diff options
Diffstat (limited to 'arch/x86_64/ia32')
-rw-r--r-- | arch/x86_64/ia32/fpu32.c | 1 | ||||
-rw-r--r-- | arch/x86_64/ia32/ia32_signal.c | 2 | ||||
-rw-r--r-- | arch/x86_64/ia32/ia32entry.S | 11 | ||||
-rw-r--r-- | arch/x86_64/ia32/ptrace32.c | 43 | ||||
-rw-r--r-- | arch/x86_64/ia32/sys_ia32.c | 25 |
5 files changed, 41 insertions, 41 deletions
diff --git a/arch/x86_64/ia32/fpu32.c b/arch/x86_64/ia32/fpu32.c index 1c23095f1813..2c8209a3605a 100644 --- a/arch/x86_64/ia32/fpu32.c +++ b/arch/x86_64/ia32/fpu32.c | |||
@@ -2,7 +2,6 @@ | |||
2 | * Copyright 2002 Andi Kleen, SuSE Labs. | 2 | * Copyright 2002 Andi Kleen, SuSE Labs. |
3 | * FXSAVE<->i387 conversion support. Based on code by Gareth Hughes. | 3 | * FXSAVE<->i387 conversion support. Based on code by Gareth Hughes. |
4 | * This is used for ptrace, signals and coredumps in 32bit emulation. | 4 | * This is used for ptrace, signals and coredumps in 32bit emulation. |
5 | * $Id: fpu32.c,v 1.1 2002/03/21 14:16:32 ak Exp $ | ||
6 | */ | 5 | */ |
7 | 6 | ||
8 | #include <linux/sched.h> | 7 | #include <linux/sched.h> |
diff --git a/arch/x86_64/ia32/ia32_signal.c b/arch/x86_64/ia32/ia32_signal.c index e0a92439f634..25e5ca22204c 100644 --- a/arch/x86_64/ia32/ia32_signal.c +++ b/arch/x86_64/ia32/ia32_signal.c | |||
@@ -6,8 +6,6 @@ | |||
6 | * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson | 6 | * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson |
7 | * 2000-06-20 Pentium III FXSR, SSE support by Gareth Hughes | 7 | * 2000-06-20 Pentium III FXSR, SSE support by Gareth Hughes |
8 | * 2000-12-* x86-64 compatibility mode signal handling by Andi Kleen | 8 | * 2000-12-* x86-64 compatibility mode signal handling by Andi Kleen |
9 | * | ||
10 | * $Id: ia32_signal.c,v 1.22 2002/07/29 10:34:03 ak Exp $ | ||
11 | */ | 9 | */ |
12 | 10 | ||
13 | #include <linux/sched.h> | 11 | #include <linux/sched.h> |
diff --git a/arch/x86_64/ia32/ia32entry.S b/arch/x86_64/ia32/ia32entry.S index 4ec594ab1a98..c536fa98ea37 100644 --- a/arch/x86_64/ia32/ia32entry.S +++ b/arch/x86_64/ia32/ia32entry.S | |||
@@ -155,6 +155,7 @@ sysenter_tracesys: | |||
155 | .previous | 155 | .previous |
156 | jmp sysenter_do_call | 156 | jmp sysenter_do_call |
157 | CFI_ENDPROC | 157 | CFI_ENDPROC |
158 | ENDPROC(ia32_sysenter_target) | ||
158 | 159 | ||
159 | /* | 160 | /* |
160 | * 32bit SYSCALL instruction entry. | 161 | * 32bit SYSCALL instruction entry. |
@@ -178,7 +179,7 @@ sysenter_tracesys: | |||
178 | */ | 179 | */ |
179 | ENTRY(ia32_cstar_target) | 180 | ENTRY(ia32_cstar_target) |
180 | CFI_STARTPROC32 simple | 181 | CFI_STARTPROC32 simple |
181 | CFI_DEF_CFA rsp,0 | 182 | CFI_DEF_CFA rsp,PDA_STACKOFFSET |
182 | CFI_REGISTER rip,rcx | 183 | CFI_REGISTER rip,rcx |
183 | /*CFI_REGISTER rflags,r11*/ | 184 | /*CFI_REGISTER rflags,r11*/ |
184 | swapgs | 185 | swapgs |
@@ -249,6 +250,7 @@ cstar_tracesys: | |||
249 | .quad 1b,ia32_badarg | 250 | .quad 1b,ia32_badarg |
250 | .previous | 251 | .previous |
251 | jmp cstar_do_call | 252 | jmp cstar_do_call |
253 | END(ia32_cstar_target) | ||
252 | 254 | ||
253 | ia32_badarg: | 255 | ia32_badarg: |
254 | movq $-EFAULT,%rax | 256 | movq $-EFAULT,%rax |
@@ -314,16 +316,13 @@ ia32_tracesys: | |||
314 | LOAD_ARGS ARGOFFSET /* reload args from stack in case ptrace changed it */ | 316 | LOAD_ARGS ARGOFFSET /* reload args from stack in case ptrace changed it */ |
315 | RESTORE_REST | 317 | RESTORE_REST |
316 | jmp ia32_do_syscall | 318 | jmp ia32_do_syscall |
319 | END(ia32_syscall) | ||
317 | 320 | ||
318 | ia32_badsys: | 321 | ia32_badsys: |
319 | movq $0,ORIG_RAX-ARGOFFSET(%rsp) | 322 | movq $0,ORIG_RAX-ARGOFFSET(%rsp) |
320 | movq $-ENOSYS,RAX-ARGOFFSET(%rsp) | 323 | movq $-ENOSYS,RAX-ARGOFFSET(%rsp) |
321 | jmp int_ret_from_sys_call | 324 | jmp int_ret_from_sys_call |
322 | 325 | ||
323 | ni_syscall: | ||
324 | movq %rax,%rdi | ||
325 | jmp sys32_ni_syscall | ||
326 | |||
327 | quiet_ni_syscall: | 326 | quiet_ni_syscall: |
328 | movq $-ENOSYS,%rax | 327 | movq $-ENOSYS,%rax |
329 | ret | 328 | ret |
@@ -370,10 +369,10 @@ ENTRY(ia32_ptregs_common) | |||
370 | RESTORE_REST | 369 | RESTORE_REST |
371 | jmp ia32_sysret /* misbalances the return cache */ | 370 | jmp ia32_sysret /* misbalances the return cache */ |
372 | CFI_ENDPROC | 371 | CFI_ENDPROC |
372 | END(ia32_ptregs_common) | ||
373 | 373 | ||
374 | .section .rodata,"a" | 374 | .section .rodata,"a" |
375 | .align 8 | 375 | .align 8 |
376 | .globl ia32_sys_call_table | ||
377 | ia32_sys_call_table: | 376 | ia32_sys_call_table: |
378 | .quad sys_restart_syscall | 377 | .quad sys_restart_syscall |
379 | .quad sys_exit | 378 | .quad sys_exit |
diff --git a/arch/x86_64/ia32/ptrace32.c b/arch/x86_64/ia32/ptrace32.c index 23a4515a73b4..a590b7a0d92d 100644 --- a/arch/x86_64/ia32/ptrace32.c +++ b/arch/x86_64/ia32/ptrace32.c | |||
@@ -7,8 +7,6 @@ | |||
7 | * | 7 | * |
8 | * This allows to access 64bit processes too; but there is no way to see the extended | 8 | * This allows to access 64bit processes too; but there is no way to see the extended |
9 | * register contents. | 9 | * register contents. |
10 | * | ||
11 | * $Id: ptrace32.c,v 1.16 2003/03/14 16:06:35 ak Exp $ | ||
12 | */ | 10 | */ |
13 | 11 | ||
14 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
@@ -27,6 +25,7 @@ | |||
27 | #include <asm/debugreg.h> | 25 | #include <asm/debugreg.h> |
28 | #include <asm/i387.h> | 26 | #include <asm/i387.h> |
29 | #include <asm/fpu32.h> | 27 | #include <asm/fpu32.h> |
28 | #include <asm/ia32.h> | ||
30 | 29 | ||
31 | /* | 30 | /* |
32 | * Determines which flags the user has access to [1 = access, 0 = no access]. | 31 | * Determines which flags the user has access to [1 = access, 0 = no access]. |
@@ -199,6 +198,24 @@ static int getreg32(struct task_struct *child, unsigned regno, u32 *val) | |||
199 | 198 | ||
200 | #undef R32 | 199 | #undef R32 |
201 | 200 | ||
201 | static long ptrace32_siginfo(unsigned request, u32 pid, u32 addr, u32 data) | ||
202 | { | ||
203 | int ret; | ||
204 | compat_siginfo_t *si32 = (compat_siginfo_t *)compat_ptr(data); | ||
205 | siginfo_t *si = compat_alloc_user_space(sizeof(siginfo_t)); | ||
206 | if (request == PTRACE_SETSIGINFO) { | ||
207 | ret = copy_siginfo_from_user32(si, si32); | ||
208 | if (ret) | ||
209 | return ret; | ||
210 | } | ||
211 | ret = sys_ptrace(request, pid, addr, (unsigned long)si); | ||
212 | if (ret) | ||
213 | return ret; | ||
214 | if (request == PTRACE_GETSIGINFO) | ||
215 | ret = copy_siginfo_to_user32(si32, si); | ||
216 | return ret; | ||
217 | } | ||
218 | |||
202 | asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) | 219 | asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) |
203 | { | 220 | { |
204 | struct task_struct *child; | 221 | struct task_struct *child; |
@@ -208,9 +225,19 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) | |||
208 | __u32 val; | 225 | __u32 val; |
209 | 226 | ||
210 | switch (request) { | 227 | switch (request) { |
211 | default: | 228 | case PTRACE_TRACEME: |
229 | case PTRACE_ATTACH: | ||
230 | case PTRACE_KILL: | ||
231 | case PTRACE_CONT: | ||
232 | case PTRACE_SINGLESTEP: | ||
233 | case PTRACE_DETACH: | ||
234 | case PTRACE_SYSCALL: | ||
235 | case PTRACE_SETOPTIONS: | ||
212 | return sys_ptrace(request, pid, addr, data); | 236 | return sys_ptrace(request, pid, addr, data); |
213 | 237 | ||
238 | default: | ||
239 | return -EINVAL; | ||
240 | |||
214 | case PTRACE_PEEKTEXT: | 241 | case PTRACE_PEEKTEXT: |
215 | case PTRACE_PEEKDATA: | 242 | case PTRACE_PEEKDATA: |
216 | case PTRACE_POKEDATA: | 243 | case PTRACE_POKEDATA: |
@@ -225,10 +252,11 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) | |||
225 | case PTRACE_GETFPXREGS: | 252 | case PTRACE_GETFPXREGS: |
226 | case PTRACE_GETEVENTMSG: | 253 | case PTRACE_GETEVENTMSG: |
227 | break; | 254 | break; |
228 | } | ||
229 | 255 | ||
230 | if (request == PTRACE_TRACEME) | 256 | case PTRACE_SETSIGINFO: |
231 | return ptrace_traceme(); | 257 | case PTRACE_GETSIGINFO: |
258 | return ptrace32_siginfo(request, pid, addr, data); | ||
259 | } | ||
232 | 260 | ||
233 | child = ptrace_get_task_struct(pid); | 261 | child = ptrace_get_task_struct(pid); |
234 | if (IS_ERR(child)) | 262 | if (IS_ERR(child)) |
@@ -349,8 +377,7 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) | |||
349 | break; | 377 | break; |
350 | 378 | ||
351 | default: | 379 | default: |
352 | ret = -EINVAL; | 380 | BUG(); |
353 | break; | ||
354 | } | 381 | } |
355 | 382 | ||
356 | out: | 383 | out: |
diff --git a/arch/x86_64/ia32/sys_ia32.c b/arch/x86_64/ia32/sys_ia32.c index f182b20858e2..dc88154c412b 100644 --- a/arch/x86_64/ia32/sys_ia32.c +++ b/arch/x86_64/ia32/sys_ia32.c | |||
@@ -508,19 +508,6 @@ sys32_waitpid(compat_pid_t pid, unsigned int *stat_addr, int options) | |||
508 | return compat_sys_wait4(pid, stat_addr, options, NULL); | 508 | return compat_sys_wait4(pid, stat_addr, options, NULL); |
509 | } | 509 | } |
510 | 510 | ||
511 | int sys32_ni_syscall(int call) | ||
512 | { | ||
513 | struct task_struct *me = current; | ||
514 | static char lastcomm[sizeof(me->comm)]; | ||
515 | |||
516 | if (strncmp(lastcomm, me->comm, sizeof(lastcomm))) { | ||
517 | printk(KERN_INFO "IA32 syscall %d from %s not implemented\n", | ||
518 | call, me->comm); | ||
519 | strncpy(lastcomm, me->comm, sizeof(lastcomm)); | ||
520 | } | ||
521 | return -ENOSYS; | ||
522 | } | ||
523 | |||
524 | /* 32-bit timeval and related flotsam. */ | 511 | /* 32-bit timeval and related flotsam. */ |
525 | 512 | ||
526 | asmlinkage long | 513 | asmlinkage long |
@@ -916,7 +903,7 @@ long sys32_vm86_warning(void) | |||
916 | struct task_struct *me = current; | 903 | struct task_struct *me = current; |
917 | static char lastcomm[sizeof(me->comm)]; | 904 | static char lastcomm[sizeof(me->comm)]; |
918 | if (strncmp(lastcomm, me->comm, sizeof(lastcomm))) { | 905 | if (strncmp(lastcomm, me->comm, sizeof(lastcomm))) { |
919 | printk(KERN_INFO "%s: vm86 mode not supported on 64 bit kernel\n", | 906 | compat_printk(KERN_INFO "%s: vm86 mode not supported on 64 bit kernel\n", |
920 | me->comm); | 907 | me->comm); |
921 | strncpy(lastcomm, me->comm, sizeof(lastcomm)); | 908 | strncpy(lastcomm, me->comm, sizeof(lastcomm)); |
922 | } | 909 | } |
@@ -929,13 +916,3 @@ long sys32_lookup_dcookie(u32 addr_low, u32 addr_high, | |||
929 | return sys_lookup_dcookie(((u64)addr_high << 32) | addr_low, buf, len); | 916 | return sys_lookup_dcookie(((u64)addr_high << 32) | addr_low, buf, len); |
930 | } | 917 | } |
931 | 918 | ||
932 | static int __init ia32_init (void) | ||
933 | { | ||
934 | printk("IA32 emulation $Id: sys_ia32.c,v 1.32 2002/03/24 13:02:28 ak Exp $\n"); | ||
935 | return 0; | ||
936 | } | ||
937 | |||
938 | __initcall(ia32_init); | ||
939 | |||
940 | extern unsigned long ia32_sys_call_table[]; | ||
941 | EXPORT_SYMBOL(ia32_sys_call_table); | ||