From c7c9407366c9e9b97d27427978870f4b81d7ed5e Mon Sep 17 00:00:00 2001 From: "K. Richard Pixley" Date: Fri, 16 Oct 1992 23:39:34 +0000 Subject: [PATCH] i386v host/target/native separation --- gdb/.Sanitize | 3 +- gdb/ChangeLog | 15 +++- gdb/Makefile.in | 2 +- gdb/config/i386v.mh | 4 +- gdb/config/i386v.mt | 2 +- gdb/config/linux.mh | 4 +- gdb/i386v-nat.c | 168 ++++++++++++++++++++++++++++++++++++++++++++ gdb/nm-i386v.h | 36 ++++++++++ gdb/tm-i386v.h | 11 --- gdb/xm-i386v.h | 7 +- 10 files changed, 228 insertions(+), 24 deletions(-) create mode 100644 gdb/i386v-nat.c create mode 100644 gdb/nm-i386v.h diff --git a/gdb/.Sanitize b/gdb/.Sanitize index 0f8d4a44a6..970248f6ee 100644 --- a/gdb/.Sanitize +++ b/gdb/.Sanitize @@ -105,9 +105,9 @@ hppah-xdep.c i386-pinsn.c i386-stub.c i386-tdep.c -i386-xdep.c i386b-nat.c i386mach-nat.c +i386v-nat.c i387-tdep.c i960-pinsn.c i960-tdep.c @@ -146,6 +146,7 @@ nindy-tdep.c nm-delta88.h nm-i386bsd.h nm-i386mach.h +nm-i386v.h nm-irix3.h nm-irix4.h nm-linux.h diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 38b1ceb384..1185838372 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,9 +1,22 @@ Fri Oct 16 13:06:08 1992 K. Richard Pixley (rich@sendai.cygnus.com) + Native support for i386v (untested). + + * config/i386v.mh (XDEPFILES): removed infptrace.o inftarg.o + fork-child.o coredep.o corelow.o i386-xdep.o i387-tdep.o. + (NAT_FILE, NATDEPFILES): new macros. + * config/i386v.mt (TDEPFILES): removed exec.o, added i387-tdep.o. + * i386-xdep.c: removed. + * Makefile.in (HFILES): added nm-i386v.h + * i386v-nat.c, nm-i386v.h: new file. + * xm-i386v.h: (REGISTER_U_ADDR, i386_register_u_addr): removed to + nm-i386v.h. + * tm-i386v.h (FLOAT_INFO): removed. + Native support for linux (untested). * config/linux.mh (XDEPFILES): removed infptrace.o inftarg.o - fork-child.o coredep.o corelow.o i387-tdep.o. + fork-child.o coredep.o corelow.o i387-tdep.o i386-xdep.o. (NAT_FILE, NATDEPFILES): new macros. * config/linux.mt (TDEPFILES): removed exec.o, added i387-tdep.o. * Makefile.in (HFILES): added nm-linux.h. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 2aab4f893c..bd741d126e 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -255,7 +255,7 @@ HFILES= breakpoint.h buildsym.h call-cmds.h command.h defs.h \ xm-m68k.h xm-sparc.h xm-sysv4.h xm-vax.h \ nm-irix3.h nm-irix4.h nm-mips.h nm-rs6000.h nm-sun2.h nm-sun3.h \ nm-sun4os4.h nm-trash.h nm-news.h nm-ultra3.h nm-m88k.h \ - nm-i386mach.h nm-sun386.h nm-linux.h + nm-i386mach.h nm-sun386.h nm-linux.h nm-i386v.h REMOTE_EXAMPLES = m68k-stub.c i386-stub.c sparc-stub.c rem-multi.shar diff --git a/gdb/config/i386v.mh b/gdb/config/i386v.mh index 60ddc30a3d..1c94ae5771 100644 --- a/gdb/config/i386v.mh +++ b/gdb/config/i386v.mh @@ -1,6 +1,8 @@ # Host: Intel 386 running System V -XDEPFILES= infptrace.o inftarg.o fork-child.o coredep.o corelow.o i386-xdep.o i387-tdep.o +XDEPFILES= XM_FILE= xm-i386v.h +NAT_FILE= nm-i386v.h +NATDEPFILES= exec.o infptrace.o inftarg.o fork-child.o coredep.o corelow.o i386v-nat.o XM_CLIBS= -lPW SYSV_DEFINE=-DSYSV REGEX=regex.o diff --git a/gdb/config/i386v.mt b/gdb/config/i386v.mt index d595f7ec0d..75e566139c 100644 --- a/gdb/config/i386v.mt +++ b/gdb/config/i386v.mt @@ -1,3 +1,3 @@ # Target: Intel 386 running System V -TDEPFILES= exec.o i386-tdep.o i386-pinsn.o +TDEPFILES= i386-tdep.o i386-pinsn.o i387-tdep.o TM_FILE= tm-i386v.h diff --git a/gdb/config/linux.mh b/gdb/config/linux.mh index e02e42060d..c7a5285c80 100644 --- a/gdb/config/linux.mh +++ b/gdb/config/linux.mh @@ -1,8 +1,8 @@ # Host: Intel 386 running System V -XDEPFILES= i386-xdep.o +XDEPFILES= XM_FILE= xm-linux.h NAT_FILE= nm-linux.h -NATDEPFILES= exec.o infptrace.o inftarg.o fork-child.o coredep.o corelow.o +NATDEPFILES= exec.o infptrace.o inftarg.o fork-child.o coredep.o corelow.o i386v-nat.o XM_CLIBS= TERMLIB= SYSV_DEFINE=-DSYSV diff --git a/gdb/i386v-nat.c b/gdb/i386v-nat.c new file mode 100644 index 0000000000..f43b87eb52 --- /dev/null +++ b/gdb/i386v-nat.c @@ -0,0 +1,168 @@ +/* Intel 386 native support. + Copyright (C) 1988, 1989, 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" +#include "language.h" +#include "gdbcore.h" + +#ifdef USG +#include +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include "ieee-float.h" + +#include "target.h" + +extern struct ext_format ext_format_i387; + +/* this table must line up with REGISTER_NAMES in tm-i386v.h */ +/* symbols like 'EAX' come from */ +static int regmap[] = +{ + EAX, ECX, EDX, EBX, + UESP, EBP, ESI, EDI, + EIP, EFL, CS, SS, + DS, ES, FS, GS, +}; + +/* blockend is the value of u.u_ar0, and points to the + * place where GS is stored + */ + +int +i386_register_u_addr (blockend, regnum) + int blockend; + int regnum; +{ +#if 0 + /* this will be needed if fp registers are reinstated */ + /* for now, you can look at them with 'info float' + * sys5 wont let you change them with ptrace anyway + */ + if (regnum >= FP0_REGNUM && regnum <= FP7_REGNUM) + { + int ubase, fpstate; + struct user u; + ubase = blockend + 4 * (SS + 1) - KSTKSZ; + fpstate = ubase + ((char *)&u.u_fpstate - (char *)&u); + return (fpstate + 0x1c + 10 * (regnum - FP0_REGNUM)); + } + else +#endif + return (blockend + 4 * regmap[regnum]); + +} + +#if 0 +/* using FLOAT_INFO as is would be a problem. FLOAT_INFO is called + via a command xxx and eventually calls ptrace without ever having + traversed the target vector. This would be terribly impolite + behaviour for a sun4 hosted remote gdb. + + A fix might be to move this code into the "info registers" command. + rich@cygnus.com 15 Sept 92. */ +i386_float_info () +{ + struct user u; /* just for address computations */ + int i; + /* fpstate defined in */ + struct fpstate *fpstatep; + char buf[sizeof (struct fpstate) + 2 * sizeof (int)]; + unsigned int uaddr; + char fpvalid = 0; + unsigned int rounded_addr; + unsigned int rounded_size; + extern int corechan; + int skip; + + uaddr = (char *)&u.u_fpvalid - (char *)&u; + if (target_has_execution) + { + unsigned int data; + unsigned int mask; + + rounded_addr = uaddr & -sizeof (int); + data = ptrace (3, inferior_pid, (PTRACE_ARG3_TYPE) rounded_addr, 0); + mask = 0xff << ((uaddr - rounded_addr) * 8); + + fpvalid = ((data & mask) != 0); + } +#if 0 + else + { + if (lseek (corechan, uaddr, 0) < 0) + perror ("seek on core file"); + if (myread (corechan, &fpvalid, 1) < 0) + perror ("read on core file"); + + } +#endif /* no core support yet */ + + if (fpvalid == 0) + { + printf ("no floating point status saved\n"); + return; + } + + uaddr = (char *)&U_FPSTATE(u) - (char *)&u; + if (target_has_execution) + { + int *ip; + + rounded_addr = uaddr & -sizeof (int); + rounded_size = (((uaddr + sizeof (struct fpstate)) - uaddr) + + sizeof (int) - 1) / sizeof (int); + skip = uaddr - rounded_addr; + + ip = (int *)buf; + for (i = 0; i < rounded_size; i++) + { + *ip++ = ptrace (3, inferior_pid, (PTRACE_ARG3_TYPE) rounded_addr, 0); + rounded_addr += sizeof (int); + } + } +#if 0 + else + { + if (lseek (corechan, uaddr, 0) < 0) + perror_with_name ("seek on core file"); + if (myread (corechan, buf, sizeof (struct fpstate)) < 0) + perror_with_name ("read from core file"); + skip = 0; + } + #endif /* 0 */ + + fpstatep = (struct fpstate *)(buf + skip); + print_387_status (fpstatep->status, (struct env387 *)fpstatep->state); +} + +#endif /* never */ diff --git a/gdb/nm-i386v.h b/gdb/nm-i386v.h new file mode 100644 index 0000000000..8a7c6c7bb7 --- /dev/null +++ b/gdb/nm-i386v.h @@ -0,0 +1,36 @@ +/* Native support for i386. + Copyright 1986, 1987, 1989, 1992 Free Software Foundation, Inc. + Changes for 80386 by Pace Willisson (pace@prep.ai.mit.edu), July 1988. + +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. */ + +#if 0 +/* code to execute to print interesting information about the + floating point processor (if any) + No need to define if there is nothing to do. + On the 386, unfortunately this code is host-dependent (and lives + in the i386-xdep.c file), so we can't + do this unless we *know* we aren't cross-debugging. FIXME. + */ +#define FLOAT_INFO { i386_float_info (); } +#endif /*0*/ + +#define REGISTER_U_ADDR(addr, blockend, regno) \ + (addr) = i386_register_u_addr ((blockend),(regno)); + +extern int +i386_register_u_addr PARAMS ((int, int)); diff --git a/gdb/tm-i386v.h b/gdb/tm-i386v.h index a9b09ba81e..bfd0e35daa 100644 --- a/gdb/tm-i386v.h +++ b/gdb/tm-i386v.h @@ -99,17 +99,6 @@ i386_skip_prologue PARAMS ((int)); #define INVALID_FLOAT(p, len) (0) -#if 0 -/* code to execute to print interesting information about the - floating point processor (if any) - No need to define if there is nothing to do. - On the 386, unfortunately this code is host-dependent (and lives - in the i386-xdep.c file), so we can't - do this unless we *know* we aren't cross-debugging. FIXME. - */ -#define FLOAT_INFO { i386_float_info (); } -#endif /*0*/ - /* Say how long (ordinary) registers are. */ #define REGISTER_TYPE long diff --git a/gdb/xm-i386v.h b/gdb/xm-i386v.h index 866261699b..cff23190cd 100644 --- a/gdb/xm-i386v.h +++ b/gdb/xm-i386v.h @@ -1,4 +1,4 @@ -/* Macro defintions for i386. +/* Host support for i386. Copyright 1986, 1987, 1989, 1992 Free Software Foundation, Inc. Changes for 80386 by Pace Willisson (pace@prep.ai.mit.edu), July 1988. @@ -43,8 +43,3 @@ on those where it does, it occurs quite reliably. */ #define KERNEL_U_ADDR 0xe0000000 -#define REGISTER_U_ADDR(addr, blockend, regno) \ - (addr) = i386_register_u_addr ((blockend),(regno)); - -extern int -i386_register_u_addr PARAMS ((int, int)); -- 2.34.1