mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 12:03:41 +08:00
* Makefile.in (ALLDEPFILES): Remove sparc-linux-nat.c and
sparcl-tdep.c. Add sparc-linux-tdep.c, sparc-sol2-nat.c, sparc-sol2-tdep.c, sparc-sol2-nat.c, sparc-sol2-tdep.c, sparc64-linux-nat.c, sparc64-linux-tdep.c, sparc64-nat.c, sparc64-sol2-tdep.c, sparc64-tdep.c, sparc64fbsd-nat.c, sparc64fbsd-tdep.c, sparcnbsd-nat.c, sparcnbsd-tdep.c. (sparc_nat_h): New variable. (sparcbsd_nat_h, sparcnbsd_tdep_h): Remove variables. (tm-sun4os4.h): Remove dependency. (sparcbsd-nat.o, sparc-linux-nat.o): Remove dependencies. (sparc64fbsd-nat.o, sparc64fbsd-tdep.o, sparc64nbsd-nat.o, sparc64-tdep.o, sparc-nat.o, sparcnbsd-nat.o, sparcnbsd-tdep.o, sparc-tdep.o): Update dependencies. (sparc-linux-tdep.o, sparc-sol2-nat.o, sparc-sol2-tdep.o, sparc64-linux-nat.o, sparc64-linux-tdep.o, sparc64-nat.o, sparc64-sol2-tdep.o, sparc64-tdep.o, sparc64nbsd-tdep.o): New dependencies. * configure.host: Remove existing sparc-*-lynxos*, sparc-*-solaris*, sparc-*-sunos4*, sparc-*-sunos5*, sparc-*-*, ultrasparc-*-freebsd, sparcv9-*-freebsd, sparc64-*-linux*, sparcv9-*-* and sparc64-*-* triplets. Add new sparc64-*-linux*, sparc-*-solaris2*, sparcv9-*-solaris2* and sparc64-*-solaris2* triplets. * configure.tgt: Remove exitsing sparc-*-aout*, sparc-*-coff*, sparc-*-elf*, sparc*-lynxos*, sparc-*-solars2*, sparc-*-sunos4*, sparc-*-sunos5*, sparc-*-vxworks*, sparc64-*linux*, sparc64-*-*, sparcv9-*-* and commented out sparc64-*-solars2* triplets. Add new sparc-*-solaris2.[0-6], sparc-*-solaris2.[0-6].*, sparc64-*-linux, sparc-*-solaris2*, sparcv9-*-solaris*, sparc64-*-solaris2* and sparc64-*-* triplets. * sparc64-tdep.c: Update copyright year. Include "inferior.h", "symtab.h" and "objfiles.h". (BIAS): Remove define. (X_OP, X_RD, X_A, X_COND, X_OP2, X_IMM22, X_OP3, X_I, X_DISP22) (X_DISP19): Remove macros. (sparc_fetch_instruction): Remove function. (struct gdbarch_tdep): Remove definition. (SPARC64_NUM_REGS, SPARC64_NUM_PSEUDO_REGS): Use ARRAY_SIZE. (sparc_breakpoint_from_pc): Remove function. (struct sparc64_frame_cache): Remove definition. (sparc64_alloc_frame_cache, sparc64_analyze_prologue, sparc64_unwind_pc): Remove functions. (sparc64_skip_prologue): Use `struct sparc_frame_cache' instead of `struct sparc64_frame_cache. Call sparc_analyze_prologue instead of sparc64_analyze_prologue. Mark constant as ULL instead of UL. (sparc64_frame_cache): Change return type to `struct sparc_frame_cache *'. Simply call sparc_frame_cache. (sparc64_frame_this_id, sparc64_frame_prev_register, sparc64_frame_base_address): Use `struct sparc_frame_cache' instead of `struct sparc64_frame_cache. (sparc_unwind_dummy_id, sparc_extract_struct_value_address, sparc_analyze_control_transfer, sparc_software_single_step, sparc64_gdbarch_init, sparc_supply_rwindow, sparc_fill_rwindow, _initialize_sparc64_tdep): Remove functions. (TSTATE_CWP, TSTATE_ICC, TSTATE_XCC): New macros. (PSR_S, PSR_ICC, PSR_VERS, PSR_IMPL, PSR_V8PLUS, PSR_XCC): New macros. (sparc64_supply_gregset, sparc64_collect_gregset, sparc64_supply_fpregset, sparc64_collect_fpregset): New functions. (sparc64_init_abi): New function. * sparc64-tdep.h: Update copyright year. Fix typo in multiple inclusion guard. Include "sparc-tdep.h". (BIAS): Define. (r_tstate_offset, r_fprs_offset): New defines. (enum sparc_regnum): Remove defenition. (enum sparc64_regnum): Reformat. (sparc_supply_rwindow, sparc_fill_rwindow): Remove prototypes. (sparc64_init_abi, sparc64_supply_gregset, sparc64_collect_gregset, sparc64_supply_fpregset, sparc64_collect_fpregset): New prototypes. (sparc64_sol2_gregset, sparc64nbsd_gregset, sparc64fbsd_gregset): Add extern declarations. (sparc64_sol2_init_abi): New prototype. (sparc64fbsd_supply_reg, sparc64fbsd_fill_reg) (sparc64fbsd_supply_fpreg, sparc64fbsd_fill_fpreg): Remove prototypes. * sparc64fbsd-nat.c: Include "sparc-nat.h", don't include "sparnbsd-nat.h". (sparc64fbsd_reg_supplies_p, sparc64fbsd_fpreg_supplies_p): Remove functions. (_initialize_sparc64fbsd_nat): Remove initialization of sparcbsd_supply_reg, sparcbsd_fill_reg, sparcbsd_supply_fpreg, sparcbsd_fill_fpreg, sparcbsd_reg_supplies_p, sparcbsd_fpreg_supplies_p. Initialize sparc_gregset. * sparc64fbsd-tdep.c: Update copyright year. Include "frame.h", "frame-unwind.h", "trad-frame.h" and "gdb_assert.h". (sparc64fbsd_r_global_offset, sparc64fbsd_r_out_offset) (sparc64fbsd_r_fprs_offset, sparc64fbsd_r_tnpc_offset) (sparc64fbsd_r_tpc_offset, sparc64fbsd_r_tstate_offset) (sparc64fbsd_r_y_offset): Remove variables. (sparc64fbsd_sizeof_struct_reg, sparc64fbsd_sizeof_struct_fpreg): Make static and const. (sparc64fbsd_supply_reg, sparc64fbsd_fill_reg) (sparc64fbsd_supply_fpreg, sparc64fbsd_fill_fpreg): Remove functions. (sparc64fbsd_gregset): New variable. (fetch_core_registers): Replace calls to sparc64fbsd_supply_reg and sparc64fbsd_supply_fpreg with calls to sparc64_supply_gregset and sparc64_supply_fpregset. (sparc64fbsd_pc_in_sigtramp, sparc64fbsd_sigtramp_frame_cache) (sparc64fbsd_sigtramp_frame_this_id) (sparc64fbsd_sigtramp_frame_prev_register): New functions. (sparc64fbsd_sigtramp_frame_unwind): New variable. (sparc64fbsd_sigtramp_frame_sniffer): New function. (sparc64fbsd_init_abi): Set pc_in_sigtramp, append sparc64fbsd_sigtramp_frame_sniffer. Call sparc64_init_abi. * sparcnbsd-tdep.c: Update copyright year. Include "floatformat.h", "frame.h", "frame-unwind.h", "symtab.h", "trad-frame.h" and "gdb_assert.h", don't include "target.h", "value.h" and "sparcnbsd-tdep.h". (REG32_OFFSET_PSR, REG32_OFFSET_PC, REG32_OFFSET_NPC) (REG32_OFFSET_Y, REG32_OFFSET_GLOBAL, REG32_OFFSET_OUT) (REG64_OFFSET_TSTATE, REG64_OFFSET_PC, REG64_OFFSET_NPC) (REG64_OFFSET_Y, REG64_OFFSET_GLOBAL, REG64_OFFSET_OUT): Remove defines. (sparcnbsd_gregset): New variable. (sparcnbsd_supply_reg32, sparcnbsd_supply_reg64) (sparcnbsd_fill_reg32, sparcnbsd_fill_reg64) (sparcnbsd_supply_fpreg32, sparcnbsd_supply_fpreg64) (sparcnbsd_fill_reg32, sparcnbsd_fill_reg64): Remove functions. (sparc32nbsd_sigtramp_start, sparc32nbsd_sigtramp_end): New variables. (sparc32nbsd_pc_in_sigtramp, sparc32nbsd_sigcontext_frame_cache) (sparc32nbsd_sigcontext_frame_this_id) (sparc32nbsd_sigcontext_frame_prev_register): New functions. (sparc32nbsd_sigcontext_frame_unwind): New variable. (sparc32nbsd_sigtramp_frame_sniffer): New function. (sparcnbsd_get_longjmp_target_32, sparcnbsd_get_longjmp_target_64): Remove functions. (sparcnbsd_aout_in_solib_call_trampoline): Rewrite. (sparcnbsd_init_abi_common, sparcnbsd_init_aout, sparcnbsd_init_elf): Remove. (sparcnbsd_init_abi, sparcnbsd_aout_init_abi) (sparcnbsd_elf_init_abi): New functions. (_initialize_sparcnbsd_tdep): New prototype. (_initialize_sparnbsd_tdep): Update. * config/sparc/fbsd.mh (NATDEPFILES): Remove sparcbsd-nat.o and corelow.o. Add sparc64-nat.o and sparc-nat.o. * config/sparc/fbsd.mt (TDEPFILES): Add sparc-tdep.o and corelow.o. * config/sparc/linux.mh: Update comment. (XM_FILE, HOST_IPC): Remove variables. (NATDEPFILES): Add sparc-sol2-nat.o and core-regset.o. Remove sparc-linux-nat.o. * config/sparc/linux.mt: Update comment. (TDEPFILES): Add sparc-sol2-tdep.o and sparc-linux-tdep.o. * config/sparc/nbsd.mt: Reformat. * config/sparc/nbsd64.mh: Update comment. (NATDEPFILES): Add sparc-nat.o. * config/sparc/nbsd64.mt: Update comment. (TDEPFILES): Add sparc64-tdep.o and sparc64nbsd-tdep.o. (TM_FILE): Set to tm-nbsd.h. * config/sparc/nbsdelf.mh: Update comment. (NATDEPFILES): Add sparc-nat.o. (XM_FILE): Delete. * config/sparc/nbsdaout.mh: Update comment. (NATDEPFILES): Add sparc-nat.o (XM_FILE): Delete. * config/sparc/nm-linux.h: Update copyright year. Don't include "config/nm-svr4.h" and "solib.h". Add protection against multiple inclusion. (KERNEL_U_SIZE): Remove define. (kernel_u_size): Remove prototype. (PTRACE_ARG3_TYPE, PTRACE_XFER_TYPE): Define. * config/sparc/nm-nbsd.h: Update copyright. Don't include "regcache.h". (CHILD_PREPARE_TO_STORE): Remove define. * config/sparc/nm-nbsdaout.h: Tweak some comments. * sparc-nat.c, sparc-tdep.c, sparc-tdep.h, sparc64nbsd-nat.c, sparcnbsd-nat.c: Rewrite files. * config/sparc/tm-linux.h, config/sparc/tm-nbsd.h: Rewrite files. * sparc-linux-nat.c, sparcbsd-nat.c, sparcbsd-nat.h, sparcnbsd-tdep.h: Remove files. * config/sparc/nm-sparclynx.h, config/sparc/nm-sun4os4.h, config/sparc/nm-sun4sol2.h, config/sparc/sp64.mt, config/sparc/sp64linux.mt, config/sparc/sp64sol2.mt, config/sparc/sparc-em.mt, config/sparc/sparclynx.mh, config/sparc/sparclynx.mt, config/sparc/sun4os4.mh, config/sparc/sun4os4.mt, config/sparc/sun4sol2.mh, config/sparc/sun4sol2.mt, config/sparc/tm-sp64.h, config/sparc/tm-sp64linux.h, config/sparc/tm-sparc.h, config/sparc/tm-sparclynx.h, config/sparc/tm-spc-em.h, config/sparc/tm-sun4os4.h, config/sparc/tm-sun4sol2.h, config/sparc/tm-vxsparc.h, config/sparc/vxsparc.mt, config/sparc/xm-linux.h, config/sparc/xm-sun4sol2.h: Remove files. * sparc-linux-tdep.c, sparc-nat.h, sparc-sol2-nat.c, sparc-sol2-tdep.c, sparc64-linux-nat.c, sparc64-linux-t dep.c, sparc64-nat.c, sparc64-sol2-tdep.c, sparc64nbsd-tdep.c: New files. * config/sparc/linux64.mh, config/sparc/linux64.mt, config/sparc/nm-sol2.h, config/sparc/sol2-64.mt, config/sparc/sol2.mh, config/sparc/sol2.mt, config/sparc/sparc.mt, config/sparc/sparc64.mt, config/sparc/tm-sol2.h: New files.
This commit is contained in:
parent
06846494ce
commit
386c036baa
194
gdb/ChangeLog
194
gdb/ChangeLog
@ -1,3 +1,197 @@
|
||||
2004-01-02 Mark Kettenis <kettenis@gnu.org>
|
||||
|
||||
* Makefile.in (ALLDEPFILES): Remove sparc-linux-nat.c and
|
||||
sparcl-tdep.c. Add sparc-linux-tdep.c, sparc-sol2-nat.c,
|
||||
sparc-sol2-tdep.c, sparc-sol2-nat.c, sparc-sol2-tdep.c,
|
||||
sparc64-linux-nat.c, sparc64-linux-tdep.c, sparc64-nat.c,
|
||||
sparc64-sol2-tdep.c, sparc64-tdep.c, sparc64fbsd-nat.c,
|
||||
sparc64fbsd-tdep.c, sparcnbsd-nat.c, sparcnbsd-tdep.c.
|
||||
(sparc_nat_h): New variable.
|
||||
(sparcbsd_nat_h, sparcnbsd_tdep_h): Remove variables.
|
||||
(tm-sun4os4.h): Remove dependency.
|
||||
(sparcbsd-nat.o, sparc-linux-nat.o): Remove dependencies.
|
||||
(sparc64fbsd-nat.o, sparc64fbsd-tdep.o, sparc64nbsd-nat.o,
|
||||
sparc64-tdep.o, sparc-nat.o, sparcnbsd-nat.o, sparcnbsd-tdep.o,
|
||||
sparc-tdep.o): Update dependencies.
|
||||
(sparc-linux-tdep.o, sparc-sol2-nat.o, sparc-sol2-tdep.o,
|
||||
sparc64-linux-nat.o, sparc64-linux-tdep.o, sparc64-nat.o,
|
||||
sparc64-sol2-tdep.o, sparc64-tdep.o, sparc64nbsd-tdep.o): New
|
||||
dependencies.
|
||||
* configure.host: Remove existing sparc-*-lynxos*,
|
||||
sparc-*-solaris*, sparc-*-sunos4*, sparc-*-sunos5*, sparc-*-*,
|
||||
ultrasparc-*-freebsd, sparcv9-*-freebsd, sparc64-*-linux*,
|
||||
sparcv9-*-* and sparc64-*-* triplets. Add new sparc64-*-linux*,
|
||||
sparc-*-solaris2*, sparcv9-*-solaris2* and sparc64-*-solaris2*
|
||||
triplets.
|
||||
* configure.tgt: Remove exitsing sparc-*-aout*, sparc-*-coff*,
|
||||
sparc-*-elf*, sparc*-lynxos*, sparc-*-solars2*, sparc-*-sunos4*,
|
||||
sparc-*-sunos5*, sparc-*-vxworks*, sparc64-*linux*, sparc64-*-*,
|
||||
sparcv9-*-* and commented out sparc64-*-solars2* triplets. Add
|
||||
new sparc-*-solaris2.[0-6], sparc-*-solaris2.[0-6].*,
|
||||
sparc64-*-linux, sparc-*-solaris2*, sparcv9-*-solaris*,
|
||||
sparc64-*-solaris2* and sparc64-*-* triplets.
|
||||
* sparc64-tdep.c: Update copyright year. Include "inferior.h",
|
||||
"symtab.h" and "objfiles.h".
|
||||
(BIAS): Remove define.
|
||||
(X_OP, X_RD, X_A, X_COND, X_OP2, X_IMM22, X_OP3, X_I, X_DISP22)
|
||||
(X_DISP19): Remove macros.
|
||||
(sparc_fetch_instruction): Remove function.
|
||||
(struct gdbarch_tdep): Remove definition.
|
||||
(SPARC64_NUM_REGS, SPARC64_NUM_PSEUDO_REGS): Use ARRAY_SIZE.
|
||||
(sparc_breakpoint_from_pc): Remove function.
|
||||
(struct sparc64_frame_cache): Remove definition.
|
||||
(sparc64_alloc_frame_cache, sparc64_analyze_prologue,
|
||||
sparc64_unwind_pc): Remove functions.
|
||||
(sparc64_skip_prologue): Use `struct sparc_frame_cache' instead of
|
||||
`struct sparc64_frame_cache. Call sparc_analyze_prologue instead
|
||||
of sparc64_analyze_prologue. Mark constant as ULL instead of UL.
|
||||
(sparc64_frame_cache): Change return type to `struct
|
||||
sparc_frame_cache *'. Simply call sparc_frame_cache.
|
||||
(sparc64_frame_this_id, sparc64_frame_prev_register,
|
||||
sparc64_frame_base_address): Use `struct sparc_frame_cache'
|
||||
instead of `struct sparc64_frame_cache.
|
||||
(sparc_unwind_dummy_id, sparc_extract_struct_value_address,
|
||||
sparc_analyze_control_transfer, sparc_software_single_step,
|
||||
sparc64_gdbarch_init, sparc_supply_rwindow, sparc_fill_rwindow,
|
||||
_initialize_sparc64_tdep): Remove functions.
|
||||
(TSTATE_CWP, TSTATE_ICC, TSTATE_XCC): New macros.
|
||||
(PSR_S, PSR_ICC, PSR_VERS, PSR_IMPL, PSR_V8PLUS, PSR_XCC): New
|
||||
macros.
|
||||
(sparc64_supply_gregset, sparc64_collect_gregset,
|
||||
sparc64_supply_fpregset, sparc64_collect_fpregset): New functions.
|
||||
(sparc64_init_abi): New function.
|
||||
* sparc64-tdep.h: Update copyright year. Fix typo in multiple
|
||||
inclusion guard. Include "sparc-tdep.h".
|
||||
(BIAS): Define.
|
||||
(r_tstate_offset, r_fprs_offset): New defines.
|
||||
(enum sparc_regnum): Remove defenition.
|
||||
(enum sparc64_regnum): Reformat.
|
||||
(sparc_supply_rwindow, sparc_fill_rwindow): Remove prototypes.
|
||||
(sparc64_init_abi, sparc64_supply_gregset,
|
||||
sparc64_collect_gregset, sparc64_supply_fpregset,
|
||||
sparc64_collect_fpregset): New prototypes.
|
||||
(sparc64_sol2_gregset, sparc64nbsd_gregset, sparc64fbsd_gregset):
|
||||
Add extern declarations.
|
||||
(sparc64_sol2_init_abi): New prototype.
|
||||
(sparc64fbsd_supply_reg, sparc64fbsd_fill_reg)
|
||||
(sparc64fbsd_supply_fpreg, sparc64fbsd_fill_fpreg): Remove
|
||||
prototypes.
|
||||
* sparc64fbsd-nat.c: Include "sparc-nat.h", don't include
|
||||
"sparnbsd-nat.h".
|
||||
(sparc64fbsd_reg_supplies_p, sparc64fbsd_fpreg_supplies_p): Remove
|
||||
functions.
|
||||
(_initialize_sparc64fbsd_nat): Remove initialization of
|
||||
sparcbsd_supply_reg, sparcbsd_fill_reg, sparcbsd_supply_fpreg,
|
||||
sparcbsd_fill_fpreg, sparcbsd_reg_supplies_p,
|
||||
sparcbsd_fpreg_supplies_p. Initialize sparc_gregset.
|
||||
* sparc64fbsd-tdep.c: Update copyright year. Include "frame.h",
|
||||
"frame-unwind.h", "trad-frame.h" and "gdb_assert.h".
|
||||
(sparc64fbsd_r_global_offset, sparc64fbsd_r_out_offset)
|
||||
(sparc64fbsd_r_fprs_offset, sparc64fbsd_r_tnpc_offset)
|
||||
(sparc64fbsd_r_tpc_offset, sparc64fbsd_r_tstate_offset)
|
||||
(sparc64fbsd_r_y_offset): Remove variables.
|
||||
(sparc64fbsd_sizeof_struct_reg, sparc64fbsd_sizeof_struct_fpreg):
|
||||
Make static and const.
|
||||
(sparc64fbsd_supply_reg, sparc64fbsd_fill_reg)
|
||||
(sparc64fbsd_supply_fpreg, sparc64fbsd_fill_fpreg): Remove
|
||||
functions.
|
||||
(sparc64fbsd_gregset): New variable.
|
||||
(fetch_core_registers): Replace calls to sparc64fbsd_supply_reg
|
||||
and sparc64fbsd_supply_fpreg with calls to sparc64_supply_gregset
|
||||
and sparc64_supply_fpregset.
|
||||
(sparc64fbsd_pc_in_sigtramp, sparc64fbsd_sigtramp_frame_cache)
|
||||
(sparc64fbsd_sigtramp_frame_this_id)
|
||||
(sparc64fbsd_sigtramp_frame_prev_register): New functions.
|
||||
(sparc64fbsd_sigtramp_frame_unwind): New variable.
|
||||
(sparc64fbsd_sigtramp_frame_sniffer): New function.
|
||||
(sparc64fbsd_init_abi): Set pc_in_sigtramp, append
|
||||
sparc64fbsd_sigtramp_frame_sniffer. Call sparc64_init_abi.
|
||||
* sparcnbsd-tdep.c: Update copyright year. Include
|
||||
"floatformat.h", "frame.h", "frame-unwind.h", "symtab.h",
|
||||
"trad-frame.h" and "gdb_assert.h", don't include "target.h",
|
||||
"value.h" and "sparcnbsd-tdep.h".
|
||||
(REG32_OFFSET_PSR, REG32_OFFSET_PC, REG32_OFFSET_NPC)
|
||||
(REG32_OFFSET_Y, REG32_OFFSET_GLOBAL, REG32_OFFSET_OUT)
|
||||
(REG64_OFFSET_TSTATE, REG64_OFFSET_PC, REG64_OFFSET_NPC)
|
||||
(REG64_OFFSET_Y, REG64_OFFSET_GLOBAL, REG64_OFFSET_OUT): Remove
|
||||
defines.
|
||||
(sparcnbsd_gregset): New variable.
|
||||
(sparcnbsd_supply_reg32, sparcnbsd_supply_reg64)
|
||||
(sparcnbsd_fill_reg32, sparcnbsd_fill_reg64)
|
||||
(sparcnbsd_supply_fpreg32, sparcnbsd_supply_fpreg64)
|
||||
(sparcnbsd_fill_reg32, sparcnbsd_fill_reg64): Remove functions.
|
||||
(sparc32nbsd_sigtramp_start, sparc32nbsd_sigtramp_end): New
|
||||
variables.
|
||||
(sparc32nbsd_pc_in_sigtramp, sparc32nbsd_sigcontext_frame_cache)
|
||||
(sparc32nbsd_sigcontext_frame_this_id)
|
||||
(sparc32nbsd_sigcontext_frame_prev_register): New functions.
|
||||
(sparc32nbsd_sigcontext_frame_unwind): New variable.
|
||||
(sparc32nbsd_sigtramp_frame_sniffer): New function.
|
||||
(sparcnbsd_get_longjmp_target_32,
|
||||
sparcnbsd_get_longjmp_target_64): Remove functions.
|
||||
(sparcnbsd_aout_in_solib_call_trampoline): Rewrite.
|
||||
(sparcnbsd_init_abi_common, sparcnbsd_init_aout,
|
||||
sparcnbsd_init_elf): Remove.
|
||||
(sparcnbsd_init_abi, sparcnbsd_aout_init_abi)
|
||||
(sparcnbsd_elf_init_abi): New functions.
|
||||
(_initialize_sparcnbsd_tdep): New prototype.
|
||||
(_initialize_sparnbsd_tdep): Update.
|
||||
* config/sparc/fbsd.mh (NATDEPFILES): Remove sparcbsd-nat.o and
|
||||
corelow.o. Add sparc64-nat.o and sparc-nat.o.
|
||||
* config/sparc/fbsd.mt (TDEPFILES): Add sparc-tdep.o and corelow.o.
|
||||
* config/sparc/linux.mh: Update comment.
|
||||
(XM_FILE, HOST_IPC): Remove variables.
|
||||
(NATDEPFILES): Add sparc-sol2-nat.o and core-regset.o. Remove
|
||||
sparc-linux-nat.o.
|
||||
* config/sparc/linux.mt: Update comment.
|
||||
(TDEPFILES): Add sparc-sol2-tdep.o and sparc-linux-tdep.o.
|
||||
* config/sparc/nbsd.mt: Reformat.
|
||||
* config/sparc/nbsd64.mh: Update comment.
|
||||
(NATDEPFILES): Add sparc-nat.o.
|
||||
* config/sparc/nbsd64.mt: Update comment.
|
||||
(TDEPFILES): Add sparc64-tdep.o and sparc64nbsd-tdep.o.
|
||||
(TM_FILE): Set to tm-nbsd.h.
|
||||
* config/sparc/nbsdelf.mh: Update comment.
|
||||
(NATDEPFILES): Add sparc-nat.o.
|
||||
(XM_FILE): Delete.
|
||||
* config/sparc/nbsdaout.mh: Update comment.
|
||||
(NATDEPFILES): Add sparc-nat.o
|
||||
(XM_FILE): Delete.
|
||||
* config/sparc/nm-linux.h: Update copyright year. Don't include
|
||||
"config/nm-svr4.h" and "solib.h". Add protection against multiple
|
||||
inclusion.
|
||||
(KERNEL_U_SIZE): Remove define.
|
||||
(kernel_u_size): Remove prototype.
|
||||
(PTRACE_ARG3_TYPE, PTRACE_XFER_TYPE): Define.
|
||||
* config/sparc/nm-nbsd.h: Update copyright. Don't include
|
||||
"regcache.h".
|
||||
(CHILD_PREPARE_TO_STORE): Remove define.
|
||||
* config/sparc/nm-nbsdaout.h: Tweak some comments.
|
||||
* sparc-nat.c, sparc-tdep.c, sparc-tdep.h, sparc64nbsd-nat.c,
|
||||
sparcnbsd-nat.c: Rewrite files.
|
||||
* config/sparc/tm-linux.h, config/sparc/tm-nbsd.h: Rewrite files.
|
||||
* sparc-linux-nat.c, sparcbsd-nat.c, sparcbsd-nat.h,
|
||||
sparcnbsd-tdep.h: Remove files.
|
||||
* config/sparc/nm-sparclynx.h, config/sparc/nm-sun4os4.h,
|
||||
config/sparc/nm-sun4sol2.h, config/sparc/sp64.mt,
|
||||
config/sparc/sp64linux.mt, config/sparc/sp64sol2.mt,
|
||||
config/sparc/sparc-em.mt, config/sparc/sparclynx.mh,
|
||||
config/sparc/sparclynx.mt, config/sparc/sun4os4.mh,
|
||||
config/sparc/sun4os4.mt, config/sparc/sun4sol2.mh,
|
||||
config/sparc/sun4sol2.mt, config/sparc/tm-sp64.h,
|
||||
config/sparc/tm-sp64linux.h, config/sparc/tm-sparc.h,
|
||||
config/sparc/tm-sparclynx.h, config/sparc/tm-spc-em.h,
|
||||
config/sparc/tm-sun4os4.h, config/sparc/tm-sun4sol2.h,
|
||||
config/sparc/tm-vxsparc.h, config/sparc/vxsparc.mt,
|
||||
config/sparc/xm-linux.h, config/sparc/xm-sun4sol2.h: Remove files.
|
||||
* sparc-linux-tdep.c, sparc-nat.h, sparc-sol2-nat.c,
|
||||
sparc-sol2-tdep.c, sparc64-linux-nat.c, sparc64-linux-t dep.c,
|
||||
sparc64-nat.c, sparc64-sol2-tdep.c, sparc64nbsd-tdep.c: New files.
|
||||
* config/sparc/linux64.mh, config/sparc/linux64.mt,
|
||||
config/sparc/nm-sol2.h, config/sparc/sol2-64.mt,
|
||||
config/sparc/sol2.mh, config/sparc/sol2.mt, config/sparc/sparc.mt,
|
||||
config/sparc/sparc64.mt, config/sparc/tm-sol2.h: New files.
|
||||
|
||||
2004-01-02 Andrew Cagney <cagney@redhat.com>
|
||||
|
||||
From 2003-12-18 Kazuhiro Inaoka:
|
||||
|
@ -755,10 +755,9 @@ solib_svr4_h = solib-svr4.h
|
||||
solist_h = solist.h
|
||||
somsolib_h = somsolib.h
|
||||
source_h = source.h
|
||||
sparc64_tdep_h = sparc64-tdep.h
|
||||
sparcbsd_nat_h = sparcbsd-nat.h
|
||||
sparcnbsd_tdep_h = sparcnbsd-tdep.h
|
||||
sparc_nat_h = sparc-nat.h
|
||||
sparc_tdep_h = sparc-tdep.h
|
||||
sparc64_tdep_h = sparc64-tdep.h
|
||||
srec_h = srec.h
|
||||
stabsread_h = stabsread.h
|
||||
stack_h = stack.h
|
||||
@ -1114,7 +1113,6 @@ gdb1$(EXEEXT): gdb$(EXEEXT)
|
||||
# dependency to do the right thing.
|
||||
tm-sun3.h tm-altos.h: tm-m68k.h
|
||||
tm-sun2.h tm-3b1.h: tm-m68k.h
|
||||
tm-sun4os4.h: tm-sparc.h
|
||||
xm-vaxult.h: xm-vax.h
|
||||
xm-vaxbsd.h: xm-vax.h
|
||||
|
||||
@ -1307,10 +1305,14 @@ ALLDEPFILES = \
|
||||
s390-tdep.c s390-nat.c \
|
||||
ser-go32.c ser-pipe.c ser-tcp.c \
|
||||
sh-tdep.c sh64-tdep.c shnbsd-tdep.c shnbsd-nat.c \
|
||||
solib.c solib-irix.c solib-svr4.c solib-sunos.c sparc-linux-nat.c \
|
||||
sparc-nat.c \
|
||||
sparc64nbsd-nat.c sparcnbsd-nat.c sparcnbsd-tdep.c \
|
||||
sparc-tdep.c sparcl-tdep.c sun3-nat.c \
|
||||
solib.c solib-irix.c solib-svr4.c solib-sunos.c \
|
||||
sparc-linux-tdep.c sparc-nat.c sparc-sol2-nat.c sparc-sol2-tdep.c \
|
||||
sparc-tdep.c sparc-sol2-nat.c sparc-sol2-tdep.c sparc64-linux-nat.c \
|
||||
sparc64-linux-tdep.c sparc64-nat.c sparc64-sol2-tdep.c \
|
||||
sparc64-tdep.c sparc64fbsd-nat.c sparc64fbsd-tdep.c \
|
||||
sparc64nbsd-nat.c sparc64nbsd-tdep.c sparcnbsd-nat.c \
|
||||
sparcnbsd-tdep.c \
|
||||
sun3-nat.c \
|
||||
symm-tdep.c symm-nat.c \
|
||||
vax-tdep.c \
|
||||
vx-share/xdr_ld.c vx-share/xdr_ptrace.c vx-share/xdr_rdb.c \
|
||||
@ -2325,32 +2327,55 @@ source.o: source.c $(defs_h) $(symtab_h) $(expression_h) $(language_h) \
|
||||
$(gdb_string_h) $(gdb_stat_h) $(gdbcore_h) $(gdb_regex_h) \
|
||||
$(symfile_h) $(objfiles_h) $(annotate_h) $(gdbtypes_h) $(linespec_h) \
|
||||
$(filenames_h) $(completer_h) $(ui_out_h)
|
||||
sparc64fbsd-nat.o: sparc64fbsd-nat.c $(defs_h) $(sparc64_tdep_h) \
|
||||
$(sparcbsd_nat_h)
|
||||
sparc64fbsd-tdep.o: sparc64fbsd-tdep.c $(defs_h) $(gdbcore_h) $(osabi_h) \
|
||||
$(regcache_h) $(target_h) $(gdb_string_h) $(sparc64_tdep_h)
|
||||
sparc64nbsd-nat.o: sparc64nbsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) \
|
||||
$(sparc_tdep_h) $(sparcnbsd_tdep_h)
|
||||
sparc-linux-tdep.o: sparc-linux-tdep.c $(defs_h) $(floatformat_h) $(frame_h) \
|
||||
$(frame_unwind_h) $(gdbarch_h) $(gdbcore_h) $(osabi_h) $(regcache_h) \
|
||||
$(solib_svr4_h) $(symtab_h) $(trad_frame_h) $(gdb_assert_h) \
|
||||
$(gdb_string_h) $(sparc_tdep_h)
|
||||
sparc-nat.o: sparc-nat.c $(defs_h) $(inferior_h) $(regcache_h) \
|
||||
$(gdb_string_h) $(gdb_wait_h) $(sparc_tdep_h) $(sparc_nat_h)
|
||||
sparc-sol2-nat.o: sparc-sol2-nat.c $(defs_h) $(regcache_h) $(gregset_h) \
|
||||
$(sparc_tdep_h) $(sparc64_tdep_h)
|
||||
sparc-sol2-tdep.o: sparc-sol2-tdep.c $(defs_h) $(frame_h) $(frame_unwind_h) \
|
||||
$(gdbcore_h) $(symtab_h) $(objfiles_h) $(osabi_h) $(regcache_h) \
|
||||
$(target_h) $(trad_frame_h) $(gdb_assert_h) $(gdb_string_h) \
|
||||
$(sparc_tdep_h)
|
||||
sparc-tdep.o: sparc-tdep.c $(defs_h) $(arch_utils_h) $(dis_asm_h) \
|
||||
$(float_format_h) $(frame_h) $(frame_base_h) $(frame_unwind_h) \
|
||||
$(gdbcore_h) $(gdbtypes_h) $(inferior_h) $(symtab_h) $(objfiles_h) \
|
||||
$(osabi_h) $(regcache_h) $(target_h) $(value_h) $(gdb_assert_h) \
|
||||
$(gdb_string_h) $(sparc_tdep_h)
|
||||
sparc64-linux-nat.o: sparc64-linux-nat.c $(defs_h) \
|
||||
$(sparc64_tdep_h) $(sparc_nat_h)
|
||||
sparc64-linux-tdep.o: sparc64-linux-tdep.c $(defs_h) $(gdbarch_h) \
|
||||
$(osabi_h) $(solib_svr4_h) $(sparc64_tdep_h)
|
||||
sparc64-nat.o: sparc-nat.c $(defs_h) $(gdbarch_h) \
|
||||
$(sparc64_tdep_h) $(sparc_nat_h)
|
||||
sparc64-sol2-tdep.o: sparc64-sol2-tdep.c $(defs_h) $(frame_h) \
|
||||
$(frame_unwind_h) $(gdbarch_h) $(symtab_h) $(objfiles_h) $(osabi_h) \
|
||||
$(trad_frame_h) $(gdb_assert_h) $(sparc64_tdep_h)
|
||||
sparc64-tdep.o: sparc64-tdep.c $(defs_h) $(arch_utils_h) $(floatformat_h) \
|
||||
$(frame_h) $(frame_base_h) $(frame_unwind_h) $(gdbcore_h) \
|
||||
$(gdbtypes_h) $(osabi_h) $(regcache_h) $(target_h) $(value_h) \
|
||||
$(gdb_assert_h) $(gdb_string_h) $(sparc64_tdep_h)
|
||||
sparcbsd-nat.o: sparcbsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) \
|
||||
$(sparc64_tdep_h) $(sparcbsd_nat_h)
|
||||
sparc-linux-nat.o: sparc-linux-nat.c $(defs_h) $(regcache_h) $(sparc_tdep_h) \
|
||||
$(gregset_h)
|
||||
sparc-nat.o: sparc-nat.c $(defs_h) $(inferior_h) $(target_h) $(gdbcore_h) \
|
||||
$(regcache_h) $(sparc_tdep_h) $(gdb_wait_h)
|
||||
sparcnbsd-nat.o: sparcnbsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) \
|
||||
$(sparc_tdep_h) $(sparcnbsd_tdep_h)
|
||||
sparcnbsd-tdep.o: sparcnbsd-tdep.c $(defs_h) $(gdbcore_h) $(regcache_h) \
|
||||
$(target_h) $(value_h) $(osabi_h) $(gdb_string_h) $(sparc_tdep_h) \
|
||||
$(sparcnbsd_tdep_h) $(nbsd_tdep_h) $(solib_svr4_h)
|
||||
$(gdbtypes_h) $(inferior_h) $(symtab_h) $(objfiles_h) $(osabi_h) \
|
||||
$(regcache_h) $(target_h) $(value_h) $(gdb_assert_h) $(gdb_string_h) \
|
||||
$(sparc64_tdep_h)
|
||||
sparc64fbsd-nat.o: sparc64fbsd-nat.c $(defs_h) $(sparc64_tdep_h) \
|
||||
$(sparc_nat_h)
|
||||
sparc64fbsd-tdep.o: sparc64fbsd-tdep.c $(defs_h) $(frame_h) \
|
||||
$(frame_unwind_h) $(gdbcore_h) $(osabi_h) $(regcache_h) $(target_h) \
|
||||
$(trad_frame_h) $(gdb_assert_h) $(gdb_string_h) $(sparc64_tdep_h)
|
||||
sparc64nbsd-nat.o: sparc64nbsd-nat.c $(defs_h) $(sparc64_tdep_h) \
|
||||
$(sparc_nat_h)
|
||||
sparc64nbsd-tdep.o: sparc64nbsd-tdep.c $(defs_h) $(frame_h) \
|
||||
$(frame_unwind_h) $(gdbcore_h) $(osabi_h) $(regcache_h) \
|
||||
$(solib_svr4_h) $(trad_frame_h) $(gdb_assert_h) $(gdb_string_h) \
|
||||
$(sparc64_tdep_h) $(nbsd_tdep_h)
|
||||
sparcnbsd-nat.o: sparcnbsd-nat.c $(defs_h) $(sparc_tdep_h) $(sparc_nat_h)
|
||||
sparcnbsd-tdep.o: sparcnbsd-tdep.c $(defs_h) $(floatformat_h) $(frame_h) \
|
||||
$(frame_unwind_h) $(gdbcore_h) $(osabi_h) $(regcache_h) \
|
||||
$(solib_svr4_h) $(symtab_h) $(trad_frame_h) $(gdb_assert_h) \
|
||||
$(gdb_string_h) $(sparc_tdep_h) $(nbsd_tdep_h)
|
||||
sparc-stub.o: sparc-stub.c
|
||||
sparc-tdep.o: sparc-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) \
|
||||
$(inferior_h) $(target_h) $(value_h) $(bfd_h) $(gdb_string_h) \
|
||||
$(regcache_h) $(osabi_h) $(dis_asm_h) $(sparc_tdep_h) $(gregset_h) \
|
||||
$(gdbcore_h) $(gdb_assert_h) $(symfile_h)
|
||||
|
||||
stabsread.o: stabsread.c $(defs_h) $(gdb_string_h) $(bfd_h) $(gdb_obstack_h) \
|
||||
$(symtab_h) $(gdbtypes_h) $(expression_h) $(symfile_h) $(objfiles_h) \
|
||||
$(aout_stab_gnu_h) $(libaout_h) $(aout_aout64_h) $(gdb_stabs_h) \
|
||||
|
@ -1,5 +1,5 @@
|
||||
# Host: FreeBSD/sparc64
|
||||
NATDEPFILES= sparc64fbsd-nat.o sparcbsd-nat.o \
|
||||
corelow.o fork-child.o infptrace.o inftarg.o \
|
||||
NATDEPFILES= sparc64fbsd-nat.o sparc64-nat.o sparc-nat.o \
|
||||
fork-child.o infptrace.o inftarg.o \
|
||||
solib.o solib-svr4.o solib-legacy.o
|
||||
NAT_FILE= nm-fbsd.h
|
||||
|
@ -1,3 +1,3 @@
|
||||
# Target: FreeBSD/sparc64
|
||||
TDEPFILES= sparc64-tdep.o sparc64fbsd-tdep.o
|
||||
TDEPFILES= sparc-tdep.o sparc64-tdep.o sparc64fbsd-tdep.o corelow.o
|
||||
TM_FILE= tm-fbsd.h
|
||||
|
@ -1,14 +1,11 @@
|
||||
# Host: Sparcstation, running GNU/Linux.
|
||||
|
||||
XM_FILE= xm-linux.h
|
||||
|
||||
# Host: GNU/Linux SPARC
|
||||
NAT_FILE= nm-linux.h
|
||||
NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o sparc-nat.o \
|
||||
proc-service.o thread-db.o lin-lwp.o sparc-linux-nat.o \
|
||||
NATDEPFILES= sparc-nat.o sparc-sol2-nat.o \
|
||||
corelow.o core-regset.o fork-child.o \
|
||||
infptrace.o inftarg.o \
|
||||
proc-service.o thread-db.o lin-lwp.o \
|
||||
linux-proc.o gcore.o linux-nat.o
|
||||
|
||||
# The dynamically loaded libthread_db needs access to symbols in the
|
||||
# gdb executable.
|
||||
LOADLIBES = -ldl -rdynamic
|
||||
|
||||
HOST_IPC=-DBSD_IPC
|
||||
|
@ -1,3 +1,4 @@
|
||||
# Target: Sparcstation, running Linux
|
||||
TDEPFILES= sparc-tdep.o solib.o solib-svr4.o solib-legacy.o
|
||||
# Target: GNU/Linux SPARC
|
||||
TDEPFILES= sparc-tdep.o sparc-sol2-tdep.o sparc-linux-tdep.o \
|
||||
solib.o solib-svr4.o solib-legacy.o
|
||||
TM_FILE= tm-linux.h
|
||||
|
11
gdb/config/sparc/linux64.mh
Normal file
11
gdb/config/sparc/linux64.mh
Normal file
@ -0,0 +1,11 @@
|
||||
# Host: GNU/Linux UltraSPARC
|
||||
NAT_FILE= nm-linux.h
|
||||
NATDEPFILES= sparc-nat.o sparc64-nat.o sparc-sol2-nat.o sparc64-linux-nat.o \
|
||||
corelow.o core-regset.o \
|
||||
fork-child.o infptrace.o inftarg.o \
|
||||
proc-service.o thread-db.o lin-lwp.o \
|
||||
linux-proc.o gcore.o linux-nat.o
|
||||
|
||||
# The dynamically loaded libthread_db needs access to symbols in the
|
||||
# gdb executable.
|
||||
LOADLIBES = -ldl -rdynamic
|
5
gdb/config/sparc/linux64.mt
Normal file
5
gdb/config/sparc/linux64.mt
Normal file
@ -0,0 +1,5 @@
|
||||
# Target: GNU/Linux UltraSPARC
|
||||
TDEPFILES= sparc64-tdep.o sparc64-sol2-tdep.o sparc64-linux-tdep.o \
|
||||
sparc-tdep.o sparc-sol2-tdep.o sparc-linux-tdep.o \
|
||||
solib.o solib-svr4.o solib-legacy.o
|
||||
TM_FILE= tm-linux.h
|
@ -1,4 +1,4 @@
|
||||
# Target: SPARC running NetBSD
|
||||
TDEPFILES= sparc-tdep.o sparcnbsd-tdep.o nbsd-tdep.o corelow.o solib.o \
|
||||
solib-svr4.o
|
||||
# Target: NetBSD/sparc
|
||||
TDEPFILES= sparc-tdep.o sparcnbsd-tdep.o nbsd-tdep.o \
|
||||
corelow.o solib.o solib-svr4.o
|
||||
TM_FILE= tm-nbsd.h
|
||||
|
@ -1,3 +1,4 @@
|
||||
# Host: UltraSPARC running NetBSD
|
||||
NATDEPFILES= fork-child.o infptrace.o inftarg.o sparc64nbsd-nat.o
|
||||
# Host: NetBSD/sparc64
|
||||
NATDEPFILES= sparc64nbsd-nat.o sparc-nat.o \
|
||||
fork-child.o infptrace.o inftarg.o
|
||||
NAT_FILE= nm-nbsd.h
|
||||
|
@ -1,4 +1,5 @@
|
||||
# Target: UltraSPARC running NetBSD
|
||||
TDEPFILES= sparc-tdep.o sparcnbsd-tdep.o nbsd-tdep.o corelow.o solib.o \
|
||||
solib-svr4.o
|
||||
TM_FILE= tm-nbsd64.h
|
||||
# Target: NetBSD/sparc64
|
||||
TDEPFILES= sparc64-tdep.o sparc64nbsd-tdep.o \
|
||||
sparc-tdep.o sparcnbsd-tdep.o nbsd-tdep.o \
|
||||
corelow.o solib.o solib-svr4.o
|
||||
TM_FILE= tm-nbsd.h
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Host: Sun 4 or Sparcstation, running NetBSD
|
||||
NATDEPFILES= fork-child.o infptrace.o inftarg.o sparcnbsd-nat.o solib-sunos.o
|
||||
XM_FILE= xm-nbsd.h
|
||||
# Host: NetBSD/sparc a.out
|
||||
NATDEPFILES= sparc-nat.o sparcnbsd-nat.o \
|
||||
fork-child.o infptrace.o inftarg.o solib-sunos.o
|
||||
NAT_FILE= nm-nbsdaout.h
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Host: Sun 4 or Sparcstation, running NetBSD
|
||||
NATDEPFILES= fork-child.o infptrace.o inftarg.o sparcnbsd-nat.o
|
||||
XM_FILE= xm-nbsd.h
|
||||
# Host: NetBSD/sparc ELF
|
||||
NATDEPFILES= sparc-nat.o sparcnbsd-nat.o \
|
||||
fork-child.o infptrace.o inftarg.o
|
||||
NAT_FILE= nm-nbsd.h
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* Macro definitions for running gdb on a Sparc running GNU/Linux.
|
||||
/* Native-dependent definitions for GNU/Linux SPARC.
|
||||
|
||||
Copyright 1989, 1992, 1996, 1998, 1999, 2000, 2002 Free Software
|
||||
Foundation, Inc.
|
||||
Copyright 1989, 1992, 1996, 1998, 1999, 2000, 2002, 2003
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -20,13 +20,18 @@
|
||||
Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "config/nm-sysv4.h"
|
||||
#include "config/nm-linux.h"
|
||||
#include "solib.h"
|
||||
#ifndef NM_LINUX_H
|
||||
#define NM_LINUX_H
|
||||
|
||||
#include "config/nm-linux.h"
|
||||
|
||||
/* Type of the third argument to the `ptrace' system call. */
|
||||
#define PTRACE_ARG3_TYPE long
|
||||
|
||||
/* Type of the fourth argument to the `ptrace' system call. */
|
||||
#define PTRACE_XFER_TYPE long
|
||||
|
||||
/* Override copies of {fetch,store}_inferior_registers in `infptrace.c'. */
|
||||
#define FETCH_INFERIOR_REGISTERS
|
||||
|
||||
/* Return sizeof user struct to callers in less machine dependent routines */
|
||||
|
||||
#define KERNEL_U_SIZE kernel_u_size()
|
||||
extern int kernel_u_size (void);
|
||||
#endif /* nm-linux.h */
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* Native-dependent definitions for Sparc running NetBSD, for GDB.
|
||||
Copyright 1986, 1987, 1989, 1992, 1994, 1996, 1999, 2000, 2002
|
||||
/* Native-dependent definitions for NetBSD/sparc.
|
||||
|
||||
Copyright 1986, 1987, 1989, 1992, 1994, 1996, 1999, 2000, 2002, 2003
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
@ -22,14 +23,7 @@
|
||||
#ifndef NM_NBSD_H
|
||||
#define NM_NBSD_H
|
||||
|
||||
#include "regcache.h"
|
||||
|
||||
/* Get generic NetBSD native definitions. */
|
||||
|
||||
/* Get generic NetBSD native definitions. */
|
||||
#include "config/nm-nbsd.h"
|
||||
|
||||
/* Before storing, we need to read all the registers. */
|
||||
|
||||
#define CHILD_PREPARE_TO_STORE() deprecated_read_register_bytes (0, NULL, DEPRECATED_REGISTER_BYTES)
|
||||
|
||||
#endif /* NM_NBSD_H */
|
||||
#endif /* nm-nbsd.h */
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* Native-dependent definitions for Sparc running NetBSD a.out, for GDB.
|
||||
Copyright 1999 Free Software Foundation, Inc.
|
||||
/* Native-dependent definitions for NetBSD/sparc a.out.
|
||||
|
||||
Copyright 1999, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -23,8 +24,7 @@
|
||||
|
||||
#include "sparc/nm-nbsd.h"
|
||||
|
||||
/* Get generic NetBSD a.out native definitions. */
|
||||
|
||||
/* Get generic NetBSD a.out native definitions. */
|
||||
#include "config/nm-nbsdaout.h"
|
||||
|
||||
#endif /* NM_NBSDAOUT_H */
|
||||
#endif /* nm-nbsdaout.h */
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* Native-dependent definitions for Sparc running SVR4.
|
||||
Copyright 1994, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
|
||||
/* Native-dependent definitions for Solaris SPARC.
|
||||
|
||||
Copyright 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -15,50 +16,43 @@
|
||||
|
||||
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. */
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include "regcache.h"
|
||||
|
||||
/* Include the generic SVR4 definitions. */
|
||||
|
||||
#include "config/nm-sysv4.h"
|
||||
|
||||
/* Before storing, we need to read all the registers. */
|
||||
|
||||
#define CHILD_PREPARE_TO_STORE() deprecated_read_register_bytes (0, NULL, DEPRECATED_REGISTER_BYTES)
|
||||
|
||||
/* Solaris PSRVADDR support does not seem to include a place for nPC. */
|
||||
|
||||
#define PRSVADDR_BROKEN
|
||||
|
||||
/* gdb wants to use the prgregset_t interface rather than
|
||||
the gregset_t interface, partly because that's what's
|
||||
used in core-sol2.c */
|
||||
#ifndef NM_SOL2_H
|
||||
#define NM_SOL2_H
|
||||
|
||||
#define GDB_GREGSET_T prgregset_t
|
||||
#define GDB_FPREGSET_T prfpregset_t
|
||||
|
||||
#ifdef NEW_PROC_API /* Solaris 6 and above can do HW watchpoints */
|
||||
/* Shared library support. */
|
||||
|
||||
#include "solib.h"
|
||||
|
||||
/* Hardware wactchpoints. */
|
||||
|
||||
/* Solaris 2.6 and above can do HW watchpoints. */
|
||||
#ifdef NEW_PROC_API
|
||||
|
||||
#define TARGET_HAS_HARDWARE_WATCHPOINTS
|
||||
|
||||
/* The man page for proc4 on solaris 6 and 7 says that the system
|
||||
/* The man page for proc(4) on Solaris 2.6 and up says that the system
|
||||
can support "thousands" of hardware watchpoints, but gives no
|
||||
method for finding out how many. So just tell GDB 'yes'. */
|
||||
#define TARGET_CAN_USE_HARDWARE_WATCHPOINT(TYPE, CNT, OT) 1
|
||||
method for finding out how many; It doesn't say anything about the
|
||||
allowed size for the watched area either. So we just tell GDB
|
||||
'yes'. */
|
||||
#define TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT(SIZE) 1
|
||||
|
||||
/* When a hardware watchpoint fires off the PC will be left at the
|
||||
instruction following the one which caused the watchpoint.
|
||||
It will *NOT* be necessary for GDB to step over the watchpoint. */
|
||||
instruction following the one which caused the watchpoint. It will
|
||||
*NOT* be necessary for GDB to step over the watchpoint. */
|
||||
#define HAVE_CONTINUABLE_WATCHPOINT 1
|
||||
|
||||
extern int procfs_stopped_by_watchpoint (ptid_t);
|
||||
#define STOPPED_BY_WATCHPOINT(W) \
|
||||
procfs_stopped_by_watchpoint(inferior_ptid)
|
||||
|
||||
/* Use these macros for watchpoint insertion/deletion. */
|
||||
/* type can be 0: write watch, 1: read watch, 2: access watch (read/write) */
|
||||
/* Use these macros for watchpoint insertion/deletion. TYPE can be 0
|
||||
(write watch), 1 (read watch), 2 (access watch (read/write). */
|
||||
|
||||
extern int procfs_set_watchpoint (ptid_t, CORE_ADDR, int, int, int);
|
||||
#define target_insert_watchpoint(ADDR, LEN, TYPE) \
|
||||
@ -67,3 +61,5 @@ extern int procfs_set_watchpoint (ptid_t, CORE_ADDR, int, int, int);
|
||||
procfs_set_watchpoint (inferior_ptid, ADDR, 0, 0, 0)
|
||||
|
||||
#endif /* NEW_PROC_API */
|
||||
|
||||
#endif /* nm-sol2.h */
|
@ -1,26 +0,0 @@
|
||||
/* Native-dependent definitions for Sparc running LynxOS.
|
||||
Copyright 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. */
|
||||
|
||||
#ifndef NM_SPARCLYNX_H
|
||||
#define NM_SPARCLYNX_H
|
||||
|
||||
#include "config/nm-lynx.h"
|
||||
|
||||
#endif /* NM_SPARCLYNX_H */
|
@ -1,42 +0,0 @@
|
||||
/* Macro definitions for running gdb on a Sun 4 running sunos 4.
|
||||
Copyright 1989, 1992, 1996, 2000 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 "regcache.h"
|
||||
|
||||
/* Do implement the attach and detach commands. */
|
||||
|
||||
#define ATTACH_DETACH
|
||||
|
||||
/* Override copies of {fetch,store}_inferior_registers in infptrace.c. */
|
||||
|
||||
#define FETCH_INFERIOR_REGISTERS
|
||||
|
||||
/* Before storing, we need to read all the registers. */
|
||||
|
||||
#define CHILD_PREPARE_TO_STORE() deprecated_read_register_bytes (0, NULL, DEPRECATED_REGISTER_BYTES)
|
||||
|
||||
/* Return sizeof user struct to callers in less machine dependent routines */
|
||||
|
||||
#define KERNEL_U_SIZE kernel_u_size()
|
||||
extern int kernel_u_size (void);
|
||||
|
||||
/* SunOS 4.x uses nonstandard "char *" as type of third argument to ptrace() */
|
||||
|
||||
#define PTRACE_ARG3_TYPE char*
|
3
gdb/config/sparc/sol2-64.mt
Normal file
3
gdb/config/sparc/sol2-64.mt
Normal file
@ -0,0 +1,3 @@
|
||||
# Target: Solaris UltraSPARC
|
||||
TDEPFILES= sparc64-tdep.o sparc64-sol2-tdep.o sparc-tdep.o sparc-sol2-tdep.o
|
||||
TM_FILE= tm-sol2.h
|
6
gdb/config/sparc/sol2.mh
Normal file
6
gdb/config/sparc/sol2.mh
Normal file
@ -0,0 +1,6 @@
|
||||
# Host: Solaris SPARC & UltraSPARC
|
||||
NAT_FILE= nm-sol2.h
|
||||
NATDEPFILES= sparc-sol2-nat.o \
|
||||
corelow.o core-regset.o fork-child.o gcore.o \
|
||||
procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o \
|
||||
solib.o solib-svr4.o solib-legacy.o
|
3
gdb/config/sparc/sol2.mt
Normal file
3
gdb/config/sparc/sol2.mt
Normal file
@ -0,0 +1,3 @@
|
||||
# Target: Solaris SPARC
|
||||
TDEPFILES= sparc-tdep.o sparc-sol2-tdep.o
|
||||
TM_FILE= tm-sol2.h
|
@ -1,6 +0,0 @@
|
||||
# Target: SPARC64
|
||||
# solib.o and procfs.o taken out for now. We don't have shared libraries yet,
|
||||
# and the elf version requires procfs.o but the a.out version doesn't.
|
||||
# Then again, having procfs.o in a target makefile fragment seems wrong.
|
||||
TDEPFILES = sparc-tdep.o
|
||||
TM_FILE= tm-sp64.h
|
@ -1,3 +0,0 @@
|
||||
# Target: UltraSPARC, running Linux 64bit programs
|
||||
TDEPFILES= sparc-tdep.o solib.o solib-svr4.o solib-legacy.o
|
||||
TM_FILE= tm-sp64linux.h
|
@ -1,3 +0,0 @@
|
||||
# Target: Ultrasparc, running Solaris 2
|
||||
TDEPFILES= sparc-tdep.o
|
||||
TM_FILE= tm-sun4sol2.h
|
@ -1,3 +0,0 @@
|
||||
# Target: SPARC embedded
|
||||
TDEPFILES= sparc-tdep.o
|
||||
TM_FILE= tm-spc-em.h
|
2
gdb/config/sparc/sparc.mt
Normal file
2
gdb/config/sparc/sparc.mt
Normal file
@ -0,0 +1,2 @@
|
||||
# Target: SPARC
|
||||
TDEPFILES= sparc-tdep.o
|
2
gdb/config/sparc/sparc64.mt
Normal file
2
gdb/config/sparc/sparc64.mt
Normal file
@ -0,0 +1,2 @@
|
||||
# Target: UltraSPARC
|
||||
TDEPFILES= sparc-tdep.o sparc64-tdep.o
|
@ -1,6 +0,0 @@
|
||||
# Host: Sparc running LynxOS
|
||||
|
||||
XM_CLIBS= -lbsd
|
||||
|
||||
NAT_FILE= nm-sparclynx.h
|
||||
NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o lynx-nat.o
|
@ -1,3 +0,0 @@
|
||||
# Target: Sparc running LynxOS
|
||||
TDEPFILES= coff-solib.o sparc-tdep.o
|
||||
TM_FILE= tm-sparclynx.h
|
@ -1,9 +0,0 @@
|
||||
# Host: Sun 4 or Sparcstation, running SunOS 4
|
||||
NAT_FILE= nm-sun4os4.h
|
||||
NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o sparc-nat.o
|
||||
HOST_IPC=-DBSD_IPC
|
||||
|
||||
# Setting XM_CLIBS=-lresolv would let us use the DNS, but that would screw
|
||||
# anyone who wants to use NIS, which includes at least one Cygnus customer
|
||||
# (PR 3593). So leave it this way until/unless we find a resolver which can
|
||||
# get names from either DNS or NIS from the same GDB binary.
|
@ -1,3 +0,0 @@
|
||||
# Target: Sun 4 or Sparcstation, running SunOS 4
|
||||
TDEPFILES= sparc-tdep.o solib.o solib-sunos.o
|
||||
TM_FILE= tm-sun4os4.h
|
@ -1,22 +0,0 @@
|
||||
# Host: Sun 4 or Sparcstation, running Solaris 2
|
||||
|
||||
XM_FILE= xm-sun4sol2.h
|
||||
XM_CLIBS= -lsocket -lnsl
|
||||
|
||||
NAT_FILE= nm-sun4sol2.h
|
||||
NATDEPFILES= corelow.o core-sol2.o solib.o solib-svr4.o solib-legacy.o \
|
||||
fork-child.o procfs.o gcore.o \
|
||||
proc-api.o proc-events.o proc-flags.o proc-why.o
|
||||
|
||||
# /usr/include/v9 is needed only by core-sol2.c when including
|
||||
# v9/sys/privregs.h, or rather the headers it in turn includes.
|
||||
MH_CFLAGS=-I/usr/include/v9
|
||||
# If you are compiling with Sun's compiler, add the -xs option to CC
|
||||
# (e.g. `make CC="cc -xs"').
|
||||
# Sun's compilers require the -xs option to produce debug information
|
||||
# in the final linked executable. Otherwise they leave it in the .o
|
||||
# files only, with undocumented pointers to it in the linked executable.
|
||||
# This is commented out because we don't assume that the Sun compiler
|
||||
# is in use.
|
||||
#MH_CFLAGS=-xs -I/usr/include/v9
|
||||
HOST_IPC=-DBSD_IPC
|
@ -1,3 +0,0 @@
|
||||
# Target: Sun 4 or Sparcstation, running Solaris 2
|
||||
TDEPFILES= sparc-tdep.o
|
||||
TM_FILE= tm-sun4sol2.h
|
@ -1,7 +1,6 @@
|
||||
/* Macro definitions for GDB for a Sparc running GNU/Linux.
|
||||
/* Target-dependent definitions for GNU/Linux SPARC.
|
||||
|
||||
Copyright 1989, 1992, 1994, 1995, 1998, 1999, 2002 Free Software
|
||||
Foundation, Inc.
|
||||
Copyright 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -17,16 +16,14 @@
|
||||
|
||||
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. */
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifndef TM_SPARCLINUX_H
|
||||
#define TM_SPARCLINUX_H
|
||||
#ifndef TM_LINUX_H
|
||||
#define TM_LINUX_H
|
||||
|
||||
#include "sparc/tm-sparc.h"
|
||||
#define GDB_MULTI_ARCH GDB_MULTI_ARCH_TM
|
||||
|
||||
#define SIGCONTEXT_PC_OFFSET 12
|
||||
/* Shared library support. */
|
||||
#include "solib.h"
|
||||
|
||||
#include "config/tm-linux.h"
|
||||
|
||||
#endif /* TM_SPARCLINUX_H */
|
||||
#endif /* tm-linux.h */
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* Macro definitions for Sparc running under NetBSD.
|
||||
Copyright 1994, 2002 Free Software Foundation, Inc.
|
||||
/* Target-dependent definitions for NetBSD/sparc.
|
||||
|
||||
Copyright 1994, 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -21,7 +22,9 @@
|
||||
#ifndef TM_NBSD_H
|
||||
#define TM_NBSD_H
|
||||
|
||||
#include "sparc/tm-sparc.h"
|
||||
#define GDB_MULTI_ARCH GDB_MULTI_ARCH_TM
|
||||
|
||||
/* Shared library support. */
|
||||
#include "solib.h"
|
||||
|
||||
#endif /* TM_NBSD_H */
|
||||
#endif /* tm-nbsd.h */
|
||||
|
40
gdb/config/sparc/tm-sol2.h
Normal file
40
gdb/config/sparc/tm-sol2.h
Normal file
@ -0,0 +1,40 @@
|
||||
/* Target-dependent definitions for Solaris SPARC.
|
||||
|
||||
Copyright 2003 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifndef TM_SOL2_H
|
||||
#define TM_SOL2_H
|
||||
|
||||
#define GDB_MULTI_ARCH GDB_MULTI_ARCH_TM
|
||||
|
||||
/* The Sun compilers (Sun ONE Studio, Forte Developer, Sun WorkShop,
|
||||
SunPRO) compiler puts out 0 instead of the address in N_SO stabs.
|
||||
Starting with SunPRO 3.0, the compiler does this for N_FUN stabs
|
||||
too. */
|
||||
#define SOFUN_ADDRESS_MAYBE_MISSING
|
||||
|
||||
/* The Sun compilers also do "globalization"; see the comment in
|
||||
sparc-tdep.c for more information. */
|
||||
extern char *sparc_stabs_unglobalize_name (char *name);
|
||||
#define STATIC_TRANSFORM_NAME(name) \
|
||||
sparc_stabs_unglobalize_name (name)
|
||||
#define IS_STATIC_TRANSFORM_NAME(name) \
|
||||
((name) != sparc_stabs_unglobalize_name (name))
|
||||
|
||||
#endif /* tm-sol2.h */
|
@ -1,107 +0,0 @@
|
||||
/* Target machine sub-parameters for SPARC64, for GDB, the GNU debugger.
|
||||
This is included by other tm-*.h files to define SPARC64 cpu-related info.
|
||||
Copyright 1994, 1995, 1996, 1998, 1999, 2000
|
||||
Free Software Foundation, Inc.
|
||||
This is (obviously) based on the SPARC Vn (n<9) port.
|
||||
Contributed by Doug Evans (dje@cygnus.com).
|
||||
Further modified by Bob Manson (manson@cygnus.com).
|
||||
|
||||
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. */
|
||||
|
||||
struct type;
|
||||
|
||||
#ifndef GDB_TARGET_IS_SPARC64
|
||||
#define GDB_TARGET_IS_SPARC64 1
|
||||
#endif
|
||||
|
||||
#include "sparc/tm-sparc.h"
|
||||
|
||||
/* Eeeew. Ok, we have to assume (for now) that the processor really is
|
||||
in sparc64 mode. While this is the same instruction sequence as
|
||||
on the Sparc, the stack frames are offset by +2047 (and the arguments
|
||||
are 8 bytes instead of 4). */
|
||||
/* Instructions are:
|
||||
std %f10, [ %fp + 0x7a7 ]
|
||||
std %f8, [ %fp + 0x79f ]
|
||||
std %f6, [ %fp + 0x797 ]
|
||||
std %f4, [ %fp + 0x78f ]
|
||||
std %f2, [ %fp + 0x787 ]
|
||||
std %f0, [ %fp + 0x77f ]
|
||||
std %g6, [ %fp + 0x777 ]
|
||||
std %g4, [ %fp + 0x76f ]
|
||||
std %g2, [ %fp + 0x767 ]
|
||||
std %g0, [ %fp + 0x75f ]
|
||||
std %fp, [ %fp + 0x757 ]
|
||||
std %i4, [ %fp + 0x74f ]
|
||||
std %i2, [ %fp + 0x747 ]
|
||||
std %i0, [ %fp + 0x73f ]
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
rd %tbr, %o0
|
||||
st %o0, [ %fp + 0x72b ]
|
||||
rd %tpc, %o0
|
||||
st %o0, [ %fp + 0x727 ]
|
||||
rd %psr, %o0
|
||||
st %o0, [ %fp + 0x723 ]
|
||||
rd %y, %o0
|
||||
st %o0, [ %fp + 0x71f ]
|
||||
ldx [ %sp + 0x8a7 ], %o5
|
||||
ldx [ %sp + 0x89f ], %o4
|
||||
ldx [ %sp + 0x897 ], %o3
|
||||
ldx [ %sp + 0x88f ], %o2
|
||||
ldx [ %sp + 0x887 ], %o1
|
||||
call %g0
|
||||
ldx [ %sp + 0x87f ], %o0
|
||||
nop
|
||||
ta 1
|
||||
nop
|
||||
nop
|
||||
*/
|
||||
|
||||
/* Offsets into jmp_buf.
|
||||
FIXME: This was borrowed from the v8 stuff and will probably have to change
|
||||
for v9. */
|
||||
|
||||
#define JB_ELEMENT_SIZE 8 /* Size of each element in jmp_buf */
|
||||
|
||||
#define JB_ONSSTACK 0
|
||||
#define JB_SIGMASK 1
|
||||
#define JB_SP 2
|
||||
#define JB_PC 3
|
||||
#define JB_NPC 4
|
||||
#define JB_PSR 5
|
||||
#define JB_G1 6
|
||||
#define JB_O0 7
|
||||
#define JB_WBCNT 8
|
||||
|
||||
/* Figure out where the longjmp will land. We expect that we have
|
||||
just entered longjmp and haven't yet setup the stack frame, so the
|
||||
args are still in the output regs. %o0 (O0_REGNUM) points at the
|
||||
jmp_buf structure from which we extract the pc (JB_PC) that we will
|
||||
land at. The pc is copied into ADDR. This routine returns true on
|
||||
success */
|
||||
|
||||
extern int get_longjmp_target (CORE_ADDR *);
|
||||
|
||||
#define GET_LONGJMP_TARGET(ADDR) get_longjmp_target(ADDR)
|
||||
|
||||
#undef TM_PRINT_INSN_MACH
|
||||
#define TM_PRINT_INSN_MACH bfd_mach_sparc_v9a
|
||||
|
@ -1,34 +0,0 @@
|
||||
/* Macro definitions for GDB for a UltraSparc running GNU/Linux.
|
||||
|
||||
Copyright 2001, 2002 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_SPARC_LIN64_H
|
||||
#define TM_SPARC_LIN64_H
|
||||
|
||||
#include "sparc/tm-sp64.h"
|
||||
|
||||
#define SIGCONTEXT_PC_OFFSET 16 /* See asm-sparc64/sigcontext.h */
|
||||
|
||||
/* We always want full V9 + Ultra VIS stuff... */
|
||||
#undef TM_PRINT_INSN_MACH
|
||||
#define TM_PRINT_INSN_MACH bfd_mach_sparc_v9a
|
||||
|
||||
#include "config/tm-sysv4.h"
|
||||
|
||||
#endif /* TM_SPARC_LIN64_H */
|
@ -1,354 +0,0 @@
|
||||
/* Target machine sub-parameters for SPARC, for GDB, the GNU debugger.
|
||||
This is included by other tm-*.h files to define SPARC cpu-related info.
|
||||
Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
|
||||
1998, 1999, 2000, 2001, 2002, 2003
|
||||
Free Software Foundation, Inc.
|
||||
Contributed by Michael Tiemann (tiemann@mcc.com)
|
||||
|
||||
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 "regcache.h"
|
||||
|
||||
struct type;
|
||||
struct value;
|
||||
struct frame_info;
|
||||
|
||||
/*
|
||||
* The following enums are purely for the convenience of the GDB
|
||||
* developer, when debugging GDB.
|
||||
*/
|
||||
|
||||
enum { /* Sparc general registers, for all sparc versions. */
|
||||
G0_REGNUM, G1_REGNUM, G2_REGNUM, G3_REGNUM,
|
||||
G4_REGNUM, G5_REGNUM, G6_REGNUM, G7_REGNUM,
|
||||
O0_REGNUM, O1_REGNUM, O2_REGNUM, O3_REGNUM,
|
||||
O4_REGNUM, O5_REGNUM, O6_REGNUM, O7_REGNUM,
|
||||
L0_REGNUM, L1_REGNUM, L2_REGNUM, L3_REGNUM,
|
||||
L4_REGNUM, L5_REGNUM, L6_REGNUM, L7_REGNUM,
|
||||
I0_REGNUM, I1_REGNUM, I2_REGNUM, I3_REGNUM,
|
||||
I4_REGNUM, I5_REGNUM, I6_REGNUM, I7_REGNUM,
|
||||
FP0_REGNUM /* Floating point register 0 */
|
||||
};
|
||||
|
||||
enum { /* Sparc general registers, alternate names. */
|
||||
R0_REGNUM, R1_REGNUM, R2_REGNUM, R3_REGNUM,
|
||||
R4_REGNUM, R5_REGNUM, R6_REGNUM, R7_REGNUM,
|
||||
R8_REGNUM, R9_REGNUM, R10_REGNUM, R11_REGNUM,
|
||||
R12_REGNUM, R13_REGNUM, R14_REGNUM, R15_REGNUM,
|
||||
R16_REGNUM, R17_REGNUM, R18_REGNUM, R19_REGNUM,
|
||||
R20_REGNUM, R21_REGNUM, R22_REGNUM, R23_REGNUM,
|
||||
R24_REGNUM, R25_REGNUM, R26_REGNUM, R27_REGNUM,
|
||||
R28_REGNUM, R29_REGNUM, R30_REGNUM, R31_REGNUM
|
||||
};
|
||||
|
||||
enum { /* Sparc32 control registers. */
|
||||
PS_REGNUM = 65, /* PC, NPC, and Y are omitted because */
|
||||
WIM_REGNUM = 66, /* they have different values depending on */
|
||||
TBR_REGNUM = 67, /* 32-bit / 64-bit mode. */
|
||||
FPS_REGNUM = 70,
|
||||
CPS_REGNUM = 71
|
||||
};
|
||||
|
||||
/* v9 misc. and priv. regs */
|
||||
|
||||
/* Note: specifying values explicitly for documentation purposes. */
|
||||
enum { /* Sparc64 control registers, excluding Y, PC, and NPC. */
|
||||
CCR_REGNUM = 82, /* Condition Code Register (%xcc,%icc) */
|
||||
FSR_REGNUM = 83, /* Floating Point State */
|
||||
FPRS_REGNUM = 84, /* Floating Point Registers State */
|
||||
ASI_REGNUM = 86, /* Alternate Space Identifier */
|
||||
VER_REGNUM = 87, /* Version register */
|
||||
TICK_REGNUM = 88, /* Tick register */
|
||||
PIL_REGNUM = 89, /* Processor Interrupt Level */
|
||||
PSTATE_REGNUM = 90, /* Processor State */
|
||||
TSTATE_REGNUM = 91, /* Trap State */
|
||||
TBA_REGNUM = 92, /* Trap Base Address */
|
||||
TL_REGNUM = 93, /* Trap Level */
|
||||
TT_REGNUM = 94, /* Trap Type */
|
||||
TPC_REGNUM = 95, /* Trap pc */
|
||||
TNPC_REGNUM = 96, /* Trap npc */
|
||||
WSTATE_REGNUM = 97, /* Window State */
|
||||
CWP_REGNUM = 98, /* Current Window Pointer */
|
||||
CANSAVE_REGNUM = 99, /* Savable Windows */
|
||||
CANRESTORE_REGNUM = 100, /* Restorable Windows */
|
||||
CLEANWIN_REGNUM = 101, /* Clean Windows */
|
||||
OTHERWIN_REGNUM = 102, /* Other Windows */
|
||||
ASR16_REGNUM = 103, /* Ancillary State Registers */
|
||||
ASR17_REGNUM = 104,
|
||||
ASR18_REGNUM = 105,
|
||||
ASR19_REGNUM = 106,
|
||||
ASR20_REGNUM = 107,
|
||||
ASR21_REGNUM = 108,
|
||||
ASR22_REGNUM = 109,
|
||||
ASR23_REGNUM = 110,
|
||||
ASR24_REGNUM = 111,
|
||||
ASR25_REGNUM = 112,
|
||||
ASR26_REGNUM = 113,
|
||||
ASR27_REGNUM = 114,
|
||||
ASR28_REGNUM = 115,
|
||||
ASR29_REGNUM = 116,
|
||||
ASR30_REGNUM = 117,
|
||||
ASR31_REGNUM = 118,
|
||||
ICC_REGNUM = 119, /* 32 bit condition codes */
|
||||
XCC_REGNUM = 120, /* 64 bit condition codes */
|
||||
FCC0_REGNUM = 121, /* fp cc reg 0 */
|
||||
FCC1_REGNUM = 122, /* fp cc reg 1 */
|
||||
FCC2_REGNUM = 123, /* fp cc reg 2 */
|
||||
FCC3_REGNUM = 124 /* fp cc reg 3 */
|
||||
};
|
||||
|
||||
/*
|
||||
* Make sparc target multi-archable: April 2000
|
||||
*/
|
||||
|
||||
/* Multi-arch definition of TARGET_IS_SPARC64, TARGET_ELF64 */
|
||||
#undef GDB_TARGET_IS_SPARC64
|
||||
#define GDB_TARGET_IS_SPARC64 \
|
||||
(sparc_intreg_size () == 8)
|
||||
#undef TARGET_ELF64
|
||||
#define TARGET_ELF64 \
|
||||
(sparc_intreg_size () == 8)
|
||||
extern int sparc_intreg_size (void);
|
||||
|
||||
/*
|
||||
* The following defines should ONLY appear for MULTI_ARCH.
|
||||
*/
|
||||
|
||||
/* Multi-arch the nPC and Y registers. */
|
||||
#define Y_REGNUM (sparc_y_regnum ())
|
||||
|
||||
/* On the Sun 4 under SunOS, the compile will leave a fake insn which
|
||||
encodes the structure size being returned. If we detect such
|
||||
a fake insn, step past it. */
|
||||
|
||||
#define PC_ADJUST(PC) sparc_pc_adjust (PC)
|
||||
extern CORE_ADDR sparc_pc_adjust (CORE_ADDR);
|
||||
|
||||
/* If an argument is declared "register", Sun cc will keep it in a register,
|
||||
never saving it onto the stack. So we better not believe the "p" symbol
|
||||
descriptor stab. */
|
||||
|
||||
#define DEPRECATE_USE_REGISTER_NOT_ARG
|
||||
|
||||
/* For acc, there's no need to correct LBRAC entries by guessing how
|
||||
they should work. In fact, this is harmful because the LBRAC
|
||||
entries now all appear at the end of the function, not intermixed
|
||||
with the SLINE entries. n_opt_found detects acc for Solaris binaries;
|
||||
function_stab_type detects acc for SunOS4 binaries.
|
||||
|
||||
For binary from SunOS4 /bin/cc, need to correct LBRAC's.
|
||||
|
||||
For gcc, like acc, don't correct. */
|
||||
|
||||
#define SUN_FIXED_LBRAC_BUG \
|
||||
(n_opt_found \
|
||||
|| function_stab_type == N_STSYM \
|
||||
|| function_stab_type == N_GSYM \
|
||||
|| processing_gcc_compilation)
|
||||
|
||||
/* Do variables in the debug stabs occur after the N_LBRAC or before it?
|
||||
acc: after, gcc: before, SunOS4 /bin/cc: before. */
|
||||
|
||||
#define VARIABLES_INSIDE_BLOCK(desc, gcc_p) \
|
||||
(!(gcc_p) \
|
||||
&& (n_opt_found \
|
||||
|| function_stab_type == N_STSYM \
|
||||
|| function_stab_type == N_GSYM))
|
||||
|
||||
/* Sequence of bytes for breakpoint instruction (ta 1). */
|
||||
|
||||
extern const unsigned char *sparc_breakpoint_from_pc (CORE_ADDR *pc, int *len);
|
||||
#define BREAKPOINT_FROM_PC(PC,LEN) sparc_breakpoint_from_pc ((PC), (LEN))
|
||||
|
||||
/* Register numbers of various important registers.
|
||||
Note that some of these values are "real" register numbers,
|
||||
and correspond to the general registers of the machine,
|
||||
and some are "phony" register numbers which are too large
|
||||
to be actual register numbers as far as the user is concerned
|
||||
but do serve to get the desired values when passed to read_register. */
|
||||
|
||||
#define G0_REGNUM 0 /* %g0 */
|
||||
#define G1_REGNUM 1 /* %g1 */
|
||||
#define O0_REGNUM 8 /* %o0 */
|
||||
#define RP_REGNUM 15 /* Contains return address value, *before* \
|
||||
any windows get switched. */
|
||||
#define O7_REGNUM 15 /* Last local reg not saved on stack frame */
|
||||
#define L0_REGNUM 16 /* First local reg that's saved on stack frame
|
||||
rather than in machine registers */
|
||||
#define I0_REGNUM 24 /* %i0 */
|
||||
#define I7_REGNUM 31 /* Last local reg saved on stack frame */
|
||||
#define PS_REGNUM 65 /* Contains processor status */
|
||||
#define PS_FLAG_CARRY 0x100000 /* Carry bit in PS */
|
||||
#define WIM_REGNUM 66 /* Window Invalid Mask (not really supported) */
|
||||
#define TBR_REGNUM 67 /* Trap Base Register (not really supported) */
|
||||
#define FPS_REGNUM 70 /* Floating point status register */
|
||||
#define CPS_REGNUM 71 /* Coprocessor status register */
|
||||
|
||||
/* Writing to %g0 is a noop (not an error or exception or anything like
|
||||
that, however). */
|
||||
|
||||
#define CANNOT_STORE_REGISTER(regno) ((regno) == G0_REGNUM)
|
||||
|
||||
#define DEPRECATED_PRINT_EXTRA_FRAME_INFO(FI) \
|
||||
sparc_print_extra_frame_info (FI)
|
||||
extern void sparc_print_extra_frame_info (struct frame_info *);
|
||||
|
||||
/* DEPRECATED_INIT_EXTRA_FRAME_INFO needs the PC to detect flat
|
||||
frames. */
|
||||
|
||||
#define DEPRECATED_INIT_FRAME_PC_FIRST(FROMLEAF, PREV) \
|
||||
((FROMLEAF) ? DEPRECATED_SAVED_PC_AFTER_CALL ((PREV)->next) : \
|
||||
(PREV)->next ? DEPRECATED_FRAME_SAVED_PC ((PREV)->next) : read_pc ())
|
||||
|
||||
/* Define other aspects of the stack frame. */
|
||||
|
||||
/* The location of I0 w.r.t SP. This is actually dependent on how the
|
||||
system's window overflow/underflow routines are written. Most
|
||||
vendors save the L regs followed by the I regs (at the higher
|
||||
address). Some vendors get it wrong. */
|
||||
|
||||
#define FRAME_SAVED_L0 0
|
||||
#define FRAME_SAVED_I0 (8 * DEPRECATED_REGISTER_RAW_SIZE (L0_REGNUM))
|
||||
|
||||
/* Things needed for making the inferior call functions. */
|
||||
/*
|
||||
* First of all, let me give my opinion of what the DUMMY_FRAME
|
||||
* actually looks like.
|
||||
*
|
||||
* | |
|
||||
* | |
|
||||
* + - - - - - - - - - - - - - - - - +<-- fp (level 0)
|
||||
* | |
|
||||
* | |
|
||||
* | |
|
||||
* | |
|
||||
* | Frame of innermost program |
|
||||
* | function |
|
||||
* | |
|
||||
* | |
|
||||
* | |
|
||||
* | |
|
||||
* | |
|
||||
* |---------------------------------|<-- sp (level 0), fp (c)
|
||||
* | |
|
||||
* DUMMY | fp0-31 |
|
||||
* | |
|
||||
* | ------ |<-- fp - 0x80
|
||||
* FRAME | g0-7 |<-- fp - 0xa0
|
||||
* | i0-7 |<-- fp - 0xc0
|
||||
* | other |<-- fp - 0xe0
|
||||
* | ? |
|
||||
* | ? |
|
||||
* |---------------------------------|<-- sp' = fp - 0x140
|
||||
* | |
|
||||
* xcution start | |
|
||||
* sp' + 0x94 -->| CALL_DUMMY (x code) |
|
||||
* | |
|
||||
* | |
|
||||
* |---------------------------------|<-- sp'' = fp - 0x200
|
||||
* | align sp to 8 byte boundary |
|
||||
* | ==> args to fn <== |
|
||||
* Room for | |
|
||||
* i & l's + agg | CALL_DUMMY_STACK_ADJUST = 0x0x44|
|
||||
* |---------------------------------|<-- final sp (variable)
|
||||
* | |
|
||||
* | Where function called will |
|
||||
* | build frame. |
|
||||
* | |
|
||||
* | |
|
||||
*
|
||||
* I understand everything in this picture except what the space
|
||||
* between fp - 0xe0 and fp - 0x140 is used for. Oh, and I don't
|
||||
* understand why there's a large chunk of CALL_DUMMY that never gets
|
||||
* executed (its function is superceeded by
|
||||
* DEPRECATED_PUSH_DUMMY_FRAME; they are designed to do the same
|
||||
* thing).
|
||||
*
|
||||
* DEPRECATED_PUSH_DUMMY_FRAME saves the registers above sp' and
|
||||
* pushes the * register file stack down one.
|
||||
*
|
||||
* call_function then writes CALL_DUMMY, pushes the args onto the
|
||||
* stack, and adjusts the stack pointer.
|
||||
|
||||
call_function_by_hand then starts execution (in the middle of
|
||||
CALL_DUMMY, as directed by call_function). */
|
||||
|
||||
#ifndef CALL_DUMMY
|
||||
/* This sequence of words is the instructions
|
||||
|
||||
00: bc 10 00 01 mov %g1, %fp
|
||||
04: 9d e3 80 00 save %sp, %g0, %sp
|
||||
08: bc 10 00 02 mov %g2, %fp
|
||||
0c: be 10 00 03 mov %g3, %i7
|
||||
10: da 03 a0 58 ld [ %sp + 0x58 ], %o5
|
||||
14: d8 03 a0 54 ld [ %sp + 0x54 ], %o4
|
||||
18: d6 03 a0 50 ld [ %sp + 0x50 ], %o3
|
||||
1c: d4 03 a0 4c ld [ %sp + 0x4c ], %o2
|
||||
20: d2 03 a0 48 ld [ %sp + 0x48 ], %o1
|
||||
24: 40 00 00 00 call <fun>
|
||||
28: d0 03 a0 44 ld [ %sp + 0x44 ], %o0
|
||||
2c: 01 00 00 00 nop
|
||||
30: 91 d0 20 01 ta 1
|
||||
34: 01 00 00 00 nop
|
||||
|
||||
NOTES:
|
||||
* the first four instructions are necessary only on the simulator.
|
||||
* this is a multiple of 8 (not only 4) bytes.
|
||||
* the `call' insn is a relative, not an absolute call.
|
||||
* the `nop' at the end is needed to keep the trap from
|
||||
clobbering things (if NPC pointed to garbage instead).
|
||||
*/
|
||||
|
||||
#endif /* CALL_DUMMY */
|
||||
|
||||
/* Sparc has no reliable single step ptrace call */
|
||||
|
||||
#define SOFTWARE_SINGLE_STEP_P() 1
|
||||
extern void sparc_software_single_step (enum target_signal, int);
|
||||
#define SOFTWARE_SINGLE_STEP(sig,bp_p) sparc_software_single_step (sig,bp_p)
|
||||
|
||||
/* We need more arguments in a frame specification for the
|
||||
"frame" or "info frame" command. */
|
||||
|
||||
#define SETUP_ARBITRARY_FRAME(argc, argv) setup_arbitrary_frame (argc, argv)
|
||||
extern struct frame_info *setup_arbitrary_frame (int, CORE_ADDR *);
|
||||
|
||||
extern void sparc_do_registers_info (int regnum, int all);
|
||||
#undef DEPRECATED_DO_REGISTERS_INFO
|
||||
#define DEPRECATED_DO_REGISTERS_INFO(REGNUM,ALL) sparc_do_registers_info (REGNUM, ALL)
|
||||
|
||||
/* Optimization for storing registers to the inferior. The hook
|
||||
DO_DEFERRED_STORES
|
||||
actually executes any deferred stores. It is called any time
|
||||
we are going to proceed the child, or read its registers.
|
||||
The hook CLEAR_DEFERRED_STORES is called when we want to throw
|
||||
away the inferior process, e.g. when it dies or we kill it.
|
||||
FIXME, this does not handle remote debugging cleanly. */
|
||||
|
||||
extern int deferred_stores;
|
||||
#define DO_DEFERRED_STORES \
|
||||
if (deferred_stores) \
|
||||
target_store_registers (-2);
|
||||
#define CLEAR_DEFERRED_STORES \
|
||||
deferred_stores = 0;
|
||||
|
||||
/* Select the sparc disassembler */
|
||||
|
||||
#define TM_PRINT_INSN_MACH bfd_mach_sparc
|
||||
|
||||
#define DEPRECATED_EXTRA_STACK_ALIGNMENT_NEEDED 1
|
@ -1,37 +0,0 @@
|
||||
/* Macro definitions for Sparc running under LynxOS.
|
||||
Copyright 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. */
|
||||
|
||||
#ifndef TM_SPARCLYNX_H
|
||||
#define TM_SPARCLYNX_H
|
||||
|
||||
#include "config/tm-lynx.h"
|
||||
|
||||
/* Use generic Sparc definitions. */
|
||||
#include "sparc/tm-sparc.h"
|
||||
|
||||
/* Lynx does this backwards from everybody else */
|
||||
|
||||
#undef FRAME_SAVED_I0
|
||||
#undef FRAME_SAVED_L0
|
||||
|
||||
#define FRAME_SAVED_I0 0
|
||||
#define FRAME_SAVED_L0 (8 * DEPRECATED_REGISTER_RAW_SIZE (I0_REGNUM))
|
||||
|
||||
#endif /* TM_SPARCLYNX_H */
|
@ -1,46 +0,0 @@
|
||||
/* Target machine definitions for GDB for an embedded SPARC.
|
||||
Copyright 1989, 1992, 1993, 2000 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 "sparc/tm-sparc.h"
|
||||
|
||||
/* Offsets into jmp_buf. Not defined by Sun, but at least documented in a
|
||||
comment in <machine/setjmp.h>! */
|
||||
|
||||
#define JB_ELEMENT_SIZE 4 /* Size of each element in jmp_buf */
|
||||
|
||||
#define JB_ONSSTACK 0
|
||||
#define JB_SIGMASK 1
|
||||
#define JB_SP 2
|
||||
#define JB_PC 3
|
||||
#define JB_NPC 4
|
||||
#define JB_PSR 5
|
||||
#define JB_G1 6
|
||||
#define JB_O0 7
|
||||
#define JB_WBCNT 8
|
||||
|
||||
/* Figure out where the longjmp will land. We expect that we have just entered
|
||||
longjmp and haven't yet setup the stack frame, so the args are still in the
|
||||
output regs. %o0 (O0_REGNUM) points at the jmp_buf structure from which we
|
||||
extract the pc (JB_PC) that we will land at. The pc is copied into ADDR.
|
||||
This routine returns true on success */
|
||||
|
||||
extern int get_longjmp_target (CORE_ADDR *);
|
||||
|
||||
#define GET_LONGJMP_TARGET(ADDR) get_longjmp_target(ADDR)
|
@ -1,59 +0,0 @@
|
||||
/* Macro definitions for GDB for a Sun 4 running sunos 4.
|
||||
Copyright 1989, 1992, 1994, 1995, 1998, 2000
|
||||
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 "sparc/tm-sparc.h"
|
||||
#include "config/tm-sunos.h"
|
||||
|
||||
/* Redefine SKIP_TRAMPOLINE_CODE to handle PIC compiled modules
|
||||
in main executables. */
|
||||
|
||||
#undef SKIP_TRAMPOLINE_CODE
|
||||
#define SKIP_TRAMPOLINE_CODE(pc) sunos4_skip_trampoline_code (pc)
|
||||
extern CORE_ADDR sunos4_skip_trampoline_code (CORE_ADDR);
|
||||
|
||||
/* Offsets into jmp_buf. Not defined by Sun, but at least documented in a
|
||||
comment in <machine/setjmp.h>! */
|
||||
|
||||
#define JB_ELEMENT_SIZE 4 /* Size of each element in jmp_buf */
|
||||
|
||||
#define JB_ONSSTACK 0
|
||||
#define JB_SIGMASK 1
|
||||
#define JB_SP 2
|
||||
#define JB_PC 3
|
||||
#define JB_NPC 4
|
||||
#define JB_PSR 5
|
||||
#define JB_G1 6
|
||||
#define JB_O0 7
|
||||
#define JB_WBCNT 8
|
||||
|
||||
/* Figure out where the longjmp will land. We expect that we have just entered
|
||||
longjmp and haven't yet setup the stack frame, so the args are still in the
|
||||
output regs. %o0 (O0_REGNUM) points at the jmp_buf structure from which we
|
||||
extract the pc (JB_PC) that we will land at. The pc is copied into ADDR.
|
||||
This routine returns true on success */
|
||||
|
||||
extern int get_longjmp_target (CORE_ADDR *);
|
||||
|
||||
#define GET_LONGJMP_TARGET(ADDR) get_longjmp_target(ADDR)
|
||||
|
||||
extern char *sunpro_static_transform_name (char *);
|
||||
#define STATIC_TRANSFORM_NAME(x) sunpro_static_transform_name (x)
|
||||
#define IS_STATIC_TRANSFORM_NAME(name) ((name)[0] == '$')
|
@ -1,78 +0,0 @@
|
||||
/* Macro definitions for GDB for a Sun 4 running Solaris 2
|
||||
Copyright 1989, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000
|
||||
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 "sparc/tm-sparc.h"
|
||||
#include "config/tm-sysv4.h"
|
||||
|
||||
/* With Sol2 it is no longer necessary to enable software single-step,
|
||||
since the /proc interface can take care of it for us in hardware. */
|
||||
#undef SOFTWARE_SINGLE_STEP
|
||||
#undef SOFTWARE_SINGLE_STEP_P
|
||||
|
||||
/* There are two different signal handler trampolines in Solaris2. */
|
||||
#define IN_SIGTRAMP(pc, name) \
|
||||
((name) \
|
||||
&& (DEPRECATED_STREQ ("sigacthandler", name) || DEPRECATED_STREQ ("ucbsigvechandler", name)))
|
||||
|
||||
/* The signal handler gets a pointer to an ucontext as third argument
|
||||
if it is called from sigacthandler. This is the offset to the saved
|
||||
PC within it. sparc_frame_saved_pc knows how to deal with
|
||||
ucbsigvechandler. */
|
||||
#define SIGCONTEXT_PC_OFFSET 44
|
||||
|
||||
#if 0 /* FIXME Setjmp/longjmp are not as well doc'd in SunOS 5.x yet */
|
||||
|
||||
/* Offsets into jmp_buf. Not defined by Sun, but at least documented in a
|
||||
comment in <machine/setjmp.h>! */
|
||||
|
||||
#define JB_ELEMENT_SIZE 4 /* Size of each element in jmp_buf */
|
||||
|
||||
#define JB_ONSSTACK 0
|
||||
#define JB_SIGMASK 1
|
||||
#define JB_SP 2
|
||||
#define JB_PC 3
|
||||
#define JB_NPC 4
|
||||
#define JB_PSR 5
|
||||
#define JB_G1 6
|
||||
#define JB_O0 7
|
||||
#define JB_WBCNT 8
|
||||
|
||||
/* Figure out where the longjmp will land. We expect that we have just entered
|
||||
longjmp and haven't yet setup the stack frame, so the args are still in the
|
||||
output regs. %o0 (O0_REGNUM) points at the jmp_buf structure from which we
|
||||
extract the pc (JB_PC) that we will land at. The pc is copied into ADDR.
|
||||
This routine returns true on success */
|
||||
|
||||
extern int get_longjmp_target (CORE_ADDR *);
|
||||
|
||||
#define GET_LONGJMP_TARGET(ADDR) get_longjmp_target(ADDR)
|
||||
#endif /* 0 */
|
||||
|
||||
/* The SunPRO compiler puts out 0 instead of the address in N_SO symbols,
|
||||
and for SunPRO 3.0, N_FUN symbols too. */
|
||||
#define SOFUN_ADDRESS_MAYBE_MISSING
|
||||
|
||||
extern char *sunpro_static_transform_name (char *);
|
||||
#define STATIC_TRANSFORM_NAME(x) sunpro_static_transform_name (x)
|
||||
#define IS_STATIC_TRANSFORM_NAME(name) ((name)[0] == '$')
|
||||
|
||||
/* Enable handling of shared libraries for a.out executables. */
|
||||
#define HANDLE_SVR4_EXEC_EMULATORS
|
@ -1,27 +0,0 @@
|
||||
/* Target machine description for VxWorks sparc's, for GDB, the GNU debugger.
|
||||
Copyright 1993, 1999 Free Software Foundation, Inc.
|
||||
Contributed by Cygnus Support.
|
||||
|
||||
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 "sparc/tm-spc-em.h"
|
||||
#include "config/tm-vxworks.h"
|
||||
|
||||
/* Number of registers in a ptrace_getfpregs call. */
|
||||
|
||||
/* #define VX_SIZE_FPREGS (don't know how many) */
|
@ -1,3 +0,0 @@
|
||||
# Target: SPARC running VxWorks
|
||||
TDEPFILES= sparc-tdep.o remote-vx.o remote-vxsparc.o xdr_ld.o xdr_ptrace.o xdr_rdb.o
|
||||
TM_FILE= tm-vxsparc.h
|
@ -1,42 +0,0 @@
|
||||
/* Macro definitions for running gdb on a Sparc running GNU/Linux.
|
||||
|
||||
Copyright 1989, 1993, 1994, 1995, 1996, 1998, 2001, 2002 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_SPARCLINUX_H
|
||||
#define XM_SPARCLINUX_H
|
||||
|
||||
/* This is the amount to subtract from u.u_ar0
|
||||
to get the offset in the core file of the register values. */
|
||||
#define KERNEL_U_ADDR 0x0
|
||||
|
||||
#define U_REGS_OFFSET 0
|
||||
|
||||
/* If you expect to use the mmalloc package to obtain mapped symbol files,
|
||||
for now you have to specify some parameters that determine how gdb places
|
||||
the mappings in it's address space. See the comments in map_to_address()
|
||||
for details. This is expected to only be a short term solution. Yes it
|
||||
is a kludge.
|
||||
FIXME: Make this more automatic. */
|
||||
|
||||
#define MMAP_BASE_ADDRESS 0xE0000000 /* First mapping here */
|
||||
#define MMAP_INCREMENT 0x01000000 /* Increment to next mapping */
|
||||
|
||||
#endif /* _XM_SPARCLINUX_H */
|
@ -1,37 +0,0 @@
|
||||
/* Macro definitions for running gdb on a Sun 4 running Solaris 2.
|
||||
Copyright 1989, 1992, 1993, 1994, 1995, 1996, 1998, 2000
|
||||
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. */
|
||||
|
||||
/* Pick up more stuff from the generic SVR4 host include file. */
|
||||
|
||||
#include "config/xm-sysv4.h"
|
||||
|
||||
/* These are not currently used in SVR4 (but should be, FIXME!). */
|
||||
#undef DO_DEFERRED_STORES
|
||||
#undef CLEAR_DEFERRED_STORES
|
||||
|
||||
/* solaris doesn't have siginterrupt, though it has sigaction; however,
|
||||
in this case siginterrupt would just be setting the default. */
|
||||
#define NO_SIGINTERRUPT
|
||||
|
||||
/* On sol2.7, <curses.h> emits a bunch of 'macro redefined'
|
||||
warnings, which makes autoconf think curses.h doesn't
|
||||
exist. Compensate for that here. */
|
||||
#define HAVE_CURSES_H 1
|
@ -125,20 +125,16 @@ s390*-*-*) gdb_host=s390 ;;
|
||||
|
||||
sh*-*-netbsdelf*) gdb_host=nbsd ;;
|
||||
|
||||
sparc64-*-freebsd*) gdb_host=fbsd ;;
|
||||
sparc-*-linux*) gdb_host=linux ;;
|
||||
sparc-*-lynxos*) gdb_host=sparclynx ;;
|
||||
sparc64-*-linux*) gdb_host=linux64 ;;
|
||||
sparc-*-netbsdelf*) gdb_host=nbsdelf ;;
|
||||
sparc-*-netbsdaout*) gdb_host=nbsdaout ;;
|
||||
sparc-*-netbsd*) gdb_host=nbsdaout ;;
|
||||
sparc-*-solaris2*) gdb_host=sun4sol2 ;;
|
||||
sparc-*-sunos4*) gdb_host=sun4os4 ;;
|
||||
sparc-*-sunos5*) gdb_host=sun4sol2 ;;
|
||||
sparc-*-*) gdb_host=sun4os4 ;;
|
||||
sparc64-*-freebsd*|ultrasparc-*-freebsd*|sparcv9-*-freebsd*)
|
||||
gdb_host=fbsd ;;
|
||||
sparc64-*-linux*) gdb_host=linux ;;
|
||||
sparc64-*-netbsd*) gdb_host=nbsd64 ;;
|
||||
sparcv9-*-* | sparc64-*-*) gdb_host=sun4sol2 ;;
|
||||
sparc-*-solaris2* | sparcv9-*-solaris2* | sparc64-*-solaris2*)
|
||||
gdb_host=sol2
|
||||
;;
|
||||
|
||||
vax-*-bsd*) gdb_host=vaxbsd ;;
|
||||
vax-*-ultrix2*) gdb_host=vaxult2 ;;
|
||||
|
@ -186,26 +186,18 @@ sh*-*-netbsdelf*) gdb_target=nbsd ;;
|
||||
sh-*-nto*) gdb_target=nto ;;
|
||||
sh*) gdb_target=embed ;;
|
||||
|
||||
sparc-*-aout*) gdb_target=sparc-em ;;
|
||||
sparc-*-coff*) gdb_target=sparc-em ;;
|
||||
sparc-*-elf*) gdb_target=sparc-em ;;
|
||||
sparc-*-linux*) gdb_target=linux ;;
|
||||
sparc-*-lynxos*) gdb_target=sparclynx ;;
|
||||
sparc64-*-linux*) gdb_target=linux64 ;;
|
||||
sparc-*-netbsd*) gdb_target=nbsd ;;
|
||||
sparc-*-solaris2*) gdb_target=sun4sol2 ;;
|
||||
sparc-*-sunos4*) gdb_target=sun4os4 ;;
|
||||
sparc-*-sunos5*) gdb_target=sun4sol2 ;;
|
||||
sparc-*-vxworks*) gdb_target=vxsparc ;;
|
||||
sparc-*-*) gdb_target=sun4os4 ;;
|
||||
# It's not clear what the right solution for "v8plus" systems is yet.
|
||||
# For now, stick with sparc-sun-solaris2 since that's what config.guess
|
||||
# should return. Work is still needed to get gdb to print the 64 bit
|
||||
# regs (some of which are usable in v8plus) so sp64sol.mt hasn't been
|
||||
# deleted though presumably it should be eventually.
|
||||
#sparc64-*-solaris2*) gdb_target=sp64sol2 ;;
|
||||
sparc64-*-linux*) gdb_target=sp64linux ;;
|
||||
sparc64-*-netbsd*) gdb_target=nbsd64 ;;
|
||||
sparcv9-*-* | sparc64-*-*) gdb_target=sp64 ;;
|
||||
sparc-*-solaris2.[0-6] | sparc-*-solaris2.[0-6].*)
|
||||
gdb_target=sol2
|
||||
;;
|
||||
sparc-*-solaris2* | sparcv9-*-solaris2* | sparc64-*-solaris2*)
|
||||
gdb_target=sol2-64
|
||||
;;
|
||||
sparc-*-*) gdb_target=sparc ;;
|
||||
sparc64-*-*) gdb_target=sparc64 ;;
|
||||
|
||||
xstormy16-*-*) gdb_target=xstormy16 ;;
|
||||
|
||||
|
@ -1,101 +0,0 @@
|
||||
/* Native-dependent code for GNU/Linux SPARC.
|
||||
|
||||
Copyright 2001, 2002, 2003 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 "regcache.h"
|
||||
#include "sparc-tdep.h"
|
||||
|
||||
#include <sys/procfs.h>
|
||||
|
||||
/* Prototypes for supply_gregset etc. */
|
||||
#include "gregset.h"
|
||||
|
||||
void
|
||||
supply_gregset (elf_gregset_t *gregsetp)
|
||||
{
|
||||
elf_greg_t *regp = (elf_greg_t *) gregsetp;
|
||||
int i;
|
||||
|
||||
for (i = G0_REGNUM; i <= I7_REGNUM; i++)
|
||||
supply_register (i, (char *) (regp + (i - G0_REGNUM)));
|
||||
|
||||
supply_register (PS_REGNUM, (char *) (regp + 32));
|
||||
|
||||
supply_register (PC_REGNUM, (char *) (regp + 33));
|
||||
supply_register (DEPRECATED_NPC_REGNUM, (char *) (regp + 34));
|
||||
supply_register (Y_REGNUM, (char *) (regp + 35));
|
||||
|
||||
supply_register (WIM_REGNUM, (char *) (regp + 36));
|
||||
supply_register (TBR_REGNUM, (char *) (regp + 37));
|
||||
|
||||
/* Fill inaccessible registers with zero. */
|
||||
supply_register (CPS_REGNUM, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
fill_gregset (elf_gregset_t *gregsetp, int regno)
|
||||
{
|
||||
elf_greg_t *regp = (elf_greg_t *) gregsetp;
|
||||
int i;
|
||||
|
||||
for (i = G0_REGNUM; i <= I7_REGNUM; i++)
|
||||
if (regno == -1 || regno == i)
|
||||
regcache_collect (i, regp + (i - G0_REGNUM));
|
||||
|
||||
if (regno == -1 || regno == PS_REGNUM)
|
||||
regcache_collect (PS_REGNUM, regp + 32);
|
||||
|
||||
if (regno == -1 || regno == PC_REGNUM)
|
||||
regcache_collect (PC_REGNUM, regp + 33);
|
||||
if (regno == -1 || regno == DEPRECATED_NPC_REGNUM)
|
||||
regcache_collect (DEPRECATED_NPC_REGNUM, regp + 34);
|
||||
if (regno == -1 || regno == Y_REGNUM)
|
||||
regcache_collect (Y_REGNUM, regp + 35);
|
||||
|
||||
if (regno == -1 || regno == WIM_REGNUM)
|
||||
regcache_collect (WIM_REGNUM, regp + 36);
|
||||
if (regno == -1 || regno == TBR_REGNUM)
|
||||
regcache_collect (TBR_REGNUM, regp + 37);
|
||||
}
|
||||
|
||||
void
|
||||
supply_fpregset (elf_fpregset_t *fpregsetp)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = FP0_REGNUM; i < FP0_REGNUM + 32; i++)
|
||||
supply_register (i, (char *) &fpregsetp->pr_fr.pr_regs[i - FP0_REGNUM]);
|
||||
|
||||
supply_register (FPS_REGNUM, (char *) &fpregsetp->pr_fsr);
|
||||
}
|
||||
|
||||
void
|
||||
fill_fpregset (elf_fpregset_t *fpregsetp, int regno)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = FP0_REGNUM; i < FP0_REGNUM + 32; i++)
|
||||
if (regno == -1 || regno == i)
|
||||
regcache_collect (i, &fpregsetp->pr_fr.pr_regs[i - FP0_REGNUM]);
|
||||
|
||||
if (regno == -1 || regno == FPS_REGNUM)
|
||||
regcache_collect (FPS_REGNUM, &fpregsetp->pr_fsr);
|
||||
}
|
311
gdb/sparc-linux-tdep.c
Normal file
311
gdb/sparc-linux-tdep.c
Normal file
@ -0,0 +1,311 @@
|
||||
/* Target-dependent code for GNU/Linux SPARC.
|
||||
|
||||
Copyright 2003 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 "floatformat.h"
|
||||
#include "frame.h"
|
||||
#include "frame-unwind.h"
|
||||
#include "gdbarch.h"
|
||||
#include "gdbcore.h"
|
||||
#include "osabi.h"
|
||||
#include "regcache.h"
|
||||
#include "solib-svr4.h"
|
||||
#include "symtab.h"
|
||||
#include "trad-frame.h"
|
||||
|
||||
#include "gdb_assert.h"
|
||||
#include "gdb_string.h"
|
||||
|
||||
#include "sparc-tdep.h"
|
||||
|
||||
/* Recognizing signal handler frames. */
|
||||
|
||||
/* GNU/Linux has two flavors of signals. Normal signal handlers, and
|
||||
"realtime" (RT) signals. The RT signals can provide additional
|
||||
information to the signal handler if the SA_SIGINFO flag is set
|
||||
when establishing a signal handler using `sigaction'. It is not
|
||||
unlikely that future versions of GNU/Linux will support SA_SIGINFO
|
||||
for normal signals too. */
|
||||
|
||||
/* When the sparc Linux kernel calls a signal handler and the
|
||||
SA_RESTORER flag isn't set, the return address points to a bit of
|
||||
code on the stack. This function returns whether the PC appears to
|
||||
be within this bit of code.
|
||||
|
||||
The instruction sequence for normal signals is
|
||||
mov __NR_sigreturn, %g1 ! hex: 0x821020d8
|
||||
ta 0x10 ! hex: 0x91d02010
|
||||
|
||||
Checking for the code sequence should be somewhat reliable, because
|
||||
the effect is to call the system call sigreturn. This is unlikely
|
||||
to occur anywhere other than a signal trampoline.
|
||||
|
||||
It kind of sucks that we have to read memory from the process in
|
||||
order to identify a signal trampoline, but there doesn't seem to be
|
||||
any other way. However, sparc32_linux_pc_in_sigtramp arranges to
|
||||
only call us if no function name could be identified, which should
|
||||
be the case since the code is on the stack. */
|
||||
|
||||
#define LINUX32_SIGTRAMP_INSN0 0x821020d8 /* mov __NR_sigreturn, %g1 */
|
||||
#define LINUX32_SIGTRAMP_INSN1 0x91d02010 /* ta 0x10 */
|
||||
|
||||
/* The instruction sequence for RT signals is
|
||||
mov __NR_rt_sigreturn, %g1 ! hex: 0x82102065
|
||||
ta {0x10,0x6d} ! hex: 0x91d02010 or 0x91d0206d
|
||||
|
||||
The effect is to call the system call rt_sigreturn. The trap number
|
||||
is variable based upon whether this is a 32-bit or 64-bit sparc binary.
|
||||
Note that 64-bit binaries only use this RT signal return method. */
|
||||
|
||||
#define LINUX32_RT_SIGTRAMP_INSN0 0x82102065
|
||||
#define LINUX32_RT_SIGTRAMP_INSN1 0x91d02010
|
||||
|
||||
/* If PC is in a sigtramp routine consisting of the instructions INSN0
|
||||
and INSN1, return the address of the start of the routine.
|
||||
Otherwise, return 0. */
|
||||
|
||||
CORE_ADDR
|
||||
sparc_linux_sigtramp_start (CORE_ADDR pc, ULONGEST insn0, ULONGEST insn1)
|
||||
{
|
||||
ULONGEST word0, word1;
|
||||
char buf[8]; /* Two instructions. */
|
||||
|
||||
/* We only recognize a signal trampoline if PC is at the start of
|
||||
one of the instructions. We optimize for finding the PC at the
|
||||
start of the instruction sequence, as will be the case when the
|
||||
trampoline is not the first frame on the stack. We assume that
|
||||
in the case where the PC is not at the start of the instruction
|
||||
sequence, there will be a few trailing readable bytes on the
|
||||
stack. */
|
||||
|
||||
if (read_memory_nobpt (pc, buf, sizeof buf) != 0)
|
||||
return 0;
|
||||
|
||||
word0 = extract_unsigned_integer (buf, 4);
|
||||
if (word0 != insn0)
|
||||
{
|
||||
if (word0 != insn1)
|
||||
return 0;
|
||||
|
||||
pc -= 4;
|
||||
if (read_memory_nobpt (pc, buf, sizeof buf) != 0)
|
||||
return 0;
|
||||
|
||||
word0 = extract_unsigned_integer (buf, 4);
|
||||
}
|
||||
|
||||
word1 = extract_unsigned_integer (buf + 4, 4);
|
||||
if (word0 != insn0 || word1 != insn1)
|
||||
return 0;
|
||||
|
||||
return pc;
|
||||
}
|
||||
|
||||
static CORE_ADDR
|
||||
sparc32_linux_sigtramp_start (CORE_ADDR pc)
|
||||
{
|
||||
return sparc_linux_sigtramp_start (pc, LINUX32_SIGTRAMP_INSN0,
|
||||
LINUX32_SIGTRAMP_INSN1);
|
||||
}
|
||||
|
||||
static CORE_ADDR
|
||||
sparc32_linux_rt_sigtramp_start (CORE_ADDR pc)
|
||||
{
|
||||
return sparc_linux_sigtramp_start (pc, LINUX32_RT_SIGTRAMP_INSN0,
|
||||
LINUX32_RT_SIGTRAMP_INSN1);
|
||||
}
|
||||
|
||||
static int
|
||||
sparc32_linux_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
{
|
||||
/* If we have NAME, we can optimize the search. The trampolines are
|
||||
named __restore and __restore_rt. However, they aren't dynamically
|
||||
exported from the shared C library, so the trampoline may appear to
|
||||
be part of the preceding function. This should always be sigaction,
|
||||
__sigaction, or __libc_sigaction (all aliases to the same function). */
|
||||
if (name == NULL || strstr (name, "sigaction") != NULL)
|
||||
return (sparc32_linux_sigtramp_start (pc) != 0
|
||||
|| sparc32_linux_rt_sigtramp_start (pc) != 0);
|
||||
|
||||
return (strcmp ("__restore", name) == 0
|
||||
|| strcmp ("__restore_rt", name) == 0);
|
||||
}
|
||||
|
||||
static struct sparc_frame_cache *
|
||||
sparc32_linux_sigtramp_frame_cache (struct frame_info *next_frame,
|
||||
void **this_cache)
|
||||
{
|
||||
struct sparc_frame_cache *cache;
|
||||
CORE_ADDR sigcontext_addr, addr;
|
||||
int regnum;
|
||||
|
||||
if (*this_cache)
|
||||
return *this_cache;
|
||||
|
||||
cache = sparc32_frame_cache (next_frame, this_cache);
|
||||
gdb_assert (cache == *this_cache);
|
||||
|
||||
/* ??? What about signal trampolines that aren't frameless? */
|
||||
regnum = SPARC_SP_REGNUM;
|
||||
cache->base = frame_unwind_register_unsigned (next_frame, regnum);
|
||||
|
||||
regnum = SPARC_O1_REGNUM;
|
||||
sigcontext_addr = frame_unwind_register_unsigned (next_frame, regnum);
|
||||
|
||||
cache->pc = frame_pc_unwind (next_frame);
|
||||
addr = sparc32_linux_sigtramp_start (cache->pc);
|
||||
if (addr == 0)
|
||||
{
|
||||
/* If this is a RT signal trampoline, adjust SIGCONTEXT_ADDR
|
||||
accordingly. */
|
||||
addr = sparc32_linux_rt_sigtramp_start (cache->pc);
|
||||
if (addr)
|
||||
sigcontext_addr += 128;
|
||||
else
|
||||
addr = frame_func_unwind (next_frame);
|
||||
}
|
||||
cache->pc = addr;
|
||||
|
||||
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
|
||||
|
||||
cache->saved_regs[SPARC32_PSR_REGNUM].addr = sigcontext_addr + 0;
|
||||
cache->saved_regs[SPARC32_PC_REGNUM].addr = sigcontext_addr + 4;
|
||||
cache->saved_regs[SPARC32_NPC_REGNUM].addr = sigcontext_addr + 8;
|
||||
cache->saved_regs[SPARC32_Y_REGNUM].addr = sigcontext_addr + 12;
|
||||
|
||||
/* Since %g0 is always zero, keep the identity encoding. */
|
||||
for (regnum = SPARC_G1_REGNUM, addr = sigcontext_addr + 20;
|
||||
regnum <= SPARC_O7_REGNUM; regnum++, addr += 4)
|
||||
cache->saved_regs[regnum].addr = addr;
|
||||
|
||||
for (regnum = SPARC_L0_REGNUM, addr = cache->base;
|
||||
regnum <= SPARC_I7_REGNUM; regnum++, addr += 4)
|
||||
cache->saved_regs[regnum].addr = addr;
|
||||
|
||||
return cache;
|
||||
}
|
||||
|
||||
static void
|
||||
sparc32_linux_sigtramp_frame_this_id (struct frame_info *next_frame,
|
||||
void **this_cache,
|
||||
struct frame_id *this_id)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc32_linux_sigtramp_frame_cache (next_frame, this_cache);
|
||||
|
||||
(*this_id) = frame_id_build (cache->base, cache->pc);
|
||||
}
|
||||
|
||||
static void
|
||||
sparc32_linux_sigtramp_frame_prev_register (struct frame_info *next_frame,
|
||||
void **this_cache,
|
||||
int regnum, int *optimizedp,
|
||||
enum lval_type *lvalp,
|
||||
CORE_ADDR *addrp,
|
||||
int *realnump, void *valuep)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc32_linux_sigtramp_frame_cache (next_frame, this_cache);
|
||||
|
||||
trad_frame_prev_register (next_frame, cache->saved_regs, regnum,
|
||||
optimizedp, lvalp, addrp, realnump, valuep);
|
||||
}
|
||||
|
||||
static const struct frame_unwind sparc32_linux_sigtramp_frame_unwind =
|
||||
{
|
||||
SIGTRAMP_FRAME,
|
||||
sparc32_linux_sigtramp_frame_this_id,
|
||||
sparc32_linux_sigtramp_frame_prev_register
|
||||
};
|
||||
|
||||
static const struct frame_unwind *
|
||||
sparc32_linux_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
if (sparc32_linux_pc_in_sigtramp (pc, name))
|
||||
return &sparc32_linux_sigtramp_frame_unwind;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static struct link_map_offsets *
|
||||
sparc32_linux_svr4_fetch_link_map_offsets (void)
|
||||
{
|
||||
static struct link_map_offsets lmo;
|
||||
static struct link_map_offsets *lmp = NULL;
|
||||
|
||||
if (lmp == NULL)
|
||||
{
|
||||
lmp = &lmo;
|
||||
|
||||
/* Everything we need is in the first 8 bytes. */
|
||||
lmo.r_debug_size = 8;
|
||||
lmo.r_map_offset = 4;
|
||||
lmo.r_map_size = 4;
|
||||
|
||||
/* Everything we need is in the first 20 bytes. */
|
||||
lmo.link_map_size = 20;
|
||||
lmo.l_addr_offset = 0;
|
||||
lmo.l_addr_size = 4;
|
||||
lmo.l_name_offset = 4;
|
||||
lmo.l_name_size = 4;
|
||||
lmo.l_next_offset = 12;
|
||||
lmo.l_next_size = 4;
|
||||
lmo.l_prev_offset = 16;
|
||||
lmo.l_prev_size = 4;
|
||||
}
|
||||
|
||||
return lmp;
|
||||
}
|
||||
|
||||
static void
|
||||
sparc32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
{
|
||||
/* GNU/Linux is very similar to Solaris ... */
|
||||
sparc32_sol2_init_abi (info, gdbarch);
|
||||
|
||||
/* ... but doesn't have kernel-assisted single-stepping support. */
|
||||
set_gdbarch_software_single_step (gdbarch, sparc_software_single_step);
|
||||
|
||||
/* GNU/Linux doesn't support the 128-bit `long double' from the psABI. */
|
||||
set_gdbarch_long_double_bit (gdbarch, 64);
|
||||
set_gdbarch_long_double_format (gdbarch, &floatformat_ieee_double_big);
|
||||
|
||||
set_gdbarch_pc_in_sigtramp (gdbarch, sparc32_linux_pc_in_sigtramp);
|
||||
frame_unwind_append_sniffer (gdbarch, sparc32_linux_sigtramp_frame_sniffer);
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, sparc32_linux_svr4_fetch_link_map_offsets);
|
||||
}
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
extern void _initialize_sparc_linux_tdep (void);
|
||||
|
||||
void
|
||||
_initialize_sparc_linux_tdep (void)
|
||||
{
|
||||
gdbarch_register_osabi (bfd_arch_sparc, 0, GDB_OSABI_LINUX,
|
||||
sparc32_linux_init_abi);
|
||||
}
|
480
gdb/sparc-nat.c
480
gdb/sparc-nat.c
@ -1,7 +1,6 @@
|
||||
/* Functions specific to running gdb native on a SPARC running SunOS4.
|
||||
/* Native-dependent code for SPARC.
|
||||
|
||||
Copyright 1989, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
|
||||
2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
Copyright 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -22,46 +21,121 @@
|
||||
|
||||
#include "defs.h"
|
||||
#include "inferior.h"
|
||||
#include "target.h"
|
||||
#include "gdbcore.h"
|
||||
#include "regcache.h"
|
||||
|
||||
#include "sparc-tdep.h"
|
||||
|
||||
#ifdef HAVE_SYS_PARAM_H
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
#include <signal.h>
|
||||
#include "gdb_string.h"
|
||||
#include <sys/ptrace.h>
|
||||
#include "gdb_wait.h"
|
||||
#ifdef __linux__
|
||||
#include <asm/reg.h>
|
||||
#else
|
||||
#ifdef HAVE_MACHINE_REG_H
|
||||
#include <machine/reg.h>
|
||||
#endif
|
||||
#include <sys/user.h>
|
||||
|
||||
/* We don't store all registers immediately when requested, since they
|
||||
get sent over in large chunks anyway. Instead, we accumulate most
|
||||
of the changes and send them over once. "deferred_stores" keeps
|
||||
track of which sets of registers we have locally-changed copies of,
|
||||
so we only need send the groups that have changed. */
|
||||
#include "sparc-tdep.h"
|
||||
#include "sparc-nat.h"
|
||||
|
||||
#define INT_REGS 1
|
||||
#define STACK_REGS 2
|
||||
#define FP_REGS 4
|
||||
/* With some trickery we can use the code in this file for most (if
|
||||
not all) ptrace(2) based SPARC systems, which includes SunOS 4,
|
||||
Linux and the various SPARC BSD's.
|
||||
|
||||
/* Fetch one or more registers from the inferior. REGNO == -1 to get
|
||||
them all. We actually fetch more than requested, when convenient,
|
||||
marking them as valid so we won't fetch them again. */
|
||||
First, we need a data structure for use with ptrace(2). SunOS has
|
||||
`struct regs' and `struct fp_status' in <machine/reg.h>. BSD's
|
||||
have `struct reg' and `struct fpreg' in <machine/reg.h>. GNU/Linux
|
||||
has the same structures as SunOS 4, but they're in <asm/reg.h>,
|
||||
which is a kernel header. As a general rule we avoid including
|
||||
GNU/Linux kernel headers. Fortunately GNU/Linux has a `gregset_t'
|
||||
and a `fpregset_t' that are equivalent to `struct regs' and `struct
|
||||
fp_status' in <sys/ucontext.h>, which is automatically included by
|
||||
<signal.h>. Settling on using the `gregset_t' and `fpregset_t'
|
||||
typedefs, providing them for the other systems, therefore solves
|
||||
the puzzle. */
|
||||
|
||||
#ifdef HAVE_MACHINE_REG_H
|
||||
#ifdef HAVE_STRUCT_REG
|
||||
typedef struct reg gregset_t;
|
||||
typedef struct fpreg fpregset_t;
|
||||
#else
|
||||
typedef struct regs gregset_t;
|
||||
typedef struct fp_status fpregset_t;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Second, we need to remap the BSD ptrace(2) requests to their SunOS
|
||||
equivalents. GNU/Linux already follows SunOS here. */
|
||||
|
||||
#ifndef PTRACE_GETREGS
|
||||
#define PTRACE_GETREGS PT_GETREGS
|
||||
#endif
|
||||
|
||||
#ifndef PTRACE_SETREGS
|
||||
#define PTRACE_SETREGS PT_SETREGS
|
||||
#endif
|
||||
|
||||
#ifndef PTRACE_GETFPREGS
|
||||
#define PTRACE_GETFPREGS PT_GETFPREGS
|
||||
#endif
|
||||
|
||||
#ifndef PTRACE_SETFPREGS
|
||||
#define PTRACE_SETFPREGS PT_SETFPREGS
|
||||
#endif
|
||||
|
||||
/* Register set description. */
|
||||
const struct sparc_gregset *sparc_gregset;
|
||||
void (*sparc_supply_gregset) (const struct sparc_gregset *,
|
||||
struct regcache *, int , const void *);
|
||||
void (*sparc_collect_gregset) (const struct sparc_gregset *,
|
||||
const struct regcache *, int, void *);
|
||||
void (*sparc_supply_fpregset) (struct regcache *, int , const void *);
|
||||
void (*sparc_collect_fpregset) (const struct regcache *, int , void *);
|
||||
int (*sparc_gregset_supplies_p) (int);
|
||||
int (*sparc_fpregset_supplies_p) (int);
|
||||
|
||||
/* Determine whether `gregset_t' contains register REGNUM. */
|
||||
|
||||
int
|
||||
sparc32_gregset_supplies_p (int regnum)
|
||||
{
|
||||
/* Integer registers. */
|
||||
if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_G7_REGNUM)
|
||||
|| (regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM)
|
||||
|| (regnum >= SPARC_L0_REGNUM && regnum <= SPARC_L7_REGNUM)
|
||||
|| (regnum >= SPARC_I0_REGNUM && regnum <= SPARC_I7_REGNUM))
|
||||
return 1;
|
||||
|
||||
/* Control registers. */
|
||||
if (regnum == SPARC32_PC_REGNUM
|
||||
|| regnum == SPARC32_NPC_REGNUM
|
||||
|| regnum == SPARC32_PSR_REGNUM
|
||||
|| regnum == SPARC32_Y_REGNUM)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Determine whether `fpregset_t' contains register REGNUM. */
|
||||
|
||||
int
|
||||
sparc32_fpregset_supplies_p (int regnum)
|
||||
{
|
||||
/* Floating-point registers. */
|
||||
if (regnum >= SPARC_F0_REGNUM && regnum <= SPARC_F31_REGNUM)
|
||||
return 1;
|
||||
|
||||
/* Control registers. */
|
||||
if (regnum == SPARC32_FSR_REGNUM)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
|
||||
for all registers (including the floating-point registers). */
|
||||
|
||||
void
|
||||
fetch_inferior_registers (int regno)
|
||||
fetch_inferior_registers (int regnum)
|
||||
{
|
||||
struct regs inferior_registers;
|
||||
struct fp_status inferior_fp_registers;
|
||||
int i;
|
||||
int fetch_pid;
|
||||
struct regcache *regcache = current_regcache;
|
||||
int pid;
|
||||
|
||||
/* NOTE: cagney/2002-12-03: This code assumes that the currently
|
||||
selected light weight processes' registers can be written
|
||||
@ -76,309 +150,123 @@ fetch_inferior_registers (int regno)
|
||||
These functions should instead be paramaterized with an explicit
|
||||
object (struct regcache, struct thread_info?) into which the LWPs
|
||||
registers can be written. */
|
||||
pid = TIDGET (inferior_ptid);
|
||||
if (pid == 0)
|
||||
pid = PIDGET (inferior_ptid);
|
||||
|
||||
fetch_pid = TIDGET (inferior_ptid);
|
||||
if (fetch_pid == 0)
|
||||
fetch_pid = PIDGET (inferior_ptid);
|
||||
|
||||
/* We should never be called with deferred stores, because a prerequisite
|
||||
for writing regs is to have fetched them all (PREPARE_TO_STORE), sigh. */
|
||||
if (deferred_stores)
|
||||
internal_error (__FILE__, __LINE__, "failed internal consistency check");
|
||||
|
||||
DO_DEFERRED_STORES;
|
||||
|
||||
/* Global and Out regs are fetched directly, as well as the control
|
||||
registers. If we're getting one of the in or local regs,
|
||||
and the stack pointer has not yet been fetched,
|
||||
we have to do that first, since they're found in memory relative
|
||||
to the stack pointer. */
|
||||
if (regno < O7_REGNUM /* including -1 */
|
||||
|| regno >= Y_REGNUM
|
||||
|| (!deprecated_register_valid[SP_REGNUM] && regno < I7_REGNUM))
|
||||
if (regnum == SPARC_G0_REGNUM)
|
||||
{
|
||||
if (0 != ptrace (PTRACE_GETREGS, fetch_pid,
|
||||
(PTRACE_ARG3_TYPE) & inferior_registers, 0))
|
||||
perror ("ptrace_getregs");
|
||||
|
||||
deprecated_registers[DEPRECATED_REGISTER_BYTE (0)] = 0;
|
||||
memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (1)],
|
||||
&inferior_registers.r_g1, 15 * DEPRECATED_REGISTER_RAW_SIZE (G0_REGNUM));
|
||||
*(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (PS_REGNUM)]
|
||||
= inferior_registers.r_ps;
|
||||
*(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (PC_REGNUM)]
|
||||
= inferior_registers.r_pc;
|
||||
*(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (DEPRECATED_NPC_REGNUM)]
|
||||
= inferior_registers.r_npc;
|
||||
*(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (Y_REGNUM)] = inferior_registers.r_y;
|
||||
|
||||
for (i = G0_REGNUM; i <= O7_REGNUM; i++)
|
||||
deprecated_register_valid[i] = 1;
|
||||
deprecated_register_valid[Y_REGNUM] = 1;
|
||||
deprecated_register_valid[PS_REGNUM] = 1;
|
||||
deprecated_register_valid[PC_REGNUM] = 1;
|
||||
deprecated_register_valid[DEPRECATED_NPC_REGNUM] = 1;
|
||||
/* If we don't set these valid, read_register_bytes() rereads
|
||||
all the regs every time it is called! FIXME. */
|
||||
deprecated_register_valid[WIM_REGNUM] = 1; /* Not true yet, FIXME */
|
||||
deprecated_register_valid[TBR_REGNUM] = 1; /* Not true yet, FIXME */
|
||||
deprecated_register_valid[CPS_REGNUM] = 1; /* Not true yet, FIXME */
|
||||
regcache_raw_supply (regcache, SPARC_G0_REGNUM, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Floating point registers */
|
||||
if (regno == -1 ||
|
||||
regno == FPS_REGNUM ||
|
||||
(regno >= FP0_REGNUM && regno <= FP0_REGNUM + 31))
|
||||
if (regnum == -1 || sparc_gregset_supplies_p (regnum))
|
||||
{
|
||||
if (0 != ptrace (PTRACE_GETFPREGS, fetch_pid,
|
||||
(PTRACE_ARG3_TYPE) & inferior_fp_registers,
|
||||
0))
|
||||
perror ("ptrace_getfpregs");
|
||||
memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)],
|
||||
&inferior_fp_registers, sizeof inferior_fp_registers.fpu_fr);
|
||||
memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FPS_REGNUM)],
|
||||
&inferior_fp_registers.Fpu_fsr, sizeof (FPU_FSR_TYPE));
|
||||
for (i = FP0_REGNUM; i <= FP0_REGNUM + 31; i++)
|
||||
deprecated_register_valid[i] = 1;
|
||||
deprecated_register_valid[FPS_REGNUM] = 1;
|
||||
gregset_t regs;
|
||||
|
||||
if (ptrace (PTRACE_GETREGS, pid, (PTRACE_ARG3_TYPE) ®s, 0) == -1)
|
||||
perror_with_name ("Couldn't get registers");
|
||||
|
||||
sparc_supply_gregset (sparc_gregset, regcache, -1, ®s);
|
||||
if (regnum != -1)
|
||||
return;
|
||||
}
|
||||
|
||||
/* These regs are saved on the stack by the kernel. Only read them
|
||||
all (16 ptrace calls!) if we really need them. */
|
||||
if (regno == -1)
|
||||
if (regnum == -1 || sparc_fpregset_supplies_p (regnum))
|
||||
{
|
||||
CORE_ADDR sp = *(unsigned int *) & deprecated_registers[DEPRECATED_REGISTER_BYTE (SP_REGNUM)];
|
||||
target_read_memory (sp, &deprecated_registers[DEPRECATED_REGISTER_BYTE (L0_REGNUM)],
|
||||
16 * DEPRECATED_REGISTER_RAW_SIZE (L0_REGNUM));
|
||||
for (i = L0_REGNUM; i <= I7_REGNUM; i++)
|
||||
deprecated_register_valid[i] = 1;
|
||||
}
|
||||
else if (regno >= L0_REGNUM && regno <= I7_REGNUM)
|
||||
{
|
||||
CORE_ADDR sp = *(unsigned int *) & deprecated_registers[DEPRECATED_REGISTER_BYTE (SP_REGNUM)];
|
||||
i = DEPRECATED_REGISTER_BYTE (regno);
|
||||
if (deprecated_register_valid[regno])
|
||||
printf_unfiltered ("register %d valid and read\n", regno);
|
||||
target_read_memory (sp + i - DEPRECATED_REGISTER_BYTE (L0_REGNUM),
|
||||
&deprecated_registers[i], DEPRECATED_REGISTER_RAW_SIZE (regno));
|
||||
deprecated_register_valid[regno] = 1;
|
||||
fpregset_t fpregs;
|
||||
|
||||
if (ptrace (PTRACE_GETFPREGS, pid, (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
|
||||
perror_with_name ("Couldn't get floating point status");
|
||||
|
||||
sparc_supply_fpregset (regcache, -1, &fpregs);
|
||||
}
|
||||
}
|
||||
|
||||
/* 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 (int regno)
|
||||
store_inferior_registers (int regnum)
|
||||
{
|
||||
struct regs inferior_registers;
|
||||
struct fp_status inferior_fp_registers;
|
||||
int wanna_store = INT_REGS + STACK_REGS + FP_REGS;
|
||||
int store_pid;
|
||||
struct regcache *regcache = current_regcache;
|
||||
int pid;
|
||||
|
||||
/* NOTE: cagney/2002-12-02: See comment in fetch_inferior_registers
|
||||
about threaded assumptions. */
|
||||
store_pid = TIDGET (inferior_ptid);
|
||||
if (store_pid == 0)
|
||||
store_pid = PIDGET (inferior_ptid);
|
||||
pid = TIDGET (inferior_ptid);
|
||||
if (pid == 0)
|
||||
pid = PIDGET (inferior_ptid);
|
||||
|
||||
/* First decide which pieces of machine-state we need to modify.
|
||||
Default for regno == -1 case is all pieces. */
|
||||
if (regno >= 0)
|
||||
if (regnum == -1 || sparc_gregset_supplies_p (regnum))
|
||||
{
|
||||
if (FP0_REGNUM <= regno && regno < FP0_REGNUM + 32)
|
||||
{
|
||||
wanna_store = FP_REGS;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (regno == SP_REGNUM)
|
||||
wanna_store = INT_REGS + STACK_REGS;
|
||||
else if (regno < L0_REGNUM || regno > I7_REGNUM)
|
||||
wanna_store = INT_REGS;
|
||||
else if (regno == FPS_REGNUM)
|
||||
wanna_store = FP_REGS;
|
||||
else
|
||||
wanna_store = STACK_REGS;
|
||||
}
|
||||
}
|
||||
gregset_t regs;
|
||||
|
||||
/* See if we're forcing the stores to happen now, or deferring. */
|
||||
if (regno == -2)
|
||||
{
|
||||
wanna_store = deferred_stores;
|
||||
deferred_stores = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (wanna_store == STACK_REGS)
|
||||
{
|
||||
/* Fall through and just store one stack reg. If we deferred
|
||||
it, we'd have to store them all, or remember more info. */
|
||||
}
|
||||
else
|
||||
{
|
||||
deferred_stores |= wanna_store;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (ptrace (PTRACE_GETREGS, pid, (PTRACE_ARG3_TYPE) ®s, 0) == -1)
|
||||
perror_with_name ("Couldn't get registers");
|
||||
|
||||
if (wanna_store & STACK_REGS)
|
||||
{
|
||||
CORE_ADDR sp = *(unsigned int *) & deprecated_registers[DEPRECATED_REGISTER_BYTE (SP_REGNUM)];
|
||||
sparc_collect_gregset (sparc_gregset, regcache, regnum, ®s);
|
||||
|
||||
if (regno < 0 || regno == SP_REGNUM)
|
||||
if (ptrace (PTRACE_SETREGS, pid, (PTRACE_ARG3_TYPE) ®s, 0) == -1)
|
||||
perror_with_name ("Couldn't write registers");
|
||||
|
||||
/* Deal with the stack regs. */
|
||||
if (regnum == -1 || regnum == SPARC_SP_REGNUM
|
||||
|| (regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM))
|
||||
{
|
||||
if (!deprecated_register_valid[L0_REGNUM + 5])
|
||||
internal_error (__FILE__, __LINE__, "failed internal consistency check");
|
||||
target_write_memory (sp,
|
||||
&deprecated_registers[DEPRECATED_REGISTER_BYTE (L0_REGNUM)],
|
||||
16 * DEPRECATED_REGISTER_RAW_SIZE (L0_REGNUM));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!deprecated_register_valid[regno])
|
||||
internal_error (__FILE__, __LINE__, "failed internal consistency check");
|
||||
target_write_memory (sp + DEPRECATED_REGISTER_BYTE (regno) - DEPRECATED_REGISTER_BYTE (L0_REGNUM),
|
||||
&deprecated_registers[DEPRECATED_REGISTER_BYTE (regno)],
|
||||
DEPRECATED_REGISTER_RAW_SIZE (regno));
|
||||
ULONGEST sp;
|
||||
|
||||
regcache_cooked_read_unsigned (regcache, SPARC_SP_REGNUM, &sp);
|
||||
sparc_collect_rwindow (regcache, sp, regnum);
|
||||
}
|
||||
|
||||
if (regnum != -1)
|
||||
return;
|
||||
}
|
||||
|
||||
if (wanna_store & INT_REGS)
|
||||
if (regnum == -1 || sparc_fpregset_supplies_p (regnum))
|
||||
{
|
||||
if (!deprecated_register_valid[G1_REGNUM])
|
||||
internal_error (__FILE__, __LINE__, "failed internal consistency check");
|
||||
fpregset_t fpregs, saved_fpregs;
|
||||
|
||||
memcpy (&inferior_registers.r_g1,
|
||||
&deprecated_registers[DEPRECATED_REGISTER_BYTE (G1_REGNUM)],
|
||||
15 * DEPRECATED_REGISTER_RAW_SIZE (G1_REGNUM));
|
||||
if (ptrace (PTRACE_GETFPREGS, pid, (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
|
||||
perror_with_name ("Couldn't get floating-point registers");
|
||||
|
||||
inferior_registers.r_ps =
|
||||
*(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (PS_REGNUM)];
|
||||
inferior_registers.r_pc =
|
||||
*(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (PC_REGNUM)];
|
||||
inferior_registers.r_npc =
|
||||
*(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (DEPRECATED_NPC_REGNUM)];
|
||||
inferior_registers.r_y =
|
||||
*(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (Y_REGNUM)];
|
||||
memcpy (&saved_fpregs, &fpregs, sizeof (fpregs));
|
||||
sparc_collect_fpregset (regcache, regnum, &fpregs);
|
||||
|
||||
if (0 != ptrace (PTRACE_SETREGS, store_pid,
|
||||
(PTRACE_ARG3_TYPE) & inferior_registers, 0))
|
||||
perror ("ptrace_setregs");
|
||||
}
|
||||
|
||||
if (wanna_store & FP_REGS)
|
||||
{
|
||||
if (!deprecated_register_valid[FP0_REGNUM + 9])
|
||||
internal_error (__FILE__, __LINE__, "failed internal consistency check");
|
||||
memcpy (&inferior_fp_registers,
|
||||
&deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)],
|
||||
sizeof inferior_fp_registers.fpu_fr);
|
||||
memcpy (&inferior_fp_registers.Fpu_fsr,
|
||||
&deprecated_registers[DEPRECATED_REGISTER_BYTE (FPS_REGNUM)],
|
||||
sizeof (FPU_FSR_TYPE));
|
||||
if (0 !=
|
||||
ptrace (PTRACE_SETFPREGS, store_pid,
|
||||
(PTRACE_ARG3_TYPE) & inferior_fp_registers, 0))
|
||||
perror ("ptrace_setfpregs");
|
||||
}
|
||||
}
|
||||
|
||||
/* Provide registers to GDB from a core file.
|
||||
|
||||
CORE_REG_SECT points to an array of bytes, which are the contents
|
||||
of a `note' from a core file which BFD thinks might contain
|
||||
register contents. CORE_REG_SIZE is its size.
|
||||
|
||||
WHICH says which register set corelow suspects this is:
|
||||
0 --- the general-purpose register set
|
||||
2 --- the floating-point register set
|
||||
|
||||
IGNORE is unused. */
|
||||
|
||||
static void
|
||||
fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
|
||||
int which, CORE_ADDR ignore)
|
||||
{
|
||||
|
||||
if (which == 0)
|
||||
{
|
||||
|
||||
/* Integer registers */
|
||||
|
||||
#define gregs ((struct regs *)core_reg_sect)
|
||||
/* G0 *always* holds 0. */
|
||||
*(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (0)] = 0;
|
||||
|
||||
/* The globals and output registers. */
|
||||
memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (G1_REGNUM)], &gregs->r_g1,
|
||||
15 * DEPRECATED_REGISTER_RAW_SIZE (G1_REGNUM));
|
||||
*(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (PS_REGNUM)] = gregs->r_ps;
|
||||
*(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (PC_REGNUM)] = gregs->r_pc;
|
||||
*(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (DEPRECATED_NPC_REGNUM)] = gregs->r_npc;
|
||||
*(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (Y_REGNUM)] = gregs->r_y;
|
||||
|
||||
/* My best guess at where to get the locals and input
|
||||
registers is exactly where they usually are, right above
|
||||
the stack pointer. If the core dump was caused by a bus error
|
||||
from blowing away the stack pointer (as is possible) then this
|
||||
won't work, but it's worth the try. */
|
||||
{
|
||||
int sp;
|
||||
|
||||
sp = *(int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (SP_REGNUM)];
|
||||
if (0 != target_read_memory (sp,
|
||||
&deprecated_registers[DEPRECATED_REGISTER_BYTE (L0_REGNUM)],
|
||||
16 * DEPRECATED_REGISTER_RAW_SIZE (L0_REGNUM)))
|
||||
{
|
||||
/* fprintf_unfiltered so user can still use gdb */
|
||||
fprintf_unfiltered (gdb_stderr,
|
||||
"Couldn't read input and local registers from core file\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (which == 2)
|
||||
{
|
||||
|
||||
/* Floating point registers */
|
||||
|
||||
#define fpuregs ((struct fpu *) core_reg_sect)
|
||||
if (core_reg_size >= sizeof (struct fpu))
|
||||
/* Writing the floating-point registers will fail on NetBSD with
|
||||
EINVAL if the inferior process doesn't have an FPU state
|
||||
(i.e. if it didn't use the FPU yet). Therefore we don't try
|
||||
to write the registers if nothing changed. */
|
||||
if (memcmp (&saved_fpregs, &fpregs, sizeof (fpregs)) != 0)
|
||||
{
|
||||
memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)],
|
||||
fpuregs->fpu_regs, sizeof (fpuregs->fpu_regs));
|
||||
memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FPS_REGNUM)],
|
||||
&fpuregs->fpu_fsr, sizeof (FPU_FSR_TYPE));
|
||||
if (ptrace (PTRACE_SETFPREGS, pid,
|
||||
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
|
||||
perror_with_name ("Couldn't write floating-point registers");
|
||||
}
|
||||
else
|
||||
fprintf_unfiltered (gdb_stderr, "Couldn't read float regs from core file\n");
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
kernel_u_size (void)
|
||||
{
|
||||
return (sizeof (struct user));
|
||||
if (regnum != -1)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Register that we are able to handle sparc core file formats.
|
||||
FIXME: is this really bfd_target_unknown_flavour? */
|
||||
|
||||
static struct core_fns sparc_core_fns =
|
||||
{
|
||||
bfd_target_unknown_flavour, /* core_flavour */
|
||||
default_check_format, /* check_format */
|
||||
default_core_sniffer, /* core_sniffer */
|
||||
fetch_core_registers, /* core_read_registers */
|
||||
NULL /* next */
|
||||
};
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
void _initialize_sparc_nat (void);
|
||||
|
||||
void
|
||||
_initialize_core_sparc (void)
|
||||
_initialize_sparc_nat (void)
|
||||
{
|
||||
add_core_fns (&sparc_core_fns);
|
||||
/* Deafult to using SunOS 4 register sets. */
|
||||
if (sparc_gregset == NULL)
|
||||
sparc_gregset = &sparc32_sunos4_gregset;
|
||||
if (sparc_supply_gregset == NULL)
|
||||
sparc_supply_gregset = sparc32_supply_gregset;
|
||||
if (sparc_collect_gregset == NULL)
|
||||
sparc_collect_gregset = sparc32_collect_gregset;
|
||||
if (sparc_supply_fpregset == NULL)
|
||||
sparc_supply_fpregset = sparc32_supply_fpregset;
|
||||
if (sparc_collect_fpregset == NULL)
|
||||
sparc_collect_fpregset = sparc32_collect_fpregset;
|
||||
if (sparc_gregset_supplies_p == NULL)
|
||||
sparc_gregset_supplies_p = sparc32_gregset_supplies_p;
|
||||
if (sparc_fpregset_supplies_p == NULL)
|
||||
sparc_fpregset_supplies_p = sparc32_fpregset_supplies_p;
|
||||
}
|
||||
|
40
gdb/sparc-nat.h
Normal file
40
gdb/sparc-nat.h
Normal file
@ -0,0 +1,40 @@
|
||||
/* Native-dependent code for SPARC.
|
||||
|
||||
Copyright 2003 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 SPARC_NAT_H
|
||||
#define SPARC_NAT_H 1
|
||||
|
||||
struct sparc_gregset;
|
||||
|
||||
extern const struct sparc_gregset *sparc_gregset;
|
||||
extern void (*sparc_supply_gregset) (const struct sparc_gregset *,
|
||||
struct regcache *, int , const void *);
|
||||
extern void (*sparc_collect_gregset) (const struct sparc_gregset *,
|
||||
const struct regcache *, int, void *);
|
||||
extern void (*sparc_supply_fpregset) (struct regcache *, int , const void *);
|
||||
extern void (*sparc_collect_fpregset) (const struct regcache *, int , void *);
|
||||
extern int (*sparc_gregset_supplies_p) (int);
|
||||
extern int (*sparc_fpregset_supplies_p) (int);
|
||||
|
||||
extern int sparc32_gregset_supplies_p (int regnum);
|
||||
extern int sparc32_fpregset_supplies_p (int regnum);
|
||||
|
||||
#endif /* sparc-nat.h */
|
98
gdb/sparc-sol2-nat.c
Normal file
98
gdb/sparc-sol2-nat.c
Normal file
@ -0,0 +1,98 @@
|
||||
/* Native-dependent code for Solaris SPARC.
|
||||
|
||||
Copyright 2003, 2004 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 "regcache.h"
|
||||
|
||||
#include <sys/procfs.h>
|
||||
#include "gregset.h"
|
||||
|
||||
#include "sparc-tdep.h"
|
||||
|
||||
/* This file provids the (temporary) glue between the Solaris SPARC
|
||||
target dependent code and the machine independent SVR4 /proc
|
||||
support. */
|
||||
|
||||
/* Solaris 7 (Solaris 2.7, SunOS 5.7) and up support two process data
|
||||
models, the traditional 32-bit data model (ILP32) and the 64-bit
|
||||
data model (LP64). The format of /proc depends on the data model
|
||||
of the observer (the controlling process, GDB in our case). The
|
||||
Solaris header files conveniently define PR_MODEL_NATIVE to the
|
||||
data model of the controlling process. If its value is
|
||||
PR_MODEL_LP64, we know that GDB is being compiled as a 64-bit
|
||||
program.
|
||||
|
||||
GNU/Linux uses the same formats as Solaris for its core files (but
|
||||
not for ptrace(2)). The GNU/Linux headers don't define
|
||||
PR_MODEL_NATIVE though. Therefore we rely on the __arch64__ define
|
||||
provided by GCC to determine the appropriate data model.
|
||||
|
||||
Note that a 32-bit GDB won't be able to debug a 64-bit target
|
||||
process using /proc on Solaris. */
|
||||
|
||||
#if (defined (__arch64__) ||
|
||||
(defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64))
|
||||
|
||||
#include "sparc64-tdep.h"
|
||||
|
||||
#define sparc_supply_gregset sparc64_supply_gregset
|
||||
#define sparc_supply_fpregset sparc64_supply_fpregset
|
||||
#define sparc_collect_gregset sparc64_collect_gregset
|
||||
#define sparc_collect_fpregset sparc64_collect_fpregset
|
||||
|
||||
#define sparc_sol2_gregset sparc64_sol2_gregset
|
||||
#define sparc_sol2_fpregset sparc64_sol2_fpregset
|
||||
|
||||
#else
|
||||
|
||||
#define sparc_supply_gregset sparc32_supply_gregset
|
||||
#define sparc_supply_fpregset sparc32_supply_fpregset
|
||||
#define sparc_collect_gregset sparc32_collect_gregset
|
||||
#define sparc_collect_fpregset sparc32_collect_fpregset
|
||||
|
||||
#define sparc_sol2_gregset sparc32_sol2_gregset
|
||||
#define sparc_sol2_fpregset sparc32_sol2_fpregset
|
||||
|
||||
#endif
|
||||
|
||||
void
|
||||
supply_gregset (prgregset_t *gregs)
|
||||
{
|
||||
sparc_supply_gregset (&sparc_sol2_gregset, current_regcache, -1, gregs);
|
||||
}
|
||||
|
||||
void
|
||||
supply_fpregset (prfpregset_t *fpregs)
|
||||
{
|
||||
sparc_supply_fpregset (current_regcache, -1, fpregs);
|
||||
}
|
||||
|
||||
void
|
||||
fill_gregset (prgregset_t *gregs, int regnum)
|
||||
{
|
||||
sparc_collect_gregset (&sparc_sol2_gregset, current_regcache, regnum, gregs);
|
||||
}
|
||||
|
||||
void
|
||||
fill_fpregset (prfpregset_t *fpregs, int regnum)
|
||||
{
|
||||
sparc_collect_fpregset (current_regcache, regnum, fpregs);
|
||||
}
|
201
gdb/sparc-sol2-tdep.c
Normal file
201
gdb/sparc-sol2-tdep.c
Normal file
@ -0,0 +1,201 @@
|
||||
/* Target-dependent code for Solaris SPARC.
|
||||
|
||||
Copyright 2003 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 "frame-unwind.h"
|
||||
#include "gdbcore.h"
|
||||
#include "symtab.h"
|
||||
#include "objfiles.h"
|
||||
#include "osabi.h"
|
||||
#include "regcache.h"
|
||||
#include "target.h"
|
||||
#include "trad-frame.h"
|
||||
|
||||
#include "gdb_assert.h"
|
||||
#include "gdb_string.h"
|
||||
|
||||
#include "sparc-tdep.h"
|
||||
|
||||
/* From <sys/regset.h>. */
|
||||
const struct sparc_gregset sparc32_sol2_gregset =
|
||||
{
|
||||
32 * 4, /* %psr */
|
||||
33 * 4, /* %pc */
|
||||
34 * 4, /* %npc */
|
||||
35 * 4, /* %y */
|
||||
36 * 4, /* %wim */
|
||||
37 * 4, /* %tbr */
|
||||
1 * 4, /* %g1 */
|
||||
16 * 4, /* %l0 */
|
||||
};
|
||||
|
||||
|
||||
/* The Solaris signal trampolines reside in libc. For normal signals,
|
||||
the function `sigacthandler' is used. This signal trampoline will
|
||||
call the signal handler using the System V calling convention,
|
||||
where the third argument is a pointer to an instance of
|
||||
`ucontext_t', which has a member `uc_mcontext' that contains the
|
||||
saved registers. Incidentally, the kernel passes the `ucontext_t'
|
||||
pointer as the third argument of the signal trampoline too, and
|
||||
`sigacthandler' simply passes it on. However, if you link your
|
||||
program with "-L/usr/ucblib -R/usr/ucblib -lucb", the function
|
||||
`ucbsigvechandler' will be used, which invokes the using the BSD
|
||||
convention, where the third argument is a pointer to an instance of
|
||||
`struct sigcontext'. It is the `ucbsigvechandler' function that
|
||||
converts the `ucontext_t' to a `sigcontext', and back. Unless the
|
||||
signal handler modifies the `struct sigcontext' we can safely
|
||||
ignore this. */
|
||||
|
||||
int
|
||||
sparc_sol2_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
{
|
||||
return (name && (strcmp (name, "sigacthandler") == 0
|
||||
|| strcmp (name, "ucbsigvechandler") == 0));
|
||||
}
|
||||
|
||||
static struct sparc_frame_cache *
|
||||
sparc32_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
|
||||
void **this_cache)
|
||||
{
|
||||
struct sparc_frame_cache *cache;
|
||||
CORE_ADDR mcontext_addr, addr;
|
||||
int regnum;
|
||||
|
||||
if (*this_cache)
|
||||
return *this_cache;
|
||||
|
||||
cache = sparc_frame_cache (next_frame, this_cache);
|
||||
gdb_assert (cache == *this_cache);
|
||||
|
||||
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
|
||||
|
||||
/* The third argument is a pointer to an instance of `ucontext_t',
|
||||
which has a member `uc_mcontext' that contains the saved
|
||||
registers. */
|
||||
regnum = (cache->frameless_p ? SPARC_O2_REGNUM : SPARC_I2_REGNUM);
|
||||
mcontext_addr = frame_unwind_register_unsigned (next_frame, regnum) + 40;
|
||||
|
||||
cache->saved_regs[SPARC32_PSR_REGNUM].addr = mcontext_addr + 0 * 4;
|
||||
cache->saved_regs[SPARC32_PC_REGNUM].addr = mcontext_addr + 1 * 4;
|
||||
cache->saved_regs[SPARC32_NPC_REGNUM].addr = mcontext_addr + 2 * 4;
|
||||
cache->saved_regs[SPARC32_Y_REGNUM].addr = mcontext_addr + 3 * 4;
|
||||
|
||||
/* Since %g0 is always zero, keep the identity encoding. */
|
||||
for (regnum = SPARC_G1_REGNUM, addr = mcontext_addr + 4 * 4;
|
||||
regnum <= SPARC_O7_REGNUM; regnum++, addr += 4)
|
||||
cache->saved_regs[regnum].addr = addr;
|
||||
|
||||
if (get_frame_memory_unsigned (next_frame, mcontext_addr + 19 * 4, 4))
|
||||
{
|
||||
/* The register windows haven't been flushed. */
|
||||
for (regnum = SPARC_L0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++)
|
||||
trad_frame_set_unknown (cache->saved_regs, regnum);
|
||||
}
|
||||
else
|
||||
{
|
||||
addr = cache->saved_regs[SPARC_SP_REGNUM].addr;
|
||||
addr = get_frame_memory_unsigned (next_frame, addr, 4);
|
||||
for (regnum = SPARC_L0_REGNUM;
|
||||
regnum <= SPARC_I7_REGNUM; regnum++, addr += 4)
|
||||
cache->saved_regs[regnum].addr = addr;
|
||||
}
|
||||
|
||||
return cache;
|
||||
}
|
||||
|
||||
static void
|
||||
sparc32_sol2_sigtramp_frame_this_id (struct frame_info *next_frame,
|
||||
void **this_cache,
|
||||
struct frame_id *this_id)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc32_sol2_sigtramp_frame_cache (next_frame, this_cache);
|
||||
|
||||
(*this_id) = frame_id_build (cache->base, cache->pc);
|
||||
}
|
||||
|
||||
static void
|
||||
sparc32_sol2_sigtramp_frame_prev_register (struct frame_info *next_frame,
|
||||
void **this_cache,
|
||||
int regnum, int *optimizedp,
|
||||
enum lval_type *lvalp,
|
||||
CORE_ADDR *addrp,
|
||||
int *realnump, void *valuep)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc32_sol2_sigtramp_frame_cache (next_frame, this_cache);
|
||||
|
||||
trad_frame_prev_register (next_frame, cache->saved_regs, regnum,
|
||||
optimizedp, lvalp, addrp, realnump, valuep);
|
||||
}
|
||||
|
||||
static const struct frame_unwind sparc32_sol2_sigtramp_frame_unwind =
|
||||
{
|
||||
SIGTRAMP_FRAME,
|
||||
sparc32_sol2_sigtramp_frame_this_id,
|
||||
sparc32_sol2_sigtramp_frame_prev_register
|
||||
};
|
||||
|
||||
static const struct frame_unwind *
|
||||
sparc32_sol2_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
if (sparc_sol2_pc_in_sigtramp (pc, name))
|
||||
return &sparc32_sol2_sigtramp_frame_unwind;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
sparc32_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
{
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||
|
||||
/* Solaris has SVR4-style shared libraries... */
|
||||
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
|
||||
/* ...which means that we need some special handling when doing
|
||||
prologue analysis. */
|
||||
tdep->plt_entry_size = 12;
|
||||
|
||||
/* Solaris has kernel-assisted single-stepping support. */
|
||||
set_gdbarch_software_single_step (gdbarch, NULL);
|
||||
|
||||
set_gdbarch_pc_in_sigtramp (gdbarch, sparc_sol2_pc_in_sigtramp);
|
||||
frame_unwind_append_sniffer (gdbarch, sparc32_sol2_sigtramp_frame_sniffer);
|
||||
}
|
||||
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
void _initialize_sparc_sol2_tdep (void);
|
||||
|
||||
void
|
||||
_initialize_sparc_sol2_tdep (void)
|
||||
{
|
||||
gdbarch_register_osabi (bfd_arch_sparc, 0,
|
||||
GDB_OSABI_SOLARIS, sparc32_sol2_init_abi);
|
||||
}
|
4244
gdb/sparc-tdep.c
4244
gdb/sparc-tdep.c
File diff suppressed because it is too large
Load Diff
174
gdb/sparc-tdep.h
174
gdb/sparc-tdep.h
@ -1,6 +1,6 @@
|
||||
/* Target-dependent code for the SPARC for GDB, the GNU debugger.
|
||||
/* Target-dependent code for SPARC.
|
||||
|
||||
Copyright 2003 Free Software Foundation, Inc.
|
||||
Copyright 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -19,4 +19,172 @@
|
||||
Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
extern int sparc_y_regnum (void);
|
||||
#ifndef SPARC_TDEP_H
|
||||
#define SPARC_TDEP_H 1
|
||||
|
||||
struct gdbarch;
|
||||
struct regcache;
|
||||
struct trad_frame_saved_reg;
|
||||
|
||||
/* Register offsets for the general-purpose register set. */
|
||||
|
||||
struct sparc_gregset
|
||||
{
|
||||
int r_psr_offset;
|
||||
int r_pc_offset;
|
||||
int r_npc_offset;
|
||||
int r_y_offset;
|
||||
int r_wim_offset;
|
||||
int r_tbr_offset;
|
||||
int r_g1_offset;
|
||||
int r_l0_offset;
|
||||
int r_y_size;
|
||||
};
|
||||
|
||||
/* SPARC architecture-specific information. */
|
||||
|
||||
struct gdbarch_tdep
|
||||
{
|
||||
/* Register numbers for the PN and nPC registers. The definitions
|
||||
for (64-bit) UltraSPARC differ from the (32-bit) SPARC
|
||||
definitions. */
|
||||
int pc_regnum;
|
||||
int npc_regnum;
|
||||
|
||||
/* Offset of saved PC in jmp_buf. */
|
||||
int jb_pc_offset;
|
||||
|
||||
/* Size of an Procedure Linkage Table (PLT) entry, 0 if we shouldn't
|
||||
treat the PLT special when doing prologue analysis. */
|
||||
size_t plt_entry_size;
|
||||
};
|
||||
|
||||
/* Register numbers of various important registers. */
|
||||
|
||||
enum sparc_regnum
|
||||
{
|
||||
SPARC_G0_REGNUM, /* %g0 */
|
||||
SPARC_G1_REGNUM,
|
||||
SPARC_G2_REGNUM,
|
||||
SPARC_G3_REGNUM,
|
||||
SPARC_G4_REGNUM,
|
||||
SPARC_G5_REGNUM,
|
||||
SPARC_G6_REGNUM,
|
||||
SPARC_G7_REGNUM, /* %g7 */
|
||||
SPARC_O0_REGNUM, /* %o0 */
|
||||
SPARC_O1_REGNUM,
|
||||
SPARC_O2_REGNUM,
|
||||
SPARC_O3_REGNUM,
|
||||
SPARC_O4_REGNUM,
|
||||
SPARC_O5_REGNUM,
|
||||
SPARC_SP_REGNUM, /* %sp (%o6) */
|
||||
SPARC_O7_REGNUM, /* %o7 */
|
||||
SPARC_L0_REGNUM, /* %l0 */
|
||||
SPARC_L1_REGNUM,
|
||||
SPARC_L2_REGNUM,
|
||||
SPARC_L3_REGNUM,
|
||||
SPARC_L4_REGNUM,
|
||||
SPARC_L5_REGNUM,
|
||||
SPARC_L6_REGNUM,
|
||||
SPARC_L7_REGNUM, /* %l7 */
|
||||
SPARC_I0_REGNUM, /* %i0 */
|
||||
SPARC_I1_REGNUM,
|
||||
SPARC_I2_REGNUM,
|
||||
SPARC_I3_REGNUM,
|
||||
SPARC_I4_REGNUM,
|
||||
SPARC_I5_REGNUM,
|
||||
SPARC_FP_REGNUM, /* %fp (%i6) */
|
||||
SPARC_I7_REGNUM, /* %i7 */
|
||||
SPARC_F0_REGNUM, /* %f0 */
|
||||
SPARC_F1_REGNUM,
|
||||
SPARC_F31_REGNUM /* %f31 */
|
||||
= SPARC_F0_REGNUM + 31
|
||||
};
|
||||
|
||||
enum sparc32_regnum
|
||||
{
|
||||
SPARC32_Y_REGNUM /* %y */
|
||||
= SPARC_F31_REGNUM + 1,
|
||||
SPARC32_PSR_REGNUM, /* %psr */
|
||||
SPARC32_WIM_REGNUM, /* %wim */
|
||||
SPARC32_TBR_REGNUM, /* %tbr */
|
||||
SPARC32_PC_REGNUM, /* %pc */
|
||||
SPARC32_NPC_REGNUM, /* %npc */
|
||||
SPARC32_FSR_REGNUM, /* %fsr */
|
||||
SPARC32_CSR_REGNUM, /* %csr */
|
||||
|
||||
/* Pseudo registers. */
|
||||
SPARC32_D0_REGNUM, /* %d0 */
|
||||
SPARC32_D30_REGNUM /* %d30 */
|
||||
= SPARC32_D0_REGNUM + 15
|
||||
};
|
||||
|
||||
|
||||
struct sparc_frame_cache
|
||||
{
|
||||
/* Base address. */
|
||||
CORE_ADDR base;
|
||||
CORE_ADDR pc;
|
||||
|
||||
/* Do we have a frame? */
|
||||
int frameless_p;
|
||||
|
||||
/* Do we have a Structure, Union or Quad-Precision return value?. */
|
||||
int struct_return_p;
|
||||
|
||||
/* Table of saved registers. */
|
||||
struct trad_frame_saved_reg *saved_regs;
|
||||
};
|
||||
|
||||
/* Fetch the instruction at PC. */
|
||||
extern unsigned long sparc_fetch_instruction (CORE_ADDR pc);
|
||||
|
||||
extern CORE_ADDR sparc_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
|
||||
struct sparc_frame_cache *cache);
|
||||
|
||||
extern struct sparc_frame_cache *
|
||||
sparc_frame_cache (struct frame_info *next_frame, void **this_cache);
|
||||
|
||||
extern struct sparc_frame_cache *
|
||||
sparc32_frame_cache (struct frame_info *next_frame, void **this_cache);
|
||||
|
||||
|
||||
|
||||
extern void sparc_software_single_step (enum target_signal sig,
|
||||
int insert_breakpoints_p);
|
||||
|
||||
extern void sparc_supply_rwindow (struct regcache *regcache,
|
||||
CORE_ADDR sp, int regnum);
|
||||
extern void sparc_collect_rwindow (const struct regcache *regcache,
|
||||
CORE_ADDR sp, int regnum);
|
||||
|
||||
/* Register offsets for SunOS 4. */
|
||||
extern const struct sparc_gregset sparc32_sunos4_gregset;
|
||||
|
||||
extern void sparc32_supply_gregset (const struct sparc_gregset *gregset,
|
||||
struct regcache *regcache,
|
||||
int regnum, const void *gregs);
|
||||
extern void sparc32_collect_gregset (const struct sparc_gregset *gregset,
|
||||
const struct regcache *regcache,
|
||||
int regnum, void *gregs);
|
||||
extern void sparc32_supply_fpregset (struct regcache *regcache,
|
||||
int regnum, const void *fpregs);
|
||||
extern void sparc32_collect_fpregset (const struct regcache *regcache,
|
||||
int regnum, void *fpregs);
|
||||
|
||||
/* Functions and variables exported from sparc-sol2-tdep.c. */
|
||||
|
||||
/* Register offsets for Solaris 2. */
|
||||
extern const struct sparc_gregset sparc32_sol2_gregset;
|
||||
|
||||
extern int sparc_sol2_pc_in_sigtramp (CORE_ADDR pc, char *name);
|
||||
|
||||
extern void sparc32_sol2_init_abi (struct gdbarch_info info,
|
||||
struct gdbarch *gdbarch);
|
||||
|
||||
/* Functions and variables exported from sparcnbsd-tdep.c. */
|
||||
|
||||
/* Register offsets for NetBSD. */
|
||||
extern const struct sparc_gregset sparc32nbsd_gregset;
|
||||
|
||||
#endif /* sparc-tdep.h */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Native-dependent code for SPARC BSD's.
|
||||
/* Native-dependent code for GNU/Linux UltraSPARC.
|
||||
|
||||
Copyright 2003 Free Software Foundation, Inc.
|
||||
|
||||
@ -19,19 +19,30 @@
|
||||
Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifndef SPARCBSD_NAT_H
|
||||
#define SPARCBSD_NAT_H
|
||||
#include "defs.h"
|
||||
|
||||
/* Functions translating between `struct reg' and `struct fpreg' and
|
||||
GDB's register cache. */
|
||||
extern void (*sparcbsd_supply_reg)(const char *, int);
|
||||
extern void (*sparcbsd_fill_reg)(char *, int);
|
||||
extern void (*sparcbsd_supply_fpreg)(const char *, int);
|
||||
extern void (*sparcbsd_fill_fpreg)(char *, int);
|
||||
#include "sparc64-tdep.h"
|
||||
#include "sparc-nat.h"
|
||||
|
||||
/* Functions indication whether `struct reg' or `struct fpreg' provides
|
||||
a certain register. */
|
||||
extern int (*sparcbsd_reg_supplies_p)(int);
|
||||
extern int (*sparcbsd_fpreg_supplies_p)(int);
|
||||
static const struct sparc_gregset sparc64_linux_ptrace_gregset =
|
||||
{
|
||||
16 * 8, /* "tstate" */
|
||||
17 * 8, /* %pc */
|
||||
18 * 8, /* %npc */
|
||||
19 * 8, /* %y */
|
||||
-1, /* %wim */
|
||||
-1, /* %tbr */
|
||||
0 * 8, /* %g1 */
|
||||
-1, /* %l0 */
|
||||
4 /* sizeof (%y) */
|
||||
};
|
||||
|
||||
|
||||
#endif /* sparcbsd-nat.h */
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
void _initialize_sparc64_linux_nat (void);
|
||||
|
||||
void
|
||||
_initialize_sparc64_linux_nat (void)
|
||||
{
|
||||
sparc_gregset = &sparc64_linux_ptrace_gregset;
|
||||
}
|
82
gdb/sparc64-linux-tdep.c
Normal file
82
gdb/sparc64-linux-tdep.c
Normal file
@ -0,0 +1,82 @@
|
||||
/* Target-dependent code for GNU/Linux UltraSPARC.
|
||||
|
||||
Copyright 2003 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 "gdbarch.h"
|
||||
#include "osabi.h"
|
||||
#include "solib-svr4.h"
|
||||
|
||||
#include "sparc64-tdep.h"
|
||||
|
||||
static struct link_map_offsets *
|
||||
sparc64_linux_svr4_fetch_link_map_offsets (void)
|
||||
{
|
||||
static struct link_map_offsets lmo;
|
||||
static struct link_map_offsets *lmp = NULL;
|
||||
|
||||
if (lmp == NULL)
|
||||
{
|
||||
lmp = &lmo;
|
||||
|
||||
/* Everything we need is in the first 16 bytes. */
|
||||
lmo.r_debug_size = 16;
|
||||
lmo.r_map_offset = 8;
|
||||
lmo.r_map_size = 8;
|
||||
|
||||
/* Everything we need is in the first 40 bytes. */
|
||||
lmo.link_map_size = 40;
|
||||
lmo.l_addr_offset = 0;
|
||||
lmo.l_addr_size = 8;
|
||||
lmo.l_name_offset = 8;
|
||||
lmo.l_name_size = 8;
|
||||
lmo.l_next_offset = 24;
|
||||
lmo.l_next_size = 8;
|
||||
lmo.l_prev_offset = 32;
|
||||
lmo.l_prev_size = 8;
|
||||
}
|
||||
|
||||
return lmp;
|
||||
}
|
||||
|
||||
static void
|
||||
sparc64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
{
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||
|
||||
/* GNU/Linux is very similar to Solaris ... */
|
||||
sparc64_sol2_init_abi (info, gdbarch);
|
||||
|
||||
/* ... but doesn't have kernel-assisted single-stepping support. */
|
||||
set_gdbarch_software_single_step (gdbarch, sparc_software_single_step);
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, sparc64_linux_svr4_fetch_link_map_offsets);
|
||||
}
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
extern void _initialize_sparc64_linux_tdep (void);
|
||||
|
||||
void
|
||||
_initialize_sparc64_linux_tdep (void)
|
||||
{
|
||||
gdbarch_register_osabi (bfd_arch_sparc, bfd_mach_sparc_v9,
|
||||
GDB_OSABI_LINUX, sparc64_linux_init_abi);
|
||||
}
|
87
gdb/sparc64-nat.c
Normal file
87
gdb/sparc64-nat.c
Normal file
@ -0,0 +1,87 @@
|
||||
/* Native-dependent code for GNU/Linux UltraSPARC.
|
||||
|
||||
Copyright 2003 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 "gdbarch.h"
|
||||
|
||||
#include "sparc64-tdep.h"
|
||||
#include "sparc-nat.h"
|
||||
|
||||
/* Determine whether `gregset_t' contains register REGNUM. */
|
||||
|
||||
static int
|
||||
sparc64_gregset_supplies_p (int regnum)
|
||||
{
|
||||
if (gdbarch_ptr_bit (current_gdbarch) == 32)
|
||||
return sparc32_gregset_supplies_p (regnum);
|
||||
|
||||
/* Integer registers. */
|
||||
if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_G7_REGNUM)
|
||||
|| (regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM)
|
||||
|| (regnum >= SPARC_L0_REGNUM && regnum <= SPARC_L7_REGNUM)
|
||||
|| (regnum >= SPARC_I0_REGNUM && regnum <= SPARC_I7_REGNUM))
|
||||
return 1;
|
||||
|
||||
/* Control registers. */
|
||||
if (regnum == SPARC64_PC_REGNUM
|
||||
|| regnum == SPARC64_NPC_REGNUM
|
||||
|| regnum == SPARC64_STATE_REGNUM
|
||||
|| regnum == SPARC64_Y_REGNUM
|
||||
|| regnum == SPARC64_FPRS_REGNUM)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Determine whether `fpregset_t' contains register REGNUM. */
|
||||
|
||||
static int
|
||||
sparc64_fpregset_supplies_p (int regnum)
|
||||
{
|
||||
if (gdbarch_ptr_bit (current_gdbarch) == 32)
|
||||
return sparc32_fpregset_supplies_p (regnum);
|
||||
|
||||
/* Floating-point registers. */
|
||||
if ((regnum >= SPARC_F0_REGNUM && regnum <= SPARC_F31_REGNUM)
|
||||
|| (regnum >= SPARC64_F32_REGNUM && regnum <= SPARC64_F62_REGNUM))
|
||||
return 1;
|
||||
|
||||
/* Control registers. */
|
||||
if (regnum == SPARC64_FSR_REGNUM)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
void _initialize_sparc64_nat (void);
|
||||
|
||||
void
|
||||
_initialize_sparc64_nat (void)
|
||||
{
|
||||
sparc_supply_gregset = sparc64_supply_gregset;
|
||||
sparc_collect_gregset = sparc64_collect_gregset;
|
||||
sparc_supply_fpregset = sparc64_supply_fpregset;
|
||||
sparc_collect_fpregset = sparc64_collect_fpregset;
|
||||
sparc_gregset_supplies_p = sparc64_gregset_supplies_p;
|
||||
sparc_fpregset_supplies_p = sparc64_fpregset_supplies_p;
|
||||
}
|
182
gdb/sparc64-sol2-tdep.c
Normal file
182
gdb/sparc64-sol2-tdep.c
Normal file
@ -0,0 +1,182 @@
|
||||
/* Target-dependent code for Solaris UltraSPARC.
|
||||
|
||||
Copyright 2003, 2004 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 "frame-unwind.h"
|
||||
#include "gdbarch.h"
|
||||
#include "symtab.h"
|
||||
#include "objfiles.h"
|
||||
#include "osabi.h"
|
||||
#include "trad-frame.h"
|
||||
|
||||
#include "gdb_assert.h"
|
||||
|
||||
#include "sparc64-tdep.h"
|
||||
|
||||
/* From <sys/regset.h>. */
|
||||
const struct sparc_gregset sparc64_sol2_gregset =
|
||||
{
|
||||
32 * 8, /* "tstate" */
|
||||
33 * 8, /* %pc */
|
||||
34 * 8, /* %npc */
|
||||
35 * 8, /* %y */
|
||||
-1, /* %wim */
|
||||
-1, /* %tbr */
|
||||
1 * 8, /* %g1 */
|
||||
16 * 8, /* %l0 */
|
||||
8 /* sizeof (%y) */
|
||||
};
|
||||
|
||||
|
||||
static struct sparc_frame_cache *
|
||||
sparc64_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
|
||||
void **this_cache)
|
||||
{
|
||||
struct sparc_frame_cache *cache;
|
||||
CORE_ADDR mcontext_addr, addr;
|
||||
int regnum;
|
||||
|
||||
if (*this_cache)
|
||||
return *this_cache;
|
||||
|
||||
cache = sparc_frame_cache (next_frame, this_cache);
|
||||
gdb_assert (cache == *this_cache);
|
||||
|
||||
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
|
||||
|
||||
/* The third argument is a pointer to an instance of `ucontext_t',
|
||||
which has a member `uc_mcontext' that contains the saved
|
||||
registers. */
|
||||
regnum = (cache->frameless_p ? SPARC_O2_REGNUM : SPARC_I2_REGNUM);
|
||||
mcontext_addr = frame_unwind_register_unsigned (next_frame, regnum) + 64;
|
||||
|
||||
cache->saved_regs[SPARC64_CCR_REGNUM].addr = mcontext_addr + 0 * 8;
|
||||
cache->saved_regs[SPARC64_PC_REGNUM].addr = mcontext_addr + 1 * 8;
|
||||
cache->saved_regs[SPARC64_NPC_REGNUM].addr = mcontext_addr + 2 * 8;
|
||||
cache->saved_regs[SPARC64_Y_REGNUM].addr = mcontext_addr + 3 * 8;
|
||||
cache->saved_regs[SPARC64_ASI_REGNUM].addr = mcontext_addr + 19 * 8;
|
||||
cache->saved_regs[SPARC64_FPRS_REGNUM].addr = mcontext_addr + 20 * 8;
|
||||
|
||||
/* Since %g0 is always zero, keep the identity encoding. */
|
||||
for (regnum = SPARC_G1_REGNUM, addr = mcontext_addr + 4 * 8;
|
||||
regnum <= SPARC_O7_REGNUM; regnum++, addr += 8)
|
||||
cache->saved_regs[regnum].addr = addr;
|
||||
|
||||
if (get_frame_memory_unsigned (next_frame, mcontext_addr + 21 * 8, 8))
|
||||
{
|
||||
/* The register windows haven't been flushed. */
|
||||
for (regnum = SPARC_L0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++)
|
||||
trad_frame_set_unknown (cache->saved_regs, regnum);
|
||||
}
|
||||
else
|
||||
{
|
||||
CORE_ADDR sp;
|
||||
|
||||
addr = cache->saved_regs[SPARC_SP_REGNUM].addr;
|
||||
sp = get_frame_memory_unsigned (next_frame, addr, 8);
|
||||
for (regnum = SPARC_L0_REGNUM, addr = sp + BIAS;
|
||||
regnum <= SPARC_I7_REGNUM; regnum++, addr += 8)
|
||||
cache->saved_regs[regnum].addr = addr;
|
||||
}
|
||||
|
||||
return cache;
|
||||
}
|
||||
|
||||
static void
|
||||
sparc64_sol2_sigtramp_frame_this_id (struct frame_info *next_frame,
|
||||
void **this_cache,
|
||||
struct frame_id *this_id)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc64_sol2_sigtramp_frame_cache (next_frame, this_cache);
|
||||
|
||||
(*this_id) = frame_id_build (cache->base, cache->pc);
|
||||
}
|
||||
|
||||
static void
|
||||
sparc64_sol2_sigtramp_frame_prev_register (struct frame_info *next_frame,
|
||||
void **this_cache,
|
||||
int regnum, int *optimizedp,
|
||||
enum lval_type *lvalp,
|
||||
CORE_ADDR *addrp,
|
||||
int *realnump, void *valuep)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc64_sol2_sigtramp_frame_cache (next_frame, this_cache);
|
||||
|
||||
trad_frame_prev_register (next_frame, cache->saved_regs, regnum,
|
||||
optimizedp, lvalp, addrp, realnump, valuep);
|
||||
}
|
||||
|
||||
static const struct frame_unwind sparc64_sol2_sigtramp_frame_unwind =
|
||||
{
|
||||
SIGTRAMP_FRAME,
|
||||
sparc64_sol2_sigtramp_frame_this_id,
|
||||
sparc64_sol2_sigtramp_frame_prev_register
|
||||
};
|
||||
|
||||
static const struct frame_unwind *
|
||||
sparc64_sol2_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
if (sparc_sol2_pc_in_sigtramp (pc, name))
|
||||
return &sparc64_sol2_sigtramp_frame_unwind;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
sparc64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
{
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||
|
||||
set_gdbarch_pc_in_sigtramp (gdbarch, sparc_sol2_pc_in_sigtramp);
|
||||
frame_unwind_append_sniffer (gdbarch, sparc64_sol2_sigtramp_frame_sniffer);
|
||||
|
||||
sparc64_init_abi (info, gdbarch);
|
||||
|
||||
/* Solaris has SVR4-style shared libraries... */
|
||||
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
|
||||
/* ...which means that we need some special handling when doing
|
||||
prologue analysis. */
|
||||
tdep->plt_entry_size = 16;
|
||||
|
||||
/* Solaris has kernel-assisted single-stepping support. */
|
||||
set_gdbarch_software_single_step (gdbarch, NULL);
|
||||
}
|
||||
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
void _initialize_sparc64_sol2_tdep (void);
|
||||
|
||||
void
|
||||
_initialize_sparc64_sol2_tdep (void)
|
||||
{
|
||||
gdbarch_register_osabi (bfd_arch_sparc, bfd_mach_sparc_v9,
|
||||
GDB_OSABI_SOLARIS, sparc64_sol2_init_abi);
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
/* Target-dependent code for UltraSPARC.
|
||||
|
||||
Copyright 2003 Free Software Foundation, Inc.
|
||||
Copyright 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -27,6 +27,9 @@
|
||||
#include "frame-unwind.h"
|
||||
#include "gdbcore.h"
|
||||
#include "gdbtypes.h"
|
||||
#include "inferior.h"
|
||||
#include "symtab.h"
|
||||
#include "objfiles.h"
|
||||
#include "osabi.h"
|
||||
#include "regcache.h"
|
||||
#include "target.h"
|
||||
@ -45,41 +48,6 @@
|
||||
/* Please use the sparc32_-prefix for 32-bit specific code, the
|
||||
sparc64_-prefix for 64-bit specific code and the sparc_-prefix for
|
||||
code can handle both. */
|
||||
|
||||
/* The stack pointer is offset from the stack frame by a BIAS of 2047
|
||||
(0x7ff) for 64-bit code. BIAS is likely to be defined on SPARC
|
||||
hosts, so undefine it first. */
|
||||
#undef BIAS
|
||||
#define BIAS 2047
|
||||
|
||||
/* Macros to extract fields from SPARC instructions. */
|
||||
#define X_OP(i) (((i) >> 30) & 0x3)
|
||||
#define X_A(i) (((i) >> 29) & 1)
|
||||
#define X_COND(i) (((i) >> 25) & 0xf)
|
||||
#define X_OP2(i) (((i) >> 22) & 0x7)
|
||||
#define X_IMM22(i) ((i) & 0x3fffff)
|
||||
#define X_OP3(i) (((i) >> 19) & 0x3f)
|
||||
/* Sign extension macros. */
|
||||
#define X_DISP22(i) ((X_IMM22 (i) ^ 0x200000) - 0x200000)
|
||||
#define X_DISP19(i) ((((i) & 0x7ffff) ^ 0x40000) - 0x40000)
|
||||
|
||||
/* Fetch the instruction at PC. Instructions are always big-endian
|
||||
even if the processor operates in little-endian mode. */
|
||||
|
||||
static unsigned long
|
||||
sparc_fetch_instruction (CORE_ADDR pc)
|
||||
{
|
||||
unsigned char buf[4];
|
||||
unsigned long insn;
|
||||
int i;
|
||||
|
||||
read_memory (pc, buf, sizeof (buf));
|
||||
|
||||
insn = 0;
|
||||
for (i = 0; i < sizeof (buf); i++)
|
||||
insn = (insn << 8) | buf[i];
|
||||
return insn;
|
||||
}
|
||||
|
||||
/* The functions on this page are intended to be used to classify
|
||||
function arguments. */
|
||||
@ -163,14 +131,6 @@ sparc64_structure_or_union_p (const struct type *type)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* UltraSPARC architecture specific information. */
|
||||
|
||||
struct gdbarch_tdep
|
||||
{
|
||||
/* Offset of saved PC in jmp_buf. */
|
||||
int jb_pc_offset;
|
||||
};
|
||||
|
||||
/* Register information. */
|
||||
|
||||
struct sparc64_register_info
|
||||
@ -283,8 +243,7 @@ static struct sparc64_register_info sparc64_register_info[] =
|
||||
};
|
||||
|
||||
/* Total number of registers. */
|
||||
#define SPARC64_NUM_REGS \
|
||||
(sizeof (sparc64_register_info) / sizeof (sparc64_register_info[0]))
|
||||
#define SPARC64_NUM_REGS ARRAY_SIZE (sparc64_register_info)
|
||||
|
||||
/* We provide the aliases %d0..%d62 and %q0..%q60 for the floating
|
||||
registers as "psuedo" registers. */
|
||||
@ -348,9 +307,7 @@ static struct sparc64_register_info sparc64_pseudo_register_info[] =
|
||||
};
|
||||
|
||||
/* Total number of pseudo registers. */
|
||||
#define SPARC64_NUM_PSEUDO_REGS \
|
||||
(sizeof (sparc64_pseudo_register_info) \
|
||||
/ sizeof (sparc64_pseudo_register_info[0]))
|
||||
#define SPARC64_NUM_PSEUDO_REGS ARRAY_SIZE (sparc64_pseudo_register_info)
|
||||
|
||||
/* Return the name of register REGNUM. */
|
||||
|
||||
@ -499,79 +456,8 @@ sparc64_pseudo_register_write (struct gdbarch *gdbarch,
|
||||
regcache_raw_write_unsigned (regcache, SPARC64_STATE_REGNUM, state);
|
||||
}
|
||||
}
|
||||
|
||||
/* Use the program counter to determine the contents and size of a
|
||||
breakpoint instruction. Return a pointer to a string of bytes that
|
||||
encode a breakpoint instruction, store the length of the string in
|
||||
*LEN and optionally adjust *PC to point to the correct memory
|
||||
location for inserting the breakpoint. */
|
||||
|
||||
static const unsigned char *
|
||||
sparc_breakpoint_from_pc (CORE_ADDR *pc, int *len)
|
||||
{
|
||||
static unsigned char break_insn[] = { 0x91, 0xd0, 0x20, 0x01 };
|
||||
|
||||
*len = sizeof (break_insn);
|
||||
return break_insn;
|
||||
}
|
||||
|
||||
|
||||
struct sparc64_frame_cache
|
||||
{
|
||||
/* Base address. */
|
||||
CORE_ADDR base;
|
||||
CORE_ADDR pc;
|
||||
|
||||
/* Do we have a frame? */
|
||||
int frameless_p;
|
||||
};
|
||||
|
||||
/* Allocate and initialize a frame cache. */
|
||||
|
||||
static struct sparc64_frame_cache *
|
||||
sparc64_alloc_frame_cache (void)
|
||||
{
|
||||
struct sparc64_frame_cache *cache;
|
||||
int i;
|
||||
|
||||
cache = FRAME_OBSTACK_ZALLOC (struct sparc64_frame_cache);
|
||||
|
||||
/* Base address. */
|
||||
cache->base = 0;
|
||||
cache->pc = 0;
|
||||
|
||||
/* Frameless until proven otherwise. */
|
||||
cache->frameless_p = 1;
|
||||
|
||||
return cache;
|
||||
}
|
||||
|
||||
static CORE_ADDR
|
||||
sparc64_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
|
||||
struct sparc64_frame_cache *cache)
|
||||
{
|
||||
unsigned long insn;
|
||||
|
||||
if (current_pc <= pc)
|
||||
return current_pc;
|
||||
|
||||
/* Check whether the function starts with a SAVE instruction. */
|
||||
insn = sparc_fetch_instruction (pc);
|
||||
if (X_OP (insn) == 2 && X_OP3 (insn) == 0x3c)
|
||||
{
|
||||
cache->frameless_p = 0;
|
||||
return pc + 4;
|
||||
}
|
||||
|
||||
return pc;
|
||||
}
|
||||
|
||||
static CORE_ADDR
|
||||
sparc64_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
|
||||
{
|
||||
return frame_unwind_register_unsigned (next_frame, SPARC64_PC_REGNUM);
|
||||
}
|
||||
|
||||
/* Return PC of first real instruction of the function starting at
|
||||
START_PC. */
|
||||
|
||||
@ -580,7 +466,7 @@ sparc64_skip_prologue (CORE_ADDR start_pc)
|
||||
{
|
||||
struct symtab_and_line sal;
|
||||
CORE_ADDR func_start, func_end;
|
||||
struct sparc64_frame_cache cache;
|
||||
struct sparc_frame_cache cache;
|
||||
|
||||
/* This is the preferred method, find the end of the prologue by
|
||||
using the debugging information. */
|
||||
@ -593,50 +479,22 @@ sparc64_skip_prologue (CORE_ADDR start_pc)
|
||||
return sal.end;
|
||||
}
|
||||
|
||||
return sparc64_analyze_prologue (start_pc, 0xffffffffffffffffUL, &cache);
|
||||
return sparc_analyze_prologue (start_pc, 0xffffffffffffffffULL, &cache);
|
||||
}
|
||||
|
||||
/* Normal frames. */
|
||||
|
||||
static struct sparc64_frame_cache *
|
||||
static struct sparc_frame_cache *
|
||||
sparc64_frame_cache (struct frame_info *next_frame, void **this_cache)
|
||||
{
|
||||
struct sparc64_frame_cache *cache;
|
||||
|
||||
if (*this_cache)
|
||||
return *this_cache;
|
||||
|
||||
cache = sparc64_alloc_frame_cache ();
|
||||
*this_cache = cache;
|
||||
|
||||
/* In priciple, for normal frames, %fp (%i6) holds the frame
|
||||
pointer, which holds the base address for the current stack
|
||||
frame. */
|
||||
|
||||
cache->base = frame_unwind_register_unsigned (next_frame, SPARC_FP_REGNUM);
|
||||
if (cache->base == 0)
|
||||
return cache;
|
||||
|
||||
cache->pc = frame_func_unwind (next_frame);
|
||||
if (cache->pc != 0)
|
||||
sparc64_analyze_prologue (cache->pc, frame_pc_unwind (next_frame), cache);
|
||||
|
||||
if (cache->frameless_p)
|
||||
{
|
||||
/* We didn't find a valid frame, which means that CACHE->base
|
||||
currently holds the frame pointer for our calling frame. */
|
||||
cache->base = frame_unwind_register_unsigned (next_frame,
|
||||
SPARC_SP_REGNUM);
|
||||
}
|
||||
|
||||
return cache;
|
||||
return sparc_frame_cache (next_frame, this_cache);
|
||||
}
|
||||
|
||||
static void
|
||||
sparc64_frame_this_id (struct frame_info *next_frame, void **this_cache,
|
||||
struct frame_id *this_id)
|
||||
{
|
||||
struct sparc64_frame_cache *cache =
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc64_frame_cache (next_frame, this_cache);
|
||||
|
||||
/* This marks the outermost frame. */
|
||||
@ -652,7 +510,7 @@ sparc64_frame_prev_register (struct frame_info *next_frame, void **this_cache,
|
||||
enum lval_type *lvalp, CORE_ADDR *addrp,
|
||||
int *realnump, void *valuep)
|
||||
{
|
||||
struct sparc64_frame_cache *cache =
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc64_frame_cache (next_frame, this_cache);
|
||||
|
||||
if (regnum == SPARC64_PC_REGNUM || regnum == SPARC64_NPC_REGNUM)
|
||||
@ -718,7 +576,7 @@ sparc64_frame_sniffer (struct frame_info *next_frame)
|
||||
static CORE_ADDR
|
||||
sparc64_frame_base_address (struct frame_info *next_frame, void **this_cache)
|
||||
{
|
||||
struct sparc64_frame_cache *cache =
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc64_frame_cache (next_frame, this_cache);
|
||||
|
||||
/* ??? Should we take BIAS into account here? */
|
||||
@ -732,15 +590,6 @@ static const struct frame_base sparc64_frame_base =
|
||||
sparc64_frame_base_address,
|
||||
sparc64_frame_base_address
|
||||
};
|
||||
|
||||
static struct frame_id
|
||||
sparc_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR sp;
|
||||
|
||||
sp = frame_unwind_register_unsigned (next_frame, SPARC_SP_REGNUM);
|
||||
return frame_id_build (sp, frame_pc_unwind (next_frame));
|
||||
}
|
||||
|
||||
/* Check whether TYPE must be 16-byte aligned. */
|
||||
|
||||
@ -1193,19 +1042,6 @@ sparc64_store_return_value (struct type *type, struct regcache *regcache,
|
||||
}
|
||||
}
|
||||
|
||||
/* Extract from REGCACHE, which contains the (raw) register state, the
|
||||
address in which a function should return its structure value, as a
|
||||
CORE_ADDR. */
|
||||
|
||||
static CORE_ADDR
|
||||
sparc_extract_struct_value_address (struct regcache *regcache)
|
||||
{
|
||||
ULONGEST addr;
|
||||
|
||||
regcache_cooked_read_unsigned (regcache, SPARC_O0_REGNUM, &addr);
|
||||
return addr;
|
||||
}
|
||||
|
||||
static int
|
||||
sparc64_use_struct_convention (int gcc_p, struct type *type)
|
||||
{
|
||||
@ -1213,138 +1049,20 @@ sparc64_use_struct_convention (int gcc_p, struct type *type)
|
||||
registers. */
|
||||
return (TYPE_LENGTH (type) > 32);
|
||||
}
|
||||
|
||||
|
||||
/* The SPARC Architecture doesn't have hardware single-step support,
|
||||
and most operating systems don't implement it either, so we provide
|
||||
software single-step mechanism. */
|
||||
|
||||
static CORE_ADDR
|
||||
sparc_analyze_control_transfer (CORE_ADDR pc, CORE_ADDR *npc)
|
||||
{
|
||||
unsigned long insn = sparc_fetch_instruction (pc);
|
||||
int conditional_p = X_COND (insn) & 0x7;
|
||||
int branch_p = 0;
|
||||
long offset = 0; /* Must be signed for sign-extend. */
|
||||
|
||||
if (X_OP (insn) == 0 && X_OP2 (insn) == 3 && (insn & 0x1000000) == 0)
|
||||
{
|
||||
/* Branch on Integer Register with Prediction (BPr). */
|
||||
branch_p = 1;
|
||||
conditional_p = 1;
|
||||
}
|
||||
else if (X_OP (insn) == 0 && X_OP2 (insn) == 6)
|
||||
{
|
||||
/* Branch on Floating-Point Condition Codes (FBfcc). */
|
||||
branch_p = 1;
|
||||
offset = 4 * X_DISP22 (insn);
|
||||
}
|
||||
else if (X_OP (insn) == 0 && X_OP2 (insn) == 5)
|
||||
{
|
||||
/* Branch on Floating-Point Condition Codes with Prediction
|
||||
(FBPfcc). */
|
||||
branch_p = 1;
|
||||
offset = 4 * X_DISP19 (insn);
|
||||
}
|
||||
else if (X_OP (insn) == 0 && X_OP2 (insn) == 2)
|
||||
{
|
||||
/* Branch on Integer Condition Codes (Bicc). */
|
||||
branch_p = 1;
|
||||
offset = 4 * X_DISP22 (insn);
|
||||
}
|
||||
else if (X_OP (insn) == 0 && X_OP2 (insn) == 1)
|
||||
{
|
||||
/* Branch on Integer Condition Codes with Prediction (BPcc). */
|
||||
branch_p = 1;
|
||||
offset = 4 * X_DISP19 (insn);
|
||||
}
|
||||
|
||||
/* FIXME: Handle DONE and RETRY instructions. */
|
||||
|
||||
/* FIXME: Handle the Trap instruction. */
|
||||
|
||||
if (branch_p)
|
||||
{
|
||||
if (conditional_p)
|
||||
{
|
||||
/* For conditional branches, return nPC + 4 iff the annul
|
||||
bit is 1. */
|
||||
return (X_A (insn) ? *npc + 4 : 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* For unconditional branches, return the target if its
|
||||
specified condition is "always" and return nPC + 4 if the
|
||||
condition is "never". If the annul bit is 1, set *NPC to
|
||||
zero. */
|
||||
if (X_COND (insn) == 0x0)
|
||||
pc = *npc, offset = 4;
|
||||
if (X_A (insn))
|
||||
*npc = 0;
|
||||
|
||||
gdb_assert (offset != 0);
|
||||
return pc + offset;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
sparc_software_single_step (enum target_signal sig, int insert_breakpoints_p)
|
||||
sparc64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
{
|
||||
static CORE_ADDR npc, nnpc;
|
||||
static char npc_save[4], nnpc_save[4];
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||
|
||||
if (insert_breakpoints_p)
|
||||
{
|
||||
CORE_ADDR pc;
|
||||
|
||||
pc = sparc_address_from_register (SPARC64_PC_REGNUM);
|
||||
npc = sparc_address_from_register (SPARC64_NPC_REGNUM);
|
||||
|
||||
/* Analyze the instruction at PC. */
|
||||
nnpc = sparc_analyze_control_transfer (pc, &npc);
|
||||
if (npc != 0)
|
||||
target_insert_breakpoint (npc, npc_save);
|
||||
if (nnpc != 0)
|
||||
target_insert_breakpoint (nnpc, nnpc_save);
|
||||
|
||||
/* Assert that we have set at least one breakpoint. */
|
||||
gdb_assert (npc != 0 || nnpc != 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (npc != 0)
|
||||
target_remove_breakpoint (npc, npc_save);
|
||||
if (nnpc != 0)
|
||||
target_remove_breakpoint (nnpc, nnpc_save);
|
||||
|
||||
npc = 0;
|
||||
nnpc = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static struct gdbarch *
|
||||
sparc64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
{
|
||||
struct gdbarch_tdep *tdep;
|
||||
struct gdbarch *gdbarch;
|
||||
|
||||
/* If there is already a candidate, use it. */
|
||||
arches = gdbarch_list_lookup_by_info (arches, &info);
|
||||
if (arches != NULL)
|
||||
return arches->gdbarch;
|
||||
|
||||
/* Allocate space for the new architecture. */
|
||||
tdep = XMALLOC (struct gdbarch_tdep);
|
||||
gdbarch = gdbarch_alloc (&info, tdep);
|
||||
tdep->pc_regnum = SPARC64_PC_REGNUM;
|
||||
tdep->npc_regnum = SPARC64_NPC_REGNUM;
|
||||
|
||||
/* This is what all the fuss is about. */
|
||||
set_gdbarch_long_bit (gdbarch, 64);
|
||||
set_gdbarch_long_long_bit (gdbarch, 64);
|
||||
set_gdbarch_ptr_bit (gdbarch, 64);
|
||||
set_gdbarch_long_double_bit (gdbarch, 128);
|
||||
|
||||
set_gdbarch_num_regs (gdbarch, SPARC64_NUM_REGS);
|
||||
set_gdbarch_register_name (gdbarch, sparc64_register_name);
|
||||
@ -1354,147 +1072,329 @@ sparc64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
set_gdbarch_pseudo_register_write (gdbarch, sparc64_pseudo_register_write);
|
||||
|
||||
/* Register numbers of various important registers. */
|
||||
set_gdbarch_sp_regnum (gdbarch, SPARC_SP_REGNUM); /* %sp */
|
||||
set_gdbarch_pc_regnum (gdbarch, SPARC64_PC_REGNUM); /* %pc */
|
||||
set_gdbarch_deprecated_npc_regnum (gdbarch, SPARC64_NPC_REGNUM);
|
||||
set_gdbarch_fp0_regnum (gdbarch, SPARC_F0_REGNUM); /* %f0 */
|
||||
|
||||
/* Call dummy code. */
|
||||
set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
|
||||
set_gdbarch_push_dummy_code (gdbarch, NULL);
|
||||
set_gdbarch_push_dummy_call (gdbarch, sparc64_push_dummy_call);
|
||||
|
||||
set_gdbarch_extract_return_value (gdbarch, sparc64_extract_return_value);
|
||||
set_gdbarch_store_return_value (gdbarch, sparc64_store_return_value);
|
||||
set_gdbarch_extract_struct_value_address
|
||||
(gdbarch, sparc_extract_struct_value_address);
|
||||
set_gdbarch_use_struct_convention (gdbarch, sparc64_use_struct_convention);
|
||||
set_gdbarch_return_value_on_stack
|
||||
(gdbarch, generic_return_value_on_stack_not);
|
||||
set_gdbarch_stabs_argument_has_addr
|
||||
(gdbarch, default_stabs_argument_has_addr);
|
||||
|
||||
set_gdbarch_skip_prologue (gdbarch, sparc64_skip_prologue);
|
||||
|
||||
/* Stack grows downward. */
|
||||
set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
|
||||
|
||||
set_gdbarch_breakpoint_from_pc (gdbarch, sparc_breakpoint_from_pc);
|
||||
set_gdbarch_decr_pc_after_break (gdbarch, 0);
|
||||
set_gdbarch_function_start_offset (gdbarch, 0);
|
||||
|
||||
set_gdbarch_frame_args_skip (gdbarch, 8);
|
||||
|
||||
set_gdbarch_print_insn (gdbarch, print_insn_sparc);
|
||||
|
||||
set_gdbarch_software_single_step (gdbarch, sparc_software_single_step);
|
||||
|
||||
set_gdbarch_unwind_dummy_id (gdbarch, sparc_unwind_dummy_id);
|
||||
|
||||
set_gdbarch_unwind_pc (gdbarch, sparc64_unwind_pc);
|
||||
|
||||
frame_base_set_default (gdbarch, &sparc64_frame_base);
|
||||
|
||||
/* Hook in ABI-specific overrides, if they have been registered. */
|
||||
gdbarch_init_osabi (info, gdbarch);
|
||||
|
||||
frame_unwind_append_sniffer (gdbarch, sparc64_frame_sniffer);
|
||||
|
||||
return gdbarch;
|
||||
frame_base_set_default (gdbarch, &sparc64_frame_base);
|
||||
}
|
||||
|
||||
/* Helper functions for dealing with register windows. */
|
||||
|
||||
/* Helper functions for dealing with register sets. */
|
||||
|
||||
#define TSTATE_CWP 0x000000000000001fULL
|
||||
#define TSTATE_ICC 0x0000000f00000000ULL
|
||||
#define TSTATE_XCC 0x000000f000000000ULL
|
||||
|
||||
#define PSR_S 0x00000080
|
||||
#define PSR_ICC 0x00f00000
|
||||
#define PSR_VERS 0x0f000000
|
||||
#define PSR_IMPL 0xf0000000
|
||||
#define PSR_V8PLUS 0xff000000
|
||||
#define PSR_XCC 0x000f0000
|
||||
|
||||
void
|
||||
sparc_supply_rwindow (CORE_ADDR sp, int regnum)
|
||||
sparc64_supply_gregset (const struct sparc_gregset *gregset,
|
||||
struct regcache *regcache,
|
||||
int regnum, const void *gregs)
|
||||
{
|
||||
int offset = 0;
|
||||
char buf[8];
|
||||
int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32);
|
||||
const char *regs = gregs;
|
||||
int i;
|
||||
|
||||
if (sp & 1)
|
||||
if (sparc32)
|
||||
{
|
||||
/* Registers are 64-bit. */
|
||||
sp += BIAS;
|
||||
|
||||
for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
|
||||
if (regnum == SPARC32_PSR_REGNUM || regnum == -1)
|
||||
{
|
||||
if (regnum == i || regnum == -1)
|
||||
{
|
||||
target_read_memory (sp + ((i - SPARC_L0_REGNUM) * 8), buf, 8);
|
||||
supply_register (i, buf);
|
||||
}
|
||||
int offset = gregset->r_tstate_offset;
|
||||
ULONGEST tstate, psr;
|
||||
char buf[4];
|
||||
|
||||
tstate = extract_unsigned_integer (regs + offset, 8);
|
||||
psr = ((tstate & TSTATE_CWP) | PSR_S | ((tstate & TSTATE_ICC) >> 12)
|
||||
| ((tstate & TSTATE_XCC) >> 20) | PSR_V8PLUS);
|
||||
store_unsigned_integer (buf, 4, psr);
|
||||
regcache_raw_supply (regcache, SPARC32_PSR_REGNUM, buf);
|
||||
}
|
||||
|
||||
if (regnum == SPARC32_PC_REGNUM || regnum == -1)
|
||||
regcache_raw_supply (regcache, SPARC32_PC_REGNUM,
|
||||
regs + gregset->r_pc_offset + 4);
|
||||
|
||||
if (regnum == SPARC32_NPC_REGNUM || regnum == -1)
|
||||
regcache_raw_supply (regcache, SPARC32_NPC_REGNUM,
|
||||
regs + gregset->r_npc_offset + 4);
|
||||
|
||||
if (regnum == SPARC32_Y_REGNUM || regnum == -1)
|
||||
{
|
||||
int offset = gregset->r_y_offset + 8 - gregset->r_y_size;
|
||||
regcache_raw_supply (regcache, SPARC32_Y_REGNUM, regs + offset);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Registers are 32-bit. Toss any sign-extension of the stack
|
||||
pointer. */
|
||||
sp &= 0xffffffffUL;
|
||||
if (regnum == SPARC64_STATE_REGNUM || regnum == -1)
|
||||
regcache_raw_supply (regcache, SPARC64_STATE_REGNUM,
|
||||
regs + gregset->r_tstate_offset);
|
||||
|
||||
/* Clear out the top half of the temporary buffer, and put the
|
||||
register value in the bottom half if we're in 64-bit mode. */
|
||||
if (gdbarch_ptr_bit (current_gdbarch) == 64)
|
||||
if (regnum == SPARC64_PC_REGNUM || regnum == -1)
|
||||
regcache_raw_supply (regcache, SPARC64_PC_REGNUM,
|
||||
regs + gregset->r_pc_offset);
|
||||
|
||||
if (regnum == SPARC64_NPC_REGNUM || regnum == -1)
|
||||
regcache_raw_supply (regcache, SPARC64_NPC_REGNUM,
|
||||
regs + gregset->r_npc_offset);
|
||||
|
||||
if (regnum == SPARC64_Y_REGNUM || regnum == -1)
|
||||
{
|
||||
memset (buf, 0, 4);
|
||||
offset = 4;
|
||||
char buf[8];
|
||||
|
||||
memset (buf, 0, 8);
|
||||
memcpy (buf + 8 - gregset->r_y_size,
|
||||
regs + gregset->r_y_offset, gregset->r_y_size);
|
||||
regcache_raw_supply (regcache, SPARC64_Y_REGNUM, buf);
|
||||
}
|
||||
|
||||
for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
|
||||
if ((regnum == SPARC64_FPRS_REGNUM || regnum == -1)
|
||||
&& gregset->r_fprs_offset != -1)
|
||||
regcache_raw_supply (regcache, SPARC64_FPRS_REGNUM,
|
||||
regs + gregset->r_fprs_offset);
|
||||
}
|
||||
|
||||
if (regnum == SPARC_G0_REGNUM || regnum == -1)
|
||||
regcache_raw_supply (regcache, SPARC_G0_REGNUM, NULL);
|
||||
|
||||
if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_O7_REGNUM) || regnum == -1)
|
||||
{
|
||||
int offset = gregset->r_g1_offset;
|
||||
|
||||
if (sparc32)
|
||||
offset += 4;
|
||||
|
||||
for (i = SPARC_G1_REGNUM; i <= SPARC_O7_REGNUM; i++)
|
||||
{
|
||||
if (regnum == i || regnum == -1)
|
||||
regcache_raw_supply (regcache, i, regs + offset);
|
||||
offset += 8;
|
||||
}
|
||||
}
|
||||
|
||||
if ((regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM) || regnum == -1)
|
||||
{
|
||||
/* Not all of the register set variants include Locals and
|
||||
Inputs. For those that don't, we read them off the stack. */
|
||||
if (gregset->r_l0_offset == -1)
|
||||
{
|
||||
ULONGEST sp;
|
||||
|
||||
regcache_cooked_read_unsigned (regcache, SPARC_SP_REGNUM, &sp);
|
||||
sparc_supply_rwindow (regcache, sp, regnum);
|
||||
}
|
||||
else
|
||||
{
|
||||
int offset = gregset->r_l0_offset;
|
||||
|
||||
if (sparc32)
|
||||
offset += 4;
|
||||
|
||||
for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
|
||||
{
|
||||
target_read_memory (sp + ((i - SPARC_L0_REGNUM) * 4),
|
||||
buf + offset, 4);
|
||||
supply_register (i, buf);
|
||||
if (regnum == i || regnum == -1)
|
||||
regcache_raw_supply (regcache, i, regs + offset);
|
||||
offset += 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
sparc_fill_rwindow (CORE_ADDR sp, int regnum)
|
||||
sparc64_collect_gregset (const struct sparc_gregset *gregset,
|
||||
const struct regcache *regcache,
|
||||
int regnum, void *gregs)
|
||||
{
|
||||
int offset = 0;
|
||||
char buf[8];
|
||||
int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32);
|
||||
char *regs = gregs;
|
||||
int i;
|
||||
|
||||
if (sp & 1)
|
||||
if (sparc32)
|
||||
{
|
||||
/* Registers are 64-bit. */
|
||||
sp += BIAS;
|
||||
|
||||
for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
|
||||
if (regnum == SPARC32_PSR_REGNUM || regnum == -1)
|
||||
{
|
||||
if (regnum == -1 || regnum == SPARC_SP_REGNUM || regnum == i)
|
||||
{
|
||||
regcache_collect (i, buf);
|
||||
target_write_memory (sp + ((i - SPARC_L0_REGNUM) * 8), buf, 8);
|
||||
}
|
||||
int offset = gregset->r_tstate_offset;
|
||||
ULONGEST tstate, psr;
|
||||
char buf[8];
|
||||
|
||||
tstate = extract_unsigned_integer (regs + offset, 8);
|
||||
regcache_raw_collect (regcache, SPARC32_PSR_REGNUM, buf);
|
||||
psr = extract_unsigned_integer (buf, 4);
|
||||
tstate |= (psr & PSR_ICC) << 12;
|
||||
if ((psr & (PSR_VERS | PSR_IMPL)) == PSR_V8PLUS)
|
||||
tstate |= (psr & PSR_XCC) << 20;
|
||||
store_unsigned_integer (buf, 8, tstate);
|
||||
memcpy (regs + offset, buf, 8);
|
||||
}
|
||||
|
||||
if (regnum == SPARC32_PC_REGNUM || regnum == -1)
|
||||
regcache_raw_collect (regcache, SPARC32_PC_REGNUM,
|
||||
regs + gregset->r_pc_offset + 4);
|
||||
|
||||
if (regnum == SPARC32_NPC_REGNUM || regnum == -1)
|
||||
regcache_raw_collect (regcache, SPARC32_NPC_REGNUM,
|
||||
regs + gregset->r_npc_offset + 4);
|
||||
|
||||
if (regnum == SPARC32_Y_REGNUM || regnum == -1)
|
||||
{
|
||||
int offset = gregset->r_y_offset + 8 - gregset->r_y_size;
|
||||
regcache_raw_collect (regcache, SPARC32_Y_REGNUM, regs + offset);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Registers are 32-bit. Toss any sign-extension of the stack
|
||||
pointer. */
|
||||
sp &= 0xffffffffUL;
|
||||
if (regnum == SPARC64_STATE_REGNUM || regnum == -1)
|
||||
regcache_raw_collect (regcache, SPARC64_STATE_REGNUM,
|
||||
regs + gregset->r_tstate_offset);
|
||||
|
||||
/* Only use the bottom half if we're in 64-bit mode. */
|
||||
if (gdbarch_ptr_bit (current_gdbarch) == 64)
|
||||
offset = 4;
|
||||
if (regnum == SPARC64_PC_REGNUM || regnum == -1)
|
||||
regcache_raw_collect (regcache, SPARC64_PC_REGNUM,
|
||||
regs + gregset->r_pc_offset);
|
||||
|
||||
for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
|
||||
if (regnum == SPARC64_NPC_REGNUM || regnum == -1)
|
||||
regcache_raw_collect (regcache, SPARC64_NPC_REGNUM,
|
||||
regs + gregset->r_npc_offset);
|
||||
|
||||
if (regnum == SPARC64_Y_REGNUM || regnum == -1)
|
||||
{
|
||||
if (regnum == -1 || regnum == SPARC_SP_REGNUM || regnum == i)
|
||||
char buf[8];
|
||||
|
||||
regcache_raw_collect (regcache, SPARC64_Y_REGNUM, buf);
|
||||
memcpy (regs + gregset->r_y_offset,
|
||||
buf + 8 - gregset->r_y_size, gregset->r_y_size);
|
||||
}
|
||||
|
||||
if ((regnum == SPARC64_FPRS_REGNUM || regnum == -1)
|
||||
&& gregset->r_fprs_offset != -1)
|
||||
regcache_raw_collect (regcache, SPARC64_FPRS_REGNUM,
|
||||
regs + gregset->r_fprs_offset);
|
||||
|
||||
}
|
||||
|
||||
if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_O7_REGNUM) || regnum == -1)
|
||||
{
|
||||
int offset = gregset->r_g1_offset;
|
||||
|
||||
if (sparc32)
|
||||
offset += 4;
|
||||
|
||||
/* %g0 is always zero. */
|
||||
for (i = SPARC_G1_REGNUM; i <= SPARC_O7_REGNUM; i++)
|
||||
{
|
||||
if (regnum == i || regnum == -1)
|
||||
regcache_raw_collect (regcache, i, regs + offset);
|
||||
offset += 8;
|
||||
}
|
||||
}
|
||||
|
||||
if ((regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM) || regnum == -1)
|
||||
{
|
||||
/* Not all of the register set variants include Locals and
|
||||
Inputs. For those that don't, we read them off the stack. */
|
||||
if (gregset->r_l0_offset != -1)
|
||||
{
|
||||
int offset = gregset->r_l0_offset;
|
||||
|
||||
if (sparc32)
|
||||
offset += 4;
|
||||
|
||||
for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
|
||||
{
|
||||
regcache_collect (i, buf);
|
||||
target_write_memory (sp + ((i - SPARC_L0_REGNUM) * 4),
|
||||
buf + offset, 4);
|
||||
if (regnum == i || regnum == -1)
|
||||
regcache_raw_collect (regcache, i, regs + offset);
|
||||
offset += 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
void _initialize_sparc64_tdep (void);
|
||||
|
||||
void
|
||||
_initialize_sparc64_tdep (void)
|
||||
sparc64_supply_fpregset (struct regcache *regcache,
|
||||
int regnum, const void *fpregs)
|
||||
{
|
||||
register_gdbarch_init (bfd_arch_sparc, sparc64_gdbarch_init);
|
||||
int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32);
|
||||
const char *regs = fpregs;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1)
|
||||
regcache_raw_supply (regcache, SPARC_F0_REGNUM + i, regs + (i * 4));
|
||||
}
|
||||
|
||||
if (sparc32)
|
||||
{
|
||||
if (regnum == SPARC32_FSR_REGNUM || regnum == -1)
|
||||
regcache_raw_supply (regcache, SPARC32_FSR_REGNUM,
|
||||
regs + (32 * 4) + (16 * 8) + 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
if (regnum == (SPARC64_F32_REGNUM + i) || regnum == -1)
|
||||
regcache_raw_supply (regcache, SPARC64_F32_REGNUM + i,
|
||||
regs + (32 * 4) + (i * 8));
|
||||
}
|
||||
|
||||
if (regnum == SPARC64_FSR_REGNUM || regnum == -1)
|
||||
regcache_raw_supply (regcache, SPARC64_FSR_REGNUM,
|
||||
regs + (32 * 4) + (16 * 8));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
sparc64_collect_fpregset (const struct regcache *regcache,
|
||||
int regnum, void *fpregs)
|
||||
{
|
||||
int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32);
|
||||
char *regs = fpregs;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1)
|
||||
regcache_raw_collect (regcache, SPARC_F0_REGNUM + i, regs + (i * 4));
|
||||
}
|
||||
|
||||
if (sparc32)
|
||||
{
|
||||
if (regnum == SPARC32_FSR_REGNUM || regnum == -1)
|
||||
regcache_raw_collect (regcache, SPARC32_FSR_REGNUM,
|
||||
regs + (32 * 4) + (16 * 8) + 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
if (regnum == (SPARC64_F32_REGNUM + i) || regnum == -1)
|
||||
regcache_raw_collect (regcache, SPARC64_F32_REGNUM + i,
|
||||
regs + (32 * 4) + (i * 8));
|
||||
}
|
||||
|
||||
if (regnum == SPARC64_FSR_REGNUM || regnum == -1)
|
||||
regcache_raw_collect (regcache, SPARC64_FSR_REGNUM,
|
||||
regs + (32 * 4) + (16 * 8));
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* Target-dependent code for UltraSPARC.
|
||||
|
||||
Copyright 2003 Free Software Foundation, Inc.
|
||||
Copyright 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -20,84 +20,94 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifndef SPARC64_TDEP_H
|
||||
#define SPARC62_TDEP_H 1
|
||||
#define SPARC64_TDEP_H 1
|
||||
|
||||
#include "sparc-tdep.h"
|
||||
|
||||
/* The stack pointer is offset from the stack frame by a BIAS of 2047
|
||||
(0x7ff) for 64-bit code. BIAS is likely to be defined on SPARC
|
||||
hosts, so undefine it first. */
|
||||
#undef BIAS
|
||||
#define BIAS 2047
|
||||
|
||||
/* Register offsets for the general-purpose register set. */
|
||||
|
||||
/* UltraSPARC doesn't have %psr. */
|
||||
#define r_tstate_offset r_psr_offset
|
||||
|
||||
/* UltraSPARC doesn't have %wim either. */
|
||||
#define r_fprs_offset r_wim_offset
|
||||
|
||||
/* Register numbers of various important registers. */
|
||||
|
||||
enum sparc_regnum
|
||||
{
|
||||
SPARC_G0_REGNUM, /* %g0 */
|
||||
SPARC_G1_REGNUM,
|
||||
SPARC_G2_REGNUM,
|
||||
SPARC_G3_REGNUM,
|
||||
SPARC_G4_REGNUM,
|
||||
SPARC_G5_REGNUM,
|
||||
SPARC_G6_REGNUM,
|
||||
SPARC_G7_REGNUM, /* %g7 */
|
||||
SPARC_O0_REGNUM, /* %o0 */
|
||||
SPARC_O1_REGNUM,
|
||||
SPARC_O2_REGNUM,
|
||||
SPARC_O3_REGNUM,
|
||||
SPARC_O4_REGNUM,
|
||||
SPARC_O5_REGNUM,
|
||||
SPARC_SP_REGNUM, /* %sp (%o6) */
|
||||
SPARC_O7_REGNUM, /* %o7 */
|
||||
SPARC_L0_REGNUM, /* %l0 */
|
||||
SPARC_L1_REGNUM,
|
||||
SPARC_L2_REGNUM,
|
||||
SPARC_L3_REGNUM,
|
||||
SPARC_L4_REGNUM,
|
||||
SPARC_L5_REGNUM,
|
||||
SPARC_L6_REGNUM,
|
||||
SPARC_L7_REGNUM, /* %l7 */
|
||||
SPARC_I0_REGNUM, /* %i0 */
|
||||
SPARC_I1_REGNUM,
|
||||
SPARC_I2_REGNUM,
|
||||
SPARC_I3_REGNUM,
|
||||
SPARC_I4_REGNUM,
|
||||
SPARC_I5_REGNUM,
|
||||
SPARC_FP_REGNUM, /* %fp (%i6) */
|
||||
SPARC_I7_REGNUM, /* %i7 */
|
||||
SPARC_F0_REGNUM, /* %f0 */
|
||||
SPARC_F31_REGNUM = SPARC_F0_REGNUM + 31 /* %f31 */
|
||||
};
|
||||
|
||||
enum sparc64_regnum
|
||||
{
|
||||
SPARC64_F32_REGNUM = SPARC_F0_REGNUM + 32, /* %f32 */
|
||||
SPARC64_F62_REGNUM = SPARC64_F32_REGNUM + 15, /* %f62 */
|
||||
SPARC64_F32_REGNUM /* %f32 */
|
||||
= SPARC_F0_REGNUM + 32,
|
||||
SPARC64_F62_REGNUM /* %f62 */
|
||||
= SPARC64_F32_REGNUM + 15,
|
||||
SPARC64_PC_REGNUM, /* %pc */
|
||||
SPARC64_NPC_REGNUM, /* %npc */
|
||||
SPARC64_STATE_REGNUM,
|
||||
SPARC64_FSR_REGNUM, /* %fsr */
|
||||
SPARC64_FPRS_REGNUM, /* %fprs */
|
||||
SPARC64_Y_REGNUM, /* %y */
|
||||
|
||||
|
||||
/* Pseudo registers. */
|
||||
SPARC64_CWP_REGNUM, /* %cwp */
|
||||
SPARC64_PSTATE_REGNUM, /* %pstate */
|
||||
SPARC64_ASI_REGNUM, /* %asi */
|
||||
SPARC64_CCR_REGNUM, /* %ccr */
|
||||
SPARC64_D0_REGNUM, /* %d0 */
|
||||
SPARC64_D10_REGNUM = SPARC64_D0_REGNUM + 5, /* %d10 */
|
||||
SPARC64_D30_REGNUM = SPARC64_D0_REGNUM + 15, /* %d30 */
|
||||
SPARC64_D32_REGNUM = SPARC64_D0_REGNUM + 16, /* %d32 */
|
||||
SPARC64_D62_REGNUM = SPARC64_D0_REGNUM + 31, /* %d62 */
|
||||
SPARC64_D10_REGNUM /* %d10 */
|
||||
= SPARC64_D0_REGNUM + 5,
|
||||
SPARC64_D30_REGNUM /* %d30 */
|
||||
= SPARC64_D0_REGNUM + 15,
|
||||
SPARC64_D32_REGNUM /* %d32 */
|
||||
= SPARC64_D0_REGNUM + 16,
|
||||
SPARC64_D62_REGNUM /* %d62 */
|
||||
= SPARC64_D0_REGNUM + 31,
|
||||
SPARC64_Q0_REGNUM, /* %q0 */
|
||||
SPARC64_Q8_REGNUM = SPARC64_Q0_REGNUM + 2, /* %q8 */
|
||||
SPARC64_Q28_REGNUM = SPARC64_Q0_REGNUM + 7, /* %q28 */
|
||||
SPARC64_Q32_REGNUM = SPARC64_Q0_REGNUM + 8, /* %q32 */
|
||||
SPARC64_Q60_REGNUM = SPARC64_Q0_REGNUM + 15 /* %q60 */
|
||||
SPARC64_Q8_REGNUM /* %q8 */
|
||||
= SPARC64_Q0_REGNUM + 2,
|
||||
SPARC64_Q28_REGNUM /* %q28 */
|
||||
= SPARC64_Q0_REGNUM + 7,
|
||||
SPARC64_Q32_REGNUM /* %q32 */
|
||||
= SPARC64_Q0_REGNUM + 8,
|
||||
SPARC64_Q60_REGNUM /* %q60 */
|
||||
= SPARC64_Q0_REGNUM + 15
|
||||
};
|
||||
|
||||
extern void sparc_supply_rwindow (CORE_ADDR sp, int regnum);
|
||||
extern void sparc_fill_rwindow (CORE_ADDR sp, int regnum);
|
||||
extern void sparc64_init_abi (struct gdbarch_info info,
|
||||
struct gdbarch *gdbarch);
|
||||
|
||||
/* Functions exported from sparc64fbsd-tdep.c. */
|
||||
extern void sparc64_supply_gregset (const struct sparc_gregset *gregset,
|
||||
struct regcache *regcache,
|
||||
int regnum, const void *gregs);
|
||||
extern void sparc64_collect_gregset (const struct sparc_gregset *gregset,
|
||||
const struct regcache *regcache,
|
||||
int regnum, void *gregs);
|
||||
extern void sparc64_supply_fpregset (struct regcache *regcache,
|
||||
int regnum, const void *fpregs);
|
||||
extern void sparc64_collect_fpregset (const struct regcache *regcache,
|
||||
int regnum, void *fpregs);
|
||||
|
||||
extern void sparc64fbsd_supply_reg (const char *regs, int regnum);
|
||||
extern void sparc64fbsd_fill_reg (char *regs, int regnum);
|
||||
extern void sparc64fbsd_supply_fpreg (const char *regs, int regnum);
|
||||
extern void sparc64fbsd_fill_fpreg (char *regs, int regnum);
|
||||
/* Functions and variables exported from sparc64-sol2-tdep.c. */
|
||||
|
||||
/* Register offsets for Solaris 2. */
|
||||
extern const struct sparc_gregset sparc64_sol2_gregset;
|
||||
|
||||
extern void sparc64_sol2_init_abi (struct gdbarch_info info,
|
||||
struct gdbarch *gdbarch);
|
||||
|
||||
/* Variables exported from sparc64fbsd-tdep.c. */
|
||||
|
||||
/* Register offsets for FreeBSD/sparc64. */
|
||||
extern const struct sparc_gregset sparc64fbsd_gregset;
|
||||
|
||||
/* Variables exported from sparc64nbsd-tdep.c. */
|
||||
|
||||
/* Register offsets for NetBSD/sparc64. */
|
||||
extern const struct sparc_gregset sparc64nbsd_gregset;
|
||||
|
||||
#endif /* sparc64-tdep.h */
|
||||
|
@ -22,47 +22,7 @@
|
||||
#include "defs.h"
|
||||
|
||||
#include "sparc64-tdep.h"
|
||||
#include "sparcbsd-nat.h"
|
||||
|
||||
/* Determine whether `struct reg' contains register REGNUM. */
|
||||
|
||||
static int
|
||||
sparc64fbsd_reg_supplies_p (int regnum)
|
||||
{
|
||||
/* Integer registers. */
|
||||
if ((regnum >= SPARC_G0_REGNUM && regnum <= SPARC_G7_REGNUM)
|
||||
|| (regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM)
|
||||
|| (regnum >= SPARC_L0_REGNUM && regnum <= SPARC_L7_REGNUM)
|
||||
|| (regnum >= SPARC_I0_REGNUM && regnum <= SPARC_I7_REGNUM))
|
||||
return 1;
|
||||
|
||||
/* Control registers. */
|
||||
if (regnum == SPARC64_PC_REGNUM
|
||||
|| regnum == SPARC64_NPC_REGNUM
|
||||
|| regnum == SPARC64_STATE_REGNUM
|
||||
|| regnum == SPARC64_FPRS_REGNUM
|
||||
|| regnum == SPARC64_Y_REGNUM)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Determine whether `struct fpreg' contains register REGNUM. */
|
||||
|
||||
static int
|
||||
sparc64fbsd_fpreg_supplies_p (int regnum)
|
||||
{
|
||||
/* Floating-point registers. */
|
||||
if ((regnum >= SPARC_F0_REGNUM && regnum <= SPARC_F31_REGNUM)
|
||||
|| (regnum >= SPARC64_F32_REGNUM && regnum <= SPARC64_F62_REGNUM))
|
||||
return 1;
|
||||
|
||||
/* Control registers. */
|
||||
if (regnum == SPARC64_FSR_REGNUM)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#include "sparc-nat.h"
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
void _initialize_sparc64fbsd_nat (void);
|
||||
@ -70,11 +30,5 @@ void _initialize_sparc64fbsd_nat (void);
|
||||
void
|
||||
_initialize_sparc64fbsd_nat (void)
|
||||
{
|
||||
sparcbsd_supply_reg = sparc64fbsd_supply_reg;
|
||||
sparcbsd_fill_reg = sparc64fbsd_fill_reg;
|
||||
sparcbsd_supply_fpreg = sparc64fbsd_supply_fpreg;
|
||||
sparcbsd_fill_fpreg = sparc64fbsd_fill_fpreg;
|
||||
|
||||
sparcbsd_reg_supplies_p = sparc64fbsd_reg_supplies_p;
|
||||
sparcbsd_fpreg_supplies_p = sparc64fbsd_fpreg_supplies_p;
|
||||
sparc_gregset = &sparc64fbsd_gregset;
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* Target-dependent code for FreeBSD/sparc64.
|
||||
|
||||
Copyright 2003 Free Software Foundation, Inc.
|
||||
Copyright 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -20,167 +20,37 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "defs.h"
|
||||
#include "frame.h"
|
||||
#include "frame-unwind.h"
|
||||
#include "gdbcore.h"
|
||||
#include "osabi.h"
|
||||
#include "regcache.h"
|
||||
#include "target.h"
|
||||
#include "trad-frame.h"
|
||||
|
||||
#include "gdb_assert.h"
|
||||
#include "gdb_string.h"
|
||||
|
||||
#include "sparc64-tdep.h"
|
||||
|
||||
/* From <machine/reg.h>. */
|
||||
|
||||
/* Offset of registers in `struct reg'. */
|
||||
int sparc64fbsd_r_global_offset = (0 * 8);
|
||||
int sparc64fbsd_r_out_offset = (8 * 8);
|
||||
int sparc64fbsd_r_fprs_offset = (16 * 8);
|
||||
int sparc64fbsd_r_tnpc_offset = (24 * 8);
|
||||
int sparc64fbsd_r_tpc_offset = (25 * 8);
|
||||
int sparc64fbsd_r_tstate_offset = (26 * 8);
|
||||
int sparc64fbsd_r_y_offset = (28 * 8);
|
||||
const struct sparc_gregset sparc64fbsd_gregset =
|
||||
{
|
||||
26 * 8, /* "tstate" */
|
||||
25 * 8, /* %pc */
|
||||
24 * 8, /* %npc */
|
||||
28 * 8, /* %y */
|
||||
16 * 8, /* %fprs */
|
||||
-1,
|
||||
1 * 8, /* %g1 */
|
||||
-1, /* %l0 */
|
||||
8 /* sizeof (%y) */
|
||||
};
|
||||
|
||||
|
||||
/* Size of `struct reg' and `struct fpreg'. */
|
||||
int sparc64fbsd_sizeof_struct_reg = 256;
|
||||
int sparc64fbsd_sizeof_struct_fpreg = 272;
|
||||
|
||||
void
|
||||
sparc64fbsd_supply_reg (const char *regs, int regnum)
|
||||
{
|
||||
char buf[8];
|
||||
int i;
|
||||
|
||||
if (regnum == SPARC64_PC_REGNUM || regnum == -1)
|
||||
supply_register (SPARC64_PC_REGNUM, regs + sparc64fbsd_r_tpc_offset);
|
||||
|
||||
if (regnum == SPARC64_NPC_REGNUM || regnum == -1)
|
||||
supply_register (SPARC64_NPC_REGNUM, regs + sparc64fbsd_r_tnpc_offset);
|
||||
|
||||
if (regnum == SPARC64_STATE_REGNUM || regnum == -1)
|
||||
supply_register (SPARC64_STATE_REGNUM, regs + sparc64fbsd_r_tstate_offset);
|
||||
|
||||
if (regnum == SPARC64_FPRS_REGNUM || regnum == -1)
|
||||
supply_register (SPARC64_FPRS_REGNUM, regs + sparc64fbsd_r_fprs_offset);
|
||||
|
||||
if (regnum == SPARC64_Y_REGNUM || regnum == -1)
|
||||
supply_register (SPARC64_Y_REGNUM, regs + sparc64fbsd_r_y_offset);
|
||||
|
||||
if ((regnum >= SPARC_G0_REGNUM && regnum <= SPARC_G7_REGNUM) || regnum == -1)
|
||||
{
|
||||
if (regnum == SPARC_G0_REGNUM || regnum == -1)
|
||||
supply_register (SPARC_G0_REGNUM, NULL); /* %g0 is always zero. */
|
||||
for (i = SPARC_G1_REGNUM; i <= SPARC_G7_REGNUM; i++)
|
||||
{
|
||||
if (regnum == i || regnum == -1)
|
||||
supply_register (i, (regs + sparc64fbsd_r_global_offset
|
||||
+ ((i - SPARC_G0_REGNUM) * 8)));
|
||||
}
|
||||
}
|
||||
|
||||
if ((regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM) || regnum == -1)
|
||||
{
|
||||
for (i = SPARC_O0_REGNUM; i <= SPARC_O7_REGNUM; i++)
|
||||
{
|
||||
if (regnum == i || regnum == -1)
|
||||
supply_register (i, (regs + sparc64fbsd_r_out_offset
|
||||
+ ((i - SPARC_O0_REGNUM) * 8)));
|
||||
}
|
||||
}
|
||||
|
||||
/* Inputs and Locals are stored onto the stack by by the kernel. */
|
||||
if ((regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM) || regnum == -1)
|
||||
{
|
||||
ULONGEST sp;
|
||||
|
||||
regcache_cooked_read_unsigned (current_regcache, SPARC_SP_REGNUM, &sp);
|
||||
sparc_supply_rwindow (sp, regnum);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
sparc64fbsd_fill_reg (char *regs, int regnum)
|
||||
{
|
||||
char buf[8];
|
||||
int i;
|
||||
|
||||
if (regnum == SPARC64_PC_REGNUM || regnum == -1)
|
||||
regcache_collect (SPARC64_PC_REGNUM, regs + sparc64fbsd_r_tpc_offset);
|
||||
|
||||
if (regnum == SPARC64_NPC_REGNUM || regnum == -1)
|
||||
regcache_collect (SPARC64_NPC_REGNUM, regs + sparc64fbsd_r_tnpc_offset);
|
||||
|
||||
if (regnum == SPARC64_FPRS_REGNUM || regnum == -1)
|
||||
regcache_collect (SPARC64_FPRS_REGNUM, regs + sparc64fbsd_r_fprs_offset);
|
||||
|
||||
if (regnum == SPARC64_Y_REGNUM || regnum == -1)
|
||||
regcache_collect (SPARC64_Y_REGNUM, regs + sparc64fbsd_r_y_offset);
|
||||
|
||||
if ((regnum >= SPARC_G0_REGNUM && regnum <= SPARC_G7_REGNUM) || regnum == -1)
|
||||
{
|
||||
/* %g0 is always zero. */
|
||||
for (i = SPARC_G1_REGNUM; i <= SPARC_G7_REGNUM; i++)
|
||||
{
|
||||
if (regnum == i || regnum == -1)
|
||||
regcache_collect (i, (regs + sparc64fbsd_r_global_offset
|
||||
+ ((i - SPARC_G0_REGNUM) * 8)));
|
||||
}
|
||||
}
|
||||
|
||||
if ((regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM) || regnum == -1)
|
||||
{
|
||||
for (i = SPARC_O0_REGNUM; i <= SPARC_O7_REGNUM; i++)
|
||||
{
|
||||
if (regnum == i || regnum == -1)
|
||||
regcache_collect (i, (regs + sparc64fbsd_r_out_offset
|
||||
+ ((i - SPARC_O0_REGNUM) * 8)));
|
||||
}
|
||||
}
|
||||
|
||||
/* Responsibility for the stack regs is pushed off onto the caller. */
|
||||
}
|
||||
|
||||
void
|
||||
sparc64fbsd_supply_fpreg (const char *fpregs, int regnum)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1)
|
||||
supply_register (SPARC_F0_REGNUM + i, fpregs + (i * 4));
|
||||
}
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
if (regnum == (SPARC64_F32_REGNUM + i) || regnum == -1)
|
||||
supply_register (SPARC64_F32_REGNUM + i, fpregs + (32 * 4) + (i * 8));
|
||||
}
|
||||
|
||||
if (regnum == SPARC64_FSR_REGNUM || regnum == -1)
|
||||
supply_register (SPARC64_FSR_REGNUM, fpregs + (32 * 4) + (16 * 8));
|
||||
}
|
||||
|
||||
void
|
||||
sparc64fbsd_fill_fpreg (char *fpregs, int regnum)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1)
|
||||
regcache_collect (SPARC_F0_REGNUM + i, fpregs + (i * 4));
|
||||
}
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
if (regnum == (SPARC64_F32_REGNUM + i) || regnum == -1)
|
||||
regcache_collect (SPARC64_F32_REGNUM + i, fpregs + (32 * 4) + (i * 8));
|
||||
}
|
||||
|
||||
if (regnum == SPARC64_FSR_REGNUM || regnum == -1)
|
||||
regcache_collect (SPARC64_FSR_REGNUM, fpregs + (32 * 4) + (16 * 8));
|
||||
}
|
||||
|
||||
static const int sparc64fbsd_sizeof_struct_reg = 256;
|
||||
static const int sparc64fbsd_sizeof_struct_fpreg = 272;
|
||||
|
||||
static void
|
||||
fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
|
||||
@ -192,14 +62,15 @@ fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
|
||||
if (core_reg_size != sparc64fbsd_sizeof_struct_reg)
|
||||
warning ("Wrong size register set in core file.");
|
||||
else
|
||||
sparc64fbsd_supply_reg (core_reg_sect, -1);
|
||||
sparc64_supply_gregset (&sparc64fbsd_gregset, current_regcache,
|
||||
-1, core_reg_sect);
|
||||
break;
|
||||
|
||||
case 2: /* Floating pointer registers */
|
||||
if (core_reg_size != sparc64fbsd_sizeof_struct_fpreg)
|
||||
warning ("Wrong size FP register set in core file.");
|
||||
else
|
||||
sparc64fbsd_supply_fpreg (core_reg_sect, -1);
|
||||
sparc64_supply_fpregset (current_regcache, -1, core_reg_sect);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -218,10 +89,141 @@ static struct core_fns sparc64fbsd_core_fns =
|
||||
};
|
||||
|
||||
|
||||
/* Signal trampolines. */
|
||||
|
||||
static int
|
||||
sparc64fbsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
{
|
||||
return (name && strcmp (name, "__sigtramp") == 0);
|
||||
}
|
||||
|
||||
static struct sparc_frame_cache *
|
||||
sparc64fbsd_sigtramp_frame_cache (struct frame_info *next_frame,
|
||||
void **this_cache)
|
||||
{
|
||||
struct sparc_frame_cache *cache;
|
||||
CORE_ADDR addr, mcontext_addr, sp;
|
||||
LONGEST fprs;
|
||||
int regnum;
|
||||
|
||||
if (*this_cache)
|
||||
return *this_cache;
|
||||
|
||||
cache = sparc_frame_cache (next_frame, this_cache);
|
||||
gdb_assert (cache == *this_cache);
|
||||
|
||||
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
|
||||
|
||||
/* The third argument is a pointer to an instance of `ucontext_t',
|
||||
which has a member `uc_mcontext' that contains the saved
|
||||
registers. */
|
||||
addr = frame_unwind_register_unsigned (next_frame, SPARC_O2_REGNUM);
|
||||
mcontext_addr = addr + 64;
|
||||
|
||||
/* The following registers travel in the `mc_local' slots of
|
||||
`mcontext_t'. */
|
||||
addr = mcontext_addr + 16 * 8;
|
||||
cache->saved_regs[SPARC64_FPRS_REGNUM].addr = addr + 0 * 8;
|
||||
cache->saved_regs[SPARC64_FSR_REGNUM].addr = addr + 1 * 8;
|
||||
|
||||
/* The following registers travel in the `mc_in' slots of
|
||||
`mcontext_t'. */
|
||||
addr = mcontext_addr + 24 * 8;
|
||||
cache->saved_regs[SPARC64_NPC_REGNUM].addr = addr + 0 * 8;
|
||||
cache->saved_regs[SPARC64_PC_REGNUM].addr = addr + 1 * 8;
|
||||
cache->saved_regs[SPARC64_STATE_REGNUM].addr = addr + 2 * 8;
|
||||
cache->saved_regs[SPARC64_Y_REGNUM].addr = addr + 4 * 8;
|
||||
|
||||
/* The `global' and `out' registers travel in the `mc_global' and
|
||||
`mc_out' slots of `mcontext_t', except for %g0. Since %g0 is
|
||||
always zero, keep the identity encoding. */
|
||||
for (regnum = SPARC_G1_REGNUM, addr = mcontext_addr + 8;
|
||||
regnum <= SPARC_O7_REGNUM; regnum++, addr += 8)
|
||||
cache->saved_regs[regnum].addr = addr;
|
||||
|
||||
/* The `local' and `in' registers have been saved in the register
|
||||
save area. */
|
||||
addr = cache->saved_regs[SPARC_SP_REGNUM].addr;
|
||||
sp = get_frame_memory_unsigned (next_frame, addr, 8);
|
||||
for (regnum = SPARC_L0_REGNUM, addr = sp + BIAS;
|
||||
regnum <= SPARC_I7_REGNUM; regnum++, addr += 8)
|
||||
cache->saved_regs[regnum].addr = addr;
|
||||
|
||||
/* The floating-point registers are only saved if the FEF bit in
|
||||
%fprs has been set. */
|
||||
|
||||
#define FPRS_FEF (1 << 2)
|
||||
|
||||
addr = cache->saved_regs[SPARC64_FPRS_REGNUM].addr;
|
||||
fprs = get_frame_memory_unsigned (next_frame, addr, 8);
|
||||
if (fprs & FPRS_FEF)
|
||||
{
|
||||
for (regnum = SPARC_F0_REGNUM, addr = mcontext_addr + 32 * 8;
|
||||
regnum <= SPARC_F31_REGNUM; regnum++, addr += 4)
|
||||
cache->saved_regs[regnum].addr = addr;
|
||||
|
||||
for (regnum = SPARC64_F32_REGNUM;
|
||||
regnum <= SPARC64_F62_REGNUM; regnum++, addr += 8)
|
||||
cache->saved_regs[regnum].addr = addr;
|
||||
}
|
||||
|
||||
return cache;
|
||||
}
|
||||
|
||||
static void
|
||||
sparc64fbsd_sigtramp_frame_this_id (struct frame_info *next_frame,
|
||||
void **this_cache,
|
||||
struct frame_id *this_id)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc64fbsd_sigtramp_frame_cache (next_frame, this_cache);
|
||||
|
||||
(*this_id) = frame_id_build (cache->base, cache->pc);
|
||||
}
|
||||
|
||||
static void
|
||||
sparc64fbsd_sigtramp_frame_prev_register (struct frame_info *next_frame,
|
||||
void **this_cache,
|
||||
int regnum, int *optimizedp,
|
||||
enum lval_type *lvalp,
|
||||
CORE_ADDR *addrp,
|
||||
int *realnump, void *valuep)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc64fbsd_sigtramp_frame_cache (next_frame, this_cache);
|
||||
|
||||
trad_frame_prev_register (next_frame, cache->saved_regs, regnum,
|
||||
optimizedp, lvalp, addrp, realnump, valuep);
|
||||
}
|
||||
|
||||
static const struct frame_unwind sparc64fbsd_sigtramp_frame_unwind =
|
||||
{
|
||||
SIGTRAMP_FRAME,
|
||||
sparc64fbsd_sigtramp_frame_this_id,
|
||||
sparc64fbsd_sigtramp_frame_prev_register
|
||||
};
|
||||
|
||||
static const struct frame_unwind *
|
||||
sparc64fbsd_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
if (sparc64fbsd_pc_in_sigtramp (pc, name))
|
||||
return &sparc64fbsd_sigtramp_frame_unwind;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
sparc64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
{
|
||||
/* Nothing yet. */
|
||||
set_gdbarch_pc_in_sigtramp (gdbarch, sparc64fbsd_pc_in_sigtramp);
|
||||
frame_unwind_append_sniffer (gdbarch, sparc64fbsd_sigtramp_frame_sniffer);
|
||||
|
||||
sparc64_init_abi (info, gdbarch);
|
||||
}
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* Native-dependent code for UltraSPARC systems running NetBSD.
|
||||
Copyright 2002, 2003 Free Software Foundation, Inc.
|
||||
Contributed by Wasabi Systems, Inc.
|
||||
/* Native-dependent code for NetBSD/sparc64.
|
||||
|
||||
Copyright 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -20,189 +20,120 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "defs.h"
|
||||
#include "inferior.h"
|
||||
#include "regcache.h"
|
||||
|
||||
#include "sparc-tdep.h"
|
||||
#include "sparcnbsd-tdep.h"
|
||||
#include "sparc64-tdep.h"
|
||||
#include "sparc-nat.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/ptrace.h>
|
||||
#include <machine/reg.h>
|
||||
/* NetBSD is different from the other OSes that support both SPARC and
|
||||
UltraSPARC in that the result of ptrace(2) depends on whether the
|
||||
traced process is 32-bit or 64-bit. */
|
||||
|
||||
/* NOTE: We don't bother with any of the deferred_store nonsense; it
|
||||
makes things a lot more complicated than they need to be. */
|
||||
|
||||
/* Determine if PT_GETREGS fetches this register. */
|
||||
static int
|
||||
getregs_supplies (int regno)
|
||||
static void
|
||||
sparc64nbsd_supply_gregset (const struct sparc_gregset *gregset,
|
||||
struct regcache *regcache,
|
||||
int regnum, const void *gregs)
|
||||
{
|
||||
/* FIXME: PS_REGNUM for 32-bit code. */
|
||||
return (regno == TSTATE_REGNUM
|
||||
|| regno == PC_REGNUM
|
||||
|| regno == DEPRECATED_NPC_REGNUM
|
||||
|| regno == Y_REGNUM
|
||||
|| (regno >= G0_REGNUM && regno <= G7_REGNUM)
|
||||
|| (regno >= O0_REGNUM && regno <= O7_REGNUM)
|
||||
/* stack regs (handled by sparcnbsd_supply_reg) */
|
||||
|| (regno >= L0_REGNUM && regno <= I7_REGNUM));
|
||||
int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32);
|
||||
|
||||
if (sparc32)
|
||||
sparc32_supply_gregset (&sparc32nbsd_gregset, regcache, regnum, gregs);
|
||||
else
|
||||
sparc64_supply_gregset (&sparc64nbsd_gregset, regcache, regnum, gregs);
|
||||
}
|
||||
|
||||
/* Determine if PT_GETFPREGS fetches this register. */
|
||||
static int
|
||||
getfpregs_supplies (int regno)
|
||||
static void
|
||||
sparc64nbsd_collect_gregset (const struct sparc_gregset *gregset,
|
||||
const struct regcache *regcache,
|
||||
int regnum, void *gregs)
|
||||
{
|
||||
return ((regno >= FP0_REGNUM && regno <= (FP0_REGNUM + 47))
|
||||
|| regno == FPS_REGNUM);
|
||||
int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32);
|
||||
|
||||
if (sparc32)
|
||||
sparc32_collect_gregset (&sparc32nbsd_gregset, regcache, regnum, gregs);
|
||||
else
|
||||
sparc64_collect_gregset (&sparc64nbsd_gregset, regcache, regnum, gregs);
|
||||
}
|
||||
|
||||
static void
|
||||
sparc64nbsd_supply_fpregset (struct regcache *regcache,
|
||||
int regnum, const void *fpregs)
|
||||
{
|
||||
int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32);
|
||||
|
||||
if (sparc32)
|
||||
sparc32_supply_fpregset (regcache, regnum, fpregs);
|
||||
else
|
||||
sparc64_supply_fpregset (regcache, regnum, fpregs);
|
||||
}
|
||||
|
||||
static void
|
||||
sparc64nbsd_collect_fpregset (const struct regcache *regcache,
|
||||
int regnum, void *fpregs)
|
||||
{
|
||||
int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32);
|
||||
|
||||
if (sparc32)
|
||||
sparc32_collect_fpregset (regcache, regnum, fpregs);
|
||||
else
|
||||
sparc64_collect_fpregset (regcache, regnum, fpregs);
|
||||
}
|
||||
|
||||
/* Determine whether `gregset_t' contains register REGNUM. */
|
||||
|
||||
static int
|
||||
sparc64nbsd_gregset_supplies_p (int regnum)
|
||||
{
|
||||
if (gdbarch_ptr_bit (current_gdbarch) == 32)
|
||||
return sparc32_gregset_supplies_p (regnum);
|
||||
|
||||
/* Integer registers. */
|
||||
if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_G7_REGNUM)
|
||||
|| (regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM)
|
||||
|| (regnum >= SPARC_L0_REGNUM && regnum <= SPARC_L7_REGNUM)
|
||||
|| (regnum >= SPARC_I0_REGNUM && regnum <= SPARC_I7_REGNUM))
|
||||
return 1;
|
||||
|
||||
/* Control registers. */
|
||||
if (regnum == SPARC64_PC_REGNUM
|
||||
|| regnum == SPARC64_NPC_REGNUM
|
||||
|| regnum == SPARC64_STATE_REGNUM
|
||||
|| regnum == SPARC64_Y_REGNUM)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Determine whether `fpregset_t' contains register REGNUM. */
|
||||
|
||||
static int
|
||||
sparc64nbsd_fpregset_supplies_p (int regnum)
|
||||
{
|
||||
if (gdbarch_ptr_bit (current_gdbarch) == 32)
|
||||
return sparc32_fpregset_supplies_p (regnum);
|
||||
|
||||
/* Floating-point registers. */
|
||||
if ((regnum >= SPARC_F0_REGNUM && regnum <= SPARC_F31_REGNUM)
|
||||
|| (regnum >= SPARC64_F32_REGNUM && regnum <= SPARC64_F62_REGNUM))
|
||||
return 1;
|
||||
|
||||
/* Control registers. */
|
||||
if (regnum == SPARC64_FSR_REGNUM)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
void _initialize_sparcnbsd_nat (void);
|
||||
|
||||
void
|
||||
fetch_inferior_registers (int regno)
|
||||
_initialize_sparcnbsd_nat (void)
|
||||
{
|
||||
/* We don't use deferred stores. */
|
||||
if (deferred_stores)
|
||||
internal_error (__FILE__, __LINE__,
|
||||
"fetch_inferior_registers: deferred stores pending");
|
||||
|
||||
if (regno == -1 || getregs_supplies (regno))
|
||||
{
|
||||
union {
|
||||
struct reg32 regs32;
|
||||
struct reg64 regs64;
|
||||
} regs;
|
||||
|
||||
if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) ®s, 0) == -1)
|
||||
perror_with_name ("Couldn't get registers");
|
||||
|
||||
if (gdbarch_ptr_bit (current_gdbarch) == 32)
|
||||
sparcnbsd_supply_reg32 ((char *) ®s.regs32, regno);
|
||||
else
|
||||
sparcnbsd_supply_reg64 ((char *) ®s.regs64, regno);
|
||||
if (regno != -1)
|
||||
return;
|
||||
}
|
||||
|
||||
if (regno == -1 || getfpregs_supplies (regno))
|
||||
{
|
||||
union {
|
||||
struct fpreg32 fpregs32;
|
||||
struct fpreg64 fpregs64;
|
||||
} fpregs;
|
||||
|
||||
if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
|
||||
perror_with_name ("Couldn't get floating point registers");
|
||||
|
||||
if (gdbarch_ptr_bit (current_gdbarch) == 32)
|
||||
sparcnbsd_supply_fpreg32 ((char *) &fpregs.fpregs32, regno);
|
||||
else
|
||||
sparcnbsd_supply_fpreg64 ((char *) &fpregs.fpregs64, regno);
|
||||
if (regno != -1)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
store_inferior_registers (int regno)
|
||||
{
|
||||
/* We don't use deferred stores. */
|
||||
if (deferred_stores)
|
||||
internal_error (__FILE__, __LINE__,
|
||||
"store_inferior_registers: deferred stores pending");
|
||||
|
||||
if (regno == -1 || getregs_supplies (regno))
|
||||
{
|
||||
union {
|
||||
struct reg32 regs32;
|
||||
struct reg64 regs64;
|
||||
} regs;
|
||||
|
||||
if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) ®s, 0) == -1)
|
||||
perror_with_name ("Couldn't get registers");
|
||||
|
||||
if (gdbarch_ptr_bit (current_gdbarch) == 32)
|
||||
sparcnbsd_fill_reg32 ((char *) ®s.regs32, regno);
|
||||
else
|
||||
sparcnbsd_fill_reg64 ((char *) ®s.regs64, regno);
|
||||
|
||||
if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) ®s, 0) == -1)
|
||||
perror_with_name ("Couldn't write registers");
|
||||
|
||||
/* Deal with the stack regs. */
|
||||
if (regno == -1 || regno == SP_REGNUM
|
||||
|| (regno >= L0_REGNUM && regno <= I7_REGNUM))
|
||||
{
|
||||
CORE_ADDR sp = read_register (SP_REGNUM);
|
||||
int i;
|
||||
char buf[8];
|
||||
|
||||
if (sp & 1)
|
||||
{
|
||||
/* Registers are 64-bit. */
|
||||
sp += 2047;
|
||||
|
||||
for (i = L0_REGNUM; i <= I7_REGNUM; i++)
|
||||
{
|
||||
if (regno == -1 || regno == SP_REGNUM || regno == i)
|
||||
{
|
||||
regcache_collect (i, buf);
|
||||
target_write_memory (sp + ((i - L0_REGNUM) * 8),
|
||||
buf, sizeof (buf));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Registers are 32-bit. Toss any sign-extension of the stack
|
||||
pointer.
|
||||
|
||||
FIXME: We don't currently handle 32-bit code in a binary
|
||||
that indicated LP64. Do we have to care about that? */
|
||||
if (gdbarch_ptr_bit (current_gdbarch) != 32)
|
||||
internal_error
|
||||
(__FILE__, __LINE__,
|
||||
"store_inferior_registers: 32-bit code in 64-bit inferior");
|
||||
|
||||
sp &= 0xffffffffUL;
|
||||
for (i = L0_REGNUM; i <= I7_REGNUM; i++)
|
||||
{
|
||||
if (regno == -1 || regno == SP_REGNUM || regno == i)
|
||||
{
|
||||
regcache_collect (i, buf);
|
||||
target_write_memory (sp + ((i - L0_REGNUM) * 4), buf, 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (regno != -1)
|
||||
return;
|
||||
}
|
||||
|
||||
if (regno == -1 || getfpregs_supplies (regno))
|
||||
{
|
||||
union {
|
||||
struct fpreg32 fpregs32;
|
||||
struct fpreg64 fpregs64;
|
||||
} fpregs;
|
||||
|
||||
if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
|
||||
perror_with_name ("Couldn't get floating point registers");
|
||||
|
||||
if (gdbarch_ptr_bit (current_gdbarch) == 32)
|
||||
sparcnbsd_fill_fpreg32 ((char *) &fpregs.fpregs32, regno);
|
||||
else
|
||||
sparcnbsd_fill_fpreg64 ((char *) &fpregs.fpregs64, regno);
|
||||
|
||||
if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
|
||||
perror_with_name ("Couldn't write floating point registers");
|
||||
|
||||
if (regno != -1)
|
||||
return;
|
||||
}
|
||||
sparc_supply_gregset = sparc64nbsd_supply_gregset;
|
||||
sparc_collect_gregset = sparc64nbsd_collect_gregset;
|
||||
sparc_supply_fpregset = sparc64nbsd_supply_fpregset;
|
||||
sparc_collect_fpregset = sparc64nbsd_collect_fpregset;
|
||||
sparc_gregset_supplies_p = sparc64nbsd_gregset_supplies_p;
|
||||
sparc_fpregset_supplies_p = sparc64nbsd_fpregset_supplies_p;
|
||||
}
|
||||
|
258
gdb/sparc64nbsd-tdep.c
Normal file
258
gdb/sparc64nbsd-tdep.c
Normal file
@ -0,0 +1,258 @@
|
||||
/* Target-dependent code for NetBSD/sparc64.
|
||||
|
||||
Copyright 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
Based on code contributed by Wasabi Systems, 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 "frame-unwind.h"
|
||||
#include "gdbcore.h"
|
||||
#include "osabi.h"
|
||||
#include "regcache.h"
|
||||
#include "symtab.h"
|
||||
#include "solib-svr4.h"
|
||||
#include "trad-frame.h"
|
||||
|
||||
#include "gdb_assert.h"
|
||||
#include "gdb_string.h"
|
||||
|
||||
#include "sparc64-tdep.h"
|
||||
#include "nbsd-tdep.h"
|
||||
|
||||
/* From <machine/reg.h>. */
|
||||
const struct sparc_gregset sparc64nbsd_gregset =
|
||||
{
|
||||
0 * 8, /* "tstate" */
|
||||
1 * 8, /* %pc */
|
||||
2 * 8, /* %npc */
|
||||
3 * 8, /* %y */
|
||||
-1, /* %fprs */
|
||||
-1,
|
||||
5 * 8, /* %g1 */
|
||||
-1, /* %l0 */
|
||||
4 /* sizeof (%y) */
|
||||
};
|
||||
|
||||
/* Size of `struct reg' and `struct fpreg'. */
|
||||
static const int sparc64nbsd_sizeof_struct_reg = 160;
|
||||
static const int sparc64nbsd_sizeof_struct_fpreg = 272;
|
||||
|
||||
static void
|
||||
fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
|
||||
CORE_ADDR ignore)
|
||||
{
|
||||
switch (which)
|
||||
{
|
||||
case 0: /* Integer registers */
|
||||
if (core_reg_size != sparc64nbsd_sizeof_struct_reg)
|
||||
warning ("Wrong size register set in core file.");
|
||||
else
|
||||
sparc64_supply_gregset (&sparc64nbsd_gregset, current_regcache,
|
||||
-1, core_reg_sect);
|
||||
break;
|
||||
|
||||
case 2: /* Floating pointer registers */
|
||||
if (core_reg_size != sparc64nbsd_sizeof_struct_fpreg)
|
||||
warning ("Wrong size FP register set in core file.");
|
||||
else
|
||||
sparc64_supply_fpregset (current_regcache, -1, core_reg_sect);
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Don't know what kind of register request this is; just ignore it. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct core_fns sparc64nbsd_core_fns =
|
||||
{
|
||||
bfd_target_elf_flavour, /* core_flavour */
|
||||
default_check_format, /* check_format */
|
||||
default_core_sniffer, /* core_sniffer */
|
||||
fetch_core_registers, /* core_read_registers */
|
||||
NULL
|
||||
};
|
||||
|
||||
/* Signal trampolines. */
|
||||
|
||||
/* The following variables describe the location of an on-stack signal
|
||||
trampoline. The current values correspond to the memory layout for
|
||||
NetBSD 1.3 and up. These shouldn't be necessary for NetBSD 2.0 and
|
||||
up, since NetBSD uses signal trampolines provided by libc now. */
|
||||
|
||||
static const CORE_ADDR sparc64nbsd_sigtramp_start = 0xffffffffffffdee4ULL;
|
||||
static const CORE_ADDR sparc64nbsd_sigtramp_end = 0xffffffffffffe000ULL;
|
||||
|
||||
static int
|
||||
sparc64nbsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
{
|
||||
if (pc >= sparc64nbsd_sigtramp_start && pc < sparc64nbsd_sigtramp_end)
|
||||
return 1;
|
||||
|
||||
return nbsd_pc_in_sigtramp (pc, name);
|
||||
}
|
||||
|
||||
static struct sparc_frame_cache *
|
||||
sparc64nbsd_sigcontext_frame_cache (struct frame_info *next_frame,
|
||||
void **this_cache)
|
||||
{
|
||||
struct sparc_frame_cache *cache;
|
||||
CORE_ADDR addr, sigcontext_addr, sp;
|
||||
LONGEST fprs;
|
||||
int regnum, delta;
|
||||
|
||||
if (*this_cache)
|
||||
return *this_cache;
|
||||
|
||||
cache = sparc_frame_cache (next_frame, this_cache);
|
||||
gdb_assert (cache == *this_cache);
|
||||
|
||||
/* The registers are saved in bits and pieces scattered all over the
|
||||
place. The code below records their location on the assumption
|
||||
that the part of the signal trampoline that saves the state has
|
||||
been executed. */
|
||||
|
||||
/* If we couldn't find the frame's function, we're probably dealing
|
||||
with an on-stack signal trampoline. */
|
||||
if (cache->pc == 0)
|
||||
{
|
||||
cache->pc = sparc64nbsd_sigtramp_start;
|
||||
|
||||
/* Since we couldn't find the frame's function, the cache was
|
||||
initialized under the assumption that we're frameless. */
|
||||
cache->frameless_p = 0;
|
||||
addr = frame_unwind_register_unsigned (next_frame, SPARC_FP_REGNUM);
|
||||
cache->base = addr;
|
||||
}
|
||||
|
||||
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
|
||||
|
||||
/* We find the appropriate instance of `struct sigcontext' at a
|
||||
fixed offset in the signal frame. */
|
||||
sigcontext_addr = cache->base + BIAS + 128 + 8;
|
||||
|
||||
cache->saved_regs[SPARC_SP_REGNUM].addr = sigcontext_addr + 8;
|
||||
cache->saved_regs[SPARC64_PC_REGNUM].addr = sigcontext_addr + 16;
|
||||
cache->saved_regs[SPARC64_NPC_REGNUM].addr = sigcontext_addr + 24;
|
||||
cache->saved_regs[SPARC64_STATE_REGNUM].addr = sigcontext_addr + 32;
|
||||
cache->saved_regs[SPARC_G1_REGNUM].addr = sigcontext_addr + 40;
|
||||
cache->saved_regs[SPARC_O0_REGNUM].addr = sigcontext_addr + 48;
|
||||
|
||||
/* The remaining `global' registers and %y are saved in the `local'
|
||||
registers. */
|
||||
delta = SPARC_L0_REGNUM - SPARC_G0_REGNUM;
|
||||
for (regnum = SPARC_G2_REGNUM; regnum <= SPARC_G7_REGNUM; regnum++)
|
||||
cache->saved_regs[regnum].realreg = regnum + delta;
|
||||
cache->saved_regs[SPARC64_Y_REGNUM].realreg = SPARC_L1_REGNUM;
|
||||
|
||||
/* The remaining `out' registers can be found in the current frame's
|
||||
`in' registers. */
|
||||
delta = SPARC_I0_REGNUM - SPARC_O0_REGNUM;
|
||||
for (regnum = SPARC_O1_REGNUM; regnum <= SPARC_O5_REGNUM; regnum++)
|
||||
cache->saved_regs[regnum].realreg = regnum + delta;
|
||||
cache->saved_regs[SPARC_O7_REGNUM].realreg = SPARC_I7_REGNUM;
|
||||
|
||||
/* The `local' and `in' registers have been saved in the register
|
||||
save area. */
|
||||
addr = cache->saved_regs[SPARC_SP_REGNUM].addr;
|
||||
sp = get_frame_memory_unsigned (next_frame, addr, 8);
|
||||
for (regnum = SPARC_L0_REGNUM, addr = sp + BIAS;
|
||||
regnum <= SPARC_I7_REGNUM; regnum++, addr += 8)
|
||||
cache->saved_regs[regnum].addr = addr;
|
||||
|
||||
/* TODO: Handle the floating-point registers. */
|
||||
|
||||
return cache;
|
||||
}
|
||||
|
||||
static void
|
||||
sparc64nbsd_sigcontext_frame_this_id (struct frame_info *next_frame,
|
||||
void **this_cache,
|
||||
struct frame_id *this_id)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc64nbsd_sigcontext_frame_cache (next_frame, this_cache);
|
||||
|
||||
(*this_id) = frame_id_build (cache->base, cache->pc);
|
||||
}
|
||||
|
||||
static void
|
||||
sparc64nbsd_sigcontext_frame_prev_register (struct frame_info *next_frame,
|
||||
void **this_cache,
|
||||
int regnum, int *optimizedp,
|
||||
enum lval_type *lvalp,
|
||||
CORE_ADDR *addrp,
|
||||
int *realnump, void *valuep)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc64nbsd_sigcontext_frame_cache (next_frame, this_cache);
|
||||
|
||||
trad_frame_prev_register (next_frame, cache->saved_regs, regnum,
|
||||
optimizedp, lvalp, addrp, realnump, valuep);
|
||||
}
|
||||
|
||||
static const struct frame_unwind sparc64nbsd_sigcontext_frame_unwind =
|
||||
{
|
||||
SIGTRAMP_FRAME,
|
||||
sparc64nbsd_sigcontext_frame_this_id,
|
||||
sparc64nbsd_sigcontext_frame_prev_register
|
||||
};
|
||||
|
||||
static const struct frame_unwind *
|
||||
sparc64nbsd_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
if (sparc64nbsd_pc_in_sigtramp (pc, name))
|
||||
{
|
||||
if (name == NULL || strncmp (name, "__sigtramp_sigcontext", 21))
|
||||
return &sparc64nbsd_sigcontext_frame_unwind;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
sparc64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
{
|
||||
set_gdbarch_pc_in_sigtramp (gdbarch, sparc64nbsd_pc_in_sigtramp);
|
||||
frame_unwind_append_sniffer (gdbarch, sparc64nbsd_sigtramp_frame_sniffer);
|
||||
|
||||
sparc64_init_abi (info, gdbarch);
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, nbsd_lp64_solib_svr4_fetch_link_map_offsets);
|
||||
}
|
||||
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
void _initialize_sparc64nbsd_tdep (void);
|
||||
|
||||
void
|
||||
_initialize_sparc64nbsd_tdep (void)
|
||||
{
|
||||
gdbarch_register_osabi (bfd_arch_sparc, bfd_mach_sparc_v9,
|
||||
GDB_OSABI_NETBSD_ELF, sparc64nbsd_init_abi);
|
||||
|
||||
add_core_fns (&sparc64nbsd_core_fns);
|
||||
}
|
@ -1,126 +0,0 @@
|
||||
/* Native-dependent code for SPARC BSD's.
|
||||
|
||||
Copyright 2002, 2003 Free Software Foundation, Inc.
|
||||
Based on code contributed by Wasabi Systems, 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 "regcache.h"
|
||||
|
||||
/* FIXME: Should be changed to sparc-tdep.h when the old code is gone. */
|
||||
#include "sparc64-tdep.h"
|
||||
#include "sparcbsd-nat.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/ptrace.h>
|
||||
#include <machine/reg.h>
|
||||
|
||||
/* Functions translating between `struct reg' and `struct fpreg' and
|
||||
GDB's register cache. */
|
||||
void (*sparcbsd_supply_reg)(const char *, int);
|
||||
void (*sparcbsd_fill_reg)(char *, int);
|
||||
void (*sparcbsd_supply_fpreg)(const char *, int);
|
||||
void (*sparcbsd_fill_fpreg)(char *, int);
|
||||
|
||||
/* Functions indication whether `struct reg' or `struct fpreg' provides
|
||||
a certain register. */
|
||||
int (*sparcbsd_reg_supplies_p)(int);
|
||||
int (*sparcbsd_fpreg_supplies_p)(int);
|
||||
|
||||
void
|
||||
fetch_inferior_registers (int regnum)
|
||||
{
|
||||
if (regnum == -1 || sparcbsd_reg_supplies_p (regnum))
|
||||
{
|
||||
struct reg regs;
|
||||
|
||||
if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) ®s, 0) == -1)
|
||||
perror_with_name ("Couldn't get registers");
|
||||
|
||||
sparcbsd_supply_reg ((char *) ®s, regnum);
|
||||
if (regnum != -1)
|
||||
return;
|
||||
}
|
||||
|
||||
if (regnum == -1 || sparcbsd_fpreg_supplies_p (regnum))
|
||||
{
|
||||
struct fpreg fpregs;
|
||||
|
||||
if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
|
||||
perror_with_name ("Couldn't get floating-point registers");
|
||||
|
||||
sparcbsd_supply_fpreg ((char *) &fpregs, regnum);
|
||||
if (regnum != -1)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
store_inferior_registers (int regnum)
|
||||
{
|
||||
if (regnum == -1 || sparcbsd_reg_supplies_p (regnum))
|
||||
{
|
||||
struct reg regs;
|
||||
|
||||
if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) ®s, 0) == -1)
|
||||
perror_with_name ("Couldn't get registers");
|
||||
|
||||
sparcbsd_fill_reg ((char *) ®s, regnum);
|
||||
|
||||
if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) ®s, 0) == -1)
|
||||
perror_with_name ("Couldn't write registers");
|
||||
|
||||
/* Deal with the stack regs. */
|
||||
if (regnum == -1 || regnum == SPARC_SP_REGNUM
|
||||
|| (regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM))
|
||||
{
|
||||
ULONGEST sp;
|
||||
|
||||
regcache_cooked_read_unsigned (current_regcache,
|
||||
SPARC_SP_REGNUM, &sp);
|
||||
sparc_fill_rwindow (sp, regnum);
|
||||
}
|
||||
|
||||
if (regnum != -1)
|
||||
return;
|
||||
}
|
||||
|
||||
if (regnum == -1 || sparcbsd_fpreg_supplies_p (regnum))
|
||||
{
|
||||
struct fpreg fpregs;
|
||||
|
||||
if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
|
||||
perror_with_name ("Couldn't get floating-point registers");
|
||||
|
||||
sparcbsd_fill_fpreg ((char *) &fpregs, regnum);
|
||||
|
||||
if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
|
||||
perror_with_name ("Couldn't write floating-point registers");
|
||||
|
||||
if (regnum != -1)
|
||||
return;
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
/* Native-dependent code for SPARC systems running NetBSD.
|
||||
Copyright 2002, 2003 Free Software Foundation, Inc.
|
||||
Contributed by Wasabi Systems, Inc.
|
||||
/* Native-dependent code for NetBSD/sparc.
|
||||
|
||||
Copyright 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -20,136 +20,15 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "defs.h"
|
||||
#include "inferior.h"
|
||||
#include "regcache.h"
|
||||
|
||||
#include "sparc-tdep.h"
|
||||
#include "sparcnbsd-tdep.h"
|
||||
#include "sparc-nat.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/ptrace.h>
|
||||
#include <machine/reg.h>
|
||||
|
||||
/* NOTE: We don't bother with any of the deferred_store nonsense; it
|
||||
makes things a lot more complicated than they need to be. */
|
||||
|
||||
/* Determine if PT_GETREGS fetches this register. */
|
||||
static int
|
||||
getregs_supplies (int regno)
|
||||
{
|
||||
return (regno == PS_REGNUM
|
||||
|| regno == PC_REGNUM
|
||||
|| regno == DEPRECATED_NPC_REGNUM
|
||||
|| regno == Y_REGNUM
|
||||
|| (regno >= G0_REGNUM && regno <= G7_REGNUM)
|
||||
|| (regno >= O0_REGNUM && regno <= O7_REGNUM)
|
||||
/* stack regs (handled by sparcnbsd_supply_reg) */
|
||||
|| (regno >= L0_REGNUM && regno <= I7_REGNUM));
|
||||
}
|
||||
|
||||
/* Determine if PT_GETFPREGS fetches this register. */
|
||||
static int
|
||||
getfpregs_supplies (int regno)
|
||||
{
|
||||
return ((regno >= FP0_REGNUM && regno <= (FP0_REGNUM + 31))
|
||||
|| regno == FPS_REGNUM);
|
||||
}
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
void _initialize_sparcnbsd_nat (void);
|
||||
|
||||
void
|
||||
fetch_inferior_registers (int regno)
|
||||
_initialize_sparcnbsd_nat (void)
|
||||
{
|
||||
/* We don't use deferred stores. */
|
||||
if (deferred_stores)
|
||||
internal_error (__FILE__, __LINE__,
|
||||
"fetch_inferior_registers: deferred stores pending");
|
||||
|
||||
if (regno == -1 || getregs_supplies (regno))
|
||||
{
|
||||
struct reg regs;
|
||||
|
||||
if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) ®s, 0) == -1)
|
||||
perror_with_name ("Couldn't get registers");
|
||||
|
||||
sparcnbsd_supply_reg32 ((char *) ®s, regno);
|
||||
if (regno != -1)
|
||||
return;
|
||||
}
|
||||
|
||||
if (regno == -1 || getfpregs_supplies (regno))
|
||||
{
|
||||
struct fpreg fpregs;
|
||||
|
||||
if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
|
||||
perror_with_name ("Couldn't get floating point registers");
|
||||
|
||||
sparcnbsd_supply_fpreg32 ((char *) &fpregs, regno);
|
||||
if (regno != -1)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
store_inferior_registers (int regno)
|
||||
{
|
||||
/* We don't use deferred stores. */
|
||||
if (deferred_stores)
|
||||
internal_error (__FILE__, __LINE__,
|
||||
"store_inferior_registers: deferred stores pending");
|
||||
|
||||
if (regno == -1 || getregs_supplies (regno))
|
||||
{
|
||||
struct reg regs;
|
||||
|
||||
if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) ®s, 0) == -1)
|
||||
perror_with_name ("Couldn't get registers");
|
||||
|
||||
sparcnbsd_fill_reg32 ((char *) ®s, regno);
|
||||
|
||||
if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) ®s, 0) == -1)
|
||||
perror_with_name ("Couldn't write registers");
|
||||
|
||||
/* Deal with the stack regs. */
|
||||
if (regno == -1 || regno == SP_REGNUM
|
||||
|| (regno >= L0_REGNUM && regno <= I7_REGNUM))
|
||||
{
|
||||
CORE_ADDR sp = read_register (SP_REGNUM);
|
||||
int i;
|
||||
char buf[4];
|
||||
|
||||
for (i = L0_REGNUM; i <= I7_REGNUM; i++)
|
||||
{
|
||||
if (regno == -1 || regno == SP_REGNUM || regno == i)
|
||||
{
|
||||
regcache_collect (i, buf);
|
||||
target_write_memory (sp + ((i - L0_REGNUM) * 4),
|
||||
buf, sizeof (buf));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (regno != -1)
|
||||
return;
|
||||
}
|
||||
|
||||
if (regno == -1 || getfpregs_supplies (regno))
|
||||
{
|
||||
struct fpreg fpregs;
|
||||
|
||||
if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
|
||||
perror_with_name ("Couldn't get floating point registers");
|
||||
|
||||
sparcnbsd_fill_fpreg32 ((char *) &fpregs, regno);
|
||||
|
||||
if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
|
||||
(PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
|
||||
perror_with_name ("Couldn't write floating point registers");
|
||||
|
||||
if (regno != -1)
|
||||
return;
|
||||
}
|
||||
sparc_gregset = &sparc32nbsd_gregset;
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* Target-dependent code for SPARC systems running NetBSD.
|
||||
Copyright 2002, 2003 Free Software Foundation, Inc.
|
||||
/* Target-dependent code for NetBSD/sparc.
|
||||
|
||||
Copyright 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
Contributed by Wasabi Systems, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
@ -20,394 +21,58 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "defs.h"
|
||||
#include "floatformat.h"
|
||||
#include "frame.h"
|
||||
#include "frame-unwind.h"
|
||||
#include "gdbcore.h"
|
||||
#include "regcache.h"
|
||||
#include "target.h"
|
||||
#include "value.h"
|
||||
#include "osabi.h"
|
||||
#include "regcache.h"
|
||||
#include "solib-svr4.h"
|
||||
#include "symtab.h"
|
||||
#include "trad-frame.h"
|
||||
|
||||
#include "gdb_assert.h"
|
||||
#include "gdb_string.h"
|
||||
|
||||
#include "sparc-tdep.h"
|
||||
#include "sparcnbsd-tdep.h"
|
||||
#include "nbsd-tdep.h"
|
||||
|
||||
#include "solib-svr4.h"
|
||||
|
||||
#define REG32_OFFSET_PSR (0 * 4)
|
||||
#define REG32_OFFSET_PC (1 * 4)
|
||||
#define REG32_OFFSET_NPC (2 * 4)
|
||||
#define REG32_OFFSET_Y (3 * 4)
|
||||
#define REG32_OFFSET_GLOBAL (4 * 4)
|
||||
#define REG32_OFFSET_OUT (12 * 4)
|
||||
|
||||
#define REG64_OFFSET_TSTATE (0 * 8)
|
||||
#define REG64_OFFSET_PC (1 * 8)
|
||||
#define REG64_OFFSET_NPC (2 * 8)
|
||||
#define REG64_OFFSET_Y (3 * 8)
|
||||
#define REG64_OFFSET_GLOBAL (4 * 8)
|
||||
#define REG64_OFFSET_OUT (12 * 8)
|
||||
|
||||
void
|
||||
sparcnbsd_supply_reg32 (char *regs, int regno)
|
||||
const struct sparc_gregset sparc32nbsd_gregset =
|
||||
{
|
||||
int i;
|
||||
0 * 4, /* %psr */
|
||||
1 * 4, /* %pc */
|
||||
2 * 4, /* %npc */
|
||||
3 * 4, /* %y */
|
||||
-1, /* %wim */
|
||||
-1, /* %tbr */
|
||||
5 * 4, /* %g1 */
|
||||
-1 /* %l0 */
|
||||
};
|
||||
|
||||
if (regno == PS_REGNUM || regno == -1)
|
||||
supply_register (PS_REGNUM, regs + REG32_OFFSET_PSR);
|
||||
/* Unlike other NetBSD implementations, the SPARC port historically
|
||||
used .reg and .reg2 (see bfd/netbsd-core.c), and as such, we can
|
||||
share one routine for a.out and ELF core files. */
|
||||
|
||||
if (regno == PC_REGNUM || regno == -1)
|
||||
supply_register (PC_REGNUM, regs + REG32_OFFSET_PC);
|
||||
|
||||
if (regno == DEPRECATED_NPC_REGNUM || regno == -1)
|
||||
supply_register (DEPRECATED_NPC_REGNUM, regs + REG32_OFFSET_NPC);
|
||||
|
||||
if (regno == Y_REGNUM || regno == -1)
|
||||
supply_register (Y_REGNUM, regs + REG32_OFFSET_Y);
|
||||
|
||||
if ((regno >= G0_REGNUM && regno <= G7_REGNUM) || regno == -1)
|
||||
{
|
||||
if (regno == G0_REGNUM || regno == -1)
|
||||
supply_register (G0_REGNUM, NULL); /* %g0 is always zero */
|
||||
for (i = G1_REGNUM; i <= G7_REGNUM; i++)
|
||||
{
|
||||
if (regno == i || regno == -1)
|
||||
supply_register (i, regs + REG32_OFFSET_GLOBAL +
|
||||
((i - G0_REGNUM) * 4));
|
||||
}
|
||||
}
|
||||
|
||||
if ((regno >= O0_REGNUM && regno <= O7_REGNUM) || regno == -1)
|
||||
{
|
||||
for (i = O0_REGNUM; i <= O7_REGNUM; i++)
|
||||
{
|
||||
if (regno == i || regno == -1)
|
||||
supply_register (i, regs + REG32_OFFSET_OUT +
|
||||
((i - O0_REGNUM) * 4));
|
||||
}
|
||||
}
|
||||
|
||||
/* Inputs and Locals are stored onto the stack by by the kernel. */
|
||||
if ((regno >= L0_REGNUM && regno <= I7_REGNUM) || regno == -1)
|
||||
{
|
||||
CORE_ADDR sp = read_register (SP_REGNUM);
|
||||
char buf[4];
|
||||
|
||||
for (i = L0_REGNUM; i <= I7_REGNUM; i++)
|
||||
{
|
||||
if (regno == i || regno == -1)
|
||||
{
|
||||
target_read_memory (sp + ((i - L0_REGNUM) * 4),
|
||||
buf, sizeof (buf));
|
||||
supply_register (i, buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME: If we don't set these valid, read_register_bytes() rereads
|
||||
all the regs every time it is called! */
|
||||
if (regno == WIM_REGNUM || regno == -1)
|
||||
supply_register (WIM_REGNUM, NULL);
|
||||
if (regno == TBR_REGNUM || regno == -1)
|
||||
supply_register (TBR_REGNUM, NULL);
|
||||
if (regno == CPS_REGNUM || regno == -1)
|
||||
supply_register (CPS_REGNUM, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
sparcnbsd_supply_reg64 (char *regs, int regno)
|
||||
{
|
||||
int i;
|
||||
char buf[8];
|
||||
|
||||
if (regno == TSTATE_REGNUM || regno == -1)
|
||||
supply_register (PS_REGNUM, regs + REG64_OFFSET_TSTATE);
|
||||
|
||||
if (regno == PC_REGNUM || regno == -1)
|
||||
supply_register (PC_REGNUM, regs + REG64_OFFSET_PC);
|
||||
|
||||
if (regno == DEPRECATED_NPC_REGNUM || regno == -1)
|
||||
supply_register (DEPRECATED_NPC_REGNUM, regs + REG64_OFFSET_NPC);
|
||||
|
||||
if (regno == Y_REGNUM || regno == -1)
|
||||
{
|
||||
memset (buf, 0, sizeof (buf));
|
||||
memcpy (&buf[4], regs + REG64_OFFSET_Y, 4);
|
||||
supply_register (Y_REGNUM, buf);
|
||||
}
|
||||
|
||||
if ((regno >= G0_REGNUM && regno <= G7_REGNUM) || regno == -1)
|
||||
{
|
||||
if (regno == G0_REGNUM || regno == -1)
|
||||
supply_register (G0_REGNUM, NULL); /* %g0 is always zero */
|
||||
for (i = G1_REGNUM; i <= G7_REGNUM; i++)
|
||||
{
|
||||
if (regno == i || regno == -1)
|
||||
supply_register (i, regs + REG64_OFFSET_GLOBAL +
|
||||
((i - G0_REGNUM) * 8));
|
||||
}
|
||||
}
|
||||
|
||||
if ((regno >= O0_REGNUM && regno <= O7_REGNUM) || regno == -1)
|
||||
{
|
||||
for (i = O0_REGNUM; i <= O7_REGNUM; i++)
|
||||
{
|
||||
if (regno == i || regno == -1)
|
||||
supply_register (i, regs + REG64_OFFSET_OUT +
|
||||
((i - O0_REGNUM) * 8));
|
||||
}
|
||||
}
|
||||
|
||||
/* Inputs and Locals are stored onto the stack by by the kernel. */
|
||||
if ((regno >= L0_REGNUM && regno <= I7_REGNUM) || regno == -1)
|
||||
{
|
||||
CORE_ADDR sp = read_register (SP_REGNUM);
|
||||
char buf[8];
|
||||
|
||||
if (sp & 1)
|
||||
{
|
||||
/* Registers are 64-bit. */
|
||||
sp += 2047;
|
||||
|
||||
for (i = L0_REGNUM; i <= I7_REGNUM; i++)
|
||||
{
|
||||
if (regno == i || regno == -1)
|
||||
{
|
||||
target_read_memory (sp + ((i - L0_REGNUM) * 8),
|
||||
buf, sizeof (buf));
|
||||
supply_register (i, buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Registers are 32-bit. Toss any sign-extension of the stack
|
||||
pointer, clear out the top half of the temporary buffer, and
|
||||
put the register value in the bottom half. */
|
||||
|
||||
sp &= 0xffffffffUL;
|
||||
memset (buf, 0, sizeof (buf));
|
||||
for (i = L0_REGNUM; i <= I7_REGNUM; i++)
|
||||
{
|
||||
if (regno == i || regno == -1)
|
||||
{
|
||||
target_read_memory (sp + ((i - L0_REGNUM) * 4),
|
||||
&buf[4], sizeof (buf));
|
||||
supply_register (i, buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME: If we don't set these valid, read_register_bytes() rereads
|
||||
all the regs every time it is called! */
|
||||
if (regno == WIM_REGNUM || regno == -1)
|
||||
supply_register (WIM_REGNUM, NULL);
|
||||
if (regno == TBR_REGNUM || regno == -1)
|
||||
supply_register (TBR_REGNUM, NULL);
|
||||
if (regno == CPS_REGNUM || regno == -1)
|
||||
supply_register (CPS_REGNUM, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
sparcnbsd_fill_reg32 (char *regs, int regno)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (regno == PS_REGNUM || regno == -1)
|
||||
regcache_collect (PS_REGNUM, regs + REG32_OFFSET_PSR);
|
||||
|
||||
if (regno == PC_REGNUM || regno == -1)
|
||||
regcache_collect (PC_REGNUM, regs + REG32_OFFSET_PC);
|
||||
|
||||
if (regno == DEPRECATED_NPC_REGNUM || regno == -1)
|
||||
regcache_collect (DEPRECATED_NPC_REGNUM, regs + REG32_OFFSET_NPC);
|
||||
|
||||
if (regno == Y_REGNUM || regno == -1)
|
||||
regcache_collect (Y_REGNUM, regs + REG32_OFFSET_Y);
|
||||
|
||||
if ((regno >= G0_REGNUM && regno <= G7_REGNUM) || regno == -1)
|
||||
{
|
||||
/* %g0 is always zero */
|
||||
for (i = G1_REGNUM; i <= G7_REGNUM; i++)
|
||||
{
|
||||
if (regno == i || regno == -1)
|
||||
regcache_collect (i, regs + REG32_OFFSET_GLOBAL +
|
||||
((i - G0_REGNUM) * 4));
|
||||
}
|
||||
}
|
||||
|
||||
if ((regno >= O0_REGNUM && regno <= O7_REGNUM) || regno == -1)
|
||||
{
|
||||
for (i = O0_REGNUM; i <= O7_REGNUM; i++)
|
||||
{
|
||||
if (regno == i || regno == -1)
|
||||
regcache_collect (i, regs + REG32_OFFSET_OUT +
|
||||
((i - O0_REGNUM) * 4));
|
||||
}
|
||||
}
|
||||
|
||||
/* Responsibility for the stack regs is pushed off onto the caller. */
|
||||
}
|
||||
|
||||
void
|
||||
sparcnbsd_fill_reg64 (char *regs, int regno)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (regno == TSTATE_REGNUM || regno == -1)
|
||||
regcache_collect (TSTATE_REGNUM, regs + REG64_OFFSET_TSTATE);
|
||||
|
||||
if (regno == PC_REGNUM || regno == -1)
|
||||
regcache_collect (PC_REGNUM, regs + REG64_OFFSET_PC);
|
||||
|
||||
if (regno == DEPRECATED_NPC_REGNUM || regno == -1)
|
||||
regcache_collect (DEPRECATED_NPC_REGNUM, regs + REG64_OFFSET_NPC);
|
||||
|
||||
if (regno == Y_REGNUM || regno == -1)
|
||||
regcache_collect (Y_REGNUM, regs + REG64_OFFSET_Y);
|
||||
|
||||
if ((regno >= G0_REGNUM && regno <= G7_REGNUM) || regno == -1)
|
||||
{
|
||||
/* %g0 is always zero */
|
||||
for (i = G1_REGNUM; i <= G7_REGNUM; i++)
|
||||
{
|
||||
if (regno == i || regno == -1)
|
||||
regcache_collect (i, regs + REG64_OFFSET_GLOBAL +
|
||||
((i - G0_REGNUM) * 4));
|
||||
}
|
||||
}
|
||||
|
||||
if ((regno >= O0_REGNUM && regno <= O7_REGNUM) || regno == -1)
|
||||
{
|
||||
for (i = O0_REGNUM; i <= O7_REGNUM; i++)
|
||||
{
|
||||
if (regno == i || regno == -1)
|
||||
regcache_collect (i, regs + REG64_OFFSET_OUT +
|
||||
((i - O0_REGNUM) * 4));
|
||||
}
|
||||
}
|
||||
|
||||
/* Responsibility for the stack regs is pushed off onto the caller. */
|
||||
}
|
||||
|
||||
void
|
||||
sparcnbsd_supply_fpreg32 (char *fpregs, int regno)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= 31; i++)
|
||||
{
|
||||
if (regno == (FP0_REGNUM + i) || regno == -1)
|
||||
supply_register (FP0_REGNUM + i, fpregs + (i * 4));
|
||||
}
|
||||
|
||||
if (regno == FPS_REGNUM || regno == -1)
|
||||
supply_register (FPS_REGNUM, fpregs + (32 * 4));
|
||||
}
|
||||
|
||||
void
|
||||
sparcnbsd_supply_fpreg64 (char *fpregs, int regno)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= 31; i++)
|
||||
{
|
||||
if (regno == (FP0_REGNUM + i) || regno == -1)
|
||||
supply_register (FP0_REGNUM + i, fpregs + (i * 4));
|
||||
}
|
||||
|
||||
for (; i <= 47; i++)
|
||||
{
|
||||
if (regno == (FP0_REGNUM + i) || regno == -1)
|
||||
supply_register (FP0_REGNUM + i, fpregs + (32 * 4) + (i * 8));
|
||||
}
|
||||
|
||||
if (regno == FPS_REGNUM || regno == -1)
|
||||
supply_register (FPS_REGNUM, fpregs + (32 * 4) + (16 * 8));
|
||||
|
||||
/* XXX %gsr */
|
||||
}
|
||||
|
||||
void
|
||||
sparcnbsd_fill_fpreg32 (char *fpregs, int regno)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= 31; i++)
|
||||
{
|
||||
if (regno == (FP0_REGNUM + i) || regno == -1)
|
||||
regcache_collect (FP0_REGNUM + i, fpregs + (i * 4));
|
||||
}
|
||||
|
||||
if (regno == FPS_REGNUM || regno == -1)
|
||||
regcache_collect (FPS_REGNUM, fpregs + (32 * 4));
|
||||
}
|
||||
|
||||
void
|
||||
sparcnbsd_fill_fpreg64 (char *fpregs, int regno)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= 31; i++)
|
||||
{
|
||||
if (regno == (FP0_REGNUM + i) || regno == -1)
|
||||
regcache_collect (FP0_REGNUM + i, fpregs + (i * 4));
|
||||
}
|
||||
|
||||
for (; i <= 47; i++)
|
||||
{
|
||||
if (regno == (FP0_REGNUM + i) || regno == -1)
|
||||
regcache_collect (FP0_REGNUM + i, fpregs + (32 * 4) + (i * 8));
|
||||
}
|
||||
|
||||
if (regno == FPS_REGNUM || regno == -1)
|
||||
regcache_collect (FPS_REGNUM, fpregs + (32 * 4) + (16 * 8));
|
||||
|
||||
/* XXX %gsr */
|
||||
}
|
||||
|
||||
/* Unlike other NetBSD implementations, the SPARC port historically used
|
||||
.reg and .reg2 (see bfd/netbsd-core.c), and as such, we can share one
|
||||
routine for a.out and ELF core files. */
|
||||
static void
|
||||
fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
|
||||
CORE_ADDR ignore)
|
||||
{
|
||||
int reg_size, fpreg_size;
|
||||
|
||||
if (gdbarch_ptr_bit (current_gdbarch) == 32)
|
||||
{
|
||||
reg_size = (20 * 4);
|
||||
fpreg_size = (33 * 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
reg_size = (20 * 8);
|
||||
fpreg_size = (64 * 4)
|
||||
+ 8 /* fsr */
|
||||
+ 4 /* gsr */
|
||||
+ 4; /* pad */
|
||||
}
|
||||
int reg_size = 20 * 4;
|
||||
int fpreg_size = 33 * 4;
|
||||
|
||||
switch (which)
|
||||
{
|
||||
case 0: /* Integer registers */
|
||||
case 0: /* Integer registers. */
|
||||
if (core_reg_size != reg_size)
|
||||
warning ("Wrong size register set in core file.");
|
||||
else if (gdbarch_ptr_bit (current_gdbarch) == 32)
|
||||
sparcnbsd_supply_reg32 (core_reg_sect, -1);
|
||||
else
|
||||
sparcnbsd_supply_reg64 (core_reg_sect, -1);
|
||||
sparc32_supply_gregset (&sparc32nbsd_gregset, current_regcache,
|
||||
-1, core_reg_sect);
|
||||
break;
|
||||
|
||||
case 2: /* Floating pointer registers */
|
||||
case 2: /* Floating pointer registers. */
|
||||
if (core_reg_size != fpreg_size)
|
||||
warning ("Wrong size FP register set in core file.");
|
||||
else if (gdbarch_ptr_bit (current_gdbarch) == 32)
|
||||
sparcnbsd_supply_fpreg32 (core_reg_sect, -1);
|
||||
else
|
||||
sparcnbsd_supply_fpreg64 (core_reg_sect, -1);
|
||||
sparc32_supply_fpregset (current_regcache, -1, core_reg_sect);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -433,82 +98,200 @@ static struct core_fns sparcnbsd_elfcore_fns =
|
||||
fetch_core_registers, /* core_read_registers */
|
||||
NULL
|
||||
};
|
||||
|
||||
/* Signal trampolines. */
|
||||
|
||||
/* FIXME: Need PC_IN_SIGTRAMP() support, but NetBSD/sparc signal trampolines
|
||||
aren't easily identified. */
|
||||
/* The following variables describe the location of an on-stack signal
|
||||
trampoline. The current values correspond to the memory layout for
|
||||
NetBSD 1.3 and up. These shouldn't be necessary for NetBSD 2.0 and
|
||||
up, since NetBSD uses signal trampolines provided by libc now. */
|
||||
|
||||
static const CORE_ADDR sparc32nbsd_sigtramp_start = 0xeffffef0;
|
||||
static const CORE_ADDR sparc32nbsd_sigtramp_end = 0xeffffff0;
|
||||
|
||||
static int
|
||||
sparcnbsd_get_longjmp_target_32 (CORE_ADDR *pc)
|
||||
sparc32nbsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
{
|
||||
CORE_ADDR jb_addr;
|
||||
char buf[4];
|
||||
if (pc >= sparc32nbsd_sigtramp_start && pc < sparc32nbsd_sigtramp_end)
|
||||
return 1;
|
||||
|
||||
jb_addr = read_register (O0_REGNUM);
|
||||
|
||||
if (target_read_memory (jb_addr + 12, buf, sizeof (buf)))
|
||||
return 0;
|
||||
|
||||
*pc = extract_unsigned_integer (buf, sizeof (buf));
|
||||
|
||||
return 1;
|
||||
return nbsd_pc_in_sigtramp (pc, name);
|
||||
}
|
||||
|
||||
static int
|
||||
sparcnbsd_get_longjmp_target_64 (CORE_ADDR *pc)
|
||||
static struct sparc_frame_cache *
|
||||
sparc32nbsd_sigcontext_frame_cache (struct frame_info *next_frame,
|
||||
void **this_cache)
|
||||
{
|
||||
CORE_ADDR jb_addr;
|
||||
char buf[8];
|
||||
struct sparc_frame_cache *cache;
|
||||
CORE_ADDR addr, sigcontext_addr;
|
||||
LONGEST psr;
|
||||
int regnum, delta;
|
||||
|
||||
jb_addr = read_register (O0_REGNUM);
|
||||
if (*this_cache)
|
||||
return *this_cache;
|
||||
|
||||
if (target_read_memory (jb_addr + 16, buf, sizeof (buf)))
|
||||
return 0;
|
||||
cache = sparc_frame_cache (next_frame, this_cache);
|
||||
gdb_assert (cache == *this_cache);
|
||||
|
||||
*pc = extract_unsigned_integer (buf, sizeof (buf));
|
||||
/* The registers are saved in bits and pieces scattered all over the
|
||||
place. The code below records their location on the assumption
|
||||
that the part of the signal trampoline that saves the state has
|
||||
been executed. */
|
||||
|
||||
return 1;
|
||||
/* If we couldn't find the frame's function, we're probably dealing
|
||||
with an on-stack signal trampoline. */
|
||||
if (cache->pc == 0)
|
||||
{
|
||||
cache->pc = sparc32nbsd_sigtramp_start;
|
||||
|
||||
/* Since we couldn't find the frame's function, the cache was
|
||||
initialized under the assumption that we're frameless. */
|
||||
cache->frameless_p = 0;
|
||||
addr = frame_unwind_register_unsigned (next_frame, SPARC_FP_REGNUM);
|
||||
cache->base = addr;
|
||||
}
|
||||
|
||||
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
|
||||
|
||||
/* We find the appropriate instance of `struct sigcontext' at a
|
||||
fixed offset in the signal frame. */
|
||||
sigcontext_addr = cache->base + 64 + 16;
|
||||
|
||||
cache->saved_regs[SPARC_SP_REGNUM].addr = sigcontext_addr + 8;
|
||||
cache->saved_regs[SPARC32_PC_REGNUM].addr = sigcontext_addr + 12;
|
||||
cache->saved_regs[SPARC32_NPC_REGNUM].addr = sigcontext_addr + 16;
|
||||
cache->saved_regs[SPARC32_PSR_REGNUM].addr = sigcontext_addr + 20;
|
||||
cache->saved_regs[SPARC_G1_REGNUM].addr = sigcontext_addr + 24;
|
||||
cache->saved_regs[SPARC_O0_REGNUM].addr = sigcontext_addr + 28;
|
||||
|
||||
/* The remaining `global' registers and %y are saved in the `local'
|
||||
registers. */
|
||||
delta = SPARC_L0_REGNUM - SPARC_G0_REGNUM;
|
||||
for (regnum = SPARC_G2_REGNUM; regnum <= SPARC_G7_REGNUM; regnum++)
|
||||
cache->saved_regs[regnum].realreg = regnum + delta;
|
||||
cache->saved_regs[SPARC32_Y_REGNUM].realreg = SPARC_L1_REGNUM;
|
||||
|
||||
/* The remaining `out' registers can be found in the current frame's
|
||||
`in' registers. */
|
||||
delta = SPARC_I0_REGNUM - SPARC_O0_REGNUM;
|
||||
for (regnum = SPARC_O1_REGNUM; regnum <= SPARC_O5_REGNUM; regnum++)
|
||||
cache->saved_regs[regnum].realreg = regnum + delta;
|
||||
cache->saved_regs[SPARC_O7_REGNUM].realreg = SPARC_I7_REGNUM;
|
||||
|
||||
/* The `local' and `in' registers have been saved in the register
|
||||
save area. */
|
||||
addr = cache->saved_regs[SPARC_SP_REGNUM].addr;
|
||||
addr = get_frame_memory_unsigned (next_frame, addr, 4);
|
||||
for (regnum = SPARC_L0_REGNUM;
|
||||
regnum <= SPARC_I7_REGNUM; regnum++, addr += 4)
|
||||
cache->saved_regs[regnum].addr = addr;
|
||||
|
||||
/* The floating-point registers are only saved if the EF bit in %prs
|
||||
has been set. */
|
||||
|
||||
#define PSR_EF 0x00001000
|
||||
|
||||
addr = cache->saved_regs[SPARC32_PSR_REGNUM].addr;
|
||||
psr = get_frame_memory_unsigned (next_frame, addr, 4);
|
||||
if (psr & PSR_EF)
|
||||
{
|
||||
CORE_ADDR sp;
|
||||
|
||||
sp = frame_unwind_register_unsigned (next_frame, SPARC_SP_REGNUM);
|
||||
cache->saved_regs[SPARC32_FSR_REGNUM].addr = sp + 96;
|
||||
for (regnum = SPARC_F0_REGNUM, addr = sp + 96 + 8;
|
||||
regnum <= SPARC_F31_REGNUM; regnum++, addr += 4)
|
||||
cache->saved_regs[regnum].addr = addr;
|
||||
}
|
||||
|
||||
return cache;
|
||||
}
|
||||
|
||||
static void
|
||||
sparc32nbsd_sigcontext_frame_this_id (struct frame_info *next_frame,
|
||||
void **this_cache,
|
||||
struct frame_id *this_id)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc32nbsd_sigcontext_frame_cache (next_frame, this_cache);
|
||||
|
||||
(*this_id) = frame_id_build (cache->base, cache->pc);
|
||||
}
|
||||
|
||||
static void
|
||||
sparc32nbsd_sigcontext_frame_prev_register (struct frame_info *next_frame,
|
||||
void **this_cache,
|
||||
int regnum, int *optimizedp,
|
||||
enum lval_type *lvalp,
|
||||
CORE_ADDR *addrp,
|
||||
int *realnump, void *valuep)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc32nbsd_sigcontext_frame_cache (next_frame, this_cache);
|
||||
|
||||
trad_frame_prev_register (next_frame, cache->saved_regs, regnum,
|
||||
optimizedp, lvalp, addrp, realnump, valuep);
|
||||
}
|
||||
|
||||
static const struct frame_unwind sparc32nbsd_sigcontext_frame_unwind =
|
||||
{
|
||||
SIGTRAMP_FRAME,
|
||||
sparc32nbsd_sigcontext_frame_this_id,
|
||||
sparc32nbsd_sigcontext_frame_prev_register
|
||||
};
|
||||
|
||||
static const struct frame_unwind *
|
||||
sparc32nbsd_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
if (sparc32nbsd_pc_in_sigtramp (pc, name))
|
||||
{
|
||||
if (name == NULL || strncmp (name, "__sigtramp_sigcontext", 21))
|
||||
return &sparc32nbsd_sigcontext_frame_unwind;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* Return non-zero if we are in a shared library trampoline code stub. */
|
||||
|
||||
static int
|
||||
sparcnbsd_aout_in_solib_call_trampoline (CORE_ADDR pc, char *name)
|
||||
{
|
||||
if (strcmp (name, "_DYNAMIC") == 0)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
return (name && !strcmp (name, "_DYNAMIC"));
|
||||
}
|
||||
|
||||
static void
|
||||
sparcnbsd_init_abi_common (struct gdbarch_info info,
|
||||
struct gdbarch *gdbarch)
|
||||
sparc32nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
{
|
||||
set_gdbarch_get_longjmp_target (gdbarch, gdbarch_ptr_bit (gdbarch) == 32 ?
|
||||
sparcnbsd_get_longjmp_target_32 :
|
||||
sparcnbsd_get_longjmp_target_64);
|
||||
/* NetBSD doesn't support the 128-bit `long double' from the psABI. */
|
||||
set_gdbarch_long_double_bit (gdbarch, 64);
|
||||
set_gdbarch_long_double_format (gdbarch, &floatformat_ieee_double_big);
|
||||
|
||||
set_gdbarch_pc_in_sigtramp (gdbarch, sparc32nbsd_pc_in_sigtramp);
|
||||
frame_unwind_append_sniffer (gdbarch, sparc32nbsd_sigtramp_frame_sniffer);
|
||||
}
|
||||
|
||||
static void
|
||||
sparcnbsd_init_abi_aout (struct gdbarch_info info,
|
||||
struct gdbarch *gdbarch)
|
||||
sparc32nbsd_aout_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
{
|
||||
sparcnbsd_init_abi_common (info, gdbarch);
|
||||
sparc32nbsd_init_abi (info, gdbarch);
|
||||
|
||||
set_gdbarch_in_solib_call_trampoline (gdbarch,
|
||||
sparcnbsd_aout_in_solib_call_trampoline);
|
||||
set_gdbarch_in_solib_call_trampoline
|
||||
(gdbarch, sparcnbsd_aout_in_solib_call_trampoline);
|
||||
}
|
||||
|
||||
static void
|
||||
sparcnbsd_init_abi_elf (struct gdbarch_info info,
|
||||
struct gdbarch *gdbarch)
|
||||
sparc32nbsd_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
{
|
||||
sparcnbsd_init_abi_common (info, gdbarch);
|
||||
sparc32nbsd_init_abi (info, gdbarch);
|
||||
|
||||
set_gdbarch_pc_in_sigtramp (gdbarch, nbsd_pc_in_sigtramp);
|
||||
|
||||
set_solib_svr4_fetch_link_map_offsets (gdbarch,
|
||||
gdbarch_ptr_bit (gdbarch) == 32 ?
|
||||
nbsd_ilp32_solib_svr4_fetch_link_map_offsets :
|
||||
nbsd_lp64_solib_svr4_fetch_link_map_offsets);
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, nbsd_ilp32_solib_svr4_fetch_link_map_offsets);
|
||||
}
|
||||
|
||||
static enum gdb_osabi
|
||||
@ -520,6 +303,10 @@ sparcnbsd_aout_osabi_sniffer (bfd *abfd)
|
||||
return GDB_OSABI_UNKNOWN;
|
||||
}
|
||||
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
void _initialize_sparcnbsd_tdep (void);
|
||||
|
||||
void
|
||||
_initialize_sparnbsd_tdep (void)
|
||||
{
|
||||
@ -527,9 +314,9 @@ _initialize_sparnbsd_tdep (void)
|
||||
sparcnbsd_aout_osabi_sniffer);
|
||||
|
||||
gdbarch_register_osabi (bfd_arch_sparc, 0, GDB_OSABI_NETBSD_AOUT,
|
||||
sparcnbsd_init_abi_aout);
|
||||
sparc32nbsd_aout_init_abi);
|
||||
gdbarch_register_osabi (bfd_arch_sparc, 0, GDB_OSABI_NETBSD_ELF,
|
||||
sparcnbsd_init_abi_elf);
|
||||
sparc32nbsd_elf_init_abi);
|
||||
|
||||
add_core_fns (&sparcnbsd_core_fns);
|
||||
add_core_fns (&sparcnbsd_elfcore_fns);
|
||||
|
@ -1,34 +0,0 @@
|
||||
/* Common target dependent code for GDB on SPARC systems running NetBSD.
|
||||
Copyright 2002 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 SPARCNBSD_TDEP_H
|
||||
#define SPARCNBSD_TDEP_H
|
||||
|
||||
void sparcnbsd_supply_reg32 (char *, int);
|
||||
void sparcnbsd_supply_reg64 (char *, int);
|
||||
void sparcnbsd_fill_reg32 (char *, int);
|
||||
void sparcnbsd_fill_reg64 (char *, int);
|
||||
|
||||
void sparcnbsd_supply_fpreg32 (char *, int);
|
||||
void sparcnbsd_supply_fpreg64 (char *, int);
|
||||
void sparcnbsd_fill_fpreg32 (char *, int);
|
||||
void sparcnbsd_fill_fpreg64 (char *, int);
|
||||
|
||||
#endif /* SPARCNBSD_TDEP_H */
|
Loading…
Reference in New Issue
Block a user