Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [patch] Overhaul i386nbsd-nat.c, add support for XMM + ELF core files
@ 2002-01-04 16:08 Jason R Thorpe
  2002-01-04 16:41 ` Mark Kettenis
  0 siblings, 1 reply; 8+ messages in thread
From: Jason R Thorpe @ 2002-01-04 16:08 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 1310 bytes --]

The following patch overhauls i386nbsd-nat.c, using new interfaces to
access the gdb regcache, and adds support for XMM registers and ELF
format NetBSD core files.

        [ for gdb/ChangeLog ]
2002-01-04  Jason Thorpe  <thorpej@wasabisystems.com> 
 
        * i386nbsd-nat.c (supply_regs): New function. 
        (fetch_inferior_registers): Use supply_regs to
        provide integer registers.  Use i387_supply_fsave
        to supply FP registers.  Add support for XMM
        registers using PT_GETXMMREGS and i387_supply_fxsave.    
        (store_inferior_registers): Use regcache_collect 
        for integer registers.  Use i387_fill_fsave for
        FP registers.  Add support for XMM registers
        using i387_fill_fxsave and PT_SETXMMREGS. 
        (fetch_core_registers): Use supply_regs for
        integer registers and i387_supply_fsave for 
        FP registers.
        (fetch_elfcore_registers): New function. 
        (i386nbsd_elfcore_fns): New.
        (_initialize_i386nbsd_nat): Register i386nbsd_elfcore_fns. 
        * config/i386/nbsd.mh (NATDEPFILES): Add i387-nat.o. 
        * config/i386/nbsdelf.mh (NATDEPFILES): Likewise. 
        * config/i386/tm-nbsd.h: Update copyright years.
        (HAVE_SSE_REGS): Define.

-- 
        -- Jason R. Thorpe <thorpej@wasabisystems.com>

[-- Attachment #2: patch3 --]
[-- Type: text/plain, Size: 14238 bytes --]

Index: i386nbsd-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386nbsd-nat.c,v
retrieving revision 1.9
diff -c -r1.9 i386nbsd-nat.c
*** i386nbsd-nat.c	2002/01/04 22:43:31	1.9
--- i386nbsd-nat.c	2002/01/04 23:54:54
***************
*** 25,160 ****
  #include <machine/reg.h>
  #include <machine/frame.h>
  #include "inferior.h"
! #include "gdbcore.h" /* for registers_fetched() */
  #include "regcache.h"
  
  /* Defines for XMM0_REGNUM etc. */
  #include "i386-tdep.h"
  
! #define RF(dst, src) \
! 	memcpy(&registers[REGISTER_BYTE(dst)], &src, sizeof(src))
  
! #define RS(src, dst) \
! 	memcpy(&dst, &registers[REGISTER_BYTE(src)], sizeof(dst))
!      
! struct env387
!   {
!     unsigned short control;
!     unsigned short r0;
!     unsigned short status;
!     unsigned short r1;
!     unsigned short tag;  
!     unsigned short r2;
!     unsigned long eip;
!     unsigned short code_seg;
!     unsigned short opcode;
!     unsigned long operand; 
!     unsigned short operand_seg;
!     unsigned short r3;
!     unsigned char regs[8][10];
!   };
  
  void
  fetch_inferior_registers (int regno)
  {
    struct reg inferior_registers;
!   struct env387 inferior_fpregisters;
! 
!   ptrace (PT_GETREGS, PIDGET (inferior_ptid),
! 	  (PTRACE_ARG3_TYPE) &inferior_registers, 0);
    ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
! 	  (PTRACE_ARG3_TYPE) &inferior_fpregisters, 0);
! 
!   RF ( 0, inferior_registers.r_eax);
!   RF ( 1, inferior_registers.r_ecx);
!   RF ( 2, inferior_registers.r_edx);
!   RF ( 3, inferior_registers.r_ebx);
!   RF ( 4, inferior_registers.r_esp);
!   RF ( 5, inferior_registers.r_ebp);
!   RF ( 6, inferior_registers.r_esi);
!   RF ( 7, inferior_registers.r_edi);
!   RF ( 8, inferior_registers.r_eip);
!   RF ( 9, inferior_registers.r_eflags);
!   RF (10, inferior_registers.r_cs);
!   RF (11, inferior_registers.r_ss);
!   RF (12, inferior_registers.r_ds);
!   RF (13, inferior_registers.r_es);
!   RF (14, inferior_registers.r_fs);
!   RF (15, inferior_registers.r_gs);
! 
!   RF (FP0_REGNUM,     inferior_fpregisters.regs[0]);
!   RF (FP0_REGNUM + 1, inferior_fpregisters.regs[1]);
!   RF (FP0_REGNUM + 2, inferior_fpregisters.regs[2]);
!   RF (FP0_REGNUM + 3, inferior_fpregisters.regs[3]);
!   RF (FP0_REGNUM + 4, inferior_fpregisters.regs[4]);
!   RF (FP0_REGNUM + 5, inferior_fpregisters.regs[5]);
!   RF (FP0_REGNUM + 6, inferior_fpregisters.regs[6]);
!   RF (FP0_REGNUM + 7, inferior_fpregisters.regs[7]);
! 
!   RF (FCTRL_REGNUM,   inferior_fpregisters.control);
!   RF (FSTAT_REGNUM,   inferior_fpregisters.status);
!   RF (FTAG_REGNUM,    inferior_fpregisters.tag);
!   RF (FCS_REGNUM,     inferior_fpregisters.code_seg);
!   RF (FCOFF_REGNUM,   inferior_fpregisters.eip);
!   RF (FDS_REGNUM,     inferior_fpregisters.operand_seg);
!   RF (FDOFF_REGNUM,   inferior_fpregisters.operand);
!   RF (FOP_REGNUM,     inferior_fpregisters.opcode);
! 
!   registers_fetched ();
  }
  
  void
  store_inferior_registers (int regno)
  {
    struct reg inferior_registers;
!   struct env387 inferior_fpregisters;
! 
!   RS ( 0, inferior_registers.r_eax);
!   RS ( 1, inferior_registers.r_ecx);
!   RS ( 2, inferior_registers.r_edx);
!   RS ( 3, inferior_registers.r_ebx);
!   RS ( 4, inferior_registers.r_esp);
!   RS ( 5, inferior_registers.r_ebp);
!   RS ( 6, inferior_registers.r_esi);
!   RS ( 7, inferior_registers.r_edi);
!   RS ( 8, inferior_registers.r_eip);
!   RS ( 9, inferior_registers.r_eflags);
!   RS (10, inferior_registers.r_cs);
!   RS (11, inferior_registers.r_ss);
!   RS (12, inferior_registers.r_ds);
!   RS (13, inferior_registers.r_es);
!   RS (14, inferior_registers.r_fs);
!   RS (15, inferior_registers.r_gs);
! 
!   
!   RS (FP0_REGNUM,     inferior_fpregisters.regs[0]);
!   RS (FP0_REGNUM + 1, inferior_fpregisters.regs[1]);
!   RS (FP0_REGNUM + 2, inferior_fpregisters.regs[2]);
!   RS (FP0_REGNUM + 3, inferior_fpregisters.regs[3]);
!   RS (FP0_REGNUM + 4, inferior_fpregisters.regs[4]);
!   RS (FP0_REGNUM + 5, inferior_fpregisters.regs[5]);
!   RS (FP0_REGNUM + 6, inferior_fpregisters.regs[6]);
!   RS (FP0_REGNUM + 7, inferior_fpregisters.regs[7]);
! 
!   RS (FCTRL_REGNUM,   inferior_fpregisters.control);
!   RS (FSTAT_REGNUM,   inferior_fpregisters.status);
!   RS (FTAG_REGNUM,    inferior_fpregisters.tag);
!   RS (FCS_REGNUM,     inferior_fpregisters.code_seg);
!   RS (FCOFF_REGNUM,   inferior_fpregisters.eip);
!   RS (FDS_REGNUM,     inferior_fpregisters.operand_seg);
!   RS (FDOFF_REGNUM,   inferior_fpregisters.operand);
!   RS (FOP_REGNUM,     inferior_fpregisters.opcode);
!   
!   ptrace (PT_SETREGS, PIDGET (inferior_ptid),
! 	  (PTRACE_ARG3_TYPE) &inferior_registers, 0);
!   ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
! 	  (PTRACE_ARG3_TYPE) &inferior_fpregisters, 0);
  }
  \f
  struct md_core
  {
    struct reg intreg;
!   struct env387 freg;
  };
  
  static void
--- 25,175 ----
  #include <machine/reg.h>
  #include <machine/frame.h>
  #include "inferior.h"
! #include "gdbcore.h"
  #include "regcache.h"
  
+ /* Prototypes for i387_supply_fsave etc.  */
+ #include "i387-nat.h"  
+ 
  /* Defines for XMM0_REGNUM etc. */
  #include "i386-tdep.h"
+ 
+ #ifdef PT_GETXMMREGS
+ static int have_ptrace_xmmregs = -1;
+ #endif
+ 
+ /* Offsets of the registers in the "reg" structure, indexed by
+    GDB register array index.  */
+ static int regmap[] =
+ {
+   0x00 /* eax */,
+   0x04 /* ecx */,
+   0x08 /* edx */,
+   0x0c /* ebx */,
+   0x10 /* esp */,
+   0x14 /* ebp */,
+   0x18 /* esi */,
+   0x1c /* edi */,
+   0x20 /* eip */,
+   0x24 /* eflags */,
+   0x28 /* cs */,
+   0x2c /* ss */,
+   0x30 /* ds */,
+   0x34 /* es */,
+   0x38 /* fs */,
+   0x3c /* gs */,
+ };
  
! /* Macro to determine if a register is fetched with PT_GETREGS.  */
! #define GETREGS_SUPPLIES(regno) \
!   ((0 <= (regno) && (regno) <= 15))
  
! static void
! supply_regs (char *regs)
! {
!   int regno;
  
+   for (regno = 0; regno < 16; regno++)
+     supply_register (regno, regs + regmap[regno]);
+ }
+ 
  void
  fetch_inferior_registers (int regno)
  {
    struct reg inferior_registers;
!   char inferior_fpregisters[108];
! #ifdef PT_GETXMMREGS
!   char inferior_xmmregisters[512];
! #endif
! 
!   if (regno == -1 || GETREGS_SUPPLIES (regno))
!     {
!       ptrace (PT_GETREGS, PIDGET (inferior_ptid),
! 	      (PTRACE_ARG3_TYPE) &inferior_registers, 0);
!       supply_regs ((char *) &inferior_registers);
!       if (regno != -1)
! 	return;
!     }
! 
! #ifdef PT_GETXMMREGS
!   if (have_ptrace_xmmregs != 0 &&
!       ptrace(PT_GETXMMREGS, PIDGET (inferior_ptid),
! 	     (PTRACE_ARG3_TYPE) inferior_xmmregisters, 0) == 0)
!     {
!       have_ptrace_xmmregs = 1;
!       i387_supply_fxsave (inferior_xmmregisters);
!     }
!   else
!     {
!       ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
! 	      (PTRACE_ARG3_TYPE) inferior_fpregisters, 0);
!       have_ptrace_xmmregs = 0;
!       i387_supply_fsave ((char *) inferior_fpregisters);
!     }
! #else
    ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
! 	  (PTRACE_ARG3_TYPE) inferior_fpregisters, 0);
!   i387_supply_fsave ((char *) inferior_fpregisters);
! #endif
  }
  
  void
  store_inferior_registers (int regno)
  {
    struct reg inferior_registers;
!   char *regs = (char *) &inferior_registers;
!   char inferior_fpregisters[108];
! #ifdef PT_GETXMMREGS
!   char inferior_xmmregisters[512];
! #endif
!   int i;
! 
!   if (regno == -1 || GETREGS_SUPPLIES (regno))
!     {
!       ptrace(PT_GETREGS, PIDGET (inferior_ptid),
! 	     (PTRACE_ARG3_TYPE) &inferior_registers, 0);
! 
!       for (i = 0; i < 16; i++)
! 	{
! 	  if (regno == -1 || regno == i)
! 	    regcache_collect (i, regs + regmap[i]);
! 	}
! 
!       ptrace (PT_SETREGS, PIDGET (inferior_ptid),
! 	      (PTRACE_ARG3_TYPE) &inferior_registers, 0);
! 
!       if (regno != -1)
! 	return;
!     }
! 
! #ifdef PT_GETXMMREGS
!   if (have_ptrace_xmmregs != 0 &&
!       ptrace(PT_GETXMMREGS, PIDGET (inferior_ptid),
! 	     (PTRACE_ARG3_TYPE) inferior_xmmregisters, 0) == 0)
!     {
!       have_ptrace_xmmregs = 1;
!       i387_fill_fxsave (inferior_xmmregisters, regno);
!       ptrace (PT_SETXMMREGS, PIDGET (inferior_ptid),
! 	      (PTRACE_ARG3_TYPE) inferior_xmmregisters, 0);
!     }
!   else
!     {
!       have_ptrace_xmmregs = 0;
! #endif
!       ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
! 	      (PTRACE_ARG3_TYPE) inferior_fpregisters, 0);
!       i387_fill_fsave (inferior_fpregisters, regno);
!       ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
! 	      (PTRACE_ARG3_TYPE) inferior_fpregisters, 0);
! #ifdef PT_GETXMMREGS
!     }
! #endif
  }
  \f
  struct md_core
  {
    struct reg intreg;
!   char freg[108];
  };
  
  static void
***************
*** 163,192 ****
  {
    struct md_core *core_reg = (struct md_core *) core_reg_sect;
  
!   /* integer registers */
!   memcpy (&registers[REGISTER_BYTE (0)], &core_reg->intreg,
! 	  sizeof (struct reg));
! 
!   /* floating point registers */
!   RF (FP0_REGNUM,     core_reg->freg.regs[0]);
!   RF (FP0_REGNUM + 1, core_reg->freg.regs[1]);
!   RF (FP0_REGNUM + 2, core_reg->freg.regs[2]);
!   RF (FP0_REGNUM + 3, core_reg->freg.regs[3]);
!   RF (FP0_REGNUM + 4, core_reg->freg.regs[4]);
!   RF (FP0_REGNUM + 5, core_reg->freg.regs[5]);
!   RF (FP0_REGNUM + 6, core_reg->freg.regs[6]);
!   RF (FP0_REGNUM + 7, core_reg->freg.regs[7]);
! 
!   RF (FCTRL_REGNUM,   core_reg->freg.control);
!   RF (FSTAT_REGNUM,   core_reg->freg.status);
!   RF (FTAG_REGNUM,    core_reg->freg.tag);
!   RF (FCS_REGNUM,     core_reg->freg.code_seg);
!   RF (FCOFF_REGNUM,   core_reg->freg.eip);
!   RF (FDS_REGNUM,     core_reg->freg.operand_seg);
!   RF (FDOFF_REGNUM,   core_reg->freg.operand);
!   RF (FOP_REGNUM,     core_reg->freg.opcode);
  
!   registers_fetched ();
  }
  
  /* Register that we are able to handle i386nbsd core file formats.
--- 178,226 ----
  {
    struct md_core *core_reg = (struct md_core *) core_reg_sect;
  
!   /* We get everything from one section.  */
!   if (which != 0)
!     return;
  
!   /* Integer registers.  */
!   supply_regs ((char *) &core_reg->intreg);
! 
!   /* Floating point registers.  */
!   i387_supply_fsave (core_reg->freg);
! }
! 
! static void
! fetch_elfcore_registers (char *core_reg_sect, unsigned core_reg_size, int which,
!                          CORE_ADDR ignore)
! {
!   switch (which)
!     {
!     case 0:  /* Integer registers.  */
!       if (core_reg_size != sizeof (struct reg))
! 	warning ("Wrong size register set in core file.");
!       else
! 	supply_regs (core_reg_sect);
!       break;
! 
!     case 2:  /* Floating point registers.  */
!       if (core_reg_size != 108)
! 	warning ("Wrong size FP register set in core file.");
!       else
! 	i387_supply_fsave (core_reg_sect);
!       break;
! 
!     case 3:  /* "Extended" floating point registers.  This is gdb-speak
! 		for SSE/SSE2. */
!       if (core_reg_size != 512)
! 	warning ("Wrong size XMM register set in core file.");
!       else
! 	i387_supply_fxsave (core_reg_sect);
!       break;
! 
!     default:
!       /* Don't know what kind of register request this is; just ignore it.  */
!       break;
!     }
  }
  
  /* Register that we are able to handle i386nbsd core file formats.
***************
*** 201,208 ****
--- 235,252 ----
    NULL					/* next */
  };
  
+ static struct core_fns i386nbsd_elfcore_fns =
+ {
+   bfd_target_elf_flavour,		/* core_flavour */
+   default_check_format,			/* check_format */
+   default_core_sniffer,			/* core_sniffer */
+   fetch_elfcore_registers,		/* core_read_registers */
+   NULL					/* next */
+ };
+ 
  void
  _initialize_i386nbsd_nat (void)
  {
    add_core_fns (&i386nbsd_core_fns);
+   add_core_fns (&i386nbsd_elfcore_fns);
  }
Index: config/i386/nbsd.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/nbsd.mh,v
retrieving revision 1.10
diff -c -r1.10 nbsd.mh
*** nbsd.mh	2001/10/02 23:11:21	1.10
--- nbsd.mh	2002/01/04 23:54:55
***************
*** 7,13 ****
  # continuation character (backslash) to extend a commented line.  As a
  # consequence, BSD make considers subsequent tab-indented lines to be
  # "unassociated shell commands".
! NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o i386nbsd-nat.o solib.o solib-sunos.o
  
  XM_FILE= xm-nbsd.h
  NAT_FILE= nm-nbsd.h
--- 7,13 ----
  # continuation character (backslash) to extend a commented line.  As a
  # consequence, BSD make considers subsequent tab-indented lines to be
  # "unassociated shell commands".
! NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o i387-nat.o i386nbsd-nat.o solib.o solib-sunos.o
  
  XM_FILE= xm-nbsd.h
  NAT_FILE= nm-nbsd.h
Index: config/i386/nbsdelf.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/nbsdelf.mh,v
retrieving revision 1.6
diff -c -r1.6 nbsdelf.mh
*** nbsdelf.mh	2001/03/10 06:17:21	1.6
--- nbsdelf.mh	2002/01/04 23:54:55
***************
*** 1,5 ****
  # Host: Intel 386 running NetBSD
  XDEPFILES=
! NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o i386nbsd-nat.o solib.o solib-svr4.o solib-legacy.o
  XM_FILE= xm-nbsd.h
  NAT_FILE= nm-nbsdelf.h
--- 1,5 ----
  # Host: Intel 386 running NetBSD
  XDEPFILES=
! NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o i387-nat.o i386nbsd-nat.o solib.o solib-svr4.o solib-legacy.o
  XM_FILE= xm-nbsd.h
  NAT_FILE= nm-nbsdelf.h
Index: config/i386/tm-nbsd.h
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/tm-nbsd.h,v
retrieving revision 1.7
diff -c -r1.7 tm-nbsd.h
*** tm-nbsd.h	2001/03/06 08:21:29	1.7
--- tm-nbsd.h	2002/01/04 23:54:55
***************
*** 1,5 ****
  /* Macro definitions for i386 running under NetBSD.
!    Copyright 1994, 1996, 2000 Free Software Foundation, Inc.
  
     This file is part of GDB.
  
--- 1,5 ----
  /* Macro definitions for i386 running under NetBSD.
!    Copyright 1994, 1996, 2000, 2002 Free Software Foundation, Inc.
  
     This file is part of GDB.
  
***************
*** 22,27 ****
--- 22,28 ----
  #define TM_NBSD_H
  
  #define HAVE_I387_REGS
+ #define HAVE_SSE_REGS
  
  #include "i386/tm-i386.h"
  #include "config/tm-nbsd.h"

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [patch] Overhaul i386nbsd-nat.c, add support for XMM + ELF core files
  2002-01-04 16:08 [patch] Overhaul i386nbsd-nat.c, add support for XMM + ELF core files Jason R Thorpe
@ 2002-01-04 16:41 ` Mark Kettenis
  2002-01-04 17:05   ` Jason R Thorpe
  2002-01-04 19:03   ` Jason R Thorpe
  0 siblings, 2 replies; 8+ messages in thread
From: Mark Kettenis @ 2002-01-04 16:41 UTC (permalink / raw)
  To: thorpej; +Cc: gdb-patches

Jason R Thorpe <thorpej@wasabisystems.com> writes:

> The following patch overhauls i386nbsd-nat.c, using new interfaces to
> access the gdb regcache, and adds support for XMM registers and ELF
> format NetBSD core files.

Is there any chance that I can convince you to make NetBSD use
i386bsd-nat.c instead of i386nbsd-nat.c?  NetBSD is close enough to
FreeBSD and OpenBSD to be able to use the same basic functionality on
all of them.

Mark


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [patch] Overhaul i386nbsd-nat.c, add support for XMM + ELF core files
  2002-01-04 16:41 ` Mark Kettenis
@ 2002-01-04 17:05   ` Jason R Thorpe
  2002-01-04 19:03   ` Jason R Thorpe
  1 sibling, 0 replies; 8+ messages in thread
From: Jason R Thorpe @ 2002-01-04 17:05 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: gdb-patches

On Sat, Jan 05, 2002 at 01:39:52AM +0100, Mark Kettenis wrote:

 > Is there any chance that I can convince you to make NetBSD use
 > i386bsd-nat.c instead of i386nbsd-nat.c?  NetBSD is close enough to
 > FreeBSD and OpenBSD to be able to use the same basic functionality on
 > all of them.

I'd really rather not (the other BSD's don't have the XMM functionality,
for example), but I'll take a look to see if it's really feasible.

Note, i386nbsd-nat.c is still going to be necessary, since NetBSD uses
different core files than the others.

-- 
        -- Jason R. Thorpe <thorpej@wasabisystems.com>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [patch] Overhaul i386nbsd-nat.c, add support for XMM + ELF core files
  2002-01-04 16:41 ` Mark Kettenis
  2002-01-04 17:05   ` Jason R Thorpe
@ 2002-01-04 19:03   ` Jason R Thorpe
  2002-01-04 19:28     ` Michael Snyder
  2002-01-05  6:07     ` Mark Kettenis
  1 sibling, 2 replies; 8+ messages in thread
From: Jason R Thorpe @ 2002-01-04 19:03 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 2122 bytes --]

On Sat, Jan 05, 2002 at 01:39:52AM +0100, Mark Kettenis wrote:

 > Is there any chance that I can convince you to make NetBSD use
 > i386bsd-nat.c instead of i386nbsd-nat.c?  NetBSD is close enough to
 > FreeBSD and OpenBSD to be able to use the same basic functionality on
 > all of them.

Alright, I did this; it wasn't quite as nasty as I thought it'd be.

OK to commit?

        [ for gdb/ChangeLog ]
2002-01-04  Jason Thorpe  <thorpej@wasabisystems.com> 
 
        * acconfig.h (HAVE_PT_GETXMMREGS): New.
        * config.in: Regenerate. 
        * configure.in: Update copyright years.
        Add test for PT_GETXMMREGS supplied by <sys/ptrace.h>.
        * configure: Regenerate.
        * i386bsd-nat.c: Update copyright years.
        (fill_gregset): Use regcache_collect.  
        (fetch_inferior_registers): Only fetch integer registers
        if requested to do so.  Add support for XMM registers
        using PT_GETXMMREGS. 
        (store_inferior_registers): Only store integer registers
        if requested to do so.  Add support for XMM registers
        using PT_SETXMMREGS. 
        * i386nbsd-nat.c (fetch_inferior_registers): Remove.
        (store_inferior_registers): Remove. 
        (fetch_core_registers): Use supply_gregset and i387_supply_fsave. 
        (fetch_elfcore_registers): New function.
        (i386nbsd_elfcore_fns): New.
        (_initialize_i386nbsd_nat): Register i386nbsd_elfcore_fns.
        * config/i386/nbsd.mh (NATDEPFILES): Add i387-nat.o and
        i386bsd-nat.o.
        * config/i386/nbsdelf.mh (NATDEPFILES): Likewise.
        * config/i386/nbsd.mt (TDEPFILES): Add i386bsd-nat.o.
        * config/i386/nbsdelf.mt (TDEPFILES): Likewise.
        * config/i386/tm-nbsd.h: Update copyright years. 
        (HAVE_SSE_REGS): Define. 
        (IN_SIGTRAMP): Define as i386bsd_in_sigtramp.
        (SIGTRAMP_START): Redefine as i386bsd_sigtramp_start.
        (SIGTRAMP_END): Redefine as i386bsd_sigtramp_end.
        (SIGCONTEXT_PC_OFFSET): Remove.
        (FRAME_SAVED_PC): Define as i386bsd_frame_saved_pc.

-- 
        -- Jason R. Thorpe <thorpej@wasabisystems.com>

[-- Attachment #2: patch3 --]
[-- Type: text/plain, Size: 21627 bytes --]

Index: acconfig.h
===================================================================
RCS file: /cvs/src/src/gdb/acconfig.h,v
retrieving revision 1.16
diff -c -r1.16 acconfig.h
*** acconfig.h	2001/03/31 18:09:02	1.16
--- acconfig.h	2002/01/05 02:57:32
***************
*** 150,155 ****
--- 150,158 ----
  /* Define if <sys/ptrace.h> defines the PT_GETDBREGS request.  */
  #undef HAVE_PT_GETDBREGS
  
+ /* Define if <sys/ptrace.h> defines the PT_GETXMMREGS request.  */
+ #undef HAVE_PT_GETXMMREGS
+ 
  /* Define if gnu-regex.c included with GDB should be used. */
  #undef USE_INCLUDED_REGEX
  
Index: configure.in
===================================================================
RCS file: /cvs/src/src/gdb/configure.in,v
retrieving revision 1.76
diff -c -r1.76 configure.in
*** configure.in	2001/12/21 22:32:37	1.76
--- configure.in	2002/01/05 02:57:40
***************
*** 1,5 ****
  dnl Autoconf configure script for GDB, the GNU debugger.
! dnl Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001
  dnl Free Software Foundation, Inc.
  dnl
  dnl This file is part of GDB.
--- 1,5 ----
  dnl Autoconf configure script for GDB, the GNU debugger.
! dnl Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
  dnl Free Software Foundation, Inc.
  dnl
  dnl This file is part of GDB.
***************
*** 215,220 ****
--- 215,233 ----
  AC_MSG_RESULT($gdb_cv_have_pt_getdbregs)
  if test $gdb_cv_have_pt_getdbregs = yes; then
    AC_DEFINE(HAVE_PT_GETDBREGS)
+ fi
+ 
+ # See if <sys/ptrace.h> provides the PT_GETXMMREGS request.
+ AC_MSG_CHECKING(for PT_GETXMMREGS)
+ AC_CACHE_VAL(gdb_cv_have_pt_getxmmregs,
+ [AC_TRY_COMPILE([#include <sys/types.h>
+ #include <sys/ptrace.h>],
+ 		[PT_GETXMMREGS;],
+ 		[gdb_cv_have_pt_getxmmregs=yes],
+ 		[gdb_cv_have_pt_getxmmregs=no])])
+ AC_MSG_RESULT($gdb_cv_have_pt_getxmmregs)
+ if test $gdb_cv_have_pt_getxmmregs = yes; then
+   AC_DEFINE(HAVE_PT_GETXMMREGS)
  fi
  
  
Index: i386bsd-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386bsd-nat.c,v
retrieving revision 1.10
diff -c -r1.10 i386bsd-nat.c
*** i386bsd-nat.c	2001/12/29 20:15:47	1.10
--- i386bsd-nat.c	2002/01/05 02:57:41
***************
*** 1,5 ****
  /* Native-dependent code for modern i386 BSD's.
!    Copyright 2000, 2001 Free Software Foundation, Inc.
  
     This file is part of GDB.
  
--- 1,5 ----
  /* Native-dependent code for modern i386 BSD's.
!    Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
  
     This file is part of GDB.
  
***************
*** 96,101 ****
--- 96,111 ----
  
  #define REG_ADDR(regset, regno) ((char *) (regset) + reg_offset[regno])
  
+ /* Macro to determine if a register is fetched with PT_GETREGS.  */
+ #define GETREGS_SUPPLIES(regno) \
+   ((0 <= (regno) && (regno) <= 15))
+ 
+ #ifdef HAVE_PT_GETXMMREGS
+ /* Set to 1 if the kernel supports PT_GETXMMREGS.  Initialized to -1
+    so that we try PT_GETXMMREGS the first time around.  */
+ static int have_ptrace_xmmregs = -1;
+ #endif
+ 
  /* Return nonzero if we shouldn't try to fetch register REGNO.  */
  
  static int
***************
*** 135,142 ****
  
    for (i = 0; i < NUM_GREGS; i++)
      if ((regno == -1 || regno == i) && ! CANNOT_STORE_REGISTER (i))
!       memcpy (REG_ADDR (gregsetp, i), &registers[REGISTER_BYTE (i)],
! 	      REGISTER_RAW_SIZE (i));
  }
  
  #include "i387-nat.h"
--- 145,151 ----
  
    for (i = 0; i < NUM_GREGS; i++)
      if ((regno == -1 || regno == i) && ! CANNOT_STORE_REGISTER (i))
!       regcache_collect (i, REG_ADDR (gregsetp, i));
  }
  
  #include "i387-nat.h"
***************
*** 166,188 ****
  void
  fetch_inferior_registers (int regno)
  {
-   gregset_t gregs;
  
!   if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
!               (PTRACE_ARG3_TYPE) &gregs, 0) == -1)
!     perror_with_name ("Couldn't get registers");
  
!   supply_gregset (&gregs);
  
    if (regno == -1 || regno >= FP0_REGNUM)
      {
        fpregset_t fpregs;
  
        if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
  		  (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
  	perror_with_name ("Couldn't get floating point status");
  
        supply_fpregset (&fpregs);
      }
  }
  
--- 175,222 ----
  void
  fetch_inferior_registers (int regno)
  {
  
!   if (regno == -1 || GETREGS_SUPPLIES (regno))
!     {
!       gregset_t gregs;
  
!       if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
! 		  (PTRACE_ARG3_TYPE) &gregs, 0) == -1)
! 	perror_with_name ("Couldn't get registers");
! 
!       supply_gregset (&gregs);
!       if (regno != -1)
! 	return;
!     }
  
    if (regno == -1 || regno >= FP0_REGNUM)
      {
        fpregset_t fpregs;
+ #ifdef HAVE_PT_GETXMMREGS
+       char xmmregs[512];
+ 
+       if (have_ptrace_xmmregs != 0 &&
+ 	  ptrace(PT_GETXMMREGS, PIDGET (inferior_ptid),
+ 		 (PTRACE_ARG3_TYPE) xmmregs, 0) == 0)
+ 	{
+ 	  have_ptrace_xmmregs = 1;
+ 	  i387_supply_fxsave (xmmregs);
+ 	}
+       else
+ 	{
+           if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
+ 		      (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
+ 	    perror_with_name ("Couldn't get floating point status");
  
+ 	  supply_fpregset (&fpregs);
+ 	}
+ #else
        if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
  		  (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
  	perror_with_name ("Couldn't get floating point status");
  
        supply_fpregset (&fpregs);
+ #endif
      }
  }
  
***************
*** 192,222 ****
  void
  store_inferior_registers (int regno)
  {
!   gregset_t gregs;
  
!   if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
!               (PTRACE_ARG3_TYPE) &gregs, 0) == -1)
!     perror_with_name ("Couldn't get registers");
  
!   fill_gregset (&gregs, regno);
  
!   if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
! 	      (PTRACE_ARG3_TYPE) &gregs, 0) == -1)
!     perror_with_name ("Couldn't write registers");
  
    if (regno == -1 || regno >= FP0_REGNUM)
      {
        fpregset_t fpregs;
  
!       if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
! 		  (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
! 	perror_with_name ("Couldn't get floating point status");
  
!       fill_fpregset (&fpregs, regno);
    
!       if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
! 		  (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
! 	perror_with_name ("Couldn't write floating point status");
      }
  }
  \f
--- 226,284 ----
  void
  store_inferior_registers (int regno)
  {
! 
!   if (regno == -1 || GETREGS_SUPPLIES (regno))
!     {
!       gregset_t gregs;
  
!       if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
!                   (PTRACE_ARG3_TYPE) &gregs, 0) == -1)
!         perror_with_name ("Couldn't get registers");
  
!       fill_gregset (&gregs, regno);
  
!       if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
! 	          (PTRACE_ARG3_TYPE) &gregs, 0) == -1)
!         perror_with_name ("Couldn't write registers");
  
+       if (regno != -1)
+ 	return;
+     }
+ 
    if (regno == -1 || regno >= FP0_REGNUM)
      {
        fpregset_t fpregs;
+ #ifdef HAVE_PT_GETXMMREGS
+       char xmmregs[512];
  
!       if (have_ptrace_xmmregs != 0 &&
! 	  ptrace(PT_GETXMMREGS, PIDGET (inferior_ptid),
! 		 (PTRACE_ARG3_TYPE) xmmregs, 0) == 0)
! 	{
! 	  have_ptrace_xmmregs = 1;
! 
! 	  i387_fill_fxsave (xmmregs, regno);
! 
! 	  if (ptrace (PT_SETXMMREGS, PIDGET (inferior_ptid),
! 		      (PTRACE_ARG3_TYPE) xmmregs, 0) == -1)
!             perror_with_name ("Couldn't write XMM registers");
! 	}
!       else
! 	{
! 	  have_ptrace_xmmregs = 0;
! #endif
!           if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
! 		      (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
! 	    perror_with_name ("Couldn't get floating point status");
  
!           fill_fpregset (&fpregs, regno);
    
!           if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
! 		      (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
! 	    perror_with_name ("Couldn't write floating point status");
! #ifdef HAVE_PT_GETXMMREGS
!         }
! #endif
      }
  }
  \f
Index: i386nbsd-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386nbsd-nat.c,v
retrieving revision 1.9
diff -c -r1.9 i386nbsd-nat.c
*** i386nbsd-nat.c	2002/01/04 22:43:31	1.9
--- i386nbsd-nat.c	2002/01/05 02:57:41
***************
*** 25,160 ****
  #include <machine/reg.h>
  #include <machine/frame.h>
  #include "inferior.h"
! #include "gdbcore.h" /* for registers_fetched() */
  #include "regcache.h"
  
! /* Defines for XMM0_REGNUM etc. */
! #include "i386-tdep.h"
  
! #define RF(dst, src) \
! 	memcpy(&registers[REGISTER_BYTE(dst)], &src, sizeof(src))
  
! #define RS(src, dst) \
! 	memcpy(&dst, &registers[REGISTER_BYTE(src)], sizeof(dst))
!      
! struct env387
!   {
!     unsigned short control;
!     unsigned short r0;
!     unsigned short status;
!     unsigned short r1;
!     unsigned short tag;  
!     unsigned short r2;
!     unsigned long eip;
!     unsigned short code_seg;
!     unsigned short opcode;
!     unsigned long operand; 
!     unsigned short operand_seg;
!     unsigned short r3;
!     unsigned char regs[8][10];
!   };
  
- void
- fetch_inferior_registers (int regno)
- {
-   struct reg inferior_registers;
-   struct env387 inferior_fpregisters;
- 
-   ptrace (PT_GETREGS, PIDGET (inferior_ptid),
- 	  (PTRACE_ARG3_TYPE) &inferior_registers, 0);
-   ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
- 	  (PTRACE_ARG3_TYPE) &inferior_fpregisters, 0);
- 
-   RF ( 0, inferior_registers.r_eax);
-   RF ( 1, inferior_registers.r_ecx);
-   RF ( 2, inferior_registers.r_edx);
-   RF ( 3, inferior_registers.r_ebx);
-   RF ( 4, inferior_registers.r_esp);
-   RF ( 5, inferior_registers.r_ebp);
-   RF ( 6, inferior_registers.r_esi);
-   RF ( 7, inferior_registers.r_edi);
-   RF ( 8, inferior_registers.r_eip);
-   RF ( 9, inferior_registers.r_eflags);
-   RF (10, inferior_registers.r_cs);
-   RF (11, inferior_registers.r_ss);
-   RF (12, inferior_registers.r_ds);
-   RF (13, inferior_registers.r_es);
-   RF (14, inferior_registers.r_fs);
-   RF (15, inferior_registers.r_gs);
- 
-   RF (FP0_REGNUM,     inferior_fpregisters.regs[0]);
-   RF (FP0_REGNUM + 1, inferior_fpregisters.regs[1]);
-   RF (FP0_REGNUM + 2, inferior_fpregisters.regs[2]);
-   RF (FP0_REGNUM + 3, inferior_fpregisters.regs[3]);
-   RF (FP0_REGNUM + 4, inferior_fpregisters.regs[4]);
-   RF (FP0_REGNUM + 5, inferior_fpregisters.regs[5]);
-   RF (FP0_REGNUM + 6, inferior_fpregisters.regs[6]);
-   RF (FP0_REGNUM + 7, inferior_fpregisters.regs[7]);
- 
-   RF (FCTRL_REGNUM,   inferior_fpregisters.control);
-   RF (FSTAT_REGNUM,   inferior_fpregisters.status);
-   RF (FTAG_REGNUM,    inferior_fpregisters.tag);
-   RF (FCS_REGNUM,     inferior_fpregisters.code_seg);
-   RF (FCOFF_REGNUM,   inferior_fpregisters.eip);
-   RF (FDS_REGNUM,     inferior_fpregisters.operand_seg);
-   RF (FDOFF_REGNUM,   inferior_fpregisters.operand);
-   RF (FOP_REGNUM,     inferior_fpregisters.opcode);
- 
-   registers_fetched ();
- }
- 
- void
- store_inferior_registers (int regno)
- {
-   struct reg inferior_registers;
-   struct env387 inferior_fpregisters;
- 
-   RS ( 0, inferior_registers.r_eax);
-   RS ( 1, inferior_registers.r_ecx);
-   RS ( 2, inferior_registers.r_edx);
-   RS ( 3, inferior_registers.r_ebx);
-   RS ( 4, inferior_registers.r_esp);
-   RS ( 5, inferior_registers.r_ebp);
-   RS ( 6, inferior_registers.r_esi);
-   RS ( 7, inferior_registers.r_edi);
-   RS ( 8, inferior_registers.r_eip);
-   RS ( 9, inferior_registers.r_eflags);
-   RS (10, inferior_registers.r_cs);
-   RS (11, inferior_registers.r_ss);
-   RS (12, inferior_registers.r_ds);
-   RS (13, inferior_registers.r_es);
-   RS (14, inferior_registers.r_fs);
-   RS (15, inferior_registers.r_gs);
- 
-   
-   RS (FP0_REGNUM,     inferior_fpregisters.regs[0]);
-   RS (FP0_REGNUM + 1, inferior_fpregisters.regs[1]);
-   RS (FP0_REGNUM + 2, inferior_fpregisters.regs[2]);
-   RS (FP0_REGNUM + 3, inferior_fpregisters.regs[3]);
-   RS (FP0_REGNUM + 4, inferior_fpregisters.regs[4]);
-   RS (FP0_REGNUM + 5, inferior_fpregisters.regs[5]);
-   RS (FP0_REGNUM + 6, inferior_fpregisters.regs[6]);
-   RS (FP0_REGNUM + 7, inferior_fpregisters.regs[7]);
- 
-   RS (FCTRL_REGNUM,   inferior_fpregisters.control);
-   RS (FSTAT_REGNUM,   inferior_fpregisters.status);
-   RS (FTAG_REGNUM,    inferior_fpregisters.tag);
-   RS (FCS_REGNUM,     inferior_fpregisters.code_seg);
-   RS (FCOFF_REGNUM,   inferior_fpregisters.eip);
-   RS (FDS_REGNUM,     inferior_fpregisters.operand_seg);
-   RS (FDOFF_REGNUM,   inferior_fpregisters.operand);
-   RS (FOP_REGNUM,     inferior_fpregisters.opcode);
-   
-   ptrace (PT_SETREGS, PIDGET (inferior_ptid),
- 	  (PTRACE_ARG3_TYPE) &inferior_registers, 0);
-   ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
- 	  (PTRACE_ARG3_TYPE) &inferior_fpregisters, 0);
- }
- \f
  struct md_core
  {
    struct reg intreg;
!   struct env387 freg;
  };
  
  static void
--- 25,50 ----
  #include <machine/reg.h>
  #include <machine/frame.h>
  #include "inferior.h"
! #include "gdbcore.h"
  #include "regcache.h"
  
! #ifndef HAVE_GREGSET_T
! typedef struct reg gregset_t;
! #endif
! 
! #ifndef HAVE_FPREGSET_T
! typedef struct fpreg fpregset_t;
! #endif
  
! #include "gregset.h"
  
! /* Prototypes for i387_supply_fsave etc.  */
! #include "i387-nat.h"  
  
  struct md_core
  {
    struct reg intreg;
!   char freg[108];
  };
  
  static void
***************
*** 162,194 ****
  		      CORE_ADDR ignore)
  {
    struct md_core *core_reg = (struct md_core *) core_reg_sect;
  
!   /* integer registers */
!   memcpy (&registers[REGISTER_BYTE (0)], &core_reg->intreg,
! 	  sizeof (struct reg));
! 
!   /* floating point registers */
!   RF (FP0_REGNUM,     core_reg->freg.regs[0]);
!   RF (FP0_REGNUM + 1, core_reg->freg.regs[1]);
!   RF (FP0_REGNUM + 2, core_reg->freg.regs[2]);
!   RF (FP0_REGNUM + 3, core_reg->freg.regs[3]);
!   RF (FP0_REGNUM + 4, core_reg->freg.regs[4]);
!   RF (FP0_REGNUM + 5, core_reg->freg.regs[5]);
!   RF (FP0_REGNUM + 6, core_reg->freg.regs[6]);
!   RF (FP0_REGNUM + 7, core_reg->freg.regs[7]);
! 
!   RF (FCTRL_REGNUM,   core_reg->freg.control);
!   RF (FSTAT_REGNUM,   core_reg->freg.status);
!   RF (FTAG_REGNUM,    core_reg->freg.tag);
!   RF (FCS_REGNUM,     core_reg->freg.code_seg);
!   RF (FCOFF_REGNUM,   core_reg->freg.eip);
!   RF (FDS_REGNUM,     core_reg->freg.operand_seg);
!   RF (FDOFF_REGNUM,   core_reg->freg.operand);
!   RF (FOP_REGNUM,     core_reg->freg.opcode);
  
!   registers_fetched ();
  }
  
  /* Register that we are able to handle i386nbsd core file formats.
     FIXME: is this really bfd_target_unknown_flavour? */
  
--- 52,108 ----
  		      CORE_ADDR ignore)
  {
    struct md_core *core_reg = (struct md_core *) core_reg_sect;
+ 
+   /* We get everything from one section.  */
+   if (which != 0)
+     return;
  
!   /* Integer registers.  */
!   supply_gregset (&core_reg->intreg);
  
!   /* Floating point registers.  */
!   i387_supply_fsave (core_reg->freg);
  }
  
+ static void
+ fetch_elfcore_registers (char *core_reg_sect, unsigned core_reg_size, int which,
+                          CORE_ADDR ignore)
+ {
+   gregset_t gregset;
+ 
+   switch (which)
+     {
+     case 0:  /* Integer registers.  */
+       if (core_reg_size != sizeof (struct reg))
+ 	warning ("Wrong size register set in core file.");
+       else
+ 	{
+ 	  memcpy (&gregset, core_reg_sect, sizeof (gregset));
+ 	  supply_gregset (&gregset);
+ 	}
+       break;
+ 
+     case 2:  /* Floating point registers.  */
+       if (core_reg_size != 108)
+ 	warning ("Wrong size FP register set in core file.");
+       else
+ 	i387_supply_fsave (core_reg_sect);
+       break;
+ 
+     case 3:  /* "Extended" floating point registers.  This is gdb-speak
+ 		for SSE/SSE2. */
+       if (core_reg_size != 512)
+ 	warning ("Wrong size XMM register set in core file.");
+       else
+ 	i387_supply_fxsave (core_reg_sect);
+       break;
+ 
+     default:
+       /* Don't know what kind of register request this is; just ignore it.  */
+       break;
+     }
+ }
+ 
  /* Register that we are able to handle i386nbsd core file formats.
     FIXME: is this really bfd_target_unknown_flavour? */
  
***************
*** 201,208 ****
--- 115,132 ----
    NULL					/* next */
  };
  
+ static struct core_fns i386nbsd_elfcore_fns =
+ {
+   bfd_target_elf_flavour,		/* core_flavour */
+   default_check_format,			/* check_format */
+   default_core_sniffer,			/* core_sniffer */
+   fetch_elfcore_registers,		/* core_read_registers */
+   NULL					/* next */
+ };
+ 
  void
  _initialize_i386nbsd_nat (void)
  {
    add_core_fns (&i386nbsd_core_fns);
+   add_core_fns (&i386nbsd_elfcore_fns);
  }
Index: config/i386/nbsd.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/nbsd.mh,v
retrieving revision 1.10
diff -c -r1.10 nbsd.mh
*** nbsd.mh	2001/10/02 23:11:21	1.10
--- nbsd.mh	2002/01/05 02:57:41
***************
*** 7,13 ****
  # continuation character (backslash) to extend a commented line.  As a
  # consequence, BSD make considers subsequent tab-indented lines to be
  # "unassociated shell commands".
! NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o i386nbsd-nat.o solib.o solib-sunos.o
  
  XM_FILE= xm-nbsd.h
  NAT_FILE= nm-nbsd.h
--- 7,13 ----
  # continuation character (backslash) to extend a commented line.  As a
  # consequence, BSD make considers subsequent tab-indented lines to be
  # "unassociated shell commands".
! NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o i387-nat.o i386bsd-nat.o i386nbsd-nat.o solib.o solib-sunos.o
  
  XM_FILE= xm-nbsd.h
  NAT_FILE= nm-nbsd.h
Index: config/i386/nbsd.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/nbsd.mt,v
retrieving revision 1.6
diff -c -r1.6 nbsd.mt
*** nbsd.mt	2001/01/22 20:23:16	1.6
--- nbsd.mt	2002/01/05 02:57:42
***************
*** 1,5 ****
  # Target: Intel 386 running NetBSD
! TDEPFILES= i386-tdep.o i387-tdep.o i386nbsd-tdep.o
  TM_FILE= tm-nbsd.h
  
  GDBSERVER_DEPFILES= low-nbsd.o
--- 1,5 ----
  # Target: Intel 386 running NetBSD
! TDEPFILES= i386-tdep.o i387-tdep.o i386bsd-tdep.o i386nbsd-tdep.o
  TM_FILE= tm-nbsd.h
  
  GDBSERVER_DEPFILES= low-nbsd.o
Index: config/i386/nbsdelf.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/nbsdelf.mh,v
retrieving revision 1.6
diff -c -r1.6 nbsdelf.mh
*** nbsdelf.mh	2001/03/10 06:17:21	1.6
--- nbsdelf.mh	2002/01/05 02:57:42
***************
*** 1,5 ****
  # Host: Intel 386 running NetBSD
  XDEPFILES=
! NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o i386nbsd-nat.o solib.o solib-svr4.o solib-legacy.o
  XM_FILE= xm-nbsd.h
  NAT_FILE= nm-nbsdelf.h
--- 1,5 ----
  # Host: Intel 386 running NetBSD
  XDEPFILES=
! NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o i387-nat.o i386bsd-nat.o i386nbsd-nat.o solib.o solib-svr4.o solib-legacy.o
  XM_FILE= xm-nbsd.h
  NAT_FILE= nm-nbsdelf.h
Index: config/i386/nbsdelf.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/nbsdelf.mt,v
retrieving revision 1.3
diff -c -r1.3 nbsdelf.mt
*** nbsdelf.mt	2001/01/22 20:23:16	1.3
--- nbsdelf.mt	2002/01/05 02:57:42
***************
*** 1,5 ****
  # Target: Intel 386 running NetBSD
! TDEPFILES= i386-tdep.o i387-tdep.o
  TM_FILE= tm-nbsdelf.h
  
  GDBSERVER_DEPFILES= low-nbsd.o
--- 1,5 ----
  # Target: Intel 386 running NetBSD
! TDEPFILES= i386-tdep.o i387-tdep.o i386bsd-tdep.o
  TM_FILE= tm-nbsdelf.h
  
  GDBSERVER_DEPFILES= low-nbsd.o
Index: config/i386/tm-nbsd.h
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/tm-nbsd.h,v
retrieving revision 1.7
diff -c -r1.7 tm-nbsd.h
*** tm-nbsd.h	2001/03/06 08:21:29	1.7
--- tm-nbsd.h	2002/01/05 02:57:42
***************
*** 1,5 ****
  /* Macro definitions for i386 running under NetBSD.
!    Copyright 1994, 1996, 2000 Free Software Foundation, Inc.
  
     This file is part of GDB.
  
--- 1,5 ----
  /* Macro definitions for i386 running under NetBSD.
!    Copyright 1994, 1996, 2000, 2002 Free Software Foundation, Inc.
  
     This file is part of GDB.
  
***************
*** 22,27 ****
--- 22,28 ----
  #define TM_NBSD_H
  
  #define HAVE_I387_REGS
+ #define HAVE_SSE_REGS
  
  #include "i386/tm-i386.h"
  #include "config/tm-nbsd.h"
***************
*** 46,58 ****
  \f
  /* Support for signal handlers.  */
  
! /* The sigtramp is above the user stack and immediately below the 
!    user area.  Using constants here allows for cross debugging. */
  
! #define SIGTRAMP_START(pc)	0xbfbfdf20
! #define SIGTRAMP_END(pc)	0xbfbfdff0
  
! /* Offset to saved PC in sigcontext, from <sys/signal.h>.  */
! #define SIGCONTEXT_PC_OFFSET 20
  
  #endif /* TM_NBSD_H */
--- 47,70 ----
  \f
  /* Support for signal handlers.  */
  
! #define IN_SIGTRAMP(pc, name) i386bsd_in_sigtramp (pc, name)
! extern int i386bsd_in_sigtramp (CORE_ADDR pc, char *name);
  
! /* These defines allow the recognition of sigtramps as a function name
!    <sigtramp>.
  
!    FIXME: kettenis/2001-07-13: These should be added to the target
!    vector and turned into functions when we go "multi-arch".  */
! 
! #define SIGTRAMP_START(pc) i386bsd_sigtramp_start
! #define SIGTRAMP_END(pc) i386bsd_sigtramp_end
! extern CORE_ADDR i386bsd_sigtramp_start;
! extern CORE_ADDR i386bsd_sigtramp_end;
! 
! /* Override FRAME_SAVED_PC to enable the recognition of signal handlers.  */
! 
! #undef FRAME_SAVED_PC
! #define FRAME_SAVED_PC(frame) i386bsd_frame_saved_pc (frame)
! extern CORE_ADDR i386bsd_frame_saved_pc (struct frame_info *frame);
  
  #endif /* TM_NBSD_H */

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [patch] Overhaul i386nbsd-nat.c, add support for XMM + ELF core  files
  2002-01-04 19:03   ` Jason R Thorpe
@ 2002-01-04 19:28     ` Michael Snyder
  2002-01-04 19:41       ` Andrew Cagney
  2002-01-05  6:07     ` Mark Kettenis
  1 sibling, 1 reply; 8+ messages in thread
From: Michael Snyder @ 2002-01-04 19:28 UTC (permalink / raw)
  To: thorpej; +Cc: Mark Kettenis, gdb-patches

Jason R Thorpe wrote:
> 
> On Sat, Jan 05, 2002 at 01:39:52AM +0100, Mark Kettenis wrote:
> 
>  > Is there any chance that I can convince you to make NetBSD use
>  > i386bsd-nat.c instead of i386nbsd-nat.c?  NetBSD is close enough to
>  > FreeBSD and OpenBSD to be able to use the same basic functionality on
>  > all of them.
> 
> Alright, I did this; it wasn't quite as nasty as I thought it'd be.
> 
> OK to commit?
> 
>         [ for gdb/ChangeLog ]
> 2002-01-04  Jason Thorpe  <thorpej@wasabisystems.com>
> 
>         * acconfig.h (HAVE_PT_GETXMMREGS): New.
>         * config.in: Regenerate.
>         * configure.in: Update copyright years.
>         Add test for PT_GETXMMREGS supplied by <sys/ptrace.h>.
>         * configure: Regenerate.
>         * i386bsd-nat.c: Update copyright years.
>         (fill_gregset): Use regcache_collect.

Are you concerned about threads?  regcache_collect is not thread-aware.


>         (fetch_inferior_registers): Only fetch integer registers
>         if requested to do so.  Add support for XMM registers
>         using PT_GETXMMREGS.
>         (store_inferior_registers): Only store integer registers
>         if requested to do so.  Add support for XMM registers
>         using PT_SETXMMREGS.
>         * i386nbsd-nat.c (fetch_inferior_registers): Remove.
>         (store_inferior_registers): Remove.
>         (fetch_core_registers): Use supply_gregset and i387_supply_fsave.
>         (fetch_elfcore_registers): New function.
>         (i386nbsd_elfcore_fns): New.
>         (_initialize_i386nbsd_nat): Register i386nbsd_elfcore_fns.
>         * config/i386/nbsd.mh (NATDEPFILES): Add i387-nat.o and
>         i386bsd-nat.o.
>         * config/i386/nbsdelf.mh (NATDEPFILES): Likewise.
>         * config/i386/nbsd.mt (TDEPFILES): Add i386bsd-nat.o.
>         * config/i386/nbsdelf.mt (TDEPFILES): Likewise.
>         * config/i386/tm-nbsd.h: Update copyright years.
>         (HAVE_SSE_REGS): Define.
>         (IN_SIGTRAMP): Define as i386bsd_in_sigtramp.
>         (SIGTRAMP_START): Redefine as i386bsd_sigtramp_start.
>         (SIGTRAMP_END): Redefine as i386bsd_sigtramp_end.
>         (SIGCONTEXT_PC_OFFSET): Remove.
>         (FRAME_SAVED_PC): Define as i386bsd_frame_saved_pc.
> 
> --
>         -- Jason R. Thorpe <thorpej@wasabisystems.com>
> 
>   ------------------------------------------------------------------------
>                     Name: JRT-patch3
>    JRT-patch3       Type: Plain Text (text/plain)
>              Description: patch3


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [patch] Overhaul i386nbsd-nat.c, add support for XMM + ELF core  files
  2002-01-04 19:28     ` Michael Snyder
@ 2002-01-04 19:41       ` Andrew Cagney
  2002-01-05 12:59         ` Michael Snyder
  0 siblings, 1 reply; 8+ messages in thread
From: Andrew Cagney @ 2002-01-04 19:41 UTC (permalink / raw)
  To: Michael Snyder; +Cc: thorpej, Mark Kettenis, gdb-patches

>  (fill_gregset): Use regcache_collect.
> 
> 
> Are you concerned about threads?  regcache_collect is not thread-aware.


I don't think that is a problem here.  The code it is replacing was 
using registers[] directly.  regcache_collect() is definitly less evil 
than registers[] :-)

Oh, and released versioins of NetBSD don't have kernel level threads.

enjoy,
Andrew

	




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [patch] Overhaul i386nbsd-nat.c, add support for XMM + ELF core files
  2002-01-04 19:03   ` Jason R Thorpe
  2002-01-04 19:28     ` Michael Snyder
@ 2002-01-05  6:07     ` Mark Kettenis
  1 sibling, 0 replies; 8+ messages in thread
From: Mark Kettenis @ 2002-01-05  6:07 UTC (permalink / raw)
  To: thorpej; +Cc: gdb-patches

   Date: Fri, 4 Jan 2002 19:03:50 -0800
   From: Jason R Thorpe <thorpej@wasabisystems.com>

   On Sat, Jan 05, 2002 at 01:39:52AM +0100, Mark Kettenis wrote:

    > Is there any chance that I can convince you to make NetBSD use
    > i386bsd-nat.c instead of i386nbsd-nat.c?  NetBSD is close enough to
    > FreeBSD and OpenBSD to be able to use the same basic functionality on
    > all of them.

[From your first message]

   I'd really rather not (the other BSD's don't have the XMM functionality,
   for example), but I'll take a look to see if it's really feasible.

My secret agenda of course is that when FreeBSD gets XMM
functionality, GDB will already have the support for it :-).

Likewise, when NetBSD implements support for the debug registers
(which FreeBSD already has), the support will already be there!

   Note, i386nbsd-nat.c is still going to be necessary, since NetBSD uses
   different core files than the others.

Sure!

[From your second message]

   Alright, I did this; it wasn't quite as nasty as I thought it'd be.

Well, I tried hard to write i386bsd.c such that it could be used on
all BSD's :-).

   OK to commit?

Yes please!

Thanks,

Mark


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [patch] Overhaul i386nbsd-nat.c, add support for XMM + ELF core   files
  2002-01-04 19:41       ` Andrew Cagney
@ 2002-01-05 12:59         ` Michael Snyder
  0 siblings, 0 replies; 8+ messages in thread
From: Michael Snyder @ 2002-01-05 12:59 UTC (permalink / raw)
  To: Andrew Cagney; +Cc: thorpej, Mark Kettenis, gdb-patches

Andrew Cagney wrote:
> 
> >  (fill_gregset): Use regcache_collect.
> >
> >
> > Are you concerned about threads?  regcache_collect is not thread-aware.
> 
> I don't think that is a problem here.  The code it is replacing was
> using registers[] directly.  regcache_collect() is definitly less evil
> than registers[] :-)

Definitely.

> Oh, and released versioins of NetBSD don't have kernel level threads.

OK, then it's not an issue.


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2002-01-05 20:59 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-01-04 16:08 [patch] Overhaul i386nbsd-nat.c, add support for XMM + ELF core files Jason R Thorpe
2002-01-04 16:41 ` Mark Kettenis
2002-01-04 17:05   ` Jason R Thorpe
2002-01-04 19:03   ` Jason R Thorpe
2002-01-04 19:28     ` Michael Snyder
2002-01-04 19:41       ` Andrew Cagney
2002-01-05 12:59         ` Michael Snyder
2002-01-05  6:07     ` Mark Kettenis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox