]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/arm-tdep.c
Initial creation of sourceware repository
[thirdparty/binutils-gdb.git] / gdb / arm-tdep.c
1 /* Target-dependent code for the Acorn Risc Machine, for GDB, the GNU Debugger.
2 Copyright (C) 1988, 1989, 1991, 1992, 1993, 1995, 1996, 1998, 1999
3 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 2 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, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21 #include "defs.h"
22 #include "frame.h"
23 #include "inferior.h"
24 #include "gdbcmd.h"
25 #include "gdbcore.h"
26 #include "symfile.h"
27 #include "gdb_string.h"
28 #include "coff/internal.h" /* Internal format of COFF symbols in BFD */
29
30 /*
31 The following macros are actually wrong. Neither arm nor thumb can
32 or should set the lsb on addr.
33 The thumb addresses are mod 2, so (addr & 2) would be a good heuristic
34 to use when checking for thumb (see arm_pc_is_thumb() below).
35 Unfortunately, something else depends on these (incorrect) macros, so
36 fixing them actually breaks gdb. I didn't have time to investigate. Z.R.
37 */
38 /* Thumb function addresses are odd (bit 0 is set). Here are some
39 macros to test, set, or clear bit 0 of addresses. */
40 #define IS_THUMB_ADDR(addr) ((addr) & 1)
41 #define MAKE_THUMB_ADDR(addr) ((addr) | 1)
42 #define UNMAKE_THUMB_ADDR(addr) ((addr) & ~1)
43
44 /* Macros to round N up or down to the next A boundary; A must be
45 a power of two. */
46 #define ROUND_DOWN(n,a) ((n) & ~((a) - 1))
47 #define ROUND_UP(n,a) (((n) + (a) - 1) & ~((a) - 1))
48
49 /* Should call_function allocate stack space for a struct return? */
50 /* The system C compiler uses a similar structure return convention to gcc */
51 int
52 arm_use_struct_convention (gcc_p, type)
53 int gcc_p;
54 struct type *type;
55 {
56 return (TYPE_LENGTH (type) > 4);
57 }
58
59 int
60 arm_frame_chain_valid (chain, thisframe)
61 CORE_ADDR chain;
62 struct frame_info *thisframe;
63 {
64 #define LOWEST_PC 0x20 /* the first 0x20 bytes are the trap vectors. */
65 return (chain != 0 && (FRAME_SAVED_PC (thisframe) >= LOWEST_PC));
66 }
67
68 /* Set to true if the 32-bit mode is in use. */
69
70 int arm_apcs_32 = 1;
71
72 /* Flag set by arm_fix_call_dummy that tells whether the target function
73 is a Thumb function. This flag is checked by arm_push_arguments.
74 FIXME: Change the PUSH_ARGUMENTS macro (and its use in valops.c) to
75 pass the function address as an additional parameter. */
76
77 static int target_is_thumb;
78
79 /* Flag set by arm_fix_call_dummy that tells whether the calling function
80 is a Thumb function. This flag is checked by arm_pc_is_thumb
81 and arm_call_dummy_breakpoint_offset. */
82
83 static int caller_is_thumb;
84
85 /* Tell if the program counter value in MEMADDR is in a Thumb function. */
86
87 int
88 arm_pc_is_thumb (memaddr)
89 bfd_vma memaddr;
90 {
91 struct minimal_symbol * sym;
92 CORE_ADDR sp;
93
94 /* If bit 0 of the address is set, assume this is a Thumb address. */
95 if (IS_THUMB_ADDR (memaddr))
96 return 1;
97
98 /* Thumb function have a "special" bit set in minimal symbols */
99 sym = lookup_minimal_symbol_by_pc (memaddr);
100 if (sym)
101 {
102 return (MSYMBOL_IS_SPECIAL(sym));
103 }
104 else
105 return 0;
106 }
107
108 /* Tell if the program counter value in MEMADDR is in a call dummy that
109 is being called from a Thumb function. */
110
111 int
112 arm_pc_is_thumb_dummy (memaddr)
113 bfd_vma memaddr;
114 {
115 CORE_ADDR sp = read_sp();
116
117 if (PC_IN_CALL_DUMMY (memaddr, sp, sp+64))
118 return caller_is_thumb;
119 else
120 return 0;
121 }
122
123 CORE_ADDR
124 arm_addr_bits_remove (val)
125 CORE_ADDR val;
126 {
127 if (arm_pc_is_thumb (val))
128 return (val & (arm_apcs_32 ? 0xfffffffe : 0x03fffffe));
129 else
130 return (val & (arm_apcs_32 ? 0xfffffffc : 0x03fffffc));
131 }
132
133 CORE_ADDR
134 arm_saved_pc_after_call (frame)
135 struct frame_info *frame;
136 {
137 return ADDR_BITS_REMOVE (read_register (LR_REGNUM));
138 }
139
140 /* A typical Thumb prologue looks like this:
141 push {r7, lr}
142 add sp, sp, #-28
143 add r7, sp, #12
144 Sometimes the latter instruction may be replaced by:
145 mov r7, sp
146 */
147
148 static CORE_ADDR
149 thumb_skip_prologue (pc)
150 CORE_ADDR pc;
151 {
152 CORE_ADDR current_pc;
153
154 for (current_pc = pc; current_pc < pc + 20; current_pc += 2)
155 {
156 unsigned short insn = read_memory_unsigned_integer (current_pc, 2);
157
158 if ( (insn & 0xfe00) != 0xb400 /* push {..., r7, lr} */
159 && (insn & 0xff00) != 0xb000 /* add sp, #simm */
160 && (insn & 0xff00) != 0xaf00 /* add r7, sp, #imm */
161 && insn != 0x466f /* mov r7, sp */
162 && (insn & 0xffc0) != 0x4640) /* mov r0-r7, r8-r15 */
163 break;
164 }
165
166 return current_pc;
167 }
168
169 /* APCS (ARM procedure call standard) defines the following prologue:
170
171 mov ip, sp
172 [stmfd sp!, {a1,a2,a3,a4}]
173 stmfd sp!, {...,fp,ip,lr,pc}
174 [stfe f7, [sp, #-12]!]
175 [stfe f6, [sp, #-12]!]
176 [stfe f5, [sp, #-12]!]
177 [stfe f4, [sp, #-12]!]
178 sub fp, ip, #nn // nn == 20 or 4 depending on second ins
179 */
180
181 CORE_ADDR
182 arm_skip_prologue (pc)
183 CORE_ADDR pc;
184 {
185 unsigned long inst;
186 CORE_ADDR skip_pc;
187 CORE_ADDR func_addr, func_end;
188 struct symtab_and_line sal;
189
190 /* See what the symbol table says. */
191 if (find_pc_partial_function (pc, NULL, & func_addr, & func_end))
192 {
193 sal = find_pc_line (func_addr, 0);
194 if (sal.line != 0 && sal.end < func_end)
195 return sal.end;
196 }
197
198 /* Check if this is Thumb code. */
199 if (arm_pc_is_thumb (pc))
200 return thumb_skip_prologue (pc);
201
202 /* Can't find the prologue end in the symbol table, try it the hard way
203 by disassembling the instructions. */
204 skip_pc = pc;
205 inst = read_memory_integer (skip_pc, 4);
206 if (inst != 0xe1a0c00d) /* mov ip, sp */
207 return pc;
208
209 skip_pc += 4;
210 inst = read_memory_integer (skip_pc, 4);
211 if ((inst & 0xfffffff0) == 0xe92d0000) /* stmfd sp!,{a1,a2,a3,a4} */
212 {
213 skip_pc += 4;
214 inst = read_memory_integer (skip_pc, 4);
215 }
216
217 if ((inst & 0xfffff800) != 0xe92dd800) /* stmfd sp!,{...,fp,ip,lr,pc} */
218 return pc;
219
220 skip_pc += 4;
221 inst = read_memory_integer (skip_pc, 4);
222
223 /* Any insns after this point may float into the code, if it makes
224 for better instruction scheduling, so we skip them only if
225 we find them, but still consdier the function to be frame-ful */
226
227 /* We may have either one sfmfd instruction here, or several stfe insns,
228 depending on the version of floating point code we support. */
229 if ((inst & 0xffbf0fff) == 0xec2d0200) /* sfmfd fn, <cnt>, [sp]! */
230 {
231 skip_pc += 4;
232 inst = read_memory_integer (skip_pc, 4);
233 }
234 else
235 {
236 while ((inst & 0xffff8fff) == 0xed6d0103) /* stfe fn, [sp, #-12]! */
237 {
238 skip_pc += 4;
239 inst = read_memory_integer (skip_pc, 4);
240 }
241 }
242
243 if ((inst & 0xfffff000) == 0xe24cb000) /* sub fp, ip, #nn */
244 skip_pc += 4;
245
246 return skip_pc;
247 }
248
249
250
251 /* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
252 This function decodes a Thumb function prologue to determine:
253 1) the size of the stack frame
254 2) which registers are saved on it
255 3) the offsets of saved regs
256 4) the offset from the stack pointer to the frame pointer
257 This information is stored in the "extra" fields of the frame_info.
258
259 A typical Thumb function prologue might look like this:
260 push {r7, lr}
261 sub sp, #28,
262 add r7, sp, #12
263 Which would create this stack frame (offsets relative to FP)
264 old SP -> 24 stack parameters
265 20 LR
266 16 R7
267 R7 -> 0 local variables (16 bytes)
268 SP -> -12 additional stack space (12 bytes)
269 The frame size would thus be 36 bytes, and the frame offset would be
270 12 bytes. The frame register is R7. */
271
272 static void
273 thumb_scan_prologue (fi)
274 struct frame_info * fi;
275 {
276 CORE_ADDR prologue_start;
277 CORE_ADDR prologue_end;
278 CORE_ADDR current_pc;
279 int saved_reg[16]; /* which register has been copied to register n? */
280 int i;
281
282 if (find_pc_partial_function (fi->pc, NULL, & prologue_start, & prologue_end))
283 {
284 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
285
286 if (sal.line == 0) /* no line info, use current PC */
287 prologue_end = fi->pc;
288 else if (sal.end < prologue_end) /* next line begins after fn end */
289 prologue_end = sal.end; /* (probably means no prologue) */
290 }
291 else
292 prologue_end = prologue_start + 40; /* We're in the boondocks: allow for */
293 /* 16 pushes, an add, and "mv fp,sp" */
294
295 prologue_end = min (prologue_end, fi->pc);
296
297 /* Initialize the saved register map. When register H is copied to
298 register L, we will put H in saved_reg[L]. */
299 for (i = 0; i < 16; i++)
300 saved_reg[i] = i;
301
302 /* Search the prologue looking for instructions that set up the
303 frame pointer, adjust the stack pointer, and save registers. */
304
305 fi->framesize = 0;
306 for (current_pc = prologue_start; current_pc < prologue_end; current_pc += 2)
307 {
308 unsigned short insn;
309 int regno;
310 int offset;
311
312 insn = read_memory_unsigned_integer (current_pc, 2);
313
314 if ((insn & 0xfe00) == 0xb400) /* push { rlist } */
315 {
316 /* Bits 0-7 contain a mask for registers R0-R7. Bit 8 says
317 whether to save LR (R14). */
318 int mask = (insn & 0xff) | ((insn & 0x100) << 6);
319
320 /* Calculate offsets of saved R0-R7 and LR. */
321 for (regno = LR_REGNUM; regno >= 0; regno--)
322 if (mask & (1 << regno))
323 {
324 fi->framesize += 4;
325 fi->fsr.regs[saved_reg[regno]] = -(fi->framesize);
326 saved_reg[regno] = regno; /* reset saved register map */
327 }
328 }
329 else if ((insn & 0xff00) == 0xb000) /* add sp, #simm */
330 {
331 offset = (insn & 0x7f) << 2; /* get scaled offset */
332 if (insn & 0x80) /* is it signed? */
333 offset = -offset;
334 fi->framesize -= offset;
335 }
336 else if ((insn & 0xff00) == 0xaf00) /* add r7, sp, #imm */
337 {
338 fi->framereg = THUMB_FP_REGNUM;
339 fi->frameoffset = (insn & 0xff) << 2; /* get scaled offset */
340 }
341 else if (insn == 0x466f) /* mov r7, sp */
342 {
343 fi->framereg = THUMB_FP_REGNUM;
344 fi->frameoffset = 0;
345 saved_reg[THUMB_FP_REGNUM] = SP_REGNUM;
346 }
347 else if ((insn & 0xffc0) == 0x4640) /* mov r0-r7, r8-r15 */
348 {
349 int lo_reg = insn & 7; /* dest. register (r0-r7) */
350 int hi_reg = ((insn >> 3) & 7) + 8; /* source register (r8-15) */
351 saved_reg[lo_reg] = hi_reg; /* remember hi reg was saved */
352 }
353 else
354 break; /* anything else isn't prologue */
355 }
356 }
357
358 /* Function: check_prologue_cache
359 Check if prologue for this frame's PC has already been scanned.
360 If it has, copy the relevant information about that prologue and
361 return non-zero. Otherwise do not copy anything and return zero.
362
363 The information saved in the cache includes:
364 * the frame register number;
365 * the size of the stack frame;
366 * the offsets of saved regs (relative to the old SP); and
367 * the offset from the stack pointer to the frame pointer
368
369 The cache contains only one entry, since this is adequate
370 for the typical sequence of prologue scan requests we get.
371 When performing a backtrace, GDB will usually ask to scan
372 the same function twice in a row (once to get the frame chain,
373 and once to fill in the extra frame information).
374 */
375
376 static struct frame_info prologue_cache;
377
378 static int
379 check_prologue_cache (fi)
380 struct frame_info * fi;
381 {
382 int i;
383
384 if (fi->pc == prologue_cache.pc)
385 {
386 fi->framereg = prologue_cache.framereg;
387 fi->framesize = prologue_cache.framesize;
388 fi->frameoffset = prologue_cache.frameoffset;
389 for (i = 0; i <= NUM_REGS; i++)
390 fi->fsr.regs[i] = prologue_cache.fsr.regs[i];
391 return 1;
392 }
393 else
394 return 0;
395 }
396
397
398 /* Function: save_prologue_cache
399 Copy the prologue information from fi to the prologue cache.
400 */
401
402 static void
403 save_prologue_cache (fi)
404 struct frame_info * fi;
405 {
406 int i;
407
408 prologue_cache.pc = fi->pc;
409 prologue_cache.framereg = fi->framereg;
410 prologue_cache.framesize = fi->framesize;
411 prologue_cache.frameoffset = fi->frameoffset;
412
413 for (i = 0; i <= NUM_REGS; i++)
414 prologue_cache.fsr.regs[i] = fi->fsr.regs[i];
415 }
416
417
418 /* Function: arm_scan_prologue
419 This function decodes an ARM function prologue to determine:
420 1) the size of the stack frame
421 2) which registers are saved on it
422 3) the offsets of saved regs
423 4) the offset from the stack pointer to the frame pointer
424 This information is stored in the "extra" fields of the frame_info.
425
426 A typical Arm function prologue might look like this:
427 mov ip, sp
428 stmfd sp!, {fp, ip, lr, pc}
429 sub fp, ip, #4
430 sub sp, sp, #16
431 Which would create this stack frame (offsets relative to FP):
432 IP -> 4 (caller's stack)
433 FP -> 0 PC (points to address of stmfd instruction + 12 in callee)
434 -4 LR (return address in caller)
435 -8 IP (copy of caller's SP)
436 -12 FP (caller's FP)
437 SP -> -28 Local variables
438 The frame size would thus be 32 bytes, and the frame offset would be
439 28 bytes. */
440
441 static void
442 arm_scan_prologue (fi)
443 struct frame_info * fi;
444 {
445 int regno, sp_offset, fp_offset;
446 CORE_ADDR prologue_start, prologue_end, current_pc;
447
448 /* Check if this function is already in the cache of frame information. */
449 if (check_prologue_cache (fi))
450 return;
451
452 /* Assume there is no frame until proven otherwise. */
453 fi->framereg = SP_REGNUM;
454 fi->framesize = 0;
455 fi->frameoffset = 0;
456
457 /* Check for Thumb prologue. */
458 if (arm_pc_is_thumb (fi->pc))
459 {
460 thumb_scan_prologue (fi);
461 save_prologue_cache (fi);
462 return;
463 }
464
465 /* Find the function prologue. If we can't find the function in
466 the symbol table, peek in the stack frame to find the PC. */
467 if (find_pc_partial_function (fi->pc, NULL, &prologue_start, &prologue_end))
468 {
469 /* Assume the prologue is everything between the first instruction
470 in the function and the first source line. */
471 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
472
473 if (sal.line == 0) /* no line info, use current PC */
474 prologue_end = fi->pc;
475 else if (sal.end < prologue_end) /* next line begins after fn end */
476 prologue_end = sal.end; /* (probably means no prologue) */
477 }
478 else
479 {
480 /* Get address of the stmfd in the prologue of the callee; the saved
481 PC is the address of the stmfd + 12. */
482 prologue_start = (read_memory_integer (fi->frame, 4) & 0x03fffffc) - 12;
483 prologue_end = prologue_start + 40; /* FIXME: should be big enough */
484 }
485
486 /* Now search the prologue looking for instructions that set up the
487 frame pointer, adjust the stack pointer, and save registers. */
488
489 sp_offset = fp_offset = 0;
490 for (current_pc = prologue_start; current_pc < prologue_end; current_pc += 4)
491 {
492 unsigned int insn = read_memory_unsigned_integer (current_pc, 4);
493
494 if ((insn & 0xffff0000) == 0xe92d0000) /* stmfd sp!, {..., r7, lr} */
495 {
496 int mask = insn & 0xffff;
497
498 /* Calculate offsets of saved registers. */
499 for (regno = PC_REGNUM; regno >= 0; regno--)
500 if (mask & (1 << regno))
501 {
502 sp_offset -= 4;
503 fi->fsr.regs[regno] = sp_offset;
504 }
505 }
506 else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
507 {
508 unsigned imm = insn & 0xff; /* immediate value */
509 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
510 imm = (imm >> rot) | (imm << (32-rot));
511 fp_offset = -imm;
512 fi->framereg = FP_REGNUM;
513 }
514 else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
515 {
516 unsigned imm = insn & 0xff; /* immediate value */
517 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
518 imm = (imm >> rot) | (imm << (32-rot));
519 sp_offset -= imm;
520 }
521 else if ((insn & 0xffff7fff) == 0xed6d0103) /* stfe f?, [sp, -#c]! */
522 {
523 sp_offset -= 12;
524 regno = F0_REGNUM + ((insn >> 12) & 0x07);
525 fi->fsr.regs[regno] = sp_offset;
526 }
527 else if (insn == 0xe1a0c00d) /* mov ip, sp */
528 continue;
529 else
530 break; /* not a recognized prologue instruction */
531 }
532
533 /* The frame size is just the negative of the offset (from the original SP)
534 of the last thing thing we pushed on the stack. The frame offset is
535 [new FP] - [new SP]. */
536 fi->framesize = -sp_offset;
537 fi->frameoffset = fp_offset - sp_offset;
538
539 save_prologue_cache (fi);
540 }
541
542
543 /* Function: find_callers_reg
544 Find REGNUM on the stack. Otherwise, it's in an active register. One thing
545 we might want to do here is to check REGNUM against the clobber mask, and
546 somehow flag it as invalid if it isn't saved on the stack somewhere. This
547 would provide a graceful failure mode when trying to get the value of
548 caller-saves registers for an inner frame. */
549
550 static CORE_ADDR
551 arm_find_callers_reg (fi, regnum)
552 struct frame_info * fi;
553 int regnum;
554 {
555 for (; fi; fi = fi->next)
556
557 #if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
558 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
559 return generic_read_register_dummy (fi->pc, fi->frame, regnum);
560 else
561 #endif
562 if (fi->fsr.regs[regnum] != 0)
563 return read_memory_integer (fi->fsr.regs[regnum],
564 REGISTER_RAW_SIZE(regnum));
565 return read_register (regnum);
566 }
567
568
569 /* Function: frame_chain
570 Given a GDB frame, determine the address of the calling function's frame.
571 This will be used to create a new GDB frame struct, and then
572 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
573 For ARM, we save the frame size when we initialize the frame_info.
574
575 The original definition of this function was a macro in tm-arm.h:
576 { In the case of the ARM, the frame's nominal address is the FP value,
577 and 12 bytes before comes the saved previous FP value as a 4-byte word. }
578
579 #define FRAME_CHAIN(thisframe) \
580 ((thisframe)->pc >= LOWEST_PC ? \
581 read_memory_integer ((thisframe)->frame - 12, 4) :\
582 0)
583 */
584
585 CORE_ADDR
586 arm_frame_chain (fi)
587 struct frame_info * fi;
588 {
589 #if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
590 CORE_ADDR fn_start, callers_pc, fp;
591
592 /* is this a dummy frame? */
593 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
594 return fi->frame; /* dummy frame same as caller's frame */
595
596 /* is caller-of-this a dummy frame? */
597 callers_pc = FRAME_SAVED_PC(fi); /* find out who called us: */
598 fp = arm_find_callers_reg (fi, FP_REGNUM);
599 if (PC_IN_CALL_DUMMY (callers_pc, fp, fp))
600 return fp; /* dummy frame's frame may bear no relation to ours */
601
602 if (find_pc_partial_function (fi->pc, 0, &fn_start, 0))
603 if (fn_start == entry_point_address ())
604 return 0; /* in _start fn, don't chain further */
605 #endif
606 CORE_ADDR caller_pc, fn_start;
607 struct frame_info caller_fi;
608 int framereg = fi->framereg;
609
610 if (fi->pc < LOWEST_PC)
611 return 0;
612
613 /* If the caller is the startup code, we're at the end of the chain. */
614 caller_pc = FRAME_SAVED_PC (fi);
615 if (find_pc_partial_function (caller_pc, 0, &fn_start, 0))
616 if (fn_start == entry_point_address ())
617 return 0;
618
619 /* If the caller is Thumb and the caller is ARM, or vice versa,
620 the frame register of the caller is different from ours.
621 So we must scan the prologue of the caller to determine its
622 frame register number. */
623 if (arm_pc_is_thumb (caller_pc) != arm_pc_is_thumb (fi->pc))
624 {
625 memset (& caller_fi, 0, sizeof (caller_fi));
626 caller_fi.pc = caller_pc;
627 arm_scan_prologue (& caller_fi);
628 framereg = caller_fi.framereg;
629 }
630
631 /* If the caller used a frame register, return its value.
632 Otherwise, return the caller's stack pointer. */
633 if (framereg == FP_REGNUM || framereg == THUMB_FP_REGNUM)
634 return arm_find_callers_reg (fi, framereg);
635 else
636 return fi->frame + fi->framesize;
637 }
638
639 /* Function: init_extra_frame_info
640 This function actually figures out the frame address for a given pc and
641 sp. This is tricky because we sometimes don't use an explicit
642 frame pointer, and the previous stack pointer isn't necessarily recorded
643 on the stack. The only reliable way to get this info is to
644 examine the prologue. */
645
646 void
647 arm_init_extra_frame_info (fi)
648 struct frame_info * fi;
649 {
650 int reg;
651
652 if (fi->next)
653 fi->pc = FRAME_SAVED_PC (fi->next);
654
655 memset (fi->fsr.regs, '\000', sizeof fi->fsr.regs);
656
657 #if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
658 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
659 {
660 /* We need to setup fi->frame here because run_stack_dummy gets it wrong
661 by assuming it's always FP. */
662 fi->frame = generic_read_register_dummy (fi->pc, fi->frame, SP_REGNUM);
663 fi->framesize = 0;
664 fi->frameoffset = 0;
665 return;
666 }
667 else
668 #endif
669 {
670 arm_scan_prologue (fi);
671
672 if (!fi->next) /* this is the innermost frame? */
673 fi->frame = read_register (fi->framereg);
674 else /* not the innermost frame */
675 /* If we have an FP, the callee saved it. */
676 if (fi->framereg == FP_REGNUM || fi->framereg == THUMB_FP_REGNUM)
677 if (fi->next->fsr.regs[fi->framereg] != 0)
678 fi->frame = read_memory_integer (fi->next->fsr.regs[fi->framereg],
679 4);
680
681 /* Calculate actual addresses of saved registers using offsets determined
682 by arm_scan_prologue. */
683 for (reg = 0; reg < NUM_REGS; reg++)
684 if (fi->fsr.regs[reg] != 0)
685 fi->fsr.regs[reg] += fi->frame + fi->framesize - fi->frameoffset;
686 }
687 }
688
689
690 /* Function: frame_saved_pc
691 Find the caller of this frame. We do this by seeing if LR_REGNUM is saved
692 in the stack anywhere, otherwise we get it from the registers.
693
694 The old definition of this function was a macro:
695 #define FRAME_SAVED_PC(FRAME) \
696 ADDR_BITS_REMOVE (read_memory_integer ((FRAME)->frame - 4, 4))
697 */
698
699 CORE_ADDR
700 arm_frame_saved_pc (fi)
701 struct frame_info * fi;
702 {
703 #if 0 /* FIXME: enable this code if we convert to new call dummy scheme. */
704 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
705 return generic_read_register_dummy (fi->pc, fi->frame, PC_REGNUM);
706 else
707 #endif
708 {
709 CORE_ADDR pc = arm_find_callers_reg (fi, LR_REGNUM);
710 return IS_THUMB_ADDR (pc) ? UNMAKE_THUMB_ADDR (pc) : pc;
711 }
712 }
713
714
715 /* Return the frame address. On ARM, it is R11; on Thumb it is R7.
716 Examine the Program Status Register to decide which state we're in. */
717
718 CORE_ADDR
719 arm_target_read_fp ()
720 {
721 if (read_register (PS_REGNUM) & 0x20) /* Bit 5 is Thumb state bit */
722 return read_register (THUMB_FP_REGNUM); /* R7 if Thumb */
723 else
724 return read_register (FP_REGNUM); /* R11 if ARM */
725 }
726
727
728 /* Calculate the frame offsets of the saved registers (ARM version). */
729 void
730 arm_frame_find_saved_regs (fi, regaddr)
731 struct frame_info *fi;
732 struct frame_saved_regs *regaddr;
733 {
734 memcpy (regaddr, &fi->fsr, sizeof (struct frame_saved_regs));
735 }
736
737
738 void
739 arm_push_dummy_frame ()
740 {
741 CORE_ADDR old_sp = read_register (SP_REGNUM);
742 CORE_ADDR sp = old_sp;
743 CORE_ADDR fp, prologue_start;
744 int regnum;
745
746 /* Push the two dummy prologue instructions in reverse order,
747 so that they'll be in the correct low-to-high order in memory. */
748 /* sub fp, ip, #4 */
749 sp = push_word (sp, 0xe24cb004);
750 /* stmdb sp!, {r0-r10, fp, ip, lr, pc} */
751 prologue_start = sp = push_word (sp, 0xe92ddfff);
752
753 /* push a pointer to the dummy prologue + 12, because when
754 stm instruction stores the PC, it stores the address of the stm
755 instruction itself plus 12. */
756 fp = sp = push_word (sp, prologue_start + 12);
757 sp = push_word (sp, read_register (PC_REGNUM)); /* FIXME: was PS_REGNUM */
758 sp = push_word (sp, old_sp);
759 sp = push_word (sp, read_register (FP_REGNUM));
760
761 for (regnum = 10; regnum >= 0; regnum --)
762 sp = push_word (sp, read_register (regnum));
763
764 write_register (FP_REGNUM, fp);
765 write_register (THUMB_FP_REGNUM, fp);
766 write_register (SP_REGNUM, sp);
767 }
768
769 /* Fix up the call dummy, based on whether the processor is currently
770 in Thumb or ARM mode, and whether the target function is Thumb
771 or ARM. There are three different situations requiring three
772 different dummies:
773
774 * ARM calling ARM: uses the call dummy in tm-arm.h, which has already
775 been copied into the dummy parameter to this function.
776 * ARM calling Thumb: uses the call dummy in tm-arm.h, but with the
777 "mov pc,r4" instruction patched to be a "bx r4" instead.
778 * Thumb calling anything: uses the Thumb dummy defined below, which
779 works for calling both ARM and Thumb functions.
780
781 All three call dummies expect to receive the target function address
782 in R4, with the low bit set if it's a Thumb function.
783 */
784
785 void
786 arm_fix_call_dummy (dummy, pc, fun, nargs, args, type, gcc_p)
787 char * dummy;
788 CORE_ADDR pc;
789 CORE_ADDR fun;
790 int nargs;
791 value_ptr * args;
792 struct type * type;
793 int gcc_p;
794 {
795 static short thumb_dummy[4] =
796 {
797 0xf000, 0xf801, /* bl label */
798 0xdf18, /* swi 24 */
799 0x4720, /* label: bx r4 */
800 };
801 static unsigned long arm_bx_r4 = 0xe12fff14; /* bx r4 instruction */
802
803 /* Set flag indicating whether the current PC is in a Thumb function. */
804 caller_is_thumb = arm_pc_is_thumb (read_pc());
805
806 /* If the target function is Thumb, set the low bit of the function address.
807 And if the CPU is currently in ARM mode, patch the second instruction
808 of call dummy to use a BX instruction to switch to Thumb mode. */
809 target_is_thumb = arm_pc_is_thumb (fun);
810 if (target_is_thumb)
811 {
812 fun |= 1;
813 if (!caller_is_thumb)
814 store_unsigned_integer (dummy + 4, sizeof (arm_bx_r4), arm_bx_r4);
815 }
816
817 /* If the CPU is currently in Thumb mode, use the Thumb call dummy
818 instead of the ARM one that's already been copied. This will
819 work for both Thumb and ARM target functions. */
820 if (caller_is_thumb)
821 {
822 int i;
823 char *p = dummy;
824 int len = sizeof (thumb_dummy) / sizeof (thumb_dummy[0]);
825
826 for (i = 0; i < len; i++)
827 {
828 store_unsigned_integer (p, sizeof (thumb_dummy[0]), thumb_dummy[i]);
829 p += sizeof (thumb_dummy[0]);
830 }
831 }
832
833 /* Put the target address in r4; the call dummy will copy this to the PC. */
834 write_register (4, fun);
835 }
836
837
838 /* Return the offset in the call dummy of the instruction that needs
839 to have a breakpoint placed on it. This is the offset of the 'swi 24'
840 instruction, which is no longer actually used, but simply acts
841 as a place-holder now.
842
843 This implements the CALL_DUMMY_BREAK_OFFSET macro.
844 */
845
846 int
847 arm_call_dummy_breakpoint_offset ()
848 {
849 if (caller_is_thumb)
850 return 4;
851 else
852 return 8;
853 }
854
855
856 CORE_ADDR
857 arm_push_arguments(nargs, args, sp, struct_return, struct_addr)
858 int nargs;
859 value_ptr * args;
860 CORE_ADDR sp;
861 int struct_return;
862 CORE_ADDR struct_addr;
863 {
864 int argreg;
865 int float_argreg;
866 int argnum;
867 int stack_offset;
868 struct stack_arg {
869 char *val;
870 int len;
871 int offset;
872 };
873 struct stack_arg *stack_args =
874 (struct stack_arg*)alloca (nargs * sizeof (struct stack_arg));
875 int nstack_args = 0;
876
877
878 /* Initialize the integer and float register pointers. */
879 argreg = A1_REGNUM;
880 float_argreg = F0_REGNUM;
881
882 /* the struct_return pointer occupies the first parameter-passing reg */
883 if (struct_return)
884 write_register (argreg++, struct_addr);
885
886 /* The offset onto the stack at which we will start copying parameters
887 (after the registers are used up) begins at 16 in the old ABI.
888 This leaves room for the "home" area for register parameters. */
889 stack_offset = REGISTER_SIZE * 4;
890
891 /* Process args from left to right. Store as many as allowed in
892 registers, save the rest to be pushed on the stack */
893 for(argnum = 0; argnum < nargs; argnum++)
894 {
895 char * val;
896 value_ptr arg = args[argnum];
897 struct type * arg_type = check_typedef (VALUE_TYPE (arg));
898 struct type * target_type = TYPE_TARGET_TYPE (arg_type);
899 int len = TYPE_LENGTH (arg_type);
900 enum type_code typecode = TYPE_CODE (arg_type);
901 CORE_ADDR regval;
902 int newarg;
903
904 val = (char *) VALUE_CONTENTS (arg);
905
906 /* If the argument is a pointer to a function, and it's a Thumb
907 function, set the low bit of the pointer. */
908 if (typecode == TYPE_CODE_PTR
909 && target_type != NULL
910 && TYPE_CODE (target_type) == TYPE_CODE_FUNC)
911 {
912 regval = extract_address (val, len);
913 if (arm_pc_is_thumb (regval))
914 store_address (val, len, MAKE_THUMB_ADDR (regval));
915 }
916
917 #define MAPCS_FLOAT 0 /* --mapcs-float not implemented by the compiler yet */
918 #if MAPCS_FLOAT
919 /* Up to four floating point arguments can be passed in floating
920 point registers on ARM (not on Thumb). */
921 if (typecode == TYPE_CODE_FLT
922 && float_argreg <= ARM_LAST_FP_ARG_REGNUM
923 && !target_is_thumb)
924 {
925 /* This is a floating point value that fits entirely
926 in a single register. */
927 regval = extract_address (val, len);
928 write_register (float_argreg++, regval);
929 }
930 else
931 #endif
932 {
933 /* Copy the argument to general registers or the stack in
934 register-sized pieces. Large arguments are split between
935 registers and stack. */
936 while (len > 0)
937 {
938 if (argreg <= ARM_LAST_ARG_REGNUM)
939 {
940 int partial_len = len < REGISTER_SIZE ? len : REGISTER_SIZE;
941 regval = extract_address (val, partial_len);
942
943 /* It's a simple argument being passed in a general
944 register. */
945 write_register (argreg, regval);
946 argreg++;
947 len -= partial_len;
948 val += partial_len;
949 }
950 else
951 {
952 /* keep for later pushing */
953 stack_args[nstack_args].val = val;
954 stack_args[nstack_args++].len = len;
955 break;
956 }
957 }
958 }
959 }
960 /* now do the real stack pushing, process args right to left */
961 while(nstack_args--)
962 {
963 sp -= stack_args[nstack_args].len;
964 write_memory(sp, stack_args[nstack_args].val,
965 stack_args[nstack_args].len);
966 }
967
968 /* Return adjusted stack pointer. */
969 return sp;
970 }
971
972 void
973 arm_pop_frame ()
974 {
975 struct frame_info *frame = get_current_frame();
976 int regnum;
977
978 for (regnum = 0; regnum < NUM_REGS; regnum++)
979 if (frame->fsr.regs[regnum] != 0)
980 write_register (regnum,
981 read_memory_integer (frame->fsr.regs[regnum], 4));
982
983 write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
984 write_register (SP_REGNUM, read_register (frame->framereg));
985
986 flush_cached_frames ();
987 }
988
989 static void
990 print_fpu_flags (flags)
991 int flags;
992 {
993 if (flags & (1 << 0)) fputs ("IVO ", stdout);
994 if (flags & (1 << 1)) fputs ("DVZ ", stdout);
995 if (flags & (1 << 2)) fputs ("OFL ", stdout);
996 if (flags & (1 << 3)) fputs ("UFL ", stdout);
997 if (flags & (1 << 4)) fputs ("INX ", stdout);
998 putchar ('\n');
999 }
1000
1001 void
1002 arm_float_info ()
1003 {
1004 register unsigned long status = read_register (FPS_REGNUM);
1005 int type;
1006
1007 type = (status >> 24) & 127;
1008 printf ("%s FPU type %d\n",
1009 (status & (1<<31)) ? "Hardware" : "Software",
1010 type);
1011 fputs ("mask: ", stdout);
1012 print_fpu_flags (status >> 16);
1013 fputs ("flags: ", stdout);
1014 print_fpu_flags (status);
1015 }
1016
1017 static char *original_register_names[] =
1018 { "a1", "a2", "a3", "a4", /* 0 1 2 3 */
1019 "v1", "v2", "v3", "v4", /* 4 5 6 7 */
1020 "v5", "v6", "sl", "fp", /* 8 9 10 11 */
1021 "ip", "sp", "lr", "pc", /* 12 13 14 15 */
1022 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
1023 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
1024 "fps","ps" } /* 24 25 */;
1025
1026 /* These names are the ones which gcc emits, and
1027 I find them less confusing. Toggle between them
1028 using the `othernames' command. */
1029 static char *additional_register_names[] =
1030 { "r0", "r1", "r2", "r3", /* 0 1 2 3 */
1031 "r4", "r5", "r6", "r7", /* 4 5 6 7 */
1032 "r8", "r9", "sl", "fp", /* 8 9 10 11 */
1033 "ip", "sp", "lr", "pc", /* 12 13 14 15 */
1034 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
1035 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
1036 "fps","ps" } /* 24 25 */;
1037
1038 char **arm_register_names = original_register_names;
1039
1040
1041 static void
1042 arm_othernames ()
1043 {
1044 static int toggle;
1045 arm_register_names = (toggle
1046 ? additional_register_names
1047 : original_register_names);
1048 toggle = !toggle;
1049 }
1050
1051 /* FIXME: Fill in with the 'right thing', see asm
1052 template in arm-convert.s */
1053
1054 void
1055 convert_from_extended (ptr, dbl)
1056 void * ptr;
1057 double * dbl;
1058 {
1059 *dbl = *(double*)ptr;
1060 }
1061
1062 void
1063 convert_to_extended (dbl, ptr)
1064 void * ptr;
1065 double * dbl;
1066 {
1067 *(double*)ptr = *dbl;
1068 }
1069
1070 static int
1071 condition_true (cond, status_reg)
1072 unsigned long cond;
1073 unsigned long status_reg;
1074 {
1075 if (cond == INST_AL || cond == INST_NV)
1076 return 1;
1077
1078 switch (cond)
1079 {
1080 case INST_EQ:
1081 return ((status_reg & FLAG_Z) != 0);
1082 case INST_NE:
1083 return ((status_reg & FLAG_Z) == 0);
1084 case INST_CS:
1085 return ((status_reg & FLAG_C) != 0);
1086 case INST_CC:
1087 return ((status_reg & FLAG_C) == 0);
1088 case INST_MI:
1089 return ((status_reg & FLAG_N) != 0);
1090 case INST_PL:
1091 return ((status_reg & FLAG_N) == 0);
1092 case INST_VS:
1093 return ((status_reg & FLAG_V) != 0);
1094 case INST_VC:
1095 return ((status_reg & FLAG_V) == 0);
1096 case INST_HI:
1097 return ((status_reg & (FLAG_C | FLAG_Z)) == FLAG_C);
1098 case INST_LS:
1099 return ((status_reg & (FLAG_C | FLAG_Z)) != FLAG_C);
1100 case INST_GE:
1101 return (((status_reg & FLAG_N) == 0) == ((status_reg & FLAG_V) == 0));
1102 case INST_LT:
1103 return (((status_reg & FLAG_N) == 0) != ((status_reg & FLAG_V) == 0));
1104 case INST_GT:
1105 return (((status_reg & FLAG_Z) == 0) &&
1106 (((status_reg & FLAG_N) == 0) == ((status_reg & FLAG_V) == 0)));
1107 case INST_LE:
1108 return (((status_reg & FLAG_Z) != 0) ||
1109 (((status_reg & FLAG_N) == 0) != ((status_reg & FLAG_V) == 0)));
1110 }
1111 return 1;
1112 }
1113
1114 #define submask(x) ((1L << ((x) + 1)) - 1)
1115 #define bit(obj,st) (((obj) >> (st)) & 1)
1116 #define bits(obj,st,fn) (((obj) >> (st)) & submask ((fn) - (st)))
1117 #define sbits(obj,st,fn) \
1118 ((long) (bits(obj,st,fn) | ((long) bit(obj,fn) * ~ submask (fn - st))))
1119 #define BranchDest(addr,instr) \
1120 ((CORE_ADDR) (((long) (addr)) + 8 + (sbits (instr, 0, 23) << 2)))
1121 #define ARM_PC_32 1
1122
1123 static unsigned long
1124 shifted_reg_val (inst, carry, pc_val, status_reg)
1125 unsigned long inst;
1126 int carry;
1127 unsigned long pc_val;
1128 unsigned long status_reg;
1129 {
1130 unsigned long res, shift;
1131 int rm = bits (inst, 0, 3);
1132 unsigned long shifttype = bits (inst, 5, 6);
1133
1134 if (bit(inst, 4))
1135 {
1136 int rs = bits (inst, 8, 11);
1137 shift = (rs == 15 ? pc_val + 8 : read_register (rs)) & 0xFF;
1138 }
1139 else
1140 shift = bits (inst, 7, 11);
1141
1142 res = (rm == 15
1143 ? ((pc_val | (ARM_PC_32 ? 0 : status_reg))
1144 + (bit (inst, 4) ? 12 : 8))
1145 : read_register (rm));
1146
1147 switch (shifttype)
1148 {
1149 case 0: /* LSL */
1150 res = shift >= 32 ? 0 : res << shift;
1151 break;
1152
1153 case 1: /* LSR */
1154 res = shift >= 32 ? 0 : res >> shift;
1155 break;
1156
1157 case 2: /* ASR */
1158 if (shift >= 32) shift = 31;
1159 res = ((res & 0x80000000L)
1160 ? ~((~res) >> shift) : res >> shift);
1161 break;
1162
1163 case 3: /* ROR/RRX */
1164 shift &= 31;
1165 if (shift == 0)
1166 res = (res >> 1) | (carry ? 0x80000000L : 0);
1167 else
1168 res = (res >> shift) | (res << (32-shift));
1169 break;
1170 }
1171
1172 return res & 0xffffffff;
1173 }
1174
1175
1176 /* Return number of 1-bits in VAL. */
1177
1178 static int
1179 bitcount (val)
1180 unsigned long val;
1181 {
1182 int nbits;
1183 for (nbits = 0; val != 0; nbits++)
1184 val &= val - 1; /* delete rightmost 1-bit in val */
1185 return nbits;
1186 }
1187
1188
1189 static CORE_ADDR
1190 thumb_get_next_pc (pc)
1191 CORE_ADDR pc;
1192 {
1193 unsigned long pc_val = ((unsigned long)pc) + 4; /* PC after prefetch */
1194 unsigned short inst1 = read_memory_integer (pc, 2);
1195 CORE_ADDR nextpc = pc + 2; /* default is next instruction */
1196 unsigned long offset;
1197
1198 if ((inst1 & 0xff00) == 0xbd00) /* pop {rlist, pc} */
1199 {
1200 CORE_ADDR sp;
1201
1202 /* Fetch the saved PC from the stack. It's stored above
1203 all of the other registers. */
1204 offset = bitcount (bits (inst1, 0, 7)) * REGISTER_SIZE;
1205 sp = read_register (SP_REGNUM);
1206 nextpc = (CORE_ADDR) read_memory_integer (sp + offset, 4);
1207 nextpc = ADDR_BITS_REMOVE (nextpc);
1208 if (nextpc == pc)
1209 error ("Infinite loop detected");
1210 }
1211 else if ((inst1 & 0xf000) == 0xd000) /* conditional branch */
1212 {
1213 unsigned long status = read_register (PS_REGNUM);
1214 unsigned long cond = bits (inst1, 8, 11);
1215 if (cond != 0x0f && condition_true (cond, status)) /* 0x0f = SWI */
1216 nextpc = pc_val + (sbits (inst1, 0, 7) << 1);
1217 }
1218 else if ((inst1 & 0xf800) == 0xe000) /* unconditional branch */
1219 {
1220 nextpc = pc_val + (sbits (inst1, 0, 10) << 1);
1221 }
1222 else if ((inst1 & 0xf800) == 0xf000) /* long branch with link */
1223 {
1224 unsigned short inst2 = read_memory_integer (pc + 2, 2);
1225 offset = (sbits (inst1, 0, 10) << 12) + (bits (inst2, 0, 10) << 1);
1226 nextpc = pc_val + offset;
1227 }
1228
1229 return nextpc;
1230 }
1231
1232
1233 CORE_ADDR
1234 arm_get_next_pc (pc)
1235 CORE_ADDR pc;
1236 {
1237 unsigned long pc_val;
1238 unsigned long this_instr;
1239 unsigned long status;
1240 CORE_ADDR nextpc;
1241
1242 if (arm_pc_is_thumb (pc))
1243 return thumb_get_next_pc (pc);
1244
1245 pc_val = (unsigned long) pc;
1246 this_instr = read_memory_integer (pc, 4);
1247 status = read_register (PS_REGNUM);
1248 nextpc = (CORE_ADDR) (pc_val + 4); /* Default case */
1249
1250 if (condition_true (bits (this_instr, 28, 31), status))
1251 {
1252 switch (bits (this_instr, 24, 27))
1253 {
1254 case 0x0: case 0x1: /* data processing */
1255 case 0x2: case 0x3:
1256 {
1257 unsigned long operand1, operand2, result = 0;
1258 unsigned long rn;
1259 int c;
1260
1261 if (bits (this_instr, 12, 15) != 15)
1262 break;
1263
1264 if (bits (this_instr, 22, 25) == 0
1265 && bits (this_instr, 4, 7) == 9) /* multiply */
1266 error ("Illegal update to pc in instruction");
1267
1268 /* Multiply into PC */
1269 c = (status & FLAG_C) ? 1 : 0;
1270 rn = bits (this_instr, 16, 19);
1271 operand1 = (rn == 15) ? pc_val + 8 : read_register (rn);
1272
1273 if (bit (this_instr, 25))
1274 {
1275 unsigned long immval = bits (this_instr, 0, 7);
1276 unsigned long rotate = 2 * bits (this_instr, 8, 11);
1277 operand2 = ((immval >> rotate) | (immval << (32-rotate)))
1278 & 0xffffffff;
1279 }
1280 else /* operand 2 is a shifted register */
1281 operand2 = shifted_reg_val (this_instr, c, pc_val, status);
1282
1283 switch (bits (this_instr, 21, 24))
1284 {
1285 case 0x0: /*and*/
1286 result = operand1 & operand2;
1287 break;
1288
1289 case 0x1: /*eor*/
1290 result = operand1 ^ operand2;
1291 break;
1292
1293 case 0x2: /*sub*/
1294 result = operand1 - operand2;
1295 break;
1296
1297 case 0x3: /*rsb*/
1298 result = operand2 - operand1;
1299 break;
1300
1301 case 0x4: /*add*/
1302 result = operand1 + operand2;
1303 break;
1304
1305 case 0x5: /*adc*/
1306 result = operand1 + operand2 + c;
1307 break;
1308
1309 case 0x6: /*sbc*/
1310 result = operand1 - operand2 + c;
1311 break;
1312
1313 case 0x7: /*rsc*/
1314 result = operand2 - operand1 + c;
1315 break;
1316
1317 case 0x8: case 0x9: case 0xa: case 0xb: /* tst, teq, cmp, cmn */
1318 result = (unsigned long) nextpc;
1319 break;
1320
1321 case 0xc: /*orr*/
1322 result = operand1 | operand2;
1323 break;
1324
1325 case 0xd: /*mov*/
1326 /* Always step into a function. */
1327 result = operand2;
1328 break;
1329
1330 case 0xe: /*bic*/
1331 result = operand1 & ~operand2;
1332 break;
1333
1334 case 0xf: /*mvn*/
1335 result = ~operand2;
1336 break;
1337 }
1338 nextpc = (CORE_ADDR) ADDR_BITS_REMOVE (result);
1339
1340 if (nextpc == pc)
1341 error ("Infinite loop detected");
1342 break;
1343 }
1344
1345 case 0x4: case 0x5: /* data transfer */
1346 case 0x6: case 0x7:
1347 if (bit (this_instr, 20))
1348 {
1349 /* load */
1350 if (bits (this_instr, 12, 15) == 15)
1351 {
1352 /* rd == pc */
1353 unsigned long rn;
1354 unsigned long base;
1355
1356 if (bit (this_instr, 22))
1357 error ("Illegal update to pc in instruction");
1358
1359 /* byte write to PC */
1360 rn = bits (this_instr, 16, 19);
1361 base = (rn == 15) ? pc_val + 8 : read_register (rn);
1362 if (bit (this_instr, 24))
1363 {
1364 /* pre-indexed */
1365 int c = (status & FLAG_C) ? 1 : 0;
1366 unsigned long offset =
1367 (bit (this_instr, 25)
1368 ? shifted_reg_val (this_instr, c, pc_val)
1369 : bits (this_instr, 0, 11));
1370
1371 if (bit (this_instr, 23))
1372 base += offset;
1373 else
1374 base -= offset;
1375 }
1376 nextpc = (CORE_ADDR) read_memory_integer ((CORE_ADDR) base,
1377 4);
1378
1379 nextpc = ADDR_BITS_REMOVE (nextpc);
1380
1381 if (nextpc == pc)
1382 error ("Infinite loop detected");
1383 }
1384 }
1385 break;
1386
1387 case 0x8: case 0x9: /* block transfer */
1388 if (bit (this_instr, 20))
1389 {
1390 /* LDM */
1391 if (bit (this_instr, 15))
1392 {
1393 /* loading pc */
1394 int offset = 0;
1395
1396 if (bit (this_instr, 23))
1397 {
1398 /* up */
1399 unsigned long reglist = bits (this_instr, 0, 14);
1400 offset = bitcount (reglist) * 4;
1401 if (bit (this_instr, 24)) /* pre */
1402 offset += 4;
1403 }
1404 else if (bit (this_instr, 24))
1405 offset = -4;
1406
1407 {
1408 unsigned long rn_val =
1409 read_register (bits (this_instr, 16, 19));
1410 nextpc =
1411 (CORE_ADDR) read_memory_integer ((CORE_ADDR) (rn_val
1412 + offset),
1413 4);
1414 }
1415 nextpc = ADDR_BITS_REMOVE (nextpc);
1416 if (nextpc == pc)
1417 error ("Infinite loop detected");
1418 }
1419 }
1420 break;
1421
1422 case 0xb: /* branch & link */
1423 case 0xa: /* branch */
1424 {
1425 nextpc = BranchDest (pc, this_instr);
1426
1427 nextpc = ADDR_BITS_REMOVE (nextpc);
1428 if (nextpc == pc)
1429 error ("Infinite loop detected");
1430 break;
1431 }
1432
1433 case 0xc: case 0xd:
1434 case 0xe: /* coproc ops */
1435 case 0xf: /* SWI */
1436 break;
1437
1438 default:
1439 fprintf (stderr, "Bad bit-field extraction\n");
1440 return (pc);
1441 }
1442 }
1443
1444 return nextpc;
1445 }
1446
1447 #include "bfd-in2.h"
1448 #include "libcoff.h"
1449
1450 static int
1451 gdb_print_insn_arm (memaddr, info)
1452 bfd_vma memaddr;
1453 disassemble_info * info;
1454 {
1455 if (arm_pc_is_thumb (memaddr))
1456 {
1457 static asymbol * asym;
1458 static combined_entry_type ce;
1459 static struct coff_symbol_struct csym;
1460 static struct _bfd fake_bfd;
1461 static bfd_target fake_target;
1462
1463 if (csym.native == NULL)
1464 {
1465 /* Create a fake symbol vector containing a Thumb symbol. This is
1466 solely so that the code in print_insn_little_arm() and
1467 print_insn_big_arm() in opcodes/arm-dis.c will detect the presence
1468 of a Thumb symbol and switch to decoding Thumb instructions. */
1469
1470 fake_target.flavour = bfd_target_coff_flavour;
1471 fake_bfd.xvec = & fake_target;
1472 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
1473 csym.native = & ce;
1474 csym.symbol.the_bfd = & fake_bfd;
1475 csym.symbol.name = "fake";
1476 asym = (asymbol *) & csym;
1477 }
1478
1479 memaddr = UNMAKE_THUMB_ADDR (memaddr);
1480 info->symbols = & asym;
1481 }
1482 else
1483 info->symbols = NULL;
1484
1485 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1486 return print_insn_big_arm (memaddr, info);
1487 else
1488 return print_insn_little_arm (memaddr, info);
1489 }
1490
1491 /* Sequence of bytes for breakpoint instruction. */
1492 #define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7} /* Recognized illegal opcodes */
1493 #define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
1494 #define THUMB_LE_BREAKPOINT {0xfe,0xdf}
1495 #define THUMB_BE_BREAKPOINT {0xdf,0xfe}
1496
1497 /* The following has been superseded by BREAKPOINT_FOR_PC, but
1498 is defined merely to keep mem-break.c happy. */
1499 #define LITTLE_BREAKPOINT ARM_LE_BREAKPOINT
1500 #define BIG_BREAKPOINT ARM_BE_BREAKPOINT
1501
1502 /* This function implements the BREAKPOINT_FROM_PC macro. It uses the program
1503 counter value to determine whether a 16- or 32-bit breakpoint should be
1504 used. It returns a pointer to a string of bytes that encode a breakpoint
1505 instruction, stores the length of the string to *lenptr, and adjusts pc
1506 (if necessary) to point to the actual memory location where the
1507 breakpoint should be inserted. */
1508
1509 unsigned char *
1510 arm_breakpoint_from_pc (pcptr, lenptr)
1511 CORE_ADDR * pcptr;
1512 int * lenptr;
1513 {
1514 if (arm_pc_is_thumb (*pcptr) || arm_pc_is_thumb_dummy (*pcptr))
1515 {
1516 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1517 {
1518 static char thumb_breakpoint[] = THUMB_BE_BREAKPOINT;
1519 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
1520 *lenptr = sizeof (thumb_breakpoint);
1521 return thumb_breakpoint;
1522 }
1523 else
1524 {
1525 static char thumb_breakpoint[] = THUMB_LE_BREAKPOINT;
1526 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
1527 *lenptr = sizeof (thumb_breakpoint);
1528 return thumb_breakpoint;
1529 }
1530 }
1531 else
1532 {
1533 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1534 {
1535 static char arm_breakpoint[] = ARM_BE_BREAKPOINT;
1536 *lenptr = sizeof (arm_breakpoint);
1537 return arm_breakpoint;
1538 }
1539 else
1540 {
1541 static char arm_breakpoint[] = ARM_LE_BREAKPOINT;
1542 *lenptr = sizeof (arm_breakpoint);
1543 return arm_breakpoint;
1544 }
1545 }
1546 }
1547 /* Return non-zero if the PC is inside a call thunk (aka stub or trampoline).
1548 This implements the IN_SOLIB_CALL_TRAMPOLINE macro. */
1549
1550 int
1551 arm_in_call_stub (pc, name)
1552 CORE_ADDR pc;
1553 char * name;
1554 {
1555 CORE_ADDR start_addr;
1556
1557 /* Find the starting address of the function containing the PC. If the
1558 caller didn't give us a name, look it up at the same time. */
1559 if (find_pc_partial_function (pc, name ? NULL : &name, &start_addr, NULL) == 0)
1560 return 0;
1561
1562 return strncmp (name, "_call_via_r", 11) == 0;
1563 }
1564
1565
1566 /* If PC is in a Thumb call or return stub, return the address of the target
1567 PC, which is in a register. The thunk functions are called _called_via_xx,
1568 where x is the register name. The possible names are r0-r9, sl, fp, ip,
1569 sp, and lr. */
1570
1571 CORE_ADDR
1572 arm_skip_stub (pc)
1573 CORE_ADDR pc;
1574 {
1575 char * name;
1576 CORE_ADDR start_addr;
1577
1578 /* Find the starting address and name of the function containing the PC. */
1579 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
1580 return 0;
1581
1582 /* Call thunks always start with "_call_via_". */
1583 if (strncmp (name, "_call_via_", 10) == 0)
1584 {
1585 /* Use the name suffix to determine which register contains
1586 the target PC. */
1587 static char *table[15] =
1588 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1589 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
1590 };
1591 int regno;
1592
1593 for (regno = 0; regno <= 14; regno++)
1594 if (strcmp (&name[10], table[regno]) == 0)
1595 return read_register (regno);
1596 }
1597 return 0; /* not a stub */
1598 }
1599
1600
1601 void
1602 _initialize_arm_tdep ()
1603 {
1604 tm_print_insn = gdb_print_insn_arm;
1605
1606 add_com ("othernames", class_obscure, arm_othernames,
1607 "Switch to the other set of register names.");
1608
1609 /* ??? Maybe this should be a boolean. */
1610 add_show_from_set (add_set_cmd ("apcs32", no_class,
1611 var_zinteger, (char *)&arm_apcs_32,
1612 "Set usage of ARM 32-bit mode.\n", &setlist),
1613 & showlist);
1614
1615 }
1616
1617 /* Test whether the coff symbol specific value corresponds to a Thumb function */
1618 int
1619 coff_sym_is_thumb(int val)
1620 {
1621 return (val == C_THUMBEXT ||
1622 val == C_THUMBSTAT ||
1623 val == C_THUMBEXTFUNC ||
1624 val == C_THUMBSTATFUNC ||
1625 val == C_THUMBLABEL);
1626 }