aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Gilmore <gnu@cygnus>1992-03-29 23:14:34 +0000
committerJohn Gilmore <gnu@cygnus>1992-03-29 23:14:34 +0000
commitf9e3b3ccc2cdb773011d31eae24a7474b32e3c0a (patch)
treeaea5a321a038d37dc46775cf888dd5af0b11e8d5
parent1eeba68641b9b75e2d780759c39a079d8ddda0fc (diff)
downloadgdb-f9e3b3ccc2cdb773011d31eae24a7474b32e3c0a.zip
gdb-f9e3b3ccc2cdb773011d31eae24a7474b32e3c0a.tar.gz
gdb-f9e3b3ccc2cdb773011d31eae24a7474b32e3c0a.tar.bz2
* target.c (nomemory): Now that higher levels examine errno, give EIO.
* tm-sparc.h: Don't #include <sun4/reg.h>. * sparc-tdep.c (sparc_frame_chain, frame_saved_pc): Remove dependency on <sun4/reg.h>. Start to handle cross-byte-order. * language.h: Avoid forward enum declaration. * configure.in, tm-sun4os5.h, xm-sun4os5.h, config/sun4os5.mh, config/sun4os5.mt: New host and target. * defs.h (errno): #include <errno.h> rather than assuming int. From Pierre Willard.
-rw-r--r--gdb/configure.in14
-rw-r--r--gdb/language.h4
-rw-r--r--gdb/sparc-tdep.c88
-rw-r--r--gdb/tm-sparc.h4
-rw-r--r--gdb/tm-sun4os5.h52
-rw-r--r--gdb/xm-sun4os5.h57
6 files changed, 174 insertions, 45 deletions
diff --git a/gdb/configure.in b/gdb/configure.in
index 2489602..19d03bf 100644
--- a/gdb/configure.in
+++ b/gdb/configure.in
@@ -63,9 +63,10 @@ m68000)
sparc)
case "${host_os}" in
- sunos3) gdb_host=sun4os3 ;;
- sunos4) gdb_host=sun4os4 ;;
- *) gdb_host=sun4 ;;
+ sunos3) gdb_host=sun4os3 ;;
+ sunos4) gdb_host=sun4os4 ;;
+ sunos5*|sysv4*) gdb_host=sun4os5 ;;
+ *) gdb_host=sun4 ;;
esac
;;
@@ -255,9 +256,10 @@ sparc)
case "${target_vendor}" in
sun)
case "${target_os}" in
- sunos3) gdb_target=sun4os3 ;;
- sunos4) gdb_target=sun4os4 ;;
- *) gdb_target=sun4 ;;
+ sunos3) gdb_target=sun4os3 ;;
+ sunos4) gdb_target=sun4os4 ;;
+ sunos5|sysv4*) gdb_target=sun4os5 ;;
+ *) gdb_target=sun4 ;;
esac
;;
esac
diff --git a/gdb/language.h b/gdb/language.h
index a92497a..16030a5 100644
--- a/gdb/language.h
+++ b/gdb/language.h
@@ -22,9 +22,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#if !defined (LANGUAGE_H)
#define LANGUAGE_H 1
-#ifdef __STDC__ /* Forward defs for prototypes */
+#ifdef __STDC__ /* Forward decls for prototypes */
struct value;
-enum exp_opcode;
+/* enum exp_opcode; ANSI's `wisdom' didn't include forward enum decls. */
#endif
/* This used to be included to configure GDB for one or more specific
diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c
index 12ad9c5..8e332fc 100644
--- a/gdb/sparc-tdep.c
+++ b/gdb/sparc-tdep.c
@@ -1,7 +1,5 @@
-/* Machine-dependent code which would otherwise be in inflow.c and core.c,
- for GDB, the GNU debugger.
- Copyright (C) 1986, 1987, 1989 Free Software Foundation, Inc.
- This code is for the sparc cpu.
+/* Target-dependent code for the SPARC for GDB, the GNU debugger.
+ Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc.
This file is part of GDB.
@@ -19,9 +17,7 @@ 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 <stdio.h>
#include "defs.h"
-#include "param.h"
#include "frame.h"
#include "inferior.h"
#include "obstack.h"
@@ -38,7 +34,7 @@ extern int stop_after_trap;
typedef enum
{
- Error, not_branch, bicc, bicca, ba, baa, ticc, ta,
+ Error, not_branch, bicc, bicca, ba, baa, ticc, ta
} branch_type;
/* Simulate single-step ptrace call for sun4. Code written by Gary
@@ -67,7 +63,8 @@ int one_stepped;
set up a simulated single-step, we undo our damage. */
void
-single_step ()
+single_step (pid)
+ int pid; /* ignored */
{
branch_type br, isannulled();
CORE_ADDR pc;
@@ -122,18 +119,23 @@ single_step ()
}
}
+#define FRAME_SAVED_L0 0 /* Byte offset from SP */
+#define FRAME_SAVED_I0 32 /* Byte offset from SP */
+
CORE_ADDR
sparc_frame_chain (thisframe)
FRAME thisframe;
{
CORE_ADDR retval;
int err;
- err = target_read_memory
- ((CORE_ADDR)&(((struct rwindow *)(thisframe->frame))->rw_in[6]),
- &retval,
- sizeof (CORE_ADDR));
+ CORE_ADDR addr;
+
+ addr = thisframe->frame + FRAME_SAVED_I0 +
+ REGISTER_RAW_SIZE(FP_REGNUM) * (FP_REGNUM - I0_REGNUM);
+ err = target_read_memory (addr, (char *) &retval, sizeof (CORE_ADDR));
if (err)
return 0;
+ SWAP_TARGET_AND_HOST (&retval, sizeof (retval));
return retval;
}
@@ -141,33 +143,30 @@ CORE_ADDR
sparc_extract_struct_value_address (regbuf)
char regbuf[REGISTER_BYTES];
{
- CORE_ADDR retval;
- read_memory (((int *)(regbuf))[SP_REGNUM]+(16*4),
- &retval,
- sizeof (CORE_ADDR));
- return retval;
+ /* FIXME, handle byte swapping */
+ return read_memory_integer (((int *)(regbuf))[SP_REGNUM]+(16*4),
+ sizeof (CORE_ADDR));
}
-/*
- * Find the pc saved in frame FRAME.
- */
+/* Find the pc saved in frame FRAME. */
+
CORE_ADDR
frame_saved_pc (frame)
FRAME frame;
{
CORE_ADDR prev_pc;
- /* If it's at the bottom, the return value's stored in i7/rp */
- if (get_current_frame () == frame)
- read_memory ((CORE_ADDR)&((struct rwindow *)
- (read_register (SP_REGNUM)))->rw_in[7],
- &prev_pc, sizeof (CORE_ADDR));
- else
- /* Wouldn't this always work? */
- read_memory ((CORE_ADDR)&((struct rwindow *)(frame->bottom))->rw_in[7],
- &prev_pc,
- sizeof (CORE_ADDR));
-
+ if (get_current_frame () == frame) /* FIXME, debug check. Remove >=gdb-4.6 */
+ {
+ if (read_register (SP_REGNUM) != frame->bottom) abort();
+ }
+
+ read_memory ((CORE_ADDR) (frame->bottom + FRAME_SAVED_I0 +
+ REGISTER_RAW_SIZE(I7_REGNUM) * (I7_REGNUM - I0_REGNUM)),
+ (char *) &prev_pc,
+ sizeof (CORE_ADDR));
+
+ SWAP_TARGET_AND_HOST (&prev_pc, sizeof (prev_pc));
return PC_ADJUST (prev_pc);
}
@@ -638,7 +637,30 @@ sparc_pc_adjust(pc)
This information is not currently used by GDB, since no current SPARC
implementations support extended float. */
-const struct ext_format ext_format_sparc[] = {
+const struct ext_format ext_format_sparc = {
/* tot sbyte smask expbyte manbyte */
- { 16, 0, 0x80, 0,1, 4,8 }, /* sparc */
+ 16, 0, 0x80, 0,1, 4,8, /* sparc */
};
+
+/* Figure out where the longjmp will land. We expect that we have just entered
+ longjmp and haven't yet setup the stack frame, so the args are still in the
+ output regs. %o0 (O0_REGNUM) points at the jmp_buf structure from which we
+ extract the pc (JB_PC) that we will land at. The pc is copied into ADDR.
+ This routine returns true on success */
+
+int
+get_longjmp_target(pc)
+ CORE_ADDR *pc;
+{
+ CORE_ADDR jb_addr;
+
+ jb_addr = read_register(O0_REGNUM);
+
+ if (target_read_memory(jb_addr + JB_PC * JB_ELEMENT_SIZE, (char *) pc,
+ sizeof(CORE_ADDR)))
+ return 0;
+
+ SWAP_TARGET_AND_HOST(pc, sizeof(CORE_ADDR));
+
+ return 1;
+}
diff --git a/gdb/tm-sparc.h b/gdb/tm-sparc.h
index a1ca17e..a86694c 100644
--- a/gdb/tm-sparc.h
+++ b/gdb/tm-sparc.h
@@ -295,10 +295,6 @@ sparc_extract_struct_value_address PARAMS ((char [REGISTER_BYTES]));
/* Describe the pointer in each stack frame to the previous stack frame
(its caller). */
-/* If you're not compiling this on a sun, you'll have to get a copy
- of <sun4/reg.h> (also known as <machine/reg.h>). */
-#include <sun4/reg.h>
-
/* FRAME_CHAIN takes a frame's nominal address
and produces the frame's chain-pointer. */
diff --git a/gdb/tm-sun4os5.h b/gdb/tm-sun4os5.h
new file mode 100644
index 0000000..e241bbd
--- /dev/null
+++ b/gdb/tm-sun4os5.h
@@ -0,0 +1,52 @@
+/* Macro definitions for GDB for a Sun 4 running SunOS 5.
+ Copyright (C) 1989, 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 "tm-sparc.h"
+
+#include "tm-sysv4.h"
+
+#undef STACK_END_ADDRESS
+#define STACK_END_ADDRESS 0xf8000000
+
+#if 0 /* Setjmp/longjmp are not as well doc'd in SunOS 5.x yet */
+
+/* Offsets into jmp_buf. Not defined by Sun, but at least documented in a
+ comment in <machine/setjmp.h>! */
+
+#define JB_ELEMENT_SIZE 4 /* Size of each element in jmp_buf */
+
+#define JB_ONSSTACK 0
+#define JB_SIGMASK 1
+#define JB_SP 2
+#define JB_PC 3
+#define JB_NPC 4
+#define JB_PSR 5
+#define JB_G1 6
+#define JB_O0 7
+#define JB_WBCNT 8
+
+/* Figure out where the longjmp will land. We expect that we have just entered
+ longjmp and haven't yet setup the stack frame, so the args are still in the
+ output regs. %o0 (O0_REGNUM) points at the jmp_buf structure from which we
+ extract the pc (JB_PC) that we will land at. The pc is copied into ADDR.
+ This routine returns true on success */
+
+#define GET_LONGJMP_TARGET(ADDR) get_longjmp_target(ADDR)
+
+#endif /* 0 */
diff --git a/gdb/xm-sun4os5.h b/gdb/xm-sun4os5.h
new file mode 100644
index 0000000..990c28a
--- /dev/null
+++ b/gdb/xm-sun4os5.h
@@ -0,0 +1,57 @@
+/* Macro definitions for running gdb on a Sun 4 running sunos 5.
+ Copyright 1989, 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. */
+
+/* Most of what we know is generic to SPARC hosts. */
+
+#include "xm-sparc.h"
+
+/* Pick up more stuff from the generic SVR4 host include file. */
+
+#include "xm-sysv4.h"
+
+/* SVR4's can't seem to agree on what to call the type that contains the
+ general registers. Kludge around it with a #define. */
+
+#define gregset_t prgreg_t
+#define fpregset_t prfpregset_t
+
+/* The native Sun compiler complains about using volatile
+ to indicate functions that never return. So shut it up by simply
+ defining away "NORETURN", which is normally defined to "volatile". */
+
+#ifndef __GNUC__
+# define NORETURN /**/
+#endif
+
+/* Large alloca's fail because the attempt to increase the stack limit in
+ main() fails because shared libraries are allocated just below the initial
+ stack limit. The SunOS kernel will not allow the stack to grow into
+ the area occupied by the shared libraries. Sun knows about this bug
+ but has no obvious fix for it. */
+#define BROKEN_LARGE_ALLOCA
+
+/* If you expect to use the mmalloc package to obtain mapped symbol files,
+ for now you have to specify some parameters that determine how gdb places
+ the mappings in it's address space. See the comments in map_to_address()
+ for details. This is expected to only be a short term solution. Yes it
+ is a kludge.
+ FIXME: Make this more automatic. */
+
+#define MMAP_BASE_ADDRESS 0xE0000000 /* First mapping here */
+#define MMAP_INCREMENT 0x01000000 /* Increment to next mapping */