x86: x86-32 ptrace get/putreg current task
authorRoland McGrath <roland@redhat.com>
Wed, 30 Jan 2008 12:30:58 +0000 (13:30 +0100)
committerIngo Molnar <mingo@elte.hu>
Wed, 30 Jan 2008 12:30:58 +0000 (13:30 +0100)
This generalizes the getreg and putreg functions so they can be used on the
current task, as well as on a task stopped in TASK_TRACED and switched off.
This lays the groundwork to share this code for all kinds of user-mode
machine state access, not just ptrace.

Signed-off-by: Roland McGrath <roland@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/kernel/ptrace_32.c

index 5aca84e..2607130 100644 (file)
@@ -55,6 +55,12 @@ static int putreg(struct task_struct *child,
                if (value && (value & 3) != 3)
                        return -EIO;
                child->thread.gs = value;
+               if (child == current)
+                       /*
+                        * The user-mode %gs is not affected by
+                        * kernel entry, so we must update the CPU.
+                        */
+                       loadsegment(gs, value);
                return 0;
        case DS:
        case ES:
@@ -104,6 +110,8 @@ static unsigned long getreg(struct task_struct *child, unsigned long regno)
                break;
        case GS:
                retval = child->thread.gs;
+               if (child == current)
+                       savesegment(gs, retval);
                break;
        case DS:
        case ES: