Changeset View
Changeset View
Standalone View
Standalone View
devel/gdb/files/kgdb/sparc64fbsd-kern.c
Show All 18 Lines | |||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
*/ | */ | ||||
#include <sys/cdefs.h> | |||||
#include "defs.h" | #include "defs.h" | ||||
#include "gdbarch.h" | #include "gdbarch.h" | ||||
#include "gdbcore.h" | #include "gdbcore.h" | ||||
#include "osabi.h" | #include "osabi.h" | ||||
#include "regcache.h" | #include "regcache.h" | ||||
#include "target.h" | #include "target.h" | ||||
#include "frame-unwind.h" | #include "frame-unwind.h" | ||||
#include "solib.h" | #include "solib.h" | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | sparc64fbsd_trapframe_cache (struct frame_info *this_frame, void **this_cache) | ||||
gdb_assert (cache == *this_cache); | gdb_assert (cache == *this_cache); | ||||
fp = get_frame_register_unsigned (this_frame, SPARC_FP_REGNUM); | fp = get_frame_register_unsigned (this_frame, SPARC_FP_REGNUM); | ||||
trapframe_addr = fp + BIAS - TRAPFRAME_SIZE; | trapframe_addr = fp + BIAS - TRAPFRAME_SIZE; | ||||
sp = get_frame_register_unsigned (this_frame, SPARC_SP_REGNUM); | sp = get_frame_register_unsigned (this_frame, SPARC_SP_REGNUM); | ||||
cache->saved_regs = trad_frame_alloc_saved_regs (this_frame); | cache->saved_regs = trad_frame_alloc_saved_regs (this_frame); | ||||
cache->saved_regs[SPARC_SP_REGNUM].addr = trapframe_addr + OFF_TF_SP; | cache->saved_regs[SPARC_SP_REGNUM].set_addr (trapframe_addr + OFF_TF_SP); | ||||
#ifdef notyet | #ifdef notyet | ||||
cache->saved_regs[SPARC64_STATE_REGNUM].addr = trapframe_addr + OFF_TF_TSTATE; | cache->saved_regs[SPARC64_STATE_REGNUM].set_addr (trapframe_addr | ||||
+ OFF_TF_TSTATE); | |||||
#endif | #endif | ||||
cache->saved_regs[SPARC64_PC_REGNUM].addr = trapframe_addr + OFF_TF_TPC; | cache->saved_regs[SPARC64_PC_REGNUM].set_addr (trapframe_addr + OFF_TF_TPC); | ||||
cache->saved_regs[SPARC64_NPC_REGNUM].addr = trapframe_addr + OFF_TF_TNPC; | cache->saved_regs[SPARC64_NPC_REGNUM].set_addr (trapframe_addr + OFF_TF_TNPC); | ||||
for (regnum = SPARC_O0_REGNUM; regnum <= SPARC_O7_REGNUM; regnum++) | for (regnum = SPARC_O0_REGNUM; regnum <= SPARC_O7_REGNUM; regnum++) | ||||
cache->saved_regs[regnum].addr = | cache->saved_regs[regnum].set_addr (trapframe_addr + OFF_TF_OUT | ||||
trapframe_addr + OFF_TF_OUT + (regnum - SPARC_O0_REGNUM) * 8; | + (regnum - SPARC_O0_REGNUM) * 8); | ||||
for (regnum = SPARC_L0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++) | for (regnum = SPARC_L0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++) | ||||
cache->saved_regs[regnum].addr = | cache->saved_regs[regnum].set_addr (sp + BIAS | ||||
sp + BIAS + (regnum - SPARC_L0_REGNUM) * 8; | + (regnum - SPARC_L0_REGNUM) * 8); | ||||
return cache; | return cache; | ||||
} | } | ||||
static void | static void | ||||
sparc64fbsd_trapframe_this_id (struct frame_info *this_frame, | sparc64fbsd_trapframe_this_id (struct frame_info *this_frame, | ||||
void **this_cache, struct frame_id *this_id) | void **this_cache, struct frame_id *this_id) | ||||
{ | { | ||||
Show All 29 Lines | if (name && (strcmp(name, "tl0_intr") == 0 | ||||
|| strcmp(name, "tl1_trap") == 0)) | || strcmp(name, "tl1_trap") == 0)) | ||||
return 1; | return 1; | ||||
return 0; | return 0; | ||||
} | } | ||||
static const struct frame_unwind sparc64fbsd_trapframe_unwind = | static const struct frame_unwind sparc64fbsd_trapframe_unwind = | ||||
{ | { | ||||
"sparc64 FreeBSD kernel trap", | |||||
SIGTRAMP_FRAME, | SIGTRAMP_FRAME, | ||||
default_frame_unwind_stop_reason, | default_frame_unwind_stop_reason, | ||||
sparc64fbsd_trapframe_this_id, | sparc64fbsd_trapframe_this_id, | ||||
sparc64fbsd_trapframe_prev_register, | sparc64fbsd_trapframe_prev_register, | ||||
NULL, | NULL, | ||||
sparc64fbsd_trapframe_sniffer | sparc64fbsd_trapframe_sniffer | ||||
}; | }; | ||||
▲ Show 20 Lines • Show All 130 Lines • ▼ Show 20 Lines | sparc64fbsd_kernel_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch) | ||||
set_solib_ops(gdbarch, &kld_so_ops); | set_solib_ops(gdbarch, &kld_so_ops); | ||||
#ifdef __sparc64__ | #ifdef __sparc64__ | ||||
fbsd_vmcore_set_supply_pcb(gdbarch, sparc64fbsd_supply_pcb); | fbsd_vmcore_set_supply_pcb(gdbarch, sparc64fbsd_supply_pcb); | ||||
fbsd_vmcore_set_cpu_pcb_addr(gdbarch, kgdb_trgt_stop_pcb); | fbsd_vmcore_set_cpu_pcb_addr(gdbarch, kgdb_trgt_stop_pcb); | ||||
#endif | #endif | ||||
} | } | ||||
void _initialize_sparc64_kgdb_tdep(void); | void _initialize_sparc64_kgdb_tdep (); | ||||
void | void | ||||
_initialize_sparc64_kgdb_tdep(void) | _initialize_sparc64_kgdb_tdep () | ||||
{ | { | ||||
gdbarch_register_osabi_sniffer(bfd_arch_sparc, | gdbarch_register_osabi_sniffer(bfd_arch_sparc, | ||||
bfd_target_elf_flavour, | bfd_target_elf_flavour, | ||||
fbsd_kernel_osabi_sniffer); | fbsd_kernel_osabi_sniffer); | ||||
gdbarch_register_osabi (bfd_arch_sparc, bfd_mach_sparc_v9, | gdbarch_register_osabi (bfd_arch_sparc, bfd_mach_sparc_v9, | ||||
GDB_OSABI_FREEBSD_KERNEL, sparc64fbsd_kernel_init_abi); | GDB_OSABI_FREEBSD_KERNEL, sparc64fbsd_kernel_init_abi); | ||||
} | } | ||||