|
|
|
@ -21,9 +21,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ |
|
|
|
#include "/usr/include/sys/wait.h" |
|
|
|
#include "frame.h" |
|
|
|
#include "inferior.h" |
|
|
|
/***************************
|
|
|
|
#include "initialize.h" |
|
|
|
****************************/ |
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
#include <sys/param.h> |
|
|
|
@ -155,41 +152,27 @@ fetch_inferior_registers (ignored) |
|
|
|
{ |
|
|
|
struct regs inferior_registers; |
|
|
|
struct fp_status inferior_fp_registers; |
|
|
|
int i; |
|
|
|
|
|
|
|
/* Global and Out regs are fetched directly, as well as the control
|
|
|
|
registers. If we're getting one of the in or local regs, |
|
|
|
and the stack pointer has not yet been fetched, |
|
|
|
we have to do that first, since they're found in memory relative |
|
|
|
to the stack pointer. */ |
|
|
|
|
|
|
|
if (ptrace (PTRACE_GETREGS, inferior_pid, |
|
|
|
(PTRACE_ARG3_TYPE) &inferior_registers, 0)) |
|
|
|
perror("ptrace_getregs"); |
|
|
|
|
|
|
|
registers[REGISTER_BYTE (0)] = 0; |
|
|
|
memcpy (®isters[REGISTER_BYTE (1)], &inferior_registers.r_g1, |
|
|
|
15 * REGISTER_RAW_SIZE (G0_REGNUM)); |
|
|
|
*(int *)®isters[REGISTER_BYTE (PS_REGNUM)] = inferior_registers.r_ps; |
|
|
|
*(int *)®isters[REGISTER_BYTE (PC_REGNUM)] = inferior_registers.r_pc; |
|
|
|
*(int *)®isters[REGISTER_BYTE (NPC_REGNUM)] = inferior_registers.r_npc; |
|
|
|
*(int *)®isters[REGISTER_BYTE (Y_REGNUM)] = inferior_registers.r_y; |
|
|
|
|
|
|
|
/* Floating point registers */ |
|
|
|
|
|
|
|
if (ptrace (PTRACE_GETFPREGS, inferior_pid, |
|
|
|
(PTRACE_ARG3_TYPE) &inferior_fp_registers, |
|
|
|
0)) |
|
|
|
perror("ptrace_getfpregs"); |
|
|
|
ptrace (PTRACE_GETREGS, inferior_pid, |
|
|
|
(PTRACE_ARG3_TYPE) &inferior_registers); |
|
|
|
#ifdef FP0_REGNUM |
|
|
|
ptrace (PTRACE_GETFPREGS, inferior_pid, |
|
|
|
(PTRACE_ARG3_TYPE) &inferior_fp_registers); |
|
|
|
#endif |
|
|
|
|
|
|
|
memcpy (registers, &inferior_registers, 16 * 4); |
|
|
|
#ifdef FP0_REGNUM |
|
|
|
memcpy (®isters[REGISTER_BYTE (FP0_REGNUM)], &inferior_fp_registers, |
|
|
|
sizeof inferior_fp_registers.fpu_fr); |
|
|
|
|
|
|
|
/* These regs are saved on the stack by the kernel. Only read them
|
|
|
|
all (16 ptrace calls!) if we really need them. */ |
|
|
|
|
|
|
|
read_inferior_memory (*(CORE_ADDR*)®isters[REGISTER_BYTE (SP_REGNUM)], |
|
|
|
®isters[REGISTER_BYTE (L0_REGNUM)], |
|
|
|
16*REGISTER_RAW_SIZE (L0_REGNUM)); |
|
|
|
sizeof inferior_fp_registers.fps_regs); |
|
|
|
#endif |
|
|
|
*(int *)®isters[REGISTER_BYTE (PS_REGNUM)] = inferior_registers.r_ps; |
|
|
|
*(int *)®isters[REGISTER_BYTE (PC_REGNUM)] = inferior_registers.r_pc; |
|
|
|
#ifdef FP0_REGNUM |
|
|
|
memcpy |
|
|
|
(®isters[REGISTER_BYTE (FPC_REGNUM)], |
|
|
|
&inferior_fp_registers.fps_control, |
|
|
|
sizeof inferior_fp_registers - sizeof inferior_fp_registers.fps_regs); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
/* Store our register values back into the inferior.
|
|
|
|
@ -202,33 +185,27 @@ store_inferior_registers (ignored) |
|
|
|
{ |
|
|
|
struct regs inferior_registers; |
|
|
|
struct fp_status inferior_fp_registers; |
|
|
|
CORE_ADDR sp = *(CORE_ADDR *)®isters[REGISTER_BYTE (SP_REGNUM)]; |
|
|
|
|
|
|
|
write_inferior_memory (sp, ®isters[REGISTER_BYTE (L0_REGNUM)], |
|
|
|
16*REGISTER_RAW_SIZE (L0_REGNUM)); |
|
|
|
|
|
|
|
memcpy (&inferior_registers.r_g1, ®isters[REGISTER_BYTE (G1_REGNUM)], |
|
|
|
15 * REGISTER_RAW_SIZE (G1_REGNUM)); |
|
|
|
|
|
|
|
inferior_registers.r_ps = |
|
|
|
*(int *)®isters[REGISTER_BYTE (PS_REGNUM)]; |
|
|
|
inferior_registers.r_pc = |
|
|
|
*(int *)®isters[REGISTER_BYTE (PC_REGNUM)]; |
|
|
|
inferior_registers.r_npc = |
|
|
|
*(int *)®isters[REGISTER_BYTE (NPC_REGNUM)]; |
|
|
|
inferior_registers.r_y = |
|
|
|
*(int *)®isters[REGISTER_BYTE (Y_REGNUM)]; |
|
|
|
|
|
|
|
if (ptrace (PTRACE_SETREGS, inferior_pid, |
|
|
|
(PTRACE_ARG3_TYPE) &inferior_registers, 0)) |
|
|
|
perror("ptrace_setregs"); |
|
|
|
|
|
|
|
memcpy (&inferior_fp_registers, ®isters[REGISTER_BYTE (FP0_REGNUM)], |
|
|
|
sizeof inferior_fp_registers.fpu_fr); |
|
|
|
|
|
|
|
if (ptrace (PTRACE_SETFPREGS, inferior_pid, |
|
|
|
(PTRACE_ARG3_TYPE) &inferior_fp_registers, 0)) |
|
|
|
perror("ptrace_setfpregs"); |
|
|
|
bcopy (registers, &inferior_registers, 16 * 4); |
|
|
|
#ifdef FP0_REGNUM |
|
|
|
bcopy (®isters[REGISTER_BYTE (FP0_REGNUM)], &inferior_fp_registers, |
|
|
|
sizeof inferior_fp_registers.fps_regs); |
|
|
|
#endif |
|
|
|
inferior_registers.r_ps = *(int *)®isters[REGISTER_BYTE (PS_REGNUM)]; |
|
|
|
inferior_registers.r_pc = *(int *)®isters[REGISTER_BYTE (PC_REGNUM)]; |
|
|
|
|
|
|
|
#ifdef FP0_REGNUM |
|
|
|
bcopy (®isters[REGISTER_BYTE (FPC_REGNUM)], |
|
|
|
&inferior_fp_registers.fps_control, |
|
|
|
sizeof inferior_fp_registers - sizeof inferior_fp_registers.fps_regs); |
|
|
|
#endif |
|
|
|
|
|
|
|
ptrace (PTRACE_SETREGS, inferior_pid, |
|
|
|
(PTRACE_ARG3_TYPE) &inferior_registers); |
|
|
|
#if FP0_REGNUM |
|
|
|
ptrace (PTRACE_SETFPREGS, inferior_pid, |
|
|
|
(PTRACE_ARG3_TYPE) &inferior_fp_registers); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
/* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory
|
|
|
|
|