forked from xt-sys/exectos
Compare commits
55 Commits
Author | SHA1 | Date | |
---|---|---|---|
e6ebac7cda | |||
4453b95f5c | |||
61d5e36a4e | |||
410b96b58a | |||
66e136c7d6 | |||
d61b48740f | |||
3607a6d930 | |||
c8787c3bd6 | |||
b83c3923da | |||
a694be3795 | |||
9eae01cc98 | |||
58e3371fac | |||
98c3b93c3d | |||
15a81b03d9 | |||
7fce778ee4 | |||
b0aabf96b8 | |||
486e987b71 | |||
ecaf923e6d | |||
953de7fb5f | |||
55ef9bf686 | |||
6823982227 | |||
ff41b0d4f7 | |||
6130a34587 | |||
2ca708fe43 | |||
d2ce921676 | |||
a81bad32fe | |||
da3e039a05 | |||
e778a95a01 | |||
24b6cc2250 | |||
fdf649fcec | |||
61fcf8e0ec | |||
d85ed34ce2 | |||
dcb0b8fb4b | |||
6729d72322 | |||
b229854ae0 | |||
e0125dda54 | |||
7b8f4f15cc | |||
2e7793dc2b | |||
2c5b680426 | |||
626ece8046 | |||
088940424d | |||
7abd0f3017 | |||
f8519ec09d | |||
3bda67be0a | |||
cb64235953 | |||
ceb36ae8ec | |||
94076b7471 | |||
ebc2607446 | |||
801cf64f45 | |||
f52c50242a | |||
3f10e1b59e | |||
47219585d4 | |||
e46f2e6116 | |||
3804786e89 | |||
6bcf3e134f |
13
.github/workflows/build.yml
vendored
13
.github/workflows/build.yml
vendored
@ -7,6 +7,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [amd64, i686]
|
||||
build: [debug, release]
|
||||
runs-on: oscw
|
||||
container:
|
||||
image: codingworkshop/oscw-runner:latest
|
||||
@ -17,7 +18,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
- name: Build ExectOS
|
||||
run: |
|
||||
echo "charch ${{ matrix.arch }} && ./configure.sh && cd build-${{ matrix.arch }}-xtchain && xbuild -v && xbuild diskimg -v" > build.cmds
|
||||
echo "charch ${{ matrix.arch }} && chbuild ${{ matrix.build }} && ./configure.sh && cd build-${{ matrix.arch }}-${{ matrix.build }} && xbuild -v && xbuild diskimg -v" > build.cmds
|
||||
xtchain < build.cmds
|
||||
- name: Publish binaries
|
||||
if: ${{ github.ref == 'refs/heads/master' }}
|
||||
@ -26,8 +27,8 @@ jobs:
|
||||
OSCW_ARTIFACTS_USERNAME: ${{ secrets.OSCW_ARTIFACTS_USERNAME }}
|
||||
OSCW_ARTIFACTS_USERKEY: ${{ secrets.OSCW_ARTIFACTS_USERKEY }}
|
||||
run: |
|
||||
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 }}-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 }}-sym.tar.gz -C build-${{ matrix.arch }}-xtchain/output/symbols .
|
||||
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 }}*.gz" ExectOS
|
||||
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 }}-${{ 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 }}-${{ matrix.build }}-sym.tar.gz -C build-${{ matrix.arch }}-${{ matrix.build }}/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
|
||||
artifact_publish "ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-${{ matrix.build }}*.gz" ExectOS
|
||||
|
@ -1,8 +1,5 @@
|
||||
# Detect XTChain toolchain
|
||||
# Minimum CMake version requirement
|
||||
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
|
||||
string(TOLOWER ${ARCH} ARCH)
|
||||
@ -44,7 +41,7 @@ set(CMAKE_TOOLCHAIN_FILE "sdk/cmake/toolchain.cmake")
|
||||
project(EXECTOS)
|
||||
|
||||
# Load all the CMake SDK
|
||||
include(sdk/cmake/baseaddress.cmake)
|
||||
include(sdk/cmake/baseaddress/${ARCH}.cmake)
|
||||
include(sdk/cmake/emulation.cmake)
|
||||
include(sdk/cmake/functions.cmake)
|
||||
include(sdk/cmake/version.cmake)
|
||||
|
3
IDEAS.md
3
IDEAS.md
@ -12,9 +12,6 @@ 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.
|
||||
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.
|
||||
- [ ] 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
|
||||
disk).
|
||||
|
||||
|
21
README.md
21
README.md
@ -8,14 +8,14 @@
|
||||
<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">
|
||||
</a>
|
||||
<a href="https://artifacts.codingworkshop.eu.org/ExectOS">
|
||||
<a href="https://artifacts.codingworkshop.eu.org/ExectOS/?C=M&O=D">
|
||||
<img alt="CI/CD Artifacts" src="https://img.shields.io/badge/Download-%F0%9F%A1%87-blueviolet">
|
||||
</a>
|
||||
<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">
|
||||
</a>
|
||||
<a href="https://codeium.com/">
|
||||
<img alt="Codeium" src="https://img.shields.io/badge/Powered%20By-Codeium-09B6A2?logo=Codeium">
|
||||
<a href="https://exectos.eu.org/ai-assisted">
|
||||
<img alt="AI Assisted" src="https://img.shields.io/badge/AI-Assisted-darkcyan">
|
||||
</a>
|
||||
<a href="https://github.com/sponsors/xt-sys/">
|
||||
<img alt="Sponsor" src="https://img.shields.io/badge/Sponsor-%E2%9D%A4-red?logo=GitHub">
|
||||
@ -69,15 +69,12 @@ design, it requires a modern EFI enabled hardware. It is not possible currently
|
||||
| xtldr | XTOS boot loader source code |
|
||||
|
||||
# Build
|
||||
XTOS can be built only by using [XTChain](https://git.codingworkshop.eu.org/xt-sys/xtchain), a special toolchain
|
||||
prepared for compiling XT software. Currently, there is only a Linux version available, so a Linux distribution or WSL
|
||||
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:
|
||||
```
|
||||
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:
|
||||
XTOS can only be built using [XTchain](https://git.codingworkshop.eu.org/xt-sys/xtchain), a dedicated toolchain designed
|
||||
specifically for compiling XT software. XTChain is currently available for both Linux and Windows. Detailed instructions
|
||||
on how to configure and run XTChain can be found [here](https://exectos.eu.org/contributing/setting-up-xtchain).
|
||||
|
||||
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:
|
||||
```
|
||||
charch [i686|amd64]
|
||||
chbuild [DEBUG|RELEASE]
|
||||
|
51
configure.ps1
Normal file
51
configure.ps1
Normal file
@ -0,0 +1,51 @@
|
||||
# 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."
|
||||
}
|
@ -1,4 +1,10 @@
|
||||
#!/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
|
||||
if [ "x${XTCVER}" = "x" ]; then
|
||||
@ -16,13 +22,12 @@ fi
|
||||
|
||||
# Set variables
|
||||
EXECTOS_SOURCE_DIR=$(cd `dirname ${0}` && pwd)
|
||||
EXECTOS_BINARY_DIR=build-${ARCH}-xtchain
|
||||
EXECTOS_BINARY_DIR=build-${ARCH}-${BUILD_TYPE,,}
|
||||
|
||||
# Create directories if needed
|
||||
if [ "${EXECTOS_SOURCE_DIR}" = "${PWD}" ]; then
|
||||
echo Creating directories in ${EXECTOS_BINARY_DIR}
|
||||
mkdir -p "${EXECTOS_BINARY_DIR}"
|
||||
ln -sf ${EXECTOS_BINARY_DIR} build
|
||||
cd "${EXECTOS_BINARY_DIR}"
|
||||
fi
|
||||
|
||||
|
2
sdk/cmake/baseaddress/amd64.cmake
Normal file
2
sdk/cmake/baseaddress/amd64.cmake
Normal file
@ -0,0 +1,2 @@
|
||||
# Set base addresses for all modules
|
||||
set(BASEADDRESS_XTOSKRNL 0x0000000140000000)
|
@ -1,3 +1,2 @@
|
||||
# Set base addresses for all modules
|
||||
set(BASEADDRESS_XTLDR 0x00010000)
|
||||
set(BASEADDRESS_XTOSKRNL 0x00400000)
|
@ -27,22 +27,22 @@ add_custom_target(bochsvm
|
||||
|
||||
# This target starts up a QEMU+OVMF virtual machine using KVM accelerator
|
||||
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
|
||||
-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_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
|
||||
VERBATIM USES_TERMINAL)
|
||||
|
||||
# This target starts up a QEMU+OVMF virtual machine using TCG accelerator
|
||||
add_custom_target(testtcg
|
||||
DEPENDS diskimg
|
||||
DEPENDS install
|
||||
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
|
||||
-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
|
||||
-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
|
||||
VERBATIM USES_TERMINAL)
|
||||
|
@ -11,11 +11,10 @@ endif()
|
||||
|
||||
# Set build optimisation
|
||||
if(BUILD_TYPE STREQUAL "DEBUG")
|
||||
add_compiler_ccxxflags("/Zi")
|
||||
add_compiler_ccxxflags("-Ob0 -Od")
|
||||
add_compiler_ccxxflags("/GS- /Zi /Ob0 /Od")
|
||||
add_linker_flags("/DEBUG /INCREMENTAL /OPT:NOREF /OPT:NOICF /PDBSOURCEPATH:build")
|
||||
else()
|
||||
add_compiler_ccxxflags("-Ob2 -Oy")
|
||||
add_compiler_ccxxflags("/GS- /Ob2 /Ot /Ox /Oy")
|
||||
add_linker_flags("/INCREMENTAL:NO /OPT:REF /OPT:ICF")
|
||||
endif()
|
||||
|
||||
@ -48,6 +47,9 @@ 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-gnu-folding-constant")
|
||||
|
||||
# Disable compiler builtins
|
||||
add_compiler_ccxxflags("-fno-builtin")
|
||||
|
||||
# Set debugging symbols output directory
|
||||
set(CMAKE_PDB_OUTPUT_DIRECTORY "${EXECTOS_BINARY_DIR}/output/symbols")
|
||||
|
||||
|
@ -43,19 +43,23 @@
|
||||
#define APIC_DF_CLUSTER 0x0FFFFFFF
|
||||
|
||||
/* APIC delivery modes */
|
||||
#define APIC_DM_FIXED 0
|
||||
#define APIC_DM_LOWPRIO 1
|
||||
#define APIC_DM_SMI 2
|
||||
#define APIC_DM_REMOTE 3
|
||||
#define APIC_DM_NMI 4
|
||||
#define APIC_DM_INIT 5
|
||||
#define APIC_DM_STARTUP 6
|
||||
#define APIC_DM_EXTINT 7
|
||||
#define APIC_DM_FIXED 0x00000000
|
||||
#define APIC_DM_LOWPRIO 0x00000100
|
||||
#define APIC_DM_SMI 0x00000200
|
||||
#define APIC_DM_REMOTE 0x00000300
|
||||
#define APIC_DM_NMI 0x00000400
|
||||
#define APIC_DM_INIT 0x00000500
|
||||
#define APIC_DM_STARTUP 0x00000600
|
||||
#define APIC_DM_EXTINT 0x00000700
|
||||
|
||||
/* APIC trigger modes */
|
||||
#define APIC_TGM_EDGE 0
|
||||
#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 */
|
||||
#define APIC_MAX_IOAPICS 64
|
||||
|
||||
|
@ -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_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_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_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);
|
||||
|
@ -187,7 +187,7 @@ typedef struct _GENERIC_ADDRESS
|
||||
UCHAR BitOffset;
|
||||
UCHAR Reserved;
|
||||
PHYSICAL_ADDRESS Address;
|
||||
} GENERIC_ADDRESS, *PGENERIC_ADDRESS;
|
||||
} PACKED GENERIC_ADDRESS, *PGENERIC_ADDRESS;
|
||||
|
||||
/* Each ACPI table description header structure */
|
||||
typedef struct _ACPI_DESCRIPTION_HEADER
|
||||
@ -201,14 +201,14 @@ typedef struct _ACPI_DESCRIPTION_HEADER
|
||||
ULONG OemRevision;
|
||||
UCHAR CreatorID[4];
|
||||
ULONG CreatorRev;
|
||||
} ACPI_DESCRIPTION_HEADER, *PACPI_DESCRIPTION_HEADER;
|
||||
} PACKED ACPI_DESCRIPTION_HEADER, *PACPI_DESCRIPTION_HEADER;
|
||||
|
||||
/* Each ACPI subtable description header structure */
|
||||
typedef struct _ACPI_SUBTABLE_HEADER
|
||||
{
|
||||
UCHAR Type;
|
||||
UCHAR Length;
|
||||
} ACPI_SUBTABLE_HEADER, *PACPI_SUBTABLE_HEADER;
|
||||
} PACKED ACPI_SUBTABLE_HEADER, *PACPI_SUBTABLE_HEADER;
|
||||
|
||||
/* ACPI cache list structure */
|
||||
typedef struct _ACPI_CACHE_LIST
|
||||
@ -229,14 +229,14 @@ typedef struct _ACPI_RSDP
|
||||
ULONGLONG XsdtAddress;
|
||||
UCHAR XChecksum;
|
||||
UCHAR Reserved[3];
|
||||
} ACPI_RSDP, *PACPI_RSDP;
|
||||
} PACKED ACPI_RSDP, *PACPI_RSDP;
|
||||
|
||||
/* ACPI Root System Description Table (RSDT) structure */
|
||||
typedef struct _ACPI_RSDT
|
||||
{
|
||||
ACPI_DESCRIPTION_HEADER Header;
|
||||
ULONG Tables[];
|
||||
} ACPI_RSDT, *PACPI_RSDT;
|
||||
} PACKED ACPI_RSDT, *PACPI_RSDT;
|
||||
|
||||
/* ACPI eXtended Root System Description Table (XSDT) structure */
|
||||
typedef struct _ACPI_XSDT
|
||||
@ -303,7 +303,7 @@ typedef struct _ACPI_FADT
|
||||
GENERIC_ADDRESS XGp1Blk;
|
||||
GENERIC_ADDRESS SleepControlReg;
|
||||
GENERIC_ADDRESS SleepStatusReg;
|
||||
} ACPI_FADT, *PACPI_FADT;
|
||||
} PACKED ACPI_FADT, *PACPI_FADT;
|
||||
|
||||
/* ACPI Multiple APIC Description Table (MADT) structure */
|
||||
typedef struct _ACPI_MADT
|
||||
@ -312,26 +312,26 @@ typedef struct _ACPI_MADT
|
||||
ULONG LocalApicAddress;
|
||||
ULONG Flags;
|
||||
ULONG ApicTables[];
|
||||
} ACPI_MADT, *PACPI_MADT;
|
||||
} PACKED ACPI_MADT, *PACPI_MADT;
|
||||
|
||||
/* ACPI Local APIC MADT subtable structure */
|
||||
typedef struct _ACPI_MADT_LOCAL_APIC
|
||||
{
|
||||
ACPI_SUBTABLE_HEADER Header;
|
||||
UCHAR ProcessorId;
|
||||
UCHAR Id;
|
||||
ULONG LapicFlags;
|
||||
} ACPI_MADT_LOCAL_APIC, *PACPI_MADT_LOCAL_APIC;
|
||||
UCHAR AcpiId;
|
||||
UCHAR ApicId;
|
||||
ULONG Flags;
|
||||
} PACKED ACPI_MADT_LOCAL_APIC, *PACPI_MADT_LOCAL_APIC;
|
||||
|
||||
/* ACPI Local X2APIC MADT subtable structure */
|
||||
typedef struct _ACPI_MADT_LOCAL_X2APIC
|
||||
{
|
||||
ACPI_SUBTABLE_HEADER Header;
|
||||
USHORT Reserved;
|
||||
ULONG Id;
|
||||
ULONG LapicFlags;
|
||||
ULONG ProcessorId;
|
||||
} ACPI_MADT_LOCAL_X2APIC, *PACPI_MADT_LOCAL_X2APIC;
|
||||
ULONG ApicId;
|
||||
ULONG Flags;
|
||||
ULONG AcpiId;
|
||||
} PACKED ACPI_MADT_LOCAL_X2APIC, *PACPI_MADT_LOCAL_X2APIC;
|
||||
|
||||
/* ACPI System Information structure */
|
||||
typedef struct _ACPI_SYSTEM_INFO
|
||||
@ -342,12 +342,12 @@ typedef struct _ACPI_SYSTEM_INFO
|
||||
ULONG IoApicCount;
|
||||
ULONG IntiCount;
|
||||
ULONG LintiCount;
|
||||
ULONG ImcrPresent;
|
||||
BOOLEAN ImcrPresent;
|
||||
ULONG ApicBase;
|
||||
PPROCESSOR_IDENTITY CpuInfo;
|
||||
ULONG IoApicPhysicalBase[APIC_MAX_IOAPICS];
|
||||
PULONG IoApicVirtualBase[APIC_MAX_IOAPICS];
|
||||
ULONG IoApicIntiBase[APIC_MAX_IOAPICS];
|
||||
ULONG IoApicVirtualBase[APIC_MAX_IOAPICS];
|
||||
ULONG IoApicVectorBase[APIC_MAX_IOAPICS];
|
||||
} ACPI_SYSTEM_INFO, *PACPI_SYSTEM_INFO;
|
||||
|
||||
/* ACPI Timer information structure */
|
||||
@ -393,9 +393,9 @@ typedef struct _HAL_FRAMEBUFFER_DATA
|
||||
/* Processor identity structure */
|
||||
typedef struct _PROCESSOR_IDENTITY
|
||||
{
|
||||
UCHAR Id;
|
||||
UCHAR CpuId;
|
||||
UCHAR CpuNumber;
|
||||
ULONG AcpiId;
|
||||
ULONG ApicId;
|
||||
USHORT CpuNumber;
|
||||
BOOLEAN Bsp;
|
||||
BOOLEAN Started;
|
||||
} PROCESSOR_IDENTITY, *PPROCESSOR_IDENTITY;
|
||||
|
@ -48,19 +48,23 @@
|
||||
#define APIC_DF_CLUSTER 0x0FFFFFFF
|
||||
|
||||
/* APIC delivery modes */
|
||||
#define APIC_DM_FIXED 0
|
||||
#define APIC_DM_LOWPRIO 1
|
||||
#define APIC_DM_SMI 2
|
||||
#define APIC_DM_REMOTE 3
|
||||
#define APIC_DM_NMI 4
|
||||
#define APIC_DM_INIT 5
|
||||
#define APIC_DM_STARTUP 6
|
||||
#define APIC_DM_EXTINT 7
|
||||
#define APIC_DM_FIXED 0x00000000
|
||||
#define APIC_DM_LOWPRIO 0x00000100
|
||||
#define APIC_DM_SMI 0x00000200
|
||||
#define APIC_DM_REMOTE 0x00000300
|
||||
#define APIC_DM_NMI 0x00000400
|
||||
#define APIC_DM_INIT 0x00000500
|
||||
#define APIC_DM_STARTUP 0x00000600
|
||||
#define APIC_DM_EXTINT 0x00000700
|
||||
|
||||
/* APIC trigger modes */
|
||||
#define APIC_TGM_EDGE 0
|
||||
#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 */
|
||||
#define APIC_MAX_IOAPICS 64
|
||||
|
||||
|
@ -95,7 +95,8 @@
|
||||
#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))
|
||||
|
||||
/* 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))
|
||||
|
||||
/* Macros for concatenating strings */
|
||||
|
@ -29,6 +29,7 @@
|
||||
#define MEMORY_ALIGNMENT 8
|
||||
#define MM_USERPAGE_TABLES 1536
|
||||
#define MM_VIRTUAL_PAGESIZE 20
|
||||
#define STACK_ALIGNMENT 4
|
||||
#elif defined(__amd64__) || defined(__x86_64__)
|
||||
#define _ARCH amd64
|
||||
#define _ARCH_AMD64 1
|
||||
@ -43,6 +44,7 @@
|
||||
#define MEMORY_ALIGNMENT 16
|
||||
#define MM_USERPAGE_TABLES 4194304
|
||||
#define MM_VIRTUAL_PAGESIZE 52
|
||||
#define STACK_ALIGNMENT 16
|
||||
#else
|
||||
#error Unknown architecture
|
||||
#endif
|
||||
|
@ -49,6 +49,5 @@ set_install_target(xtldr efi/boot)
|
||||
|
||||
# Set loader entrypoint and subsystem
|
||||
set_entrypoint(xtldr "BlStartXtLoader")
|
||||
set_imagebase(xtldr ${BASEADDRESS_XTLDR})
|
||||
set_linker_map(xtldr TRUE)
|
||||
set_subsystem(xtldr efi_application)
|
||||
|
@ -149,9 +149,9 @@ BlBuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlMapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN UINT_PTR VirtualAddress,
|
||||
IN UINT_PTR PhysicalAddress,
|
||||
IN UINT NumberOfPages)
|
||||
IN ULONG_PTR VirtualAddress,
|
||||
IN ULONG_PTR PhysicalAddress,
|
||||
IN ULONG NumberOfPages)
|
||||
{
|
||||
SIZE_T Pml1Entry, Pml2Entry, Pml3Entry, Pml4Entry, Pml5Entry;
|
||||
PHARDWARE_PTE Pml1, Pml2, Pml3, Pml4, Pml5;
|
||||
@ -216,6 +216,7 @@ BlMapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
}
|
||||
|
||||
/* Set paging entry settings */
|
||||
RtlZeroMemory(&Pml1[Pml1Entry], sizeof(HARDWARE_PTE));
|
||||
Pml1[Pml1Entry].PageFrameNumber = PageFrameNumber;
|
||||
Pml1[Pml1Entry].Valid = 1;
|
||||
Pml1[Pml1Entry].Writable = 1;
|
||||
@ -250,8 +251,12 @@ EFI_STATUS
|
||||
BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR SelfMapAddress)
|
||||
{
|
||||
PHARDWARE_PTE PmlBase;
|
||||
ULONGLONG PmlIndex;
|
||||
|
||||
/* Initialize PML base pointer */
|
||||
PmlBase = (PHARDWARE_PTE)PageMap->PtePointer;
|
||||
|
||||
/* Check page map level */
|
||||
if(PageMap->PageMapLevel == 5)
|
||||
{
|
||||
@ -265,9 +270,10 @@ BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
PmlIndex = (SelfMapAddress >> MM_PXI_SHIFT) & 0x1FF;
|
||||
|
||||
/* Add self-mapping for PML4 */
|
||||
((PHARDWARE_PTE)PageMap->PtePointer)[PmlIndex].PageFrameNumber = (UINT_PTR)PageMap->PtePointer / EFI_PAGE_SIZE;
|
||||
((PHARDWARE_PTE)PageMap->PtePointer)[PmlIndex].Valid = 1;
|
||||
((PHARDWARE_PTE)PageMap->PtePointer)[PmlIndex].Writable = 1;
|
||||
RtlZeroMemory(&PmlBase[PmlIndex], sizeof(HARDWARE_PTE));
|
||||
PmlBase[PmlIndex].PageFrameNumber = (UINT_PTR)PageMap->PtePointer / EFI_PAGE_SIZE;
|
||||
PmlBase[PmlIndex].Valid = 1;
|
||||
PmlBase[PmlIndex].Writable = 1;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
|
@ -58,6 +58,7 @@ BlBuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
for(Index = 0; Index < 4; Index++)
|
||||
{
|
||||
/* 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].Valid = 1;
|
||||
|
||||
@ -169,9 +170,9 @@ BlBuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlMapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN UINT_PTR VirtualAddress,
|
||||
IN UINT_PTR PhysicalAddress,
|
||||
IN UINT NumberOfPages)
|
||||
IN ULONG_PTR VirtualAddress,
|
||||
IN ULONG_PTR PhysicalAddress,
|
||||
IN ULONG NumberOfPages)
|
||||
{
|
||||
SIZE_T Pml1Entry, Pml2Entry, Pml3Entry;
|
||||
PHARDWARE_PTE Pml1, Pml2, Pml3;
|
||||
@ -218,6 +219,7 @@ BlMapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
}
|
||||
|
||||
/* Set paging entry settings */
|
||||
RtlZeroMemory(&Pml1[Pml1Entry], sizeof(HARDWARE_PTE));
|
||||
Pml1[Pml1Entry].PageFrameNumber = PageFrameNumber;
|
||||
Pml1[Pml1Entry].Valid = 1;
|
||||
Pml1[Pml1Entry].Writable = 1;
|
||||
@ -252,8 +254,9 @@ EFI_STATUS
|
||||
BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR SelfMapAddress)
|
||||
{
|
||||
ULONGLONG PmlIndex;
|
||||
PHARDWARE_LEGACY_PTE LegacyPml;
|
||||
PHARDWARE_PTE Pml;
|
||||
ULONGLONG PmlIndex;
|
||||
ULONG Index;
|
||||
|
||||
/* Check page map level */
|
||||
@ -268,6 +271,7 @@ BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
/* Add self-mapping for PML3 (PAE enabled) */
|
||||
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].Valid = 1;
|
||||
Pml[PmlIndex + Index].Writable = 1;
|
||||
@ -275,13 +279,16 @@ BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
}
|
||||
else
|
||||
{
|
||||
LegacyPml = (PHARDWARE_LEGACY_PTE)PageMap->PtePointer;
|
||||
|
||||
/* Calculate PML index based on provided self map address */
|
||||
PmlIndex = (SelfMapAddress >> MM_PDI_LEGACY_SHIFT);
|
||||
|
||||
/* Add self-mapping for PML2 (PAE disabled) */
|
||||
((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[PmlIndex].PageFrameNumber = (UINT_PTR)PageMap->PtePointer / EFI_PAGE_SIZE;
|
||||
((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[PmlIndex].Valid = 1;
|
||||
((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[PmlIndex].Writable = 1;
|
||||
RtlZeroMemory(&LegacyPml[PmlIndex], sizeof(HARDWARE_LEGACY_PTE));
|
||||
LegacyPml[PmlIndex].PageFrameNumber = (UINT_PTR)PageMap->PtePointer / EFI_PAGE_SIZE;
|
||||
LegacyPml[PmlIndex].Valid = 1;
|
||||
LegacyPml[PmlIndex].Writable = 1;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
|
@ -18,7 +18,7 @@
|
||||
/* XTLDR routines forward references */
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlAllocateMemoryPages(IN ULONGLONG Pages,
|
||||
BlAllocateMemoryPages(IN ULONGLONG NumberOfPages,
|
||||
OUT PEFI_PHYSICAL_ADDRESS Memory);
|
||||
|
||||
XTCDECL
|
||||
@ -121,7 +121,7 @@ BlFindVolumeDevicePath(IN PEFI_DEVICE_PATH_PROTOCOL FsHandle,
|
||||
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlFreeMemoryPages(IN ULONGLONG Pages,
|
||||
BlFreeMemoryPages(IN ULONGLONG NumberOfPages,
|
||||
IN EFI_PHYSICAL_ADDRESS Memory);
|
||||
|
||||
XTCDECL
|
||||
@ -249,9 +249,9 @@ BlMapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlMapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN UINT_PTR VirtualAddress,
|
||||
IN UINT_PTR PhysicalAddress,
|
||||
IN UINT NumberOfPages);
|
||||
IN ULONG_PTR VirtualAddress,
|
||||
IN ULONG_PTR PhysicalAddress,
|
||||
IN ULONG NumberOfPages);
|
||||
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
@ -462,7 +462,7 @@ XTCDECL
|
||||
BOOLEAN
|
||||
BlpFindParentBlockDevice(IN PLIST_ENTRY BlockDevices,
|
||||
IN PEFI_BLOCK_DEVICE_DATA ChildNode,
|
||||
OUT PEFI_BLOCK_DEVICE_DATA ParentNode);
|
||||
OUT PEFI_BLOCK_DEVICE_DATA *ParentNode);
|
||||
|
||||
XTCDECL
|
||||
LONG
|
||||
|
@ -12,7 +12,7 @@
|
||||
/**
|
||||
* This routine allocates one or more 4KB pages.
|
||||
*
|
||||
* @param Pages
|
||||
* @param NumberOfPages
|
||||
* The number of contiguous 4KB pages to allocate.
|
||||
*
|
||||
* @param Memory
|
||||
@ -24,10 +24,10 @@
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlAllocateMemoryPages(IN ULONGLONG Pages,
|
||||
BlAllocateMemoryPages(IN ULONGLONG NumberOfPages,
|
||||
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.
|
||||
*
|
||||
* @param Pages
|
||||
* @param NumberOfPages
|
||||
* The number of contiguous 4 KB pages to free.
|
||||
*
|
||||
* @param Memory
|
||||
@ -67,10 +67,10 @@ BlAllocateMemoryPool(IN UINT_PTR Size,
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlFreeMemoryPages(IN ULONGLONG Pages,
|
||||
BlFreeMemoryPages(IN ULONGLONG NumberOfPages,
|
||||
IN EFI_PHYSICAL_ADDRESS Memory)
|
||||
{
|
||||
return EfiSystemTable->BootServices->FreePages(Memory, Pages);
|
||||
return EfiSystemTable->BootServices->FreePages(Memory, NumberOfPages);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -47,7 +47,7 @@ ChBootSystem(IN PXTBL_BOOT_PARAMETERS Parameters)
|
||||
}
|
||||
|
||||
/* Open EFI volume */
|
||||
Status = XtLdrProtocol->Disk.OpenVolume(NULL, &DiskHandle, &FsHandle);
|
||||
Status = XtLdrProtocol->Disk.OpenVolume(Parameters->DevicePath, &DiskHandle, &FsHandle);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to open a volume, return error code */
|
||||
|
@ -25,7 +25,7 @@ XtpMapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
||||
{
|
||||
PHARDWARE_PTE PdeBase, PpeBase, PxeBase;
|
||||
EFI_PHYSICAL_ADDRESS Address;
|
||||
XTSTATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Check page map level */
|
||||
if(PageMap->PageMapLevel > 4)
|
||||
@ -168,6 +168,9 @@ XtEnablePaging(IN PXTBL_PAGE_MAPPING PageMap)
|
||||
/* Write PML4 to CR3 */
|
||||
ArWriteControlRegister(3, (UINT_PTR)PageMap->PtePointer);
|
||||
|
||||
/* Enable paging */
|
||||
ArWriteControlRegister(0, ArReadControlRegister(0) | CR0_PG);
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
@ -24,8 +24,9 @@ EFI_STATUS
|
||||
XtpMapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
||||
{
|
||||
EFI_PHYSICAL_ADDRESS Address;
|
||||
PHARDWARE_LEGACY_PTE LegacyPdeBase;
|
||||
PHARDWARE_PTE PdeBase;
|
||||
XTSTATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Allocate memory */
|
||||
Status = XtLdrProtocol->Memory.AllocatePages(1, &Address);
|
||||
@ -38,13 +39,14 @@ XtpMapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
||||
/* Zero fill allocated memory */
|
||||
RtlZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||
|
||||
/* Check page map level */
|
||||
/* Check if PAE is enabled (3-level paging) */
|
||||
if(PageMap->PageMapLevel == 3)
|
||||
{
|
||||
/* Get PDE base address (PAE enabled) */
|
||||
PdeBase = (PHARDWARE_PTE)(((PHARDWARE_PTE)PageMap->PtePointer)[MM_HARDWARE_VA_START >> MM_PPI_SHIFT].PageFrameNumber << MM_PAGE_SHIFT);
|
||||
|
||||
/* 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].Valid = 1;
|
||||
PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF].Writable = 1;
|
||||
@ -52,9 +54,11 @@ XtpMapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
||||
else
|
||||
{
|
||||
/* Make PDE valid (PAE disabled) */
|
||||
((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].Valid = 1;
|
||||
((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].PageFrameNumber = Address >> MM_PAGE_SHIFT;
|
||||
((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].Writable = 1;
|
||||
LegacyPdeBase = (PHARDWARE_LEGACY_PTE)PageMap->PtePointer;
|
||||
RtlZeroMemory(&LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT], sizeof(HARDWARE_LEGACY_PTE));
|
||||
LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].Valid = 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 */
|
||||
@ -75,22 +79,18 @@ XTCDECL
|
||||
EFI_STATUS
|
||||
XtEnablePaging(IN PXTBL_PAGE_MAPPING PageMap)
|
||||
{
|
||||
PCPUID_REGISTERS CpuRegisters = NULL;
|
||||
CPUID_REGISTERS CpuRegisters;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Prepare CPUID registers */
|
||||
CpuRegisters->Leaf = CPUID_GET_CPU_FEATURES;
|
||||
CpuRegisters->SubLeaf = 0;
|
||||
CpuRegisters->Eax = 0;
|
||||
CpuRegisters->Ebx = 0;
|
||||
CpuRegisters->Ecx = 0;
|
||||
CpuRegisters->Edx = 0;
|
||||
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
||||
CpuRegisters.Leaf = CPUID_GET_CPU_FEATURES;
|
||||
|
||||
/* Get CPUID */
|
||||
ArCpuId(CpuRegisters);
|
||||
ArCpuId(&CpuRegisters);
|
||||
|
||||
/* Store PAE status from the CPUID results */
|
||||
if(!(CpuRegisters->Edx & CPUID_FEATURES_EDX_PAE))
|
||||
if(!(CpuRegisters.Edx & CPUID_FEATURES_EDX_PAE))
|
||||
{
|
||||
/* No PAE support */
|
||||
XtLdrProtocol->Debug.Print(L"ERROR: PAE extension not supported by the CPU\n");
|
||||
|
@ -323,7 +323,7 @@ XtBootSystem(IN PXTBL_BOOT_PARAMETERS Parameters)
|
||||
Parameters->KernelFile, Parameters->Parameters);
|
||||
|
||||
/* Open EFI volume */
|
||||
Status = XtLdrProtocol->Disk.OpenVolume(NULL, &DiskHandle, &FsHandle);
|
||||
Status = XtLdrProtocol->Disk.OpenVolume(Parameters->DevicePath, &DiskHandle, &FsHandle);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to open a volume */
|
||||
|
@ -4,6 +4,7 @@
|
||||
* FILE: xtldr/textui.c
|
||||
* DESCRIPTION: Text console User Interface (TUI) support for XT Boot Loader
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
* Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtldr.h>
|
||||
@ -22,7 +23,8 @@ BlDisplayBootMenu()
|
||||
{
|
||||
XTBL_DIALOG_HANDLE Handle;
|
||||
PXTBL_BOOTMENU_ITEM MenuEntries = NULL;
|
||||
ULONG Index, NumberOfEntries, HighligtedEntryId;
|
||||
ULONG Index;
|
||||
ULONG HighligtedEntryId, NumberOfEntries, TopVisibleEntry, VisibleEntries;
|
||||
UINT_PTR EventIndex;
|
||||
EFI_EVENT Events[2];
|
||||
EFI_INPUT_KEY Key;
|
||||
@ -32,6 +34,7 @@ BlDisplayBootMenu()
|
||||
PWCHAR TimeOutString;
|
||||
|
||||
/* Initialize boot menu list */
|
||||
TopVisibleEntry = 0;
|
||||
Status = BlInitializeBootMenuList(&MenuEntries, &NumberOfEntries, &HighligtedEntryId);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
@ -39,6 +42,19 @@ BlDisplayBootMenu()
|
||||
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 */
|
||||
TimeOutString = BlGetConfigValue(L"TIMEOUT");
|
||||
TimeOut = -1;
|
||||
@ -59,23 +75,24 @@ BlDisplayBootMenu()
|
||||
/* Infinite boot menu loop */
|
||||
while(TRUE)
|
||||
{
|
||||
/* Draw boot menu */
|
||||
/* Redraw boot menu */
|
||||
BlpDrawBootMenu(&Handle);
|
||||
|
||||
/* Check if there is anything to show in the boot menu */
|
||||
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;
|
||||
}
|
||||
/* 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 */
|
||||
if(NumberOfEntries > 0)
|
||||
{
|
||||
/* Iterate through all menu entries */
|
||||
for(Index = 0; Index < NumberOfEntries; Index++)
|
||||
for(Index = 0; Index < VisibleEntries; Index++)
|
||||
{
|
||||
/* Draw menu entry */
|
||||
BlpDrawBootMenuEntry(&Handle, MenuEntries[Index].EntryName, Index, Index == HighligtedEntryId);
|
||||
BlpDrawBootMenuEntry(&Handle, MenuEntries[TopVisibleEntry + Index].EntryName,
|
||||
Index, (TopVisibleEntry + Index) == HighligtedEntryId);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -159,14 +176,14 @@ BlDisplayBootMenu()
|
||||
else if(Key.ScanCode == 0x01)
|
||||
{
|
||||
/* UpArrow key pressed, go to previous entry if possible */
|
||||
if(HighligtedEntryId > 0)
|
||||
if (HighligtedEntryId > 0)
|
||||
{
|
||||
/* Highlight previous entry */
|
||||
HighligtedEntryId--;
|
||||
BlpDrawBootMenuEntry(&Handle, MenuEntries[HighligtedEntryId + 1].EntryName,
|
||||
HighligtedEntryId + 1, FALSE);
|
||||
BlpDrawBootMenuEntry(&Handle, MenuEntries[HighligtedEntryId].EntryName,
|
||||
HighligtedEntryId, TRUE);
|
||||
if (HighligtedEntryId < TopVisibleEntry)
|
||||
{
|
||||
TopVisibleEntry = HighligtedEntryId;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(Key.ScanCode == 0x02)
|
||||
@ -174,12 +191,12 @@ BlDisplayBootMenu()
|
||||
/* DownArrow key pressed, go to next entry if possible */
|
||||
if(HighligtedEntryId < NumberOfEntries - 1)
|
||||
{
|
||||
/* Highlight next entry */
|
||||
HighligtedEntryId++;
|
||||
BlpDrawBootMenuEntry(&Handle, MenuEntries[HighligtedEntryId - 1].EntryName,
|
||||
HighligtedEntryId - 1, FALSE);
|
||||
BlpDrawBootMenuEntry(&Handle, MenuEntries[HighligtedEntryId].EntryName,
|
||||
HighligtedEntryId, TRUE);
|
||||
if (HighligtedEntryId >= TopVisibleEntry + VisibleEntries)
|
||||
{
|
||||
TopVisibleEntry = HighligtedEntryId - VisibleEntries + 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(Key.ScanCode == 0x09)
|
||||
@ -188,12 +205,9 @@ BlDisplayBootMenu()
|
||||
if(HighligtedEntryId != 0)
|
||||
{
|
||||
/* Highlight first entry */
|
||||
BlpDrawBootMenuEntry(&Handle, MenuEntries[HighligtedEntryId].EntryName,
|
||||
HighligtedEntryId, FALSE);
|
||||
BlpDrawBootMenuEntry(&Handle, MenuEntries[0].EntryName, 0, TRUE);
|
||||
|
||||
/* Update highlighted entry ID */
|
||||
HighligtedEntryId = 0;
|
||||
TopVisibleEntry = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(Key.ScanCode == 0x0A)
|
||||
@ -202,13 +216,9 @@ BlDisplayBootMenu()
|
||||
if(HighligtedEntryId != NumberOfEntries - 1)
|
||||
{
|
||||
/* 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;
|
||||
TopVisibleEntry = (NumberOfEntries > VisibleEntries) ? (NumberOfEntries - VisibleEntries) : 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(Key.ScanCode == 0x0B)
|
||||
@ -870,8 +880,8 @@ BlpDrawBootMenu(OUT PXTBL_DIALOG_HANDLE Handle)
|
||||
BlSetCursorPosition(0, Handle->PosY + Handle->Height);
|
||||
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"
|
||||
" Operating System, 'e' to edit it before booting or 's' for XTLDR shell.\n"
|
||||
" Additional help available after pressing F1 key.");
|
||||
L" Operating System, 'e' to edit it before booting or 's' for XTLDR shell.\n"
|
||||
L" Additional help available after pressing F1 key.");
|
||||
}
|
||||
|
||||
/**
|
||||
|
124
xtldr/volume.c
124
xtldr/volume.c
@ -4,6 +4,7 @@
|
||||
* FILE: xtldr/volume.c
|
||||
* DESCRIPTION: XTLDR volume support
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
* Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtldr.h>
|
||||
@ -78,21 +79,41 @@ BlEnumerateBlockDevices()
|
||||
ListEntry = BlockDevices.Flink;
|
||||
while(ListEntry != &BlockDevices)
|
||||
{
|
||||
/* Take block device from the list */
|
||||
/* Get data for the next discovered device. */
|
||||
BlockDeviceData = CONTAIN_RECORD(ListEntry, EFI_BLOCK_DEVICE_DATA, ListEntry);
|
||||
|
||||
/* Find last node */
|
||||
Status = BlpFindLastBlockDeviceNode(BlockDeviceData->DevicePath, &LastNode);
|
||||
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");
|
||||
ListEntry = ListEntry->Flink;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Set drive type to 'unknown' by default */
|
||||
/* Initialize drive type before attempting to classify the device */
|
||||
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 */
|
||||
if(LastNode->Type == EFI_ACPI_DEVICE_PATH && LastNode->SubType == EFI_ACPI_DP)
|
||||
{
|
||||
@ -101,65 +122,54 @@ BlEnumerateBlockDevices()
|
||||
if(AcpiDevice->HID == 0x60441D0 || AcpiDevice->HID == 0x70041D0 || AcpiDevice->HID == 0x70141D1)
|
||||
{
|
||||
/* Floppy drive found */
|
||||
Media = BlockDeviceData->BlockIo->Media;
|
||||
DriveType = XTBL_BOOT_DEVICE_FLOPPY;
|
||||
DriveNumber = FDCount++;
|
||||
PartitionNumber = 0;
|
||||
|
||||
/* Print debug message */
|
||||
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)
|
||||
else if((LastNode->Type == EFI_MEDIA_DEVICE_PATH && LastNode->SubType == EFI_MEDIA_CDROM_DP) ||
|
||||
(LastNode->Type == EFI_MESSAGING_DEVICE_PATH &&
|
||||
(LastNode->SubType == EFI_MESSAGING_ATAPI_DP || LastNode->SubType == EFI_MESSAGING_SATA_DP) &&
|
||||
Media->MediaPresent && Media->RemovableMedia))
|
||||
{
|
||||
/* Media device path found */
|
||||
if(LastNode->SubType == EFI_MEDIA_CDROM_DP)
|
||||
{
|
||||
/* Optical drive found */
|
||||
Media = BlockDeviceData->BlockIo->Media;
|
||||
DriveType = XTBL_BOOT_DEVICE_CDROM;
|
||||
DriveNumber = CDCount++;
|
||||
PartitionNumber = 0;
|
||||
/* Optical drive found */
|
||||
DriveType = XTBL_BOOT_DEVICE_CDROM;
|
||||
DriveNumber = CDCount++;
|
||||
PartitionNumber = 0;
|
||||
|
||||
/* Print debug message */
|
||||
BlDebugPrint(L"Found CD-ROM drive (DriveNumber: %lu, MediaPresent: %u, RemovableMedia: %u, RO: %u)\n",
|
||||
DriveNumber, Media->MediaPresent, Media->RemovableMedia, Media->ReadOnly);
|
||||
}
|
||||
else if(LastNode->SubType == EFI_MEDIA_HARDDRIVE_DP)
|
||||
{
|
||||
/* Hard disk partition found */
|
||||
Media = BlockDeviceData->BlockIo->Media;
|
||||
HDPath = (PEFI_HARDDRIVE_DEVICE_PATH)LastNode;
|
||||
DriveType = XTBL_BOOT_DEVICE_HARDDISK;
|
||||
DriveNumber = (HDPath->PartitionNumber == 1) ? HDCount++ : HDCount - 1;
|
||||
PartitionNumber = HDPath->PartitionNumber;
|
||||
PartitionGuid = (PEFI_GUID)HDPath->Signature;
|
||||
/* Print debug message */
|
||||
BlDebugPrint(L"Found CD-ROM drive (DriveNumber: %lu, MediaPresent: %u, RemovableMedia: %u, RO: %u)\n",
|
||||
DriveNumber, Media->MediaPresent, Media->RemovableMedia, Media->ReadOnly);
|
||||
}
|
||||
else if(LastNode->Type == EFI_MEDIA_DEVICE_PATH && LastNode->SubType == EFI_MEDIA_HARDDRIVE_DP)
|
||||
{
|
||||
/* Hard disk partition found */
|
||||
HDPath = (PEFI_HARDDRIVE_DEVICE_PATH)LastNode;
|
||||
DriveType = XTBL_BOOT_DEVICE_HARDDISK;
|
||||
DriveNumber = (HDPath->PartitionNumber == 1) ? HDCount++ : HDCount - 1;
|
||||
PartitionNumber = HDPath->PartitionNumber;
|
||||
PartitionGuid = (PEFI_GUID)HDPath->Signature;
|
||||
|
||||
/* Print debug message */
|
||||
BlDebugPrint(L"Found Hard Disk partition (DiskNumber: %lu, PartNumber: %lu, "
|
||||
L"MBRType: %u, GUID: {%V}, PartSize: %uB)\n",
|
||||
DriveNumber, PartitionNumber, HDPath->MBRType,
|
||||
PartitionGuid, HDPath->PartitionSize * Media->BlockSize);
|
||||
}
|
||||
else if(LastNode->SubType == EFI_MEDIA_RAMDISK_DP)
|
||||
{
|
||||
/* RAM disk found */
|
||||
Media = BlockDeviceData->BlockIo->Media;
|
||||
DriveType = XTBL_BOOT_DEVICE_RAMDISK;
|
||||
DriveNumber = RDCount++;
|
||||
PartitionNumber = 0;
|
||||
/* Print debug message */
|
||||
BlDebugPrint(L"Found Hard Disk partition (DiskNumber: %lu, PartNumber: %lu, "
|
||||
L"MBRType: %u, GUID: {%V}, PartSize: %uB)\n",
|
||||
DriveNumber, PartitionNumber, HDPath->MBRType,
|
||||
PartitionGuid, HDPath->PartitionSize * Media->BlockSize);
|
||||
}
|
||||
else if(LastNode->Type == EFI_MEDIA_DEVICE_PATH && LastNode->SubType == EFI_MEDIA_RAMDISK_DP)
|
||||
{
|
||||
/* RAM disk found */
|
||||
DriveType = XTBL_BOOT_DEVICE_RAMDISK;
|
||||
DriveNumber = RDCount++;
|
||||
PartitionNumber = 0;
|
||||
|
||||
/* Print debug message */
|
||||
BlDebugPrint(L"Found RAM Disk (DiskNumber: %lu, MediaPresent: %u)\n",
|
||||
DriveNumber, Media->MediaPresent);
|
||||
}
|
||||
|
||||
if(!BlpFindParentBlockDevice(&BlockDevices, BlockDeviceData, ParentNode))
|
||||
{
|
||||
BlDebugPrint(L"WARNING: No parent device found, skipping orphaned media device path\n");
|
||||
continue;
|
||||
}
|
||||
/* Print debug message */
|
||||
BlDebugPrint(L"Found RAM Disk (DiskNumber: %lu, MediaPresent: %u)\n",
|
||||
DriveNumber, Media->MediaPresent);
|
||||
}
|
||||
|
||||
/* Make sure the device found has valid type set */
|
||||
@ -917,17 +927,25 @@ BlpDuplicateDevicePath(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath)
|
||||
EFI_STATUS Status;
|
||||
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;
|
||||
|
||||
/* Get the device path length */
|
||||
while(TRUE)
|
||||
{
|
||||
Length += *(PUSHORT)DevicePath->Length;
|
||||
Length += *(PUSHORT)DevicePathNode->Length;
|
||||
if(DevicePathNode->Type == EFI_END_DEVICE_PATH)
|
||||
{
|
||||
break;
|
||||
}
|
||||
DevicePathNode = (PEFI_DEVICE_PATH_PROTOCOL)((PUCHAR)DevicePathNode + *(PUSHORT)DevicePath->Length);
|
||||
DevicePathNode = (PEFI_DEVICE_PATH_PROTOCOL)((PUCHAR)DevicePathNode + *(PUSHORT)DevicePathNode->Length);
|
||||
}
|
||||
|
||||
/* Check length */
|
||||
@ -1016,7 +1034,7 @@ XTCDECL
|
||||
BOOLEAN
|
||||
BlpFindParentBlockDevice(IN PLIST_ENTRY BlockDevices,
|
||||
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_BLOCK_DEVICE_DATA BlockDeviceData;
|
||||
@ -1039,7 +1057,7 @@ BlpFindParentBlockDevice(IN PLIST_ENTRY BlockDevices,
|
||||
if(ParentDevicePath->Type == EFI_END_DEVICE_PATH)
|
||||
{
|
||||
/* Parent device is a match */
|
||||
ParentNode = BlockDeviceData;
|
||||
*ParentNode = BlockDeviceData;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -151,7 +151,8 @@ BlInitializeBootMenuList(OUT PXTBL_BOOTMENU_ITEM *MenuEntries,
|
||||
MenuEntrySection = CONTAIN_RECORD(MenuEntrySectionList, XTBL_CONFIG_SECTION, Flink);
|
||||
|
||||
/* Check if this is the default menu entry */
|
||||
if(RtlCompareWideStringInsensitive(MenuEntrySection->SectionName, DefaultMenuEntry, 0) == 0)
|
||||
if((RtlWideStringLength(MenuEntrySection->SectionName, 0) == RtlWideStringLength(DefaultMenuEntry, 0)) &&
|
||||
(RtlCompareWideStringInsensitive(MenuEntrySection->SectionName, DefaultMenuEntry, 0) == 0))
|
||||
{
|
||||
/* Set default OS ID */
|
||||
DefaultOS = NumberOfEntries;
|
||||
|
@ -9,7 +9,7 @@ This is a list of them:
|
||||
|
||||
* Ar - Architecture library
|
||||
* Ex - Kernel Executive
|
||||
* Hl - Hardware Abstraction Layer (HAL)
|
||||
* Hl - Hardware Layer
|
||||
* Ke - Core kernel library
|
||||
* Mm - Memory 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
|
||||
threads.
|
||||
|
||||
### HL: Hardware Abstraction Layer
|
||||
Hardware Abstraction Layer (HAL), is a layer between the physical hardware of the computer and the rest of the operating
|
||||
system. It was designed to hide differences in hardware and therefore it provides a consistent platform on which
|
||||
the system and applications may run.
|
||||
### HL: Hardware Layer
|
||||
Hardware Layer, is a layer between the physical hardware of the computer and the rest of the operating system. It was
|
||||
designed to hide differences in hardware and therefore it provides a consistent platform on which the system and
|
||||
applications may run.
|
||||
|
||||
### KE: Kernel Library
|
||||
The kernel implements its core functionality that everything else in the system depends upon. This includes basic
|
||||
|
@ -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_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_SYS_TSS, (ULONG_PTR)ProcessorBlock->TssBase, sizeof(KTSS), AMD64_TSS, KGDT_DPL_SYSTEM, 0);
|
||||
ArpSetGdtEntry(ProcessorBlock->GdtBase, KGDT_SYS_TSS, (ULONG_PTR)ProcessorBlock->TssBase, sizeof(KTSS) - 1, 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_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);
|
||||
|
@ -265,15 +265,22 @@ XTAPI
|
||||
XTSTATUS
|
||||
HlpInitializeAcpiSystemInformation(VOID)
|
||||
{
|
||||
PUCHAR MadtTable;
|
||||
PACPI_MADT_LOCAL_X2APIC LocalX2Apic;
|
||||
PACPI_MADT_LOCAL_APIC LocalApic;
|
||||
ULONG_PTR MadtTable;
|
||||
PACPI_MADT Madt;
|
||||
XTSTATUS Status;
|
||||
ULONG CpuCount;
|
||||
USHORT CpuCount;
|
||||
|
||||
/* Zero the ACPI system information structure */
|
||||
RtlZeroMemory(&HlpAcpiSystemInfo, sizeof(ACPI_SYSTEM_INFO));
|
||||
/* Allocate memory for ACPI system information structure */
|
||||
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);
|
||||
if(Status != STATUS_SUCCESS)
|
||||
{
|
||||
@ -282,38 +289,54 @@ HlpInitializeAcpiSystemInformation(VOID)
|
||||
}
|
||||
|
||||
/* Set APIC table traverse pointer and initialize number of CPUs */
|
||||
MadtTable = (PUCHAR)Madt->ApicTables;
|
||||
MadtTable = (ULONG_PTR)Madt->ApicTables;
|
||||
CpuCount = 0;
|
||||
|
||||
/* Traverse all MADT tables to get number of processors */
|
||||
while(MadtTable <= ((PUCHAR)Madt + Madt->Header.Length))
|
||||
/* 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_MADT_LOCAL_APIC)MadtTable)->Header.Type == ACPI_MADT_TYPE_LOCAL_APIC) &&
|
||||
(((PACPI_MADT_LOCAL_APIC)MadtTable)->Header.Length == sizeof(ACPI_MADT_LOCAL_APIC)))
|
||||
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(((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 */
|
||||
CpuCount++;
|
||||
}
|
||||
|
||||
/* 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) &&
|
||||
(((PACPI_MADT_LOCAL_X2APIC)MadtTable)->Header.Length == sizeof(ACPI_MADT_LOCAL_X2APIC)))
|
||||
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(((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 */
|
||||
CpuCount++;
|
||||
}
|
||||
|
||||
/* Go to the next MADT table */
|
||||
MadtTable += ((PACPI_MADT_LOCAL_X2APIC)MadtTable)->Header.Length;
|
||||
MadtTable += ((PACPI_SUBTABLE_HEADER)MadtTable)->Length;
|
||||
}
|
||||
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 STATUS_SUCCESS;
|
||||
}
|
||||
@ -385,9 +507,13 @@ XTSTATUS
|
||||
HlpQueryAcpiCache(IN ULONG Signature,
|
||||
OUT PACPI_DESCRIPTION_HEADER *AcpiTable)
|
||||
{
|
||||
PACPI_DESCRIPTION_HEADER TableHeader;
|
||||
PACPI_CACHE_LIST AcpiCache;
|
||||
PLIST_ENTRY ListEntry;
|
||||
|
||||
/* Initialize variables */
|
||||
TableHeader = NULL;
|
||||
|
||||
/* Iterate through ACPI tables cache list */
|
||||
ListEntry = HlpAcpiCacheList.Flink;
|
||||
while(ListEntry != &HlpAcpiCacheList)
|
||||
@ -399,7 +525,7 @@ HlpQueryAcpiCache(IN ULONG Signature,
|
||||
if(AcpiCache->Header.Signature == Signature)
|
||||
{
|
||||
/* ACPI table found in cache, return it */
|
||||
*AcpiTable = &AcpiCache->Header;
|
||||
TableHeader = &AcpiCache->Header;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -408,13 +534,14 @@ HlpQueryAcpiCache(IN ULONG Signature,
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
return STATUS_NOT_FOUND;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
/* Return table header and status code */
|
||||
*AcpiTable = TableHeader;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@ -452,6 +579,9 @@ HlpQueryAcpiTables(IN ULONG Signature,
|
||||
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 */
|
||||
if(Signature == ACPI_DSDT_SIGNATURE || Signature == ACPI_FACS_SIGNATURE)
|
||||
{
|
||||
|
@ -277,7 +277,7 @@ HlInitializeComPort(IN OUT PCPPORT Port,
|
||||
HlIoPortOutByte(PtrToUshort(PortAddress + (ULONG)COMPORT_REG_MCR), COMPORT_MCR_NOM);
|
||||
|
||||
/* Read junk data out of the Receive Buffer Register (RBR) */
|
||||
HlIoPortInByte(PtrToUshort(Port->Address + (ULONG)COMPORT_REG_RBR));
|
||||
HlIoPortInByte(PtrToUshort(PortAddress + (ULONG)COMPORT_REG_RBR));
|
||||
|
||||
/* Store port details */
|
||||
Port->Address = PortAddress;
|
||||
|
@ -15,9 +15,6 @@ LIST_ENTRY HlpAcpiCacheList;
|
||||
/* ACPI Root System Description Pointer (RSDP) */
|
||||
PACPI_RSDP HlpAcpiRsdp;
|
||||
|
||||
/* ACPI system information */
|
||||
ACPI_SYSTEM_INFO HlpAcpiSystemInfo;
|
||||
|
||||
/* ACPI timer information */
|
||||
ACPI_TIMER_INFO HlpAcpiTimerInfo;
|
||||
|
||||
@ -29,3 +26,6 @@ APIC_MODE HlpApicMode;
|
||||
|
||||
/* FrameBuffer information */
|
||||
HAL_FRAMEBUFFER_DATA HlpFrameBufferData;
|
||||
|
||||
/* System information */
|
||||
ACPI_SYSTEM_INFO HlpSystemInfo;
|
||||
|
@ -35,7 +35,7 @@ HlClearApicErrors(VOID)
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTFASTCALL
|
||||
ULONG
|
||||
ULONGLONG
|
||||
HlReadApicRegister(IN APIC_REGISTER Register)
|
||||
{
|
||||
if(HlpApicMode == APIC_MODE_X2APIC)
|
||||
@ -81,7 +81,7 @@ HlSendEoi(VOID)
|
||||
XTFASTCALL
|
||||
VOID
|
||||
HlWriteApicRegister(IN APIC_REGISTER Register,
|
||||
IN ULONG Value)
|
||||
IN ULONGLONG Value)
|
||||
{
|
||||
if(HlpApicMode == APIC_MODE_X2APIC)
|
||||
{
|
||||
@ -133,6 +133,26 @@ HlpCheckX2ApicSupport(VOID)
|
||||
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.
|
||||
*
|
||||
@ -371,3 +391,35 @@ HlpInitializePic(VOID)
|
||||
/* Initialize legacy PIC */
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -18,7 +18,7 @@ VOID
|
||||
HlClearApicErrors(VOID);
|
||||
|
||||
XTFASTCALL
|
||||
ULONG
|
||||
ULONGLONG
|
||||
HlReadApicRegister(IN APIC_REGISTER Register);
|
||||
|
||||
XTAPI
|
||||
@ -28,12 +28,16 @@ HlSendEoi(VOID);
|
||||
XTFASTCALL
|
||||
VOID
|
||||
HlWriteApicRegister(IN APIC_REGISTER Register,
|
||||
IN ULONG Value);
|
||||
IN ULONGLONG Value);
|
||||
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
HlpCheckX2ApicSupport(VOID);
|
||||
|
||||
XTAPI
|
||||
ULONG
|
||||
HlpGetCpuApicId(VOID);
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
HlpHandleApicSpuriousService(VOID);
|
||||
@ -54,6 +58,11 @@ XTAPI
|
||||
VOID
|
||||
HlpInitializePic();
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
HlpSendIpi(ULONG ApicId,
|
||||
ULONG Vector);
|
||||
|
||||
XTFASTCALL
|
||||
KRUNLEVEL
|
||||
HlpTransformApicTprToRunLevel(IN UCHAR Tpr);
|
||||
|
@ -18,9 +18,6 @@ EXTERN LIST_ENTRY HlpAcpiCacheList;
|
||||
/* ACPI Root System Description Pointer (RSDP) */
|
||||
EXTERN PACPI_RSDP HlpAcpiRsdp;
|
||||
|
||||
/* ACPI system information */
|
||||
EXTERN ACPI_SYSTEM_INFO HlpAcpiSystemInfo;
|
||||
|
||||
/* ACPI timer information */
|
||||
EXTERN ACPI_TIMER_INFO HlpAcpiTimerInfo;
|
||||
|
||||
@ -33,6 +30,9 @@ EXTERN APIC_MODE HlpApicMode;
|
||||
/* FrameBuffer information */
|
||||
EXTERN HAL_FRAMEBUFFER_DATA HlpFrameBufferData;
|
||||
|
||||
/* System information */
|
||||
EXTERN ACPI_SYSTEM_INFO HlpSystemInfo;
|
||||
|
||||
/* Pointer to boot loader provided DbgPrint() routine */
|
||||
EXTERN VOID (*KeDbgPrint)(IN PWCHAR Format, IN ...);
|
||||
|
||||
|
@ -102,6 +102,10 @@ XTAPI
|
||||
XTSTATUS
|
||||
HlpInitializeAcpiSystemInformation(VOID);
|
||||
|
||||
XTAPI
|
||||
XTSTATUS
|
||||
HlpInitializeAcpiSystemStructure(VOID);
|
||||
|
||||
XTAPI
|
||||
XTSTATUS
|
||||
HlpInitializeAcpiTimer(VOID);
|
||||
|
@ -18,7 +18,7 @@ VOID
|
||||
HlClearApicErrors(VOID);
|
||||
|
||||
XTFASTCALL
|
||||
ULONG
|
||||
ULONGLONG
|
||||
HlReadApicRegister(IN APIC_REGISTER Register);
|
||||
|
||||
XTAPI
|
||||
@ -28,12 +28,16 @@ HlSendEoi(VOID);
|
||||
XTFASTCALL
|
||||
VOID
|
||||
HlWriteApicRegister(IN APIC_REGISTER Register,
|
||||
IN ULONG Value);
|
||||
IN ULONGLONG Value);
|
||||
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
HlpCheckX2ApicSupport(VOID);
|
||||
|
||||
XTAPI
|
||||
ULONG
|
||||
HlpGetCpuApicId(VOID);
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
HlpHandleApicSpuriousService(VOID);
|
||||
@ -54,6 +58,11 @@ XTAPI
|
||||
VOID
|
||||
HlpInitializePic(VOID);
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
HlpSendIpi(ULONG ApicId,
|
||||
ULONG Vector);
|
||||
|
||||
XTFASTCALL
|
||||
KRUNLEVEL
|
||||
HlpTransformApicTprToRunLevel(IN UCHAR Tpr);
|
||||
|
@ -17,7 +17,7 @@ XTAPI
|
||||
XTSTATUS
|
||||
MmAllocateHardwareMemory(IN PFN_NUMBER PageCount,
|
||||
IN BOOLEAN Aligned,
|
||||
OUT PULONG_PTR Buffer);
|
||||
OUT PPHYSICAL_ADDRESS Buffer);
|
||||
|
||||
XTAPI
|
||||
XTSTATUS
|
||||
|
@ -93,7 +93,7 @@ KepStartKernel(VOID)
|
||||
RtlInitializeListHead(&KepProcessListHead);
|
||||
PageDirectory[0] = 0;
|
||||
PageDirectory[1] = 0;
|
||||
KeInitializeProcess(CurrentProcess, 0, 0xFFFFFFFF, PageDirectory, FALSE);
|
||||
KeInitializeProcess(CurrentProcess, 0, MAXULONG_PTR, PageDirectory, FALSE);
|
||||
CurrentProcess->Quantum = MAXCHAR;
|
||||
|
||||
/* Initialize Idle thread */
|
||||
|
@ -93,7 +93,7 @@ KepStartKernel(VOID)
|
||||
RtlInitializeListHead(&KepProcessListHead);
|
||||
PageDirectory[0] = 0;
|
||||
PageDirectory[1] = 0;
|
||||
KeInitializeProcess(CurrentProcess, 0, 0xFFFFFFFF, PageDirectory, FALSE);
|
||||
KeInitializeProcess(CurrentProcess, 0, MAXULONG_PTR, PageDirectory, FALSE);
|
||||
CurrentProcess->Quantum = MAXCHAR;
|
||||
|
||||
/* Initialize Idle thread */
|
||||
|
@ -60,6 +60,6 @@ KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters)
|
||||
/* Raise to HIGH runlevel */
|
||||
KeRaiseRunLevel(HIGH_LEVEL);
|
||||
|
||||
/* Switch boot stack aligning it to 4 byte boundary */
|
||||
KepSwitchBootStack((ULONG_PTR)&ArKernelBootStack & ~0x3);
|
||||
/* Switch the boot stack, setting the pointer to the top of the buffer and aligning it as required by the ABI */
|
||||
KepSwitchBootStack(((ULONG_PTR)&ArKernelBootStack + KERNEL_STACK_SIZE) & ~(STACK_ALIGNMENT - 1));
|
||||
}
|
||||
|
@ -1035,13 +1035,13 @@ VOID
|
||||
__ubsan_handle_type_mismatch_v1(IN PKUBSAN_TYPE_MISMATCH_DATA_V1 Data,
|
||||
IN ULONG_PTR Pointer)
|
||||
{
|
||||
KUBSAN_TYPE_MISMATCH_DATA MismatchData;
|
||||
|
||||
/* Prepare UBSAN type mismatch data in old format */
|
||||
KUBSAN_TYPE_MISMATCH_DATA MismatchData = {
|
||||
.Location = Data->Location,
|
||||
.Type = Data->Type,
|
||||
.Alignment = 1UL << Data->LogAlignment,
|
||||
.TypeCheckKind = Data->TypeCheckKind,
|
||||
};
|
||||
MismatchData.Alignment = 1UL << Data->LogAlignment;
|
||||
MismatchData.Location = Data->Location;
|
||||
MismatchData.Type = Data->Type;
|
||||
MismatchData.TypeCheckKind = Data->TypeCheckKind;
|
||||
|
||||
/* Call UBSAN type mismatch handler */
|
||||
KepHandleUbsanTypeMismatch(&MismatchData, Pointer);
|
||||
|
@ -29,7 +29,7 @@ XTAPI
|
||||
XTSTATUS
|
||||
MmAllocateHardwareMemory(IN PFN_NUMBER PageCount,
|
||||
IN BOOLEAN Aligned,
|
||||
OUT PULONG_PTR Buffer)
|
||||
OUT PPHYSICAL_ADDRESS Buffer)
|
||||
{
|
||||
PLOADER_MEMORY_DESCRIPTOR Descriptor, ExtraDescriptor, HardwareDescriptor;
|
||||
PFN_NUMBER Alignment, MaxPage;
|
||||
@ -37,7 +37,7 @@ MmAllocateHardwareMemory(IN PFN_NUMBER PageCount,
|
||||
PLIST_ENTRY ListEntry;
|
||||
|
||||
/* Assume failure */
|
||||
*Buffer = 0;
|
||||
(*Buffer).QuadPart = 0;
|
||||
|
||||
/* Calculate maximum page address */
|
||||
MaxPage = MM_MAXIMUM_PHYSICAL_ADDRESS >> MM_PAGE_SHIFT;
|
||||
@ -135,7 +135,7 @@ MmAllocateHardwareMemory(IN PFN_NUMBER PageCount,
|
||||
}
|
||||
|
||||
/* Return physical address */
|
||||
*Buffer = PhysicalAddress;
|
||||
(*Buffer).QuadPart = PhysicalAddress;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user