annotate packages/hal/arm/arch/current/src/arm_stub.c @ 36:e97d78785e2d ecos-sw-1999-09-12

Merge from eCos master repository on 1999-09-12-15:40:34-BST
author jlarmour
date Sun, 12 Sep 1999 15:26:05 +0000
parents 29bc183297e1
children e7ba79f6d3a8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
1 /* arm_stub.c - helper functions for stub, generic to all ARM processors
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3 * Copyright (c) 1998,1999 Cygnus Solutions
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
4 *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
5 * The authors hereby grant permission to use, copy, modify, distribute,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 * and license this software and its documentation for any purpose, provided
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 * that existing copyright notices are retained in all copies and that this
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
8 * notice is included verbatim in any distributions. No written agreement,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
9 * license, or royalty fee is required for any of the authorized uses.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
10 * Modifications to this software may be copyrighted by their authors
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
11 * and need not follow the licensing terms described here, provided that
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
12 * the new terms are clearly indicated on the first page of each file where
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
13 * they apply.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
14 */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
15
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
16 #include <stddef.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
17
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
18 #include <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
19
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
20 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
21
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
22 #ifdef CYG_HAL_ARM_SIM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
23 #error "GDB Stub support not implemented for ARM SIM"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
24 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
25
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
26 #include <cyg/hal/hal_stub.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
27 #include <cyg/hal/hal_arch.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
28 #include <cyg/hal/hal_intr.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
29
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 #ifndef FALSE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
31 #define FALSE 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
32 #define TRUE 1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
35
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 #ifdef CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 #include <cyg/hal/dbg-threads-api.h> // dbg_currthread_id
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
39
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
40 /* Given a trap value TRAP, return the corresponding signal. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
41
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
42 int __computeSignal (unsigned int trap_number)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43 {
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
44 // should also catch CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION here but we
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
45 // can't tell the different between a real one and a breakpoint :-(
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 switch (trap_number) {
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
47 case CYGNUM_HAL_VECTOR_ABORT_PREFETCH: // Fall through
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
48 case CYGNUM_HAL_VECTOR_ABORT_DATA: // Fall through
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
49 case CYGNUM_HAL_VECTOR_reserved:
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
50 return SIGBUS;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
51 case CYGNUM_HAL_VECTOR_IRQ:
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
52 case CYGNUM_HAL_VECTOR_FIQ:
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
53 return SIGINT;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54 default:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55 return SIGTRAP;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 /* Return the trap number corresponding to the last-taken trap. */
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
61 volatile int jifl;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 int __get_trap_number (void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 // The vector is not not part of the GDB register set so get it
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 // directly from the save context.
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
66 return _hal_registers->vector;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 /* Set the currently-saved pc register value to PC. This also updates NPC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 as needed. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 void set_pc (target_register_t pc)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74 put_register (PC, pc);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 /*----------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 * Single-step support
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 /* Set things up so that the next user resume will execute one instruction.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83 This may be done by setting breakpoints or setting a single step flag
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 in the saved user registers, for example. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 #define NULL_PTR (unsigned long *)0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87 static unsigned long *ss_saved_pc = NULL_PTR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 static unsigned long ss_saved_instr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
90
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 #define FIXME() {diag_printf("FIXME - %s\n", __FUNCTION__); }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 static int
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 ins_will_execute(unsigned long ins)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 unsigned long psr = get_register(PS); // condition codes
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 int res = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 switch ((ins & 0xF0000000) >> 28) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 case 0x0: // EQ
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 res = (psr & PS_Z) != 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102 case 0x1: // NE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 res = (psr & PS_Z) == 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 case 0x2: // CS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106 res = (psr & PS_C) != 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 case 0x3: // CC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109 res = (psr & PS_C) == 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111 case 0x4: // MI
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 res = (psr & PS_N) != 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 case 0x5: // PL
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 res = (psr & PS_N) == 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 case 0x6: // VS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 res = (psr & PS_V) != 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120 case 0x7: // VC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 res = (psr & PS_V) == 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 case 0x8: // HI
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 2
diff changeset
124 res = ((psr & PS_C) != 0) && ((psr & PS_Z) == 0);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 case 0x9: // LS
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 2
diff changeset
127 res = ((psr & PS_C) == 0) || ((psr & PS_Z) != 0);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 case 0xA: // GE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 res = ((psr & (PS_N|PS_V)) == (PS_N|PS_V)) ||
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 ((psr & (PS_N|PS_V)) == 0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 case 0xB: // LT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134 res = ((psr & (PS_N|PS_V)) == PS_N) ||
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 ((psr & (PS_N|PS_V)) == PS_V);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 case 0xC: // GT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138 res = ((psr & (PS_N|PS_V)) == (PS_N|PS_V)) ||
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 ((psr & (PS_N|PS_V)) == 0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 res = ((psr & PS_Z) == 0) && res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 case 0xD: // LE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 res = ((psr & (PS_N|PS_V)) == PS_N) ||
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 ((psr & (PS_N|PS_V)) == PS_V);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 res = ((psr & PS_Z) == PS_Z) || res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 case 0xE: // AL
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148 res = TRUE;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150 case 0xF: // NV
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 res = FALSE;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 static unsigned long
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 RmShifted(int shift)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 unsigned long Rm = get_register(shift & 0x00F);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 int shift_count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 if ((shift & 0x010) == 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 shift_count = (shift & 0xF80) >> 7;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 shift_count = get_register((shift & 0xF00) >> 8);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167 switch ((shift & 0x060) >> 5) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 case 0x0: // Logical left
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169 Rm <<= shift_count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 case 0x1: // Logical right
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 Rm >>= shift_count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174 case 0x2: // Arithmetic right
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175 Rm = (unsigned long)((long)Rm >> shift_count);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 case 0x3: // Rotate right
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178 if (shift_count == 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179 // Special case, RORx
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180 Rm >>= 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 if (get_register(PS) & PS_C) Rm |= 0x80000000;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183 Rm = (Rm >> shift_count) | (Rm << (32-shift_count));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
184 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187 return Rm;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190 // Decide the next instruction to be executed for a given instruction
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191 static unsigned long *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 target_ins(unsigned long *pc, unsigned long ins)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
194 unsigned long new_pc, offset, op2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195 unsigned long Rn;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196 int i, reg_count, c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197 switch ((ins & 0x0C000000) >> 26) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 case 0x0:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 // Data processing
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200 new_pc = (unsigned long)(pc+1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
201 if ((ins & 0x0000F000) == 0x0000F000) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
202 // Destination register is PC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
203 if ((ins & 0x0FBF0000) != 0x010F0000) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204 Rn = (unsigned long)get_register((ins & 0x000F0000) >> 16);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205 if ((ins & 0x02000000) == 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206 op2 = RmShifted(ins & 0x00000FFF);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
208 op2 = ins & 0x000000FF;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209 i = (ins & 0x00000F00) >> 8; // Rotate count
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210 op2 = (op2 >> (i*2)) | (op2 << (32-(i*2)));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
212 switch ((ins & 0x01E00000) >> 21) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213 case 0x0: // AND
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214 new_pc = Rn & op2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
215 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216 case 0x1: // EOR
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
217 new_pc = Rn ^ op2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
219 case 0x2: // SUB
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
220 new_pc = Rn - op2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
221 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
222 case 0x3: // RSB
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
223 new_pc = op2 - Rn;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
224 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225 case 0x4: // ADD
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226 new_pc = Rn + op2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 case 0x5: // ADC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229 c = (get_register(PS) & PS_C) != 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 new_pc = Rn + op2 + c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
232 case 0x6: // SBC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 c = (get_register(PS) & PS_C) != 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234 new_pc = Rn - op2 + c - 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
235 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 case 0x7: // RSC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237 c = (get_register(PS) & PS_C) != 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238 new_pc = op2 - Rn +c - 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240 case 0x8: // TST
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241 case 0x9: // TEQ
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 case 0xA: // CMP
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243 case 0xB: // CMN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244 break; // PC doesn't change
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 case 0xC: // ORR
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
246 new_pc = Rn | op2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 case 0xD: // MOV
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 new_pc = op2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 case 0xE: // BIC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 new_pc = Rn & ~op2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254 case 0xF: // MVN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 new_pc = ~op2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260 return ((unsigned long *)new_pc);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261 case 0x1:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262 if ((ins & 0x02000010) == 0x02000010) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 // Undefined!
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 return (pc+1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266 if ((ins & 0x00100000) == 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267 // STR
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 return (pc+1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270 // LDR
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
271 if ((ins & 0x0000F000) != 0x0000F000) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
272 // Rd not PC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 return (pc+1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
274 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
275 Rn = (unsigned long)get_register((ins & 0x000F0000) >> 16);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276 if ((ins & 0x000F0000) == 0x000F0000) Rn += 8; // PC prefetch!
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
277 if (ins & 0x01000000) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278 // Add/subtract offset before
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 if ((ins & 0x02000000) == 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280 // Immediate offset
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
281 if (ins & 0x00800000) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282 // Add offset
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283 Rn += (ins & 0x00000FFF);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
284 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
285 // Subtract offset
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
286 Rn -= (ins & 0x00000FFF);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
287 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
288 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
289 // Offset is in a register
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
290 if (ins & 0x00800000) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
291 // Add offset
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
292 Rn += RmShifted(ins & 0x00000FFF);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
293 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
294 // Subtract offset
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
295 Rn -= RmShifted(ins & 0x00000FFF);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
296 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
297 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
298 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
299 return ((unsigned long *)*(unsigned long *)Rn);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
300 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
301 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
302 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
303 return (pc+1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
304 case 0x2: // Branch, LDM/STM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
305 if ((ins & 0x02000000) == 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
306 // LDM/STM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
307 if ((ins & 0x00100000) == 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
308 // STM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
309 return (pc+1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
310 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
311 // LDM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
312 if ((ins & 0x00008000) == 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
313 // PC not in list
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
314 return (pc+1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
315 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
316 Rn = (unsigned long)get_register((ins & 0x000F0000) >> 16);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
317 if ((ins & 0x000F0000) == 0x000F0000) Rn += 8; // PC prefetch!
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
318 offset = ins & 0x0000FFFF;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
319 reg_count = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
320 for (i = 0; i < 15; i++) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
321 if (offset & (1<<i)) reg_count++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
322 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
323 if (ins & 0x00800000) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
324 // Add offset
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
325 Rn += reg_count*4;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
326 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
327 // Subtract offset
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
328 Rn -= 4;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
329 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
330 return ((unsigned long *)*(unsigned long *)Rn);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
331 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
332 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
333 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
334 // Branch
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 2
diff changeset
335 if (ins_will_execute(ins)) {
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 2
diff changeset
336 offset = (ins & 0x00FFFFFF) << 2;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 2
diff changeset
337 if (ins & 0x00800000) offset |= 0xFC000000; // sign extend
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 2
diff changeset
338 new_pc = (unsigned long)(pc+2) + offset;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 2
diff changeset
339 return ((unsigned long *)new_pc);
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 2
diff changeset
340 } else {
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 2
diff changeset
341 // Falls through
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 2
diff changeset
342 return (pc+1);
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 2
diff changeset
343 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
344 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
345 case 0x3: // Coprocessor & SWI
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
346 return (pc+1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
347 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
348 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
349
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
350 void __single_step (void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
351 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
352 unsigned long *pc = (unsigned long *)get_register(PC);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
353 unsigned long curins = *pc;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
354 if (ins_will_execute(curins)) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
355 // Decode instruction to decide what the next PC will be
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
356 ss_saved_pc = target_ins(pc, curins);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
357 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
358 // The current instruction will not execute (the conditions don't hold)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
359 ss_saved_pc = (pc+1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
360 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
361 // For now
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
362 ss_saved_instr = *ss_saved_pc;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
363 *ss_saved_pc = 0xE7FFDEFF; // As used by ARM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
364 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
365
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
366 /* Clear the single-step state. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
367
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
368 void __clear_single_step (void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
369 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
370 if (ss_saved_pc != NULL_PTR) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
371 *ss_saved_pc = ss_saved_instr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
372 ss_saved_pc = NULL_PTR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
373 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
374 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
375
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
376 void __install_breakpoints (void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
377 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
378 // FIXME();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
379 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
380
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
381 void __clear_breakpoints (void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
382 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
383 // FIXME();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
384 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
385
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
386 /* If the breakpoint we hit is in the breakpoint() instruction, return a
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
387 non-zero value. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
388
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
389 int
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
390 __is_breakpoint_function ()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
391 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
392 return get_register (PC) == (target_register_t)&CYG_LABEL_NAME(breakinst);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
393 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
394
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
395
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
396 /* Skip the current instruction. Since this is only called by the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
397 stub when the PC points to a breakpoint or trap instruction,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
398 we can safely just skip 4. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
399
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
400 void __skipinst (void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
401 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
402 put_register (PC, get_register (PC) + 4);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
403 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
404
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 34
diff changeset
405
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
406 #endif // CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS