xref: /openbmc/linux/arch/um/os-Linux/registers.c (revision 77bf4400319db9d2a8af6b00c2be6faa0f3d07cb)
1 /*
2  * Copyright (C) 2004 PathScale, Inc
3  * Licensed under the GPL
4  */
5 
6 #include <errno.h>
7 #include <string.h>
8 #include <sys/ptrace.h>
9 #include "user.h"
10 #include "sysdep/ptrace.h"
11 
12 /* This is set once at boot time and not changed thereafter */
13 
14 static unsigned long exec_regs[MAX_REG_NR];
15 
16 void init_thread_registers(struct uml_pt_regs *to)
17 {
18 	memcpy(to->regs, exec_regs, sizeof(to->regs));
19 }
20 
21 void save_registers(int pid, struct uml_pt_regs *regs)
22 {
23 	int err;
24 
25 	err = ptrace(PTRACE_GETREGS, pid, 0, regs->regs);
26 	if(err < 0)
27 		panic("save_registers - saving registers failed, errno = %d\n",
28 		      errno);
29 }
30 
31 void restore_registers(int pid, struct uml_pt_regs *regs)
32 {
33 	int err;
34 
35 	err = ptrace(PTRACE_SETREGS, pid, 0, regs->regs);
36 	if(err < 0)
37 		panic("restore_registers - saving registers failed, "
38 		      "errno = %d\n", errno);
39 }
40 
41 void init_registers(int pid)
42 {
43 	int err;
44 
45 	err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs);
46 	if(err)
47 		panic("check_ptrace : PTRACE_GETREGS failed, errno = %d",
48 		      errno);
49 }
50 
51 void get_safe_registers(unsigned long *regs)
52 {
53 	memcpy(regs, exec_regs, sizeof(exec_regs));
54 }
55