UML - Floating point signal delivery fixes
Subsystems (2)
PATCH 2/7 UML - Floating point signal delivery fixes
Handle floating point state in across signals correctly. UML/i386 needs to know whether the host does PTRACE_[GS]ETFPXREGS, so an arch_init_registers hook is added, which on x86_64 does nothing.
UML doesn't save and restore floating point registers on kernel entry and exit, so they need to be copied between the host process and the sigcontext. save_fpx_registers and restore_fpx_registers are added for this purpose. save_fp_registers and restore_fp_registers already exist.
There was a bunch of floating point state conversion code in arch/um/sys-i386/ptrace.c which isn't needed there, but is needed in signal.c, so it is moved over.
The i386 code now distinguishes between fp and fpx state and handles them correctly. The x86_64 code just needs to copy state as-is between the host process and the stack. There are also some fixes there to pass the correct address of the floating point state around.
--
arch/um/include/registers.h | 2 arch/um/include/sysdep-i386/ptrace.h | 2 arch/um/include/sysdep-x86_64/ptrace.h | 4 arch/um/os-Linux/registers.c | 2 arch/um/os-Linux/sys-i386/registers.c | 35 ++++- arch/um/sys-i386/ptrace.c | 79 ----------- arch/um/sys-i386/signal.c | 221 ++++++++++++++++++++++++++++++--- arch/um/sys-x86_64/signal.c | 53 +++++-- 8 files changed, 283 insertions(+), 115 deletions(-)
arch/um/include/sysdep-i386/ptrace.h +2 -0
@@ -168,4 +168,6 @@ struct syscall_args {#define UPT_FAULTINFO (r) (&(r)->faultinfo) +extern void arch_init_registers (int pid); +#endif
arch/um/include/sysdep-x86_64/ptrace.h +4 -0
@@ -234,4 +234,8 @@ struct syscall_args {#define UPT_FAULTINFO (r) (&(r)->faultinfo) +static inline void arch_init_registers (int pid) +{ +} +#endif
arch/um/os-Linux/registers.c +2 -0
@@ -47,6 +47,8 @@ void init_registers(int pid)if (err)panic ("check_ptrace : PTRACE_GETREGS failed, errno = %d" , errno); + +arch_init_registers (pid); }void get_safe_registers (unsigned long *regs)
arch/um/os-Linux/sys-i386/registers.c +32 -3
@@ -8,9 +8,6 @@#include "longjmp.h" #include "user.h" -/* XXX These need to use [GS]ETFPXREGS and copy_sc_{to,from}_user_skas needs -* to pass in a sufficiently large buffer -*/ int save_fp_registers (int pid,unsigned long *fp_regs) {if (ptrace (PTRACE_GETFPREGS , pid,0 , fp_regs) <0 )
@@ -25,6 +22,20 @@ int restore_fp_registers(int pid, unsignreturn 0 ; } +int save_fpx_registers (int pid,unsigned long *fp_regs) +{ +if (ptrace (PTRACE_GETFPXREGS , pid,0 , fp_regs) <0 ) +return -errno; +return 0 ; +} + +int restore_fpx_registers (int pid,unsigned long *fp_regs) +{ +if (ptrace (PTRACE_SETFPXREGS , pid,0 , fp_regs) <0 ) +return -errno; +return 0 ; +} +unsigned long get_thread_reg (int reg,jmp_buf *buf) {switch (reg){
@@ -36,3 +47,21 @@ unsigned long get_thread_reg(int reg, jmreturn 0 ; } } + +int have_fpx_regs =1 ; + +void arch_init_registers (int pid) +{ +unsigned long fpx_regs[HOST_XFP_SIZE ]; +int err; + + err =ptrace (PTRACE_GETFPXREGS , pid,0 , fpx_regs); +if (!err) +return ; + +if (errno !=EIO ) +panic ("check_ptrace : PTRACE_GETFPXREGS failed, errno = %d" , + errno); + + have_fpx_regs =0 ; +}
arch/um/sys-i386/ptrace.c +0 -79
85 lines not on this page · raw message
arch/um/sys-i386/signal.c +202 -19
254 lines not on this page · raw message
arch/um/sys-x86_64/signal.c +39 -14
111 lines not on this page · raw message
arch/um/include/registers.h +2 -0
@@ -12,6 +12,8 @@extern void init_thread_registers (struct uml_pt_regs *to);extern int save_fp_registers (int pid,unsigned long *fp_regs);extern int restore_fp_registers (int pid,unsigned long *fp_regs); +extern int save_fpx_registers (int pid,unsigned long *fp_regs); +extern int restore_fpx_registers (int pid,unsigned long *fp_regs);extern void save_registers (int pid,struct uml_pt_regs *regs);extern void restore_registers (int pid,struct uml_pt_regs *regs);extern void init_registers (int pid);
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
User-mode-linux-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel