Compare commits

..

No commits in common. "master" and "master" have entirely different histories.

25 changed files with 105 additions and 317 deletions

View File

@ -44,7 +44,7 @@ set(CMAKE_TOOLCHAIN_FILE "sdk/cmake/toolchain.cmake")
project(EXECTOS) project(EXECTOS)
# Load all the CMake SDK # Load all the CMake SDK
include(sdk/cmake/baseaddress/${ARCH}.cmake) include(sdk/cmake/baseaddress.cmake)
include(sdk/cmake/emulation.cmake) include(sdk/cmake/emulation.cmake)
include(sdk/cmake/functions.cmake) include(sdk/cmake/functions.cmake)
include(sdk/cmake/version.cmake) include(sdk/cmake/version.cmake)

View File

@ -1,2 +1,3 @@
# Set base addresses for all modules # Set base addresses for all modules
set(BASEADDRESS_XTLDR 0x00010000)
set(BASEADDRESS_XTOSKRNL 0x00400000) set(BASEADDRESS_XTOSKRNL 0x00400000)

View File

@ -1,2 +0,0 @@
# Set base addresses for all modules
set(BASEADDRESS_XTOSKRNL 0x0000000140000000)

View File

@ -27,22 +27,22 @@ add_custom_target(bochsvm
# This target starts up a QEMU+OVMF virtual machine using KVM accelerator # This target starts up a QEMU+OVMF virtual machine using KVM accelerator
add_custom_target(testkvm add_custom_target(testkvm
DEPENDS install DEPENDS diskimg
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-KVM" -machine type=q35,kernel_irqchip=on,accel=kvm,mem-merge=off,vmport=off -enable-kvm -cpu host,-hypervisor,+topoext COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-KVM" -machine type=q35,kernel_irqchip=on,accel=kvm,mem-merge=off,vmport=off -enable-kvm -cpu host,-hypervisor,+topoext
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none -smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_code_${ARCH}.fd,if=pflash,format=raw,unit=0,readonly=on -drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_code_${ARCH}.fd,if=pflash,format=raw,unit=0,readonly=on
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_vars_${ARCH}.fd,if=pflash,format=raw,unit=1 -drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_vars_${ARCH}.fd,if=pflash,format=raw,unit=1
-hda fat:rw:${EXECTOS_BINARY_DIR}/output/binaries -hda ${EXECTOS_BINARY_DIR}/output/disk.img
-boot menu=on -d int -M smm=off -no-reboot -no-shutdown -serial stdio -boot menu=on -d int -M smm=off -no-reboot -no-shutdown -serial stdio
VERBATIM USES_TERMINAL) VERBATIM USES_TERMINAL)
# This target starts up a QEMU+OVMF virtual machine using TCG accelerator # This target starts up a QEMU+OVMF virtual machine using TCG accelerator
add_custom_target(testtcg add_custom_target(testtcg
DEPENDS install DEPENDS diskimg
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-TCG" -machine type=q35,accel=tcg -cpu max,-hypervisor COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-TCG" -machine type=q35,accel=tcg -cpu max,-hypervisor
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none -smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_code_${ARCH}.fd,if=pflash,format=raw,unit=0,readonly=on -drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_code_${ARCH}.fd,if=pflash,format=raw,unit=0,readonly=on
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_vars_${ARCH}.fd,if=pflash,format=raw,unit=1 -drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_vars_${ARCH}.fd,if=pflash,format=raw,unit=1
-hda fat:rw:${EXECTOS_BINARY_DIR}/output/binaries -hda ${EXECTOS_BINARY_DIR}/output/disk.img
-boot menu=on -d int -M smm=off -no-reboot -no-shutdown -serial stdio -boot menu=on -d int -M smm=off -no-reboot -no-shutdown -serial stdio
VERBATIM USES_TERMINAL) VERBATIM USES_TERMINAL)

View File

@ -11,10 +11,11 @@ endif()
# Set build optimisation # Set build optimisation
if(BUILD_TYPE STREQUAL "DEBUG") if(BUILD_TYPE STREQUAL "DEBUG")
add_compiler_ccxxflags("/GS- /Zi /Ob0 /Od") add_compiler_ccxxflags("/Zi")
add_compiler_ccxxflags("-Ob0 -Od")
add_linker_flags("/DEBUG /INCREMENTAL /OPT:NOREF /OPT:NOICF /PDBSOURCEPATH:build") add_linker_flags("/DEBUG /INCREMENTAL /OPT:NOREF /OPT:NOICF /PDBSOURCEPATH:build")
else() else()
add_compiler_ccxxflags("/GS- /Ob2 /Ot /Ox /Oy") add_compiler_ccxxflags("-Ob2 -Oy")
add_linker_flags("/INCREMENTAL:NO /OPT:REF /OPT:ICF") add_linker_flags("/INCREMENTAL:NO /OPT:REF /OPT:ICF")
endif() endif()

View File

@ -43,23 +43,19 @@
#define APIC_DF_CLUSTER 0x0FFFFFFF #define APIC_DF_CLUSTER 0x0FFFFFFF
/* APIC delivery modes */ /* APIC delivery modes */
#define APIC_DM_FIXED 0x00000000 #define APIC_DM_FIXED 0
#define APIC_DM_LOWPRIO 0x00000100 #define APIC_DM_LOWPRIO 1
#define APIC_DM_SMI 0x00000200 #define APIC_DM_SMI 2
#define APIC_DM_REMOTE 0x00000300 #define APIC_DM_REMOTE 3
#define APIC_DM_NMI 0x00000400 #define APIC_DM_NMI 4
#define APIC_DM_INIT 0x00000500 #define APIC_DM_INIT 5
#define APIC_DM_STARTUP 0x00000600 #define APIC_DM_STARTUP 6
#define APIC_DM_EXTINT 0x00000700 #define APIC_DM_EXTINT 7
/* APIC trigger modes */ /* APIC trigger modes */
#define APIC_TGM_EDGE 0 #define APIC_TGM_EDGE 0
#define APIC_TGM_LEVEL 1 #define APIC_TGM_LEVEL 1
/* APIC LDR (Logical Destination Register) shifts */
#define APIC_X2APIC_LDR_SHIFT 16
#define APIC_XAPIC_LDR_SHIFT 24
/* Maximum number of I/O APICs */ /* Maximum number of I/O APICs */
#define APIC_MAX_IOAPICS 64 #define APIC_MAX_IOAPICS 64

View File

@ -84,7 +84,7 @@ typedef EFI_STATUS (*PBL_INVOKE_BOOT_PROTOCOL)(IN PWCHAR ShortName, IN PLIST_ENT
typedef EFI_STATUS (*PBL_LOCATE_PROTOCOL_HANDLES)(OUT PEFI_HANDLE *Handles, OUT PUINT_PTR Count, IN PEFI_GUID ProtocolGuid); typedef EFI_STATUS (*PBL_LOCATE_PROTOCOL_HANDLES)(OUT PEFI_HANDLE *Handles, OUT PUINT_PTR Count, IN PEFI_GUID ProtocolGuid);
typedef EFI_STATUS (*PBL_LOAD_EFI_IMAGE)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, IN PVOID ImageData, IN SIZE_T ImageSize, OUT PEFI_HANDLE ImageHandle); typedef EFI_STATUS (*PBL_LOAD_EFI_IMAGE)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, IN PVOID ImageData, IN SIZE_T ImageSize, OUT PEFI_HANDLE ImageHandle);
typedef EFI_STATUS (*PBL_MAP_EFI_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN OUT PVOID *MemoryMapAddress, IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine); typedef EFI_STATUS (*PBL_MAP_EFI_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN OUT PVOID *MemoryMapAddress, IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine);
typedef EFI_STATUS (*PBL_MAP_PAGE)(IN PXTBL_PAGE_MAPPING PageMap, IN ULONG_PTR VirtualAddress, IN ULONG_PTR PhysicalAddress, IN ULONG NumberOfPages); typedef EFI_STATUS (*PBL_MAP_PAGE)(IN PXTBL_PAGE_MAPPING PageMap, IN UINT_PTR VirtualAddress, IN UINT_PTR PhysicalAddress, IN UINT NumberOfPages);
typedef EFI_STATUS (*PBL_MAP_VIRTUAL_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN PVOID VirtualAddress, IN PVOID PhysicalAddress, IN ULONGLONG NumberOfPages, IN LOADER_MEMORY_TYPE MemoryType); typedef EFI_STATUS (*PBL_MAP_VIRTUAL_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN PVOID VirtualAddress, IN PVOID PhysicalAddress, IN ULONGLONG NumberOfPages, IN LOADER_MEMORY_TYPE MemoryType);
typedef EFI_STATUS (*PBL_OPEN_VOLUME)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, OUT PEFI_HANDLE DiskHandle, OUT PEFI_FILE_HANDLE *FsHandle); typedef EFI_STATUS (*PBL_OPEN_VOLUME)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, OUT PEFI_HANDLE DiskHandle, OUT PEFI_FILE_HANDLE *FsHandle);
typedef EFI_STATUS (*PBL_OPEN_PROTOCOL)(OUT PEFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid); typedef EFI_STATUS (*PBL_OPEN_PROTOCOL)(OUT PEFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid);

View File

@ -187,7 +187,7 @@ typedef struct _GENERIC_ADDRESS
UCHAR BitOffset; UCHAR BitOffset;
UCHAR Reserved; UCHAR Reserved;
PHYSICAL_ADDRESS Address; PHYSICAL_ADDRESS Address;
} PACKED GENERIC_ADDRESS, *PGENERIC_ADDRESS; } GENERIC_ADDRESS, *PGENERIC_ADDRESS;
/* Each ACPI table description header structure */ /* Each ACPI table description header structure */
typedef struct _ACPI_DESCRIPTION_HEADER typedef struct _ACPI_DESCRIPTION_HEADER
@ -201,14 +201,14 @@ typedef struct _ACPI_DESCRIPTION_HEADER
ULONG OemRevision; ULONG OemRevision;
UCHAR CreatorID[4]; UCHAR CreatorID[4];
ULONG CreatorRev; ULONG CreatorRev;
} PACKED ACPI_DESCRIPTION_HEADER, *PACPI_DESCRIPTION_HEADER; } ACPI_DESCRIPTION_HEADER, *PACPI_DESCRIPTION_HEADER;
/* Each ACPI subtable description header structure */ /* Each ACPI subtable description header structure */
typedef struct _ACPI_SUBTABLE_HEADER typedef struct _ACPI_SUBTABLE_HEADER
{ {
UCHAR Type; UCHAR Type;
UCHAR Length; UCHAR Length;
} PACKED ACPI_SUBTABLE_HEADER, *PACPI_SUBTABLE_HEADER; } ACPI_SUBTABLE_HEADER, *PACPI_SUBTABLE_HEADER;
/* ACPI cache list structure */ /* ACPI cache list structure */
typedef struct _ACPI_CACHE_LIST typedef struct _ACPI_CACHE_LIST
@ -229,14 +229,14 @@ typedef struct _ACPI_RSDP
ULONGLONG XsdtAddress; ULONGLONG XsdtAddress;
UCHAR XChecksum; UCHAR XChecksum;
UCHAR Reserved[3]; UCHAR Reserved[3];
} PACKED ACPI_RSDP, *PACPI_RSDP; } ACPI_RSDP, *PACPI_RSDP;
/* ACPI Root System Description Table (RSDT) structure */ /* ACPI Root System Description Table (RSDT) structure */
typedef struct _ACPI_RSDT typedef struct _ACPI_RSDT
{ {
ACPI_DESCRIPTION_HEADER Header; ACPI_DESCRIPTION_HEADER Header;
ULONG Tables[]; ULONG Tables[];
} PACKED ACPI_RSDT, *PACPI_RSDT; } ACPI_RSDT, *PACPI_RSDT;
/* ACPI eXtended Root System Description Table (XSDT) structure */ /* ACPI eXtended Root System Description Table (XSDT) structure */
typedef struct _ACPI_XSDT typedef struct _ACPI_XSDT
@ -303,7 +303,7 @@ typedef struct _ACPI_FADT
GENERIC_ADDRESS XGp1Blk; GENERIC_ADDRESS XGp1Blk;
GENERIC_ADDRESS SleepControlReg; GENERIC_ADDRESS SleepControlReg;
GENERIC_ADDRESS SleepStatusReg; GENERIC_ADDRESS SleepStatusReg;
} PACKED ACPI_FADT, *PACPI_FADT; } ACPI_FADT, *PACPI_FADT;
/* ACPI Multiple APIC Description Table (MADT) structure */ /* ACPI Multiple APIC Description Table (MADT) structure */
typedef struct _ACPI_MADT typedef struct _ACPI_MADT
@ -312,26 +312,26 @@ typedef struct _ACPI_MADT
ULONG LocalApicAddress; ULONG LocalApicAddress;
ULONG Flags; ULONG Flags;
ULONG ApicTables[]; ULONG ApicTables[];
} PACKED ACPI_MADT, *PACPI_MADT; } ACPI_MADT, *PACPI_MADT;
/* ACPI Local APIC MADT subtable structure */ /* ACPI Local APIC MADT subtable structure */
typedef struct _ACPI_MADT_LOCAL_APIC typedef struct _ACPI_MADT_LOCAL_APIC
{ {
ACPI_SUBTABLE_HEADER Header; ACPI_SUBTABLE_HEADER Header;
UCHAR AcpiId; UCHAR ProcessorId;
UCHAR ApicId; UCHAR Id;
ULONG Flags; ULONG LapicFlags;
} PACKED ACPI_MADT_LOCAL_APIC, *PACPI_MADT_LOCAL_APIC; } ACPI_MADT_LOCAL_APIC, *PACPI_MADT_LOCAL_APIC;
/* ACPI Local X2APIC MADT subtable structure */ /* ACPI Local X2APIC MADT subtable structure */
typedef struct _ACPI_MADT_LOCAL_X2APIC typedef struct _ACPI_MADT_LOCAL_X2APIC
{ {
ACPI_SUBTABLE_HEADER Header; ACPI_SUBTABLE_HEADER Header;
USHORT Reserved; USHORT Reserved;
ULONG ApicId; ULONG Id;
ULONG Flags; ULONG LapicFlags;
ULONG AcpiId; ULONG ProcessorId;
} PACKED ACPI_MADT_LOCAL_X2APIC, *PACPI_MADT_LOCAL_X2APIC; } ACPI_MADT_LOCAL_X2APIC, *PACPI_MADT_LOCAL_X2APIC;
/* ACPI System Information structure */ /* ACPI System Information structure */
typedef struct _ACPI_SYSTEM_INFO typedef struct _ACPI_SYSTEM_INFO
@ -342,12 +342,12 @@ typedef struct _ACPI_SYSTEM_INFO
ULONG IoApicCount; ULONG IoApicCount;
ULONG IntiCount; ULONG IntiCount;
ULONG LintiCount; ULONG LintiCount;
BOOLEAN ImcrPresent; ULONG ImcrPresent;
ULONG ApicBase; ULONG ApicBase;
PPROCESSOR_IDENTITY CpuInfo; PPROCESSOR_IDENTITY CpuInfo;
ULONG IoApicPhysicalBase[APIC_MAX_IOAPICS]; ULONG IoApicPhysicalBase[APIC_MAX_IOAPICS];
ULONG IoApicVirtualBase[APIC_MAX_IOAPICS]; PULONG IoApicVirtualBase[APIC_MAX_IOAPICS];
ULONG IoApicVectorBase[APIC_MAX_IOAPICS]; ULONG IoApicIntiBase[APIC_MAX_IOAPICS];
} ACPI_SYSTEM_INFO, *PACPI_SYSTEM_INFO; } ACPI_SYSTEM_INFO, *PACPI_SYSTEM_INFO;
/* ACPI Timer information structure */ /* ACPI Timer information structure */
@ -393,9 +393,9 @@ typedef struct _HAL_FRAMEBUFFER_DATA
/* Processor identity structure */ /* Processor identity structure */
typedef struct _PROCESSOR_IDENTITY typedef struct _PROCESSOR_IDENTITY
{ {
ULONG AcpiId; UCHAR Id;
ULONG ApicId; UCHAR CpuId;
USHORT CpuNumber; UCHAR CpuNumber;
BOOLEAN Bsp; BOOLEAN Bsp;
BOOLEAN Started; BOOLEAN Started;
} PROCESSOR_IDENTITY, *PPROCESSOR_IDENTITY; } PROCESSOR_IDENTITY, *PPROCESSOR_IDENTITY;

View File

@ -48,23 +48,19 @@
#define APIC_DF_CLUSTER 0x0FFFFFFF #define APIC_DF_CLUSTER 0x0FFFFFFF
/* APIC delivery modes */ /* APIC delivery modes */
#define APIC_DM_FIXED 0x00000000 #define APIC_DM_FIXED 0
#define APIC_DM_LOWPRIO 0x00000100 #define APIC_DM_LOWPRIO 1
#define APIC_DM_SMI 0x00000200 #define APIC_DM_SMI 2
#define APIC_DM_REMOTE 0x00000300 #define APIC_DM_REMOTE 3
#define APIC_DM_NMI 0x00000400 #define APIC_DM_NMI 4
#define APIC_DM_INIT 0x00000500 #define APIC_DM_INIT 5
#define APIC_DM_STARTUP 0x00000600 #define APIC_DM_STARTUP 6
#define APIC_DM_EXTINT 0x00000700 #define APIC_DM_EXTINT 7
/* APIC trigger modes */ /* APIC trigger modes */
#define APIC_TGM_EDGE 0 #define APIC_TGM_EDGE 0
#define APIC_TGM_LEVEL 1 #define APIC_TGM_LEVEL 1
/* APIC LDR (Logical Destination Register) shifts */
#define APIC_X2APIC_LDR_SHIFT 16
#define APIC_XAPIC_LDR_SHIFT 24
/* Maximum number of I/O APICs */ /* Maximum number of I/O APICs */
#define APIC_MAX_IOAPICS 64 #define APIC_MAX_IOAPICS 64

View File

@ -95,8 +95,7 @@
#define SIGNATURE32(A, B, C, D) (SIGNATURE16(A, B) | (SIGNATURE16(C, D) << 16)) #define SIGNATURE32(A, B, C, D) (SIGNATURE16(A, B) | (SIGNATURE16(C, D) << 16))
#define SIGNATURE64(A, B, C, D, E, F, G, H) (SIGNATURE32(A, B, C, D) | ((UINT64)(SIGNATURE32(E, F, G, H)) << 32)) #define SIGNATURE64(A, B, C, D, E, F, G, H) (SIGNATURE32(A, B, C, D) | ((UINT64)(SIGNATURE32(E, F, G, H)) << 32))
/* XT size <-> pages conversion macro */ /* XT size to pages conversion macro */
#define PAGES_TO_SIZE(Pages) ((Pages) << MM_PAGE_SHIFT)
#define SIZE_TO_PAGES(Size) (((Size) >> MM_PAGE_SHIFT) + (((Size) & (MM_PAGE_MASK)) ? 1 : 0)) #define SIZE_TO_PAGES(Size) (((Size) >> MM_PAGE_SHIFT) + (((Size) & (MM_PAGE_MASK)) ? 1 : 0))
/* Macros for concatenating strings */ /* Macros for concatenating strings */

View File

@ -49,5 +49,6 @@ set_install_target(xtldr efi/boot)
# Set loader entrypoint and subsystem # Set loader entrypoint and subsystem
set_entrypoint(xtldr "BlStartXtLoader") set_entrypoint(xtldr "BlStartXtLoader")
set_imagebase(xtldr ${BASEADDRESS_XTLDR})
set_linker_map(xtldr TRUE) set_linker_map(xtldr TRUE)
set_subsystem(xtldr efi_application) set_subsystem(xtldr efi_application)

View File

@ -149,9 +149,9 @@ BlBuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
XTCDECL XTCDECL
EFI_STATUS EFI_STATUS
BlMapPage(IN PXTBL_PAGE_MAPPING PageMap, BlMapPage(IN PXTBL_PAGE_MAPPING PageMap,
IN ULONG_PTR VirtualAddress, IN UINT_PTR VirtualAddress,
IN ULONG_PTR PhysicalAddress, IN UINT_PTR PhysicalAddress,
IN ULONG NumberOfPages) IN UINT NumberOfPages)
{ {
SIZE_T Pml1Entry, Pml2Entry, Pml3Entry, Pml4Entry, Pml5Entry; SIZE_T Pml1Entry, Pml2Entry, Pml3Entry, Pml4Entry, Pml5Entry;
PHARDWARE_PTE Pml1, Pml2, Pml3, Pml4, Pml5; PHARDWARE_PTE Pml1, Pml2, Pml3, Pml4, Pml5;

View File

@ -169,9 +169,9 @@ BlBuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
XTCDECL XTCDECL
EFI_STATUS EFI_STATUS
BlMapPage(IN PXTBL_PAGE_MAPPING PageMap, BlMapPage(IN PXTBL_PAGE_MAPPING PageMap,
IN ULONG_PTR VirtualAddress, IN UINT_PTR VirtualAddress,
IN ULONG_PTR PhysicalAddress, IN UINT_PTR PhysicalAddress,
IN ULONG NumberOfPages) IN UINT NumberOfPages)
{ {
SIZE_T Pml1Entry, Pml2Entry, Pml3Entry; SIZE_T Pml1Entry, Pml2Entry, Pml3Entry;
PHARDWARE_PTE Pml1, Pml2, Pml3; PHARDWARE_PTE Pml1, Pml2, Pml3;

View File

@ -18,7 +18,7 @@
/* XTLDR routines forward references */ /* XTLDR routines forward references */
XTCDECL XTCDECL
EFI_STATUS EFI_STATUS
BlAllocateMemoryPages(IN ULONGLONG NumberOfPages, BlAllocateMemoryPages(IN ULONGLONG Pages,
OUT PEFI_PHYSICAL_ADDRESS Memory); OUT PEFI_PHYSICAL_ADDRESS Memory);
XTCDECL XTCDECL
@ -121,7 +121,7 @@ BlFindVolumeDevicePath(IN PEFI_DEVICE_PATH_PROTOCOL FsHandle,
XTCDECL XTCDECL
EFI_STATUS EFI_STATUS
BlFreeMemoryPages(IN ULONGLONG NumberOfPages, BlFreeMemoryPages(IN ULONGLONG Pages,
IN EFI_PHYSICAL_ADDRESS Memory); IN EFI_PHYSICAL_ADDRESS Memory);
XTCDECL XTCDECL
@ -249,9 +249,9 @@ BlMapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
XTCDECL XTCDECL
EFI_STATUS EFI_STATUS
BlMapPage(IN PXTBL_PAGE_MAPPING PageMap, BlMapPage(IN PXTBL_PAGE_MAPPING PageMap,
IN ULONG_PTR VirtualAddress, IN UINT_PTR VirtualAddress,
IN ULONG_PTR PhysicalAddress, IN UINT_PTR PhysicalAddress,
IN ULONG NumberOfPages); IN UINT NumberOfPages);
XTCDECL XTCDECL
EFI_STATUS EFI_STATUS

View File

@ -12,7 +12,7 @@
/** /**
* This routine allocates one or more 4KB pages. * This routine allocates one or more 4KB pages.
* *
* @param NumberOfPages * @param Pages
* The number of contiguous 4KB pages to allocate. * The number of contiguous 4KB pages to allocate.
* *
* @param Memory * @param Memory
@ -24,10 +24,10 @@
*/ */
XTCDECL XTCDECL
EFI_STATUS EFI_STATUS
BlAllocateMemoryPages(IN ULONGLONG NumberOfPages, BlAllocateMemoryPages(IN ULONGLONG Pages,
OUT PEFI_PHYSICAL_ADDRESS Memory) OUT PEFI_PHYSICAL_ADDRESS Memory)
{ {
return EfiSystemTable->BootServices->AllocatePages(AllocateAnyPages, EfiLoaderData, NumberOfPages, Memory); return EfiSystemTable->BootServices->AllocatePages(AllocateAnyPages, EfiLoaderData, Pages, Memory);
} }
/** /**
@ -55,7 +55,7 @@ BlAllocateMemoryPool(IN UINT_PTR Size,
/** /**
* This routine frees memory pages. * This routine frees memory pages.
* *
* @param NumberOfPages * @param Pages
* The number of contiguous 4 KB pages to free. * The number of contiguous 4 KB pages to free.
* *
* @param Memory * @param Memory
@ -67,10 +67,10 @@ BlAllocateMemoryPool(IN UINT_PTR Size,
*/ */
XTCDECL XTCDECL
EFI_STATUS EFI_STATUS
BlFreeMemoryPages(IN ULONGLONG NumberOfPages, BlFreeMemoryPages(IN ULONGLONG Pages,
IN EFI_PHYSICAL_ADDRESS Memory) IN EFI_PHYSICAL_ADDRESS Memory)
{ {
return EfiSystemTable->BootServices->FreePages(Memory, NumberOfPages); return EfiSystemTable->BootServices->FreePages(Memory, Pages);
} }
/** /**

View File

@ -9,7 +9,7 @@ This is a list of them:
* Ar - Architecture library * Ar - Architecture library
* Ex - Kernel Executive * Ex - Kernel Executive
* Hl - Hardware Layer * Hl - Hardware Abstraction Layer (HAL)
* Ke - Core kernel library * Ke - Core kernel library
* Mm - Memory manager * Mm - Memory manager
* Po - Plug&Play and Power Manager * Po - Plug&Play and Power Manager
@ -26,10 +26,10 @@ The kernel executive supplies heap management, including support for allocating
pools, as well as synchronization primitives like push locks and fast mutexes, interlocked memory access, and worker pools, as well as synchronization primitives like push locks and fast mutexes, interlocked memory access, and worker
threads. threads.
### HL: Hardware Layer ### HL: Hardware Abstraction Layer
Hardware Layer, is a layer between the physical hardware of the computer and the rest of the operating system. It was Hardware Abstraction Layer (HAL), is a layer between the physical hardware of the computer and the rest of the operating
designed to hide differences in hardware and therefore it provides a consistent platform on which the system and system. It was designed to hide differences in hardware and therefore it provides a consistent platform on which
applications may run. the system and applications may run.
### KE: Kernel Library ### KE: Kernel Library
The kernel implements its core functionality that everything else in the system depends upon. This includes basic The kernel implements its core functionality that everything else in the system depends upon. This includes basic

View File

@ -265,112 +265,15 @@ XTAPI
XTSTATUS XTSTATUS
HlpInitializeAcpiSystemInformation(VOID) HlpInitializeAcpiSystemInformation(VOID)
{ {
PACPI_MADT_LOCAL_X2APIC LocalX2Apic; PUCHAR MadtTable;
PACPI_MADT_LOCAL_APIC LocalApic;
ULONG_PTR MadtTable;
PACPI_MADT Madt;
XTSTATUS Status;
USHORT CpuCount;
/* Allocate memory for ACPI system information structure */
Status = HlpInitializeAcpiSystemStructure();
if(Status != STATUS_SUCCESS)
{
/* Failed to allocate memory, return error */
return STATUS_INSUFFICIENT_RESOURCES;
}
/* Get Multiple APIC Description Table (MADT) */
Status = HlGetAcpiTable(ACPI_MADT_SIGNATURE, (PACPI_DESCRIPTION_HEADER*)&Madt);
if(Status != STATUS_SUCCESS)
{
/* Failed to get MADT, return error */
return STATUS_NOT_FOUND;
}
/* Set APIC table traverse pointer and initialize number of CPUs */
MadtTable = (ULONG_PTR)Madt->ApicTables;
CpuCount = 0;
/* Traverse all MADT tables to get system information */
while(MadtTable <= ((ULONG_PTR)Madt + Madt->Header.Length))
{
/* Check if this is a local APIC subtable */
if((((PACPI_SUBTABLE_HEADER)MadtTable)->Type == ACPI_MADT_TYPE_LOCAL_APIC) &&
(((PACPI_SUBTABLE_HEADER)MadtTable)->Length == sizeof(ACPI_MADT_LOCAL_APIC)))
{
/* Get local APIC subtable */
LocalApic = (PACPI_MADT_LOCAL_APIC)MadtTable;
/* Make sure, this CPU can be enabled */
if(LocalApic->Flags & ACPI_MADT_PLAOC_ENABLED)
{
/* Store CPU number, APIC ID and CPU ID */
HlpSystemInfo.CpuInfo[CpuCount].AcpiId = LocalApic->AcpiId;
HlpSystemInfo.CpuInfo[CpuCount].ApicId = LocalApic->ApicId;
HlpSystemInfo.CpuInfo[CpuCount].CpuNumber = CpuCount;
/* Increment number of CPUs */
CpuCount++;
}
/* Go to the next MADT table */
MadtTable += ((PACPI_SUBTABLE_HEADER)MadtTable)->Length;
}
else if((((PACPI_SUBTABLE_HEADER)MadtTable)->Type == ACPI_MADT_TYPE_LOCAL_X2APIC) &&
(((PACPI_SUBTABLE_HEADER)MadtTable)->Length == sizeof(ACPI_MADT_LOCAL_X2APIC)))
{
/* Get local X2APIC subtable */
LocalX2Apic = (PACPI_MADT_LOCAL_X2APIC)MadtTable;
/* Make sure, this CPU can be enabled */
if(LocalX2Apic->Flags & ACPI_MADT_PLAOC_ENABLED)
{
/* Store CPU number, APIC ID and CPU ID */
HlpSystemInfo.CpuInfo[CpuCount].AcpiId = LocalX2Apic->AcpiId;
HlpSystemInfo.CpuInfo[CpuCount].ApicId = LocalX2Apic->ApicId;
HlpSystemInfo.CpuInfo[CpuCount].CpuNumber = CpuCount;
/* Increment number of CPUs */
CpuCount++;
}
/* Go to the next MADT table */
MadtTable += ((PACPI_SUBTABLE_HEADER)MadtTable)->Length;
}
else
{
/* Any other MADT table, try to go to the next one byte-by-byte */
MadtTable += 1;
}
}
/* Store number of CPUs */
HlpSystemInfo.CpuCount = CpuCount;
/* Return success */
return STATUS_SUCCESS;
}
/**
* Initializes ACPI System Information data structure based on the size of available ACPI data.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTAPI
XTSTATUS
HlpInitializeAcpiSystemStructure(VOID)
{
PHYSICAL_ADDRESS PhysicalAddress;
PFN_NUMBER PageCount;
ULONG_PTR MadtTable;
PACPI_MADT Madt; PACPI_MADT Madt;
XTSTATUS Status; XTSTATUS Status;
ULONG CpuCount; ULONG CpuCount;
/* Get Multiple APIC Description Table (MADT) */ /* Zero the ACPI system information structure */
RtlZeroMemory(&HlpAcpiSystemInfo, sizeof(ACPI_SYSTEM_INFO));
/* Get Multi-APIC Description Table (MADT) */
Status = HlGetAcpiTable(ACPI_MADT_SIGNATURE, (PACPI_DESCRIPTION_HEADER*)&Madt); Status = HlGetAcpiTable(ACPI_MADT_SIGNATURE, (PACPI_DESCRIPTION_HEADER*)&Madt);
if(Status != STATUS_SUCCESS) if(Status != STATUS_SUCCESS)
{ {
@ -379,38 +282,38 @@ HlpInitializeAcpiSystemStructure(VOID)
} }
/* Set APIC table traverse pointer and initialize number of CPUs */ /* Set APIC table traverse pointer and initialize number of CPUs */
MadtTable = (ULONG_PTR)Madt->ApicTables; MadtTable = (PUCHAR)Madt->ApicTables;
CpuCount = 0; CpuCount = 0;
/* Traverse all MADT tables to get number of processors */ /* Traverse all MADT tables to get number of processors */
while(MadtTable <= ((ULONG_PTR)Madt + Madt->Header.Length)) while(MadtTable <= ((PUCHAR)Madt + Madt->Header.Length))
{ {
/* Check if this is a local APIC subtable */ /* Check if this is a local APIC subtable */
if((((PACPI_SUBTABLE_HEADER)MadtTable)->Type == ACPI_MADT_TYPE_LOCAL_APIC) && if((((PACPI_MADT_LOCAL_APIC)MadtTable)->Header.Type == ACPI_MADT_TYPE_LOCAL_APIC) &&
(((PACPI_SUBTABLE_HEADER)MadtTable)->Length == sizeof(ACPI_MADT_LOCAL_APIC))) (((PACPI_MADT_LOCAL_APIC)MadtTable)->Header.Length == sizeof(ACPI_MADT_LOCAL_APIC)))
{ {
/* Make sure, this CPU can be enabled */ /* Make sure, this CPU can be enabled */
if(((PACPI_MADT_LOCAL_APIC)MadtTable)->Flags & ACPI_MADT_PLAOC_ENABLED) if(((PACPI_MADT_LOCAL_APIC)MadtTable)->LapicFlags & ACPI_MADT_PLAOC_ENABLED)
{ {
/* Increment number of CPUs */ /* Increment number of CPUs */
CpuCount++; CpuCount++;
} }
/* Go to the next MADT table */ /* Go to the next MADT table */
MadtTable += ((PACPI_SUBTABLE_HEADER)MadtTable)->Length; MadtTable += ((PACPI_MADT_LOCAL_APIC)MadtTable)->Header.Length;
} }
else if((((PACPI_SUBTABLE_HEADER)MadtTable)->Type == ACPI_MADT_TYPE_LOCAL_X2APIC) && else if((((PACPI_MADT_LOCAL_X2APIC)MadtTable)->Header.Type == ACPI_MADT_TYPE_LOCAL_X2APIC) &&
(((PACPI_SUBTABLE_HEADER)MadtTable)->Length == sizeof(ACPI_MADT_LOCAL_X2APIC))) (((PACPI_MADT_LOCAL_X2APIC)MadtTable)->Header.Length == sizeof(ACPI_MADT_LOCAL_X2APIC)))
{ {
/* Make sure, this CPU can be enabled */ /* Make sure, this CPU can be enabled */
if(((PACPI_MADT_LOCAL_X2APIC)MadtTable)->Flags & ACPI_MADT_PLAOC_ENABLED) if(((PACPI_MADT_LOCAL_X2APIC)MadtTable)->LapicFlags & ACPI_MADT_PLAOC_ENABLED)
{ {
/* Increment number of CPUs */ /* Increment number of CPUs */
CpuCount++; CpuCount++;
} }
/* Go to the next MADT table */ /* Go to the next MADT table */
MadtTable += ((PACPI_SUBTABLE_HEADER)MadtTable)->Length; MadtTable += ((PACPI_MADT_LOCAL_X2APIC)MadtTable)->Header.Length;
} }
else else
{ {
@ -419,31 +322,6 @@ HlpInitializeAcpiSystemStructure(VOID)
} }
} }
/* Zero the ACPI system information structure */
RtlZeroMemory(&HlpSystemInfo, sizeof(ACPI_SYSTEM_INFO));
/* Calculate number of pages needed to store CPU information */
PageCount = SIZE_TO_PAGES(CpuCount * sizeof(PROCESSOR_IDENTITY));
/* Allocate memory for CPU information */
Status = MmAllocateHardwareMemory(PageCount, TRUE, &PhysicalAddress);
if(Status != STATUS_SUCCESS)
{
/* Failed to allocate memory, return error */
return Status;
}
/* Map physical address to the virtual memory area */
Status = MmMapHardwareMemory(PhysicalAddress, PageCount, TRUE, (PVOID *)&HlpSystemInfo.CpuInfo);
if(Status != STATUS_SUCCESS)
{
/* Failed to map memory, return error */
return Status;
}
/* Zero the CPU information structure */
RtlZeroMemory(HlpSystemInfo.CpuInfo, PAGES_TO_SIZE(PageCount));
/* Return success */ /* Return success */
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -507,13 +385,9 @@ XTSTATUS
HlpQueryAcpiCache(IN ULONG Signature, HlpQueryAcpiCache(IN ULONG Signature,
OUT PACPI_DESCRIPTION_HEADER *AcpiTable) OUT PACPI_DESCRIPTION_HEADER *AcpiTable)
{ {
PACPI_DESCRIPTION_HEADER TableHeader;
PACPI_CACHE_LIST AcpiCache; PACPI_CACHE_LIST AcpiCache;
PLIST_ENTRY ListEntry; PLIST_ENTRY ListEntry;
/* Initialize variables */
TableHeader = NULL;
/* Iterate through ACPI tables cache list */ /* Iterate through ACPI tables cache list */
ListEntry = HlpAcpiCacheList.Flink; ListEntry = HlpAcpiCacheList.Flink;
while(ListEntry != &HlpAcpiCacheList) while(ListEntry != &HlpAcpiCacheList)
@ -525,7 +399,7 @@ HlpQueryAcpiCache(IN ULONG Signature,
if(AcpiCache->Header.Signature == Signature) if(AcpiCache->Header.Signature == Signature)
{ {
/* ACPI table found in cache, return it */ /* ACPI table found in cache, return it */
TableHeader = &AcpiCache->Header; *AcpiTable = &AcpiCache->Header;
break; break;
} }
@ -534,14 +408,13 @@ HlpQueryAcpiCache(IN ULONG Signature,
} }
/* Check if the requested ACPI table was found in the cache */ /* Check if the requested ACPI table was found in the cache */
if(TableHeader == NULL) if(*AcpiTable == NULL)
{ {
/* ACPI table not found in cache, return error */ /* ACPI table not found in cache, return error */
return STATUS_NOT_FOUND; return STATUS_NOT_FOUND;
} }
/* Return table header and status code */ /* Return success */
*AcpiTable = TableHeader;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -579,9 +452,6 @@ HlpQueryAcpiTables(IN ULONG Signature,
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
/* Ensure that table header is not set before attempting to find ACPI table */
TableHeader = NULL;
/* Check if DSDT or FACS table requested */ /* Check if DSDT or FACS table requested */
if(Signature == ACPI_DSDT_SIGNATURE || Signature == ACPI_FACS_SIGNATURE) if(Signature == ACPI_DSDT_SIGNATURE || Signature == ACPI_FACS_SIGNATURE)
{ {

View File

@ -15,6 +15,9 @@ LIST_ENTRY HlpAcpiCacheList;
/* ACPI Root System Description Pointer (RSDP) */ /* ACPI Root System Description Pointer (RSDP) */
PACPI_RSDP HlpAcpiRsdp; PACPI_RSDP HlpAcpiRsdp;
/* ACPI system information */
ACPI_SYSTEM_INFO HlpAcpiSystemInfo;
/* ACPI timer information */ /* ACPI timer information */
ACPI_TIMER_INFO HlpAcpiTimerInfo; ACPI_TIMER_INFO HlpAcpiTimerInfo;
@ -26,6 +29,3 @@ APIC_MODE HlpApicMode;
/* FrameBuffer information */ /* FrameBuffer information */
HAL_FRAMEBUFFER_DATA HlpFrameBufferData; HAL_FRAMEBUFFER_DATA HlpFrameBufferData;
/* System information */
ACPI_SYSTEM_INFO HlpSystemInfo;

View File

@ -35,7 +35,7 @@ HlClearApicErrors(VOID)
* @since XT 1.0 * @since XT 1.0
*/ */
XTFASTCALL XTFASTCALL
ULONGLONG ULONG
HlReadApicRegister(IN APIC_REGISTER Register) HlReadApicRegister(IN APIC_REGISTER Register)
{ {
if(HlpApicMode == APIC_MODE_X2APIC) if(HlpApicMode == APIC_MODE_X2APIC)
@ -81,7 +81,7 @@ HlSendEoi(VOID)
XTFASTCALL XTFASTCALL
VOID VOID
HlWriteApicRegister(IN APIC_REGISTER Register, HlWriteApicRegister(IN APIC_REGISTER Register,
IN ULONGLONG Value) IN ULONG Value)
{ {
if(HlpApicMode == APIC_MODE_X2APIC) if(HlpApicMode == APIC_MODE_X2APIC)
{ {
@ -133,26 +133,6 @@ HlpCheckX2ApicSupport(VOID)
return TRUE; return TRUE;
} }
/**
* Gets the local APIC ID of the current processor.
*
* @return This routine returns the current processor's local APIC ID.
*
* @since XT 1.0
*/
XTAPI
ULONG
HlpGetCpuApicId(VOID)
{
ULONG ApicId;
/* Read APIC ID register */
ApicId = HlReadApicRegister(APIC_ID);
/* Return logical CPU ID depending on current APIC mode */
return (HlpApicMode == APIC_MODE_COMPAT) ? ((ApicId & 0xFFFFFFFF) >> APIC_XAPIC_LDR_SHIFT) : ApicId;
}
/** /**
* Allows an APIC spurious interrupts to end up. * Allows an APIC spurious interrupts to end up.
* *
@ -391,35 +371,3 @@ HlpInitializePic(VOID)
/* Initialize legacy PIC */ /* Initialize legacy PIC */
HlpInitializeLegacyPic(); HlpInitializeLegacyPic();
} }
/**
* Sends an IPI (Inter-Processor Interrupt) to the specified CPU.
*
* @param ApicId
* Supplies a CPU APIC ID to send an IPI to.
*
* @param Vector
* Supplies the IPI vector to send.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
HlpSendIpi(ULONG ApicId,
ULONG Vector)
{
/* Check current APIC mode */
if(HlpApicMode == APIC_MODE_X2APIC)
{
/* Send IPI using x2APIC mode */
HlWriteApicRegister(APIC_ICR0, ((ULONGLONG)ApicId << 32) | Vector);
}
else
{
/* Send IPI using xAPIC compatibility mode */
HlWriteApicRegister(APIC_ICR1, ApicId << 24);
HlWriteApicRegister(APIC_ICR0, Vector);
}
}

View File

@ -18,7 +18,7 @@ VOID
HlClearApicErrors(VOID); HlClearApicErrors(VOID);
XTFASTCALL XTFASTCALL
ULONGLONG ULONG
HlReadApicRegister(IN APIC_REGISTER Register); HlReadApicRegister(IN APIC_REGISTER Register);
XTAPI XTAPI
@ -28,16 +28,12 @@ HlSendEoi(VOID);
XTFASTCALL XTFASTCALL
VOID VOID
HlWriteApicRegister(IN APIC_REGISTER Register, HlWriteApicRegister(IN APIC_REGISTER Register,
IN ULONGLONG Value); IN ULONG Value);
XTAPI XTAPI
BOOLEAN BOOLEAN
HlpCheckX2ApicSupport(VOID); HlpCheckX2ApicSupport(VOID);
XTAPI
ULONG
HlpGetCpuApicId(VOID);
XTCDECL XTCDECL
VOID VOID
HlpHandleApicSpuriousService(VOID); HlpHandleApicSpuriousService(VOID);
@ -58,11 +54,6 @@ XTAPI
VOID VOID
HlpInitializePic(); HlpInitializePic();
XTAPI
VOID
HlpSendIpi(ULONG ApicId,
ULONG Vector);
XTFASTCALL XTFASTCALL
KRUNLEVEL KRUNLEVEL
HlpTransformApicTprToRunLevel(IN UCHAR Tpr); HlpTransformApicTprToRunLevel(IN UCHAR Tpr);

View File

@ -18,6 +18,9 @@ EXTERN LIST_ENTRY HlpAcpiCacheList;
/* ACPI Root System Description Pointer (RSDP) */ /* ACPI Root System Description Pointer (RSDP) */
EXTERN PACPI_RSDP HlpAcpiRsdp; EXTERN PACPI_RSDP HlpAcpiRsdp;
/* ACPI system information */
EXTERN ACPI_SYSTEM_INFO HlpAcpiSystemInfo;
/* ACPI timer information */ /* ACPI timer information */
EXTERN ACPI_TIMER_INFO HlpAcpiTimerInfo; EXTERN ACPI_TIMER_INFO HlpAcpiTimerInfo;
@ -30,9 +33,6 @@ EXTERN APIC_MODE HlpApicMode;
/* FrameBuffer information */ /* FrameBuffer information */
EXTERN HAL_FRAMEBUFFER_DATA HlpFrameBufferData; EXTERN HAL_FRAMEBUFFER_DATA HlpFrameBufferData;
/* System information */
EXTERN ACPI_SYSTEM_INFO HlpSystemInfo;
/* Pointer to boot loader provided DbgPrint() routine */ /* Pointer to boot loader provided DbgPrint() routine */
EXTERN VOID (*KeDbgPrint)(IN PWCHAR Format, IN ...); EXTERN VOID (*KeDbgPrint)(IN PWCHAR Format, IN ...);

View File

@ -102,10 +102,6 @@ XTAPI
XTSTATUS XTSTATUS
HlpInitializeAcpiSystemInformation(VOID); HlpInitializeAcpiSystemInformation(VOID);
XTAPI
XTSTATUS
HlpInitializeAcpiSystemStructure(VOID);
XTAPI XTAPI
XTSTATUS XTSTATUS
HlpInitializeAcpiTimer(VOID); HlpInitializeAcpiTimer(VOID);

View File

@ -18,7 +18,7 @@ VOID
HlClearApicErrors(VOID); HlClearApicErrors(VOID);
XTFASTCALL XTFASTCALL
ULONGLONG ULONG
HlReadApicRegister(IN APIC_REGISTER Register); HlReadApicRegister(IN APIC_REGISTER Register);
XTAPI XTAPI
@ -28,16 +28,12 @@ HlSendEoi(VOID);
XTFASTCALL XTFASTCALL
VOID VOID
HlWriteApicRegister(IN APIC_REGISTER Register, HlWriteApicRegister(IN APIC_REGISTER Register,
IN ULONGLONG Value); IN ULONG Value);
XTAPI XTAPI
BOOLEAN BOOLEAN
HlpCheckX2ApicSupport(VOID); HlpCheckX2ApicSupport(VOID);
XTAPI
ULONG
HlpGetCpuApicId(VOID);
XTCDECL XTCDECL
VOID VOID
HlpHandleApicSpuriousService(VOID); HlpHandleApicSpuriousService(VOID);
@ -58,11 +54,6 @@ XTAPI
VOID VOID
HlpInitializePic(VOID); HlpInitializePic(VOID);
XTAPI
VOID
HlpSendIpi(ULONG ApicId,
ULONG Vector);
XTFASTCALL XTFASTCALL
KRUNLEVEL KRUNLEVEL
HlpTransformApicTprToRunLevel(IN UCHAR Tpr); HlpTransformApicTprToRunLevel(IN UCHAR Tpr);

View File

@ -17,7 +17,7 @@ XTAPI
XTSTATUS XTSTATUS
MmAllocateHardwareMemory(IN PFN_NUMBER PageCount, MmAllocateHardwareMemory(IN PFN_NUMBER PageCount,
IN BOOLEAN Aligned, IN BOOLEAN Aligned,
OUT PPHYSICAL_ADDRESS Buffer); OUT PULONG_PTR Buffer);
XTAPI XTAPI
XTSTATUS XTSTATUS

View File

@ -29,7 +29,7 @@ XTAPI
XTSTATUS XTSTATUS
MmAllocateHardwareMemory(IN PFN_NUMBER PageCount, MmAllocateHardwareMemory(IN PFN_NUMBER PageCount,
IN BOOLEAN Aligned, IN BOOLEAN Aligned,
OUT PPHYSICAL_ADDRESS Buffer) OUT PULONG_PTR Buffer)
{ {
PLOADER_MEMORY_DESCRIPTOR Descriptor, ExtraDescriptor, HardwareDescriptor; PLOADER_MEMORY_DESCRIPTOR Descriptor, ExtraDescriptor, HardwareDescriptor;
PFN_NUMBER Alignment, MaxPage; PFN_NUMBER Alignment, MaxPage;
@ -37,7 +37,7 @@ MmAllocateHardwareMemory(IN PFN_NUMBER PageCount,
PLIST_ENTRY ListEntry; PLIST_ENTRY ListEntry;
/* Assume failure */ /* Assume failure */
(*Buffer).QuadPart = 0; *Buffer = 0;
/* Calculate maximum page address */ /* Calculate maximum page address */
MaxPage = MM_MAXIMUM_PHYSICAL_ADDRESS >> MM_PAGE_SHIFT; MaxPage = MM_MAXIMUM_PHYSICAL_ADDRESS >> MM_PAGE_SHIFT;
@ -135,7 +135,7 @@ MmAllocateHardwareMemory(IN PFN_NUMBER PageCount,
} }
/* Return physical address */ /* Return physical address */
(*Buffer).QuadPart = PhysicalAddress; *Buffer = PhysicalAddress;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }