]>
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> | |
42daba31 | 10 | #include "sysdep/ptrace.h" |
ba180fd4 | 11 | #include "user.h" |
42daba31 JD |
12 | |
13 | /* This is set once at boot time and not changed thereafter */ | |
14 | ||
15 | static unsigned long exec_regs[MAX_REG_NR]; | |
16 | ||
77bf4400 | 17 | void init_thread_registers(struct uml_pt_regs *to) |
42daba31 | 18 | { |
18baddda | 19 | memcpy(to->gp, exec_regs, sizeof(to->gp)); |
42daba31 JD |
20 | } |
21 | ||
77bf4400 | 22 | void save_registers(int pid, struct uml_pt_regs *regs) |
42daba31 JD |
23 | { |
24 | int err; | |
25 | ||
18baddda | 26 | err = ptrace(PTRACE_GETREGS, pid, 0, regs->gp); |
ba180fd4 | 27 | if (err < 0) |
42daba31 JD |
28 | panic("save_registers - saving registers failed, errno = %d\n", |
29 | errno); | |
30 | } | |
31 | ||
77bf4400 | 32 | void restore_registers(int pid, struct uml_pt_regs *regs) |
42daba31 JD |
33 | { |
34 | int err; | |
35 | ||
18baddda | 36 | err = ptrace(PTRACE_SETREGS, pid, 0, regs->gp); |
ba180fd4 | 37 | if (err < 0) |
42daba31 JD |
38 | panic("restore_registers - saving registers failed, " |
39 | "errno = %d\n", errno); | |
40 | } | |
41 | ||
42 | void init_registers(int pid) | |
43 | { | |
44 | int err; | |
45 | ||
46 | err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs); | |
ba180fd4 | 47 | if (err) |
42daba31 JD |
48 | panic("check_ptrace : PTRACE_GETREGS failed, errno = %d", |
49 | errno); | |
a5f6096c JD |
50 | |
51 | arch_init_registers(pid); | |
42daba31 JD |
52 | } |
53 | ||
54 | void get_safe_registers(unsigned long *regs) | |
55 | { | |
56 | memcpy(regs, exec_regs, sizeof(exec_regs)); | |
57 | } |