#define M68HC11_REG_SIZE (2)
+#define M68HC12_NUM_REGS (9)
+#define M68HC12_NUM_PSEUDO_REGS ((M68HC11_MAX_SOFT_REGS+5)+1-1)
+#define M68HC12_HARD_PC_REGNUM (SOFT_D32_REGNUM+1)
+
struct insn_sequence;
struct gdbarch_tdep
{
struct regcache *regcache,
int regno, void *buf)
{
+ /* The PC is a pseudo reg only for 68HC12 with the memory bank
+ addressing mode. */
+ if (regno == M68HC12_HARD_PC_REGNUM)
+ {
+ const int regsize = TYPE_LENGTH (builtin_type_uint32);
+ CORE_ADDR pc = read_register (HARD_PC_REGNUM);
+ int page = read_register (HARD_PAGE_REGNUM);
+
+ if (pc >= 0x8000 && pc < 0xc000)
+ {
+ pc -= 0x8000;
+ pc += (page << 14);
+ pc += 0x1000000;
+ }
+ store_unsigned_integer (buf, regsize, pc);
+ return;
+ }
+
m68hc11_initialize_register_info ();
/* Fetch a soft register: translate into a memory read. */
struct regcache *regcache,
int regno, const void *buf)
{
+ /* The PC is a pseudo reg only for 68HC12 with the memory bank
+ addressing mode. */
+ if (regno == M68HC12_HARD_PC_REGNUM)
+ {
+ const int regsize = TYPE_LENGTH (builtin_type_uint32);
+ char *tmp = alloca (regsize);
+ CORE_ADDR pc;
+
+ memcpy (tmp, buf, regsize);
+ pc = extract_unsigned_integer (tmp, regsize);
+ if (pc >= 0x1000000)
+ {
+ pc -= 0x1000000;
+ write_register (HARD_PAGE_REGNUM, (pc >> 14) & 0x0ff);
+ pc &= 0x03fff;
+ write_register (HARD_PC_REGNUM, pc + 0x8000);
+ }
+ else
+ write_register (HARD_PC_REGNUM, pc);
+ return;
+ }
+
m68hc11_initialize_register_info ();
/* Store a soft register: translate into a memory write. */
static const char *
m68hc11_register_name (int reg_nr)
{
+ if (reg_nr == M68HC12_HARD_PC_REGNUM && USE_PAGE_REGISTER)
+ return "pc";
+ if (reg_nr == HARD_PC_REGNUM && USE_PAGE_REGISTER)
+ return "ppc";
+
if (reg_nr < 0)
return NULL;
if (reg_nr >= M68HC11_ALL_REGS)
register CORE_ADDR fp, sp;
register int regnum;
- if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
+ if (DEPRECATED_PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
generic_pop_dummy_frame ();
else
{
- fp = FRAME_FP (frame);
+ fp = get_frame_base (frame);
FRAME_INIT_SAVED_REGS (frame);
/* Copy regs from where they were saved in the frame. */
return pc;
}
-/* Given a GDB frame, determine the address of the calling function's frame.
- This will be used to create a new GDB frame struct, and then
- INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
-*/
+/* Given a GDB frame, determine the address of the calling function's
+ frame. This will be used to create a new GDB frame struct, and
+ then INIT_EXTRA_FRAME_INFO and DEPRECATED_INIT_FRAME_PC will be
+ called for the new frame. */
static CORE_ADDR
m68hc11_frame_chain (struct frame_info *frame)
{
CORE_ADDR addr;
- if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
+ if (DEPRECATED_PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
return frame->frame; /* dummy frame same as caller's frame */
if (frame->extra_info->return_pc == 0
case HARD_CCR_REGNUM:
return builtin_type_uint8;
+ case M68HC12_HARD_PC_REGNUM:
+ return builtin_type_uint32;
+
default:
return builtin_type_uint16;
}
return sp;
}
-/* Index within `registers' of the first byte of the space for
- register N. */
-static int
-m68hc11_register_byte (int reg_nr)
-{
- return (reg_nr * M68HC11_REG_SIZE);
-}
-
-static int
-m68hc11_register_raw_size (int reg_nr)
-{
- switch (reg_nr)
- {
- case HARD_PAGE_REGNUM:
- case HARD_A_REGNUM:
- case HARD_B_REGNUM:
- case HARD_CCR_REGNUM:
- return 1;
-
- default:
- return M68HC11_REG_SIZE;
- }
-}
-
/* Test whether the ELF symbol corresponds to a function using rtc or
rti to return. */
gdbarch = gdbarch_alloc (&info, tdep);
tdep->elf_flags = elf_flags;
+ /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
+ ready to unwind the PC first (see frame.c:get_prev_frame()). */
+ set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_default);
+
switch (info.bfd_arch_info->arch)
{
case bfd_arch_m68hc11:
tdep->stack_correction = 1;
tdep->use_page_register = 0;
tdep->prologue = m6811_prologue;
+ set_gdbarch_addr_bit (gdbarch, 16);
+ set_gdbarch_num_pseudo_regs (gdbarch, M68HC11_NUM_PSEUDO_REGS);
+ set_gdbarch_pc_regnum (gdbarch, HARD_PC_REGNUM);
+ set_gdbarch_num_regs (gdbarch, M68HC11_NUM_REGS);
break;
case bfd_arch_m68hc12:
tdep->stack_correction = 0;
tdep->use_page_register = elf_flags & E_M68HC12_BANKS;
tdep->prologue = m6812_prologue;
+ set_gdbarch_addr_bit (gdbarch, elf_flags & E_M68HC12_BANKS ? 32 : 16);
+ set_gdbarch_num_pseudo_regs (gdbarch,
+ elf_flags & E_M68HC12_BANKS
+ ? M68HC12_NUM_PSEUDO_REGS
+ : M68HC11_NUM_PSEUDO_REGS);
+ set_gdbarch_pc_regnum (gdbarch, elf_flags & E_M68HC12_BANKS
+ ? M68HC12_HARD_PC_REGNUM : HARD_PC_REGNUM);
+ set_gdbarch_num_regs (gdbarch, elf_flags & E_M68HC12_BANKS
+ ? M68HC12_NUM_REGS : M68HC11_NUM_REGS);
break;
default:
set_gdbarch_fp0_regnum (gdbarch, -1);
set_gdbarch_max_register_raw_size (gdbarch, 2);
set_gdbarch_max_register_virtual_size (gdbarch, 2);
- set_gdbarch_register_raw_size (gdbarch, m68hc11_register_raw_size);
- set_gdbarch_register_virtual_size (gdbarch, m68hc11_register_raw_size);
- set_gdbarch_register_byte (gdbarch, m68hc11_register_byte);
set_gdbarch_frame_init_saved_regs (gdbarch, m68hc11_frame_init_saved_regs);
set_gdbarch_frame_args_skip (gdbarch, 0);
set_gdbarch_read_sp (gdbarch, generic_target_read_sp);
set_gdbarch_write_sp (gdbarch, generic_target_write_sp);
- set_gdbarch_num_regs (gdbarch, M68HC11_NUM_REGS);
- set_gdbarch_num_pseudo_regs (gdbarch, M68HC11_NUM_PSEUDO_REGS);
set_gdbarch_sp_regnum (gdbarch, HARD_SP_REGNUM);
set_gdbarch_fp_regnum (gdbarch, SOFT_FP_REGNUM);
- set_gdbarch_pc_regnum (gdbarch, HARD_PC_REGNUM);
set_gdbarch_register_name (gdbarch, m68hc11_register_name);
set_gdbarch_register_size (gdbarch, 2);
set_gdbarch_register_bytes (gdbarch, M68HC11_ALL_REGS * 2);
set_gdbarch_pseudo_register_read (gdbarch, m68hc11_pseudo_register_read);
set_gdbarch_pseudo_register_write (gdbarch, m68hc11_pseudo_register_write);
- set_gdbarch_use_generic_dummy_frames (gdbarch, 1);
set_gdbarch_call_dummy_length (gdbarch, 0);
- set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
set_gdbarch_call_dummy_address (gdbarch, m68hc11_call_dummy_address);
set_gdbarch_call_dummy_breakpoint_offset_p (gdbarch, 1); /*???*/
set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0);
set_gdbarch_call_dummy_start_offset (gdbarch, 0);
- set_gdbarch_pc_in_call_dummy (gdbarch, generic_pc_in_call_dummy);
set_gdbarch_call_dummy_words (gdbarch, m68hc11_call_dummy_words);
set_gdbarch_sizeof_call_dummy_words (gdbarch,
sizeof (m68hc11_call_dummy_words));
set_gdbarch_call_dummy_p (gdbarch, 1);
set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 0);
- set_gdbarch_get_saved_register (gdbarch, generic_get_saved_register);
+ set_gdbarch_get_saved_register (gdbarch, deprecated_generic_get_saved_register);
set_gdbarch_fix_call_dummy (gdbarch, generic_fix_call_dummy);
set_gdbarch_deprecated_extract_return_value (gdbarch, m68hc11_extract_return_value);
set_gdbarch_push_arguments (gdbarch, m68hc11_push_arguments);
set_gdbarch_return_value_on_stack (gdbarch, m68hc11_return_value_on_stack);
set_gdbarch_store_struct_return (gdbarch, m68hc11_store_struct_return);
- set_gdbarch_store_return_value (gdbarch, m68hc11_store_return_value);
+ set_gdbarch_deprecated_store_return_value (gdbarch, m68hc11_store_return_value);
set_gdbarch_deprecated_extract_struct_value_address (gdbarch, m68hc11_extract_struct_value_address);
set_gdbarch_register_convertible (gdbarch, generic_register_convertible_not);
set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid);
- set_gdbarch_get_saved_register (gdbarch, generic_get_saved_register);
+ set_gdbarch_get_saved_register (gdbarch, deprecated_generic_get_saved_register);
set_gdbarch_store_struct_return (gdbarch, m68hc11_store_struct_return);
- set_gdbarch_store_return_value (gdbarch, m68hc11_store_return_value);
+ set_gdbarch_deprecated_store_return_value (gdbarch, m68hc11_store_return_value);
set_gdbarch_deprecated_extract_struct_value_address
(gdbarch, m68hc11_extract_struct_value_address);
set_gdbarch_use_struct_convention (gdbarch, m68hc11_use_struct_convention);