mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-11-04 08:01:38 +01:00 
			
		
		
		
	
		
			
	
	
		
			145 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			145 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/* 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 */
							 | 
						||
| 
								 | 
							
								
							 |