]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ARC: stop using pt_regs->orig_r8
authorVineet Gupta <vgupta@synopsys.com>
Sat, 22 Jun 2013 07:08:59 +0000 (12:38 +0530)
committerVineet Gupta <vgupta@synopsys.com>
Sat, 22 Jun 2013 13:53:26 +0000 (19:23 +0530)
Historically, pt_regs have had orig_r8, an overloaded container for
  (1) backup copy of r8 (syscall number Trap Exceptions)
  (2) additional system state: (syscall/Exception/Interrupt)

There is no point in keeping (1) since syscall number is never clobbered
in-place, in pt_regs, unlike r0 which duals as first syscall arg as well
as syscall return value and in case of syscall restart, the orig arg0
needs restoring (from orig_r0)  after having been updated in-place with
syscall ret value.

This further paves way to convert (2) to contain ECR itself (rather than
current madeup values)

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/include/asm/entry.h
arch/arc/include/asm/syscall.h
arch/arc/include/uapi/asm/ptrace.h

index 72a7ed47117a30c0f617d96069c61ba60a40e1d6..de01bc842a9acb9e7578ffa33e76e0fb5e8ae440 100644 (file)
  * Save scratch regs for sys calls
  *-------------------------------------------------------------*/
 .macro SAVE_ALL_TRAP
-       /*
-        * Setup pt_regs->orig_r8.
-        * Encode syscall number (r8) in upper short word of event type (r9)
-        * N.B. #1: This is already endian safe (see ptrace.h)
-        *      #2: Only r9 can be used as scratch as it is already clobbered
-        *          and it's contents are no longer needed by the latter part
-        *          of exception prologue
-        */
-       lsl  r9, r8, 16
-       or   r9, r9, orig_r8_IS_SCALL
-
-       SAVE_ALL_EXCEPTION  r9
+       SAVE_ALL_EXCEPTION  orig_r8_IS_SCALL
 .endm
 
 /*--------------------------------------------------------------
index 33ab3048e9b20a6447475ec417b3fc10a91a309a..29de098043064a20112dd7ffd02f86059261ae44 100644 (file)
@@ -18,7 +18,7 @@ static inline long
 syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
 {
        if (user_mode(regs) && in_syscall(regs))
-               return regs->orig_r8;
+               return regs->r8;
        else
                return -1;
 }
@@ -26,8 +26,7 @@ syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
 static inline void
 syscall_rollback(struct task_struct *task, struct pt_regs *regs)
 {
-       /* XXX: I can't fathom how pt_regs->r8 will be clobbered ? */
-       regs->r8 = regs->orig_r8;
+       regs->r0 = regs->orig_r0;
 }
 
 static inline long
index 4599109f68f2262ad4ad26b36e5cfb7bc7ca3f34..2618cc13ba75ff1106f82f5604b54c691305bd76 100644 (file)
@@ -44,7 +44,7 @@ struct user_regs_struct {
                long r19, r18, r17, r16, r15, r14, r13;
        } callee;
        long efa;       /* break pt addr, for break points in delay slots */
-       long stop_pc;   /* give dbg stop_pc directly after checking orig_r8 */
+       long stop_pc;   /* give dbg stop_pc after ensuring brkpt trap */
 };
 #endif /* !__ASSEMBLY__ */