X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fdve3900-rom.c;h=a7cfb22547cffd10fc342a819d1cc80f54511b2c;hb=121d8485df3bd59f8a74752e6ef3b7123b482b9e;hp=1239d16cf7985473a922d13b8cb273da23a0f9c3;hpb=b6ba6518e9254bc25f88088228e93ac966ebccd1;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/dve3900-rom.c b/gdb/dve3900-rom.c index 1239d16cf7..a7cfb22547 100644 --- a/gdb/dve3900-rom.c +++ b/gdb/dve3900-rom.c @@ -29,10 +29,11 @@ #include "gdb_string.h" #include #include "regcache.h" +#include "mips-tdep.h" /* Type of function passed to bfd_map_over_sections. */ -typedef void (*section_map_func) (bfd * abfd, asection * sect, PTR obj); +typedef void (*section_map_func) (bfd * abfd, asection * sect, void *obj); /* Packet escape character used by Densan monitor. */ @@ -113,7 +114,7 @@ static int ethernet = 0; different names than GDB does, and don't support all the registers either. */ -static char *r3900_regnames[NUM_REGS] = +static char *r3900_regnames[] = { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", @@ -121,11 +122,11 @@ static char *r3900_regnames[NUM_REGS] = "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", "S", /* PS_REGNUM */ - "l", /* LO_REGNUM */ - "h", /* HI_REGNUM */ - "B", /* BADVADDR_REGNUM */ - "Pcause", /* CAUSE_REGNUM */ - "p" /* PC_REGNUM */ + "l", /* MIPS_EMBED_LO_REGNUM */ + "h", /* MIPS_EMBED_HI_REGNUM */ + "B", /* MIPS_EMBED_BADVADDR_REGNUM */ + "Pcause", /* MIPS_EMBED_CAUSE_REGNUM */ + "p" /* MIPS_EMBED_PC_REGNUM */ }; @@ -267,19 +268,19 @@ reg_table[] = } , { - "HI", HI_REGNUM + "HI", MIPS_EMBED_HI_REGNUM } , { - "LO", LO_REGNUM + "LO", MIPS_EMBED_LO_REGNUM } , { - "PC", PC_REGNUM + "PC", MIPS_EMBED_PC_REGNUM } , { - "BadV", BADVADDR_REGNUM + "BadV", MIPS_EMBED_BADVADDR_REGNUM } , { @@ -420,7 +421,7 @@ fetch_bad_vaddr (void) monitor_printf ("xB\r"); monitor_expect ("BadV=", NULL, 0); monitor_expect_prompt (buf, sizeof (buf)); - monitor_supply_register (BADVADDR_REGNUM, buf); + monitor_supply_register (mips_regnum (current_gdbarch)->badvaddr, buf); } @@ -455,17 +456,24 @@ static void fetch_bitmapped_register (int regno, struct bit_field *bf) { unsigned long val; - unsigned char regbuf[MAX_REGISTER_RAW_SIZE]; + unsigned char regbuf[MAX_REGISTER_SIZE]; + char *regname = NULL; - monitor_printf ("x%s\r", r3900_regnames[regno]); + if (regno >= sizeof (r3900_regnames) / sizeof (r3900_regnames[0])) + internal_error (__FILE__, __LINE__, + "fetch_bitmapped_register: regno out of bounds"); + else + regname = r3900_regnames[regno]; + + monitor_printf ("x%s\r", regname); val = fetch_fields (bf); monitor_printf (".\r"); monitor_expect_prompt (NULL, 0); /* supply register stores in target byte order, so swap here */ - store_unsigned_integer (regbuf, REGISTER_RAW_SIZE (regno), val); - supply_register (regno, regbuf); + store_unsigned_integer (regbuf, register_size (current_gdbarch, regno), val); + regcache_raw_supply (current_regcache, regno, regbuf); } @@ -478,20 +486,15 @@ fetch_bitmapped_register (int regno, struct bit_field *bf) static void r3900_fetch_registers (int regno) { - switch (regno) - { - case BADVADDR_REGNUM: - fetch_bad_vaddr (); - return; - case PS_REGNUM: - fetch_bitmapped_register (PS_REGNUM, status_fields); - return; - case CAUSE_REGNUM: - fetch_bitmapped_register (CAUSE_REGNUM, cause_fields); - return; - default: - orig_monitor_fetch_registers (regno); - } + if (regno == mips_regnum (current_gdbarch)->badvaddr) + fetch_bad_vaddr (); + else if (regno == PS_REGNUM) + fetch_bitmapped_register (PS_REGNUM, status_fields); + else if (regno == mips_regnum (current_gdbarch)->cause) + fetch_bitmapped_register (mips_regnum (current_gdbarch)->cause, + cause_fields); + else + orig_monitor_fetch_registers (regno); } @@ -501,9 +504,16 @@ static void store_bitmapped_register (int regno, struct bit_field *bf) { unsigned long oldval, newval; + char *regname = NULL; + + if (regno >= sizeof (r3900_regnames) / sizeof (r3900_regnames[0])) + internal_error (__FILE__, __LINE__, + "fetch_bitmapped_register: regno out of bounds"); + else + regname = r3900_regnames[regno]; /* Fetch the current value of the register. */ - monitor_printf ("x%s\r", r3900_regnames[regno]); + monitor_printf ("x%s\r", regname); oldval = fetch_fields (bf); newval = read_register (regno); @@ -530,17 +540,13 @@ store_bitmapped_register (int regno, struct bit_field *bf) static void r3900_store_registers (int regno) { - switch (regno) - { - case PS_REGNUM: - store_bitmapped_register (PS_REGNUM, status_fields); - return; - case CAUSE_REGNUM: - store_bitmapped_register (CAUSE_REGNUM, cause_fields); - return; - default: - orig_monitor_store_registers (regno); - } + if (regno == PS_REGNUM) + store_bitmapped_register (PS_REGNUM, status_fields); + else if (regno == mips_regnum (current_gdbarch)->cause) + store_bitmapped_register (mips_regnum (current_gdbarch)->cause, + cause_fields); + else + orig_monitor_store_registers (regno); } @@ -634,7 +640,7 @@ debug_write (unsigned char *buf, int buflen) static void ignore_packet (void) { - int c; + int c = -1; int len; /* Ignore lots of trash (messages about section addresses, for example) @@ -927,7 +933,7 @@ r3900_load (char *filename, int from_tty) if (exec_bfd) write_pc (bfd_get_start_address (exec_bfd)); - inferior_pid = 0; /* No process now */ + inferior_ptid = null_ptid; /* No process now */ /* This is necessary because many things were based on the PC at the time that we attached to the monitor, which is no longer valid