mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-10-27 12:11:41 +01:00 
			
		
		
		
	
		
			
	
	
		
			162 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			162 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  *  xtensa-libdb-macros.h | ||
|  |  */ | ||
|  | 
 | ||
|  | /* $Id: //depot/rel/Eaglenest/Xtensa/Software/libdb/xtensa-libdb-macros.h#1 $ */ | ||
|  | 
 | ||
|  | /* Copyright (c) 2004-2008 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 __H_LIBDB_MACROS
 | ||
|  | #define __H_LIBDB_MACROS
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *  This header file provides macros used to construct, identify and use | ||
|  |  *  "target numbers" that are assigned to various types of Xtensa processor | ||
|  |  *  registers and states.  These target numbers are used by GDB in the remote | ||
|  |  *  protocol, and are thus used by all GDB debugger agents (targets). | ||
|  |  *  They are also used in ELF debugger information sections (stabs, dwarf, etc). | ||
|  |  * | ||
|  |  *  These macros are separated from xtensa-libdb.h because they are needed | ||
|  |  *  by certain debugger agents that do not use or have access to libdb, | ||
|  |  *  e.g. the OCD daemon, RedBoot, XMON, etc. | ||
|  |  * | ||
|  |  *  For the time being, for compatibility with certain 3rd party debugger | ||
|  |  *  software vendors, target numbers are limited to 16 bits.  It is | ||
|  |  *  conceivable that this will be extended in the future to 32 bits. | ||
|  |  */ | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | extern "C" { | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifndef uint32
 | ||
|  |  #define uint32	unsigned int
 | ||
|  | #endif
 | ||
|  | #ifndef int32
 | ||
|  |  #define int32	int
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *  Macros to form register "target numbers" for various standard registers/states: | ||
|  |  */ | ||
|  | #define XTENSA_DBREGN_INVALID		-1		/* not a valid target number */
 | ||
|  | #define XTENSA_DBREGN_A(n)		(0x0000+(n))	/* address registers a0..a15 */
 | ||
|  | #define XTENSA_DBREGN_B(n)		(0x0010+(n))	/* boolean bits b0..b15 */
 | ||
|  | #define XTENSA_DBREGN_PC		 0x0020		/* program counter */
 | ||
|  | 				      /* 0x0021		   RESERVED for use by Tensilica */ | ||
|  | #define XTENSA_DBREGN_BO(n)		(0x0022+(n))	/* boolean octuple-bits bo0..bo1 */
 | ||
|  | #define XTENSA_DBREGN_BQ(n)		(0x0024+(n))	/* boolean quadruple-bits bq0..bq3 */
 | ||
|  | #define XTENSA_DBREGN_BD(n)		(0x0028+(n))	/* boolean double-bits bd0..bd7 */
 | ||
|  | #define XTENSA_DBREGN_F(n)		(0x0030+(n))	/* floating point registers f0..f15 */
 | ||
|  | #define XTENSA_DBREGN_VEC(n)		(0x0040+(n))	/* Vectra vec regs v0..v15 */
 | ||
|  | #define XTENSA_DBREGN_VSEL(n)		(0x0050+(n))	/* Vectra sel s0..s3 (V1) ..s7 (V2) */
 | ||
|  | #define XTENSA_DBREGN_VALIGN(n)		(0x0058+(n))	/* Vectra valign regs u0..u3 */
 | ||
|  | #define XTENSA_DBREGN_VCOEFF(n)		(0x005C+(n))	/* Vectra I vcoeff regs c0..c1 */
 | ||
|  | 				      /* 0x005E..0x005F	   RESERVED for use by Tensilica */ | ||
|  | #define XTENSA_DBREGN_AEP(n)		(0x0060+(n))	/* HiFi2 Audio Engine regs aep0..aep7 */
 | ||
|  | #define XTENSA_DBREGN_AEQ(n)		(0x0068+(n))	/* HiFi2 Audio Engine regs aeq0..aeq3 */
 | ||
|  | 				      /* 0x006C..0x00FF	   RESERVED for use by Tensilica */ | ||
|  | #define XTENSA_DBREGN_AR(n)		(0x0100+(n))	/* physical address regs ar0..ar63
 | ||
|  | 							   (note: only with window option) */ | ||
|  | 				      /* 0x0140..0x01FF	   RESERVED for use by Tensilica */ | ||
|  | #define XTENSA_DBREGN_SREG(n)		(0x0200+(n))	/* special registers 0..255 (core) */
 | ||
|  | #define XTENSA_DBREGN_BR		XTENSA_DBREGN_SREG(0x04)	/* all 16 boolean bits, BR */
 | ||
|  | #define XTENSA_DBREGN_MR(n)		XTENSA_DBREGN_SREG(0x20+(n))	/* MAC16 registers m0..m3 */
 | ||
|  | #define XTENSA_DBREGN_UREG(n)		(0x0300+(n))	/* user registers 0..255 (TIE) */
 | ||
|  | 				      /* 0x0400..0x0FFF	   RESERVED for use by Tensilica */ | ||
|  | 				      /* 0x1000..0x1FFF	   user-defined regfiles */ | ||
|  | 				      /* 0x2000..0xEFFF	   other states (and regfiles) */ | ||
|  | #define XTENSA_DBREGN_DBAGENT(n)	(0xF000+(n))	/* non-processor "registers" 0..4095 for
 | ||
|  | 							   3rd-party debugger agent defined use */ | ||
|  | 				      /* > 0xFFFF (32-bit) RESERVED for use by Tensilica */ | ||
|  | /*#define XTENSA_DBREGN_CONTEXT(n)	(0x02000000+((n)<<20))*/	/* add this macro's value to a target
 | ||
|  | 							   number to identify a specific context 0..31 | ||
|  | 							   for context-replicated registers */ | ||
|  | #define XTENSA_DBREGN_MASK		0xFFFF		/* mask of valid target_number bits */
 | ||
|  | #define XTENSA_DBREGN_WRITE_SIDE	0x04000000	/* flag to request write half of a register
 | ||
|  | 							   split into distinct read and write entries | ||
|  | 							   with the same target number (currently only | ||
|  | 							   valid in a couple of libdb API functions; | ||
|  | 							   see xtensa-libdb.h for details) */ | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *  Macros to identify specific ranges of target numbers (formed above): | ||
|  |  *  NOTE:  any context number (or other upper 12 bits) are considered | ||
|  |  *  modifiers and are thus stripped out for identification purposes. | ||
|  |  */ | ||
|  | #define XTENSA_DBREGN_IS_VALID(tn)	(((tn) & ~0xFFFF) == 0)	/* just tests it's 16-bit unsigned */
 | ||
|  | #define XTENSA_DBREGN_IS_A(tn)		(((tn) & 0xFFF0)==0x0000)	/* is a0..a15 */
 | ||
|  | #define XTENSA_DBREGN_IS_B(tn)		(((tn) & 0xFFF0)==0x0010)	/* is b0..b15 */
 | ||
|  | #define XTENSA_DBREGN_IS_PC(tn)		(((tn) & 0xFFFF)==0x0020)	/* is program counter */
 | ||
|  | #define XTENSA_DBREGN_IS_BO(tn)		(((tn) & 0xFFFE)==0x0022)	/* is bo0..bo1 */
 | ||
|  | #define XTENSA_DBREGN_IS_BQ(tn)		(((tn) & 0xFFFC)==0x0024)	/* is bq0..bq3 */
 | ||
|  | #define XTENSA_DBREGN_IS_BD(tn)		(((tn) & 0xFFF8)==0x0028)	/* is bd0..bd7 */
 | ||
|  | #define XTENSA_DBREGN_IS_F(tn)		(((tn) & 0xFFF0)==0x0030)	/* is f0..f15 */
 | ||
|  | #define XTENSA_DBREGN_IS_VEC(tn)	(((tn) & 0xFFF0)==0x0040)	/* is v0..v15 */
 | ||
|  | #define XTENSA_DBREGN_IS_VSEL(tn)	(((tn) & 0xFFF8)==0x0050)	/* is s0..s7 (s0..s3 in V1) */
 | ||
|  | #define XTENSA_DBREGN_IS_VALIGN(tn)	(((tn) & 0xFFFC)==0x0058)	/* is u0..u3 */
 | ||
|  | #define XTENSA_DBREGN_IS_VCOEFF(tn)	(((tn) & 0xFFFE)==0x005C)	/* is c0..c1 */
 | ||
|  | #define XTENSA_DBREGN_IS_AEP(tn)	(((tn) & 0xFFF8)==0x0060)	/* is aep0..aep7 */
 | ||
|  | #define XTENSA_DBREGN_IS_AEQ(tn)	(((tn) & 0xFFFC)==0x0068)	/* is aeq0..aeq3 */
 | ||
|  | #define XTENSA_DBREGN_IS_AR(tn)		(((tn) & 0xFFC0)==0x0100)	/* is ar0..ar63 */
 | ||
|  | #define XTENSA_DBREGN_IS_SREG(tn)	(((tn) & 0xFF00)==0x0200)	/* is special register */
 | ||
|  | #define XTENSA_DBREGN_IS_BR(tn)		(((tn) & 0xFFFF)==XTENSA_DBREGN_SREG(0x04))	/* is BR */
 | ||
|  | #define XTENSA_DBREGN_IS_MR(tn)		(((tn) & 0xFFFC)==XTENSA_DBREGN_SREG(0x20))	/* m0..m3 */
 | ||
|  | #define XTENSA_DBREGN_IS_UREG(tn)	(((tn) & 0xFF00)==0x0300)	/* is user register */
 | ||
|  | #define XTENSA_DBREGN_IS_DBAGENT(tn)	(((tn) & 0xF000)==0xF000)	/* is non-processor */
 | ||
|  | /*#define XTENSA_DBREGN_IS_CONTEXT(tn)	(((tn) & 0x02000000) != 0)*/	/* specifies context # */ | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *  Macros to extract register index from a register "target number" | ||
|  |  *  when a specific range has been identified using one of the _IS_ macros above. | ||
|  |  *  These macros only return a useful value if the corresponding _IS_ macro returns true. | ||
|  |  */ | ||
|  | #define XTENSA_DBREGN_A_INDEX(tn)	((tn) & 0x0F)		/* 0..15  for a0..a15 */
 | ||
|  | #define XTENSA_DBREGN_B_INDEX(tn)	((tn) & 0x0F)		/* 0..15  for b0..b15 */
 | ||
|  | #define XTENSA_DBREGN_BO_INDEX(tn)	((tn) & 0x01)		/* 0..1   for bo0..bo1 */
 | ||
|  | #define XTENSA_DBREGN_BQ_INDEX(tn)	((tn) & 0x03)		/* 0..3   for bq0..bq3 */
 | ||
|  | #define XTENSA_DBREGN_BD_INDEX(tn)	((tn) & 0x07)		/* 0..7   for bd0..bd7 */
 | ||
|  | #define XTENSA_DBREGN_F_INDEX(tn)	((tn) & 0x0F)		/* 0..15  for f0..f15 */
 | ||
|  | #define XTENSA_DBREGN_VEC_INDEX(tn)	((tn) & 0x0F)		/* 0..15  for v0..v15 */
 | ||
|  | #define XTENSA_DBREGN_VSEL_INDEX(tn)	((tn) & 0x07)		/* 0..7   for s0..s7 */
 | ||
|  | #define XTENSA_DBREGN_VALIGN_INDEX(tn)	((tn) & 0x03)		/* 0..3   for u0..u3 */
 | ||
|  | #define XTENSA_DBREGN_VCOEFF_INDEX(tn)	((tn) & 0x01)		/* 0..1   for c0..c1 */
 | ||
|  | #define XTENSA_DBREGN_AEP_INDEX(tn)	((tn) & 0x07)		/* 0..7   for aep0..aep7 */
 | ||
|  | #define XTENSA_DBREGN_AEQ_INDEX(tn)	((tn) & 0x03)		/* 0..3   for aeq0..aeq3 */
 | ||
|  | #define XTENSA_DBREGN_AR_INDEX(tn)	((tn) & 0x3F)		/* 0..63  for ar0..ar63 */
 | ||
|  | #define XTENSA_DBREGN_SREG_INDEX(tn)	((tn) & 0xFF)		/* 0..255 for special registers */
 | ||
|  | #define XTENSA_DBREGN_MR_INDEX(tn)	((tn) & 0x03)		/* 0..3   for m0..m3 */
 | ||
|  | #define XTENSA_DBREGN_UREG_INDEX(tn)	((tn) & 0xFF)		/* 0..255 for user registers */
 | ||
|  | #define XTENSA_DBREGN_DBAGENT_INDEX(tn)	((tn) & 0xFFF)		/* 0..4095 for non-processor */
 | ||
|  | /*#define XTENSA_DBREGN_CONTEXT_INDEX(tn)	(((tn) >> 20) & 0x1F)*/	/* 0..31  context numbers */ | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | } | ||
|  | #endif
 | ||
|  |        | ||
|  | #endif /* __H_LIBDB_MACROS */
 | ||
|  | 
 |