static void fetch_register (int regno) { int tid; int val; if (CANNOT_FETCH_REGISTER (regno)) { regcache_raw_supply (current_regcache, regno, NULL); return; } /* GNU/Linux LWP ID's are process ID's. */ tid = TIDGET (inferior_ptid); if (tid == 0) tid = PIDGET (inferior_ptid); /* Not a threaded program. */ errno = 0; val = ptrace (PTRACE_PEEKUSER, tid, register_addr (regno, 0), 0); if (errno != 0) error (_("Couldn't read register %s (#%d): %s."), REGISTER_NAME (regno), regno, safe_strerror (errno)); regcache_raw_supply (current_regcache, regno, &val); }
void mipsfbsd_supply_reg (char *regs, int regno) { int i; for (i = 0; i <= PC_REGNUM; i++) { if (regno == i || regno == -1) { if (CANNOT_FETCH_REGISTER (i)) supply_register (i, NULL); else supply_register (i, regs + (i * mips_regsize (current_gdbarch))); } } }
void mipsfbsd_supply_fpreg (char *fpregs, int regno) { int i; for (i = FP0_REGNUM; i <= mips_regnum (current_gdbarch)->fp_implementation_revision; i++) { if (regno == i || regno == -1) { if (CANNOT_FETCH_REGISTER (i)) supply_register (i, NULL); else supply_register (i, fpregs + ((i - FP0_REGNUM) * mips_regsize (current_gdbarch))); } } }
void alphabsd_supply_fpreg (char *fpregs, int regno) { int i; for (i = FP0_REGNUM; i < FP0_REGNUM + NUM_FPREGS; i++) { if (i == regno || regno == -1) { if (CANNOT_FETCH_REGISTER (i)) supply_register (i, NULL); else supply_register (i, fpregs + ((i - FP0_REGNUM) * 8)); } } if (regno == ALPHA_FPCR_REGNUM || regno == -1) supply_register (ALPHA_FPCR_REGNUM, fpregs + (32 * 8)); }
static void fetch_register (int regno) { /* This isn't really an address. But ptrace thinks of it as one. */ CORE_ADDR regaddr; char mess[128]; /* For messages */ int i; unsigned int offset; /* Offset of registers within the u area. */ char buf[MAX_REGISTER_SIZE]; int tid; if (CANNOT_FETCH_REGISTER (regno)) { memset (buf, '\0', register_size (current_gdbarch, regno)); /* Supply zeroes */ regcache_raw_supply (current_regcache, regno, buf); return; } /* Overload thread id onto process id */ tid = TIDGET (inferior_ptid); if (tid == 0) tid = PIDGET (inferior_ptid); /* no thread id, just use process id */ offset = U_REGS_OFFSET; regaddr = register_addr (regno, offset); for (i = 0; i < register_size (current_gdbarch, regno); i += sizeof (PTRACE_XFER_TYPE)) { errno = 0; *(PTRACE_XFER_TYPE *) &buf[i] = ptrace (PT_READ_U, tid, (PTRACE_ARG3_TYPE) regaddr, 0); regaddr += sizeof (PTRACE_XFER_TYPE); if (errno != 0) { sprintf (mess, "reading register %s (#%d)", REGISTER_NAME (regno), regno); perror_with_name (mess); } } regcache_raw_supply (current_regcache, regno, buf); }
void alphabsd_supply_reg (char *regs, int regno) { int i; for (i = 0; i < NUM_GREGS; i++) { if (i == regno || regno == -1) { if (CANNOT_FETCH_REGISTER (i)) supply_register (i, NULL); else supply_register (i, regs + (i * 8)); } } /* The PC travels in the ZERO slot. */ if (regno == PC_REGNUM || regno == -1) supply_register (PC_REGNUM, regs + (31 * 8)); }
static void inf_ptrace_fetch_register (int regnum) { CORE_ADDR addr; size_t size; PTRACE_TYPE_RET *buf; int pid, i; if (CANNOT_FETCH_REGISTER (regnum)) { regcache_raw_supply (current_regcache, regnum, NULL); return; } /* Cater for systems like GNU/Linux, that implement threads as separate processes. */ pid = ptid_get_lwp (inferior_ptid); if (pid == 0) pid = ptid_get_pid (inferior_ptid); /* This isn't really an address, but ptrace thinks of it as one. */ addr = inf_ptrace_register_u_offset (regnum); size = register_size (current_gdbarch, regnum); gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0); buf = alloca (size); /* Read the register contents from the inferior a chunk at a time. */ for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++) { errno = 0; buf[i] = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3)addr, 0); if (errno != 0) error (_("Couldn't read register %s (#%d): %s."), REGISTER_NAME (regnum), regnum, safe_strerror (errno)); addr += sizeof (PTRACE_TYPE_RET); } regcache_raw_supply (current_regcache, regnum, buf); }
static void fetch_register (int regnum) { CORE_ADDR addr; size_t size; PTRACE_TYPE_RET *buf; int tid, i; if (CANNOT_FETCH_REGISTER (regnum)) { regcache_raw_supply (current_regcache, regnum, NULL); return; } /* GNU/Linux LWP ID's are process ID's. */ tid = TIDGET (inferior_ptid); if (tid == 0) tid = PIDGET (inferior_ptid); /* Not a threaded program. */ /* This isn't really an address. But ptrace thinks of it as one. */ addr = register_addr (regnum, U_REGS_OFFSET); size = register_size (current_gdbarch, regnum); gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0); buf = alloca (size); /* Read the register contents from the inferior a chuck at the time. */ for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++) { errno = 0; buf[i] = ptrace (PT_READ_U, tid, (PTRACE_TYPE_ARG3) addr, 0); if (errno != 0) error (_("Couldn't read register %s (#%d): %s."), REGISTER_NAME (regnum), regnum, safe_strerror (errno)); addr += sizeof (PTRACE_TYPE_RET); } regcache_raw_supply (current_regcache, regnum, buf); }
static void fetch_osf_core_registers (char *core_reg_sect, unsigned core_reg_size, int which, CORE_ADDR reg_addr) { int regno; int addr; int bad_reg = -1; /* Table to map a gdb regnum to an index in the core register section. The floating point register values are garbage in OSF/1.2 core files. OSF5 uses different names for the register enum list, need to handle two cases. The actual values are the same. */ static int const core_reg_mapping[ALPHA_NUM_REGS] = { #ifdef NCF_REGS #define EFL NCF_REGS CF_V0, CF_T0, CF_T1, CF_T2, CF_T3, CF_T4, CF_T5, CF_T6, CF_T7, CF_S0, CF_S1, CF_S2, CF_S3, CF_S4, CF_S5, CF_S6, CF_A0, CF_A1, CF_A2, CF_A3, CF_A4, CF_A5, CF_T8, CF_T9, CF_T10, CF_T11, CF_RA, CF_T12, CF_AT, CF_GP, CF_SP, -1, EFL + 0, EFL + 1, EFL + 2, EFL + 3, EFL + 4, EFL + 5, EFL + 6, EFL + 7, EFL + 8, EFL + 9, EFL + 10, EFL + 11, EFL + 12, EFL + 13, EFL + 14, EFL + 15, EFL + 16, EFL + 17, EFL + 18, EFL + 19, EFL + 20, EFL + 21, EFL + 22, EFL + 23, EFL + 24, EFL + 25, EFL + 26, EFL + 27, EFL + 28, EFL + 29, EFL + 30, EFL + 31, CF_PC, -1 #else #define EFL (EF_SIZE / 8) EF_V0, EF_T0, EF_T1, EF_T2, EF_T3, EF_T4, EF_T5, EF_T6, EF_T7, EF_S0, EF_S1, EF_S2, EF_S3, EF_S4, EF_S5, EF_S6, EF_A0, EF_A1, EF_A2, EF_A3, EF_A4, EF_A5, EF_T8, EF_T9, EF_T10, EF_T11, EF_RA, EF_T12, EF_AT, EF_GP, EF_SP, -1, EFL + 0, EFL + 1, EFL + 2, EFL + 3, EFL + 4, EFL + 5, EFL + 6, EFL + 7, EFL + 8, EFL + 9, EFL + 10, EFL + 11, EFL + 12, EFL + 13, EFL + 14, EFL + 15, EFL + 16, EFL + 17, EFL + 18, EFL + 19, EFL + 20, EFL + 21, EFL + 22, EFL + 23, EFL + 24, EFL + 25, EFL + 26, EFL + 27, EFL + 28, EFL + 29, EFL + 30, EFL + 31, EF_PC, -1 #endif }; for (regno = 0; regno < ALPHA_NUM_REGS; regno++) { if (CANNOT_FETCH_REGISTER (regno)) { supply_register (regno, NULL); continue; } addr = 8 * core_reg_mapping[regno]; if (addr < 0 || addr >= core_reg_size) { /* ??? UNIQUE is a new addition. Don't generate an error. */ if (regno == ALPHA_UNIQUE_REGNUM) { supply_register (regno, NULL); continue; } if (bad_reg < 0) bad_reg = regno; } else { supply_register (regno, core_reg_sect + addr); } } if (bad_reg >= 0) { error ("Register %s not found in core file.", REGISTER_NAME (bad_reg)); } }