Compare commits

...

20 Commits

Author SHA1 Message Date
e0125dda54
Use virtual FAT disk images
All checks were successful
Builds / ExectOS (i686) (push) Successful in 1m8s
Builds / ExectOS (amd64) (push) Successful in 1m49s
2025-01-24 09:19:59 +01:00
7b8f4f15cc
Add APIC Logical Destination Register (LDR) shifts and correct APIC delivery mode values
All checks were successful
Builds / ExectOS (i686) (push) Successful in 6m22s
Builds / ExectOS (amd64) (push) Successful in 23s
2024-07-23 20:14:06 +02:00
2e7793dc2b
Implement HlpGetCpuApicId() routine
Some checks failed
Builds / ExectOS (amd64) (push) Failing after 27s
Builds / ExectOS (i686) (push) Failing after 27s
2024-07-22 23:31:20 +02:00
2c5b680426
Implement HlpSendIpi() routine
All checks were successful
Builds / ExectOS (i686) (push) Successful in 36s
Builds / ExectOS (amd64) (push) Successful in 38s
2024-07-22 23:23:55 +02:00
626ece8046
HlReadApicRegister() should return and HlWriteApicRegister() should take ULONGLONG value
All checks were successful
Builds / ExectOS (i686) (push) Successful in 35s
Builds / ExectOS (amd64) (push) Successful in 36s
2024-07-16 22:36:45 +02:00
088940424d
Fix data types and rename some fields to avoid confusion
All checks were successful
Builds / ExectOS (i686) (push) Successful in 36s
Builds / ExectOS (amd64) (push) Successful in 36s
2024-07-16 16:28:12 +02:00
7abd0f3017
Revert unintentional change
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 35s
Builds / ExectOS (i686) (push) Successful in 34s
2024-07-14 12:13:56 +02:00
f8519ec09d
Rename HlpAcpiSystemInfo global variable to HlpSystemInfo
Some checks failed
Builds / ExectOS (amd64) (push) Failing after 27s
Builds / ExectOS (i686) (push) Failing after 27s
2024-07-14 12:11:39 +02:00
3bda67be0a
Basic ACPI system info initialization code for traversing MADT tables
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 36s
Builds / ExectOS (i686) (push) Successful in 35s
2024-07-13 21:08:58 +02:00
cb64235953
Use PHYSICAL_ADDRESS data type in MmAllocateHardwareMemory() routine as it is used in MmMapHardwareMemory() as well to avoid the need of data conversion
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 35s
Builds / ExectOS (i686) (push) Successful in 34s
2024-07-13 15:54:10 +02:00
ceb36ae8ec
Add PAGES_TO_SIZE macro definition
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 35s
Builds / ExectOS (i686) (push) Successful in 34s
2024-07-13 15:39:08 +02:00
94076b7471
Separate image base address per architecture
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 37s
Builds / ExectOS (i686) (push) Successful in 35s
2024-07-10 22:42:48 +02:00
ebc2607446
Update compiler optimization flags
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 37s
Builds / ExectOS (i686) (push) Successful in 35s
2024-07-10 17:57:29 +02:00
801cf64f45
Update kernel readme
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 39s
Builds / ExectOS (i686) (push) Successful in 37s
2024-07-10 16:10:48 +02:00
f52c50242a
Correct comment
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 38s
Builds / ExectOS (i686) (push) Successful in 36s
2024-07-09 22:57:02 +02:00
3f10e1b59e
Fix page fault when trying to find ACPI table
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 36s
Builds / ExectOS (i686) (push) Successful in 35s
2024-07-09 22:47:26 +02:00
47219585d4
Fix pointer operation overflow
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 36s
Builds / ExectOS (i686) (push) Successful in 36s
2024-07-09 22:40:32 +02:00
e46f2e6116
Ensure that table header is not set before attempting to find ACPI table
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 42s
Builds / ExectOS (i686) (push) Successful in 41s
2024-07-09 22:36:40 +02:00
3804786e89
All ACPI related structures should be packed
All checks were successful
Builds / ExectOS (i686) (push) Successful in 38s
Builds / ExectOS (amd64) (push) Successful in 40s
2024-07-07 22:13:34 +02:00
6bcf3e134f
Unify naming convention and switch to ULONG in memory map related routines
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 1m35s
Builds / ExectOS (i686) (push) Successful in 1m33s
2024-07-06 22:59:10 +02:00
25 changed files with 318 additions and 106 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.cmake) include(sdk/cmake/baseaddress/${ARCH}.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

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

View File

@ -1,3 +1,2 @@
# 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

@ -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 diskimg DEPENDS install
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 ${EXECTOS_BINARY_DIR}/output/disk.img -hda fat:rw:${EXECTOS_BINARY_DIR}/output/binaries
-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 diskimg DEPENDS install
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 ${EXECTOS_BINARY_DIR}/output/disk.img -hda fat:rw:${EXECTOS_BINARY_DIR}/output/binaries
-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,11 +11,10 @@ endif()
# Set build optimisation # Set build optimisation
if(BUILD_TYPE STREQUAL "DEBUG") if(BUILD_TYPE STREQUAL "DEBUG")
add_compiler_ccxxflags("/Zi") add_compiler_ccxxflags("/GS- /Zi /Ob0 /Od")
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("-Ob2 -Oy") add_compiler_ccxxflags("/GS- /Ob2 /Ot /Ox /Oy")
add_linker_flags("/INCREMENTAL:NO /OPT:REF /OPT:ICF") add_linker_flags("/INCREMENTAL:NO /OPT:REF /OPT:ICF")
endif() endif()

View File

@ -43,19 +43,23 @@
#define APIC_DF_CLUSTER 0x0FFFFFFF #define APIC_DF_CLUSTER 0x0FFFFFFF
/* APIC delivery modes */ /* APIC delivery modes */
#define APIC_DM_FIXED 0 #define APIC_DM_FIXED 0x00000000
#define APIC_DM_LOWPRIO 1 #define APIC_DM_LOWPRIO 0x00000100
#define APIC_DM_SMI 2 #define APIC_DM_SMI 0x00000200
#define APIC_DM_REMOTE 3 #define APIC_DM_REMOTE 0x00000300
#define APIC_DM_NMI 4 #define APIC_DM_NMI 0x00000400
#define APIC_DM_INIT 5 #define APIC_DM_INIT 0x00000500
#define APIC_DM_STARTUP 6 #define APIC_DM_STARTUP 0x00000600
#define APIC_DM_EXTINT 7 #define APIC_DM_EXTINT 0x00000700
/* 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 UINT_PTR VirtualAddress, IN UINT_PTR PhysicalAddress, IN UINT NumberOfPages); 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_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;
} GENERIC_ADDRESS, *PGENERIC_ADDRESS; } PACKED 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;
} ACPI_DESCRIPTION_HEADER, *PACPI_DESCRIPTION_HEADER; } PACKED 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;
} ACPI_SUBTABLE_HEADER, *PACPI_SUBTABLE_HEADER; } PACKED 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];
} ACPI_RSDP, *PACPI_RSDP; } PACKED 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[];
} ACPI_RSDT, *PACPI_RSDT; } PACKED 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;
} ACPI_FADT, *PACPI_FADT; } PACKED 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[];
} ACPI_MADT, *PACPI_MADT; } PACKED 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 ProcessorId; UCHAR AcpiId;
UCHAR Id; UCHAR ApicId;
ULONG LapicFlags; ULONG Flags;
} ACPI_MADT_LOCAL_APIC, *PACPI_MADT_LOCAL_APIC; } PACKED 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 Id; ULONG ApicId;
ULONG LapicFlags; ULONG Flags;
ULONG ProcessorId; ULONG AcpiId;
} ACPI_MADT_LOCAL_X2APIC, *PACPI_MADT_LOCAL_X2APIC; } PACKED 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;
ULONG ImcrPresent; BOOLEAN ImcrPresent;
ULONG ApicBase; ULONG ApicBase;
PPROCESSOR_IDENTITY CpuInfo; PPROCESSOR_IDENTITY CpuInfo;
ULONG IoApicPhysicalBase[APIC_MAX_IOAPICS]; ULONG IoApicPhysicalBase[APIC_MAX_IOAPICS];
PULONG IoApicVirtualBase[APIC_MAX_IOAPICS]; ULONG IoApicVirtualBase[APIC_MAX_IOAPICS];
ULONG IoApicIntiBase[APIC_MAX_IOAPICS]; ULONG IoApicVectorBase[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
{ {
UCHAR Id; ULONG AcpiId;
UCHAR CpuId; ULONG ApicId;
UCHAR CpuNumber; USHORT CpuNumber;
BOOLEAN Bsp; BOOLEAN Bsp;
BOOLEAN Started; BOOLEAN Started;
} PROCESSOR_IDENTITY, *PPROCESSOR_IDENTITY; } PROCESSOR_IDENTITY, *PPROCESSOR_IDENTITY;

View File

@ -48,19 +48,23 @@
#define APIC_DF_CLUSTER 0x0FFFFFFF #define APIC_DF_CLUSTER 0x0FFFFFFF
/* APIC delivery modes */ /* APIC delivery modes */
#define APIC_DM_FIXED 0 #define APIC_DM_FIXED 0x00000000
#define APIC_DM_LOWPRIO 1 #define APIC_DM_LOWPRIO 0x00000100
#define APIC_DM_SMI 2 #define APIC_DM_SMI 0x00000200
#define APIC_DM_REMOTE 3 #define APIC_DM_REMOTE 0x00000300
#define APIC_DM_NMI 4 #define APIC_DM_NMI 0x00000400
#define APIC_DM_INIT 5 #define APIC_DM_INIT 0x00000500
#define APIC_DM_STARTUP 6 #define APIC_DM_STARTUP 0x00000600
#define APIC_DM_EXTINT 7 #define APIC_DM_EXTINT 0x00000700
/* 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,7 +95,8 @@
#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 to pages conversion macro */ /* XT size <-> 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,6 +49,5 @@ 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 UINT_PTR VirtualAddress, IN ULONG_PTR VirtualAddress,
IN UINT_PTR PhysicalAddress, IN ULONG_PTR PhysicalAddress,
IN UINT NumberOfPages) IN ULONG 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 UINT_PTR VirtualAddress, IN ULONG_PTR VirtualAddress,
IN UINT_PTR PhysicalAddress, IN ULONG_PTR PhysicalAddress,
IN UINT NumberOfPages) IN ULONG 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 Pages, BlAllocateMemoryPages(IN ULONGLONG NumberOfPages,
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 Pages, BlFreeMemoryPages(IN ULONGLONG NumberOfPages,
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 UINT_PTR VirtualAddress, IN ULONG_PTR VirtualAddress,
IN UINT_PTR PhysicalAddress, IN ULONG_PTR PhysicalAddress,
IN UINT NumberOfPages); IN ULONG 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 Pages * @param NumberOfPages
* 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 Pages, BlAllocateMemoryPages(IN ULONGLONG NumberOfPages,
OUT PEFI_PHYSICAL_ADDRESS Memory) OUT PEFI_PHYSICAL_ADDRESS Memory)
{ {
return EfiSystemTable->BootServices->AllocatePages(AllocateAnyPages, EfiLoaderData, Pages, Memory); return EfiSystemTable->BootServices->AllocatePages(AllocateAnyPages, EfiLoaderData, NumberOfPages, Memory);
} }
/** /**
@ -55,7 +55,7 @@ BlAllocateMemoryPool(IN UINT_PTR Size,
/** /**
* This routine frees memory pages. * This routine frees memory pages.
* *
* @param Pages * @param NumberOfPages
* 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 Pages, BlFreeMemoryPages(IN ULONGLONG NumberOfPages,
IN EFI_PHYSICAL_ADDRESS Memory) IN EFI_PHYSICAL_ADDRESS Memory)
{ {
return EfiSystemTable->BootServices->FreePages(Memory, Pages); return EfiSystemTable->BootServices->FreePages(Memory, NumberOfPages);
} }
/** /**

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 Abstraction Layer (HAL) * Hl - Hardware Layer
* 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 Abstraction Layer ### HL: Hardware Layer
Hardware Abstraction Layer (HAL), is a layer between the physical hardware of the computer and the rest of the operating Hardware Layer, is a layer between the physical hardware of the computer and the rest of the operating system. It was
system. It was designed to hide differences in hardware and therefore it provides a consistent platform on which designed to hide differences in hardware and therefore it provides a consistent platform on which the system and
the system and applications may run. 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,15 +265,22 @@ XTAPI
XTSTATUS XTSTATUS
HlpInitializeAcpiSystemInformation(VOID) HlpInitializeAcpiSystemInformation(VOID)
{ {
PUCHAR MadtTable; PACPI_MADT_LOCAL_X2APIC LocalX2Apic;
PACPI_MADT_LOCAL_APIC LocalApic;
ULONG_PTR MadtTable;
PACPI_MADT Madt; PACPI_MADT Madt;
XTSTATUS Status; XTSTATUS Status;
ULONG CpuCount; USHORT CpuCount;
/* Zero the ACPI system information structure */ /* Allocate memory for ACPI system information structure */
RtlZeroMemory(&HlpAcpiSystemInfo, sizeof(ACPI_SYSTEM_INFO)); Status = HlpInitializeAcpiSystemStructure();
if(Status != STATUS_SUCCESS)
{
/* Failed to allocate memory, return error */
return STATUS_INSUFFICIENT_RESOURCES;
}
/* Get Multi-APIC Description Table (MADT) */ /* Get Multiple 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)
{ {
@ -282,38 +289,54 @@ HlpInitializeAcpiSystemInformation(VOID)
} }
/* Set APIC table traverse pointer and initialize number of CPUs */ /* Set APIC table traverse pointer and initialize number of CPUs */
MadtTable = (PUCHAR)Madt->ApicTables; MadtTable = (ULONG_PTR)Madt->ApicTables;
CpuCount = 0; CpuCount = 0;
/* Traverse all MADT tables to get number of processors */ /* Traverse all MADT tables to get system information */
while(MadtTable <= ((PUCHAR)Madt + Madt->Header.Length)) while(MadtTable <= ((ULONG_PTR)Madt + Madt->Header.Length))
{ {
/* Check if this is a local APIC subtable */ /* Check if this is a local APIC subtable */
if((((PACPI_MADT_LOCAL_APIC)MadtTable)->Header.Type == ACPI_MADT_TYPE_LOCAL_APIC) && if((((PACPI_SUBTABLE_HEADER)MadtTable)->Type == ACPI_MADT_TYPE_LOCAL_APIC) &&
(((PACPI_MADT_LOCAL_APIC)MadtTable)->Header.Length == sizeof(ACPI_MADT_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 */ /* Make sure, this CPU can be enabled */
if(((PACPI_MADT_LOCAL_APIC)MadtTable)->LapicFlags & ACPI_MADT_PLAOC_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 */ /* Increment number of CPUs */
CpuCount++; CpuCount++;
} }
/* Go to the next MADT table */ /* Go to the next MADT table */
MadtTable += ((PACPI_MADT_LOCAL_APIC)MadtTable)->Header.Length; MadtTable += ((PACPI_SUBTABLE_HEADER)MadtTable)->Length;
} }
else if((((PACPI_MADT_LOCAL_X2APIC)MadtTable)->Header.Type == ACPI_MADT_TYPE_LOCAL_X2APIC) && else if((((PACPI_SUBTABLE_HEADER)MadtTable)->Type == ACPI_MADT_TYPE_LOCAL_X2APIC) &&
(((PACPI_MADT_LOCAL_X2APIC)MadtTable)->Header.Length == sizeof(ACPI_MADT_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 */ /* Make sure, this CPU can be enabled */
if(((PACPI_MADT_LOCAL_X2APIC)MadtTable)->LapicFlags & ACPI_MADT_PLAOC_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 */ /* Increment number of CPUs */
CpuCount++; CpuCount++;
} }
/* Go to the next MADT table */ /* Go to the next MADT table */
MadtTable += ((PACPI_MADT_LOCAL_X2APIC)MadtTable)->Header.Length; MadtTable += ((PACPI_SUBTABLE_HEADER)MadtTable)->Length;
} }
else else
{ {
@ -322,6 +345,105 @@ HlpInitializeAcpiSystemInformation(VOID)
} }
} }
/* 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;
XTSTATUS Status;
ULONG CpuCount;
/* 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 number of processors */
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)))
{
/* Make sure, this CPU can be enabled */
if(((PACPI_MADT_LOCAL_APIC)MadtTable)->Flags & ACPI_MADT_PLAOC_ENABLED)
{
/* 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)))
{
/* Make sure, this CPU can be enabled */
if(((PACPI_MADT_LOCAL_X2APIC)MadtTable)->Flags & ACPI_MADT_PLAOC_ENABLED)
{
/* 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;
}
}
/* 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;
} }
@ -385,9 +507,13 @@ 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)
@ -399,7 +525,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 */
*AcpiTable = &AcpiCache->Header; TableHeader = &AcpiCache->Header;
break; break;
} }
@ -408,13 +534,14 @@ 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(*AcpiTable == NULL) if(TableHeader == 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 success */ /* Return table header and status code */
*AcpiTable = TableHeader;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -452,6 +579,9 @@ 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,9 +15,6 @@ 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;
@ -29,3 +26,6 @@ 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
ULONG ULONGLONG
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 ULONG Value) IN ULONGLONG Value)
{ {
if(HlpApicMode == APIC_MODE_X2APIC) if(HlpApicMode == APIC_MODE_X2APIC)
{ {
@ -133,6 +133,26 @@ 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.
* *
@ -371,3 +391,35 @@ 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
ULONG ULONGLONG
HlReadApicRegister(IN APIC_REGISTER Register); HlReadApicRegister(IN APIC_REGISTER Register);
XTAPI XTAPI
@ -28,12 +28,16 @@ HlSendEoi(VOID);
XTFASTCALL XTFASTCALL
VOID VOID
HlWriteApicRegister(IN APIC_REGISTER Register, HlWriteApicRegister(IN APIC_REGISTER Register,
IN ULONG Value); IN ULONGLONG Value);
XTAPI XTAPI
BOOLEAN BOOLEAN
HlpCheckX2ApicSupport(VOID); HlpCheckX2ApicSupport(VOID);
XTAPI
ULONG
HlpGetCpuApicId(VOID);
XTCDECL XTCDECL
VOID VOID
HlpHandleApicSpuriousService(VOID); HlpHandleApicSpuriousService(VOID);
@ -54,6 +58,11 @@ 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,9 +18,6 @@ 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;
@ -33,6 +30,9 @@ 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,6 +102,10 @@ 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
ULONG ULONGLONG
HlReadApicRegister(IN APIC_REGISTER Register); HlReadApicRegister(IN APIC_REGISTER Register);
XTAPI XTAPI
@ -28,12 +28,16 @@ HlSendEoi(VOID);
XTFASTCALL XTFASTCALL
VOID VOID
HlWriteApicRegister(IN APIC_REGISTER Register, HlWriteApicRegister(IN APIC_REGISTER Register,
IN ULONG Value); IN ULONGLONG Value);
XTAPI XTAPI
BOOLEAN BOOLEAN
HlpCheckX2ApicSupport(VOID); HlpCheckX2ApicSupport(VOID);
XTAPI
ULONG
HlpGetCpuApicId(VOID);
XTCDECL XTCDECL
VOID VOID
HlpHandleApicSpuriousService(VOID); HlpHandleApicSpuriousService(VOID);
@ -54,6 +58,11 @@ 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 PULONG_PTR Buffer); OUT PPHYSICAL_ADDRESS 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 PULONG_PTR Buffer) OUT PPHYSICAL_ADDRESS 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 = 0; (*Buffer).QuadPart = 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 = PhysicalAddress; (*Buffer).QuadPart = PhysicalAddress;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }