Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARC: stop using pt_regs->orig_r8

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>

+4 -16
+1 -12
arch/arc/include/asm/entry.h
··· 422 422 * Save scratch regs for sys calls 423 423 *-------------------------------------------------------------*/ 424 424 .macro SAVE_ALL_TRAP 425 - /* 426 - * Setup pt_regs->orig_r8. 427 - * Encode syscall number (r8) in upper short word of event type (r9) 428 - * N.B. #1: This is already endian safe (see ptrace.h) 429 - * #2: Only r9 can be used as scratch as it is already clobbered 430 - * and it's contents are no longer needed by the latter part 431 - * of exception prologue 432 - */ 433 - lsl r9, r8, 16 434 - or r9, r9, orig_r8_IS_SCALL 435 - 436 - SAVE_ALL_EXCEPTION r9 425 + SAVE_ALL_EXCEPTION orig_r8_IS_SCALL 437 426 .endm 438 427 439 428 /*--------------------------------------------------------------
+2 -3
arch/arc/include/asm/syscall.h
··· 18 18 syscall_get_nr(struct task_struct *task, struct pt_regs *regs) 19 19 { 20 20 if (user_mode(regs) && in_syscall(regs)) 21 - return regs->orig_r8; 21 + return regs->r8; 22 22 else 23 23 return -1; 24 24 } ··· 26 26 static inline void 27 27 syscall_rollback(struct task_struct *task, struct pt_regs *regs) 28 28 { 29 - /* XXX: I can't fathom how pt_regs->r8 will be clobbered ? */ 30 - regs->r8 = regs->orig_r8; 29 + regs->r0 = regs->orig_r0; 31 30 } 32 31 33 32 static inline long
+1 -1
arch/arc/include/uapi/asm/ptrace.h
··· 44 44 long r19, r18, r17, r16, r15, r14, r13; 45 45 } callee; 46 46 long efa; /* break pt addr, for break points in delay slots */ 47 - long stop_pc; /* give dbg stop_pc directly after checking orig_r8 */ 47 + long stop_pc; /* give dbg stop_pc after ensuring brkpt trap */ 48 48 }; 49 49 #endif /* !__ASSEMBLY__ */ 50 50