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