Files
fail/ovp/armmModel/armStructure.h
hsc b70b6fb43a another directory rename: failstar -> fail
"failstar" sounds like a name for a cruise liner from the 80s.  As "*" isn't a
desirable part of directory names, just name the whole thing "fail/", the core
parts being stored in "fail/core/".

Additionally fixing two build system dependency issues:
 - missing jobserver -> protomessages dependency
 - broken bochs -> fail dependency (add_custom_target DEPENDS only allows plain
   file dependencies ... cmake for the win)


git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@956 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
2012-03-08 19:43:02 +00:00

360 lines
14 KiB
C

/*
* Copyright (c) 2005-2011 Imperas Software Ltd., www.imperas.com
*
* YOUR ACCESS TO THE INFORMATION IN THIS MODEL IS CONDITIONAL
* UPON YOUR ACCEPTANCE THAT YOU WILL NOT USE OR PERMIT OTHERS
* TO USE THE INFORMATION FOR THE PURPOSES OF DETERMINING WHETHER
* IMPLEMENTATIONS OF THE ARM ARCHITECTURE INFRINGE ANY THIRD
* PARTY PATENTS.
*
* THE LICENSE BELOW EXTENDS ONLY TO USE OF THE SOFTWARE FOR
* MODELING PURPOSES AND SHALL NOT BE CONSTRUED AS GRANTING
* A LICENSE TO CREATE A HARDWARE IMPLEMENTATION OF THE
* FUNCTIONALITY OF THE SOFTWARE LICENSED HEREUNDER.
* YOU MAY USE THE SOFTWARE SUBJECT TO THE LICENSE TERMS BELOW
* PROVIDED THAT YOU ENSURE THAT THIS NOTICE IS REPLICATED UNMODIFIED
* AND IN ITS ENTIRETY IN ALL DISTRIBUTIONS OF THE SOFTWARE,
* MODIFIED OR UNMODIFIED, IN SOURCE CODE OR IN BINARY FORM.
*
* Licensed under an Imperas Modfied Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.ovpworld.org/licenses/OVP_MODIFIED_1.0_APACHE_OPEN_SOURCE_LICENSE_2.0.pdf
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#ifndef ARM_STRUCTURE_H
#define ARM_STRUCTURE_H
// VMI header files
#include "vmi/vmiPorts.h"
#include "vmi/vmiTypes.h"
// model header files
#include "armConfig.h"
#include "armExceptionTypes.h"
#include "armSysRegisters.h"
#include "armMode.h"
#include "armTypeRefs.h"
#include "armVariant.h"
// processor debug flags
#define ARM_DISASSEMBLE_MASK 0x00000001
#define ARM_THUMB_MASK 0x00000002
#define ARM_DEBUG_MMU_MASK 0x00000004
#define ARM_DEBUG_EXCEPT_MASK 0x00000008
#define ARM_DUMP_SDFP_REG_MASK 0x00000010
#define ARM_DISASSEMBLE(_P) ((_P)->flags & ARM_DISASSEMBLE_MASK)
#define ARM_THUMB(_P) ((_P)->flags & ARM_THUMB_MASK)
#define ARM_DEBUG_MMU(_P) ((_P)->flags & ARM_DEBUG_MMU_MASK)
#define ARM_DEBUG_EXCEPT(_P) ((_P)->flags & ARM_DEBUG_EXCEPT_MASK)
#define ARM_DUMP_SDFP_REG(_P) ((_P)->flags & ARM_DUMP_SDFP_REG_MASK)
#define ARM_GPR_BITS 32
#define ARM_GPR_BYTES (ARM_GPR_BITS/8)
#define ARM_GPR_NUM 16
#define ARM_TEMP_NUM 12
#define ARM_VFP_REG_BITS 64
#define ARM_VFP_REG_BYTES 8
#define ARM_VFP16_REG_NUM 16
#define ARM_VFP32_REG_NUM 32
#define ARM_EXCEPT_NUM 512
#define ARM_EXCEPT_MASK_NUM ((ARM_EXCEPT_NUM+31)/32)
#define ARM_INTERRUPT_NUM 496
#define ARM_NO_TAG -1
// simulator compatibility modes
typedef enum armCompatModeE {
COMPAT_ISA, // conform to the documented ISA
COMPAT_GDB, // conform to gdb simulator
COMPAT_CODE_SOURCERY // conform to ARM CodeSourcery toolchain output (ignore BKPT)
} armCompatMode;
// arithmetic flags
typedef struct armArithFlagsS {
Uns8 ZF; // zero flag
Uns8 NF; // sign flag
Uns8 CF; // carry flag
Uns8 VF; // overflow flag
} armArithFlags;
// other flags
typedef struct armOtherFlagsS {
Uns8 HI; // hi flag (created on demand)
Uns8 LT; // lt flag (created on demand)
Uns8 LE; // le flag (created on demand)
Uns8 QF; // saturation flag
} armOtherFlags;
// ARM PSR (combines APSR, IPSR and EPSR)
typedef union armPSRU {
struct {
Uns32 exceptNum : 9; // exception number
Uns32 align4 : 1; // 4 byte alignment (in stack)
Uns32 IT72 : 6; // if-then state, bits 7:2
Uns32 GE : 4; // GE bits (unused when no DSP)
Uns32 _u1 : 4; // unused bits
Uns32 T : 1; // Thumb mode bit
Uns32 IT10 : 2; // if-then state, bits 1:0
Uns32 Q : 1; // DSP overflow/saturate flag
Uns32 V : 1; // overflow flag
Uns32 C : 1; // carry flag
Uns32 Z : 1; // zero flag
Uns32 N : 1; // sign flag
} fields;
Uns32 reg;
} armPSR;
// PSR Access Macros
#define PSR_FIELD(_A, _F) ((_A)->sregs.PSR.fields._F)
#define IN_USER_MODE(_A) (!PSR_FIELD(_A, exceptNum) && CONTROL_FIELD(_A, threadUnpriv))
#define IN_THUMB_MODE(_A) PSR_FIELD(_A, T)
#define IN_HANDLER_MODE(_A) (PSR_FIELD(_A, exceptNum) && True)
#define IN_BASE_MODE(_A) IN_USER_MODE(_A)
#define IN_PRIV_MPU_MODE(_A) (!IN_USER_MODE(_A) && MPU_ENABLED(_A))
// Masks for fields in PSR
#define PSR_FLAGS 0xf8000000
#define PSR_NZCV 0xf0000000
#define PSR_EXCEPT_NUM 0x000001ff
#define PSR_THUMB 0x01000000
#define PSR_IT10 0x06000000
#define PSR_IT72 0x0000fc00
#define PSR_GE 0x000f0000
#define PSR_GE3 0x00080000
#define PSR_GE2 0x00040000
#define PSR_GE1 0x00020000
#define PSR_GE0 0x00010000
#define PSR_GE32 (PSR_GE3|PSR_GE2)
#define PSR_GE10 (PSR_GE1|PSR_GE0)
#define PSR_GE30 (PSR_GE32|PSR_GE10)
#define PSR_IT (PSR_IT72 | PSR_IT10)
#define PSR_ALL (PSR_FLAGS | PSR_IT | PSR_THUMB | PSR_GE | PSR_EXCEPT_NUM)
#define PSR_NOT_FLAGS (PSR_ALL & ~(PSR_FLAGS | PSR_GE))
// ARM CONTROL
typedef union armCONTROLU {
struct {
Uns32 threadUnpriv : 1; // is thread mode unprivileged?
Uns32 useSP_Process : 1; // use SP_process stack
Uns32 FPCA : 1; // Is FP active in current context?
} fields;
Uns32 reg;
} armCONTROL;
// CONTROL Access Macros
#define CONTROL_FIELD(_A, _F) ((_A)->sregs.CONTROL.fields._F)
#define USE_SP_PROCESS(_A) CONTROL_FIELD(_A, useSP_Process)
// Masks for fields in CONTROL
#define CONTROL_FPCA 0x00000004
// ARM FPSCR
typedef union armFPSCRU {
struct {
Uns32 IOC : 1;
Uns32 DZC : 1;
Uns32 OFC : 1;
Uns32 UFC : 1;
Uns32 IXC : 1;
Uns32 _u1 : 2;
Uns32 IDC : 1;
Uns32 _u2 : 14;
Uns32 RMode : 2;
Uns32 FZ : 1;
Uns32 DN : 1;
Uns32 AHP : 1;
Uns32 _u3 : 1;
Uns32 V : 1;
Uns32 C : 1;
Uns32 Z : 1;
Uns32 N : 1;
} fields;
Uns32 reg;
} armFPSCR;
// FPSCR Access Macros
#define FPSCR_MASK 0xf7c0009f
#define FPSCR_REG(_A) ((_A)->sregs.FPSCR.reg)
#define FPSCR_FIELD(_A, _F) ((_A)->sregs.FPSCR.fields._F)
// Write Masks for fields in other control registers (with no structs)
#define PRIMASK_MASK 0x00000001
#define FAULTMASK_MASK 0x00000001
#define BASEPRI_MASK 0x000000ff
// Special register definitions
typedef struct armSpecialRegsS {
armPSR PSR;
armCONTROL CONTROL;
Uns32 PRIMASK;
Uns32 FAULTMASK;
Uns32 BASEPRI;
armFPSCR FPSCR;
} armSpecialRegs;
// Banked registers
typedef struct armBankRegsS {
// process stack pointer
Uns32 R13_process;
} armBankRegs;
typedef struct armDomainSetS {
memDomainP external; // external memory domain
memDomainP vmPriv; // virtual code domain, privileged mode
memDomainP vmUser; // virtual code domain, user mode
memDomainP system; // system domain
} armDomainSet, *armDomainSetP;
typedef enum armPIDSetE {
APS_PHYS, // physical domains (privileged or user mode)
APS_VM_P, // MMU/MPU-managed privileged mode domains
APS_VM_U, // MMU/MPU-managed user mode domains
APS_LAST // KEEP LAST: for sizing
} armPIDSet;
// decoder callback function to decode instruction at the passed address
#define ARM_DECODER_FN(_NAME) void _NAME( \
armP arm, \
Uns32 thisPC, \
armInstructionInfoP info \
)
typedef ARM_DECODER_FN((*armDecoderFn));
// Callback function to return size of instruction at the passed for the specified mode
#define ARM_ISIZE_FN(_NAME) Uns32 _NAME( \
armP arm, \
Uns32 thisPC, \
Bool isThumb \
)
typedef ARM_ISIZE_FN((*armIsizeFn));
// opaque type for MPU protection region
typedef struct protRegionS *protRegionP;
// VFP register bank
typedef union armVFPRS {
Uns8 b[ARM_VFP16_REG_NUM*8]; // when viewed as bytes
Uns16 h[ARM_VFP16_REG_NUM*4]; // When viewed as 16 bit halfwords
Uns32 w[ARM_VFP16_REG_NUM*2]; // when viewed as 32-bit words
Uns64 d[ARM_VFP16_REG_NUM]; // when viewed as 64-bit double words
} armVFPR;
#define FP_REG(_A, _I) ((_A)->vregs.w[(_I)])
// floating point control word type
typedef union armFPCWU {
Uns32 u32; // when viewed as composed value
vmiFPControlWord cw; // when viewed as fields
} armFPCW;
// processor structure
typedef struct armS {
// TRUE PROCESSOR REGISTERS
armArithFlags aflags; // arithmetic flags
armOtherFlags oflags; // other flags
Uns32 regs[ARM_GPR_NUM]; // current mode GPRs
armSpecialRegs sregs; // special purpose registers
// SIMULATOR SUPPORT
Uns32 temps[ARM_TEMP_NUM]; // temporary registers
Uns8 itStateRT; // if-then state (run time)
Uns8 itStateMT; // if-then state (morph time)
Uns8 divideTarget; // target of divide instruction
Uns8 disableReason; // reason why processor disabled
Bool eventRegister; // event register
Bool pendingInterrupt; // is interrupt pending?
armMode mode :8; // current processor mode
Bool validHI :1; // is hi flag valid?
Bool validLT :1; // is lt flag valid?
Bool validLE :1; // is le flag valid?
Bool checkEndian :1; // check endian using blockMask?
Bool checkL4 :1; // check interwork using blockMask?
Bool checkUnaligned :1; // check alignment mode using blockMask?
Bool disableTimerRVR0 :1; // disable timer (SYST_RVR==0)?
Bool sleepOnExit :1; // sleeping at exception exit?
Bool denormalInput :1; // input denormal sticky flag
memEndian instructionEndian:1; // instruction endianness
armExceptCxt exceptionContext :3; // exception context
Uns32 exclusiveTag; // tag for active exclusive access
Uns32 exclusiveTagMask; // mask to select exclusive tag bits
Uns32 priorityMask; // priority mask
Uns32 exceptNum; // total number of exceptions
Uns32 exceptMaskNum; // number of words in exception masks
Uns32 timerModulus; // modulus value for counter
Uns64 timerBase; // nominal counter base value
// SYSTEM AND BANKED REGISTERS (INFREQUENTLY USED AT RUN TIME)
armBankRegs bank; // banked registers
armSCSRegs scs; // SCS registers
// VFP REGISTERS
armFPCW currentCW; // current control word
armArithFlags sdfpAFlags; // FPU comparison flags
Uns8 sdfpFlags; // FPU operation flags
Uns8 sdfpSticky; // FPU sticky flags
armVFPR vregs; // VFP data registers
// VARIANT CONFIGURATION
Uns32 flags; // configuration flags
armConfig configInfo; // configuration register defaults
armCompatMode compatMode :2; // compatibility mode
Bool simEx :1; // simulate exceptions?
Bool verbose :1; // verbose messages enabled?
Bool showHiddenRegs :1; // show hidden registers in reg dump
Bool UAL :1; // disassemble using UAL syntax
Bool disableBitBand :1; // bit banding disabled
// MEMORY SUBSYSTEM SUPPORT
Bool restoreDomain :1; // whether to resore domain (LDRT, STRT)
protRegionP impu; // instruction/unified MPU
protRegionP dmpu; // data MPU (if not unified)
armDomainSet ids; // instruction domain set
armDomainSet dds; // data domain set
// NET HANDLES (used for NVIC)
Uns32 sysResetReq; // system reset requested
Uns32 intISS; // interrupt service started
Uns32 eventOut; // event output signal
Uns32 lockup; // lockup output signal
// EXCEPTION SUPPORT
Int32 unboostedPriority; // unboosted execution priority
Int32 executionPriority; // current execution priority
armExceptNum enabledException; // current enabled exception
armExceptNum pendingException; // current pending exception
armExceptNum derivedException; // pushStack/popStack exception
Uns32 nestedActivation; // used for handler->thread check
Uns32 xPend[ARM_EXCEPT_MASK_NUM]; // pending exceptions
Uns32 xActive[ARM_EXCEPT_MASK_NUM];// active exceptions
Uns32 xEnable[ARM_EXCEPT_MASK_NUM];// exception enables
Uns8 xPriority[ARM_EXCEPT_NUM]; // exception priorities
vmiNetPortP netPorts; // net ports on this variant
memDomainP FPCARdomain; // memory domain associated with the FPCAR
// INTERCEPT LIBRARY SUPPORT
armDecoderFn decoderCB; // generic instruction decoder
armIsizeFn isizeCB; // instruction size callback
} arm;
#endif