blob: a32ba6ab12112e3c6379d55588e538560512fb28 [file] [log] [blame]
Jeff Dike42daba32007-10-16 01:26:47 -07001/*
2 * Copyright (C) 2004 PathScale, Inc
Jeff Dikeba180fd2007-10-16 01:27:00 -07003 * Copyright (C) 2004 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
Jeff Dike42daba32007-10-16 01:26:47 -07004 * Licensed under the GPL
5 */
6
7#include <errno.h>
8#include <string.h>
9#include <sys/ptrace.h>
Jeff Dike42daba32007-10-16 01:26:47 -070010#include "sysdep/ptrace.h"
Jeff Dikeba180fd2007-10-16 01:27:00 -070011#include "user.h"
Jeff Dike42daba32007-10-16 01:26:47 -070012
13/* This is set once at boot time and not changed thereafter */
14
15static unsigned long exec_regs[MAX_REG_NR];
16
Jeff Dike77bf4402007-10-16 01:26:58 -070017void init_thread_registers(struct uml_pt_regs *to)
Jeff Dike42daba32007-10-16 01:26:47 -070018{
Jeff Dike18baddd2007-10-16 01:27:07 -070019 memcpy(to->gp, exec_regs, sizeof(to->gp));
Jeff Dike42daba32007-10-16 01:26:47 -070020}
21
Jeff Dike77bf4402007-10-16 01:26:58 -070022void save_registers(int pid, struct uml_pt_regs *regs)
Jeff Dike42daba32007-10-16 01:26:47 -070023{
24 int err;
25
Jeff Dike18baddd2007-10-16 01:27:07 -070026 err = ptrace(PTRACE_GETREGS, pid, 0, regs->gp);
Jeff Dikeba180fd2007-10-16 01:27:00 -070027 if (err < 0)
Jeff Dike42daba32007-10-16 01:26:47 -070028 panic("save_registers - saving registers failed, errno = %d\n",
29 errno);
30}
31
Jeff Dike77bf4402007-10-16 01:26:58 -070032void restore_registers(int pid, struct uml_pt_regs *regs)
Jeff Dike42daba32007-10-16 01:26:47 -070033{
34 int err;
35
Jeff Dike18baddd2007-10-16 01:27:07 -070036 err = ptrace(PTRACE_SETREGS, pid, 0, regs->gp);
Jeff Dikeba180fd2007-10-16 01:27:00 -070037 if (err < 0)
Jeff Dike42daba32007-10-16 01:26:47 -070038 panic("restore_registers - saving registers failed, "
39 "errno = %d\n", errno);
40}
41
42void init_registers(int pid)
43{
44 int err;
45
46 err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs);
Jeff Dikeba180fd2007-10-16 01:27:00 -070047 if (err)
Jeff Dike42daba32007-10-16 01:26:47 -070048 panic("check_ptrace : PTRACE_GETREGS failed, errno = %d",
49 errno);
Jeff Dikea5f6096c2007-10-16 01:27:15 -070050
51 arch_init_registers(pid);
Jeff Dike42daba32007-10-16 01:26:47 -070052}
53
54void get_safe_registers(unsigned long *regs)
55{
56 memcpy(regs, exec_regs, sizeof(exec_regs));
57}