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:
(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.