Date: Thu, 9 May 2013 22:17:09 -0700 From: Tim Kientzle <kientzle@freebsd.org> To: Andrew Turner <andrew@fubar.geek.nz> Cc: freebsd-arm@freebsd.org Subject: Re: Is this related to the general panic discussed in freebsd-current? Message-ID: <F8AB4C38-CE15-4C77-8E84-959F2D8167D7@freebsd.org> In-Reply-To: <20130506124711.23978ec8@bender.lan> References: <51835891.4050409@thieprojects.ch> <03971BD1-4ADE-4435-BDD0-B94B62634F1D@bsdimp.com> <5183BF8C.4040406@thieprojects.ch> <CCABA43A-6D7E-4310-9F68-AEE54C88F431@kientzle.com> <6D0E82C9-79D1-4804-9B39-3440F99AA8FE@kientzle.com> <20130505140006.0d671ba5@bender> <D0B02568-E7AB-410E-8717-E9F9C745E6ED@kientzle.com> <20130505233729.63ac23bc@bender.lan> <B5B4C509-5CEC-4155-90BF-B40D7395F09B@kientzle.com> <724191A9-57F4-4D66-9E4A-EBBC13BDC0D1@freebsd.org> <20130506124711.23978ec8@bender.lan>
next in thread | previous in thread | raw e-mail | index | archive | help
On May 6, 2013, at 4:47 AM, Andrew Turner wrote: > On Sun, 5 May 2013 22:39:56 -0700 > Tim Kientzle <kientzle@freebsd.org> wrote: >> Here's a version of stack_capture that allows a Clang-built >> OABI kernel with WITNESS enabled to boot: >>=20 >> /* In sys/arm/arm/stack_machdep.c */ >> static void >> stack_capture(struct stack *st, u_int32_t *frame) >> { >> vm_offset_t callpc; >>=20 >> stack_zero(st); >> while (INKERNEL(frame)) { >> callpc =3D frame[1]; >> if (stack_put(st, callpc) =3D=3D -1) >> break; >> frame =3D (u_int32_t *)(frame[0]); >> } >> } > It looks like this should work in most cases where fp and lr are next > to each other (ip and sp are between them but doesn't need to be = saved). Disassembling an EABI kernel, there are 7930 'push' instructions with fp and lr next to each other and only 220 without, so it looks like the = EABI kernel uses this frame convention as well. So what do you think of the following? #if defined(__ARM_EABI__) static void stack_capture(struct stack *st, u_int32_t *frame) { vm_offset_t callpc; stack_zero(st); while (INKERNEL(frame)) { callpc =3D frame[1]; if (stack_put(st, callpc) =3D=3D -1) break; frame =3D (u_int32_t *)(frame[0]); } } #elif !defined(__clang__) =85 old stack_capture code that works for OABI with gcc =85 #else /* * Clang doesn't yet produce compliant stack frames for OABI. */ static void stack_capture(=85) { /* empty */ } #endif
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?F8AB4C38-CE15-4C77-8E84-959F2D8167D7>