2003-06-03 Roland McGrath <roland@redhat.com>
Linux/ARM improvements from Russell King <rmk@arm.linux.org.uk>:
* defs.h [LINUX] (TCB_WAITEXECVE): Define for [ARM] too.
* process.c (struct_user_offsets) [LINUX] [ARM]: Add ARM registers.
* signal.c [LINUX] (sys_sigreturn) [ARM]: New case.
* syscall.c (get_scno, syscall_fixup) [LINUX] [ARM]: Case rewritten.
(get_error) [LINUX] [ARM]: Update.
(syscall_enter) [LINUX] [ARM]: New case.
* util.c (printcall) [LINUX] [ARM]: New case.
diff --git a/signal.c b/signal.c
index 4398294..e393b0f 100644
--- a/signal.c
+++ b/signal.c
@@ -1183,26 +1183,51 @@
sys_sigreturn(tcp)
struct tcb *tcp;
{
-#if defined(S390) || defined(S390X)
- long usp;
- struct sigcontext_struct sc;
+#ifdef ARM
+ struct pt_regs regs;
+ struct sigcontext_struct sc;
- if (entering(tcp)) {
- tcp->u_arg[0] = 0;
- if (upeek(tcp->pid,PT_GPR15,&usp)<0)
- return 0;
- if (umove(tcp, usp+__SIGNAL_FRAMESIZE, &sc) < 0)
- return 0;
- tcp->u_arg[0] = 1;
- memcpy(&tcp->u_arg[1],&sc.oldmask[0],sizeof(sigset_t));
- } else {
- tcp->u_rval = tcp->u_error = 0;
- if (tcp->u_arg[0] == 0)
- return 0;
- tcp->auxstr = sprintsigmask("mask now ",(sigset_t *)&tcp->u_arg[1],0);
- return RVAL_NONE | RVAL_STR;
- }
- return 0;
+ if (entering(tcp)) {
+ tcp->u_arg[0] = 0;
+
+ if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (void *)®s) == -1)
+ return 0;
+
+ if (umove(tcp, regs.ARM_sp, &sc) < 0)
+ return 0;
+
+ tcp->u_arg[0] = 1;
+ tcp->u_arg[1] = sc.oldmask;
+ } else {
+ sigset_t sigm;
+ long_to_sigset(tcp->u_arg[1], &sigm);
+ tcp->u_rval = tcp->u_error = 0;
+ if (tcp->u_arg[0] == 0)
+ return 0;
+ tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
+ return RVAL_NONE | RVAL_STR;
+ }
+ return 0;
+#elif defined(S390) || defined(S390X)
+ long usp;
+ struct sigcontext_struct sc;
+
+ if (entering(tcp)) {
+ tcp->u_arg[0] = 0;
+ if (upeek(tcp->pid,PT_GPR15,&usp)<0)
+ return 0;
+ if (umove(tcp, usp+__SIGNAL_FRAMESIZE, &sc) < 0)
+ return 0;
+ tcp->u_arg[0] = 1;
+ memcpy(&tcp->u_arg[1],&sc.oldmask[0],sizeof(sigset_t));
+ } else {
+ tcp->u_rval = tcp->u_error = 0;
+ if (tcp->u_arg[0] == 0)
+ return 0;
+ tcp->auxstr = sprintsigmask("mask now ",(sigset_t *)&tcp->u_arg[1],0);
+ return RVAL_NONE | RVAL_STR;
+ }
+ return 0;
#else
#ifdef I386
long esp;
@@ -1256,50 +1281,50 @@
return 0;
#else /* !IA64 */
#ifdef POWERPC
- long esp;
- struct sigcontext_struct sc;
+ long esp;
+ struct sigcontext_struct sc;
- if (entering(tcp)) {
- tcp->u_arg[0] = 0;
- if (upeek(tcp->pid, sizeof(unsigned long)*PT_R1, &esp) < 0)
- return 0;
- if (umove(tcp, esp, &sc) < 0)
- return 0;
- tcp->u_arg[0] = 1;
- tcp->u_arg[1] = sc.oldmask;
- }
- else {
- sigset_t sigm;
- long_to_sigset(tcp->u_arg[1], &sigm);
- tcp->u_rval = tcp->u_error = 0;
- if (tcp->u_arg[0] == 0)
- return 0;
- tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
- return RVAL_NONE | RVAL_STR;
- }
- return 0;
+ if (entering(tcp)) {
+ tcp->u_arg[0] = 0;
+ if (upeek(tcp->pid, sizeof(unsigned long)*PT_R1, &esp) < 0)
+ return 0;
+ if (umove(tcp, esp, &sc) < 0)
+ return 0;
+ tcp->u_arg[0] = 1;
+ tcp->u_arg[1] = sc.oldmask;
+ }
+ else {
+ sigset_t sigm;
+ long_to_sigset(tcp->u_arg[1], &sigm);
+ tcp->u_rval = tcp->u_error = 0;
+ if (tcp->u_arg[0] == 0)
+ return 0;
+ tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
+ return RVAL_NONE | RVAL_STR;
+ }
+ return 0;
#else /* !POWERPC */
#ifdef M68K
long usp;
struct sigcontext sc;
if (entering(tcp)) {
- tcp->u_arg[0] = 0;
- if (upeek(tcp->pid, 4*PT_USP, &usp) < 0)
+ tcp->u_arg[0] = 0;
+ if (upeek(tcp->pid, 4*PT_USP, &usp) < 0)
return 0;
- if (umove(tcp, usp, &sc) < 0)
+ if (umove(tcp, usp, &sc) < 0)
return 0;
- tcp->u_arg[0] = 1;
- tcp->u_arg[1] = sc.sc_mask;
+ tcp->u_arg[0] = 1;
+ tcp->u_arg[1] = sc.sc_mask;
}
else {
- sigset_t sigm;
- long_to_sigset(tcp->u_arg[1], &sigm);
- tcp->u_rval = tcp->u_error = 0;
- if (tcp->u_arg[0] == 0)
+ sigset_t sigm;
+ long_to_sigset(tcp->u_arg[1], &sigm);
+ tcp->u_rval = tcp->u_error = 0;
+ if (tcp->u_arg[0] == 0)
return 0;
- tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
- return RVAL_NONE | RVAL_STR;
+ tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
+ return RVAL_NONE | RVAL_STR;
}
return 0;
#else /* !M68K */
@@ -1308,22 +1333,22 @@
struct sigcontext_struct sc;
if (entering(tcp)) {
- tcp->u_arg[0] = 0;
- if (upeek(tcp->pid, REG_FP, &fp) < 0)
+ tcp->u_arg[0] = 0;
+ if (upeek(tcp->pid, REG_FP, &fp) < 0)
return 0;
- if (umove(tcp, fp, &sc) < 0)
+ if (umove(tcp, fp, &sc) < 0)
return 0;
- tcp->u_arg[0] = 1;
- tcp->u_arg[1] = sc.sc_mask;
+ tcp->u_arg[0] = 1;
+ tcp->u_arg[1] = sc.sc_mask;
}
else {
- sigset_t sigm;
- long_to_sigset(tcp->u_arg[1], &sigm);
- tcp->u_rval = tcp->u_error = 0;
- if (tcp->u_arg[0] == 0)
+ sigset_t sigm;
+ long_to_sigset(tcp->u_arg[1], &sigm);
+ tcp->u_rval = tcp->u_error = 0;
+ if (tcp->u_arg[0] == 0)
return 0;
- tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
- return RVAL_NONE | RVAL_STR;
+ tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
+ return RVAL_NONE | RVAL_STR;
}
return 0;
#else
@@ -1333,8 +1358,8 @@
m_siginfo_t si;
if(ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0) {
- perror("sigreturn: PTRACE_GETREGS ");
- return 0;
+ perror("sigreturn: PTRACE_GETREGS ");
+ return 0;
}
if(entering(tcp)) {
tcp->u_arg[0] = 0;