/*++ Copyright (c) 2000 Microsoft Corporation Module Name: amd64prv.h Abstract: This header file defines private interfaces shared between the following modules: amd64.c amd64s.asm amd64x86.c Author: Forrest Foltz (forrestf) 20-Apr-00 Revision History: --*/ #if !defined(_AMD64PRV_H_) #define _AMD64PRV_H_ // // 64-bit pointer and LONG_PTR fields are changed to this // typedef LONGLONG POINTER64; // // KSEG0 definitions for both the AMD64 and X86 platforms. Note that // these are duplicated from amd64.h and i386.h, respectively. // #define KSEG0_BASE_AMD64 0xFFFFF80000000000UI64 #define KSEG0_SIZE_AMD64 0x0000000040000000UI64 #define KSEG0_LIMIT_AMD64 (KSEG0_BASE_AMD64 + KSEG0_SIZE_AMD64) #define KSEG0_BASE_X86 0x80000000 #define KSEG0_SIZE_X86 0x40000000 #define KSEG0_LIMIT_X86 (KSEG0_BASE_X86 + KSEG0_SIZE_X86) #define IS_KSEG0_PTR_X86(x) (((x) >= KSEG0_BASE_X86) && ((x) < KSEG0_LIMIT_X86)) #define IS_KSEG0_PTR_AMD64(x) (((x) >= KSEG0_BASE_AMD64) && ((x) < KSEG0_LIMIT_AMD64)) __inline POINTER64 PTR_64( IN PVOID Pointer32 ) /*++ Routine Description: This function is used by the loader to convert a 32-bit X86 KSEG0 pointer to a 64-bit AMD64 KSEG0 pointer. Arguments: Pointer32 - Supplies the 32-bit KSEG0 pointer to convert. Return value: Returns the equivalent 64-bit KSEG0 pointer. --*/ { ULONG pointer32; ULONGLONG pointer64; if (Pointer32 == NULL) { return 0; } ASSERT( IS_KSEG0_PTR_X86((ULONG)Pointer32) != FALSE ); pointer32 = (ULONG)Pointer32 - KSEG0_BASE_X86; pointer64 = KSEG0_BASE_AMD64 + pointer32; return (POINTER64)pointer64; } __inline PVOID PTR_32( IN POINTER64 Pointer64 ) /*++ Routine Description: This function is used by the loader to convert a 64-bit AMD64 KSEG0 pointer to a 32-bit X86 KSEG0 pointer. Arguments: Pointer64 - Supplies the 64-bit KSEG0 pointer to convert. Return value: Returns the equivalent 32-bit KSEG0 pointer. --*/ { ULONG pointer32; if (Pointer64 == 0) { return NULL; } ASSERT( IS_KSEG0_PTR_AMD64(Pointer64) != FALSE ); pointer32 = (ULONG)(Pointer64 - KSEG0_BASE_AMD64 + KSEG0_BASE_X86); return (PVOID)pointer32; } // // Macros // #define PAGE_MASK ((1 << PAGE_SHIFT) - 1) #define ROUNDUP_X(x,m) (((x)+(m)-1) & ~((m)-1)) // // Size round up // #define ROUNDUP16(x) ROUNDUP_X(x,16) #define ROUNDUP_PAGE(x) ROUNDUP_X(x,PAGE_SIZE) // // Shared PTE, PFN types // typedef ULONG PFN_NUMBER32, *PPFN_NUMBER32; typedef ULONGLONG PFN_NUMBER64, *PPFN_NUMBER64; #if defined(_AMD64_) typedef ULONG PTE_X86, *PPTE_X86; typedef HARDWARE_PTE PTE_AMD64, *PPTE_AMD64; #elif defined(_X86_) typedef ULONGLONG PTE_AMD64, *PPTE_AMD64; typedef HARDWARE_PTE PTE_X86, *PPTE_X86; #else #error "Target architecture not defined" #endif // // Descriptor table descriptor // #pragma pack(push,1) typedef struct DESCRIPTOR_TABLE_DESCRIPTOR { USHORT Limit; POINTER64 Base; } DESCRIPTOR_TABLE_DESCRIPTOR, *PDESCRIPTOR_TABLE_DESCRIPTOR; #pragma pack(pop) // // Structures found within the CM_PARTIAL_RESOURCE_DESCRIPTOR union // typedef struct _CM_PRD_GENERIC { PHYSICAL_ADDRESS Start; ULONG Length; } CM_PRD_GENERIC, *PCM_PRD_GENERIC; typedef struct _CM_PRD_PORT { PHYSICAL_ADDRESS Start; ULONG Length; } CM_PRD_PORT, *PCM_PRD_PORT; typedef struct _CM_PRD_INTERRUPT { ULONG Level; ULONG Vector; KAFFINITY Affinity; } CM_PRD_INTERRUPT, *PCM_PRD_INTERRUPT; typedef struct _CM_PRD_MEMORY { PHYSICAL_ADDRESS Start; ULONG Length; } CM_PRD_MEMORY, *PCM_PRD_MEMORY; typedef struct _CM_PRD_DMA { ULONG Channel; ULONG Port; ULONG Reserved1; } CM_PRD_DMA, *PCM_PRD_DMA; typedef struct _CM_PRD_DEVICEPRIVATE { ULONG Data[3]; } CM_PRD_DEVICEPRIVATE, *PCM_PRD_DEVICEPRIVATE; typedef struct _CM_PRD_BUSNUMBER { ULONG Start; ULONG Length; ULONG Reserved; } CM_PRD_BUSNUMBER, *PCM_PRD_BUSNUMBER; typedef struct _CM_PRD_DEVICESPECIFICDATA { ULONG DataSize; ULONG Reserved1; ULONG Reserved2; } CM_PRD_DEVICESPECIFICDATA, *PCM_PRD_DEVICESPECIFICDATA; // // Define page table structure. // #define PTES_PER_PAGE (PAGE_SIZE / sizeof(HARDWARE_PTE)) typedef HARDWARE_PTE PAGE_TABLE[ PTES_PER_PAGE ]; typedef HARDWARE_PTE *PPAGE_TABLE; typedef struct _AMD64_PAGE_TABLE { PTE_AMD64 PteArray[ PTES_PER_PAGE ]; } AMD64_PAGE_TABLE, *PAMD64_PAGE_TABLE; // // Constants that are already defined in other header files but are not // (yet) included here // #define LU_BASE_ADDRESS (ULONG)0xFEE00000 // // Inclusion of this header file by both amd64.c and amd64x86.c ensures that // a PAGE_TABLE is the same size for both platforms. // C_ASSERT( sizeof(PAGE_TABLE) == PAGE_SIZE ); // // 64-bit GDT entry // typedef struct _GDT_64 *PGDT_64; // // We keep some information for each AMD64 mapping level // typedef struct _AMD64_MAPPING_LEVEL { ULONGLONG RecursiveMappingBase; ULONG AddressMask; ULONG AddressShift; } CONST AMD64_MAPPING_INFO, *PAMD64_MAPPING_INFO; // // Routines and data found in amd64.c and referenced in amd64x86.c // #define AMD64_MAPPING_LEVELS 4 extern AMD64_MAPPING_INFO BlAmd64MappingLevels[ AMD64_MAPPING_LEVELS ]; extern const ULONG BlAmd64DoubleFaultStackSize; #define DOUBLE_FAULT_STACK_SIZE_64 BlAmd64DoubleFaultStackSize extern const ULONG BlAmd64KernelStackSize; #define KERNEL_STACK_SIZE_64 BlAmd64KernelStackSize extern const ULONG BlAmd64McaExceptionStackSize; #define MCA_EXCEPTION_STACK_SIZE_64 BlAmd64McaExceptionStackSize extern const ULONG BlAmd64GdtSize; #define GDT_64_SIZE BlAmd64GdtSize extern const ULONG BlAmd64IdtSize; #define IDT_64_SIZE BlAmd64IdtSize extern const ULONG BlAmd64_TSS_IST_PANIC; #define TSS64_IST_PANIC BlAmd64_TSS_IST_PANIC extern const ULONG BlAmd64_TSS_IST_MCA; #define TSS64_IST_MCA BlAmd64_TSS_IST_MCA extern const ULONG64 BlAmd64UserSharedData; #define KI_USER_SHARED_DATA_64 BlAmd64UserSharedData VOID BlAmd64ClearTopLevelPte( VOID ); VOID BlAmd64BuildAmd64GDT( IN PVOID SysTss, OUT PVOID Gdt ); VOID BlAmd64BuildGdtEntry( IN PGDT_64 Gdt, IN USHORT Selector, IN POINTER64 Base, IN ULONGLONG Limit, IN ULONG Type, IN ULONG Dpl, IN BOOLEAN LongMode, IN BOOLEAN DefaultBig ); ARC_STATUS BlAmd64CreateMapping( IN ULONGLONG Va, IN ULONGLONG Pfn ); ARC_STATUS BlAmd64MapHalVaSpace( VOID ); // // Routines and data found in amd64x86.c and referenced in amd64.c // PAMD64_PAGE_TABLE BlAmd64AllocatePageTable( VOID ); VOID BlAmd64InitializePageTable( IN PPAGE_TABLE PageTable ); ARC_STATUS BlAmd64PrepForTransferToKernelPhase1( IN PLOADER_PARAMETER_BLOCK BlLoaderBlock ); VOID BlAmd64PrepForTransferToKernelPhase2( IN PLOADER_PARAMETER_BLOCK BlLoaderBlock ); ARC_STATUS BlAmd64TransferToKernel( IN PTRANSFER_ROUTINE SystemEntry, IN PLOADER_PARAMETER_BLOCK BlLoaderBlock ); // // Routines and data found in amd64s.asm and referenced elsewhere // BOOLEAN BlIsAmd64Supported ( VOID ); // // Shared data // #endif // _AMD64PRV_H_