Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1227 lines
37 KiB

/*
* Copyright (c) 2000, Intel Corporation
* All rights reserved.
*
* WARRANTY DISCLAIMER
*
* THESE MATERIALS ARE PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THESE
* MATERIALS, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Intel Corporation is the author of the Materials, and requests that all
* problem reports or change requests be submitted to it directly at
* http://developer.intel.com/opensource.
*/
#ifndef EM_H
#define EM_H
/*** UPDATED TO 2.6 draft ***/
#include "iel.h"
#include "EM_hints.h"
/*****************************************************************************/
/*** ***/
/*** Enhanced mode architecture constants and macros ***/
/*** ***/
/*** NOTE: this header files assumes that the following typedef's exist: ***/
/*** U8, U16, U32, U64. iel.h contains these typedefs, but one ***/
/*** may want to define them differently. ***/
/*** ***/
/*****************************************************************************/
#define EM_BUNDLE_SIZE 16
#define EM_SYLLABLE_BITS 41
#define EM_DISPERSAL_POS 0
#define EM_DISPERSAL_BITS 5
#define EM_SBIT_POS 0
#define EM_TEMPLATE_POS 1
#define EM_TEMPLATE_BITS 4
#define EM_NUM_OF_TEMPLATES (1<<EM_TEMPLATE_BITS)
/*** including the reserved!!! ***/
#define EM_SYL2_POS (EM_DISPERSAL_POS+EM_DISPERSAL_BITS)
#define EM_MAJOR_OPCODE_POS 37
#define EM_MAJOR_OPCODE_BITS 4
#define EM_PREDICATE_POS 0
#define EM_PREDICATE_BITS 6
#define EM_IL_SLOT_BITS 4
#define EM_IL_SLOTS_MASK32 ((1<<EM_IL_SLOT_BITS)-1)
typedef enum
{
EM_SLOT_0=0,
EM_SLOT_1=1,
EM_SLOT_2=2,
EM_SLOT_LAST=3
} EM_slot_num_t;
/****************************************************************************/
/*** the following macros needs iel. Bundle assumed to be in U128 ***/
/*** Bring syllable binary to bits 0-40 of Syl; DO NOT mask off bits 41 ***/
/*** and on (for movl, can use Slot=2 but then Maj.Op. is in bits 79-82!) ***/
#define EM_GET_SYLLABLE(syl,bundle,slot) \
IEL_SHR((syl), (bundle), EM_SYL2_POS+(slot)*EM_SYLLABLE_BITS)
#define EM_GET_TEMPLATE(bundle) \
((IEL_GETDW0(bundle) >> EM_TEMPLATE_POS) & ((1<<EM_TEMPLATE_BITS)-1))
#define EM_TEMPLATE_IS_RESERVED(templt) \
(((templt)==3)||((templt)==10)||((templt)==13)||((templt)==15))
#define EM_IL_GET_BUNDLE_ADDRESS(il,addr) \
IEL_CONVERT2((addr),IEL_GETDW0(il) & \
(unsigned int)(~EM_IL_SLOTS_MASK32), \
IEL_GETDW1(il))
#define EM_IL_GET_SLOT_NO(il) (IEL_GETDW0(il) & EM_IL_SLOTS_MASK32)
#define EM_IL_SET(il,addr,slot) \
IEL_CONVERT2((il), IEL_GETDW0(addr) | (slot), IEL_GETDW1(addr))
#define EM_IS_IGNORED_SQUARE(template_role, major_opcode) \
(((template_role) == EM_TROLE_BR) && \
(major_opcode == 3 || major_opcode == 6) ? 1 : 0)
#define EM_IS_GENERIC_INST(impls_flag) \
((impls_flag == ArchRev0) || (impls_flag & Impl_Brl))
#define EM_IS_ITANIUM_INST(impls_flag) \
(EM_IS_GENERIC_INST(impls_flag) || (impls_flag & Impl_Ipref) || (impls_flag & Impl_Itanium))
/*****************************************************************************/
typedef U64 EM_IL; /* Instruction (syllable) Location */
typedef enum em_branch_type_s
{
EM_branch_type_none = 0x0,
EM_branch_type_direct_cond = 0x1,
EM_branch_type_direct_wexit = 0x2,
EM_branch_type_direct_wtop = 0x3,
EM_branch_type_direct_cloop = 0x4,
EM_branch_type_direct_cexit = 0x5,
EM_branch_type_direct_ctop = 0x6,
EM_branch_type_direct_call = 0x7,
EM_branch_type_direct_last = 0x8,
EM_branch_type_indirect_cond = 0x9,
EM_branch_type_indirect_ia = 0xa,
EM_branch_type_indirect_ret = 0xb,
EM_branch_type_indirect_call = 0xc,
EM_branch_type_last
} EM_branch_type_t;
typedef enum em_cmp_type_s
{
EM_cmp_type_none = 0, /* none (dstT=REL, dstF=!REL) */
EM_cmp_type_and = 1, /* and (dstT&=REL, dstF&=REL) */
EM_cmp_type_or = 2, /* or (dstT|=REL, dstF|=REL) */
EM_cmp_type_unc = 3, /* uncond (dstT=P&REL, dstF=P&!REL) */
EM_cmp_type_or_andcm = 4, /* or.andcm (dstT|=REL, dstF&=!REL) */
EM_cmp_type_last
} EM_cmp_type_t;
typedef enum EM_template_e
{
EM_template_mii = 0,
EM_template_mi_i = 1,
EM_template_mlx = 2,
/*** 3 reserved ***/
EM_template_mmi = 4,
EM_template_m_mi = 5,
EM_template_mfi = 6,
EM_template_mmf = 7,
EM_template_mib = 8,
EM_template_mbb = 9,
/*** 10 reserved ***/
EM_template_bbb = 11,
EM_template_mmb = 12,
/*** 13 reserved ***/
EM_template_mfb = 14,
/*** 15 reserved ***/
EM_template_last
} EM_template_t;
/***** Misc operands values: fclass, sync (stype), mux *****/
typedef enum em_fclass_bit
{
EM_fclass_bit_pos = 0 ,
EM_fclass_bit_neg = 1 ,
EM_fclass_bit_zero = 2 ,
EM_fclass_bit_unorm = 3 ,
EM_fclass_bit_norm = 4 ,
EM_fclass_bit_inf = 5 ,
EM_fclass_bit_signan = 6 ,
EM_fclass_bit_qnan = 7 ,
EM_fclass_bit_nat = 8
} EM_fclass_bit_t;
#define EM_FCLASS_POS (1<<EM_fclass_bit_pos ) /*** 0x001 ***/
#define EM_FCLASS_NEG (1<<EM_fclass_bit_neg ) /*** 0x002 ***/
#define EM_FCLASS_ZERO (1<<EM_fclass_bit_zero ) /*** 0x004 ***/
#define EM_FCLASS_UNORM (1<<EM_fclass_bit_unorm ) /*** 0x008 ***/
#define EM_FCLASS_NORM (1<<EM_fclass_bit_norm ) /*** 0x010 ***/
#define EM_FCLASS_INF (1<<EM_fclass_bit_inf ) /*** 0x020 ***/
#define EM_FCLASS_SIGNAN (1<<EM_fclass_bit_signan) /*** 0x040 ***/
#define EM_FCLASS_QNAN (1<<EM_fclass_bit_qnan ) /*** 0x080 ***/
#define EM_FCLASS_NAT (1<<EM_fclass_bit_nat ) /*** 0x100 ***/
#define EM_MUX_BRCST 0x0
#define EM_MUX_MIX 0x8
#define EM_MUX_SHUF 0x9
#define EM_MUX_ALT 0xA
#define EM_MUX_REV 0xB
/*** sync-stype: arbitrary! need fix!!! <flags> ***/ /* !!!!!??? */
#define EM_STYPE_LOAD 0x0
#define EM_STYPE_STORE 0x1
#define EM_STYPE_EXT 0x2
#define EM_STYPE_PURGE 0x4
#define EM_MAX_MEM_OPERAND_SIZE 32
#define EM_NUM_OF_PRIVILEGE_LEVELS 4
/*** shift of branch/chk (target21 <--> target25) ***/
#define EM_IPREL_TARGET_SHIFT_AMOUNT 4
/*****************************************************/
/***** register-related constants and structures *****/
/*****************************************************/
/* branch register structure definition */
typedef U64 EM_branch_reg_t;
typedef struct EM_FPSR_s
{
U4byte trap:6,sf0:13,sf1:13;
U4byte sf2:13,sf3:13,reserved:6;
} EM_FPSR_t;
#define EM_FPSR_S0_ABSOLUTE_MASK 0x7f
#define EM_FPSR_SFX_TD_MASK 0x40
#define EM_FPSR_SFX_PC_MASK 0x0c
#define EM_FPSR_SFX_RESERVED_PC_VALUE 0x04
typedef struct EM_RSC_s
{
U4byte mode:2, pl:2, be:1, reserved1:11, loadrs:14, reserved2:2;
U4byte reserved3;
} EM_RSC_t;
typedef struct EM_BSP_s
{
U4byte ignored:3,pointer_low:29;
U4byte pointer_high;
} EM_BSP_t;
typedef EM_BSP_t EM_BSPSTORE_t;
typedef struct EM_EC_s
{
U4byte count:6, ignored1:26;
U4byte ignored2;
} EM_EC_t;
typedef struct EM_RNAT_s
{
U4byte rse_nats_low;
U4byte rse_nats_high:31, ignored:1;
} EM_RNAT_t;
#define EM_FRAME_RRB_MASK_LOW 0x3ffff
#define EM_FRAME_RRB_MASK_HIGH 0xffffffc0
#define EM_FRAME_FP_RRB_MASK 0xfe000000
#define EM_FRAME_FP_RRB_BIT_POS 25
#define EM_FRAME_RRB_FR_LOW_BIT_MASK 0x2000000
#define EM_FRAME_SOL_POS 7
#define EM_FRAME_SOL_MASK 0x3f80
#define EM_FRAME_SOR_POS 14
#define EM_FRAME_SOR_MASK 0x3c000
#define EM_FRAME_SOR_ZERO_BITS_NUM 3
#define EM_FRAME_SOF_MASK 0x7f
typedef struct EM_frame_marker_s
{
U4byte sof:7, sol:7, sor:4, rrb_int:7, rrb_fp:7;
U4byte rrb_pred:6, reserved:26;
} EM_frame_marker_t;
#define EM_PFS_CPL_BIT_POS 30
#define EM_PFS_HIGH_EC_BIT_POS 20
#define EM_PFS_CPL_MASK 0xc0000000
#define EM_PFS_EC_MASK 0x03f00000
typedef struct EM_PFS_s
{
U4byte pfm_l;
U4byte pfm_h:6, reserved1:14, pec:6, reserved2:4, ppl:2;
} EM_PFS_t;
#define EM_PSR_CPL_MASK 0x3
#define EM_PSR_CPL_BIT_POS 0
#define EM_PSR_H_ED_MASK 0x800
#define EM_PSR_H_ED_BIT_POS 0xb
#define EM_PSR_H_MC_MASK 0x8
#define EM_PSR_H_IT_MASK 0x10
/*** PSR ***/
typedef struct EM_PSR_s
{
U4byte
reserved1:1, /* 0 */
be:1, /* 1 */
up:1, /* 2 */
ac:1, /* 3 */
mfl:1,/* 4 */
mfh:1,/* 5 */
reserved2:7,/* 6-12 */
ic:1, /* 13 */
i:1, /* 14 */
pk:1, /* 15 */
reserved3:1, /* 16 */
dt:1, /* 17 */
dfl:1,/* 18 */
dfh:1,/* 19 */
sp:1, /* 20 */
pp:1, /* 21 */
di:1, /* 22 */
si:1, /* 23 */
db:1, /* 24 */
lp:1, /* 25 */
tb:1, /* 26 */
rt:1, /* 27 */
reserved4:4; /* 28-31 */
U4byte
cpl:2, /* 32,33 */
is:1, /* 34 */
mc:1, /* 35 */
it:1, /* 36 */
id:1, /* 37 */
da:1, /* 38 */
dd:1, /* 39 */
ss:1, /* 40 */
ri:2, /* 41,42 */
ed:1, /* 43 */
bn:1, /* 44 */
ia:1, /* 45 */
reserved5:18; /* 46-63 */
} EM_PSR_t;
/*** DCR ***/
typedef struct EM_DCR_s
{
U4byte
pp:1, /* 0 */
be:1, /* 1 */
lc:1, /* 2 */
reserved1:5, /* 3-7 */
dm:1, /* 8 */
dp:1, /* 9 */
dk:1, /* 10 */
dx:1, /* 11 */
dr:1, /* 12 */
da:1, /* 13 */
dd:1, /* 14 */
reserved4:1, /* 15 , - was 'du' before eas24 and became reserved */
reserved2:16; /* 16-31 */
U4byte reserved3; /* 32-63 */
} EM_DCR_t;
/**** ITM ****/
typedef U64 EM_ITM_t;
/**** IVA ****/
typedef struct EM_IVA_s
{
U4byte
ignored:15,
iva_low:17;
U4byte iva_high;
} EM_IVA_t;
/**** PTA ****/
typedef struct EM_pta_s
{
U4byte
ve:1, /* 0 */
reserved1:1, /* 1 */
size:6, /* 2-7 */
vf:1, /* 8 */
reserved2:6, /* 9-14 */
base_low:17; /* 15-31 */
U4byte
base_high:32;/* 32-63 */
} EM_PTA_t;
/**** IPSR ****/
typedef EM_PSR_t EM_IPSR_t;
/**** ISR ****/
typedef struct EM_ISR_s
{
U4byte
code:16, /* 0-15 */
iA_vector:8, /* 16-23 */
reserved1:8; /* 24-31 */
U4byte
x:1, /* 32 */
w:1, /* 33 */
r:1, /* 34 */
na:1, /* 35 */
sp:1, /* 36 */
rs:1, /* 37 */
ir:1, /* 38 */
ni:1, /* 39 */
so:1, /* 40 */
ei:2, /* 41-42 */
ed:1, /* 43 */
reserved2:20;/* 44-63 */
} EM_ISR_t;
/* Low 12 bits of low word of IFA is defined as
ignored according to the TLB insertion format */
typedef struct EM_IFA_s
{
U4byte
ignored:12,
vpn_low:20;
U4byte
vpn_high;
} EM_IFA_t;
typedef struct EM_IIP_s
{
U4byte
vpn_low;
U4byte
vpn_high;
} EM_IIP_t;
typedef EM_IIP_t EM_vaddr_t;
/* Unimplemented virtual and physical addresses */
#define EM_MAX_IMPL_VA_MSB 60
#define EM_MIN_IMPL_VA_MSB 50
#define EM_MAX_IMPL_PA_MSB 62
#define EM_MIN_IMPL_PA_MSB 31
/**** ITIR ***/
typedef struct EM_itir_s
{
U4byte
reserved1:2, /* 0-1 */
ps:6, /* 2-7 */
key:24; /* 8-31 */
U4byte
reserved2:16, /* 32-47 */
reserved4:15, /* 48-62 - was ppn */
reserved3:1; /* 63 */
} EM_ITIR_t;
#define EM_ITR_PPN_HIGH_OFFSET 24
/**** IIPA ****/
typedef U64 EM_IIPA_t;
/**** IFS ****/
typedef struct
{
U4byte
ifm_low; /* 0-31 */
U4byte
ifm_high:6, /* 32-37 */
reserved:25, /* 38-62 */
v:1; /* 63 */
} EM_IFS_t;
/**** IIM ****/
typedef struct
{
U4byte
imm21:21, /* 0-20 */
ignored1:11; /* 21-31 */
U4byte ignored2; /* 32-63 */
} EM_IIM_t;
typedef struct EM_IHA_s
{
U4byte ignored:3,iha_low:29;
U4byte iha_high;
} EM_IHA_t;
/**** LID ****/
typedef struct
{
U4byte
reserved:16,
eid:8,
id:8;
U4byte ignored;
} EM_LID_t;
/**** IVR ****/
typedef struct
{
U4byte
vec:8, /* not "vector" due to IAS issues */
reserved:8,
ignored1:16;
U4byte ignored2;
} EM_IVR_t;
/**** TPR ****/
typedef struct
{
U4byte
ignored1:4,
mic:4,
reserved:8,
mmi:1,
ignored2:15;
U4byte ignored3;
} EM_TPR_t;
/**** EOI ****/
typedef struct
{
U4byte ignored1;
U4byte ignored2;
} EM_EOI_t;
/**** IRR ****/
typedef U64 EM_IRR_t;
/**** ITV ****/
typedef struct
{
U4byte
vec:8, /* not "vector" due to IAS issues */
reserved1:4,
zero:1,
reserved2:3,
m:1,
ignored1:15;
U4byte ignored2;
} EM_ITV_t;
/**** PMV ****/
typedef EM_ITV_t EM_PMV_t;
/**** LRR ****/
typedef struct
{
U4byte
vec:8, /* not "vector" due to IAS issues */
dm:3,
reserved1:1,
ignored3:1,
ipp:1,
reserved2:1,
tm:1,
m:1,
ignored1:15;
U4byte ignored2;
} EM_LRR_t;
/**** BHB ****/
typedef struct
{
U4byte
max:10,
ignored:2,
base_low:20;
U4byte
base_high;
} EM_BHB_t;
/**** THA ****/
typedef struct
{
U4byte
ptr:10,
bh:1,
ignored1:1,
vaddr:20;
U4byte
ignored2;
} EM_THA_t;
/**** CMCV ****/
typedef EM_ITV_t EM_CMCV_t;
/**** RR ****/
typedef struct EM_region_register_s
{
U4byte
ve:1, /* 0 */
reserved1:1, /* 1 */
ps:6, /* 2-7 */
rid:24; /* 8-31 */
U4byte reserved2; /* 32-63 */
} EM_RR_t;
/**** PKR ****/
typedef struct EM_key_register_s
{
U4byte
v:1, /* 0 */
wd:1, /* 1 */
rd:1, /* 2 */
xd:1, /* 3 */
reserved1:4, /* 4-7 */
key:24; /* 8-31 */
U4byte reserved2; /* 32-63 */
} EM_PKR_t;
typedef U64 EM_DBR_EVEN_t;
typedef U64 EM_IBR_EVEN_t;
typedef struct EM_DBR_ODD_s
{
U4byte mask_low; /* 0 - 31 */
U4byte mask_high:24, /* 32 - 55 */
plm:4, /* 56 - 59 */
ignored:2, /* 60 - 61 */
w:1, /* 62 */
r:1; /* 63 */
} EM_DBR_ODD_t;
typedef struct EM_IBR_ODD_s
{
U4byte mask_low; /* 0 - 31 */
U4byte mask_high:24, /* 32 - 55 */
plm:4, /* 56 - 59 */
ignored:3, /* 60 - 62 */
x:1; /* 63 */
} EM_IBR_ODD_t;
/**** PMC Registers ****/
/**** PMC0 ****/
typedef struct EM_PMC0_register_s
{
U4byte
fr:1, /* 0 */
ignored1:3, /* 1 - 3 */
overflow:4, /* 4 - 7 */
ignored2:24; /* 8 - 31 */
U4byte ignored3; /* 32 - 63 */
} EM_PMC0_t;
/**** PMC1 - PMC3 ****/
typedef U64 EM_PMC1_3_t;
/**** PMC4 - ****/
typedef struct EM_PMC_register_s
{
U4byte
plm:4, /* 0 - 3 */
ev:1, /* 4 */
oi:1, /* 5 */
pm:1, /* 6 */
ignored1:1, /* 7 */
es:8, /* 8 - 15 */
umask:4, /* 16 - 19 */
ignored2:12; /* 20 - 31 */
U4byte ignored3; /* 32 - 63 */
} EM_PMC_t;
typedef struct EM_PMD_register_s
{
U4byte count; /* 0 - 31 */
U4byte sxt; /* 32 - 63 */
} EM_PMD_t;
/* Number of implementet count bits in PMD */
#define EM_PMD_COUNT_SIZE 32
typedef U64 EM_MSR_t;
typedef struct EM_tlb_insert_reg_s
{
U4byte
p:1, /* 0 */
mx:1, /* 1 */
ma:3, /* 2-4 */
a:1, /* 5 */
d:1, /* 6 */
pl:2, /* 7-8 */
ar:3, /* 9-11 */
ppn_low:20; /* 12-31 */
U4byte
ppn_high:12, /* 32-43 */
reserved2:4, /* 44-47 - was ppn_high */
reserved1:4, /* 48-51 */
ed:1, /* 52 */
ignored:11; /* 63-63 */
} EM_tlb_insert_reg_t;
typedef enum
{
EM_TLB_ar_r_r_r, /* 000 */
EM_TLB_ar_rx_rx_rx, /* 001 */
EM_TLB_ar_rw_rw_rw, /* 010 */
EM_TLB_ar_rwx_rwx_rwx, /* 011 */
EM_TLB_ar_r_rw_rw, /* 100 */
EM_TLB_ar_rx_rx_rwx, /* 101 */
EM_TLB_ar_rwx_rw_rw, /* 110 */
EM_TLB_ar_x_x_rx, /* 111 */
EM_TLB_ar_last
} EM_page_access_right_t;
typedef enum
{ /* ma mx */
EM_VA_MA_WB = 0x0, /* 000 0 */
EM_VA_MA_WT = 0x4, /* 010 0 */
EM_VA_MA_WP = 0x6, /* 011 0 */
EM_VA_MA_UC = 0x8, /* 100 0 */
EM_VA_MA_UCC = 0x9, /* 100 1 */
EM_VA_MA_UCE = 0xa, /* 101 0 */
EM_VA_MA_WC = 0xc, /* 110 0 */
EM_VA_MA_NATPAGE = 0xe /* 111 0 */
} EM_vaddr_mem_attribute_t;
/* encodings of guest memory attributes */
typedef enum
{
EM_IA_GVA_MA_UC = 0x0, /* 000 */
EM_IA_GVA_MA_WC = 0x1, /* 001 */
EM_IA_GVA_MA_WT = 0x4, /* 100 */
EM_IA_GVA_MA_WP = 0x5, /* 101 */
EM_IA_GVA_MA_WB = 0x6, /* 110 */
EM_IA_GVA_MA_UC_MINUS = 0x7 /* 111 */
} EM_IA_vaddr_gmem_attribute_t;
/* In eas24: attr = ma + mx */
#define EM_VA_IS_MA_ATTRIBUTE_RESERVED(attr) \
(((attr) == 0x2) || ((attr) == 0x4) || ((attr) == 0x6) || \
((attr) & 0x1))
#define EM_GVA_IS_MA_ATTRIBUTE_RESERVED(attr) \
(((attr) == 0x1) || ((attr) == 0x2) || ((attr) == 0x3) || \
((attr) == 0x5) || ((attr) == 0x7) || ((attr) == 0xb) || \
((attr) == 0xd) || ((attr) == 0xf))
typedef EM_tlb_insert_reg_t EM_vhpt_short_format_t;
typedef struct EM_vhpt_long_format_s
{
U4byte
p:1, /* 0 */
mx:1, /* 1 */
ma:3, /* 2-4 */
a:1, /* 5 */
d:1, /* 6 */
pl:2, /* 7-8 */
ar:3, /* 9-11 */
ppn_low:20; /* 12-31 */
U4byte
ppn_mid:12, /* 32-43 */
reserved5:4, /* 44-47 - was ppn_mid*/
reserved1:4, /* 48-51 */
ed:1, /* 52 */
ignored:11; /* 53-63 */
U4byte
reserved2:2, /* 0-1 */
ps:6, /* 2-7 */
key:24; /* 8-31 */
U4byte
reserved3:16,/* 32-47 */
reserved6:15, /* 48-62 - was ppn_high */
reserved4:1; /* 63 */
U64 tag;
U64 avl3;
} EM_vhpt_long_format_t;
typedef struct EM_gvhpt_short_format_s
{
U4byte
p:1, /* 0 */
w:1, /* 1 */
u:1, /* 2 */
pa10:2, /* 3-4 */
a:1, /* 5 */
d:1, /* 6 */
pa2:1, /* 7 */
g:1, /* 8 */
ignored:3, /* 9-11 */
ppn:20; /* 12 - 31 */
}EM_gvhpt_short_format_t;
typedef struct EM_gvhpt_long_format_s
{
U4byte
p:1, /* 0 */
w:1, /* 1 */
u:1, /* 2 */
pa10:2, /* 3-4 */
a:1, /* 5 */
d:1, /* 6 */
pa2:1, /* 7 */
g:1, /* 8 */
ignored:3, /* 9-11 */
ppn_low:20; /* 12 - 31 */
U4byte
ppn_high:16, /* 32-47 */
reserved:16; /* 48-63 */
}EM_gvhpt_long_format_t;
/* the minimum VHPT size is 2^14 = 16K */
#define EM_MIN_VHPT_SIZE_POWER 14
/* define the number of registers */
#define EM_NUM_OF_GREGS 128
#define EM_NUM_OF_ADD22_GREGS 4
#define EM_NUM_OF_FPREGS 128
#define EM_NUM_OF_PREGS 64
#define EM_NUM_OF_BREGS 8
#define EM_NUM_OF_AREGS 128
#define EM_NUM_OF_CREGS 128
#define EM_NUM_OF_RREGS 8
#define EM_NUM_OF_PKREGS 16
#define EM_NUM_OF_DBREGS 32 /* guess for max value*/
#define EM_NUM_OF_IBREGS 32 /* guess for max value*/
#define EM_NUM_OF_PMCREGS 32 /* guess for max value*/
#define EM_NUM_OF_PMDREGS 32 /* guess for max value*/
#define EM_NUM_OF_MSREGS 2048 /* guess for max value*/
#define EM_NUM_OF_KREGS 8 /* kernel registers are AREGS */
#define EM_NUM_OF_CPUID_REGS 5 /* implementation independent part */
#define EM_NUM_OF_IRREGS 4
#define EM_NUM_OF_BANKED_REGS 16
#define EM_FIRST_BANKED_REG 16
#define EM_FIRST_IN_FP_LOW_REG_SET 0
#define EM_FIRST_IN_FP_HIGH_REG_SET 32
#define EM_PREDICATE_WIRED_TRUE 0
#define EM_STACK_BASE_REGISTER 32
#define EM_REGISTER_STACK_SIZE 96
#define EM_GREG_ROTATING_BASE 32
#define EM_PREG_ROTATING_BASE 16
#define EM_NUM_OF_ROTATING_PREGS (EM_NUM_OF_PREGS - EM_PREG_ROTATING_BASE)
#define EM_FPREG_ROTATING_BASE 32
#define EM_NUM_OF_ROTATING_FPREGS (EM_NUM_OF_FPREGS - EM_FPREG_ROTATING_BASE)
#define EM_GREGS_ROTATING_GROUPS 8
/* kernel registers macros */
#define EM_IS_AREG_A_KREG(n) (((n) >= EM_AR_KR0) && ((n) <= EM_AR_KR7))
#define EM_AREG_NUM_TO_KREG(n) ((n) - EM_AR_KR0)
#define EM_KREG_NUM_TO_AREG(n) ((n) + EM_AR_KR0)
#define EM_IS_KREG_A_AREG(n) ((n) < 7)
/* PSR user and system mask */
#define EM_PSR_UM_MASK 0x3f
#define EM_PSR_SM_MASK 0xffffff
#define EM_PSR_MFL_MASK 0x10
#define EM_PSR_MFH_MASK 0x20
/* instruction and data TLB translation registers information */
#define EM_TLB_MIN_DATA_TR_NUM 8
#define EM_TLB_MIN_INST_TR_NUM 8
#define EM_TLB_MAX_DATA_TR_NUM 256
#define EM_TLB_MAX_INST_TR_NUM 256
#define EM_TLB_MIN_TLB_TC_NUM 8
#define EM_TLB_MAX_TLB_TC_NUM 256
#define EM_TLB_DATA_TR_NUM_MASK 0xff
#define EM_TLB_INST_TR_NUM_MASK 0xff
/* define the special purpose application registers */
typedef enum
{
EM_AR_KR0 = 0,
EM_AR_KR1 = 1,
EM_AR_KR2 = 2,
EM_AR_KR3 = 3,
EM_AR_KR4 = 4,
EM_AR_KR5 = 5,
EM_AR_KR6 = 6,
EM_AR_KR7 = 7,
/* ar8-15 reserved */
EM_AR_RSC = 16,
EM_AR_BSP = 17,
EM_AR_BSPSTORE = 18,
EM_AR_RNAT = 19,
/* ar20 reserved */
EM_AR_FCR = 21,
/* ar22-23 reserved */
EM_AR_EFLAG = 24,
EM_AR_CSD = 25,
EM_AR_SSD = 26,
EM_AR_CFLG = 27,
EM_AR_FSR = 28,
EM_AR_FIR = 29,
EM_AR_FDR = 30,
/* ar31 reserved */
EM_AR_CCV = 32,
/* ar33-35 reserved */
EM_AR_UNAT = 36,
/* ar37-39 reserved */
EM_AR_FPSR = 40,
/* ar41-43 reserved */
EM_AR_ITC = 44,
/* ar45-47 reserved */
/* ar48-63 ignored */
EM_AR_PFS = 64,
EM_AR_LC = 65,
EM_AR_EC = 66,
/* ar67-111 reserved */
/* ar112-128 ignored */
EM_AR_LAST = 128
} EM_areg_num_t;
/*****************************/
/*** Control Registers ***/
/*****************************/
typedef enum
{
EM_CR_DCR = 0,
EM_CR_ITM = 1,
EM_CR_IVA = 2,
/*** 3-7 reserved ***/
EM_CR_PTA = 8,
EM_CR_GPTA = 9,
/*** 10-15 reserved ***/
EM_CR_IPSR = 16,
EM_CR_ISR = 17,
/*** 18 reserved ***/
EM_CR_IIP = 19,
EM_CR_IFA = 20,
EM_CR_ITIR = 21,
EM_CR_IIPA = 22,
EM_CR_IFS = 23,
EM_CR_IIM = 24,
EM_CR_IHA = 25,
/*** 25-63 reserved ***/
/*** SAPIC registers ***/
EM_CR_LID = 64,
EM_CR_IVR = 65,
EM_CR_TPR = 66,
EM_CR_EOI = 67,
EM_CR_IRR0 = 68,
EM_CR_IRR1 = 69,
EM_CR_IRR2 = 70,
EM_CR_IRR3 = 71,
EM_CR_ITV = 72,
EM_CR_PMV = 73,
EM_CR_CMCV = 74,
/*** 75-79 reserved ***/
EM_CR_LRR0 = 80,
EM_CR_LRR1 = 81,
/*** 82-127 reserved ***/
EM_CR_LAST = 128
} EM_creg_num_t;
typedef enum
{
EM_CPUID_VENDOR0 = 0,
EM_CPUID_VENDOR1 = 1,
EM_CPUID_SERIAL_NUM = 2,
EM_CPUID_VERSION = 3,
EM_CPUID_FEATURES = 4,
EM_CPUID_LAST
} EM_cpuid_num_t;
typedef enum
{
EM_GR_BHB = 6,
EM_GR_THA = 7
} EM_greg_num_t;
typedef struct EM_CPUID_version_s
{
U4byte
number:8,
revision:8,
model:8,
family:8;
U4byte
archrev:8,
reserved1:24;
} EM_CPUID_version_t;
#define EM_NUM_OF_M_ROLE_APP_REGS 64
#define EM_NUM_OF_I_ROLE_APP_REGS (EM_NUM_OF_AREGS - \
EM_NUM_OF_M_ROLE_APP_REGS)
#define EM_APP_REG_IS_I_ROLE(ar_no) ((ar_no) >= EM_NUM_OF_M_ROLE_APP_REGS)
#define EM_APP_REG_IS_RESERVED(ar_no) ((((ar_no) > 7) && ((ar_no) < 16)) ||\
(((ar_no) > 19) && ((ar_no) < 21)) ||\
(((ar_no) > 21) && ((ar_no) < 24)) ||\
(((ar_no) > 30) && ((ar_no) < 32)) ||\
(((ar_no) > 32) && ((ar_no) < 36)) ||\
(((ar_no) > 36) && ((ar_no) < 40)) ||\
(((ar_no) > 40) && ((ar_no) < 44)) ||\
(((ar_no) > 44) && ((ar_no) < 48)) ||\
(((ar_no) > 66) && ((ar_no) < 112)))
#define EM_APP_REG_IS_IGNORED(ar_no) ((((ar_no) > 47) && ((ar_no) < 64))||\
((ar_no) > 111))
#define EM_CREG_IS_I_ROLE(cr_no) 0
#define EM_CREG_IS_RESERVED(cr_no) ((((cr_no) > 2) && ((cr_no) < 8)) ||\
(((cr_no) > 9) && ((cr_no) < 16)) ||\
((cr_no) == 18) ||\
(((cr_no) > 25) && ((cr_no) < 64)) ||\
(((cr_no) > 74) && ((cr_no) < 80)) ||\
((cr_no) > 81))
#define EM_PMD_IS_IMPLEMENTED(pmd_no) ((pmd_no) > 3 && (pmd_no) < 8)
#define EM_PMC_IS_IMPLEMENTED(pmc_no) ((pmc_no) < 8)
/* Interruption Priorities, taken from Table 10-5 in EAS2.4. */
typedef enum EM_interruption_e
{
EM_INTR_NONE = 0,
/* Aborts: IA32, IA64 */
EM_INTR_MACHINE_RESET = 1,
EM_INTR_MACHINE_CHECK_ABORT = 2,
/* Interrupts: IA32, IA64 */
EM_INTR_PLATFORM_MANAGEMENT_INTERRUPT = 3,
EM_INTR_EXTERNAL_INTERRUPT = 4,
/* Faults: IA64 */
EM_INTR_IR_UNIMPLEMENTED_DATA_ADDRESS_FAULT = 5,
EM_INTR_IR_DATA_NESTED_TLB_FAULT = 6,
EM_INTR_IR_ALT_DATA_TLB_FAULT = 7,
EM_INTR_IR_VHPT_DATA_FAULT = 8,
EM_INTR_IR_DATA_TLB_FAULT = 9,
EM_INTR_IR_DATA_PAGE_NOT_PRESENT_FAULT = 10,
EM_INTR_IR_DATA_NAT_PAGE_CONSUMPTION_FAULT = 11,
EM_INTR_IR_DATA_KEY_MISS_FAULT = 12,
EM_INTR_IR_DATA_KEY_PERMISSION_FAULT = 13,
EM_INTR_IR_DATA_ACCESS_RIGHT_FAULT = 14,
EM_INTR_IR_DATA_ACCESS_BIT_FAULT = 15,
EM_INTR_IR_DATA_DEBUG_FAULT = 16,
/* Faults: IA32 */
EM_INTR_IA_INST_BREAKPOINT_FAULT = 17,
EM_INTR_IA_CODE_FETCH_FAULT = 18,
/* Faults: IA32, IA64 */
EM_INTR_INST_ALT_TLB_FAULT = 19,
EM_INTR_INST_VHPT_FAULT = 20,
EM_INTR_INST_TLB_FAULT = 21,
EM_INTR_INST_PAGE_NOT_PRESENT_FAULT = 22,
EM_INTR_INST_NAT_PAGE_CONSUMPTION_FAULT = 23,
EM_INTR_INST_KEY_MISS_FAULT = 24,
EM_INTR_INST_KEY_PERMISSION_FAULT = 25,
EM_INTR_INST_ACCESS_RIGHT_FAULT = 26,
EM_INTR_INST_ACCESS_BIT_FAULT = 27,
/* Faults: IA64 */
EM_INTR_INST_DEBUG_FAULT = 28,
/* Faults: IA32 */
EM_INTR_IA_INST_LENGTH_FAULT = 29,
EM_INTR_IA_INVALID_OPCODE_FAULT = 30,
EM_INTR_IA_INST_INTERCEPT_FAULT = 31,
/* Faults: IA64 */
EM_INTR_ILLEGAL_OPERATION_FAULT = 32,
EM_INTR_BREAK_INSTRUCTION_FAULT = 33,
EM_INTR_PRIVILEGED_OPERATION_FAULT = 34,
/* Faults: IA32, IA64 */
EM_INTR_DISABLED_FP_REGISTER_FAULT = 35,
EM_INTR_DISABLED_ISA_TRANSITION_FAULT = 36,
/* Faults: IA32 */
EM_INTR_IA_COPROCESSOR_NOT_AVAILABLE_FAULT = 37,
EM_INTR_IA_FP_ERROR_FAULT = 38,
/* Faults: IA32, IA64 */
EM_INTR_REGISTER_NAT_CONSUMPTION_FAULT = 39,
/* Faults: IA64 */
EM_INTR_RESERVED_REGISTER_FIELD_FAULT = 40,
EM_INTR_PRIVILEGED_REGISTER_FAULT = 41,
EM_INTR_SPECULATIVE_OPERATION_FAULT = 42,
/* Faults: IA32 */
EM_INTR_IA_STACK_EXCEPTION_FAULT = 43,
EM_INTR_IA_GENERAL_PROTECTION_FAULT = 44,
/* Faults: IA32, IA64 */
EM_INTR_DATA_NESTED_TLB_FAULT = 45,
EM_INTR_DATA_ALT_TLB_FAULT = 46,
EM_INTR_DATA_VHPT_FAULT = 47,
EM_INTR_DATA_TLB_FAULT = 48,
EM_INTR_DATA_PAGE_NOT_PRESENT_FAULT = 49,
EM_INTR_DATA_NAT_PAGE_CONSUMPTION_FAULT = 50,
EM_INTR_DATA_KEY_MISS_FAULT = 51,
EM_INTR_DATA_KEY_PERMISSION_FAULT = 52,
EM_INTR_DATA_ACCESS_RIGHT_FAULT = 53,
EM_INTR_DATA_DIRTY_BIT_FAULT = 54,
EM_INTR_DATA_ACCESS_BIT_FAULT = 55,
/* Faults: IA64 */
EM_INTR_DATA_DEBUG_FAULT = 56,
EM_INTR_UNALIGNED_DATA_REFERENCE_FAULT = 57,
/* Faults: IA32 */
EM_INTR_IA_UNALIGNED_DATA_REFERENCE_FAULT = 58,
EM_INTR_IA_LOCKED_DATA_REFERENCE_FAULT = 59,
EM_INTR_IA_SEGMENT_NOT_PRESENT_FAULT = 60,
EM_INTR_IA_DIVIDE_BY_ZERO_FAULT = 61,
EM_INTR_IA_BOUND_FAULT = 62,
EM_INTR_IA_KNI_NUMERIC_ERROR_FAULT = 63,
/* Faults: IA64 */
EM_INTR_LOCKED_DATA_REFERENCE_FAULT = 64,
EM_INTR_FP_EXCEPTION_FAULT = 65,
/* Traps: IA64 */
EM_INTR_UNIMPLEMENTED_INST_ADDRESS_TRAP = 66,
EM_INTR_FP_TRAP = 67,
EM_INTR_LOWER_PRIVILEGE_TARNSFER_TRAP = 68,
EM_INTR_TAKEN_BRANCH_TRAP = 69,
EM_INTR_SINGLE_STEP_TRAP = 70,
/* Traps: IA32 */
EM_INTR_IA_SYSTEM_FLAG_INTERCEPT_TRAP = 71,
EM_INTR_IA_GATE_INTERCEPT_TRAP = 72,
EM_INTR_IA_INTO_TRAP = 73,
EM_INTR_IA_BREAKPOINT_TRAP = 74,
EM_INTR_IA_SOFTWARE_INTERRUPT_TRAP = 75,
EM_INTR_IA_DATA_DEBUG_TRAP = 76,
EM_INTR_IA_TAKEN_BRANCH_TRAP = 77,
EM_INTR_IA_SINGLE_STEP_TRAP = 78,
EM_INTR_LAST = 79
} EM_interruption_t;
/* Interruption Vectors, taken from Table 10-6 in EAS2.4. */
typedef enum
{
EM_VECTOR_VHPT_TRANSLATION = 0x0000,
EM_VECTOR_INST_TLB = 0x0400,
EM_VECTOR_DATA_TLB = 0x0800,
EM_VECTOR_INST_ALT_TLB = 0x0c00,
EM_VECTOR_DATA_ALT_TLB = 0x1000,
EM_VECTOR_DATA_NESTED_TLB = 0x1400,
EM_VECTOR_INST_KEY_MISS = 0x1800,
EM_VECTOR_DATA_KEY_MISS = 0x1C00,
EM_VECTOR_DIRTY_BIT = 0x2000,
EM_VECTOR_INST_ACCESS_BIT = 0x2400,
EM_VECTOR_DATA_ACCESS_BIT = 0x2800,
EM_VECTOR_BREAK_INSTRUCTION = 0x2C00,
EM_VECTOR_EXTERNAL_INTERRUPT = 0x3000,
/*** reserved: 0x3400 through 0x4c00 ***/
EM_VECTOR_PAGE_NOT_PRESENT = 0x5000,
EM_VECTOR_KEY_PERMISSION = 0x5100,
EM_VECTOR_INST_ACCESS_RIGHT = 0x5200,
EM_VECTOR_DATA_ACCESS_RIGHT = 0x5300,
EM_VECTOR_GENERAL_EXCEPTION = 0x5400,
EM_VECTOR_DISABLED_FP_REGISTER = 0x5500,
EM_VECTOR_NAT_CONSUMPTION = 0x5600,
EM_VECTOR_SPECULATION = 0x5700,
/*** reserved: 0x5800 ***/
EM_VECTOR_DEBUG = 0x5900,
EM_VECTOR_UNALIGNED_REFERENCE = 0x5A00,
EM_VECTOR_LOCKED_DATA_REFERENCE = 0x5B00,
EM_VECTOR_FP_EXCEPTION = 0x5C00,
EM_VECTOR_FP_TRAP = 0x5D00,
EM_VECTOR_LOWER_PRIVILEGE_TRANSFER = 0x5E00,
EM_VECTOR_TAKEN_BRANCH = 0x5F00,
EM_VECTOR_SINGLE_STEP = 0x6000,
/*** reserved: 0x6100 through 0x6800 ***/
EM_VECTOR_IA_EXCEPTIONS = 0x6900,
EM_VECTOR_IA_INTERCEPTIONS = 0x6A00,
EM_VECTOR_IA_INTERRUPTIONS = 0x6B00
/*** reserved: 0x6c00 through 0x7f00 ***/
} EM_vector_t;
#define EM_INTR_ISR_CODE_TPA 0
#define EM_INTR_ISR_CODE_FC 1
#define EM_INTR_ISR_CODE_PROBE 2
#define EM_INTR_ISR_CODE_TAK 3
#define EM_INTR_ISR_CODE_LFETCH 4
#define EM_INTR_ISR_CODE_PROBE_FAULT 5
#define EM_ISR_CODE_ILLEGAL_OPERATION 0x0
#define EM_ISR_CODE_PRIVILEGED_OPERATION 0x10
#define EM_ISR_CODE_PRIVILEGED_REGISTER 0x20
#define EM_ISR_CODE_RESERVED_REGISTER_FIELD 0x30
#define EM_ISR_CODE_ILLEGAL_ISA_TRANSITION 0x40
#define EM_ISR_CODE_F0_F15 0
#define EM_ISR_CODE_F16_F127 1
#define EM_ISR_CODE_NAT_REGISTER_CONSUMPTION 0x10
#define EM_ISR_CODE_NAT_PAGE_CONSUMPTION 0x20
#define EM_ISR_CODE_INST_DEBUG 0
#define EM_ISR_CODE_DATA_DEBUG 1
#define EM_ISR_CODE_FP_IEEE_V 0x0001
#define EM_ISR_CODE_FP_IA_DENORMAL 0x0002
#define EM_ISR_CODE_FP_IEEE_Z 0x0004
#define EM_ISR_CODE_FP_SOFT_ASSIST 0x0008
#define EM_ISR_CODE_FP_IEEE_O 0x0800
#define EM_ISR_CODE_FP_IEEE_U 0x1000
#define EM_ISR_CODE_FP_IEEE_I 0x2000
#define EM_ISR_CODE_FP_EXPONENT 0x4000
#define EM_ISR_CODE_FP_ROUNDING_ADD_1 0x8000
#define EM_ISR_CODE_MASK_IA_TRAP 0x02
#define EM_ISR_CODE_MASK_IA_DATA_DEBUG_TRAP 0x00
#define EM_ISR_CODE_MASK_FP_TRAP 0x01
#define EM_ISR_CODE_MASK_LOWER_PRIV 0x02
#define EM_ISR_CODE_MASK_TAKEN_BRANCH 0x04
#define EM_ISR_CODE_MASK_SINGLE_STEP 0x08
#define EM_ISR_CODE_MASK_UNIMPLEMENTED_INST 0x10
#define EM_ISR_VECTOR_MASK_IA_TRAP 0x1
#define EM_ISR_VECTOR_MASK_EM_TRAP 0x0
#define EM_ISR_CODE_CHK_A_GR 0
#define EM_ISR_CODE_CHK_S_GR 1
#define EM_ISR_CODE_CHK_A_FP 2
#define EM_ISR_CODE_CHK_S_FP 3
#define EM_ISR_CODE_CHK_FCHK 4
/*** SAPIC definitions ***/
#define EM_SAPIC_SPURIOUS_VECTOR_NUM 0x0f
#define EM_SAPIC_SIZE_OF_INTERRUPT_GROUP 16
#define EM_SAPIC_NUM_OF_INTERRUPT_GROUPS 16
#define EM_SAPIC_GROUPS_IN_IRR 4
#define EM_SAPIC_GROUP(vec) \
((vec) / EM_SAPIC_NUM_OF_INTERRUPT_GROUPS)
#define EM_SAPIC_IRR(vec) \
((vec) / (EM_SAPIC_NUM_OF_INTERRUPT_GROUPS*EM_SAPIC_GROUPS_IN_IRR))
#define EM_SAPIC_IRR_BIT_POS(vec) \
((vec) % (EM_SAPIC_NUM_OF_INTERRUPT_GROUPS*EM_SAPIC_GROUPS_IN_IRR))
/*** version strings at the .comment section ***/
#define EM_IAS_OBJECT_FILE_NAME "!!!!Object file name: "
#define EM_IAS_VER_NUMBER "!!!!Major Version "
#define EM_IAS_VERSION_COMMENT "!!!!EM_EAS2.6"
/*** architecture and API versions ***/
#define EM_EAS_MAJOR_VERSION 2
#define EM_EAS_MINOR_VERSION 6
#define EM_API_MAJOR_VERSION 9
#define EM_API_MINOR_VERSION 6
/*** END OF EM_H Enhanced Mode ARCHITECTURE ***/
#endif /*** EM_H ***/