void mips64_fill_gregset (const struct regcache *regcache, mips64_elf_gregset_t *gregsetp, int regno) { int regaddr, regi; mips64_elf_greg_t *regp = *gregsetp; void *src, *dst; if (regno == -1) { memset (regp, 0, sizeof (mips64_elf_gregset_t)); for (regi = 1; regi < 32; regi++) mips64_fill_gregset (regcache, gregsetp, regi); mips64_fill_gregset (regcache, gregsetp, mips_regnum (current_gdbarch)->lo); mips64_fill_gregset (regcache, gregsetp, mips_regnum (current_gdbarch)->hi); mips64_fill_gregset (regcache, gregsetp, mips_regnum (current_gdbarch)->pc); mips64_fill_gregset (regcache, gregsetp, mips_regnum (current_gdbarch)->badvaddr); mips64_fill_gregset (regcache, gregsetp, MIPS_PS_REGNUM); mips64_fill_gregset (regcache, gregsetp, mips_regnum (current_gdbarch)->cause); mips64_fill_gregset (regcache, gregsetp, MIPS_RESTART_REGNUM); return; } if (regno > 0 && regno < 32) regaddr = regno + MIPS64_EF_REG0; else if (regno == mips_regnum (current_gdbarch)->lo) regaddr = MIPS64_EF_LO; else if (regno == mips_regnum (current_gdbarch)->hi) regaddr = MIPS64_EF_HI; else if (regno == mips_regnum (current_gdbarch)->pc) regaddr = MIPS64_EF_CP0_EPC; else if (regno == mips_regnum (current_gdbarch)->badvaddr) regaddr = MIPS64_EF_CP0_BADVADDR; else if (regno == MIPS_PS_REGNUM) regaddr = MIPS64_EF_CP0_STATUS; else if (regno == mips_regnum (current_gdbarch)->cause) regaddr = MIPS64_EF_CP0_CAUSE; else if (mips_linux_restart_reg_p (current_gdbarch) && regno == MIPS_RESTART_REGNUM) regaddr = MIPS64_EF_REG0; else regaddr = -1; if (regaddr != -1) { gdb_byte buf[MAX_REGISTER_SIZE]; LONGEST val; regcache_raw_collect (regcache, regno, buf); val = extract_signed_integer (buf, register_size (current_gdbarch, regno)); dst = regp + regaddr; store_signed_integer (dst, 8, val); } }
static void mips64_fill_gregset_wrapper (const struct regset *regset, const struct regcache *regcache, int regnum, void *gregs, size_t len) { gdb_assert (len == sizeof (mips64_elf_gregset_t)); mips64_fill_gregset (regcache, (mips64_elf_gregset_t *)gregs, regnum); }
void fill_gregset (const struct regcache *regcache, gdb_gregset_t *gregsetp, int regno) { if (mips_isa_regsize (get_regcache_arch (regcache)) == 4) mips_fill_gregset (regcache, (mips_elf_gregset_t *) gregsetp, regno); else mips64_fill_gregset (regcache, (mips64_elf_gregset_t *) gregsetp, 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")); } }