static void bdm_ppc_fetch_registers (int regno) { struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); int i; unsigned char *regs; int first_regno, last_regno; int first_bdm_regno, last_bdm_regno; int reglen; if (regno == -1) { first_regno = 0; last_regno = NUM_REGS - 1; first_bdm_regno = 0; last_bdm_regno = BDM_NUM_REGS - 1; } else { first_regno = regno; last_regno = regno; first_bdm_regno = bdm_regmap[regno]; last_bdm_regno = bdm_regmap[regno]; } if (first_bdm_regno == -1) { regcache_raw_supply (current_regcache, first_regno, NULL); return; /* Unsupported register */ } /* FIXME: jimb/2004-05-04: I'm not sure how to adapt this code to processors that lack floating point registers, and I don't have have the equipment to test it. So we'll leave that case for the next person who encounters it. */ gdb_assert (ppc_floating_point_unit_p (current_gdbarch)); #if 1 /* Can't ask for floating point regs on ppc 8xx, also need to avoid asking for the mq register. */ if (first_regno == last_regno) /* only want one reg */ { /* printf("Asking for register %d\n", first_regno); */ /* if asking for an invalid register */ if ((first_regno == gdbarch_tdep (current_gdbarch)->ppc_mq_regnum) || (first_regno == gdbarch_tdep (current_gdbarch)->ppc_fpscr_regnum) || ((first_regno >= tdep->ppc_fp0_regnum) && (first_regno < tdep->ppc_fp0_regnum + ppc_num_fprs))) { /* printf("invalid reg request!\n"); */ regcache_raw_supply (current_regcache, first_regno, NULL); return; /* Unsupported register */ } else { regs = ocd_read_bdm_registers (first_bdm_regno, last_bdm_regno, ®len); } } else internal_error (__FILE__, __LINE__, "ppc_bdm_fetch_registers: " "'all registers' case not implemented"); #endif #if 0 regs = ocd_read_bdm_registers (first_bdm_regno, last_bdm_regno, ®len); #endif for (i = first_regno; i <= last_regno; i++) { int bdm_regno, regoffset; bdm_regno = bdm_regmap[i]; if (bdm_regno != -1) { regoffset = bdm_regno - first_bdm_regno; if (regoffset >= reglen / 4) continue; regcache_raw_supply (current_regcache, i, regs + 4 * regoffset); } else regcache_raw_supply (current_regcache, i, NULL); /* Unsupported register */ } }
static void bdm_ppc_fetch_registers (int regno) { int i; unsigned char *regs, *beginregs, *endregs, *almostregs; unsigned char midregs[32]; unsigned char mqreg[1]; int first_regno, last_regno; int first_bdm_regno, last_bdm_regno; int reglen, beginreglen, endreglen; #if 1 for (i = 0; i < (FPLAST_REGNUM - FP0_REGNUM + 1); i++) { midregs[i] = -1; } mqreg[0] = -1; #endif if (regno == -1) { first_regno = 0; last_regno = NUM_REGS - 1; first_bdm_regno = 0; last_bdm_regno = BDM_NUM_REGS - 1; } else { first_regno = regno; last_regno = regno; first_bdm_regno = bdm_regmap[regno]; last_bdm_regno = bdm_regmap[regno]; } if (first_bdm_regno == -1) { supply_register (first_regno, NULL); return; /* Unsupported register */ } #if 1 /* Can't ask for floating point regs on ppc 8xx, also need to avoid asking for the mq register. */ if (first_regno == last_regno) /* only want one reg */ { /* printf("Asking for register %d\n", first_regno); */ /* if asking for an invalid register */ if ((first_regno == gdbarch_tdep (current_gdbarch)->ppc_mq_regnum) || (first_regno == gdbarch_tdep (current_gdbarch)->ppc_fpscr_regnum) || ((first_regno >= FP0_REGNUM) && (first_regno <= FPLAST_REGNUM))) { /* printf("invalid reg request!\n"); */ supply_register (first_regno, NULL); return; /* Unsupported register */ } else { regs = ocd_read_bdm_registers (first_bdm_regno, last_bdm_regno, ®len); } } else /* want all regs */ { /* printf("Asking for registers %d to %d\n", first_regno, last_regno); */ beginregs = ocd_read_bdm_registers (first_bdm_regno, FP0_REGNUM - 1, &beginreglen); endregs = (strcat (midregs, ocd_read_bdm_registers (FPLAST_REGNUM + 1, last_bdm_regno - 1, &endreglen))); almostregs = (strcat (beginregs, endregs)); regs = (strcat (almostregs, mqreg)); reglen = beginreglen + 32 + endreglen + 1; } #endif #if 0 regs = ocd_read_bdm_registers (first_bdm_regno, last_bdm_regno, ®len); #endif for (i = first_regno; i <= last_regno; i++) { int bdm_regno, regoffset; bdm_regno = bdm_regmap[i]; if (bdm_regno != -1) { regoffset = bdm_regno - first_bdm_regno; if (regoffset >= reglen / 4) continue; supply_register (i, regs + 4 * regoffset); } else supply_register (i, NULL); /* Unsupported register */ } }