/* excArchLibP.h - PowerPC exception library private exports */ /* * Copyright (c) 2003-2005, 2008, 2009, 2013, 2018 Wind River Systems, Inc. * * The right to copy, distribute or otherwise make use of this software * may be licensed only pursuant to the terms of an applicable Wind River * license agreement. */ /* Definitions for use only by PPC excArchLib.c and syscallArchLib.c */ /* modification history -------------------- 01j,28aug18,jli fixed wrong macro EXT_ENT_CRT_OFF for T4_ERRATUM_CPU6198 (VXW6-86904) 01i,01mar13,h_k added T4_ERRATUM_CPU6198 for e6500. 01h,18nov09,to GUEST: _VB_PISA_EHV support 01g,12may09,rec move guestOs ENT_OFF definition here 01f,23may08,pch CQ118100: clean up SMP support in critical-exception handling 01e,17oct05,pch SPR 113899: exc/intConnectCode must restore 32-bit mode before calling exc/intEnt 01d,22sep04,pch Add debug/trace capabilities (under #ifdef) 01c,06aug04,pch SPR's 78780 & 100398: support use of standard exception vectors in MMU and syscall 01b,05may04,pch SPR 92997: use correct symbol name in multiple-include protection 01a,08Dec03,pch extracted from excArchLib.c vn 02z */ #ifndef __INCexcArchLibPh #define __INCexcArchLibPh #ifdef __cplusplus extern "C" { #endif #ifndef _ASMLANGUAGE /* * The following typedefs are used within excArchLib.c in the interest * of clarity, to keep from making matters worse than they already are. * (Several existing published API's are defined with types that are just * plain wrong for the PowerPC port, however, we are stuck with them.) */ typedef UINT32 vecTblOffset; /* Offset in vector table, e.g. _EXC_OFF_* */ typedef char * codeBase; /* Base address in normal code space */ typedef char * vectorBase; /* Base address in vector execution space */ typedef char * codePtr; /* Pointer into normal code space */ typedef char * vectorPtr; /* Pointer into vector execution space */ /* * Convert a (vectorPtr) into a (codePtr), allowing for any difference * between excVecBase and excVecBaseAltAdrs. The distinction is critical * during initialization, when vector execution space may not be accessible * because the MMU has not yet been set up. */ #define CODE_PTR_FROM_VECTOR_PTR(vecp) \ (codePtr)((((vectorPtr)(vecp)) - excVecBase) + excVecBaseAltAdrs) #endif /* _ASMLANGUAGE */ /* * Word offsets to the branch instructions in * the exc*ConnectCode arrays in excArchLib.c * * Changes affecting ENT_OFF or ENT_CRT_OFF will require corresponding * changes in excALib.s:excEnt() and excCrtEnt() when calculating the * original vector address from the LR value. */ #if defined(_EXC_OFF_CRTL) || defined(_WRS_PPC_64BIT) # if defined(T4_ERRATUM_CPU6198) && defined(_WRS_CONFIG_SMP) # define T4_LIS_OFF 4 /* offset for lis p0,HI(mtmsrwa) */ # define T4_ORI_OFF 5 /* offset for ori p0,p0,LO(mtmsrwa) */ # define T4_LABEL_OFF 8 /* offset for RMCI to */ # define ENT_OFF 9 /* offset for intEnt/excEnt */ # define ISR_OFF 12 /* offset for ISR or exc. handler */ # define EXIT_OFF 14 /* offset for intExit/excExit */ # define EXT_ENT_OFF 10 /* offset for ext intEnt/excEnt */ # define EXT_ISR_OFF 15 /* offset for ext ISR or exc handler */ # define EXT_EXIT_OFF 22 /* offset for ext intExit/excExit */ # else # define ENT_OFF 6 /* offset for intEnt/excEnt */ # define ISR_OFF 9 /* offset for ISR or exc. handler */ # define EXIT_OFF 11 /* offset for intExit/excExit */ # define EXT_ENT_OFF 7 /* offset for ext intEnt/excEnt */ # define EXT_ISR_OFF 12 /* offset for ext ISR or exc handler */ # define EXT_EXIT_OFF 19 /* offset for ext intExit/excExit */ # endif /* T4_ERRATUM_CPU6198 && _WRS_CONFIG_SMP */ # ifdef _EXC_OFF_CRTL # define EXT_ENT_CRT_OFF 3 /* offset for ext intEnt/excEnt */ # define EXT_ISR_CRT_OFF 8 /* offset for ext ISR or exc handler */ # define EXT_EXIT_CRT_OFF 15 /* offset for ext intExit/excExit */ # define ENT_CRT_OFF 2 /* offset for intEnt/excEnt */ # define ISR_CRT_OFF 5 /* offset for ISR or exc. handler */ # define EXIT_CRT_OFF 7 /* offset for intCrtExit/excCrtExit */ # endif /* _EXC_OFF_CRTL */ # if defined(_EXC_OFF_CRTL) && defined(LOG_FRAMELESS) /* * Logging of "frameless nesting" occurences, used only for testing purposes. * * Each log record consists of one word, with the record type (exit case) in * the most-significant byte and the interrupted vector offset in the least- * significant halfword. The round-robin log buffer pointer, and the counts * for the three record types, are stored at addresses 0x80-0x8f. * * CRT_COUNT_061C is used when TRAP_DISPATCH_ADDR is also set, for debugging. */ /* offsets from address zero */ #define LOG_FML_PTR 0x80 /* where to store next log record */ #define RIV_COUNT 0x84 /* count of resume-in-vector cases */ #define ESF_COUNT 0x88 /* count of copy-ESF cases */ #define STM_COUNT 0x8c /* count of syscall/TLB-miss cases */ #define CRT_COUNT_ENT 0x90 /* count of all critical interrupt entries */ #define CRT_COUNT_EXIT 0x94 /* count of all critical interrupt exits */ #define CRT_COUNT_RESC 0x98 /* calls of reschedule from intCrtExit */ #define CRT_COUNT_061C 0x9c /* dispatches of PC==0x061C in windALib */ #define CRT_COUNT_RESV 0xa0 /* reserved for future use */ /* log record types */ #define RIV_TYPE 0x5000 /* resume-in-vector */ #define ESF_TYPE 0x6000 /* copy-ESF */ #define STM_TYPE 0x7000 /* syscall/TLB-miss */ /* size of log record in bytes */ #define LOG_FML_SIZE 4 /* size of log buffer in bytes, must be a power of 2 */ #define LOG_FML_BUF_SIZE 0x1000 /* bit number corresponding to buffer size, used to wrap log pointer */ #define LOG_FML_BIT 19 # endif /* _EXC_OFF_CRTL && LOG_FRAMELESS */ #else /* _EXC_OFF_CRTL || _WRS_PPC_64BIT */ # define ENT_OFF 2 /* offset for intEnt/excEnt */ # define ISR_OFF 5 /* offset for ISR or exc. handler */ # define EXIT_OFF 7 /* offset for intExit/excExit */ # define EXT_ENT_OFF 3 /* offset for ext intEnt/excEnt */ # define EXT_ISR_OFF 8 /* offset for ext ISR or exc handler */ # define EXT_EXIT_OFF 15 /* offset for ext intExit/excExit */ #endif /* _EXC_OFF_CRTL || _WRS_PPC_64BIT */ #if defined(_WRS_CONFIG_WRHV_GUEST) && !defined(_WRS_CONFIG_VBI_PPC_E500MC) # undef ENT_OFF # define ENT_OFF 3 /* 3 words in for guest OS */ #endif /* _WRS_CONFIG_WRHV_GUEST && !_WRS_CONFIG_VBI_PPC_E500MC */ #ifdef LOG_DISPATCH /* logging of dispatch (rfi/rfci) operations, used only for debugging */ /* offsets from address zero */ #define LOG_DISP_PTR 0xec /* where to store next log record */ #define LOG_DISP_SAVE 0xe8 /* last LOG_DISP_PTR when logging suspended */ /* offsets in log record */ #define LOG_DISP_ID 0x00 /* record type = dispatcher ID */ #define LOG_DISP_LR 0x04 /* LR value (who called dispatcher) */ #define LOG_DISP_SP_IN 0x08 /* SP value when dispatcher called */ #define LOG_DISP_CTX 0x0c /* address context loaded from */ #define LOG_DISP_PC 0x10 /* PC value to be loaded */ #define LOG_DISP_MSR 0x14 /* MSR value to be loaded */ #define LOG_DISP_SP_OUT 0x18 /* SP value to be loaded */ #define LOG_DISP_NXT_FL 0x1c /* current value of LOG_FML_PTR */ /* size of log record in bytes */ #define LOG_DISP_SIZE 32 /* size of log buffer in bytes, must be a power of 2 */ #define LOG_DISP_BUF_SIZE 0x2000 /* bit number corresponding to buffer size, used to wrap log pointer */ #define LOG_DISP_BIT 18 /* log record types */ #define DISP_WIND 0x01 /* windLoadContext */ #define DISP_CTXL 0x02 /* _sigCtxLoad */ #define DISP_EXCN 0x03 /* excExit */ #define DISP_EXCC 0x04 /* excCrtExit */ #define DISP_INTN 0x05 /* intExit, normal case */ #define DISP_INTP 0x06 /* intExit, preempting (reschedule) */ #define DISP_INTI 0x07 /* intExit, idle case */ #define DISP_INTC 0x08 /* intCrtExit, normal case */ #define DISP_INCR 0x09 /* intCrtExit, frameless RIV case */ #define DISP_INCI 0x0a /* intCrtExit, idle case */ #define DISP_INCP 0x0b /* intCrtExit, preempting (reschedule) */ #define DISP_INCF 0x0c /* intCrtExit, frameless preempting (copyESF) */ #define DISP_DTLB 0x0d /* data TLB miss handled */ #define DISP_ITLB 0x0e /* insn TLB miss handled */ #define DISP_RTPI 0x0f /* rtpUserModeSwitch */ #define DISP_SYSC 0x10 /* resume after syscall */ #define DISP_EXCM 0x11 /* excMchkExit */ #define DISP_POW 0x12 /* vxC1StateSet */ #endif /* LOG_DISPATCH */ #ifdef __cplusplus } #endif #endif /* __INCexcArchLibPh */