diff options
author | Jeff Dike <jdike@addtoit.com> | 2007-05-06 17:51:24 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-07 15:13:02 -0400 |
commit | 5d86456d3852cb95a38d2b23fe01cede54984ba5 (patch) | |
tree | a0e973d629717d93c7b4dc32ad7afd9e64f5f974 | |
parent | ccdddb57874522e6b267204f9c5e94ba7d9d66b0 (diff) |
uml: tidy fault code
Tidying in preparation for the segfault register dumping patch which follows.
void * pointers are changed to union uml_pt_regs *. This makes the types
match reality, except in arch_fixup, which is changed to operate on a union
uml_pt_regs. This fixes a bug in the call from segv_handler, which passes a
union uml_pt_regs, to segv, which expects to pass a struct sigcontext to
arch_fixup.
Whitespace and other style fixes.
There's also a errno printk fix.
Signed-off-by: Jeff Dike <jdike@linux.intel.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | arch/um/include/arch.h | 2 | ||||
-rw-r--r-- | arch/um/include/kern_util.h | 2 | ||||
-rw-r--r-- | arch/um/kernel/trap.c | 35 | ||||
-rw-r--r-- | arch/um/os-Linux/skas/trap.c | 17 | ||||
-rw-r--r-- | arch/um/sys-i386/fault.c | 18 | ||||
-rw-r--r-- | arch/um/sys-i386/signal.c | 41 | ||||
-rw-r--r-- | arch/um/sys-x86_64/fault.c | 30 | ||||
-rw-r--r-- | arch/um/sys-x86_64/signal.c | 2 |
8 files changed, 63 insertions, 84 deletions
diff --git a/arch/um/include/arch.h b/arch/um/include/arch.h index 8e11dd7c1adb..10ad52daa8c5 100644 --- a/arch/um/include/arch.h +++ b/arch/um/include/arch.h | |||
@@ -9,7 +9,7 @@ | |||
9 | #include "sysdep/ptrace.h" | 9 | #include "sysdep/ptrace.h" |
10 | 10 | ||
11 | extern void arch_check_bugs(void); | 11 | extern void arch_check_bugs(void); |
12 | extern int arch_fixup(unsigned long address, void *sc_ptr); | 12 | extern int arch_fixup(unsigned long address, union uml_pt_regs *regs); |
13 | extern int arch_handle_signal(int sig, union uml_pt_regs *regs); | 13 | extern int arch_handle_signal(int sig, union uml_pt_regs *regs); |
14 | 14 | ||
15 | #endif | 15 | #endif |
diff --git a/arch/um/include/kern_util.h b/arch/um/include/kern_util.h index ae434a9b400d..092a2841556f 100644 --- a/arch/um/include/kern_util.h +++ b/arch/um/include/kern_util.h | |||
@@ -44,7 +44,7 @@ extern unsigned long alloc_stack(int order, int atomic); | |||
44 | extern int do_signal(void); | 44 | extern int do_signal(void); |
45 | extern int is_stack_fault(unsigned long sp); | 45 | extern int is_stack_fault(unsigned long sp); |
46 | extern unsigned long segv(struct faultinfo fi, unsigned long ip, | 46 | extern unsigned long segv(struct faultinfo fi, unsigned long ip, |
47 | int is_user, void *sc); | 47 | int is_user, union uml_pt_regs *regs); |
48 | extern int handle_page_fault(unsigned long address, unsigned long ip, | 48 | extern int handle_page_fault(unsigned long address, unsigned long ip, |
49 | int is_write, int is_user, int *code_out); | 49 | int is_write, int is_user, int *code_out); |
50 | extern void syscall_ready(void); | 50 | extern void syscall_ready(void); |
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c index 2de81d4d9b57..c3e62e634c0a 100644 --- a/arch/um/kernel/trap.c +++ b/arch/um/kernel/trap.c | |||
@@ -72,8 +72,8 @@ good_area: | |||
72 | goto out; | 72 | goto out; |
73 | 73 | ||
74 | /* Don't require VM_READ|VM_EXEC for write faults! */ | 74 | /* Don't require VM_READ|VM_EXEC for write faults! */ |
75 | if(!is_write && !(vma->vm_flags & (VM_READ | VM_EXEC))) | 75 | if(!is_write && !(vma->vm_flags & (VM_READ | VM_EXEC))) |
76 | goto out; | 76 | goto out; |
77 | 77 | ||
78 | do { | 78 | do { |
79 | survive: | 79 | survive: |
@@ -157,18 +157,19 @@ static void segv_handler(int sig, union uml_pt_regs *regs) | |||
157 | * the info in the regs. A pointer to the info then would | 157 | * the info in the regs. A pointer to the info then would |
158 | * give us bad data! | 158 | * give us bad data! |
159 | */ | 159 | */ |
160 | unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc) | 160 | unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, |
161 | union uml_pt_regs *regs) | ||
161 | { | 162 | { |
162 | struct siginfo si; | 163 | struct siginfo si; |
163 | void *catcher; | 164 | void *catcher; |
164 | int err; | 165 | int err; |
165 | int is_write = FAULT_WRITE(fi); | 166 | int is_write = FAULT_WRITE(fi); |
166 | unsigned long address = FAULT_ADDRESS(fi); | 167 | unsigned long address = FAULT_ADDRESS(fi); |
167 | 168 | ||
168 | if(!is_user && (address >= start_vm) && (address < end_vm)){ | 169 | if(!is_user && (address >= start_vm) && (address < end_vm)){ |
169 | flush_tlb_kernel_vm(); | 170 | flush_tlb_kernel_vm(); |
170 | return(0); | 171 | return 0; |
171 | } | 172 | } |
172 | else if(current->mm == NULL) | 173 | else if(current->mm == NULL) |
173 | panic("Segfault with no mm"); | 174 | panic("Segfault with no mm"); |
174 | 175 | ||
@@ -183,17 +184,17 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc) | |||
183 | 184 | ||
184 | catcher = current->thread.fault_catcher; | 185 | catcher = current->thread.fault_catcher; |
185 | if(!err) | 186 | if(!err) |
186 | return(0); | 187 | return 0; |
187 | else if(catcher != NULL){ | 188 | else if(catcher != NULL){ |
188 | current->thread.fault_addr = (void *) address; | 189 | current->thread.fault_addr = (void *) address; |
189 | do_longjmp(catcher, 1); | 190 | do_longjmp(catcher, 1); |
190 | } | 191 | } |
191 | else if(current->thread.fault_addr != NULL) | 192 | else if(current->thread.fault_addr != NULL) |
192 | panic("fault_addr set but no fault catcher"); | 193 | panic("fault_addr set but no fault catcher"); |
193 | else if(!is_user && arch_fixup(ip, sc)) | 194 | else if(!is_user && arch_fixup(ip, regs)) |
194 | return(0); | 195 | return 0; |
195 | 196 | ||
196 | if(!is_user) | 197 | if(!is_user) |
197 | panic("Kernel mode fault at addr 0x%lx, ip 0x%lx", | 198 | panic("Kernel mode fault at addr 0x%lx, ip 0x%lx", |
198 | address, ip); | 199 | address, ip); |
199 | 200 | ||
@@ -202,7 +203,7 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc) | |||
202 | si.si_errno = 0; | 203 | si.si_errno = 0; |
203 | si.si_code = BUS_ADRERR; | 204 | si.si_code = BUS_ADRERR; |
204 | si.si_addr = (void __user *)address; | 205 | si.si_addr = (void __user *)address; |
205 | current->thread.arch.faultinfo = fi; | 206 | current->thread.arch.faultinfo = fi; |
206 | force_sig_info(SIGBUS, &si, current); | 207 | force_sig_info(SIGBUS, &si, current); |
207 | } else if (err == -ENOMEM) { | 208 | } else if (err == -ENOMEM) { |
208 | printk("VM: killing process %s\n", current->comm); | 209 | printk("VM: killing process %s\n", current->comm); |
@@ -211,10 +212,10 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc) | |||
211 | BUG_ON(err != -EFAULT); | 212 | BUG_ON(err != -EFAULT); |
212 | si.si_signo = SIGSEGV; | 213 | si.si_signo = SIGSEGV; |
213 | si.si_addr = (void __user *) address; | 214 | si.si_addr = (void __user *) address; |
214 | current->thread.arch.faultinfo = fi; | 215 | current->thread.arch.faultinfo = fi; |
215 | force_sig_info(SIGSEGV, &si, current); | 216 | force_sig_info(SIGSEGV, &si, current); |
216 | } | 217 | } |
217 | return(0); | 218 | return 0; |
218 | } | 219 | } |
219 | 220 | ||
220 | void relay_signal(int sig, union uml_pt_regs *regs) | 221 | void relay_signal(int sig, union uml_pt_regs *regs) |
@@ -229,7 +230,7 @@ void relay_signal(int sig, union uml_pt_regs *regs) | |||
229 | panic("Kernel mode signal %d", sig); | 230 | panic("Kernel mode signal %d", sig); |
230 | } | 231 | } |
231 | 232 | ||
232 | current->thread.arch.faultinfo = *UPT_FAULTINFO(regs); | 233 | current->thread.arch.faultinfo = *UPT_FAULTINFO(regs); |
233 | force_sig(sig, current); | 234 | force_sig(sig, current); |
234 | } | 235 | } |
235 | 236 | ||
diff --git a/arch/um/os-Linux/skas/trap.c b/arch/um/os-Linux/skas/trap.c index f104427d2caf..6a20d08caf91 100644 --- a/arch/um/os-Linux/skas/trap.c +++ b/arch/um/os-Linux/skas/trap.c | |||
@@ -18,10 +18,9 @@ | |||
18 | void sig_handler_common_skas(int sig, void *sc_ptr) | 18 | void sig_handler_common_skas(int sig, void *sc_ptr) |
19 | { | 19 | { |
20 | struct sigcontext *sc = sc_ptr; | 20 | struct sigcontext *sc = sc_ptr; |
21 | struct skas_regs *r; | 21 | union uml_pt_regs *r; |
22 | void (*handler)(int, union uml_pt_regs *); | 22 | void (*handler)(int, union uml_pt_regs *); |
23 | int save_errno = errno; | 23 | int save_user, save_errno = errno; |
24 | int save_user; | ||
25 | 24 | ||
26 | /* This is done because to allow SIGSEGV to be delivered inside a SEGV | 25 | /* This is done because to allow SIGSEGV to be delivered inside a SEGV |
27 | * handler. This can happen in copy_user, and if SEGV is disabled, | 26 | * handler. This can happen in copy_user, and if SEGV is disabled, |
@@ -31,13 +30,13 @@ void sig_handler_common_skas(int sig, void *sc_ptr) | |||
31 | if(sig == SIGSEGV) | 30 | if(sig == SIGSEGV) |
32 | change_sig(SIGSEGV, 1); | 31 | change_sig(SIGSEGV, 1); |
33 | 32 | ||
34 | r = &TASK_REGS(get_current())->skas; | 33 | r = TASK_REGS(get_current()); |
35 | save_user = r->is_user; | 34 | save_user = r->skas.is_user; |
36 | r->is_user = 0; | 35 | r->skas.is_user = 0; |
37 | if ( sig == SIGFPE || sig == SIGSEGV || | 36 | if ( sig == SIGFPE || sig == SIGSEGV || |
38 | sig == SIGBUS || sig == SIGILL || | 37 | sig == SIGBUS || sig == SIGILL || |
39 | sig == SIGTRAP ) { | 38 | sig == SIGTRAP ) { |
40 | GET_FAULTINFO_FROM_SC(r->faultinfo, sc); | 39 | GET_FAULTINFO_FROM_SC(r->skas.faultinfo, sc); |
41 | } | 40 | } |
42 | 41 | ||
43 | change_sig(SIGUSR1, 1); | 42 | change_sig(SIGUSR1, 1); |
@@ -49,10 +48,10 @@ void sig_handler_common_skas(int sig, void *sc_ptr) | |||
49 | sig != SIGVTALRM && sig != SIGALRM) | 48 | sig != SIGVTALRM && sig != SIGALRM) |
50 | unblock_signals(); | 49 | unblock_signals(); |
51 | 50 | ||
52 | handler(sig, (union uml_pt_regs *) r); | 51 | handler(sig, r); |
53 | 52 | ||
54 | errno = save_errno; | 53 | errno = save_errno; |
55 | r->is_user = save_user; | 54 | r->skas.is_user = save_user; |
56 | } | 55 | } |
57 | 56 | ||
58 | extern int ptrace_faultinfo; | 57 | extern int ptrace_faultinfo; |
diff --git a/arch/um/sys-i386/fault.c b/arch/um/sys-i386/fault.c index d0bbcdfdb53f..745b4fd49e9f 100644 --- a/arch/um/sys-i386/fault.c +++ b/arch/um/sys-i386/fault.c | |||
@@ -3,9 +3,7 @@ | |||
3 | * Licensed under the GPL | 3 | * Licensed under the GPL |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <signal.h> | ||
7 | #include "sysdep/ptrace.h" | 6 | #include "sysdep/ptrace.h" |
8 | #include "sysdep/sigcontext.h" | ||
9 | 7 | ||
10 | /* These two are from asm-um/uaccess.h and linux/module.h, check them. */ | 8 | /* These two are from asm-um/uaccess.h and linux/module.h, check them. */ |
11 | struct exception_table_entry | 9 | struct exception_table_entry |
@@ -17,26 +15,14 @@ struct exception_table_entry | |||
17 | const struct exception_table_entry *search_exception_tables(unsigned long add); | 15 | const struct exception_table_entry *search_exception_tables(unsigned long add); |
18 | 16 | ||
19 | /* Compare this to arch/i386/mm/extable.c:fixup_exception() */ | 17 | /* Compare this to arch/i386/mm/extable.c:fixup_exception() */ |
20 | int arch_fixup(unsigned long address, void *sc_ptr) | 18 | int arch_fixup(unsigned long address, union uml_pt_regs *regs) |
21 | { | 19 | { |
22 | struct sigcontext *sc = sc_ptr; | ||
23 | const struct exception_table_entry *fixup; | 20 | const struct exception_table_entry *fixup; |
24 | 21 | ||
25 | fixup = search_exception_tables(address); | 22 | fixup = search_exception_tables(address); |
26 | if(fixup != 0){ | 23 | if(fixup != 0){ |
27 | sc->eip = fixup->fixup; | 24 | UPT_IP(regs) = fixup->fixup; |
28 | return(1); | 25 | return(1); |
29 | } | 26 | } |
30 | return(0); | 27 | return(0); |
31 | } | 28 | } |
32 | |||
33 | /* | ||
34 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
35 | * Emacs will notice this stuff at the end of the file and automatically | ||
36 | * adjust the settings for this buffer only. This must remain at the end | ||
37 | * of the file. | ||
38 | * --------------------------------------------------------------------------- | ||
39 | * Local variables: | ||
40 | * c-file-style: "linux" | ||
41 | * End: | ||
42 | */ | ||
diff --git a/arch/um/sys-i386/signal.c b/arch/um/sys-i386/signal.c index 3f6acd667717..42ecf8e8ad08 100644 --- a/arch/um/sys-i386/signal.c +++ b/arch/um/sys-i386/signal.c | |||
@@ -28,7 +28,7 @@ static int copy_sc_from_user_skas(struct pt_regs *regs, | |||
28 | err = copy_from_user(&sc, from, sizeof(sc)); | 28 | err = copy_from_user(&sc, from, sizeof(sc)); |
29 | err |= copy_from_user(fpregs, sc.fpstate, sizeof(fpregs)); | 29 | err |= copy_from_user(fpregs, sc.fpstate, sizeof(fpregs)); |
30 | if(err) | 30 | if(err) |
31 | return(err); | 31 | return err; |
32 | 32 | ||
33 | REGS_GS(regs->regs.skas.regs) = sc.gs; | 33 | REGS_GS(regs->regs.skas.regs) = sc.gs; |
34 | REGS_FS(regs->regs.skas.regs) = sc.fs; | 34 | REGS_FS(regs->regs.skas.regs) = sc.fs; |
@@ -50,11 +50,11 @@ static int copy_sc_from_user_skas(struct pt_regs *regs, | |||
50 | err = restore_fp_registers(userspace_pid[0], fpregs); | 50 | err = restore_fp_registers(userspace_pid[0], fpregs); |
51 | if(err < 0){ | 51 | if(err < 0){ |
52 | printk("copy_sc_from_user_skas - PTRACE_SETFPREGS failed, " | 52 | printk("copy_sc_from_user_skas - PTRACE_SETFPREGS failed, " |
53 | "errno = %d\n", err); | 53 | "errno = %d\n", -err); |
54 | return(1); | 54 | return err; |
55 | } | 55 | } |
56 | 56 | ||
57 | return(0); | 57 | return 0; |
58 | } | 58 | } |
59 | 59 | ||
60 | int copy_sc_to_user_skas(struct sigcontext __user *to, struct _fpstate __user *to_fp, | 60 | int copy_sc_to_user_skas(struct sigcontext __user *to, struct _fpstate __user *to_fp, |
@@ -90,16 +90,16 @@ int copy_sc_to_user_skas(struct sigcontext __user *to, struct _fpstate __user *t | |||
90 | if(err < 0){ | 90 | if(err < 0){ |
91 | printk("copy_sc_to_user_skas - PTRACE_GETFPREGS failed, " | 91 | printk("copy_sc_to_user_skas - PTRACE_GETFPREGS failed, " |
92 | "errno = %d\n", err); | 92 | "errno = %d\n", err); |
93 | return(1); | 93 | return 1; |
94 | } | 94 | } |
95 | to_fp = (to_fp ? to_fp : (struct _fpstate __user *) (to + 1)); | 95 | to_fp = (to_fp ? to_fp : (struct _fpstate __user *) (to + 1)); |
96 | sc.fpstate = to_fp; | 96 | sc.fpstate = to_fp; |
97 | 97 | ||
98 | if(err) | 98 | if(err) |
99 | return(err); | 99 | return err; |
100 | 100 | ||
101 | return(copy_to_user(to, &sc, sizeof(sc)) || | 101 | return copy_to_user(to, &sc, sizeof(sc)) || |
102 | copy_to_user(to_fp, fpregs, sizeof(fpregs))); | 102 | copy_to_user(to_fp, fpregs, sizeof(fpregs)); |
103 | } | 103 | } |
104 | #endif | 104 | #endif |
105 | 105 | ||
@@ -129,7 +129,7 @@ int copy_sc_from_user_tt(struct sigcontext *to, struct sigcontext __user *from, | |||
129 | to->fpstate = to_fp; | 129 | to->fpstate = to_fp; |
130 | if(to_fp != NULL) | 130 | if(to_fp != NULL) |
131 | err |= copy_from_user(to_fp, from_fp, fpsize); | 131 | err |= copy_from_user(to_fp, from_fp, fpsize); |
132 | return(err); | 132 | return err; |
133 | } | 133 | } |
134 | 134 | ||
135 | int copy_sc_to_user_tt(struct sigcontext __user *to, struct _fpstate __user *fp, | 135 | int copy_sc_to_user_tt(struct sigcontext __user *to, struct _fpstate __user *fp, |
@@ -164,15 +164,15 @@ static int copy_sc_from_user(struct pt_regs *to, void __user *from) | |||
164 | ret = CHOOSE_MODE(copy_sc_from_user_tt(UPT_SC(&to->regs), from, | 164 | ret = CHOOSE_MODE(copy_sc_from_user_tt(UPT_SC(&to->regs), from, |
165 | sizeof(struct _fpstate)), | 165 | sizeof(struct _fpstate)), |
166 | copy_sc_from_user_skas(to, from)); | 166 | copy_sc_from_user_skas(to, from)); |
167 | return(ret); | 167 | return ret; |
168 | } | 168 | } |
169 | 169 | ||
170 | static int copy_sc_to_user(struct sigcontext __user *to, struct _fpstate __user *fp, | 170 | static int copy_sc_to_user(struct sigcontext __user *to, struct _fpstate __user *fp, |
171 | struct pt_regs *from, unsigned long sp) | 171 | struct pt_regs *from, unsigned long sp) |
172 | { | 172 | { |
173 | return(CHOOSE_MODE(copy_sc_to_user_tt(to, fp, UPT_SC(&from->regs), | 173 | return CHOOSE_MODE(copy_sc_to_user_tt(to, fp, UPT_SC(&from->regs), |
174 | sizeof(*fp), sp), | 174 | sizeof(*fp), sp), |
175 | copy_sc_to_user_skas(to, fp, from, sp))); | 175 | copy_sc_to_user_skas(to, fp, from, sp)); |
176 | } | 176 | } |
177 | 177 | ||
178 | static int copy_ucontext_to_user(struct ucontext __user *uc, struct _fpstate __user *fp, | 178 | static int copy_ucontext_to_user(struct ucontext __user *uc, struct _fpstate __user *fp, |
@@ -185,7 +185,7 @@ static int copy_ucontext_to_user(struct ucontext __user *uc, struct _fpstate __u | |||
185 | err |= put_user(current->sas_ss_size, &uc->uc_stack.ss_size); | 185 | err |= put_user(current->sas_ss_size, &uc->uc_stack.ss_size); |
186 | err |= copy_sc_to_user(&uc->uc_mcontext, fp, ¤t->thread.regs, sp); | 186 | err |= copy_sc_to_user(&uc->uc_mcontext, fp, ¤t->thread.regs, sp); |
187 | err |= copy_to_user(&uc->uc_sigmask, set, sizeof(*set)); | 187 | err |= copy_to_user(&uc->uc_sigmask, set, sizeof(*set)); |
188 | return(err); | 188 | return err; |
189 | } | 189 | } |
190 | 190 | ||
191 | struct sigframe | 191 | struct sigframe |
@@ -359,7 +359,7 @@ long sys_sigreturn(struct pt_regs regs) | |||
359 | 359 | ||
360 | /* Avoid ERESTART handling */ | 360 | /* Avoid ERESTART handling */ |
361 | PT_REGS_SYSCALL_NR(¤t->thread.regs) = -1; | 361 | PT_REGS_SYSCALL_NR(¤t->thread.regs) = -1; |
362 | return(PT_REGS_SYSCALL_RET(¤t->thread.regs)); | 362 | return PT_REGS_SYSCALL_RET(¤t->thread.regs); |
363 | 363 | ||
364 | segfault: | 364 | segfault: |
365 | force_sig(SIGSEGV, current); | 365 | force_sig(SIGSEGV, current); |
@@ -389,20 +389,9 @@ long sys_rt_sigreturn(struct pt_regs regs) | |||
389 | 389 | ||
390 | /* Avoid ERESTART handling */ | 390 | /* Avoid ERESTART handling */ |
391 | PT_REGS_SYSCALL_NR(¤t->thread.regs) = -1; | 391 | PT_REGS_SYSCALL_NR(¤t->thread.regs) = -1; |
392 | return(PT_REGS_SYSCALL_RET(¤t->thread.regs)); | 392 | return PT_REGS_SYSCALL_RET(¤t->thread.regs); |
393 | 393 | ||
394 | segfault: | 394 | segfault: |
395 | force_sig(SIGSEGV, current); | 395 | force_sig(SIGSEGV, current); |
396 | return 0; | 396 | return 0; |
397 | } | 397 | } |
398 | |||
399 | /* | ||
400 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
401 | * Emacs will notice this stuff at the end of the file and automatically | ||
402 | * adjust the settings for this buffer only. This must remain at the end | ||
403 | * of the file. | ||
404 | * --------------------------------------------------------------------------- | ||
405 | * Local variables: | ||
406 | * c-file-style: "linux" | ||
407 | * End: | ||
408 | */ | ||
diff --git a/arch/um/sys-x86_64/fault.c b/arch/um/sys-x86_64/fault.c index cee1513c5c31..4636b1465b6c 100644 --- a/arch/um/sys-x86_64/fault.c +++ b/arch/um/sys-x86_64/fault.c | |||
@@ -4,20 +4,24 @@ | |||
4 | * Licensed under the GPL | 4 | * Licensed under the GPL |
5 | */ | 5 | */ |
6 | 6 | ||
7 | #include "user.h" | 7 | #include "sysdep/ptrace.h" |
8 | 8 | ||
9 | int arch_fixup(unsigned long address, void *sc_ptr) | 9 | /* These two are from asm-um/uaccess.h and linux/module.h, check them. */ |
10 | struct exception_table_entry | ||
10 | { | 11 | { |
11 | /* XXX search_exception_tables() */ | 12 | unsigned long insn; |
13 | unsigned long fixup; | ||
14 | }; | ||
15 | |||
16 | const struct exception_table_entry *search_exception_tables(unsigned long add); | ||
17 | int arch_fixup(unsigned long address, union uml_pt_regs *regs) | ||
18 | { | ||
19 | const struct exception_table_entry *fixup; | ||
20 | |||
21 | fixup = search_exception_tables(address); | ||
22 | if(fixup != 0){ | ||
23 | UPT_IP(regs) = fixup->fixup; | ||
24 | return(1); | ||
25 | } | ||
12 | return(0); | 26 | return(0); |
13 | } | 27 | } |
14 | |||
15 | /* Overrides for Emacs so that we follow Linus's tabbing style. | ||
16 | * Emacs will notice this stuff at the end of the file and automatically | ||
17 | * adjust the settings for this buffer only. This must remain at the end | ||
18 | * of the file. | ||
19 | * --------------------------------------------------------------------------- | ||
20 | * Local variables: | ||
21 | * c-file-style: "linux" | ||
22 | * End: | ||
23 | */ | ||
diff --git a/arch/um/sys-x86_64/signal.c b/arch/um/sys-x86_64/signal.c index af2f017617b4..068006213598 100644 --- a/arch/um/sys-x86_64/signal.c +++ b/arch/um/sys-x86_64/signal.c | |||
@@ -51,7 +51,7 @@ static int copy_sc_from_user_skas(struct pt_regs *regs, | |||
51 | 51 | ||
52 | #undef GETREG | 52 | #undef GETREG |
53 | 53 | ||
54 | return(err); | 54 | return err; |
55 | } | 55 | } |
56 | 56 | ||
57 | int copy_sc_to_user_skas(struct sigcontext __user *to, | 57 | int copy_sc_to_user_skas(struct sigcontext __user *to, |