/**/ /***************************************************************************/ /** **/ /** © Copyright 2010, Hewlett-Packard Development Company, L.P. **/ /** **/ /** Confidential computer software. Valid license from HP and/or **/ /** its subsidiaries required for possession, use, or copying. **/ /** **/ /** Consistent with FAR 12.211 and 12.212, Commercial Computer Software, **/ /** Computer Software Documentation, and Technical Data for Commercial **/ /** Items are licensed to the U.S. Government under vendor's standard **/ /** commercial license. **/ /** **/ /** Neither HP nor any of its subsidiaries shall be liable for technical **/ /** or editorial errors or omissions contained herein. The information **/ /** in this document is provided "as is" without warranty of any kind and **/ /** is subject to change without notice. The warranties for HP products **/ /** are set forth in the express limited warranty statements accompanying **/ /** such products. Nothing herein should be construed as constituting an **/ /** additional warranty. **/ /** **/ /***************************************************************************/ /********************************************************************************************************************************/ /* Created: 30-Mar-2010 17:24:39 by OpenVMS SDL EV3-3 */ /* Source: 09-APR-2004 10:54:15 $1$DGA7274:[LIB_H.SRC]PTEDEF.SDL;1 */ /********************************************************************************************************************************/ /*** MODULE $PTEDEF ***/ #ifndef __PTEDEF_LOADED #define __PTEDEF_LOADED 1 #pragma __nostandard /* This file uses non-ANSI-Standard features */ #pragma __member_alignment __save #pragma __nomember_alignment #ifdef __INITIAL_POINTER_SIZE /* Defined whenever ptr size pragmas supported */ #pragma __required_pointer_size __save /* Save the previously-defined required ptr size */ #pragma __required_pointer_size __short /* And set ptr size default to 32-bit pointers */ #endif #ifdef __cplusplus extern "C" { #define __unknown_params ... #define __optional_params ... #else #define __unknown_params #define __optional_params ... #endif #ifndef __struct #if !defined(__VAXC) #define __struct struct #else #define __struct variant_struct #endif #endif #ifndef __union #if !defined(__VAXC) #define __union union #else #define __union variant_union #endif #endif /*+ */ /* Define page table entry vields and values */ /*- */ #define PTE$C_BYTES_PER_PTE 8 /* Byte length of Page Table Entry */ #define PTE$C_SHIFT_SIZE 3 /* PTE size as a power of 2 */ /* */ /* Vield definition for "valid" PTEs */ /* */ #define PTE$M_VALID 0x1 #define PTE$M_FOR 0x2 #define PTE$M_FOW 0x4 #define PTE$M_FOE 0x8 #define PTE$M_ASM 0x10 #define PTE$M_GH 0x60 #define PTE$C_GROUP_OF_1 0 /* Page in group of 1 */ #define PTE$C_GROUP_OF_8 1 /* Page in group of 8 */ #define PTE$C_GROUP_OF_64 2 /* Page in group of 64 */ #define PTE$C_GROUP_OF_512 3 /* Page in group of 512 */ #define PTE$M_NO_MB 0x80 #define PTE$M_PROT 0xFF00 #define PTE$M_SOFTWARE 0xFFFF0000 #define PTE$M_PFN 0xFFFFFFFF00000000 #define PTE$M_KRE 0x100 #define PTE$M_ERE 0x200 #define PTE$M_SRE 0x400 #define PTE$M_URE 0x800 #define PTE$M_KWE 0x1000 #define PTE$M_EWE 0x2000 #define PTE$M_SWE 0x4000 #define PTE$M_UWE 0x8000 #define PTE$M_DUMPKEY 0x100 #define PTE$M_DUMPOTHER 0x200 #define PTE$M_WINDOW 0x10000 #define PTE$M_OWN 0x60000 #define PTE$M_MODIFY 0x100000 #define PTE$M_CPY 0x30000000 #define PTE$M_NOX 0x40000000 #define PTE$M_S0_MBZ 0x80000000 #define PTE$M_TYP0 0x10000 #define PTE$M_PARTIAL_SECTION 0x80000 #define PTE$M_TYP1 0x100000 #define PTE$M_STX 0xFFFF00000000 #define PTE$M_CRF 0x1000000000000 #define PTE$M_DZRO 0x2000000000000 #define PTE$M_WRT 0x4000000000000 #define PTE$M_PGFLPAG 0xFFFFFF00000000 #define PTE$M_PGFLX 0xFF00000000000000 #define PTE$M_PGFLMAP 0xFFFFFFFF00000000 #define PTE$M_GPTX 0xFFFFFFFF00000000 #define PTE$M_BAKX 0xFFFFFFFF00000000 #define PTE$C_NOPGFLPAG 255 /*+ */ #define PTE$C_NA 0 /* No Access */ #define PTE$C_KR 256 /* Kernel Read only */ #define PTE$C_KW 4352 /* Kernel Write */ #define PTE$C_ER 768 /* Exec Read only */ #define PTE$C_EW 13056 /* Exec Write */ #define PTE$C_SR 1792 /* Super Read only */ #define PTE$C_SW 30464 /* Super Write */ #define PTE$C_UR 3840 /* User Read only */ #define PTE$C_UW 65280 /* User Write */ #define PTE$C_ERKW 4864 /* Exec Read Kernel Write */ #define PTE$C_SRKW 5888 /* Super Read Kernel Write */ #define PTE$C_SREW 14080 /* Super Read Exec Write */ #define PTE$C_URKW 7936 /* User Read Kernel Write */ #define PTE$C_UREW 16128 /* User Read Exec Write */ #define PTE$C_URSW 32512 /* User Read Super Write */ /*+ */ #define PTE$C_KOWN 0 /* Kernel Owner Mode */ #define PTE$C_EOWN 131072 /* Executive Owner Mode */ #define PTE$C_SOWN 262144 /* Supervisor Owner Mode */ #define PTE$C_UOWN 393216 /* User Owner Mode */ /*+ */ #define PTE$C_COPY 0 /* Copy */ #define PTE$C_NOCOPY 268435456 /* No copy */ #define PTE$C_DZRO 536870912 /* Copy as DZRO */ /*+ */ #define PTE$C_DZRO_L1PTE 4352 /* Kernel Write */ #define PTE$C_DZRO_L2PTE 1073746688 /* NOX, ERKW */ #if !defined(__NOBASEALIGN_SUPPORT) && !defined(__cplusplus) /* If using pre DECC V4.0 or C++ */ #pragma __nomember_alignment __quadword #else #pragma __nomember_alignment #endif typedef struct _pte { #pragma __nomember_alignment __union { __struct { unsigned pte$v_valid : 1; /* VALID bit */ unsigned pte$v_for : 1; /* Fault On Read */ unsigned pte$v_fow : 1; /* Fault On Write */ unsigned pte$v_foe : 1; /* Fault On Execute */ unsigned pte$v_asm : 1; /* Address Space Match */ unsigned pte$v_gh : 2; /* Granularity Hint */ unsigned pte$v_no_mb : 1; /* No MB required in TB miss flow */ unsigned pte$v_prot : 8; /* Page Protection */ unsigned pte$v_software : 16; /* Bits Reserved to Software */ unsigned pte$v_pfn : 32; /* Page Frame Number */ } pte$r_ptedef_bits0; __struct { unsigned pte$v_filler_1 : 8; unsigned pte$v_kre : 1; /* Kernel Read Enable */ unsigned pte$v_ere : 1; /* Executive Read Enable */ unsigned pte$v_sre : 1; /* Supervisor Read Enable */ unsigned pte$v_ure : 1; /* User Read Enable */ unsigned pte$v_kwe : 1; /* Kernel Write Enable */ unsigned pte$v_ewe : 1; /* Executive Write Enable */ unsigned pte$v_swe : 1; /* Supervisor Write Enable */ unsigned pte$v_uwe : 1; /* User Write Enable */ } pte$r_ptedef_prot; __struct { unsigned pte$v_filler_13 : 8; unsigned pte$v_dumpkey : 1; /* Global page must be dumped on key pass */ unsigned pte$v_dumpother : 1; /* Global page must be dumped on other pass */ unsigned pte$v_fill_0_ : 6; } pte$r_ptedef_bugchk; __struct { /* (ASM can only be set if valid is set */ /* so, we use this trick for porting) */ unsigned pte$v_filler_12 : 1; unsigned pte$v_fault_bits : 3; /* For SDA */ unsigned pte$v_filler_2 : 4; unsigned pte$v_prot_read : 4; /* For SDA */ unsigned pte$v_prot_write : 4; /* For SDA */ unsigned pte$v_window : 1; /* Windowed Page Bit */ unsigned pte$v_own : 2; /* Page Owner Mode */ unsigned pte$v_filler_9 : 1; unsigned pte$v_modify : 1; /* Page Modified Bit */ unsigned pte$v_sw_reserved : 7; /* For SDA */ unsigned pte$v_cpy : 2; /* Copy characteristic */ unsigned pte$v_nox : 1; /* No Execute Access Allowed */ unsigned pte$v_s0_mbz : 1; /* S0 space bit: MBZ in PTE */ } pte$r_ptedef_swbits; /* */ /* Vield definitions for various invalid forms of PTE */ /* */ __struct { unsigned pte$v_filler_3 : 16; /* skip hardware bits */ unsigned pte$v_typ0 : 1; /* TYP0 Bit */ unsigned pte$v_filler_4 : 2; /* Overlays page owner */ unsigned pte$v_partial_section : 1; /* Only part of page maps to section */ unsigned pte$v_typ1 : 1; /* TYP1 Bit */ unsigned pte$v_fill_1_ : 3; } pte$r_ptedef_bits1; __union { __struct { unsigned pte$v_filler_5 : 32; /* skip to PFN field */ unsigned pte$v_stx : 16; /* Section Table Index */ unsigned pte$v_crf : 1; /* Copy on Reference */ unsigned pte$v_dzro : 1; /* Demand Zero */ unsigned pte$v_wrt : 1; /* Section file accessed for write */ unsigned pte$v_filler_17 : 13; /* Not marked 'fill' for SDA */ } pte$r_stx_bits; __struct { unsigned pte$v_filler_6 : 32; /* skip to PGFLPAG field */ unsigned pte$v_pgflpag : 24; /* Page File Page Number (not a VBN) */ unsigned pte$v_pgflx : 8; /* System page file index */ } pte$r_bak_pgfl; __struct { unsigned pte$v_filler_16 : 32; unsigned pte$v_pgflmap : 32; /* Page file page number and index */ } pte$r_bak_pgflmap; __struct { unsigned pte$v_filler_8 : 32; /* skip to GPTX field */ unsigned pte$v_gptx : 32; /* Global Page Table Index */ } pte$r_gptx_overlay; __struct { unsigned pte$v_filler_7 : 32; /* skip to PFN field */ unsigned pte$v_bakx : 32; /* Backup Address (uninterpreted) */ } pte$r_bakx_bits; } pte$r_ptedef_pfn; __union { unsigned __int64 pte$q_entry; /* The entire page table entry */ } pte$r_ptedef_entry_qw; __struct { unsigned int pte$l_entry_l; /* The low longword of the PTE */ unsigned int pte$l_entry_h; /* The high longword of the PTE */ } pte$r_ptedef_entry_lw; } pte$r_pte_union; /*+ */ /* Define a constant indicating "no pagefile page assigned": all bits set in PGFLX */ /*- */ /* Protection field definitions. These protection encodings provide */ /* a way to express page protection using VAX-like protection symbols. */ /*- */ /*+ */ /* These constants are not meant to be shifted into the PROT position. */ /* They incorporate protection information as bitmasks relative to the */ /* start of a PTE already. */ /*- */ /* OWNer mode field definitions */ /* */ /* These constants are not meant to be shifted into the owner field. They */ /* incorporate ownership information as a bitmask relative to the start of */ /* a PTE already. */ /*_ */ /* CoPY field definitions */ /* */ /* These constants are not meant to be shifted into the copy characteristic */ /* field. They incorporate copy characteristic information relative to the */ /* start of a PTE already. */ /*_ */ /* Demand zero PTE defintions for L1 and L2 PTEs */ /*- */ } PTE; #if !defined(__VAXC) #define pte$v_valid pte$r_pte_union.pte$r_ptedef_bits0.pte$v_valid #define pte$v_for pte$r_pte_union.pte$r_ptedef_bits0.pte$v_for #define pte$v_fow pte$r_pte_union.pte$r_ptedef_bits0.pte$v_fow #define pte$v_foe pte$r_pte_union.pte$r_ptedef_bits0.pte$v_foe #define pte$v_asm pte$r_pte_union.pte$r_ptedef_bits0.pte$v_asm #define pte$v_gh pte$r_pte_union.pte$r_ptedef_bits0.pte$v_gh #define pte$v_no_mb pte$r_pte_union.pte$r_ptedef_bits0.pte$v_no_mb #define pte$v_prot pte$r_pte_union.pte$r_ptedef_bits0.pte$v_prot #define pte$v_software pte$r_pte_union.pte$r_ptedef_bits0.pte$v_software #define pte$v_pfn pte$r_pte_union.pte$r_ptedef_bits0.pte$v_pfn #define pte$v_kre pte$r_pte_union.pte$r_ptedef_prot.pte$v_kre #define pte$v_ere pte$r_pte_union.pte$r_ptedef_prot.pte$v_ere #define pte$v_sre pte$r_pte_union.pte$r_ptedef_prot.pte$v_sre #define pte$v_ure pte$r_pte_union.pte$r_ptedef_prot.pte$v_ure #define pte$v_kwe pte$r_pte_union.pte$r_ptedef_prot.pte$v_kwe #define pte$v_ewe pte$r_pte_union.pte$r_ptedef_prot.pte$v_ewe #define pte$v_swe pte$r_pte_union.pte$r_ptedef_prot.pte$v_swe #define pte$v_uwe pte$r_pte_union.pte$r_ptedef_prot.pte$v_uwe #define pte$v_dumpkey pte$r_pte_union.pte$r_ptedef_bugchk.pte$v_dumpkey #define pte$v_dumpother pte$r_pte_union.pte$r_ptedef_bugchk.pte$v_dumpother #define pte$v_fault_bits pte$r_pte_union.pte$r_ptedef_swbits.pte$v_fault_bits #define pte$v_prot_read pte$r_pte_union.pte$r_ptedef_swbits.pte$v_prot_read #define pte$v_prot_write pte$r_pte_union.pte$r_ptedef_swbits.pte$v_prot_write #define pte$v_window pte$r_pte_union.pte$r_ptedef_swbits.pte$v_window #define pte$v_own pte$r_pte_union.pte$r_ptedef_swbits.pte$v_own #define pte$v_modify pte$r_pte_union.pte$r_ptedef_swbits.pte$v_modify #define pte$v_sw_reserved pte$r_pte_union.pte$r_ptedef_swbits.pte$v_sw_reserved #define pte$v_cpy pte$r_pte_union.pte$r_ptedef_swbits.pte$v_cpy #define pte$v_nox pte$r_pte_union.pte$r_ptedef_swbits.pte$v_nox #define pte$v_s0_mbz pte$r_pte_union.pte$r_ptedef_swbits.pte$v_s0_mbz #define pte$v_typ0 pte$r_pte_union.pte$r_ptedef_bits1.pte$v_typ0 #define pte$v_partial_section pte$r_pte_union.pte$r_ptedef_bits1.pte$v_partial_section #define pte$v_typ1 pte$r_pte_union.pte$r_ptedef_bits1.pte$v_typ1 #define pte$v_stx pte$r_pte_union.pte$r_ptedef_pfn.pte$r_stx_bits.pte$v_stx #define pte$v_crf pte$r_pte_union.pte$r_ptedef_pfn.pte$r_stx_bits.pte$v_crf #define pte$v_dzro pte$r_pte_union.pte$r_ptedef_pfn.pte$r_stx_bits.pte$v_dzro #define pte$v_wrt pte$r_pte_union.pte$r_ptedef_pfn.pte$r_stx_bits.pte$v_wrt #define pte$v_filler_17 pte$r_pte_union.pte$r_ptedef_pfn.pte$r_stx_bits.pte$v_filler_17 #define pte$v_pgflpag pte$r_pte_union.pte$r_ptedef_pfn.pte$r_bak_pgfl.pte$v_pgflpag #define pte$v_pgflx pte$r_pte_union.pte$r_ptedef_pfn.pte$r_bak_pgfl.pte$v_pgflx #define pte$v_pgflmap pte$r_pte_union.pte$r_ptedef_pfn.pte$r_bak_pgflmap.pte$v_pgflmap #define pte$v_gptx pte$r_pte_union.pte$r_ptedef_pfn.pte$r_gptx_overlay.pte$v_gptx #define pte$v_bakx pte$r_pte_union.pte$r_ptedef_pfn.pte$r_bakx_bits.pte$v_bakx #define pte$q_entry pte$r_pte_union.pte$r_ptedef_entry_qw.pte$q_entry #define pte$l_entry_l pte$r_pte_union.pte$r_ptedef_entry_lw.pte$l_entry_l #define pte$l_entry_h pte$r_pte_union.pte$r_ptedef_entry_lw.pte$l_entry_h #endif /* #if !defined(__VAXC) */ #define PTE$M_FREE_PTE_MBZ1 0xFFFF #define PTE$M_SINGLE_PTE 0x10000 #define PTE$M_FREE_PTE_MBZ2 0x60000 #if !defined(__NOBASEALIGN_SUPPORT) && !defined(__cplusplus) /* If using pre DECC V4.0 or C++ */ #pragma __nomember_alignment __quadword #else #pragma __nomember_alignment #endif typedef struct _va_pte_free { #pragma __nomember_alignment __union { unsigned __int64 pte$q_index; /* PTE index field. For historic reasons, index field is defined */ __struct { /* as a quadword. Actual index lives in bits <63:19> of the quadword. */ unsigned pte$v_free_pte_mbz1 : 16; /* Bits <15:0> are MBZ. */ unsigned pte$v_single_pte : 1; /* Bit <16> denotes that the element contains a sigle PTE. */ unsigned pte$v_free_pte_mbz2 : 2; /* Bits <18:17> are MBZ in order for code to distinguish between a */ unsigned pte$v_fill_2_ : 5; } pte$r_va_pte_free_struct; /* free PTE and a GPTE. */ } pte$r_va_pte_free_union; int pte$$_filler_14; unsigned int pte$l_free_count; /* Count of free PTEs in this block. */ } VA_PTE_FREE; #if !defined(__VAXC) #define pte$q_index pte$r_va_pte_free_union.pte$q_index #define pte$v_free_pte_mbz1 pte$r_va_pte_free_union.pte$r_va_pte_free_struct.pte$v_free_pte_mbz1 #define pte$v_single_pte pte$r_va_pte_free_union.pte$r_va_pte_free_struct.pte$v_single_pte #define pte$v_free_pte_mbz2 pte$r_va_pte_free_union.pte$r_va_pte_free_struct.pte$v_free_pte_mbz2 #endif /* #if !defined(__VAXC) */ #define PTE$S_PTEDEF 16 /* Old PTE size constant for compatibility */ /* */ /* */ /* Define a constant that's used to shift the index value into the */ /* appropriate bits of the index quadword of the VA_PTE_FREE structure. */ /* */ #define PTE$C_INDEX_SHIFT_VALUE 19 #define PTE$C_FREE_BLOCK 16 /* Byte length of VA_PTE free block. */ /* Head of a private list of free PTEs */ #if !defined(__NOBASEALIGN_SUPPORT) && !defined(__cplusplus) /* If using pre DECC V4.0 or C++ */ #pragma __nomember_alignment __quadword #else #pragma __nomember_alignment #endif typedef struct _ptelist { #pragma __nomember_alignment unsigned __int64 ptelist$q_head; /* PTE index of head and tail element */ unsigned __int64 ptelist$q_tail; /* in free list; same format as in VA_PTE_FREE */ __int64 ptelist$q_count; /* count of free PTEs in this list */ } PTELIST; #define PTELIST$K_LENGTH 24 /* length of block; */ #define PTELIST$C_LENGTH 24 /* length of block; */ #ifdef __INITIAL_POINTER_SIZE #pragma __required_pointer_size __save /* Save current pointer size */ #pragma __required_pointer_size __long /* Pointers are 64-bit */ typedef struct _pte * PTE_PQ; /* Pointer to a PTE structure. */ typedef struct _pte ** PTE_PPQ; /* Pointer to a pointer to a PTE structure. */ typedef struct _ptelist * PTELIST_PQ; /* Pointer to a PTELIST structure. */ typedef struct _ptelist ** PTELIST_PPQ; /* Pointer to a pointer to a PTELIST structure. */ typedef struct _va_pte_free * VA_PTE_FREE_PQ; /* Pointer to a free VA_PTE structure. */ typedef struct _va_pte_free ** VA_PTE_FREE_PPQ; /* Pointer to a pointer to a free VA_PTE structure. */ #pragma __required_pointer_size __restore /* Return to previous pointer size */ #else typedef unsigned __int64 PTE_PQ; typedef unsigned __int64 PTE_PPQ; typedef unsigned __int64 PTELIST_PQ; typedef unsigned __int64 PTELIST_PPQ; typedef unsigned __int64 VA_PTE_FREE_PQ; typedef unsigned __int64 VA_PTE_FREE_PPQ; #endif /* __INITIAL_POINTER_SIZE */ /* We need a PTE$S_PFN for C... */ #define PTE$S_PFN 32 #pragma __member_alignment __restore #ifdef __INITIAL_POINTER_SIZE /* Defined whenever ptr size pragmas supported */ #pragma __required_pointer_size __restore /* Restore the previously-defined required ptr size */ #endif #ifdef __cplusplus } #endif #pragma __standard #endif /* __PTEDEF_LOADED */