Home | History | Annotate | Line # | Download | only in gdb
moxie-tdep.c revision 1.1.1.1
      1 /* Target-dependent code for Moxie.
      2 
      3    Copyright (C) 2009-2014 Free Software Foundation, Inc.
      4 
      5    This file is part of GDB.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19 
     20 #include "defs.h"
     21 #include "frame.h"
     22 #include "frame-unwind.h"
     23 #include "frame-base.h"
     24 #include "symtab.h"
     25 #include "gdbtypes.h"
     26 #include "gdbcmd.h"
     27 #include "gdbcore.h"
     28 #include <string.h>
     29 #include "value.h"
     30 #include "inferior.h"
     31 #include "symfile.h"
     32 #include "objfiles.h"
     33 #include "osabi.h"
     34 #include "language.h"
     35 #include "arch-utils.h"
     36 #include "regcache.h"
     37 #include "trad-frame.h"
     38 #include "dis-asm.h"
     39 #include "record.h"
     40 #include "record-full.h"
     41 
     42 #include "gdb_assert.h"
     43 
     44 #include "moxie-tdep.h"
     45 
     46 /* Local functions.  */
     47 
     48 extern void _initialize_moxie_tdep (void);
     49 
     50 /* Use an invalid address value as 'not available' marker.  */
     51 enum { REG_UNAVAIL = (CORE_ADDR) -1 };
     52 
     53 struct moxie_frame_cache
     54 {
     55   /* Base address.  */
     56   CORE_ADDR base;
     57   CORE_ADDR pc;
     58   LONGEST framesize;
     59   CORE_ADDR saved_regs[MOXIE_NUM_REGS];
     60   CORE_ADDR saved_sp;
     61 };
     62 
     63 /* Implement the "frame_align" gdbarch method.  */
     64 
     65 static CORE_ADDR
     66 moxie_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
     67 {
     68   /* Align to the size of an instruction (so that they can safely be
     69      pushed onto the stack.  */
     70   return sp & ~1;
     71 }
     72 
     73 /* Implement the "breakpoint_from_pc" gdbarch method.  */
     74 
     75 static const unsigned char *
     76 moxie_breakpoint_from_pc (struct gdbarch *gdbarch,
     77 			  CORE_ADDR *pcptr, int *lenptr)
     78 {
     79   static unsigned char breakpoint[] = { 0x35, 0x00 };
     80 
     81   *lenptr = sizeof (breakpoint);
     82   return breakpoint;
     83 }
     84 
     85 /* Moxie register names.  */
     86 
     87 char *moxie_register_names[] = {
     88   "$fp",  "$sp",  "$r0",  "$r1",  "$r2",
     89   "$r3",  "$r4",  "$r5", "$r6", "$r7",
     90   "$r8", "$r9", "$r10", "$r11", "$r12",
     91   "$r13", "$pc", "$cc" };
     92 
     93 /* Implement the "register_name" gdbarch method.  */
     94 
     95 static const char *
     96 moxie_register_name (struct gdbarch *gdbarch, int reg_nr)
     97 {
     98   if (reg_nr < 0)
     99     return NULL;
    100   if (reg_nr >= MOXIE_NUM_REGS)
    101     return NULL;
    102   return moxie_register_names[reg_nr];
    103 }
    104 
    105 /* Implement the "register_type" gdbarch method.  */
    106 
    107 static struct type *
    108 moxie_register_type (struct gdbarch *gdbarch, int reg_nr)
    109 {
    110   if (reg_nr == MOXIE_PC_REGNUM)
    111     return  builtin_type (gdbarch)->builtin_func_ptr;
    112   else if (reg_nr == MOXIE_SP_REGNUM || reg_nr == MOXIE_FP_REGNUM)
    113     return builtin_type (gdbarch)->builtin_data_ptr;
    114   else
    115     return builtin_type (gdbarch)->builtin_int32;
    116 }
    117 
    118 /* Write into appropriate registers a function return value
    119    of type TYPE, given in virtual format.  */
    120 
    121 static void
    122 moxie_store_return_value (struct type *type, struct regcache *regcache,
    123 			 const void *valbuf)
    124 {
    125   struct gdbarch *gdbarch = get_regcache_arch (regcache);
    126   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    127   CORE_ADDR regval;
    128   int len = TYPE_LENGTH (type);
    129 
    130   /* Things always get returned in RET1_REGNUM, RET2_REGNUM.  */
    131   regval = extract_unsigned_integer (valbuf, len > 4 ? 4 : len, byte_order);
    132   regcache_cooked_write_unsigned (regcache, RET1_REGNUM, regval);
    133   if (len > 4)
    134     {
    135       regval = extract_unsigned_integer ((gdb_byte *) valbuf + 4,
    136 					 len - 4, byte_order);
    137       regcache_cooked_write_unsigned (regcache, RET1_REGNUM + 1, regval);
    138     }
    139 }
    140 
    141 /* Decode the instructions within the given address range.  Decide
    142    when we must have reached the end of the function prologue.  If a
    143    frame_info pointer is provided, fill in its saved_regs etc.
    144 
    145    Returns the address of the first instruction after the prologue.  */
    146 
    147 static CORE_ADDR
    148 moxie_analyze_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr,
    149 			struct moxie_frame_cache *cache,
    150 			struct gdbarch *gdbarch)
    151 {
    152   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    153   CORE_ADDR next_addr;
    154   ULONGEST inst, inst2;
    155   LONGEST offset;
    156   int regnum;
    157 
    158   /* Record where the jsra instruction saves the PC and FP.  */
    159   cache->saved_regs[MOXIE_PC_REGNUM] = -4;
    160   cache->saved_regs[MOXIE_FP_REGNUM] = 0;
    161   cache->framesize = 0;
    162 
    163   if (start_addr >= end_addr)
    164     return end_addr;
    165 
    166   for (next_addr = start_addr; next_addr < end_addr; )
    167     {
    168       inst = read_memory_unsigned_integer (next_addr, 2, byte_order);
    169 
    170       /* Match "push $sp $rN" where N is between 0 and 13 inclusive.  */
    171       if (inst >= 0x0612 && inst <= 0x061f)
    172 	{
    173 	  regnum = inst & 0x000f;
    174 	  cache->framesize += 4;
    175 	  cache->saved_regs[regnum] = cache->framesize;
    176 	  next_addr += 2;
    177 	}
    178       else
    179 	break;
    180     }
    181 
    182   inst = read_memory_unsigned_integer (next_addr, 2, byte_order);
    183 
    184   /* Optional stack allocation for args and local vars <= 4
    185      byte.  */
    186   if (inst == 0x01e0)          /* ldi.l $r12, X */
    187     {
    188       offset = read_memory_integer (next_addr + 2, 4, byte_order);
    189       inst2 = read_memory_unsigned_integer (next_addr + 6, 2, byte_order);
    190 
    191       if (inst2 == 0x291e)     /* sub.l $sp, $r12 */
    192 	{
    193 	  cache->framesize += offset;
    194 	}
    195 
    196       return (next_addr + 8);
    197     }
    198   else if ((inst & 0xff00) == 0x9100)   /* dec $sp, X */
    199     {
    200       cache->framesize += (inst & 0x00ff);
    201       next_addr += 2;
    202 
    203       while (next_addr < end_addr)
    204 	{
    205 	  inst = read_memory_unsigned_integer (next_addr, 2, byte_order);
    206 	  if ((inst & 0xff00) != 0x9100) /* no more dec $sp, X */
    207 	    break;
    208 	  cache->framesize += (inst & 0x00ff);
    209 	  next_addr += 2;
    210 	}
    211     }
    212 
    213   return next_addr;
    214 }
    215 
    216 /* Find the end of function prologue.  */
    217 
    218 static CORE_ADDR
    219 moxie_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
    220 {
    221   CORE_ADDR func_addr = 0, func_end = 0;
    222   const char *func_name;
    223 
    224   /* See if we can determine the end of the prologue via the symbol table.
    225      If so, then return either PC, or the PC after the prologue, whichever
    226      is greater.  */
    227   if (find_pc_partial_function (pc, &func_name, &func_addr, &func_end))
    228     {
    229       CORE_ADDR post_prologue_pc
    230 	= skip_prologue_using_sal (gdbarch, func_addr);
    231       if (post_prologue_pc != 0)
    232 	return max (pc, post_prologue_pc);
    233       else
    234 	{
    235 	  /* Can't determine prologue from the symbol table, need to examine
    236 	     instructions.  */
    237 	  struct symtab_and_line sal;
    238 	  struct symbol *sym;
    239 	  struct moxie_frame_cache cache;
    240 	  CORE_ADDR plg_end;
    241 
    242 	  memset (&cache, 0, sizeof cache);
    243 
    244 	  plg_end = moxie_analyze_prologue (func_addr,
    245 					    func_end, &cache, gdbarch);
    246 	  /* Found a function.  */
    247 	  sym = lookup_symbol (func_name, NULL, VAR_DOMAIN, NULL);
    248 	  /* Don't use line number debug info for assembly source
    249 	     files.  */
    250 	  if (sym && SYMBOL_LANGUAGE (sym) != language_asm)
    251 	    {
    252 	      sal = find_pc_line (func_addr, 0);
    253 	      if (sal.end && sal.end < func_end)
    254 		{
    255 		  /* Found a line number, use it as end of
    256 		     prologue.  */
    257 		  return sal.end;
    258 		}
    259 	    }
    260 	  /* No useable line symbol.  Use result of prologue parsing
    261 	     method.  */
    262 	  return plg_end;
    263 	}
    264     }
    265 
    266   /* No function symbol -- just return the PC.  */
    267   return (CORE_ADDR) pc;
    268 }
    269 
    270 struct moxie_unwind_cache
    271 {
    272   /* The previous frame's inner most stack address.  Used as this
    273      frame ID's stack_addr.  */
    274   CORE_ADDR prev_sp;
    275   /* The frame's base, optionally used by the high-level debug info.  */
    276   CORE_ADDR base;
    277   int size;
    278   /* How far the SP and r13 (FP) have been offset from the start of
    279      the stack frame (as defined by the previous frame's stack
    280      pointer).  */
    281   LONGEST sp_offset;
    282   LONGEST r13_offset;
    283   int uses_frame;
    284   /* Table indicating the location of each and every register.  */
    285   struct trad_frame_saved_reg *saved_regs;
    286 };
    287 
    288 /* Read an unsigned integer from the inferior, and adjust
    289    endianess.  */
    290 static ULONGEST
    291 moxie_process_readu (CORE_ADDR addr, gdb_byte *buf,
    292 		     int length, enum bfd_endian byte_order)
    293 {
    294   if (target_read_memory (addr, buf, length))
    295     {
    296       if (record_debug)
    297 	printf_unfiltered (_("Process record: error reading memory at "
    298 			     "addr 0x%s len = %d.\n"),
    299 			   paddress (target_gdbarch (), addr), length);
    300       return -1;
    301     }
    302 
    303   return extract_unsigned_integer (buf, length, byte_order);
    304 }
    305 
    306 
    307 /* Helper macro to extract the signed 10-bit offset from a 16-bit
    308    branch instruction.	*/
    309 #define INST2OFFSET(o) ((((signed short)((o & ((1<<10)-1))<<6))>>6)<<1)
    310 
    311 /* Insert a single step breakpoint.  */
    312 
    313 static int
    314 moxie_software_single_step (struct frame_info *frame)
    315 {
    316   struct gdbarch *gdbarch = get_frame_arch (frame);
    317   struct address_space *aspace = get_frame_address_space (frame);
    318   CORE_ADDR addr;
    319   gdb_byte buf[4];
    320   uint16_t inst;
    321   uint32_t tmpu32;
    322   ULONGEST fp;
    323   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    324   struct regcache *regcache = get_current_regcache ();
    325 
    326   addr = get_frame_pc (frame);
    327 
    328   inst = (uint16_t) moxie_process_readu (addr, buf, 2, byte_order);
    329 
    330   /* Decode instruction.  */
    331   if (inst & (1 << 15))
    332     {
    333       if (inst & (1 << 14))
    334 	{
    335 	  /* This is a Form 3 instruction.  */
    336 	  int opcode = (inst >> 10 & 0xf);
    337 
    338 	  switch (opcode)
    339 	    {
    340 	    case 0x00: /* beq */
    341 	    case 0x01: /* bne */
    342 	    case 0x02: /* blt */
    343 	    case 0x03: /* bgt */
    344 	    case 0x04: /* bltu */
    345 	    case 0x05: /* bgtu */
    346 	    case 0x06: /* bge */
    347 	    case 0x07: /* ble */
    348 	    case 0x08: /* bgeu */
    349 	    case 0x09: /* bleu */
    350 	      /* Insert breaks on both branches, because we can't currently tell
    351 		 which way things will go.  */
    352 	      insert_single_step_breakpoint (gdbarch, aspace, addr + 2);
    353 	      insert_single_step_breakpoint (gdbarch, aspace, addr + 2 + INST2OFFSET(inst));
    354 	      break;
    355 	    default:
    356 	      {
    357 		/* Do nothing.	*/
    358 		break;
    359 	      }
    360 	    }
    361 	}
    362       else
    363 	{
    364 	  /* This is a Form 2 instruction.  They are all 16 bits.  */
    365 	  insert_single_step_breakpoint (gdbarch, aspace, addr + 2);
    366 	}
    367     }
    368   else
    369     {
    370       /* This is a Form 1 instruction.	*/
    371       int opcode = inst >> 8;
    372 
    373       switch (opcode)
    374 	{
    375 	  /* 16-bit instructions.  */
    376 	case 0x00: /* nop */
    377 	case 0x02: /* mov (register-to-register) */
    378 	case 0x05: /* add.l */
    379 	case 0x06: /* push */
    380 	case 0x07: /* pop */
    381 	case 0x0a: /* ld.l (register indirect) */
    382 	case 0x0b: /* st.l */
    383 	case 0x0e: /* cmp */
    384 	case 0x0f:
    385 	case 0x10:
    386 	case 0x11:
    387 	case 0x12:
    388 	case 0x13:
    389 	case 0x14:
    390 	case 0x15:
    391 	case 0x16:
    392 	case 0x17:
    393 	case 0x18:
    394 	case 0x1c: /* ld.b (register indirect) */
    395 	case 0x1e: /* st.b */
    396 	case 0x21: /* ld.s (register indirect) */
    397 	case 0x23: /* st.s */
    398 	case 0x26: /* and */
    399 	case 0x27: /* lshr */
    400 	case 0x28: /* ashl */
    401 	case 0x29: /* sub.l */
    402 	case 0x2a: /* neg */
    403 	case 0x2b: /* or */
    404 	case 0x2c: /* not */
    405 	case 0x2d: /* ashr */
    406 	case 0x2e: /* xor */
    407 	case 0x2f: /* mul.l */
    408 	case 0x31: /* div.l */
    409 	case 0x32: /* udiv.l */
    410 	case 0x33: /* mod.l */
    411 	case 0x34: /* umod.l */
    412 	  insert_single_step_breakpoint (gdbarch, aspace, addr + 2);
    413 	  break;
    414 
    415 	  /* 48-bit instructions.  */
    416 	case 0x01: /* ldi.l (immediate) */
    417 	case 0x08: /* lda.l */
    418 	case 0x09: /* sta.l */
    419 	case 0x0c: /* ldo.l */
    420 	case 0x0d: /* sto.l */
    421 	case 0x1b: /* ldi.b (immediate) */
    422 	case 0x1d: /* lda.b */
    423 	case 0x1f: /* sta.b */
    424 	case 0x20: /* ldi.s (immediate) */
    425 	case 0x22: /* lda.s */
    426 	case 0x24: /* sta.s */
    427 	case 0x36: /* ldo.b */
    428 	case 0x37: /* sto.b */
    429 	case 0x38: /* ldo.s */
    430 	case 0x39: /* sto.s */
    431 	  insert_single_step_breakpoint (gdbarch, aspace, addr + 6);
    432 	  break;
    433 
    434 	  /* Control flow instructions.	 */
    435 	case 0x03: /* jsra */
    436 	case 0x1a: /* jmpa */
    437 	  insert_single_step_breakpoint (gdbarch, aspace,
    438 					 moxie_process_readu (addr + 2,
    439 							      buf, 4,
    440 							      byte_order));
    441 	  break;
    442 
    443 	case 0x04: /* ret */
    444 	  regcache_cooked_read_unsigned (regcache, MOXIE_FP_REGNUM, &fp);
    445 	  insert_single_step_breakpoint (gdbarch, aspace,
    446 					 moxie_process_readu (fp + 4,
    447 							      buf, 4,
    448 							      byte_order));
    449 	  break;
    450 
    451 	case 0x19: /* jsr */
    452 	case 0x25: /* jmp */
    453 	  regcache_raw_read (regcache,
    454 			     (inst >> 4) & 0xf, (gdb_byte *) & tmpu32);
    455 	  insert_single_step_breakpoint (gdbarch, aspace,
    456 					 tmpu32);
    457 	  break;
    458 
    459 	case 0x30: /* swi */
    460 	case 0x35: /* brk */
    461 	  /* Unsupported, for now.  */
    462 	  break;
    463 	}
    464     }
    465 
    466   return 1;
    467 }
    468 
    469 /* Implement the "read_pc" gdbarch method.  */
    470 
    471 static CORE_ADDR
    472 moxie_read_pc (struct regcache *regcache)
    473 {
    474   ULONGEST pc;
    475 
    476   regcache_cooked_read_unsigned (regcache, MOXIE_PC_REGNUM, &pc);
    477   return pc;
    478 }
    479 
    480 /* Implement the "write_pc" gdbarch method.  */
    481 
    482 static void
    483 moxie_write_pc (struct regcache *regcache, CORE_ADDR val)
    484 {
    485   regcache_cooked_write_unsigned (regcache, MOXIE_PC_REGNUM, val);
    486 }
    487 
    488 /* Implement the "unwind_sp" gdbarch method.  */
    489 
    490 static CORE_ADDR
    491 moxie_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
    492 {
    493   return frame_unwind_register_unsigned (next_frame, MOXIE_SP_REGNUM);
    494 }
    495 
    496 /* Given a return value in `regbuf' with a type `valtype',
    497    extract and copy its value into `valbuf'.  */
    498 
    499 static void
    500 moxie_extract_return_value (struct type *type, struct regcache *regcache,
    501 			   void *dst)
    502 {
    503   struct gdbarch *gdbarch = get_regcache_arch (regcache);
    504   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    505   bfd_byte *valbuf = dst;
    506   int len = TYPE_LENGTH (type);
    507   ULONGEST tmp;
    508 
    509   /* By using store_unsigned_integer we avoid having to do
    510      anything special for small big-endian values.  */
    511   regcache_cooked_read_unsigned (regcache, RET1_REGNUM, &tmp);
    512   store_unsigned_integer (valbuf, (len > 4 ? len - 4 : len), byte_order, tmp);
    513 
    514   /* Ignore return values more than 8 bytes in size because the moxie
    515      returns anything more than 8 bytes in the stack.  */
    516   if (len > 4)
    517     {
    518       regcache_cooked_read_unsigned (regcache, RET1_REGNUM + 1, &tmp);
    519       store_unsigned_integer (valbuf + len - 4, 4, byte_order, tmp);
    520     }
    521 }
    522 
    523 /* Implement the "return_value" gdbarch method.  */
    524 
    525 static enum return_value_convention
    526 moxie_return_value (struct gdbarch *gdbarch, struct value *function,
    527 		   struct type *valtype, struct regcache *regcache,
    528 		   gdb_byte *readbuf, const gdb_byte *writebuf)
    529 {
    530   if (TYPE_LENGTH (valtype) > 8)
    531     return RETURN_VALUE_STRUCT_CONVENTION;
    532   else
    533     {
    534       if (readbuf != NULL)
    535 	moxie_extract_return_value (valtype, regcache, readbuf);
    536       if (writebuf != NULL)
    537 	moxie_store_return_value (valtype, regcache, writebuf);
    538       return RETURN_VALUE_REGISTER_CONVENTION;
    539     }
    540 }
    541 
    542 /* Allocate and initialize a moxie_frame_cache object.  */
    543 
    544 static struct moxie_frame_cache *
    545 moxie_alloc_frame_cache (void)
    546 {
    547   struct moxie_frame_cache *cache;
    548   int i;
    549 
    550   cache = FRAME_OBSTACK_ZALLOC (struct moxie_frame_cache);
    551 
    552   cache->base = 0;
    553   cache->saved_sp = 0;
    554   cache->pc = 0;
    555   cache->framesize = 0;
    556   for (i = 0; i < MOXIE_NUM_REGS; ++i)
    557     cache->saved_regs[i] = REG_UNAVAIL;
    558 
    559   return cache;
    560 }
    561 
    562 /* Populate a moxie_frame_cache object for this_frame.  */
    563 
    564 static struct moxie_frame_cache *
    565 moxie_frame_cache (struct frame_info *this_frame, void **this_cache)
    566 {
    567   struct moxie_frame_cache *cache;
    568   CORE_ADDR current_pc;
    569   int i;
    570 
    571   if (*this_cache)
    572     return *this_cache;
    573 
    574   cache = moxie_alloc_frame_cache ();
    575   *this_cache = cache;
    576 
    577   cache->base = get_frame_register_unsigned (this_frame, MOXIE_FP_REGNUM);
    578   if (cache->base == 0)
    579     return cache;
    580 
    581   cache->pc = get_frame_func (this_frame);
    582   current_pc = get_frame_pc (this_frame);
    583   if (cache->pc)
    584     {
    585       struct gdbarch *gdbarch = get_frame_arch (this_frame);
    586       moxie_analyze_prologue (cache->pc, current_pc, cache, gdbarch);
    587     }
    588 
    589   cache->saved_sp = cache->base - cache->framesize;
    590 
    591   for (i = 0; i < MOXIE_NUM_REGS; ++i)
    592     if (cache->saved_regs[i] != REG_UNAVAIL)
    593       cache->saved_regs[i] = cache->base - cache->saved_regs[i];
    594 
    595   return cache;
    596 }
    597 
    598 /* Implement the "unwind_pc" gdbarch method.  */
    599 
    600 static CORE_ADDR
    601 moxie_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
    602 {
    603   return frame_unwind_register_unsigned (next_frame, MOXIE_PC_REGNUM);
    604 }
    605 
    606 /* Given a GDB frame, determine the address of the calling function's
    607    frame.  This will be used to create a new GDB frame struct.  */
    608 
    609 static void
    610 moxie_frame_this_id (struct frame_info *this_frame,
    611 		    void **this_prologue_cache, struct frame_id *this_id)
    612 {
    613   struct moxie_frame_cache *cache = moxie_frame_cache (this_frame,
    614 						   this_prologue_cache);
    615 
    616   /* This marks the outermost frame.  */
    617   if (cache->base == 0)
    618     return;
    619 
    620   *this_id = frame_id_build (cache->saved_sp, cache->pc);
    621 }
    622 
    623 /* Get the value of register regnum in the previous stack frame.  */
    624 
    625 static struct value *
    626 moxie_frame_prev_register (struct frame_info *this_frame,
    627 			  void **this_prologue_cache, int regnum)
    628 {
    629   struct moxie_frame_cache *cache = moxie_frame_cache (this_frame,
    630 						   this_prologue_cache);
    631 
    632   gdb_assert (regnum >= 0);
    633 
    634   if (regnum == MOXIE_SP_REGNUM && cache->saved_sp)
    635     return frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
    636 
    637   if (regnum < MOXIE_NUM_REGS && cache->saved_regs[regnum] != REG_UNAVAIL)
    638     return frame_unwind_got_memory (this_frame, regnum,
    639 				    cache->saved_regs[regnum]);
    640 
    641   return frame_unwind_got_register (this_frame, regnum, regnum);
    642 }
    643 
    644 static const struct frame_unwind moxie_frame_unwind = {
    645   NORMAL_FRAME,
    646   default_frame_unwind_stop_reason,
    647   moxie_frame_this_id,
    648   moxie_frame_prev_register,
    649   NULL,
    650   default_frame_sniffer
    651 };
    652 
    653 /* Return the base address of this_frame.  */
    654 
    655 static CORE_ADDR
    656 moxie_frame_base_address (struct frame_info *this_frame, void **this_cache)
    657 {
    658   struct moxie_frame_cache *cache = moxie_frame_cache (this_frame,
    659 						       this_cache);
    660 
    661   return cache->base;
    662 }
    663 
    664 static const struct frame_base moxie_frame_base = {
    665   &moxie_frame_unwind,
    666   moxie_frame_base_address,
    667   moxie_frame_base_address,
    668   moxie_frame_base_address
    669 };
    670 
    671 static struct frame_id
    672 moxie_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
    673 {
    674   CORE_ADDR sp = get_frame_register_unsigned (this_frame, MOXIE_SP_REGNUM);
    675 
    676   return frame_id_build (sp, get_frame_pc (this_frame));
    677 }
    678 
    679 /* Parse the current instruction and record the values of the registers and
    680    memory that will be changed in current instruction to "record_arch_list".
    681    Return -1 if something wrong.  */
    682 
    683 static int
    684 moxie_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
    685 		      CORE_ADDR addr)
    686 {
    687   gdb_byte buf[4];
    688   uint16_t inst;
    689   uint32_t tmpu32;
    690   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    691 
    692   if (record_debug > 1)
    693     fprintf_unfiltered (gdb_stdlog, "Process record: moxie_process_record "
    694 			            "addr = 0x%s\n",
    695 			paddress (target_gdbarch (), addr));
    696 
    697   inst = (uint16_t) moxie_process_readu (addr, buf, 2, byte_order);
    698 
    699   /* Decode instruction.  */
    700   if (inst & (1 << 15))
    701     {
    702       if (inst & (1 << 14))
    703 	{
    704 	  /* This is a Form 3 instruction.  */
    705 	  int opcode = (inst >> 10 & 0xf);
    706 
    707 	  switch (opcode)
    708 	    {
    709 	    case 0x00: /* beq */
    710 	    case 0x01: /* bne */
    711 	    case 0x02: /* blt */
    712 	    case 0x03: /* bgt */
    713 	    case 0x04: /* bltu */
    714 	    case 0x05: /* bgtu */
    715 	    case 0x06: /* bge */
    716 	    case 0x07: /* ble */
    717 	    case 0x08: /* bgeu */
    718 	    case 0x09: /* bleu */
    719 	      /* Do nothing.  */
    720 	      break;
    721 	    default:
    722 	      {
    723 		/* Do nothing.  */
    724 		break;
    725 	      }
    726 	    }
    727 	}
    728       else
    729 	{
    730 	  /* This is a Form 2 instruction.  */
    731 	  int opcode = (inst >> 12 & 0x3);
    732 	  switch (opcode)
    733 	    {
    734 	    case 0x00: /* inc */
    735 	    case 0x01: /* dec */
    736 	    case 0x02: /* gsr */
    737 	      {
    738 		int reg = (inst >> 8) & 0xf;
    739 		if (record_full_arch_list_add_reg (regcache, reg))
    740 		  return -1;
    741 	      }
    742 	      break;
    743 	    case 0x03: /* ssr */
    744 	      {
    745 		/* Do nothing until GDB learns about moxie's special
    746 		   registers.  */
    747 	      }
    748 	      break;
    749 	    default:
    750 	      /* Do nothing.  */
    751 	      break;
    752 	    }
    753 	}
    754     }
    755   else
    756     {
    757       /* This is a Form 1 instruction.  */
    758       int opcode = inst >> 8;
    759 
    760       switch (opcode)
    761 	{
    762 	case 0x00: /* nop */
    763 	  /* Do nothing.  */
    764 	  break;
    765 	case 0x01: /* ldi.l (immediate) */
    766 	case 0x02: /* mov (register-to-register) */
    767 	  {
    768 	    int reg = (inst >> 4) & 0xf;
    769 	    if (record_full_arch_list_add_reg (regcache, reg))
    770 	      return -1;
    771 	  }
    772 	  break;
    773 	case 0x03: /* jsra */
    774 	  {
    775 	    regcache_raw_read (regcache,
    776 			       MOXIE_SP_REGNUM, (gdb_byte *) & tmpu32);
    777 	    tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
    778 					       4, byte_order);
    779 	    if (record_full_arch_list_add_reg (regcache, MOXIE_FP_REGNUM)
    780 		|| (record_full_arch_list_add_reg (regcache,
    781 						   MOXIE_SP_REGNUM))
    782 		|| record_full_arch_list_add_mem (tmpu32 - 12, 12))
    783 	      return -1;
    784 	  }
    785 	  break;
    786 	case 0x04: /* ret */
    787 	  {
    788 	    if (record_full_arch_list_add_reg (regcache, MOXIE_FP_REGNUM)
    789 		|| (record_full_arch_list_add_reg (regcache,
    790 						   MOXIE_SP_REGNUM)))
    791 	      return -1;
    792 	  }
    793 	  break;
    794 	case 0x05: /* add.l */
    795 	  {
    796 	    int reg = (inst >> 4) & 0xf;
    797 	    if (record_full_arch_list_add_reg (regcache, reg))
    798 	      return -1;
    799 	  }
    800 	  break;
    801 	case 0x06: /* push */
    802 	  {
    803 	    int reg = (inst >> 4) & 0xf;
    804 	    regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
    805 	    tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
    806 					       4, byte_order);
    807 	    if (record_full_arch_list_add_reg (regcache, reg)
    808 		|| record_full_arch_list_add_mem (tmpu32 - 4, 4))
    809 	      return -1;
    810 	  }
    811 	  break;
    812 	case 0x07: /* pop */
    813 	  {
    814 	    int a = (inst >> 4) & 0xf;
    815 	    int b = inst & 0xf;
    816 	    if (record_full_arch_list_add_reg (regcache, a)
    817 		|| record_full_arch_list_add_reg (regcache, b))
    818 	      return -1;
    819 	  }
    820 	  break;
    821 	case 0x08: /* lda.l */
    822 	  {
    823 	    int reg = (inst >> 4) & 0xf;
    824 	    if (record_full_arch_list_add_reg (regcache, reg))
    825 	      return -1;
    826 	  }
    827 	  break;
    828 	case 0x09: /* sta.l */
    829 	  {
    830 	    tmpu32 = (uint32_t) moxie_process_readu (addr+2, buf,
    831 						     4, byte_order);
    832 	    if (record_full_arch_list_add_mem (tmpu32, 4))
    833 	      return -1;
    834 	  }
    835 	  break;
    836 	case 0x0a: /* ld.l (register indirect) */
    837 	  {
    838 	    int reg = (inst >> 4) & 0xf;
    839 	    if (record_full_arch_list_add_reg (regcache, reg))
    840 	      return -1;
    841 	  }
    842 	  break;
    843 	case 0x0b: /* st.l */
    844 	  {
    845 	    int reg = (inst >> 4) & 0xf;
    846 	    regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
    847 	    tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
    848 					       4, byte_order);
    849 	    if (record_full_arch_list_add_mem (tmpu32, 4))
    850 	      return -1;
    851 	  }
    852 	  break;
    853 	case 0x0c: /* ldo.l */
    854 	  {
    855 	    int reg = (inst >> 4) & 0xf;
    856 	    if (record_full_arch_list_add_reg (regcache, reg))
    857 	      return -1;
    858 	  }
    859 	  break;
    860 	case 0x0d: /* sto.l */
    861 	  {
    862 	    int reg = (inst >> 4) & 0xf;
    863 	    uint32_t offset = (uint32_t) moxie_process_readu (addr+2, buf, 4,
    864 							      byte_order);
    865 	    regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
    866 	    tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
    867 					       4, byte_order);
    868 	    tmpu32 += offset;
    869 	    if (record_full_arch_list_add_mem (tmpu32, 4))
    870 	      return -1;
    871 	  }
    872 	  break;
    873 	case 0x0e: /* cmp */
    874 	  {
    875 	    if (record_full_arch_list_add_reg (regcache, MOXIE_CC_REGNUM))
    876 	      return -1;
    877 	  }
    878 	  break;
    879 	case 0x0f:
    880 	case 0x10:
    881 	case 0x11:
    882 	case 0x12:
    883 	case 0x13:
    884 	case 0x14:
    885 	case 0x15:
    886 	case 0x16:
    887 	case 0x17:
    888 	case 0x18:
    889 	  {
    890 	    /* Do nothing.  */
    891 	    break;
    892 	  }
    893 	case 0x19: /* jsr */
    894 	  {
    895 	    regcache_raw_read (regcache,
    896 			       MOXIE_SP_REGNUM, (gdb_byte *) & tmpu32);
    897 	    tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
    898 					       4, byte_order);
    899 	    if (record_full_arch_list_add_reg (regcache, MOXIE_FP_REGNUM)
    900 		|| (record_full_arch_list_add_reg (regcache,
    901 						   MOXIE_SP_REGNUM))
    902 		|| record_full_arch_list_add_mem (tmpu32 - 12, 12))
    903 	      return -1;
    904 	  }
    905 	  break;
    906 	case 0x1a: /* jmpa */
    907 	  {
    908 	    /* Do nothing.  */
    909 	  }
    910 	  break;
    911 	case 0x1b: /* ldi.b (immediate) */
    912 	case 0x1c: /* ld.b (register indirect) */
    913 	case 0x1d: /* lda.b */
    914 	  {
    915 	    int reg = (inst >> 4) & 0xf;
    916 	    if (record_full_arch_list_add_reg (regcache, reg))
    917 	      return -1;
    918 	  }
    919 	  break;
    920 	case 0x1e: /* st.b */
    921 	  {
    922 	    int reg = (inst >> 4) & 0xf;
    923 	    regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
    924 	    tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
    925 					       4, byte_order);
    926 	    if (record_full_arch_list_add_mem (tmpu32, 1))
    927 	      return -1;
    928 	  }
    929 	  break;
    930 	case 0x1f: /* sta.b */
    931 	  {
    932 	    tmpu32 = moxie_process_readu (addr+2, buf, 4, byte_order);
    933 	    if (record_full_arch_list_add_mem (tmpu32, 1))
    934 	      return -1;
    935 	  }
    936 	  break;
    937 	case 0x20: /* ldi.s (immediate) */
    938 	case 0x21: /* ld.s (register indirect) */
    939 	case 0x22: /* lda.s */
    940 	  {
    941 	    int reg = (inst >> 4) & 0xf;
    942 	    if (record_full_arch_list_add_reg (regcache, reg))
    943 	      return -1;
    944 	  }
    945 	  break;
    946 	case 0x23: /* st.s */
    947 	  {
    948 	    int reg = (inst >> 4) & 0xf;
    949 	    regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
    950 	    tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
    951 					       4, byte_order);
    952 	    if (record_full_arch_list_add_mem (tmpu32, 2))
    953 	      return -1;
    954 	  }
    955 	  break;
    956 	case 0x24: /* sta.s */
    957 	  {
    958 	    tmpu32 = moxie_process_readu (addr+2, buf, 4, byte_order);
    959 	    if (record_full_arch_list_add_mem (tmpu32, 2))
    960 	      return -1;
    961 	  }
    962 	  break;
    963 	case 0x25: /* jmp */
    964 	  {
    965 	    /* Do nothing.  */
    966 	  }
    967 	  break;
    968 	case 0x26: /* and */
    969 	case 0x27: /* lshr */
    970 	case 0x28: /* ashl */
    971 	case 0x29: /* sub.l */
    972 	case 0x2a: /* neg */
    973 	case 0x2b: /* or */
    974 	case 0x2c: /* not */
    975 	case 0x2d: /* ashr */
    976 	case 0x2e: /* xor */
    977 	case 0x2f: /* mul.l */
    978 	  {
    979 	    int reg = (inst >> 4) & 0xf;
    980 	    if (record_full_arch_list_add_reg (regcache, reg))
    981 	      return -1;
    982 	  }
    983 	  break;
    984 	case 0x30: /* swi */
    985 	  {
    986 	    /* We currently implement support for libgloss'
    987 	       system calls.  */
    988 
    989 	    int inum = moxie_process_readu (addr+2, buf, 4, byte_order);
    990 
    991 	    switch (inum)
    992 	      {
    993 	      case 0x1: /* SYS_exit */
    994 		{
    995 		  /* Do nothing.  */
    996 		}
    997 		break;
    998 	      case 0x2: /* SYS_open */
    999 		{
   1000 		  if (record_full_arch_list_add_reg (regcache, RET1_REGNUM))
   1001 		    return -1;
   1002 		}
   1003 		break;
   1004 	      case 0x4: /* SYS_read */
   1005 		{
   1006 		  uint32_t length, ptr;
   1007 
   1008 		  /* Read buffer pointer is in $r1.  */
   1009 		  regcache_raw_read (regcache, 3, (gdb_byte *) & ptr);
   1010 		  ptr = extract_unsigned_integer ((gdb_byte *) & ptr,
   1011 						  4, byte_order);
   1012 
   1013 		  /* String length is at 0x12($fp).  */
   1014 		  regcache_raw_read (regcache,
   1015 				     MOXIE_FP_REGNUM, (gdb_byte *) & tmpu32);
   1016 		  tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
   1017 						     4, byte_order);
   1018 		  length = moxie_process_readu (tmpu32+20, buf, 4, byte_order);
   1019 
   1020 		  if (record_full_arch_list_add_mem (ptr, length))
   1021 		    return -1;
   1022 		}
   1023 		break;
   1024 	      case 0x5: /* SYS_write */
   1025 		{
   1026 		  if (record_full_arch_list_add_reg (regcache, RET1_REGNUM))
   1027 		    return -1;
   1028 		}
   1029 		break;
   1030 	      default:
   1031 		break;
   1032 	      }
   1033 	  }
   1034 	  break;
   1035 	case 0x31: /* div.l */
   1036 	case 0x32: /* udiv.l */
   1037 	case 0x33: /* mod.l */
   1038 	case 0x34: /* umod.l */
   1039 	  {
   1040 	    int reg = (inst >> 4) & 0xf;
   1041 	    if (record_full_arch_list_add_reg (regcache, reg))
   1042 	      return -1;
   1043 	  }
   1044 	  break;
   1045 	case 0x35: /* brk */
   1046 	  /* Do nothing.  */
   1047 	  break;
   1048 	case 0x36: /* ldo.b */
   1049 	  {
   1050 	    int reg = (inst >> 4) & 0xf;
   1051 	    if (record_full_arch_list_add_reg (regcache, reg))
   1052 	      return -1;
   1053 	  }
   1054 	  break;
   1055 	case 0x37: /* sto.b */
   1056 	  {
   1057 	    int reg = (inst >> 4) & 0xf;
   1058 	    uint32_t offset = (uint32_t) moxie_process_readu (addr+2, buf, 4,
   1059 							      byte_order);
   1060 	    regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
   1061 	    tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
   1062 					       4, byte_order);
   1063 	    tmpu32 += offset;
   1064 	    if (record_full_arch_list_add_mem (tmpu32, 1))
   1065 	      return -1;
   1066 	  }
   1067 	  break;
   1068 	case 0x38: /* ldo.s */
   1069 	  {
   1070 	    int reg = (inst >> 4) & 0xf;
   1071 	    if (record_full_arch_list_add_reg (regcache, reg))
   1072 	      return -1;
   1073 	  }
   1074 	  break;
   1075 	case 0x39: /* sto.s */
   1076 	  {
   1077 	    int reg = (inst >> 4) & 0xf;
   1078 	    uint32_t offset = (uint32_t) moxie_process_readu (addr+2, buf, 4,
   1079 							      byte_order);
   1080 	    regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
   1081 	    tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
   1082 					       4, byte_order);
   1083 	    tmpu32 += offset;
   1084 	    if (record_full_arch_list_add_mem (tmpu32, 2))
   1085 	      return -1;
   1086 	  }
   1087 	  break;
   1088 	default:
   1089 	  /* Do nothing.  */
   1090 	  break;
   1091 	}
   1092     }
   1093 
   1094   if (record_full_arch_list_add_reg (regcache, MOXIE_PC_REGNUM))
   1095     return -1;
   1096   if (record_full_arch_list_add_end ())
   1097     return -1;
   1098   return 0;
   1099 }
   1100 
   1101 /* Allocate and initialize the moxie gdbarch object.  */
   1102 
   1103 static struct gdbarch *
   1104 moxie_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   1105 {
   1106   struct gdbarch *gdbarch;
   1107   struct gdbarch_tdep *tdep;
   1108 
   1109   /* If there is already a candidate, use it.  */
   1110   arches = gdbarch_list_lookup_by_info (arches, &info);
   1111   if (arches != NULL)
   1112     return arches->gdbarch;
   1113 
   1114   /* Allocate space for the new architecture.  */
   1115   tdep = XMALLOC (struct gdbarch_tdep);
   1116   gdbarch = gdbarch_alloc (&info, tdep);
   1117 
   1118   set_gdbarch_read_pc (gdbarch, moxie_read_pc);
   1119   set_gdbarch_write_pc (gdbarch, moxie_write_pc);
   1120   set_gdbarch_unwind_sp (gdbarch, moxie_unwind_sp);
   1121 
   1122   set_gdbarch_num_regs (gdbarch, MOXIE_NUM_REGS);
   1123   set_gdbarch_sp_regnum (gdbarch, MOXIE_SP_REGNUM);
   1124   set_gdbarch_pc_regnum (gdbarch, MOXIE_PC_REGNUM);
   1125   set_gdbarch_register_name (gdbarch, moxie_register_name);
   1126   set_gdbarch_register_type (gdbarch, moxie_register_type);
   1127 
   1128   set_gdbarch_return_value (gdbarch, moxie_return_value);
   1129 
   1130   set_gdbarch_skip_prologue (gdbarch, moxie_skip_prologue);
   1131   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
   1132   set_gdbarch_breakpoint_from_pc (gdbarch, moxie_breakpoint_from_pc);
   1133   set_gdbarch_frame_align (gdbarch, moxie_frame_align);
   1134 
   1135   frame_base_set_default (gdbarch, &moxie_frame_base);
   1136 
   1137   /* Methods for saving / extracting a dummy frame's ID.  The ID's
   1138      stack address must match the SP value returned by
   1139      PUSH_DUMMY_CALL, and saved by generic_save_dummy_frame_tos.  */
   1140   set_gdbarch_dummy_id (gdbarch, moxie_dummy_id);
   1141 
   1142   set_gdbarch_unwind_pc (gdbarch, moxie_unwind_pc);
   1143 
   1144   set_gdbarch_print_insn (gdbarch, print_insn_moxie);
   1145 
   1146   /* Hook in ABI-specific overrides, if they have been registered.  */
   1147   gdbarch_init_osabi (info, gdbarch);
   1148 
   1149   /* Hook in the default unwinders.  */
   1150   frame_unwind_append_unwinder (gdbarch, &moxie_frame_unwind);
   1151 
   1152   /* Single stepping.  */
   1153   set_gdbarch_software_single_step (gdbarch, moxie_software_single_step);
   1154 
   1155   /* Support simple overlay manager.  */
   1156   set_gdbarch_overlay_update (gdbarch, simple_overlay_update);
   1157 
   1158   /* Support reverse debugging.  */
   1159   set_gdbarch_process_record (gdbarch, moxie_process_record);
   1160 
   1161   return gdbarch;
   1162 }
   1163 
   1164 /* Register this machine's init routine.  */
   1165 
   1166 void
   1167 _initialize_moxie_tdep (void)
   1168 {
   1169   register_gdbarch_init (bfd_arch_moxie, moxie_gdbarch_init);
   1170 }
   1171