diff options
Diffstat (limited to 'arch/um/os-Linux')
-rw-r--r-- | arch/um/os-Linux/skas/process.c | 15 | ||||
-rw-r--r-- | arch/um/os-Linux/sys-i386/registers.c | 16 | ||||
-rw-r--r-- | arch/um/os-Linux/sys-x86_64/registers.c | 10 |
3 files changed, 41 insertions, 0 deletions
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index b14829469fae..1e8cba6550a9 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c | |||
@@ -115,6 +115,14 @@ void get_skas_faultinfo(int pid, struct faultinfo * fi) | |||
115 | sizeof(struct ptrace_faultinfo)); | 115 | sizeof(struct ptrace_faultinfo)); |
116 | } | 116 | } |
117 | else { | 117 | else { |
118 | unsigned long fpregs[FP_SIZE]; | ||
119 | |||
120 | err = get_fp_registers(pid, fpregs); | ||
121 | if (err < 0) { | ||
122 | printk(UM_KERN_ERR "save_fp_registers returned %d\n", | ||
123 | err); | ||
124 | fatal_sigsegv(); | ||
125 | } | ||
118 | err = ptrace(PTRACE_CONT, pid, 0, SIGSEGV); | 126 | err = ptrace(PTRACE_CONT, pid, 0, SIGSEGV); |
119 | if (err) { | 127 | if (err) { |
120 | printk(UM_KERN_ERR "Failed to continue stub, pid = %d, " | 128 | printk(UM_KERN_ERR "Failed to continue stub, pid = %d, " |
@@ -128,6 +136,13 @@ void get_skas_faultinfo(int pid, struct faultinfo * fi) | |||
128 | * the stub stack page. We just have to copy it. | 136 | * the stub stack page. We just have to copy it. |
129 | */ | 137 | */ |
130 | memcpy(fi, (void *)current_stub_stack(), sizeof(*fi)); | 138 | memcpy(fi, (void *)current_stub_stack(), sizeof(*fi)); |
139 | |||
140 | err = put_fp_registers(pid, fpregs); | ||
141 | if (err < 0) { | ||
142 | printk(UM_KERN_ERR "put_fp_registers returned %d\n", | ||
143 | err); | ||
144 | fatal_sigsegv(); | ||
145 | } | ||
131 | } | 146 | } |
132 | } | 147 | } |
133 | 148 | ||
diff --git a/arch/um/os-Linux/sys-i386/registers.c b/arch/um/os-Linux/sys-i386/registers.c index f74d853a0ee0..b613473b3ec1 100644 --- a/arch/um/os-Linux/sys-i386/registers.c +++ b/arch/um/os-Linux/sys-i386/registers.c | |||
@@ -56,6 +56,22 @@ unsigned long get_thread_reg(int reg, jmp_buf *buf) | |||
56 | 56 | ||
57 | int have_fpx_regs = 1; | 57 | int have_fpx_regs = 1; |
58 | 58 | ||
59 | int get_fp_registers(int pid, unsigned long *regs) | ||
60 | { | ||
61 | if (have_fpx_regs) | ||
62 | return save_fpx_registers(pid, regs); | ||
63 | else | ||
64 | return save_fp_registers(pid, regs); | ||
65 | } | ||
66 | |||
67 | int put_fp_registers(int pid, unsigned long *regs) | ||
68 | { | ||
69 | if (have_fpx_regs) | ||
70 | return restore_fpx_registers(pid, regs); | ||
71 | else | ||
72 | return restore_fp_registers(pid, regs); | ||
73 | } | ||
74 | |||
59 | void arch_init_registers(int pid) | 75 | void arch_init_registers(int pid) |
60 | { | 76 | { |
61 | unsigned long fpx_regs[HOST_XFP_SIZE]; | 77 | unsigned long fpx_regs[HOST_XFP_SIZE]; |
diff --git a/arch/um/os-Linux/sys-x86_64/registers.c b/arch/um/os-Linux/sys-x86_64/registers.c index a375853337a7..594d97ad02b3 100644 --- a/arch/um/os-Linux/sys-x86_64/registers.c +++ b/arch/um/os-Linux/sys-x86_64/registers.c | |||
@@ -40,3 +40,13 @@ unsigned long get_thread_reg(int reg, jmp_buf *buf) | |||
40 | return 0; | 40 | return 0; |
41 | } | 41 | } |
42 | } | 42 | } |
43 | |||
44 | int get_fp_registers(int pid, unsigned long *regs) | ||
45 | { | ||
46 | return save_fp_registers(pid, regs); | ||
47 | } | ||
48 | |||
49 | int put_fp_registers(int pid, unsigned long *regs) | ||
50 | { | ||
51 | return restore_fp_registers(pid, regs); | ||
52 | } | ||