Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (C) 2004 PathScale, Inc
0004  * Copyright (C) 2004 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
0005  */
0006 
0007 #include <errno.h>
0008 #include <string.h>
0009 #include <sys/ptrace.h>
0010 #include <sysdep/ptrace.h>
0011 #include <sysdep/ptrace_user.h>
0012 #include <registers.h>
0013 
0014 int save_registers(int pid, struct uml_pt_regs *regs)
0015 {
0016     int err;
0017 
0018     err = ptrace(PTRACE_GETREGS, pid, 0, regs->gp);
0019     if (err < 0)
0020         return -errno;
0021     return 0;
0022 }
0023 
0024 int restore_pid_registers(int pid, struct uml_pt_regs *regs)
0025 {
0026     int err;
0027 
0028     err = ptrace(PTRACE_SETREGS, pid, 0, regs->gp);
0029     if (err < 0)
0030         return -errno;
0031     return 0;
0032 }
0033 
0034 /* This is set once at boot time and not changed thereafter */
0035 
0036 static unsigned long exec_regs[MAX_REG_NR];
0037 static unsigned long exec_fp_regs[FP_SIZE];
0038 
0039 int init_pid_registers(int pid)
0040 {
0041     int err;
0042 
0043     err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs);
0044     if (err < 0)
0045         return -errno;
0046 
0047     arch_init_registers(pid);
0048     get_fp_registers(pid, exec_fp_regs);
0049     return 0;
0050 }
0051 
0052 void get_safe_registers(unsigned long *regs, unsigned long *fp_regs)
0053 {
0054     memcpy(regs, exec_regs, sizeof(exec_regs));
0055 
0056     if (fp_regs)
0057         memcpy(fp_regs, exec_fp_regs, sizeof(exec_fp_regs));
0058 }