13#include "../../winldr.h"
20#define KIP0PCRADDRESS 0xffdff000
22#define SELFMAP_ENTRY 0x300
41#define TYPE_TSS16A 0x01
43#define TYPE_TSS16B 0x03
44#define TYPE_CALL16 0x04
46#define TYPE_INT16 0x06
47#define TYPE_TRAP16 0x07
49#define TYPE_TSS32A 0x09
51#define TYPE_TSS32B 0x0B
52#define TYPE_CALL32 0x0C
54#define TYPE_INT32 0x0E
55#define TYPE_TRAP32 0x0F
57#define DESCRIPTOR_ACCESSED 0x1
58#define DESCRIPTOR_READ_WRITE 0x2
59#define DESCRIPTOR_EXECUTE_READ 0x2
60#define DESCRIPTOR_EXPAND_DOWN 0x4
61#define DESCRIPTOR_CONFORMING 0x4
62#define DESCRIPTOR_CODE 0x8
64#define TYPE_CODE (0x10 | DESCRIPTOR_CODE | DESCRIPTOR_EXECUTE_READ)
65#define TYPE_DATA (0x10 | DESCRIPTOR_READ_WRITE)
96 Entry->HighWord.Bits.Granularity = 0;
101 Entry->HighWord.Bits.Granularity = 1;
104 Entry->HighWord.Bits.LimitHi = ((
Limit >> 16) & 0x0f);
119 Entry->HighWord.Bits.Type = (
Type & 0x1f);
120 Entry->HighWord.Bits.Dpl = (Dpl & 0x3);
122 Entry->HighWord.Bits.Sys = 0;
123 Entry->HighWord.Bits.Reserved_0 = 0;
124 Entry->HighWord.Bits.Default_Big = !!(SegMode & 2);
125 Entry->HighWord.Bits.Granularity |= !!Granularity;
151 "LimitLow = 0x%04x\n"
153 "HighWord.Bytes.BaseMid = 0x%02x\n"
154 "HighWord.Bytes.Flags1 = 0x%02x\n"
155 "HighWord.Bytes.Flags2 = 0x%02x\n"
156 "HighWord.Bytes.BaseHi = 0x%02x\n"
187 ULONG NumPageTables, TotalSize;
196 TRACE(
"NumPageTables = %d\n", NumPageTables);
200 TotalSize = (1 + 1 + NumPageTables * 2) * MM_PAGE_SIZE;
208 NumPageTables*MM_PAGE_SIZE,
212 if (
Buffer + (TotalSize - NumPageTables*MM_PAGE_SIZE) !=
215 TRACE(
"There was a problem allocating two adjacent blocks of memory!\n");
220 UiMessageBox(
"Impossible to allocate memory block for page tables!");
290 TRACE(
"MempSetupPaging: SP 0x%X, Number: 0x%X, Kernel: %s\n",
291 StartPage, NumberOfPages, KernelMapping ?
"yes" :
"no");
327 if (KernelPT[
Page & 0x3ff].Valid)
WARN(
"KernelPT already mapped\n");
366 ULONG APICAddress, CpuInfo[4];
370 LocalAPIC = (((CpuInfo[3] >> 9) & 1) != 0);
378 APICAddress = (MsrValue.
LowPart & 0xFFFFF000);
380 TRACE(
"Local APIC detected at address 0x%x\n",
385 = APICAddress >> MM_PAGE_SHIFT;
420#define ExtendedBIOSDataArea ((PULONG)0x740)
421#define ExtendedBIOSDataSize ((PULONG)0x744)
422#define RomFontPointers ((PULONG)0x700)
437 WARN(
"Couldn't get address of extended BIOS data area\n");
451 ULONG BlockSize, NumPages;
466 TssSize = (
sizeof(
KTSS) + MM_PAGE_SIZE) & ~(MM_PAGE_SIZE - 1);
479 NumPages = (BlockSize + MM_PAGE_SIZE - 1) >> MM_PAGE_SHIFT;
494 BugCheck(
"MempAllocatePageTables failed!\n");
508 GDTIDT GdtDesc, IdtDesc, OldIdt;
519 TRACE(
"GdtIdt %p, Pcr %p, Tss 0x%08x\n",
679#if defined(__GNUC__) || defined(__clang__)
680 asm(
"ljmp $0x08, $1f\n"
682#elif defined(_MSC_VER)
703 Ke386SetLocalDescriptorTable(Ldt);
734 for (
i=0;
i<128;
i++)
740 TRACE(
"0x%08X ", PDE_Addr[
i*8+
j]);
BOOLEAN MempSetupPaging(IN PFN_NUMBER StartPage, IN PFN_NUMBER NumberOfPages, IN BOOLEAN KernelMapping)
static BOOLEAN MempAllocatePageTables(VOID)
static VOID WinLdrpMapApic(VOID)
VOID MempUnmapPage(PFN_NUMBER Page)
VOID WinLdrSetProcessorContext(void)
void WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock)
PUCHAR KernelPageTablesBuffer
FORCEINLINE VOID KiSetGdtEntry(IN OUT PKGDTENTRY Entry, IN ULONG32 Base, IN ULONG Limit, IN UCHAR Type, IN UCHAR Dpl, IN UCHAR SegMode)
VOID KiSetGdtEntryEx(IN OUT PKGDTENTRY Entry, IN ULONG32 Base, IN ULONG Limit, IN UCHAR Type, IN UCHAR Dpl, IN BOOLEAN Granularity, IN UCHAR SegMode)
FORCEINLINE PKGDTENTRY KiGetGdtEntry(IN PVOID pGdt, IN USHORT Selector)
static void WinLdrSetupSpecialDataPointers(VOID)
#define DESCRIPTOR_ACCESSED
#define ExtendedBIOSDataArea
PUCHAR PhysicalPageTablesBuffer
static VOID MempAllocatePTE(ULONG Entry, PHARDWARE_PTE *PhysicalPT, PHARDWARE_PTE *KernelPT)
static BOOLEAN WinLdrMapSpecialPages(void)
#define ExtendedBIOSDataSize
FORCEINLINE VOID KiSetGdtDescriptorBase(IN OUT PKGDTENTRY Entry, IN ULONG32 Base)
PHARDWARE_PTE HalPageTable
FORCEINLINE VOID KiSetGdtDescriptorLimit(IN OUT PKGDTENTRY Entry, IN ULONG Limit)
#define BugCheck(fmt,...)
#define DBG_DEFAULT_CHANNEL(ch)
#define MachGetExtendedBIOSData(ExtendedBIOSDataArea, ExtendedBIOSDataSize)
#define MachVideoGetFontsFromFirmware(RomFontPointers)
VOID MmSetMemoryType(PVOID MemoryAddress, SIZE_T MemorySize, TYPE_OF_MEMORY NewType)
PVOID MmAllocateMemoryWithType(SIZE_T MemorySize, TYPE_OF_MEMORY MemoryType)
PFN_NUMBER TotalPagesInLookupTable
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
#define Ke386GetGlobalDescriptorTable
#define Ke386SetGlobalDescriptorTable
void __cdecl _disable(void)
PPC_QUAL void __cpuid(int CPUInfo[], const int InfoType)
PPC_QUAL unsigned long long __readmsr()
__INTRIN_INLINE void __writeeflags(uintptr_t Value)
__INTRIN_INLINE void __lidt(void *Source)
__INTRIN_INLINE unsigned long __readcr0(void)
__INTRIN_INLINE void __writecr3(unsigned int Data)
__INTRIN_INLINE void __writecr0(unsigned int Data)
__INTRIN_INLINE void __sidt(void *Destination)
_In_ PVOID _Out_opt_ BOOLEAN _Out_opt_ PPFN_NUMBER Page
static void push(calc_node_t *op)
@ LoaderFirmwareTemporary
#define KI_USER_SHARED_DATA
base of all file and directory entries
struct _KGDTENTRY::@2424::@2425 Bytes
union _KGDTENTRY::@2424 HighWord
union _LOADER_PARAMETER_BLOCK::@3346 u
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
VOID UiMessageBox(PCSTR Format,...)
static BOOL Write(PBYTE Address, PBYTE Data, SIZE_T Size)
int WINAPI StartPage(_In_ HDC)
_In_ LONG _In_ LONG Limit