2003-08-07 Michal Ludvig <mludvig@suse.cz>
[deliverable/binutils-gdb.git] / gdb / hppa-hpux-tdep.c
CommitLineData
273f8429 1/* Target-dependent code for HPUX running on PA-RISC, for GDB.
ef6e7e13
AC
2
3 Copyright 2002, 2003 Free Software Foundation, Inc.
273f8429
JB
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21#include "defs.h"
22#include "arch-utils.h"
60e1ff27 23#include "gdbcore.h"
273f8429 24#include "osabi.h"
65e82032 25#include "gdb_string.h"
222e5d1d 26#include "frame.h"
273f8429
JB
27
28/* Forward declarations. */
29extern void _initialize_hppa_hpux_tdep (void);
30extern initialize_file_ftype _initialize_hppa_hpux_tdep;
31
60e1ff27
JB
32/* FIXME: brobecker 2002-12-25. The following functions will eventually
33 become static, after the multiarching conversion is done. */
34int hppa_hpux_pc_in_sigtramp (CORE_ADDR pc, char *name);
35void hppa_hpux_frame_saved_pc_in_sigtramp (struct frame_info *fi,
36 CORE_ADDR *tmp);
37void hppa_hpux_frame_base_before_sigtramp (struct frame_info *fi,
38 CORE_ADDR *tmp);
39void hppa_hpux_frame_find_saved_regs_in_sigtramp
43bd9a9e 40 (struct frame_info *fi, CORE_ADDR *fsr);
60e1ff27
JB
41
42int
43hppa_hpux_pc_in_sigtramp (CORE_ADDR pc, char *name)
44{
45 /* Actually, for a PA running HPUX the kernel calls the signal handler
46 without an intermediate trampoline. Luckily the kernel always sets
47 the return pointer for the signal handler to point to _sigreturn. */
48 return (name && (strcmp ("_sigreturn", name) == 0));
49}
50
51/* For hppa_hpux_frame_saved_pc_in_sigtramp,
52 hppa_hpux_frame_base_before_sigtramp and
53 hppa_hpux_frame_find_saved_regs_in_sigtramp:
54
55 The signal context structure pointer is always saved at the base
56 of the frame which "calls" the signal handler. We only want to find
57 the hardware save state structure, which lives 10 32bit words into
58 sigcontext structure.
59
60 Within the hardware save state structure, registers are found in the
61 same order as the register numbers in GDB.
62
63 At one time we peeked at %r31 rather than the PC queues to determine
64 what instruction took the fault. This was done on purpose, but I don't
65 remember why. Looking at the PC queues is really the right way, and
66 I don't remember why that didn't work when this code was originally
67 written. */
68
69void
70hppa_hpux_frame_saved_pc_in_sigtramp (struct frame_info *fi, CORE_ADDR *tmp)
71{
ef6e7e13 72 *tmp = read_memory_integer (get_frame_base (fi) + (43 * 4), 4);
60e1ff27
JB
73}
74
75void
76hppa_hpux_frame_base_before_sigtramp (struct frame_info *fi,
77 CORE_ADDR *tmp)
78{
ef6e7e13 79 *tmp = read_memory_integer (get_frame_base (fi) + (40 * 4), 4);
60e1ff27
JB
80}
81
82void
83hppa_hpux_frame_find_saved_regs_in_sigtramp (struct frame_info *fi,
43bd9a9e 84 CORE_ADDR *fsr)
60e1ff27
JB
85{
86 int i;
ef6e7e13 87 const CORE_ADDR tmp = get_frame_base (fi) + (10 * 4);
60e1ff27
JB
88
89 for (i = 0; i < NUM_REGS; i++)
90 {
91 if (i == SP_REGNUM)
43bd9a9e 92 fsr[SP_REGNUM] = read_memory_integer (tmp + SP_REGNUM * 4, 4);
60e1ff27 93 else
43bd9a9e 94 fsr[i] = tmp + i * 4;
60e1ff27
JB
95 }
96}
97
7d773d96
JB
98static void
99hppa_hpux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
100{
101 set_gdbarch_pc_in_sigtramp (gdbarch, hppa_hpux_pc_in_sigtramp);
102}
60e1ff27 103
273f8429
JB
104static void
105hppa_hpux_som_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
106{
7d773d96 107 hppa_hpux_init_abi (info, gdbarch);
273f8429
JB
108}
109
110static void
111hppa_hpux_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
112{
7d773d96 113 hppa_hpux_init_abi (info, gdbarch);
273f8429
JB
114}
115
116void
117_initialize_hppa_hpux_tdep (void)
118{
05816f70 119 gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_HPUX_SOM,
273f8429 120 hppa_hpux_som_init_abi);
05816f70 121 gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_HPUX_ELF,
273f8429
JB
122 hppa_hpux_elf_init_abi);
123}
This page took 0.078063 seconds and 4 git commands to generate.