diff --git a/arch/arm/syscall-common.S b/arch/arm/syscall-common.S index 09f8a2782..c3cbf7105 100644 --- a/arch/arm/syscall-common.S +++ b/arch/arm/syscall-common.S @@ -1,12 +1,18 @@ #include "asm/linkage.h" +@ We use the register R8 unlike libc that uses R12. +@ This avoids corruption of the register by the stub +@ for the syscall sys_munmap() when syscalls are hooked +@ by ptrace(). However we have to make sure that +@ the compiler doesn't use the register on the route +@ between parasite_service() and sys_munmap(). + syscall_common: ldr %r7, [%r7] - add %ip, %sp, #16 - ldm %ip, {%r4, %r5, %r6} + add %r8, %sp, #24 + ldm %r8, {%r4, %r5, %r6} svc 0x00000000 - pop {%r4, %r5, %r6, %r7} - bx %lr + pop {%r4, %r5, %r6, %r7, %r8, %pc} .macro syscall name, nr @@ -14,7 +20,7 @@ syscall_common: .long \nr ENTRY(\name) - push {%r4, %r5, %r6, %r7} + push {%r4, %r5, %r6, %r7, %r8, %lr} adr %r7, .nr_\name b syscall_common END(\name)