Compare commits

..

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

44 changed files with 259 additions and 569 deletions

View File

@ -7,7 +7,6 @@ jobs:
strategy: strategy:
matrix: matrix:
arch: [amd64, i686] arch: [amd64, i686]
build: [debug, release]
runs-on: oscw runs-on: oscw
container: container:
image: codingworkshop/oscw-runner:latest image: codingworkshop/oscw-runner:latest
@ -18,7 +17,7 @@ jobs:
fetch-depth: 0 fetch-depth: 0
- name: Build ExectOS - name: Build ExectOS
run: | run: |
echo "charch ${{ matrix.arch }} && chbuild ${{ matrix.build }} && ./configure.sh && cd build-${{ matrix.arch }}-${{ matrix.build }} && xbuild -v && xbuild diskimg -v" > build.cmds echo "charch ${{ matrix.arch }} && ./configure.sh && cd build-${{ matrix.arch }}-xtchain && xbuild -v && xbuild diskimg -v" > build.cmds
xtchain < build.cmds xtchain < build.cmds
- name: Publish binaries - name: Publish binaries
if: ${{ github.ref == 'refs/heads/master' }} if: ${{ github.ref == 'refs/heads/master' }}
@ -27,8 +26,8 @@ jobs:
OSCW_ARTIFACTS_USERNAME: ${{ secrets.OSCW_ARTIFACTS_USERNAME }} OSCW_ARTIFACTS_USERNAME: ${{ secrets.OSCW_ARTIFACTS_USERNAME }}
OSCW_ARTIFACTS_USERKEY: ${{ secrets.OSCW_ARTIFACTS_USERKEY }} OSCW_ARTIFACTS_USERKEY: ${{ secrets.OSCW_ARTIFACTS_USERKEY }}
run: | run: |
tar -I 'gzip' -cpf ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-${{ matrix.build }}-bin.tar.gz -C build-${{ matrix.arch }}-${{ matrix.build }}/output/binaries . tar -I 'gzip' -cpf ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-bin.tar.gz -C build-${{ matrix.arch }}-xtchain/output/binaries .
tar -I 'gzip' -cpf ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-${{ matrix.build }}-lib.tar.gz -C build-${{ matrix.arch }}-${{ matrix.build }}/output/library . tar -I 'gzip' -cpf ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-lib.tar.gz -C build-${{ matrix.arch }}-xtchain/output/library .
tar -I 'gzip' -cpf ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-${{ matrix.build }}-sym.tar.gz -C build-${{ matrix.arch }}-${{ matrix.build }}/output/symbols . tar -I 'gzip' -cpf ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-sym.tar.gz -C build-${{ matrix.arch }}-xtchain/output/symbols .
gzip -c build-${{ matrix.arch }}-${{ matrix.build }}/output/disk.img > ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-${{ matrix.build }}.img.gz gzip -c build-${{ matrix.arch }}-xtchain/output/disk.img > ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}.img.gz
artifact_publish "ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-${{ matrix.build }}*.gz" ExectOS artifact_publish "ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}*.gz" ExectOS

View File

@ -1,5 +1,8 @@
# Minimum CMake version requirement # Detect XTChain toolchain
cmake_minimum_required(VERSION 3.19.0) cmake_minimum_required(VERSION 3.19.0)
if(NOT CMAKE_VERSION MATCHES "XTC")
message(FATAL_ERROR "XTChain not detected or corrupted!")
endif()
# Lowercase target architecture # Lowercase target architecture
string(TOLOWER ${ARCH} ARCH) string(TOLOWER ${ARCH} ARCH)
@ -41,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

@ -12,6 +12,9 @@ This is a list of ideas that migh but not must be realized.
- [ ] Rewrite memory mapping and paging support in bootloader to make it more flexible and architecture independent. - [ ] Rewrite memory mapping and paging support in bootloader to make it more flexible and architecture independent.
This should support paging levels, thus allowing to make a use of PML5 on modern AMD64 processors and increasing This should support paging levels, thus allowing to make a use of PML5 on modern AMD64 processors and increasing
the addressable virtual memory from 256TB to 128PB. This is partially done. the addressable virtual memory from 256TB to 128PB. This is partially done.
- [ ] Implement a scrolling mechanism to boot menu allowing to show more boot entries than can fit in the box.
Currently, the limit is not set, nor check, thus adding more menu items will result in positions displayed under
the box.
- [ ] Implement editing boot menu entries directly from the boot menu. Changes should be runtime only (not stored on - [ ] Implement editing boot menu entries directly from the boot menu. Changes should be runtime only (not stored on
disk). disk).

View File

@ -8,14 +8,14 @@
<a href="https://git.codingworkshop.eu.org/xt-sys/exectos/actions"> <a href="https://git.codingworkshop.eu.org/xt-sys/exectos/actions">
<img alt="Build Status" src="https://codingworkshop.eu.org/actions.php?project=xt-sys/exectos"> <img alt="Build Status" src="https://codingworkshop.eu.org/actions.php?project=xt-sys/exectos">
</a> </a>
<a href="https://artifacts.codingworkshop.eu.org/ExectOS/?C=M&O=D"> <a href="https://artifacts.codingworkshop.eu.org/ExectOS">
<img alt="CI/CD Artifacts" src="https://img.shields.io/badge/Download-%F0%9F%A1%87-blueviolet"> <img alt="CI/CD Artifacts" src="https://img.shields.io/badge/Download-%F0%9F%A1%87-blueviolet">
</a> </a>
<a href="https://git.codingworkshop.eu.org/xt-sys/exectos/src/branch/master/COPYING.md"> <a href="https://git.codingworkshop.eu.org/xt-sys/exectos/src/branch/master/COPYING.md">
<img alt="License" src="https://img.shields.io/badge/License-GPLv3-blue.svg"> <img alt="License" src="https://img.shields.io/badge/License-GPLv3-blue.svg">
</a> </a>
<a href="https://exectos.eu.org/ai-assisted"> <a href="https://codeium.com/">
<img alt="AI Assisted" src="https://img.shields.io/badge/AI-Assisted-darkcyan"> <img alt="Codeium" src="https://img.shields.io/badge/Powered%20By-Codeium-09B6A2?logo=Codeium">
</a> </a>
<a href="https://github.com/sponsors/xt-sys/"> <a href="https://github.com/sponsors/xt-sys/">
<img alt="Sponsor" src="https://img.shields.io/badge/Sponsor-%E2%9D%A4-red?logo=GitHub"> <img alt="Sponsor" src="https://img.shields.io/badge/Sponsor-%E2%9D%A4-red?logo=GitHub">
@ -69,12 +69,15 @@ design, it requires a modern EFI enabled hardware. It is not possible currently
| xtldr | XTOS boot loader source code | | xtldr | XTOS boot loader source code |
# Build # Build
XTOS can only be built using [XTchain](https://git.codingworkshop.eu.org/xt-sys/xtchain), a dedicated toolchain designed XTOS can be built only by using [XTChain](https://git.codingworkshop.eu.org/xt-sys/xtchain), a special toolchain
specifically for compiling XT software. XTChain is currently available for both Linux and Windows. Detailed instructions prepared for compiling XT software. Currently, there is only a Linux version available, so a Linux distribution or WSL
on how to configure and run XTChain can be found [here](https://exectos.eu.org/contributing/setting-up-xtchain). is needed. If XTChain is already installed and available, then building ExectOS is quiet easy. First, open a terminal
or WSL console and type the following command to launch XTChain build console:
With the XTchain environment already running, navigate to the directory containing the ExectOS source code and use the ```
following commands to set the target build architecture and configure the sources: xtchain
```
While the console is already running, navigate to the directory containing ExectOS source code and use the following
commands to first set target build architecture and configure the sources:
``` ```
charch [i686|amd64] charch [i686|amd64]
chbuild [DEBUG|RELEASE] chbuild [DEBUG|RELEASE]

View File

@ -1,51 +0,0 @@
# PROJECT: ExectOS
# LICENSE: See the COPYING.md in the top level directory
# FILE: configure.ps1
# DESCRIPTION: Project configuration script for preparing the build environment
# DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
# Check XTchain
if (-not $env:XTCVER) {
Write-Host "XTChain not detected or corrupted!"
exit 1
}
# Set target architecture
if ($env:TARGET) {
$ARCH = $env:TARGET
} else {
$ARCH = "amd64"
}
# Set target build type
if (-not $env:BUILD_TYPE) {
$env:BUILD_TYPE = "DEBUG"
}
# Set variables
$EXECTOS_SOURCE_DIR = (Get-Location).Path
$EXECTOS_BINARY_DIR = "build-$($ARCH)-$($env:BUILD_TYPE.ToLower())"
# Create directories if needed
if ($EXECTOS_SOURCE_DIR -eq (Get-Location).Path) {
Write-Host "Creating directories in $EXECTOS_BINARY_DIR"
New-Item -ItemType Directory -Path $EXECTOS_BINARY_DIR -Force | Out-Null
Set-Location -Path $EXECTOS_BINARY_DIR
}
# Delete old cache
Remove-Item -Path "CMakeCache.txt" -ErrorAction SilentlyContinue
Remove-Item -Path "host-tools/CMakeCache.txt" -ErrorAction SilentlyContinue
# Configure project using CMake
& cmake -G Ninja -DARCH:STRING=$($ARCH) -DBUILD_TYPE:STRING=$($env:BUILD_TYPE) $EXECTOS_SOURCE_DIR
# Check if configuration succeeded
if ($LASTEXITCODE -ne 0) {
Write-Host "Configure script failed."
exit 1
} else {
"$($ARCH)" | Out-File -Encoding ASCII -NoNewline build.arch
Write-Host "Configure script completed. Enter '$EXECTOS_BINARY_DIR' directory and execute 'xbuild' to build ExectOS."
}

View File

@ -1,10 +1,4 @@
#!/bin/bash #!/bin/bash
# PROJECT: ExectOS
# LICENSE: See the COPYING.md in the top level directory
# FILE: configure.sh
# DESCRIPTION: Project configuration script for preparing the build environment
# DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
# Check XTCHain # Check XTCHain
if [ "x${XTCVER}" = "x" ]; then if [ "x${XTCVER}" = "x" ]; then
@ -22,12 +16,13 @@ fi
# Set variables # Set variables
EXECTOS_SOURCE_DIR=$(cd `dirname ${0}` && pwd) EXECTOS_SOURCE_DIR=$(cd `dirname ${0}` && pwd)
EXECTOS_BINARY_DIR=build-${ARCH}-${BUILD_TYPE,,} EXECTOS_BINARY_DIR=build-${ARCH}-xtchain
# Create directories if needed # Create directories if needed
if [ "${EXECTOS_SOURCE_DIR}" = "${PWD}" ]; then if [ "${EXECTOS_SOURCE_DIR}" = "${PWD}" ]; then
echo Creating directories in ${EXECTOS_BINARY_DIR} echo Creating directories in ${EXECTOS_BINARY_DIR}
mkdir -p "${EXECTOS_BINARY_DIR}" mkdir -p "${EXECTOS_BINARY_DIR}"
ln -sf ${EXECTOS_BINARY_DIR} build
cd "${EXECTOS_BINARY_DIR}" cd "${EXECTOS_BINARY_DIR}"
fi fi

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()
@ -47,9 +48,6 @@ add_compiler_ccxxflags("-nostdinc -Wno-char-subscripts -Wno-incompatible-library
add_compiler_ccxxflags("-Wno-microsoft-enum-forward-reference -Wno-multichar -Wno-parentheses-equality -Wno-undefined-inline") add_compiler_ccxxflags("-Wno-microsoft-enum-forward-reference -Wno-multichar -Wno-parentheses-equality -Wno-undefined-inline")
add_compiler_ccxxflags("-Wno-gnu-folding-constant") add_compiler_ccxxflags("-Wno-gnu-folding-constant")
# Disable compiler builtins
add_compiler_ccxxflags("-fno-builtin")
# Set debugging symbols output directory # Set debugging symbols output directory
set(CMAKE_PDB_OUTPUT_DIRECTORY "${EXECTOS_BINARY_DIR}/output/symbols") set(CMAKE_PDB_OUTPUT_DIRECTORY "${EXECTOS_BINARY_DIR}/output/symbols")

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

@ -29,7 +29,6 @@
#define MEMORY_ALIGNMENT 8 #define MEMORY_ALIGNMENT 8
#define MM_USERPAGE_TABLES 1536 #define MM_USERPAGE_TABLES 1536
#define MM_VIRTUAL_PAGESIZE 20 #define MM_VIRTUAL_PAGESIZE 20
#define STACK_ALIGNMENT 4
#elif defined(__amd64__) || defined(__x86_64__) #elif defined(__amd64__) || defined(__x86_64__)
#define _ARCH amd64 #define _ARCH amd64
#define _ARCH_AMD64 1 #define _ARCH_AMD64 1
@ -44,7 +43,6 @@
#define MEMORY_ALIGNMENT 16 #define MEMORY_ALIGNMENT 16
#define MM_USERPAGE_TABLES 4194304 #define MM_USERPAGE_TABLES 4194304
#define MM_VIRTUAL_PAGESIZE 52 #define MM_VIRTUAL_PAGESIZE 52
#define STACK_ALIGNMENT 16
#else #else
#error Unknown architecture #error Unknown architecture
#endif #endif

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;
@ -216,7 +216,6 @@ BlMapPage(IN PXTBL_PAGE_MAPPING PageMap,
} }
/* Set paging entry settings */ /* Set paging entry settings */
RtlZeroMemory(&Pml1[Pml1Entry], sizeof(HARDWARE_PTE));
Pml1[Pml1Entry].PageFrameNumber = PageFrameNumber; Pml1[Pml1Entry].PageFrameNumber = PageFrameNumber;
Pml1[Pml1Entry].Valid = 1; Pml1[Pml1Entry].Valid = 1;
Pml1[Pml1Entry].Writable = 1; Pml1[Pml1Entry].Writable = 1;
@ -251,12 +250,8 @@ EFI_STATUS
BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap, BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
IN ULONG_PTR SelfMapAddress) IN ULONG_PTR SelfMapAddress)
{ {
PHARDWARE_PTE PmlBase;
ULONGLONG PmlIndex; ULONGLONG PmlIndex;
/* Initialize PML base pointer */
PmlBase = (PHARDWARE_PTE)PageMap->PtePointer;
/* Check page map level */ /* Check page map level */
if(PageMap->PageMapLevel == 5) if(PageMap->PageMapLevel == 5)
{ {
@ -270,10 +265,9 @@ BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
PmlIndex = (SelfMapAddress >> MM_PXI_SHIFT) & 0x1FF; PmlIndex = (SelfMapAddress >> MM_PXI_SHIFT) & 0x1FF;
/* Add self-mapping for PML4 */ /* Add self-mapping for PML4 */
RtlZeroMemory(&PmlBase[PmlIndex], sizeof(HARDWARE_PTE)); ((PHARDWARE_PTE)PageMap->PtePointer)[PmlIndex].PageFrameNumber = (UINT_PTR)PageMap->PtePointer / EFI_PAGE_SIZE;
PmlBase[PmlIndex].PageFrameNumber = (UINT_PTR)PageMap->PtePointer / EFI_PAGE_SIZE; ((PHARDWARE_PTE)PageMap->PtePointer)[PmlIndex].Valid = 1;
PmlBase[PmlIndex].Valid = 1; ((PHARDWARE_PTE)PageMap->PtePointer)[PmlIndex].Writable = 1;
PmlBase[PmlIndex].Writable = 1;
} }
/* Return success */ /* Return success */

View File

@ -58,7 +58,6 @@ BlBuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
for(Index = 0; Index < 4; Index++) for(Index = 0; Index < 4; Index++)
{ {
/* Set paging entry settings */ /* Set paging entry settings */
RtlZeroMemory(&((PHARDWARE_PTE)PageMap->PtePointer)[Index], sizeof(HARDWARE_PTE));
((PHARDWARE_PTE)PageMap->PtePointer)[Index].PageFrameNumber = DirectoryAddress / EFI_PAGE_SIZE; ((PHARDWARE_PTE)PageMap->PtePointer)[Index].PageFrameNumber = DirectoryAddress / EFI_PAGE_SIZE;
((PHARDWARE_PTE)PageMap->PtePointer)[Index].Valid = 1; ((PHARDWARE_PTE)PageMap->PtePointer)[Index].Valid = 1;
@ -170,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;
@ -219,7 +218,6 @@ BlMapPage(IN PXTBL_PAGE_MAPPING PageMap,
} }
/* Set paging entry settings */ /* Set paging entry settings */
RtlZeroMemory(&Pml1[Pml1Entry], sizeof(HARDWARE_PTE));
Pml1[Pml1Entry].PageFrameNumber = PageFrameNumber; Pml1[Pml1Entry].PageFrameNumber = PageFrameNumber;
Pml1[Pml1Entry].Valid = 1; Pml1[Pml1Entry].Valid = 1;
Pml1[Pml1Entry].Writable = 1; Pml1[Pml1Entry].Writable = 1;
@ -254,9 +252,8 @@ EFI_STATUS
BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap, BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
IN ULONG_PTR SelfMapAddress) IN ULONG_PTR SelfMapAddress)
{ {
PHARDWARE_LEGACY_PTE LegacyPml;
PHARDWARE_PTE Pml;
ULONGLONG PmlIndex; ULONGLONG PmlIndex;
PHARDWARE_PTE Pml;
ULONG Index; ULONG Index;
/* Check page map level */ /* Check page map level */
@ -271,7 +268,6 @@ BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
/* Add self-mapping for PML3 (PAE enabled) */ /* Add self-mapping for PML3 (PAE enabled) */
for(Index = 0; Index < 4; Index++) for(Index = 0; Index < 4; Index++)
{ {
RtlZeroMemory(&Pml[PmlIndex + Index], sizeof(HARDWARE_PTE));
Pml[PmlIndex + Index].PageFrameNumber = ((PHARDWARE_PTE)PageMap->PtePointer)[Index].PageFrameNumber; Pml[PmlIndex + Index].PageFrameNumber = ((PHARDWARE_PTE)PageMap->PtePointer)[Index].PageFrameNumber;
Pml[PmlIndex + Index].Valid = 1; Pml[PmlIndex + Index].Valid = 1;
Pml[PmlIndex + Index].Writable = 1; Pml[PmlIndex + Index].Writable = 1;
@ -279,16 +275,13 @@ BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
} }
else else
{ {
LegacyPml = (PHARDWARE_LEGACY_PTE)PageMap->PtePointer;
/* Calculate PML index based on provided self map address */ /* Calculate PML index based on provided self map address */
PmlIndex = (SelfMapAddress >> MM_PDI_LEGACY_SHIFT); PmlIndex = (SelfMapAddress >> MM_PDI_LEGACY_SHIFT);
/* Add self-mapping for PML2 (PAE disabled) */ /* Add self-mapping for PML2 (PAE disabled) */
RtlZeroMemory(&LegacyPml[PmlIndex], sizeof(HARDWARE_LEGACY_PTE)); ((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[PmlIndex].PageFrameNumber = (UINT_PTR)PageMap->PtePointer / EFI_PAGE_SIZE;
LegacyPml[PmlIndex].PageFrameNumber = (UINT_PTR)PageMap->PtePointer / EFI_PAGE_SIZE; ((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[PmlIndex].Valid = 1;
LegacyPml[PmlIndex].Valid = 1; ((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[PmlIndex].Writable = 1;
LegacyPml[PmlIndex].Writable = 1;
} }
/* Return success */ /* Return success */

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
@ -462,7 +462,7 @@ XTCDECL
BOOLEAN BOOLEAN
BlpFindParentBlockDevice(IN PLIST_ENTRY BlockDevices, BlpFindParentBlockDevice(IN PLIST_ENTRY BlockDevices,
IN PEFI_BLOCK_DEVICE_DATA ChildNode, IN PEFI_BLOCK_DEVICE_DATA ChildNode,
OUT PEFI_BLOCK_DEVICE_DATA *ParentNode); OUT PEFI_BLOCK_DEVICE_DATA ParentNode);
XTCDECL XTCDECL
LONG LONG

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

@ -47,7 +47,7 @@ ChBootSystem(IN PXTBL_BOOT_PARAMETERS Parameters)
} }
/* Open EFI volume */ /* Open EFI volume */
Status = XtLdrProtocol->Disk.OpenVolume(Parameters->DevicePath, &DiskHandle, &FsHandle); Status = XtLdrProtocol->Disk.OpenVolume(NULL, &DiskHandle, &FsHandle);
if(Status != STATUS_EFI_SUCCESS) if(Status != STATUS_EFI_SUCCESS)
{ {
/* Failed to open a volume, return error code */ /* Failed to open a volume, return error code */

View File

@ -25,7 +25,7 @@ XtpMapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
{ {
PHARDWARE_PTE PdeBase, PpeBase, PxeBase; PHARDWARE_PTE PdeBase, PpeBase, PxeBase;
EFI_PHYSICAL_ADDRESS Address; EFI_PHYSICAL_ADDRESS Address;
EFI_STATUS Status; XTSTATUS Status;
/* Check page map level */ /* Check page map level */
if(PageMap->PageMapLevel > 4) if(PageMap->PageMapLevel > 4)
@ -168,9 +168,6 @@ XtEnablePaging(IN PXTBL_PAGE_MAPPING PageMap)
/* Write PML4 to CR3 */ /* Write PML4 to CR3 */
ArWriteControlRegister(3, (UINT_PTR)PageMap->PtePointer); ArWriteControlRegister(3, (UINT_PTR)PageMap->PtePointer);
/* Enable paging */
ArWriteControlRegister(0, ArReadControlRegister(0) | CR0_PG);
/* Return success */ /* Return success */
return STATUS_EFI_SUCCESS; return STATUS_EFI_SUCCESS;
} }

View File

@ -24,9 +24,8 @@ EFI_STATUS
XtpMapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap) XtpMapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
{ {
EFI_PHYSICAL_ADDRESS Address; EFI_PHYSICAL_ADDRESS Address;
PHARDWARE_LEGACY_PTE LegacyPdeBase;
PHARDWARE_PTE PdeBase; PHARDWARE_PTE PdeBase;
EFI_STATUS Status; XTSTATUS Status;
/* Allocate memory */ /* Allocate memory */
Status = XtLdrProtocol->Memory.AllocatePages(1, &Address); Status = XtLdrProtocol->Memory.AllocatePages(1, &Address);
@ -39,14 +38,13 @@ XtpMapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
/* Zero fill allocated memory */ /* Zero fill allocated memory */
RtlZeroMemory((PVOID)Address, EFI_PAGE_SIZE); RtlZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
/* Check if PAE is enabled (3-level paging) */ /* Check page map level */
if(PageMap->PageMapLevel == 3) if(PageMap->PageMapLevel == 3)
{ {
/* Get PDE base address (PAE enabled) */ /* Get PDE base address (PAE enabled) */
PdeBase = (PHARDWARE_PTE)(((PHARDWARE_PTE)PageMap->PtePointer)[MM_HARDWARE_VA_START >> MM_PPI_SHIFT].PageFrameNumber << MM_PAGE_SHIFT); PdeBase = (PHARDWARE_PTE)(((PHARDWARE_PTE)PageMap->PtePointer)[MM_HARDWARE_VA_START >> MM_PPI_SHIFT].PageFrameNumber << MM_PAGE_SHIFT);
/* Make PDE valid */ /* Make PDE valid */
RtlZeroMemory(&PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF], sizeof(HARDWARE_PTE));
PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF].PageFrameNumber = Address >> MM_PAGE_SHIFT; PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF].PageFrameNumber = Address >> MM_PAGE_SHIFT;
PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF].Valid = 1; PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF].Valid = 1;
PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF].Writable = 1; PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF].Writable = 1;
@ -54,11 +52,9 @@ XtpMapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
else else
{ {
/* Make PDE valid (PAE disabled) */ /* Make PDE valid (PAE disabled) */
LegacyPdeBase = (PHARDWARE_LEGACY_PTE)PageMap->PtePointer; ((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].Valid = 1;
RtlZeroMemory(&LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT], sizeof(HARDWARE_LEGACY_PTE)); ((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].PageFrameNumber = Address >> MM_PAGE_SHIFT;
LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].Valid = 1; ((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].Writable = 1;
LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].PageFrameNumber = Address >> MM_PAGE_SHIFT;
LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].Writable = 1;
} }
/* Return success */ /* Return success */
@ -79,18 +75,22 @@ XTCDECL
EFI_STATUS EFI_STATUS
XtEnablePaging(IN PXTBL_PAGE_MAPPING PageMap) XtEnablePaging(IN PXTBL_PAGE_MAPPING PageMap)
{ {
CPUID_REGISTERS CpuRegisters; PCPUID_REGISTERS CpuRegisters = NULL;
EFI_STATUS Status; EFI_STATUS Status;
/* Prepare CPUID registers */ /* Prepare CPUID registers */
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS)); CpuRegisters->Leaf = CPUID_GET_CPU_FEATURES;
CpuRegisters.Leaf = CPUID_GET_CPU_FEATURES; CpuRegisters->SubLeaf = 0;
CpuRegisters->Eax = 0;
CpuRegisters->Ebx = 0;
CpuRegisters->Ecx = 0;
CpuRegisters->Edx = 0;
/* Get CPUID */ /* Get CPUID */
ArCpuId(&CpuRegisters); ArCpuId(CpuRegisters);
/* Store PAE status from the CPUID results */ /* Store PAE status from the CPUID results */
if(!(CpuRegisters.Edx & CPUID_FEATURES_EDX_PAE)) if(!(CpuRegisters->Edx & CPUID_FEATURES_EDX_PAE))
{ {
/* No PAE support */ /* No PAE support */
XtLdrProtocol->Debug.Print(L"ERROR: PAE extension not supported by the CPU\n"); XtLdrProtocol->Debug.Print(L"ERROR: PAE extension not supported by the CPU\n");

View File

@ -323,7 +323,7 @@ XtBootSystem(IN PXTBL_BOOT_PARAMETERS Parameters)
Parameters->KernelFile, Parameters->Parameters); Parameters->KernelFile, Parameters->Parameters);
/* Open EFI volume */ /* Open EFI volume */
Status = XtLdrProtocol->Disk.OpenVolume(Parameters->DevicePath, &DiskHandle, &FsHandle); Status = XtLdrProtocol->Disk.OpenVolume(NULL, &DiskHandle, &FsHandle);
if(Status != STATUS_EFI_SUCCESS) if(Status != STATUS_EFI_SUCCESS)
{ {
/* Failed to open a volume */ /* Failed to open a volume */

View File

@ -4,7 +4,6 @@
* FILE: xtldr/textui.c * FILE: xtldr/textui.c
* DESCRIPTION: Text console User Interface (TUI) support for XT Boot Loader * DESCRIPTION: Text console User Interface (TUI) support for XT Boot Loader
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org> * DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
* Aiken Harris <harraiken91@gmail.com>
*/ */
#include <xtldr.h> #include <xtldr.h>
@ -23,8 +22,7 @@ BlDisplayBootMenu()
{ {
XTBL_DIALOG_HANDLE Handle; XTBL_DIALOG_HANDLE Handle;
PXTBL_BOOTMENU_ITEM MenuEntries = NULL; PXTBL_BOOTMENU_ITEM MenuEntries = NULL;
ULONG Index; ULONG Index, NumberOfEntries, HighligtedEntryId;
ULONG HighligtedEntryId, NumberOfEntries, TopVisibleEntry, VisibleEntries;
UINT_PTR EventIndex; UINT_PTR EventIndex;
EFI_EVENT Events[2]; EFI_EVENT Events[2];
EFI_INPUT_KEY Key; EFI_INPUT_KEY Key;
@ -34,7 +32,6 @@ BlDisplayBootMenu()
PWCHAR TimeOutString; PWCHAR TimeOutString;
/* Initialize boot menu list */ /* Initialize boot menu list */
TopVisibleEntry = 0;
Status = BlInitializeBootMenuList(&MenuEntries, &NumberOfEntries, &HighligtedEntryId); Status = BlInitializeBootMenuList(&MenuEntries, &NumberOfEntries, &HighligtedEntryId);
if(Status != STATUS_EFI_SUCCESS) if(Status != STATUS_EFI_SUCCESS)
{ {
@ -42,19 +39,6 @@ BlDisplayBootMenu()
return; return;
} }
/* Draw boot menu */
BlpDrawBootMenu(&Handle);
/* Calculate how many entries can be visible in the menu box */
VisibleEntries = Handle.Height - 2;
/* Adjust the view if the default entry is not initially visible */
if(HighligtedEntryId >= VisibleEntries)
{
/* Scroll the view to make the highlighted entry the last visible one */
TopVisibleEntry = HighligtedEntryId - VisibleEntries + 1;
}
/* Get timeout from the configuration */ /* Get timeout from the configuration */
TimeOutString = BlGetConfigValue(L"TIMEOUT"); TimeOutString = BlGetConfigValue(L"TIMEOUT");
TimeOut = -1; TimeOut = -1;
@ -75,24 +59,23 @@ BlDisplayBootMenu()
/* Infinite boot menu loop */ /* Infinite boot menu loop */
while(TRUE) while(TRUE)
{ {
/* Redraw boot menu */ /* Draw boot menu */
BlpDrawBootMenu(&Handle); BlpDrawBootMenu(&Handle);
/* Sanity check to ensure we do not display more entries than possible */
if (VisibleEntries > NumberOfEntries)
{
VisibleEntries = NumberOfEntries;
}
/* Check if there is anything to show in the boot menu */ /* Check if there is anything to show in the boot menu */
if(NumberOfEntries > 0) if(NumberOfEntries > 0) {
{ /* Check if all menu entries will fit into the menu box */
if(NumberOfEntries > Handle.Height - 2)
{
/* Too many menu entries, limit entries to match box height (-2 for upper and bottom borders) */
NumberOfEntries = Handle.Height - 2;
}
/* Iterate through all menu entries */ /* Iterate through all menu entries */
for(Index = 0; Index < VisibleEntries; Index++) for(Index = 0; Index < NumberOfEntries; Index++)
{ {
/* Draw menu entry */ /* Draw menu entry */
BlpDrawBootMenuEntry(&Handle, MenuEntries[TopVisibleEntry + Index].EntryName, BlpDrawBootMenuEntry(&Handle, MenuEntries[Index].EntryName, Index, Index == HighligtedEntryId);
Index, (TopVisibleEntry + Index) == HighligtedEntryId);
} }
} }
else else
@ -176,14 +159,14 @@ BlDisplayBootMenu()
else if(Key.ScanCode == 0x01) else if(Key.ScanCode == 0x01)
{ {
/* UpArrow key pressed, go to previous entry if possible */ /* UpArrow key pressed, go to previous entry if possible */
if (HighligtedEntryId > 0) if(HighligtedEntryId > 0)
{ {
/* Highlight previous entry */
HighligtedEntryId--; HighligtedEntryId--;
if (HighligtedEntryId < TopVisibleEntry) BlpDrawBootMenuEntry(&Handle, MenuEntries[HighligtedEntryId + 1].EntryName,
{ HighligtedEntryId + 1, FALSE);
TopVisibleEntry = HighligtedEntryId; BlpDrawBootMenuEntry(&Handle, MenuEntries[HighligtedEntryId].EntryName,
} HighligtedEntryId, TRUE);
break;
} }
} }
else if(Key.ScanCode == 0x02) else if(Key.ScanCode == 0x02)
@ -191,12 +174,12 @@ BlDisplayBootMenu()
/* DownArrow key pressed, go to next entry if possible */ /* DownArrow key pressed, go to next entry if possible */
if(HighligtedEntryId < NumberOfEntries - 1) if(HighligtedEntryId < NumberOfEntries - 1)
{ {
/* Highlight next entry */
HighligtedEntryId++; HighligtedEntryId++;
if (HighligtedEntryId >= TopVisibleEntry + VisibleEntries) BlpDrawBootMenuEntry(&Handle, MenuEntries[HighligtedEntryId - 1].EntryName,
{ HighligtedEntryId - 1, FALSE);
TopVisibleEntry = HighligtedEntryId - VisibleEntries + 1; BlpDrawBootMenuEntry(&Handle, MenuEntries[HighligtedEntryId].EntryName,
} HighligtedEntryId, TRUE);
break;
} }
} }
else if(Key.ScanCode == 0x09) else if(Key.ScanCode == 0x09)
@ -205,9 +188,12 @@ BlDisplayBootMenu()
if(HighligtedEntryId != 0) if(HighligtedEntryId != 0)
{ {
/* Highlight first entry */ /* Highlight first entry */
BlpDrawBootMenuEntry(&Handle, MenuEntries[HighligtedEntryId].EntryName,
HighligtedEntryId, FALSE);
BlpDrawBootMenuEntry(&Handle, MenuEntries[0].EntryName, 0, TRUE);
/* Update highlighted entry ID */
HighligtedEntryId = 0; HighligtedEntryId = 0;
TopVisibleEntry = 0;
break;
} }
} }
else if(Key.ScanCode == 0x0A) else if(Key.ScanCode == 0x0A)
@ -216,9 +202,13 @@ BlDisplayBootMenu()
if(HighligtedEntryId != NumberOfEntries - 1) if(HighligtedEntryId != NumberOfEntries - 1)
{ {
/* Highlight last entry */ /* Highlight last entry */
BlpDrawBootMenuEntry(&Handle, MenuEntries[HighligtedEntryId].EntryName,
HighligtedEntryId, FALSE);
BlpDrawBootMenuEntry(&Handle, MenuEntries[NumberOfEntries - 1].EntryName,
NumberOfEntries - 1, TRUE);
/* Update highlighted entry ID */
HighligtedEntryId = NumberOfEntries - 1; HighligtedEntryId = NumberOfEntries - 1;
TopVisibleEntry = (NumberOfEntries > VisibleEntries) ? (NumberOfEntries - VisibleEntries) : 0;
break;
} }
} }
else if(Key.ScanCode == 0x0B) else if(Key.ScanCode == 0x0B)
@ -880,8 +870,8 @@ BlpDrawBootMenu(OUT PXTBL_DIALOG_HANDLE Handle)
BlSetCursorPosition(0, Handle->PosY + Handle->Height); BlSetCursorPosition(0, Handle->PosY + Handle->Height);
BlSetConsoleAttributes(EFI_TEXT_BGCOLOR_BLACK | EFI_TEXT_FGCOLOR_LIGHTGRAY); BlSetConsoleAttributes(EFI_TEXT_BGCOLOR_BLACK | EFI_TEXT_FGCOLOR_LIGHTGRAY);
BlConsolePrint(L" Use cursors to change the selection. Press ENTER key to boot the chosen\n" BlConsolePrint(L" Use cursors to change the selection. Press ENTER key to boot the chosen\n"
L" Operating System, 'e' to edit it before booting or 's' for XTLDR shell.\n" " Operating System, 'e' to edit it before booting or 's' for XTLDR shell.\n"
L" Additional help available after pressing F1 key."); " Additional help available after pressing F1 key.");
} }
/** /**

View File

@ -4,7 +4,6 @@
* FILE: xtldr/volume.c * FILE: xtldr/volume.c
* DESCRIPTION: XTLDR volume support * DESCRIPTION: XTLDR volume support
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org> * DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
* Aiken Harris <harraiken91@gmail.com>
*/ */
#include <xtldr.h> #include <xtldr.h>
@ -79,41 +78,21 @@ BlEnumerateBlockDevices()
ListEntry = BlockDevices.Flink; ListEntry = BlockDevices.Flink;
while(ListEntry != &BlockDevices) while(ListEntry != &BlockDevices)
{ {
/* Get data for the next discovered device. */ /* Take block device from the list */
BlockDeviceData = CONTAIN_RECORD(ListEntry, EFI_BLOCK_DEVICE_DATA, ListEntry); BlockDeviceData = CONTAIN_RECORD(ListEntry, EFI_BLOCK_DEVICE_DATA, ListEntry);
/* Find last node */ /* Find last node */
Status = BlpFindLastBlockDeviceNode(BlockDeviceData->DevicePath, &LastNode); Status = BlpFindLastBlockDeviceNode(BlockDeviceData->DevicePath, &LastNode);
if(Status != STATUS_EFI_SUCCESS) if(Status != STATUS_EFI_SUCCESS)
{ {
/* Skip this device if its last node cannot be found, as it is required for classification */
BlDebugPrint(L"WARNING: Block device last node not found\n"); BlDebugPrint(L"WARNING: Block device last node not found\n");
ListEntry = ListEntry->Flink; ListEntry = ListEntry->Flink;
continue; continue;
} }
/* Initialize drive type before attempting to classify the device */ /* Set drive type to 'unknown' by default */
DriveType = XTBL_BOOT_DEVICE_UNKNOWN; DriveType = XTBL_BOOT_DEVICE_UNKNOWN;
/* Locate the parent for this block device to ensure it is not an orphaned entry */
if(!BlpFindParentBlockDevice(&BlockDevices, BlockDeviceData, &ParentNode))
{
/* Orphaned device found. Log a warning and skip it as it cannot be properly classified */
BlDebugPrint(L"WARNING: No parent device found, skipping orphaned media device path\n");
ListEntry = ListEntry->Flink;
continue;
}
/* Verify that media information is available, as some devices may not report it */
if(!BlockDeviceData->BlockIo->Media)
{
/* The device is unusable without media info, log a warning and skip it */
BlDebugPrint(L"WARNING: Block device is missing media information\n");
ListEntry = ListEntry->Flink;
continue;
}
Media = BlockDeviceData->BlockIo->Media;
/* Check last node type */ /* Check last node type */
if(LastNode->Type == EFI_ACPI_DEVICE_PATH && LastNode->SubType == EFI_ACPI_DP) if(LastNode->Type == EFI_ACPI_DEVICE_PATH && LastNode->SubType == EFI_ACPI_DP)
{ {
@ -122,54 +101,65 @@ BlEnumerateBlockDevices()
if(AcpiDevice->HID == 0x60441D0 || AcpiDevice->HID == 0x70041D0 || AcpiDevice->HID == 0x70141D1) if(AcpiDevice->HID == 0x60441D0 || AcpiDevice->HID == 0x70041D0 || AcpiDevice->HID == 0x70141D1)
{ {
/* Floppy drive found */ /* Floppy drive found */
Media = BlockDeviceData->BlockIo->Media;
DriveType = XTBL_BOOT_DEVICE_FLOPPY; DriveType = XTBL_BOOT_DEVICE_FLOPPY;
DriveNumber = FDCount++; DriveNumber = FDCount++;
PartitionNumber = 0; PartitionNumber = 0;
/* Print debug message */ /* Print debug message */
BlDebugPrint(L"Found Floppy Disk (DiskNumber: %lu, MediaPresent: %u, RO: %u)\n", BlDebugPrint(L"Found Floppy Disk (DiskNumber: %lu, MediaPresent: %u, RO: %u)\n",
DriveNumber, Media->MediaPresent, Media->ReadOnly); DriveNumber, Media->MediaPresent, Media->ReadOnly);
} }
} }
else if((LastNode->Type == EFI_MEDIA_DEVICE_PATH && LastNode->SubType == EFI_MEDIA_CDROM_DP) || else if(LastNode->Type == EFI_MEDIA_DEVICE_PATH)
(LastNode->Type == EFI_MESSAGING_DEVICE_PATH &&
(LastNode->SubType == EFI_MESSAGING_ATAPI_DP || LastNode->SubType == EFI_MESSAGING_SATA_DP) &&
Media->MediaPresent && Media->RemovableMedia))
{ {
/* Optical drive found */ /* Media device path found */
DriveType = XTBL_BOOT_DEVICE_CDROM; if(LastNode->SubType == EFI_MEDIA_CDROM_DP)
DriveNumber = CDCount++; {
PartitionNumber = 0; /* Optical drive found */
Media = BlockDeviceData->BlockIo->Media;
DriveType = XTBL_BOOT_DEVICE_CDROM;
DriveNumber = CDCount++;
PartitionNumber = 0;
/* Print debug message */ /* Print debug message */
BlDebugPrint(L"Found CD-ROM drive (DriveNumber: %lu, MediaPresent: %u, RemovableMedia: %u, RO: %u)\n", BlDebugPrint(L"Found CD-ROM drive (DriveNumber: %lu, MediaPresent: %u, RemovableMedia: %u, RO: %u)\n",
DriveNumber, Media->MediaPresent, Media->RemovableMedia, Media->ReadOnly); DriveNumber, Media->MediaPresent, Media->RemovableMedia, Media->ReadOnly);
} }
else if(LastNode->Type == EFI_MEDIA_DEVICE_PATH && LastNode->SubType == EFI_MEDIA_HARDDRIVE_DP) else if(LastNode->SubType == EFI_MEDIA_HARDDRIVE_DP)
{ {
/* Hard disk partition found */ /* Hard disk partition found */
HDPath = (PEFI_HARDDRIVE_DEVICE_PATH)LastNode; Media = BlockDeviceData->BlockIo->Media;
DriveType = XTBL_BOOT_DEVICE_HARDDISK; HDPath = (PEFI_HARDDRIVE_DEVICE_PATH)LastNode;
DriveNumber = (HDPath->PartitionNumber == 1) ? HDCount++ : HDCount - 1; DriveType = XTBL_BOOT_DEVICE_HARDDISK;
PartitionNumber = HDPath->PartitionNumber; DriveNumber = (HDPath->PartitionNumber == 1) ? HDCount++ : HDCount - 1;
PartitionGuid = (PEFI_GUID)HDPath->Signature; PartitionNumber = HDPath->PartitionNumber;
PartitionGuid = (PEFI_GUID)HDPath->Signature;
/* Print debug message */ /* Print debug message */
BlDebugPrint(L"Found Hard Disk partition (DiskNumber: %lu, PartNumber: %lu, " BlDebugPrint(L"Found Hard Disk partition (DiskNumber: %lu, PartNumber: %lu, "
L"MBRType: %u, GUID: {%V}, PartSize: %uB)\n", L"MBRType: %u, GUID: {%V}, PartSize: %uB)\n",
DriveNumber, PartitionNumber, HDPath->MBRType, DriveNumber, PartitionNumber, HDPath->MBRType,
PartitionGuid, HDPath->PartitionSize * Media->BlockSize); PartitionGuid, HDPath->PartitionSize * Media->BlockSize);
} }
else if(LastNode->Type == EFI_MEDIA_DEVICE_PATH && LastNode->SubType == EFI_MEDIA_RAMDISK_DP) else if(LastNode->SubType == EFI_MEDIA_RAMDISK_DP)
{ {
/* RAM disk found */ /* RAM disk found */
DriveType = XTBL_BOOT_DEVICE_RAMDISK; Media = BlockDeviceData->BlockIo->Media;
DriveNumber = RDCount++; DriveType = XTBL_BOOT_DEVICE_RAMDISK;
PartitionNumber = 0; DriveNumber = RDCount++;
PartitionNumber = 0;
/* Print debug message */ /* Print debug message */
BlDebugPrint(L"Found RAM Disk (DiskNumber: %lu, MediaPresent: %u)\n", BlDebugPrint(L"Found RAM Disk (DiskNumber: %lu, MediaPresent: %u)\n",
DriveNumber, Media->MediaPresent); DriveNumber, Media->MediaPresent);
}
if(!BlpFindParentBlockDevice(&BlockDevices, BlockDeviceData, ParentNode))
{
BlDebugPrint(L"WARNING: No parent device found, skipping orphaned media device path\n");
continue;
}
} }
/* Make sure the device found has valid type set */ /* Make sure the device found has valid type set */
@ -927,25 +917,17 @@ BlpDuplicateDevicePath(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath)
EFI_STATUS Status; EFI_STATUS Status;
UINT Length = 0; UINT Length = 0;
/* Check if the input device path is NULL */
if(!DevicePath)
{
/* Nothing to duplicate */
return NULL;
}
/* Start iterating from the beginning of the device path */
DevicePathNode = DevicePath; DevicePathNode = DevicePath;
/* Get the device path length */ /* Get the device path length */
while(TRUE) while(TRUE)
{ {
Length += *(PUSHORT)DevicePathNode->Length; Length += *(PUSHORT)DevicePath->Length;
if(DevicePathNode->Type == EFI_END_DEVICE_PATH) if(DevicePathNode->Type == EFI_END_DEVICE_PATH)
{ {
break; break;
} }
DevicePathNode = (PEFI_DEVICE_PATH_PROTOCOL)((PUCHAR)DevicePathNode + *(PUSHORT)DevicePathNode->Length); DevicePathNode = (PEFI_DEVICE_PATH_PROTOCOL)((PUCHAR)DevicePathNode + *(PUSHORT)DevicePath->Length);
} }
/* Check length */ /* Check length */
@ -1034,7 +1016,7 @@ XTCDECL
BOOLEAN BOOLEAN
BlpFindParentBlockDevice(IN PLIST_ENTRY BlockDevices, BlpFindParentBlockDevice(IN PLIST_ENTRY BlockDevices,
IN PEFI_BLOCK_DEVICE_DATA ChildNode, IN PEFI_BLOCK_DEVICE_DATA ChildNode,
OUT PEFI_BLOCK_DEVICE_DATA *ParentNode) OUT PEFI_BLOCK_DEVICE_DATA ParentNode)
{ {
PEFI_DEVICE_PATH_PROTOCOL ChildDevicePath, ParentDevicePath; PEFI_DEVICE_PATH_PROTOCOL ChildDevicePath, ParentDevicePath;
PEFI_BLOCK_DEVICE_DATA BlockDeviceData; PEFI_BLOCK_DEVICE_DATA BlockDeviceData;
@ -1057,7 +1039,7 @@ BlpFindParentBlockDevice(IN PLIST_ENTRY BlockDevices,
if(ParentDevicePath->Type == EFI_END_DEVICE_PATH) if(ParentDevicePath->Type == EFI_END_DEVICE_PATH)
{ {
/* Parent device is a match */ /* Parent device is a match */
*ParentNode = BlockDeviceData; ParentNode = BlockDeviceData;
return TRUE; return TRUE;
} }

View File

@ -151,8 +151,7 @@ BlInitializeBootMenuList(OUT PXTBL_BOOTMENU_ITEM *MenuEntries,
MenuEntrySection = CONTAIN_RECORD(MenuEntrySectionList, XTBL_CONFIG_SECTION, Flink); MenuEntrySection = CONTAIN_RECORD(MenuEntrySectionList, XTBL_CONFIG_SECTION, Flink);
/* Check if this is the default menu entry */ /* Check if this is the default menu entry */
if((RtlWideStringLength(MenuEntrySection->SectionName, 0) == RtlWideStringLength(DefaultMenuEntry, 0)) && if(RtlCompareWideStringInsensitive(MenuEntrySection->SectionName, DefaultMenuEntry, 0) == 0)
(RtlCompareWideStringInsensitive(MenuEntrySection->SectionName, DefaultMenuEntry, 0) == 0))
{ {
/* Set default OS ID */ /* Set default OS ID */
DefaultOS = NumberOfEntries; DefaultOS = NumberOfEntries;

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

@ -216,7 +216,7 @@ ArpInitializeGdt(IN PKPROCESSOR_BLOCK ProcessorBlock)
ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_R3_CMCODE, 0x0, 0xFFFFFFFF, KGDT_TYPE_CODE, KGDT_DPL_USER, 2); ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_R3_CMCODE, 0x0, 0xFFFFFFFF, KGDT_TYPE_CODE, KGDT_DPL_USER, 2);
ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_R3_DATA, 0x0, 0xFFFFFFFF, KGDT_TYPE_DATA, KGDT_DPL_USER, 2); ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_R3_DATA, 0x0, 0xFFFFFFFF, KGDT_TYPE_DATA, KGDT_DPL_USER, 2);
ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_R3_CODE, 0x0, 0x0, KGDT_TYPE_CODE, KGDT_DPL_USER, 1); ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_R3_CODE, 0x0, 0x0, KGDT_TYPE_CODE, KGDT_DPL_USER, 1);
ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_SYS_TSS, (ULONG_PTR)ProcessorBlock->TssBase, sizeof(KTSS) - 1, AMD64_TSS, KGDT_DPL_SYSTEM, 0); ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_SYS_TSS, (ULONG_PTR)ProcessorBlock->TssBase, sizeof(KTSS), AMD64_TSS, KGDT_DPL_SYSTEM, 0);
ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_R3_CMTEB, 0x0, 0x0FFF, KGDT_TYPE_DATA, KGDT_DPL_USER, 2); ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_R3_CMTEB, 0x0, 0x0FFF, KGDT_TYPE_DATA, KGDT_DPL_USER, 2);
ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_R0_LDT, 0x0, 0xFFFFFFFF, KGDT_TYPE_CODE, KGDT_DPL_SYSTEM, 0); ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_R0_LDT, 0x0, 0xFFFFFFFF, KGDT_TYPE_CODE, KGDT_DPL_SYSTEM, 0);
ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_ALIAS, (ULONG_PTR)ProcessorBlock->GdtBase, (GDT_ENTRIES * sizeof(KGDTENTRY)) - 1, KGDT_TYPE_DATA, KGDT_DPL_SYSTEM, 0); ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_ALIAS, (ULONG_PTR)ProcessorBlock->GdtBase, (GDT_ENTRIES * sizeof(KGDTENTRY)) - 1, KGDT_TYPE_DATA, KGDT_DPL_SYSTEM, 0);

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

@ -277,7 +277,7 @@ HlInitializeComPort(IN OUT PCPPORT Port,
HlIoPortOutByte(PtrToUshort(PortAddress + (ULONG)COMPORT_REG_MCR), COMPORT_MCR_NOM); HlIoPortOutByte(PtrToUshort(PortAddress + (ULONG)COMPORT_REG_MCR), COMPORT_MCR_NOM);
/* Read junk data out of the Receive Buffer Register (RBR) */ /* Read junk data out of the Receive Buffer Register (RBR) */
HlIoPortInByte(PtrToUshort(PortAddress + (ULONG)COMPORT_REG_RBR)); HlIoPortInByte(PtrToUshort(Port->Address + (ULONG)COMPORT_REG_RBR));
/* Store port details */ /* Store port details */
Port->Address = PortAddress; Port->Address = PortAddress;

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

@ -93,7 +93,7 @@ KepStartKernel(VOID)
RtlInitializeListHead(&KepProcessListHead); RtlInitializeListHead(&KepProcessListHead);
PageDirectory[0] = 0; PageDirectory[0] = 0;
PageDirectory[1] = 0; PageDirectory[1] = 0;
KeInitializeProcess(CurrentProcess, 0, MAXULONG_PTR, PageDirectory, FALSE); KeInitializeProcess(CurrentProcess, 0, 0xFFFFFFFF, PageDirectory, FALSE);
CurrentProcess->Quantum = MAXCHAR; CurrentProcess->Quantum = MAXCHAR;
/* Initialize Idle thread */ /* Initialize Idle thread */

View File

@ -93,7 +93,7 @@ KepStartKernel(VOID)
RtlInitializeListHead(&KepProcessListHead); RtlInitializeListHead(&KepProcessListHead);
PageDirectory[0] = 0; PageDirectory[0] = 0;
PageDirectory[1] = 0; PageDirectory[1] = 0;
KeInitializeProcess(CurrentProcess, 0, MAXULONG_PTR, PageDirectory, FALSE); KeInitializeProcess(CurrentProcess, 0, 0xFFFFFFFF, PageDirectory, FALSE);
CurrentProcess->Quantum = MAXCHAR; CurrentProcess->Quantum = MAXCHAR;
/* Initialize Idle thread */ /* Initialize Idle thread */

View File

@ -60,6 +60,6 @@ KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters)
/* Raise to HIGH runlevel */ /* Raise to HIGH runlevel */
KeRaiseRunLevel(HIGH_LEVEL); KeRaiseRunLevel(HIGH_LEVEL);
/* Switch the boot stack, setting the pointer to the top of the buffer and aligning it as required by the ABI */ /* Switch boot stack aligning it to 4 byte boundary */
KepSwitchBootStack(((ULONG_PTR)&ArKernelBootStack + KERNEL_STACK_SIZE) & ~(STACK_ALIGNMENT - 1)); KepSwitchBootStack((ULONG_PTR)&ArKernelBootStack & ~0x3);
} }

View File

@ -1035,13 +1035,13 @@ VOID
__ubsan_handle_type_mismatch_v1(IN PKUBSAN_TYPE_MISMATCH_DATA_V1 Data, __ubsan_handle_type_mismatch_v1(IN PKUBSAN_TYPE_MISMATCH_DATA_V1 Data,
IN ULONG_PTR Pointer) IN ULONG_PTR Pointer)
{ {
KUBSAN_TYPE_MISMATCH_DATA MismatchData;
/* Prepare UBSAN type mismatch data in old format */ /* Prepare UBSAN type mismatch data in old format */
MismatchData.Alignment = 1UL << Data->LogAlignment; KUBSAN_TYPE_MISMATCH_DATA MismatchData = {
MismatchData.Location = Data->Location; .Location = Data->Location,
MismatchData.Type = Data->Type; .Type = Data->Type,
MismatchData.TypeCheckKind = Data->TypeCheckKind; .Alignment = 1UL << Data->LogAlignment,
.TypeCheckKind = Data->TypeCheckKind,
};
/* Call UBSAN type mismatch handler */ /* Call UBSAN type mismatch handler */
KepHandleUbsanTypeMismatch(&MismatchData, Pointer); KepHandleUbsanTypeMismatch(&MismatchData, Pointer);

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;
} }