]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * Copyright (C) 2004 PathScale, Inc | |
f0c4cad9 | 3 | * Copyright (C) 2004 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) |
1da177e4 LT |
4 | * Licensed under the GPL |
5 | */ | |
6 | ||
7 | #include <errno.h> | |
f0c4cad9 | 8 | #include "kern_constants.h" |
13c06be3 | 9 | #include "longjmp.h" |
1da177e4 | 10 | #include "user.h" |
f0c4cad9 | 11 | #include "sysdep/ptrace_user.h" |
1da177e4 | 12 | |
1da177e4 LT |
13 | int save_fp_registers(int pid, unsigned long *fp_regs) |
14 | { | |
f0c4cad9 | 15 | if (ptrace(PTRACE_GETFPREGS, pid, 0, fp_regs) < 0) |
6c59e2f5 JD |
16 | return -errno; |
17 | return 0; | |
1da177e4 LT |
18 | } |
19 | ||
20 | int restore_fp_registers(int pid, unsigned long *fp_regs) | |
21 | { | |
f0c4cad9 | 22 | if (ptrace(PTRACE_SETFPREGS, pid, 0, fp_regs) < 0) |
6c59e2f5 JD |
23 | return -errno; |
24 | return 0; | |
1da177e4 LT |
25 | } |
26 | ||
a5f6096c JD |
27 | int save_fpx_registers(int pid, unsigned long *fp_regs) |
28 | { | |
f0c4cad9 | 29 | if (ptrace(PTRACE_GETFPXREGS, pid, 0, fp_regs) < 0) |
a5f6096c JD |
30 | return -errno; |
31 | return 0; | |
32 | } | |
33 | ||
34 | int restore_fpx_registers(int pid, unsigned long *fp_regs) | |
35 | { | |
f0c4cad9 | 36 | if (ptrace(PTRACE_SETFPXREGS, pid, 0, fp_regs) < 0) |
a5f6096c JD |
37 | return -errno; |
38 | return 0; | |
39 | } | |
40 | ||
75e29b18 | 41 | unsigned long get_thread_reg(int reg, jmp_buf *buf) |
fad1c45c | 42 | { |
f0c4cad9 JD |
43 | switch (reg) { |
44 | case EIP: | |
45 | return buf[0]->__eip; | |
46 | case UESP: | |
47 | return buf[0]->__esp; | |
48 | case EBP: | |
49 | return buf[0]->__ebp; | |
75e29b18 | 50 | default: |
f0c4cad9 JD |
51 | printk(UM_KERN_ERR "get_thread_regs - unknown register %d\n", |
52 | reg); | |
75e29b18 JD |
53 | return 0; |
54 | } | |
fad1c45c | 55 | } |
a5f6096c JD |
56 | |
57 | int have_fpx_regs = 1; | |
58 | ||
2f56debd JD |
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 | ||
a5f6096c JD |
75 | void arch_init_registers(int pid) |
76 | { | |
77 | unsigned long fpx_regs[HOST_XFP_SIZE]; | |
78 | int err; | |
79 | ||
80 | err = ptrace(PTRACE_GETFPXREGS, pid, 0, fpx_regs); | |
5134d8fe | 81 | if (!err) |
a5f6096c JD |
82 | return; |
83 | ||
5134d8fe | 84 | if (errno != EIO) |
a5f6096c JD |
85 | panic("check_ptrace : PTRACE_GETFPXREGS failed, errno = %d", |
86 | errno); | |
87 | ||
88 | have_fpx_regs = 0; | |
89 | } |