From 173a4f1bdac6b08dddc43e1fdbb1e291e0f82cb7 Mon Sep 17 00:00:00 2001 From: "K. Richard Pixley" Date: Fri, 16 Oct 1992 20:53:46 +0000 Subject: [PATCH] m88k native support --- gdb/.Sanitize | 4 +- gdb/ChangeLog | 13 +++ gdb/config/delta88.mh | 4 +- gdb/config/delta88.mt | 2 +- gdb/config/m88k.mh | 4 +- gdb/config/m88k.mt | 2 +- gdb/m88k-nat.c | 225 ++++++++++++++++++++++++++++++++++++++++++ gdb/nm-m88k.h | 24 +++++ gdb/xm-delta88.h | 4 - gdb/xm-m88k.h | 4 - 10 files changed, 273 insertions(+), 13 deletions(-) create mode 100644 gdb/m88k-nat.c create mode 100644 gdb/nm-m88k.h diff --git a/gdb/.Sanitize b/gdb/.Sanitize index e1773e406b..93cdc0401d 100644 --- a/gdb/.Sanitize +++ b/gdb/.Sanitize @@ -125,9 +125,9 @@ m2-exp.y m68k-pinsn.c m68k-stub.c m68k-tdep.c +m88k-nat.c m88k-pinsn.c m88k-tdep.c -m88k-xdep.c mach386-xdep.c main.c maint.c @@ -142,9 +142,11 @@ munch news-xdep.c nindy-share nindy-tdep.c +nm-delta88.h nm-i386bsd.h nm-irix3.h nm-irix4.h +nm-m88k.h nm-mips.h nm-news.h nm-rs6000.h diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b3af08afb2..12364e0b95 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +Fri Oct 16 13:06:08 1992 K. Richard Pixley (rich@sendai.cygnus.com) + + Native support for m88k (untested). + + * xm-delta88.h, xm-m88k.h (REGISTER_U_ADDR, + FETCH_INFERIOR_REGISTERS): removed. + * config/m88k.mh, config/delta88.mh (XDEPFILES): infptrace.o + inftarg.o fork-child.o m88k-xdep.o removed to NATDEPFILES. + (NAT_FILE, NATDEPFILES): new macros. + * config/m88k.mt, config/delta88.mt (TDEPFILES): removed exec.o. + * m88k-nat.c, nm-m88k.h, nm-delta88.h: new files.o. + * m88k-xdep.c: removed. + Fri Oct 16 04:16:30 1992 John Gilmore (gnu@cygnus.com) * i386b-nat.c: Comment changes. diff --git a/gdb/config/delta88.mh b/gdb/config/delta88.mh index a5e623a50a..c454cf03ba 100644 --- a/gdb/config/delta88.mh +++ b/gdb/config/delta88.mh @@ -1,6 +1,8 @@ # Host: Motorola 88000 running DGUX -XDEPFILES= infptrace.o inftarg.o fork-child.o m88k-xdep.o +XDEPFILES= XM_FILE= xm-delta88.h +NAT_FILE= nm-m88k.h +NATDEPFILES= exec.o infptrace.o inftarg.o fork-child.o m88k-nat.o REGEX=regex.o REGEX1=regex.o ALLOCA=alloca.o diff --git a/gdb/config/delta88.mt b/gdb/config/delta88.mt index 887d26dded..65b608e68a 100644 --- a/gdb/config/delta88.mt +++ b/gdb/config/delta88.mt @@ -1,3 +1,3 @@ # Target: Motorola 88000 -TDEPFILES= m88k-tdep.o m88k-pinsn.o exec.o +TDEPFILES= m88k-tdep.o m88k-pinsn.o TM_FILE= tm-delta88.h diff --git a/gdb/config/m88k.mh b/gdb/config/m88k.mh index 9e3a817450..1c71040c13 100644 --- a/gdb/config/m88k.mh +++ b/gdb/config/m88k.mh @@ -1,3 +1,5 @@ # Host: Motorola 88000 running DGUX -XDEPFILES= infptrace.o inftarg.o fork-child.o m88k-xdep.o +XDEPFILES= XM_FILE= xm-m88k.h +NAT_FILE= nm-m88k.h +NATDEPFILES= exec.o infptrace.o inftarg.o fork-child.o m88k-nat.o diff --git a/gdb/config/m88k.mt b/gdb/config/m88k.mt index 73e1bed575..c10c89cb93 100644 --- a/gdb/config/m88k.mt +++ b/gdb/config/m88k.mt @@ -1,3 +1,3 @@ # Target: Motorola 88000 Binary Compatability Standard -TDEPFILES= m88k-tdep.o m88k-pinsn.o exec.o +TDEPFILES= m88k-tdep.o m88k-pinsn.o TM_FILE= tm-m88k.h diff --git a/gdb/m88k-nat.c b/gdb/m88k-nat.c new file mode 100644 index 0000000000..15a0f7eef2 --- /dev/null +++ b/gdb/m88k-nat.c @@ -0,0 +1,225 @@ +/* Native-dependent Motorola 88xxx support for GDB, the GNU Debugger. + Copyright 1988, 1990, 1991, 1992 Free Software Foundation, Inc. + +This file is part of GDB. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include "defs.h" +#include "frame.h" +#include "inferior.h" + +#ifdef USG +#include +#endif + +#include +#include +#include +#include "gdbcore.h" +#include + +#ifndef USER /* added to support BCS ptrace_user */ +#define USER ptrace_user +#endif +#include +#include +#include +#include + +#include "symtab.h" +#include "setjmp.h" +#include "value.h" + +#ifdef DELTA88 +/* #include */ + +/* define offsets to the pc instruction offsets in ptrace_user struct */ +#define SXIP_OFFSET (char *)&u.pt_sigframe.sig_sxip - (char *)&u +#define SNIP_OFFSET (char *)&u.pt_sigframe.sig_snip - (char *)&u +#define SFIP_OFFSET (char *)&u.pt_sigframe.sig_sfip - (char *)&u +#else +/* define offsets to the pc instruction offsets in ptrace_user struct */ +#define SXIP_OFFSET (char *)&u.pt_sigframe.dg_sigframe.sc_sxip - (char *)&u +#define SNIP_OFFSET (char *)&u.pt_sigframe.dg_sigframe.sc_snip - (char *)&u +#define SFIP_OFFSET (char *)&u.pt_sigframe.dg_sigframe.sc_sfip - (char *)&u +#endif + +extern int have_symbol_file_p(); + +extern jmp_buf stack_jmp; + +extern int errno; +extern char registers[REGISTER_BYTES]; + +void +fetch_inferior_registers (regno) + int regno; /* Original value discarded */ +{ + register unsigned int regaddr; + char buf[MAX_REGISTER_RAW_SIZE]; + register int i; + + struct USER u; + unsigned int offset; + + offset = (char *) &u.pt_r0 - (char *) &u; + regaddr = offset; /* byte offset to r0;*/ + +/* offset = ptrace (3, inferior_pid, (PTRACE_ARG3_TYPE) offset, 0) - KERNEL_U_ADDR; */ + for (regno = 0; regno < NUM_REGS; regno++) + { + /*regaddr = register_addr (regno, offset);*/ + /* 88k enhancement */ + + for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int)) + { + *(int *) &buf[i] = ptrace (3, inferior_pid, + (PTRACE_ARG3_TYPE) regaddr, 0); + regaddr += sizeof (int); + } + supply_register (regno, buf); + } + /* now load up registers 36 - 38; special pc registers */ + *(int *) &buf[0] = ptrace (3,inferior_pid, + (PTRACE_ARG3_TYPE) SXIP_OFFSET ,0); + supply_register (SXIP_REGNUM, buf); + *(int *) &buf[0] = ptrace (3, inferior_pid, + (PTRACE_ARG3_TYPE) SNIP_OFFSET,0); + supply_register (SNIP_REGNUM, buf); + *(int *) &buf[0] = ptrace (3, inferior_pid, + (PTRACE_ARG3_TYPE) SFIP_OFFSET,0); + supply_register (SFIP_REGNUM, buf); +} + +/* Store our register values back into the inferior. + If REGNO is -1, do this for all registers. + Otherwise, REGNO specifies which register (so we can save time). */ + +void +store_inferior_registers (regno) + int regno; +{ + register unsigned int regaddr; + char buf[80]; + + struct USER u; + + + unsigned int offset = (char *) &u.pt_r0 - (char *) &u; + + regaddr = offset; + + 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)); + } + + +} + + +/* blockend is the address of the end of the user structure */ +m88k_register_u_addr (blockend, regnum) +{ + struct USER u; + int ustart = blockend - sizeof (struct USER); + switch (regnum) + { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 20: + case 21: + case 22: + case 23: + case 24: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: return (ustart + ((int) &u.pt_r0 - (int) &u) + sizeof(REGISTER_TYPE) * 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); + } +} + diff --git a/gdb/nm-m88k.h b/gdb/nm-m88k.h new file mode 100644 index 0000000000..105615c11f --- /dev/null +++ b/gdb/nm-m88k.h @@ -0,0 +1,24 @@ +/* Native support macros for m88k, for GDB. + Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992 + Free Software Foundation, Inc. + +This file is part of GDB. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#define FETCH_INFERIOR_REGISTERS + +#define REGISTER_U_ADDR(addr, blockend, regno) \ + (addr) = m88k_register_u_addr ((blockend),(regno)); diff --git a/gdb/xm-delta88.h b/gdb/xm-delta88.h index bc9ddd9b14..eb8e20b579 100644 --- a/gdb/xm-delta88.h +++ b/gdb/xm-delta88.h @@ -42,7 +42,3 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define KERNEL_U_ADDR 0 -#define REGISTER_U_ADDR(addr, blockend, regno) \ - (addr) = m88k_register_u_addr ((blockend),(regno)); - -#define FETCH_INFERIOR_REGISTERS diff --git a/gdb/xm-m88k.h b/gdb/xm-m88k.h index bad91f8dda..f58f758007 100644 --- a/gdb/xm-m88k.h +++ b/gdb/xm-m88k.h @@ -60,7 +60,3 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define KERNEL_U_ADDR 0 -#define REGISTER_U_ADDR(addr, blockend, regno) \ - (addr) = m88k_register_u_addr ((blockend),(regno)); - -#define FETCH_INFERIOR_REGISTERS -- 2.34.1