This commit was generated by cvs2svn to track changes on a CVS vendor
[deliverable/binutils-gdb.git] / gdb / arm-tdep.c
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.
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 = ADDR_BITS_REMOVE(read_memory_integer (fi->frame, 4)) - 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 CORE_ADDR old_SP;
978
979 old_SP = read_register (frame->framereg);
980 for (regnum = 0; regnum < NUM_REGS; regnum++)
981 if (frame->fsr.regs[regnum] != 0)
982 write_register (regnum,
983 read_memory_integer (frame->fsr.regs[regnum], 4));
984
985 write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
986 write_register (SP_REGNUM, old_SP);
987
988 flush_cached_frames ();
989 }
990
991 static void
992 print_fpu_flags (flags)
993 int flags;
994 {
995 if (flags & (1 << 0)) fputs ("IVO ", stdout);
996 if (flags & (1 << 1)) fputs ("DVZ ", stdout);
997 if (flags & (1 << 2)) fputs ("OFL ", stdout);
998 if (flags & (1 << 3)) fputs ("UFL ", stdout);
999 if (flags & (1 << 4)) fputs ("INX ", stdout);
1000 putchar ('\n');
1001 }
1002
1003 void
1004 arm_float_info ()
1005 {
1006 register unsigned long status = read_register (FPS_REGNUM);
1007 int type;
1008
1009 type = (status >> 24) & 127;
1010 printf ("%s FPU type %d\n",
1011 (status & (1<<31)) ? "Hardware" : "Software",
1012 type);
1013 fputs ("mask: ", stdout);
1014 print_fpu_flags (status >> 16);
1015 fputs ("flags: ", stdout);
1016 print_fpu_flags (status);
1017 }
1018
1019 static char *original_register_names[] =
1020 { "a1", "a2", "a3", "a4", /* 0 1 2 3 */
1021 "v1", "v2", "v3", "v4", /* 4 5 6 7 */
1022 "v5", "v6", "sl", "fp", /* 8 9 10 11 */
1023 "ip", "sp", "lr", "pc", /* 12 13 14 15 */
1024 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
1025 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
1026 "fps","ps" } /* 24 25 */;
1027
1028 /* These names are the ones which gcc emits, and
1029 I find them less confusing. Toggle between them
1030 using the `othernames' command. */
1031 static char *additional_register_names[] =
1032 { "r0", "r1", "r2", "r3", /* 0 1 2 3 */
1033 "r4", "r5", "r6", "r7", /* 4 5 6 7 */
1034 "r8", "r9", "sl", "fp", /* 8 9 10 11 */
1035 "ip", "sp", "lr", "pc", /* 12 13 14 15 */
1036 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
1037 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
1038 "fps","ps" } /* 24 25 */;
1039
1040 char **arm_register_names = original_register_names;
1041
1042
1043 static void
1044 arm_othernames ()
1045 {
1046 static int toggle;
1047 arm_register_names = (toggle
1048 ? additional_register_names
1049 : original_register_names);
1050 toggle = !toggle;
1051 }
1052
1053 /* FIXME: Fill in with the 'right thing', see asm
1054 template in arm-convert.s */
1055
1056 void
1057 convert_from_extended (ptr, dbl)
1058 void * ptr;
1059 double * dbl;
1060 {
1061 *dbl = *(double*)ptr;
1062 }
1063
1064 void
1065 convert_to_extended (dbl, ptr)
1066 void * ptr;
1067 double * dbl;
1068 {
1069 *(double*)ptr = *dbl;
1070 }
1071
1072 static int
1073 condition_true (cond, status_reg)
1074 unsigned long cond;
1075 unsigned long status_reg;
1076 {
1077 if (cond == INST_AL || cond == INST_NV)
1078 return 1;
1079
1080 switch (cond)
1081 {
1082 case INST_EQ:
1083 return ((status_reg & FLAG_Z) != 0);
1084 case INST_NE:
1085 return ((status_reg & FLAG_Z) == 0);
1086 case INST_CS:
1087 return ((status_reg & FLAG_C) != 0);
1088 case INST_CC:
1089 return ((status_reg & FLAG_C) == 0);
1090 case INST_MI:
1091 return ((status_reg & FLAG_N) != 0);
1092 case INST_PL:
1093 return ((status_reg & FLAG_N) == 0);
1094 case INST_VS:
1095 return ((status_reg & FLAG_V) != 0);
1096 case INST_VC:
1097 return ((status_reg & FLAG_V) == 0);
1098 case INST_HI:
1099 return ((status_reg & (FLAG_C | FLAG_Z)) == FLAG_C);
1100 case INST_LS:
1101 return ((status_reg & (FLAG_C | FLAG_Z)) != FLAG_C);
1102 case INST_GE:
1103 return (((status_reg & FLAG_N) == 0) == ((status_reg & FLAG_V) == 0));
1104 case INST_LT:
1105 return (((status_reg & FLAG_N) == 0) != ((status_reg & FLAG_V) == 0));
1106 case INST_GT:
1107 return (((status_reg & FLAG_Z) == 0) &&
1108 (((status_reg & FLAG_N) == 0) == ((status_reg & FLAG_V) == 0)));
1109 case INST_LE:
1110 return (((status_reg & FLAG_Z) != 0) ||
1111 (((status_reg & FLAG_N) == 0) != ((status_reg & FLAG_V) == 0)));
1112 }
1113 return 1;
1114 }
1115
1116 #define submask(x) ((1L << ((x) + 1)) - 1)
1117 #define bit(obj,st) (((obj) >> (st)) & 1)
1118 #define bits(obj,st,fn) (((obj) >> (st)) & submask ((fn) - (st)))
1119 #define sbits(obj,st,fn) \
1120 ((long) (bits(obj,st,fn) | ((long) bit(obj,fn) * ~ submask (fn - st))))
1121 #define BranchDest(addr,instr) \
1122 ((CORE_ADDR) (((long) (addr)) + 8 + (sbits (instr, 0, 23) << 2)))
1123 #define ARM_PC_32 1
1124
1125 static unsigned long
1126 shifted_reg_val (inst, carry, pc_val, status_reg)
1127 unsigned long inst;
1128 int carry;
1129 unsigned long pc_val;
1130 unsigned long status_reg;
1131 {
1132 unsigned long res, shift;
1133 int rm = bits (inst, 0, 3);
1134 unsigned long shifttype = bits (inst, 5, 6);
1135
1136 if (bit(inst, 4))
1137 {
1138 int rs = bits (inst, 8, 11);
1139 shift = (rs == 15 ? pc_val + 8 : read_register (rs)) & 0xFF;
1140 }
1141 else
1142 shift = bits (inst, 7, 11);
1143
1144 res = (rm == 15
1145 ? ((pc_val | (ARM_PC_32 ? 0 : status_reg))
1146 + (bit (inst, 4) ? 12 : 8))
1147 : read_register (rm));
1148
1149 switch (shifttype)
1150 {
1151 case 0: /* LSL */
1152 res = shift >= 32 ? 0 : res << shift;
1153 break;
1154
1155 case 1: /* LSR */
1156 res = shift >= 32 ? 0 : res >> shift;
1157 break;
1158
1159 case 2: /* ASR */
1160 if (shift >= 32) shift = 31;
1161 res = ((res & 0x80000000L)
1162 ? ~((~res) >> shift) : res >> shift);
1163 break;
1164
1165 case 3: /* ROR/RRX */
1166 shift &= 31;
1167 if (shift == 0)
1168 res = (res >> 1) | (carry ? 0x80000000L : 0);
1169 else
1170 res = (res >> shift) | (res << (32-shift));
1171 break;
1172 }
1173
1174 return res & 0xffffffff;
1175 }
1176
1177
1178 /* Return number of 1-bits in VAL. */
1179
1180 static int
1181 bitcount (val)
1182 unsigned long val;
1183 {
1184 int nbits;
1185 for (nbits = 0; val != 0; nbits++)
1186 val &= val - 1; /* delete rightmost 1-bit in val */
1187 return nbits;
1188 }
1189
1190
1191 static CORE_ADDR
1192 thumb_get_next_pc (pc)
1193 CORE_ADDR pc;
1194 {
1195 unsigned long pc_val = ((unsigned long)pc) + 4; /* PC after prefetch */
1196 unsigned short inst1 = read_memory_integer (pc, 2);
1197 CORE_ADDR nextpc = pc + 2; /* default is next instruction */
1198 unsigned long offset;
1199
1200 if ((inst1 & 0xff00) == 0xbd00) /* pop {rlist, pc} */
1201 {
1202 CORE_ADDR sp;
1203
1204 /* Fetch the saved PC from the stack. It's stored above
1205 all of the other registers. */
1206 offset = bitcount (bits (inst1, 0, 7)) * REGISTER_SIZE;
1207 sp = read_register (SP_REGNUM);
1208 nextpc = (CORE_ADDR) read_memory_integer (sp + offset, 4);
1209 nextpc = ADDR_BITS_REMOVE (nextpc);
1210 if (nextpc == pc)
1211 error ("Infinite loop detected");
1212 }
1213 else if ((inst1 & 0xf000) == 0xd000) /* conditional branch */
1214 {
1215 unsigned long status = read_register (PS_REGNUM);
1216 unsigned long cond = bits (inst1, 8, 11);
1217 if (cond != 0x0f && condition_true (cond, status)) /* 0x0f = SWI */
1218 nextpc = pc_val + (sbits (inst1, 0, 7) << 1);
1219 }
1220 else if ((inst1 & 0xf800) == 0xe000) /* unconditional branch */
1221 {
1222 nextpc = pc_val + (sbits (inst1, 0, 10) << 1);
1223 }
1224 else if ((inst1 & 0xf800) == 0xf000) /* long branch with link */
1225 {
1226 unsigned short inst2 = read_memory_integer (pc + 2, 2);
1227 offset = (sbits (inst1, 0, 10) << 12) + (bits (inst2, 0, 10) << 1);
1228 nextpc = pc_val + offset;
1229 }
1230
1231 return nextpc;
1232 }
1233
1234
1235 CORE_ADDR
1236 arm_get_next_pc (pc)
1237 CORE_ADDR pc;
1238 {
1239 unsigned long pc_val;
1240 unsigned long this_instr;
1241 unsigned long status;
1242 CORE_ADDR nextpc;
1243
1244 if (arm_pc_is_thumb (pc))
1245 return thumb_get_next_pc (pc);
1246
1247 pc_val = (unsigned long) pc;
1248 this_instr = read_memory_integer (pc, 4);
1249 status = read_register (PS_REGNUM);
1250 nextpc = (CORE_ADDR) (pc_val + 4); /* Default case */
1251
1252 if (condition_true (bits (this_instr, 28, 31), status))
1253 {
1254 switch (bits (this_instr, 24, 27))
1255 {
1256 case 0x0: case 0x1: /* data processing */
1257 case 0x2: case 0x3:
1258 {
1259 unsigned long operand1, operand2, result = 0;
1260 unsigned long rn;
1261 int c;
1262
1263 if (bits (this_instr, 12, 15) != 15)
1264 break;
1265
1266 if (bits (this_instr, 22, 25) == 0
1267 && bits (this_instr, 4, 7) == 9) /* multiply */
1268 error ("Illegal update to pc in instruction");
1269
1270 /* Multiply into PC */
1271 c = (status & FLAG_C) ? 1 : 0;
1272 rn = bits (this_instr, 16, 19);
1273 operand1 = (rn == 15) ? pc_val + 8 : read_register (rn);
1274
1275 if (bit (this_instr, 25))
1276 {
1277 unsigned long immval = bits (this_instr, 0, 7);
1278 unsigned long rotate = 2 * bits (this_instr, 8, 11);
1279 operand2 = ((immval >> rotate) | (immval << (32-rotate)))
1280 & 0xffffffff;
1281 }
1282 else /* operand 2 is a shifted register */
1283 operand2 = shifted_reg_val (this_instr, c, pc_val, status);
1284
1285 switch (bits (this_instr, 21, 24))
1286 {
1287 case 0x0: /*and*/
1288 result = operand1 & operand2;
1289 break;
1290
1291 case 0x1: /*eor*/
1292 result = operand1 ^ operand2;
1293 break;
1294
1295 case 0x2: /*sub*/
1296 result = operand1 - operand2;
1297 break;
1298
1299 case 0x3: /*rsb*/
1300 result = operand2 - operand1;
1301 break;
1302
1303 case 0x4: /*add*/
1304 result = operand1 + operand2;
1305 break;
1306
1307 case 0x5: /*adc*/
1308 result = operand1 + operand2 + c;
1309 break;
1310
1311 case 0x6: /*sbc*/
1312 result = operand1 - operand2 + c;
1313 break;
1314
1315 case 0x7: /*rsc*/
1316 result = operand2 - operand1 + c;
1317 break;
1318
1319 case 0x8: case 0x9: case 0xa: case 0xb: /* tst, teq, cmp, cmn */
1320 result = (unsigned long) nextpc;
1321 break;
1322
1323 case 0xc: /*orr*/
1324 result = operand1 | operand2;
1325 break;
1326
1327 case 0xd: /*mov*/
1328 /* Always step into a function. */
1329 result = operand2;
1330 break;
1331
1332 case 0xe: /*bic*/
1333 result = operand1 & ~operand2;
1334 break;
1335
1336 case 0xf: /*mvn*/
1337 result = ~operand2;
1338 break;
1339 }
1340 nextpc = (CORE_ADDR) ADDR_BITS_REMOVE (result);
1341
1342 if (nextpc == pc)
1343 error ("Infinite loop detected");
1344 break;
1345 }
1346
1347 case 0x4: case 0x5: /* data transfer */
1348 case 0x6: case 0x7:
1349 if (bit (this_instr, 20))
1350 {
1351 /* load */
1352 if (bits (this_instr, 12, 15) == 15)
1353 {
1354 /* rd == pc */
1355 unsigned long rn;
1356 unsigned long base;
1357
1358 if (bit (this_instr, 22))
1359 error ("Illegal update to pc in instruction");
1360
1361 /* byte write to PC */
1362 rn = bits (this_instr, 16, 19);
1363 base = (rn == 15) ? pc_val + 8 : read_register (rn);
1364 if (bit (this_instr, 24))
1365 {
1366 /* pre-indexed */
1367 int c = (status & FLAG_C) ? 1 : 0;
1368 unsigned long offset =
1369 (bit (this_instr, 25)
1370 ? shifted_reg_val (this_instr, c, pc_val)
1371 : bits (this_instr, 0, 11));
1372
1373 if (bit (this_instr, 23))
1374 base += offset;
1375 else
1376 base -= offset;
1377 }
1378 nextpc = (CORE_ADDR) read_memory_integer ((CORE_ADDR) base,
1379 4);
1380
1381 nextpc = ADDR_BITS_REMOVE (nextpc);
1382
1383 if (nextpc == pc)
1384 error ("Infinite loop detected");
1385 }
1386 }
1387 break;
1388
1389 case 0x8: case 0x9: /* block transfer */
1390 if (bit (this_instr, 20))
1391 {
1392 /* LDM */
1393 if (bit (this_instr, 15))
1394 {
1395 /* loading pc */
1396 int offset = 0;
1397
1398 if (bit (this_instr, 23))
1399 {
1400 /* up */
1401 unsigned long reglist = bits (this_instr, 0, 14);
1402 offset = bitcount (reglist) * 4;
1403 if (bit (this_instr, 24)) /* pre */
1404 offset += 4;
1405 }
1406 else if (bit (this_instr, 24))
1407 offset = -4;
1408
1409 {
1410 unsigned long rn_val =
1411 read_register (bits (this_instr, 16, 19));
1412 nextpc =
1413 (CORE_ADDR) read_memory_integer ((CORE_ADDR) (rn_val
1414 + offset),
1415 4);
1416 }
1417 nextpc = ADDR_BITS_REMOVE (nextpc);
1418 if (nextpc == pc)
1419 error ("Infinite loop detected");
1420 }
1421 }
1422 break;
1423
1424 case 0xb: /* branch & link */
1425 case 0xa: /* branch */
1426 {
1427 nextpc = BranchDest (pc, this_instr);
1428
1429 nextpc = ADDR_BITS_REMOVE (nextpc);
1430 if (nextpc == pc)
1431 error ("Infinite loop detected");
1432 break;
1433 }
1434
1435 case 0xc: case 0xd:
1436 case 0xe: /* coproc ops */
1437 case 0xf: /* SWI */
1438 break;
1439
1440 default:
1441 fprintf (stderr, "Bad bit-field extraction\n");
1442 return (pc);
1443 }
1444 }
1445
1446 return nextpc;
1447 }
1448
1449 #include "bfd-in2.h"
1450 #include "libcoff.h"
1451
1452 static int
1453 gdb_print_insn_arm (memaddr, info)
1454 bfd_vma memaddr;
1455 disassemble_info * info;
1456 {
1457 if (arm_pc_is_thumb (memaddr))
1458 {
1459 static asymbol * asym;
1460 static combined_entry_type ce;
1461 static struct coff_symbol_struct csym;
1462 static struct _bfd fake_bfd;
1463 static bfd_target fake_target;
1464
1465 if (csym.native == NULL)
1466 {
1467 /* Create a fake symbol vector containing a Thumb symbol. This is
1468 solely so that the code in print_insn_little_arm() and
1469 print_insn_big_arm() in opcodes/arm-dis.c will detect the presence
1470 of a Thumb symbol and switch to decoding Thumb instructions. */
1471
1472 fake_target.flavour = bfd_target_coff_flavour;
1473 fake_bfd.xvec = & fake_target;
1474 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
1475 csym.native = & ce;
1476 csym.symbol.the_bfd = & fake_bfd;
1477 csym.symbol.name = "fake";
1478 asym = (asymbol *) & csym;
1479 }
1480
1481 memaddr = UNMAKE_THUMB_ADDR (memaddr);
1482 info->symbols = & asym;
1483 }
1484 else
1485 info->symbols = NULL;
1486
1487 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1488 return print_insn_big_arm (memaddr, info);
1489 else
1490 return print_insn_little_arm (memaddr, info);
1491 }
1492
1493 /* Sequence of bytes for breakpoint instruction. */
1494 #define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7} /* Recognized illegal opcodes */
1495 #define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
1496 #define THUMB_LE_BREAKPOINT {0xfe,0xdf}
1497 #define THUMB_BE_BREAKPOINT {0xdf,0xfe}
1498
1499 /* The following has been superseded by BREAKPOINT_FOR_PC, but
1500 is defined merely to keep mem-break.c happy. */
1501 #define LITTLE_BREAKPOINT ARM_LE_BREAKPOINT
1502 #define BIG_BREAKPOINT ARM_BE_BREAKPOINT
1503
1504 /* This function implements the BREAKPOINT_FROM_PC macro. It uses the program
1505 counter value to determine whether a 16- or 32-bit breakpoint should be
1506 used. It returns a pointer to a string of bytes that encode a breakpoint
1507 instruction, stores the length of the string to *lenptr, and adjusts pc
1508 (if necessary) to point to the actual memory location where the
1509 breakpoint should be inserted. */
1510
1511 unsigned char *
1512 arm_breakpoint_from_pc (pcptr, lenptr)
1513 CORE_ADDR * pcptr;
1514 int * lenptr;
1515 {
1516 if (arm_pc_is_thumb (*pcptr) || arm_pc_is_thumb_dummy (*pcptr))
1517 {
1518 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1519 {
1520 static char thumb_breakpoint[] = THUMB_BE_BREAKPOINT;
1521 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
1522 *lenptr = sizeof (thumb_breakpoint);
1523 return thumb_breakpoint;
1524 }
1525 else
1526 {
1527 static char thumb_breakpoint[] = THUMB_LE_BREAKPOINT;
1528 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
1529 *lenptr = sizeof (thumb_breakpoint);
1530 return thumb_breakpoint;
1531 }
1532 }
1533 else
1534 {
1535 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1536 {
1537 static char arm_breakpoint[] = ARM_BE_BREAKPOINT;
1538 *lenptr = sizeof (arm_breakpoint);
1539 return arm_breakpoint;
1540 }
1541 else
1542 {
1543 static char arm_breakpoint[] = ARM_LE_BREAKPOINT;
1544 *lenptr = sizeof (arm_breakpoint);
1545 return arm_breakpoint;
1546 }
1547 }
1548 }
1549 /* Return non-zero if the PC is inside a call thunk (aka stub or trampoline).
1550 This implements the IN_SOLIB_CALL_TRAMPOLINE macro. */
1551
1552 int
1553 arm_in_call_stub (pc, name)
1554 CORE_ADDR pc;
1555 char * name;
1556 {
1557 CORE_ADDR start_addr;
1558
1559 /* Find the starting address of the function containing the PC. If the
1560 caller didn't give us a name, look it up at the same time. */
1561 if (find_pc_partial_function (pc, name ? NULL : &name, &start_addr, NULL) == 0)
1562 return 0;
1563
1564 return strncmp (name, "_call_via_r", 11) == 0;
1565 }
1566
1567
1568 /* If PC is in a Thumb call or return stub, return the address of the target
1569 PC, which is in a register. The thunk functions are called _called_via_xx,
1570 where x is the register name. The possible names are r0-r9, sl, fp, ip,
1571 sp, and lr. */
1572
1573 CORE_ADDR
1574 arm_skip_stub (pc)
1575 CORE_ADDR pc;
1576 {
1577 char * name;
1578 CORE_ADDR start_addr;
1579
1580 /* Find the starting address and name of the function containing the PC. */
1581 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
1582 return 0;
1583
1584 /* Call thunks always start with "_call_via_". */
1585 if (strncmp (name, "_call_via_", 10) == 0)
1586 {
1587 /* Use the name suffix to determine which register contains
1588 the target PC. */
1589 static char *table[15] =
1590 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1591 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
1592 };
1593 int regno;
1594
1595 for (regno = 0; regno <= 14; regno++)
1596 if (strcmp (&name[10], table[regno]) == 0)
1597 return read_register (regno);
1598 }
1599 return 0; /* not a stub */
1600 }
1601
1602
1603 void
1604 _initialize_arm_tdep ()
1605 {
1606 tm_print_insn = gdb_print_insn_arm;
1607
1608 add_com ("othernames", class_obscure, arm_othernames,
1609 "Switch to the other set of register names.");
1610
1611 /* ??? Maybe this should be a boolean. */
1612 add_show_from_set (add_set_cmd ("apcs32", no_class,
1613 var_zinteger, (char *)&arm_apcs_32,
1614 "Set usage of ARM 32-bit mode.\n", &setlist),
1615 & showlist);
1616
1617 }
1618
1619 /* Test whether the coff symbol specific value corresponds to a Thumb function */
1620 int
1621 coff_sym_is_thumb(int val)
1622 {
1623 return (val == C_THUMBEXT ||
1624 val == C_THUMBSTAT ||
1625 val == C_THUMBEXTFUNC ||
1626 val == C_THUMBSTATFUNC ||
1627 val == C_THUMBLABEL);
1628 }
This page took 0.089672 seconds and 5 git commands to generate.