Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[linux-drm-fsl-dcu.git] / arch / um / os-Linux / sys-x86_64 / registers.c
index 44438d15c3d699c5492d903a2e87df3765efe550..a2d7e0c603f798efe99beb39da79b35f3ca9199e 100644 (file)
@@ -9,6 +9,7 @@
 #include "uml-config.h"
 #include "skas_ptregs.h"
 #include "registers.h"
+#include "longjmp.h"
 #include "user.h"
 
 /* These are set once at boot time and not changed thereafter */
@@ -26,12 +27,12 @@ static int move_registers(int pid, int int_op, int fp_op,
                          union uml_pt_regs *regs)
 {
        if(ptrace(int_op, pid, 0, regs->skas.regs) < 0)
-               return(-errno);
+               return -errno;
 
        if(ptrace(fp_op, pid, 0, regs->skas.fp) < 0)
-               return(-errno);
+               return -errno;
 
-       return(0);
+       return 0;
 }
 
 void save_registers(int pid, union uml_pt_regs *regs)
@@ -61,26 +62,30 @@ void init_registers(int pid)
        err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs);
        if(err)
                panic("check_ptrace : PTRACE_GETREGS failed, errno = %d",
-                     err);
+                     errno);
 
        err = ptrace(PTRACE_GETFPREGS, pid, 0, exec_fp_regs);
        if(err)
                panic("check_ptrace : PTRACE_GETFPREGS failed, errno = %d",
-                     err);
+                     errno);
 }
 
-void get_safe_registers(unsigned long *regs)
+void get_safe_registers(unsigned long *regs, unsigned long *fp_regs)
 {
        memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long));
+       if(fp_regs != NULL)
+               memcpy(fp_regs, exec_fp_regs,
+                      HOST_FP_SIZE * sizeof(unsigned long));
 }
 
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
+unsigned long get_thread_reg(int reg, jmp_buf *buf)
+{
+       switch(reg){
+       case RIP: return buf[0]->__rip;
+       case RSP: return buf[0]->__rsp;
+       case RBP: return buf[0]->__rbp;
+       default:
+               printk("get_thread_regs - unknown register %d\n", reg);
+               return 0;
+       }
+}