From 7a9309370f28edb8e5349a5801bc66b76572fe62 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Fri, 24 Aug 2018 07:11:18 -0600 Subject: [PATCH] arm syscalls: svcall/sycall logic needs to get the ucontext argument from R4 instead of stack since all syscall parameters pass from registers in syscall.h --- arch/arm/src/armv6-m/up_svcall.c | 9 ++------- arch/arm/src/armv7-a/arm_syscall.c | 7 +------ arch/arm/src/armv7-m/up_svcall.c | 9 ++------- arch/arm/src/armv7-r/arm_syscall.c | 9 ++------- 4 files changed, 7 insertions(+), 27 deletions(-) diff --git a/arch/arm/src/armv6-m/up_svcall.c b/arch/arm/src/armv6-m/up_svcall.c index fd61de1906f..98377230346 100644 --- a/arch/arm/src/armv6-m/up_svcall.c +++ b/arch/arm/src/armv6-m/up_svcall.c @@ -348,7 +348,7 @@ int up_svcall(int irq, FAR void *context, FAR void *arg) * R1 = sighand * R2 = signo * R3 = info - * ucontext (on the stack) + * R4 = ucontext */ #if defined(CONFIG_BUILD_PROTECTED) && !defined(CONFIG_DISABLE_SIGNALS) @@ -375,12 +375,7 @@ int up_svcall(int irq, FAR void *context, FAR void *arg) regs[REG_R0] = regs[REG_R1]; /* sighand */ regs[REG_R1] = regs[REG_R2]; /* signal */ regs[REG_R2] = regs[REG_R3]; /* info */ - - /* The last parameter, ucontext, is trickier. The ucontext - * parameter will reside at an offset of 4 from the stack pointer. - */ - - regs[REG_R3] = *(uint32_t *)(regs[REG_SP]+4); + regs[REG_R3] = regs[REG_R4]; /* ucontext */ } break; #endif diff --git a/arch/arm/src/armv7-a/arm_syscall.c b/arch/arm/src/armv7-a/arm_syscall.c index 77b33b45f4b..7b95e4935b3 100644 --- a/arch/arm/src/armv7-a/arm_syscall.c +++ b/arch/arm/src/armv7-a/arm_syscall.c @@ -350,12 +350,7 @@ uint32_t *arm_syscall(uint32_t *regs) regs[REG_R0] = regs[REG_R1]; /* sighand */ regs[REG_R1] = regs[REG_R2]; /* signal */ regs[REG_R2] = regs[REG_R3]; /* info */ - - /* The last parameter, ucontext, is trickier. The ucontext - * parameter will reside at an offset of 4 from the stack pointer. - */ - - regs[REG_R3] = *(uint32_t *)(regs[REG_SP]+4); + regs[REG_R3] = regs[REG_R4]; /* ucontext */ #ifdef CONFIG_ARCH_KERNEL_STACK /* If we are signalling a user process, then we must be operating diff --git a/arch/arm/src/armv7-m/up_svcall.c b/arch/arm/src/armv7-m/up_svcall.c index be91eff109a..d549edc9590 100644 --- a/arch/arm/src/armv7-m/up_svcall.c +++ b/arch/arm/src/armv7-m/up_svcall.c @@ -348,7 +348,7 @@ int up_svcall(int irq, FAR void *context, FAR void *arg) * R1 = sighand * R2 = signo * R3 = info - * ucontext (on the stack) + * R4 = ucontext */ #if defined(CONFIG_BUILD_PROTECTED) && !defined(CONFIG_DISABLE_SIGNALS) @@ -375,12 +375,7 @@ int up_svcall(int irq, FAR void *context, FAR void *arg) regs[REG_R0] = regs[REG_R1]; /* sighand */ regs[REG_R1] = regs[REG_R2]; /* signal */ regs[REG_R2] = regs[REG_R3]; /* info */ - - /* The last parameter, ucontext, is trickier. The ucontext - * parameter will reside at an offset of 4 from the stack pointer. - */ - - regs[REG_R3] = *(uint32_t *)(regs[REG_SP]+4); + regs[REG_R3] = regs[REG_R4]; /* ucontext */ } break; #endif diff --git a/arch/arm/src/armv7-r/arm_syscall.c b/arch/arm/src/armv7-r/arm_syscall.c index 49290d5509e..26168ce4b5c 100644 --- a/arch/arm/src/armv7-r/arm_syscall.c +++ b/arch/arm/src/armv7-r/arm_syscall.c @@ -322,7 +322,7 @@ uint32_t *arm_syscall(uint32_t *regs) * R1 = sighand * R2 = signo * R3 = info - * ucontext (on the stack) + * R4 = ucontext */ case SYS_signal_handler: @@ -348,12 +348,7 @@ uint32_t *arm_syscall(uint32_t *regs) regs[REG_R0] = regs[REG_R1]; /* sighand */ regs[REG_R1] = regs[REG_R2]; /* signal */ regs[REG_R2] = regs[REG_R3]; /* info */ - - /* The last parameter, ucontext, is trickier. The ucontext - * parameter will reside at an offset of 4 from the stack pointer. - */ - - regs[REG_R3] = *(uint32_t *)(regs[REG_SP]+4); + regs[REG_R3] = regs[REG_R4]; /* ucontext */ #ifdef CONFIG_ARCH_KERNEL_STACK /* If we are signalling a user process, then we must be operating