Add software single step support to moxie port
[deliverable/binutils-gdb.git] / gdb / moxie-tdep.c
1 /* Target-dependent code for Moxie.
2
3 Copyright (C) 2009-2013 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 }
This page took 0.078018 seconds and 5 git commands to generate.