diff options
Diffstat (limited to 'include/asm-xtensa/xtensa/hal.h')
-rw-r--r-- | include/asm-xtensa/xtensa/hal.h | 822 |
1 files changed, 822 insertions, 0 deletions
diff --git a/include/asm-xtensa/xtensa/hal.h b/include/asm-xtensa/xtensa/hal.h new file mode 100644 index 000000000000..d10472505454 --- /dev/null +++ b/include/asm-xtensa/xtensa/hal.h | |||
@@ -0,0 +1,822 @@ | |||
1 | #ifndef XTENSA_HAL_H | ||
2 | #define XTENSA_HAL_H | ||
3 | |||
4 | /* | ||
5 | * THIS FILE IS GENERATED -- DO NOT MODIFY BY HAND | ||
6 | * | ||
7 | * include/asm-xtensa/xtensa/hal.h -- contains a definition of the | ||
8 | * Core HAL interface. | ||
9 | * | ||
10 | * All definitions in this header file are independent of any specific | ||
11 | * Xtensa processor configuration. Thus an OS or other software can | ||
12 | * include this header file and be compiled into configuration- | ||
13 | * independent objects that can be distributed and eventually linked | ||
14 | * to the HAL library (libhal.a) to create a configuration-specific | ||
15 | * final executable. | ||
16 | * | ||
17 | * Certain definitions, however, are release-specific -- such as the | ||
18 | * XTHAL_RELEASE_xxx macros (or additions made in later releases). | ||
19 | * | ||
20 | * This file is subject to the terms and conditions of the GNU General Public | ||
21 | * License. See the file "COPYING" in the main directory of this archive | ||
22 | * for more details. | ||
23 | * | ||
24 | * Copyright (C) 2002 Tensilica Inc. | ||
25 | */ | ||
26 | |||
27 | |||
28 | /*---------------------------------------------------------------------- | ||
29 | Constant Definitions | ||
30 | (shared with assembly) | ||
31 | ----------------------------------------------------------------------*/ | ||
32 | |||
33 | /* Software release information (not configuration-specific!): */ | ||
34 | #define XTHAL_RELEASE_MAJOR 1050 | ||
35 | #define XTHAL_RELEASE_MINOR 0 | ||
36 | #define XTHAL_RELEASE_NAME "T1050.0-2002-08-06-eng0" | ||
37 | #define XTHAL_RELEASE_INTERNAL "2002-08-06-eng0" | ||
38 | #define XTHAL_REL_T1050 1 | ||
39 | #define XTHAL_REL_T1050_0 1 | ||
40 | #define XTHAL_REL_T1050_0_2002 1 | ||
41 | #define XTHAL_REL_T1050_0_2002_08 1 | ||
42 | #define XTHAL_REL_T1050_0_2002_08_06 1 | ||
43 | #define XTHAL_REL_T1050_0_2002_08_06_ENG0 1 | ||
44 | |||
45 | /* HAL version numbers (these names are for backward compatibility): */ | ||
46 | #define XTHAL_MAJOR_REV XTHAL_RELEASE_MAJOR | ||
47 | #define XTHAL_MINOR_REV XTHAL_RELEASE_MINOR | ||
48 | /* | ||
49 | * A bit of software release history on values of XTHAL_{MAJOR,MINOR}_REV: | ||
50 | * | ||
51 | * Release MAJOR MINOR Comment | ||
52 | * ======= ===== ===== ======= | ||
53 | * T1015.n n/a n/a (HAL not yet available) | ||
54 | * T1020.{0,1,2} 0 1 (HAL beta) | ||
55 | * T1020.{3,4} 0 2 First release. | ||
56 | * T1020.n (n>4) 0 2 or >3 (TBD) | ||
57 | * T1030.0 0 1 (HAL beta) | ||
58 | * T1030.{1,2} 0 3 Equivalent to first release. | ||
59 | * T1030.n (n>=3) 0 >= 3 (TBD) | ||
60 | * T1040.n 1040 n Full CHAL available from T1040.2 | ||
61 | * T1050.n 1050 n Current release. | ||
62 | * | ||
63 | * | ||
64 | * Note: there is a distinction between the software release with | ||
65 | * which something is compiled (accessible using XTHAL_RELEASE_* macros) | ||
66 | * and the software release with which the HAL library was compiled | ||
67 | * (accessible using Xthal_release_* global variables). This | ||
68 | * distinction is particularly relevant for vendors that distribute | ||
69 | * configuration-independent binaries (eg. an OS), where their customer | ||
70 | * might link it with a HAL of a different Xtensa software release. | ||
71 | * In this case, it may be appropriate for the OS to verify at run-time | ||
72 | * whether XTHAL_RELEASE_* and Xthal_release_* are compatible. | ||
73 | * [Guidelines as to which release is compatible with which are not | ||
74 | * currently provided explicitly, but might be inferred from reading | ||
75 | * OSKit documentation for all releases -- compatibility is also highly | ||
76 | * dependent on which HAL features are used. Each release is usually | ||
77 | * backward compatible, with very few exceptions if any.] | ||
78 | * | ||
79 | * Notes: | ||
80 | * Tornado 2.0 supported in T1020.3+, T1030.1+, and T1040.{0,1} only. | ||
81 | * Tornado 2.0.2 supported in T1040.2+, and T1050. | ||
82 | * Compile-time HAL port of NucleusPlus supported by T1040.2+ and T1050. | ||
83 | */ | ||
84 | |||
85 | |||
86 | /* | ||
87 | * Architectural limits, independent of configuration. | ||
88 | * Note that these are ISA-defined limits, not micro-architecture implementation | ||
89 | * limits enforced by the Xtensa Processor Generator (which may be stricter than | ||
90 | * these below). | ||
91 | */ | ||
92 | #define XTHAL_MAX_CPS 8 /* max number of coprocessors (0..7) */ | ||
93 | #define XTHAL_MAX_INTERRUPTS 32 /* max number of interrupts (0..31) */ | ||
94 | #define XTHAL_MAX_INTLEVELS 16 /* max number of interrupt levels (0..15) */ | ||
95 | /* (as of T1040, implementation limit is 7: 0..6) */ | ||
96 | #define XTHAL_MAX_TIMERS 4 /* max number of timers (CCOMPARE0..CCOMPARE3) */ | ||
97 | /* (as of T1040, implementation limit is 3: 0..2) */ | ||
98 | |||
99 | /* Misc: */ | ||
100 | #define XTHAL_LITTLEENDIAN 0 | ||
101 | #define XTHAL_BIGENDIAN 1 | ||
102 | |||
103 | |||
104 | /* Interrupt types: */ | ||
105 | #define XTHAL_INTTYPE_UNCONFIGURED 0 | ||
106 | #define XTHAL_INTTYPE_SOFTWARE 1 | ||
107 | #define XTHAL_INTTYPE_EXTERN_EDGE 2 | ||
108 | #define XTHAL_INTTYPE_EXTERN_LEVEL 3 | ||
109 | #define XTHAL_INTTYPE_TIMER 4 | ||
110 | #define XTHAL_INTTYPE_NMI 5 | ||
111 | #define XTHAL_MAX_INTTYPES 6 /* number of interrupt types */ | ||
112 | |||
113 | /* Timer related: */ | ||
114 | #define XTHAL_TIMER_UNCONFIGURED -1 /* Xthal_timer_interrupt[] value for non-existent timers */ | ||
115 | #define XTHAL_TIMER_UNASSIGNED XTHAL_TIMER_UNCONFIGURED /* (for backwards compatibility only) */ | ||
116 | |||
117 | |||
118 | /* Access Mode bits (tentative): */ /* bit abbr unit short_name PPC equ - Description */ | ||
119 | #define XTHAL_AMB_EXCEPTION 0 /* 001 E EX fls: EXception none - generate exception on any access (aka "illegal") */ | ||
120 | #define XTHAL_AMB_HITCACHE 1 /* 002 C CH fls: use Cache on Hit ~(I CI) - use cache on hit -- way from tag match [or H HC, or U UC] (ISA: same, except for Isolate case) */ | ||
121 | #define XTHAL_AMB_ALLOCATE 2 /* 004 A AL fl?: ALlocate none - refill cache on miss -- way from LRU [or F FI fill] (ISA: Read/Write Miss Refill) */ | ||
122 | #define XTHAL_AMB_WRITETHRU 3 /* 008 W WT --s: WriteThrough W WT - store immediately to memory (ISA: same) */ | ||
123 | #define XTHAL_AMB_ISOLATE 4 /* 010 I IS fls: ISolate none - use cache regardless of hit-vs-miss -- way from vaddr (ISA: use-cache-on-miss+hit) */ | ||
124 | #define XTHAL_AMB_GUARD 5 /* 020 G GU ?l?: GUard G * - non-speculative; spec/replay refs not permitted */ | ||
125 | #if 0 | ||
126 | #define XTHAL_AMB_ORDERED x /* 000 O OR fls: ORdered G * - mem accesses cannot be out of order */ | ||
127 | #define XTHAL_AMB_FUSEWRITES x /* 000 F FW --s: FuseWrites none - allow combining/merging multiple writes (to same datapath data unit) into one (implied by writeback) */ | ||
128 | #define XTHAL_AMB_COHERENT x /* 000 M MC fl?: Mem/MP Coherent M - on reads, other CPUs/bus-masters may need to supply data */ | ||
129 | #define XTHAL_AMB_TRUSTED x /* 000 T TR ?l?: TRusted none - memory will not bus error (if it does, handle as fatal imprecise interrupt) */ | ||
130 | #define XTHAL_AMB_PREFETCH x /* 000 P PR fl?: PRefetch none - on refill, read line+1 into prefetch buffers */ | ||
131 | #define XTHAL_AMB_STREAM x /* 000 S ST ???: STreaming none - access one of N stream buffers */ | ||
132 | #endif /*0*/ | ||
133 | |||
134 | #define XTHAL_AM_EXCEPTION (1<<XTHAL_AMB_EXCEPTION) | ||
135 | #define XTHAL_AM_HITCACHE (1<<XTHAL_AMB_HITCACHE) | ||
136 | #define XTHAL_AM_ALLOCATE (1<<XTHAL_AMB_ALLOCATE) | ||
137 | #define XTHAL_AM_WRITETHRU (1<<XTHAL_AMB_WRITETHRU) | ||
138 | #define XTHAL_AM_ISOLATE (1<<XTHAL_AMB_ISOLATE) | ||
139 | #define XTHAL_AM_GUARD (1<<XTHAL_AMB_GUARD) | ||
140 | #if 0 | ||
141 | #define XTHAL_AM_ORDERED (1<<XTHAL_AMB_ORDERED) | ||
142 | #define XTHAL_AM_FUSEWRITES (1<<XTHAL_AMB_FUSEWRITES) | ||
143 | #define XTHAL_AM_COHERENT (1<<XTHAL_AMB_COHERENT) | ||
144 | #define XTHAL_AM_TRUSTED (1<<XTHAL_AMB_TRUSTED) | ||
145 | #define XTHAL_AM_PREFETCH (1<<XTHAL_AMB_PREFETCH) | ||
146 | #define XTHAL_AM_STREAM (1<<XTHAL_AMB_STREAM) | ||
147 | #endif /*0*/ | ||
148 | |||
149 | /* | ||
150 | * Allowed Access Modes (bit combinations). | ||
151 | * | ||
152 | * Columns are: | ||
153 | * "FOGIWACE" | ||
154 | * Access mode bits (see XTHAL_AMB_xxx above). | ||
155 | * <letter> = bit is set | ||
156 | * '-' = bit is clear | ||
157 | * '.' = bit is irrelevant / don't care, as follows: | ||
158 | * E=1 makes all others irrelevant | ||
159 | * W,F relevant only for stores | ||
160 | * "2345" | ||
161 | * Indicates which Xtensa releases support the corresponding | ||
162 | * access mode. Releases for each character column are: | ||
163 | * 2 = prior to T1020.2: T1015 (V1.5), T1020.0, T1020.1 | ||
164 | * 3 = T1020.2 and later: T1020.2+, T1030 | ||
165 | * 4 = T1040 | ||
166 | * 5 = T1050 (maybe) | ||
167 | * And the character column contents are: | ||
168 | * <number> = support by release(s) | ||
169 | * "." = unsupported by release(s) | ||
170 | * "?" = support unknown | ||
171 | */ | ||
172 | /* FOGIWACE 2345 */ | ||
173 | /* For instruction fetch: */ | ||
174 | #define XTHAL_FAM_EXCEPTION 0x001 /* .......E 2345 exception */ | ||
175 | #define XTHAL_FAM_ISOLATE 0x012 /* .--I.-C- .... isolate */ | ||
176 | #define XTHAL_FAM_BYPASS 0x000 /* .---.--- 2345 bypass */ | ||
177 | #define XTHAL_FAM_NACACHED 0x002 /* .---.-C- .... cached no-allocate (frozen) */ | ||
178 | #define XTHAL_FAM_CACHED 0x006 /* .---.AC- 2345 cached */ | ||
179 | /* For data load: */ | ||
180 | #define XTHAL_LAM_EXCEPTION 0x001 /* .......E 2345 exception */ | ||
181 | #define XTHAL_LAM_ISOLATE 0x012 /* .--I.-C- 2345 isolate */ | ||
182 | #define XTHAL_LAM_BYPASS 0x000 /* .O--.--- 2... bypass speculative */ | ||
183 | #define XTHAL_LAM_BYPASSG 0x020 /* .OG-.--- .345 bypass guarded */ | ||
184 | #define XTHAL_LAM_NACACHED 0x002 /* .O--.-C- 2... cached no-allocate speculative */ | ||
185 | #define XTHAL_LAM_NACACHEDG 0x022 /* .OG-.-C- .345 cached no-allocate guarded */ | ||
186 | #define XTHAL_LAM_CACHED 0x006 /* .---.AC- 2345 cached speculative */ | ||
187 | #define XTHAL_LAM_CACHEDG 0x026 /* .?G-.AC- .... cached guarded */ | ||
188 | /* For data store: */ | ||
189 | #define XTHAL_SAM_EXCEPTION 0x001 /* .......E 2345 exception */ | ||
190 | #define XTHAL_SAM_ISOLATE 0x032 /* .-GI--C- 2345 isolate */ | ||
191 | #define XTHAL_SAM_BYPASS 0x028 /* -OG-W--- 2345 bypass */ | ||
192 | /*efine XTHAL_SAM_BYPASSF 0x028*/ /* F-G-W--- ...? bypass write-combined */ | ||
193 | #define XTHAL_SAM_WRITETHRU 0x02A /* -OG-W-C- 234? writethrough */ | ||
194 | /*efine XTHAL_SAM_WRITETHRUF 0x02A*/ /* F-G-W-C- ...5 writethrough write-combined */ | ||
195 | #define XTHAL_SAM_WRITEALLOC 0x02E /* -OG-WAC- ...? writethrough-allocate */ | ||
196 | /*efine XTHAL_SAM_WRITEALLOCF 0x02E*/ /* F-G-WAC- ...? writethrough-allocate write-combined */ | ||
197 | #define XTHAL_SAM_WRITEBACK 0x026 /* F-G--AC- ...5 writeback */ | ||
198 | |||
199 | #if 0 | ||
200 | /* | ||
201 | Cache attribute encoding for CACHEATTR (per ISA): | ||
202 | (Note: if this differs from ISA Ref Manual, ISA has precedence) | ||
203 | |||
204 | Inst-fetches Loads Stores | ||
205 | ------------- ------------ ------------- | ||
206 | 0x0 FCA_EXCEPTION ?LCA_NACACHED_G* SCA_WRITETHRU "uncached" | ||
207 | 0x1 FCA_CACHED LCA_CACHED SCA_WRITETHRU cached | ||
208 | 0x2 FCA_BYPASS LCA_BYPASS_G* SCA_BYPASS bypass | ||
209 | 0x3 FCA_CACHED LCA_CACHED SCA_WRITEALLOCF write-allocate | ||
210 | or LCA_EXCEPTION SCA_EXCEPTION (if unimplemented) | ||
211 | 0x4 FCA_CACHED LCA_CACHED SCA_WRITEBACK write-back | ||
212 | or LCA_EXCEPTION SCA_EXCEPTION (if unimplemented) | ||
213 | 0x5..D FCA_EXCEPTION LCA_EXCEPTION SCA_EXCEPTION (reserved) | ||
214 | 0xE FCA_EXCEPTION LCA_ISOLATE SCA_ISOLATE isolate | ||
215 | 0xF FCA_EXCEPTION LCA_EXCEPTION SCA_EXCEPTION illegal | ||
216 | * Prior to T1020.2?, guard feature not supported, this defaulted to speculative (no _G) | ||
217 | */ | ||
218 | #endif /*0*/ | ||
219 | |||
220 | |||
221 | #if !defined(__ASSEMBLY__) && !defined(_NOCLANGUAGE) | ||
222 | #ifdef __cplusplus | ||
223 | extern "C" { | ||
224 | #endif | ||
225 | |||
226 | /*---------------------------------------------------------------------- | ||
227 | HAL | ||
228 | ----------------------------------------------------------------------*/ | ||
229 | |||
230 | /* Constant to be checked in build = (XTHAL_MAJOR_REV<<16)|XTHAL_MINOR_REV */ | ||
231 | extern const unsigned int Xthal_rev_no; | ||
232 | |||
233 | |||
234 | /*---------------------------------------------------------------------- | ||
235 | Processor State | ||
236 | ----------------------------------------------------------------------*/ | ||
237 | /* save & restore the extra processor state */ | ||
238 | extern void xthal_save_extra(void *base); | ||
239 | extern void xthal_restore_extra(void *base); | ||
240 | |||
241 | extern void xthal_save_cpregs(void *base, int); | ||
242 | extern void xthal_restore_cpregs(void *base, int); | ||
243 | |||
244 | /*extern void xthal_save_all_extra(void *base);*/ | ||
245 | /*extern void xthal_restore_all_extra(void *base);*/ | ||
246 | |||
247 | /* space for processor state */ | ||
248 | extern const unsigned int Xthal_extra_size; | ||
249 | extern const unsigned int Xthal_extra_align; | ||
250 | /* space for TIE register files */ | ||
251 | extern const unsigned int Xthal_cpregs_size[XTHAL_MAX_CPS]; | ||
252 | extern const unsigned int Xthal_cpregs_align[XTHAL_MAX_CPS]; | ||
253 | |||
254 | /* total of space for the processor state (for Tor2) */ | ||
255 | extern const unsigned int Xthal_all_extra_size; | ||
256 | extern const unsigned int Xthal_all_extra_align; | ||
257 | |||
258 | /* initialize the extra processor */ | ||
259 | /*extern void xthal_init_extra(void);*/ | ||
260 | /* initialize the TIE coprocessor */ | ||
261 | /*extern void xthal_init_cp(int);*/ | ||
262 | |||
263 | /* initialize the extra processor */ | ||
264 | extern void xthal_init_mem_extra(void *); | ||
265 | /* initialize the TIE coprocessor */ | ||
266 | extern void xthal_init_mem_cp(void *, int); | ||
267 | |||
268 | /* validate & invalidate the TIE register file */ | ||
269 | extern void xthal_validate_cp(int); | ||
270 | extern void xthal_invalidate_cp(int); | ||
271 | |||
272 | /* the number of TIE coprocessors contiguous from zero (for Tor2) */ | ||
273 | extern const unsigned int Xthal_num_coprocessors; | ||
274 | |||
275 | /* actual number of coprocessors */ | ||
276 | extern const unsigned char Xthal_cp_num; | ||
277 | /* index of highest numbered coprocessor, plus one */ | ||
278 | extern const unsigned char Xthal_cp_max; | ||
279 | /* index of highest allowed coprocessor number, per cfg, plus one */ | ||
280 | /*extern const unsigned char Xthal_cp_maxcfg;*/ | ||
281 | /* bitmask of which coprocessors are present */ | ||
282 | extern const unsigned int Xthal_cp_mask; | ||
283 | |||
284 | /* read and write cpenable register */ | ||
285 | extern void xthal_set_cpenable(unsigned); | ||
286 | extern unsigned xthal_get_cpenable(void); | ||
287 | |||
288 | /* read & write extra state register */ | ||
289 | /*extern int xthal_read_extra(void *base, unsigned reg, unsigned *value);*/ | ||
290 | /*extern int xthal_write_extra(void *base, unsigned reg, unsigned value);*/ | ||
291 | |||
292 | /* read & write a TIE coprocessor register */ | ||
293 | /*extern int xthal_read_cpreg(void *base, int cp, unsigned reg, unsigned *value);*/ | ||
294 | /*extern int xthal_write_cpreg(void *base, int cp, unsigned reg, unsigned value);*/ | ||
295 | |||
296 | /* return coprocessor number based on register */ | ||
297 | /*extern int xthal_which_cp(unsigned reg);*/ | ||
298 | |||
299 | /*---------------------------------------------------------------------- | ||
300 | Interrupts | ||
301 | ----------------------------------------------------------------------*/ | ||
302 | |||
303 | /* the number of interrupt levels */ | ||
304 | extern const unsigned char Xthal_num_intlevels; | ||
305 | /* the number of interrupts */ | ||
306 | extern const unsigned char Xthal_num_interrupts; | ||
307 | |||
308 | /* mask for level of interrupts */ | ||
309 | extern const unsigned int Xthal_intlevel_mask[XTHAL_MAX_INTLEVELS]; | ||
310 | /* mask for level 0 to N interrupts */ | ||
311 | extern const unsigned int Xthal_intlevel_andbelow_mask[XTHAL_MAX_INTLEVELS]; | ||
312 | |||
313 | /* level of each interrupt */ | ||
314 | extern const unsigned char Xthal_intlevel[XTHAL_MAX_INTERRUPTS]; | ||
315 | |||
316 | /* type per interrupt */ | ||
317 | extern const unsigned char Xthal_inttype[XTHAL_MAX_INTERRUPTS]; | ||
318 | |||
319 | /* masks of each type of interrupt */ | ||
320 | extern const unsigned int Xthal_inttype_mask[XTHAL_MAX_INTTYPES]; | ||
321 | |||
322 | /* interrupt numbers assigned to each timer interrupt */ | ||
323 | extern const int Xthal_timer_interrupt[XTHAL_MAX_TIMERS]; | ||
324 | |||
325 | /*** Virtual interrupt prioritization: ***/ | ||
326 | |||
327 | /* Convert between interrupt levels (as per PS.INTLEVEL) and virtual interrupt priorities: */ | ||
328 | extern unsigned xthal_vpri_to_intlevel(unsigned vpri); | ||
329 | extern unsigned xthal_intlevel_to_vpri(unsigned intlevel); | ||
330 | |||
331 | /* Enables/disables given set (mask) of interrupts; returns previous enabled-mask of all ints: */ | ||
332 | extern unsigned xthal_int_enable(unsigned); | ||
333 | extern unsigned xthal_int_disable(unsigned); | ||
334 | |||
335 | /* Set/get virtual priority of an interrupt: */ | ||
336 | extern int xthal_set_int_vpri(int intnum, int vpri); | ||
337 | extern int xthal_get_int_vpri(int intnum); | ||
338 | |||
339 | /* Set/get interrupt lockout level for exclusive access to virtual priority data structures: */ | ||
340 | extern void xthal_set_vpri_locklevel(unsigned intlevel); | ||
341 | extern unsigned xthal_get_vpri_locklevel(void); | ||
342 | |||
343 | /* Set/get current virtual interrupt priority: */ | ||
344 | extern unsigned xthal_set_vpri(unsigned vpri); | ||
345 | extern unsigned xthal_get_vpri(unsigned vpri); | ||
346 | extern unsigned xthal_set_vpri_intlevel(unsigned intlevel); | ||
347 | extern unsigned xthal_set_vpri_lock(void); | ||
348 | |||
349 | |||
350 | |||
351 | /*---------------------------------------------------------------------- | ||
352 | Generic Interrupt Trampolining Support | ||
353 | ----------------------------------------------------------------------*/ | ||
354 | |||
355 | typedef void (XtHalVoidFunc)(void); | ||
356 | |||
357 | /* | ||
358 | * Bitmask of interrupts currently trampolining down: | ||
359 | */ | ||
360 | extern unsigned Xthal_tram_pending; | ||
361 | |||
362 | /* | ||
363 | * Bitmask of which interrupts currently trampolining down | ||
364 | * synchronously are actually enabled; this bitmask is necessary | ||
365 | * because INTENABLE cannot hold that state (sync-trampolining | ||
366 | * interrupts must be kept disabled while trampolining); | ||
367 | * in the current implementation, any bit set here is not set | ||
368 | * in INTENABLE, and vice-versa; once a sync-trampoline is | ||
369 | * handled (at level one), its enable bit must be moved from | ||
370 | * here to INTENABLE: | ||
371 | */ | ||
372 | extern unsigned Xthal_tram_enabled; | ||
373 | |||
374 | /* | ||
375 | * Bitmask of interrupts configured for sync trampolining: | ||
376 | */ | ||
377 | extern unsigned Xthal_tram_sync; | ||
378 | |||
379 | |||
380 | /* Trampoline support functions: */ | ||
381 | extern unsigned xthal_tram_pending_to_service( void ); | ||
382 | extern void xthal_tram_done( unsigned serviced_mask ); | ||
383 | extern int xthal_tram_set_sync( int intnum, int sync ); | ||
384 | extern XtHalVoidFunc* xthal_set_tram_trigger_func( XtHalVoidFunc *trigger_fn ); | ||
385 | |||
386 | /* INTENABLE,INTREAD,INTSET,INTCLEAR register access functions: */ | ||
387 | extern unsigned xthal_get_intenable( void ); | ||
388 | extern void xthal_set_intenable( unsigned ); | ||
389 | extern unsigned xthal_get_intread( void ); | ||
390 | extern void xthal_set_intset( unsigned ); | ||
391 | extern void xthal_set_intclear( unsigned ); | ||
392 | |||
393 | |||
394 | /*---------------------------------------------------------------------- | ||
395 | Register Windows | ||
396 | ----------------------------------------------------------------------*/ | ||
397 | |||
398 | /* number of registers in register window */ | ||
399 | extern const unsigned int Xthal_num_aregs; | ||
400 | extern const unsigned char Xthal_num_aregs_log2; | ||
401 | |||
402 | /* This spill any live register windows (other than the caller's): */ | ||
403 | extern void xthal_window_spill( void ); | ||
404 | |||
405 | |||
406 | /*---------------------------------------------------------------------- | ||
407 | Cache | ||
408 | ----------------------------------------------------------------------*/ | ||
409 | |||
410 | /* size of the cache lines in log2(bytes) */ | ||
411 | extern const unsigned char Xthal_icache_linewidth; | ||
412 | extern const unsigned char Xthal_dcache_linewidth; | ||
413 | /* size of the cache lines in bytes */ | ||
414 | extern const unsigned short Xthal_icache_linesize; | ||
415 | extern const unsigned short Xthal_dcache_linesize; | ||
416 | /* number of cache sets in log2(lines per way) */ | ||
417 | extern const unsigned char Xthal_icache_setwidth; | ||
418 | extern const unsigned char Xthal_dcache_setwidth; | ||
419 | /* cache set associativity (number of ways) */ | ||
420 | extern const unsigned int Xthal_icache_ways; | ||
421 | extern const unsigned int Xthal_dcache_ways; | ||
422 | /* size of the caches in bytes (ways * 2^(linewidth + setwidth)) */ | ||
423 | extern const unsigned int Xthal_icache_size; | ||
424 | extern const unsigned int Xthal_dcache_size; | ||
425 | /* cache features */ | ||
426 | extern const unsigned char Xthal_dcache_is_writeback; | ||
427 | extern const unsigned char Xthal_icache_line_lockable; | ||
428 | extern const unsigned char Xthal_dcache_line_lockable; | ||
429 | |||
430 | /* cache attribute register control (used by other HAL routines) */ | ||
431 | extern unsigned xthal_get_cacheattr( void ); | ||
432 | extern unsigned xthal_get_icacheattr( void ); | ||
433 | extern unsigned xthal_get_dcacheattr( void ); | ||
434 | extern void xthal_set_cacheattr( unsigned ); | ||
435 | extern void xthal_set_icacheattr( unsigned ); | ||
436 | extern void xthal_set_dcacheattr( unsigned ); | ||
437 | |||
438 | /* initialize cache support (must be called once at startup, before all other cache calls) */ | ||
439 | /*extern void xthal_cache_startinit( void );*/ | ||
440 | /* reset caches */ | ||
441 | /*extern void xthal_icache_reset( void );*/ | ||
442 | /*extern void xthal_dcache_reset( void );*/ | ||
443 | /* enable caches */ | ||
444 | extern void xthal_icache_enable( void ); /* DEPRECATED */ | ||
445 | extern void xthal_dcache_enable( void ); /* DEPRECATED */ | ||
446 | /* disable caches */ | ||
447 | extern void xthal_icache_disable( void ); /* DEPRECATED */ | ||
448 | extern void xthal_dcache_disable( void ); /* DEPRECATED */ | ||
449 | |||
450 | /* invalidate the caches */ | ||
451 | extern void xthal_icache_all_invalidate( void ); | ||
452 | extern void xthal_dcache_all_invalidate( void ); | ||
453 | extern void xthal_icache_region_invalidate( void *addr, unsigned size ); | ||
454 | extern void xthal_dcache_region_invalidate( void *addr, unsigned size ); | ||
455 | extern void xthal_icache_line_invalidate(void *addr); | ||
456 | extern void xthal_dcache_line_invalidate(void *addr); | ||
457 | /* write dirty data back */ | ||
458 | extern void xthal_dcache_all_writeback( void ); | ||
459 | extern void xthal_dcache_region_writeback( void *addr, unsigned size ); | ||
460 | extern void xthal_dcache_line_writeback(void *addr); | ||
461 | /* write dirty data back and invalidate */ | ||
462 | extern void xthal_dcache_all_writeback_inv( void ); | ||
463 | extern void xthal_dcache_region_writeback_inv( void *addr, unsigned size ); | ||
464 | extern void xthal_dcache_line_writeback_inv(void *addr); | ||
465 | /* prefetch and lock specified memory range into cache */ | ||
466 | extern void xthal_icache_region_lock( void *addr, unsigned size ); | ||
467 | extern void xthal_dcache_region_lock( void *addr, unsigned size ); | ||
468 | extern void xthal_icache_line_lock(void *addr); | ||
469 | extern void xthal_dcache_line_lock(void *addr); | ||
470 | /* unlock from cache */ | ||
471 | extern void xthal_icache_all_unlock( void ); | ||
472 | extern void xthal_dcache_all_unlock( void ); | ||
473 | extern void xthal_icache_region_unlock( void *addr, unsigned size ); | ||
474 | extern void xthal_dcache_region_unlock( void *addr, unsigned size ); | ||
475 | extern void xthal_icache_line_unlock(void *addr); | ||
476 | extern void xthal_dcache_line_unlock(void *addr); | ||
477 | |||
478 | |||
479 | /* sync icache and memory */ | ||
480 | extern void xthal_icache_sync( void ); | ||
481 | /* sync dcache and memory */ | ||
482 | extern void xthal_dcache_sync( void ); | ||
483 | |||
484 | /*---------------------------------------------------------------------- | ||
485 | Debug | ||
486 | ----------------------------------------------------------------------*/ | ||
487 | |||
488 | /* 1 if debug option configured, 0 if not: */ | ||
489 | extern const int Xthal_debug_configured; | ||
490 | |||
491 | /* Number of instruction and data break registers: */ | ||
492 | extern const int Xthal_num_ibreak; | ||
493 | extern const int Xthal_num_dbreak; | ||
494 | |||
495 | /* Set (plant) and remove software breakpoint, both synchronizing cache: */ | ||
496 | extern unsigned int xthal_set_soft_break(void *addr); | ||
497 | extern void xthal_remove_soft_break(void *addr, unsigned int); | ||
498 | |||
499 | |||
500 | /*---------------------------------------------------------------------- | ||
501 | Disassembler | ||
502 | ----------------------------------------------------------------------*/ | ||
503 | |||
504 | /* Max expected size of the return buffer for a disassembled instruction (hint only): */ | ||
505 | #define XTHAL_DISASM_BUFSIZE 80 | ||
506 | |||
507 | /* Disassembly option bits for selecting what to return: */ | ||
508 | #define XTHAL_DISASM_OPT_ADDR 0x0001 /* display address */ | ||
509 | #define XTHAL_DISASM_OPT_OPHEX 0x0002 /* display opcode bytes in hex */ | ||
510 | #define XTHAL_DISASM_OPT_OPCODE 0x0004 /* display opcode name (mnemonic) */ | ||
511 | #define XTHAL_DISASM_OPT_PARMS 0x0008 /* display parameters */ | ||
512 | #define XTHAL_DISASM_OPT_ALL 0x0FFF /* display everything */ | ||
513 | |||
514 | /* routine to get a string for the disassembled instruction */ | ||
515 | extern int xthal_disassemble( unsigned char *instr_buf, void *tgt_addr, | ||
516 | char *buffer, unsigned buflen, unsigned options ); | ||
517 | |||
518 | /* routine to get the size of the next instruction. Returns 0 for | ||
519 | illegal instruction */ | ||
520 | extern int xthal_disassemble_size( unsigned char *instr_buf ); | ||
521 | |||
522 | |||
523 | /*---------------------------------------------------------------------- | ||
524 | Core Counter | ||
525 | ----------------------------------------------------------------------*/ | ||
526 | |||
527 | /* counter info */ | ||
528 | extern const unsigned char Xthal_have_ccount; /* set if CCOUNT register present */ | ||
529 | extern const unsigned char Xthal_num_ccompare; /* number of CCOMPAREn registers */ | ||
530 | |||
531 | /* get CCOUNT register (if not present return 0) */ | ||
532 | extern unsigned xthal_get_ccount(void); | ||
533 | |||
534 | /* set and get CCOMPAREn registers (if not present, get returns 0) */ | ||
535 | extern void xthal_set_ccompare(int, unsigned); | ||
536 | extern unsigned xthal_get_ccompare(int); | ||
537 | |||
538 | |||
539 | /*---------------------------------------------------------------------- | ||
540 | Instruction/Data RAM/ROM Access | ||
541 | ----------------------------------------------------------------------*/ | ||
542 | |||
543 | extern void* xthal_memcpy(void *dst, const void *src, unsigned len); | ||
544 | extern void* xthal_bcopy(const void *src, void *dst, unsigned len); | ||
545 | |||
546 | /*---------------------------------------------------------------------- | ||
547 | MP Synchronization | ||
548 | ----------------------------------------------------------------------*/ | ||
549 | extern int xthal_compare_and_set( int *addr, int test_val, int compare_val ); | ||
550 | extern unsigned xthal_get_prid( void ); | ||
551 | |||
552 | /*extern const char Xthal_have_s32c1i;*/ | ||
553 | extern const unsigned char Xthal_have_prid; | ||
554 | |||
555 | |||
556 | /*---------------------------------------------------------------------- | ||
557 | Miscellaneous | ||
558 | ----------------------------------------------------------------------*/ | ||
559 | |||
560 | extern const unsigned int Xthal_release_major; | ||
561 | extern const unsigned int Xthal_release_minor; | ||
562 | extern const char * const Xthal_release_name; | ||
563 | extern const char * const Xthal_release_internal; | ||
564 | |||
565 | extern const unsigned char Xthal_memory_order; | ||
566 | extern const unsigned char Xthal_have_windowed; | ||
567 | extern const unsigned char Xthal_have_density; | ||
568 | extern const unsigned char Xthal_have_booleans; | ||
569 | extern const unsigned char Xthal_have_loops; | ||
570 | extern const unsigned char Xthal_have_nsa; | ||
571 | extern const unsigned char Xthal_have_minmax; | ||
572 | extern const unsigned char Xthal_have_sext; | ||
573 | extern const unsigned char Xthal_have_clamps; | ||
574 | extern const unsigned char Xthal_have_mac16; | ||
575 | extern const unsigned char Xthal_have_mul16; | ||
576 | extern const unsigned char Xthal_have_fp; | ||
577 | extern const unsigned char Xthal_have_speculation; | ||
578 | extern const unsigned char Xthal_have_exceptions; | ||
579 | extern const unsigned char Xthal_xea_version; | ||
580 | extern const unsigned char Xthal_have_interrupts; | ||
581 | extern const unsigned char Xthal_have_highlevel_interrupts; | ||
582 | extern const unsigned char Xthal_have_nmi; | ||
583 | |||
584 | extern const unsigned short Xthal_num_writebuffer_entries; | ||
585 | |||
586 | extern const unsigned int Xthal_build_unique_id; | ||
587 | /* Release info for hardware targeted by software upgrades: */ | ||
588 | extern const unsigned int Xthal_hw_configid0; | ||
589 | extern const unsigned int Xthal_hw_configid1; | ||
590 | extern const unsigned int Xthal_hw_release_major; | ||
591 | extern const unsigned int Xthal_hw_release_minor; | ||
592 | extern const char * const Xthal_hw_release_name; | ||
593 | extern const char * const Xthal_hw_release_internal; | ||
594 | |||
595 | |||
596 | /* Internal memories... */ | ||
597 | |||
598 | extern const unsigned char Xthal_num_instrom; | ||
599 | extern const unsigned char Xthal_num_instram; | ||
600 | extern const unsigned char Xthal_num_datarom; | ||
601 | extern const unsigned char Xthal_num_dataram; | ||
602 | extern const unsigned char Xthal_num_xlmi; | ||
603 | extern const unsigned int Xthal_instrom_vaddr[1]; | ||
604 | extern const unsigned int Xthal_instrom_paddr[1]; | ||
605 | extern const unsigned int Xthal_instrom_size [1]; | ||
606 | extern const unsigned int Xthal_instram_vaddr[1]; | ||
607 | extern const unsigned int Xthal_instram_paddr[1]; | ||
608 | extern const unsigned int Xthal_instram_size [1]; | ||
609 | extern const unsigned int Xthal_datarom_vaddr[1]; | ||
610 | extern const unsigned int Xthal_datarom_paddr[1]; | ||
611 | extern const unsigned int Xthal_datarom_size [1]; | ||
612 | extern const unsigned int Xthal_dataram_vaddr[1]; | ||
613 | extern const unsigned int Xthal_dataram_paddr[1]; | ||
614 | extern const unsigned int Xthal_dataram_size [1]; | ||
615 | extern const unsigned int Xthal_xlmi_vaddr[1]; | ||
616 | extern const unsigned int Xthal_xlmi_paddr[1]; | ||
617 | extern const unsigned int Xthal_xlmi_size [1]; | ||
618 | |||
619 | |||
620 | |||
621 | /*---------------------------------------------------------------------- | ||
622 | Memory Management Unit | ||
623 | ----------------------------------------------------------------------*/ | ||
624 | |||
625 | extern const unsigned char Xthal_have_spanning_way; | ||
626 | extern const unsigned char Xthal_have_identity_map; | ||
627 | extern const unsigned char Xthal_have_mimic_cacheattr; | ||
628 | extern const unsigned char Xthal_have_xlt_cacheattr; | ||
629 | extern const unsigned char Xthal_have_cacheattr; | ||
630 | extern const unsigned char Xthal_have_tlbs; | ||
631 | |||
632 | extern const unsigned char Xthal_mmu_asid_bits; /* 0 .. 8 */ | ||
633 | extern const unsigned char Xthal_mmu_asid_kernel; | ||
634 | extern const unsigned char Xthal_mmu_rings; /* 1 .. 4 (perhaps 0 if no MMU and/or no protection?) */ | ||
635 | extern const unsigned char Xthal_mmu_ring_bits; | ||
636 | extern const unsigned char Xthal_mmu_sr_bits; | ||
637 | extern const unsigned char Xthal_mmu_ca_bits; | ||
638 | extern const unsigned int Xthal_mmu_max_pte_page_size; | ||
639 | extern const unsigned int Xthal_mmu_min_pte_page_size; | ||
640 | |||
641 | extern const unsigned char Xthal_itlb_way_bits; | ||
642 | extern const unsigned char Xthal_itlb_ways; | ||
643 | extern const unsigned char Xthal_itlb_arf_ways; | ||
644 | extern const unsigned char Xthal_dtlb_way_bits; | ||
645 | extern const unsigned char Xthal_dtlb_ways; | ||
646 | extern const unsigned char Xthal_dtlb_arf_ways; | ||
647 | |||
648 | /* Convert between virtual and physical addresses (through static maps only): */ | ||
649 | /*** WARNING: these two functions may go away in a future release; don't depend on them! ***/ | ||
650 | extern int xthal_static_v2p( unsigned vaddr, unsigned *paddrp ); | ||
651 | extern int xthal_static_p2v( unsigned paddr, unsigned *vaddrp, unsigned cached ); | ||
652 | |||
653 | #if 0 | ||
654 | /******************* EXPERIMENTAL AND TENTATIVE ONLY ********************/ | ||
655 | |||
656 | #define XTHAL_MMU_PAGESZ_COUNT_MAX 8 /* maximum number of different page sizes */ | ||
657 | extern const char Xthal_mmu_pagesz_count; /* 0 .. 8 number of different page sizes configured */ | ||
658 | |||
659 | /* Note: the following table doesn't necessarily have page sizes in increasing order: */ | ||
660 | extern const char Xthal_mmu_pagesz_log2[XTHAL_MMU_PAGESZ_COUNT_MAX]; /* 10 .. 28 (0 past count) */ | ||
661 | |||
662 | /* Sorted (increasing) table of page sizes, that indexes into the above table: */ | ||
663 | extern const char Xthal_mmu_pagesz_sorted[XTHAL_MMU_PAGESZ_COUNT_MAX]; /* 0 .. 7 (0 past count) */ | ||
664 | |||
665 | /*u32 Xthal_virtual_exceptions;*/ /* bitmask of which exceptions execute in virtual mode... */ | ||
666 | |||
667 | extern const char Xthal_mmu_pte_pagesz_log2_min; /* ?? minimum page size in PTEs */ | ||
668 | extern const char Xthal_mmu_pte_pagesz_log2_max; /* ?? maximum page size in PTEs */ | ||
669 | |||
670 | /* Cache Attribute Bits Implemented by the Cache (part of the cache abstraction) */ | ||
671 | extern const char Xthal_icache_fca_bits_implemented; /* ITLB/UTLB only! */ | ||
672 | extern const char Xthal_dcache_lca_bits_implemented; /* DTLB/UTLB only! */ | ||
673 | extern const char Xthal_dcache_sca_bits_implemented; /* DTLB/UTLB only! */ | ||
674 | |||
675 | /* Per TLB Parameters (Instruction, Data, Unified) */ | ||
676 | struct XtHalMmuTlb Xthal_itlb; /* description of MMU I-TLB generic features */ | ||
677 | struct XtHalMmuTlb Xthal_dtlb; /* description of MMU D-TLB generic features */ | ||
678 | struct XtHalMmuTlb Xthal_utlb; /* description of MMU U-TLB generic features */ | ||
679 | |||
680 | #define XTHAL_MMU_WAYS_MAX 8 /* maximum number of ways (associativities) for each TLB */ | ||
681 | |||
682 | /* Structure for common information described for each possible TLB (instruction, data and unified): */ | ||
683 | typedef struct XtHalMmuTlb { | ||
684 | u8 va_bits; /* 32 (number of virtual address bits) */ | ||
685 | u8 pa_bits; /* 32 (number of physical address bits) */ | ||
686 | bool tlb_va_indexed; /* 1 (set if TLB is indexed by virtual address) */ | ||
687 | bool tlb_va_tagged; /* 0 (set if TLB is tagged by virtual address) */ | ||
688 | bool cache_va_indexed; /* 1 (set if cache is indexed by virtual address) */ | ||
689 | bool cache_va_tagged; /* 0 (set if cache is tagged by virtual address) */ | ||
690 | /*bool (whether page tables are traversed in vaddr sorted order, paddr sorted order, ...) */ | ||
691 | /*u8 (set of available page attribute bits, other than cache attribute bits defined above) */ | ||
692 | /*u32 (various masks for pages, MMU table/TLB entries, etc.) */ | ||
693 | u8 way_count; /* 0 .. 8 (number of ways, a.k.a. associativities, for this TLB) */ | ||
694 | XtHalMmuTlbWay * ways[XTHAL_MMU_WAYS_MAX]; /* pointers to per-way parms for each way */ | ||
695 | } XtHalMmuTlb; | ||
696 | |||
697 | /* Per TLB Way (Per Associativity) Parameters */ | ||
698 | typedef struct XtHalMmuTlbWay { | ||
699 | u32 index_count_log2; /* 0 .. 4 */ | ||
700 | u32 pagesz_mask; /* 0 .. 2^pagesz_count - 1 (each bit corresponds to a size */ | ||
701 | /* defined in the Xthal_mmu_pagesz_log2[] table) */ | ||
702 | u32 vpn_const_mask; | ||
703 | u32 vpn_const_value; | ||
704 | u64 ppn_const_mask; /* future may support pa_bits > 32 */ | ||
705 | u64 ppn_const_value; | ||
706 | u32 ppn_id_mask; /* paddr bits taken directly from vaddr */ | ||
707 | bool backgnd_match; /* 0 or 1 */ | ||
708 | /* These are defined in terms of the XTHAL_CACHE_xxx bits: */ | ||
709 | u8 fca_const_mask; /* ITLB/UTLB only! */ | ||
710 | u8 fca_const_value; /* ITLB/UTLB only! */ | ||
711 | u8 lca_const_mask; /* DTLB/UTLB only! */ | ||
712 | u8 lca_const_value; /* DTLB/UTLB only! */ | ||
713 | u8 sca_const_mask; /* DTLB/UTLB only! */ | ||
714 | u8 sca_const_value; /* DTLB/UTLB only! */ | ||
715 | /* These define an encoding that map 5 bits in TLB and PTE entries to */ | ||
716 | /* 8 bits (FCA, ITLB), 16 bits (LCA+SCA, DTLB) or 24 bits (FCA+LCA+SCA, UTLB): */ | ||
717 | /* (they may be moved to struct XtHalMmuTlb) */ | ||
718 | u8 ca_bits; /* number of bits in TLB/PTE entries for cache attributes */ | ||
719 | u32 * ca_map; /* pointer to array of 2^ca_bits entries of FCA+LCA+SCA bits */ | ||
720 | } XtHalMmuTlbWay; | ||
721 | |||
722 | /* | ||
723 | * The way to determine whether protection support is present in core | ||
724 | * is to [look at Xthal_mmu_rings ???]. | ||
725 | * Give info on memory requirements for MMU tables and other in-memory | ||
726 | * data structures (globally, per task, base and per page, etc.) - whatever bounds can be calculated. | ||
727 | */ | ||
728 | |||
729 | |||
730 | /* Default vectors: */ | ||
731 | xthal_immu_fetch_miss_vector | ||
732 | xthal_dmmu_load_miss_vector | ||
733 | xthal_dmmu_store_miss_vector | ||
734 | |||
735 | /* Functions called when a fault is detected: */ | ||
736 | typedef void (XtHalMmuFaultFunc)( unsigned vaddr, ...context... ); | ||
737 | /* Or, */ | ||
738 | /* a? = vaddr */ | ||
739 | /* a? = context... */ | ||
740 | /* PS.xxx = xxx */ | ||
741 | XtHalMMuFaultFunc *Xthal_immu_fetch_fault_func; | ||
742 | XtHalMMuFaultFunc *Xthal_dmmu_load_fault_func; | ||
743 | XtHalMMuFaultFunc *Xthal_dmmu_store_fault_func; | ||
744 | |||
745 | /* Default Handlers: */ | ||
746 | /* The user and/or kernel exception handlers may jump to these handlers to handle the relevant exceptions, | ||
747 | * according to the value of EXCCAUSE. The exact register state on entry to these handlers is TBD. */ | ||
748 | /* When multiple TLB entries match (hit) on the same access: */ | ||
749 | xthal_immu_fetch_multihit_handler | ||
750 | xthal_dmmu_load_multihit_handler | ||
751 | xthal_dmmu_store_multihit_handler | ||
752 | /* Protection violations according to cache attributes, and other cache attribute mismatches: */ | ||
753 | xthal_immu_fetch_attr_handler | ||
754 | xthal_dmmu_load_attr_handler | ||
755 | xthal_dmmu_store_attr_handler | ||
756 | /* Protection violations due to insufficient ring level: */ | ||
757 | xthal_immu_fetch_priv_handler | ||
758 | xthal_dmmu_load_priv_handler | ||
759 | xthal_dmmu_store_priv_handler | ||
760 | /* Alignment exception handlers (if supported by the particular Xtensa MMU configuration): */ | ||
761 | xthal_dmmu_load_align_handler | ||
762 | xthal_dmmu_store_align_handler | ||
763 | |||
764 | /* Or, alternatively, the OS user and/or kernel exception handlers may simply jump to the | ||
765 | * following entry points which will handle any values of EXCCAUSE not handled by the OS: */ | ||
766 | xthal_user_exc_default_handler | ||
767 | xthal_kernel_exc_default_handler | ||
768 | |||
769 | #endif /*0*/ | ||
770 | |||
771 | #ifdef INCLUDE_DEPRECATED_HAL_CODE | ||
772 | extern const unsigned char Xthal_have_old_exc_arch; | ||
773 | extern const unsigned char Xthal_have_mmu; | ||
774 | extern const unsigned int Xthal_num_regs; | ||
775 | extern const unsigned char Xthal_num_iroms; | ||
776 | extern const unsigned char Xthal_num_irams; | ||
777 | extern const unsigned char Xthal_num_droms; | ||
778 | extern const unsigned char Xthal_num_drams; | ||
779 | extern const unsigned int Xthal_configid0; | ||
780 | extern const unsigned int Xthal_configid1; | ||
781 | #endif | ||
782 | |||
783 | #ifdef INCLUDE_DEPRECATED_HAL_DEBUG_CODE | ||
784 | #define XTHAL_24_BIT_BREAK 0x80000000 | ||
785 | #define XTHAL_16_BIT_BREAK 0x40000000 | ||
786 | extern const unsigned short Xthal_ill_inst_16[16]; | ||
787 | #define XTHAL_DEST_REG 0xf0000000 /* Mask for destination register */ | ||
788 | #define XTHAL_DEST_REG_INST 0x08000000 /* Branch address is in register */ | ||
789 | #define XTHAL_DEST_REL_INST 0x04000000 /* Branch address is relative */ | ||
790 | #define XTHAL_RFW_INST 0x00000800 | ||
791 | #define XTHAL_RFUE_INST 0x00000400 | ||
792 | #define XTHAL_RFI_INST 0x00000200 | ||
793 | #define XTHAL_RFE_INST 0x00000100 | ||
794 | #define XTHAL_RET_INST 0x00000080 | ||
795 | #define XTHAL_BREAK_INST 0x00000040 | ||
796 | #define XTHAL_SYSCALL_INST 0x00000020 | ||
797 | #define XTHAL_LOOP_END 0x00000010 /* Not set by xthal_inst_type */ | ||
798 | #define XTHAL_JUMP_INST 0x00000008 /* Call or jump instruction */ | ||
799 | #define XTHAL_BRANCH_INST 0x00000004 /* Branch instruction */ | ||
800 | #define XTHAL_24_BIT_INST 0x00000002 | ||
801 | #define XTHAL_16_BIT_INST 0x00000001 | ||
802 | typedef struct xthal_state { | ||
803 | unsigned pc; | ||
804 | unsigned ar[16]; | ||
805 | unsigned lbeg; | ||
806 | unsigned lend; | ||
807 | unsigned lcount; | ||
808 | unsigned extra_ptr; | ||
809 | unsigned cpregs_ptr[XTHAL_MAX_CPS]; | ||
810 | } XTHAL_STATE; | ||
811 | extern unsigned int xthal_inst_type(void *addr); | ||
812 | extern unsigned int xthal_branch_addr(void *addr); | ||
813 | extern unsigned int xthal_get_npc(XTHAL_STATE *user_state); | ||
814 | #endif /* INCLUDE_DEPRECATED_HAL_DEBUG_CODE */ | ||
815 | |||
816 | #ifdef __cplusplus | ||
817 | } | ||
818 | #endif | ||
819 | #endif /*!__ASSEMBLY__ */ | ||
820 | |||
821 | #endif /*XTENSA_HAL_H*/ | ||
822 | |||