1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
|
// OBSOLETE /* ARC target-dependent stuff.
// OBSOLETE Copyright 1995, 1996, 1999, 2000, 2001 Free Software Foundation, Inc.
// OBSOLETE
// OBSOLETE This file is part of GDB.
// OBSOLETE
// OBSOLETE This program is free software; you can redistribute it and/or modify
// OBSOLETE it under the terms of the GNU General Public License as published by
// OBSOLETE the Free Software Foundation; either version 2 of the License, or
// OBSOLETE (at your option) any later version.
// OBSOLETE
// OBSOLETE This program is distributed in the hope that it will be useful,
// OBSOLETE but WITHOUT ANY WARRANTY; without even the implied warranty of
// OBSOLETE MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// OBSOLETE GNU General Public License for more details.
// OBSOLETE
// OBSOLETE You should have received a copy of the GNU General Public License
// OBSOLETE along with this program; if not, write to the Free Software
// OBSOLETE Foundation, Inc., 59 Temple Place - Suite 330,
// OBSOLETE Boston, MA 02111-1307, USA. */
// OBSOLETE
// OBSOLETE #include "defs.h"
// OBSOLETE #include "frame.h"
// OBSOLETE #include "inferior.h"
// OBSOLETE #include "gdbcore.h"
// OBSOLETE #include "target.h"
// OBSOLETE #include "floatformat.h"
// OBSOLETE #include "symtab.h"
// OBSOLETE #include "gdbcmd.h"
// OBSOLETE #include "regcache.h"
// OBSOLETE #include "gdb_string.h"
// OBSOLETE
// OBSOLETE /* Local functions */
// OBSOLETE
// OBSOLETE static int arc_set_cpu_type (char *str);
// OBSOLETE
// OBSOLETE /* Current CPU, set with the "set cpu" command. */
// OBSOLETE static int arc_bfd_mach_type;
// OBSOLETE char *arc_cpu_type;
// OBSOLETE char *tmp_arc_cpu_type;
// OBSOLETE
// OBSOLETE /* Table of cpu names. */
// OBSOLETE struct
// OBSOLETE {
// OBSOLETE char *name;
// OBSOLETE int value;
// OBSOLETE }
// OBSOLETE arc_cpu_type_table[] =
// OBSOLETE {
// OBSOLETE { "arc5", bfd_mach_arc_5 },
// OBSOLETE { "arc6", bfd_mach_arc_6 },
// OBSOLETE { "arc7", bfd_mach_arc_7 },
// OBSOLETE { "arc8", bfd_mach_arc_8 },
// OBSOLETE { NULL, 0 }
// OBSOLETE };
// OBSOLETE
// OBSOLETE /* Used by simulator. */
// OBSOLETE int display_pipeline_p;
// OBSOLETE int cpu_timer;
// OBSOLETE /* This one must have the same type as used in the emulator.
// OBSOLETE It's currently an enum so this should be ok for now. */
// OBSOLETE int debug_pipeline_p;
// OBSOLETE
// OBSOLETE #define ARC_CALL_SAVED_REG(r) ((r) >= 16 && (r) < 24)
// OBSOLETE
// OBSOLETE #define OPMASK 0xf8000000
// OBSOLETE
// OBSOLETE /* Instruction field accessor macros.
// OBSOLETE See the Programmer's Reference Manual. */
// OBSOLETE #define X_OP(i) (((i) >> 27) & 0x1f)
// OBSOLETE #define X_A(i) (((i) >> 21) & 0x3f)
// OBSOLETE #define X_B(i) (((i) >> 15) & 0x3f)
// OBSOLETE #define X_C(i) (((i) >> 9) & 0x3f)
// OBSOLETE #define X_D(i) ((((i) & 0x1ff) ^ 0x100) - 0x100)
// OBSOLETE #define X_L(i) (((((i) >> 5) & 0x3ffffc) ^ 0x200000) - 0x200000)
// OBSOLETE #define X_N(i) (((i) >> 5) & 3)
// OBSOLETE #define X_Q(i) ((i) & 0x1f)
// OBSOLETE
// OBSOLETE /* Return non-zero if X is a short immediate data indicator. */
// OBSOLETE #define SHIMM_P(x) ((x) == 61 || (x) == 63)
// OBSOLETE
// OBSOLETE /* Return non-zero if X is a "long" (32 bit) immediate data indicator. */
// OBSOLETE #define LIMM_P(x) ((x) == 62)
// OBSOLETE
// OBSOLETE /* Build a simple instruction. */
// OBSOLETE #define BUILD_INSN(op, a, b, c, d) \
// OBSOLETE ((((op) & 31) << 27) \
// OBSOLETE | (((a) & 63) << 21) \
// OBSOLETE | (((b) & 63) << 15) \
// OBSOLETE | (((c) & 63) << 9) \
// OBSOLETE | ((d) & 511))
// OBSOLETE
// OBSOLETE /* Codestream stuff. */
// OBSOLETE static void codestream_read (unsigned int *, int);
// OBSOLETE static void codestream_seek (CORE_ADDR);
// OBSOLETE static unsigned int codestream_fill (int);
// OBSOLETE
// OBSOLETE #define CODESTREAM_BUFSIZ 16
// OBSOLETE static CORE_ADDR codestream_next_addr;
// OBSOLETE static CORE_ADDR codestream_addr;
// OBSOLETE /* FIXME assumes sizeof (int) == 32? */
// OBSOLETE static unsigned int codestream_buf[CODESTREAM_BUFSIZ];
// OBSOLETE static int codestream_off;
// OBSOLETE static int codestream_cnt;
// OBSOLETE
// OBSOLETE #define codestream_tell() \
// OBSOLETE (codestream_addr + codestream_off * sizeof (codestream_buf[0]))
// OBSOLETE #define codestream_peek() \
// OBSOLETE (codestream_cnt == 0 \
// OBSOLETE ? codestream_fill (1) \
// OBSOLETE : codestream_buf[codestream_off])
// OBSOLETE #define codestream_get() \
// OBSOLETE (codestream_cnt-- == 0 \
// OBSOLETE ? codestream_fill (0) \
// OBSOLETE : codestream_buf[codestream_off++])
// OBSOLETE
// OBSOLETE static unsigned int
// OBSOLETE codestream_fill (int peek_flag)
// OBSOLETE {
// OBSOLETE codestream_addr = codestream_next_addr;
// OBSOLETE codestream_next_addr += CODESTREAM_BUFSIZ * sizeof (codestream_buf[0]);
// OBSOLETE codestream_off = 0;
// OBSOLETE codestream_cnt = CODESTREAM_BUFSIZ;
// OBSOLETE read_memory (codestream_addr, (char *) codestream_buf,
// OBSOLETE CODESTREAM_BUFSIZ * sizeof (codestream_buf[0]));
// OBSOLETE /* FIXME: check return code? */
// OBSOLETE
// OBSOLETE
// OBSOLETE /* Handle byte order differences -> convert to host byte ordering. */
// OBSOLETE {
// OBSOLETE int i;
// OBSOLETE for (i = 0; i < CODESTREAM_BUFSIZ; i++)
// OBSOLETE codestream_buf[i] =
// OBSOLETE extract_unsigned_integer (&codestream_buf[i],
// OBSOLETE sizeof (codestream_buf[i]));
// OBSOLETE }
// OBSOLETE
// OBSOLETE if (peek_flag)
// OBSOLETE return codestream_peek ();
// OBSOLETE else
// OBSOLETE return codestream_get ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE static void
// OBSOLETE codestream_seek (CORE_ADDR place)
// OBSOLETE {
// OBSOLETE codestream_next_addr = place / CODESTREAM_BUFSIZ;
// OBSOLETE codestream_next_addr *= CODESTREAM_BUFSIZ;
// OBSOLETE codestream_cnt = 0;
// OBSOLETE codestream_fill (1);
// OBSOLETE while (codestream_tell () != place)
// OBSOLETE codestream_get ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* This function is currently unused but leave in for now. */
// OBSOLETE
// OBSOLETE static void
// OBSOLETE codestream_read (unsigned int *buf, int count)
// OBSOLETE {
// OBSOLETE unsigned int *p;
// OBSOLETE int i;
// OBSOLETE p = buf;
// OBSOLETE for (i = 0; i < count; i++)
// OBSOLETE *p++ = codestream_get ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Set up prologue scanning and return the first insn. */
// OBSOLETE
// OBSOLETE static unsigned int
// OBSOLETE setup_prologue_scan (CORE_ADDR pc)
// OBSOLETE {
// OBSOLETE unsigned int insn;
// OBSOLETE
// OBSOLETE codestream_seek (pc);
// OBSOLETE insn = codestream_get ();
// OBSOLETE
// OBSOLETE return insn;
// OBSOLETE }
// OBSOLETE
// OBSOLETE /*
// OBSOLETE * Find & return amount a local space allocated, and advance codestream to
// OBSOLETE * first register push (if any).
// OBSOLETE * If entry sequence doesn't make sense, return -1, and leave
// OBSOLETE * codestream pointer random.
// OBSOLETE */
// OBSOLETE
// OBSOLETE static long
// OBSOLETE arc_get_frame_setup (CORE_ADDR pc)
// OBSOLETE {
// OBSOLETE unsigned int insn;
// OBSOLETE /* Size of frame or -1 if unrecognizable prologue. */
// OBSOLETE int frame_size = -1;
// OBSOLETE /* An initial "sub sp,sp,N" may or may not be for a stdarg fn. */
// OBSOLETE int maybe_stdarg_decr = -1;
// OBSOLETE
// OBSOLETE insn = setup_prologue_scan (pc);
// OBSOLETE
// OBSOLETE /* The authority for what appears here is the home-grown ABI.
// OBSOLETE The most recent version is 1.2. */
// OBSOLETE
// OBSOLETE /* First insn may be "sub sp,sp,N" if stdarg fn. */
// OBSOLETE if ((insn & BUILD_INSN (-1, -1, -1, -1, 0))
// OBSOLETE == BUILD_INSN (10, SP_REGNUM, SP_REGNUM, SHIMM_REGNUM, 0))
// OBSOLETE {
// OBSOLETE maybe_stdarg_decr = X_D (insn);
// OBSOLETE insn = codestream_get ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE if ((insn & BUILD_INSN (-1, 0, -1, -1, -1)) /* st blink,[sp,4] */
// OBSOLETE == BUILD_INSN (2, 0, SP_REGNUM, BLINK_REGNUM, 4))
// OBSOLETE {
// OBSOLETE insn = codestream_get ();
// OBSOLETE /* Frame may not be necessary, even though blink is saved.
// OBSOLETE At least this is something we recognize. */
// OBSOLETE frame_size = 0;
// OBSOLETE }
// OBSOLETE
// OBSOLETE if ((insn & BUILD_INSN (-1, 0, -1, -1, -1)) /* st fp,[sp] */
// OBSOLETE == BUILD_INSN (2, 0, SP_REGNUM, FP_REGNUM, 0))
// OBSOLETE {
// OBSOLETE insn = codestream_get ();
// OBSOLETE if ((insn & BUILD_INSN (-1, -1, -1, -1, 0))
// OBSOLETE != BUILD_INSN (12, FP_REGNUM, SP_REGNUM, SP_REGNUM, 0))
// OBSOLETE return -1;
// OBSOLETE
// OBSOLETE /* Check for stack adjustment sub sp,sp,N. */
// OBSOLETE insn = codestream_peek ();
// OBSOLETE if ((insn & BUILD_INSN (-1, -1, -1, 0, 0))
// OBSOLETE == BUILD_INSN (10, SP_REGNUM, SP_REGNUM, 0, 0))
// OBSOLETE {
// OBSOLETE if (LIMM_P (X_C (insn)))
// OBSOLETE frame_size = codestream_get ();
// OBSOLETE else if (SHIMM_P (X_C (insn)))
// OBSOLETE frame_size = X_D (insn);
// OBSOLETE else
// OBSOLETE return -1;
// OBSOLETE if (frame_size < 0)
// OBSOLETE return -1;
// OBSOLETE
// OBSOLETE codestream_get ();
// OBSOLETE
// OBSOLETE /* This sequence is used to get the address of the return
// OBSOLETE buffer for a function that returns a structure. */
// OBSOLETE insn = codestream_peek ();
// OBSOLETE if ((insn & OPMASK) == 0x60000000)
// OBSOLETE codestream_get ();
// OBSOLETE }
// OBSOLETE /* Frameless fn. */
// OBSOLETE else
// OBSOLETE {
// OBSOLETE frame_size = 0;
// OBSOLETE }
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* If we found a "sub sp,sp,N" and nothing else, it may or may not be a
// OBSOLETE stdarg fn. The stdarg decrement is not treated as part of the frame size,
// OBSOLETE so we have a dilemma: what do we return? For now, if we get a
// OBSOLETE "sub sp,sp,N" and nothing else assume this isn't a stdarg fn. One way
// OBSOLETE to fix this completely would be to add a bit to the function descriptor
// OBSOLETE that says the function is a stdarg function. */
// OBSOLETE
// OBSOLETE if (frame_size < 0 && maybe_stdarg_decr > 0)
// OBSOLETE return maybe_stdarg_decr;
// OBSOLETE return frame_size;
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Given a pc value, skip it forward past the function prologue by
// OBSOLETE disassembling instructions that appear to be a prologue.
// OBSOLETE
// OBSOLETE If FRAMELESS_P is set, we are only testing to see if the function
// OBSOLETE is frameless. If it is a frameless function, return PC unchanged.
// OBSOLETE This allows a quicker answer. */
// OBSOLETE
// OBSOLETE CORE_ADDR
// OBSOLETE arc_skip_prologue (CORE_ADDR pc, int frameless_p)
// OBSOLETE {
// OBSOLETE unsigned int insn;
// OBSOLETE int i, frame_size;
// OBSOLETE
// OBSOLETE if ((frame_size = arc_get_frame_setup (pc)) < 0)
// OBSOLETE return (pc);
// OBSOLETE
// OBSOLETE if (frameless_p)
// OBSOLETE return frame_size == 0 ? pc : codestream_tell ();
// OBSOLETE
// OBSOLETE /* Skip over register saves. */
// OBSOLETE for (i = 0; i < 8; i++)
// OBSOLETE {
// OBSOLETE insn = codestream_peek ();
// OBSOLETE if ((insn & BUILD_INSN (-1, 0, -1, 0, 0))
// OBSOLETE != BUILD_INSN (2, 0, SP_REGNUM, 0, 0))
// OBSOLETE break; /* not st insn */
// OBSOLETE if (!ARC_CALL_SAVED_REG (X_C (insn)))
// OBSOLETE break;
// OBSOLETE codestream_get ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE return codestream_tell ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Is the prologue at PC frameless? */
// OBSOLETE
// OBSOLETE int
// OBSOLETE arc_prologue_frameless_p (CORE_ADDR pc)
// OBSOLETE {
// OBSOLETE return (pc == arc_skip_prologue (pc, 1));
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Return the return address for a frame.
// OBSOLETE This is used to implement FRAME_SAVED_PC.
// OBSOLETE This is taken from frameless_look_for_prologue. */
// OBSOLETE
// OBSOLETE CORE_ADDR
// OBSOLETE arc_frame_saved_pc (struct frame_info *frame)
// OBSOLETE {
// OBSOLETE CORE_ADDR func_start;
// OBSOLETE unsigned int insn;
// OBSOLETE
// OBSOLETE func_start = get_pc_function_start (frame->pc) + FUNCTION_START_OFFSET;
// OBSOLETE if (func_start == 0)
// OBSOLETE {
// OBSOLETE /* Best guess. */
// OBSOLETE return ARC_PC_TO_REAL_ADDRESS (read_memory_integer (FRAME_FP (frame) + 4, 4));
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* The authority for what appears here is the home-grown ABI.
// OBSOLETE The most recent version is 1.2. */
// OBSOLETE
// OBSOLETE insn = setup_prologue_scan (func_start);
// OBSOLETE
// OBSOLETE /* First insn may be "sub sp,sp,N" if stdarg fn. */
// OBSOLETE if ((insn & BUILD_INSN (-1, -1, -1, -1, 0))
// OBSOLETE == BUILD_INSN (10, SP_REGNUM, SP_REGNUM, SHIMM_REGNUM, 0))
// OBSOLETE insn = codestream_get ();
// OBSOLETE
// OBSOLETE /* If the next insn is "st blink,[sp,4]" we can get blink from there.
// OBSOLETE Otherwise this is a leaf function and we can use blink. Note that
// OBSOLETE this still allows for the case where a leaf function saves/clobbers/
// OBSOLETE restores blink. */
// OBSOLETE
// OBSOLETE if ((insn & BUILD_INSN (-1, 0, -1, -1, -1)) /* st blink,[sp,4] */
// OBSOLETE != BUILD_INSN (2, 0, SP_REGNUM, BLINK_REGNUM, 4))
// OBSOLETE return ARC_PC_TO_REAL_ADDRESS (read_register (BLINK_REGNUM));
// OBSOLETE else
// OBSOLETE return ARC_PC_TO_REAL_ADDRESS (read_memory_integer (FRAME_FP (frame) + 4, 4));
// OBSOLETE }
// OBSOLETE
// OBSOLETE /*
// OBSOLETE * Parse the first few instructions of the function to see
// OBSOLETE * what registers were stored.
// OBSOLETE *
// OBSOLETE * The startup sequence can be at the start of the function.
// OBSOLETE * 'st blink,[sp+4], st fp,[sp], mov fp,sp'
// OBSOLETE *
// OBSOLETE * Local space is allocated just below by sub sp,sp,nnn.
// OBSOLETE * Next, the registers used by this function are stored (as offsets from sp).
// OBSOLETE */
// OBSOLETE
// OBSOLETE void
// OBSOLETE frame_find_saved_regs (struct frame_info *fip, struct frame_saved_regs *fsrp)
// OBSOLETE {
// OBSOLETE long locals;
// OBSOLETE unsigned int insn;
// OBSOLETE CORE_ADDR dummy_bottom;
// OBSOLETE CORE_ADDR adr;
// OBSOLETE int i, regnum, offset;
// OBSOLETE
// OBSOLETE memset (fsrp, 0, sizeof *fsrp);
// OBSOLETE
// OBSOLETE /* If frame is the end of a dummy, compute where the beginning would be. */
// OBSOLETE dummy_bottom = fip->frame - 4 - REGISTER_BYTES - CALL_DUMMY_LENGTH;
// OBSOLETE
// OBSOLETE /* Check if the PC is in the stack, in a dummy frame. */
// OBSOLETE if (dummy_bottom <= fip->pc && fip->pc <= fip->frame)
// OBSOLETE {
// OBSOLETE /* all regs were saved by push_call_dummy () */
// OBSOLETE adr = fip->frame;
// OBSOLETE for (i = 0; i < NUM_REGS; i++)
// OBSOLETE {
// OBSOLETE adr -= REGISTER_RAW_SIZE (i);
// OBSOLETE fsrp->regs[i] = adr;
// OBSOLETE }
// OBSOLETE return;
// OBSOLETE }
// OBSOLETE
// OBSOLETE locals = arc_get_frame_setup (get_pc_function_start (fip->pc));
// OBSOLETE
// OBSOLETE if (locals >= 0)
// OBSOLETE {
// OBSOLETE /* Set `adr' to the value of `sp'. */
// OBSOLETE adr = fip->frame - locals;
// OBSOLETE for (i = 0; i < 8; i++)
// OBSOLETE {
// OBSOLETE insn = codestream_get ();
// OBSOLETE if ((insn & BUILD_INSN (-1, 0, -1, 0, 0))
// OBSOLETE != BUILD_INSN (2, 0, SP_REGNUM, 0, 0))
// OBSOLETE break;
// OBSOLETE regnum = X_C (insn);
// OBSOLETE offset = X_D (insn);
// OBSOLETE fsrp->regs[regnum] = adr + offset;
// OBSOLETE }
// OBSOLETE }
// OBSOLETE
// OBSOLETE fsrp->regs[PC_REGNUM] = fip->frame + 4;
// OBSOLETE fsrp->regs[FP_REGNUM] = fip->frame;
// OBSOLETE }
// OBSOLETE
// OBSOLETE void
// OBSOLETE arc_push_dummy_frame (void)
// OBSOLETE {
// OBSOLETE CORE_ADDR sp = read_register (SP_REGNUM);
// OBSOLETE int regnum;
// OBSOLETE char regbuf[MAX_REGISTER_RAW_SIZE];
// OBSOLETE
// OBSOLETE read_register_gen (PC_REGNUM, regbuf);
// OBSOLETE write_memory (sp + 4, regbuf, REGISTER_SIZE);
// OBSOLETE read_register_gen (FP_REGNUM, regbuf);
// OBSOLETE write_memory (sp, regbuf, REGISTER_SIZE);
// OBSOLETE write_register (FP_REGNUM, sp);
// OBSOLETE for (regnum = 0; regnum < NUM_REGS; regnum++)
// OBSOLETE {
// OBSOLETE read_register_gen (regnum, regbuf);
// OBSOLETE sp = push_bytes (sp, regbuf, REGISTER_RAW_SIZE (regnum));
// OBSOLETE }
// OBSOLETE sp += (2 * REGISTER_SIZE);
// OBSOLETE write_register (SP_REGNUM, sp);
// OBSOLETE }
// OBSOLETE
// OBSOLETE void
// OBSOLETE arc_pop_frame (void)
// OBSOLETE {
// OBSOLETE struct frame_info *frame = get_current_frame ();
// OBSOLETE CORE_ADDR fp;
// OBSOLETE int regnum;
// OBSOLETE struct frame_saved_regs fsr;
// OBSOLETE char regbuf[MAX_REGISTER_RAW_SIZE];
// OBSOLETE
// OBSOLETE fp = FRAME_FP (frame);
// OBSOLETE get_frame_saved_regs (frame, &fsr);
// OBSOLETE for (regnum = 0; regnum < NUM_REGS; regnum++)
// OBSOLETE {
// OBSOLETE CORE_ADDR adr;
// OBSOLETE adr = fsr.regs[regnum];
// OBSOLETE if (adr)
// OBSOLETE {
// OBSOLETE read_memory (adr, regbuf, REGISTER_RAW_SIZE (regnum));
// OBSOLETE write_register_bytes (REGISTER_BYTE (regnum), regbuf,
// OBSOLETE REGISTER_RAW_SIZE (regnum));
// OBSOLETE }
// OBSOLETE }
// OBSOLETE write_register (FP_REGNUM, read_memory_integer (fp, 4));
// OBSOLETE write_register (PC_REGNUM, read_memory_integer (fp + 4, 4));
// OBSOLETE write_register (SP_REGNUM, fp + 8);
// OBSOLETE flush_cached_frames ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Simulate single-step. */
// OBSOLETE
// OBSOLETE typedef enum
// OBSOLETE {
// OBSOLETE NORMAL4, /* a normal 4 byte insn */
// OBSOLETE NORMAL8, /* a normal 8 byte insn */
// OBSOLETE BRANCH4, /* a 4 byte branch insn, including ones without delay slots */
// OBSOLETE BRANCH8, /* an 8 byte branch insn, including ones with delay slots */
// OBSOLETE }
// OBSOLETE insn_type;
// OBSOLETE
// OBSOLETE /* Return the type of INSN and store in TARGET the destination address of a
// OBSOLETE branch if this is one. */
// OBSOLETE /* ??? Need to verify all cases are properly handled. */
// OBSOLETE
// OBSOLETE static insn_type
// OBSOLETE get_insn_type (unsigned long insn, CORE_ADDR pc, CORE_ADDR *target)
// OBSOLETE {
// OBSOLETE unsigned long limm;
// OBSOLETE
// OBSOLETE switch (insn >> 27)
// OBSOLETE {
// OBSOLETE case 0:
// OBSOLETE case 1:
// OBSOLETE case 2: /* load/store insns */
// OBSOLETE if (LIMM_P (X_A (insn))
// OBSOLETE || LIMM_P (X_B (insn))
// OBSOLETE || LIMM_P (X_C (insn)))
// OBSOLETE return NORMAL8;
// OBSOLETE return NORMAL4;
// OBSOLETE case 4:
// OBSOLETE case 5:
// OBSOLETE case 6: /* branch insns */
// OBSOLETE *target = pc + 4 + X_L (insn);
// OBSOLETE /* ??? It isn't clear that this is always the right answer.
// OBSOLETE The problem occurs when the next insn is an 8 byte insn. If the
// OBSOLETE branch is conditional there's no worry as there shouldn't be an 8
// OBSOLETE byte insn following. The programmer may be cheating if s/he knows
// OBSOLETE the branch will never be taken, but we don't deal with that.
// OBSOLETE Note that the programmer is also allowed to play games by putting
// OBSOLETE an insn with long immediate data in the delay slot and then duplicate
// OBSOLETE the long immediate data at the branch target. Ugh! */
// OBSOLETE if (X_N (insn) == 0)
// OBSOLETE return BRANCH4;
// OBSOLETE return BRANCH8;
// OBSOLETE case 7: /* jump insns */
// OBSOLETE if (LIMM_P (X_B (insn)))
// OBSOLETE {
// OBSOLETE limm = read_memory_integer (pc + 4, 4);
// OBSOLETE *target = ARC_PC_TO_REAL_ADDRESS (limm);
// OBSOLETE return BRANCH8;
// OBSOLETE }
// OBSOLETE if (SHIMM_P (X_B (insn)))
// OBSOLETE *target = ARC_PC_TO_REAL_ADDRESS (X_D (insn));
// OBSOLETE else
// OBSOLETE *target = ARC_PC_TO_REAL_ADDRESS (read_register (X_B (insn)));
// OBSOLETE if (X_Q (insn) == 0 && X_N (insn) == 0)
// OBSOLETE return BRANCH4;
// OBSOLETE return BRANCH8;
// OBSOLETE default: /* arithmetic insns, etc. */
// OBSOLETE if (LIMM_P (X_A (insn))
// OBSOLETE || LIMM_P (X_B (insn))
// OBSOLETE || LIMM_P (X_C (insn)))
// OBSOLETE return NORMAL8;
// OBSOLETE return NORMAL4;
// OBSOLETE }
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* single_step() is called just before we want to resume the inferior, if we
// OBSOLETE want to single-step it but there is no hardware or kernel single-step
// OBSOLETE support. We find all the possible targets of the coming instruction and
// OBSOLETE breakpoint them.
// OBSOLETE
// OBSOLETE single_step is also called just after the inferior stops. If we had
// OBSOLETE set up a simulated single-step, we undo our damage. */
// OBSOLETE
// OBSOLETE void
// OBSOLETE arc_software_single_step (enum target_signal ignore, /* sig but we don't need it */
// OBSOLETE int insert_breakpoints_p)
// OBSOLETE {
// OBSOLETE static CORE_ADDR next_pc, target;
// OBSOLETE static int brktrg_p;
// OBSOLETE typedef char binsn_quantum[BREAKPOINT_MAX];
// OBSOLETE static binsn_quantum break_mem[2];
// OBSOLETE
// OBSOLETE if (insert_breakpoints_p)
// OBSOLETE {
// OBSOLETE insn_type type;
// OBSOLETE CORE_ADDR pc;
// OBSOLETE unsigned long insn;
// OBSOLETE
// OBSOLETE pc = read_register (PC_REGNUM);
// OBSOLETE insn = read_memory_integer (pc, 4);
// OBSOLETE type = get_insn_type (insn, pc, &target);
// OBSOLETE
// OBSOLETE /* Always set a breakpoint for the insn after the branch. */
// OBSOLETE next_pc = pc + ((type == NORMAL8 || type == BRANCH8) ? 8 : 4);
// OBSOLETE target_insert_breakpoint (next_pc, break_mem[0]);
// OBSOLETE
// OBSOLETE brktrg_p = 0;
// OBSOLETE
// OBSOLETE if ((type == BRANCH4 || type == BRANCH8)
// OBSOLETE /* Watch out for branches to the following location.
// OBSOLETE We just stored a breakpoint there and another call to
// OBSOLETE target_insert_breakpoint will think the real insn is the
// OBSOLETE breakpoint we just stored there. */
// OBSOLETE && target != next_pc)
// OBSOLETE {
// OBSOLETE brktrg_p = 1;
// OBSOLETE target_insert_breakpoint (target, break_mem[1]);
// OBSOLETE }
// OBSOLETE
// OBSOLETE }
// OBSOLETE else
// OBSOLETE {
// OBSOLETE /* Remove breakpoints. */
// OBSOLETE target_remove_breakpoint (next_pc, break_mem[0]);
// OBSOLETE
// OBSOLETE if (brktrg_p)
// OBSOLETE target_remove_breakpoint (target, break_mem[1]);
// OBSOLETE
// OBSOLETE /* Fix the pc. */
// OBSOLETE stop_pc -= DECR_PC_AFTER_BREAK;
// OBSOLETE write_pc (stop_pc);
// OBSOLETE }
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Because of Multi-arch, GET_LONGJMP_TARGET is always defined. So test
// OBSOLETE for a definition of JB_PC. */
// OBSOLETE #ifdef JB_PC
// OBSOLETE /* Figure out where the longjmp will land. Slurp the args out of the stack.
// OBSOLETE We expect the first arg to be a pointer to the jmp_buf structure from which
// OBSOLETE we extract the pc (JB_PC) that we will land at. The pc is copied into PC.
// OBSOLETE This routine returns true on success. */
// OBSOLETE
// OBSOLETE int
// OBSOLETE get_longjmp_target (CORE_ADDR *pc)
// OBSOLETE {
// OBSOLETE char buf[TARGET_PTR_BIT / TARGET_CHAR_BIT];
// OBSOLETE CORE_ADDR sp, jb_addr;
// OBSOLETE
// OBSOLETE sp = read_register (SP_REGNUM);
// OBSOLETE
// OBSOLETE if (target_read_memory (sp + SP_ARG0, /* Offset of first arg on stack */
// OBSOLETE buf,
// OBSOLETE TARGET_PTR_BIT / TARGET_CHAR_BIT))
// OBSOLETE return 0;
// OBSOLETE
// OBSOLETE jb_addr = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
// OBSOLETE
// OBSOLETE if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
// OBSOLETE TARGET_PTR_BIT / TARGET_CHAR_BIT))
// OBSOLETE return 0;
// OBSOLETE
// OBSOLETE *pc = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
// OBSOLETE
// OBSOLETE return 1;
// OBSOLETE }
// OBSOLETE #endif /* GET_LONGJMP_TARGET */
// OBSOLETE
// OBSOLETE /* Disassemble one instruction. */
// OBSOLETE
// OBSOLETE static int
// OBSOLETE arc_print_insn (bfd_vma vma, disassemble_info *info)
// OBSOLETE {
// OBSOLETE static int current_mach;
// OBSOLETE static int current_endian;
// OBSOLETE static disassembler_ftype current_disasm;
// OBSOLETE
// OBSOLETE if (current_disasm == NULL
// OBSOLETE || arc_bfd_mach_type != current_mach
// OBSOLETE || TARGET_BYTE_ORDER != current_endian)
// OBSOLETE {
// OBSOLETE current_mach = arc_bfd_mach_type;
// OBSOLETE current_endian = TARGET_BYTE_ORDER;
// OBSOLETE current_disasm = arc_get_disassembler (NULL);
// OBSOLETE }
// OBSOLETE
// OBSOLETE return (*current_disasm) (vma, info);
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Command to set cpu type. */
// OBSOLETE
// OBSOLETE void
// OBSOLETE arc_set_cpu_type_command (char *args, int from_tty)
// OBSOLETE {
// OBSOLETE int i;
// OBSOLETE
// OBSOLETE if (tmp_arc_cpu_type == NULL || *tmp_arc_cpu_type == '\0')
// OBSOLETE {
// OBSOLETE printf_unfiltered ("The known ARC cpu types are as follows:\n");
// OBSOLETE for (i = 0; arc_cpu_type_table[i].name != NULL; ++i)
// OBSOLETE printf_unfiltered ("%s\n", arc_cpu_type_table[i].name);
// OBSOLETE
// OBSOLETE /* Restore the value. */
// OBSOLETE tmp_arc_cpu_type = xstrdup (arc_cpu_type);
// OBSOLETE
// OBSOLETE return;
// OBSOLETE }
// OBSOLETE
// OBSOLETE if (!arc_set_cpu_type (tmp_arc_cpu_type))
// OBSOLETE {
// OBSOLETE error ("Unknown cpu type `%s'.", tmp_arc_cpu_type);
// OBSOLETE /* Restore its value. */
// OBSOLETE tmp_arc_cpu_type = xstrdup (arc_cpu_type);
// OBSOLETE }
// OBSOLETE }
// OBSOLETE
// OBSOLETE static void
// OBSOLETE arc_show_cpu_type_command (char *args, int from_tty)
// OBSOLETE {
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Modify the actual cpu type.
// OBSOLETE Result is a boolean indicating success. */
// OBSOLETE
// OBSOLETE static int
// OBSOLETE arc_set_cpu_type (char *str)
// OBSOLETE {
// OBSOLETE int i, j;
// OBSOLETE
// OBSOLETE if (str == NULL)
// OBSOLETE return 0;
// OBSOLETE
// OBSOLETE for (i = 0; arc_cpu_type_table[i].name != NULL; ++i)
// OBSOLETE {
// OBSOLETE if (strcasecmp (str, arc_cpu_type_table[i].name) == 0)
// OBSOLETE {
// OBSOLETE arc_cpu_type = str;
// OBSOLETE arc_bfd_mach_type = arc_cpu_type_table[i].value;
// OBSOLETE return 1;
// OBSOLETE }
// OBSOLETE }
// OBSOLETE
// OBSOLETE return 0;
// OBSOLETE }
// OBSOLETE
// OBSOLETE void
// OBSOLETE _initialize_arc_tdep (void)
// OBSOLETE {
// OBSOLETE struct cmd_list_element *c;
// OBSOLETE
// OBSOLETE c = add_set_cmd ("cpu", class_support, var_string_noescape,
// OBSOLETE (char *) &tmp_arc_cpu_type,
// OBSOLETE "Set the type of ARC cpu in use.\n\
// OBSOLETE This command has two purposes. In a multi-cpu system it lets one\n\
// OBSOLETE change the cpu being debugged. It also gives one access to\n\
// OBSOLETE cpu-type-specific registers and recognize cpu-type-specific instructions.\
// OBSOLETE ",
// OBSOLETE &setlist);
// OBSOLETE set_cmd_cfunc (c, arc_set_cpu_type_command);
// OBSOLETE c = add_show_from_set (c, &showlist);
// OBSOLETE set_cmd_cfunc (c, arc_show_cpu_type_command);
// OBSOLETE
// OBSOLETE /* We have to use xstrdup() here because the `set' command frees it
// OBSOLETE before setting a new value. */
// OBSOLETE tmp_arc_cpu_type = xstrdup (DEFAULT_ARC_CPU_TYPE);
// OBSOLETE arc_set_cpu_type (tmp_arc_cpu_type);
// OBSOLETE
// OBSOLETE c = add_set_cmd ("displaypipeline", class_support, var_zinteger,
// OBSOLETE (char *) &display_pipeline_p,
// OBSOLETE "Set pipeline display (simulator only).\n\
// OBSOLETE When enabled, the state of the pipeline after each cycle is displayed.",
// OBSOLETE &setlist);
// OBSOLETE c = add_show_from_set (c, &showlist);
// OBSOLETE
// OBSOLETE c = add_set_cmd ("debugpipeline", class_support, var_zinteger,
// OBSOLETE (char *) &debug_pipeline_p,
// OBSOLETE "Set pipeline debug display (simulator only).\n\
// OBSOLETE When enabled, debugging information about the pipeline is displayed.",
// OBSOLETE &setlist);
// OBSOLETE c = add_show_from_set (c, &showlist);
// OBSOLETE
// OBSOLETE c = add_set_cmd ("cputimer", class_support, var_zinteger,
// OBSOLETE (char *) &cpu_timer,
// OBSOLETE "Set maximum cycle count (simulator only).\n\
// OBSOLETE Control will return to gdb if the timer expires.\n\
// OBSOLETE A negative value disables the timer.",
// OBSOLETE &setlist);
// OBSOLETE c = add_show_from_set (c, &showlist);
// OBSOLETE
// OBSOLETE tm_print_insn = arc_print_insn;
// OBSOLETE }
|