MaderNoob/galloc

Bus Fault in realloc

trueb2 opened this issue · 0 comments

I hit a bus fault when switching a library from rust-embedded/embedded-alloc#36. I don't have any bus errors when running the Heap from embedded-alloc based on the linked_list_allocator.

Running on ZephyrRTOS where a couple threads might be able to make an allocation, but NRF52840 Cortex-M4F only has one core.

[00:02:09.454,620] <err> os: bus_fault: ***** BUS FAULT *****
[00:02:09.454,650] <err> os: bus_fault:   Imprecise data bus error
[00:02:09.454,681] <err> os: esf_dump: r0/a1:  0x00000050  r1/a2:  0xe3400200  r2/a3:  0xb89bbb68
[00:02:09.454,681] <err> os: esf_dump: r3/a4:  0x20020774 r12/ip:  0x20020770 r14/lr:  0x0004da3b
[00:02:09.454,711] <err> os: esf_dump:  xpsr:  0xa1000000
[00:02:09.454,711] <err> os: esf_dump: s[ 0]:  0x00000000  s[ 1]:  0x00000000  s[ 2]:  0x00000000  s[ 3]:  0x00000000
[00:02:09.454,742] <err> os: esf_dump: s[ 4]:  0x00000000  s[ 5]:  0x00000000  s[ 6]:  0x00000000  s[ 7]:  0x00000000
[00:02:09.454,742] <err> os: esf_dump: s[ 8]:  0x00000000  s[ 9]:  0x00000000  s[10]:  0x00000000  s[11]:  0x00000000
[00:02:09.454,772] <err> os: esf_dump: s[12]:  0x00000000  s[13]:  0x00000000  s[14]:  0x00000000  s[15]:  0x00000000
[00:02:09.454,772] <err> os: esf_dump: fpscr:  0x200204f0
[00:02:09.454,803] <err> os: esf_dump: Faulting instruction address (r15/pc): 0x000610c8
[00:02:09.454,833] <err> os: z_fatal_error: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0
[00:02:09.454,864] <err> os: z_fatal_error: Current thread: 0x20003ed8 (max86141_fifo)
[00:02:10.268,859] <err> os: k_sys_fatal_error_handler: Halting system

That program counter is buried down in the rust_realloc call:

   610a2:	e7ad      	b.n	61000 <__rust_realloc+0x28c>
   610a4:	e9d0 1001 	ldrd	r1, r0, [r0, #4]
   610a8:	f042 0303 	orr.w	r3, r2, #3
   610ac:	f022 0703 	bic.w	r7, r2, #3
   610b0:	f8cc 3000 	str.w	r3, [ip]
   610b4:	4663      	mov	r3, ip
   610b6:	f8cc 0008 	str.w	r0, [ip, #8]
   610ba:	f843 1f04 	str.w	r1, [r3, #4]!
   610be:	2900      	cmp	r1, #0
   610c0:	f847 200c 	str.w	r2, [r7, ip]
   610c4:	bf18      	it	ne
   610c6:	608b      	strne	r3, [r1, #8]
   610c8:	f8c0 c000 	str.w	ip, [r0]
   610cc:	e798      	b.n	61000 <__rust_realloc+0x28c>
   610ce:	fa97 f1a7 	rbit	r1, r7
   610d2:	6800      	ldr	r0, [r0, #0]
   610d4:	fab1 f181 	clz	r1, r1
   610d8:	1ecb      	subs	r3, r1, #3
   610da:	f1a0 010c 	sub.w	r1, r0, #12
   610de:	2b07      	cmp	r3, #7
   610e0:	bf28      	it	cs
   610e2:	2307      	movcs	r3, #7
   610e4:	08c8      	lsrs	r0, r1, #3
   610e6:	299f      	cmp	r1, #159	; 0x9f
   610e8:	d85c      	bhi.n	611a4 <__rust_realloc+0x430>

Call stack from Rust is inside of push to BitVec, alloc::raw_vec::finish_grow, and __rust_realloc