]>
Commit | Line | Data |
---|---|---|
42daba31 JD |
1 | /* |
2 | * Copyright (C) 2004 PathScale, Inc | |
ba180fd4 | 3 | * Copyright (C) 2004 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) |
42daba31 JD |
4 | * Licensed under the GPL |
5 | */ | |
6 | ||
7 | #include <errno.h> | |
8 | #include <string.h> | |
9 | #include <sys/ptrace.h> | |
37185b33 AV |
10 | #include <sysdep/ptrace.h> |
11 | #include <sysdep/ptrace_user.h> | |
12 | #include <registers.h> | |
42daba31 | 13 | |
3e6f2ac4 | 14 | int save_registers(int pid, struct uml_pt_regs *regs) |
42daba31 JD |
15 | { |
16 | int err; | |
17 | ||
18baddda | 18 | err = ptrace(PTRACE_GETREGS, pid, 0, regs->gp); |
ba180fd4 | 19 | if (err < 0) |
3e6f2ac4 JD |
20 | return -errno; |
21 | return 0; | |
42daba31 JD |
22 | } |
23 | ||
3e6f2ac4 | 24 | int restore_registers(int pid, struct uml_pt_regs *regs) |
42daba31 JD |
25 | { |
26 | int err; | |
27 | ||
18baddda | 28 | err = ptrace(PTRACE_SETREGS, pid, 0, regs->gp); |
ba180fd4 | 29 | if (err < 0) |
3e6f2ac4 JD |
30 | return -errno; |
31 | return 0; | |
42daba31 JD |
32 | } |
33 | ||
d25f2e12 JD |
34 | /* This is set once at boot time and not changed thereafter */ |
35 | ||
36 | static unsigned long exec_regs[MAX_REG_NR]; | |
fbfe9c84 | 37 | static unsigned long exec_fp_regs[FP_SIZE]; |
d25f2e12 | 38 | |
3e6f2ac4 | 39 | int init_registers(int pid) |
42daba31 JD |
40 | { |
41 | int err; | |
42 | ||
43 | err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs); | |
3e6f2ac4 JD |
44 | if (err < 0) |
45 | return -errno; | |
a5f6096c JD |
46 | |
47 | arch_init_registers(pid); | |
fbfe9c84 | 48 | get_fp_registers(pid, exec_fp_regs); |
3e6f2ac4 | 49 | return 0; |
42daba31 JD |
50 | } |
51 | ||
fbfe9c84 | 52 | void get_safe_registers(unsigned long *regs, unsigned long *fp_regs) |
42daba31 JD |
53 | { |
54 | memcpy(regs, exec_regs, sizeof(exec_regs)); | |
fbfe9c84 IL |
55 | |
56 | if (fp_regs) | |
57 | memcpy(fp_regs, exec_fp_regs, sizeof(exec_fp_regs)); | |
42daba31 | 58 | } |