Skip to contentSkip to conversation

UML - Floating point signal delivery fixes

PATCH New Jeff Dike 1 participant 1 message Aug 23, 2007

Subsystems (2)
lore
Share & tools
lore

Jeff Dike

author
#0 lore raw

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
Index: linux-2.6.22/arch/um/include/sysdep-i386/ptrace.h
===================================================================
@@ -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
Index: linux-2.6.22/arch/um/include/sysdep-x86_64/ptrace.h
===================================================================
@@ -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
Index: linux-2.6.22/arch/um/os-Linux/registers.c
===================================================================
@@ -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
Index: linux-2.6.22/arch/um/os-Linux/sys-i386/registers.c
===================================================================
@@ -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, unsign
 	return 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, jm
 		return 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
Index: linux-2.6.22/arch/um/include/registers.h
===================================================================
@@ -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