X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fcxux-nat.c;h=e8f35a371d42d43635925aff8b9770e520dd816a;hb=7bda5e4ae2bdb120b4f4c6e7a4fa18b84f108813;hp=f693a30a0452c45cc727cd287a0b11b2ea4efa21;hpb=5b64ad42d36e6d487e1f7287d37fbc243a178e72;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/cxux-nat.c b/gdb/cxux-nat.c index f693a30a04..e8f35a371d 100644 --- a/gdb/cxux-nat.c +++ b/gdb/cxux-nat.c @@ -1,521 +1,537 @@ -/* Native support for Motorola 88k running Harris CX/UX. - Copyright 1988, 1990, 1991, 1992, 1993, 1994 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "defs.h" -#include "frame.h" -#include "inferior.h" - -#include -#include -#include -#include -#include "gdbcore.h" -#include - -#include "bfd.h" -#include "symfile.h" -#include "objfiles.h" -#include "symtab.h" - -#ifndef USER /* added to support BCS ptrace_user */ -#define USER ptrace_user -#endif -#include -#include -#include -#include "gdb_stat.h" - -#include "symtab.h" -#include "setjmp.h" -#include "value.h" - -#include - -/* CX/UX provides them already, but as word offsets instead of char offsets */ -#define SXIP_OFFSET (PT_SXIP * 4) -#define SNIP_OFFSET (PT_SNIP * 4) -#define SFIP_OFFSET (PT_SFIP * 4) -#define PSR_OFFSET (PT_PSR * sizeof(int)) -#define FPSR_OFFSET (PT_FPSR * sizeof(int)) -#define FPCR_OFFSET (PT_FPCR * sizeof(int)) - -#define XREGADDR(r) (((char *)&u.pt_x0-(char *)&u) + \ - ((r)-X0_REGNUM)*sizeof(X_REGISTER_RAW_TYPE)) - -extern int have_symbol_file_p(); - -extern jmp_buf stack_jmp; - -extern int errno; - -void -fetch_inferior_registers (regno) - int regno; /* Original value discarded */ -{ - register unsigned int regaddr; - char buf[MAX_REGISTER_RAW_SIZE]; - register int i; - - struct USER u; - unsigned int offset; - - offset = (char *) &u.pt_r0 - (char *) &u; - regaddr = offset; /* byte offset to r0;*/ - -/* offset = ptrace (3, inferior_pid, (PTRACE_ARG3_TYPE) offset, 0) - KERNEL_U_ADDR; */ - for (regno = 0; regno < PC_REGNUM; regno++) - { - /*regaddr = register_addr (regno, offset);*/ - /* 88k enhancement */ - - for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int)) - { - *(int *) &buf[i] = ptrace (3, inferior_pid, - (PTRACE_ARG3_TYPE) regaddr, 0); - regaddr += sizeof (int); - } - supply_register (regno, buf); - } - /* now load up registers 32-37; special pc registers */ - *(int *) &buf[0] = ptrace (3, inferior_pid, - (PTRACE_ARG3_TYPE) PSR_OFFSET,0); - supply_register (PSR_REGNUM, buf); - *(int *) &buf[0] = ptrace (3, inferior_pid, - (PTRACE_ARG3_TYPE) FPSR_OFFSET,0); - supply_register (FPSR_REGNUM, buf); - *(int *) &buf[0] = ptrace (3, inferior_pid, - (PTRACE_ARG3_TYPE) FPCR_OFFSET,0); - supply_register (FPCR_REGNUM, buf); - *(int *) &buf[0] = ptrace (3,inferior_pid, - (PTRACE_ARG3_TYPE) SXIP_OFFSET ,0); - supply_register (SXIP_REGNUM, buf); - *(int *) &buf[0] = ptrace (3, inferior_pid, - (PTRACE_ARG3_TYPE) SNIP_OFFSET,0); - supply_register (SNIP_REGNUM, buf); - *(int *) &buf[0] = ptrace (3, inferior_pid, - (PTRACE_ARG3_TYPE) SFIP_OFFSET,0); - supply_register (SFIP_REGNUM, buf); - - if (target_is_m88110) - { - for (regaddr = XREGADDR(X0_REGNUM), regno = X0_REGNUM; - regno < NUM_REGS; - regno++, regaddr += 16) - { - X_REGISTER_RAW_TYPE xval; - - *(int *) &xval.w1 = ptrace (3, inferior_pid, - (PTRACE_ARG3_TYPE) regaddr, 0); - *(int *) &xval.w2 = ptrace (3, inferior_pid, - (PTRACE_ARG3_TYPE) (regaddr+4), 0); - *(int *) &xval.w3 = ptrace (3, inferior_pid, - (PTRACE_ARG3_TYPE) (regaddr+8), 0); - *(int *) &xval.w4 = ptrace (3, inferior_pid, - (PTRACE_ARG3_TYPE) (regaddr+12), 0); - supply_register(regno, (void *)&xval); - } - } -} - -/* 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]; - - struct USER u; - - unsigned int offset = (char *) &u.pt_r0 - (char *) &u; - - regaddr = offset; - - /* Don't try to deal with EXIP_REGNUM or ENIP_REGNUM, because I think either - svr3 doesn't run on an 88110, or the kernel isolates the different (not - completely sure this is true, but seems to be. */ - if (regno >= 0) - { - /* regaddr = register_addr (regno, offset); */ - if (regno < PC_REGNUM) - { - regaddr = offset + regno * sizeof (int); - errno = 0; - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) regaddr, read_register (regno)); - if (errno != 0) - { - sprintf (buf, "writing register number %d", regno); - perror_with_name (buf); - } - } - else if (regno == PSR_REGNUM) - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) PSR_OFFSET, read_register(regno)); - else if (regno == FPSR_REGNUM) - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) FPSR_OFFSET, read_register(regno)); - else if (regno == FPCR_REGNUM) - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) FPCR_OFFSET, read_register(regno)); - else if (regno == SXIP_REGNUM) - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) SXIP_OFFSET, read_register(regno)); - else if (regno == SNIP_REGNUM) - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) SNIP_OFFSET, read_register(regno)); - else if (regno == SFIP_REGNUM) - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) SFIP_OFFSET, read_register(regno)); - else if (target_is_m88110 && regno < NUM_REGS) - { - X_REGISTER_RAW_TYPE xval; - - read_register_bytes(REGISTER_BYTE(regno), (char *)&xval, - sizeof(X_REGISTER_RAW_TYPE)); - regaddr = XREGADDR(regno); - ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, xval.w1); - ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr+4, xval.w2); - ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr+8, xval.w3); - ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr+12, xval.w4); - } - else - printf_unfiltered ("Bad register number for store_inferior routine\n"); - } - else - { - for (regno = 0; regno < PC_REGNUM; regno++) - { - /* regaddr = register_addr (regno, offset); */ - errno = 0; - regaddr = offset + regno * sizeof (int); - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) regaddr, read_register (regno)); - if (errno != 0) - { - sprintf (buf, "writing register number %d", regno); - perror_with_name (buf); - } - } - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) PSR_OFFSET, read_register(regno)); - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) FPSR_OFFSET,read_register(regno)); - ptrace (6, inferior_pid, - (PTRACE_ARG3_TYPE) FPCR_OFFSET,read_register(regno)); - ptrace (6,inferior_pid, - (PTRACE_ARG3_TYPE) SXIP_OFFSET,read_register(SXIP_REGNUM)); - ptrace (6,inferior_pid, - (PTRACE_ARG3_TYPE) SNIP_OFFSET,read_register(SNIP_REGNUM)); - ptrace (6,inferior_pid, - (PTRACE_ARG3_TYPE) SFIP_OFFSET,read_register(SFIP_REGNUM)); - if (target_is_m88110) - { - for (regno = X0_REGNUM; regno < NUM_REGS; regno++) - { - X_REGISTER_RAW_TYPE xval; - - read_register_bytes(REGISTER_BYTE(regno), (char *)&xval, - sizeof(X_REGISTER_RAW_TYPE)); - regaddr = XREGADDR(regno); - ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, xval.w1); - ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) (regaddr+4), xval.w2); - ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) (regaddr+8), xval.w3); - ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) (regaddr+12), xval.w4); - } - } - } -} - -/* blockend is the address of the end of the user structure */ - -m88k_register_u_addr (blockend, regnum) - int blockend, regnum; -{ - struct USER u; - int ustart = blockend - sizeof (struct USER); - - if (regnum < PSR_REGNUM) - return (ustart + ((int) &u.pt_r0 - (int) &u) + - REGISTER_SIZE * regnum); - else if (regnum == PSR_REGNUM) - return (ustart + ((int) &u.pt_psr) - (int) &u); - else if (regnum == FPSR_REGNUM) - return (ustart + ((int) &u.pt_fpsr) - (int) &u); - else if (regnum == FPCR_REGNUM) - return (ustart + ((int) &u.pt_fpcr) - (int) &u); - else if (regnum == SXIP_REGNUM) - return (ustart + SXIP_OFFSET); - else if (regnum == SNIP_REGNUM) - return (ustart + SNIP_OFFSET); - else if (regnum == SFIP_REGNUM) - return (ustart + SFIP_OFFSET); - else if (target_is_m88110) - return (ustart + ((int) &u.pt_x0 - (int) &u) + /* Must be X register */ - sizeof(u.pt_x0) * (regnum - X0_REGNUM)); - else - return (blockend + REGISTER_SIZE * regnum); -} - -#ifdef USE_PROC_FS - -#include - -/* Given a pointer to a general register set in /proc format (gregset_t *), - unpack the register contents and supply them as gdb's idea of the current - register values. */ - -void -supply_gregset (gregsetp) - gregset_t *gregsetp; -{ - register int regi; - register greg_t *regp = (greg_t *) gregsetp; - - for (regi=0; regi <= SP_REGNUM; regi++) - supply_register (regi, (char *) (regp + regi)); - - supply_register (SXIP_REGNUM, (char *) (regp + R_XIP)); - supply_register (SNIP_REGNUM, (char *) (regp + R_NIP)); - supply_register (SFIP_REGNUM, (char *) (regp + R_FIP)); - supply_register (PSR_REGNUM, (char *) (regp + R_PSR)); - supply_register (FPSR_REGNUM, (char *) (regp + R_FPSR)); - supply_register (FPCR_REGNUM, (char *) (regp + R_FPCR)); -} - -void -fill_gregset (gregsetp, regno) - gregset_t *gregsetp; - int regno; -{ - int regi; - register greg_t *regp = (greg_t *) gregsetp; - - for (regi = 0 ; regi <= R_R31 ; regi++) - if ((regno == -1) || (regno == regi)) - *(regp + regi) = *(int *) ®isters[REGISTER_BYTE(regi)]; - - if ((regno == -1) || (regno == SXIP_REGNUM)) - *(regp + R_XIP) = *(int *) ®isters[REGISTER_BYTE(SXIP_REGNUM)]; - if ((regno == -1) || (regno == SNIP_REGNUM)) - *(regp + R_NIP) = *(int *) ®isters[REGISTER_BYTE(SNIP_REGNUM)]; - if ((regno == -1) || (regno == SFIP_REGNUM)) - *(regp + R_FIP) = *(int *) ®isters[REGISTER_BYTE(SFIP_REGNUM)]; - if ((regno == -1) || (regno == PSR_REGNUM)) - *(regp + R_PSR) = *(int *) ®isters[REGISTER_BYTE(PSR_REGNUM)]; - if ((regno == -1) || (regno == FPSR_REGNUM)) - *(regp + R_FPSR) = *(int *) ®isters[REGISTER_BYTE(FPSR_REGNUM)]; - if ((regno == -1) || (regno == FPCR_REGNUM)) - *(regp + R_FPCR) = *(int *) ®isters[REGISTER_BYTE(FPCR_REGNUM)]; -} - -#endif /* USE_PROC_FS */ - -/* This support adds the equivalent of adb's % command. When - the `add-shared-symbol-files' command is given, this routine scans - the dynamic linker's link map and reads the minimal symbols - from each shared object file listed in the map. */ - -struct link_map { - unsigned long l_addr; /* address at which object is mapped */ - char *l_name; /* full name of loaded object */ - void *l_ld; /* dynamic structure of object */ - struct link_map *l_next; /* next link object */ - struct link_map *l_prev; /* previous link object */ -}; - -#define LINKS_MAP_POINTER "_ld_tail" -#define LIBC_FILE "/usr/lib/libc.so.1" -#define SHARED_OFFSET 0xf0001000 - -#ifndef PATH_MAX -#define PATH_MAX 1023 /* maximum size of path name on OS */ -#endif - -void -add_shared_symbol_files () -{ - void *desc; - struct link_map *ld_map, *lm, lms; - struct minimal_symbol *minsym; - struct objfile *objfile; - char *path_name; - - if (! inferior_pid) - { - warning ("The program has not yet been started."); - return; - } - - objfile = symbol_file_add (LIBC_FILE, 0, 0, 0, 0, 1, 0, 0); - minsym = lookup_minimal_symbol (LINKS_MAP_POINTER, objfile); - - ld_map = (struct link_map *) - read_memory_integer (((int)SYMBOL_VALUE_ADDRESS(minsym) + SHARED_OFFSET), 4); - lm = ld_map; - while (lm) - { - int local_errno = 0; - - read_memory ((CORE_ADDR)lm, (char*)&lms, sizeof (struct link_map)); - if (lms.l_name) - { - if (target_read_string ((CORE_ADDR)lms.l_name, &path_name, - PATH_MAX, &local_errno)) - { - symbol_file_add (path_name, 1, lms.l_addr, 0, 0, 0, 0, 0); - free(path_name); - } - } - /* traverse links in reverse order so that we get the - the symbols the user actually gets. */ - lm = lms.l_prev; - } - - /* Getting new symbols may change our opinion about what is - frameless. */ - reinit_frame_cache (); -} - -#if defined(_ES_MP) - -#include - -unsigned int -m88k_harris_core_register_addr (regno, reg_ptr) - int regno, reg_ptr; -{ - unsigned int word_offset; - - switch (regno) - { - case PSR_REGNUM: - word_offset = R_EPSR; - break; - case FPSR_REGNUM: - word_offset = R_FPSR; - break; - case FPCR_REGNUM: - word_offset = R_FPCR; - break; - case SXIP_REGNUM: - word_offset = R_EXIP; - break; - case SNIP_REGNUM: - word_offset = R_ENIP; - break; - case SFIP_REGNUM: - word_offset = R_EFIP; - break; - default: - if (regno <= FP_REGNUM) - word_offset = regno; - else - word_offset = ((regno - X0_REGNUM) * 4); - } - return (word_offset * 4); -} - -#endif /* _ES_MP */ - -void -_initialize_m88k_nat() -{ -#ifdef _ES_MP - /* Enable 88110 support, as we don't support the 88100 under ES/MP. */ - - target_is_m88110 = 1; -#elif defined(_CX_UX) - /* Determine whether we're running on an 88100 or an 88110. */ - target_is_m88110 = (sinfo(SYSMACHINE,0) == SYS5800); -#endif /* _CX_UX */ -} - -#ifdef _ES_MP -/* Given a pointer to a general register set in /proc format (gregset_t *), - unpack the register contents and supply them as gdb's idea of the current - register values. */ - -void -supply_gregset (gregsetp) - gregset_t *gregsetp; -{ - register int regi; - register greg_t *regp = (greg_t *) gregsetp; - - for (regi = 0 ; regi < R_R31 ; regi++) - { - supply_register (regi, (char *) (regp + regi)); - } - supply_register (PSR_REGNUM, (char *) (regp + R_EPSR)); - supply_register (FPSR_REGNUM, (char *) (regp + R_FPSR)); - supply_register (FPCR_REGNUM, (char *) (regp + R_FPCR)); - supply_register (SXIP_REGNUM, (char *) (regp + R_EXIP)); - supply_register (SNIP_REGNUM, (char *) (regp + R_ENIP)); - supply_register (SFIP_REGNUM, (char *) (regp + R_EFIP)); -} - -/* Given a pointer to a floating point register set in /proc format - (fpregset_t *), unpack the register contents and supply them as gdb's - idea of the current floating point register values. */ - -void -supply_fpregset (fpregsetp) - fpregset_t *fpregsetp; -{ - register int regi; - char *from; - - for (regi = FP0_REGNUM ; regi <= FPLAST_REGNUM ; regi++) - { - from = (char *) &((*fpregsetp)[regi-FP0_REGNUM]); - supply_register (regi, from); - } -} - -#endif /* _ES_MP */ - -#ifdef _CX_UX - -#include - -unsigned int m88k_harris_core_register_addr(int regno, int reg_ptr) -{ - unsigned int word_offset; - - switch (regno) { - case PSR_REGNUM : word_offset = R_PSR; break; - case FPSR_REGNUM : word_offset = R_FPSR; break; - case FPCR_REGNUM : word_offset = R_FPCR; break; - case SXIP_REGNUM : word_offset = R_XIP; break; - case SNIP_REGNUM : word_offset = R_NIP; break; - case SFIP_REGNUM : word_offset = R_FIP; break; - default : - if (regno <= FP_REGNUM) - word_offset = regno; - else - word_offset = ((regno - X0_REGNUM) * 4) + R_X0; - } - return (word_offset * 4); -} - -#endif /* _CX_UX */ +// OBSOLETE /* Native support for Motorola 88k running Harris CX/UX. +// OBSOLETE Copyright 1988, 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, +// OBSOLETE 2001 Free Software Foundation, Inc. +// OBSOLETE +// OBSOLETE This file is part of GDB. +// OBSOLETE +// OBSOLETE This program is free software; you can redistribute it and/or modify +// OBSOLETE it under the terms of the GNU General Public License as published by +// OBSOLETE the Free Software Foundation; either version 2 of the License, or +// OBSOLETE (at your option) any later version. +// OBSOLETE +// OBSOLETE This program is distributed in the hope that it will be useful, +// OBSOLETE but WITHOUT ANY WARRANTY; without even the implied warranty of +// OBSOLETE MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// OBSOLETE GNU General Public License for more details. +// OBSOLETE +// OBSOLETE You should have received a copy of the GNU General Public License +// OBSOLETE along with this program; if not, write to the Free Software +// OBSOLETE Foundation, Inc., 59 Temple Place - Suite 330, +// OBSOLETE Boston, MA 02111-1307, USA. */ +// OBSOLETE +// OBSOLETE #include "defs.h" +// OBSOLETE #include "frame.h" +// OBSOLETE #include "inferior.h" +// OBSOLETE +// OBSOLETE #include +// OBSOLETE #include +// OBSOLETE #include +// OBSOLETE #include +// OBSOLETE #include "gdbcore.h" +// OBSOLETE #include +// OBSOLETE +// OBSOLETE #include "bfd.h" +// OBSOLETE #include "symfile.h" +// OBSOLETE #include "objfiles.h" +// OBSOLETE #include "symtab.h" +// OBSOLETE #include "regcache.h" +// OBSOLETE +// OBSOLETE #ifndef USER /* added to support BCS ptrace_user */ +// OBSOLETE #define USER ptrace_user +// OBSOLETE #endif +// OBSOLETE #include +// OBSOLETE #include +// OBSOLETE #include +// OBSOLETE #include "gdb_stat.h" +// OBSOLETE +// OBSOLETE #include "symtab.h" +// OBSOLETE #include "setjmp.h" +// OBSOLETE #include "value.h" +// OBSOLETE +// OBSOLETE #include +// OBSOLETE +// OBSOLETE /* CX/UX provides them already, but as word offsets instead of char offsets */ +// OBSOLETE #define SXIP_OFFSET (PT_SXIP * 4) +// OBSOLETE #define SNIP_OFFSET (PT_SNIP * 4) +// OBSOLETE #define SFIP_OFFSET (PT_SFIP * 4) +// OBSOLETE #define PSR_OFFSET (PT_PSR * sizeof(int)) +// OBSOLETE #define FPSR_OFFSET (PT_FPSR * sizeof(int)) +// OBSOLETE #define FPCR_OFFSET (PT_FPCR * sizeof(int)) +// OBSOLETE +// OBSOLETE #define XREGADDR(r) (((char *)&u.pt_x0-(char *)&u) + \ +// OBSOLETE ((r)-X0_REGNUM)*sizeof(X_REGISTER_RAW_TYPE)) +// OBSOLETE +// OBSOLETE extern int have_symbol_file_p (); +// OBSOLETE +// OBSOLETE extern jmp_buf stack_jmp; +// OBSOLETE +// OBSOLETE extern int errno; +// OBSOLETE +// OBSOLETE void +// OBSOLETE fetch_inferior_registers (int regno) +// OBSOLETE { +// OBSOLETE register unsigned int regaddr; +// OBSOLETE char buf[MAX_REGISTER_RAW_SIZE]; +// OBSOLETE register int i; +// OBSOLETE +// OBSOLETE struct USER u; +// OBSOLETE unsigned int offset; +// OBSOLETE +// OBSOLETE offset = (char *) &u.pt_r0 - (char *) &u; +// OBSOLETE regaddr = offset; /* byte offset to r0; */ +// OBSOLETE +// OBSOLETE /* offset = ptrace (3, PIDGET (inferior_ptid), (PTRACE_ARG3_TYPE) offset, 0) - KERNEL_U_ADDR; */ +// OBSOLETE for (regno = 0; regno < PC_REGNUM; regno++) +// OBSOLETE { +// OBSOLETE /*regaddr = register_addr (regno, offset); */ +// OBSOLETE /* 88k enhancement */ +// OBSOLETE +// OBSOLETE for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int)) +// OBSOLETE { +// OBSOLETE *(int *) &buf[i] = ptrace (3, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) regaddr, 0); +// OBSOLETE regaddr += sizeof (int); +// OBSOLETE } +// OBSOLETE supply_register (regno, buf); +// OBSOLETE } +// OBSOLETE /* now load up registers 32-37; special pc registers */ +// OBSOLETE *(int *) &buf[0] = ptrace (3, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) PSR_OFFSET, 0); +// OBSOLETE supply_register (PSR_REGNUM, buf); +// OBSOLETE *(int *) &buf[0] = ptrace (3, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) FPSR_OFFSET, 0); +// OBSOLETE supply_register (FPSR_REGNUM, buf); +// OBSOLETE *(int *) &buf[0] = ptrace (3, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) FPCR_OFFSET, 0); +// OBSOLETE supply_register (FPCR_REGNUM, buf); +// OBSOLETE *(int *) &buf[0] = ptrace (3, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) SXIP_OFFSET, 0); +// OBSOLETE supply_register (SXIP_REGNUM, buf); +// OBSOLETE *(int *) &buf[0] = ptrace (3, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) SNIP_OFFSET, 0); +// OBSOLETE supply_register (SNIP_REGNUM, buf); +// OBSOLETE *(int *) &buf[0] = ptrace (3, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) SFIP_OFFSET, 0); +// OBSOLETE supply_register (SFIP_REGNUM, buf); +// OBSOLETE +// OBSOLETE if (target_is_m88110) +// OBSOLETE { +// OBSOLETE for (regaddr = XREGADDR (X0_REGNUM), regno = X0_REGNUM; +// OBSOLETE regno < NUM_REGS; +// OBSOLETE regno++, regaddr += 16) +// OBSOLETE { +// OBSOLETE X_REGISTER_RAW_TYPE xval; +// OBSOLETE +// OBSOLETE *(int *) &xval.w1 = ptrace (3, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) regaddr, 0); +// OBSOLETE *(int *) &xval.w2 = ptrace (3, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) (regaddr + 4), 0); +// OBSOLETE *(int *) &xval.w3 = ptrace (3, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) (regaddr + 8), 0); +// OBSOLETE *(int *) &xval.w4 = ptrace (3, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) (regaddr + 12), 0); +// OBSOLETE supply_register (regno, (void *) &xval); +// OBSOLETE } +// OBSOLETE } +// OBSOLETE } +// OBSOLETE +// OBSOLETE /* Store our register values back into the inferior. +// OBSOLETE If REGNO is -1, do this for all registers. +// OBSOLETE Otherwise, REGNO specifies which register (so we can save time). */ +// OBSOLETE +// OBSOLETE void +// OBSOLETE store_inferior_registers (int regno) +// OBSOLETE { +// OBSOLETE register unsigned int regaddr; +// OBSOLETE char buf[80]; +// OBSOLETE +// OBSOLETE struct USER u; +// OBSOLETE +// OBSOLETE unsigned int offset = (char *) &u.pt_r0 - (char *) &u; +// OBSOLETE +// OBSOLETE regaddr = offset; +// OBSOLETE +// OBSOLETE /* Don't try to deal with EXIP_REGNUM or ENIP_REGNUM, because I think either +// OBSOLETE svr3 doesn't run on an 88110, or the kernel isolates the different (not +// OBSOLETE completely sure this is true, but seems to be. */ +// OBSOLETE if (regno >= 0) +// OBSOLETE { +// OBSOLETE /* regaddr = register_addr (regno, offset); */ +// OBSOLETE if (regno < PC_REGNUM) +// OBSOLETE { +// OBSOLETE regaddr = offset + regno * sizeof (int); +// OBSOLETE errno = 0; +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) regaddr, read_register (regno)); +// OBSOLETE if (errno != 0) +// OBSOLETE { +// OBSOLETE sprintf (buf, "writing register number %d", regno); +// OBSOLETE perror_with_name (buf); +// OBSOLETE } +// OBSOLETE } +// OBSOLETE else if (regno == PSR_REGNUM) +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) PSR_OFFSET, read_register (regno)); +// OBSOLETE else if (regno == FPSR_REGNUM) +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) FPSR_OFFSET, read_register (regno)); +// OBSOLETE else if (regno == FPCR_REGNUM) +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) FPCR_OFFSET, read_register (regno)); +// OBSOLETE else if (regno == SXIP_REGNUM) +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) SXIP_OFFSET, read_register (regno)); +// OBSOLETE else if (regno == SNIP_REGNUM) +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) SNIP_OFFSET, read_register (regno)); +// OBSOLETE else if (regno == SFIP_REGNUM) +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) SFIP_OFFSET, read_register (regno)); +// OBSOLETE else if (target_is_m88110 && regno < NUM_REGS) +// OBSOLETE { +// OBSOLETE X_REGISTER_RAW_TYPE xval; +// OBSOLETE +// OBSOLETE read_register_bytes (REGISTER_BYTE (regno), (char *) &xval, +// OBSOLETE sizeof (X_REGISTER_RAW_TYPE)); +// OBSOLETE regaddr = XREGADDR (regno); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), (PTRACE_ARG3_TYPE) regaddr, xval.w1); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), (PTRACE_ARG3_TYPE) regaddr + 4, xval.w2); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), (PTRACE_ARG3_TYPE) regaddr + 8, xval.w3); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), (PTRACE_ARG3_TYPE) regaddr + 12, xval.w4); +// OBSOLETE } +// OBSOLETE else +// OBSOLETE printf_unfiltered ("Bad register number for store_inferior routine\n"); +// OBSOLETE } +// OBSOLETE else +// OBSOLETE { +// OBSOLETE for (regno = 0; regno < PC_REGNUM; regno++) +// OBSOLETE { +// OBSOLETE /* regaddr = register_addr (regno, offset); */ +// OBSOLETE errno = 0; +// OBSOLETE regaddr = offset + regno * sizeof (int); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) regaddr, read_register (regno)); +// OBSOLETE if (errno != 0) +// OBSOLETE { +// OBSOLETE sprintf (buf, "writing register number %d", regno); +// OBSOLETE perror_with_name (buf); +// OBSOLETE } +// OBSOLETE } +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) PSR_OFFSET, read_register (regno)); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) FPSR_OFFSET, read_register (regno)); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) FPCR_OFFSET, read_register (regno)); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) SXIP_OFFSET, read_register (SXIP_REGNUM)); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) SNIP_OFFSET, read_register (SNIP_REGNUM)); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), +// OBSOLETE (PTRACE_ARG3_TYPE) SFIP_OFFSET, read_register (SFIP_REGNUM)); +// OBSOLETE if (target_is_m88110) +// OBSOLETE { +// OBSOLETE for (regno = X0_REGNUM; regno < NUM_REGS; regno++) +// OBSOLETE { +// OBSOLETE X_REGISTER_RAW_TYPE xval; +// OBSOLETE +// OBSOLETE read_register_bytes (REGISTER_BYTE (regno), (char *) &xval, +// OBSOLETE sizeof (X_REGISTER_RAW_TYPE)); +// OBSOLETE regaddr = XREGADDR (regno); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), (PTRACE_ARG3_TYPE) regaddr, xval.w1); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), (PTRACE_ARG3_TYPE) (regaddr + 4), xval.w2); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), (PTRACE_ARG3_TYPE) (regaddr + 8), xval.w3); +// OBSOLETE ptrace (6, PIDGET (inferior_ptid), (PTRACE_ARG3_TYPE) (regaddr + 12), xval.w4); +// OBSOLETE } +// OBSOLETE } +// OBSOLETE } +// OBSOLETE } +// OBSOLETE +// OBSOLETE /* blockend is the address of the end of the user structure */ +// OBSOLETE +// OBSOLETE m88k_register_u_addr (int blockend, int regnum) +// OBSOLETE { +// OBSOLETE struct USER u; +// OBSOLETE int ustart = blockend - sizeof (struct USER); +// OBSOLETE +// OBSOLETE if (regnum < PSR_REGNUM) +// OBSOLETE return (ustart + ((int) &u.pt_r0 - (int) &u) + +// OBSOLETE REGISTER_SIZE * regnum); +// OBSOLETE else if (regnum == PSR_REGNUM) +// OBSOLETE return (ustart + ((int) &u.pt_psr) - (int) &u); +// OBSOLETE else if (regnum == FPSR_REGNUM) +// OBSOLETE return (ustart + ((int) &u.pt_fpsr) - (int) &u); +// OBSOLETE else if (regnum == FPCR_REGNUM) +// OBSOLETE return (ustart + ((int) &u.pt_fpcr) - (int) &u); +// OBSOLETE else if (regnum == SXIP_REGNUM) +// OBSOLETE return (ustart + SXIP_OFFSET); +// OBSOLETE else if (regnum == SNIP_REGNUM) +// OBSOLETE return (ustart + SNIP_OFFSET); +// OBSOLETE else if (regnum == SFIP_REGNUM) +// OBSOLETE return (ustart + SFIP_OFFSET); +// OBSOLETE else if (target_is_m88110) +// OBSOLETE return (ustart + ((int) &u.pt_x0 - (int) &u) + /* Must be X register */ +// OBSOLETE sizeof (u.pt_x0) * (regnum - X0_REGNUM)); +// OBSOLETE else +// OBSOLETE return (blockend + REGISTER_SIZE * regnum); +// OBSOLETE } +// OBSOLETE +// OBSOLETE #ifdef USE_PROC_FS +// OBSOLETE +// OBSOLETE #include +// OBSOLETE +// OBSOLETE /* Prototypes for supply_gregset etc. */ +// OBSOLETE #include "gregset.h" +// OBSOLETE +// OBSOLETE /* Given a pointer to a general register set in /proc format (gregset_t *), +// OBSOLETE unpack the register contents and supply them as gdb's idea of the current +// OBSOLETE register values. */ +// OBSOLETE +// OBSOLETE void +// OBSOLETE supply_gregset (gregset_t *gregsetp) +// OBSOLETE { +// OBSOLETE register int regi; +// OBSOLETE register greg_t *regp = (greg_t *) gregsetp; +// OBSOLETE +// OBSOLETE for (regi = 0; regi <= SP_REGNUM; regi++) +// OBSOLETE supply_register (regi, (char *) (regp + regi)); +// OBSOLETE +// OBSOLETE supply_register (SXIP_REGNUM, (char *) (regp + R_XIP)); +// OBSOLETE supply_register (SNIP_REGNUM, (char *) (regp + R_NIP)); +// OBSOLETE supply_register (SFIP_REGNUM, (char *) (regp + R_FIP)); +// OBSOLETE supply_register (PSR_REGNUM, (char *) (regp + R_PSR)); +// OBSOLETE supply_register (FPSR_REGNUM, (char *) (regp + R_FPSR)); +// OBSOLETE supply_register (FPCR_REGNUM, (char *) (regp + R_FPCR)); +// OBSOLETE } +// OBSOLETE +// OBSOLETE void +// OBSOLETE fill_gregset (gregset_t *gregsetp, int regno) +// OBSOLETE { +// OBSOLETE int regi; +// OBSOLETE register greg_t *regp = (greg_t *) gregsetp; +// OBSOLETE +// OBSOLETE for (regi = 0; regi <= R_R31; regi++) +// OBSOLETE if ((regno == -1) || (regno == regi)) +// OBSOLETE *(regp + regi) = *(int *) ®isters[REGISTER_BYTE (regi)]; +// OBSOLETE +// OBSOLETE if ((regno == -1) || (regno == SXIP_REGNUM)) +// OBSOLETE *(regp + R_XIP) = *(int *) ®isters[REGISTER_BYTE (SXIP_REGNUM)]; +// OBSOLETE if ((regno == -1) || (regno == SNIP_REGNUM)) +// OBSOLETE *(regp + R_NIP) = *(int *) ®isters[REGISTER_BYTE (SNIP_REGNUM)]; +// OBSOLETE if ((regno == -1) || (regno == SFIP_REGNUM)) +// OBSOLETE *(regp + R_FIP) = *(int *) ®isters[REGISTER_BYTE (SFIP_REGNUM)]; +// OBSOLETE if ((regno == -1) || (regno == PSR_REGNUM)) +// OBSOLETE *(regp + R_PSR) = *(int *) ®isters[REGISTER_BYTE (PSR_REGNUM)]; +// OBSOLETE if ((regno == -1) || (regno == FPSR_REGNUM)) +// OBSOLETE *(regp + R_FPSR) = *(int *) ®isters[REGISTER_BYTE (FPSR_REGNUM)]; +// OBSOLETE if ((regno == -1) || (regno == FPCR_REGNUM)) +// OBSOLETE *(regp + R_FPCR) = *(int *) ®isters[REGISTER_BYTE (FPCR_REGNUM)]; +// OBSOLETE } +// OBSOLETE +// OBSOLETE #endif /* USE_PROC_FS */ +// OBSOLETE +// OBSOLETE /* This support adds the equivalent of adb's % command. When +// OBSOLETE the `add-shared-symbol-files' command is given, this routine scans +// OBSOLETE the dynamic linker's link map and reads the minimal symbols +// OBSOLETE from each shared object file listed in the map. */ +// OBSOLETE +// OBSOLETE struct link_map +// OBSOLETE { +// OBSOLETE unsigned long l_addr; /* address at which object is mapped */ +// OBSOLETE char *l_name; /* full name of loaded object */ +// OBSOLETE void *l_ld; /* dynamic structure of object */ +// OBSOLETE struct link_map *l_next; /* next link object */ +// OBSOLETE struct link_map *l_prev; /* previous link object */ +// OBSOLETE }; +// OBSOLETE +// OBSOLETE #define LINKS_MAP_POINTER "_ld_tail" +// OBSOLETE #define LIBC_FILE "/usr/lib/libc.so.1" +// OBSOLETE #define SHARED_OFFSET 0xf0001000 +// OBSOLETE +// OBSOLETE #ifndef PATH_MAX +// OBSOLETE #define PATH_MAX 1023 /* maximum size of path name on OS */ +// OBSOLETE #endif +// OBSOLETE +// OBSOLETE void +// OBSOLETE add_shared_symbol_files (void) +// OBSOLETE { +// OBSOLETE void *desc; +// OBSOLETE struct link_map *ld_map, *lm, lms; +// OBSOLETE struct minimal_symbol *minsym; +// OBSOLETE struct objfile *objfile; +// OBSOLETE char *path_name; +// OBSOLETE +// OBSOLETE if (ptid_equal (inferior_ptid, null_ptid)) +// OBSOLETE { +// OBSOLETE warning ("The program has not yet been started."); +// OBSOLETE return; +// OBSOLETE } +// OBSOLETE +// OBSOLETE objfile = symbol_file_add (LIBC_FILE, 0, NULL, 0, OBJF_READNOW); +// OBSOLETE minsym = lookup_minimal_symbol (LINKS_MAP_POINTER, objfile); +// OBSOLETE +// OBSOLETE ld_map = (struct link_map *) +// OBSOLETE read_memory_integer (((int) SYMBOL_VALUE_ADDRESS (minsym) + SHARED_OFFSET), 4); +// OBSOLETE lm = ld_map; +// OBSOLETE while (lm) +// OBSOLETE { +// OBSOLETE int local_errno = 0; +// OBSOLETE +// OBSOLETE read_memory ((CORE_ADDR) lm, (char *) &lms, sizeof (struct link_map)); +// OBSOLETE if (lms.l_name) +// OBSOLETE { +// OBSOLETE if (target_read_string ((CORE_ADDR) lms.l_name, &path_name, +// OBSOLETE PATH_MAX, &local_errno)) +// OBSOLETE { +// OBSOLETE struct section_addr_info section_addrs; +// OBSOLETE memset (§ion_addrs, 0, sizeof (section_addrs)); +// OBSOLETE section_addrs.other[0].addr = lms.l_addr; +// OBSOLETE section_addrs.other[0].name = ".text"; +// OBSOLETE symbol_file_add (path_name, 1, §ion_addrs, 0, 0); +// OBSOLETE xfree (path_name); +// OBSOLETE } +// OBSOLETE } +// OBSOLETE /* traverse links in reverse order so that we get the +// OBSOLETE the symbols the user actually gets. */ +// OBSOLETE lm = lms.l_prev; +// OBSOLETE } +// OBSOLETE +// OBSOLETE /* Getting new symbols may change our opinion about what is +// OBSOLETE frameless. */ +// OBSOLETE reinit_frame_cache (); +// OBSOLETE } +// OBSOLETE +// OBSOLETE #if defined(_ES_MP) +// OBSOLETE +// OBSOLETE #include +// OBSOLETE +// OBSOLETE unsigned int +// OBSOLETE m88k_harris_core_register_addr (int regno, int reg_ptr) +// OBSOLETE { +// OBSOLETE unsigned int word_offset; +// OBSOLETE +// OBSOLETE switch (regno) +// OBSOLETE { +// OBSOLETE case PSR_REGNUM: +// OBSOLETE word_offset = R_EPSR; +// OBSOLETE break; +// OBSOLETE case FPSR_REGNUM: +// OBSOLETE word_offset = R_FPSR; +// OBSOLETE break; +// OBSOLETE case FPCR_REGNUM: +// OBSOLETE word_offset = R_FPCR; +// OBSOLETE break; +// OBSOLETE case SXIP_REGNUM: +// OBSOLETE word_offset = R_EXIP; +// OBSOLETE break; +// OBSOLETE case SNIP_REGNUM: +// OBSOLETE word_offset = R_ENIP; +// OBSOLETE break; +// OBSOLETE case SFIP_REGNUM: +// OBSOLETE word_offset = R_EFIP; +// OBSOLETE break; +// OBSOLETE default: +// OBSOLETE if (regno <= FP_REGNUM) +// OBSOLETE word_offset = regno; +// OBSOLETE else +// OBSOLETE word_offset = ((regno - X0_REGNUM) * 4); +// OBSOLETE } +// OBSOLETE return (word_offset * 4); +// OBSOLETE } +// OBSOLETE +// OBSOLETE #endif /* _ES_MP */ +// OBSOLETE +// OBSOLETE void +// OBSOLETE _initialize_m88k_nat (void) +// OBSOLETE { +// OBSOLETE #ifdef _ES_MP +// OBSOLETE /* Enable 88110 support, as we don't support the 88100 under ES/MP. */ +// OBSOLETE +// OBSOLETE target_is_m88110 = 1; +// OBSOLETE #elif defined(_CX_UX) +// OBSOLETE /* Determine whether we're running on an 88100 or an 88110. */ +// OBSOLETE target_is_m88110 = (sinfo (SYSMACHINE, 0) == SYS5800); +// OBSOLETE #endif /* _CX_UX */ +// OBSOLETE } +// OBSOLETE +// OBSOLETE #ifdef _ES_MP +// OBSOLETE /* Given a pointer to a general register set in /proc format (gregset_t *), +// OBSOLETE unpack the register contents and supply them as gdb's idea of the current +// OBSOLETE register values. */ +// OBSOLETE +// OBSOLETE void +// OBSOLETE supply_gregset (gregset_t *gregsetp) +// OBSOLETE { +// OBSOLETE register int regi; +// OBSOLETE register greg_t *regp = (greg_t *) gregsetp; +// OBSOLETE +// OBSOLETE for (regi = 0; regi < R_R31; regi++) +// OBSOLETE { +// OBSOLETE supply_register (regi, (char *) (regp + regi)); +// OBSOLETE } +// OBSOLETE supply_register (PSR_REGNUM, (char *) (regp + R_EPSR)); +// OBSOLETE supply_register (FPSR_REGNUM, (char *) (regp + R_FPSR)); +// OBSOLETE supply_register (FPCR_REGNUM, (char *) (regp + R_FPCR)); +// OBSOLETE supply_register (SXIP_REGNUM, (char *) (regp + R_EXIP)); +// OBSOLETE supply_register (SNIP_REGNUM, (char *) (regp + R_ENIP)); +// OBSOLETE supply_register (SFIP_REGNUM, (char *) (regp + R_EFIP)); +// OBSOLETE } +// OBSOLETE +// OBSOLETE /* Given a pointer to a floating point register set in /proc format +// OBSOLETE (fpregset_t *), unpack the register contents and supply them as gdb's +// OBSOLETE idea of the current floating point register values. */ +// OBSOLETE +// OBSOLETE void +// OBSOLETE supply_fpregset (fpregset_t *fpregsetp) +// OBSOLETE { +// OBSOLETE register int regi; +// OBSOLETE char *from; +// OBSOLETE +// OBSOLETE for (regi = FP0_REGNUM; regi <= FPLAST_REGNUM; regi++) +// OBSOLETE { +// OBSOLETE from = (char *) &((*fpregsetp)[regi - FP0_REGNUM]); +// OBSOLETE supply_register (regi, from); +// OBSOLETE } +// OBSOLETE } +// OBSOLETE +// OBSOLETE #endif /* _ES_MP */ +// OBSOLETE +// OBSOLETE #ifdef _CX_UX +// OBSOLETE +// OBSOLETE #include +// OBSOLETE +// OBSOLETE unsigned int +// OBSOLETE m88k_harris_core_register_addr (int regno, int reg_ptr) +// OBSOLETE { +// OBSOLETE unsigned int word_offset; +// OBSOLETE +// OBSOLETE switch (regno) +// OBSOLETE { +// OBSOLETE case PSR_REGNUM: +// OBSOLETE word_offset = R_PSR; +// OBSOLETE break; +// OBSOLETE case FPSR_REGNUM: +// OBSOLETE word_offset = R_FPSR; +// OBSOLETE break; +// OBSOLETE case FPCR_REGNUM: +// OBSOLETE word_offset = R_FPCR; +// OBSOLETE break; +// OBSOLETE case SXIP_REGNUM: +// OBSOLETE word_offset = R_XIP; +// OBSOLETE break; +// OBSOLETE case SNIP_REGNUM: +// OBSOLETE word_offset = R_NIP; +// OBSOLETE break; +// OBSOLETE case SFIP_REGNUM: +// OBSOLETE word_offset = R_FIP; +// OBSOLETE break; +// OBSOLETE default: +// OBSOLETE if (regno <= FP_REGNUM) +// OBSOLETE word_offset = regno; +// OBSOLETE else +// OBSOLETE word_offset = ((regno - X0_REGNUM) * 4) + R_X0; +// OBSOLETE } +// OBSOLETE return (word_offset * 4); +// OBSOLETE } +// OBSOLETE +// OBSOLETE #endif /* _CX_UX */