| /* Definitions for Xtensa processor config info needed for TRAX. |
| |
| Copyright (c) 2005-2011 Tensilica Inc. |
| |
| Permission is hereby granted, free of charge, to any person obtaining |
| a copy of this software and associated documentation files (the |
| "Software"), to deal in the Software without restriction, including |
| without limitation the rights to use, copy, modify, merge, publish, |
| distribute, sublicense, and/or sell copies of the Software, and to |
| permit persons to whom the Software is furnished to do so, subject to |
| the following conditions: |
| |
| The above copyright notice and this permission notice shall be included |
| in all copies or substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
| IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
| TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
| SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ |
| |
| #ifndef TRAX_CORE_CONFIG_H |
| #define TRAX_CORE_CONFIG_H |
| |
| #include "xtensa-params.h" |
| |
| /* |
| * Vector Enumerations. |
| */ |
| |
| /* These must match the LX2.0 and later traceport spec: */ |
| #define VEC_NO_VECTOR 0 |
| #define VEC_FIRST VEC_RESET /* first valid vector */ |
| #define VEC_RESET 1 |
| #define VEC_DEBUG 2 |
| #define VEC_NMI 3 |
| #define VEC_USER 4 |
| #define VEC_KERNEL 5 |
| #define VEC_DOUBLE 6 |
| #define VEC_MEMERR 7 |
| #define VEC_RESERVED8 8 |
| #define VEC_RESERVED9 9 |
| #define VEC_WINO4 10 |
| #define VEC_WINU4 11 |
| #define VEC_WINO8 12 |
| #define VEC_WINU8 13 |
| #define VEC_WINO12 14 |
| #define VEC_WINU12 15 |
| #define VEC_INTLEVEL2 16 |
| #define VEC_INTLEVEL3 17 |
| #define VEC_INTLEVEL4 18 |
| #define VEC_INTLEVEL5 19 |
| #define VEC_INTLEVEL6 20 |
| /* These are internal, i.e. don't appear like this on traceport: */ |
| #define VEC_DEBUG_OCD 21 |
| #define VEC_UNKNOWN 22 |
| /* Enumerations 23 through 31 are also reserved, but putting */ |
| /* placeholders here seems wasteful and unnecessary. */ |
| #define VEC_COUNT 23 |
| |
| /* Other branch (change-of-PC-flow) type encodings; |
| * if PC changes due to an exception or interrupt vector, |
| * one of the VEC_* values above is used, otherwise |
| * (or if it's unknown whether it's due to an exception/interrupt) |
| * one of the following is used: */ |
| |
| #define BRANCH_IS_VEC(n) ((n) < VEC_COUNT) /* is known to be except/interrupt? */ |
| #define BRANCH_OR_VEC 24 /* unknown type of branch (branch/exception/interrupt/etc) */ |
| #define BRANCH_UNKNOWN 25 /* unknown type of branch (anything but except/interrupt) */ |
| #define BRANCH_UNKNOWN_ERR 26 /* like BRANCH_UNKNOWN with known error (non-branch instr) */ |
| #define BRANCH_LOOPBACK 28 /* zero-overhead loopback (from LEND to LBEG) */ |
| #define BRANCH_CONDTAKEN 29 /* conditional branch taken (or LOOP{NEZ,GTZ} loop skip) */ |
| #define BRANCH_JUMP 30 /* jump (unconditional branch, i.e. J or JX) */ |
| #define BRANCH_IS_CALL(n) (((n) & ~3) == 32) /* is a function call? */ |
| #define BRANCH_CALL0 32 /* non-windowed function call (CALL0, CALLX0) */ |
| #define BRANCH_CALL4 33 /* windowed function call (CALL4, CALLX4) */ |
| #define BRANCH_CALL8 34 /* windowed function call (CALL8, CALLX8) */ |
| #define BRANCH_CALL12 35 /* windowed function call (CALL12, CALLX12) */ |
| #define BRANCH_IS_RETURN(n) ((n) >= 36) /* is any kind of return? */ |
| #define BRANCH_IS_CALLRETURN(n) (((n) & ~1) == 36) /* is a function return? */ |
| #define BRANCH_RET 36 /* non-windowed function return (RET or RET.N) */ |
| #define BRANCH_RETW 37 /* windowed function return (RETW or RETW.N) */ |
| #define BRANCH_IS_EIRETURN(n) ((n) >= 38) /* is an except/inter. return? */ |
| #define BRANCH_RFE 38 /* RFE or RFUE */ |
| #define BRANCH_RFDE 39 /* RFDE */ |
| #define BRANCH_RFWO 40 /* RFWO */ |
| #define BRANCH_RFWU 41 /* RFWU */ |
| #define BRANCH_RFI_2 42 /* RFI 2 */ |
| #define BRANCH_RFI_3 43 /* RFI 3 */ |
| #define BRANCH_RFI_4 44 /* RFI 4 */ |
| #define BRANCH_RFI_5 45 /* RFI 5 */ |
| #define BRANCH_RFI_6 46 /* RFI 6 */ |
| #define BRANCH_RFI_NMI 47 /* RFI NMILEVEL */ |
| #define BRANCH_RFI_DEBUG 48 /* RFI DEBUGLEVEL */ |
| #define BRANCH_RFME 49 /* RFME */ |
| #define BRANCH_COUNT 50 /* (number of defined BRANCH_xxx values) */ |
| |
| |
| |
| typedef struct { |
| unsigned vaddr; |
| unsigned vaddr2; /* for static vectors only (reloc vectors option) */ |
| int is_configured; |
| } trax_vector_t; |
| |
| |
| /* |
| * This structure describes those portion of a Tensilica processor's |
| * configuration that are useful for trace. |
| */ |
| typedef struct { |
| char ** isa_dlls; |
| char * core_name; /* (XPG core name, not necessarily same as XTENSA_CORE) */ |
| int big_endian; /* 0 = little-endian, 1 = big-endian */ |
| int has_loops; /* 1 = zero overhead loops configured */ |
| int has_autorefill; /* 1 = TLB autorefill (MMU) configured */ |
| unsigned max_instr_size; /* in bytes (eg. 3, 4, 8, ...) */ |
| unsigned int_level_max; /* number of interrupt levels configured (without NMI) */ |
| int debug_level; /* debug intlevel, 0 if debug not configured */ |
| int nmi_level; /* NMI intlevel, 0 if NMI not configured */ |
| unsigned targethw_min; /* min. targeted hardware version (XTENSA_HWVERSION_<rel>) */ |
| unsigned targethw_max; /* max. targeted hardware version (XTENSA_HWVERSION_<rel>) */ |
| int reloc_vectors; /* 0 = fixed vectors, 1 = relocatable vectors */ |
| int statvec_select; /* 0 = stat vec base 0, 1 = stat vec base 1 (SW default) */ |
| int vecbase_align; /* number of bits to align VECBASE (32 - bits in VECBASE) */ |
| unsigned statvec_base0; /* static vector base 0 */ |
| unsigned statvec_base1; /* static vector base 1 */ |
| unsigned vecbase_reset; /* reset value of VECBASE */ |
| trax_vector_t vectors[VEC_COUNT]; /* all vectors... */ |
| } trax_core_config_t; |
| |
| |
| /* Globals: */ |
| //extern const char * const trax_vector_short_names[/*VEC_COUNT*/]; // nobody uses this one |
| extern const char * const trax_vector_names[/*VEC_COUNT*/]; |
| |
| /* Prototypes: */ |
| extern int trax_read_params (trax_core_config_t *c, xtensa_params p); |
| extern int trax_vector_from_address(trax_core_config_t *config, unsigned long vaddr, unsigned long *vecbases); |
| |
| #endif /* TRAX_CORE_CONFIG_H */ |
| |