Commit ff14c616 authored by Roland McGrath's avatar Roland McGrath Committed by Ingo Molnar

x86: x86-64 ia32 ptrace pt_regs cleanup

This cleans up the getreg32/putreg32 functions to use struct pt_regs in a
straightforward fashion, instead of equivalent ugly pointer arithmetic.
Signed-off-by: default avatarRoland McGrath <roland@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 35d0991f
...@@ -37,11 +37,11 @@ ...@@ -37,11 +37,11 @@
#define R32(l,q) \ #define R32(l,q) \
case offsetof(struct user32, regs.l): \ case offsetof(struct user32, regs.l): \
stack[offsetof(struct pt_regs, q) / 8] = val; break regs->q = val; break;
static int putreg32(struct task_struct *child, unsigned regno, u32 val) static int putreg32(struct task_struct *child, unsigned regno, u32 val)
{ {
__u64 *stack = (__u64 *)task_pt_regs(child); struct pt_regs *regs = task_pt_regs(child);
switch (regno) { switch (regno) {
case offsetof(struct user32, regs.fs): case offsetof(struct user32, regs.fs):
...@@ -65,12 +65,12 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val) ...@@ -65,12 +65,12 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)
case offsetof(struct user32, regs.ss): case offsetof(struct user32, regs.ss):
if ((val & 3) != 3) if ((val & 3) != 3)
return -EIO; return -EIO;
stack[offsetof(struct pt_regs, ss)/8] = val & 0xffff; regs->ss = val & 0xffff;
break; break;
case offsetof(struct user32, regs.cs): case offsetof(struct user32, regs.cs):
if ((val & 3) != 3) if ((val & 3) != 3)
return -EIO; return -EIO;
stack[offsetof(struct pt_regs, cs)/8] = val & 0xffff; regs->cs = val & 0xffff;
break; break;
R32(ebx, bx); R32(ebx, bx);
...@@ -84,9 +84,7 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val) ...@@ -84,9 +84,7 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)
R32(eip, ip); R32(eip, ip);
R32(esp, sp); R32(esp, sp);
case offsetof(struct user32, regs.eflags): { case offsetof(struct user32, regs.eflags):
__u64 *flags = &stack[offsetof(struct pt_regs, flags)/8];
val &= FLAG_MASK; val &= FLAG_MASK;
/* /*
* If the user value contains TF, mark that * If the user value contains TF, mark that
...@@ -97,9 +95,8 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val) ...@@ -97,9 +95,8 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)
clear_tsk_thread_flag(child, TIF_FORCED_TF); clear_tsk_thread_flag(child, TIF_FORCED_TF);
else if (test_tsk_thread_flag(child, TIF_FORCED_TF)) else if (test_tsk_thread_flag(child, TIF_FORCED_TF))
val |= X86_EFLAGS_TF; val |= X86_EFLAGS_TF;
*flags = val | (*flags & ~FLAG_MASK); regs->flags = val | (regs->flags & ~FLAG_MASK);
break; break;
}
case offsetof(struct user32, u_debugreg[0]) ... case offsetof(struct user32, u_debugreg[0]) ...
offsetof(struct user32, u_debugreg[7]): offsetof(struct user32, u_debugreg[7]):
...@@ -123,11 +120,11 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val) ...@@ -123,11 +120,11 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)
#define R32(l,q) \ #define R32(l,q) \
case offsetof(struct user32, regs.l): \ case offsetof(struct user32, regs.l): \
*val = stack[offsetof(struct pt_regs, q)/8]; break *val = regs->q; break
static int getreg32(struct task_struct *child, unsigned regno, u32 *val) static int getreg32(struct task_struct *child, unsigned regno, u32 *val)
{ {
__u64 *stack = (__u64 *)task_pt_regs(child); struct pt_regs *regs = task_pt_regs(child);
switch (regno) { switch (regno) {
case offsetof(struct user32, regs.fs): case offsetof(struct user32, regs.fs):
...@@ -160,7 +157,7 @@ static int getreg32(struct task_struct *child, unsigned regno, u32 *val) ...@@ -160,7 +157,7 @@ static int getreg32(struct task_struct *child, unsigned regno, u32 *val)
/* /*
* If the debugger set TF, hide it from the readout. * If the debugger set TF, hide it from the readout.
*/ */
*val = stack[offsetof(struct pt_regs, flags)/8]; *val = regs->flags;
if (test_tsk_thread_flag(child, TIF_FORCED_TF)) if (test_tsk_thread_flag(child, TIF_FORCED_TF))
*val &= ~X86_EFLAGS_TF; *val &= ~X86_EFLAGS_TF;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment