void mips64_supply_fpregset (struct regcache *regcache, const mips64_elf_fpregset_t *fpregsetp) { struct gdbarch *gdbarch = get_regcache_arch (regcache); int regi; /* See mips_linux_o32_sigframe_init for a description of the peculiar FP register layout. */ if (register_size (gdbarch, gdbarch_fp0_regnum (gdbarch)) == 4) for (regi = 0; regi < 32; regi++) { const gdb_byte *reg_ptr = (const gdb_byte *)(*fpregsetp + (regi & ~1)); if ((gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) != (regi & 1)) reg_ptr += 4; regcache_raw_supply (regcache, gdbarch_fp0_regnum (gdbarch) + regi, reg_ptr); } else for (regi = 0; regi < 32; regi++) regcache_raw_supply (regcache, gdbarch_fp0_regnum (gdbarch) + regi, (const char *)(*fpregsetp + regi)); supply_32bit_reg (regcache, mips_regnum (gdbarch)->fp_control_status, (const gdb_byte *)(*fpregsetp + 32)); /* The ABI doesn't tell us how to supply FCRIR, and core dumps don't include it - but the result of PTRACE_GETFPREGS does. The best we can do is to assume that its value is present. */ supply_32bit_reg (regcache, mips_regnum (gdbarch)->fp_implementation_revision, (const gdb_byte *)(*fpregsetp + 32) + 4); }
void mips_supply_gregset (struct regcache *regcache, const mips_elf_gregset_t *gregsetp) { int regi; const mips_elf_greg_t *regp = *gregsetp; char zerobuf[MAX_REGISTER_SIZE]; struct gdbarch *gdbarch = get_regcache_arch (regcache); memset (zerobuf, 0, MAX_REGISTER_SIZE); for (regi = EF_REG0 + 1; regi <= EF_REG31; regi++) supply_32bit_reg (regcache, regi - EF_REG0, regp + regi); if (mips_linux_restart_reg_p (gdbarch)) supply_32bit_reg (regcache, MIPS_RESTART_REGNUM, regp + EF_REG0); supply_32bit_reg (regcache, mips_regnum (gdbarch)->lo, regp + EF_LO); supply_32bit_reg (regcache, mips_regnum (gdbarch)->hi, regp + EF_HI); supply_32bit_reg (regcache, mips_regnum (gdbarch)->pc, regp + EF_CP0_EPC); supply_32bit_reg (regcache, mips_regnum (gdbarch)->badvaddr, regp + EF_CP0_BADVADDR); supply_32bit_reg (regcache, MIPS_PS_REGNUM, regp + EF_CP0_STATUS); supply_32bit_reg (regcache, mips_regnum (gdbarch)->cause, regp + EF_CP0_CAUSE); }
void mips_supply_gregset (struct regcache *regcache, const mips_elf_gregset_t *gregsetp) { int regi; const mips_elf_greg_t *regp = *gregsetp; char zerobuf[MAX_REGISTER_SIZE]; memset (zerobuf, 0, MAX_REGISTER_SIZE); for (regi = EF_REG0 + 1; regi <= EF_REG31; regi++) supply_32bit_reg (regcache, regi - EF_REG0, regp + regi); if (mips_linux_restart_reg_p (current_gdbarch)) supply_32bit_reg (regcache, MIPS_RESTART_REGNUM, regp + EF_REG0); supply_32bit_reg (regcache, mips_regnum (current_gdbarch)->lo, regp + EF_LO); supply_32bit_reg (regcache, mips_regnum (current_gdbarch)->hi, regp + EF_HI); supply_32bit_reg (regcache, mips_regnum (current_gdbarch)->pc, regp + EF_CP0_EPC); supply_32bit_reg (regcache, mips_regnum (current_gdbarch)->badvaddr, regp + EF_CP0_BADVADDR); supply_32bit_reg (regcache, MIPS_PS_REGNUM, regp + EF_CP0_STATUS); supply_32bit_reg (regcache, mips_regnum (current_gdbarch)->cause, regp + EF_CP0_CAUSE); /* Fill inaccessible registers with zero. */ regcache_raw_supply (regcache, MIPS_ZERO_REGNUM, zerobuf); regcache_raw_supply (regcache, MIPS_UNUSED_REGNUM, zerobuf); for (regi = MIPS_FIRST_EMBED_REGNUM; regi <= MIPS_LAST_EMBED_REGNUM; regi++) regcache_raw_supply (regcache, regi, zerobuf); }