X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/3d8536f3658d83e8ba648e862c9da4e268a3f5c7..d575ddc0ef874292672001dc58848befa5325115:/gdb/m88k-nat.c diff --git a/gdb/m88k-nat.c b/gdb/m88k-nat.c index d474aa2a30..b16c52313d 100644 --- a/gdb/m88k-nat.c +++ b/gdb/m88k-nat.c @@ -114,60 +114,62 @@ store_inferior_registers (regno) struct USER u; - unsigned int offset = (char *) &u.pt_r0 - (char *) &u; regaddr = offset; + /* Don't try to deal with EXIP_REGNUM or ENIP_REGNUM, because I think either + svr3 doesn't run on an 88110, or the kernel isolates the different (not + completely sure this is true, but seems to be. */ if (regno >= 0) { -/* regaddr = register_addr (regno, offset); */ - if (regno < PC_REGNUM) - { - regaddr = offset + regno * sizeof (int); - errno = 0; - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) regaddr, read_register (regno)); - if (errno != 0) - { - sprintf (buf, "writing register number %d", regno); - perror_with_name (buf); - } - } - else if (regno == SXIP_REGNUM) - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) SXIP_OFFSET, read_register(regno)); - else if (regno == SNIP_REGNUM) - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) SNIP_OFFSET, read_register(regno)); - else if (regno == SFIP_REGNUM) - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) SFIP_OFFSET, read_register(regno)); - else printf ("Bad register number for store_inferior routine\n"); - } - else { - for (regno = 0; regno < NUM_REGS - 3; regno++) - { /* regaddr = register_addr (regno, offset); */ - errno = 0; - regaddr = offset + regno * sizeof (int); - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) regaddr, read_register (regno)); - if (errno != 0) - { - sprintf (buf, "writing register number %d", regno); - perror_with_name (buf); - } - } - ptrace (6,inferior_pid, - (PTRACE_ARG3_TYPE) SXIP_OFFSET,read_register(SXIP_REGNUM)); - ptrace (6,inferior_pid, - (PTRACE_ARG3_TYPE) SNIP_OFFSET,read_register(SNIP_REGNUM)); - ptrace (6,inferior_pid, - (PTRACE_ARG3_TYPE) SFIP_OFFSET,read_register(SFIP_REGNUM)); - } - - + if (regno < PC_REGNUM) + { + regaddr = offset + regno * sizeof (int); + errno = 0; + ptrace (6, inferior_pid, + (PTRACE_ARG3_TYPE) regaddr, read_register (regno)); + if (errno != 0) + { + sprintf (buf, "writing register number %d", regno); + perror_with_name (buf); + } + } + else if (regno == SXIP_REGNUM) + ptrace (6, inferior_pid, + (PTRACE_ARG3_TYPE) SXIP_OFFSET, read_register(regno)); + else if (regno == SNIP_REGNUM) + ptrace (6, inferior_pid, + (PTRACE_ARG3_TYPE) SNIP_OFFSET, read_register(regno)); + else if (regno == SFIP_REGNUM) + ptrace (6, inferior_pid, + (PTRACE_ARG3_TYPE) SFIP_OFFSET, read_register(regno)); + else + printf_unfiltered ("Bad register number for store_inferior routine\n"); + } + else + { + for (regno = 0; regno < PC_REGNUM; regno++) + { + /* regaddr = register_addr (regno, offset); */ + errno = 0; + regaddr = offset + regno * sizeof (int); + ptrace (6, inferior_pid, + (PTRACE_ARG3_TYPE) regaddr, read_register (regno)); + if (errno != 0) + { + sprintf (buf, "writing register number %d", regno); + perror_with_name (buf); + } + } + ptrace (6,inferior_pid, + (PTRACE_ARG3_TYPE) SXIP_OFFSET,read_register(SXIP_REGNUM)); + ptrace (6,inferior_pid, + (PTRACE_ARG3_TYPE) SNIP_OFFSET,read_register(SNIP_REGNUM)); + ptrace (6,inferior_pid, + (PTRACE_ARG3_TYPE) SFIP_OFFSET,read_register(SFIP_REGNUM)); + } } @@ -209,14 +211,21 @@ m88k_register_u_addr (blockend, regnum) case 28: case 29: case 30: - case 31: return (ustart + ((int) &u.pt_r0 - (int) &u) + sizeof(REGISTER_TYPE) * regnum); + case 31: + return (ustart + ((int) &u.pt_r0 - (int) &u) + REGISTER_SIZE * regnum); case PSR_REGNUM: return (ustart + ((int) &u.pt_psr - (int) &u)); case FPSR_REGNUM: return (ustart + ((int) &u.pt_fpsr - (int) &u)); case FPCR_REGNUM: return (ustart + ((int) &u.pt_fpcr - (int) &u)); case SXIP_REGNUM: return (ustart + SXIP_OFFSET); case SNIP_REGNUM: return (ustart + SNIP_OFFSET); case SFIP_REGNUM: return (ustart + SFIP_OFFSET); - default: return (blockend + sizeof (REGISTER_TYPE) * regnum); + default: + if (regnum < NUM_REGS) + /* The register is one of those which is not defined... + give it zero */ + return (ustart + ((int) &u.pt_r0 - (int) &u)); + else + return (blockend + REGISTER_SIZE * regnum); } }