Add stack unwinding directives to assembly leaf functions.
So that the real culprit of native crashes can surface in the stack trace.
This commit is contained in:
		@@ -41,6 +41,8 @@
 | 
				
			|||||||
   .equ     kernel_cmpxchg, 0xFFFF0FC0
 | 
					   .equ     kernel_cmpxchg, 0xFFFF0FC0
 | 
				
			||||||
   .equ     kernel_atomic_base, 0xFFFF0FFF
 | 
					   .equ     kernel_atomic_base, 0xFFFF0FFF
 | 
				
			||||||
__atomic_dec:
 | 
					__atomic_dec:
 | 
				
			||||||
 | 
					    .fnstart
 | 
				
			||||||
 | 
					    .save {r4, lr}
 | 
				
			||||||
    stmdb   sp!, {r4, lr}
 | 
					    stmdb   sp!, {r4, lr}
 | 
				
			||||||
    mov     r2, r0
 | 
					    mov     r2, r0
 | 
				
			||||||
1: @ atomic_dec
 | 
					1: @ atomic_dec
 | 
				
			||||||
@@ -53,8 +55,11 @@ __atomic_dec:
 | 
				
			|||||||
    add     r0, r1, #1
 | 
					    add     r0, r1, #1
 | 
				
			||||||
    ldmia   sp!, {r4, lr}
 | 
					    ldmia   sp!, {r4, lr}
 | 
				
			||||||
    bx      lr
 | 
					    bx      lr
 | 
				
			||||||
 | 
					    .fnend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__atomic_inc:
 | 
					__atomic_inc:
 | 
				
			||||||
 | 
					    .fnstart
 | 
				
			||||||
 | 
					    .save {r4, lr}
 | 
				
			||||||
    stmdb   sp!, {r4, lr}
 | 
					    stmdb   sp!, {r4, lr}
 | 
				
			||||||
    mov     r2, r0
 | 
					    mov     r2, r0
 | 
				
			||||||
1: @ atomic_inc
 | 
					1: @ atomic_inc
 | 
				
			||||||
@@ -67,9 +72,12 @@ __atomic_inc:
 | 
				
			|||||||
    sub     r0, r1, #1
 | 
					    sub     r0, r1, #1
 | 
				
			||||||
    ldmia   sp!, {r4, lr}
 | 
					    ldmia   sp!, {r4, lr}
 | 
				
			||||||
    bx      lr
 | 
					    bx      lr
 | 
				
			||||||
 | 
					    .fnend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* r0(old) r1(new) r2(addr) -> r0(zero_if_succeeded) */
 | 
					/* r0(old) r1(new) r2(addr) -> r0(zero_if_succeeded) */
 | 
				
			||||||
__atomic_cmpxchg:
 | 
					__atomic_cmpxchg:
 | 
				
			||||||
 | 
					    .fnstart
 | 
				
			||||||
 | 
					    .save {r4, lr}
 | 
				
			||||||
    stmdb   sp!, {r4, lr}
 | 
					    stmdb   sp!, {r4, lr}
 | 
				
			||||||
    mov     r4, r0          /* r4 = save oldvalue */
 | 
					    mov     r4, r0          /* r4 = save oldvalue */
 | 
				
			||||||
1: @ atomic_cmpxchg
 | 
					1: @ atomic_cmpxchg
 | 
				
			||||||
@@ -84,6 +92,7 @@ __atomic_cmpxchg:
 | 
				
			|||||||
2: @ atomic_cmpxchg
 | 
					2: @ atomic_cmpxchg
 | 
				
			||||||
    ldmia   sp!, {r4, lr}
 | 
					    ldmia   sp!, {r4, lr}
 | 
				
			||||||
    bx      lr
 | 
					    bx      lr
 | 
				
			||||||
 | 
					    .fnend
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#define KUSER_CMPXCHG 0xffffffc0
 | 
					#define KUSER_CMPXCHG 0xffffffc0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,6 +44,7 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
memcmp:
 | 
					memcmp:
 | 
				
			||||||
 | 
					        .fnstart
 | 
				
			||||||
        PLD         (r0, #0)
 | 
					        PLD         (r0, #0)
 | 
				
			||||||
        PLD         (r1, #0)
 | 
					        PLD         (r1, #0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -53,6 +54,7 @@ memcmp:
 | 
				
			|||||||
        moveq       r0, #0
 | 
					        moveq       r0, #0
 | 
				
			||||||
        bxeq        lr
 | 
					        bxeq        lr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .save {r4, lr}
 | 
				
			||||||
        /* save registers */
 | 
					        /* save registers */
 | 
				
			||||||
        stmfd       sp!, {r4, lr}
 | 
					        stmfd       sp!, {r4, lr}
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
@@ -174,6 +176,7 @@ memcmp:
 | 
				
			|||||||
9:      /* restore registers and return */
 | 
					9:      /* restore registers and return */
 | 
				
			||||||
        ldmfd       sp!, {r4, lr}
 | 
					        ldmfd       sp!, {r4, lr}
 | 
				
			||||||
        bx          lr
 | 
					        bx          lr
 | 
				
			||||||
 | 
					        .fnend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,6 +44,7 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__memcmp16:
 | 
					__memcmp16:
 | 
				
			||||||
 | 
					        .fnstart
 | 
				
			||||||
        PLD         (r0, #0)
 | 
					        PLD         (r0, #0)
 | 
				
			||||||
        PLD         (r1, #0)
 | 
					        PLD         (r1, #0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -79,6 +80,7 @@ __memcmp16:
 | 
				
			|||||||
        bx          lr
 | 
					        bx          lr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .save {r4, lr}
 | 
				
			||||||
        /* save registers */
 | 
					        /* save registers */
 | 
				
			||||||
0:      stmfd       sp!, {r4, lr}
 | 
					0:      stmfd       sp!, {r4, lr}
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
@@ -93,6 +95,7 @@ __memcmp16:
 | 
				
			|||||||
        /* restore registers and return */
 | 
					        /* restore registers and return */
 | 
				
			||||||
        ldmnefd     sp!, {r4, lr}
 | 
					        ldmnefd     sp!, {r4, lr}
 | 
				
			||||||
        bxne        lr
 | 
					        bxne        lr
 | 
				
			||||||
 | 
					        .fnend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,6 +40,7 @@
 | 
				
			|||||||
#define NEON_MAX_PREFETCH_DISTANCE 320
 | 
					#define NEON_MAX_PREFETCH_DISTANCE 320
 | 
				
			||||||
 | 
					
 | 
				
			||||||
memcpy:
 | 
					memcpy:
 | 
				
			||||||
 | 
					        .fnstart
 | 
				
			||||||
		mov	ip, r0
 | 
							mov	ip, r0
 | 
				
			||||||
		cmp	r2, #16
 | 
							cmp	r2, #16
 | 
				
			||||||
		blt     4f	@ Have less than 16 bytes to copy
 | 
							blt     4f	@ Have less than 16 bytes to copy
 | 
				
			||||||
@@ -128,6 +129,7 @@ memcpy:
 | 
				
			|||||||
		ldrmib	r3, [r1], #1
 | 
							ldrmib	r3, [r1], #1
 | 
				
			||||||
		strmib	r3, [ip], #1
 | 
							strmib	r3, [ip], #1
 | 
				
			||||||
		bx	lr
 | 
							bx	lr
 | 
				
			||||||
 | 
					        .fnend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else	/* __ARM_ARCH__ < 7 */
 | 
					#else	/* __ARM_ARCH__ < 7 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user