static void mips64_fill_fpregset_wrapper (const struct regset *regset, const struct regcache *regcache, int regnum, void *gregs, size_t len) { gdb_assert (len == sizeof (mips64_elf_fpregset_t)); mips64_fill_fpregset (regcache, (mips64_elf_fpregset_t *)gregs, regnum); }
void fill_fpregset (const struct regcache *regcache, gdb_fpregset_t *fpregsetp, int regno) { if (mips_isa_regsize (get_regcache_arch (regcache)) == 4) mips_fill_fpregset (regcache, (mips_elf_fpregset_t *) fpregsetp, regno); else mips64_fill_fpregset (regcache, (mips64_elf_fpregset_t *) fpregsetp, regno); }
static void mips64_linux_regsets_store_registers (const struct regcache *regcache, int regno) { struct gdbarch *gdbarch = get_regcache_arch (regcache); int is_fp; int tid; if (regno >= mips_regnum (gdbarch)->fp0 && regno <= mips_regnum (gdbarch)->fp0 + 32) is_fp = 1; else if (regno == mips_regnum (gdbarch)->fp_control_status) is_fp = 1; else if (regno == mips_regnum (gdbarch)->fp_implementation_revision) is_fp = 1; else is_fp = 0; tid = ptid_get_lwp (inferior_ptid); if (tid == 0) tid = ptid_get_pid (inferior_ptid); if (regno == -1 || !is_fp) { mips64_elf_gregset_t regs; if (ptrace (PTRACE_GETREGS, tid, 0L, (PTRACE_TYPE_ARG3) ®s) == -1) perror_with_name (_("Couldn't get registers")); mips64_fill_gregset (regcache, ®s, regno); if (ptrace (PTRACE_SETREGS, tid, 0L, (PTRACE_TYPE_ARG3) ®s) == -1) perror_with_name (_("Couldn't set registers")); } if (regno == -1 || is_fp) { mips64_elf_fpregset_t fp_regs; if (ptrace (PTRACE_GETFPREGS, tid, 0L, (PTRACE_TYPE_ARG3) &fp_regs) == -1) perror_with_name (_("Couldn't get FP registers")); mips64_fill_fpregset (regcache, &fp_regs, regno); if (ptrace (PTRACE_SETFPREGS, tid, 0L, (PTRACE_TYPE_ARG3) &fp_regs) == -1) perror_with_name (_("Couldn't set FP registers")); } }
void mips64_fill_fpregset (const struct regcache *regcache, mips64_elf_fpregset_t *fpregsetp, int regno) { struct gdbarch *gdbarch = get_regcache_arch (regcache); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); gdb_byte *to; if ((regno >= gdbarch_fp0_regnum (gdbarch)) && (regno < gdbarch_fp0_regnum (gdbarch) + 32)) { /* See mips_linux_o32_sigframe_init for a description of the peculiar FP register layout. */ if (register_size (gdbarch, regno) == 4) { int regi = regno - gdbarch_fp0_regnum (gdbarch); to = (gdb_byte *) (*fpregsetp + (regi & ~1)); if ((gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) != (regi & 1)) to += 4; regcache_raw_collect (regcache, regno, to); } else { to = (gdb_byte *) (*fpregsetp + regno - gdbarch_fp0_regnum (gdbarch)); regcache_raw_collect (regcache, regno, to); } } else if (regno == mips_regnum (gdbarch)->fp_control_status) { gdb_byte buf[MAX_REGISTER_SIZE]; LONGEST val; regcache_raw_collect (regcache, regno, buf); val = extract_signed_integer (buf, register_size (gdbarch, regno), byte_order); to = (gdb_byte *) (*fpregsetp + 32); store_signed_integer (to, 4, byte_order, val); } else if (regno == mips_regnum (gdbarch)->fp_implementation_revision) { gdb_byte buf[MAX_REGISTER_SIZE]; LONGEST val; regcache_raw_collect (regcache, regno, buf); val = extract_signed_integer (buf, register_size (gdbarch, regno), byte_order); to = (gdb_byte *) (*fpregsetp + 32) + 4; store_signed_integer (to, 4, byte_order, val); } else if (regno == -1) { int regi; for (regi = 0; regi < 32; regi++) mips64_fill_fpregset (regcache, fpregsetp, gdbarch_fp0_regnum (gdbarch) + regi); mips64_fill_fpregset (regcache, fpregsetp, mips_regnum (gdbarch)->fp_control_status); mips64_fill_fpregset (regcache, fpregsetp, (mips_regnum (gdbarch) ->fp_implementation_revision)); } }