Chris Zankel | e344b63 | 2005-06-23 22:01:30 -0700 | [diff] [blame] | 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 | |