NetBSD Problem Report #49299

From martin@duskware.de  Tue Oct 21 18:04:37 2014
Return-Path: <martin@duskware.de>
Received: from mail.netbsd.org (mail.netbsd.org [149.20.53.66])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(Client CN "mail.netbsd.org", Issuer "Postmaster NetBSD.org" (verified OK))
	by mollari.NetBSD.org (Postfix) with ESMTPS id A4380A65EB
	for <gnats-bugs@gnats.NetBSD.org>; Tue, 21 Oct 2014 18:04:37 +0000 (UTC)
Date: Tue, 21 Oct 2014 20:04:34 CEST
From: martin@NetBSD.org
Reply-To: martin@NetBSD.org
To: gnats-bugs@NetBSD.org
Subject: earmv7hfeb kernels can not load modules
X-Send-Pr-Version: 3.95

>Number:         49299
>Category:       port-arm
>Synopsis:       earmv7hfeb kernels can not load modules
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    port-arm-maintainer
>State:          closed
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Oct 21 18:05:00 +0000 2014
>Closed-Date:    Sun Nov 16 09:19:24 +0000 2014
>Last-Modified:  Sun Nov 16 09:19:24 +0000 2014
>Originator:     Martin Husemann
>Release:        NetBSD 7.99.1
>Organization:
The NetBSD Foundation, Inc.
>Environment:
System: NetBSD  7.99.1 NetBSD 7.99.1 (CUBIETRUCK) #17: Tue Oct 21 19:53:07 CEST 2014  martin@night-owl.duskware.de:/usr/src/sys/arch/evbarm/compile/CUBIETRUCK evbarm
Architecture: earmv7hfeb
Machine: evbarm
>Description:

Loading kernel modules crashes the kernel on big endian ARM kernels.

>How-To-Repeat:

Boot e.g. a CUBIETRUCK big endian kernel, then:

# modload filemon
Undefined instruction 0xdc0a0e1 in kernel at 0xca4ac1d4 (LR 0x8013f4a8 SP 0xbfce
fde8)                                                                          
Stopped in pid 18.1 (modload) at        filemon:filemon_modcmd: undeq   0dc0a0e1

db> bt
0xbfcefe74: netbsd:module_do_load+0xc
0xbfcefeac: netbsd:module_load+0x6c  
0xbfceff0c: netbsd:sys_modctl+0x3bc
0xbfceff7c: netbsd:syscall+0x84    
0xbfceffac: netbsd:swi_handler+0xa0


>Fix:
n/a

>Release-Note:

>Audit-Trail:
From: Martin Husemann <martin@duskware.de>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Wed, 22 Oct 2014 11:08:25 +0200

 The same test works fine on a little endian kernel.
 Endianess bug in kobj_machdep.c? There are a few places where it
 checks special hex values in the target location, which might need
 swapping.

 Martin

From: Masao Uebayashi <uebayasi@gmail.com>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Tue, 4 Nov 2014 02:40:08 +0900

 0xdc0a0e1 looks like the exact first instruction of filemon_modcmd,
 but inverted endian:

 000001d4 <filemon_modcmd>:
  1d4:   e1a0c00d        mov     ip, sp
  :

From: Martin Husemann <martin@duskware.de>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Mon, 3 Nov 2014 20:32:36 +0100

 I wonder if we have ld -x somewhere in our module generation process...

 Martin

From: Matt Thomas <matt@3am-software.com>
To: gnats-bugs@NetBSD.org,
 Masao Uebayashi <uebayasi@gmail.com>
Cc: port-arm-maintainer@netbsd.org,
 gnats-admin@netbsd.org,
 netbsd-bugs@netbsd.org,
 martin@NetBSD.org
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Mon, 3 Nov 2014 14:10:40 -0800

 > On Nov 3, 2014, at 9:45 AM, Masao Uebayashi <uebayasi@gmail.com> =
 wrote:
 >=20
 > The following reply was made to PR port-arm/49299; it has been noted =
 by GNATS.
 >=20
 > From: Masao Uebayashi <uebayasi@gmail.com>
 > To: gnats-bugs@netbsd.org
 > Cc:=20
 > Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
 > Date: Tue, 4 Nov 2014 02:40:08 +0900
 >=20
 > 0xdc0a0e1 looks like the exact first instruction of filemon_modcmd,
 > but inverted endian:
 >=20
 > 000001d4 <filemon_modcmd>:
 >  1d4:   e1a0c00d        mov     ip, sp
 >  :
 >=20

 Code needs to added to iterate though the $a/$d/$t symbols and do the =
 appropriate byte swapping of instruction.  I don=E2=80=99t even know our =
 ksyms can deal with symbols that have multiple values.=

From: matthew green <mrg@eterna.com.au>
To: gnats-bugs@NetBSD.org
Cc: port-arm-maintainer@netbsd.org, gnats-admin@netbsd.org,
    netbsd-bugs@netbsd.org, martin@NetBSD.org
Subject: re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Tue, 04 Nov 2014 13:55:46 +1100

 Martin Husemann writes:
 > The following reply was made to PR port-arm/49299; it has been noted by GNATS.
 > 
 > From: Martin Husemann <martin@duskware.de>
 > To: gnats-bugs@NetBSD.org
 > Cc: 
 > Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
 > Date: Mon, 3 Nov 2014 20:32:36 +0100
 > 
 >  I wonder if we have ld -x somewhere in our module generation process...

 you mean the main linking process?  there's also another special one
 for arm.  see share/mk/bsd.kmod.mk.

From: Martin Husemann <martin@duskware.de>
To: Matt Thomas <matt@3am-software.com>
Cc: gnats-bugs@NetBSD.org, Masao Uebayashi <uebayasi@gmail.com>,
	port-arm-maintainer@netbsd.org, gnats-admin@netbsd.org,
	netbsd-bugs@netbsd.org, martin@NetBSD.org
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Tue, 4 Nov 2014 08:27:52 +0100

 On Mon, Nov 03, 2014 at 02:10:40PM -0800, Matt Thomas wrote:

 > Code needs to added to iterate though the $a/$d/$t symbols and do the
 > appropriate byte swapping of instruction.

 Can you give a pointer to a specification for that symbols?

 Martin

From: Masao Uebayashi <uebayasi@gmail.com>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Wed, 5 Nov 2014 15:53:35 +0900

 On Tue, Nov 4, 2014 at 11:55 AM, matthew green <mrg@eterna.com.au> wrote:
 > you mean the main linking process?  there's also another special one
 > for arm.  see share/mk/bsd.kmod.mk.

 s/bsd.kmod.mk/bsd.kmodule.mk/

 The .if "arm" part is quite a hack...

 At least ${CC} to generate ${PROG} should use linker script (-T
 ${KMODSCRIPT}) for consistency.

From: Martin Husemann <martin@duskware.de>
To: Matt Thomas <matt@3am-software.com>
Cc: gnats-bugs@NetBSD.org
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Thu, 6 Nov 2014 23:13:23 +0100

 --5mCyUwZo2JvN/JJP
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline

 Ok, this was easier than I expected: the patch attached fixes it for me.

 I couldn't find a proper #ifdef condition to enable it - shouldn't there
 be one for --eb8 ?

 I also don't like the hardcoding of ".text" in the section selection,
 but unfortunately we are called slightly too late and the section
 header has already been freed. This could be easily worked around by
 copying over the section header type to the progbits table and check
 for SHT_PROGBITS instead of strcmp against ".text" - or by adding a MD
 hook after relocations are done but before jetisoning.

 Martin

 --5mCyUwZo2JvN/JJP
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename=patch

 Index: kobj_machdep.c
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/arm/arm32/kobj_machdep.c,v
 retrieving revision 1.9
 diff -u -p -r1.9 kobj_machdep.c
 --- kobj_machdep.c	27 Aug 2013 06:41:05 -0000	1.9
 +++ kobj_machdep.c	6 Nov 2014 21:58:24 -0000
 @@ -62,6 +62,16 @@ __KERNEL_RCSID(0, "$NetBSD: kobj_machdep
  #include <sys/exec.h>
  #include <sys/exec_elf.h>

 +#if __ARM_ARCH==7 && __ARM_BIG_ENDIAN
 +#define	ARM_8EB
 +#endif
 +
 +#ifdef ARM_8EB
 +#include <sys/ksyms.h>
 +#include <sys/kobj_impl.h>
 +#include <sys/kmem.h>
 +#endif
 +
  #include <arm/cpufunc.h>

  int
 @@ -203,6 +213,184 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
  	return -1;
  }

 +#ifdef ARM_8EB
 +
 +enum be8_magic_sym_type {
 +	Other, ArmStart, ThumbStart, DataStart
 +};
 +
 +struct be8_marker {
 +	enum be8_magic_sym_type type;
 +	void *addr;
 +};
 +
 +struct be8_marker_list {
 +	size_t cnt;
 +	struct be8_marker *markers;
 +};
 +
 +static enum be8_magic_sym_type
 +be8_sym_type(const char *name, int info)
 +{
 +	if (ELF_ST_BIND(info) != STB_LOCAL)
 +		return Other;
 +	if (ELF_ST_TYPE(info) != STT_NOTYPE)
 +		return Other;
 +	if (strcmp(name, "$a") == 0)
 +		return ArmStart;
 +	if (strncmp(name, "$a.", 3) == 0)
 +		return ArmStart;
 +	if (strcmp(name, "$t") == 0)
 +		return ThumbStart;
 +	if (strncmp(name, "$t.", 3) == 0)
 +		return ThumbStart;
 +	if (strcmp(name, "$d") == 0)
 +		return DataStart;
 +	if (strncmp(name, "$d.", 3) == 0)
 +		return DataStart;
 +	return Other;
 +}
 +
 +static int
 +be8_ksym_count(const char *name, int symindex, void *value, uint32_t size,
 +	int info, void *cookie)
 +{
 +	size_t *res = cookie;
 +	enum be8_magic_sym_type t = be8_sym_type(name, info);
 +
 +	if (t != Other)
 +		(*res)++;
 +	return 0;
 +}
 +
 +static int
 +be8_ksym_add(const char *name, int symindex, void *value, uint32_t size,
 +	int info, void *cookie)
 +{
 +	size_t ndx;
 +	struct be8_marker_list *list = cookie;
 +	enum be8_magic_sym_type t = be8_sym_type(name, info);
 +
 +	if (t == Other)
 +		return 0;
 +
 +	ndx = list->cnt++;
 +	list->markers[ndx].type = t;
 +	list->markers[ndx].addr = value;
 +
 +	return 0;
 +}
 +
 +static int
 +be8_ksym_comp(const void *a, const void *b)
 +{
 +	const struct be8_marker *ma = a, *mb = b;
 +	uintptr_t va = (uintptr_t)ma->addr, vb = (uintptr_t)mb->addr;
 +
 +	if (va == vb)
 +		return 0;
 +	if (va < vb)
 +		return -1;
 +	return 1;
 +}
 +
 +static void
 +be8_ksym_swap(void *start, size_t size, const struct be8_marker_list *list)
 +{
 +	uintptr_t va_end = (uintptr_t)start + size;
 +	size_t i;
 +	uint32_t *p32, *p32_end, v32;
 +	uint16_t *p16, *p16_end, v16;
 +
 +	/* find first relevant list entry */
 +	for (i = 0; i < list->cnt; i++)
 +		if (start <= list->markers[i].addr)
 +			break;
 +
 +	/* swap all arm and thumb code parts of this section */
 +	for ( ; i < list->cnt; i++) {
 +		switch (list->markers[i].type) {
 +		case ArmStart:
 +			p32 = (uint32_t*)list->markers[i].addr;
 +			p32_end = (uint32_t*)va_end;
 +			if (i+1 < list->cnt) {
 +				if ((uintptr_t)list->markers[i+1].addr
 +				    < va_end)
 +					p32_end = (uint32_t*)
 +						list->markers[i+1].addr;
 +			}
 +			while (p32 < p32_end) {
 +				v32 = bswap32(*p32);
 +				*p32++ = v32;
 +			}
 +			break;
 +		case ThumbStart:
 +			p16 = (uint16_t*)list->markers[i].addr;
 +			p16_end = (uint16_t*)va_end;
 +			if (i+1 < list->cnt) {
 +				if ((uintptr_t)list->markers[i+1].addr
 +				    < va_end)
 +					p16_end = (uint16_t*)
 +						list->markers[i+1].addr;
 +			}
 +			while (p16 < p16_end) {
 +				v16 = bswap16(*p16);
 +				*p16++ = v16;
 +			}
 +			break;
 +		default:
 +			break;
 +		}
 +	}
 +}
 + 
 +static void
 +kobj_be8_fixup(kobj_t ko)
 +{
 +	size_t relsym_cnt = 0, i;
 +	struct be8_marker_list list;
 +	struct be8_marker tmp;
 +
 +	/*
 +	 * Count all special relocations symbols
 +	 */
 +	ksyms_mod_foreach(ko->ko_name, be8_ksym_count, &relsym_cnt);
 +
 +	/*
 +	 * Provide storage for the address list and add the symbols
 +	 */
 +	list.cnt = 0;
 +	list.markers = kmem_alloc(relsym_cnt*sizeof(*list.markers), KM_SLEEP);
 +	ksyms_mod_foreach(ko->ko_name, be8_ksym_add, &list);
 +	KASSERT(list.cnt == relsym_cnt);
 +
 +	/*
 +	 * Sort symbols by ascending address
 +	 */
 +	if (kheapsort(list.markers, relsym_cnt, sizeof(*list.markers),
 +	    be8_ksym_comp, &tmp) != 0)
 +		panic("could not sort be8 marker symbols");
 +
 +	/*
 +	 * Apply swaps to the .text section (XXX we do not have the
 +	 * section header available any more, it has been jetisoned
 +	 * already, so we can not check for all PROGBIT sections).
 +	 */
 +	for (i = 0; i < ko->ko_nprogtab; i++) {
 +		if (strcmp(ko->ko_progtab[i].name, ".text") != 0)
 +			continue;
 +		be8_ksym_swap(ko->ko_progtab[i].addr,
 +		    (size_t)ko->ko_progtab[i].size,
 +		    &list);
 +	}
 +
 +	/*
 +	 * Done, free list
 +	 */
 +	kmem_free(list.markers, relsym_cnt*sizeof(*list.markers));
 +}
 +#endif
 +
  int
  kobj_machdep(kobj_t ko, void *base, size_t size, bool load)
  {
 @@ -212,6 +400,9 @@ kobj_machdep(kobj_t ko, void *base, size
  		cpu_idcache_wbinv_range((vaddr_t)base, size);
  		cpu_tlb_flushID();
  #endif
 +#ifdef ARM_8EB
 +		kobj_be8_fixup(ko);
 +#endif
  	}

  	return 0;

 --5mCyUwZo2JvN/JJP--

From: Christos Zoulas <christos@zoulas.com>
To: "gnats-bugs@NetBSD.org" <gnats-bugs@NetBSD.org>
Cc: "port-arm-maintainer@netbsd.org" <port-arm-maintainer@netbsd.org>,
 "gnats-admin@netbsd.org" <gnats-admin@netbsd.org>,
 "netbsd-bugs@netbsd.org" <netbsd-bugs@netbsd.org>,
 "martin@NetBSD.org" <martin@NetBSD.org>
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Thu, 6 Nov 2014 18:49:02 -0500

 > +    if (ELF_ST_BIND(info) !=3D STB_LOCAL)
 > +        return Other;
 > +    if (ELF_ST_TYPE(info) !=3D STT_NOTYPE)
 > +        return Other;
 > +    if (strcmp(name, "$a") =3D=3D 0)
 > +        return ArmStart;
 > +    if (strncmp(name, "$a.", 3) =3D=3D 0)
 > +        return ArmStart;
 > +    if (strcmp(name, "$t") =3D=3D 0)
 > +        return ThumbStart;
 > +    if (strncmp(name, "$t.", 3) =3D=3D 0)
 > +        return ThumbStart;
 > +    if (strcmp(name, "$d") =3D=3D 0)
 > +        return DataStart;
 > +    if (strncmp(name, "$d.", 3) =3D=3D 0)
 > +        return DataStart;
 > +    return Other;
 > +}
 > +

 This sequence of strcmps can be made a lot more efficient with specialized c=
 ode (and smaller)

 > +static int
 > +be8_ksym_count(const char *name, int symindex, void *value, uint32_t size=
 ,
 > +    int info, void *cookie)
 > +{
 > +    size_t *res =3D cookie;
 > +    enum be8_magic_sym_type t =3D be8_sym_type(name, info);
 > +
 > +    if (t !=3D Other)
 > +        (*res)++;
 > +    return 0;
 > +}
 > +
 > +static int
 > +be8_ksym_add(const char *name, int symindex, void *value, uint32_t size,
 > +    int info, void *cookie)
 > +{
 > +    size_t ndx;
 > +    struct be8_marker_list *list =3D cookie;
 > +    enum be8_magic_sym_type t =3D be8_sym_type(name, info);
 > +
 > +    if (t =3D=3D Other)
 > +        return 0;
 > +
 > +    ndx =3D list->cnt++;
 > +    list->markers[ndx].type =3D t;
 > +    list->markers[ndx].addr =3D value;
 > +
 > +    return 0;
 > +}
 > +
 > +static int
 > +be8_ksym_comp(const void *a, const void *b)
 > +{
 > +    const struct be8_marker *ma =3D a, *mb =3D b;
 > +    uintptr_t va =3D (uintptr_t)ma->addr, vb =3D (uintptr_t)mb->addr;
 > +
 > +    if (va =3D=3D vb)
 > +        return 0;
 > +    if (va < vb)
 > +        return -1;
 > +    return 1;
 > +}
 > +
 > +static void
 > +be8_ksym_swap(void *start, size_t size, const struct be8_marker_list *lis=
 t)
 > +{
 > +    uintptr_t va_end =3D (uintptr_t)start + size;
 > +    size_t i;
 > +    uint32_t *p32, *p32_end, v32;
 > +    uint16_t *p16, *p16_end, v16;
 > +
 > +    /* find first relevant list entry */
 > +    for (i =3D 0; i < list->cnt; i++)
 > +        if (start <=3D list->markers[i].addr)
 > +            break;
 > +
 > +    /* swap all arm and thumb code parts of this section */
 > +    for ( ; i < list->cnt; i++) {
 > +        switch (list->markers[i].type) {
 > +        case ArmStart:
 > +            p32 =3D (uint32_t*)list->markers[i].addr;
 > +            p32_end =3D (uint32_t*)va_end;
 > +            if (i+1 < list->cnt) {
 > +                if ((uintptr_t)list->markers[i+1].addr
 > +                    < va_end)
 > +                    p32_end =3D (uint32_t*)
 > +                        list->markers[i+1].addr;
 > +            }
 > +            while (p32 < p32_end) {
 > +                v32 =3D bswap32(*p32);
 > +                *p32++ =3D v32;
 > +            }
 > +            break;
 > +        case ThumbStart:
 > +            p16 =3D (uint16_t*)list->markers[i].addr;
 > +            p16_end =3D (uint16_t*)va_end;
 > +            if (i+1 < list->cnt) {
 > +                if ((uintptr_t)list->markers[i+1].addr
 > +                    < va_end)
 > +                    p16_end =3D (uint16_t*)
 > +                        list->markers[i+1].addr;
 > +       =20

 I think a default and break here is better

 >    }
 > +            while (p16 < p16_end) {
 > +                v16 =3D bswap16(*p16);

 > +                *p16++ =3D v16;
 > +            }
 > +            break;
 > +        default:
 > +            break;
 > +        }
 > +    }
 > +}
 > +=20
 > +static void
 > +kobj_be8_fixup(kobj_t ko)
 > +{
 > +    size_t relsym_cnt =3D 0, i;
 > +    struct be8_marker_list list;
 > +    struct be8_marker tmp;
 > +
 > +    /*
 > +     * Count all special relocations symbols
 > +     */
 > +    ksyms_mod_foreach(ko->ko_name, be8_ksym_count, &relsym_cnt);
 > +
 > +    /*
 > +     * Provide storage for the address list and add the symbols
 > +     */
 > +    list.cnt =3D 0;
 > +    list.markers =3D kmem_alloc(relsym_cnt*sizeof(*list.markers), KM_SLEE=
 P);
 > +    ksyms_mod_foreach(ko->ko_name, be8_ksym_add, &list);
 > +    KASSERT(list.cnt =3D=3D relsym_cnt);
 > +
 > +    /*
 > +     * Sort symbols by ascending address
 > +     */
 > +    if (kheapsort(list.markers, relsym_cnt, sizeof(*list.markers),
 > +        be8_ksym_comp, &tmp) !=3D 0)
 > +        panic("could not sort be8 marker symbols");
 > +
 > +    /*
 > +     * Apply swaps to the .text section (XXX we do not have the
 > +     * section header available any more, it has been jetisoned
 > +     * already, so we can not check for all PROGBIT sections).
 > +     */
 > +    for (i =3D 0; i < ko->ko_nprogtab; i++) {
 > +        if (strcmp(ko->ko_progtab[i].name, ".text") !=3D 0)
 > +            continue;
 > +        be8_ksym_swap(ko->ko_progtab[i].addr,
 > +            (size_t)ko->ko_progtab[i].size,
 > +            &list);
 > +    }
 > +
 > +    /*
 > +     * Done, free list
 > +     */
 > +    kmem_free(list.markers, relsym_cnt*sizeof(*list.markers));
 > +}
 > +#endif
 > +
 >  int
 >  kobj_machdep(kobj_t ko, void *base, size_t size, bool load)
 >  {
 > @@ -212,6 +400,9 @@ kobj_machdep(kobj_t ko, void *base, size
 >          cpu_idcache_wbinv_range((vaddr_t)base, size);
 >          cpu_tlb_flushID();
 >  #endif
 > +#ifdef ARM_8EB
 > +        kobj_be8_fixup(ko);
 > +#endif
 >      }
 >=20
 >      return 0;
 >=20
 > --5mCyUwZo2JvN/JJP--
 >=20

From: Masao Uebayashi <uebayasi@gmail.com>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Fri, 7 Nov 2014 11:34:23 +0900

 Just curious; why is this done at run-time?

From: Matt Thomas <matt@3am-software.com>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Thu, 6 Nov 2014 18:47:18 -0800

 > On Nov 6, 2014, at 6:35 PM, Masao Uebayashi <uebayasi@gmail.com> =
 wrote:
 >=20
 > The following reply was made to PR port-arm/49299; it has been noted =
 by GNATS.
 >=20
 > From: Masao Uebayashi <uebayasi@gmail.com>
 > To: gnats-bugs@netbsd.org
 > Cc:=20
 > Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
 > Date: Fri, 7 Nov 2014 11:34:23 +0900
 >=20
 > Just curious; why is this done at run-time?

 because arm mandates it must be done by the linker.

From: Martin Husemann <martin@duskware.de>
To: Christos Zoulas <christos@zoulas.com>
Cc: "gnats-bugs@NetBSD.org" <gnats-bugs@NetBSD.org>
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Fri, 7 Nov 2014 08:48:17 +0100

 On Thu, Nov 06, 2014 at 06:49:02PM -0500, Christos Zoulas wrote:
 > This sequence of strcmps can be made a lot more efficient with specialized code (and smaller)

 Yes, not sure it is worth though, but can do.

 > > +        case ThumbStart:
 > > +            p16 = (uint16_t*)list->markers[i].addr;
 > > +            p16_end = (uint16_t*)va_end;
 > > +            if (i+1 < list->cnt) {
 > > +                if ((uintptr_t)list->markers[i+1].addr
 > > +                    < va_end)
 > > +                    p16_end = (uint16_t*)
 > > +                        list->markers[i+1].addr;
 > > +        
 > 
 > I think a default and break here is better

 Sorry, I don't understand what you mean.

 Martin

From: Martin Husemann <martin@duskware.de>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Fri, 7 Nov 2014 09:30:39 +0100

 Here is the optimized version of the match function (I'll fix the regexp
 in the comments, heh)

 Martin

 static enum be8_magic_sym_type
 be8_sym_type(const char *name, int info)
 {
 	if (ELF_ST_BIND(info) != STB_LOCAL)
 		return Other;
 	if (ELF_ST_TYPE(info) != STT_NOTYPE)
 		return Other;
 	if (name[0] != '$')
 		return Other;

 	/* match $a and $a\.* */
 	if (name[1] == 'a' && (name[2] == 0 || name[2] == '.'))
 		return ArmStart;

 	/* match $t and $t\.* */
 	if (name[1] == 't' && (name[2] == 0 || name[2] == '.'))
 		return ThumbStart;

 	/* match $d and $d\.* */
 	if (name[1] == 'd' && (name[2] == 0 || name[2] == '.'))
 		return DataStart;

 	return Other;
 }


From: christos@zoulas.com (Christos Zoulas)
To: Martin Husemann <martin@duskware.de>
Cc: "gnats-bugs@NetBSD.org" <gnats-bugs@NetBSD.org>
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Fri, 7 Nov 2014 07:49:57 -0500

 On Nov 7,  8:48am, martin@duskware.de (Martin Husemann) wrote:
 -- Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules

 | On Thu, Nov 06, 2014 at 06:49:02PM -0500, Christos Zoulas wrote:
 | > This sequence of strcmps can be made a lot more efficient with specialized code (and smaller)
 | 
 | Yes, not sure it is worth though, but can do.
 | 
 | > > +        case ThumbStart:
 | > > +            p16 = (uint16_t*)list->markers[i].addr;
 | > > +            p16_end = (uint16_t*)va_end;
 | > > +            if (i+1 < list->cnt) {
 | > > +                if ((uintptr_t)list->markers[i+1].addr
 | > > +                    < va_end)
 | > > +                    p16_end = (uint16_t*)
 | > > +                        list->markers[i+1].addr;
 | > > +        
 | > 
 | > I think a default and break here is better
 | 
 | Sorry, I don't understand what you mean.

 There is a switch statement and there is no break and default: after the last
 case statement.

 christos

From: christos@zoulas.com (Christos Zoulas)
To: gnats-bugs@NetBSD.org, port-arm-maintainer@netbsd.org, 
	gnats-admin@netbsd.org, netbsd-bugs@netbsd.org, martin@NetBSD.org
Cc: 
Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
Date: Fri, 7 Nov 2014 07:56:04 -0500

 On Nov 7,  8:35am, martin@duskware.de (Martin Husemann) wrote:
 -- Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules

 | The following reply was made to PR port-arm/49299; it has been noted by GNATS.
 | 
 | From: Martin Husemann <martin@duskware.de>
 | To: gnats-bugs@NetBSD.org
 | Cc: 
 | Subject: Re: port-arm/49299: earmv7hfeb kernels can not load modules
 | Date: Fri, 7 Nov 2014 09:30:39 +0100
 | 
 |  Here is the optimized version of the match function (I'll fix the regexp
 |  in the comments, heh)
 |  
 |  Martin
 |  
 |  static enum be8_magic_sym_type
 |  be8_sym_type(const char *name, int info)
 |  {
 |  	if (ELF_ST_BIND(info) != STB_LOCAL)
 |  		return Other;
 |  	if (ELF_ST_TYPE(info) != STT_NOTYPE)
 |  		return Other;

 	/* filter out non $? $?\.* */
   	if (name[0] != '$' || name[1] == '\0' || (name[2] != '\0' &&
 	    || name[2] != '.'))
   		return Other;

 	switch (name[1]) {
 	case 'a':	/* match $a and $a\.* */
   		return ArmStart;
 	case 'd':	/* match $d and $d\.* */
   		return DataStart;
   	case 't':	/* match $t and $t\.* */
   		return ThumbStart;
 	default:
   		return Other;
 	}
     }

 christos

From: "Martin Husemann" <martin@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/49299 CVS commit: src/sys/arch/arm/arm32
Date: Fri, 7 Nov 2014 21:28:32 +0000

 Module Name:	src
 Committed By:	martin
 Date:		Fri Nov  7 21:28:32 UTC 2014

 Modified Files:
 	src/sys/arch/arm/arm32: kobj_machdep.c

 Log Message:
 PR port-arm/49299: add support for BE8 byte swapped instructions.


 To generate a diff of this commit:
 cvs rdiff -u -r1.9 -r1.10 src/sys/arch/arm/arm32/kobj_machdep.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: "Soren Jacobsen" <snj@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/49299 CVS commit: [netbsd-7] src/sys/arch/arm/arm32
Date: Fri, 14 Nov 2014 08:16:56 +0000

 Module Name:	src
 Committed By:	snj
 Date:		Fri Nov 14 08:16:56 UTC 2014

 Modified Files:
 	src/sys/arch/arm/arm32 [netbsd-7]: kobj_machdep.c

 Log Message:
 Pull up following revision(s) (requested by martin in ticket #228):
 	sys/arch/arm/arm32/kobj_machdep.c: revision 1.10
 PR port-arm/49299: add support for BE8 byte swapped instructions.


 To generate a diff of this commit:
 cvs rdiff -u -r1.9 -r1.9.4.1 src/sys/arch/arm/arm32/kobj_machdep.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

State-Changed-From-To: open->closed
State-Changed-By: martin@NetBSD.org
State-Changed-When: Sun, 16 Nov 2014 09:19:24 +0000
State-Changed-Why:
Fixed and pulled up to -7


>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2014 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.