Compare commits
No commits in common. "master" and "master" have entirely different histories.
13
.github/workflows/build.yml
vendored
13
.github/workflows/build.yml
vendored
@ -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
|
||||||
|
@ -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)
|
||||||
|
3
IDEAS.md
3
IDEAS.md
@ -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).
|
||||||
|
|
||||||
|
21
README.md
21
README.md
@ -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]
|
||||||
|
@ -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."
|
|
||||||
}
|
|
@ -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
|
||||||
|
|
||||||
|
@ -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)
|
@ -1,2 +0,0 @@
|
|||||||
# Set base addresses for all modules
|
|
||||||
set(BASEADDRESS_XTOSKRNL 0x0000000140000000)
|
|
@ -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)
|
||||||
|
@ -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")
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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 */
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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");
|
||||||
|
@ -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 */
|
||||||
|
@ -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.");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
124
xtldr/volume.c
124
xtldr/volume.c
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -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);
|
||||||
|
@ -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 ...);
|
||||||
|
|
||||||
|
@ -102,10 +102,6 @@ XTAPI
|
|||||||
XTSTATUS
|
XTSTATUS
|
||||||
HlpInitializeAcpiSystemInformation(VOID);
|
HlpInitializeAcpiSystemInformation(VOID);
|
||||||
|
|
||||||
XTAPI
|
|
||||||
XTSTATUS
|
|
||||||
HlpInitializeAcpiSystemStructure(VOID);
|
|
||||||
|
|
||||||
XTAPI
|
XTAPI
|
||||||
XTSTATUS
|
XTSTATUS
|
||||||
HlpInitializeAcpiTimer(VOID);
|
HlpInitializeAcpiTimer(VOID);
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user