1 /* Target-dependent code for the Acorn Risc Machine (ARM).
2 Copyright (C) 1988, 1989, 1991, 1992, 1993, 1995-1999
3 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 2 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, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
28 #include "gdb_string.h"
29 #include "coff/internal.h" /* Internal format of COFF symbols in BFD */
32 The following macros are actually wrong. Neither arm nor thumb can
33 or should set the lsb on addr.
34 The thumb addresses are mod 2, so (addr & 2) would be a good heuristic
35 to use when checking for thumb (see arm_pc_is_thumb() below).
36 Unfortunately, something else depends on these (incorrect) macros, so
37 fixing them actually breaks gdb. I didn't have time to investigate. Z.R.
39 /* Thumb function addresses are odd (bit 0 is set). Here are some
40 macros to test, set, or clear bit 0 of addresses. */
41 #define IS_THUMB_ADDR(addr) ((addr) & 1)
42 #define MAKE_THUMB_ADDR(addr) ((addr) | 1)
43 #define UNMAKE_THUMB_ADDR(addr) ((addr) & ~1)
45 /* Macros to round N up or down to the next A boundary; A must be
47 #define ROUND_DOWN(n,a) ((n) & ~((a) - 1))
48 #define ROUND_UP(n,a) (((n) + (a) - 1) & ~((a) - 1))
50 static char *APCS_register_names[] =
51 {"a1", "a2", "a3", "a4", /* 0 1 2 3 */
52 "v1", "v2", "v3", "v4", /* 4 5 6 7 */
53 "v5", "v6", "sl", "fp", /* 8 9 10 11 */
54 "ip", "sp", "lr", "pc", /* 12 13 14 15 */
55 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
56 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
57 "fps", "ps"} /* 24 25 */ ;
59 /* These names are the ones which gcc emits, and
60 I find them less confusing. Toggle between them
61 using the `othernames' command. */
62 static char *additional_register_names[] =
63 {"r0", "r1", "r2", "r3", /* 0 1 2 3 */
64 "r4", "r5", "r6", "r7", /* 4 5 6 7 */
65 "r8", "r9", "r10", "r11", /* 8 9 10 11 */
66 "r12", "r13", "r14", "pc", /* 12 13 14 15 */
67 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
68 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
69 "fps", "ps"} /* 24 25 */ ;
71 /* By default use the APCS registers names */
73 char **arm_register_names = APCS_register_names;
75 /* Should call_function allocate stack space for a struct return? */
76 /* The system C compiler uses a similar structure return convention to gcc */
78 arm_use_struct_convention (gcc_p, type)
82 return (TYPE_LENGTH (type) > 4);
86 arm_frame_chain_valid (chain, thisframe)
88 struct frame_info *thisframe;
90 #define LOWEST_PC 0x20 /* the first 0x20 bytes are the trap vectors. */
91 return (chain != 0 && (FRAME_SAVED_PC (thisframe) >= LOWEST_PC));
94 /* Set to true if the 32-bit mode is in use. */
98 /* Flag set by arm_fix_call_dummy that tells whether the target function
99 is a Thumb function. This flag is checked by arm_push_arguments.
100 FIXME: Change the PUSH_ARGUMENTS macro (and its use in valops.c) to
101 pass the function address as an additional parameter. */
103 static int target_is_thumb;
105 /* Flag set by arm_fix_call_dummy that tells whether the calling function
106 is a Thumb function. This flag is checked by arm_pc_is_thumb
107 and arm_call_dummy_breakpoint_offset. */
109 static int caller_is_thumb;
111 /* Tell if the program counter value in MEMADDR is in a Thumb function. */
114 arm_pc_is_thumb (memaddr)
117 struct minimal_symbol *sym;
120 /* If bit 0 of the address is set, assume this is a Thumb address. */
121 if (IS_THUMB_ADDR (memaddr))
124 /* Thumb function have a "special" bit set in minimal symbols */
125 sym = lookup_minimal_symbol_by_pc (memaddr);
128 return (MSYMBOL_IS_SPECIAL (sym));
134 /* Tell if the program counter value in MEMADDR is in a call dummy that
135 is being called from a Thumb function. */
138 arm_pc_is_thumb_dummy (memaddr)
141 CORE_ADDR sp = read_sp ();
143 if (PC_IN_CALL_DUMMY (memaddr, sp, sp + 64))
144 return caller_is_thumb;
150 arm_addr_bits_remove (val)
153 if (arm_pc_is_thumb (val))
154 return (val & (arm_apcs_32 ? 0xfffffffe : 0x03fffffe));
156 return (val & (arm_apcs_32 ? 0xfffffffc : 0x03fffffc));
160 arm_saved_pc_after_call (frame)
161 struct frame_info *frame;
163 return ADDR_BITS_REMOVE (read_register (LR_REGNUM));
167 arm_frameless_function_invocation (fi)
168 struct frame_info *fi;
171 CORE_ADDR func_start, after_prologue;
172 func_start = (get_pc_function_start ((fi)->pc) + FUNCTION_START_OFFSET);
173 after_prologue = func_start;
174 SKIP_PROLOGUE (after_prologue);
175 frameless = (after_prologue == func_start);
179 /* A typical Thumb prologue looks like this:
183 Sometimes the latter instruction may be replaced by:
188 thumb_skip_prologue (pc)
191 CORE_ADDR current_pc;
193 for (current_pc = pc; current_pc < pc + 20; current_pc += 2)
195 unsigned short insn = read_memory_unsigned_integer (current_pc, 2);
197 if ((insn & 0xfe00) != 0xb400 /* push {..., r7, lr} */
198 && (insn & 0xff00) != 0xb000 /* add sp, #simm */
199 && (insn & 0xff00) != 0xaf00 /* add r7, sp, #imm */
200 && insn != 0x466f /* mov r7, sp */
201 && (insn & 0xffc0) != 0x4640) /* mov r0-r7, r8-r15 */
208 /* APCS (ARM procedure call standard) defines the following prologue:
211 [stmfd sp!, {a1,a2,a3,a4}]
212 stmfd sp!, {...,fp,ip,lr,pc}
213 [stfe f7, [sp, #-12]!]
214 [stfe f6, [sp, #-12]!]
215 [stfe f5, [sp, #-12]!]
216 [stfe f4, [sp, #-12]!]
217 sub fp, ip, #nn // nn == 20 or 4 depending on second ins
221 arm_skip_prologue (pc)
226 CORE_ADDR func_addr, func_end;
227 struct symtab_and_line sal;
229 /* See what the symbol table says. */
230 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
232 sal = find_pc_line (func_addr, 0);
233 if (sal.line != 0 && sal.end < func_end)
237 /* Check if this is Thumb code. */
238 if (arm_pc_is_thumb (pc))
239 return thumb_skip_prologue (pc);
241 /* Can't find the prologue end in the symbol table, try it the hard way
242 by disassembling the instructions. */
244 inst = read_memory_integer (skip_pc, 4);
245 if (inst != 0xe1a0c00d) /* mov ip, sp */
249 inst = read_memory_integer (skip_pc, 4);
250 if ((inst & 0xfffffff0) == 0xe92d0000) /* stmfd sp!,{a1,a2,a3,a4} */
253 inst = read_memory_integer (skip_pc, 4);
256 if ((inst & 0xfffff800) != 0xe92dd800) /* stmfd sp!,{...,fp,ip,lr,pc} */
260 inst = read_memory_integer (skip_pc, 4);
262 /* Any insns after this point may float into the code, if it makes
263 for better instruction scheduling, so we skip them only if
264 we find them, but still consdier the function to be frame-ful */
266 /* We may have either one sfmfd instruction here, or several stfe insns,
267 depending on the version of floating point code we support. */
268 if ((inst & 0xffbf0fff) == 0xec2d0200) /* sfmfd fn, <cnt>, [sp]! */
271 inst = read_memory_integer (skip_pc, 4);
275 while ((inst & 0xffff8fff) == 0xed6d0103) /* stfe fn, [sp, #-12]! */
278 inst = read_memory_integer (skip_pc, 4);
282 if ((inst & 0xfffff000) == 0xe24cb000) /* sub fp, ip, #nn */
288 /* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
289 This function decodes a Thumb function prologue to determine:
290 1) the size of the stack frame
291 2) which registers are saved on it
292 3) the offsets of saved regs
293 4) the offset from the stack pointer to the frame pointer
294 This information is stored in the "extra" fields of the frame_info.
296 A typical Thumb function prologue might look like this:
300 Which would create this stack frame (offsets relative to FP)
301 old SP -> 24 stack parameters
304 R7 -> 0 local variables (16 bytes)
305 SP -> -12 additional stack space (12 bytes)
306 The frame size would thus be 36 bytes, and the frame offset would be
307 12 bytes. The frame register is R7. */
314 thumb_scan_prologue (fi)
315 struct frame_info *fi;
317 CORE_ADDR prologue_start;
318 CORE_ADDR prologue_end;
319 CORE_ADDR current_pc;
320 int saved_reg[16]; /* which register has been copied to register n? */
323 if (find_pc_partial_function (fi->pc, NULL, &prologue_start, &prologue_end))
325 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
327 if (sal.line == 0) /* no line info, use current PC */
328 prologue_end = fi->pc;
329 else if (sal.end < prologue_end) /* next line begins after fn end */
330 prologue_end = sal.end; /* (probably means no prologue) */
333 prologue_end = prologue_start + 40; /* We're in the boondocks: allow for */
334 /* 16 pushes, an add, and "mv fp,sp" */
336 prologue_end = min (prologue_end, fi->pc);
338 /* Initialize the saved register map. When register H is copied to
339 register L, we will put H in saved_reg[L]. */
340 for (i = 0; i < 16; i++)
343 /* Search the prologue looking for instructions that set up the
344 frame pointer, adjust the stack pointer, and save registers. */
347 for (current_pc = prologue_start; current_pc < prologue_end; current_pc += 2)
353 insn = read_memory_unsigned_integer (current_pc, 2);
355 if ((insn & 0xfe00) == 0xb400) /* push { rlist } */
357 /* Bits 0-7 contain a mask for registers R0-R7. Bit 8 says
358 whether to save LR (R14). */
359 int mask = (insn & 0xff) | ((insn & 0x100) << 6);
361 /* Calculate offsets of saved R0-R7 and LR. */
362 for (regno = LR_REGNUM; regno >= 0; regno--)
363 if (mask & (1 << regno))
366 fi->fsr.regs[saved_reg[regno]] = -(fi->framesize);
367 saved_reg[regno] = regno; /* reset saved register map */
370 else if ((insn & 0xff00) == 0xb000) /* add sp, #simm */
372 offset = (insn & 0x7f) << 2; /* get scaled offset */
373 if (insn & 0x80) /* is it signed? */
375 fi->framesize -= offset;
377 else if ((insn & 0xff00) == 0xaf00) /* add r7, sp, #imm */
379 fi->framereg = THUMB_FP_REGNUM;
380 fi->frameoffset = (insn & 0xff) << 2; /* get scaled offset */
382 else if (insn == 0x466f) /* mov r7, sp */
384 fi->framereg = THUMB_FP_REGNUM;
386 saved_reg[THUMB_FP_REGNUM] = SP_REGNUM;
388 else if ((insn & 0xffc0) == 0x4640) /* mov r0-r7, r8-r15 */
390 int lo_reg = insn & 7; /* dest. register (r0-r7) */
391 int hi_reg = ((insn >> 3) & 7) + 8; /* source register (r8-15) */
392 saved_reg[lo_reg] = hi_reg; /* remember hi reg was saved */
395 break; /* anything else isn't prologue */
399 /* Function: check_prologue_cache
400 Check if prologue for this frame's PC has already been scanned.
401 If it has, copy the relevant information about that prologue and
402 return non-zero. Otherwise do not copy anything and return zero.
404 The information saved in the cache includes:
405 * the frame register number;
406 * the size of the stack frame;
407 * the offsets of saved regs (relative to the old SP); and
408 * the offset from the stack pointer to the frame pointer
410 The cache contains only one entry, since this is adequate
411 for the typical sequence of prologue scan requests we get.
412 When performing a backtrace, GDB will usually ask to scan
413 the same function twice in a row (once to get the frame chain,
414 and once to fill in the extra frame information).
417 static struct frame_info prologue_cache;
420 check_prologue_cache (fi)
421 struct frame_info *fi;
425 if (fi->pc == prologue_cache.pc)
427 fi->framereg = prologue_cache.framereg;
428 fi->framesize = prologue_cache.framesize;
429 fi->frameoffset = prologue_cache.frameoffset;
430 for (i = 0; i <= NUM_REGS; i++)
431 fi->fsr.regs[i] = prologue_cache.fsr.regs[i];
439 /* Function: save_prologue_cache
440 Copy the prologue information from fi to the prologue cache.
444 save_prologue_cache (fi)
445 struct frame_info *fi;
449 prologue_cache.pc = fi->pc;
450 prologue_cache.framereg = fi->framereg;
451 prologue_cache.framesize = fi->framesize;
452 prologue_cache.frameoffset = fi->frameoffset;
454 for (i = 0; i <= NUM_REGS; i++)
455 prologue_cache.fsr.regs[i] = fi->fsr.regs[i];
459 /* Function: arm_scan_prologue
460 This function decodes an ARM function prologue to determine:
461 1) the size of the stack frame
462 2) which registers are saved on it
463 3) the offsets of saved regs
464 4) the offset from the stack pointer to the frame pointer
465 This information is stored in the "extra" fields of the frame_info.
467 A typical Arm function prologue might look like this:
469 stmfd sp!, {fp, ip, lr, pc}
472 Which would create this stack frame (offsets relative to FP):
473 IP -> 4 (caller's stack)
474 FP -> 0 PC (points to address of stmfd instruction + 12 in callee)
475 -4 LR (return address in caller)
476 -8 IP (copy of caller's SP)
478 SP -> -28 Local variables
479 The frame size would thus be 32 bytes, and the frame offset would be
483 arm_scan_prologue (fi)
484 struct frame_info *fi;
486 int regno, sp_offset, fp_offset;
487 CORE_ADDR prologue_start, prologue_end, current_pc;
489 /* Check if this function is already in the cache of frame information. */
490 if (check_prologue_cache (fi))
493 /* Assume there is no frame until proven otherwise. */
494 fi->framereg = SP_REGNUM;
498 /* Check for Thumb prologue. */
499 if (arm_pc_is_thumb (fi->pc))
501 thumb_scan_prologue (fi);
502 save_prologue_cache (fi);
506 /* Find the function prologue. If we can't find the function in
507 the symbol table, peek in the stack frame to find the PC. */
508 if (find_pc_partial_function (fi->pc, NULL, &prologue_start, &prologue_end))
510 /* Assume the prologue is everything between the first instruction
511 in the function and the first source line. */
512 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
514 if (sal.line == 0) /* no line info, use current PC */
515 prologue_end = fi->pc;
516 else if (sal.end < prologue_end) /* next line begins after fn end */
517 prologue_end = sal.end; /* (probably means no prologue) */
521 /* Get address of the stmfd in the prologue of the callee; the saved
522 PC is the address of the stmfd + 12. */
523 prologue_start = ADDR_BITS_REMOVE (read_memory_integer (fi->frame, 4)) - 12;
524 prologue_end = prologue_start + 40; /* FIXME: should be big enough */
527 /* Now search the prologue looking for instructions that set up the
528 frame pointer, adjust the stack pointer, and save registers. */
530 sp_offset = fp_offset = 0;
531 for (current_pc = prologue_start; current_pc < prologue_end; current_pc += 4)
533 unsigned int insn = read_memory_unsigned_integer (current_pc, 4);
535 if ((insn & 0xffff0000) == 0xe92d0000) /* stmfd sp!, {..., r7, lr} */
537 int mask = insn & 0xffff;
539 /* Calculate offsets of saved registers. */
540 for (regno = PC_REGNUM; regno >= 0; regno--)
541 if (mask & (1 << regno))
544 fi->fsr.regs[regno] = sp_offset;
547 else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
549 unsigned imm = insn & 0xff; /* immediate value */
550 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
551 imm = (imm >> rot) | (imm << (32 - rot));
553 fi->framereg = FP_REGNUM;
555 else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
557 unsigned imm = insn & 0xff; /* immediate value */
558 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
559 imm = (imm >> rot) | (imm << (32 - rot));
562 else if ((insn & 0xffff7fff) == 0xed6d0103) /* stfe f?, [sp, -#c]! */
565 regno = F0_REGNUM + ((insn >> 12) & 0x07);
566 fi->fsr.regs[regno] = sp_offset;
568 else if (insn == 0xe1a0c00d) /* mov ip, sp */
571 break; /* not a recognized prologue instruction */
574 /* The frame size is just the negative of the offset (from the original SP)
575 of the last thing thing we pushed on the stack. The frame offset is
576 [new FP] - [new SP]. */
577 fi->framesize = -sp_offset;
578 fi->frameoffset = fp_offset - sp_offset;
580 save_prologue_cache (fi);
584 /* Function: find_callers_reg
585 Find REGNUM on the stack. Otherwise, it's in an active register. One thing
586 we might want to do here is to check REGNUM against the clobber mask, and
587 somehow flag it as invalid if it isn't saved on the stack somewhere. This
588 would provide a graceful failure mode when trying to get the value of
589 caller-saves registers for an inner frame. */
592 arm_find_callers_reg (fi, regnum)
593 struct frame_info *fi;
596 for (; fi; fi = fi->next)
598 #if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
599 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
600 return generic_read_register_dummy (fi->pc, fi->frame, regnum);
603 if (fi->fsr.regs[regnum] != 0)
604 return read_memory_integer (fi->fsr.regs[regnum],
605 REGISTER_RAW_SIZE (regnum));
606 return read_register (regnum);
609 /* Function: frame_chain
610 Given a GDB frame, determine the address of the calling function's frame.
611 This will be used to create a new GDB frame struct, and then
612 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
613 For ARM, we save the frame size when we initialize the frame_info.
615 The original definition of this function was a macro in tm-arm.h:
616 { In the case of the ARM, the frame's nominal address is the FP value,
617 and 12 bytes before comes the saved previous FP value as a 4-byte word. }
619 #define FRAME_CHAIN(thisframe) \
620 ((thisframe)->pc >= LOWEST_PC ? \
621 read_memory_integer ((thisframe)->frame - 12, 4) :\
631 struct frame_info *fi;
633 #if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
634 CORE_ADDR fn_start, callers_pc, fp;
636 /* is this a dummy frame? */
637 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
638 return fi->frame; /* dummy frame same as caller's frame */
640 /* is caller-of-this a dummy frame? */
641 callers_pc = FRAME_SAVED_PC (fi); /* find out who called us: */
642 fp = arm_find_callers_reg (fi, FP_REGNUM);
643 if (PC_IN_CALL_DUMMY (callers_pc, fp, fp))
644 return fp; /* dummy frame's frame may bear no relation to ours */
646 if (find_pc_partial_function (fi->pc, 0, &fn_start, 0))
647 if (fn_start == entry_point_address ())
648 return 0; /* in _start fn, don't chain further */
650 CORE_ADDR caller_pc, fn_start;
651 struct frame_info caller_fi;
652 int framereg = fi->framereg;
654 if (fi->pc < LOWEST_PC)
657 /* If the caller is the startup code, we're at the end of the chain. */
658 caller_pc = FRAME_SAVED_PC (fi);
659 if (find_pc_partial_function (caller_pc, 0, &fn_start, 0))
660 if (fn_start == entry_point_address ())
663 /* If the caller is Thumb and the caller is ARM, or vice versa,
664 the frame register of the caller is different from ours.
665 So we must scan the prologue of the caller to determine its
666 frame register number. */
667 if (arm_pc_is_thumb (caller_pc) != arm_pc_is_thumb (fi->pc))
669 memset (&caller_fi, 0, sizeof (caller_fi));
670 caller_fi.pc = caller_pc;
671 arm_scan_prologue (&caller_fi);
672 framereg = caller_fi.framereg;
675 /* If the caller used a frame register, return its value.
676 Otherwise, return the caller's stack pointer. */
677 if (framereg == FP_REGNUM || framereg == THUMB_FP_REGNUM)
678 return arm_find_callers_reg (fi, framereg);
680 return fi->frame + fi->framesize;
683 /* Function: init_extra_frame_info
684 This function actually figures out the frame address for a given pc and
685 sp. This is tricky because we sometimes don't use an explicit
686 frame pointer, and the previous stack pointer isn't necessarily recorded
687 on the stack. The only reliable way to get this info is to
688 examine the prologue. */
691 arm_init_extra_frame_info (fi)
692 struct frame_info *fi;
697 fi->pc = FRAME_SAVED_PC (fi->next);
699 memset (fi->fsr.regs, '\000', sizeof fi->fsr.regs);
701 #if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
702 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
704 /* We need to setup fi->frame here because run_stack_dummy gets it wrong
705 by assuming it's always FP. */
706 fi->frame = generic_read_register_dummy (fi->pc, fi->frame, SP_REGNUM);
714 arm_scan_prologue (fi);
716 if (!fi->next) /* this is the innermost frame? */
717 fi->frame = read_register (fi->framereg);
719 /* not the innermost frame */
720 /* If we have an FP, the callee saved it. */ if (fi->framereg == FP_REGNUM || fi->framereg == THUMB_FP_REGNUM)
721 if (fi->next->fsr.regs[fi->framereg] != 0)
722 fi->frame = read_memory_integer (fi->next->fsr.regs[fi->framereg],
725 /* Calculate actual addresses of saved registers using offsets determined
726 by arm_scan_prologue. */
727 for (reg = 0; reg < NUM_REGS; reg++)
728 if (fi->fsr.regs[reg] != 0)
729 fi->fsr.regs[reg] += fi->frame + fi->framesize - fi->frameoffset;
734 /* Function: frame_saved_pc
735 Find the caller of this frame. We do this by seeing if LR_REGNUM is saved
736 in the stack anywhere, otherwise we get it from the registers.
738 The old definition of this function was a macro:
739 #define FRAME_SAVED_PC(FRAME) \
740 ADDR_BITS_REMOVE (read_memory_integer ((FRAME)->frame - 4, 4))
744 arm_frame_saved_pc (fi)
745 struct frame_info *fi;
747 #if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
748 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
749 return generic_read_register_dummy (fi->pc, fi->frame, PC_REGNUM);
753 CORE_ADDR pc = arm_find_callers_reg (fi, LR_REGNUM);
754 return IS_THUMB_ADDR (pc) ? UNMAKE_THUMB_ADDR (pc) : pc;
759 /* Return the frame address. On ARM, it is R11; on Thumb it is R7.
760 Examine the Program Status Register to decide which state we're in. */
763 arm_target_read_fp ()
765 if (read_register (PS_REGNUM) & 0x20) /* Bit 5 is Thumb state bit */
766 return read_register (THUMB_FP_REGNUM); /* R7 if Thumb */
768 return read_register (FP_REGNUM); /* R11 if ARM */
772 /* Calculate the frame offsets of the saved registers (ARM version). */
774 arm_frame_find_saved_regs (fi, regaddr)
775 struct frame_info *fi;
776 struct frame_saved_regs *regaddr;
778 memcpy (regaddr, &fi->fsr, sizeof (struct frame_saved_regs));
783 arm_push_dummy_frame ()
785 CORE_ADDR old_sp = read_register (SP_REGNUM);
786 CORE_ADDR sp = old_sp;
787 CORE_ADDR fp, prologue_start;
790 /* Push the two dummy prologue instructions in reverse order,
791 so that they'll be in the correct low-to-high order in memory. */
793 sp = push_word (sp, 0xe24cb004);
794 /* stmdb sp!, {r0-r10, fp, ip, lr, pc} */
795 prologue_start = sp = push_word (sp, 0xe92ddfff);
797 /* push a pointer to the dummy prologue + 12, because when
798 stm instruction stores the PC, it stores the address of the stm
799 instruction itself plus 12. */
800 fp = sp = push_word (sp, prologue_start + 12);
801 sp = push_word (sp, read_register (PC_REGNUM)); /* FIXME: was PS_REGNUM */
802 sp = push_word (sp, old_sp);
803 sp = push_word (sp, read_register (FP_REGNUM));
805 for (regnum = 10; regnum >= 0; regnum--)
806 sp = push_word (sp, read_register (regnum));
808 write_register (FP_REGNUM, fp);
809 write_register (THUMB_FP_REGNUM, fp);
810 write_register (SP_REGNUM, sp);
813 /* Fix up the call dummy, based on whether the processor is currently
814 in Thumb or ARM mode, and whether the target function is Thumb
815 or ARM. There are three different situations requiring three
818 * ARM calling ARM: uses the call dummy in tm-arm.h, which has already
819 been copied into the dummy parameter to this function.
820 * ARM calling Thumb: uses the call dummy in tm-arm.h, but with the
821 "mov pc,r4" instruction patched to be a "bx r4" instead.
822 * Thumb calling anything: uses the Thumb dummy defined below, which
823 works for calling both ARM and Thumb functions.
825 All three call dummies expect to receive the target function address
826 in R4, with the low bit set if it's a Thumb function.
830 arm_fix_call_dummy (dummy, pc, fun, nargs, args, type, gcc_p)
839 static short thumb_dummy[4] =
841 0xf000, 0xf801, /* bl label */
843 0x4720, /* label: bx r4 */
845 static unsigned long arm_bx_r4 = 0xe12fff14; /* bx r4 instruction */
847 /* Set flag indicating whether the current PC is in a Thumb function. */
848 caller_is_thumb = arm_pc_is_thumb (read_pc ());
850 /* If the target function is Thumb, set the low bit of the function address.
851 And if the CPU is currently in ARM mode, patch the second instruction
852 of call dummy to use a BX instruction to switch to Thumb mode. */
853 target_is_thumb = arm_pc_is_thumb (fun);
857 if (!caller_is_thumb)
858 store_unsigned_integer (dummy + 4, sizeof (arm_bx_r4), arm_bx_r4);
861 /* If the CPU is currently in Thumb mode, use the Thumb call dummy
862 instead of the ARM one that's already been copied. This will
863 work for both Thumb and ARM target functions. */
868 int len = sizeof (thumb_dummy) / sizeof (thumb_dummy[0]);
870 for (i = 0; i < len; i++)
872 store_unsigned_integer (p, sizeof (thumb_dummy[0]), thumb_dummy[i]);
873 p += sizeof (thumb_dummy[0]);
877 /* Put the target address in r4; the call dummy will copy this to the PC. */
878 write_register (4, fun);
882 /* Return the offset in the call dummy of the instruction that needs
883 to have a breakpoint placed on it. This is the offset of the 'swi 24'
884 instruction, which is no longer actually used, but simply acts
885 as a place-holder now.
887 This implements the CALL_DUMMY_BREAK_OFFSET macro.
891 arm_call_dummy_breakpoint_offset ()
901 arm_push_arguments (nargs, args, sp, struct_return, struct_addr)
906 CORE_ADDR struct_addr;
918 struct stack_arg *stack_args =
919 (struct stack_arg *) alloca (nargs * sizeof (struct stack_arg));
923 /* Initialize the integer and float register pointers. */
925 float_argreg = F0_REGNUM;
927 /* the struct_return pointer occupies the first parameter-passing reg */
929 write_register (argreg++, struct_addr);
931 /* The offset onto the stack at which we will start copying parameters
932 (after the registers are used up) begins at 16 in the old ABI.
933 This leaves room for the "home" area for register parameters. */
934 stack_offset = REGISTER_SIZE * 4;
936 /* Process args from left to right. Store as many as allowed in
937 registers, save the rest to be pushed on the stack */
938 for (argnum = 0; argnum < nargs; argnum++)
941 value_ptr arg = args[argnum];
942 struct type *arg_type = check_typedef (VALUE_TYPE (arg));
943 struct type *target_type = TYPE_TARGET_TYPE (arg_type);
944 int len = TYPE_LENGTH (arg_type);
945 enum type_code typecode = TYPE_CODE (arg_type);
949 val = (char *) VALUE_CONTENTS (arg);
951 /* If the argument is a pointer to a function, and it's a Thumb
952 function, set the low bit of the pointer. */
953 if (typecode == TYPE_CODE_PTR
954 && target_type != NULL
955 && TYPE_CODE (target_type) == TYPE_CODE_FUNC)
957 regval = extract_address (val, len);
958 if (arm_pc_is_thumb (regval))
959 store_address (val, len, MAKE_THUMB_ADDR (regval));
962 #define MAPCS_FLOAT 0 /* --mapcs-float not implemented by the compiler yet */
964 /* Up to four floating point arguments can be passed in floating
965 point registers on ARM (not on Thumb). */
966 if (typecode == TYPE_CODE_FLT
967 && float_argreg <= ARM_LAST_FP_ARG_REGNUM
970 /* This is a floating point value that fits entirely
971 in a single register. */
972 regval = extract_address (val, len);
973 write_register (float_argreg++, regval);
978 /* Copy the argument to general registers or the stack in
979 register-sized pieces. Large arguments are split between
980 registers and stack. */
983 if (argreg <= ARM_LAST_ARG_REGNUM)
985 int partial_len = len < REGISTER_SIZE ? len : REGISTER_SIZE;
986 regval = extract_address (val, partial_len);
988 /* It's a simple argument being passed in a general
990 write_register (argreg, regval);
997 /* keep for later pushing */
998 stack_args[nstack_args].val = val;
999 stack_args[nstack_args++].len = len;
1005 /* now do the real stack pushing, process args right to left */
1006 while (nstack_args--)
1008 sp -= stack_args[nstack_args].len;
1009 write_memory (sp, stack_args[nstack_args].val,
1010 stack_args[nstack_args].len);
1013 /* Return adjusted stack pointer. */
1020 struct frame_info *frame = get_current_frame ();
1024 old_SP = read_register (frame->framereg);
1025 for (regnum = 0; regnum < NUM_REGS; regnum++)
1026 if (frame->fsr.regs[regnum] != 0)
1027 write_register (regnum,
1028 read_memory_integer (frame->fsr.regs[regnum], 4));
1030 write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
1031 write_register (SP_REGNUM, old_SP);
1033 flush_cached_frames ();
1037 print_fpu_flags (flags)
1040 if (flags & (1 << 0))
1041 fputs ("IVO ", stdout);
1042 if (flags & (1 << 1))
1043 fputs ("DVZ ", stdout);
1044 if (flags & (1 << 2))
1045 fputs ("OFL ", stdout);
1046 if (flags & (1 << 3))
1047 fputs ("UFL ", stdout);
1048 if (flags & (1 << 4))
1049 fputs ("INX ", stdout);
1056 register unsigned long status = read_register (FPS_REGNUM);
1059 type = (status >> 24) & 127;
1060 printf ("%s FPU type %d\n",
1061 (status & (1 << 31)) ? "Hardware" : "Software",
1063 fputs ("mask: ", stdout);
1064 print_fpu_flags (status >> 16);
1065 fputs ("flags: ", stdout);
1066 print_fpu_flags (status);
1073 if (arm_register_names == APCS_register_names)
1075 arm_register_names = additional_register_names;
1076 arm_toggle_regnames ();
1080 arm_register_names = APCS_register_names;
1081 arm_toggle_regnames ();
1086 /* FIXME: Fill in with the 'right thing', see asm
1087 template in arm-convert.s */
1090 convert_from_extended (ptr, dbl)
1094 *dbl = *(double *) ptr;
1098 convert_to_extended (dbl, ptr)
1102 *(double *) ptr = *dbl;
1106 condition_true (cond, status_reg)
1108 unsigned long status_reg;
1110 if (cond == INST_AL || cond == INST_NV)
1116 return ((status_reg & FLAG_Z) != 0);
1118 return ((status_reg & FLAG_Z) == 0);
1120 return ((status_reg & FLAG_C) != 0);
1122 return ((status_reg & FLAG_C) == 0);
1124 return ((status_reg & FLAG_N) != 0);
1126 return ((status_reg & FLAG_N) == 0);
1128 return ((status_reg & FLAG_V) != 0);
1130 return ((status_reg & FLAG_V) == 0);
1132 return ((status_reg & (FLAG_C | FLAG_Z)) == FLAG_C);
1134 return ((status_reg & (FLAG_C | FLAG_Z)) != FLAG_C);
1136 return (((status_reg & FLAG_N) == 0) == ((status_reg & FLAG_V) == 0));
1138 return (((status_reg & FLAG_N) == 0) != ((status_reg & FLAG_V) == 0));
1140 return (((status_reg & FLAG_Z) == 0) &&
1141 (((status_reg & FLAG_N) == 0) == ((status_reg & FLAG_V) == 0)));
1143 return (((status_reg & FLAG_Z) != 0) ||
1144 (((status_reg & FLAG_N) == 0) != ((status_reg & FLAG_V) == 0)));
1149 #define submask(x) ((1L << ((x) + 1)) - 1)
1150 #define bit(obj,st) (((obj) >> (st)) & 1)
1151 #define bits(obj,st,fn) (((obj) >> (st)) & submask ((fn) - (st)))
1152 #define sbits(obj,st,fn) \
1153 ((long) (bits(obj,st,fn) | ((long) bit(obj,fn) * ~ submask (fn - st))))
1154 #define BranchDest(addr,instr) \
1155 ((CORE_ADDR) (((long) (addr)) + 8 + (sbits (instr, 0, 23) << 2)))
1158 static unsigned long
1159 shifted_reg_val (inst, carry, pc_val, status_reg)
1162 unsigned long pc_val;
1163 unsigned long status_reg;
1165 unsigned long res, shift;
1166 int rm = bits (inst, 0, 3);
1167 unsigned long shifttype = bits (inst, 5, 6);
1171 int rs = bits (inst, 8, 11);
1172 shift = (rs == 15 ? pc_val + 8 : read_register (rs)) & 0xFF;
1175 shift = bits (inst, 7, 11);
1178 ? ((pc_val | (ARM_PC_32 ? 0 : status_reg))
1179 + (bit (inst, 4) ? 12 : 8))
1180 : read_register (rm));
1185 res = shift >= 32 ? 0 : res << shift;
1189 res = shift >= 32 ? 0 : res >> shift;
1195 res = ((res & 0x80000000L)
1196 ? ~((~res) >> shift) : res >> shift);
1199 case 3: /* ROR/RRX */
1202 res = (res >> 1) | (carry ? 0x80000000L : 0);
1204 res = (res >> shift) | (res << (32 - shift));
1208 return res & 0xffffffff;
1212 /* Return number of 1-bits in VAL. */
1219 for (nbits = 0; val != 0; nbits++)
1220 val &= val - 1; /* delete rightmost 1-bit in val */
1226 thumb_get_next_pc (pc)
1229 unsigned long pc_val = ((unsigned long) pc) + 4; /* PC after prefetch */
1230 unsigned short inst1 = read_memory_integer (pc, 2);
1231 CORE_ADDR nextpc = pc + 2; /* default is next instruction */
1232 unsigned long offset;
1234 if ((inst1 & 0xff00) == 0xbd00) /* pop {rlist, pc} */
1238 /* Fetch the saved PC from the stack. It's stored above
1239 all of the other registers. */
1240 offset = bitcount (bits (inst1, 0, 7)) * REGISTER_SIZE;
1241 sp = read_register (SP_REGNUM);
1242 nextpc = (CORE_ADDR) read_memory_integer (sp + offset, 4);
1243 nextpc = ADDR_BITS_REMOVE (nextpc);
1245 error ("Infinite loop detected");
1247 else if ((inst1 & 0xf000) == 0xd000) /* conditional branch */
1249 unsigned long status = read_register (PS_REGNUM);
1250 unsigned long cond = bits (inst1, 8, 11);
1251 if (cond != 0x0f && condition_true (cond, status)) /* 0x0f = SWI */
1252 nextpc = pc_val + (sbits (inst1, 0, 7) << 1);
1254 else if ((inst1 & 0xf800) == 0xe000) /* unconditional branch */
1256 nextpc = pc_val + (sbits (inst1, 0, 10) << 1);
1258 else if ((inst1 & 0xf800) == 0xf000) /* long branch with link */
1260 unsigned short inst2 = read_memory_integer (pc + 2, 2);
1261 offset = (sbits (inst1, 0, 10) << 12) + (bits (inst2, 0, 10) << 1);
1262 nextpc = pc_val + offset;
1270 arm_get_next_pc (pc)
1273 unsigned long pc_val;
1274 unsigned long this_instr;
1275 unsigned long status;
1278 if (arm_pc_is_thumb (pc))
1279 return thumb_get_next_pc (pc);
1281 pc_val = (unsigned long) pc;
1282 this_instr = read_memory_integer (pc, 4);
1283 status = read_register (PS_REGNUM);
1284 nextpc = (CORE_ADDR) (pc_val + 4); /* Default case */
1286 if (condition_true (bits (this_instr, 28, 31), status))
1288 switch (bits (this_instr, 24, 27))
1291 case 0x1: /* data processing */
1295 unsigned long operand1, operand2, result = 0;
1299 if (bits (this_instr, 12, 15) != 15)
1302 if (bits (this_instr, 22, 25) == 0
1303 && bits (this_instr, 4, 7) == 9) /* multiply */
1304 error ("Illegal update to pc in instruction");
1306 /* Multiply into PC */
1307 c = (status & FLAG_C) ? 1 : 0;
1308 rn = bits (this_instr, 16, 19);
1309 operand1 = (rn == 15) ? pc_val + 8 : read_register (rn);
1311 if (bit (this_instr, 25))
1313 unsigned long immval = bits (this_instr, 0, 7);
1314 unsigned long rotate = 2 * bits (this_instr, 8, 11);
1315 operand2 = ((immval >> rotate) | (immval << (32 - rotate)))
1318 else /* operand 2 is a shifted register */
1319 operand2 = shifted_reg_val (this_instr, c, pc_val, status);
1321 switch (bits (this_instr, 21, 24))
1324 result = operand1 & operand2;
1328 result = operand1 ^ operand2;
1332 result = operand1 - operand2;
1336 result = operand2 - operand1;
1340 result = operand1 + operand2;
1344 result = operand1 + operand2 + c;
1348 result = operand1 - operand2 + c;
1352 result = operand2 - operand1 + c;
1358 case 0xb: /* tst, teq, cmp, cmn */
1359 result = (unsigned long) nextpc;
1363 result = operand1 | operand2;
1367 /* Always step into a function. */
1372 result = operand1 & ~operand2;
1379 nextpc = (CORE_ADDR) ADDR_BITS_REMOVE (result);
1382 error ("Infinite loop detected");
1387 case 0x5: /* data transfer */
1390 if (bit (this_instr, 20))
1393 if (bits (this_instr, 12, 15) == 15)
1399 if (bit (this_instr, 22))
1400 error ("Illegal update to pc in instruction");
1402 /* byte write to PC */
1403 rn = bits (this_instr, 16, 19);
1404 base = (rn == 15) ? pc_val + 8 : read_register (rn);
1405 if (bit (this_instr, 24))
1408 int c = (status & FLAG_C) ? 1 : 0;
1409 unsigned long offset =
1410 (bit (this_instr, 25)
1411 ? shifted_reg_val (this_instr, c, pc_val)
1412 : bits (this_instr, 0, 11));
1414 if (bit (this_instr, 23))
1419 nextpc = (CORE_ADDR) read_memory_integer ((CORE_ADDR) base,
1422 nextpc = ADDR_BITS_REMOVE (nextpc);
1425 error ("Infinite loop detected");
1431 case 0x9: /* block transfer */
1432 if (bit (this_instr, 20))
1435 if (bit (this_instr, 15))
1440 if (bit (this_instr, 23))
1443 unsigned long reglist = bits (this_instr, 0, 14);
1444 offset = bitcount (reglist) * 4;
1445 if (bit (this_instr, 24)) /* pre */
1448 else if (bit (this_instr, 24))
1452 unsigned long rn_val =
1453 read_register (bits (this_instr, 16, 19));
1455 (CORE_ADDR) read_memory_integer ((CORE_ADDR) (rn_val
1459 nextpc = ADDR_BITS_REMOVE (nextpc);
1461 error ("Infinite loop detected");
1466 case 0xb: /* branch & link */
1467 case 0xa: /* branch */
1469 nextpc = BranchDest (pc, this_instr);
1471 nextpc = ADDR_BITS_REMOVE (nextpc);
1473 error ("Infinite loop detected");
1479 case 0xe: /* coproc ops */
1484 fprintf (stderr, "Bad bit-field extraction\n");
1492 #include "bfd-in2.h"
1493 #include "libcoff.h"
1496 gdb_print_insn_arm (memaddr, info)
1498 disassemble_info *info;
1500 if (arm_pc_is_thumb (memaddr))
1502 static asymbol *asym;
1503 static combined_entry_type ce;
1504 static struct coff_symbol_struct csym;
1505 static struct _bfd fake_bfd;
1506 static bfd_target fake_target;
1508 if (csym.native == NULL)
1510 /* Create a fake symbol vector containing a Thumb symbol. This is
1511 solely so that the code in print_insn_little_arm() and
1512 print_insn_big_arm() in opcodes/arm-dis.c will detect the presence
1513 of a Thumb symbol and switch to decoding Thumb instructions. */
1515 fake_target.flavour = bfd_target_coff_flavour;
1516 fake_bfd.xvec = &fake_target;
1517 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
1519 csym.symbol.the_bfd = &fake_bfd;
1520 csym.symbol.name = "fake";
1521 asym = (asymbol *) & csym;
1524 memaddr = UNMAKE_THUMB_ADDR (memaddr);
1525 info->symbols = &asym;
1528 info->symbols = NULL;
1530 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1531 return print_insn_big_arm (memaddr, info);
1533 return print_insn_little_arm (memaddr, info);
1536 /* Sequence of bytes for breakpoint instruction. */
1537 #define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7} /* Recognized illegal opcodes */
1538 #define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
1539 #define THUMB_LE_BREAKPOINT {0xfe,0xdf}
1540 #define THUMB_BE_BREAKPOINT {0xdf,0xfe}
1542 /* The following has been superseded by BREAKPOINT_FOR_PC, but
1543 is defined merely to keep mem-break.c happy. */
1544 #define LITTLE_BREAKPOINT ARM_LE_BREAKPOINT
1545 #define BIG_BREAKPOINT ARM_BE_BREAKPOINT
1547 /* This function implements the BREAKPOINT_FROM_PC macro. It uses the program
1548 counter value to determine whether a 16- or 32-bit breakpoint should be
1549 used. It returns a pointer to a string of bytes that encode a breakpoint
1550 instruction, stores the length of the string to *lenptr, and adjusts pc
1551 (if necessary) to point to the actual memory location where the
1552 breakpoint should be inserted. */
1555 arm_breakpoint_from_pc (pcptr, lenptr)
1559 if (arm_pc_is_thumb (*pcptr) || arm_pc_is_thumb_dummy (*pcptr))
1561 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1563 static char thumb_breakpoint[] = THUMB_BE_BREAKPOINT;
1564 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
1565 *lenptr = sizeof (thumb_breakpoint);
1566 return thumb_breakpoint;
1570 static char thumb_breakpoint[] = THUMB_LE_BREAKPOINT;
1571 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
1572 *lenptr = sizeof (thumb_breakpoint);
1573 return thumb_breakpoint;
1578 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1580 static char arm_breakpoint[] = ARM_BE_BREAKPOINT;
1581 *lenptr = sizeof (arm_breakpoint);
1582 return arm_breakpoint;
1586 static char arm_breakpoint[] = ARM_LE_BREAKPOINT;
1587 *lenptr = sizeof (arm_breakpoint);
1588 return arm_breakpoint;
1592 /* Return non-zero if the PC is inside a call thunk (aka stub or trampoline).
1593 This implements the IN_SOLIB_CALL_TRAMPOLINE macro. */
1596 arm_in_call_stub (pc, name)
1600 CORE_ADDR start_addr;
1602 /* Find the starting address of the function containing the PC. If the
1603 caller didn't give us a name, look it up at the same time. */
1604 if (find_pc_partial_function (pc, name ? NULL : &name, &start_addr, NULL) == 0)
1607 return strncmp (name, "_call_via_r", 11) == 0;
1611 /* If PC is in a Thumb call or return stub, return the address of the target
1612 PC, which is in a register. The thunk functions are called _called_via_xx,
1613 where x is the register name. The possible names are r0-r9, sl, fp, ip,
1621 CORE_ADDR start_addr;
1623 /* Find the starting address and name of the function containing the PC. */
1624 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
1627 /* Call thunks always start with "_call_via_". */
1628 if (strncmp (name, "_call_via_", 10) == 0)
1630 /* Use the name suffix to determine which register contains
1632 static char *table[15] =
1633 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1634 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
1638 for (regno = 0; regno <= 14; regno++)
1639 if (strcmp (&name[10], table[regno]) == 0)
1640 return read_register (regno);
1642 return 0; /* not a stub */
1647 _initialize_arm_tdep ()
1649 int regname_is_APCS = (arm_register_names == APCS_register_names);
1651 tm_print_insn = gdb_print_insn_arm;
1653 /* Sync the opcode insn printer with our register viewer: */
1655 if (arm_toggle_regnames () != regname_is_APCS)
1656 arm_toggle_regnames ();
1658 add_com ("othernames", class_obscure, arm_othernames,
1659 "Switch to the other set of register names.");
1661 /* ??? Maybe this should be a boolean. */
1662 add_show_from_set (add_set_cmd ("apcs32", no_class,
1663 var_zinteger, (char *) &arm_apcs_32,
1664 "Set usage of ARM 32-bit mode.\n", &setlist),
1669 /* Test whether the coff symbol specific value corresponds to a Thumb function */
1671 coff_sym_is_thumb (int val)
1673 return (val == C_THUMBEXT ||
1674 val == C_THUMBSTAT ||
1675 val == C_THUMBEXTFUNC ||
1676 val == C_THUMBSTATFUNC ||
1677 val == C_THUMBLABEL);