/* MVS note deprecated. */ static void mn10300_extract_return_value (struct type *type, struct regcache *regcache, void *valbuf) { struct gdbarch *gdbarch = get_regcache_arch (regcache); char buf[MAX_REGISTER_SIZE]; int len = TYPE_LENGTH (type); int reg, regsz; if (TYPE_CODE (type) == TYPE_CODE_PTR) reg = 4; else reg = 0; regsz = register_size (gdbarch, reg); if (len <= regsz) { regcache_raw_read (regcache, reg, buf); memcpy (valbuf, buf, len); } else if (len <= 2 * regsz) { regcache_raw_read (regcache, reg, buf); memcpy (valbuf, buf, regsz); gdb_assert (regsz == register_size (gdbarch, reg + 1)); regcache_raw_read (regcache, reg + 1, buf); memcpy ((char *) valbuf + regsz, buf, len - regsz); } else internal_error (__FILE__, __LINE__, _("Cannot extract return value %d bytes long."), len); }
void fill_fpregset (fpregset_t *fpregsetp, int regno) { int regi; char *from, *to; /* FIXME, this is wrong for the N32 ABI which has 64 bit FP regs. */ for (regi = FP0_REGNUM; regi < FP0_REGNUM + 32; regi++) { if ((regno == -1) || (regno == regi)) { to = (char *) &(fpregsetp->fp_r.fp_regs[regi - FP0_REGNUM]); regcache_raw_read (current_regcache, regi, to); } } if (regno == -1 || regno == mips_regnum (current_gdbarch)->fp_control_status) { char fsrbuf[8]; /* We can't fill the FSR register directly from the regcache, because there is a size issue: On one hand, fpregsetp->fp_csr is 32bits long, while the regcache expects a 64bits long buffer. So we use a buffer of the correct size and copy the register value from that buffer. */ regcache_raw_read (current_regcache, mips_regnum (current_gdbarch)->fp_control_status, fsrbuf); memcpy (&fpregsetp->fp_csr, fsrbuf + 4, 4); } }
static void frv_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, int reg, gdb_byte *buffer) { if (reg == iacc0_regnum) { regcache_raw_read (regcache, iacc0h_regnum, buffer); regcache_raw_read (regcache, iacc0l_regnum, (bfd_byte *) buffer + 4); } else if (accg0_regnum <= reg && reg <= accg7_regnum) { /* The accg raw registers have four values in each slot with the lowest register number occupying the first byte. */ int raw_regnum = accg0123_regnum + (reg - accg0_regnum) / 4; int byte_num = (reg - accg0_regnum) % 4; bfd_byte buf[4]; regcache_raw_read (regcache, raw_regnum, buf); memset (buffer, 0, 4); /* FR-V is big endian, so put the requested byte in the first byte of the buffer allocated to hold the pseudo-register. */ ((bfd_byte *) buffer)[0] = buf[byte_num]; } }
static void sparc32_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, int regnum, gdb_byte *buf) { gdb_assert (regnum >= SPARC32_D0_REGNUM && regnum <= SPARC32_D30_REGNUM); regnum = SPARC_F0_REGNUM + 2 * (regnum - SPARC32_D0_REGNUM); regcache_raw_read (regcache, regnum, buf); regcache_raw_read (regcache, regnum + 1, buf + 4); }
static void swapped_regcache_raw_write_part (struct regcache *regcache, int regnum, int offset, int len, const gdb_byte *buf) { int j; gdb_byte swapper_buf[16]; if (regnum < AMD64_XMM0_REGNUM || regnum > AMD64_XMM0_REGNUM + 15) { regcache_raw_write_part (regcache, regnum, offset, len, buf); return; } regcache_raw_read (regcache, regnum, swapper_buf); for (j = 0; j < 8; j++) { gdb_byte tmp = swapper_buf[j]; swapper_buf[j] = swapper_buf[16 - j - 1]; swapper_buf[16 - j - 1] = tmp; } memcpy (&swapper_buf[offset], buf, len); for (j = 0; j < 8; j++) { gdb_byte tmp = swapper_buf[j]; swapper_buf[j] = swapper_buf[16 - j - 1]; swapper_buf[16 - j - 1] = tmp; } regcache_raw_write (regcache, regnum, swapper_buf); }
static void m68k_svr4_extract_return_value (struct type *type, struct regcache *regcache, gdb_byte *valbuf) { int len = TYPE_LENGTH (type); gdb_byte buf[M68K_MAX_REGISTER_SIZE]; if (TYPE_CODE (type) == TYPE_CODE_FLT) { regcache_raw_read (regcache, M68K_FP0_REGNUM, buf); convert_typed_floating (buf, builtin_type_m68881_ext, valbuf, type); } else if (TYPE_CODE (type) == TYPE_CODE_PTR && len == 4) regcache_raw_read (regcache, M68K_A0_REGNUM, valbuf); else m68k_extract_return_value (type, regcache, valbuf); }
static void m68k_svr4_extract_return_value (struct type *type, struct regcache *regcache, gdb_byte *valbuf) { gdb_byte buf[M68K_MAX_REGISTER_SIZE]; struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); if (tdep->float_return && TYPE_CODE (type) == TYPE_CODE_FLT) { struct type *fpreg_type = register_type (gdbarch, M68K_FP0_REGNUM); regcache_raw_read (regcache, M68K_FP0_REGNUM, buf); convert_typed_floating (buf, fpreg_type, valbuf, type); } else if (TYPE_CODE (type) == TYPE_CODE_PTR && TYPE_LENGTH (type) == 4) regcache_raw_read (regcache, M68K_A0_REGNUM, valbuf); else m68k_extract_return_value (type, regcache, valbuf); }
static void tilegx_extract_return_value (struct type *type, struct regcache *regcache, gdb_byte *valbuf) { int len = TYPE_LENGTH (type); int i, regnum = TILEGX_R0_REGNUM; for (i = 0; i < len; i += tilegx_reg_size) regcache_raw_read (regcache, regnum++, valbuf + i); }
static void xstormy16_extract_return_value (struct type *type, struct regcache *regcache, gdb_byte *valbuf) { int len = TYPE_LENGTH (type); int i, regnum = E_1ST_ARG_REGNUM; for (i = 0; i < len; i += xstormy16_reg_size) regcache_raw_read (regcache, regnum++, valbuf + i); }
static void m68k_extract_return_value (struct type *type, struct regcache *regcache, gdb_byte *valbuf) { int len = TYPE_LENGTH (type); gdb_byte buf[M68K_MAX_REGISTER_SIZE]; if (len <= 4) { regcache_raw_read (regcache, M68K_D0_REGNUM, buf); memcpy (valbuf, buf + (4 - len), len); } else if (len <= 8) { regcache_raw_read (regcache, M68K_D0_REGNUM, buf); memcpy (valbuf, buf + (8 - len), len - 4); regcache_raw_read (regcache, M68K_D1_REGNUM, valbuf + (len - 4)); } else internal_error (__FILE__, __LINE__, _("Cannot extract return value of %d bytes long."), len); }
static enum register_status frv_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, int reg, gdb_byte *buffer) { enum register_status status; if (reg == iacc0_regnum) { status = regcache_raw_read (regcache, iacc0h_regnum, buffer); if (status == REG_VALID) status = regcache_raw_read (regcache, iacc0l_regnum, (bfd_byte *) buffer + 4); } else if (accg0_regnum <= reg && reg <= accg7_regnum) { /* The accg raw registers have four values in each slot with the lowest register number occupying the first byte. */ int raw_regnum = accg0123_regnum + (reg - accg0_regnum) / 4; int byte_num = (reg - accg0_regnum) % 4; gdb_byte buf[4]; status = regcache_raw_read (regcache, raw_regnum, buf); if (status == REG_VALID) { memset (buffer, 0, 4); /* FR-V is big endian, so put the requested byte in the first byte of the buffer allocated to hold the pseudo-register. */ buffer[0] = buf[byte_num]; } } else gdb_assert_not_reached ("invalid pseudo register number"); return status; }
static void frv_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, int reg, const gdb_byte *buffer) { if (reg == iacc0_regnum) { regcache_raw_write (regcache, iacc0h_regnum, buffer); regcache_raw_write (regcache, iacc0l_regnum, (bfd_byte *) buffer + 4); } else if (accg0_regnum <= reg && reg <= accg7_regnum) { /* The accg raw registers have four values in each slot with the lowest register number occupying the first byte. */ int raw_regnum = accg0123_regnum + (reg - accg0_regnum) / 4; int byte_num = (reg - accg0_regnum) % 4; gdb_byte buf[4]; regcache_raw_read (regcache, raw_regnum, buf); buf[byte_num] = ((bfd_byte *) buffer)[0]; regcache_raw_write (regcache, raw_regnum, buf); } }