15 changed files with 471 additions and 22 deletions
@ -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 |
|||
@ -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 |
|||
@ -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 */ |
|||
@ -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 */ |
|||
@ -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 */ |
|||
@ -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 <sys/procfs.h> |
|||
|
|||
#include "symtab.h" |
|||
#include "bfd.h" |
|||
#include "symfile.h" |
|||
#include "objfiles.h" |
|||
|
|||
#include <sys/types.h> |
|||
#include <fcntl.h> |
|||
#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)); |
|||
} |
|||
} |
|||
} |
|||
@ -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; |
|||
} |
|||
} |
|||
Loading…
Reference in new issue