1 /* Target-dependent code for Xilinx MicroBlaze.
3 Copyright (C) 2009-2014 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
21 #include "arch-utils.h"
24 #include "trad-frame.h"
28 #include "breakpoint.h"
32 #include "frame-base.h"
33 #include "frame-unwind.h"
34 #include "dwarf2-frame.h"
36 #include "gdb_assert.h"
38 #include "target-descriptions.h"
39 #include "opcodes/microblaze-opcm.h"
40 #include "opcodes/microblaze-dis.h"
41 #include "microblaze-tdep.h"
44 #include "features/microblaze-with-stack-protect.c"
45 #include "features/microblaze.c"
47 /* Instruction macros used for analyzing the prologue. */
48 /* This set of instruction macros need to be changed whenever the
49 prologue generated by the compiler could have more instructions or
50 different type of instructions.
51 This set also needs to be verified if it is complete. */
52 #define IS_RETURN(op) (op == rtsd || op == rtid)
53 #define IS_UPDATE_SP(op, rd, ra) \
54 ((op == addik || op == addi) && rd == REG_SP && ra == REG_SP)
55 #define IS_SPILL_SP(op, rd, ra) \
56 ((op == swi || op == sw) && rd == REG_SP && ra == REG_SP)
57 #define IS_SPILL_REG(op, rd, ra) \
58 ((op == swi || op == sw) && rd != REG_SP && ra == REG_SP)
59 #define IS_ALSO_SPILL_REG(op, rd, ra, rb) \
60 ((op == swi || op == sw) && rd != REG_SP && ra == 0 && rb == REG_SP)
61 #define IS_SETUP_FP(op, ra, rb) \
62 ((op == add || op == addik || op == addk) && ra == REG_SP && rb == 0)
63 #define IS_SPILL_REG_FP(op, rd, ra, fpregnum) \
64 ((op == swi || op == sw) && rd != REG_SP && ra == fpregnum && ra != 0)
65 #define IS_SAVE_HIDDEN_PTR(op, rd, ra, rb) \
66 ((op == add || op == addik) && ra == MICROBLAZE_FIRST_ARGREG && rb == 0)
68 /* The registers of the Xilinx microblaze processor. */
70 static const char *microblaze_register_names[] =
72 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
73 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
74 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
75 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
76 "rpc", "rmsr", "rear", "resr", "rfsr", "rbtr",
77 "rpvr0", "rpvr1", "rpvr2", "rpvr3", "rpvr4", "rpvr5", "rpvr6",
78 "rpvr7", "rpvr8", "rpvr9", "rpvr10", "rpvr11",
79 "redr", "rpid", "rzpr", "rtlbx", "rtlbsx", "rtlblo", "rtlbhi",
83 #define MICROBLAZE_NUM_REGS ARRAY_SIZE (microblaze_register_names)
85 static unsigned int microblaze_debug_flag = 0;
88 microblaze_debug (const char *fmt, ...)
90 if (microblaze_debug_flag)
95 printf_unfiltered ("MICROBLAZE: ");
96 vprintf_unfiltered (fmt, args);
101 /* Return the name of register REGNUM. */
104 microblaze_register_name (struct gdbarch *gdbarch, int regnum)
106 if (regnum >= 0 && regnum < MICROBLAZE_NUM_REGS)
107 return microblaze_register_names[regnum];
112 microblaze_register_type (struct gdbarch *gdbarch, int regnum)
114 if (regnum == MICROBLAZE_SP_REGNUM)
115 return builtin_type (gdbarch)->builtin_data_ptr;
117 if (regnum == MICROBLAZE_PC_REGNUM)
118 return builtin_type (gdbarch)->builtin_func_ptr;
120 return builtin_type (gdbarch)->builtin_int;
124 /* Fetch the instruction at PC. */
127 microblaze_fetch_instruction (CORE_ADDR pc)
129 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
132 /* If we can't read the instruction at PC, return zero. */
133 if (target_read_memory (pc, buf, sizeof (buf)))
136 return extract_unsigned_integer (buf, 4, byte_order);
141 microblaze_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
143 struct value **args, int nargs,
144 struct type *value_type,
145 CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
146 struct regcache *regcache)
148 error (_("push_dummy_code not implemented"));
154 microblaze_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
155 struct regcache *regcache, CORE_ADDR bp_addr,
156 int nargs, struct value **args, CORE_ADDR sp,
157 int struct_return, CORE_ADDR struct_addr)
159 error (_("store_arguments not implemented"));
163 static const gdb_byte *
164 microblaze_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pc,
167 static gdb_byte break_insn[] = MICROBLAZE_BREAKPOINT;
169 *len = sizeof (break_insn);
173 /* Allocate and initialize a frame cache. */
175 static struct microblaze_frame_cache *
176 microblaze_alloc_frame_cache (void)
178 struct microblaze_frame_cache *cache;
180 cache = FRAME_OBSTACK_ZALLOC (struct microblaze_frame_cache);
186 /* Frameless until proven otherwise. */
187 cache->frameless_p = 1;
192 /* The base of the current frame is actually in the stack pointer.
193 This happens when there is no frame pointer (microblaze ABI does not
194 require a frame pointer) or when we're stopped in the prologue or
195 epilogue itself. In these cases, microblaze_analyze_prologue will need
196 to update fi->frame before returning or analyzing the register
197 save instructions. */
198 #define MICROBLAZE_MY_FRAME_IN_SP 0x1
200 /* The base of the current frame is in a frame pointer register.
201 This register is noted in frame_extra_info->fp_regnum.
203 Note that the existance of an FP might also indicate that the
204 function has called alloca. */
205 #define MICROBLAZE_MY_FRAME_IN_FP 0x2
207 /* Function prologues on the Xilinx microblaze processors consist of:
209 - adjustments to the stack pointer (r1) (addi r1, r1, imm)
210 - making a copy of r1 into another register (a "frame" pointer)
212 - store word/multiples that use r1 or the frame pointer as the
213 base address (swi r?, r1, imm OR swi r?, fp, imm)
215 Note that microblaze really doesn't have a real frame pointer.
216 Instead, the compiler may copy the SP into a register (usually
217 r19) to act as an arg pointer. For our target-dependent purposes,
218 the frame info's "frame" member will be the beginning of the
219 frame. The SP could, in fact, point below this.
221 The prologue ends when an instruction fails to meet either of
224 /* Analyze the prologue to determine where registers are saved,
225 the end of the prologue, etc. Return the address of the first line
226 of "real" code (i.e., the end of the prologue). */
229 microblaze_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
230 CORE_ADDR current_pc,
231 struct microblaze_frame_cache *cache)
234 CORE_ADDR func_addr, func_end, addr, stop, prologue_end_addr = 0;
237 enum microblaze_instr op;
239 int save_hidden_pointer_found = 0;
240 int non_stack_instruction_found = 0;
242 /* Find the start of this function. */
243 find_pc_partial_function (pc, &name, &func_addr, &func_end);
250 /* Initialize info about frame. */
251 cache->framesize = 0;
252 cache->fp_regnum = MICROBLAZE_SP_REGNUM;
253 cache->frameless_p = 1;
255 /* Start decoding the prologue. We start by checking two special cases:
257 1. We're about to return
258 2. We're at the first insn of the prologue.
260 If we're about to return, our frame has already been deallocated.
261 If we are stopped at the first instruction of a prologue,
262 then our frame has not yet been set up. */
264 /* Get the first insn from memory. */
266 insn = microblaze_fetch_instruction (pc);
267 op = microblaze_decode_insn (insn, &rd, &ra, &rb, &imm);
272 /* Start at beginning of function and analyze until we get to the
273 current pc, or the end of the function, whichever is first. */
274 stop = (current_pc < func_end ? current_pc : func_end);
276 microblaze_debug ("Scanning prologue: name=%s, func_addr=%s, stop=%s\n",
277 name, paddress (gdbarch, func_addr),
278 paddress (gdbarch, stop));
280 for (addr = func_addr; addr < stop; addr += INST_WORD_SIZE)
282 insn = microblaze_fetch_instruction (addr);
283 op = microblaze_decode_insn (insn, &rd, &ra, &rb, &imm);
284 microblaze_debug ("%s %08lx\n", paddress (gdbarch, pc), insn);
286 /* This code is very sensitive to what functions are present in the
287 prologue. It assumes that the (addi, addik, swi, sw) can be the
288 only instructions in the prologue. */
289 if (IS_UPDATE_SP(op, rd, ra))
291 microblaze_debug ("got addi r1,r1,%d; contnuing\n", imm);
292 if (cache->framesize)
293 break; /* break if framesize already computed. */
294 cache->framesize = -imm; /* stack grows towards low memory. */
295 cache->frameless_p = 0; /* Frame found. */
296 save_hidden_pointer_found = 0;
297 non_stack_instruction_found = 0;
300 else if (IS_SPILL_SP(op, rd, ra))
302 /* Spill stack pointer. */
303 cache->register_offsets[rd] = imm; /* SP spilled before updating. */
305 microblaze_debug ("swi r1 r1 %d, continuing\n", imm);
306 save_hidden_pointer_found = 0;
307 if (!cache->framesize)
308 non_stack_instruction_found = 0;
311 else if (IS_SPILL_REG(op, rd, ra))
313 /* Spill register. */
314 cache->register_offsets[rd] = imm - cache->framesize;
316 microblaze_debug ("swi %d r1 %d, continuing\n", rd, imm);
317 save_hidden_pointer_found = 0;
318 if (!cache->framesize)
319 non_stack_instruction_found = 0;
322 else if (IS_ALSO_SPILL_REG(op, rd, ra, rb))
324 /* Spill register. */
325 cache->register_offsets[rd] = 0 - cache->framesize;
327 microblaze_debug ("sw %d r0 r1, continuing\n", rd);
328 save_hidden_pointer_found = 0;
329 if (!cache->framesize)
330 non_stack_instruction_found = 0;
333 else if (IS_SETUP_FP(op, ra, rb))
335 /* We have a frame pointer. Note the register which is
336 acting as the frame pointer. */
337 flags |= MICROBLAZE_MY_FRAME_IN_FP;
338 flags &= ~MICROBLAZE_MY_FRAME_IN_SP;
339 cache->fp_regnum = rd;
340 microblaze_debug ("Found a frame pointer: r%d\n", cache->fp_regnum);
341 save_hidden_pointer_found = 0;
342 if (!cache->framesize)
343 non_stack_instruction_found = 0;
346 else if (IS_SPILL_REG_FP(op, rd, ra, cache->fp_regnum))
348 /* reg spilled after updating. */
349 cache->register_offsets[rd] = imm - cache->framesize;
351 microblaze_debug ("swi %d %d %d, continuing\n", rd, ra, imm);
352 save_hidden_pointer_found = 0;
353 if (!cache->framesize)
354 non_stack_instruction_found = 0;
357 else if (IS_SAVE_HIDDEN_PTR(op, rd, ra, rb))
359 /* If the first argument is a hidden pointer to the area where the
360 return structure is to be saved, then it is saved as part of the
363 microblaze_debug ("add %d %d %d, continuing\n", rd, ra, rb);
364 save_hidden_pointer_found = 1;
365 if (!cache->framesize)
366 non_stack_instruction_found = 0;
370 /* As a result of the modification in the next step where we continue
371 to analyze the prologue till we reach a control flow instruction,
372 we need another variable to store when exactly a non-stack
373 instruction was encountered, which is the current definition
375 if (!non_stack_instruction_found)
376 prologue_end_addr = addr;
377 non_stack_instruction_found = 1;
379 /* When optimizations are enabled, it is not guaranteed that prologue
380 instructions are not mixed in with other instructions from the
381 program. Some programs show this behavior at -O2. This can be
382 avoided by adding -fno-schedule-insns2 switch as of now (edk 8.1)
383 In such cases, we scan the function until we see the first control
387 unsigned op = (unsigned)insn >> 26;
389 /* continue if not control flow (branch, return). */
390 if (op != 0x26 && op != 0x27 && op != 0x2d && op != 0x2e && op != 0x2f)
393 continue; /* continue if imm. */
396 /* This is not a prologue insn, so stop here. */
397 microblaze_debug ("insn is not a prologue insn -- ending scan\n");
401 microblaze_debug ("done analyzing prologue\n");
402 microblaze_debug ("prologue end = 0x%x\n", (int) addr);
404 /* If the last instruction was an add rd, r5, r0 then don't count it as
405 part of the prologue. */
406 if (save_hidden_pointer_found)
407 prologue_end_addr -= INST_WORD_SIZE;
409 return prologue_end_addr;
413 microblaze_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
418 frame_unwind_register (next_frame, MICROBLAZE_PC_REGNUM, buf);
419 pc = extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr);
420 /* For sentinel frame, return address is actual PC. For other frames,
421 return address is pc+8. This is a workaround because gcc does not
422 generate correct return address in CIE. */
423 if (frame_relative_level (next_frame) >= 0)
428 /* Return PC of first real instruction of the function starting at
432 microblaze_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
434 struct symtab_and_line sal;
435 CORE_ADDR func_start, func_end, ostart_pc;
436 struct microblaze_frame_cache cache;
438 /* This is the preferred method, find the end of the prologue by
439 using the debugging information. Debugging info does not always
440 give the right answer since parameters are stored on stack after this.
441 Always analyze the prologue. */
442 if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end))
444 sal = find_pc_line (func_start, 0);
446 if (sal.end < func_end
447 && start_pc <= sal.end)
451 ostart_pc = microblaze_analyze_prologue (gdbarch, func_start, 0xffffffffUL,
454 if (ostart_pc > start_pc)
461 static struct microblaze_frame_cache *
462 microblaze_frame_cache (struct frame_info *next_frame, void **this_cache)
464 struct microblaze_frame_cache *cache;
465 struct gdbarch *gdbarch = get_frame_arch (next_frame);
472 cache = microblaze_alloc_frame_cache ();
474 cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
476 /* Clear offsets to saved regs in frame. */
477 for (rn = 0; rn < gdbarch_num_regs (gdbarch); rn++)
478 cache->register_offsets[rn] = -1;
480 func = get_frame_func (next_frame);
482 cache->pc = get_frame_address_in_block (next_frame);
488 microblaze_frame_this_id (struct frame_info *next_frame, void **this_cache,
489 struct frame_id *this_id)
491 struct microblaze_frame_cache *cache =
492 microblaze_frame_cache (next_frame, this_cache);
494 /* This marks the outermost frame. */
495 if (cache->base == 0)
498 (*this_id) = frame_id_build (cache->base, cache->pc);
501 static struct value *
502 microblaze_frame_prev_register (struct frame_info *this_frame,
503 void **this_cache, int regnum)
505 struct microblaze_frame_cache *cache =
506 microblaze_frame_cache (this_frame, this_cache);
508 if (cache->frameless_p)
510 if (regnum == MICROBLAZE_PC_REGNUM)
512 if (regnum == MICROBLAZE_SP_REGNUM)
514 return trad_frame_get_prev_register (this_frame,
515 cache->saved_regs, regnum);
518 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
523 static const struct frame_unwind microblaze_frame_unwind =
526 default_frame_unwind_stop_reason,
527 microblaze_frame_this_id,
528 microblaze_frame_prev_register,
530 default_frame_sniffer
534 microblaze_frame_base_address (struct frame_info *next_frame,
537 struct microblaze_frame_cache *cache =
538 microblaze_frame_cache (next_frame, this_cache);
543 static const struct frame_base microblaze_frame_base =
545 µblaze_frame_unwind,
546 microblaze_frame_base_address,
547 microblaze_frame_base_address,
548 microblaze_frame_base_address
551 /* Extract from an array REGBUF containing the (raw) register state, a
552 function return value of TYPE, and copy that into VALBUF. */
554 microblaze_extract_return_value (struct type *type, struct regcache *regcache,
559 /* Copy the return value (starting) in RETVAL_REGNUM to VALBUF. */
560 switch (TYPE_LENGTH (type))
562 case 1: /* return last byte in the register. */
563 regcache_cooked_read (regcache, MICROBLAZE_RETVAL_REGNUM, buf);
564 memcpy(valbuf, buf + MICROBLAZE_REGISTER_SIZE - 1, 1);
566 case 2: /* return last 2 bytes in register. */
567 regcache_cooked_read (regcache, MICROBLAZE_RETVAL_REGNUM, buf);
568 memcpy(valbuf, buf + MICROBLAZE_REGISTER_SIZE - 2, 2);
570 case 4: /* for sizes 4 or 8, copy the required length. */
572 regcache_cooked_read (regcache, MICROBLAZE_RETVAL_REGNUM, buf);
573 regcache_cooked_read (regcache, MICROBLAZE_RETVAL_REGNUM+1, buf+4);
574 memcpy (valbuf, buf, TYPE_LENGTH (type));
577 internal_error (__FILE__, __LINE__,
578 _("Unsupported return value size requested"));
582 /* Store the return value in VALBUF (of type TYPE) where the caller
585 Integers up to four bytes are stored in r3.
587 Longs are stored in r3 (most significant word) and r4 (least
590 Small structures are always returned on stack. */
593 microblaze_store_return_value (struct type *type, struct regcache *regcache,
594 const gdb_byte *valbuf)
596 int len = TYPE_LENGTH (type);
599 memset (buf, 0, sizeof(buf));
601 /* Integral and pointer return values. */
605 gdb_assert (len == 8);
606 memcpy (buf, valbuf, 8);
607 regcache_cooked_write (regcache, MICROBLAZE_RETVAL_REGNUM+1, buf + 4);
610 /* ??? Do we need to do any sign-extension here? */
611 memcpy (buf + 4 - len, valbuf, len);
613 regcache_cooked_write (regcache, MICROBLAZE_RETVAL_REGNUM, buf);
616 static enum return_value_convention
617 microblaze_return_value (struct gdbarch *gdbarch, struct value *function,
618 struct type *type, struct regcache *regcache,
619 gdb_byte *readbuf, const gdb_byte *writebuf)
622 microblaze_extract_return_value (type, regcache, readbuf);
624 microblaze_store_return_value (type, regcache, writebuf);
626 return RETURN_VALUE_REGISTER_CONVENTION;
630 microblaze_stabs_argument_has_addr (struct gdbarch *gdbarch, struct type *type)
632 return (TYPE_LENGTH (type) == 16);
636 microblaze_write_pc (struct regcache *regcache, CORE_ADDR pc)
638 regcache_cooked_write_unsigned (regcache, MICROBLAZE_PC_REGNUM, pc);
641 static int dwarf2_to_reg_map[78] =
642 { 0 /* r0 */, 1 /* r1 */, 2 /* r2 */, 3 /* r3 */, /* 0- 3 */
643 4 /* r4 */, 5 /* r5 */, 6 /* r6 */, 7 /* r7 */, /* 4- 7 */
644 8 /* r8 */, 9 /* r9 */, 10 /* r10 */, 11 /* r11 */, /* 8-11 */
645 12 /* r12 */, 13 /* r13 */, 14 /* r14 */, 15 /* r15 */, /* 12-15 */
646 16 /* r16 */, 17 /* r17 */, 18 /* r18 */, 19 /* r19 */, /* 16-19 */
647 20 /* r20 */, 21 /* r21 */, 22 /* r22 */, 23 /* r23 */, /* 20-23 */
648 24 /* r24 */, 25 /* r25 */, 26 /* r26 */, 27 /* r27 */, /* 24-25 */
649 28 /* r28 */, 29 /* r29 */, 30 /* r30 */, 31 /* r31 */, /* 28-31 */
650 -1 /* $f0 */, -1 /* $f1 */, -1 /* $f2 */, -1 /* $f3 */, /* 32-35 */
651 -1 /* $f4 */, -1 /* $f5 */, -1 /* $f6 */, -1 /* $f7 */, /* 36-39 */
652 -1 /* $f8 */, -1 /* $f9 */, -1 /* $f10 */, -1 /* $f11 */, /* 40-43 */
653 -1 /* $f12 */, -1 /* $f13 */, -1 /* $f14 */, -1 /* $f15 */, /* 44-47 */
654 -1 /* $f16 */, -1 /* $f17 */, -1 /* $f18 */, -1 /* $f19 */, /* 48-51 */
655 -1 /* $f20 */, -1 /* $f21 */, -1 /* $f22 */, -1 /* $f23 */, /* 52-55 */
656 -1 /* $f24 */, -1 /* $f25 */, -1 /* $f26 */, -1 /* $f27 */, /* 56-59 */
657 -1 /* $f28 */, -1 /* $f29 */, -1 /* $f30 */, -1 /* $f31 */, /* 60-63 */
658 -1 /* hi */, -1 /* lo */, -1 /* accum*/, 33 /* rmsr */, /* 64-67 */
659 -1 /* $fcc1*/, -1 /* $fcc2*/, -1 /* $fcc3*/, -1 /* $fcc4*/, /* 68-71 */
660 -1 /* $fcc5*/, -1 /* $fcc6*/, -1 /* $fcc7*/, -1 /* $ap */, /* 72-75 */
661 -1 /* $rap */, -1 /* $frp */ /* 76-77 */
665 microblaze_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int reg)
667 gdb_assert ((size_t) reg < sizeof (dwarf2_to_reg_map));
668 return dwarf2_to_reg_map[reg];
672 microblaze_register_g_packet_guesses (struct gdbarch *gdbarch)
674 register_remote_g_packet_guess (gdbarch,
675 4 * MICROBLAZE_NUM_CORE_REGS,
678 register_remote_g_packet_guess (gdbarch,
679 4 * MICROBLAZE_NUM_REGS,
680 tdesc_microblaze_with_stack_protect);
683 static struct gdbarch *
684 microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
686 struct gdbarch_tdep *tdep;
687 struct gdbarch *gdbarch;
688 struct tdesc_arch_data *tdesc_data = NULL;
689 const struct target_desc *tdesc = info.target_desc;
691 /* If there is already a candidate, use it. */
692 arches = gdbarch_list_lookup_by_info (arches, &info);
694 return arches->gdbarch;
696 tdesc = tdesc_microblaze;
698 /* Check any target description for validity. */
699 if (tdesc_has_registers (tdesc))
701 const struct tdesc_feature *feature;
705 feature = tdesc_find_feature (tdesc,
706 "org.gnu.gdb.microblaze.core");
709 tdesc_data = tdesc_data_alloc ();
712 for (i = 0; i < MICROBLAZE_NUM_CORE_REGS; i++)
713 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
714 microblaze_register_names[i]);
715 feature = tdesc_find_feature (tdesc,
716 "org.gnu.gdb.microblaze.stack-protect");
720 valid_p &= tdesc_numbered_register (feature, tdesc_data,
721 MICROBLAZE_SLR_REGNUM,
723 valid_p &= tdesc_numbered_register (feature, tdesc_data,
724 MICROBLAZE_SHR_REGNUM,
729 /* Allocate space for the new architecture. */
730 tdep = XNEW (struct gdbarch_tdep);
731 gdbarch = gdbarch_alloc (&info, tdep);
733 set_gdbarch_long_double_bit (gdbarch, 128);
735 set_gdbarch_num_regs (gdbarch, MICROBLAZE_NUM_REGS);
736 set_gdbarch_register_name (gdbarch, microblaze_register_name);
737 set_gdbarch_register_type (gdbarch, microblaze_register_type);
739 /* Register numbers of various important registers. */
740 set_gdbarch_sp_regnum (gdbarch, MICROBLAZE_SP_REGNUM);
741 set_gdbarch_pc_regnum (gdbarch, MICROBLAZE_PC_REGNUM);
743 /* Map Dwarf2 registers to GDB registers. */
744 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, microblaze_dwarf2_reg_to_regnum);
746 /* Call dummy code. */
747 set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
748 set_gdbarch_push_dummy_code (gdbarch, microblaze_push_dummy_code);
749 set_gdbarch_push_dummy_call (gdbarch, microblaze_push_dummy_call);
751 set_gdbarch_return_value (gdbarch, microblaze_return_value);
752 set_gdbarch_stabs_argument_has_addr
753 (gdbarch, microblaze_stabs_argument_has_addr);
755 set_gdbarch_skip_prologue (gdbarch, microblaze_skip_prologue);
757 /* Stack grows downward. */
758 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
760 set_gdbarch_breakpoint_from_pc (gdbarch, microblaze_breakpoint_from_pc);
762 set_gdbarch_frame_args_skip (gdbarch, 8);
764 set_gdbarch_print_insn (gdbarch, print_insn_microblaze);
766 set_gdbarch_write_pc (gdbarch, microblaze_write_pc);
768 set_gdbarch_unwind_pc (gdbarch, microblaze_unwind_pc);
770 microblaze_register_g_packet_guesses (gdbarch);
772 frame_base_set_default (gdbarch, µblaze_frame_base);
774 /* Hook in ABI-specific overrides, if they have been registered. */
775 gdbarch_init_osabi (info, gdbarch);
777 /* Unwind the frame. */
778 dwarf2_append_unwinders (gdbarch);
779 frame_unwind_append_unwinder (gdbarch, µblaze_frame_unwind);
780 frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
781 if (tdesc_data != NULL)
782 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
787 /* Provide a prototype to silence -Wmissing-prototypes. */
788 void _initialize_microblaze_tdep (void);
791 _initialize_microblaze_tdep (void)
793 register_gdbarch_init (bfd_arch_microblaze, microblaze_gdbarch_init);
795 initialize_tdesc_microblaze_with_stack_protect ();
796 initialize_tdesc_microblaze ();
797 /* Debug this files internals. */
798 add_setshow_zuinteger_cmd ("microblaze", class_maintenance,
799 µblaze_debug_flag, _("\
800 Set microblaze debugging."), _("\
801 Show microblaze debugging."), _("\
802 When non-zero, microblaze specific debugging is enabled."),
805 &setdebuglist, &showdebuglist);