From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kevin Buettner To: gdb-patches@sources.redhat.com Subject: [PATCH] Add more AIX5/IA-64 support Date: Wed, 21 Feb 2001 19:09:00 -0000 Message-id: <1010222030900.ZM30094@ocotillo.lan> X-SW-Source: 2001-02/msg00437.html More merging of AIX/IA-64 support to the FSF repository... * ia64-aix-nat.c, ia64-aix-tdep.c, config/ia64/aix.mh, config/ia64/aix.mt, config/ia64/nm-aix.h, config/ia64/tm-aix.h, config/ia64/xm-aix.h: New files. * ia64-tdep.c (_initialize_ia64_tdep): Remove declaration. (ia64_aix_sigcontext_register_address): New declaration. (ia64_gdbarch_init): Provide for intialization of sigcontext_register_address member of struct tdep when on target is detected to be running AIX. * config/ia64/linux.mt (TDEPFILES): Add ia64-aix-tdep.o to this list. Index: ia64-aix-nat.c =================================================================== RCS file: ia64-aix-nat.c diff -N ia64-aix-nat.c --- /dev/null Tue May 5 13:32:27 1998 +++ ia64-aix-nat.c Wed Feb 21 18:47:21 2001 @@ -0,0 +1,160 @@ +/* Functions specific to running gdb native on IA-64 running AIX. + Copyright 2000, 2001 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 "inferior.h" +#include "target.h" +#include "gdbcore.h" +#include + +#include "symtab.h" +#include "bfd.h" +#include "symfile.h" +#include "objfiles.h" + +#include +#include +#include "gdb_stat.h" + +void +supply_gregset (prgregset_t *gregsetp) +{ + int regi; + + for (regi = IA64_GR0_REGNUM; regi <= IA64_GR31_REGNUM; regi++) + { + supply_register (regi, + (char *) &(gregsetp->__gpr[regi - IA64_GR0_REGNUM])); + } + + for (regi = IA64_BR0_REGNUM; regi <= IA64_BR7_REGNUM; regi++) + { + supply_register (regi, + (char *) &(gregsetp->__br[regi - IA64_BR0_REGNUM])); + } + + supply_register (IA64_PSR_REGNUM, (char *) &(gregsetp->__psr)); + supply_register (IA64_IP_REGNUM, (char *) &(gregsetp->__ip)); + supply_register (IA64_CFM_REGNUM, (char *) &(gregsetp->__ifs)); + supply_register (IA64_RSC_REGNUM, (char *) &(gregsetp->__rsc)); + supply_register (IA64_BSP_REGNUM, (char *) &(gregsetp->__bsp)); + supply_register (IA64_BSPSTORE_REGNUM, (char *) &(gregsetp->__bspstore)); + supply_register (IA64_RNAT_REGNUM, (char *) &(gregsetp->__rnat)); + supply_register (IA64_PFS_REGNUM, (char *) &(gregsetp->__pfs)); + supply_register (IA64_UNAT_REGNUM, (char *) &(gregsetp->__unat)); + supply_register (IA64_PR_REGNUM, (char *) &(gregsetp->__preds)); + supply_register (IA64_CCV_REGNUM, (char *) &(gregsetp->__ccv)); + supply_register (IA64_LC_REGNUM, (char *) &(gregsetp->__lc)); + supply_register (IA64_EC_REGNUM, (char *) &(gregsetp->__ec)); + /* FIXME: __nats */ + supply_register (IA64_FPSR_REGNUM, (char *) &(gregsetp->__fpsr)); + + /* These (for the most part) are pseudo registers and are obtained + by other means. Those that aren't are already handled by the + code above. */ + for (regi = IA64_GR32_REGNUM; regi <= IA64_GR127_REGNUM; regi++) + register_valid[regi] = 1; + for (regi = IA64_PR0_REGNUM; regi <= IA64_PR63_REGNUM; regi++) + register_valid[regi] = 1; + for (regi = IA64_VFP_REGNUM; regi <= NUM_REGS; regi++) + register_valid[regi] = 1; +} + +void +fill_gregset (prgregset_t *gregsetp, int regno) +{ + int regi; + +#define COPY_REG(_fld_,_regi_) \ + if ((regno == -1) || regno == _regi_) \ + memcpy (&(gregsetp->_fld_), ®isters[REGISTER_BYTE (_regi_)], \ + REGISTER_RAW_SIZE (_regi_)) + + for (regi = IA64_GR0_REGNUM; regi <= IA64_GR31_REGNUM; regi++) + { + COPY_REG (__gpr[regi - IA64_GR0_REGNUM], regi); + } + + for (regi = IA64_BR0_REGNUM; regi <= IA64_BR7_REGNUM; regi++) + { + COPY_REG (__br[regi - IA64_BR0_REGNUM], regi); + } + COPY_REG (__psr, IA64_PSR_REGNUM); + COPY_REG (__ip, IA64_IP_REGNUM); + COPY_REG (__ifs, IA64_CFM_REGNUM); + COPY_REG (__rsc, IA64_RSC_REGNUM); + COPY_REG (__bsp, IA64_BSP_REGNUM); + + /* Bad things happen if we don't update both bsp and bspstore at the + same time. */ + if (regno == IA64_BSP_REGNUM || regno == -1) + { + memcpy (&(gregsetp->__bspstore), + ®isters[REGISTER_BYTE (IA64_BSP_REGNUM)], + REGISTER_RAW_SIZE (IA64_BSP_REGNUM)); + memcpy (®isters[REGISTER_BYTE (IA64_BSPSTORE_REGNUM)], + ®isters[REGISTER_BYTE (IA64_BSP_REGNUM)], + REGISTER_RAW_SIZE (IA64_BSP_REGNUM)); + } + +#if 0 + /* We never actually write to bspstore, or we'd have to do the same thing + here too. */ + COPY_REG (__bspstore, IA64_BSPSTORE_REGNUM); +#endif + COPY_REG (__rnat, IA64_RNAT_REGNUM); + COPY_REG (__pfs, IA64_PFS_REGNUM); + COPY_REG (__unat, IA64_UNAT_REGNUM); + COPY_REG (__preds, IA64_PR_REGNUM); + COPY_REG (__ccv, IA64_CCV_REGNUM); + COPY_REG (__lc, IA64_LC_REGNUM); + COPY_REG (__ec, IA64_EC_REGNUM); + /* FIXME: __nats */ + COPY_REG (__fpsr, IA64_FPSR_REGNUM); +#undef COPY_REG +} + +void +supply_fpregset (prfpregset_t *fpregsetp) +{ + register int regi; + + for (regi = IA64_FR0_REGNUM; regi <= IA64_FR127_REGNUM; regi++) + supply_register (regi, + (char *) &(fpregsetp->__fpr[regi - IA64_FR0_REGNUM])); +} + +void +fill_fpregset (prfpregset_t *fpregsetp, int regno) +{ + int regi; + char *to; + char *from; + + for (regi = IA64_FR0_REGNUM; regi <= IA64_FR127_REGNUM; regi++) + { + if ((regno == -1) || (regno == regi)) + { + from = (char *) ®isters[REGISTER_BYTE (regi)]; + to = (char *) &(fpregsetp->__fpr[regi - IA64_FR0_REGNUM]); + memcpy (to, from, REGISTER_RAW_SIZE (regi)); + } + } +} Index: ia64-aix-tdep.c =================================================================== RCS file: ia64-aix-tdep.c diff -N ia64-aix-tdep.c --- /dev/null Tue May 5 13:32:27 1998 +++ ia64-aix-tdep.c Wed Feb 21 18:47:21 2001 @@ -0,0 +1,107 @@ +/* Target-dependent code for the IA-64 for GDB, the GNU debugger. + Copyright 2000, 2001 + 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" + +/* External hook for finding gate addresses on AIX. */ +void (*aix5_find_gate_addresses_hook) (CORE_ADDR *, CORE_ADDR *) = 0; + +/* Offset to sc_context member of sigcontext structure from frame of handler */ +#define IA64_AIX_SIGCONTEXT_OFFSET 64 + +/* Return a non-zero value iff PC is in a signal trampoline. On + AIX, we determine this by seeing if the pc is in a special + execute only page called the ``gate page''. The addresses in + question are determined by letting the AIX native portion of + the code determine these addresses via its own nefarious + means. */ + +int +ia64_aix_in_sigtramp (CORE_ADDR pc, char *func_name) +{ + CORE_ADDR gate_area_start, gate_area_end; + + if (aix5_find_gate_addresses_hook == 0) + return 0; + + (*aix5_find_gate_addresses_hook) (&gate_area_start, &gate_area_end); + + return (pc >= gate_area_start && pc < gate_area_end); +} + + +/* IA-64 AIX specific function which, given a frame address and + a register number, returns the address at which that register may be + found. 0 is returned for registers which aren't stored in the + sigcontext structure. */ + +CORE_ADDR +ia64_aix_sigcontext_register_address (CORE_ADDR sp, int regno) +{ + /* The hardcoded offsets that follow are actually offsets to the + corresponding members in struct __context in + /usr/include/sys/context.h (on an IA-64 AIX5 box). */ + if (IA64_GR0_REGNUM <= regno && regno <= IA64_GR31_REGNUM) + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 152 + 8 * (regno - IA64_GR0_REGNUM); + else if (IA64_BR0_REGNUM <= regno && regno <= IA64_BR7_REGNUM) + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 408 + 8 * (regno - IA64_BR0_REGNUM); + else if (IA64_FR0_REGNUM <= regno && regno <= IA64_FR127_REGNUM) + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 480 + 16 * (regno - IA64_FR0_REGNUM); + else + switch (regno) + { + case IA64_PSR_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 0; + case IA64_IP_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 8; + /* iipa is at 16. + isr is at 24. + ifa is at 32. + iim is at 40. */ + case IA64_CFM_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 48; /* ifs, actually */ + case IA64_RSC_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 56; + case IA64_BSP_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 64; + case IA64_BSPSTORE_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 72; + case IA64_RNAT_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 80; + case IA64_PFS_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 88; + case IA64_UNAT_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 96; + case IA64_PR_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 104; + case IA64_CCV_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 112; + case IA64_LC_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 120; + case IA64_EC_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 128; + /* nats is at 136; this is an address independent NaT bitmask */ + case IA64_FPSR_REGNUM : + return sp + IA64_AIX_SIGCONTEXT_OFFSET + 144; + default : + return 0; + } +} Index: ia64-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/ia64-tdep.c,v retrieving revision 1.13 diff -u -p -r1.13 ia64-tdep.c --- ia64-tdep.c 2001/02/21 05:20:35 1.13 +++ ia64-tdep.c 2001/02/22 02:47:24 @@ -76,9 +76,9 @@ typedef enum instruction_type #define BUNDLE_LEN 16 -extern void _initialize_ia64_tdep (void); - +/* FIXME: These extern declarations should go in ia64-tdep.h. */ extern CORE_ADDR ia64_linux_sigcontext_register_address (CORE_ADDR, int); +extern CORE_ADDR ia64_aix_sigcontext_register_address (CORE_ADDR, int); static gdbarch_init_ftype ia64_gdbarch_init; @@ -1970,8 +1970,16 @@ ia64_gdbarch_init (struct gdbarch_info i gdbarch = gdbarch_alloc (&info, tdep); tdep->os_ident = os_ident; + + /* Set the method of obtaining the sigcontext addresses at which + registers are saved. The method of checking to see if + native_find_global_pointer is nonzero to indicate that we're + on AIX is kind of hokey, but I can't think of a better way + to do it. */ if (os_ident == ELFOSABI_LINUX) tdep->sigcontext_register_address = ia64_linux_sigcontext_register_address; + else if (native_find_global_pointer != 0) + tdep->sigcontext_register_address = ia64_aix_sigcontext_register_address; else tdep->sigcontext_register_address = 0; Index: config/ia64/aix.mh =================================================================== RCS file: aix.mh diff -N aix.mh --- /dev/null Tue May 5 13:32:27 1998 +++ aix.mh Wed Feb 21 18:47:28 2001 @@ -0,0 +1,9 @@ +# Host: Intel IA-64 running AIX + +XM_FILE= xm-aix.h +XDEPFILES= + +NAT_FILE= nm-aix.h +NATDEPFILES= corelow.o core-regset.o solib.o solib-aix5.o fork-child.o \ + procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o \ + ia64-aix-nat.o Index: config/ia64/aix.mt =================================================================== RCS file: aix.mt diff -N aix.mt --- /dev/null Tue May 5 13:32:27 1998 +++ aix.mt Wed Feb 21 18:47:28 2001 @@ -0,0 +1,4 @@ +# Target: Intel IA-64 running AIX + +TDEPFILES= ia64-tdep.o ia64-linux-tdep.o ia64-aix-tdep.o +TM_FILE= tm-aix.h Index: config/ia64/linux.mt =================================================================== RCS file: /cvs/src/src/gdb/config/ia64/linux.mt,v retrieving revision 1.3 diff -u -p -r1.3 linux.mt --- linux.mt 2000/10/30 22:33:32 1.3 +++ linux.mt 2001/02/22 02:47:28 @@ -1,5 +1,5 @@ # Target: Intel IA-64 running GNU/Linux -TDEPFILES= ia64-tdep.o ia64-linux-tdep.o solib.o solib-svr4.o +TDEPFILES= ia64-tdep.o ia64-aix-tdep.o ia64-linux-tdep.o solib.o solib-svr4.o TM_FILE= tm-linux.h GDBSERVER_DEPFILES= low-linux.o Index: config/ia64/nm-aix.h =================================================================== RCS file: nm-aix.h diff -N nm-aix.h --- /dev/null Tue May 5 13:32:27 1998 +++ nm-aix.h Wed Feb 21 18:47:28 2001 @@ -0,0 +1,34 @@ +/* Native support for AIX, for GDB, the GNU debugger. + Copyright (C) 2000, 2001 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. */ + +#ifndef NM_AIX_H +#define NM_AIX_H + +#include "nm-sysv4.h" + +#ifndef MONTEREY +#define MONTEREY 1 +#endif + +/* Type of the operation code for sending control messages to the + /proc/PID/ctl file */ +#define PROC_CTL_WORD_TYPE int + +#endif /* #ifndef NM_AIX_H */ Index: config/ia64/tm-aix.h =================================================================== RCS file: tm-aix.h diff -N tm-aix.h --- /dev/null Tue May 5 13:32:27 1998 +++ tm-aix.h Wed Feb 21 18:47:28 2001 @@ -0,0 +1,32 @@ +/* Definitions to target GDB to GNU/Linux on IA-64 running AIX. + Copyright (C) 2000, 2001 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. */ + +#ifndef TM_AIX_H +#define TM_AIX_H + +#include "ia64/tm-ia64.h" +#include "tm-sysv4.h" + +#define TARGET_ELF64 + +extern int ia64_aix_in_sigtramp (CORE_ADDR pc, char *func_name); +#define IN_SIGTRAMP(pc,func_name) ia64_aix_in_sigtramp (pc, func_name) + +#endif /* #ifndef TM_AIX_H */ Index: config/ia64/xm-aix.h =================================================================== RCS file: xm-aix.h diff -N xm-aix.h --- /dev/null Tue May 5 13:32:27 1998 +++ xm-aix.h Wed Feb 21 18:47:28 2001 @@ -0,0 +1,33 @@ +/* Native support for AIX, for GDB, the GNU debugger. + Copyright (C) 2000, 2001 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. */ + +#ifndef XM_AIX_H +#define XM_AIX_H + +#define HOST_BYTE_ORDER LITTLE_ENDIAN + +/* Pick up more stuff from the generic SVR4 host include file. */ + +#include "xm-sysv4.h" + +#define GDB_GREGSET_T prgregset_t +#define GDB_FPREGSET_T prfpregset_t + +#endif /* #ifndef XM_AIX_H */