mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
I figured out what was going on.
Since nobody had made any changes to i386v-nat.c on sourceware since the repository was started, we were still getting the version from the vendor branch. (If you don't understand how the vendor branch works, treasure your innocence.) I naively assumed that, to see what changes had been introduced in version 1.2, one should diff it with 1.1, as they say in TV Guide, "with hilarious results". This change simply restores i386v-nat.c to what it used to be before I started bungling around. The text of this revision should be identical to that of revision 1.1.1.3, which was the former head of the trunk. (Yes, 1.1.1.3 was the head of the trunk. As I said, treasure your innocence.)
This commit is contained in:
parent
77d2aaae45
commit
4e32685259
157
gdb/i386v-nat.c
157
gdb/i386v-nat.c
@ -1,30 +1,31 @@
|
||||
/* Intel 386 native support for SYSV systems (pre-SVR4).
|
||||
Copyright (C) 1988, 89, 91, 92, 94, 96, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
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 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.
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "defs.h"
|
||||
|
||||
#ifdef HAVE_PTRACE_H
|
||||
# include <ptrace.h>
|
||||
#include <ptrace.h>
|
||||
#else
|
||||
# ifdef HAVE_SYS_PTRACE_H
|
||||
# include <sys/ptrace.h>
|
||||
# endif
|
||||
#ifdef HAVE_SYS_PTRACE_H
|
||||
#include <sys/ptrace.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "frame.h"
|
||||
@ -52,11 +53,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
*/
|
||||
|
||||
#ifdef TARGET_HAS_HARDWARE_WATCHPOINTS
|
||||
# ifdef HAVE_ASM_DEBUGREG_H
|
||||
# include <asm/debugreg.h>
|
||||
# else
|
||||
# include <sys/debugreg.h>
|
||||
# endif
|
||||
#ifdef HAVE_ASM_DEBUGREG_H
|
||||
#include <asm/debugreg.h>
|
||||
#else
|
||||
#include <sys/debugreg.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <sys/file.h>
|
||||
@ -69,11 +70,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
#include "floatformat.h"
|
||||
|
||||
#include "target.h"
|
||||
|
||||
|
||||
|
||||
/* this table must line up with REGISTER_NAMES in tm-i386v.h */
|
||||
/* symbols like 'EAX' come from <sys/reg.h> */
|
||||
static int regmap[] =
|
||||
static int regmap[] =
|
||||
{
|
||||
EAX, ECX, EDX, EBX,
|
||||
UESP, EBP, ESI, EDI,
|
||||
@ -96,22 +97,22 @@ i386_register_u_addr (blockend, regnum)
|
||||
|
||||
ubase = blockend;
|
||||
/* FIXME: Should have better way to test floating point range */
|
||||
if (regnum >= FP0_REGNUM && regnum <= (FP0_REGNUM + 7))
|
||||
if (regnum >= FP0_REGNUM && regnum <= (FP0_REGNUM + 7))
|
||||
{
|
||||
#ifdef KSTKSZ /* SCO, and others? */
|
||||
#ifdef KSTKSZ /* SCO, and others? */
|
||||
ubase += 4 * (SS + 1) - KSTKSZ;
|
||||
fpstate = ubase + ((char *)&u.u_fps.u_fpstate - (char *)&u);
|
||||
fpstate = ubase + ((char *) &u.u_fps.u_fpstate - (char *) &u);
|
||||
return (fpstate + 0x1c + 10 * (regnum - FP0_REGNUM));
|
||||
#else
|
||||
fpstate = ubase + ((char *)&u.i387.st_space - (char *)&u);
|
||||
fpstate = ubase + ((char *) &u.i387.st_space - (char *) &u);
|
||||
return (fpstate + 10 * (regnum - FP0_REGNUM));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return (ubase + 4 * regmap[regnum]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
@ -134,7 +135,7 @@ static CORE_ADDR address_lookup[DR_LASTADDR - DR_FIRSTADDR + 1];
|
||||
|
||||
static int
|
||||
i386_insert_aligned_watchpoint PARAMS ((int, CORE_ADDR, CORE_ADDR, int,
|
||||
int));
|
||||
int));
|
||||
|
||||
static int
|
||||
i386_insert_nonaligned_watchpoint PARAMS ((int, CORE_ADDR, CORE_ADDR, int,
|
||||
@ -164,7 +165,7 @@ i386_insert_aligned_watchpoint (pid, waddr, addr, len, rw)
|
||||
int read_write_bits, len_bits;
|
||||
int free_debug_register;
|
||||
int register_number;
|
||||
|
||||
|
||||
/* Look for a free debug register. */
|
||||
for (i = DR_FIRSTADDR; i <= DR_LASTADDR; i++)
|
||||
{
|
||||
@ -195,7 +196,7 @@ i386_insert_aligned_watchpoint (pid, waddr, addr, len, rw)
|
||||
}
|
||||
else
|
||||
return i386_insert_nonaligned_watchpoint (pid, waddr, addr, len, rw);
|
||||
|
||||
|
||||
free_debug_register = i;
|
||||
register_number = free_debug_register - DR_FIRSTADDR;
|
||||
debug_control_mirror |=
|
||||
@ -205,7 +206,7 @@ i386_insert_aligned_watchpoint (pid, waddr, addr, len, rw)
|
||||
(1 << (DR_LOCAL_ENABLE_SHIFT + DR_ENABLE_SIZE * register_number));
|
||||
debug_control_mirror |= DR_LOCAL_SLOWDOWN;
|
||||
debug_control_mirror &= ~DR_CONTROL_RESERVED;
|
||||
|
||||
|
||||
ptrace (6, pid, offsetof (struct user, u_debugreg[DR_CONTROL]),
|
||||
debug_control_mirror);
|
||||
ptrace (6, pid, offsetof (struct user, u_debugreg[free_debug_register]),
|
||||
@ -228,7 +229,8 @@ i386_insert_nonaligned_watchpoint (pid, waddr, addr, len, rw)
|
||||
int size;
|
||||
int rv;
|
||||
|
||||
static int size_try_array[16] = {
|
||||
static int size_try_array[16] =
|
||||
{
|
||||
1, 1, 1, 1, /* trying size one */
|
||||
2, 1, 2, 1, /* trying size two */
|
||||
2, 1, 2, 1, /* trying size three */
|
||||
@ -287,7 +289,7 @@ i386_remove_watchpoint (pid, addr, len)
|
||||
|
||||
CORE_ADDR
|
||||
i386_stopped_by_watchpoint (pid)
|
||||
int pid;
|
||||
int pid;
|
||||
{
|
||||
int i;
|
||||
int status;
|
||||
@ -305,88 +307,3 @@ i386_stopped_by_watchpoint (pid)
|
||||
}
|
||||
|
||||
#endif /* TARGET_HAS_HARDWARE_WATCHPOINTS */
|
||||
|
||||
#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 <sys/user.h> */
|
||||
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_unfiltered ("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 */
|
||||
|
Loading…
Reference in New Issue
Block a user