aboutsummaryrefslogtreecommitdiff
path: root/gdb/hppab-nat.c
diff options
context:
space:
mode:
authorStan Shebs <shebs@codesourcery.com>1999-04-16 01:34:07 +0000
committerStan Shebs <shebs@codesourcery.com>1999-04-16 01:34:07 +0000
commit071ea11e85eb9d529cc5eb3d35f6247466a21b99 (patch)
tree5deda65b8d7b04d1f4cbc534c3206d328e1267ec /gdb/hppab-nat.c
parent1730ec6b1848f0f32154277f788fb29f88d8475b (diff)
downloadgdb-071ea11e85eb9d529cc5eb3d35f6247466a21b99.zip
gdb-071ea11e85eb9d529cc5eb3d35f6247466a21b99.tar.gz
gdb-071ea11e85eb9d529cc5eb3d35f6247466a21b99.tar.bz2
Initial creation of sourceware repository
Diffstat (limited to 'gdb/hppab-nat.c')
-rw-r--r--gdb/hppab-nat.c215
1 files changed, 0 insertions, 215 deletions
diff --git a/gdb/hppab-nat.c b/gdb/hppab-nat.c
deleted file mode 100644
index 52ce1fd..0000000
--- a/gdb/hppab-nat.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/* Machine-dependent hooks for the unix child process stratum. This
- code is for the HP PA-RISC cpu.
-
- Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
-
- Contributed by the Center for Software Science at the
- University of Utah (pa-gdb-bugs@cs.utah.edu).
-
-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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#include "defs.h"
-#include "inferior.h"
-#include "target.h"
-#include <sys/ptrace.h>
-
-/* Use an extra level of indirection for ptrace calls.
- This lets us breakpoint usefully on call_ptrace. It also
- allows us to pass an extra argument to ptrace without
- using an ANSI-C specific macro. */
-
-#define ptrace call_ptrace
-
-#if !defined (offsetof)
-#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
-#endif
-
-/* U_REGS_OFFSET is the offset of the registers within the u area. */
-#if !defined (U_REGS_OFFSET)
-#define U_REGS_OFFSET \
- ptrace (PT_READ_U, inferior_pid, \
- (PTRACE_ARG3_TYPE) (offsetof (struct user, u_ar0)), 0) \
- - KERNEL_U_ADDR
-#endif
-
-/* Fetch one register. */
-
-static void
-fetch_register (regno)
- int regno;
-{
- register unsigned int regaddr;
- char buf[MAX_REGISTER_RAW_SIZE];
- register int i;
-
- /* Offset of registers within the u area. */
- unsigned int offset;
-
- offset = U_REGS_OFFSET;
-
- regaddr = register_addr (regno, offset);
- for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
- {
- errno = 0;
- *(int *) &buf[i] = ptrace (PT_RUREGS, inferior_pid,
- (PTRACE_ARG3_TYPE) regaddr, 0);
- regaddr += sizeof (int);
- if (errno != 0)
- {
- /* Warning, not error, in case we are attached; sometimes the
- kernel doesn't let us at the registers. */
- char *err = safe_strerror (errno);
- char *msg = alloca (strlen (err) + 128);
- sprintf (msg, "reading register %s: %s", REGISTER_NAME (regno), err);
- warning (msg);
- goto error_exit;
- }
- }
- supply_register (regno, buf);
- error_exit:;
-}
-
-/* Fetch all registers, or just one, from the child process. */
-
-void
-fetch_inferior_registers (regno)
- int regno;
-{
- if (regno == -1)
- for (regno = 0; regno < NUM_REGS; regno++)
- fetch_register (regno);
- else
- fetch_register (regno);
-}
-
-/* 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];
- extern char registers[];
- register int i;
- unsigned int offset = U_REGS_OFFSET;
- int scratch;
-
- if (regno >= 0)
- {
- if (CANNOT_STORE_REGISTER (regno))
- return;
- regaddr = register_addr (regno, offset);
- errno = 0;
- if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM)
- {
- scratch = *(int *) &registers[REGISTER_BYTE (regno)] | 0x3;
- ptrace (PT_WUREGS, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
- scratch);
- if (errno != 0)
- {
- /* Error, even if attached. Failing to write these two
- registers is pretty serious. */
- sprintf (buf, "writing register number %d", regno);
- perror_with_name (buf);
- }
- }
- else
- for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof(int))
- {
- errno = 0;
- ptrace (PT_WUREGS, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
- *(int *) &registers[REGISTER_BYTE (regno) + i]);
- if (errno != 0)
- {
- /* Warning, not error, in case we are attached; sometimes the
- kernel doesn't let us at the registers. */
- char *err = safe_strerror (errno);
- char *msg = alloca (strlen (err) + 128);
- sprintf (msg, "writing register %s: %s",
- REGISTER_NAME (regno), err);
- warning (msg);
- return;
- }
- regaddr += sizeof(int);
- }
- }
- else
- for (regno = 0; regno < NUM_REGS; regno++)
- store_inferior_registers (regno);
-}
-
-/* PT_PROT is specific to the PA BSD kernel and isn't documented
- anywhere (except here).
-
- PT_PROT allows one to enable/disable the data memory break bit
- for pages of memory in an inferior process. This bit is used
- to cause "Data memory break traps" to occur when the appropriate
- page is written to.
-
- The arguments are as follows:
-
- PT_PROT -- The ptrace action to perform.
-
- INFERIOR_PID -- The pid of the process who's page table entries
- will be modified.
-
- PT_ARGS -- The *address* of a 3 word block of memory which has
- additional information:
-
- word 0 -- The start address to watch. This should be a page-aligned
- address.
-
- word 1 -- The ending address to watch. Again, this should be a
- page aligned address.
-
- word 2 -- Nonzero to enable the data memory break bit on the
- given address range or zero to disable the data memory break
- bit on the given address range.
-
- This call may fail if the given addresses are not valid in the inferior
- process. This most often happens when restarting a program which
- as watchpoints inserted on heap or stack memory. */
-
-#define PT_PROT 21
-
-int
-hppa_set_watchpoint (addr, len, flag)
- int addr, len, flag;
-{
- int pt_args[3];
- pt_args[0] = addr;
- pt_args[1] = addr + len;
- pt_args[2] = flag;
-
- /* Mask off the lower 12 bits since we want to work on a page basis. */
- pt_args[0] >>= 12;
- pt_args[1] >>= 12;
-
- /* Rounding adjustments. */
- pt_args[1] -= pt_args[0];
- pt_args[1]++;
-
- /* Put the lower 12 bits back as zero. */
- pt_args[0] <<= 12;
- pt_args[1] <<= 12;
-
- /* Do it. */
- return ptrace (PT_PROT, inferior_pid, (PTRACE_ARG3_TYPE) pt_args, 0);
-}