Compare commits
1 Commits
master
...
implement-
Author | SHA1 | Date | |
---|---|---|---|
363e100493 |
13
.github/workflows/build.yml
vendored
13
.github/workflows/build.yml
vendored
@@ -7,7 +7,6 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [amd64, i686]
|
||||
build: [debug, release]
|
||||
runs-on: oscw
|
||||
container:
|
||||
image: codingworkshop/oscw-runner:latest
|
||||
@@ -18,7 +17,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
- name: Build ExectOS
|
||||
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
|
||||
- name: Publish binaries
|
||||
if: ${{ github.ref == 'refs/heads/master' }}
|
||||
@@ -27,8 +26,8 @@ jobs:
|
||||
OSCW_ARTIFACTS_USERNAME: ${{ secrets.OSCW_ARTIFACTS_USERNAME }}
|
||||
OSCW_ARTIFACTS_USERKEY: ${{ secrets.OSCW_ARTIFACTS_USERKEY }}
|
||||
run: |
|
||||
tar -I 'gzip' -cpf ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-${{ matrix.build }}-bin.tar.gz -C build-${{ matrix.arch }}-${{ matrix.build }}/output/binaries .
|
||||
tar -I 'gzip' -cpf ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-${{ matrix.build }}-sdk.tar.gz -C build-${{ matrix.arch }}-${{ matrix.build }}/output/sdk .
|
||||
tar -I 'gzip' -cpf ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-${{ matrix.build }}-sym.tar.gz -C build-${{ matrix.arch }}-${{ matrix.build }}/output/symbols .
|
||||
gzip -c build-${{ matrix.arch }}-${{ matrix.build }}/output/disk.img > ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-${{ matrix.build }}.img.gz
|
||||
artifact_publish "ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-${{ matrix.build }}*.gz" ExectOS
|
||||
tar -I 'gzip' -cpf ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-bin.tar.gz -C build-${{ matrix.arch }}-xtchain/output/binaries .
|
||||
tar -I 'gzip' -cpf ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-lib.tar.gz -C build-${{ matrix.arch }}-xtchain/output/library .
|
||||
tar -I 'gzip' -cpf ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}-sym.tar.gz -C build-${{ matrix.arch }}-xtchain/output/symbols .
|
||||
gzip -c build-${{ matrix.arch }}-xtchain/output/disk.img > ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}.img.gz
|
||||
artifact_publish "ExectOS-$(date +'%Y%m%d')-${GITHUB_SHA:0:10}-${{ matrix.arch }}*.gz" ExectOS
|
||||
|
@@ -1,5 +1,8 @@
|
||||
# Minimum CMake version requirement
|
||||
# Detect XTChain toolchain
|
||||
cmake_minimum_required(VERSION 3.19.0)
|
||||
if(NOT CMAKE_VERSION MATCHES "XTC")
|
||||
message(FATAL_ERROR "XTChain not detected or corrupted!")
|
||||
endif()
|
||||
|
||||
# Lowercase target architecture
|
||||
string(TOLOWER ${ARCH} ARCH)
|
||||
@@ -41,7 +44,7 @@ set(CMAKE_TOOLCHAIN_FILE "sdk/cmake/toolchain.cmake")
|
||||
project(EXECTOS)
|
||||
|
||||
# Load all the CMake SDK
|
||||
include(sdk/cmake/baseaddress/${ARCH}.cmake)
|
||||
include(sdk/cmake/baseaddress.cmake)
|
||||
include(sdk/cmake/emulation.cmake)
|
||||
include(sdk/cmake/functions.cmake)
|
||||
include(sdk/cmake/version.cmake)
|
||||
@@ -55,15 +58,18 @@ add_definitions(-D__XTOS__)
|
||||
add_definitions(-DXTOS_SOURCE_DIR="${EXECTOS_SOURCE_DIR}")
|
||||
add_definitions(-DXTOS_BINARY_DIR="${EXECTOS_BINARY_DIR}")
|
||||
|
||||
# Set libraries target directory
|
||||
set(LIBRARY_OUTPUT_PATH ${EXECTOS_BINARY_DIR}/output/library CACHE PATH "Build directory" FORCE)
|
||||
|
||||
# Compute __FILE__ definition
|
||||
file(RELATIVE_PATH _PATH_PREFIX ${EXECTOS_BINARY_DIR} ${EXECTOS_SOURCE_DIR})
|
||||
add_compiler_flags(-D__RELFILE__="&__FILE__[__FILE__[0] == '.' ? sizeof \\\"${_PATH_PREFIX}\\\" - 1 : sizeof XTOS_SOURCE_DIR]")
|
||||
|
||||
# Set the virtual disk image size (in MiB)
|
||||
set_disk_image_size(48)
|
||||
set_disk_image_size(32)
|
||||
|
||||
# Build all subprojects
|
||||
add_subdirectory(boot)
|
||||
add_subdirectory(bootdata)
|
||||
add_subdirectory(drivers)
|
||||
add_subdirectory(sdk)
|
||||
add_subdirectory(xtldr)
|
||||
add_subdirectory(xtoskrnl)
|
||||
|
16
IDEAS.md
16
IDEAS.md
@@ -1,9 +1,25 @@
|
||||
## ExectOS Ideas
|
||||
This is a list of ideas that migh but not must be realized.
|
||||
|
||||
### SDK
|
||||
- [ ] Currently XT Development Kit (XTDK) is a garbage. It should be cleaned up the way, it contains all structures
|
||||
and definitions, as well as all routines that are exported and can be used by other components or software
|
||||
dynamically linked. All other routines should be available as well in some form, as some libraries can share
|
||||
code with others (eg. XTLDR calls routines exported by XTOSKRNL). This is partially done, as XTDK has been
|
||||
cleaned up, but still there are routines used by XTLDR.
|
||||
|
||||
### XTLDR
|
||||
- [ ] Rewrite memory mapping and paging support in bootloader to make it more flexible and architecture independent.
|
||||
This should support paging levels, thus allowing to make a use of PML5 on modern AMD64 processors and increasing
|
||||
the addressable virtual memory from 256TB to 128PB.
|
||||
- [ ] Find graphics card from all PCI devices and identify its framebuffer address when GOP is not supported by UEFI
|
||||
firmware and UGA has to be used instead.
|
||||
|
||||
### XTOSKRNL
|
||||
- [ ] Implement mechanism for detecting CPU features and checking hardware requirements. If CPU does not meet
|
||||
requirements, it should cause a kernel panic before any non-supported instruction is being used.
|
||||
- [ ] Design a mechanism of sharing common code between some architectures (i.e. both i686 and amd64 supports APIC,
|
||||
while it is not available on ARM).
|
||||
- [ ] Finish framebuffer and terminal implementation. Initialization code is already prepared as well as routines for
|
||||
clearing the screen and drawing single points. Terminal should be instantiable (should be able to create many
|
||||
terminals and switch between them) and work on top of FB. It should define ANSI colors and scrollback buffer.
|
||||
|
33
README.md
33
README.md
@@ -8,20 +8,20 @@
|
||||
<a href="https://git.codingworkshop.eu.org/xt-sys/exectos/actions">
|
||||
<img alt="Build Status" src="https://codingworkshop.eu.org/actions.php?project=xt-sys/exectos">
|
||||
</a>
|
||||
<a href="https://artifacts.codingworkshop.eu.org/ExectOS/?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">
|
||||
</a>
|
||||
<a href="https://git.codingworkshop.eu.org/xt-sys/exectos/src/branch/master/COPYING.md">
|
||||
<img alt="License" src="https://img.shields.io/badge/License-GPLv3-blue.svg">
|
||||
</a>
|
||||
<a href="https://exectos.eu.org/ai-assisted">
|
||||
<img alt="AI Assisted" src="https://img.shields.io/badge/AI-Assisted-darkcyan">
|
||||
<a href="https://codeium.com/">
|
||||
<img alt="Codeium" src="https://img.shields.io/badge/Powered%20By-Codeium-09B6A2?logo=Codeium">
|
||||
</a>
|
||||
<a href="https://github.com/sponsors/xt-sys/">
|
||||
<img alt="Sponsor" src="https://img.shields.io/badge/Sponsor-%E2%9D%A4-red?logo=GitHub">
|
||||
</a>
|
||||
<a href="https://discord.com/invite/zBzJ5qMGX7">
|
||||
<img alt="Discord" src="https://img.shields.io/badge/Chat-Join%20Discord-success">
|
||||
<img alt="Discord" src="https://img.shields.io/discord/723186294540206100?label=Chat">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
@@ -58,25 +58,26 @@ design, it requires a modern EFI enabled hardware. It is not possible currently
|
||||
|
||||
# Source structure
|
||||
| Directory | Description |
|
||||
|------------------|--------------------------------------------------------------|
|
||||
| boot/bootdata | default configuration and data needed to boot XTOS |
|
||||
| boot/bootsect | boot sector code (MBR & VBR) initializing the boot process |
|
||||
| boot/xtldr | XTOS boot loader source code |
|
||||
|-------------|----------------------------------------------------------|
|
||||
| bootdata | default configuration and data needed to boot XTOS |
|
||||
| drivers | XT native drivers source code |
|
||||
| sdk/cmake | host toolchain configuration and build-related functions |
|
||||
| sdk/firmware | firmware enabling XTOS to boot on virtual machines |
|
||||
| sdk/cmake | Host toolchain configuration and build-related functions |
|
||||
| sdk/xtdk | XT Software Development Kit headers |
|
||||
| services | integral subsystems services source code |
|
||||
| subsystems | environment subsystems source code |
|
||||
| xtoskrnl | XTOS kernel source code |
|
||||
| xtldr | XTOS boot loader source code |
|
||||
|
||||
# Build
|
||||
XTOS can only be built using [XTchain](https://git.codingworkshop.eu.org/xt-sys/xtchain), a dedicated toolchain designed
|
||||
specifically for compiling XT software. XTChain is currently available for both Linux and Windows. Detailed instructions
|
||||
on how to configure and run XTChain can be found [here](https://exectos.eu.org/contributing/setting-up-xtchain).
|
||||
|
||||
With the XTchain environment already running, navigate to the directory containing the ExectOS source code and use the
|
||||
following commands to set the target build architecture and configure the sources:
|
||||
XTOS can be built only by using [XTChain](https://git.codingworkshop.eu.org/xt-sys/xtchain), a special toolchain
|
||||
prepared for compiling XT software. Currently, there is only a Linux version available, so a Linux distribution or WSL
|
||||
is needed. If XTChain is already installed and available, then building ExectOS is quiet easy. First, open a terminal
|
||||
or WSL console and type the following command to launch XTChain build console:
|
||||
```
|
||||
xtchain
|
||||
```
|
||||
While the console is already running, navigate to the directory containing ExectOS source code and use the following
|
||||
commands to first set target build architecture and configure the sources:
|
||||
```
|
||||
charch [i686|amd64]
|
||||
chbuild [DEBUG|RELEASE]
|
||||
|
@@ -1,3 +0,0 @@
|
||||
add_subdirectory(bootdata)
|
||||
add_subdirectory(bootsect)
|
||||
add_subdirectory(xtldr)
|
@@ -1,6 +0,0 @@
|
||||
# XT Boot Sector
|
||||
PROJECT(BOOTSECT)
|
||||
|
||||
# Compile boot sectors
|
||||
compile_bootsector(mbrboot ${BOOTSECT_SOURCE_DIR}/mbrboot.S 0x7C00 Start)
|
||||
compile_bootsector(espboot ${BOOTSECT_SOURCE_DIR}/espboot.S 0x7C00 Start)
|
@@ -1,275 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: boot/bootsect/espboot.S
|
||||
* DESCRIPTION: XT Boot Loader ESP boot code (FAT32)
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
.text
|
||||
.code16
|
||||
|
||||
|
||||
.global Start
|
||||
Start:
|
||||
/* Jump to the real start to omit the BPB (BIOS Parameter Block) */
|
||||
jmp RealStart
|
||||
nop
|
||||
|
||||
/* BIOS Parameter Block */
|
||||
OsName:
|
||||
.ascii "XTOS "
|
||||
OsVersion:
|
||||
.ascii "1.0"
|
||||
BytesPerSector:
|
||||
.word 512
|
||||
SectorsPerCluster:
|
||||
.byte 2
|
||||
ReservedSectors:
|
||||
.word 8
|
||||
FatCopies:
|
||||
.byte 1
|
||||
RootDirEntries:
|
||||
.word 1024
|
||||
TotalSectors:
|
||||
.word 0
|
||||
MediaType:
|
||||
.byte 0xF8
|
||||
SectorsPerFat:
|
||||
.word 0
|
||||
SectorsPerTrack:
|
||||
.word 17
|
||||
NumberOfHeads:
|
||||
.word 0
|
||||
HiddenSectors:
|
||||
.long 0
|
||||
TotalBigSectors:
|
||||
.long 0x200000
|
||||
BigSectorsPerFat:
|
||||
.long 0x1FE0
|
||||
ExtendedFlags:
|
||||
.word 0
|
||||
FsVersion:
|
||||
.word 0
|
||||
RootDirStartCluster:
|
||||
.long 0
|
||||
FSInfoSector:
|
||||
.word 0
|
||||
BackupBootSector:
|
||||
.word 6
|
||||
Reserved:
|
||||
.fill 12, 1, 0
|
||||
DriveNumber:
|
||||
.byte 0x80
|
||||
CurrentHead:
|
||||
.byte 0
|
||||
Signature:
|
||||
.byte 0x29
|
||||
SerialNumber:
|
||||
.long 0
|
||||
VolumeLabel:
|
||||
.ascii "NO NAME "
|
||||
FileSystem:
|
||||
.ascii "FAT32 "
|
||||
|
||||
RealStart:
|
||||
/* Set segments and stack */
|
||||
cli
|
||||
cld
|
||||
xorw %ax, %ax
|
||||
movw %ax, %ds
|
||||
movw %ax, %es
|
||||
movw %ax, %ss
|
||||
movw $0x7C00, %bp
|
||||
leaw -16(%bp), %sp
|
||||
sti
|
||||
|
||||
/* Get drive number */
|
||||
cmpb $0xFF, DriveNumber - Start(%bp)
|
||||
jne GetDriveParameters
|
||||
movb %dl, DriveNumber - Start(%bp)
|
||||
|
||||
GetDriveParameters:
|
||||
/* Get drive parameters from the BIOS */
|
||||
movb DriveNumber - Start(%bp), %dl
|
||||
movb $0x08, %ah
|
||||
movb $0x00, %al
|
||||
int $0x13
|
||||
jnc GetDriveSize
|
||||
movw $0xFFFF, %cx
|
||||
movb %cl, %dh
|
||||
|
||||
GetDriveSize:
|
||||
/* Get drive size from the BIOS */
|
||||
movzbl %dh, %eax
|
||||
incw %ax
|
||||
movzbl %cl, %edx
|
||||
andb $0x3F, %dl
|
||||
mulw %dx
|
||||
xchgb %cl, %ch
|
||||
shrb $0x06, %ch
|
||||
incw %cx
|
||||
movzwl %cx, %ecx
|
||||
mull %ecx
|
||||
movl %eax, %edi
|
||||
|
||||
VerifyBiosParameterBlock:
|
||||
/* Verify the FAT32 BPB */
|
||||
cmpw $0x00, SectorsPerFat - Start(%bp)
|
||||
jne FsError
|
||||
cmpw $0x00, FsVersion - Start(%bp)
|
||||
ja FsError
|
||||
|
||||
ReadExtraCode:
|
||||
/* Read second VBR sector with extra boot code */
|
||||
movl HiddenSectors - Start(%bp), %eax
|
||||
addl $0x02, %eax
|
||||
movw $0x01, %cx
|
||||
xorw %bx, %bx
|
||||
movw %bx, %es
|
||||
movw $0x7E00, %bx
|
||||
call ReadSectors
|
||||
jmp StartSectors
|
||||
|
||||
ReadSectors:
|
||||
/* Check for extended BIOS functions and use it only if available */
|
||||
pushw %es
|
||||
pushal
|
||||
movb $0x41, %ah
|
||||
movw $0x55AA, %bx
|
||||
movb DriveNumber - Start(%bp), %dl
|
||||
int $0x13
|
||||
jc ReadCHS
|
||||
cmpw $0xAA55, %bx
|
||||
jne ReadCHS
|
||||
testb $0x01, %cl
|
||||
jz ReadCHS
|
||||
|
||||
/* Verify drive size and determine whether to use CHS or LBA */
|
||||
cmpl %edi, %eax
|
||||
jnb ReadLBA
|
||||
|
||||
ReadCHS:
|
||||
/* Read sectors using CHS */
|
||||
popal
|
||||
pushal
|
||||
xorl %edx, %edx
|
||||
movzwl SectorsPerTrack - Start(%bp), %ecx
|
||||
divl %ecx
|
||||
incb %dl
|
||||
movb %dl, %cl
|
||||
movl %eax, %edx
|
||||
shrl $0x10, %edx
|
||||
divw NumberOfHeads - Start(%bp)
|
||||
movb %dl, %dh
|
||||
movb DriveNumber - Start(%bp), %dl
|
||||
movb %al, %ch
|
||||
rorb $0x01, %ah
|
||||
rorb $0x01, %ah
|
||||
orb %ah, %cl
|
||||
movw $0x0201, %ax
|
||||
int $0x13
|
||||
jc DiskError
|
||||
popal
|
||||
incl %eax
|
||||
movw %es, %dx
|
||||
addw $0x20, %dx
|
||||
movw %dx, %es
|
||||
loop ReadCHS
|
||||
popw %es
|
||||
ret
|
||||
|
||||
ReadLBA:
|
||||
/* Prepare DAP packet and read sectors using LBA */
|
||||
popal
|
||||
pushw %cx
|
||||
pushal
|
||||
pushw $0x00
|
||||
pushw $0x00
|
||||
pushl %eax
|
||||
pushw %es
|
||||
pushw %bx
|
||||
pushw %cx
|
||||
pushw $0x10
|
||||
movw %sp, %si
|
||||
movb DriveNumber - Start(%bp), %dl
|
||||
movb $0x42, %ah
|
||||
int $0x13
|
||||
jc DiskError
|
||||
addw $0x10, %sp
|
||||
popal
|
||||
popw %si
|
||||
pushw %bx
|
||||
movzwl %si, %ebx
|
||||
addl %ebx, %eax
|
||||
shll $0x05, %ebx
|
||||
movw %es, %dx
|
||||
addw %bx, %dx
|
||||
movw %dx, %es
|
||||
popw %bx
|
||||
subw %si, %cx
|
||||
jnz ReadLBA
|
||||
popw %es
|
||||
ret
|
||||
|
||||
DiskError:
|
||||
/* Display disk error message and reboot */
|
||||
movw $msgDiskError, %si
|
||||
call Print
|
||||
jmp Reboot
|
||||
|
||||
FsError:
|
||||
/* Display FS error message and reboot */
|
||||
movw $msgFsError, %si
|
||||
call Print
|
||||
jmp Reboot
|
||||
|
||||
Print:
|
||||
/* Simple routine to print messages */
|
||||
lodsb
|
||||
orb %al, %al
|
||||
jz DonePrint
|
||||
movb $0x0E, %ah
|
||||
movw $0x07, %bx
|
||||
int $0x10
|
||||
jmp Print
|
||||
DonePrint:
|
||||
retw
|
||||
|
||||
Reboot:
|
||||
/* Display a message, wait for a key press and reboot */
|
||||
movw $msgAnyKey, %si
|
||||
call Print
|
||||
xorw %ax, %ax
|
||||
int $0x16
|
||||
int $0x19
|
||||
|
||||
msgAnyKey:
|
||||
.ascii "Press any key to restart\r\n"
|
||||
|
||||
msgDiskError:
|
||||
.ascii "Disk error\r\n"
|
||||
|
||||
msgFsError:
|
||||
.ascii "File system error\r\n"
|
||||
|
||||
/* Fill the rest of the VBR with zeros and add VBR signature at the end */
|
||||
.fill (510 - (. - Start)), 1, 0
|
||||
.word 0xAA55
|
||||
|
||||
|
||||
StartSectors:
|
||||
/* Print message */
|
||||
movw $msgUnavailable, %si
|
||||
call Print
|
||||
|
||||
/* Wait for key press and reboot */
|
||||
xorw %ax, %ax
|
||||
int $0x16
|
||||
int $0x19
|
||||
|
||||
msgUnavailable:
|
||||
.ascii "XTLDR requires EFI-based system!\r\nPress any key to restart\r\n"
|
||||
|
||||
/* Fill the rest of the extra VBR with zeros */
|
||||
.fill (1024 - (. - Start)), 1, 0
|
@@ -1,153 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: boot/bootsect/amd64/mbrboot.S
|
||||
* DESCRIPTION: XT Boot Loader MBR boot code
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
.text
|
||||
.code16
|
||||
|
||||
|
||||
.global Start
|
||||
Start:
|
||||
/* Set segments and stack */
|
||||
cli
|
||||
cld
|
||||
xorw %ax, %ax
|
||||
movw %ax, %ds
|
||||
movw %ax, %es
|
||||
movw %ax, %ss
|
||||
movw $0x7C00, %bp
|
||||
leaw -16(%bp), %sp
|
||||
sti
|
||||
|
||||
/* Relocate MBR to 1FE0:7C00 */
|
||||
movw $0x1FE0, %ax
|
||||
movw %ax, %es
|
||||
movw %bp, %si
|
||||
movw %bp, %di
|
||||
movw $256, %cx
|
||||
rep movsw
|
||||
|
||||
/* Jump to the relocated MBR code */
|
||||
jmp $0x1FE0, $RealStart
|
||||
|
||||
RealStart:
|
||||
/* Set segments */
|
||||
movw %ax, %ds
|
||||
movw %ax, %es
|
||||
movw %ax, %ss
|
||||
|
||||
/* Print welcome message */
|
||||
leaw msgXtosBoot, %si
|
||||
call Print
|
||||
|
||||
/* Get BIOS boot drive and partition table offset */
|
||||
lea 0x1BE(%bp), %si
|
||||
movb %dl, .BootDrive
|
||||
xorw %cx, %cx
|
||||
|
||||
FindActivePartition:
|
||||
/* Look for active partition */
|
||||
movb (%si), %al
|
||||
cmpb $0x80, %al
|
||||
je PartitionFound
|
||||
addw $16, %si
|
||||
incw %cx
|
||||
cmpw $4, %cx
|
||||
jne FindActivePartition
|
||||
jmp PartitionNotFound
|
||||
|
||||
PartitionFound:
|
||||
/* Save LBA start */
|
||||
movl 8(%si), %eax
|
||||
movl %eax, .LbaStart
|
||||
|
||||
/* Prepare Disk Address Packet (DAP) */
|
||||
lea .Dap, %si
|
||||
movb $0x10, 0(%si)
|
||||
movb $0x00, 1(%si)
|
||||
movw $1, 2(%si)
|
||||
movw $0x7C00, 4(%si)
|
||||
movw $0x0000, 6(%si)
|
||||
movl .LbaStart, %eax
|
||||
movl %eax, 8(%si)
|
||||
|
||||
/* Read Volume Boot Record (VBR) */
|
||||
movb $0x42, %ah
|
||||
movb .BootDrive, %dl
|
||||
int $0x13
|
||||
jc VbrReadFail
|
||||
|
||||
/* Verify VBR signature */
|
||||
cmpw $0xAA55, (0x7C00 + 0x01FE)
|
||||
jne InvalidSignature
|
||||
|
||||
/* Jump to the VBR code */
|
||||
jmp $0x0000, $0x7C00
|
||||
|
||||
InvalidSignature:
|
||||
/* Invalid signature error */
|
||||
leaw msgInvalidSignature, %si
|
||||
call Print
|
||||
jmp HaltSystem
|
||||
|
||||
PartitionNotFound:
|
||||
/* Active partition not found error */
|
||||
leaw msgPartitionNotFound, %si
|
||||
call Print
|
||||
jmp HaltSystem
|
||||
|
||||
VbrReadFail:
|
||||
/* VBR read failed error */
|
||||
leaw msgVbrReadFail, %si
|
||||
call Print
|
||||
jmp HaltSystem
|
||||
|
||||
HaltSystem:
|
||||
/* Disable interrupts and stop the CPU */
|
||||
cli
|
||||
hlt
|
||||
jmp HaltSystem
|
||||
|
||||
Print:
|
||||
/* Simple routine to print messages */
|
||||
lodsb
|
||||
orb %al, %al
|
||||
jz DonePrint
|
||||
movb $0x0E, %ah
|
||||
movw $0x07, %bx
|
||||
int $0x10
|
||||
jmp Print
|
||||
DonePrint:
|
||||
retw
|
||||
|
||||
.BootDrive:
|
||||
/* Storage for the boot drive number */
|
||||
.byte 0
|
||||
|
||||
.Dap:
|
||||
/* Storage for the Disk Address Packet (DAP) */
|
||||
.fill 16, 1, 0
|
||||
|
||||
.LbaStart:
|
||||
/* Storage for the LBA start */
|
||||
.long 0
|
||||
|
||||
msgInvalidSignature:
|
||||
.asciz "Invalid partition signature!"
|
||||
|
||||
msgPartitionNotFound:
|
||||
.asciz "Bootable partition not found!"
|
||||
|
||||
msgVbrReadFail:
|
||||
.asciz "VBR read failed!"
|
||||
|
||||
msgXtosBoot:
|
||||
.asciz "Starting XTOS boot loader...\r\n"
|
||||
|
||||
/* Fill the rest of the MBR with zeros and add MBR signature at the end */
|
||||
.fill (510 - (. - Start)), 1, 0
|
||||
.word 0xAA55
|
@@ -1,372 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/arch/amd64/memory.cc
|
||||
* DESCRIPTION: XT Boot Loader AMD64 specific memory management
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
* Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtldr.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Maps boot loader related code and builds page map.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @param SelfMapAddress
|
||||
* Supplies a virtual address of the page tables.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR SelfMapAddress)
|
||||
{
|
||||
PLIST_ENTRY ListEntry, ModulesList, ModulesListEntry;
|
||||
PXTBL_MEMORY_MAPPING Mapping;
|
||||
PXTBL_MODULE_INFO ModuleInfo;
|
||||
EFI_PHYSICAL_ADDRESS Address;
|
||||
PVOID LoaderBase;
|
||||
ULONGLONG LoaderSize;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Allocate pages for the Page Map */
|
||||
Status = AllocatePages(AllocateAnyPages, 1, &Address);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Assign and zero-fill memory used by page mappings */
|
||||
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
||||
RTL::Memory::ZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
||||
|
||||
/* Add page mapping itself to memory mapping */
|
||||
Status = Memory::SelfMapPml(PageMap, SelfMapAddress);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* PML mapping failed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Map the trampoline code area */
|
||||
Status = MapVirtualMemory(PageMap, (PVOID)MM_TRAMPOLINE_ADDRESS,(PVOID)MM_TRAMPOLINE_ADDRESS,
|
||||
1, LoaderFirmwareTemporary);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Mapping trampoline code failed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get list of XTLDR modules */
|
||||
ModulesList = Protocol::GetModulesList();
|
||||
ModulesListEntry = ModulesList->Flink;
|
||||
while(ModulesListEntry != ModulesList)
|
||||
{
|
||||
/* Get module info */
|
||||
ModuleInfo = CONTAIN_RECORD(ModulesListEntry, XTBL_MODULE_INFO, Flink);
|
||||
|
||||
/* Map module code */
|
||||
Status = MapVirtualMemory(PageMap, ModuleInfo->ModuleBase, ModuleInfo->ModuleBase,
|
||||
EFI_SIZE_TO_PAGES(ModuleInfo->ModuleSize), LoaderFirmwareTemporary);
|
||||
|
||||
/* Check if mapping succeeded */
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Mapping module code failed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get next module */
|
||||
ModulesListEntry = ModulesListEntry->Flink;
|
||||
}
|
||||
|
||||
/* Get boot loader image information */
|
||||
XtLoader::GetLoaderImageInformation(&LoaderBase, &LoaderSize);
|
||||
|
||||
/* Make sure boot loader image base and size are set */
|
||||
if(LoaderBase && LoaderSize)
|
||||
{
|
||||
/* Map boot loader code as well */
|
||||
Status = MapVirtualMemory(PageMap, LoaderBase, LoaderBase,
|
||||
EFI_SIZE_TO_PAGES(LoaderSize), LoaderFirmwareTemporary);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Mapping boot loader code failed */
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Boot loader image information re not available */
|
||||
return STATUS_EFI_PROTOCOL_ERROR;
|
||||
}
|
||||
|
||||
/* Iterate through and map all the mappings*/
|
||||
Debug::Print(L"Mapping and dumping EFI memory:\n");
|
||||
ListEntry = PageMap->MemoryMap.Flink;
|
||||
while(ListEntry != &PageMap->MemoryMap)
|
||||
{
|
||||
/* Take mapping from the list */
|
||||
Mapping = CONTAIN_RECORD(ListEntry, XTBL_MEMORY_MAPPING, ListEntry);
|
||||
|
||||
/* Check if virtual address is set */
|
||||
if(Mapping->VirtualAddress)
|
||||
{
|
||||
/* Dump memory mapping */
|
||||
Debug::Print(L" Type=%02lu, PhysicalBase=%.16P, VirtualBase=%.16P, Pages=%llu\n", Mapping->MemoryType,
|
||||
Mapping->PhysicalAddress, Mapping->VirtualAddress, Mapping->NumberOfPages);
|
||||
|
||||
/* Map memory */
|
||||
Status = MapPage(PageMap, (UINT_PTR)Mapping->VirtualAddress,
|
||||
(UINT_PTR)Mapping->PhysicalAddress, Mapping->NumberOfPages);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failed */
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
/* Take next element */
|
||||
ListEntry = ListEntry->Flink;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns next level of the Page Table.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @param PageTable
|
||||
* Supplies a pointer to the current Page Table.
|
||||
*
|
||||
* @param Entry
|
||||
* Supplies an index of the current Page Table entry.
|
||||
*
|
||||
* @param NextPageTable
|
||||
* Supplies a pointer to the memory area where the next Page Table level is returned.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Memory::GetNextPageTable(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN PVOID PageTable,
|
||||
IN SIZE_T Entry,
|
||||
OUT PVOID *NextPageTable)
|
||||
{
|
||||
EFI_PHYSICAL_ADDRESS Address;
|
||||
ULONGLONG PmlPointer = 0;
|
||||
PHARDWARE_PTE PmlTable;
|
||||
EFI_STATUS Status;
|
||||
|
||||
PmlTable = (PHARDWARE_PTE)PageTable;
|
||||
|
||||
/* Check if this is a valid table */
|
||||
if(PmlTable[Entry].Valid)
|
||||
{
|
||||
/* Get PML pointer */
|
||||
PmlPointer = PmlTable[Entry].PageFrameNumber;
|
||||
PmlPointer <<= EFI_PAGE_SHIFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Allocate pages for new PML entry */
|
||||
Status = AllocatePages(AllocateAnyPages, 1, &Address);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Add new memory mapping */
|
||||
Status = MapVirtualMemory(PageMap, NULLPTR, (PVOID)(UINT_PTR)Address, 1, LoaderMemoryData);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Fill allocated memory with zeros */
|
||||
RTL::Memory::ZeroMemory((PVOID)(ULONGLONG)Address, EFI_PAGE_SIZE);
|
||||
|
||||
/* Set paging entry settings */
|
||||
PmlTable[Entry].PageFrameNumber = Address / EFI_PAGE_SIZE;
|
||||
PmlTable[Entry].Valid = 1;
|
||||
PmlTable[Entry].Writable = 1;
|
||||
PmlPointer = (ULONGLONG)Address;
|
||||
}
|
||||
|
||||
/* Set next Page Map Level (PML) */
|
||||
*NextPageTable = (PVOID)(ULONGLONG)PmlPointer;
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the actual virtual memory mapping.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @param VirtualAddress
|
||||
* Supplies a virtual address of the mapping.
|
||||
*
|
||||
* @param PhysicalAddress
|
||||
* Supplies a physical address of the mapping.
|
||||
*
|
||||
* @param NumberOfPages
|
||||
* Supplies a number of the pages of the mapping.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Memory::MapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR VirtualAddress,
|
||||
IN ULONG_PTR PhysicalAddress,
|
||||
IN ULONG NumberOfPages)
|
||||
{
|
||||
PVOID Pml1, Pml2, Pml3, Pml4, Pml5;
|
||||
SIZE_T Pml1Entry, Pml2Entry, Pml3Entry, Pml4Entry, Pml5Entry;
|
||||
PHARDWARE_PTE PmlTable;
|
||||
SIZE_T PageFrameNumber;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Set the Page Frame Number (PFN) */
|
||||
PageFrameNumber = PhysicalAddress >> EFI_PAGE_SHIFT;
|
||||
|
||||
/* Do the recursive mapping */
|
||||
while(NumberOfPages > 0)
|
||||
{
|
||||
/* Calculate the indices in the various Page Tables from the virtual address */
|
||||
Pml5Entry = (VirtualAddress & ((ULONGLONG)0x1FF << MM_P5I_SHIFT)) >> MM_P5I_SHIFT;
|
||||
Pml4Entry = (VirtualAddress & ((ULONGLONG)0x1FF << MM_PXI_SHIFT)) >> MM_PXI_SHIFT;
|
||||
Pml3Entry = (VirtualAddress & ((ULONGLONG)0x1FF << MM_PPI_SHIFT)) >> MM_PPI_SHIFT;
|
||||
Pml2Entry = (VirtualAddress & ((ULONGLONG)0x1FF << MM_PDI_SHIFT)) >> MM_PDI_SHIFT;
|
||||
Pml1Entry = (VirtualAddress & ((ULONGLONG)0x1FF << MM_PTI_SHIFT)) >> MM_PTI_SHIFT;
|
||||
|
||||
/* Check page map level */
|
||||
if(PageMap->PageMapLevel == 5)
|
||||
{
|
||||
/* Five level Page Map */
|
||||
Pml5 = PageMap->PtePointer;
|
||||
|
||||
/* Get PML4 */
|
||||
Status = GetNextPageTable(PageMap, Pml5, Pml5Entry, &Pml4);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failure */
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Four level Page Map */
|
||||
Pml4 = PageMap->PtePointer;
|
||||
}
|
||||
|
||||
/* Get PML3 */
|
||||
Status = GetNextPageTable(PageMap, Pml4, Pml4Entry, &Pml3);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get PML 2 */
|
||||
Status = GetNextPageTable(PageMap, Pml3, Pml3Entry, &Pml2);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get PML1 */
|
||||
Status = GetNextPageTable(PageMap, Pml2, Pml2Entry, &Pml1);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Set paging entry settings */
|
||||
PmlTable = (PHARDWARE_PTE)Pml1;
|
||||
RTL::Memory::ZeroMemory(&PmlTable[Pml1Entry], sizeof(HARDWARE_PTE));
|
||||
PmlTable[Pml1Entry].PageFrameNumber = PageFrameNumber;
|
||||
PmlTable[Pml1Entry].Valid = 1;
|
||||
PmlTable[Pml1Entry].Writable = 1;
|
||||
|
||||
/* Take next virtual address and PFN */
|
||||
VirtualAddress += EFI_PAGE_SIZE;
|
||||
PageFrameNumber++;
|
||||
|
||||
/* Decrease number of pages left */
|
||||
NumberOfPages--;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a recursive self mapping for all PML levels.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @param SelfMapAddress
|
||||
* Supplies a virtual address of the page tables.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Memory::SelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR SelfMapAddress)
|
||||
{
|
||||
PHARDWARE_PTE PmlBase;
|
||||
ULONGLONG PmlIndex;
|
||||
|
||||
/* Initialize PML base pointer */
|
||||
PmlBase = (PHARDWARE_PTE)PageMap->PtePointer;
|
||||
|
||||
/* Check page map level */
|
||||
if(PageMap->PageMapLevel == 5)
|
||||
{
|
||||
/* Calculate PML index based on provided self map address for PML5 */
|
||||
PmlIndex = (SelfMapAddress >> MM_P5I_SHIFT) & 0x1FF;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Calculate PML index based on provided self map address for PML4 */
|
||||
PmlIndex = (SelfMapAddress >> MM_PXI_SHIFT) & 0x1FF;
|
||||
}
|
||||
|
||||
/* Add self-mapping */
|
||||
RTL::Memory::ZeroMemory(&PmlBase[PmlIndex], sizeof(HARDWARE_PTE));
|
||||
PmlBase[PmlIndex].PageFrameNumber = (UINT_PTR)PageMap->PtePointer / EFI_PAGE_SIZE;
|
||||
PmlBase[PmlIndex].Valid = 1;
|
||||
PmlBase[PmlIndex].Writable = 1;
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
@@ -1,461 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/arch/i686/memory.cc
|
||||
* DESCRIPTION: XT Boot Loader i686 specific memory management
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
* Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtldr.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Maps boot loader related code and builds page map.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Memory::BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR SelfMapAddress)
|
||||
{
|
||||
PLIST_ENTRY ListEntry, ModulesList, ModulesListEntry;
|
||||
EFI_PHYSICAL_ADDRESS Address, DirectoryAddress;
|
||||
PXTBL_MODULE_INFO ModuleInfo;
|
||||
PXTBL_MEMORY_MAPPING Mapping;
|
||||
PVOID LoaderBase;
|
||||
ULONGLONG LoaderSize;
|
||||
EFI_STATUS Status;
|
||||
ULONG Index;
|
||||
|
||||
/* Check the page map level to determine which paging structure to create */
|
||||
if(PageMap->PageMapLevel == 3)
|
||||
{
|
||||
/* Allocate a page for the 3-level page map structure (PAE enabled) */
|
||||
Status = AllocatePages(AllocateAnyPages, 1, &Address);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failed, cannot proceed with page map creation */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Assign the allocated page to the page map and zero it out */
|
||||
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
||||
RTL::Memory::ZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
||||
|
||||
/* Allocate 4 pages for the Page Directories (PDs) */
|
||||
Status = AllocatePages(AllocateAnyPages, 4, &DirectoryAddress);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failed, cannot proceed with page map creation */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Zero-fill the allocated memory for the Page Directories */
|
||||
RTL::Memory::ZeroMemory((PVOID)DirectoryAddress, EFI_PAGE_SIZE * 4);
|
||||
|
||||
/* Fill the PDPT with pointers to the Page Directories */
|
||||
for(Index = 0; Index < 4; Index++)
|
||||
{
|
||||
RTL::Memory::ZeroMemory(&((PHARDWARE_MODERN_PTE)PageMap->PtePointer)[Index], sizeof(HARDWARE_MODERN_PTE));
|
||||
((PHARDWARE_MODERN_PTE)PageMap->PtePointer)[Index].PageFrameNumber = DirectoryAddress / EFI_PAGE_SIZE;
|
||||
((PHARDWARE_MODERN_PTE)PageMap->PtePointer)[Index].Valid = 1;
|
||||
DirectoryAddress += EFI_PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Allocate a page for the 2-level page map structure (PAE disabled) */
|
||||
Status = AllocatePages(AllocateAnyPages, 1, &Address);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failed, cannot proceed with page map creation */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Assign the allocated page to the page map and zero it out */
|
||||
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
||||
RTL::Memory::ZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
||||
}
|
||||
|
||||
/* Add page mapping itself to memory mapping */
|
||||
Status = SelfMapPml(PageMap, SelfMapAddress);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* PML mapping failed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Map the trampoline code area */
|
||||
Status = MapVirtualMemory(PageMap, (PVOID)MM_TRAMPOLINE_ADDRESS,(PVOID)MM_TRAMPOLINE_ADDRESS,
|
||||
1, LoaderFirmwareTemporary);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Mapping trampoline code failed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get list of XTLDR modules */
|
||||
ModulesList = Protocol::GetModulesList();
|
||||
ModulesListEntry = ModulesList->Flink;
|
||||
while(ModulesListEntry != ModulesList)
|
||||
{
|
||||
/* Get module info */
|
||||
ModuleInfo = CONTAIN_RECORD(ModulesListEntry, XTBL_MODULE_INFO, Flink);
|
||||
|
||||
/* Map module code */
|
||||
Status = MapVirtualMemory(PageMap, ModuleInfo->ModuleBase, ModuleInfo->ModuleBase,
|
||||
EFI_SIZE_TO_PAGES(ModuleInfo->ModuleSize), LoaderFirmwareTemporary);
|
||||
|
||||
/* Check if mapping succeeded */
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Mapping module code failed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get next module */
|
||||
ModulesListEntry = ModulesListEntry->Flink;
|
||||
}
|
||||
|
||||
/* Get boot loader image information */
|
||||
XtLoader::GetLoaderImageInformation(&LoaderBase, &LoaderSize);
|
||||
|
||||
/* Make sure boot loader image base and size are set */
|
||||
if(LoaderBase && LoaderSize)
|
||||
{
|
||||
/* Map boot loader code as well */
|
||||
Status = MapVirtualMemory(PageMap, LoaderBase, LoaderBase,
|
||||
EFI_SIZE_TO_PAGES(LoaderSize), LoaderFirmwareTemporary);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Mapping boot loader code failed */
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Boot loader image information re not available */
|
||||
return STATUS_EFI_PROTOCOL_ERROR;
|
||||
}
|
||||
|
||||
/* Iterate through and map all the mappings*/
|
||||
Debug::Print(L"Mapping and dumping EFI memory:\n");
|
||||
ListEntry = PageMap->MemoryMap.Flink;
|
||||
while(ListEntry != &PageMap->MemoryMap)
|
||||
{
|
||||
/* Take mapping from the list */
|
||||
Mapping = CONTAIN_RECORD(ListEntry, XTBL_MEMORY_MAPPING, ListEntry);
|
||||
|
||||
/* Check if virtual address is set */
|
||||
if(Mapping->VirtualAddress)
|
||||
{
|
||||
/* Dump memory mapping */
|
||||
Debug::Print(L" Type=%02lu, PhysicalBase=%.8P, VirtualBase=%.8P, Pages=%llu\n", Mapping->MemoryType,
|
||||
Mapping->PhysicalAddress, Mapping->VirtualAddress, Mapping->NumberOfPages);
|
||||
|
||||
/* Map memory */
|
||||
Status = MapPage(PageMap, (UINT_PTR)Mapping->VirtualAddress,
|
||||
(UINT_PTR)Mapping->PhysicalAddress, Mapping->NumberOfPages);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failed */
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
/* Take next element */
|
||||
ListEntry = ListEntry->Flink;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns next level of the Page Table.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @param PageTable
|
||||
* Supplies a pointer to the current Page Table.
|
||||
*
|
||||
* @param Entry
|
||||
* Supplies an index of the current Page Table entry.
|
||||
*
|
||||
* @param NextPageTable
|
||||
* Supplies a pointer to the memory area where the next Page Table level is returned.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Memory::GetNextPageTable(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN PVOID PageTable,
|
||||
IN SIZE_T Entry,
|
||||
OUT PVOID *NextPageTable)
|
||||
{
|
||||
EFI_PHYSICAL_ADDRESS Address;
|
||||
ULONGLONG PmlPointer = 0;
|
||||
EFI_STATUS Status;
|
||||
PHARDWARE_LEGACY_PTE LegacyPmlTable;
|
||||
PHARDWARE_MODERN_PTE PmlTable;
|
||||
BOOLEAN ValidPte = FALSE;
|
||||
|
||||
/* Check page map level to determine PTE size */
|
||||
if(PageMap->PageMapLevel >= 3)
|
||||
{
|
||||
/* 64-bit PTE for PML3 (PAE enabled) */
|
||||
PmlTable = (PHARDWARE_MODERN_PTE)PageTable;
|
||||
if(PmlTable[Entry].Valid)
|
||||
{
|
||||
/* Get page frame number from page table entry */
|
||||
PmlPointer = PmlTable[Entry].PageFrameNumber;
|
||||
ValidPte = TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 32-bit PTE for PML2 (PAE disabled) */
|
||||
LegacyPmlTable = (PHARDWARE_LEGACY_PTE)PageTable;
|
||||
if(LegacyPmlTable[Entry].Valid)
|
||||
{
|
||||
/* Get page frame number from page table entry */
|
||||
PmlPointer = LegacyPmlTable[Entry].PageFrameNumber;
|
||||
ValidPte = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if page table entry is valid */
|
||||
if(ValidPte)
|
||||
{
|
||||
/* Calculate the base address of the next page table */
|
||||
PmlPointer <<= EFI_PAGE_SHIFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Allocate pages for new PML entry */
|
||||
Status = AllocatePages(AllocateAnyPages, 1, &Address);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Add new memory mapping */
|
||||
Status = MapVirtualMemory(PageMap, NULLPTR, (PVOID)(UINT_PTR)Address, 1, LoaderMemoryData);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Fill allocated memory with zeros */
|
||||
RTL::Memory::ZeroMemory((PVOID)(ULONGLONG)Address, EFI_PAGE_SIZE);
|
||||
|
||||
/* Set paging entry settings based on level */
|
||||
if(PageMap->PageMapLevel >= 3)
|
||||
{
|
||||
/* 64-bit PTE for PML3 (PAE enabled) */
|
||||
PmlTable = (PHARDWARE_MODERN_PTE)PageTable;
|
||||
PmlTable[Entry].PageFrameNumber = Address / EFI_PAGE_SIZE;
|
||||
PmlTable[Entry].Valid = 1;
|
||||
PmlTable[Entry].Writable = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 32-bit PTE for PML2 (PAE disabled) */
|
||||
LegacyPmlTable = (PHARDWARE_LEGACY_PTE)PageTable;
|
||||
LegacyPmlTable[Entry].PageFrameNumber = (UINT32)(Address / EFI_PAGE_SIZE);
|
||||
LegacyPmlTable[Entry].Valid = 1;
|
||||
LegacyPmlTable[Entry].Writable = 1;
|
||||
}
|
||||
|
||||
/* Return the address of the new page table */
|
||||
PmlPointer = (ULONGLONG)Address;
|
||||
}
|
||||
|
||||
/* Set next Page Map Level (PML) */
|
||||
*NextPageTable = (PVOID)(ULONGLONG)PmlPointer;
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the actual virtual memory mapping.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @param VirtualAddress
|
||||
* Supplies a virtual address of the mapping.
|
||||
*
|
||||
* @param PhysicalAddress
|
||||
* Supplies a physical address of the mapping.
|
||||
*
|
||||
* @param NumberOfPages
|
||||
* Supplies a number of the pages of the mapping.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Memory::MapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR VirtualAddress,
|
||||
IN ULONG_PTR PhysicalAddress,
|
||||
IN ULONG NumberOfPages)
|
||||
{
|
||||
SIZE_T PageFrameNumber;
|
||||
PVOID Pml1, Pml2, Pml3;
|
||||
SIZE_T Pml1Entry, Pml2Entry, Pml3Entry;
|
||||
PHARDWARE_LEGACY_PTE LegacyPmlTable;
|
||||
PHARDWARE_MODERN_PTE PmlTable;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Set the Page Frame Number (PFN) */
|
||||
PageFrameNumber = PhysicalAddress >> EFI_PAGE_SHIFT;
|
||||
|
||||
/* Map all requested pages */
|
||||
while(NumberOfPages > 0)
|
||||
{
|
||||
/* Check the paging mode to use the correct page table structure */
|
||||
if(PageMap->PageMapLevel == 3)
|
||||
{
|
||||
/* Calculate the indices for PAE page tables */
|
||||
Pml3Entry = (VirtualAddress >> 30) & 0x3;
|
||||
Pml2Entry = (VirtualAddress >> 21) & 0x1FF;
|
||||
Pml1Entry = (VirtualAddress >> 12) & 0x1FF;
|
||||
|
||||
/* Get Page Directory Pointer Table (PML3) */
|
||||
Pml3 = PageMap->PtePointer;
|
||||
|
||||
/* Get Page Directory (PML2) */
|
||||
Status = GetNextPageTable(PageMap, Pml3, Pml3Entry, &Pml2);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to get the Page Table, abort mapping */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get Page Table (PML1) */
|
||||
Status = GetNextPageTable(PageMap, Pml2, Pml2Entry, &Pml1);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to get the Page Table, abort mapping */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Set the 64-bit PTE entry */
|
||||
PmlTable = (PHARDWARE_MODERN_PTE)Pml1;
|
||||
RTL::Memory::ZeroMemory(&PmlTable[Pml1Entry], sizeof(HARDWARE_MODERN_PTE));
|
||||
PmlTable[Pml1Entry].PageFrameNumber = PageFrameNumber;
|
||||
PmlTable[Pml1Entry].Valid = 1;
|
||||
PmlTable[Pml1Entry].Writable = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Calculate the indices for non-PAE page tables */
|
||||
Pml2Entry = (VirtualAddress >> 22) & 0x3FF;
|
||||
Pml1Entry = (VirtualAddress >> 12) & 0x3FF;
|
||||
|
||||
/* Get Page Directory (PML2) */
|
||||
Pml2 = PageMap->PtePointer;
|
||||
|
||||
/* Get Page Table (PML1) */
|
||||
Status = GetNextPageTable(PageMap, Pml2, Pml2Entry, &Pml1);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to get the Page Table, abort mapping */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Set the 32-bit PTE entry */
|
||||
LegacyPmlTable = (PHARDWARE_LEGACY_PTE)Pml1;
|
||||
RTL::Memory::ZeroMemory(&LegacyPmlTable[Pml1Entry], sizeof(HARDWARE_LEGACY_PTE));
|
||||
LegacyPmlTable[Pml1Entry].PageFrameNumber = (UINT32)PageFrameNumber;
|
||||
LegacyPmlTable[Pml1Entry].Valid = 1;
|
||||
LegacyPmlTable[Pml1Entry].Writable = 1;
|
||||
}
|
||||
|
||||
/* Take next virtual address and PFN */
|
||||
VirtualAddress += EFI_PAGE_SIZE;
|
||||
PageFrameNumber++;
|
||||
|
||||
/* Decrease number of pages left */
|
||||
NumberOfPages--;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a recursive self mapping for all PML levels.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @param SelfMapAddress
|
||||
* Supplies a virtual address of the page tables.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Memory::SelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR SelfMapAddress)
|
||||
{
|
||||
PHARDWARE_LEGACY_PTE LegacyPml;
|
||||
PHARDWARE_MODERN_PTE Pml;
|
||||
ULONGLONG PmlIndex;
|
||||
ULONG Index;
|
||||
|
||||
/* Check page map level */
|
||||
if(PageMap->PageMapLevel == 3)
|
||||
{
|
||||
/* Calculate PML index based on provided self map address */
|
||||
PmlIndex = (SelfMapAddress >> MM_PDI_SHIFT) & 0x1FF;
|
||||
|
||||
/* Get Page Directory */
|
||||
Pml = (PHARDWARE_MODERN_PTE)(((PHARDWARE_MODERN_PTE)PageMap->PtePointer)[SelfMapAddress >> MM_PPI_SHIFT].PageFrameNumber * EFI_PAGE_SIZE);
|
||||
|
||||
/* Add self-mapping for PML3 (PAE enabled) */
|
||||
for(Index = 0; Index < 4; Index++)
|
||||
{
|
||||
RTL::Memory::ZeroMemory(&Pml[PmlIndex + Index], sizeof(HARDWARE_MODERN_PTE));
|
||||
Pml[PmlIndex + Index].PageFrameNumber = ((PHARDWARE_MODERN_PTE)PageMap->PtePointer)[Index].PageFrameNumber;
|
||||
Pml[PmlIndex + Index].Valid = 1;
|
||||
Pml[PmlIndex + Index].Writable = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LegacyPml = (PHARDWARE_LEGACY_PTE)PageMap->PtePointer;
|
||||
|
||||
/* Calculate PML index based on provided self map address */
|
||||
PmlIndex = (SelfMapAddress >> MM_PDI_LEGACY_SHIFT);
|
||||
|
||||
/* Add self-mapping for PML2 (PAE disabled) */
|
||||
RTL::Memory::ZeroMemory(&LegacyPml[PmlIndex], sizeof(HARDWARE_LEGACY_PTE));
|
||||
LegacyPml[PmlIndex].PageFrameNumber = (UINT_PTR)PageMap->PtePointer / EFI_PAGE_SIZE;
|
||||
LegacyPml[PmlIndex].Valid = 1;
|
||||
LegacyPml[PmlIndex].Writable = 1;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
@@ -1,87 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/bootutil.cc
|
||||
* DESCRIPTION: Helper functions used by the boot protocol during system startup
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtldr.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Checks if a specific option exists in the list of provided boot parameters.
|
||||
*
|
||||
* @param Parameters
|
||||
* A pointer to the wide-character string containing the boot parameters, separated by spaces.
|
||||
*
|
||||
* @param Needle
|
||||
* A pointer to the wide-character string representing the kernel option to find.
|
||||
*
|
||||
* @return This routine returns TRUE if the option is found, otherwise FALSE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
BootUtils::GetBooleanParameter(IN PCWSTR Parameters,
|
||||
IN PCWSTR Needle)
|
||||
{
|
||||
PCWSTR CurrentPosition, TokenEnd, TokenStart;
|
||||
SIZE_T NeedleLength, TokenLength;
|
||||
|
||||
/* Validate input data and ensure the option is not an empty string */
|
||||
if(Parameters == NULLPTR || Needle == NULLPTR || *Needle == L'\0')
|
||||
{
|
||||
/* One of the parameters was invalid */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
CurrentPosition = Parameters;
|
||||
NeedleLength = RTL::WideString::WideStringLength(Needle, 0);
|
||||
|
||||
/* Iterate through the entire parameters string */
|
||||
while(*CurrentPosition != L'\0')
|
||||
{
|
||||
/* Skip any leading whitespace to find the start of the token */
|
||||
while(*CurrentPosition == L' ')
|
||||
{
|
||||
CurrentPosition++;
|
||||
}
|
||||
|
||||
/* Check if end of the string has been reached */
|
||||
if(*CurrentPosition == L'\0')
|
||||
{
|
||||
/* End of string reached, no more tokens */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Identify the boundaries of the current token */
|
||||
TokenStart = CurrentPosition;
|
||||
TokenEnd = TokenStart;
|
||||
while(*TokenEnd != L'\0' && *TokenEnd != L' ')
|
||||
{
|
||||
TokenEnd++;
|
||||
}
|
||||
|
||||
/* Calculate the length of the token found */
|
||||
TokenLength = TokenEnd - TokenStart;
|
||||
|
||||
/* Compare the token length */
|
||||
if(TokenLength == NeedleLength)
|
||||
{
|
||||
/* Length matches, compare the strings */
|
||||
if(RTL::WideString::CompareWideStringInsensitive(TokenStart, Needle, NeedleLength) == 0)
|
||||
{
|
||||
/* A match was found */
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Move the position past the current token to continue the search */
|
||||
CurrentPosition = TokenEnd;
|
||||
}
|
||||
|
||||
/* No match was found */
|
||||
return FALSE;
|
||||
}
|
1052
boot/xtldr/config.cc
1052
boot/xtldr/config.cc
File diff suppressed because it is too large
Load Diff
@@ -1,60 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/data.cc
|
||||
* DESCRIPTION: XT Boot Loader global and static data
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
* Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtldr.hh>
|
||||
|
||||
|
||||
/* XT Boot Loader menu list */
|
||||
PLIST_ENTRY Configuration::BootMenuList = NULLPTR;
|
||||
|
||||
/* XT Boot Loader configuration list */
|
||||
LIST_ENTRY Configuration::Config;
|
||||
|
||||
/* XT Boot Loader loaded configuration */
|
||||
LIST_ENTRY Configuration::ConfigSections;
|
||||
|
||||
/* List of user-editable boot options */
|
||||
PCWSTR Configuration::EditableConfigOptions[] = {
|
||||
L"BootModules", L"SystemType", L"SystemPath",
|
||||
L"KernelFile", L"InitrdFile", L"HalFile",
|
||||
L"Parameters", NULLPTR
|
||||
};
|
||||
|
||||
/* XT Boot Loader serial ports list */
|
||||
ULONG Debug::ComPortList[COMPORT_COUNT] = COMPORT_ADDRESS;
|
||||
|
||||
/* A list of enabled debug ports */
|
||||
ULONG Debug::EnabledDebugPorts;
|
||||
|
||||
/* XT Boot Loader serial port handle */
|
||||
CPPORT Debug::SerialPort;
|
||||
|
||||
/* XT Boot Loader registered boot protocol list */
|
||||
LIST_ENTRY Protocol::BootProtocols;
|
||||
|
||||
/* XT Boot Loader protocol */
|
||||
XTBL_LOADER_PROTOCOL Protocol::LoaderProtocol;
|
||||
|
||||
/* XT Boot Loader loaded modules list */
|
||||
LIST_ENTRY Protocol::LoadedModules;
|
||||
|
||||
/* List of available block devices */
|
||||
LIST_ENTRY Volume::EfiBlockDevices;
|
||||
|
||||
/* Pointer to the boot menu callback routine */
|
||||
PBL_XT_BOOT_MENU XtLoader::BootMenu = NULLPTR;
|
||||
|
||||
/* EFI Image Handle */
|
||||
EFI_HANDLE XtLoader::EfiImageHandle;
|
||||
|
||||
/* EFI System Table */
|
||||
PEFI_SYSTEM_TABLE XtLoader::EfiSystemTable;
|
||||
|
||||
/* XT Boot Loader status data */
|
||||
XTBL_STATUS XtLoader::LoaderStatus = {0};
|
@@ -1,402 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/debug.cc
|
||||
* DESCRIPTION: XT Boot Loader debugging support
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtldr.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Enables I/O space access to all serial controllers found on the PCI(E) root bridge.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Debug::ActivateSerialIOController()
|
||||
{
|
||||
EFI_GUID PciGuid = EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID;
|
||||
PEFI_PCI_ROOT_BRIDGE_IO_PROTOCOL PciDev;
|
||||
USHORT Bus, Device, Function, Command;
|
||||
UINT_PTR Index, PciHandleSize;
|
||||
PEFI_HANDLE PciHandle = NULLPTR;
|
||||
PCI_COMMON_HEADER PciHeader;
|
||||
EFI_STATUS Status;
|
||||
ULONGLONG Address;
|
||||
|
||||
/* Allocate memory for single EFI_HANDLE, what should be enough in most cases */
|
||||
PciHandleSize = sizeof(EFI_HANDLE);
|
||||
Status = Memory::AllocatePool(PciHandleSize, (PVOID*)&PciHandle);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get all instances of PciRootBridgeIo */
|
||||
Status = XtLoader::GetEfiSystemTable()->BootServices->LocateHandle(ByProtocol, &PciGuid, NULLPTR,
|
||||
&PciHandleSize, PciHandle);
|
||||
if(Status == STATUS_EFI_BUFFER_TOO_SMALL)
|
||||
{
|
||||
/* Reallocate more memory as requested by UEFI */
|
||||
Memory::FreePool(PciHandle);
|
||||
Status = Memory::AllocatePool(PciHandleSize, (PVOID*)&PciHandle);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory reallocation failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Second attempt to get instances of PciRootBridgeIo */
|
||||
Status = XtLoader::GetEfiSystemTable()->BootServices->LocateHandle(ByProtocol, &PciGuid, NULLPTR,
|
||||
&PciHandleSize, PciHandle);
|
||||
}
|
||||
|
||||
/* Make sure successfully obtained PciRootBridgeIo instances */
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to get PciRootBridgeIo instances */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Enumerate all devices for each handle, which decides a segment and a bus number range */
|
||||
for(Index = 0; Index < (PciHandleSize / sizeof(EFI_HANDLE)); Index++)
|
||||
{
|
||||
/* Get inferface from the protocol */
|
||||
Status = XtLoader::GetEfiSystemTable()->BootServices->HandleProtocol(PciHandle[Index], &PciGuid, (PVOID*)&PciDev);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to get interface */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Enumerate whole PCI bridge */
|
||||
for(Bus = 0; Bus <= PCI_MAX_BRIDGE_NUMBER; Bus++)
|
||||
{
|
||||
/* Enumerate all devices for each bus */
|
||||
for(Device = 0; Device < PCI_MAX_DEVICES; Device++)
|
||||
{
|
||||
/* Enumerate all functions for each devices */
|
||||
for(Function = 0; Function < PCI_MAX_FUNCTION; Function++)
|
||||
{
|
||||
/* Read configuration space */
|
||||
Address = ((ULONGLONG)((((UINT_PTR) Bus) << 24) + (((UINT_PTR) Device) << 16) +
|
||||
(((UINT_PTR) Function) << 8) + ((UINT_PTR) 0)));
|
||||
PciDev->Pci.Read(PciDev, EfiPciIoWidthUint32, Address, sizeof (PciHeader) / sizeof (UINT), &PciHeader);
|
||||
|
||||
/* Check if device exists */
|
||||
if(PciHeader.VendorId == PCI_INVALID_VENDORID)
|
||||
{
|
||||
/* Skip non-existen device */
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if device is serial controller or multiport serial controller */
|
||||
if(PciHeader.BaseClass == 0x07 && (PciHeader.SubClass == 0x00 || PciHeader.SubClass == 0x02))
|
||||
{
|
||||
/* Enable I/O space access */
|
||||
Address |= 0x4;
|
||||
Command = PCI_ENABLE_IO_SPACE;
|
||||
Status = PciDev->Pci.Write(PciDev, EfiPciIoWidthUint16, Address, 1, &Command);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Return SUCCESS */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* This routine initializes the XTLDR debug console.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Debug::InitializeDebugConsole()
|
||||
{
|
||||
ULONG PortAddress, PortNumber, BaudRate;
|
||||
PWCHAR DebugConfiguration, DebugPort, LastPort;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Set default serial port options */
|
||||
PortAddress = 0;
|
||||
PortNumber = 0;
|
||||
BaudRate = 0;
|
||||
|
||||
/* Get debug configuration */
|
||||
Configuration::GetValue(L"DEBUG", &DebugConfiguration);
|
||||
|
||||
/* Make sure any debug options are provided and debug console is not initialized yet */
|
||||
if(DebugConfiguration && EnabledDebugPorts == 0)
|
||||
{
|
||||
/* Find all debug ports */
|
||||
DebugPort = RTL::WideString::TokenizeWideString(DebugConfiguration, L";", &LastPort);
|
||||
|
||||
/* Iterate over all debug ports */
|
||||
while(DebugPort != NULLPTR)
|
||||
{
|
||||
/* Check what port is set for debugging */
|
||||
if(RTL::WideString::CompareWideStringInsensitive(DebugPort, L"COM", 3) == 0)
|
||||
{
|
||||
/* Read COM port number */
|
||||
DebugPort += 3;
|
||||
while(*DebugPort >= '0' && *DebugPort <= '9')
|
||||
{
|
||||
/* Get port number */
|
||||
PortNumber *= 10;
|
||||
PortNumber += *DebugPort - '0';
|
||||
DebugPort++;
|
||||
}
|
||||
|
||||
/* Check if custom COM port address supplied */
|
||||
if(PortNumber == 0 && RTL::WideString::CompareWideStringInsensitive(DebugPort, L":0x", 3) == 0)
|
||||
{
|
||||
/* COM port address provided */
|
||||
DebugPort += 3;
|
||||
while((*DebugPort >= '0' && *DebugPort <= '9') ||
|
||||
(*DebugPort >= 'A' && *DebugPort <= 'F') ||
|
||||
(*DebugPort >= 'a' && *DebugPort <= 'f'))
|
||||
{
|
||||
/* Get port address */
|
||||
PortAddress *= 16;
|
||||
if(*DebugPort >= '0' && *DebugPort <= '9')
|
||||
{
|
||||
PortAddress += *DebugPort - '0';
|
||||
}
|
||||
else if(*DebugPort >= 'A' && *DebugPort <= 'F')
|
||||
{
|
||||
PortAddress += *DebugPort - 'A' + 10;
|
||||
}
|
||||
else if(*DebugPort >= 'a' && *DebugPort <= 'f')
|
||||
{
|
||||
PortAddress += *DebugPort - 'a' + 10;
|
||||
}
|
||||
DebugPort++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Look for additional COM port parameters */
|
||||
if(*DebugPort == ',')
|
||||
{
|
||||
/* Baud rate provided */
|
||||
DebugPort++;
|
||||
while(*DebugPort >= '0' && *DebugPort <= '9')
|
||||
{
|
||||
/* Get baud rate */
|
||||
BaudRate *= 10;
|
||||
BaudRate += *DebugPort - '0';
|
||||
DebugPort++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Enable debug port */
|
||||
EnabledDebugPorts |= XTBL_DEBUGPORT_SERIAL;
|
||||
}
|
||||
else if(RTL::WideString::CompareWideStringInsensitive(DebugPort, L"SCREEN", 5) == 0)
|
||||
{
|
||||
/* Enable debug port */
|
||||
EnabledDebugPorts |= XTBL_DEBUGPORT_SCREEN;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Unsupported debug port specified */
|
||||
Console::Print(L"ERROR: Unsupported debug port ('%S') specified\n", DebugPort);
|
||||
EfiUtils::SleepExecution(3000);
|
||||
}
|
||||
|
||||
/* Take next debug port */
|
||||
DebugPort = RTL::WideString::TokenizeWideString(NULLPTR, L";", &LastPort);
|
||||
}
|
||||
|
||||
/* Check if serial debug port is enabled */
|
||||
if(EnabledDebugPorts & XTBL_DEBUGPORT_SERIAL)
|
||||
{
|
||||
/* Try to initialize COM port */
|
||||
Status = InitializeSerialPort(PortNumber, PortAddress, BaudRate);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Remove serial debug port, as COM port initialization failed and return */
|
||||
EnabledDebugPorts &= ~XTBL_DEBUGPORT_SERIAL;
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* This routine initializes the serial debug console.
|
||||
*
|
||||
* @param PortNumber
|
||||
* Supplies a port number.
|
||||
*
|
||||
* @param PortAddress
|
||||
* Supplies an address of the COM port.
|
||||
*
|
||||
* @param BaudRate
|
||||
* Supplies an optional port baud rate.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Debug::InitializeSerialPort(IN ULONG PortNumber,
|
||||
IN ULONG PortAddress,
|
||||
IN ULONG BaudRate)
|
||||
{
|
||||
EFI_STATUS EfiStatus;
|
||||
XTSTATUS Status;
|
||||
|
||||
/* Check if custom COM port address supplied */
|
||||
if(!PortAddress)
|
||||
{
|
||||
/* We support only a pre-defined number of ports */
|
||||
if(PortNumber > COMPORT_COUNT)
|
||||
{
|
||||
/* Fail if wrong/unsupported port used */
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* Check if serial port is set */
|
||||
if(PortNumber == 0)
|
||||
{
|
||||
/* Use COM1 by default */
|
||||
PortNumber = 1;
|
||||
}
|
||||
|
||||
/* Set custom port address based on the port number and print debug message */
|
||||
PortAddress = ComPortList[PortNumber - 1];
|
||||
Console::Print(L"Initializing serial console at port COM%d\n", PortNumber);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Custom port address supplied, print debug message */
|
||||
Console::Print(L"Initializing serial console at COM port address: 0x%lX\n", PortAddress);
|
||||
}
|
||||
|
||||
/* Initialize COM port */
|
||||
Status = HL::ComPort::InitializeComPort(&SerialPort, (PUCHAR)UlongToPtr(PortAddress), BaudRate);
|
||||
|
||||
/* Port not found under supplied address */
|
||||
if(Status == STATUS_NOT_FOUND && PortAddress)
|
||||
{
|
||||
/* This might be PCI(E) serial controller, try to activate I/O space access first */
|
||||
EfiStatus = ActivateSerialIOController();
|
||||
if(EfiStatus == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Try to reinitialize COM port */
|
||||
Console::Print(L"Enabled I/O space access for all PCI(E) serial controllers found\n");
|
||||
Status = HL::ComPort::InitializeComPort(&SerialPort, (PUCHAR)UlongToPtr(PortAddress), BaudRate);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check COM port initialization status code */
|
||||
if(Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* Serial port initialization failed, mark as not ready */
|
||||
return STATUS_EFI_NOT_READY;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* This routine formats the input string and prints it out to the debug ports.
|
||||
*
|
||||
* @param Format
|
||||
* The formatted string that is to be written to the output.
|
||||
*
|
||||
* @param ...
|
||||
* Depending on the format string, this routine might expect a sequence of additional arguments.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Debug::Print(IN PCWSTR Format,
|
||||
IN ...)
|
||||
{
|
||||
RTL_PRINT_CONTEXT ConsolePrintContext, SerialPrintContext;
|
||||
VA_LIST Arguments;
|
||||
|
||||
/* Check if debugging enabled and if EFI serial port is fully initialized */
|
||||
if(DEBUG)
|
||||
{
|
||||
/* Initialize the print contexts */
|
||||
ConsolePrintContext.WriteWideCharacter = Console::PutChar;
|
||||
SerialPrintContext.WriteWideCharacter = PutChar;
|
||||
|
||||
/* Initialise the va_list */
|
||||
VA_START(Arguments, Format);
|
||||
|
||||
/* Check if serial debug port is enabled */
|
||||
if((EnabledDebugPorts & XTBL_DEBUGPORT_SERIAL) && (SerialPort.Flags & COMPORT_FLAG_INIT))
|
||||
{
|
||||
/* Format and print the string to the serial console */
|
||||
RTL::WideString::FormatWideString(&SerialPrintContext, (PWCHAR)Format, Arguments);
|
||||
}
|
||||
|
||||
/* Check if screen debug port is enabled and Boot Services are still available */
|
||||
if((EnabledDebugPorts & XTBL_DEBUGPORT_SCREEN) && (XtLoader::GetBootServicesStatus() == TRUE))
|
||||
{
|
||||
/* Format and print the string to the screen */
|
||||
RTL::WideString::FormatWideString(&ConsolePrintContext, (PWCHAR)Format, Arguments);
|
||||
}
|
||||
|
||||
/* Clean up the va_list */
|
||||
VA_END(Arguments);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a character to the serial console.
|
||||
*
|
||||
* @param Character
|
||||
* The integer promotion of the character to be written.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
XTSTATUS
|
||||
Debug::PutChar(IN WCHAR Character)
|
||||
{
|
||||
WCHAR Buffer[2];
|
||||
|
||||
/* Write character to the serial console */
|
||||
Buffer[0] = Character;
|
||||
Buffer[1] = 0;
|
||||
return HL::ComPort::WriteComPort(&SerialPort, Buffer[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the serial port has been successfully initialized and is ready for communication.
|
||||
*
|
||||
* @return This routine returns TRUE if the serial port is initialized and ready, FALSE otherwise.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
Debug::SerialPortReady()
|
||||
{
|
||||
return (SerialPort.Flags & COMPORT_FLAG_INIT);
|
||||
}
|
@@ -1,142 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/includes/libxtos.hh
|
||||
* DESCRIPTION: XT Loader to LIBXTOS interface
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTLDR_LIBXTOS_HH
|
||||
#define __XTLDR_LIBXTOS_HH
|
||||
|
||||
#include <xtblapi.h>
|
||||
|
||||
|
||||
/* Minimal forward references for AR classes used by XTLDR */
|
||||
namespace AR
|
||||
{
|
||||
class CpuFunc
|
||||
{
|
||||
public:
|
||||
STATIC XTCDECL BOOLEAN CpuId(IN OUT PCPUID_REGISTERS Registers);
|
||||
STATIC XTCDECL ULONG_PTR ReadControlRegister(IN USHORT ControlRegister);
|
||||
STATIC XTCDECL ULONGLONG ReadModelSpecificRegister(IN ULONG Register);
|
||||
STATIC XTCDECL VOID WriteControlRegister(IN USHORT ControlRegister,
|
||||
IN UINT_PTR Value);
|
||||
};
|
||||
|
||||
class ProcSup
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI VOID GetTrampolineInformation(IN TRAMPOLINE_TYPE TrampolineType,
|
||||
OUT PVOID *TrampolineCode,
|
||||
OUT PULONG_PTR TrampolineSize);
|
||||
};
|
||||
}
|
||||
|
||||
/* Minimal forward references for HL classes used by XTLDR */
|
||||
namespace HL
|
||||
{
|
||||
class ComPort
|
||||
{
|
||||
public:
|
||||
STATIC XTCDECL XTSTATUS InitializeComPort(IN OUT PCPPORT Port,
|
||||
IN PUCHAR PortAddress,
|
||||
IN ULONG BaudRate);
|
||||
STATIC XTCDECL XTSTATUS WriteComPort(IN PCPPORT Port,
|
||||
IN UCHAR Byte);
|
||||
};
|
||||
|
||||
class IoPort
|
||||
{
|
||||
public:
|
||||
STATIC XTCDECL UCHAR ReadPort8(IN USHORT Port);
|
||||
STATIC XTCDECL USHORT ReadPort16(IN USHORT Port);
|
||||
STATIC XTCDECL ULONG ReadPort32(IN USHORT Port);
|
||||
STATIC XTCDECL VOID WritePort8(IN USHORT Port,
|
||||
IN UCHAR Value);
|
||||
STATIC XTCDECL VOID WritePort16(IN USHORT Port,
|
||||
IN USHORT Value);
|
||||
STATIC XTCDECL VOID WritePort32(IN USHORT Port,
|
||||
IN ULONG Value);
|
||||
};
|
||||
}
|
||||
|
||||
/* Minimal forward references for RTL classes used by XTLDR */
|
||||
namespace RTL
|
||||
{
|
||||
class Guid
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI BOOLEAN CompareGuids(IN PGUID Guid1,
|
||||
IN PGUID Guid2);
|
||||
};
|
||||
|
||||
class LinkedList
|
||||
{
|
||||
public:
|
||||
STATIC XTCDECL VOID InitializeListHead(IN PLIST_ENTRY ListHead);
|
||||
STATIC XTCDECL VOID InsertHeadList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry);
|
||||
STATIC XTCDECL VOID InsertTailList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry);
|
||||
STATIC XTCDECL VOID RemoveEntryList(IN PLIST_ENTRY Entry);
|
||||
};
|
||||
|
||||
class Memory
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI SIZE_T CompareMemory(IN PCVOID LeftBuffer,
|
||||
IN PCVOID RightBuffer,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI VOID CopyMemory(OUT PVOID Destination,
|
||||
IN PCVOID Source,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI VOID MoveMemory(OUT PVOID Destination,
|
||||
IN PCVOID Source,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI VOID SetMemory(OUT PVOID Destination,
|
||||
IN UCHAR Byte,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI VOID ZeroMemory(OUT PVOID Destination,
|
||||
IN SIZE_T Length);
|
||||
};
|
||||
|
||||
class String
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI SIZE_T CompareString(IN PCSTR String1,
|
||||
IN PCSTR String2,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI SIZE_T StringLength(IN PCSTR String,
|
||||
IN SIZE_T MaxLength);
|
||||
STATIC XTAPI SIZE_T StringToWideString(OUT PWCHAR Destination,
|
||||
IN PCSTR *Source,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI PCHAR TrimString(IN PCHAR String);
|
||||
};
|
||||
|
||||
class WideString
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI SIZE_T CompareWideString(IN PCWSTR String1,
|
||||
IN PCWSTR String2,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI SIZE_T CompareWideStringInsensitive(IN PCWSTR String1,
|
||||
IN PCWSTR String2,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI PWCHAR ConcatenateWideString(OUT PWCHAR Destination,
|
||||
IN PWCHAR Source,
|
||||
IN SIZE_T Count);
|
||||
STATIC XTAPI XTSTATUS FormatWideString(IN PRTL_PRINT_CONTEXT Context,
|
||||
IN PCWSTR Format,
|
||||
IN VA_LIST ArgumentList);
|
||||
STATIC XTAPI PWCHAR TokenizeWideString(IN PWCHAR String,
|
||||
IN PCWSTR Delimiter,
|
||||
IN OUT PWCHAR *SavePtr);
|
||||
STATIC XTAPI SIZE_T WideStringLength(IN PCWSTR String,
|
||||
IN SIZE_T MaxLength);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTLDR_LIBXTOS_HH */
|
@@ -1,351 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/includes/xtldr.hh
|
||||
* DESCRIPTION: Top level header for XTLDR
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#ifndef __XTLDR_XTLDR_HH
|
||||
#define __XTLDR_XTLDR_HH
|
||||
|
||||
#include <xtblapi.h>
|
||||
#include <xtver.h>
|
||||
|
||||
#include <libxtos.hh>
|
||||
|
||||
|
||||
class BootUtils
|
||||
{
|
||||
public:
|
||||
STATIC XTCDECL BOOLEAN GetBooleanParameter(IN PCWSTR Parameters,
|
||||
IN PCWSTR Needle);
|
||||
};
|
||||
|
||||
class Configuration
|
||||
{
|
||||
private:
|
||||
STATIC PLIST_ENTRY BootMenuList;
|
||||
STATIC LIST_ENTRY Config;
|
||||
STATIC LIST_ENTRY ConfigSections;
|
||||
STATIC PCWSTR EditableConfigOptions[];
|
||||
|
||||
public:
|
||||
STATIC XTCDECL BOOLEAN GetBooleanValue(IN PCWSTR ConfigName);
|
||||
STATIC XTCDECL EFI_STATUS GetBootOptionValue(IN PLIST_ENTRY Options,
|
||||
IN PCWSTR OptionName,
|
||||
OUT PWCHAR *OptionValue);
|
||||
STATIC XTCDECL VOID GetEditableOptions(OUT PCWSTR **OptionsArray,
|
||||
OUT PULONG OptionsCount);
|
||||
STATIC XTCDECL EFI_STATUS GetValue(IN PCWSTR ConfigName,
|
||||
OUT PWCHAR *ConfigValue);
|
||||
STATIC XTCDECL EFI_STATUS InitializeBootMenuList(IN ULONG MaxNameLength,
|
||||
OUT PXTBL_BOOTMENU_ITEM *MenuEntries,
|
||||
OUT PULONG EntriesCount,
|
||||
OUT PULONG DefaultId);
|
||||
STATIC XTCDECL VOID InitializeConfiguration();
|
||||
STATIC XTCDECL EFI_STATUS LoadConfiguration();
|
||||
STATIC XTCDECL EFI_STATUS ParseCommandLine();
|
||||
STATIC XTCDECL EFI_STATUS SetBootOptionValue(IN PLIST_ENTRY Options,
|
||||
IN PCWSTR OptionName,
|
||||
IN PCWSTR OptionValue);
|
||||
|
||||
private:
|
||||
STATIC XTCDECL EFI_STATUS ParseConfigFile(IN CONST PCHAR RawConfig,
|
||||
OUT PLIST_ENTRY Configuration);
|
||||
STATIC XTCDECL EFI_STATUS ReadConfigFile(IN PCWSTR ConfigDirectory,
|
||||
IN PCWSTR ConfigFile,
|
||||
OUT PCHAR *ConfigData);
|
||||
STATIC XTCDECL EFI_STATUS SetValue(IN PCWSTR ConfigName,
|
||||
IN PCWSTR ConfigValue);
|
||||
STATIC XTCDECL VOID UpdateConfiguration(IN PLIST_ENTRY NewConfig);
|
||||
};
|
||||
|
||||
class Console
|
||||
{
|
||||
public:
|
||||
STATIC XTCDECL VOID ClearLine(IN ULONGLONG LineNo);
|
||||
STATIC XTCDECL VOID ClearScreen();
|
||||
STATIC XTCDECL VOID DisableCursor();
|
||||
STATIC XTCDECL VOID EnableCursor();
|
||||
STATIC XTCDECL VOID InitializeConsole();
|
||||
STATIC XTCDECL VOID Print(IN PCWSTR Format,
|
||||
IN ...);
|
||||
STATIC XTCDECL XTSTATUS PutChar(IN WCHAR Character);
|
||||
STATIC XTCDECL VOID QueryMode(OUT PUINT_PTR ResX,
|
||||
OUT PUINT_PTR ResY);
|
||||
STATIC XTCDECL VOID ReadKeyStroke(OUT PEFI_INPUT_KEY Key);
|
||||
STATIC XTCDECL VOID ResetInputBuffer();
|
||||
STATIC XTCDECL VOID SetAttributes(IN ULONGLONG Attributes);
|
||||
STATIC XTCDECL VOID SetCursorPosition(IN ULONGLONG PosX,
|
||||
IN ULONGLONG PosY);
|
||||
STATIC XTCDECL VOID Write(IN PCWSTR String);
|
||||
|
||||
private:
|
||||
STATIC XTCDECL EFI_STATUS SetMode(IN ULONGLONG Mode);
|
||||
};
|
||||
|
||||
class Debug
|
||||
{
|
||||
private:
|
||||
STATIC ULONG ComPortList[COMPORT_COUNT];
|
||||
STATIC ULONG EnabledDebugPorts;
|
||||
STATIC CPPORT SerialPort;
|
||||
|
||||
public:
|
||||
STATIC XTCDECL EFI_STATUS InitializeDebugConsole();
|
||||
STATIC XTCDECL VOID Print(IN PCWSTR Format,
|
||||
IN ...);
|
||||
STATIC XTCDECL XTSTATUS PutChar(IN WCHAR Character);
|
||||
STATIC XTCDECL BOOLEAN SerialPortReady();
|
||||
|
||||
private:
|
||||
STATIC XTCDECL EFI_STATUS ActivateSerialIOController();
|
||||
STATIC XTCDECL EFI_STATUS InitializeSerialPort(IN ULONG PortNumber,
|
||||
IN ULONG PortAddress,
|
||||
IN ULONG BaudRate);
|
||||
};
|
||||
|
||||
class EfiUtils
|
||||
{
|
||||
public:
|
||||
STATIC XTCDECL EFI_STATUS EnterFirmwareSetup();
|
||||
STATIC XTCDECL EFI_STATUS ExitBootServices();
|
||||
STATIC XTCDECL EFI_STATUS GetConfigurationTable(IN PEFI_GUID TableGuid,
|
||||
OUT PVOID *Table);
|
||||
STATIC XTCDECL EFI_STATUS GetEfiVariable(IN PEFI_GUID Vendor,
|
||||
IN PCWSTR VariableName,
|
||||
OUT PVOID *VariableValue);
|
||||
STATIC XTCDECL ULONGLONG GetRandomValue(IN OUT PULONGLONG RNGBuffer);
|
||||
STATIC XTCDECL INT_PTR GetSecureBootStatus();
|
||||
STATIC XTCDECL EFI_STATUS InitializeEntropy(PULONGLONG RNGBuffer);
|
||||
STATIC XTCDECL EFI_STATUS LoadEfiImage(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath,
|
||||
IN PVOID ImageData,
|
||||
IN SIZE_T ImageSize,
|
||||
OUT PEFI_HANDLE ImageHandle);
|
||||
STATIC XTCDECL EFI_STATUS RebootSystem();
|
||||
STATIC XTCDECL EFI_STATUS SetEfiVariable(IN PEFI_GUID Vendor,
|
||||
IN PCWSTR VariableName,
|
||||
IN PVOID VariableValue,
|
||||
IN UINT_PTR Size);
|
||||
STATIC XTCDECL EFI_STATUS ShutdownSystem();
|
||||
STATIC XTCDECL VOID SleepExecution(IN ULONG_PTR Milliseconds);
|
||||
STATIC XTCDECL EFI_STATUS StartEfiImage(IN EFI_HANDLE ImageHandle);
|
||||
STATIC XTCDECL EFI_STATUS WaitForEfiEvent(IN UINT_PTR NumberOfEvents,
|
||||
IN PEFI_EVENT Event,
|
||||
OUT PUINT_PTR Index);
|
||||
};
|
||||
|
||||
class Memory
|
||||
{
|
||||
public:
|
||||
STATIC XTCDECL EFI_STATUS AllocatePages(IN EFI_ALLOCATE_TYPE AllocationType,
|
||||
IN ULONGLONG NumberOfPages,
|
||||
OUT PEFI_PHYSICAL_ADDRESS Memory);
|
||||
STATIC XTCDECL EFI_STATUS AllocatePool(IN UINT_PTR Size,
|
||||
OUT PVOID *Memory);
|
||||
STATIC XTCDECL EFI_STATUS BuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR SelfMapAddress);
|
||||
STATIC XTCDECL EFI_STATUS FreePages(IN ULONGLONG NumberOfPages,
|
||||
IN EFI_PHYSICAL_ADDRESS Memory);
|
||||
STATIC XTCDECL EFI_STATUS FreePool(IN PVOID Memory);
|
||||
STATIC XTCDECL VOID GetMappingsCount(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
OUT PULONG NumberOfMappings);
|
||||
STATIC XTCDECL EFI_STATUS GetMemoryMap(OUT PEFI_MEMORY_MAP MemoryMap);
|
||||
STATIC XTCDECL PVOID GetVirtualAddress(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN PVOID PhysicalAddress);
|
||||
STATIC XTCDECL VOID InitializePageMap(OUT PXTBL_PAGE_MAPPING PageMap,
|
||||
IN SHORT PageMapLevel,
|
||||
IN PAGE_SIZE PageSize);
|
||||
STATIC XTCDECL EFI_STATUS MapEfiMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
||||
IN OUT PVOID *MemoryMapAddress,
|
||||
IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine);
|
||||
STATIC XTCDECL EFI_STATUS MapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR VirtualAddress,
|
||||
IN ULONG_PTR PhysicalAddress,
|
||||
IN ULONG NumberOfPages);
|
||||
STATIC XTCDECL EFI_STATUS MapVirtualMemory(IN OUT PXTBL_PAGE_MAPPING PageMap,
|
||||
IN PVOID VirtualAddress,
|
||||
IN PVOID PhysicalAddress,
|
||||
IN ULONGLONG NumberOfPages,
|
||||
IN LOADER_MEMORY_TYPE MemoryType);
|
||||
STATIC XTCDECL PVOID PhysicalAddressToVirtual(IN PVOID PhysicalAddress,
|
||||
IN PVOID PhysicalBase,
|
||||
IN PVOID VirtualBase);
|
||||
STATIC XTCDECL EFI_STATUS PhysicalListToVirtual(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN OUT PLIST_ENTRY ListHead,
|
||||
IN PVOID PhysicalBase,
|
||||
IN PVOID VirtualBase);
|
||||
|
||||
private:
|
||||
STATIC XTCDECL LOADER_MEMORY_TYPE GetLoaderMemoryType(IN EFI_MEMORY_TYPE EfiMemoryType);
|
||||
STATIC XTCDECL EFI_STATUS GetNextPageTable(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN PVOID PageTable,
|
||||
IN SIZE_T Entry,
|
||||
OUT PVOID *NextPageTable);
|
||||
STATIC XTCDECL EFI_STATUS SelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR SelfMapAddress);
|
||||
};
|
||||
|
||||
class Protocol
|
||||
{
|
||||
private:
|
||||
STATIC LIST_ENTRY BootProtocols;
|
||||
STATIC XTBL_LOADER_PROTOCOL LoaderProtocol;
|
||||
STATIC LIST_ENTRY LoadedModules;
|
||||
|
||||
public:
|
||||
STATIC XTCDECL EFI_STATUS CloseProtocol(IN PEFI_HANDLE Handle,
|
||||
IN PEFI_GUID ProtocolGuid);
|
||||
STATIC XTCDECL EFI_STATUS FindBootProtocol(IN PCWSTR SystemType,
|
||||
OUT PEFI_GUID BootProtocolGuid);
|
||||
STATIC XTCDECL PLIST_ENTRY GetModulesList();
|
||||
STATIC XTCDECL EFI_STATUS InstallProtocol(IN PVOID Interface,
|
||||
IN PEFI_GUID Guid);
|
||||
STATIC XTCDECL VOID InitializeProtocol();
|
||||
STATIC XTCDECL EFI_STATUS InvokeBootProtocol(IN PWCHAR ShortName,
|
||||
IN PLIST_ENTRY OptionsList);
|
||||
STATIC XTCDECL EFI_STATUS LoadModule(IN PWCHAR ModuleName);
|
||||
STATIC XTCDECL EFI_STATUS LoadModules(IN PWCHAR ModulesList);
|
||||
STATIC XTCDECL EFI_STATUS LocateProtocolHandles(OUT PEFI_HANDLE *Handles,
|
||||
OUT PUINT_PTR Count,
|
||||
IN PEFI_GUID ProtocolGuid);
|
||||
STATIC XTCDECL EFI_STATUS OpenProtocol(OUT PEFI_HANDLE Handle,
|
||||
OUT PVOID *ProtocolHandler,
|
||||
IN PEFI_GUID ProtocolGuid);
|
||||
STATIC XTCDECL EFI_STATUS OpenProtocolHandle(IN EFI_HANDLE Handle,
|
||||
OUT PVOID *ProtocolHandler,
|
||||
IN PEFI_GUID ProtocolGuid);
|
||||
STATIC XTCDECL EFI_STATUS RegisterBootProtocol(IN PCWSTR SystemType,
|
||||
IN PEFI_GUID BootProtocolGuid);
|
||||
STATIC XTCDECL EFI_STATUS InstallXtLoaderProtocol();
|
||||
|
||||
private:
|
||||
STATIC XTCDECL EFI_STATUS GetModuleInformation(IN PWCHAR SectionData,
|
||||
IN ULONG SectionSize,
|
||||
OUT PXTBL_MODULE_INFO ModuleInfo);
|
||||
STATIC XTCDECL EFI_STATUS GetModuleInfoStrings(IN PWCHAR SectionData,
|
||||
IN ULONG SectionSize,
|
||||
OUT PWCHAR **ModInfo,
|
||||
OUT PULONG InfoCount);
|
||||
};
|
||||
|
||||
class Shell
|
||||
{
|
||||
public:
|
||||
STATIC XTCDECL VOID StartLoaderShell();
|
||||
|
||||
private:
|
||||
STATIC XTCDECL VOID PrintPrompt();
|
||||
};
|
||||
|
||||
class TextUi
|
||||
{
|
||||
public:
|
||||
STATIC XTCDECL VOID DisplayBootMenu();
|
||||
STATIC XTCDECL VOID DisplayErrorDialog(IN PCWSTR Caption,
|
||||
IN PCWSTR Message);
|
||||
STATIC XTCDECL VOID DisplayInfoDialog(IN PCWSTR Caption,
|
||||
IN PCWSTR Message);
|
||||
STATIC XTCDECL VOID DisplayInputDialog(IN PCWSTR Caption,
|
||||
IN PCWSTR Message,
|
||||
IN OUT PWCHAR *InputFieldText);
|
||||
STATIC XTCDECL XTBL_DIALOG_HANDLE DisplayProgressDialog(IN PCWSTR Caption,
|
||||
IN PCWSTR Message,
|
||||
IN UCHAR Percentage);
|
||||
STATIC XTCDECL VOID UpdateProgressBar(IN PXTBL_DIALOG_HANDLE Handle,
|
||||
IN PCWSTR Message,
|
||||
IN UCHAR Percentage);
|
||||
|
||||
private:
|
||||
STATIC XTCDECL VOID DetermineDialogBoxSize(IN OUT PXTBL_DIALOG_HANDLE Handle,
|
||||
IN PCWSTR Message);
|
||||
STATIC XTCDECL VOID DisplayEditMenu(IN PXTBL_BOOTMENU_ITEM MenuEntry);
|
||||
STATIC XTCDECL VOID DrawBootMenu(OUT PXTBL_DIALOG_HANDLE Handle);
|
||||
STATIC XTCDECL VOID DrawBootMenuEntry(IN PXTBL_DIALOG_HANDLE Handle,
|
||||
IN PWCHAR MenuEntry,
|
||||
IN UINT Position,
|
||||
IN BOOLEAN Highlighted);
|
||||
STATIC XTCDECL VOID DrawDialogBox(IN OUT PXTBL_DIALOG_HANDLE Handle,
|
||||
IN PCWSTR Caption,
|
||||
IN PCWSTR Message);
|
||||
STATIC XTCDECL VOID DrawButton(IN PXTBL_DIALOG_HANDLE Handle);
|
||||
STATIC XTCDECL VOID DrawInputField(IN PXTBL_DIALOG_HANDLE Handle,
|
||||
IN PWCHAR InputFieldText);
|
||||
STATIC XTCDECL VOID DrawMessage(IN PXTBL_DIALOG_HANDLE Handle,
|
||||
IN PCWSTR Message);
|
||||
STATIC XTCDECL VOID DrawProgressBar(IN PXTBL_DIALOG_HANDLE Handle,
|
||||
IN UCHAR Percentage);
|
||||
STATIC XTCDECL VOID DrawEditMenu(OUT PXTBL_DIALOG_HANDLE Handle);
|
||||
STATIC XTCDECL EFI_STATUS DrawEditMenuEntry(IN PXTBL_DIALOG_HANDLE Handle,
|
||||
IN PCWSTR OptionName,
|
||||
IN PCWSTR OptionValue,
|
||||
IN UINT Position,
|
||||
IN BOOLEAN Highlighted);
|
||||
};
|
||||
|
||||
class Volume
|
||||
{
|
||||
private:
|
||||
STATIC LIST_ENTRY EfiBlockDevices;
|
||||
|
||||
public:
|
||||
STATIC XTCDECL EFI_STATUS CloseVolume(IN PEFI_HANDLE VolumeHandle);
|
||||
STATIC XTCDECL EFI_STATUS EnumerateBlockDevices();
|
||||
STATIC XTCDECL EFI_STATUS FindDevicePath(IN PEFI_DEVICE_PATH_PROTOCOL FsHandle,
|
||||
IN CONST PWCHAR FileSystemPath,
|
||||
OUT PEFI_DEVICE_PATH_PROTOCOL* DevicePath);
|
||||
STATIC XTCDECL EFI_STATUS GetEfiPath(IN PWCHAR SystemPath,
|
||||
OUT PWCHAR *EfiPath);
|
||||
STATIC XTCDECL EFI_STATUS GetDevicePath(IN PWCHAR SystemPath,
|
||||
OUT PEFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT PWCHAR *ArcName,
|
||||
OUT PWCHAR *Path);
|
||||
STATIC XTCDECL EFI_STATUS OpenVolume(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath,
|
||||
OUT PEFI_HANDLE DiskHandle,
|
||||
OUT PEFI_FILE_HANDLE *FsHandle);
|
||||
STATIC XTCDECL EFI_STATUS ReadFile(IN PEFI_FILE_HANDLE DirHandle,
|
||||
IN PCWSTR FileName,
|
||||
OUT PVOID *FileData,
|
||||
OUT PSIZE_T FileSize);
|
||||
|
||||
|
||||
private:
|
||||
STATIC XTCDECL EFI_STATUS DiscoverEfiBlockDevices(OUT PLIST_ENTRY BlockDevices);
|
||||
STATIC XTCDECL EFI_STATUS DissectArcPath(IN PWCHAR SystemPath,
|
||||
OUT PWCHAR *ArcName,
|
||||
OUT PWCHAR *Path,
|
||||
OUT PUSHORT DriveType,
|
||||
OUT PULONG DriveNumber,
|
||||
OUT PULONG PartNumber);
|
||||
STATIC XTCDECL PEFI_DEVICE_PATH_PROTOCOL DuplicateDevicePath(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath);
|
||||
STATIC XTCDECL EFI_STATUS FindLastBlockDeviceNode(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath,
|
||||
OUT PEFI_DEVICE_PATH_PROTOCOL *LastNode);
|
||||
STATIC XTCDECL BOOLEAN FindParentBlockDevice(IN PLIST_ENTRY BlockDevices,
|
||||
IN PEFI_BLOCK_DEVICE_DATA ChildNode,
|
||||
OUT PEFI_BLOCK_DEVICE_DATA *ParentNode);
|
||||
};
|
||||
|
||||
class XtLoader
|
||||
{
|
||||
private:
|
||||
STATIC PBL_XT_BOOT_MENU BootMenu;
|
||||
STATIC EFI_HANDLE EfiImageHandle;
|
||||
STATIC PEFI_SYSTEM_TABLE EfiSystemTable;
|
||||
STATIC XTBL_STATUS LoaderStatus;
|
||||
|
||||
public:
|
||||
STATIC XTCDECL VOID DisableBootServices();
|
||||
STATIC XTCDECL BOOLEAN GetBootServicesStatus();
|
||||
STATIC XTCDECL EFI_HANDLE GetEfiImageHandle();
|
||||
STATIC XTCDECL PEFI_SYSTEM_TABLE GetEfiSystemTable();
|
||||
STATIC XTCDECL VOID GetLoaderImageInformation(PVOID *LoaderBase,
|
||||
PULONGLONG LoaderSize);
|
||||
STATIC XTCDECL INT_PTR GetSecureBootStatus();
|
||||
STATIC XTCDECL VOID InitializeBootLoader(IN EFI_HANDLE ImageHandle,
|
||||
IN PEFI_SYSTEM_TABLE SystemTable);
|
||||
STATIC XTCDECL VOID RegisterBootMenu(IN PVOID BootMenuRoutine);
|
||||
STATIC XTCDECL VOID ShowBootMenu();
|
||||
};
|
||||
|
||||
#endif /* __XTLDR_XTLDR_HH */
|
@@ -1,439 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/modules/acpi/acpi.cc
|
||||
* DESCRIPTION: XTLDR ACPI Support Module
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <acpi.hh>
|
||||
|
||||
|
||||
/* ACPI module information */
|
||||
MODULE_AUTHOR(L"Rafal Kupiec <belliash@codingworkshop.eu.org>");
|
||||
MODULE_DESCRIPTION(L"ACPI support");
|
||||
MODULE_LICENSE(L"GPLv3");
|
||||
MODULE_VERSION(L"0.1");
|
||||
|
||||
|
||||
/**
|
||||
* Attempts to get XSDP. If it is not found or checksum mismatch, it will try to get RSDP instead.
|
||||
*
|
||||
* @param AcpiTable
|
||||
* Suplies a pointer to memory area where XSDP or RSRP address will be stored.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Acpi::GetAcpiDescriptionPointer(OUT PVOID *AcpiTable)
|
||||
{
|
||||
PVOID Rsdp;
|
||||
|
||||
/* Try to get XSDP (ACPI 2.0) from system configuration tables */
|
||||
if(GetXsdpTable(&Rsdp) == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* XSDP found, return success */
|
||||
*AcpiTable = Rsdp;
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/* Try to get RSDP (ACPI 1.0) from system configuration tables */
|
||||
if(GetRsdpTable(&Rsdp) == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* RSDP found, return success */
|
||||
*AcpiTable = Rsdp;
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/* Neither XSDP nor RSDP found */
|
||||
return STATUS_EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds ACPI description table with given signature.
|
||||
*
|
||||
* @param Signature
|
||||
* Supplies the signature of the desired ACPI table.
|
||||
*
|
||||
* @param PreviousTable
|
||||
* Supplies a pointer to the table to start searching from.
|
||||
*
|
||||
* @param AcpiTable
|
||||
* Supplies a pointer to memory area where ACPI table address will be stored, or NULLPTR if not found.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Acpi::GetAcpiTable(IN CONST UINT Signature,
|
||||
IN PVOID PreviousTable,
|
||||
OUT PVOID *AcpiTable)
|
||||
{
|
||||
PACPI_DESCRIPTION_HEADER TableHeader;
|
||||
SIZE_T RsdtIndex, TableIndex;
|
||||
EFI_STATUS Status;
|
||||
SIZE_T TableCount;
|
||||
PACPI_RSDP Rsdp;
|
||||
PACPI_RSDT Rsdt;
|
||||
BOOLEAN Xsdp;
|
||||
|
||||
/* Return NULLPTR by default if requested table not found */
|
||||
*AcpiTable = NULLPTR;
|
||||
|
||||
/* Get Root System Description Table Pointer */
|
||||
Status = GetAcpiDescriptionPointer((PVOID*)&Rsdp);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* ACPI tables not found, return error */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Check if it is XSDP (ACPI 2.0) or RSDP (ACPI 1.0) */
|
||||
if(Rsdp->Revision >= 2 && Rsdp->XsdtAddress)
|
||||
{
|
||||
/* XSDP (ACPI 2.0) */
|
||||
Xsdp = TRUE;
|
||||
Rsdt = (PACPI_RSDT)(UINT_PTR)Rsdp->XsdtAddress;
|
||||
TableCount = (Rsdt->Header.Length - sizeof(ACPI_DESCRIPTION_HEADER)) / 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* RSDP (ACPI 1.0) */
|
||||
Xsdp = FALSE;
|
||||
Rsdt = (PACPI_RSDT)(UINT_PTR)Rsdp->RsdtAddress;
|
||||
TableCount = (Rsdt->Header.Length - sizeof(ACPI_DESCRIPTION_HEADER)) / 4;
|
||||
}
|
||||
|
||||
/* Iterate over all ACPI tables */
|
||||
for(TableIndex = 0; TableIndex < TableCount; TableIndex++)
|
||||
{
|
||||
/* Get table headers in reverse order */
|
||||
RsdtIndex = TableCount - TableIndex - 1;
|
||||
|
||||
/* Check if XSDP or RSDT is used */
|
||||
if(Xsdp)
|
||||
{
|
||||
/* Get table header from XSDT */
|
||||
TableHeader = (PACPI_DESCRIPTION_HEADER)(ULONG_PTR)((PULONGLONG)Rsdt->Tables)[RsdtIndex];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Get table header from RSDT */
|
||||
TableHeader = (PACPI_DESCRIPTION_HEADER)(ULONG_PTR)((PULONG)Rsdt->Tables)[RsdtIndex];
|
||||
}
|
||||
|
||||
/* Check if previous table provided */
|
||||
if(PreviousTable != NULLPTR)
|
||||
{
|
||||
/* Check if this is a table previously found */
|
||||
if(TableHeader == (PVOID)PreviousTable)
|
||||
{
|
||||
/* Unset previous table */
|
||||
PreviousTable = NULLPTR;
|
||||
}
|
||||
|
||||
/* Skip to next ACPI table */
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Verify table signature */
|
||||
if((TableHeader->Signature == Signature))
|
||||
{
|
||||
/* Found requested ACPI table */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Make sure table was found */
|
||||
if(TableHeader->Signature != Signature)
|
||||
{
|
||||
/* ACPI table not found, return error */
|
||||
return STATUS_EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/* Don't validate FADT on old, broken firmwares with ACPI 2.0 or older */
|
||||
if(TableHeader->Signature != ACPI_FADT_SIGNATURE || TableHeader->Revision > 2)
|
||||
{
|
||||
/* Validate table checksum */
|
||||
if(!ValidateAcpiTable(TableHeader, TableHeader->Length))
|
||||
{
|
||||
/* Checksum mismatch, return error */
|
||||
return STATUS_EFI_CRC_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
/* Found valid ACPI table, return success */
|
||||
*AcpiTable = TableHeader;
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the Advanced Programmable Interrupt Controller (APIC) base address.
|
||||
*
|
||||
* @param ApicBase
|
||||
* Supplies a pointer to memory area where APIC base address will be stored.
|
||||
*
|
||||
* @return This routine returns an EFI status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Acpi::GetApicBase(OUT PVOID *ApicBase)
|
||||
{
|
||||
CPUID_REGISTERS CpuRegisters;
|
||||
|
||||
/* Prepare CPUID registers to query for APIC support */
|
||||
XtLdrProtocol->Memory.ZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
||||
CpuRegisters.Leaf = CPUID_GET_STANDARD1_FEATURES;
|
||||
|
||||
/* Query CPUID */
|
||||
XtLdrProtocol->Cpu.CpuId(&CpuRegisters);
|
||||
|
||||
/* Check if APIC present */
|
||||
if((CpuRegisters.Edx & CPUID_FEATURES_EDX_APIC) == 0)
|
||||
{
|
||||
/* APIC is not supported by the CPU */
|
||||
return STATUS_EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
/* Get APIC base address */
|
||||
*ApicBase = (PVOID)((UINT_PTR)XtLdrProtocol->Cpu.ReadModelSpecificRegister(0x1B) & 0xFFFFF000);
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets RSDP (ACPI 1.0) from EFI system configuration
|
||||
*
|
||||
* @param AcpiTable
|
||||
* Suplies a pointer to memory area where RSDP address will be stored.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Acpi::GetRsdpTable(OUT PVOID *AcpiTable)
|
||||
{
|
||||
EFI_GUID AcpiGuid = EFI_CONFIG_TABLE_ACPI_TABLE_GUID;
|
||||
EFI_STATUS Status;
|
||||
PVOID RsdpTable;
|
||||
|
||||
/* Get RSDP (ACPI 1.0) table from system configuration tables */
|
||||
Status = XtLdrProtocol->Utils.GetConfigurationTable(&AcpiGuid, &RsdpTable);
|
||||
if(Status != STATUS_EFI_SUCCESS || !ValidateAcpiTable(RsdpTable, 20))
|
||||
{
|
||||
/* RSDP not found or checksum mismatch */
|
||||
*AcpiTable = NULLPTR;
|
||||
return STATUS_EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/* RSDP found, return success */
|
||||
*AcpiTable = RsdpTable;
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets SMBIOS from EFI system configuration
|
||||
*
|
||||
* @param SmBiosTable
|
||||
* Suplies a pointer to memory area where SMBIOS address will be stored.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Acpi::GetSMBiosTable(OUT PVOID *SmBiosTable)
|
||||
{
|
||||
EFI_GUID SmBiosGuid = EFI_CONFIG_TABLE_SMBIOS_TABLE_GUID;
|
||||
PSMBIOS_TABLE_HEADER SmBios;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Get SMBIOS table from system configuration tables */
|
||||
Status = XtLdrProtocol->Utils.GetConfigurationTable(&SmBiosGuid, (PVOID*)&SmBios);
|
||||
if(Status != STATUS_EFI_SUCCESS || !ValidateAcpiTable(SmBios, SmBios->Length))
|
||||
{
|
||||
/* SMBIOS not found or checksum mismatch */
|
||||
*SmBiosTable = NULLPTR;
|
||||
return STATUS_EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/* SMBIOS found, return success */
|
||||
*SmBiosTable = SmBios;
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets SMBIOS3 from EFI system configuration
|
||||
*
|
||||
* @param SmBiosTable
|
||||
* Suplies a pointer to memory area where SMBIOS3 address will be stored.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Acpi::GetSMBios3Table(OUT PVOID *SmBiosTable)
|
||||
{
|
||||
EFI_GUID SmBios3Guid = EFI_CONFIG_TABLE_SMBIOS3_TABLE_GUID;
|
||||
PSMBIOS3_TABLE_HEADER SmBios;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Get SMBIOS3 table from system configuration tables */
|
||||
Status = XtLdrProtocol->Utils.GetConfigurationTable(&SmBios3Guid, (PVOID*)&SmBios);
|
||||
if(Status != STATUS_EFI_SUCCESS || !ValidateAcpiTable(SmBios, SmBios->Length))
|
||||
{
|
||||
/* SMBIOS3 not found or checksum mismatch */
|
||||
*SmBiosTable = NULLPTR;
|
||||
return STATUS_EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/* SMBIOS3 found, return success */
|
||||
*SmBiosTable = SmBios;
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets XSDP (ACPI 2.0) from EFI system configuration
|
||||
*
|
||||
* @param AcpiTable
|
||||
* Suplies a pointer to memory area where XSDP address will be stored.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Acpi::GetXsdpTable(OUT PVOID *AcpiTable)
|
||||
{
|
||||
EFI_GUID AcpiGuid = EFI_CONFIG_TABLE_ACPI20_TABLE_GUID;
|
||||
EFI_STATUS Status;
|
||||
PVOID XsdpTable;
|
||||
|
||||
/* Get XSDP (ACPI 2.0) from system configuration tables */
|
||||
Status = XtLdrProtocol->Utils.GetConfigurationTable(&AcpiGuid, &XsdpTable);
|
||||
if(Status != STATUS_EFI_SUCCESS || !ValidateAcpiTable(XsdpTable, 36))
|
||||
{
|
||||
/* XSDP not found or checksum mismatch */
|
||||
*AcpiTable = NULLPTR;
|
||||
return STATUS_EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/* XSDP found, return success */
|
||||
*AcpiTable = XsdpTable;
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes ACPI module by opening XTLDR protocol and installing ACPI protocol.
|
||||
*
|
||||
* @param ImageHandle
|
||||
* Firmware-allocated handle that identifies the image.
|
||||
*
|
||||
* @param SystemTable
|
||||
* Provides the EFI system table.
|
||||
*
|
||||
* @return This routine returns status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Acpi::InitializeModule(IN EFI_HANDLE ImageHandle,
|
||||
IN PEFI_SYSTEM_TABLE SystemTable)
|
||||
{
|
||||
EFI_GUID Guid = XT_ACPI_PROTOCOL_GUID;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Open the XTLDR protocol */
|
||||
Status = BlGetXtLdrProtocol(SystemTable, ImageHandle, &XtLdrProtocol);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to open the protocol, return error */
|
||||
return STATUS_EFI_PROTOCOL_ERROR;
|
||||
}
|
||||
|
||||
/* Set routines available via ACPI protocol */
|
||||
AcpiProtocol.GetAcpiDescriptionPointer = GetAcpiDescriptionPointer;
|
||||
AcpiProtocol.GetAcpiTable = GetAcpiTable;
|
||||
AcpiProtocol.GetApicBase = GetApicBase;
|
||||
AcpiProtocol.GetRsdpTable = GetRsdpTable;
|
||||
AcpiProtocol.GetSMBiosTable = GetSMBiosTable;
|
||||
AcpiProtocol.GetSMBios3Table = GetSMBios3Table;
|
||||
AcpiProtocol.GetXsdpTable = GetXsdpTable;
|
||||
|
||||
/* Install ACPI protocol */
|
||||
return XtLdrProtocol->Protocol.Install(&AcpiProtocol, &Guid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates given ACPI table by calculating its checksum.
|
||||
*
|
||||
* @param Buffer
|
||||
* Supplies a pointer to the table to checksum.
|
||||
*
|
||||
* @param Size
|
||||
* Supplies the size of the table, in bytes.
|
||||
*
|
||||
* @return This routine returns TRUE if the table is valid, or FALSE otherwise.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
Acpi::ValidateAcpiTable(IN PVOID Buffer,
|
||||
IN UINT_PTR Size)
|
||||
{
|
||||
PUCHAR Pointer;
|
||||
UCHAR Sum;
|
||||
|
||||
/* Initialize variables */
|
||||
Sum = 0;
|
||||
Pointer = (PUCHAR)Buffer;
|
||||
|
||||
/* Calculate checksum of given table */
|
||||
while(Size != 0)
|
||||
{
|
||||
Sum = (UCHAR)(Sum + *Pointer);
|
||||
Pointer += 1;
|
||||
Size -= 1;
|
||||
}
|
||||
|
||||
/* Return calculated checksum */
|
||||
return (Sum == 0) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* This routine is the entry point of the XT EFI boot loader module.
|
||||
*
|
||||
* @param ImageHandle
|
||||
* Firmware-allocated handle that identifies the image.
|
||||
*
|
||||
* @param SystemTable
|
||||
* Provides the EFI system table.
|
||||
*
|
||||
* @return This routine returns status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
XtLdrModuleMain(IN EFI_HANDLE ImageHandle,
|
||||
IN PEFI_SYSTEM_TABLE SystemTable)
|
||||
{
|
||||
/* Initialize ACPI module */
|
||||
return Acpi::InitializeModule(ImageHandle, SystemTable);
|
||||
}
|
@@ -1,40 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/modules/acpi/includes/acpi.hh
|
||||
* DESCRIPTION: XTLDR ACPI module header file
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#ifndef __XTLDR_ACPI_ACPI_HH
|
||||
#define __XTLDR_ACPI_ACPI_HH
|
||||
|
||||
#include <xtblapi.h>
|
||||
|
||||
|
||||
/* ACPI module for XTLDR */
|
||||
class Acpi
|
||||
{
|
||||
private:
|
||||
STATIC XTBL_ACPI_PROTOCOL AcpiProtocol;
|
||||
STATIC PXTBL_LOADER_PROTOCOL XtLdrProtocol;
|
||||
|
||||
public:
|
||||
STATIC XTCDECL EFI_STATUS GetAcpiDescriptionPointer(OUT PVOID *AcpiTable);
|
||||
STATIC XTCDECL EFI_STATUS GetAcpiTable(IN CONST UINT Signature,
|
||||
IN PVOID PreviousTable,
|
||||
OUT PVOID *AcpiTable);
|
||||
STATIC XTCDECL EFI_STATUS GetApicBase(OUT PVOID *ApicBase);
|
||||
STATIC XTCDECL EFI_STATUS GetRsdpTable(OUT PVOID *AcpiTable);
|
||||
STATIC XTCDECL EFI_STATUS GetSMBiosTable(OUT PVOID *SmBiosTable);
|
||||
STATIC XTCDECL EFI_STATUS GetSMBios3Table(OUT PVOID *SmBiosTable);
|
||||
STATIC XTCDECL EFI_STATUS GetXsdpTable(OUT PVOID *AcpiTable);
|
||||
STATIC XTCDECL EFI_STATUS InitializeModule(IN EFI_HANDLE ImageHandle,
|
||||
IN PEFI_SYSTEM_TABLE SystemTable);
|
||||
|
||||
private:
|
||||
STATIC XTCDECL BOOLEAN ValidateAcpiTable(IN PVOID Buffer,
|
||||
IN UINT_PTR Size);
|
||||
};
|
||||
|
||||
#endif /* __XTLDR_ACPI_ACPI_HH */
|
@@ -1,32 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/modules/beep/includes/beep.hh
|
||||
* DESCRIPTION: XTLDR Beep Module header file
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#ifndef __XTLDR_BEEP_BEEP_HH
|
||||
#define __XTLDR_BEEP_BEEP_HH
|
||||
|
||||
#include <xtblapi.h>
|
||||
|
||||
|
||||
/* BEEP module for XTLDR */
|
||||
class Beep
|
||||
{
|
||||
private:
|
||||
STATIC PXTBL_LOADER_PROTOCOL XtLdrProtocol;
|
||||
|
||||
public:
|
||||
STATIC XTCDECL EFI_STATUS InitializeModule(IN EFI_HANDLE ImageHandle,
|
||||
IN PEFI_SYSTEM_TABLE SystemTable);
|
||||
STATIC XTCDECL VOID PlayTune(IN PWCHAR Arguments);
|
||||
|
||||
private:
|
||||
STATIC XTCDECL VOID DisableToneBeep();
|
||||
STATIC XTCDECL VOID EnableToneBeep(IN UINT Pitch);
|
||||
STATIC XTCDECL UINT WideStringToNumber(IN PWCHAR String);
|
||||
};
|
||||
|
||||
#endif /* __XTLDR_BEEP_BEEP_HH */
|
@@ -1,28 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/modules/chainldr/includes/chainldr.hh
|
||||
* DESCRIPTION: XTLDR Chain Loader header file
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#ifndef __XTLDR_CHAINLDR_CHAINLDR_HH
|
||||
#define __XTLDR_CHAINLDR_CHAINLDR_HH
|
||||
|
||||
#include <xtblapi.h>
|
||||
|
||||
|
||||
/* CHAINLDR module for XTLDR */
|
||||
class ChainLoader
|
||||
{
|
||||
private:
|
||||
STATIC XTBL_BOOT_PROTOCOL BootProtocol;
|
||||
STATIC PXTBL_LOADER_PROTOCOL XtLdrProtocol;
|
||||
|
||||
public:
|
||||
STATIC XTCDECL EFI_STATUS BootSystem(IN PXTBL_BOOT_PARAMETERS Parameters);
|
||||
STATIC XTCDECL EFI_STATUS InitializeModule(IN EFI_HANDLE ImageHandle,
|
||||
IN PEFI_SYSTEM_TABLE SystemTable);
|
||||
};
|
||||
|
||||
#endif /* __XTLDR_CHAINLDR_CHAINLDR_HH */
|
@@ -1,28 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/modules/dummy/includes/dummy.hh
|
||||
* DESCRIPTION: XTLDR Dummy Module header file
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#ifndef __XTLDR_DUMMY_DUMMY_HH
|
||||
#define __XTLDR_DUMMY_DUMMY_HH
|
||||
|
||||
#include <xtblapi.h>
|
||||
|
||||
|
||||
/* DUMMY module for XTLDR */
|
||||
class Dummy
|
||||
{
|
||||
private:
|
||||
STATIC XTBL_BOOT_PROTOCOL DummyProtocol;
|
||||
STATIC PXTBL_LOADER_PROTOCOL XtLdrProtocol;
|
||||
|
||||
public:
|
||||
STATIC EFI_STATUS BootSystem(IN PXTBL_BOOT_PARAMETERS Parameters);
|
||||
STATIC EFI_STATUS InitializeModule(IN EFI_HANDLE ImageHandle,
|
||||
IN PEFI_SYSTEM_TABLE SystemTable);
|
||||
};
|
||||
|
||||
#endif/* __XTLDR_DUMMY_DUMMY_HH */
|
@@ -1,19 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/modules/framebuf/data.cc
|
||||
* DESCRIPTION: EFI framebuffer module global and static data
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <framebuf.hh>
|
||||
|
||||
|
||||
/* Framebuffer display information */
|
||||
XTBL_FRAMEBUFFER_INFORMATION FrameBuffer::DisplayInfo;
|
||||
|
||||
/* Framebuffer protocol handler */
|
||||
XTBL_FRAMEBUFFER_PROTOCOL FrameBuffer::FbProtocol;
|
||||
|
||||
/* XTLDR protocol handler */
|
||||
PXTBL_LOADER_PROTOCOL FrameBuffer::XtLdrProtocol;
|
@@ -1,44 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/modules/framebuf/includes/framebuf.hh
|
||||
* DESCRIPTION: EFI Framebuffer support module header file
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#ifndef __XTLDR_MODULES_FRAMEBUF_HH
|
||||
#define __XTLDR_MODULES_FRAMEBUF_HH
|
||||
|
||||
#include <xtblapi.h>
|
||||
|
||||
|
||||
class FrameBuffer
|
||||
{
|
||||
private:
|
||||
STATIC XTBL_FRAMEBUFFER_INFORMATION DisplayInfo;
|
||||
STATIC XTBL_FRAMEBUFFER_PROTOCOL FbProtocol;
|
||||
STATIC PXTBL_LOADER_PROTOCOL XtLdrProtocol;
|
||||
|
||||
public:
|
||||
STATIC XTCDECL EFI_STATUS GetDisplayDriver(OUT PEFI_GRAPHICS_PROTOCOL Protocol);
|
||||
STATIC XTCDECL EFI_STATUS GetDisplayInformation(OUT PEFI_PHYSICAL_ADDRESS FrameBufferBase,
|
||||
OUT PULONG_PTR FrameBufferSize,
|
||||
OUT PXTBL_FRAMEBUFFER_MODE_INFORMATION ModeInfo);
|
||||
STATIC XTCDECL EFI_STATUS GetPreferredScreenResolution(OUT PUINT PreferredWidth,
|
||||
OUT PUINT PreferredHeight);
|
||||
STATIC XTCDECL EFI_STATUS InitializeDisplay();
|
||||
STATIC XTCDECL EFI_STATUS InitializeModule(IN EFI_HANDLE ImageHandle,
|
||||
IN PEFI_SYSTEM_TABLE SystemTable);
|
||||
STATIC XTCDECL EFI_STATUS SetScreenResolution(IN UINT Width,
|
||||
IN UINT Height);
|
||||
|
||||
private:
|
||||
STATIC EFI_STATUS FindFramebufferAddress(OUT PEFI_PHYSICAL_ADDRESS Address);
|
||||
STATIC XTCDECL VOID GetColorMask(IN UINT EfiMask,
|
||||
OUT PUSHORT ColorSize,
|
||||
OUT PUSHORT ColorShift);
|
||||
STATIC XTCDECL EFI_STATUS GetModeInformation();
|
||||
STATIC XTCDECL VOID GetPixelInformation(IN PEFI_PIXEL_BITMASK PixelsBitMask);
|
||||
};
|
||||
|
||||
#endif /* __XTLDR_MODULES_FRAMEBUF_HH */
|
@@ -1,16 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/modules/pecoff/globals.cc
|
||||
* DESCRIPTION: Basic PE/COFF executable file format global and static data
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <pecoff.hh>
|
||||
|
||||
|
||||
/* XTOS PE/COFF Image Protocol */
|
||||
XTBL_EXECUTABLE_IMAGE_PROTOCOL PeCoff::PeProtocol;
|
||||
|
||||
/* EFI XT Loader Protocol */
|
||||
PXTBL_LOADER_PROTOCOL PeCoff::XtLdrProtocol;
|
@@ -1,53 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/modules/pecoff/includes/pecoff.hh
|
||||
* DESCRIPTION: Basic PE/COFF executable file format support header
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#ifndef __XTLDR_PECOFF_HH
|
||||
#define __XTLDR_PECOFF_HH
|
||||
|
||||
#include <xtblapi.h>
|
||||
|
||||
|
||||
/* PE/COFF module for XTLDR */
|
||||
class PeCoff
|
||||
{
|
||||
private:
|
||||
STATIC XTBL_EXECUTABLE_IMAGE_PROTOCOL PeProtocol;
|
||||
STATIC PXTBL_LOADER_PROTOCOL XtLdrProtocol;
|
||||
|
||||
public:
|
||||
STATIC XTCDECL EFI_STATUS GetEntryPoint(IN PVOID ImagePointer,
|
||||
OUT PVOID *EntryPoint);
|
||||
STATIC XTCDECL EFI_STATUS GetFileSize(IN PVOID ImagePointer,
|
||||
OUT PULONGLONG FileSize);
|
||||
STATIC XTCDECL EFI_STATUS GetImageSize(IN PVOID ImagePointer,
|
||||
OUT PUINT ImageSize);
|
||||
STATIC XTCDECL EFI_STATUS GetMachineType(IN PVOID ImagePointer,
|
||||
OUT PUSHORT MachineType);
|
||||
STATIC XTCDECL EFI_STATUS GetSection(IN PVOID ImagePointer,
|
||||
IN PCHAR SectionName,
|
||||
OUT PULONG *RawData);
|
||||
STATIC XTCDECL EFI_STATUS GetSubSystem(IN PVOID ImagePointer,
|
||||
OUT PUSHORT SubSystem);
|
||||
STATIC XTCDECL EFI_STATUS GetVersion(IN PVOID ImagePointer,
|
||||
OUT PUSHORT Version);
|
||||
STATIC XTCDECL EFI_STATUS InitializeModule(IN EFI_HANDLE ImageHandle,
|
||||
IN PEFI_SYSTEM_TABLE SystemTable);
|
||||
STATIC XTCDECL EFI_STATUS LoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
||||
IN LOADER_MEMORY_TYPE MemoryType,
|
||||
IN PVOID VirtualAddress,
|
||||
OUT PVOID *ImagePointer);
|
||||
STATIC XTCDECL EFI_STATUS RelocateImage(IN PVOID ImagePointer,
|
||||
IN EFI_VIRTUAL_ADDRESS Address);
|
||||
STATIC XTCDECL EFI_STATUS UnloadImage(IN PVOID ImagePointer);
|
||||
STATIC XTCDECL EFI_STATUS VerifyImage(IN PVOID ImagePointer);
|
||||
|
||||
private:
|
||||
STATIC XTCDECL EFI_STATUS RelocateLoadedImage(IN PPECOFF_IMAGE_CONTEXT Image);
|
||||
};
|
||||
|
||||
#endif /* __XTLDR_PECOFF_HH */
|
@@ -1,298 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/amd64/memory.cc
|
||||
* DESCRIPTION: EFI memory management for AMD64 target
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
* Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Determines the appropriate paging level (PML) for the AMD64 architecture.
|
||||
*
|
||||
* @param Parameters
|
||||
* A pointer to the wide character string containing the kernel boot parameters.
|
||||
*
|
||||
* @return This routine returns the appropriate page map level (5 if LA57 is enabled, 4 otherwise).
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
ULONG
|
||||
Xtos::DeterminePagingLevel(IN CONST PWCHAR Parameters)
|
||||
{
|
||||
CPUID_REGISTERS CpuRegisters;
|
||||
|
||||
/* Prepare CPUID registers to query for STD7 features */
|
||||
XtLdrProtocol->Memory.ZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
||||
CpuRegisters.Leaf = CPUID_GET_VENDOR_STRING;
|
||||
|
||||
/* Query CPUID */
|
||||
XtLdrProtocol->Cpu.CpuId(&CpuRegisters);
|
||||
|
||||
/* Verify if the CPU supports the STD7 feature leaf (0x00000007) */
|
||||
if(CpuRegisters.Eax >= CPUID_GET_STANDARD7_FEATURES)
|
||||
{
|
||||
/* Prepare CPUID registers to query for LA57 support */
|
||||
XtLdrProtocol->Memory.ZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
||||
CpuRegisters.Leaf = CPUID_GET_STANDARD7_FEATURES;
|
||||
|
||||
/* Query CPUID */
|
||||
XtLdrProtocol->Cpu.CpuId(&CpuRegisters);
|
||||
|
||||
/* Check if eXtended Physical Addressing (XPA) is enabled and if LA57 is supported by the CPU */
|
||||
if((CpuRegisters.Ecx & CPUID_FEATURES_ECX_LA57) &&
|
||||
!(XtLdrProtocol->BootUtils.GetBooleanParameter(Parameters, L"NOXPA")))
|
||||
{
|
||||
/* Enable LA57 (PML5) */
|
||||
return 5;
|
||||
}
|
||||
}
|
||||
|
||||
/* Disable LA57 and use PML4 by default */
|
||||
return 4;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the actual memory mapping page table and enables paging. This routine exits EFI boot services as well.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Xtos::EnablePaging(IN PXTBL_PAGE_MAPPING PageMap)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS TrampolineAddress;
|
||||
PXT_TRAMPOLINE_ENTRY TrampolineEntry;
|
||||
ULONG_PTR TrampolineSize;
|
||||
PVOID TrampolineCode;
|
||||
|
||||
/* Build page map */
|
||||
Status = XtLdrProtocol->Memory.BuildPageMap(PageMap, (PageMap->PageMapLevel > 4) ? MM_P5E_LA57_BASE : MM_PXE_BASE);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to build page map */
|
||||
XtLdrProtocol->Debug.Print(L"Failed to build page map (Status code: %zX)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Map memory for hardware layer */
|
||||
Status = MapHardwareMemoryPool(PageMap);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to map memory for hardware layer */
|
||||
XtLdrProtocol->Debug.Print(L"Failed to map memory for hardware leyer (Status code: %zX)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Check the configured page map level to set the LA57 state accordingly */
|
||||
if(PageMap->PageMapLevel == 5)
|
||||
{
|
||||
/* Get the trampoline code information */
|
||||
XtLdrProtocol->BootUtils.GetTrampolineInformation(TrampolineEnableXpa, &TrampolineCode, &TrampolineSize);
|
||||
if(TrampolineCode == NULLPTR || TrampolineSize == 0)
|
||||
{
|
||||
/* Failed to get trampoline information */
|
||||
XtLdrProtocol->Debug.Print(L"Failed to get trampoline information\n");
|
||||
return STATUS_EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* Set the address of the trampoline code below 1MB */
|
||||
TrampolineAddress = MM_TRAMPOLINE_ADDRESS;
|
||||
|
||||
/* Allocate pages for the trampoline */
|
||||
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAddress, EFI_SIZE_TO_PAGES(TrampolineSize), &TrampolineAddress);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to allocate memory for trampoline code */
|
||||
XtLdrProtocol->Debug.Print(L"Failed to allocate memory for trampoline code (Status code: %zX)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Set the trampoline entry point and copy its code into the allocated buffer */
|
||||
TrampolineEntry = (PXT_TRAMPOLINE_ENTRY)(UINT_PTR)TrampolineAddress;
|
||||
XtLdrProtocol->Memory.CopyMemory((PVOID)TrampolineEntry, TrampolineCode, TrampolineSize);
|
||||
}
|
||||
|
||||
/* Exit EFI Boot Services */
|
||||
XtLdrProtocol->Debug.Print(L"Exiting EFI boot services\n");
|
||||
Status = XtLdrProtocol->Utils.ExitBootServices();
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to exit boot services */
|
||||
XtLdrProtocol->Debug.Print(L"Failed to exit boot services (Status code: %zX)\n", Status);
|
||||
return STATUS_EFI_ABORTED;
|
||||
}
|
||||
|
||||
/* Check the configured page map level to set the LA57 state accordingly */
|
||||
if(PageMap->PageMapLevel == 5)
|
||||
{
|
||||
/* Enable Linear Address 57-bit (LA57) extension */
|
||||
XtLdrProtocol->Debug.Print(L"Enabling Linear Address 57-bit (LA57)\n");
|
||||
|
||||
/* Execute the trampoline to enable LA57 and write PML5 to CR3 */
|
||||
TrampolineEntry((UINT64)PageMap->PtePointer);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Disable Linear Address 57-bit (LA57) extension */
|
||||
XtLdrProtocol->Debug.Print(L"Disabling Linear Address 57-bit (LA57)\n");
|
||||
|
||||
/* Write PML4 to CR3 and enable paging */
|
||||
XtLdrProtocol->Cpu.WriteControlRegister(3, (UINT_PTR)PageMap->PtePointer);
|
||||
XtLdrProtocol->Cpu.WriteControlRegister(0, XtLdrProtocol->Cpu.ReadControlRegister(0) | CR0_PG);
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps the page table for hardware layer addess space.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
||||
{
|
||||
PHARDWARE_PTE P5eBase, PdeBase, PpeBase, PxeBase;
|
||||
EFI_PHYSICAL_ADDRESS Address;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if(PageMap->PageMapLevel == 5)
|
||||
{
|
||||
/* Get P5E (PML5) base address */
|
||||
P5eBase = (PHARDWARE_PTE)PageMap->PtePointer;
|
||||
|
||||
/* Check if P5E entry already exists */
|
||||
if(!P5eBase[(MM_HARDWARE_VA_START >> MM_P5I_SHIFT) & 0x1FF].Valid)
|
||||
{
|
||||
/* No valid P5E, allocate memory */
|
||||
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, 1, &Address);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure, return error */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Zero fill memory used by P5E */
|
||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||
|
||||
/* Make P5E valid */
|
||||
P5eBase[(MM_HARDWARE_VA_START >> MM_P5I_SHIFT) & 0x1FF].Valid = 1;
|
||||
P5eBase[(MM_HARDWARE_VA_START >> MM_P5I_SHIFT) & 0x1FF].PageFrameNumber = Address / EFI_PAGE_SIZE;
|
||||
P5eBase[(MM_HARDWARE_VA_START >> MM_P5I_SHIFT) & 0x1FF].Writable = 1;
|
||||
|
||||
/* Set PXE base address */
|
||||
PxeBase = (PHARDWARE_PTE)(UINT_PTR)Address;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Set PXE base address based on existing P5E */
|
||||
PxeBase = (PHARDWARE_PTE)((P5eBase[(MM_HARDWARE_VA_START >> MM_P5I_SHIFT) & 0x1FF].PageFrameNumber) << EFI_PAGE_SHIFT);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Get PXE (PML4) base address */
|
||||
PxeBase = (PHARDWARE_PTE)PageMap->PtePointer;
|
||||
}
|
||||
|
||||
/* Check if PXE entry already exists */
|
||||
if(!PxeBase[(MM_HARDWARE_VA_START >> MM_PXI_SHIFT) & 0x1FF].Valid)
|
||||
{
|
||||
/* No valid PXE, allocate memory */
|
||||
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, 1, &Address);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure, return error */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Zero fill memory used by PXE */
|
||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||
|
||||
/* Make PXE valid */
|
||||
PxeBase[(MM_HARDWARE_VA_START >> MM_PXI_SHIFT) & 0x1FF].Valid = 1;
|
||||
PxeBase[(MM_HARDWARE_VA_START >> MM_PXI_SHIFT) & 0x1FF].PageFrameNumber = Address / EFI_PAGE_SIZE;
|
||||
PxeBase[(MM_HARDWARE_VA_START >> MM_PXI_SHIFT) & 0x1FF].Writable = 1;
|
||||
|
||||
/* Set PPE base address */
|
||||
PpeBase = (PHARDWARE_PTE)(UINT_PTR)Address;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Set PPE base address based on existing PXE */
|
||||
PpeBase = (PHARDWARE_PTE)((PxeBase[(MM_HARDWARE_VA_START >> MM_PXI_SHIFT) & 0x1FF].PageFrameNumber) << EFI_PAGE_SHIFT);
|
||||
}
|
||||
|
||||
/* Check if PPE entry already exists */
|
||||
if(!PpeBase[(MM_HARDWARE_VA_START >> MM_PPI_SHIFT) & 0x1FF].Valid)
|
||||
{
|
||||
/* No valid PPE, allocate memory */
|
||||
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, 1, &Address);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure, return error */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Zero fill memory used by PPE */
|
||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||
|
||||
/* Make PPE valid */
|
||||
PpeBase[(MM_HARDWARE_VA_START >> MM_PPI_SHIFT) & 0x1FF].Valid = 1;
|
||||
PpeBase[(MM_HARDWARE_VA_START >> MM_PPI_SHIFT) & 0x1FF].PageFrameNumber = Address / EFI_PAGE_SIZE;
|
||||
PpeBase[(MM_HARDWARE_VA_START >> MM_PPI_SHIFT) & 0x1FF].Writable = 1;
|
||||
|
||||
/* Set PDE base address */
|
||||
PdeBase = (PHARDWARE_PTE)Address;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Set PDE base address, based on existing PPE */
|
||||
PdeBase = (PHARDWARE_PTE)((PpeBase[(MM_HARDWARE_VA_START >> MM_PPI_SHIFT) & 0x1FF].PageFrameNumber) << EFI_PAGE_SHIFT);
|
||||
}
|
||||
|
||||
/* Loop through 2 PDE entries */
|
||||
for(UINT Index = 0 ; Index < 2 ; Index++)
|
||||
{
|
||||
/* Check if PDE entry already exists */
|
||||
if(!PdeBase[((MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF) + Index].Valid)
|
||||
{
|
||||
/* No valid PDE, allocate memory */
|
||||
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, 1, &Address);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure, return error */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Zero fill memory used by PDE */
|
||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||
|
||||
/* Make PDE valid */
|
||||
PdeBase[((MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF) + Index].Valid = 1;
|
||||
PdeBase[((MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF) + Index].PageFrameNumber = Address / EFI_PAGE_SIZE;
|
||||
PdeBase[((MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF) + Index].Writable = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
@@ -1,19 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/modules/xtos/data.cc
|
||||
* DESCRIPTION: XTOS module global and static data
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* XTOS Boot Protocol */
|
||||
XTBL_BOOT_PROTOCOL Xtos::BootProtocol;
|
||||
|
||||
/* XTOS PE/COFF Image Protocol */
|
||||
PXTBL_EXECUTABLE_IMAGE_PROTOCOL Xtos::PeCoffProtocol;
|
||||
|
||||
/* EFI XT Loader Protocol */
|
||||
PXTBL_LOADER_PROTOCOL Xtos::XtLdrProtocol;
|
@@ -1,181 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/i686/memory.cc
|
||||
* DESCRIPTION: EFI memory management for i686 target
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Determines the appropriate paging level (PML) for the i686 architecture.
|
||||
*
|
||||
* @param Parameters
|
||||
* A pointer to the wide character string containing the kernel boot parameters.
|
||||
*
|
||||
* @return This routine returns the appropriate page map level (3 if PAE is enabled, 2 otherwise).
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
ULONG
|
||||
Xtos::DeterminePagingLevel(IN CONST PWCHAR Parameters)
|
||||
{
|
||||
CPUID_REGISTERS CpuRegisters;
|
||||
|
||||
/* Prepare CPUID registers to query for PAE support */
|
||||
XtLdrProtocol->Memory.ZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
||||
CpuRegisters.Leaf = CPUID_GET_STANDARD1_FEATURES;
|
||||
|
||||
/* Query CPUID */
|
||||
XtLdrProtocol->Cpu.CpuId(&CpuRegisters);
|
||||
|
||||
/* Check if eXtended Physical Addressing (XPA) is enabled and if PAE is supported by the CPU */
|
||||
if((CpuRegisters.Edx & CPUID_FEATURES_EDX_PAE) &&
|
||||
!(XtLdrProtocol->BootUtils.GetBooleanParameter(Parameters, L"NOXPA")))
|
||||
{
|
||||
/* Enable PAE (PML3) */
|
||||
return 3;
|
||||
}
|
||||
|
||||
/* Disable PAE and use PML2 by default */
|
||||
return 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the actual memory mapping page table and enables paging. This routine exits EFI boot services as well.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Xtos::EnablePaging(IN PXTBL_PAGE_MAPPING PageMap)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Build page map */
|
||||
Status = XtLdrProtocol->Memory.BuildPageMap(PageMap, MM_PTE_BASE);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to build page map */
|
||||
XtLdrProtocol->Debug.Print(L"Failed to build page map (Status code: %zX)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Map memory for hardware layer */
|
||||
Status = MapHardwareMemoryPool(PageMap);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to map memory for hardware layer */
|
||||
XtLdrProtocol->Debug.Print(L"Failed to map memory for hardware layer (Status code: %zX)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Exit EFI Boot Services */
|
||||
XtLdrProtocol->Debug.Print(L"Exiting EFI boot services\n");
|
||||
Status = XtLdrProtocol->Utils.ExitBootServices();
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to exit boot services */
|
||||
XtLdrProtocol->Debug.Print(L"Failed to exit boot services (Status code: %zX)\n", Status);
|
||||
return STATUS_EFI_ABORTED;
|
||||
}
|
||||
|
||||
/* Disable paging */
|
||||
XtLdrProtocol->Cpu.WriteControlRegister(0, XtLdrProtocol->Cpu.ReadControlRegister(0) & ~CR0_PG);
|
||||
|
||||
/* Check the configured page map level to set the PAE state accordingly */
|
||||
if(PageMap->PageMapLevel == 3)
|
||||
{
|
||||
/* Enable Physical Address Extension (PAE) */
|
||||
XtLdrProtocol->Debug.Print(L"Enabling Physical Address Extension (PAE)\n");
|
||||
XtLdrProtocol->Cpu.WriteControlRegister(4, XtLdrProtocol->Cpu.ReadControlRegister(4) | CR4_PAE);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Disable Physical Address Extension (PAE) */
|
||||
XtLdrProtocol->Debug.Print(L"Disabling Physical Address Extension (PAE)\n");
|
||||
XtLdrProtocol->Cpu.WriteControlRegister(4, XtLdrProtocol->Cpu.ReadControlRegister(4) & ~CR4_PAE);
|
||||
}
|
||||
|
||||
/* Write page mappings to CR3 */
|
||||
XtLdrProtocol->Cpu.WriteControlRegister(3, (UINT_PTR)PageMap->PtePointer);
|
||||
|
||||
/* Enable paging */
|
||||
XtLdrProtocol->Cpu.WriteControlRegister(0, XtLdrProtocol->Cpu.ReadControlRegister(0) | CR0_PG);
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps the page table for hardware layer addess space.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Xtos::MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap)
|
||||
{
|
||||
EFI_PHYSICAL_ADDRESS Address;
|
||||
PHARDWARE_LEGACY_PTE LegacyPdeBase;
|
||||
PHARDWARE_MODERN_PTE PdeBase;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Allocate memory */
|
||||
Status = XtLdrProtocol->Memory.AllocatePages(AllocateAnyPages, 1, &Address);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure, return error */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Zero fill allocated memory */
|
||||
XtLdrProtocol->Memory.ZeroMemory((PVOID)Address, EFI_PAGE_SIZE);
|
||||
|
||||
/* Check if PAE is enabled (3-level paging) */
|
||||
if(PageMap->PageMapLevel == 3)
|
||||
{
|
||||
/* Get PDE base address (PAE enabled) */
|
||||
PdeBase = (PHARDWARE_MODERN_PTE)(((PHARDWARE_MODERN_PTE)PageMap->PtePointer)[MM_HARDWARE_VA_START >> MM_PPI_SHIFT].PageFrameNumber << MM_PAGE_SHIFT);
|
||||
|
||||
/* Make PDE valid */
|
||||
XtLdrProtocol->Memory.ZeroMemory(&PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF], sizeof(HARDWARE_MODERN_PTE));
|
||||
PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF].PageFrameNumber = Address >> MM_PAGE_SHIFT;
|
||||
PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF].Valid = 1;
|
||||
PdeBase[(MM_HARDWARE_VA_START >> MM_PDI_SHIFT) & 0x1FF].Writable = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Get PDE base address (PAE disabled) */
|
||||
LegacyPdeBase = (PHARDWARE_LEGACY_PTE)PageMap->PtePointer;
|
||||
|
||||
/* Check for a conflicting PDE */
|
||||
if(LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].Valid)
|
||||
{
|
||||
/* PDE already exists and is valid, nothing to do */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/* Make PDE valid */
|
||||
XtLdrProtocol->Memory.ZeroMemory(&LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT], sizeof(HARDWARE_LEGACY_PTE));
|
||||
LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].Valid = 1;
|
||||
LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].PageFrameNumber = Address >> MM_PAGE_SHIFT;
|
||||
LegacyPdeBase[MM_HARDWARE_VA_START >> MM_PDI_LEGACY_SHIFT].Writable = 1;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
@@ -1,78 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/modules/xtos/includes/xtos.hh
|
||||
* DESCRIPTION: XTOS boot protocol support header
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#ifndef __XTLDR_MODULES_XTOS_HH
|
||||
#define __XTLDR_MODULES_XTOS_HH
|
||||
|
||||
#include <xtblapi.h>
|
||||
|
||||
|
||||
/* XTOS kernel entry point */
|
||||
typedef VOID (XTAPI *PXT_ENTRY_POINT)(IN PKERNEL_INITIALIZATION_BLOCK BootParameters);
|
||||
|
||||
/* XTOS trampoline entry point */
|
||||
typedef VOID (*PXT_TRAMPOLINE_ENTRY)(UINT64 PageMap);
|
||||
|
||||
|
||||
/* XTOS module for XTLDR */
|
||||
class Xtos
|
||||
{
|
||||
private:
|
||||
STATIC XTBL_BOOT_PROTOCOL BootProtocol;
|
||||
STATIC PXTBL_EXECUTABLE_IMAGE_PROTOCOL PeCoffProtocol;
|
||||
STATIC PXTBL_LOADER_PROTOCOL XtLdrProtocol;
|
||||
|
||||
public:
|
||||
STATIC XTCDECL EFI_STATUS BootSystem(IN PXTBL_BOOT_PARAMETERS Parameters);
|
||||
STATIC XTCDECL EFI_STATUS InitializeModule(IN EFI_HANDLE ImageHandle,
|
||||
IN PEFI_SYSTEM_TABLE SystemTable);
|
||||
|
||||
private:
|
||||
STATIC XTCDECL EFI_STATUS AddVirtualMemoryMapping(IN PLIST_ENTRY MemoryMappings,
|
||||
IN PVOID VirtualAddress,
|
||||
IN PVOID PhysicalAddress,
|
||||
IN UINT NumberOfPages,
|
||||
IN LOADER_MEMORY_TYPE MemoryType);
|
||||
STATIC XTCDECL LOADER_MEMORY_TYPE ConvertEfiMemoryType(IN EFI_MEMORY_TYPE EfiMemoryType);
|
||||
STATIC XTCDECL ULONG DeterminePagingLevel(IN CONST PWCHAR Parameters);
|
||||
STATIC XTCDECL EFI_STATUS EnablePaging(IN PXTBL_PAGE_MAPPING PageMap);
|
||||
STATIC XTCDECL VOID GetDisplayInformation(OUT PSYSTEM_RESOURCE_FRAMEBUFFER FrameBufferResource,
|
||||
IN PEFI_PHYSICAL_ADDRESS FrameBufferBase,
|
||||
IN PULONG_PTR FrameBufferSize,
|
||||
IN PXTBL_FRAMEBUFFER_MODE_INFORMATION FrameBufferModeInfo);
|
||||
STATIC XTCDECL EFI_STATUS GetMemoryDescriptorList(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN PVOID *VirtualAddress,
|
||||
OUT PLIST_ENTRY MemoryDescriptorList);
|
||||
STATIC XTCDECL EFI_STATUS GetSystemResourcesList(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN PVOID *VirtualAddress,
|
||||
OUT PLIST_ENTRY SystemResourcesList);
|
||||
STATIC XTCDECL EFI_STATUS GetVirtualAddress(IN PLIST_ENTRY MemoryMappings,
|
||||
IN PVOID PhysicalAddress,
|
||||
OUT PVOID *VirtualAddress);
|
||||
STATIC XTCDECL EFI_STATUS InitializeApicBase(IN PXTBL_PAGE_MAPPING PageMap);
|
||||
STATIC XTCDECL EFI_STATUS InitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN PVOID *VirtualAddress,
|
||||
IN PXTBL_BOOT_PARAMETERS Parameters);
|
||||
STATIC XTCDECL EFI_STATUS InitializeVirtualMemory(IN OUT PLIST_ENTRY MemoryMappings,
|
||||
IN OUT PVOID *MemoryMapAddress);
|
||||
STATIC XTCDECL EFI_STATUS LoadModule(IN PEFI_FILE_HANDLE BootDir,
|
||||
IN PWCHAR FileName,
|
||||
IN PVOID VirtualAddress,
|
||||
IN LOADER_MEMORY_TYPE MemoryType,
|
||||
OUT PPECOFF_IMAGE_CONTEXT *ImageContext);
|
||||
STATIC XTCDECL EFI_STATUS MapHardwareMemoryPool(IN PXTBL_PAGE_MAPPING PageMap);
|
||||
STATIC XTCDECL EFI_STATUS MapVirtualMemory(IN PLIST_ENTRY MemoryMappings,
|
||||
IN UINT_PTR VirtualAddress,
|
||||
IN UINT_PTR PhysicalAddress,
|
||||
IN UINT NumberOfPages,
|
||||
IN OUT PVOID *PtePointer);
|
||||
STATIC XTCDECL EFI_STATUS RunBootSequence(IN PEFI_FILE_HANDLE BootDir,
|
||||
IN PXTBL_BOOT_PARAMETERS Parameters);
|
||||
};
|
||||
|
||||
#endif /* __XTLDR_MODULES_XTOS_HH */
|
File diff suppressed because it is too large
Load Diff
1815
boot/xtldr/textui.cc
1815
boot/xtldr/textui.cc
File diff suppressed because it is too large
Load Diff
@@ -1,328 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/xtldr.cc
|
||||
* DESCRIPTION: XTOS UEFI Boot Loader
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtldr.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Disables access to EFI Boot Services.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
XtLoader::DisableBootServices()
|
||||
{
|
||||
LoaderStatus.BootServices = FALSE;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Queries the availability of EFI Boot Services.
|
||||
*
|
||||
* @return This routine returns TRUE if EFI Boot Services are available, FALSE otherwise.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
XtLoader::GetBootServicesStatus()
|
||||
{
|
||||
return LoaderStatus.BootServices;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the EFI image handle.
|
||||
*
|
||||
* @return This routine returns a handle to the EFI-loaded image.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_HANDLE
|
||||
XtLoader::GetEfiImageHandle()
|
||||
{
|
||||
return XtLoader::EfiImageHandle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the EFI system table pointer.
|
||||
*
|
||||
* @return This routine returns a pointer to the EFI system table.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
PEFI_SYSTEM_TABLE
|
||||
XtLoader::GetEfiSystemTable()
|
||||
{
|
||||
return XtLoader::EfiSystemTable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides base address and size of the XTLDR image.
|
||||
*
|
||||
* @param LoaderBase
|
||||
* Supplies a pointer to a variable that receives the base address of the XTLDR image.
|
||||
*
|
||||
* @param LoaderSize
|
||||
* Supplies a pointer to a variable that receives the size of the XTLDR image.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
XtLoader::GetLoaderImageInformation(PVOID *LoaderBase,
|
||||
PULONGLONG LoaderSize)
|
||||
{
|
||||
*LoaderBase = XtLoader::LoaderStatus.LoaderBase;
|
||||
*LoaderSize = XtLoader::LoaderStatus.LoaderSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the Secure Boot status.
|
||||
*
|
||||
* @return This routine returns SecureBoot status.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
INT_PTR
|
||||
XtLoader::GetSecureBootStatus()
|
||||
{
|
||||
return LoaderStatus.SecureBoot;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes EFI Boot Loader (XTLDR).
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
XtLoader::InitializeBootLoader(IN EFI_HANDLE ImageHandle,
|
||||
IN PEFI_SYSTEM_TABLE SystemTable)
|
||||
{
|
||||
EFI_GUID LipGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID;
|
||||
PEFI_LOADED_IMAGE_PROTOCOL LoadedImage;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Set the system table and image handle */
|
||||
EfiImageHandle = ImageHandle;
|
||||
EfiSystemTable = SystemTable;
|
||||
|
||||
/* Set current XTLDR's EFI BootServices status */
|
||||
LoaderStatus.BootServices = TRUE;
|
||||
|
||||
/* Initialize console */
|
||||
Console::InitializeConsole();
|
||||
|
||||
/* Print XTLDR version */
|
||||
Console::Print(L"XTLDR boot loader v%s\n", XTOS_VERSION);
|
||||
|
||||
/* Initialize XTLDR protocol */
|
||||
Protocol::InitializeProtocol();
|
||||
|
||||
/* Initialize XTLDR configuration */
|
||||
Configuration::InitializeConfiguration();
|
||||
|
||||
/* Store SecureBoot status */
|
||||
LoaderStatus.SecureBoot = EfiUtils::GetSecureBootStatus();
|
||||
|
||||
/* Attempt to open EFI LoadedImage protocol */
|
||||
Status = Protocol::OpenProtocol(&Handle, (PVOID *)&LoadedImage, &LipGuid);
|
||||
if(Status == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Store boot loader image base and size */
|
||||
LoaderStatus.LoaderBase = LoadedImage->ImageBase;
|
||||
LoaderStatus.LoaderSize = LoadedImage->ImageSize;
|
||||
|
||||
/* Check if debug is enabled */
|
||||
if(DEBUG)
|
||||
{
|
||||
/* Protocol opened successfully, print useful debug information */
|
||||
Console::Print(L"\n---------- BOOTLOADER DEBUG ----------\n"
|
||||
L"Pointer Size : %d\n"
|
||||
L"Image Base Address : %P\n"
|
||||
L"Image Base Size : 0x%lX\n"
|
||||
L"Image Revision : 0x%lX\n"
|
||||
L"Secure Boot Status : %zd\n"
|
||||
L"--------------------------------------\n",
|
||||
sizeof(PVOID),
|
||||
LoadedImage->ImageBase,
|
||||
LoadedImage->ImageSize,
|
||||
LoadedImage->Revision,
|
||||
LoaderStatus.SecureBoot);
|
||||
EfiUtils::SleepExecution(3000);
|
||||
}
|
||||
|
||||
/* Close EFI LoadedImage protocol */
|
||||
Protocol::CloseProtocol(&Handle, &LipGuid);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a boot menu callback routine, that will be used to display alternative boot menu.
|
||||
*
|
||||
* @param BootMenuRoutine
|
||||
* Supplies a pointer to the boot menu callback routine.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
XtLoader::RegisterBootMenu(IN PVOID BootMenuRoutine)
|
||||
{
|
||||
/* Set boot menu routine */
|
||||
BootMenu = (PBL_XT_BOOT_MENU)BootMenuRoutine;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invokes either a custom boot menu handler, if one has been registered, or displays the default boot menu.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
XtLoader::ShowBootMenu()
|
||||
{
|
||||
/* Check if custom boot menu registered */
|
||||
if(BootMenu != NULLPTR)
|
||||
{
|
||||
/* Display alternative boot menu */
|
||||
BootMenu();
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Display default boot menu */
|
||||
TextUi::DisplayBootMenu();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This routine is the entry point of the XT EFI boot loader.
|
||||
*
|
||||
* @param ImageHandle
|
||||
* Firmware-allocated handle that identifies the image.
|
||||
*
|
||||
* @param SystemTable
|
||||
* Provides the EFI system table.
|
||||
*
|
||||
* @return This routine returns status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlStartXtLoader(IN EFI_HANDLE ImageHandle,
|
||||
IN PEFI_SYSTEM_TABLE SystemTable)
|
||||
{
|
||||
PWCHAR Modules;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Initialize XTLDR and */
|
||||
XtLoader::InitializeBootLoader(ImageHandle, SystemTable);
|
||||
|
||||
/* Parse configuration options passed from UEFI shell */
|
||||
Status = Configuration::ParseCommandLine();
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to parse command line options */
|
||||
TextUi::DisplayErrorDialog(L"XTLDR", L"Failed to parse command line parameters.");
|
||||
}
|
||||
|
||||
/* Attempt to early initialize debug console */
|
||||
if(DEBUG)
|
||||
{
|
||||
Status = Debug::InitializeDebugConsole();
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Initialization failed, notify user on stdout */
|
||||
TextUi::DisplayErrorDialog(L"XTLDR", L"Failed to initialize debug console.");
|
||||
}
|
||||
}
|
||||
|
||||
/* Load XTLDR configuration file */
|
||||
Status = Configuration::LoadConfiguration();
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to load/parse config file */
|
||||
TextUi::DisplayErrorDialog(L"XTLDR", L"Failed to load and parse configuration file ");
|
||||
}
|
||||
|
||||
/* Reinitialize debug console if it was not initialized earlier */
|
||||
if(DEBUG)
|
||||
{
|
||||
Status = Debug::InitializeDebugConsole();
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Initialization failed, notify user on stdout */
|
||||
TextUi::DisplayErrorDialog(L"XTLDR", L"Failed to initialize debug console.");
|
||||
}
|
||||
}
|
||||
|
||||
/* Disable watchdog timer */
|
||||
Status = XtLoader::GetEfiSystemTable()->BootServices->SetWatchdogTimer(0, 0x10000, 0, NULLPTR);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to disable the timer, print message */
|
||||
Debug::Print(L"WARNING: Failed to disable watchdog timer (Status Code: 0x%zX)\n", Status);
|
||||
}
|
||||
|
||||
/* Install loader protocol */
|
||||
Status = Protocol::InstallXtLoaderProtocol();
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to register loader protocol */
|
||||
Debug::Print(L"ERROR: Failed to register XTLDR loader protocol (Status Code: 0x%zX)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Load all necessary modules */
|
||||
Configuration::GetValue(L"MODULES", &Modules);
|
||||
Status = Protocol::LoadModules(Modules);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to load modules */
|
||||
Debug::Print(L"ERROR: Failed to load XTLDR modules (Status Code: 0x%zX)\n", Status);
|
||||
TextUi::DisplayErrorDialog(L"XTLDR", L"Failed to load some XTLDR modules.");
|
||||
}
|
||||
|
||||
/* Discover and enumerate EFI block devices */
|
||||
Status = Volume::EnumerateBlockDevices();
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to enumerate block devices */
|
||||
Debug::Print(L"ERROR: Failed to discover and enumerate block devices (Status Code: 0x%zX)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Main boot loader loop */
|
||||
while(TRUE)
|
||||
{
|
||||
/* Show boot menu */
|
||||
XtLoader::ShowBootMenu();
|
||||
|
||||
/* Fallback to shell, if boot menu returned */
|
||||
Shell::StartLoaderShell();
|
||||
}
|
||||
|
||||
/* This point should be never reached, if this happen return error code */
|
||||
return STATUS_EFI_LOAD_ERROR;
|
||||
}
|
@@ -40,30 +40,6 @@ SystemPath=multi(0)disk(0)rdisk(0)partition(1)/ExectOS
|
||||
KernelFile=xtoskrnl.exe
|
||||
Parameters=DEBUG=COM1,115200
|
||||
|
||||
[ExectOS_FBDEBUG]
|
||||
SystemName="ExectOS Operating System (FBDEBUG)"
|
||||
SystemType=XTOS
|
||||
BootModules=xtos_o
|
||||
SystemPath=multi(0)disk(0)rdisk(0)partition(1)/ExectOS
|
||||
KernelFile=xtoskrnl.exe
|
||||
Parameters=DEBUG=COM1,115200;SCREEN
|
||||
|
||||
[ExectOS_NOXPA]
|
||||
SystemName="ExectOS Operating System (NOXPA)"
|
||||
SystemType=XTOS
|
||||
BootModules=xtos_o
|
||||
SystemPath=multi(0)disk(0)rdisk(0)partition(1)/ExectOS
|
||||
KernelFile=xtoskrnl.exe
|
||||
Parameters=DEBUG=COM1,115200 NOXPA
|
||||
|
||||
[ExectOS_NOXPA_FBDEBUG]
|
||||
SystemName="ExectOS Operating System (NOXPA / FBDEBUG)"
|
||||
SystemType=XTOS
|
||||
BootModules=xtos_o
|
||||
SystemPath=multi(0)disk(0)rdisk(0)partition(1)/ExectOS
|
||||
KernelFile=xtoskrnl.exe
|
||||
Parameters=DEBUG=COM1,115200;SCREEN NOXPA
|
||||
|
||||
[Windows]
|
||||
SystemName="Microsoft Windows 2000"
|
||||
SystemType=NT50
|
@@ -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
|
||||
# PROJECT: ExectOS
|
||||
# LICENSE: See the COPYING.md in the top level directory
|
||||
# FILE: configure.sh
|
||||
# DESCRIPTION: Project configuration script for preparing the build environment
|
||||
# DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
|
||||
|
||||
# Check XTCHain
|
||||
if [ "x${XTCVER}" = "x" ]; then
|
||||
@@ -22,12 +16,13 @@ fi
|
||||
|
||||
# Set variables
|
||||
EXECTOS_SOURCE_DIR=$(cd `dirname ${0}` && pwd)
|
||||
EXECTOS_BINARY_DIR=build-${ARCH}-${BUILD_TYPE,,}
|
||||
EXECTOS_BINARY_DIR=build-${ARCH}-xtchain
|
||||
|
||||
# Create directories if needed
|
||||
if [ "${EXECTOS_SOURCE_DIR}" = "${PWD}" ]; then
|
||||
echo Creating directories in ${EXECTOS_BINARY_DIR}
|
||||
mkdir -p "${EXECTOS_BINARY_DIR}"
|
||||
ln -sf ${EXECTOS_BINARY_DIR} build
|
||||
cd "${EXECTOS_BINARY_DIR}"
|
||||
fi
|
||||
|
||||
|
@@ -7,8 +7,8 @@ include_directories(
|
||||
|
||||
# Specify list of source code files
|
||||
list(APPEND NTOSDRV_SOURCE
|
||||
${NTOSDRV_SOURCE_DIR}/ntosdrv.cc
|
||||
${NTOSDRV_SOURCE_DIR}/rtl.cc)
|
||||
${NTOSDRV_SOURCE_DIR}/ntosdrv.c
|
||||
${NTOSDRV_SOURCE_DIR}/rtl.c)
|
||||
|
||||
# Set module definition SPEC file
|
||||
set_specfile(ntosdrv.spec ntosdrv.sys)
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: drivers/ntosdrv/ntosdrv.cc
|
||||
* FILE: drivers/ntosdrv/ntosdrv.c
|
||||
* DESCRIPTION: NTOS compatibility driver
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
@@ -16,7 +16,6 @@
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCLINK
|
||||
XTAPI
|
||||
XTSTATUS
|
||||
XtDriverEntry(VOID)
|
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: drivers/ntosdrv/rtl.cc
|
||||
* FILE: drivers/ntosdrv/rtl.c
|
||||
* DESCRIPTION: NTOS compatibility driver runtime library
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
@@ -25,7 +25,6 @@
|
||||
*
|
||||
* @since NT 3.5
|
||||
*/
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlFillMemory(OUT PVOID Destination,
|
@@ -1 +0,0 @@
|
||||
set_sdk_target("xtdk/" "include")
|
@@ -1,2 +1,3 @@
|
||||
# Set base addresses for all modules
|
||||
set(BASEADDRESS_XTLDR 0x00010000)
|
||||
set(BASEADDRESS_XTOSKRNL 0x00400000)
|
@@ -1,2 +0,0 @@
|
||||
# Set base addresses for all modules
|
||||
set(BASEADDRESS_XTOSKRNL 0x0000000140000000)
|
@@ -8,58 +8,41 @@ endif()
|
||||
# This target creates a disk image
|
||||
add_custom_target(diskimg
|
||||
DEPENDS install
|
||||
COMMAND diskimg -c ${EXECTOS_BINARY_DIR}/output/binaries -f 32 -o ${EXECTOS_BINARY_DIR}/output/disk.img -s ${PROJECT_DISK_IMAGE_SIZE}
|
||||
-m ${EXECTOS_BINARY_DIR}/boot/bootsect/mbrboot.bin -v ${EXECTOS_BINARY_DIR}/boot/bootsect/espboot.bin
|
||||
COMMAND sh -c "dd if=/dev/zero of=${EXECTOS_BINARY_DIR}/output/disk.img bs=512 count=${PROJECT_DISK_IMAGE_BLOCKS} 2>/dev/null 1>/dev/null"
|
||||
COMMAND parted ${EXECTOS_BINARY_DIR}/output/disk.img -s -a minimal mklabel gpt
|
||||
COMMAND parted ${EXECTOS_BINARY_DIR}/output/disk.img -s -a minimal mkpart EFI FAT32 2048s ${PROJECT_PART_IMAGE_BLOCKS}s
|
||||
COMMAND parted ${EXECTOS_BINARY_DIR}/output/disk.img -s -a minimal toggle 1 boot
|
||||
COMMAND sh -c "dd if=/dev/zero of=${EXECTOS_BINARY_DIR}/output/part.img bs=512 count=${PROJECT_PART_IMAGE_BLOCKS} 2>/dev/null 1>/dev/null"
|
||||
COMMAND mformat -i ${EXECTOS_BINARY_DIR}/output/part.img -h32 -t32 -n64 -L32
|
||||
COMMAND sh -c "mcopy -s -i ${EXECTOS_BINARY_DIR}/output/part.img ${EXECTOS_BINARY_DIR}/output/binaries/* ::"
|
||||
COMMAND sh -c "dd if=${EXECTOS_BINARY_DIR}/output/part.img of=${EXECTOS_BINARY_DIR}/output/disk.img bs=512 count=${PROJECT_PART_IMAGE_BLOCKS} seek=2048 conv=notrunc 2>/dev/null 1>/dev/null"
|
||||
COMMAND rm ${EXECTOS_BINARY_DIR}/output/part.img
|
||||
VERBATIM)
|
||||
|
||||
find_program(BOCHS_EMULATOR bochs)
|
||||
if(BOCHS_EMULATOR)
|
||||
# This target starts up a BOCHS+BIOS virtual machine
|
||||
# This target starts up a BOCHS+OVMF virtual machine
|
||||
add_custom_target(bochsvm
|
||||
DEPENDS diskimg
|
||||
COMMAND bochs -f ../sdk/firmware/bochsrc_${ARCH}.cfg -q -unlock
|
||||
VERBATIM USES_TERMINAL)
|
||||
endif()
|
||||
|
||||
find_program(QEMU_EMULATOR ${QEMU_COMMAND})
|
||||
if(QEMU_EMULATOR)
|
||||
# This target starts up a QEMU+OVMF virtual machine using KVM accelerator
|
||||
add_custom_target(testefikvm
|
||||
DEPENDS install
|
||||
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-EFI-KVM" -machine type=q35,kernel_irqchip=on,accel="kvm:whpx",mem-merge=off,vmport=off -enable-kvm -cpu host,-hypervisor,+topoext
|
||||
add_custom_target(testkvm
|
||||
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
|
||||
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
|
||||
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_code_${ARCH}.fd,if=pflash,format=raw,unit=0,readonly=on
|
||||
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_vars_${ARCH}.fd,if=pflash,format=raw,unit=1
|
||||
-hda 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
|
||||
VERBATIM USES_TERMINAL)
|
||||
|
||||
# This target starts up a QEMU+OVMF virtual machine using TCG accelerator
|
||||
add_custom_target(testefitcg
|
||||
DEPENDS install
|
||||
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-EFI-TCG" -machine type=q35,accel=tcg -cpu max,-hypervisor
|
||||
add_custom_target(testtcg
|
||||
DEPENDS diskimg
|
||||
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-TCG" -machine type=q35,accel=tcg -cpu max,-hypervisor
|
||||
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
|
||||
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_code_${ARCH}.fd,if=pflash,format=raw,unit=0,readonly=on
|
||||
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_vars_${ARCH}.fd,if=pflash,format=raw,unit=1
|
||||
-hda fat:rw:${EXECTOS_BINARY_DIR}/output/binaries
|
||||
-boot menu=on -d int -no-reboot -no-shutdown -serial stdio
|
||||
VERBATIM USES_TERMINAL)
|
||||
|
||||
# This target starts up a QEMU+SEABIOS virtual machine using KVM accelerator
|
||||
add_custom_target(testkvm
|
||||
DEPENDS diskimg
|
||||
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-BIOS-KVM" -machine type=q35,kernel_irqchip=on,accel="kvm:whpx",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
|
||||
-hda ${EXECTOS_BINARY_DIR}/output/disk.img
|
||||
-boot menu=on -d int -no-reboot -no-shutdown -serial stdio
|
||||
-boot menu=on -d int -M smm=off -no-reboot -no-shutdown -serial stdio
|
||||
VERBATIM USES_TERMINAL)
|
||||
|
||||
# This target starts up a QEMU+SEABIOS virtual machine using TCG accelerator
|
||||
add_custom_target(testtcg
|
||||
DEPENDS diskimg
|
||||
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-BIOS-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
|
||||
-hda ${EXECTOS_BINARY_DIR}/output/disk.img
|
||||
-boot menu=on -d int -no-reboot -no-shutdown -serial stdio
|
||||
VERBATIM USES_TERMINAL)
|
||||
endif()
|
||||
|
@@ -59,59 +59,6 @@ function(add_module_linker_flags MODULE FLAGS)
|
||||
set_module_property(${MODULE} LINK_FLAGS ${FLAGS})
|
||||
endfunction()
|
||||
|
||||
# This function compiles an assembly bootsector file into a flat binary
|
||||
function(compile_bootsector NAME SOURCE BASEADDR ENTRYPOINT)
|
||||
set(BINARY_NAME "${NAME}.bin")
|
||||
set(OBJECT_NAME "${NAME}.obj")
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
|
||||
COMMAND ${CMAKE_ASM_COMPILER}
|
||||
/nologo
|
||||
--target=i386-none-elf
|
||||
/Fo${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_NAME}
|
||||
-c -- ${SOURCE}
|
||||
COMMAND ${CMAKE_ASM_LINKER}
|
||||
-m elf_i386
|
||||
--image-base=0
|
||||
--oformat binary
|
||||
-Ttext=${BASEADDR}
|
||||
--entry=_start${ENTRYPOINT}
|
||||
-o ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_NAME}
|
||||
DEPENDS ${SOURCE}
|
||||
)
|
||||
|
||||
add_custom_target(${NAME} ALL
|
||||
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
# This function sets the the qemu disk image size (in MiB)
|
||||
function(set_disk_image_size SIZE)
|
||||
MATH(EXPR DISK_BLOCKS ${SIZE}*1024*1024/512)
|
||||
MATH(EXPR PART_BLOCKS ${DISK_BLOCKS}-2048)
|
||||
set(PROJECT_DISK_IMAGE_SIZE ${SIZE} CACHE INTERNAL "PROJECT_DISK_IMAGE_SIZE")
|
||||
set(PROJECT_DISK_IMAGE_BLOCKS ${DISK_BLOCKS} CACHE INTERNAL "PROJECT_DISK_IMAGE_BLOCKS")
|
||||
set(PROJECT_PART_IMAGE_BLOCKS ${PART_BLOCKS} CACHE INTERNAL "PROJECT_PART_IMAGE_BLOCKS")
|
||||
endfunction()
|
||||
|
||||
# This function installs specified directory recursively under destination directory
|
||||
function(set_install_dir DIRECTORY DESTINATION)
|
||||
install(DIRECTORY ${DIRECTORY} DESTINATION ${EXECTOS_BINARY_DIR}/output/binaries/${DESTINATION})
|
||||
endfunction()
|
||||
|
||||
# This function installs specified file under destination directory
|
||||
function(set_install_file FILENAME DESTINATION)
|
||||
install(FILES ${FILENAME} DESTINATION ${EXECTOS_BINARY_DIR}/output/binaries/${DESTINATION})
|
||||
endfunction()
|
||||
|
||||
# This function installs specified target results under destination directory
|
||||
function(set_install_target TARGET DESTINATION)
|
||||
set_target_properties(${TARGET} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${EXECTOS_BINARY_DIR}/output/sdk/lib")
|
||||
install(TARGETS ${TARGET} DESTINATION ${EXECTOS_BINARY_DIR}/output/binaries/${DESTINATION})
|
||||
endfunction()
|
||||
|
||||
# This function sets a property for specified module
|
||||
function(set_module_property MODULE PROPERTY FLAGS)
|
||||
if(NOT ${ARGC} EQUAL 3)
|
||||
@@ -126,8 +73,19 @@ function(set_module_property MODULE PROPERTY FLAGS)
|
||||
set_property(TARGET ${MODULE} PROPERTY ${PROPERTY} ${VAL})
|
||||
endfunction()
|
||||
|
||||
function(set_sdk_target FILENAME DESTINATION)
|
||||
install(DIRECTORY ${FILENAME} DESTINATION ${EXECTOS_BINARY_DIR}/output/sdk/${DESTINATION})
|
||||
# This function installs specified directory recursively under destination directory
|
||||
function(set_install_dir DIRECTORY DESTINATION)
|
||||
install(DIRECTORY ${DIRECTORY} DESTINATION ${EXECTOS_BINARY_DIR}/output/binaries/${DESTINATION})
|
||||
endfunction()
|
||||
|
||||
# This function installs specified file under destination directory
|
||||
function(set_install_file FILENAME DESTINATION)
|
||||
install(FILES ${FILENAME} DESTINATION ${EXECTOS_BINARY_DIR}/output/binaries/${DESTINATION})
|
||||
endfunction()
|
||||
|
||||
# This function installs specified target results under destination directory
|
||||
function(set_install_target TARGET DESTINATION)
|
||||
install(TARGETS ${TARGET} DESTINATION ${EXECTOS_BINARY_DIR}/output/binaries/${DESTINATION})
|
||||
endfunction()
|
||||
|
||||
# This function is responsible for compiling module SPEC file
|
||||
@@ -139,3 +97,11 @@ function(set_specfile SPECFILE EXPORTNAME)
|
||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.def ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.c
|
||||
COMMAND ${CMAKE_SPEC_COMPILER} -a=${ARCH} -n=${EXPORTNAME} -d=${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.def -s=${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.c ${CMAKE_CURRENT_SOURCE_DIR}/${SPECFILE})
|
||||
endfunction()
|
||||
|
||||
# This function sets the the qemu disk image size (in MiB)
|
||||
function(set_disk_image_size SIZE)
|
||||
MATH(EXPR DISK_BLOCKS ${SIZE}*1024*1024/512)
|
||||
MATH(EXPR PART_BLOCKS ${DISK_BLOCKS}-2048)
|
||||
set(PROJECT_DISK_IMAGE_BLOCKS ${DISK_BLOCKS} CACHE INTERNAL "PROJECT_DISK_IMAGE_BLOCKS")
|
||||
set(PROJECT_PART_IMAGE_BLOCKS ${PART_BLOCKS} CACHE INTERNAL "PROJECT_PART_IMAGE_BLOCKS")
|
||||
endfunction()
|
||||
|
@@ -3,10 +3,8 @@ set(CMAKE_SYSTEM_NAME Windows)
|
||||
|
||||
# Set toolchain compilers
|
||||
set(CMAKE_ASM_COMPILER clang-cl)
|
||||
set(CMAKE_ASM_LINKER ld.lld)
|
||||
set(CMAKE_C_COMPILER clang-cl)
|
||||
set(CMAKE_CXX_COMPILER clang-cl)
|
||||
set(CMAKE_LINKER lld-link)
|
||||
set(CMAKE_MC_COMPILER wmc)
|
||||
set(CMAKE_RC_COMPILER wrc)
|
||||
set(CMAKE_SPEC_COMPILER xtcspecc)
|
||||
@@ -22,9 +20,8 @@ set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
set(CMAKE_C_STANDARD 23)
|
||||
set(CMAKE_CXX_STANDARD 23)
|
||||
|
||||
# Disable standard C and C++ libraries
|
||||
# Disable standard C libraries
|
||||
set(CMAKE_C_STANDARD_LIBRARIES "" CACHE INTERNAL "")
|
||||
set(CMAKE_CXX_STANDARD_LIBRARIES "" CACHE INTERNAL "")
|
||||
|
||||
# Clean linker flags
|
||||
set(CMAKE_STATIC_LINKER_FLAGS "")
|
||||
|
@@ -11,10 +11,11 @@ endif()
|
||||
|
||||
# Set build optimisation
|
||||
if(BUILD_TYPE STREQUAL "DEBUG")
|
||||
add_compiler_ccxxflags("/GS- /Zi /Ob0 /Od")
|
||||
add_linker_flags("/DEBUG /INCREMENTAL:NO /OPT:REF /OPT:NOICF /PDBSOURCEPATH:build")
|
||||
add_compiler_ccxxflags("/Zi")
|
||||
add_compiler_ccxxflags("-Ob0 -Od")
|
||||
add_linker_flags("/DEBUG /INCREMENTAL /OPT:NOREF /OPT:NOICF /PDBSOURCEPATH:build")
|
||||
else()
|
||||
add_compiler_ccxxflags("/GS- /Ob2 /Ot /Ox /Oy")
|
||||
add_compiler_ccxxflags("-Ob2 -Oy")
|
||||
add_linker_flags("/INCREMENTAL:NO /OPT:REF /OPT:ICF")
|
||||
endif()
|
||||
|
||||
@@ -47,12 +48,8 @@ add_compiler_ccxxflags("-nostdinc -Wno-char-subscripts -Wno-incompatible-library
|
||||
add_compiler_ccxxflags("-Wno-microsoft-enum-forward-reference -Wno-multichar -Wno-parentheses-equality -Wno-undefined-inline")
|
||||
add_compiler_ccxxflags("-Wno-gnu-folding-constant")
|
||||
|
||||
# Disable compiler builtins
|
||||
add_compiler_ccxxflags("-fno-builtin")
|
||||
|
||||
# Set symbols and libraries output directory
|
||||
# Set debugging symbols output directory
|
||||
set(CMAKE_PDB_OUTPUT_DIRECTORY "${EXECTOS_BINARY_DIR}/output/symbols")
|
||||
set(LIBRARY_OUTPUT_PATH "${EXECTOS_BINARY_DIR}/output/sdk/lib")
|
||||
|
||||
# Set linker flags
|
||||
add_linker_flags("${HOTPATCH_LINKER_FLAG} /LARGEADDRESSAWARE /IGNORE:4039 /IGNORE:4104 /MANIFEST:NO /NODEFAULTLIB /SAFESEH:NO")
|
||||
|
@@ -3,9 +3,9 @@ plugin_ctrl: usb_xhci=false, serial=true, e1000=false, extfpuirq=true, parallel=
|
||||
config_interface: textconfig
|
||||
display_library: x
|
||||
memory: host=64, guest=64
|
||||
romimage: file="../sdk/firmware/rombios.bin", address=0x00000000, options=none
|
||||
romimage: file="../sdk/firmware/ovmf_pure_amd64.fd", address=0x00000000, options=none
|
||||
vgaromimage: file="../sdk/firmware/vgabios.bin"
|
||||
boot: disk
|
||||
boot: floppy
|
||||
floppy_bootsig_check: disabled=0
|
||||
floppya: type=1_44
|
||||
# no floppyb
|
||||
@@ -27,7 +27,11 @@ optramimage3: file=none
|
||||
optramimage4: file=none
|
||||
pci: enabled=1, chipset=i440fx, slot1=cirrus, slot2=none, slot3=none, slot4=none, slot5=none
|
||||
vga: extension=cirrus, update_freq=5, realtime=1, ddc=builtin
|
||||
cpu: count=1:1:1, ips=400000000, quantum=16, model=corei7_sandy_bridge_2600k, reset_on_triple_fault=0, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
|
||||
cpu: count=1:1:1, ips=400000000, quantum=16, model=bx_generic, reset_on_triple_fault=0, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
|
||||
cpuid: level=6, stepping=3, model=3, family=6, vendor_string="GenuineIntel", brand_string=" Intel(R) Pentium(R) 4 CPU "
|
||||
cpuid: mmx=true, apic=xapic, simd=sse4_2, sse4a=false, misaligned_sse=false, sep=true
|
||||
cpuid: movbe=false, adx=false, aes=false, sha=false, xsave=false, xsaveopt=false, x86_64=true
|
||||
cpuid: 1g_pages=false, pcid=false, fsgsbase=false, smep=false, smap=false, mwait=true
|
||||
print_timestamps: enabled=0
|
||||
port_e9_hack: enabled=0
|
||||
private_colormap: enabled=0
|
||||
|
@@ -3,9 +3,9 @@ plugin_ctrl: usb_xhci=false, serial=true, e1000=false, extfpuirq=true, parallel=
|
||||
config_interface: textconfig
|
||||
display_library: x
|
||||
memory: host=64, guest=64
|
||||
romimage: file="../sdk/firmware/rombios.bin", address=0x00000000, options=none
|
||||
romimage: file="../sdk/firmware/ovmf_pure_i686.fd", address=0x00000000, options=none
|
||||
vgaromimage: file="../sdk/firmware/vgabios.bin"
|
||||
boot: disk
|
||||
boot: floppy
|
||||
floppy_bootsig_check: disabled=0
|
||||
floppya: type=1_44
|
||||
# no floppyb
|
||||
@@ -27,7 +27,11 @@ optramimage3: file=none
|
||||
optramimage4: file=none
|
||||
pci: enabled=1, chipset=i440fx, slot1=cirrus, slot2=none, slot3=none, slot4=none, slot5=none
|
||||
vga: extension=cirrus, update_freq=5, realtime=1, ddc=builtin
|
||||
cpu: count=1:1:1, ips=400000000, quantum=16, model=corei7_sandy_bridge_2600k, reset_on_triple_fault=0, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
|
||||
cpu: count=1:1:1, ips=400000000, quantum=16, model=bx_generic, reset_on_triple_fault=0, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
|
||||
cpuid: level=6, stepping=3, model=3, family=6, vendor_string="GenuineIntel", brand_string=" Intel(R) Pentium(R) 4 CPU "
|
||||
cpuid: mmx=true, apic=xapic, simd=sse4_2, sse4a=false, misaligned_sse=false, sep=true
|
||||
cpuid: movbe=false, adx=false, aes=false, sha=false, xsave=false, xsaveopt=false, x86_64=true
|
||||
cpuid: 1g_pages=false, pcid=false, fsgsbase=false, smep=false, smap=false, mwait=true
|
||||
print_timestamps: enabled=0
|
||||
port_e9_hack: enabled=0
|
||||
private_colormap: enabled=0
|
||||
|
BIN
sdk/firmware/ovmf_pure_amd64.fd
Normal file
BIN
sdk/firmware/ovmf_pure_amd64.fd
Normal file
Binary file not shown.
BIN
sdk/firmware/ovmf_pure_i686.fd
Normal file
BIN
sdk/firmware/ovmf_pure_i686.fd
Normal file
Binary file not shown.
Binary file not shown.
13
sdk/xtbk/README.md
Normal file
13
sdk/xtbk/README.md
Normal file
@@ -0,0 +1,13 @@
|
||||
## XT Building Kit (XTBK)
|
||||
The XTBK, or XT Building Kit is a kind of SDK (Software Development Kit) utilized internally by XTOS, the XT Operating
|
||||
System. It is designed to provide a collection of public functions that are available within the operating system but
|
||||
not necessarily exposed or accessible to software and driver developers.
|
||||
|
||||
Unlike XTDK, which focuses on providing headers for external developers to create kernel mode drivers and user mode
|
||||
applications, XTBK serves as an extension to XTDK and aids in the code-sharing process between different XTOS
|
||||
components. This enables the reuse of code across various components of the operating system, resulting in a more
|
||||
efficient and streamlined development process.
|
||||
|
||||
By incorporating XTBK, XTOS can optimize code reuse, particularly in low-level kernel code that can be shared with other
|
||||
components like the boot loader. This approach helps in reducing code duplication and improving overall code
|
||||
maintainability. Additionally, it allows for consistent implementation of functionality across different parts of the OS.
|
44
sdk/xtdk/amd64/arfuncs.h
Normal file
44
sdk/xtdk/amd64/arfuncs.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: sdk/xtdk/amd64/arfuncs.h
|
||||
* DESCRIPTION: AMD64 architecture library routines
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#ifndef __XTDK_AMD64_ARFUNCS_H
|
||||
#define __XTDK_AMD64_ARFUNCS_H
|
||||
|
||||
#include <xtdefs.h>
|
||||
#include <xtstruct.h>
|
||||
#include <xttypes.h>
|
||||
#include <amd64/xtstruct.h>
|
||||
|
||||
|
||||
/* Routines used by XTLDR */
|
||||
XTCDECL
|
||||
VOID
|
||||
ArClearInterruptFlag(VOID);
|
||||
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
ArCpuId(IN OUT PCPUID_REGISTERS Registers);
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
ArHalt(VOID);
|
||||
|
||||
XTCDECL
|
||||
ULONG_PTR
|
||||
ArReadControlRegister(IN USHORT ControlRegister);
|
||||
|
||||
XTCDECL
|
||||
ULONGLONG
|
||||
ArReadModelSpecificRegister(IN ULONG Register);
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
ArWriteControlRegister(IN USHORT ControlRegister,
|
||||
IN UINT_PTR Value);
|
||||
|
||||
#endif /* __XTDK_AMD64_ARFUNCS_H */
|
@@ -39,22 +39,13 @@
|
||||
#define CR4_PCE 0x00000100
|
||||
#define CR4_FXSR 0x00000200
|
||||
#define CR4_XMMEXCPT 0x00000400
|
||||
#define CR4_UMIP 0x00000800
|
||||
#define CR4_LA57 0x00001000
|
||||
#define CR4_RESERVED1 0x00001800
|
||||
#define CR4_VMXE 0x00002000
|
||||
#define CR4_SMXE 0x00004000
|
||||
#define CR4_FSGSBASE 0x00010000
|
||||
#define CR4_PCIDE 0x00020000
|
||||
#define CR4_XSAVE 0x00040000
|
||||
#define CR4_KL 0x00080000
|
||||
#define CR4_SMEP 0x00100000
|
||||
#define CR4_SMAP 0x00200000
|
||||
#define CR4_PKE 0x00400000
|
||||
#define CR4_CET 0x00800000
|
||||
#define CR4_PKS 0x01000000
|
||||
#define CR4_UINTR 0x02000000
|
||||
#define CR4_LASS 0x08000000
|
||||
#define CR4_LAM_SUP 0x10000000
|
||||
#define CR4_RESERVED2 0x00018000
|
||||
#define CR4_XSAVE 0x00020000
|
||||
#define CR4_RESERVED3 0xFFFC0000
|
||||
|
||||
/* Descriptors size */
|
||||
#define GDT_ENTRIES 128
|
||||
@@ -93,7 +84,6 @@
|
||||
#define X86_MSR_FSBASE 0xC0000100
|
||||
#define X86_MSR_GSBASE 0xC0000101
|
||||
#define X86_MSR_KERNEL_GSBASE 0xC0000102
|
||||
#define X86_MSR_TSC_AUX 0xC0000103
|
||||
|
||||
/* Processor features in the EFER MSR */
|
||||
#define X86_MSR_EFER_SCE (1 << 0)
|
||||
@@ -101,83 +91,36 @@
|
||||
#define X86_MSR_EFER_LMA (1 << 10)
|
||||
#define X86_MSR_EFER_NXE (1 << 11)
|
||||
#define X86_MSR_EFER_SVME (1 << 12)
|
||||
#define X86_EFER_LMSLE (1 << 13)
|
||||
#define X86_EFER_FFXSR (1 << 14)
|
||||
#define X86_EFER_TCE (1 << 15)
|
||||
#define X86_EFER_AUTOIBRS (1 << 21)
|
||||
|
||||
/* X86 EFLAG bit masks definitions */
|
||||
#define X86_EFLAGS_NF_MASK 0x00000000 /* None */
|
||||
#define X86_EFLAGS_CF_MASK 0x00000001 /* Carry */
|
||||
#define X86_EFLAGS_PF_MASK 0x00000004 /* Parity */
|
||||
#define X86_EFALGS_AF_MASK 0x00000010 /* Aux Carry */
|
||||
#define X86_EFLAGS_ZF_MASK 0x00000040 /* Zero */
|
||||
#define X86_EFLAGS_SF_MASK 0x00000080 /* Sign */
|
||||
#define X86_EFLAGS_TF_MASK 0x00000100 /* Trap */
|
||||
#define X86_EFLAGS_IF_MASK 0x00000200 /* Interrupt */
|
||||
#define X86_EFLAGS_DF_MASK 0x00000400 /* Direction */
|
||||
#define X86_EFLAGS_OF_MASK 0x00000800 /* Overflow */
|
||||
#define X86_EFLAGS_IOPL_MASK 0x00003000 /* I/O Privilege */
|
||||
#define X86_EFLAGS_NT_MASK 0x00004000 /* Nested Task */
|
||||
#define X86_EFLAGS_SIGN_MASK 0x00008000 /* Sign */
|
||||
#define X86_EFLAGS_RF_MASK 0x00010000 /* Resume */
|
||||
#define X86_EFLAGS_V86_MASK 0x00020000 /* Virtual 8086 */
|
||||
#define X86_EFLAGS_AC_MASK 0x00040000 /* Alignment Check */
|
||||
#define X86_EFLAGS_VIF_MASK 0x00080000 /* Virtual Interrupt */
|
||||
#define X86_EFLAGS_VIP_MASK 0x00100000 /* Virtual Interrupt Pending */
|
||||
#define X86_EFLAGS_ID_MASK 0x00200000 /* Identification */
|
||||
#define X86_EFLAGS_CF_MASK 0x00000001
|
||||
#define X86_EFLAGS_PF_MASK 0x00000004
|
||||
#define X86_EFALGS_AF_MASK 0x00000010
|
||||
#define X86_EFLAGS_ZF_MASK 0x00000040
|
||||
#define X86_EFLAGS_SF_MASK 0x00000080
|
||||
#define X86_EFLAGS_TF_MASK 0x00000100
|
||||
#define X86_EFLAGS_IF_MASK 0x00000200
|
||||
#define X86_EFLAGS_DF_MASK 0x00000400
|
||||
#define X86_EFLAGS_OF_MASK 0x00000800
|
||||
#define X86_EFLAGS_IOPL_MASK 0x00003000
|
||||
#define X86_EFLAGS_NT_MASK 0x00004000
|
||||
#define X86_EFLAGS_RF_MASK 0x00010000
|
||||
#define X86_EFLAGS_VM_MASK 0x00020000
|
||||
#define X86_EFLAGS_AC_MASK 0x00040000
|
||||
#define X86_EFLAGS_VIF_MASK 0x00080000
|
||||
#define X86_EFLAGS_VIP_MASK 0x00100000
|
||||
#define X86_EFLAGS_ID_MASK 0x00200000
|
||||
|
||||
/* CPU vendor enumeration list */
|
||||
typedef enum _CPU_VENDOR
|
||||
{
|
||||
CPU_VENDOR_AMD = 0x68747541,
|
||||
CPU_VENDOR_INTEL = 0x756E6547,
|
||||
CPU_VENDOR_INTEL = 0x756e6547,
|
||||
CPU_VENDOR_UNKNOWN = 0xFFFFFFFF
|
||||
} CPU_VENDOR, *PCPU_VENDOR;
|
||||
|
||||
/* CPUID extended features (0x80000001) enumeration list */
|
||||
typedef enum _CPUID_FEATURES_EXTENDED
|
||||
{
|
||||
CPUID_FEATURES_ECX_LAHF_SAHF = 1 << 0,
|
||||
CPUID_FEATURES_ECX_CMP_LEGACY = 1 << 1,
|
||||
CPUID_FEATURES_ECX_SVM = 1 << 2,
|
||||
CPUID_FEATURES_ECX_EXT_APIC_SPACE = 1 << 3,
|
||||
CPUID_FEATURES_ECX_ALT_MOV_CR8 = 1 << 4,
|
||||
CPUID_FEATURES_ECX_LZCNT = 1 << 5,
|
||||
CPUID_FEATURES_ECX_SSE4A = 1 << 6,
|
||||
CPUID_FEATURES_ECX_MISALIGNED_SSE = 1 << 7,
|
||||
CPUID_FEATURES_ECX_PREFETCHW = 1 << 8,
|
||||
CPUID_FEATURES_ECX_OSVW = 1 << 9,
|
||||
CPUID_FEATURES_ECX_IBS = 1 << 10,
|
||||
CPUID_FEATURES_ECX_XOP = 1 << 11,
|
||||
CPUID_FEATURES_ECX_SKINIT = 1 << 12,
|
||||
CPUID_FEATURES_ECX_WDT = 1 << 13,
|
||||
CPUID_FEATURES_ECX_LWP = 1 << 15,
|
||||
CPUID_FEATURES_ECX_FMA4 = 1 << 16,
|
||||
CPUID_FEATURES_ECX_TCE = 1 << 17,
|
||||
CPUID_FEATURES_ECX_NODEID = 1 << 19,
|
||||
CPUID_FEATURES_ECX_TBM = 1 << 21,
|
||||
CPUID_FEATURES_ECX_TOPOLOGY_EXTENSIONS = 1 << 22,
|
||||
CPUID_FEATURES_ECX_PERFCTR_EXT_CORE = 1 << 23,
|
||||
CPUID_FEATURES_ECX_PERFCTR_EXT_NB = 1 << 24,
|
||||
CPUID_FEATURES_ECX_DATA_BREAKPOINT_EXT = 1 << 26,
|
||||
CPUID_FEATURES_ECX_PERF_TSC = 1 << 27,
|
||||
CPUID_FEATURES_ECX_PERFCTR_EXT_L2I = 1 << 28,
|
||||
CPUID_FEATURES_ECX_MONITORX_MWAITX = 1 << 29,
|
||||
CPUID_FEATURES_ECX_CODEBP_ADDRMASK_EXT = 1 << 30,
|
||||
CPUID_FEATURES_EDX_SYSCALL_SYSRET = 1 << 11,
|
||||
CPUID_FEATURES_EDX_NX = 1 << 20,
|
||||
CPUID_FEATURES_EDX_AMD_MMX_EXT = 1 << 22,
|
||||
CPUID_FEATURES_EDX_FFXSR = 1 << 25,
|
||||
CPUID_FEATURES_EDX_1G_PAGES = 1 << 26,
|
||||
CPUID_FEATURES_EDX_RDTSCP = 1 << 27,
|
||||
CPUID_FEATURES_EDX_LONG_MODE = 1 << 29,
|
||||
CPUID_FEATURES_EDX_3DNOW_EXT = 1 << 30,
|
||||
CPUID_FEATURES_EDX_3DNOW = 1 << 31
|
||||
} CPUID_FEATURES_EXTENDED, *PCPUID_FEATURES_EXTENDED;
|
||||
|
||||
/* CPUID STD1 features (0x00000001) enumeration list */
|
||||
typedef enum _CPUID_FEATURES_STANDARD1
|
||||
/* CPUID features enumeration list */
|
||||
typedef enum _CPUID_FEATURES
|
||||
{
|
||||
CPUID_FEATURES_ECX_SSE3 = 1 << 0,
|
||||
CPUID_FEATURES_ECX_PCLMUL = 1 << 1,
|
||||
@@ -240,150 +183,15 @@ typedef enum _CPUID_FEATURES_STANDARD1
|
||||
CPUID_FEATURES_EDX_TM = 1 << 29,
|
||||
CPUID_FEATURES_EDX_IA64 = 1 << 30,
|
||||
CPUID_FEATURES_EDX_PBE = 1 << 31
|
||||
} CPUID_FEATURES_STANDARD1, *PCPUID_FEATURES_STANDARD1;
|
||||
|
||||
/* CPUID STD7 features (0x00000007, subleaf 0) enumeration list */
|
||||
typedef enum _CPUID_FEATURES_STANDARD7_LEAF0
|
||||
{
|
||||
CPUID_FEATURES_EBX_FSGSBASE = 1 << 0,
|
||||
CPUID_FEATURES_EBX_TSC_ADJUST = 1 << 1,
|
||||
CPUID_FEATURES_EBX_SGX = 1 << 2,
|
||||
CPUID_FEATURES_EBX_BMI1 = 1 << 3,
|
||||
CPUID_FEATURES_EBX_HLE = 1 << 4,
|
||||
CPUID_FEATURES_EBX_AVX2 = 1 << 5,
|
||||
CPUID_FEATURES_EBX_FDP_DEPRECATION = 1 << 6,
|
||||
CPUID_FEATURES_EBX_SMEP = 1 << 7,
|
||||
CPUID_FEATURES_EBX_BMI2 = 1 << 8,
|
||||
CPUID_FEATURES_EBX_ERMS = 1 << 9,
|
||||
CPUID_FEATURES_EBX_INVPCID = 1 << 10,
|
||||
CPUID_FEATURES_EBX_RTM = 1 << 11,
|
||||
CPUID_FEATURES_EBX_QOS_MONITORING = 1 << 12,
|
||||
CPUID_FEATURES_EBX_DEPRECATE_FCS_FDS = 1 << 13,
|
||||
CPUID_FEATURES_EBX_MPX = 1 << 14,
|
||||
CPUID_FEATURES_EBX_QOS_ENFORCEMENT = 1 << 15,
|
||||
CPUID_FEATURES_EBX_AVX512F = 1 << 16,
|
||||
CPUID_FEATURES_EBX_AVX512DQ = 1 << 17,
|
||||
CPUID_FEATURES_EBX_RDSEED = 1 << 18,
|
||||
CPUID_FEATURES_EBX_ADX = 1 << 19,
|
||||
CPUID_FEATURES_EBX_SMAP = 1 << 20,
|
||||
CPUID_FEATURES_EBX_AVX512IFMA52 = 1 << 21,
|
||||
CPUID_FEATURES_EBX_CLFLUSHOPT = 1 << 23,
|
||||
CPUID_FEATURES_EBX_CLWB = 1 << 24,
|
||||
CPUID_FEATURES_EBX_PROCESSOR_TRACE = 1 << 25,
|
||||
CPUID_FEATURES_EBX_AVX512PF = 1 << 26,
|
||||
CPUID_FEATURES_EBX_AVX512ER = 1 << 27,
|
||||
CPUID_FEATURES_EBX_AVX512CD = 1 << 28,
|
||||
CPUID_FEATURES_EBX_SHA = 1 << 29,
|
||||
CPUID_FEATURES_EBX_AVX512BW = 1 << 30,
|
||||
CPUID_FEATURES_EBX_AVX512VL = 1 << 31,
|
||||
CPUID_FEATURES_ECX_PREFETCHWT1 = 1 << 0,
|
||||
CPUID_FEATURES_ECX_AVX512_VBMI = 1 << 1,
|
||||
CPUID_FEATURES_ECX_UMIP = 1 << 2,
|
||||
CPUID_FEATURES_ECX_PKU = 1 << 3,
|
||||
CPUID_FEATURES_ECX_OSPKE = 1 << 4,
|
||||
CPUID_FEATURES_ECX_WAITPKG = 1 << 5,
|
||||
CPUID_FEATURES_ECX_AVX512_VBMI2 = 1 << 6,
|
||||
CPUID_FEATURES_ECX_CET_SS = 1 << 7,
|
||||
CPUID_FEATURES_ECX_GFNI = 1 << 8,
|
||||
CPUID_FEATURES_ECX_VAES = 1 << 9,
|
||||
CPUID_FEATURES_ECX_VPCLMULQDQ = 1 << 10,
|
||||
CPUID_FEATURES_ECX_AVX512_VNNI = 1 << 11,
|
||||
CPUID_FEATURES_ECX_AVX512_BITALG = 1 << 12,
|
||||
CPUID_FEATURES_ECX_TME = 1 << 13,
|
||||
CPUID_FEATURES_ECX_AVX512_VPOPCNTDQ = 1 << 14,
|
||||
CPUID_FEATURES_ECX_LA57 = 1 << 16,
|
||||
CPUID_FEATURES_ECX_RDPID = 1 << 22,
|
||||
CPUID_FEATURES_ECX_KEYLOCKER = 1 << 23,
|
||||
CPUID_FEATURES_ECX_BUS_LOCK_DETECT = 1 << 24,
|
||||
CPUID_FEATURES_ECX_CLDEMOTE = 1 << 25,
|
||||
CPUID_FEATURES_ECX_MOVDIRI = 1 << 27,
|
||||
CPUID_FEATURES_ECX_MOVDIR64B = 1 << 28,
|
||||
CPUID_FEATURES_ECX_ENQCMD = 1 << 29,
|
||||
CPUID_FEATURES_ECX_SGX_LAUNCH_CONFIG = 1 << 30,
|
||||
CPUID_FEATURES_ECX_PKS = 1 << 31,
|
||||
CPUID_FEATURES_EDX_SGX_KEYS = 1 << 1,
|
||||
CPUID_FEATURES_EDX_AVX512_4VNNIW = 1 << 2,
|
||||
CPUID_FEATURES_EDX_AVX512_4FMAPS = 1 << 3,
|
||||
CPUID_FEATURES_EDX_FAST_SHORT_REP_MOV = 1 << 4,
|
||||
CPUID_FEATURES_EDX_UINTR = 1 << 5,
|
||||
CPUID_FEATURES_EDX_AVX512_VPINTERSECT = 1 << 8,
|
||||
CPUID_FEATURES_EDX_SRBDS_CTRL = 1 << 9,
|
||||
CPUID_FEATURES_EDX_MD_CLEAR = 1 << 10,
|
||||
CPUID_FEATURES_EDX_RTM_ALWAYS_ABORT = 1 << 11,
|
||||
CPUID_FEATURES_EDX_RTM_FORCE_ABORT = 1 << 13,
|
||||
CPUID_FEATURES_EDX_SERIALIZE = 1 << 14,
|
||||
CPUID_FEATURES_EDX_HYBRID = 1 << 15,
|
||||
CPUID_FEATURES_EDX_TSXLDTRK = 1 << 16,
|
||||
CPUID_FEATURES_EDX_PCONFIG = 1 << 18,
|
||||
CPUID_FEATURES_EDX_ARCH_LBR = 1 << 19,
|
||||
CPUID_FEATURES_EDX_CET_IBT = 1 << 20,
|
||||
CPUID_FEATURES_EDX_AMX_BF16 = 1 << 22,
|
||||
CPUID_FEATURES_EDX_AVX512_FP16 = 1 << 23,
|
||||
CPUID_FEATURES_EDX_AMX_TILE = 1 << 24,
|
||||
CPUID_FEATURES_EDX_AMX_INT8 = 1 << 25,
|
||||
CPUID_FEATURES_EDX_SCA_IBRS_IBPB = 1 << 26,
|
||||
CPUID_FEATURES_EDX_SCA_STIBP = 1 << 27,
|
||||
CPUID_FEATURES_EDX_L1D_FLUSH = 1 << 28,
|
||||
CPUID_FEATURES_EDX_ARCH_CAPABILITIES_MSR = 1 << 29,
|
||||
CPUID_FEATURES_EDX_CORE_CAPABILITIES_MSR = 1 << 30,
|
||||
CPUID_FEATURES_EDX_SCA_SSBD = 1 << 31
|
||||
} CPUID_FEATURES_STANDARD7_LEAF0, *PCPUID_FEATURES_STANDARD7_LEAF0;
|
||||
|
||||
/* CPUID STD7 features (0x00000007, subleaf 1) enumeration list */
|
||||
typedef enum _CPUID_FEATURES_STANDARD7_LEAF1
|
||||
{
|
||||
CPUID_FEATURES_EAX_SHA512 = 1 << 0,
|
||||
CPUID_FEATURES_EAX_SM3 = 1 << 1,
|
||||
CPUID_FEATURES_EAX_SM4 = 1 << 2,
|
||||
CPUID_FEATURES_EAX_RAO_INT = 1 << 3,
|
||||
CPUID_FEATURES_EAX_AVX_VNNI = 1 << 4,
|
||||
CPUID_FEATURES_EAX_AVX512_BF16 = 1 << 5,
|
||||
CPUID_FEATURES_EAX_LASS = 1 << 6,
|
||||
CPUID_FEATURES_EAX_CMPCCXADD = 1 << 7,
|
||||
CPUID_FEATURES_EAX_ARCH_PERFMON = 1 << 8,
|
||||
CPUID_FEATURES_EAX_FAST_ZEROLEN_REP_MOVSB = 1 << 10,
|
||||
CPUID_FEATURES_EAX_FAST_ZEROLEN_REP_STOSB = 1 << 11,
|
||||
CPUID_FEATURES_EAX_FAST_ZEROLEN_REP_CMPSB = 1 << 12,
|
||||
CPUID_FEATURES_EAX_FRED = 1 << 17,
|
||||
CPUID_FEATURES_EAX_LKGS = 1 << 18,
|
||||
CPUID_FEATURES_EAX_WRMSRNS = 1 << 19,
|
||||
CPUID_FEATURES_EAX_NMI_SOURCE_REPORTING = 1 << 20,
|
||||
CPUID_FEATURES_EAX_AMX_FP16 = 1 << 21,
|
||||
CPUID_FEATURES_EAX_HRESET = 1 << 22,
|
||||
CPUID_FEATURES_EAX_AVX_IFMA = 1 << 23,
|
||||
CPUID_FEATURES_EAX_LAM = 1 << 26,
|
||||
CPUID_FEATURES_EAX_MSRLIST = 1 << 27,
|
||||
CPUID_FEATURES_EAX_INVD_DISABLE = 1 << 30,
|
||||
CPUID_FEATURES_EAX_MOVRS = 1 << 31,
|
||||
CPUID_FEATURES_EBX_PPIN = 1 << 0,
|
||||
CPUID_FEATURES_EBX_TSE = 1 << 1,
|
||||
CPUID_FEATURES_EBX_CPUIDMAXVAL_LIM_RMV = 1 << 3,
|
||||
CPUID_FEATURES_ECX_MSR_IMM = 1 << 5,
|
||||
CPUID_FEATURES_EDX_AVX_VNNI_INT8 = 1 << 4,
|
||||
CPUID_FEATURES_EDX_AVX_NE_CONVERT = 1 << 5,
|
||||
CPUID_FEATURES_EDX_AMX_COMPLEX = 1 << 8,
|
||||
CPUID_FEATURES_EDX_AVX_VNNI_INT16 = 1 << 10,
|
||||
CPUID_FEATURES_EDX_USER_TIMER = 1 << 13,
|
||||
CPUID_FEATURES_EDX_PREFETCHI = 1 << 14,
|
||||
CPUID_FEATURES_EDX_USER_MSR = 1 << 15,
|
||||
CPUID_FEATURES_EDX_UIRET_UIF = 1 << 17,
|
||||
CPUID_FEATURES_EDX_CET_SSS = 1 << 18,
|
||||
CPUID_FEATURES_EDX_AVX10 = 1 << 19,
|
||||
CPUID_FEATURES_EDX_APX = 1 << 21,
|
||||
CPUID_FEATURES_EDX_MWAIT_AND_LEAF5 = 1 << 23
|
||||
} CPUID_FEATURES_STANDARD7_LEAF1, *PCPUID_FEATURES_STANDARD7_LEAF1;
|
||||
} CPUID_FEATURES, *PCPUID_FEATURES;
|
||||
|
||||
/* CPUID requests */
|
||||
typedef enum _CPUID_REQUESTS
|
||||
{
|
||||
CPUID_GET_VENDOR_STRING,
|
||||
CPUID_GET_STANDARD1_FEATURES,
|
||||
CPUID_GET_TLB_CACHE,
|
||||
CPUID_GET_SERIAL,
|
||||
CPUID_GET_CACHE_TOPOLOGY,
|
||||
CPUID_GET_MONITOR_MWAIT,
|
||||
CPUID_GET_POWER_MANAGEMENT,
|
||||
CPUID_GET_STANDARD7_FEATURES
|
||||
CPUID_GET_CPU_FEATURES,
|
||||
CPUID_GET_TLB,
|
||||
CPUID_GET_SERIAL
|
||||
} CPUID_REQUESTS, *PCPUID_REQUESTS;
|
||||
|
||||
/* Processor identification information */
|
||||
@@ -396,6 +204,13 @@ typedef struct _CPU_IDENTIFICATION
|
||||
UCHAR VendorName[13];
|
||||
} CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
|
||||
|
||||
/* Processor features */
|
||||
typedef struct _CPU_FEATURES
|
||||
{
|
||||
CPUID_FEATURES Ecx;
|
||||
CPUID_FEATURES Edx;
|
||||
} CPU_FEATURES, *PCPU_FEATURES;
|
||||
|
||||
/* CPUID registers */
|
||||
typedef struct _CPUID_REGISTERS
|
||||
{
|
||||
@@ -419,11 +234,4 @@ typedef struct _CPUID_SIGNATURE
|
||||
ULONG Unused2:4;
|
||||
} CPU_SIGNATURE, *PCPU_SIGNATURE;
|
||||
|
||||
/* Trampoline types */
|
||||
typedef enum _TRAMPOLINE_TYPE
|
||||
{
|
||||
TrampolineApStartup,
|
||||
TrampolineEnableXpa
|
||||
} TRAMPOLINE_TYPE, *PTRAMPOLINE_TYPE;
|
||||
|
||||
#endif /* __XTDK_AMD64_ARTYPES_H */
|
||||
|
@@ -15,38 +15,32 @@
|
||||
#include <amd64/xtstruct.h>
|
||||
|
||||
|
||||
/* Hardware layer routines forward references */
|
||||
XTCLINK
|
||||
/* HAL library routines forward references */
|
||||
XTCDECL
|
||||
UCHAR
|
||||
HlReadPort8(IN USHORT Port);
|
||||
HlIoPortInByte(IN USHORT Port);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
USHORT
|
||||
HlReadPort16(IN USHORT Port);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
ULONG
|
||||
HlReadPort32(IN USHORT Port);
|
||||
HlIoPortInLong(IN USHORT Port);
|
||||
|
||||
XTCDECL
|
||||
USHORT
|
||||
HlIoPortInShort(IN USHORT Port);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
HlWritePort8(IN USHORT Port,
|
||||
HlIoPortOutByte(IN USHORT Port,
|
||||
IN UCHAR Data);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
HlWritePort16(IN USHORT Port,
|
||||
IN USHORT Value);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
HlWritePort32(IN USHORT Port,
|
||||
HlIoPortOutLong(IN USHORT Port,
|
||||
IN ULONG Value);
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
HlIoPortOutShort(IN USHORT Port,
|
||||
IN USHORT Value);
|
||||
|
||||
#endif /* __XTDK_AMD64_HLFUNCS_H */
|
||||
|
@@ -42,143 +42,37 @@
|
||||
#define APIC_DF_FLAT 0xFFFFFFFF
|
||||
#define APIC_DF_CLUSTER 0x0FFFFFFF
|
||||
|
||||
/* APIC delivery modes */
|
||||
#define APIC_DM_FIXED 0
|
||||
#define APIC_DM_LOWPRIO 1
|
||||
#define APIC_DM_SMI 2
|
||||
#define APIC_DM_REMOTE 3
|
||||
#define APIC_DM_NMI 4
|
||||
#define APIC_DM_INIT 5
|
||||
#define APIC_DM_STARTUP 6
|
||||
#define APIC_DM_EXTINT 7
|
||||
|
||||
/* APIC trigger modes */
|
||||
#define APIC_TGM_EDGE 0
|
||||
#define APIC_TGM_LEVEL 1
|
||||
|
||||
/* APIC LDR (Logical Destination Register) shifts */
|
||||
#define APIC_X2APIC_LDR_SHIFT 16
|
||||
#define APIC_XAPIC_LDR_SHIFT 24
|
||||
|
||||
/* Maximum number of I/O APICs */
|
||||
#define APIC_MAX_IOAPICS 64
|
||||
|
||||
/* 8259/ISP PIC ports definitions */
|
||||
#define PIC1_CONTROL_PORT 0x20
|
||||
#define PIC1_DATA_PORT 0x21
|
||||
#define PIC1_ELCR_PORT 0x04D0
|
||||
#define PIC2_CONTROL_PORT 0xA0
|
||||
#define PIC2_DATA_PORT 0xA1
|
||||
#define PIC2_ELCR_PORT 0x04D1
|
||||
|
||||
/* PIC vector definitions */
|
||||
#define PIC1_VECTOR_SPURIOUS 0x37
|
||||
|
||||
/* Serial ports information */
|
||||
#define COMPORT_ADDRESS {0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8}
|
||||
#define COMPORT_COUNT 8
|
||||
/* Serial port I/O addresses */
|
||||
#define COMPORT_ADDRESSES {0x000, 0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8}
|
||||
|
||||
/* Initial stall factor */
|
||||
#define INITIAL_STALL_FACTOR 100
|
||||
|
||||
/* APIC delivery mode enumeration list */
|
||||
typedef enum _APIC_DM
|
||||
{
|
||||
APIC_DM_FIXED,
|
||||
APIC_DM_LOWPRIO,
|
||||
APIC_DM_SMI,
|
||||
APIC_DM_REMOTE,
|
||||
APIC_DM_NMI,
|
||||
APIC_DM_INIT,
|
||||
APIC_DM_STARTUP,
|
||||
APIC_DM_EXTINT,
|
||||
} APIC_DM, *PAPIC_DM;
|
||||
|
||||
/* APIC destination short-hand enumeration list */
|
||||
typedef enum _APIC_DSH
|
||||
{
|
||||
APIC_DSH_Destination,
|
||||
APIC_DSH_Self,
|
||||
APIC_DSH_AllIncludingSelf,
|
||||
APIC_DSH_AllExclusingSelf
|
||||
} APIC_DSH, *PAPIC_DSH;
|
||||
|
||||
/* APIC mode list */
|
||||
typedef enum _APIC_MODE
|
||||
{
|
||||
APIC_MODE_COMPAT,
|
||||
APIC_MODE_X2APIC
|
||||
} APIC_MODE, *PAPIC_MODE;
|
||||
|
||||
/* APIC Register Address Map */
|
||||
typedef enum _APIC_REGISTER
|
||||
{
|
||||
APIC_ID = 0x02, /* APIC ID Register */
|
||||
APIC_VER = 0x03, /* APIC Version Register */
|
||||
APIC_TPR = 0x08, /* Task Priority Register */
|
||||
APIC_APR = 0x09, /* Arbitration Priority Register */
|
||||
APIC_PPR = 0x0A, /* Processor Priority Register (R) */
|
||||
APIC_EOI = 0x0B, /* EOI Register */
|
||||
APIC_RRR = 0x0C, /* Remote Read Register */
|
||||
APIC_LDR = 0x0D, /* Logical Destination Register */
|
||||
APIC_DFR = 0x0E, /* Destination Format Register (not available in extended mode) */
|
||||
APIC_SIVR = 0x0F, /* Spurious Interrupt Vector Register */
|
||||
APIC_ISR = 0x10, /* Interrupt Service Register*/
|
||||
APIC_TMR = 0x18, /* Trigger Mode Register */
|
||||
APIC_IRR = 0x20, /* Interrupt Request Register */
|
||||
APIC_ESR = 0x28, /* Error Status Register */
|
||||
APIC_ICR0 = 0x30, /* Interrupt Command Register */
|
||||
APIC_ICR1 = 0x31, /* Interrupt Command Register (not available in extended mode) */
|
||||
APIC_TMRLVTR = 0x32, /* Timer Local Vector Table */
|
||||
APIC_THRMLVTR = 0x33, /* Thermal Local Vector Table */
|
||||
APIC_PCLVTR = 0x34, /* Performance Counter Local Vector Table */
|
||||
APIC_LINT0 = 0x35, /* LINT0 Local Vector Table */
|
||||
APIC_LINT1 = 0x36, /* LINT1 Local Vector Table */
|
||||
APIC_ERRLVTR = 0x37, /* Error Local Vector Table */
|
||||
APIC_TICR = 0x38, /* Initial Count Register for Timer */
|
||||
APIC_TCCR = 0x39, /* Current Count Register for Timer */
|
||||
APIC_TDCR = 0x3E, /* Timer Divide Configuration Register */
|
||||
APIC_EAFR = 0x40, /* extended APIC Feature register */
|
||||
APIC_EACR = 0x41, /* Extended APIC Control Register */
|
||||
APIC_SEOI = 0x42, /* Specific End Of Interrupt Register */
|
||||
APIC_EXT0LVTR = 0x50, /* Extended Interrupt 0 Local Vector Table */
|
||||
APIC_EXT1LVTR = 0x51, /* Extended Interrupt 1 Local Vector Table */
|
||||
APIC_EXT2LVTR = 0x52, /* Extended Interrupt 2 Local Vector Table */
|
||||
APIC_EXT3LVTR = 0x53 /* Extended Interrupt 3 Local Vector Table */
|
||||
} APIC_REGISTER, *PAPIC_REGISTER;
|
||||
|
||||
/* I8259 PIC interrupt mode enumeration list */
|
||||
typedef enum _PIC_I8259_ICW1_INTERRUPT_MODE
|
||||
{
|
||||
EdgeTriggered,
|
||||
LevelTriggered
|
||||
} PIC_I8259_ICW1_INTERRUPT_MODE, *PPIC_I8259_ICW1_INTERRUPT_MODE;
|
||||
|
||||
/* I8259 PIC interval enumeration list */
|
||||
typedef enum _PIC_I8259_ICW1_INTERVAL
|
||||
{
|
||||
Interval8,
|
||||
Interval4
|
||||
} PIC_I8259_ICW1_INTERVAL, *PPIC_I8259_ICW1_INTERVAL;
|
||||
|
||||
/* I8259 PIC operating mode enumeration list */
|
||||
typedef enum _PIC_I8259_ICW1_OPERATING_MODE
|
||||
{
|
||||
Cascade,
|
||||
Single
|
||||
} PIC_I8259_ICW1_OPERATING_MODE, *PPIC_I8259_ICW1_OPERATING_MODE;
|
||||
|
||||
/* I8259 PIC buffered mode enumeration list */
|
||||
typedef enum _PIC_I8259_ICW4_BUFFERED_MODE
|
||||
{
|
||||
NonBuffered,
|
||||
NonBuffered2,
|
||||
BufferedSlave,
|
||||
BufferedMaster
|
||||
} PIC_I8259_ICW4_BUFFERED_MODE, *PPIC_I8259_ICW4_BUFFERED_MODE;
|
||||
|
||||
/* I8259 PIC End Of Interrupt (EOI) mode enumeration list */
|
||||
typedef enum _PIC_I8259_ICW4_EOI_MODE
|
||||
{
|
||||
NormalEoi,
|
||||
AutomaticEoi
|
||||
} PIC_I8259_ICW4_EOI_MODE, *PPIC_I8259_ICW4_EOI_MODE;
|
||||
|
||||
/* I8259 PIC system mode enumeration list */
|
||||
typedef enum _PIC_I8259_ICW4_SYSTEM_MODE
|
||||
{
|
||||
Mcs8085Mode,
|
||||
New8086Mode
|
||||
} PIC_I8259_ICW4_SYSTEM_MODE, *PPIC_I8259_ICW4_SYSTEM_MODE;
|
||||
|
||||
/* APIC Base Register */
|
||||
typedef union _APIC_BASE_REGISTER
|
||||
{
|
||||
@@ -195,31 +89,6 @@ typedef union _APIC_BASE_REGISTER
|
||||
};
|
||||
} APIC_BASE_REGISTER, *PAPIC_BASE_REGISTER;
|
||||
|
||||
/* APIC Command Register */
|
||||
typedef union _APIC_COMMAND_REGISTER
|
||||
{
|
||||
ULONGLONG LongLong;
|
||||
struct
|
||||
{
|
||||
ULONG Long0;
|
||||
ULONG Long1;
|
||||
};
|
||||
struct
|
||||
{
|
||||
ULONGLONG Vector:8;
|
||||
ULONGLONG DeliveryMode:3;
|
||||
ULONGLONG DestinationMode:1;
|
||||
ULONGLONG DeliveryStatus:1;
|
||||
ULONGLONG ReservedMBZ:1;
|
||||
ULONGLONG Level:1;
|
||||
ULONGLONG TriggerMode:1;
|
||||
ULONGLONG RemoteReadStatus:2;
|
||||
ULONGLONG DestinationShortHand:2;
|
||||
ULONGLONG Reserved2MBZ:36;
|
||||
ULONGLONG Destination:8;
|
||||
};
|
||||
} APIC_COMMAND_REGISTER, *PAPIC_COMMAND_REGISTER;
|
||||
|
||||
/* APIC Local Vector Table (LVT) Register */
|
||||
typedef union _APIC_LVT_REGISTER
|
||||
{
|
||||
@@ -227,7 +96,7 @@ typedef union _APIC_LVT_REGISTER
|
||||
struct
|
||||
{
|
||||
ULONG Vector:8;
|
||||
ULONG DeliveryMode:3;
|
||||
ULONG MessageType:3;
|
||||
ULONG Reserved1:1;
|
||||
ULONG DeliveryStatus:1;
|
||||
ULONG Reserved2:1;
|
||||
@@ -252,69 +121,14 @@ typedef union _APIC_SPURIOUS_REGISTER
|
||||
};
|
||||
} APIC_SPURIOUS_REGISTER, *PAPIC_SPURIOUS_REGISTER;
|
||||
|
||||
/* I8259 PIC register structure */
|
||||
typedef union _PIC_I8259_ICW1
|
||||
/* Processor identity structure */
|
||||
typedef struct _HAL_PROCESSOR_IDENTITY
|
||||
{
|
||||
struct
|
||||
{
|
||||
UCHAR NeedIcw4:1;
|
||||
UCHAR OperatingMode:1;
|
||||
UCHAR Interval:1;
|
||||
UCHAR InterruptMode:1;
|
||||
UCHAR Init:1;
|
||||
UCHAR InterruptVectorAddress:3;
|
||||
};
|
||||
UCHAR Bits;
|
||||
} PIC_I8259_ICW1, *PPIC_I8259_ICW1;
|
||||
|
||||
/* I8259 PIC register structure */
|
||||
typedef union _PIC_I8259_ICW2
|
||||
{
|
||||
struct
|
||||
{
|
||||
UCHAR Sbz:3;
|
||||
UCHAR InterruptVector:5;
|
||||
};
|
||||
UCHAR Bits;
|
||||
} PIC_I8259_ICW2, *PPIC_I8259_ICW2;
|
||||
|
||||
/* I8259 PIC register structure */
|
||||
typedef union _PIC_I8259_ICW3
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
UCHAR SlaveIrq0:1;
|
||||
UCHAR SlaveIrq1:1;
|
||||
UCHAR SlaveIrq2:1;
|
||||
UCHAR SlaveIrq3:1;
|
||||
UCHAR SlaveIrq4:1;
|
||||
UCHAR SlaveIrq5:1;
|
||||
UCHAR SlaveIrq6:1;
|
||||
UCHAR SlaveIrq7:1;
|
||||
};
|
||||
struct
|
||||
{
|
||||
UCHAR SlaveId:3;
|
||||
UCHAR Reserved:5;
|
||||
};
|
||||
};
|
||||
UCHAR Bits;
|
||||
} PIC_I8259_ICW3, *PPIC_I8259_ICW3;
|
||||
|
||||
/* I8259 PIC register structure */
|
||||
typedef union _PIC_I8259_ICW4
|
||||
{
|
||||
struct
|
||||
{
|
||||
UCHAR SystemMode:1;
|
||||
UCHAR EoiMode:1;
|
||||
UCHAR BufferedMode:2;
|
||||
UCHAR SpecialFullyNestedMode:1;
|
||||
UCHAR Reserved:3;
|
||||
};
|
||||
UCHAR Bits;
|
||||
} PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
||||
UCHAR ProcessorId;
|
||||
UCHAR LApicId;
|
||||
BOOLEAN Bsp;
|
||||
BOOLEAN Started;
|
||||
PKPROCESSOR_BLOCK ProcessorBlock;
|
||||
} HAL_PROCESSOR_IDENTITY, *PHAL_PROCESSOR_IDENTITY;
|
||||
|
||||
#endif /* __XTDK_AMD64_HLTYPES_H */
|
||||
|
@@ -67,6 +67,31 @@
|
||||
#define AMD64_INTERRUPT_GATE 0xE
|
||||
#define AMD64_TRAP_GATE 0xF
|
||||
|
||||
/* EFLAGS bits definitions */
|
||||
#define EFLAGS_NF_MASK 0x00000000L /* None */
|
||||
#define EFLAGS_CF_MASK 0x00000001L /* Carry */
|
||||
#define EFLAGS_PF_MASK 0x00000004L /* Parity */
|
||||
#define EFLAGS_AF_MASK 0x00000010L /* Aux Carry */
|
||||
#define EFLAGS_ZF_MASK 0x00000040L /* Zero */
|
||||
#define EFLAGS_SF_MASK 0x00000080L /* Sign */
|
||||
#define EFLAGS_TF 0x00000100L /* Trap */
|
||||
#define EFLAGS_INTERRUPT_MASK 0x00000200L /* Interrupt */
|
||||
#define EFLAGS_DF_MASK 0x00000400L /* Direction */
|
||||
#define EFLAGS_OF_MASK 0x00000800L /* Overflow */
|
||||
#define EFLAGS_IOPL_MASK 0x00003000L /* I/O Privilege */
|
||||
#define EFLAGS_NT 0x00004000L /* Nested Task */
|
||||
#define EFLAGS_SIGN_MASK 0x00008000L /* Sign */
|
||||
#define EFLAGS_RF 0x00010000L /* Resume */
|
||||
#define EFLAGS_V86_MASK 0x00020000L /* Virtual 8086 */
|
||||
#define EFLAGS_ALIGN_CHECK 0x00040000L /* Alignment Check */
|
||||
#define EFLAGS_VIF 0x00080000L /* Virtual Interrupt */
|
||||
#define EFLAGS_VIP 0x00100000L /* Virtual Interrupt Pending */
|
||||
#define EFLAGS_ID_MASK 0x00200000L /* Identification */
|
||||
|
||||
/* EFLAGS sanitize masks */
|
||||
#define EFLAGS_KERNELMODE 0x00210FD5L
|
||||
#define EFLAGS_USERMODE 0x00010DD5L
|
||||
|
||||
/* Context control flags */
|
||||
#define CONTEXT_ARCHITECTURE 0x00100000
|
||||
#define CONTEXT_CONTROL (CONTEXT_ARCHITECTURE | 0x01)
|
||||
@@ -117,10 +142,6 @@
|
||||
/* XTOS Kernel stack guard pages */
|
||||
#define KERNEL_STACK_GUARD_PAGES 1
|
||||
|
||||
/* Processor structures size */
|
||||
#define KPROCESSOR_STRUCTURES_SIZE ((2 * KERNEL_STACK_SIZE) + (GDT_ENTRIES * sizeof(KGDTENTRY)) + sizeof(KTSS) + \
|
||||
sizeof(KPROCESSOR_BLOCK) + MM_PAGE_SIZE)
|
||||
|
||||
/* Kernel frames */
|
||||
#define KEXCEPTION_FRAME_SIZE sizeof(KEXCEPTION_FRAME)
|
||||
#define KSWITCH_FRAME_SIZE sizeof(KSWITCH_FRAME)
|
||||
@@ -293,7 +314,7 @@ typedef struct _KTSS
|
||||
ULONG64 Reserved1;
|
||||
USHORT Reserved2;
|
||||
USHORT IoMapBase;
|
||||
} PACKED KTSS, *PKTSS;
|
||||
} PACK KTSS, *PKTSS;
|
||||
|
||||
/* Exception frame definition */
|
||||
typedef struct _KEXCEPTION_FRAME
|
||||
@@ -470,13 +491,14 @@ typedef struct _KPROCESSOR_STATE
|
||||
typedef struct _KPROCESSOR_CONTROL_BLOCK
|
||||
{
|
||||
ULONG MxCsr;
|
||||
UCHAR CpuNumber;
|
||||
UCHAR Number;
|
||||
PKTHREAD CurrentThread;
|
||||
PKTHREAD IdleThread;
|
||||
PKTHREAD NextThread;
|
||||
ULONG64 RspBase;
|
||||
ULONG_PTR SetMember;
|
||||
CPU_IDENTIFICATION CpuId;
|
||||
CPU_FEATURES CpuFeatures;
|
||||
KPROCESSOR_STATE ProcessorState;
|
||||
KSPIN_LOCK_QUEUE LockQueue[MaximumLock];
|
||||
KDPC_DATA DpcData[2];
|
||||
@@ -505,13 +527,8 @@ typedef struct _KPROCESSOR_BLOCK
|
||||
PKIDTENTRY IdtBase;
|
||||
KRUNLEVEL RunLevel;
|
||||
KPROCESSOR_CONTROL_BLOCK Prcb;
|
||||
ULONG Irr;
|
||||
ULONG IrrActive;
|
||||
ULONG Idr;
|
||||
ULONG ContextSwitches;
|
||||
KAFFINITY SetMember;
|
||||
ULONG StallScaleFactor;
|
||||
UCHAR CpuNumber;
|
||||
} KPROCESSOR_BLOCK, *PKPROCESSOR_BLOCK;
|
||||
|
||||
/* Thread Environment Block (TEB) structure definition */
|
||||
|
@@ -14,35 +14,22 @@
|
||||
|
||||
|
||||
/* Pages related definitions */
|
||||
#define MM_PAGE_MASK (MM_PAGE_SIZE - 1)
|
||||
#define MM_PAGE_MASK 0xFFF
|
||||
#define MM_PAGE_SHIFT 12L
|
||||
#define MM_PAGE_SIZE 4096
|
||||
|
||||
/* Page directory and page base addresses for 4-level paging */
|
||||
#define MM_PTE_BASE 0xFFFFF68000000000ULL
|
||||
#define MM_PDE_BASE 0xFFFFF6FB40000000ULL
|
||||
#define MM_PPE_BASE 0xFFFFF6FB7DA00000ULL
|
||||
#define MM_PXE_BASE 0xFFFFF6FB7DBED000ULL
|
||||
#define MM_PTE_BASE 0xFFFFF68000000000UI64
|
||||
#define MM_PDE_BASE 0xFFFFF6FB40000000UI64
|
||||
#define MM_PPE_BASE 0xFFFFF6FB7DA00000UI64
|
||||
#define MM_PXE_BASE 0xFFFFF6FB7DBED000UI64
|
||||
|
||||
/* Page directory and page base addresses for 5-level paging */
|
||||
#define MM_PTE_LA57_BASE 0xFFFF000000000000ULL
|
||||
#define MM_PDE_LA57_BASE 0xFFFF010000000000ULL
|
||||
#define MM_PPE_LA57_BASE 0xFFFF010800000000ULL
|
||||
#define MM_PXE_LA57_BASE 0xFFFF010840000000ULL
|
||||
#define MM_P5E_LA57_BASE 0xFFFF010840200000ULL
|
||||
|
||||
/* PTE shift values */
|
||||
#define MM_PTE_SHIFT 3
|
||||
#define MM_PTI_SHIFT 12
|
||||
#define MM_PDI_SHIFT 21
|
||||
#define MM_PPI_SHIFT 30
|
||||
#define MM_PXI_SHIFT 39
|
||||
#define MM_P5I_SHIFT 48
|
||||
|
||||
/* Number of PTEs per page */
|
||||
#define MM_PTE_PER_PAGE 512
|
||||
#define MM_PDE_PER_PAGE 512
|
||||
#define MM_PPE_PER_PAGE 512
|
||||
#define MM_PTE_SHIFT 3
|
||||
|
||||
#define MM_PXE_PER_PAGE 512
|
||||
|
||||
/* Minimum number of physical pages needed by the system */
|
||||
@@ -51,21 +38,6 @@
|
||||
/* Default number of secondary colors */
|
||||
#define MM_DEFAULT_SECONDARY_COLORS 64
|
||||
|
||||
/* Number of HAL allocation descriptors */
|
||||
#define MM_HARDWARE_ALLOCATION_DESCRIPTORS 64
|
||||
|
||||
/* Kernel HAL heap initial start address */
|
||||
#define MM_HARDWARE_HEAP_START_ADDRESS ((PVOID)(((ULONG_PTR)MM_HARDWARE_VA_START) + 1024 * 1024))
|
||||
|
||||
/* HAL memory pool virtual address start */
|
||||
#define MM_HARDWARE_VA_START 0xFFFFFFFFFFC00000ULL
|
||||
|
||||
/* Maximum physical address used by HAL allocations */
|
||||
#define MM_MAXIMUM_PHYSICAL_ADDRESS 0x00000000FFFFFFFFULL
|
||||
|
||||
/* Trampoline code address */
|
||||
#define MM_TRAMPOLINE_ADDRESS 0x80000
|
||||
|
||||
/* Page size enumeration list */
|
||||
typedef enum _PAGE_SIZE
|
||||
{
|
||||
@@ -95,18 +67,6 @@ typedef struct _HARDWARE_PTE
|
||||
ULONGLONG NoExecute:1;
|
||||
} HARDWARE_PTE, *PHARDWARE_PTE;
|
||||
|
||||
/* Page map information structure definition */
|
||||
typedef struct _MMPAGEMAP_INFO
|
||||
{
|
||||
BOOLEAN Xpa;
|
||||
ULONGLONG PteBase;
|
||||
ULONGLONG PdeBase;
|
||||
ULONGLONG PpeBase;
|
||||
ULONGLONG PxeBase;
|
||||
ULONGLONG P5eBase;
|
||||
ULONG VaBits;
|
||||
} MMPAGEMAP_INFO, *PMMPAGEMAP_INFO;
|
||||
|
||||
/* A Page Table Entry on AMD64 system */
|
||||
typedef struct _MMPTE_HARDWARE
|
||||
{
|
||||
|
@@ -13,28 +13,15 @@
|
||||
|
||||
|
||||
/* Architecture-specific enumeration lists forward references */
|
||||
typedef enum _APIC_DM APIC_DM, *PAPIC_DM;
|
||||
typedef enum _APIC_DSH APIC_DSH, *PAPIC_DSH;
|
||||
typedef enum _APIC_MODE APIC_MODE, *PAPIC_MODE;
|
||||
typedef enum _APIC_REGISTER APIC_REGISTER, *PAPIC_REGISTER;
|
||||
typedef enum _CPU_VENDOR CPU_VENDOR, *PCPU_VENDOR;
|
||||
typedef enum _CPUID_FEATURES_EXTENDED CPUID_FEATURES_EXTENDED, *PCPUID_FEATURES_EXTENDED;
|
||||
typedef enum _CPUID_FEATURES_STANDARD1 CPUID_FEATURES_STANDARD1, *PCPUID_FEATURES_STANDARD1;
|
||||
typedef enum _CPUID_FEATURES_STANDARD7_LEAF0 CPUID_FEATURES_STANDARD7_LEAF0, *PCPUID_FEATURES_STANDARD7_LEAF0;
|
||||
typedef enum _CPUID_FEATURES_STANDARD7_LEAF1 CPUID_FEATURES_STANDARD7_LEAF1, *PCPUID_FEATURES_STANDARD7_LEAF1;
|
||||
typedef enum _CPUID_FEATURES CPUID_FEATURES, *PCPUID_FEATURES;
|
||||
typedef enum _CPUID_REQUESTS CPUID_REQUESTS, *PCPUID_REQUESTS;
|
||||
typedef enum _PAGE_SIZE PAGE_SIZE, *PPAGE_SIZE;
|
||||
typedef enum _PIC_I8259_ICW1_INTERRUPT_MODE PIC_I8259_ICW1_INTERRUPT_MODE, *PPIC_I8259_ICW1_INTERRUPT_MODE;
|
||||
typedef enum _PIC_I8259_ICW1_INTERVAL PIC_I8259_ICW1_INTERVAL, *PPIC_I8259_ICW1_INTERVAL;
|
||||
typedef enum _PIC_I8259_ICW1_OPERATING_MODE PIC_I8259_ICW1_OPERATING_MODE, *PPIC_I8259_ICW1_OPERATING_MODE;
|
||||
typedef enum _PIC_I8259_ICW4_BUFFERED_MODE PIC_I8259_ICW4_BUFFERED_MODE, *PPIC_I8259_ICW4_BUFFERED_MODE;
|
||||
typedef enum _PIC_I8259_ICW4_EOI_MODE PIC_I8259_ICW4_EOI_MODE, *PPIC_I8259_ICW4_EOI_MODE;
|
||||
typedef enum _PIC_I8259_ICW4_SYSTEM_MODE PIC_I8259_ICW4_SYSTEM_MODE, *PPIC_I8259_ICW4_SYSTEM_MODE;
|
||||
typedef enum _TRAMPOLINE_TYPE TRAMPOLINE_TYPE, *PTRAMPOLINE_TYPE;
|
||||
|
||||
/* Architecture-specific structures forward references */
|
||||
typedef struct _CONTEXT CONTEXT, *PCONTEXT;
|
||||
typedef struct _CPU_IDENTIFICATION CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
|
||||
typedef struct _CPU_FEATURES CPU_FEATURES, *PCPU_FEATURES;
|
||||
typedef struct _CPUID_REGISTERS CPUID_REGISTERS, *PCPUID_REGISTERS;
|
||||
typedef struct _CPUID_SIGNATURE CPUID_SIGNATURE, *PCPUID_SIGNATURE;
|
||||
typedef struct _FLOATING_SAVE_AREA FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
|
||||
@@ -52,7 +39,6 @@ typedef struct _KSWITCH_FRAME KSWITCH_FRAME, *PKSWITCH_FRAME;
|
||||
typedef struct _KTHREAD_INIT_FRAME KTHREAD_INIT_FRAME, *PKTHREAD_INIT_FRAME;
|
||||
typedef struct _KTRAP_FRAME KTRAP_FRAME, *PKTRAP_FRAME;
|
||||
typedef struct _KTSS KTSS, *PKTSS;
|
||||
typedef struct _MMPAGEMAP_INFO MMPAGEMAP_INFO, *PMMPAGEMAP_INFO;
|
||||
typedef struct _MMPFN MMPFN, *PMMPFN;
|
||||
typedef struct _MMPTE_HARDWARE MMPTE_HARDWARE, *PMMPTE_HARDWARE;
|
||||
typedef struct _MMPTE_HARDWARE_LARGEPAGE MMPTE_HARDWARE_LARGEPAGE, *PMMPTE_HARDWARE_LARGEPAGE;
|
||||
@@ -64,18 +50,9 @@ typedef struct _MMPTE_TRANSITION MMPTE_TRANSITION, *PMMPTE_TRANSITION;
|
||||
typedef struct _THREAD_ENVIRONMENT_BLOCK THREAD_ENVIRONMENT_BLOCK, *PTHREAD_ENVIRONMENT_BLOCK;
|
||||
|
||||
/* Unions forward references */
|
||||
typedef union _APIC_BASE_REGISTER APIC_BASE_REGISTER, *PAPIC_BASE_REGISTER;
|
||||
typedef union _APIC_COMMAND_REGISTER APIC_COMMAND_REGISTER, *PAPIC_COMMAND_REGISTER;
|
||||
typedef union _APIC_LVT_REGISTER APIC_LVT_REGISTER, *PAPIC_LVT_REGISTER;
|
||||
typedef union _APIC_SPURIOUS_REGISTER APIC_SPURIOUS_REGISTER, *PAPIC_SPURIOUS_REGISTER;
|
||||
typedef union _MMPTE MMP5E, *PMMP5E;
|
||||
typedef union _MMPTE MMPDE, *PMMPDE;
|
||||
typedef union _MMPTE MMPPE, *PMMPPE;
|
||||
typedef union _MMPTE MMPTE, *PMMPTE;
|
||||
typedef union _MMPTE MMPXE, *PMMPXE;
|
||||
typedef union _PIC_I8259_ICW1 PIC_I8259_ICW1, *PPIC_I8259_ICW1;
|
||||
typedef union _PIC_I8259_ICW2 PIC_I8259_ICW2, *PPIC_I8259_ICW2;
|
||||
typedef union _PIC_I8259_ICW3 PIC_I8259_ICW3, *PPIC_I8259_ICW3;
|
||||
typedef union _PIC_I8259_ICW4 PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
||||
|
||||
#endif /* __XTDK_AMD64_XTSTRUCT_H */
|
||||
|
@@ -14,7 +14,6 @@
|
||||
|
||||
|
||||
/* XT BootLoader routines forward references */
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlGetXtLdrProtocol(IN PEFI_SYSTEM_TABLE SystemTable,
|
||||
|
@@ -4,7 +4,6 @@
|
||||
* FILE: sdk/xtdk/bltypes.h
|
||||
* DESCRIPTION: XT Boot Loader structures definitions
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
* Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTDK_BLTYPES_H
|
||||
@@ -19,11 +18,10 @@
|
||||
|
||||
/* EFI XT boot devices */
|
||||
#define XTBL_BOOT_DEVICE_UNKNOWN 0x00
|
||||
#define XTBL_BOOT_DEVICE_ESP 0x01
|
||||
#define XTBL_BOOT_DEVICE_CDROM 0x02
|
||||
#define XTBL_BOOT_DEVICE_FLOPPY 0x04
|
||||
#define XTBL_BOOT_DEVICE_HARDDISK 0x08
|
||||
#define XTBL_BOOT_DEVICE_RAMDISK 0x10
|
||||
#define XTBL_BOOT_DEVICE_CDROM 0x01
|
||||
#define XTBL_BOOT_DEVICE_FLOPPY 0x02
|
||||
#define XTBL_BOOT_DEVICE_HARDDISK 0x03
|
||||
#define XTBL_BOOT_DEVICE_RAMDISK 0x04
|
||||
|
||||
/* XTLDR Debug Port type definitions */
|
||||
#define XTBL_DEBUGPORT_SCREEN 1
|
||||
@@ -42,130 +40,98 @@
|
||||
#define XTBL_TUI_MAX_DIALOG_WIDTH 100
|
||||
|
||||
/* XTLDR Routine pointers */
|
||||
typedef LOADER_MEMORY_TYPE (XTCDECL *PBL_GET_MEMTYPE_ROUTINE)(IN EFI_MEMORY_TYPE EfiMemoryType);
|
||||
typedef LONG (*PBL_GET_MEMTYPE_ROUTINE)(IN LONG EfiMemoryType);
|
||||
|
||||
/* Boot Loader protocol routine pointers */
|
||||
typedef EFI_STATUS (XTCDECL *PBL_ALLOCATE_PAGES)(IN EFI_ALLOCATE_TYPE AllocationType, IN ULONGLONG Size, OUT PEFI_PHYSICAL_ADDRESS Memory);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_ALLOCATE_POOL)(IN UINT_PTR Size, OUT PVOID *Memory);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_BOOTMENU_INITIALIZE_OS_LIST)(IN ULONG MaxNameLength, OUT PXTBL_BOOTMENU_ITEM *MenuEntries, OUT PULONG EntriesCount, OUT PULONG DefaultId);
|
||||
typedef BOOLEAN (XTCDECL *PBL_BOOTUTILS_GET_BOOLEAN_PARAMETER)(IN PCWSTR Parameters, IN PCWSTR Needle);
|
||||
typedef VOID (XTAPI *PBL_BOOTUTILS_GET_TRAMPOLINE_INFORMATION)(IN TRAMPOLINE_TYPE TrampolineType, OUT PVOID *TrampolineCode, OUT PULONG_PTR TrampolineSize);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_BUILD_PAGE_MAP)(IN PXTBL_PAGE_MAPPING PageMap, IN ULONG_PTR SelfMapAddress);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_CLOSE_VOLUME)(IN PEFI_HANDLE VolumeHandle);
|
||||
typedef VOID (XTCDECL *PBL_CLEAR_CONSOLE_LINE)(IN ULONGLONG LineNo);
|
||||
typedef BOOLEAN (XTCDECL *PBL_CPU_CPUID)(IN OUT PCPUID_REGISTERS Registers);
|
||||
typedef ULONG_PTR (XTCDECL *PBL_CPU_READ_CONTROL_REGISTER)(IN USHORT ControlRegister);
|
||||
typedef ULONGLONG (XTCDECL *PBL_CPU_READ_MODEL_SPECIFIC_REGISTER)(IN ULONG Register);
|
||||
typedef VOID (XTCDECL *PBL_CPU_WRITE_CONTROL_REGISTER)(IN USHORT ControlRegister, IN UINT_PTR Value);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_CLOSE_XT_PROTOCOL)(IN PEFI_HANDLE Handle, IN PEFI_GUID ProtocolGuid);
|
||||
typedef BOOLEAN (XTCDECL *PBL_CONFIG_GET_BOOLEAN_VALUE)(IN PCWSTR ConfigName);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_CONFIG_GET_BOOT_OPTION_VALUE)(IN PLIST_ENTRY Options, IN PCWSTR OptionName, OUT PWCHAR *OptionValue);
|
||||
typedef VOID (XTCDECL *PBL_CONFIG_GET_EDITABLE_OPTIONS)(OUT PCWSTR **OptionsArray, OUT PULONG OptionsCount);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_CONFIG_GET_VALUE)(IN PCWSTR ConfigName, OUT PWCHAR *ConfigValue);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_CONFIG_SET_BOOT_OPTION_VALUE)(IN PLIST_ENTRY Options, IN PCWSTR OptionName, IN PCWSTR OptionValue);
|
||||
typedef VOID (XTCDECL *PBL_CONSOLE_CLEAR_SCREEN)();
|
||||
typedef VOID (XTCDECL *PBL_CONSOLE_DISABLE_CURSOR)();
|
||||
typedef VOID (XTCDECL *PBL_CONSOLE_ENABLE_CURSOR)();
|
||||
typedef VOID (XTCDECL *PBL_CONSOLE_PRINT)(IN PCWSTR Format, IN ...);
|
||||
typedef VOID (XTCDECL *PBL_CONSOLE_QUERY_MODE)(OUT PUINT_PTR ResX, OUT PUINT_PTR ResY);
|
||||
typedef VOID (XTCDECL *PBL_CONSOLE_READ_KEY_STROKE)(OUT PEFI_INPUT_KEY Key);
|
||||
typedef VOID (XTCDECL *PBL_CONSOLE_RESET_INPUT_BUFFER)();
|
||||
typedef VOID (XTCDECL *PBL_CONSOLE_SET_ATTRIBUTES)(IN ULONGLONG Attributes);
|
||||
typedef VOID (XTCDECL *PBL_CONSOLE_SET_CURSOR_POSITION)(IN ULONGLONG PosX, IN ULONGLONG PosY);
|
||||
typedef VOID (XTCDECL *PBL_CONSOLE_WRITE)(IN PCWSTR String);
|
||||
typedef SIZE_T (XTAPI *PBL_COMPARE_MEMORY)(IN PCVOID LeftBuffer, IN PCVOID RightBuffer, IN SIZE_T Length);
|
||||
typedef SIZE_T (XTAPI *PBL_WIDESTRING_COMPARE)(IN PCWSTR String1, IN PCWSTR String2, IN SIZE_T Length);
|
||||
typedef EFI_STATUS (*PBL_ALLOCATE_PAGES)(IN ULONGLONG Size, OUT PEFI_PHYSICAL_ADDRESS Memory);
|
||||
typedef EFI_STATUS (*PBL_ALLOCATE_POOL)(IN UINT_PTR Size, OUT PVOID *Memory);
|
||||
typedef EFI_STATUS (*PBL_BOOTMENU_INITIALIZE_OS_LIST)(OUT PXTBL_BOOTMENU_ITEM *MenuEntries, OUT PULONG EntriesCount, OUT PULONG DefaultId);
|
||||
typedef EFI_STATUS (*PBL_BUILD_PAGE_MAP)(IN PXTBL_PAGE_MAPPING PageMap, IN ULONG_PTR SelfMapAddress);
|
||||
typedef EFI_STATUS (*PBL_CLOSE_VOLUME)(IN PEFI_HANDLE VolumeHandle);
|
||||
typedef VOID (*PBL_CLEAR_CONSOLE_LINE)(IN ULONGLONG LineNo);
|
||||
typedef EFI_STATUS (*PBL_CLOSE_XT_PROTOCOL)(IN PEFI_HANDLE Handle, IN PEFI_GUID ProtocolGuid);
|
||||
typedef BOOLEAN (*PBL_CONFIG_GET_BOOLEAN_VALUE)(IN CONST PWCHAR ConfigName);
|
||||
typedef PWCHAR (*PBL_CONFIG_GET_VALUE)(IN CONST PWCHAR ConfigName);
|
||||
typedef VOID (*PBL_CONSOLE_CLEAR_SCREEN)();
|
||||
typedef VOID (*PBL_CONSOLE_DISABLE_CURSOR)();
|
||||
typedef VOID (*PBL_CONSOLE_ENABLE_CURSOR)();
|
||||
typedef VOID (*PBL_CONSOLE_PRINT)(IN PUSHORT Format, IN ...);
|
||||
typedef VOID (*PBL_CONSOLE_QUERY_MODE)(OUT PUINT_PTR ResX, OUT PUINT_PTR ResY);
|
||||
typedef VOID (*PBL_CONSOLE_READ_KEY_STROKE)(OUT PEFI_INPUT_KEY Key);
|
||||
typedef VOID (*PBL_CONSOLE_RESET_INPUT_BUFFER)();
|
||||
typedef VOID (*PBL_CONSOLE_SET_ATTRIBUTES)(IN ULONGLONG Attributes);
|
||||
typedef VOID (*PBL_CONSOLE_SET_CURSOR_POSITION)(IN ULONGLONG PosX, IN ULONGLONG PosY);
|
||||
typedef VOID (*PBL_CONSOLE_WRITE)(IN PUSHORT String);
|
||||
typedef VOID (XTAPI *PBL_COPY_MEMORY)(OUT PVOID Destination, IN PCVOID Source, IN SIZE_T Length);
|
||||
typedef VOID (XTCDECL *PBL_DEBUG_PRINT)(IN PCWSTR Format, IN ...);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_ENTER_FIRMWARE_SETUP)();
|
||||
typedef EFI_STATUS (XTCDECL *PBL_EXIT_BOOT_SERVICES)();
|
||||
typedef EFI_STATUS (XTCDECL *PBL_FIND_BOOT_PROTOCOL)(IN PCWSTR SystemType, OUT PEFI_GUID BootProtocolGuid);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_FREE_PAGES)(IN ULONGLONG Size, IN EFI_PHYSICAL_ADDRESS Memory);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_FREE_POOL)(IN PVOID Memory);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_GET_CONFIGURATION_TABLE)(IN PEFI_GUID TableGuid, OUT PVOID *Table);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_GET_EFI_VARIABLE)(IN PEFI_GUID Vendor, IN PCWSTR VariableName, OUT PVOID *VariableValue);
|
||||
typedef VOID (XTCDECL *PBL_GET_MAPPINGS_COUNT)(IN PXTBL_PAGE_MAPPING PageMap, OUT PULONG NumberOfMappings);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_GET_MEMORY_MAP)(OUT PEFI_MEMORY_MAP MemoryMap);
|
||||
typedef PLIST_ENTRY (XTCDECL *PBL_GET_MODULES_LIST)();
|
||||
typedef ULONGLONG (XTCDECL *PBL_GET_RANDOM_VALUE)(IN OUT PULONGLONG RNGBuffer);
|
||||
typedef INT_PTR (XTCDECL *PBL_GET_SECURE_BOOT_STATUS)();
|
||||
typedef PVOID (XTCDECL *PBL_GET_VIRTUAL_ADDRESS)(IN PXTBL_PAGE_MAPPING PageMap, IN PVOID PhysicalAddress);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_INITIALIZE_ENTROPY)(PULONGLONG RNGBuffer);
|
||||
typedef VOID (XTCDECL *PBL_INITIALIZE_PAGE_MAP)(OUT PXTBL_PAGE_MAPPING PageMap, IN SHORT PageMapLevel, IN PAGE_SIZE PageSize);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_INSTALL_XT_PROTOCOL)(IN PVOID Interface, IN PEFI_GUID Guid);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_INVOKE_BOOT_PROTOCOL)(IN PWCHAR ShortName, IN PLIST_ENTRY OptionsList);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_LOCATE_PROTOCOL_HANDLES)(OUT PEFI_HANDLE *Handles, OUT PUINT_PTR Count, IN PEFI_GUID ProtocolGuid);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_LOAD_EFI_IMAGE)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, IN PVOID ImageData, IN SIZE_T ImageSize, OUT PEFI_HANDLE ImageHandle);
|
||||
typedef VOID (XTCDECL *PBL_LLIST_INITIALIZE_HEAD)(IN PLIST_ENTRY ListHead);
|
||||
typedef VOID (XTCDECL *PBL_LLIST_INSERT_HEAD)(IN OUT PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry);
|
||||
typedef VOID (XTCDECL *PBL_LLIST_INSERT_TAIL)(IN OUT PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry);
|
||||
typedef VOID (XTCDECL *PBL_LLIST_REMOVE_ENTRY)(IN PLIST_ENTRY Entry);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_MAP_EFI_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN OUT PVOID *MemoryMapAddress, IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_MAP_PAGE)(IN PXTBL_PAGE_MAPPING PageMap, IN ULONG_PTR VirtualAddress, IN ULONG_PTR PhysicalAddress, IN ULONG NumberOfPages);
|
||||
typedef EFI_STATUS (XTCDECL *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 VOID (XTAPI *PBL_MOVE_MEMORY)(IN OUT PVOID Destination, IN PCVOID Source, IN SIZE_T Length);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_OPEN_VOLUME)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, OUT PEFI_HANDLE DiskHandle, OUT PEFI_FILE_HANDLE *FsHandle);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_OPEN_PROTOCOL)(OUT PEFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_OPEN_PROTOCOL_HANDLE)(IN EFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid);
|
||||
typedef PVOID (XTCDECL *PBL_PHYSICAL_ADDRESS_TO_VIRTUAL)(IN PVOID PhysicalAddress, IN PVOID PhysicalBase, IN PVOID VirtualBase);
|
||||
typedef UCHAR (XTCDECL *PBL_IOPORT_READ_8)(IN USHORT Port);
|
||||
typedef USHORT (XTCDECL *PBL_IOPORT_READ_16)(IN USHORT Port);
|
||||
typedef ULONG (XTCDECL *PBL_IOPORT_READ_32)(IN USHORT Port);
|
||||
typedef VOID (XTCDECL *PBL_IOPORT_WRITE_8)(IN USHORT Port, IN UCHAR Value);
|
||||
typedef VOID (XTCDECL *PBL_IOPORT_WRITE_16)(IN USHORT Port, IN USHORT Value);
|
||||
typedef VOID (XTCDECL *PBL_IOPORT_WRITE_32)(IN USHORT Port, IN ULONG Value);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_PHYSICAL_LIST_TO_VIRTUAL)(IN PXTBL_PAGE_MAPPING PageMap, IN OUT PLIST_ENTRY ListHead, IN PVOID PhysicalBase, IN PVOID VirtualBase);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_POWER_SYSTEM)();
|
||||
typedef EFI_STATUS (XTCDECL *PBL_READ_FILE)(IN PEFI_FILE_HANDLE DirHandle, IN PCWSTR FileName, OUT PVOID *FileData, OUT PSIZE_T FileSize);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_REGISTER_BOOT_PROTOCOL)(IN PCWSTR SystemType, IN PEFI_GUID BootProtocolGuid);
|
||||
typedef VOID (XTCDECL *PBL_REGISTER_XT_BOOT_MENU)(PVOID BootMenuRoutine);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_SET_EFI_VARIABLE)(IN PEFI_GUID Vendor, IN PCWSTR VariableName, IN PVOID VariableValue, IN UINT_PTR Size);
|
||||
typedef SIZE_T (XTAPI *PBL_STRING_COMPARE)(IN PCSTR String1, IN PCSTR String2, IN SIZE_T Length);
|
||||
typedef SIZE_T (XTAPI *PBL_STRING_LENGTH)(IN PCSTR String, IN SIZE_T MaxLength);
|
||||
typedef SIZE_T (XTAPI *PBL_STRING_TO_WIDESTRING)(OUT PWCHAR Destination, IN PCSTR *Source, IN SIZE_T Length);
|
||||
typedef PCHAR (XTAPI *PBL_STRING_TRIM)(IN PCHAR String);
|
||||
typedef VOID (*PBL_DEBUG_PRINT)(IN PUSHORT Format, IN ...);
|
||||
typedef EFI_STATUS (*PBL_ENTER_FIRMWARE_SETUP)();
|
||||
typedef EFI_STATUS (*PBL_EXIT_BOOT_SERVICES)();
|
||||
typedef EFI_STATUS (*PBL_FIND_BOOT_PROTOCOL)(IN PWCHAR SystemType, OUT PEFI_GUID BootProtocolGuid);
|
||||
typedef EFI_STATUS (*PBL_FREE_PAGES)(IN ULONGLONG Size, IN EFI_PHYSICAL_ADDRESS Memory);
|
||||
typedef EFI_STATUS (*PBL_FREE_POOL)(IN PVOID Memory);
|
||||
typedef EFI_STATUS (*PBL_GET_CONFIGURATION_TABLE)(IN PEFI_GUID TableGuid, OUT PVOID *Table);
|
||||
typedef EFI_STATUS (*PBL_GET_EFI_VARIABLE)(IN PEFI_GUID Vendor, IN PWCHAR VariableName, OUT PVOID *VariableValue);
|
||||
typedef VOID (*PBL_GET_MAPPINGS_COUNT)(IN PXTBL_PAGE_MAPPING PageMap, OUT PULONG NumberOfMappings);
|
||||
typedef EFI_STATUS (*PBL_GET_MEMORY_MAP)(OUT PEFI_MEMORY_MAP MemoryMap);
|
||||
typedef PLIST_ENTRY (*PBL_GET_MODULES_LIST)();
|
||||
typedef ULONGLONG (*PBL_GET_RANDOM_VALUE)(IN OUT PULONGLONG RNGBuffer);
|
||||
typedef INT_PTR (*PBL_GET_SECURE_BOOT_STATUS)();
|
||||
typedef PVOID (*PBL_GET_VIRTUAL_ADDRESS)(IN PXTBL_PAGE_MAPPING PageMap, IN PVOID PhysicalAddress);
|
||||
typedef EFI_STATUS (*PBL_INITIALIZE_ENTROPY)(PULONGLONG RNGBuffer);
|
||||
typedef VOID (*PBL_INITIALIZE_PAGE_MAP)(OUT PXTBL_PAGE_MAPPING PageMap, IN SHORT PageMapLevel, IN PAGE_SIZE PageSize);
|
||||
typedef EFI_STATUS (*PBL_INSTALL_XT_PROTOCOL)(IN PVOID Interface, IN PEFI_GUID Guid);
|
||||
typedef EFI_STATUS (*PBL_INVOKE_BOOT_PROTOCOL)(IN PWCHAR ShortName, IN PLIST_ENTRY OptionsList);
|
||||
typedef EFI_STATUS (*PBL_LOCATE_PROTOCOL_HANDLES)(OUT PEFI_HANDLE *Handles, OUT PUINT_PTR Count, IN PEFI_GUID ProtocolGuid);
|
||||
typedef EFI_STATUS (*PBL_LOAD_EFI_IMAGE)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, IN PVOID ImageData, IN SIZE_T ImageSize, OUT PEFI_HANDLE ImageHandle);
|
||||
typedef EFI_STATUS (*PBL_MAP_EFI_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN OUT PVOID *MemoryMapAddress, IN PBL_GET_MEMTYPE_ROUTINE GetMemoryTypeRoutine);
|
||||
typedef EFI_STATUS (*PBL_MAP_PAGE)(IN PXTBL_PAGE_MAPPING PageMap, IN UINT_PTR VirtualAddress, IN UINT_PTR PhysicalAddress, IN UINT NumberOfPages);
|
||||
typedef EFI_STATUS (*PBL_MAP_VIRTUAL_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN PVOID VirtualAddress, IN PVOID PhysicalAddress, IN ULONGLONG NumberOfPages, IN LOADER_MEMORY_TYPE MemoryType);
|
||||
typedef EFI_STATUS (*PBL_OPEN_VOLUME)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, OUT PEFI_HANDLE DiskHandle, OUT PEFI_FILE_HANDLE *FsHandle);
|
||||
typedef EFI_STATUS (*PBL_OPEN_PROTOCOL)(OUT PEFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid);
|
||||
typedef EFI_STATUS (*PBL_OPEN_PROTOCOL_HANDLE)(IN EFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid);
|
||||
typedef PVOID (*PBL_PHYSICAL_ADDRESS_TO_VIRTUAL)(IN PVOID PhysicalAddress, IN PVOID PhysicalBase, IN PVOID VirtualBase);
|
||||
typedef EFI_STATUS (*PBL_PHYSICAL_LIST_TO_VIRTUAL)(IN PXTBL_PAGE_MAPPING PageMap, IN OUT PLIST_ENTRY ListHead, IN PVOID PhysicalBase, IN PVOID VirtualBase);
|
||||
typedef EFI_STATUS (*PBL_POWER_SYSTEM)();
|
||||
typedef EFI_STATUS (*PBL_READ_FILE)(IN PEFI_FILE_HANDLE DirHandle, IN CONST PWCHAR FileName, OUT PVOID *FileData, OUT PSIZE_T FileSize);
|
||||
typedef EFI_STATUS (*PBL_REGISTER_BOOT_PROTOCOL)(IN PWCHAR SystemType, IN PEFI_GUID BootProtocolGuid);
|
||||
typedef VOID (*PBL_REGISTER_XT_BOOT_MENU)(PVOID BootMenuRoutine);
|
||||
typedef EFI_STATUS (*PBL_SET_EFI_VARIABLE)(IN PEFI_GUID Vendor, IN PWCHAR VariableName, IN PVOID VariableValue, IN UINT_PTR Size);
|
||||
typedef VOID (XTAPI *PBL_SET_MEMORY)(OUT PVOID Destination, IN UCHAR Byte, IN SIZE_T Length);
|
||||
typedef VOID (XTCDECL *PBL_SLEEP_EXECUTION)(IN ULONG_PTR Milliseconds);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_START_EFI_IMAGE)(IN EFI_HANDLE ImageHandle);
|
||||
typedef VOID (XTCDECL *PBL_TUI_DISPLAY_ERROR_DIALOG)(IN PCWSTR Caption, IN PCWSTR Message);
|
||||
typedef VOID (XTCDECL *PBL_TUI_DISPLAY_INFO_DIALOG)(IN PCWSTR Caption, IN PCWSTR Message);
|
||||
typedef VOID (XTCDECL *PBL_TUI_DISPLAY_INPUT_DIALOG)(IN PCWSTR Caption, IN PCWSTR Message, IN OUT PWCHAR *InputFieldText);
|
||||
typedef XTBL_DIALOG_HANDLE (XTCDECL *PBL_TUI_DISPLAY_PROGRESS_DIALOG)(IN PCWSTR Caption, IN PCWSTR Message, IN UCHAR Percentage);
|
||||
typedef VOID (XTCDECL *PBL_TUI_UPDATE_PROGRESS_BAR)(IN PXTBL_DIALOG_HANDLE Handle, IN PCWSTR Message, IN UCHAR Percentage);
|
||||
typedef SIZE_T (XTAPI *PBL_WIDESTRING_COMPARE_INSENSITIVE)(IN PCWSTR String1, IN PCWSTR String2, IN SIZE_T Length);
|
||||
typedef PWCHAR (XTAPI *PBL_WIDESTRING_CONCATENATE)(OUT PWCHAR Destination, IN PWCHAR Source, IN SIZE_T Count);
|
||||
typedef XTSTATUS (XTAPI *PBL_WIDESTRING_FORMAT)(IN PRTL_PRINT_CONTEXT Context, IN PCWSTR Format, IN VA_LIST ArgumentList);
|
||||
typedef SIZE_T (XTAPI *PBL_WIDESTRING_LENGTH)(IN PCWSTR String, IN SIZE_T MaxLength);
|
||||
typedef PWCHAR (XTAPI *PBL_WIDESTRING_TOKENIZE)(IN PWCHAR String, IN PCWSTR Delimiter, IN OUT PWCHAR *SavePtr);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_WAIT_FOR_EFI_EVENT)(IN UINT_PTR NumberOfEvents, IN PEFI_EVENT Event, OUT PUINT_PTR Index);
|
||||
typedef VOID (XTCDECL *PBL_XT_BOOT_MENU)();
|
||||
typedef VOID (*PBL_SLEEP_EXECUTION)(IN ULONG_PTR Milliseconds);
|
||||
typedef EFI_STATUS (*PBL_START_EFI_IMAGE)(IN EFI_HANDLE ImageHandle);
|
||||
typedef VOID (*PBL_TUI_DISPLAY_ERROR_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message);
|
||||
typedef VOID (*PBL_TUI_DISPLAY_INFO_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message);
|
||||
typedef VOID (*PBL_TUI_DISPLAY_INPUT_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message, IN PWCHAR *InputFieldText);
|
||||
typedef XTBL_DIALOG_HANDLE (*PBL_TUI_DISPLAY_PROGRESS_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message, IN UCHAR Percentage);
|
||||
typedef VOID (*PBL_TUI_UPDATE_PROGRESS_BAR)(IN PXTBL_DIALOG_HANDLE Handle, IN PWCHAR Message, IN UCHAR Percentage);
|
||||
typedef EFI_STATUS (*PBL_WAIT_FOR_EFI_EVENT)(IN UINT_PTR NumberOfEvents, IN PEFI_EVENT Event, OUT PUINT_PTR Index);
|
||||
typedef VOID (*PBL_XT_BOOT_MENU)();
|
||||
typedef VOID (XTAPI *PBL_ZERO_MEMORY)(OUT PVOID Destination, IN SIZE_T Length);
|
||||
|
||||
/* Module protocols routine pointers */
|
||||
typedef EFI_STATUS (XTCDECL *PBL_ACPI_GET_ACPI_DESCRIPTION_POINTER)(OUT PVOID *AcpiTable);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_ACPI_GET_ACPI_TABLE)(IN CONST UINT Signature, IN PVOID PreviousTable, OUT PVOID *AcpiTable);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_ACPI_GET_APIC_BASE)(OUT PVOID *ApicBase);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_ACPI_GET_RSDP_TABLE)(OUT PVOID *AcpiTable);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_ACPI_GET_SMBIOS_TABLE)(OUT PVOID *SmBiosTable);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_ACPI_GET_SMBIOS3_TABLE)(OUT PVOID *SmBiosTable);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_ACPI_GET_XSDP_TABLE)(OUT PVOID *AcpiTable);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_BOOTPROTO_BOOT_SYSTEM)(IN PXTBL_BOOT_PARAMETERS Parameters);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_EXECIMAGE_GET_ENTRY_POINT)(IN PVOID ImagePointer, OUT PVOID *EntryPoint);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_EXECIMAGE_GET_FILE_SIZE)(IN PVOID ImagePointer, OUT PULONGLONG FileSize);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_EXECIMAGE_GET_IMAGE_SIZE)(IN PVOID ImagePointer, OUT PUINT ImageSize);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_EXECIMAGE_GET_MACHINE_TYPE)(IN PVOID ImagePointer, OUT PUSHORT MachineType);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_EXECIMAGE_GET_SECTION)(IN PVOID ImagePointer, IN PCHAR SectionName, OUT PULONG *RawData);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_EXECIMAGE_GET_SUBSYSTEM)(IN PVOID ImagePointer, OUT PUSHORT SubSystem);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_EXECIMAGE_GET_VERSION)(IN PVOID ImagePointer, OUT PUSHORT Version);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_EXECIMAGE_LOAD_IMAGE)(IN PEFI_FILE_HANDLE FileHandle, IN LOADER_MEMORY_TYPE MemoryType, IN PVOID VirtualAddress, OUT PVOID *ImagePointer);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_EXECIMAGE_RELOCATE_IMAGE)(IN PVOID ImagePointer, IN EFI_VIRTUAL_ADDRESS Address);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_EXECIMAGE_UNLOAD_IMAGE)(IN PVOID ImagePointer);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_EXECIMAGE_VERIFY_IMAGE)(IN PVOID ImagePointer);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_FRAMEBUFFER_GET_DISPLAY_DRIVER)(OUT PEFI_GRAPHICS_PROTOCOL Protocol);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_FRAMEBUFFER_GET_DISPLAY_INFORMATION)(OUT PEFI_PHYSICAL_ADDRESS FrameBufferBase, OUT PULONG_PTR FrameBufferSize, OUT PXTBL_FRAMEBUFFER_MODE_INFORMATION ModeInfo);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_FRAMEBUFFER_GET_PREFERRED_SCREEN_RESOLUTION)(OUT PUINT PreferredWidth, OUT PUINT PreferredHeight);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_FRAMEBUFFER_INITIALIZE)();
|
||||
typedef EFI_STATUS (XTCDECL *PBL_FRAMEBUFFER_SET_SCREEN_RESOLUTION)(IN UINT Width, IN UINT Height);
|
||||
typedef EFI_STATUS (*PBL_ACPI_GET_ACPI_DESCRIPTION_POINTER)(OUT PVOID *AcpiTable);
|
||||
typedef EFI_STATUS (*PBL_ACPI_GET_APIC_BASE)(OUT PVOID *ApicBase);
|
||||
typedef EFI_STATUS (*PBL_ACPI_GET_RSDP_TABLE)(OUT PVOID *AcpiTable);
|
||||
typedef EFI_STATUS (*PBL_ACPI_GET_SMBIOS_TABLE)(OUT PVOID *SmBiosTable);
|
||||
typedef EFI_STATUS (*PBL_ACPI_GET_SMBIOS3_TABLE)(OUT PVOID *SmBiosTable);
|
||||
typedef EFI_STATUS (*PBL_ACPI_GET_XSDP_TABLE)(OUT PVOID *AcpiTable);
|
||||
typedef EFI_STATUS (*PBL_BOOTPROTO_BOOT_SYSTEM)(IN PXTBL_BOOT_PARAMETERS Parameters);
|
||||
typedef EFI_STATUS (*PBL_EXECIMAGE_GET_ENTRY_POINT)(IN PVOID ImagePointer, OUT PVOID *EntryPoint);
|
||||
typedef EFI_STATUS (*PBL_EXECIMAGE_GET_FILE_SIZE)(IN PVOID ImagePointer, OUT PULONGLONG FileSize);
|
||||
typedef EFI_STATUS (*PBL_EXECIMAGE_GET_IMAGE_SIZE)(IN PVOID ImagePointer, OUT PUINT ImageSize);
|
||||
typedef EFI_STATUS (*PBL_EXECIMAGE_GET_MACHINE_TYPE)(IN PVOID ImagePointer, OUT PUSHORT MachineType);
|
||||
typedef EFI_STATUS (*PBL_EXECIMAGE_GET_SECTION)(IN PVOID ImagePointer, IN PCHAR SectionName, OUT PULONG *RawData);
|
||||
typedef EFI_STATUS (*PBL_EXECIMAGE_GET_SUBSYSTEM)(IN PVOID ImagePointer, OUT PUSHORT SubSystem);
|
||||
typedef EFI_STATUS (*PBL_EXECIMAGE_GET_VERSION)(IN PVOID ImagePointer, OUT PUSHORT Version);
|
||||
typedef EFI_STATUS (*PBL_EXECIMAGE_LOAD_IMAGE)(IN PEFI_FILE_HANDLE FileHandle, IN LOADER_MEMORY_TYPE MemoryType, IN PVOID VirtualAddress, OUT PVOID *ImagePointer);
|
||||
typedef EFI_STATUS (*PBL_EXECIMAGE_RELOCATE_IMAGE)(IN PVOID ImagePointer, IN EFI_VIRTUAL_ADDRESS Address);
|
||||
typedef EFI_STATUS (*PBL_EXECIMAGE_UNLOAD_IMAGE)(IN PVOID ImagePointer);
|
||||
typedef EFI_STATUS (*PBL_EXECIMAGE_VERIFY_IMAGE)(IN PVOID ImagePointer);
|
||||
typedef EFI_STATUS (*PBL_FRAMEBUFFER_GET_DISPLAY_DRIVER)(OUT PEFI_GRAPHICS_PROTOCOL Protocol);
|
||||
typedef EFI_STATUS (*PBL_FRAMEBUFFER_GET_DISPLAY_INFORMATION)(OUT PEFI_PHYSICAL_ADDRESS FrameBufferBase, OUT PULONG_PTR FrameBufferSize, OUT PXTBL_FRAMEBUFFER_MODE_INFORMATION ModeInfo);
|
||||
typedef EFI_STATUS (*PBL_FRAMEBUFFER_GET_PREFERRED_SCREEN_RESOLUTION)(OUT PUINT PreferredWidth, OUT PUINT PreferredHeight);
|
||||
typedef EFI_STATUS (*PBL_FRAMEBUFFER_INITIALIZE)();
|
||||
typedef EFI_STATUS (*PBL_FRAMEBUFFER_SET_SCREEN_RESOLUTION)(IN UINT Width, IN UINT Height);
|
||||
|
||||
/* Boot parameters structure */
|
||||
typedef struct _XTBL_BOOT_PARAMETERS
|
||||
@@ -185,7 +151,6 @@ typedef struct _XTBL_BOOT_PARAMETERS
|
||||
typedef struct _XTBL_BOOTMENU_ITEM
|
||||
{
|
||||
PWCHAR EntryName;
|
||||
PWCHAR FullName;
|
||||
PWCHAR ShortName;
|
||||
PLIST_ENTRY Options;
|
||||
} XTBL_BOOTMENU_ITEM, *PXTBL_BOOTMENU_ITEM;
|
||||
@@ -281,10 +246,13 @@ typedef struct _XTBL_PAGE_MAPPING
|
||||
/* XTLDR Status data */
|
||||
typedef struct _XTBL_STATUS
|
||||
{
|
||||
PBL_XT_BOOT_MENU BootMenu;
|
||||
BOOLEAN BootServices;
|
||||
ULONG DebugPort;
|
||||
PVOID LoaderBase;
|
||||
ULONGLONG LoaderSize;
|
||||
BOOLEAN BootServices;
|
||||
INT_PTR SecureBoot;
|
||||
CPPORT SerialPort;
|
||||
} XTBL_STATUS, *PXTBL_STATUS;
|
||||
|
||||
/* XT framebuffer video mode information structure definition */
|
||||
@@ -301,14 +269,14 @@ typedef struct _XTBL_FRAMEBUFFER_MODE_INFORMATION
|
||||
EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
|
||||
struct
|
||||
{
|
||||
USHORT BlueMask;
|
||||
USHORT BlueShift;
|
||||
USHORT BlueSize;
|
||||
USHORT GreenMask;
|
||||
USHORT GreenShift;
|
||||
USHORT GreenSize;
|
||||
USHORT RedMask;
|
||||
USHORT RedShift;
|
||||
USHORT RedSize;
|
||||
USHORT ReservedMask;
|
||||
USHORT ReservedShift;
|
||||
USHORT ReservedSize;
|
||||
} PixelInformation;
|
||||
} XTBL_FRAMEBUFFER_MODE_INFORMATION, *PXTBL_FRAMEBUFFER_MODE_INFORMATION;
|
||||
|
||||
@@ -333,7 +301,6 @@ typedef struct _XTBL_FRAMEBUFFER_INFORMATION
|
||||
typedef struct _XTBL_ACPI_PROTOCOL
|
||||
{
|
||||
PBL_ACPI_GET_ACPI_DESCRIPTION_POINTER GetAcpiDescriptionPointer;
|
||||
PBL_ACPI_GET_ACPI_TABLE GetAcpiTable;
|
||||
PBL_ACPI_GET_APIC_BASE GetApicBase;
|
||||
PBL_ACPI_GET_RSDP_TABLE GetRsdpTable;
|
||||
PBL_ACPI_GET_SMBIOS_TABLE GetSMBiosTable;
|
||||
@@ -385,17 +352,9 @@ typedef struct _XTBL_LOADER_PROTOCOL
|
||||
PBL_REGISTER_BOOT_PROTOCOL RegisterProtocol;
|
||||
} Boot;
|
||||
struct
|
||||
{
|
||||
PBL_BOOTUTILS_GET_BOOLEAN_PARAMETER GetBooleanParameter;
|
||||
PBL_BOOTUTILS_GET_TRAMPOLINE_INFORMATION GetTrampolineInformation;
|
||||
} BootUtils;
|
||||
struct
|
||||
{
|
||||
PBL_CONFIG_GET_BOOLEAN_VALUE GetBooleanValue;
|
||||
PBL_CONFIG_GET_BOOT_OPTION_VALUE GetBootOptionValue;
|
||||
PBL_CONFIG_GET_EDITABLE_OPTIONS GetEditableOptions;
|
||||
PBL_CONFIG_GET_VALUE GetValue;
|
||||
PBL_CONFIG_SET_BOOT_OPTION_VALUE SetBootOptionValue;
|
||||
} Config;
|
||||
struct
|
||||
{
|
||||
@@ -412,13 +371,6 @@ typedef struct _XTBL_LOADER_PROTOCOL
|
||||
PBL_CONSOLE_WRITE Write;
|
||||
} Console;
|
||||
struct
|
||||
{
|
||||
PBL_CPU_CPUID CpuId;
|
||||
PBL_CPU_READ_CONTROL_REGISTER ReadControlRegister;
|
||||
PBL_CPU_READ_MODEL_SPECIFIC_REGISTER ReadModelSpecificRegister;
|
||||
PBL_CPU_WRITE_CONTROL_REGISTER WriteControlRegister;
|
||||
} Cpu;
|
||||
struct
|
||||
{
|
||||
PBL_DEBUG_PRINT Print;
|
||||
} Debug;
|
||||
@@ -429,27 +381,10 @@ typedef struct _XTBL_LOADER_PROTOCOL
|
||||
PBL_READ_FILE ReadFile;
|
||||
} Disk;
|
||||
struct
|
||||
{
|
||||
PBL_IOPORT_READ_8 Read8;
|
||||
PBL_IOPORT_READ_16 Read16;
|
||||
PBL_IOPORT_READ_32 Read32;
|
||||
PBL_IOPORT_WRITE_8 Write8;
|
||||
PBL_IOPORT_WRITE_16 Write16;
|
||||
PBL_IOPORT_WRITE_32 Write32;
|
||||
} IoPort;
|
||||
struct
|
||||
{
|
||||
PBL_LLIST_INITIALIZE_HEAD InitializeHead;
|
||||
PBL_LLIST_INSERT_HEAD InsertHead;
|
||||
PBL_LLIST_INSERT_TAIL InsertTail;
|
||||
PBL_LLIST_REMOVE_ENTRY RemoveEntry;
|
||||
} LinkedList;
|
||||
struct
|
||||
{
|
||||
PBL_ALLOCATE_PAGES AllocatePages;
|
||||
PBL_ALLOCATE_POOL AllocatePool;
|
||||
PBL_BUILD_PAGE_MAP BuildPageMap;
|
||||
PBL_COMPARE_MEMORY CompareMemory;
|
||||
PBL_COPY_MEMORY CopyMemory;
|
||||
PBL_FREE_PAGES FreePages;
|
||||
PBL_FREE_POOL FreePool;
|
||||
@@ -460,7 +395,6 @@ typedef struct _XTBL_LOADER_PROTOCOL
|
||||
PBL_MAP_EFI_MEMORY MapEfiMemory;
|
||||
PBL_MAP_PAGE MapPage;
|
||||
PBL_MAP_VIRTUAL_MEMORY MapVirtualMemory;
|
||||
PBL_MOVE_MEMORY MoveMemory;
|
||||
PBL_PHYSICAL_ADDRESS_TO_VIRTUAL PhysicalAddressToVirtual;
|
||||
PBL_PHYSICAL_LIST_TO_VIRTUAL PhysicalListToVirtual;
|
||||
PBL_SET_MEMORY SetMemory;
|
||||
@@ -476,13 +410,6 @@ typedef struct _XTBL_LOADER_PROTOCOL
|
||||
PBL_OPEN_PROTOCOL_HANDLE OpenHandle;
|
||||
} Protocol;
|
||||
struct
|
||||
{
|
||||
PBL_STRING_COMPARE Compare;
|
||||
PBL_STRING_LENGTH Length;
|
||||
PBL_STRING_TO_WIDESTRING ToWideString;
|
||||
PBL_STRING_TRIM Trim;
|
||||
} String;
|
||||
struct
|
||||
{
|
||||
PBL_TUI_DISPLAY_ERROR_DIALOG DisplayErrorDialog;
|
||||
PBL_TUI_DISPLAY_INFO_DIALOG DisplayInfoDialog;
|
||||
@@ -506,16 +433,7 @@ typedef struct _XTBL_LOADER_PROTOCOL
|
||||
PBL_SLEEP_EXECUTION SleepExecution;
|
||||
PBL_START_EFI_IMAGE StartEfiImage;
|
||||
PBL_WAIT_FOR_EFI_EVENT WaitForEfiEvent;
|
||||
} Utils;
|
||||
struct
|
||||
{
|
||||
PBL_WIDESTRING_COMPARE Compare;
|
||||
PBL_WIDESTRING_COMPARE_INSENSITIVE CompareInsensitive;
|
||||
PBL_WIDESTRING_CONCATENATE Concatenate;
|
||||
PBL_WIDESTRING_FORMAT Format;
|
||||
PBL_WIDESTRING_LENGTH Length;
|
||||
PBL_WIDESTRING_TOKENIZE Tokenize;
|
||||
} WideString;
|
||||
} Util;
|
||||
} XTBL_LOADER_PROTOCOL, *PXTBL_LOADER_PROTOCOL;
|
||||
|
||||
#endif /* __XTDK_BLTYPES_H */
|
||||
|
@@ -14,32 +14,26 @@
|
||||
|
||||
|
||||
/* Kernel Executive routines forward references */
|
||||
XTCLINK
|
||||
XTFASTCALL
|
||||
BOOLEAN
|
||||
ExAcquireRundownProtection(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
||||
|
||||
XTCLINK
|
||||
XTFASTCALL
|
||||
VOID
|
||||
ExCompleteRundownProtection(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
||||
|
||||
XTCLINK
|
||||
XTFASTCALL
|
||||
VOID
|
||||
ExInitializeRundownProtection(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
||||
|
||||
XTCLINK
|
||||
XTFASTCALL
|
||||
VOID
|
||||
ExReInitializeRundownProtection(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
||||
|
||||
XTCLINK
|
||||
XTFASTCALL
|
||||
VOID
|
||||
ExReleaseRundownProtection(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
||||
|
||||
XTCLINK
|
||||
XTFASTCALL
|
||||
VOID
|
||||
ExWaitForRundownProtectionRelease(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
||||
|
@@ -14,38 +14,17 @@
|
||||
#include <xttypes.h>
|
||||
|
||||
|
||||
/* Hardware layer routines forward references */
|
||||
XTCLINK
|
||||
XTAPI
|
||||
UCHAR
|
||||
HlReadRegister8(IN PVOID Register);
|
||||
/* Routines used by XTLDR */
|
||||
XTCDECL
|
||||
XTSTATUS
|
||||
HlComPortPutByte(IN PCPPORT Port,
|
||||
IN UCHAR Byte);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
USHORT
|
||||
HlReadRegister16(IN PVOID Register);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
ULONG
|
||||
HlReadRegister32(IN PVOID Register);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
HlWriteRegister8(IN PVOID Register,
|
||||
IN UCHAR Value);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
HlWriteRegister16(IN PVOID Register,
|
||||
IN USHORT Value);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
HlWriteRegister32(IN PVOID Register,
|
||||
IN ULONG Value);
|
||||
XTCDECL
|
||||
XTSTATUS
|
||||
HlInitializeComPort(IN OUT PCPPORT Port,
|
||||
IN ULONG PortNumber,
|
||||
IN PUCHAR PortAddress,
|
||||
IN ULONG BaudRate);
|
||||
|
||||
#endif /* __XTDK_HLFUNCS_H */
|
||||
|
@@ -9,98 +9,9 @@
|
||||
#ifndef __XTDK_HLTYPES_H
|
||||
#define __XTDK_HLTYPES_H
|
||||
|
||||
#include <xtbase.h>
|
||||
#include <xtdefs.h>
|
||||
#include <xttypes.h>
|
||||
#include ARCH_HEADER(hltypes.h)
|
||||
|
||||
|
||||
/* ACPI Root System Description Pointer (RSDP) signature */
|
||||
#define ACPI_RSDP_SIGNATURE 0x2052545020445352
|
||||
|
||||
/* ACPI table signatures */
|
||||
#define ACPI_BERT_SIGNATURE 0x54524542 /* Boot Error Record Table */
|
||||
#define ACPI_BGRT_SIGNATURE 0x54524742 /* Boot Graphics Record Table */
|
||||
#define ACPI_BOOT_SIGNATURE 0x544F4F42 /* ACPI BOOT Table */
|
||||
#define ACPI_CPEP_SIGNATURE 0x50455043 /* Corrected Platform Error Polling Table */
|
||||
#define ACPI_DBG2_SIGNATURE 0x32474244 /* Debug Port Table v2 */
|
||||
#define ACPI_DBGP_SIGNATURE 0x50474244 /* Debug Port Table */
|
||||
#define ACPI_DMAR_SIGNATURE 0x52414D44 /* DMA Remapping Table */
|
||||
#define ACPI_DSDT_SIGNATURE 0x54445344 /* Differentiated System Description Table */
|
||||
#define ACPI_ECDT_SIGNATURE 0x54444345 /* Embedded Controller Description Table */
|
||||
#define ACPI_ERST_SIGNATURE 0x54535245 /* Error Record Serialization Table */
|
||||
#define ACPI_FACS_SIGNATURE 0x53434146 /* Firmware ACPI Control Structure */
|
||||
#define ACPI_FADT_SIGNATURE 0x50434146 /* Fixed ACPI Description Table */
|
||||
#define ACPI_FBPT_SIGNATURE 0x54504246 /* Firmware Boot Performance Table */
|
||||
#define ACPI_FPDT_SIGNATURE 0x54445046 /* Firmware Performance Data Table */
|
||||
#define ACPI_GTDT_SIGNATURE 0x54445447 /* Generic Timer Description Table */
|
||||
#define ACPI_HPET_SIGNATURE 0x54455048 /* High Precision Event Timer */
|
||||
#define ACPI_IVRS_SIGNATURE 0x53525649 /* AMD IOMMU Resource Table */
|
||||
#define ACPI_MADT_SIGNATURE 0x43495041 /* MADT/APIC Description Table */
|
||||
#define ACPI_MCFG_SIGNATURE 0x4746434D /* Memory Mapped Configuration Space Access Table */
|
||||
#define ACPI_MPST_SIGNATURE 0x5453504D /* Memory Power State Table*/
|
||||
#define ACPI_MSCT_SIGNATURE 0x5443534D /* Maximum System Characteristics Table */
|
||||
#define ACPI_NFIT_SIGNATURE 0x5449464E /* NVDIMM Firmware Interface Table */
|
||||
#define ACPI_PMMT_SIGNATURE 0x544D4D50 /* Platform Memory Topology Table */
|
||||
#define ACPI_PSDT_SIGNATURE 0x54445350 /* Persistent System Description Table */
|
||||
#define ACPI_RAS2_SIGNATURE 0x32534152 /* ACPI RAS2 Feature Table */
|
||||
#define ACPI_RASF_SIGNATURE 0x46534152 /* ACPI RAS Feature Table */
|
||||
#define ACPI_RSDT_SIGNATURE 0x54445352 /* Root System Description Table */
|
||||
#define ACPI_SBST_SIGNATURE 0x54534253 /* Smart Battery Subsystem Table */
|
||||
#define ACPI_SDEV_SIGNATURE 0x56454453 /* Secure Device Table */
|
||||
#define ACPI_SLIT_SIGNATURE 0x54494C53 /* System Locality Distance Information Table */
|
||||
#define ACPI_SPCR_SIGNATURE 0x52435053 /* Serial Port Console Redirection Table */
|
||||
#define ACPI_SRAT_SIGNATURE 0x54415253 /* Static Resource Affinity Table */
|
||||
#define ACPI_SSDT_SIGNATURE 0x54445353 /* Secondary System Descriptor Table */
|
||||
#define ACPI_TPM2_SIGNATURE 0x324D5054 /* ACPI TPM 2.0 Table */
|
||||
#define ACPI_WAET_SIGNATURE 0x54454157 /* Windows ACPI Enlightenment Table */
|
||||
#define ACPI_WDAT_SIGNATURE 0x54414457 /* Watch Dog Action Table */
|
||||
#define ACPI_WDTT_SIGNATURE 0x54524457 /* Watchdog Timer Resource Table */
|
||||
#define ACPI_WPBT_SIGNATURE 0x54425057 /* Windows Platform Binary Table */
|
||||
#define ACPI_WSMT_SIGNATURE 0x544D5357 /* Windows SMM Security Mitigation Table */
|
||||
#define ACPI_XSDT_SIGNATURE 0x54445358 /* eXtended System Descriptor Table */
|
||||
|
||||
/* ACPI FADT flags masks */
|
||||
#define ACPI_FADT_32BIT_TIMER (1<<8)
|
||||
|
||||
/* ACPI Timer bit masks */
|
||||
#define ACPI_FADT_TIMER_32BIT 0x80000000
|
||||
#define ACPI_FADT_TIMER_24BIT 0x00800000
|
||||
|
||||
/* ACPI MADT subtable type definitions */
|
||||
#define ACPI_MADT_TYPE_LOCAL_APIC 0
|
||||
#define ACPI_MADT_TYPE_IOAPIC 1
|
||||
#define ACPI_MADT_TYPE_INT_OVERRIDE 2
|
||||
#define ACPI_MADT_TYPE_NMI_SOURCE 3
|
||||
#define ACPI_MADT_TYPE_LOCAL_APIC_NMI 4
|
||||
#define ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE 5
|
||||
#define ACPI_MADT_TYPE_IO_SAPIC 6
|
||||
#define ACPI_MADT_TYPE_LOCAL_SAPIC 7
|
||||
#define ACPI_MADT_TYPE_INTERRUPT_SOURCE 8
|
||||
#define ACPI_MADT_TYPE_LOCAL_X2APIC 9
|
||||
#define ACPI_MADT_TYPE_LOCAL_X2APIC_NMI 10
|
||||
#define ACPI_MADT_TYPE_GENERIC_INTERRUPT 11
|
||||
#define ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR 12
|
||||
#define ACPI_MADT_TYPE_GENERIC_MSI_FRAME 13
|
||||
#define ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR 14
|
||||
#define ACPI_MADT_TYPE_GENERIC_TRANSLATOR 15
|
||||
#define ACPI_MADT_TYPE_MULTIPROC_WAKEUP 16
|
||||
#define ACPI_MADT_TYPE_CORE_PIC 17
|
||||
#define ACPI_MADT_TYPE_LIO_PIC 18
|
||||
#define ACPI_MADT_TYPE_HT_PIC 19
|
||||
#define ACPI_MADT_TYPE_EIO_PIC 20
|
||||
#define ACPI_MADT_TYPE_MSI_PIC 21
|
||||
#define ACPI_MADT_TYPE_BIO_PIC 22
|
||||
#define ACPI_MADT_TYPE_LPC_PIC 23
|
||||
#define ACPI_MADT_TYPE_RINTC 24
|
||||
#define ACPI_MADT_TYPE_IMSIC 25
|
||||
#define ACPI_MADT_TYPE_APLIC 26
|
||||
#define ACPI_MADT_TYPE_PLIC 27
|
||||
|
||||
/* ACPI MADT Processor Local APIC Flags */
|
||||
#define ACPI_MADT_PLACE_ENABLED 0 /* Processor Local APIC CPU Enabled */
|
||||
#define ACPI_MADT_PLAOC_ENABLED 1 /* Processor Local APIC Online Capable */
|
||||
|
||||
/* Default serial port settings */
|
||||
#define COMPORT_CLOCK_RATE 0x1C200
|
||||
#define COMPORT_WAIT_TIMEOUT 204800
|
||||
@@ -179,195 +90,60 @@
|
||||
#define COMPORT_REG_MSR 0x06 /* Modem Status Register */
|
||||
#define COMPORT_REG_SR 0x07 /* Scratch Register */
|
||||
|
||||
/* Generic Address structure */
|
||||
typedef struct _GENERIC_ADDRESS
|
||||
/* APIC Register Address Map */
|
||||
typedef enum _APIC_REGISTER
|
||||
{
|
||||
UCHAR AddressSpaceID;
|
||||
UCHAR BitWidth;
|
||||
UCHAR BitOffset;
|
||||
UCHAR Reserved;
|
||||
PHYSICAL_ADDRESS Address;
|
||||
} PACKED GENERIC_ADDRESS, *PGENERIC_ADDRESS;
|
||||
APIC_ID = 0x02, /* APIC ID Register */
|
||||
APIC_VER = 0x03, /* APIC Version Register */
|
||||
APIC_TPR = 0x08, /* Task Priority Register */
|
||||
APIC_APR = 0x09, /* Arbitration Priority Register */
|
||||
APIC_PPR = 0x0A, /* Processor Priority Register (R) */
|
||||
APIC_EOI = 0x0B, /* EOI Register */
|
||||
APIC_RRR = 0x0C, /* Remote Read Register */
|
||||
APIC_LDR = 0x0D, /* Logical Destination Register */
|
||||
APIC_DFR = 0x0E, /* Destination Format Register (not available in extended mode) */
|
||||
APIC_SIVR = 0x0F, /* Spurious Interrupt Vector Register */
|
||||
APIC_ISR = 0x10, /* Interrupt Service Register*/
|
||||
APIC_TMR = 0x18, /* Trigger Mode Register */
|
||||
APIC_IRR = 0x20, /* Interrupt Request Register */
|
||||
APIC_ESR = 0x28, /* Error Status Register */
|
||||
APIC_ICR0 = 0x30, /* Interrupt Command Register */
|
||||
APIC_ICR1 = 0x31, /* Interrupt Command Register (not available in extended mode) */
|
||||
APIC_TMRLVTR = 0x32, /* Timer Local Vector Table */
|
||||
APIC_THRMLVTR = 0x33, /* Thermal Local Vector Table */
|
||||
APIC_PCLVTR = 0x34, /* Performance Counter Local Vector Table */
|
||||
APIC_LINT0 = 0x35, /* LINT0 Local Vector Table */
|
||||
APIC_LINT1 = 0x36, /* LINT1 Local Vector Table */
|
||||
APIC_ERRLVTR = 0x37, /* Error Local Vector Table */
|
||||
APIC_TICR = 0x38, /* Initial Count Register for Timer */
|
||||
APIC_TCCR = 0x39, /* Current Count Register for Timer */
|
||||
APIC_TDCR = 0x3E, /* Timer Divide Configuration Register */
|
||||
APIC_EAFR = 0x40, /* extended APIC Feature register */
|
||||
APIC_EACR = 0x41, /* Extended APIC Control Register */
|
||||
APIC_SEOI = 0x42, /* Specific End Of Interrupt Register */
|
||||
APIC_EXT0LVTR = 0x50, /* Extended Interrupt 0 Local Vector Table */
|
||||
APIC_EXT1LVTR = 0x51, /* Extended Interrupt 1 Local Vector Table */
|
||||
APIC_EXT2LVTR = 0x52, /* Extended Interrupt 2 Local Vector Table */
|
||||
APIC_EXT3LVTR = 0x53 /* Extended Interrupt 3 Local Vector Table */
|
||||
} APIC_REGISTER, *PAPIC_REGISTER;
|
||||
|
||||
/* Each ACPI table description header structure */
|
||||
typedef struct _ACPI_DESCRIPTION_HEADER
|
||||
/* APIC mode list */
|
||||
typedef enum _HAL_APIC_MODE
|
||||
{
|
||||
ULONG Signature;
|
||||
ULONG Length;
|
||||
UCHAR Revision;
|
||||
UCHAR Checksum;
|
||||
UCHAR OemId[6];
|
||||
UCHAR OemTableID[8];
|
||||
ULONG OemRevision;
|
||||
UCHAR CreatorID[4];
|
||||
ULONG CreatorRev;
|
||||
} PACKED ACPI_DESCRIPTION_HEADER, *PACPI_DESCRIPTION_HEADER;
|
||||
APIC_MODE_COMPAT,
|
||||
APIC_MODE_X2APIC
|
||||
} HAL_APIC_MODE, *PHAL_APIC_MODE;
|
||||
|
||||
/* Each ACPI subtable description header structure */
|
||||
typedef struct _ACPI_SUBTABLE_HEADER
|
||||
{
|
||||
UCHAR Type;
|
||||
UCHAR Length;
|
||||
} PACKED ACPI_SUBTABLE_HEADER, *PACPI_SUBTABLE_HEADER;
|
||||
|
||||
/* ACPI cache list structure */
|
||||
typedef struct _ACPI_CACHE_LIST
|
||||
{
|
||||
LIST_ENTRY ListEntry;
|
||||
ACPI_DESCRIPTION_HEADER Header;
|
||||
} ACPI_CACHE_LIST, *PACPI_CACHE_LIST;
|
||||
|
||||
/* ACPI Root System Description Table Pointer (RSDP) structure */
|
||||
typedef struct _ACPI_RSDP
|
||||
{
|
||||
ULONGLONG Signature;
|
||||
UCHAR Checksum;
|
||||
UCHAR OemId[6];
|
||||
UCHAR Revision;
|
||||
ULONG RsdtAddress;
|
||||
ULONG Length;
|
||||
ULONGLONG XsdtAddress;
|
||||
UCHAR XChecksum;
|
||||
UCHAR Reserved[3];
|
||||
} PACKED ACPI_RSDP, *PACPI_RSDP;
|
||||
|
||||
/* ACPI Root System Description Table (RSDT) structure */
|
||||
typedef struct _ACPI_RSDT
|
||||
{
|
||||
ACPI_DESCRIPTION_HEADER Header;
|
||||
ULONG Tables[];
|
||||
} PACKED ACPI_RSDT, *PACPI_RSDT;
|
||||
|
||||
/* ACPI eXtended Root System Description Table (XSDT) structure */
|
||||
typedef struct _ACPI_XSDT
|
||||
{
|
||||
ACPI_DESCRIPTION_HEADER Header;
|
||||
ULONGLONG Tables[];
|
||||
} PACKED ACPI_XSDT, *PACPI_XSDT;
|
||||
|
||||
/* Fixed ACPI Description Table (FADT) structure */
|
||||
typedef struct _ACPI_FADT
|
||||
{
|
||||
ACPI_DESCRIPTION_HEADER Header;
|
||||
ULONG FirmwareCtrl;
|
||||
ULONG Dsdt;
|
||||
UCHAR IntModel;
|
||||
UCHAR PmProfile;
|
||||
USHORT SciIntVector;
|
||||
ULONG SmiCmdIoPort;
|
||||
UCHAR AcpiOnValue;
|
||||
UCHAR AcpiOffValue;
|
||||
UCHAR S4BiosReq;
|
||||
UCHAR PStateControl;
|
||||
ULONG Pm1aEvtBlkIoPort;
|
||||
ULONG Pm1bEvtBlkIoPort;
|
||||
ULONG Pm1aCtrlBlkIoPort;
|
||||
ULONG Pm1bCtrlBlkIoPort;
|
||||
ULONG Pm2CtrlBlkIoPort;
|
||||
ULONG PmTmrBlkIoPort;
|
||||
ULONG Gp0BlkIoPort;
|
||||
ULONG Gp1BlkIoPort;
|
||||
UCHAR Pm1EvtLen;
|
||||
UCHAR Pm1CtrlLen;
|
||||
UCHAR Pm2CtrlLen;
|
||||
UCHAR PmTmrLen;
|
||||
UCHAR Gp0BlkLen;
|
||||
UCHAR Gp1BlkLen;
|
||||
UCHAR Gp1Base;
|
||||
UCHAR CStateControl;
|
||||
USHORT Lvl2Latency;
|
||||
USHORT Lvl3Latency;
|
||||
USHORT FlushSize;
|
||||
USHORT FlushStride;
|
||||
UCHAR DutyOffset;
|
||||
UCHAR DutyWidth;
|
||||
UCHAR DayAlarmIndex;
|
||||
UCHAR MonthAlarmIndex;
|
||||
UCHAR CenturyAlarmIndex;
|
||||
USHORT BootArch;
|
||||
UCHAR Reserved0;
|
||||
ULONG Flags;
|
||||
GENERIC_ADDRESS ResetReg;
|
||||
UCHAR ResetVal;
|
||||
USHORT ArmBootArch;
|
||||
UCHAR Reserved1;
|
||||
PHYSICAL_ADDRESS XFirmwareCtrl;
|
||||
PHYSICAL_ADDRESS XDsdt;
|
||||
GENERIC_ADDRESS XPm1aEvtBlk;
|
||||
GENERIC_ADDRESS XPm1bEvtBlk;
|
||||
GENERIC_ADDRESS XPm1aCtrlBlk;
|
||||
GENERIC_ADDRESS XPm1bCtrlBlk;
|
||||
GENERIC_ADDRESS XPm2CtrlBlk;
|
||||
GENERIC_ADDRESS XPmTmrBlk;
|
||||
GENERIC_ADDRESS XGp0Blk;
|
||||
GENERIC_ADDRESS XGp1Blk;
|
||||
GENERIC_ADDRESS SleepControlReg;
|
||||
GENERIC_ADDRESS SleepStatusReg;
|
||||
} PACKED ACPI_FADT, *PACPI_FADT;
|
||||
|
||||
/* ACPI Multiple APIC Description Table (MADT) structure */
|
||||
typedef struct _ACPI_MADT
|
||||
{
|
||||
ACPI_DESCRIPTION_HEADER Header;
|
||||
ULONG LocalApicAddress;
|
||||
ULONG Flags;
|
||||
ULONG ApicTables[];
|
||||
} PACKED ACPI_MADT, *PACPI_MADT;
|
||||
|
||||
/* ACPI Local APIC MADT subtable structure */
|
||||
typedef struct _ACPI_MADT_LOCAL_APIC
|
||||
{
|
||||
ACPI_SUBTABLE_HEADER Header;
|
||||
UCHAR AcpiId;
|
||||
UCHAR ApicId;
|
||||
ULONG Flags;
|
||||
} PACKED ACPI_MADT_LOCAL_APIC, *PACPI_MADT_LOCAL_APIC;
|
||||
|
||||
/* ACPI Local X2APIC MADT subtable structure */
|
||||
typedef struct _ACPI_MADT_LOCAL_X2APIC
|
||||
{
|
||||
ACPI_SUBTABLE_HEADER Header;
|
||||
USHORT Reserved;
|
||||
ULONG ApicId;
|
||||
ULONG Flags;
|
||||
ULONG AcpiId;
|
||||
} PACKED ACPI_MADT_LOCAL_X2APIC, *PACPI_MADT_LOCAL_X2APIC;
|
||||
|
||||
/* ACPI System Information structure */
|
||||
typedef struct _ACPI_SYSTEM_INFO
|
||||
{
|
||||
ULONG CpuCount;
|
||||
ULONG RunningCpus;
|
||||
ULONG BusCount;
|
||||
ULONG IoApicCount;
|
||||
ULONG IntiCount;
|
||||
ULONG LintiCount;
|
||||
BOOLEAN ImcrPresent;
|
||||
ULONG ApicBase;
|
||||
PPROCESSOR_IDENTITY CpuInfo;
|
||||
ULONG IoApicPhysicalBase[APIC_MAX_IOAPICS];
|
||||
ULONG IoApicVirtualBase[APIC_MAX_IOAPICS];
|
||||
ULONG IoApicVectorBase[APIC_MAX_IOAPICS];
|
||||
} ACPI_SYSTEM_INFO, *PACPI_SYSTEM_INFO;
|
||||
|
||||
/* ACPI Timer information structure */
|
||||
typedef struct _ACPI_TIMER_INFO
|
||||
{
|
||||
ULONG TimerPort;
|
||||
ULONG MsbMask;
|
||||
} ACPI_TIMER_INFO, *PACPI_TIMER_INFO;
|
||||
|
||||
/* Serial (COM) port state */
|
||||
/* Serial (COM) port initial state */
|
||||
typedef struct _CPPORT
|
||||
{
|
||||
PUCHAR Address;
|
||||
ULONG Baud;
|
||||
USHORT Flags;
|
||||
UCHAR Ring;
|
||||
} CPPORT, *PCPPORT;
|
||||
|
||||
/* Framebuffer data structure */
|
||||
typedef struct _HL_FRAMEBUFFER_DATA
|
||||
/* HAL framebuffer data structure */
|
||||
typedef struct _HAL_FRAMEBUFFER_DATA
|
||||
{
|
||||
BOOLEAN Initialized;
|
||||
PVOID Address;
|
||||
@@ -375,46 +151,10 @@ typedef struct _HL_FRAMEBUFFER_DATA
|
||||
UINT Width;
|
||||
UINT Height;
|
||||
UINT PixelsPerScanLine;
|
||||
UINT BytesPerPixel;
|
||||
UINT BitsPerPixel;
|
||||
UINT Pitch;
|
||||
PVOID Font;
|
||||
struct
|
||||
{
|
||||
USHORT BlueShift;
|
||||
USHORT BlueSize;
|
||||
USHORT GreenShift;
|
||||
USHORT GreenSize;
|
||||
USHORT RedShift;
|
||||
USHORT RedSize;
|
||||
USHORT ReservedShift;
|
||||
USHORT ReservedSize;
|
||||
} Pixels;
|
||||
} HL_FRAMEBUFFER_DATA, *PHL_FRAMEBUFFER_DATA;
|
||||
|
||||
/* Scroll region data structure */
|
||||
typedef struct _HL_SCROLL_REGION_DATA
|
||||
{
|
||||
ULONG Left;
|
||||
ULONG Top;
|
||||
ULONG Right;
|
||||
ULONG Bottom;
|
||||
ULONG WidthInChars;
|
||||
ULONG HeightInChars;
|
||||
ULONG CursorX;
|
||||
ULONG CursorY;
|
||||
ULONG BackgroundColor;
|
||||
ULONG TextColor;
|
||||
} HL_SCROLL_REGION_DATA, *PHL_SCROLL_REGION_DATA;
|
||||
|
||||
/* Processor identity structure */
|
||||
typedef struct _PROCESSOR_IDENTITY
|
||||
{
|
||||
ULONG AcpiId;
|
||||
ULONG ApicId;
|
||||
USHORT CpuNumber;
|
||||
BOOLEAN Bsp;
|
||||
BOOLEAN Started;
|
||||
} PROCESSOR_IDENTITY, *PPROCESSOR_IDENTITY;
|
||||
} HAL_FRAMEBUFFER_DATA, *PHAL_FRAMEBUFFER_DATA;
|
||||
|
||||
/* SMBIOS table header structure */
|
||||
typedef struct _SMBIOS_TABLE_HEADER
|
||||
|
44
sdk/xtdk/i686/arfuncs.h
Normal file
44
sdk/xtdk/i686/arfuncs.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: sdk/xtdk/i686/arfuncs.h
|
||||
* DESCRIPTION: I686 architecture library routines
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#ifndef __XTDK_I686_ARFUNCS_H
|
||||
#define __XTDK_I686_ARFUNCS_H
|
||||
|
||||
#include <xtdefs.h>
|
||||
#include <xtstruct.h>
|
||||
#include <xttypes.h>
|
||||
#include <i686/xtstruct.h>
|
||||
|
||||
|
||||
/* Routines used by XTLDR */
|
||||
XTCDECL
|
||||
VOID
|
||||
ArClearInterruptFlag(VOID);
|
||||
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
ArCpuId(IN OUT PCPUID_REGISTERS Registers);
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
ArHalt(VOID);
|
||||
|
||||
XTCDECL
|
||||
ULONG_PTR
|
||||
ArReadControlRegister(IN USHORT ControlRegister);
|
||||
|
||||
XTCDECL
|
||||
ULONGLONG
|
||||
ArReadModelSpecificRegister(IN ULONG Register);
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
ArWriteControlRegister(IN USHORT ControlRegister,
|
||||
IN UINT_PTR Value);
|
||||
|
||||
#endif /* __XTDK_I686_ARFUNCS_H */
|
@@ -39,22 +39,13 @@
|
||||
#define CR4_PCE 0x00000100
|
||||
#define CR4_FXSR 0x00000200
|
||||
#define CR4_XMMEXCPT 0x00000400
|
||||
#define CR4_UMIP 0x00000800
|
||||
#define CR4_LA57 0x00001000
|
||||
#define CR4_RESERVED1 0x00001800
|
||||
#define CR4_VMXE 0x00002000
|
||||
#define CR4_SMXE 0x00004000
|
||||
#define CR4_FSGSBASE 0x00010000
|
||||
#define CR4_PCIDE 0x00020000
|
||||
#define CR4_XSAVE 0x00040000
|
||||
#define CR4_KL 0x00080000
|
||||
#define CR4_SMEP 0x00100000
|
||||
#define CR4_SMAP 0x00200000
|
||||
#define CR4_PKE 0x00400000
|
||||
#define CR4_CET 0x00800000
|
||||
#define CR4_PKS 0x01000000
|
||||
#define CR4_UINTR 0x02000000
|
||||
#define CR4_LASS 0x08000000
|
||||
#define CR4_LAM_SUP 0x10000000
|
||||
#define CR4_RESERVED2 0x00018000
|
||||
#define CR4_XSAVE 0x00020000
|
||||
#define CR4_RESERVED3 0xFFFC0000
|
||||
|
||||
/* Descriptors size */
|
||||
#define GDT_ENTRIES 128
|
||||
@@ -71,27 +62,6 @@
|
||||
#define SEGMENT_FS 0x64
|
||||
#define SEGMENT_GS 0x65
|
||||
|
||||
/* X86 EFLAG bit masks definitions */
|
||||
#define X86_EFLAGS_NF_MASK 0x00000000 /* None */
|
||||
#define X86_EFLAGS_CF_MASK 0x00000001 /* Carry */
|
||||
#define X86_EFLAGS_PF_MASK 0x00000004 /* Parity */
|
||||
#define X86_EFALGS_AF_MASK 0x00000010 /* Aux Carry */
|
||||
#define X86_EFLAGS_ZF_MASK 0x00000040 /* Zero */
|
||||
#define X86_EFLAGS_SF_MASK 0x00000080 /* Sign */
|
||||
#define X86_EFLAGS_TF_MASK 0x00000100 /* Trap */
|
||||
#define X86_EFLAGS_IF_MASK 0x00000200 /* Interrupt */
|
||||
#define X86_EFLAGS_DF_MASK 0x00000400 /* Direction */
|
||||
#define X86_EFLAGS_OF_MASK 0x00000800 /* Overflow */
|
||||
#define X86_EFLAGS_IOPL_MASK 0x00003000 /* I/O Privilege */
|
||||
#define X86_EFLAGS_NT_MASK 0x00004000 /* Nested Task */
|
||||
#define X86_EFLAGS_SIGN_MASK 0x00008000 /* Sign */
|
||||
#define X86_EFLAGS_RF_MASK 0x00010000 /* Resume */
|
||||
#define X86_EFLAGS_V86_MASK 0x00020000 /* Virtual 8086 */
|
||||
#define X86_EFLAGS_AC_MASK 0x00040000 /* Alignment Check */
|
||||
#define X86_EFLAGS_VIF_MASK 0x00080000 /* Virtual Interrupt */
|
||||
#define X86_EFLAGS_VIP_MASK 0x00100000 /* Virtual Interrupt Pending */
|
||||
#define X86_EFLAGS_ID_MASK 0x00200000 /* Identification */
|
||||
|
||||
/* CPU vendor enumeration list */
|
||||
typedef enum _CPU_VENDOR
|
||||
{
|
||||
@@ -100,49 +70,8 @@ typedef enum _CPU_VENDOR
|
||||
CPU_VENDOR_UNKNOWN = 0xFFFFFFFF
|
||||
} CPU_VENDOR, *PCPU_VENDOR;
|
||||
|
||||
/* CPUID extended features (0x80000001) enumeration list */
|
||||
typedef enum _CPUID_FEATURES_EXTENDED
|
||||
{
|
||||
CPUID_FEATURES_ECX_LAHF_SAHF = 1 << 0,
|
||||
CPUID_FEATURES_ECX_CMP_LEGACY = 1 << 1,
|
||||
CPUID_FEATURES_ECX_SVM = 1 << 2,
|
||||
CPUID_FEATURES_ECX_EXT_APIC_SPACE = 1 << 3,
|
||||
CPUID_FEATURES_ECX_ALT_MOV_CR8 = 1 << 4,
|
||||
CPUID_FEATURES_ECX_LZCNT = 1 << 5,
|
||||
CPUID_FEATURES_ECX_SSE4A = 1 << 6,
|
||||
CPUID_FEATURES_ECX_MISALIGNED_SSE = 1 << 7,
|
||||
CPUID_FEATURES_ECX_PREFETCHW = 1 << 8,
|
||||
CPUID_FEATURES_ECX_OSVW = 1 << 9,
|
||||
CPUID_FEATURES_ECX_IBS = 1 << 10,
|
||||
CPUID_FEATURES_ECX_XOP = 1 << 11,
|
||||
CPUID_FEATURES_ECX_SKINIT = 1 << 12,
|
||||
CPUID_FEATURES_ECX_WDT = 1 << 13,
|
||||
CPUID_FEATURES_ECX_LWP = 1 << 15,
|
||||
CPUID_FEATURES_ECX_FMA4 = 1 << 16,
|
||||
CPUID_FEATURES_ECX_TCE = 1 << 17,
|
||||
CPUID_FEATURES_ECX_NODEID = 1 << 19,
|
||||
CPUID_FEATURES_ECX_TBM = 1 << 21,
|
||||
CPUID_FEATURES_ECX_TOPOLOGY_EXTENSIONS = 1 << 22,
|
||||
CPUID_FEATURES_ECX_PERFCTR_EXT_CORE = 1 << 23,
|
||||
CPUID_FEATURES_ECX_PERFCTR_EXT_NB = 1 << 24,
|
||||
CPUID_FEATURES_ECX_DATA_BREAKPOINT_EXT = 1 << 26,
|
||||
CPUID_FEATURES_ECX_PERF_TSC = 1 << 27,
|
||||
CPUID_FEATURES_ECX_PERFCTR_EXT_L2I = 1 << 28,
|
||||
CPUID_FEATURES_ECX_MONITORX_MWAITX = 1 << 29,
|
||||
CPUID_FEATURES_ECX_CODEBP_ADDRMASK_EXT = 1 << 30,
|
||||
CPUID_FEATURES_EDX_SYSCALL_SYSRET = 1 << 11,
|
||||
CPUID_FEATURES_EDX_NX = 1 << 20,
|
||||
CPUID_FEATURES_EDX_AMD_MMX_EXT = 1 << 22,
|
||||
CPUID_FEATURES_EDX_FFXSR = 1 << 25,
|
||||
CPUID_FEATURES_EDX_1G_PAGES = 1 << 26,
|
||||
CPUID_FEATURES_EDX_RDTSCP = 1 << 27,
|
||||
CPUID_FEATURES_EDX_LONG_MODE = 1 << 29,
|
||||
CPUID_FEATURES_EDX_3DNOW_EXT = 1 << 30,
|
||||
CPUID_FEATURES_EDX_3DNOW = 1 << 31
|
||||
} CPUID_FEATURES_EXTENDED, *PCPUID_FEATURES_EXTENDED;
|
||||
|
||||
/* CPUID STD1 features (0x00000001) enumeration list */
|
||||
typedef enum _CPUID_FEATURES_STANDARD1
|
||||
/* CPUID features enumeration list */
|
||||
typedef enum _CPUID_FEATURES
|
||||
{
|
||||
CPUID_FEATURES_ECX_SSE3 = 1 << 0,
|
||||
CPUID_FEATURES_ECX_PCLMUL = 1 << 1,
|
||||
@@ -205,150 +134,15 @@ typedef enum _CPUID_FEATURES_STANDARD1
|
||||
CPUID_FEATURES_EDX_TM = 1 << 29,
|
||||
CPUID_FEATURES_EDX_IA64 = 1 << 30,
|
||||
CPUID_FEATURES_EDX_PBE = 1 << 31
|
||||
} CPUID_FEATURES_STANDARD1, *PCPUID_FEATURES_STANDARD1;
|
||||
|
||||
/* CPUID STD7 features (0x00000007, subleaf 0) enumeration list */
|
||||
typedef enum _CPUID_FEATURES_STANDARD7_LEAF0
|
||||
{
|
||||
CPUID_FEATURES_EBX_FSGSBASE = 1 << 0,
|
||||
CPUID_FEATURES_EBX_TSC_ADJUST = 1 << 1,
|
||||
CPUID_FEATURES_EBX_SGX = 1 << 2,
|
||||
CPUID_FEATURES_EBX_BMI1 = 1 << 3,
|
||||
CPUID_FEATURES_EBX_HLE = 1 << 4,
|
||||
CPUID_FEATURES_EBX_AVX2 = 1 << 5,
|
||||
CPUID_FEATURES_EBX_FDP_DEPRECATION = 1 << 6,
|
||||
CPUID_FEATURES_EBX_SMEP = 1 << 7,
|
||||
CPUID_FEATURES_EBX_BMI2 = 1 << 8,
|
||||
CPUID_FEATURES_EBX_ERMS = 1 << 9,
|
||||
CPUID_FEATURES_EBX_INVPCID = 1 << 10,
|
||||
CPUID_FEATURES_EBX_RTM = 1 << 11,
|
||||
CPUID_FEATURES_EBX_QOS_MONITORING = 1 << 12,
|
||||
CPUID_FEATURES_EBX_DEPRECATE_FCS_FDS = 1 << 13,
|
||||
CPUID_FEATURES_EBX_MPX = 1 << 14,
|
||||
CPUID_FEATURES_EBX_QOS_ENFORCEMENT = 1 << 15,
|
||||
CPUID_FEATURES_EBX_AVX512F = 1 << 16,
|
||||
CPUID_FEATURES_EBX_AVX512DQ = 1 << 17,
|
||||
CPUID_FEATURES_EBX_RDSEED = 1 << 18,
|
||||
CPUID_FEATURES_EBX_ADX = 1 << 19,
|
||||
CPUID_FEATURES_EBX_SMAP = 1 << 20,
|
||||
CPUID_FEATURES_EBX_AVX512IFMA52 = 1 << 21,
|
||||
CPUID_FEATURES_EBX_CLFLUSHOPT = 1 << 23,
|
||||
CPUID_FEATURES_EBX_CLWB = 1 << 24,
|
||||
CPUID_FEATURES_EBX_PROCESSOR_TRACE = 1 << 25,
|
||||
CPUID_FEATURES_EBX_AVX512PF = 1 << 26,
|
||||
CPUID_FEATURES_EBX_AVX512ER = 1 << 27,
|
||||
CPUID_FEATURES_EBX_AVX512CD = 1 << 28,
|
||||
CPUID_FEATURES_EBX_SHA = 1 << 29,
|
||||
CPUID_FEATURES_EBX_AVX512BW = 1 << 30,
|
||||
CPUID_FEATURES_EBX_AVX512VL = 1 << 31,
|
||||
CPUID_FEATURES_ECX_PREFETCHWT1 = 1 << 0,
|
||||
CPUID_FEATURES_ECX_AVX512_VBMI = 1 << 1,
|
||||
CPUID_FEATURES_ECX_UMIP = 1 << 2,
|
||||
CPUID_FEATURES_ECX_PKU = 1 << 3,
|
||||
CPUID_FEATURES_ECX_OSPKE = 1 << 4,
|
||||
CPUID_FEATURES_ECX_WAITPKG = 1 << 5,
|
||||
CPUID_FEATURES_ECX_AVX512_VBMI2 = 1 << 6,
|
||||
CPUID_FEATURES_ECX_CET_SS = 1 << 7,
|
||||
CPUID_FEATURES_ECX_GFNI = 1 << 8,
|
||||
CPUID_FEATURES_ECX_VAES = 1 << 9,
|
||||
CPUID_FEATURES_ECX_VPCLMULQDQ = 1 << 10,
|
||||
CPUID_FEATURES_ECX_AVX512_VNNI = 1 << 11,
|
||||
CPUID_FEATURES_ECX_AVX512_BITALG = 1 << 12,
|
||||
CPUID_FEATURES_ECX_TME = 1 << 13,
|
||||
CPUID_FEATURES_ECX_AVX512_VPOPCNTDQ = 1 << 14,
|
||||
CPUID_FEATURES_ECX_LA57 = 1 << 16,
|
||||
CPUID_FEATURES_ECX_RDPID = 1 << 22,
|
||||
CPUID_FEATURES_ECX_KEYLOCKER = 1 << 23,
|
||||
CPUID_FEATURES_ECX_BUS_LOCK_DETECT = 1 << 24,
|
||||
CPUID_FEATURES_ECX_CLDEMOTE = 1 << 25,
|
||||
CPUID_FEATURES_ECX_MOVDIRI = 1 << 27,
|
||||
CPUID_FEATURES_ECX_MOVDIR64B = 1 << 28,
|
||||
CPUID_FEATURES_ECX_ENQCMD = 1 << 29,
|
||||
CPUID_FEATURES_ECX_SGX_LAUNCH_CONFIG = 1 << 30,
|
||||
CPUID_FEATURES_ECX_PKS = 1 << 31,
|
||||
CPUID_FEATURES_EDX_SGX_KEYS = 1 << 1,
|
||||
CPUID_FEATURES_EDX_AVX512_4VNNIW = 1 << 2,
|
||||
CPUID_FEATURES_EDX_AVX512_4FMAPS = 1 << 3,
|
||||
CPUID_FEATURES_EDX_FAST_SHORT_REP_MOV = 1 << 4,
|
||||
CPUID_FEATURES_EDX_UINTR = 1 << 5,
|
||||
CPUID_FEATURES_EDX_AVX512_VPINTERSECT = 1 << 8,
|
||||
CPUID_FEATURES_EDX_SRBDS_CTRL = 1 << 9,
|
||||
CPUID_FEATURES_EDX_MD_CLEAR = 1 << 10,
|
||||
CPUID_FEATURES_EDX_RTM_ALWAYS_ABORT = 1 << 11,
|
||||
CPUID_FEATURES_EDX_RTM_FORCE_ABORT = 1 << 13,
|
||||
CPUID_FEATURES_EDX_SERIALIZE = 1 << 14,
|
||||
CPUID_FEATURES_EDX_HYBRID = 1 << 15,
|
||||
CPUID_FEATURES_EDX_TSXLDTRK = 1 << 16,
|
||||
CPUID_FEATURES_EDX_PCONFIG = 1 << 18,
|
||||
CPUID_FEATURES_EDX_ARCH_LBR = 1 << 19,
|
||||
CPUID_FEATURES_EDX_CET_IBT = 1 << 20,
|
||||
CPUID_FEATURES_EDX_AMX_BF16 = 1 << 22,
|
||||
CPUID_FEATURES_EDX_AVX512_FP16 = 1 << 23,
|
||||
CPUID_FEATURES_EDX_AMX_TILE = 1 << 24,
|
||||
CPUID_FEATURES_EDX_AMX_INT8 = 1 << 25,
|
||||
CPUID_FEATURES_EDX_SCA_IBRS_IBPB = 1 << 26,
|
||||
CPUID_FEATURES_EDX_SCA_STIBP = 1 << 27,
|
||||
CPUID_FEATURES_EDX_L1D_FLUSH = 1 << 28,
|
||||
CPUID_FEATURES_EDX_ARCH_CAPABILITIES_MSR = 1 << 29,
|
||||
CPUID_FEATURES_EDX_CORE_CAPABILITIES_MSR = 1 << 30,
|
||||
CPUID_FEATURES_EDX_SCA_SSBD = 1 << 31
|
||||
} CPUID_FEATURES_STANDARD7_LEAF0, *PCPUID_FEATURES_STANDARD7_LEAF0;
|
||||
|
||||
/* CPUID STD7 features (0x00000007, subleaf 1) enumeration list */
|
||||
typedef enum _CPUID_FEATURES_STANDARD7_LEAF1
|
||||
{
|
||||
CPUID_FEATURES_EAX_SHA512 = 1 << 0,
|
||||
CPUID_FEATURES_EAX_SM3 = 1 << 1,
|
||||
CPUID_FEATURES_EAX_SM4 = 1 << 2,
|
||||
CPUID_FEATURES_EAX_RAO_INT = 1 << 3,
|
||||
CPUID_FEATURES_EAX_AVX_VNNI = 1 << 4,
|
||||
CPUID_FEATURES_EAX_AVX512_BF16 = 1 << 5,
|
||||
CPUID_FEATURES_EAX_LASS = 1 << 6,
|
||||
CPUID_FEATURES_EAX_CMPCCXADD = 1 << 7,
|
||||
CPUID_FEATURES_EAX_ARCH_PERFMON = 1 << 8,
|
||||
CPUID_FEATURES_EAX_FAST_ZEROLEN_REP_MOVSB = 1 << 10,
|
||||
CPUID_FEATURES_EAX_FAST_ZEROLEN_REP_STOSB = 1 << 11,
|
||||
CPUID_FEATURES_EAX_FAST_ZEROLEN_REP_CMPSB = 1 << 12,
|
||||
CPUID_FEATURES_EAX_FRED = 1 << 17,
|
||||
CPUID_FEATURES_EAX_LKGS = 1 << 18,
|
||||
CPUID_FEATURES_EAX_WRMSRNS = 1 << 19,
|
||||
CPUID_FEATURES_EAX_NMI_SOURCE_REPORTING = 1 << 20,
|
||||
CPUID_FEATURES_EAX_AMX_FP16 = 1 << 21,
|
||||
CPUID_FEATURES_EAX_HRESET = 1 << 22,
|
||||
CPUID_FEATURES_EAX_AVX_IFMA = 1 << 23,
|
||||
CPUID_FEATURES_EAX_LAM = 1 << 26,
|
||||
CPUID_FEATURES_EAX_MSRLIST = 1 << 27,
|
||||
CPUID_FEATURES_EAX_INVD_DISABLE = 1 << 30,
|
||||
CPUID_FEATURES_EAX_MOVRS = 1 << 31,
|
||||
CPUID_FEATURES_EBX_PPIN = 1 << 0,
|
||||
CPUID_FEATURES_EBX_TSE = 1 << 1,
|
||||
CPUID_FEATURES_EBX_CPUIDMAXVAL_LIM_RMV = 1 << 3,
|
||||
CPUID_FEATURES_ECX_MSR_IMM = 1 << 5,
|
||||
CPUID_FEATURES_EDX_AVX_VNNI_INT8 = 1 << 4,
|
||||
CPUID_FEATURES_EDX_AVX_NE_CONVERT = 1 << 5,
|
||||
CPUID_FEATURES_EDX_AMX_COMPLEX = 1 << 8,
|
||||
CPUID_FEATURES_EDX_AVX_VNNI_INT16 = 1 << 10,
|
||||
CPUID_FEATURES_EDX_USER_TIMER = 1 << 13,
|
||||
CPUID_FEATURES_EDX_PREFETCHI = 1 << 14,
|
||||
CPUID_FEATURES_EDX_USER_MSR = 1 << 15,
|
||||
CPUID_FEATURES_EDX_UIRET_UIF = 1 << 17,
|
||||
CPUID_FEATURES_EDX_CET_SSS = 1 << 18,
|
||||
CPUID_FEATURES_EDX_AVX10 = 1 << 19,
|
||||
CPUID_FEATURES_EDX_APX = 1 << 21,
|
||||
CPUID_FEATURES_EDX_MWAIT_AND_LEAF5 = 1 << 23
|
||||
} CPUID_FEATURES_STANDARD7_LEAF1, *PCPUID_FEATURES_STANDARD7_LEAF1;
|
||||
} CPUID_FEATURES, *PCPUID_FEATURES;
|
||||
|
||||
/* CPUID requests */
|
||||
typedef enum _CPUID_REQUESTS
|
||||
{
|
||||
CPUID_GET_VENDOR_STRING,
|
||||
CPUID_GET_STANDARD1_FEATURES,
|
||||
CPUID_GET_TLB_CACHE,
|
||||
CPUID_GET_SERIAL,
|
||||
CPUID_GET_CACHE_TOPOLOGY,
|
||||
CPUID_GET_MONITOR_MWAIT,
|
||||
CPUID_GET_POWER_MANAGEMENT,
|
||||
CPUID_GET_STANDARD7_FEATURES
|
||||
CPUID_GET_CPU_FEATURES,
|
||||
CPUID_GET_TLB,
|
||||
CPUID_GET_SERIAL
|
||||
} CPUID_REQUESTS, *PCPUID_REQUESTS;
|
||||
|
||||
/* Processor identification information */
|
||||
@@ -361,6 +155,13 @@ typedef struct _CPU_IDENTIFICATION
|
||||
UCHAR VendorName[13];
|
||||
} CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
|
||||
|
||||
/* Processor features */
|
||||
typedef struct _CPU_FEATURES
|
||||
{
|
||||
CPUID_FEATURES Ecx;
|
||||
CPUID_FEATURES Edx;
|
||||
} CPU_FEATURES, *PCPU_FEATURES;
|
||||
|
||||
/* CPUID registers */
|
||||
typedef struct _CPUID_REGISTERS
|
||||
{
|
||||
@@ -384,10 +185,4 @@ typedef struct _CPUID_SIGNATURE
|
||||
ULONG Unused2:4;
|
||||
} CPU_SIGNATURE, *PCPU_SIGNATURE;
|
||||
|
||||
/* Trampoline types */
|
||||
typedef enum _TRAMPOLINE_TYPE
|
||||
{
|
||||
TrampolineApStartup
|
||||
} TRAMPOLINE_TYPE, *PTRAMPOLINE_TYPE;
|
||||
|
||||
#endif /* __XTDK_I686_ARTYPES_H */
|
||||
|
@@ -15,38 +15,32 @@
|
||||
#include <i686/xtstruct.h>
|
||||
|
||||
|
||||
/* Hardware layer routines forward references */
|
||||
XTCLINK
|
||||
/* HAL library routines forward references */
|
||||
XTCDECL
|
||||
UCHAR
|
||||
HlReadPort8(IN USHORT Port);
|
||||
HlIoPortInByte(IN USHORT Port);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
USHORT
|
||||
HlReadPort16(IN USHORT Port);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
ULONG
|
||||
HlReadPort32(IN USHORT Port);
|
||||
HlIoPortInLong(IN USHORT Port);
|
||||
|
||||
XTCDECL
|
||||
USHORT
|
||||
HlIoPortInShort(IN USHORT Port);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
HlWritePort8(IN USHORT Port,
|
||||
HlIoPortOutByte(IN USHORT Port,
|
||||
IN UCHAR Data);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
HlWritePort16(IN USHORT Port,
|
||||
IN USHORT Value);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
HlWritePort32(IN USHORT Port,
|
||||
HlIoPortOutLong(IN USHORT Port,
|
||||
IN ULONG Value);
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
HlIoPortOutShort(IN USHORT Port,
|
||||
IN USHORT Value);
|
||||
|
||||
#endif /* __XTDK_I686_HLFUNCS_H */
|
||||
|
@@ -47,17 +47,20 @@
|
||||
#define APIC_DF_FLAT 0xFFFFFFFF
|
||||
#define APIC_DF_CLUSTER 0x0FFFFFFF
|
||||
|
||||
/* APIC delivery modes */
|
||||
#define APIC_DM_FIXED 0
|
||||
#define APIC_DM_LOWPRIO 1
|
||||
#define APIC_DM_SMI 2
|
||||
#define APIC_DM_REMOTE 3
|
||||
#define APIC_DM_NMI 4
|
||||
#define APIC_DM_INIT 5
|
||||
#define APIC_DM_STARTUP 6
|
||||
#define APIC_DM_EXTINT 7
|
||||
|
||||
/* APIC trigger modes */
|
||||
#define APIC_TGM_EDGE 0
|
||||
#define APIC_TGM_LEVEL 1
|
||||
|
||||
/* APIC LDR (Logical Destination Register) shifts */
|
||||
#define APIC_X2APIC_LDR_SHIFT 16
|
||||
#define APIC_XAPIC_LDR_SHIFT 24
|
||||
|
||||
/* Maximum number of I/O APICs */
|
||||
#define APIC_MAX_IOAPICS 64
|
||||
|
||||
/* 8259/ISP PIC ports definitions */
|
||||
#define PIC1_CONTROL_PORT 0x20
|
||||
#define PIC1_DATA_PORT 0x21
|
||||
@@ -69,123 +72,12 @@
|
||||
/* PIC vector definitions */
|
||||
#define PIC1_VECTOR_SPURIOUS 0x37
|
||||
|
||||
/* Serial ports information */
|
||||
#define COMPORT_ADDRESS {0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8}
|
||||
#define COMPORT_COUNT 8
|
||||
/* Serial port I/O addresses */
|
||||
#define COMPORT_ADDRESSES {0x000, 0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8}
|
||||
|
||||
/* Initial stall factor */
|
||||
#define INITIAL_STALL_FACTOR 100
|
||||
|
||||
/* APIC delivery mode enumeration list */
|
||||
typedef enum _APIC_DM
|
||||
{
|
||||
APIC_DM_FIXED,
|
||||
APIC_DM_LOWPRIO,
|
||||
APIC_DM_SMI,
|
||||
APIC_DM_REMOTE,
|
||||
APIC_DM_NMI,
|
||||
APIC_DM_INIT,
|
||||
APIC_DM_STARTUP,
|
||||
APIC_DM_EXTINT,
|
||||
} APIC_DM, *PAPIC_DM;
|
||||
|
||||
/* APIC destination short-hand enumeration list */
|
||||
typedef enum _APIC_DSH
|
||||
{
|
||||
APIC_DSH_Destination,
|
||||
APIC_DSH_Self,
|
||||
APIC_DSH_AllIncludingSelf,
|
||||
APIC_DSH_AllExclusingSelf
|
||||
} APIC_DSH, *PAPIC_DSH;
|
||||
|
||||
/* APIC mode list */
|
||||
typedef enum _APIC_MODE
|
||||
{
|
||||
APIC_MODE_COMPAT,
|
||||
APIC_MODE_X2APIC
|
||||
} APIC_MODE, *PAPIC_MODE;
|
||||
|
||||
/* APIC Register Address Map */
|
||||
typedef enum _APIC_REGISTER
|
||||
{
|
||||
APIC_ID = 0x02, /* APIC ID Register */
|
||||
APIC_VER = 0x03, /* APIC Version Register */
|
||||
APIC_TPR = 0x08, /* Task Priority Register */
|
||||
APIC_APR = 0x09, /* Arbitration Priority Register */
|
||||
APIC_PPR = 0x0A, /* Processor Priority Register (R) */
|
||||
APIC_EOI = 0x0B, /* EOI Register */
|
||||
APIC_RRR = 0x0C, /* Remote Read Register */
|
||||
APIC_LDR = 0x0D, /* Logical Destination Register */
|
||||
APIC_DFR = 0x0E, /* Destination Format Register (not available in extended mode) */
|
||||
APIC_SIVR = 0x0F, /* Spurious Interrupt Vector Register */
|
||||
APIC_ISR = 0x10, /* Interrupt Service Register*/
|
||||
APIC_TMR = 0x18, /* Trigger Mode Register */
|
||||
APIC_IRR = 0x20, /* Interrupt Request Register */
|
||||
APIC_ESR = 0x28, /* Error Status Register */
|
||||
APIC_ICR0 = 0x30, /* Interrupt Command Register */
|
||||
APIC_ICR1 = 0x31, /* Interrupt Command Register (not available in extended mode) */
|
||||
APIC_TMRLVTR = 0x32, /* Timer Local Vector Table */
|
||||
APIC_THRMLVTR = 0x33, /* Thermal Local Vector Table */
|
||||
APIC_PCLVTR = 0x34, /* Performance Counter Local Vector Table */
|
||||
APIC_LINT0 = 0x35, /* LINT0 Local Vector Table */
|
||||
APIC_LINT1 = 0x36, /* LINT1 Local Vector Table */
|
||||
APIC_ERRLVTR = 0x37, /* Error Local Vector Table */
|
||||
APIC_TICR = 0x38, /* Initial Count Register for Timer */
|
||||
APIC_TCCR = 0x39, /* Current Count Register for Timer */
|
||||
APIC_TDCR = 0x3E, /* Timer Divide Configuration Register */
|
||||
APIC_EAFR = 0x40, /* extended APIC Feature register */
|
||||
APIC_EACR = 0x41, /* Extended APIC Control Register */
|
||||
APIC_SEOI = 0x42, /* Specific End Of Interrupt Register */
|
||||
APIC_EXT0LVTR = 0x50, /* Extended Interrupt 0 Local Vector Table */
|
||||
APIC_EXT1LVTR = 0x51, /* Extended Interrupt 1 Local Vector Table */
|
||||
APIC_EXT2LVTR = 0x52, /* Extended Interrupt 2 Local Vector Table */
|
||||
APIC_EXT3LVTR = 0x53 /* Extended Interrupt 3 Local Vector Table */
|
||||
} APIC_REGISTER, *PAPIC_REGISTER;
|
||||
|
||||
/* I8259 PIC interrupt mode enumeration list */
|
||||
typedef enum _PIC_I8259_ICW1_INTERRUPT_MODE
|
||||
{
|
||||
EdgeTriggered,
|
||||
LevelTriggered
|
||||
} PIC_I8259_ICW1_INTERRUPT_MODE, *PPIC_I8259_ICW1_INTERRUPT_MODE;
|
||||
|
||||
/* I8259 PIC interval enumeration list */
|
||||
typedef enum _PIC_I8259_ICW1_INTERVAL
|
||||
{
|
||||
Interval8,
|
||||
Interval4
|
||||
} PIC_I8259_ICW1_INTERVAL, *PPIC_I8259_ICW1_INTERVAL;
|
||||
|
||||
/* I8259 PIC operating mode enumeration list */
|
||||
typedef enum _PIC_I8259_ICW1_OPERATING_MODE
|
||||
{
|
||||
Cascade,
|
||||
Single
|
||||
} PIC_I8259_ICW1_OPERATING_MODE, *PPIC_I8259_ICW1_OPERATING_MODE;
|
||||
|
||||
/* I8259 PIC buffered mode enumeration list */
|
||||
typedef enum _PIC_I8259_ICW4_BUFFERED_MODE
|
||||
{
|
||||
NonBuffered,
|
||||
NonBuffered2,
|
||||
BufferedSlave,
|
||||
BufferedMaster
|
||||
} PIC_I8259_ICW4_BUFFERED_MODE, *PPIC_I8259_ICW4_BUFFERED_MODE;
|
||||
|
||||
/* I8259 PIC End Of Interrupt (EOI) mode enumeration list */
|
||||
typedef enum _PIC_I8259_ICW4_EOI_MODE
|
||||
{
|
||||
NormalEoi,
|
||||
AutomaticEoi
|
||||
} PIC_I8259_ICW4_EOI_MODE, *PPIC_I8259_ICW4_EOI_MODE;
|
||||
|
||||
/* I8259 PIC system mode enumeration list */
|
||||
typedef enum _PIC_I8259_ICW4_SYSTEM_MODE
|
||||
{
|
||||
Mcs8085Mode,
|
||||
New8086Mode
|
||||
} PIC_I8259_ICW4_SYSTEM_MODE, *PPIC_I8259_ICW4_SYSTEM_MODE;
|
||||
|
||||
/* APIC Base Register */
|
||||
typedef union _APIC_BASE_REGISTER
|
||||
{
|
||||
@@ -202,31 +94,6 @@ typedef union _APIC_BASE_REGISTER
|
||||
};
|
||||
} APIC_BASE_REGISTER, *PAPIC_BASE_REGISTER;
|
||||
|
||||
/* APIC Command Register */
|
||||
typedef union _APIC_COMMAND_REGISTER
|
||||
{
|
||||
ULONGLONG LongLong;
|
||||
struct
|
||||
{
|
||||
ULONG Long0;
|
||||
ULONG Long1;
|
||||
};
|
||||
struct
|
||||
{
|
||||
ULONGLONG Vector:8;
|
||||
ULONGLONG DeliveryMode:3;
|
||||
ULONGLONG DestinationMode:1;
|
||||
ULONGLONG DeliveryStatus:1;
|
||||
ULONGLONG ReservedMBZ:1;
|
||||
ULONGLONG Level:1;
|
||||
ULONGLONG TriggerMode:1;
|
||||
ULONGLONG RemoteReadStatus:2;
|
||||
ULONGLONG DestinationShortHand:2;
|
||||
ULONGLONG Reserved2MBZ:36;
|
||||
ULONGLONG Destination:8;
|
||||
};
|
||||
} APIC_COMMAND_REGISTER, *PAPIC_COMMAND_REGISTER;
|
||||
|
||||
/* APIC Local Vector Table (LVT) Register */
|
||||
typedef union _APIC_LVT_REGISTER
|
||||
{
|
||||
@@ -234,7 +101,7 @@ typedef union _APIC_LVT_REGISTER
|
||||
struct
|
||||
{
|
||||
ULONG Vector:8;
|
||||
ULONG DeliveryMode:3;
|
||||
ULONG MessageType:3;
|
||||
ULONG Reserved1:1;
|
||||
ULONG DeliveryStatus:1;
|
||||
ULONG Reserved2:1;
|
||||
@@ -259,69 +126,14 @@ typedef union _APIC_SPURIOUS_REGISTER
|
||||
};
|
||||
} APIC_SPURIOUS_REGISTER, *PAPIC_SPURIOUS_REGISTER;
|
||||
|
||||
/* I8259 PIC register structure */
|
||||
typedef union _PIC_I8259_ICW1
|
||||
/* Processor identity structure */
|
||||
typedef struct _HAL_PROCESSOR_IDENTITY
|
||||
{
|
||||
struct
|
||||
{
|
||||
UCHAR NeedIcw4:1;
|
||||
UCHAR OperatingMode:1;
|
||||
UCHAR Interval:1;
|
||||
UCHAR InterruptMode:1;
|
||||
UCHAR Init:1;
|
||||
UCHAR InterruptVectorAddress:3;
|
||||
};
|
||||
UCHAR Bits;
|
||||
} PIC_I8259_ICW1, *PPIC_I8259_ICW1;
|
||||
|
||||
/* I8259 PIC register structure */
|
||||
typedef union _PIC_I8259_ICW2
|
||||
{
|
||||
struct
|
||||
{
|
||||
UCHAR Sbz:3;
|
||||
UCHAR InterruptVector:5;
|
||||
};
|
||||
UCHAR Bits;
|
||||
} PIC_I8259_ICW2, *PPIC_I8259_ICW2;
|
||||
|
||||
/* I8259 PIC register structure */
|
||||
typedef union _PIC_I8259_ICW3
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
UCHAR SlaveIrq0:1;
|
||||
UCHAR SlaveIrq1:1;
|
||||
UCHAR SlaveIrq2:1;
|
||||
UCHAR SlaveIrq3:1;
|
||||
UCHAR SlaveIrq4:1;
|
||||
UCHAR SlaveIrq5:1;
|
||||
UCHAR SlaveIrq6:1;
|
||||
UCHAR SlaveIrq7:1;
|
||||
};
|
||||
struct
|
||||
{
|
||||
UCHAR SlaveId:3;
|
||||
UCHAR Reserved:5;
|
||||
};
|
||||
};
|
||||
UCHAR Bits;
|
||||
} PIC_I8259_ICW3, *PPIC_I8259_ICW3;
|
||||
|
||||
/* I8259 PIC register structure */
|
||||
typedef union _PIC_I8259_ICW4
|
||||
{
|
||||
struct
|
||||
{
|
||||
UCHAR SystemMode:1;
|
||||
UCHAR EoiMode:1;
|
||||
UCHAR BufferedMode:2;
|
||||
UCHAR SpecialFullyNestedMode:1;
|
||||
UCHAR Reserved:3;
|
||||
};
|
||||
UCHAR Bits;
|
||||
} PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
||||
UCHAR ProcessorId;
|
||||
UCHAR LApicId;
|
||||
BOOLEAN Bsp;
|
||||
BOOLEAN Started;
|
||||
PKPROCESSOR_BLOCK ProcessorBlock;
|
||||
} HAL_PROCESSOR_IDENTITY, *PHAL_PROCESSOR_IDENTITY;
|
||||
|
||||
#endif /* __XTDK_I686_HLTYPES_H */
|
||||
|
@@ -95,6 +95,31 @@
|
||||
#define I686_INTERRUPT_GATE 0xE
|
||||
#define I686_TRAP_GATE 0xF
|
||||
|
||||
/* EFlags bits definitions */
|
||||
#define EFLAGS_NF_MASK 0x00000000L /* None */
|
||||
#define EFLAGS_CF_MASK 0x00000001L /* Carry */
|
||||
#define EFLAGS_PF_MASK 0x00000004L /* Parity */
|
||||
#define EFLAGS_AF_MASK 0x00000010L /* Aux Carry */
|
||||
#define EFLAGS_ZF_MASK 0x00000040L /* Zero */
|
||||
#define EFLAGS_SF_MASK 0x00000080L /* Sign */
|
||||
#define EFLAGS_TF 0x00000100L /* Trap */
|
||||
#define EFLAGS_INTERRUPT_MASK 0x00000200L /* Interrupt */
|
||||
#define EFLAGS_DF_MASK 0x00000400L /* Direction */
|
||||
#define EFLAGS_OF_MASK 0x00000800L /* Overflow */
|
||||
#define EFLAGS_IOPL_MASK 0x00003000L /* I/O Privilege */
|
||||
#define EFLAGS_NT 0x00004000L /* Nested Task */
|
||||
#define EFLAGS_SIGN_MASK 0x00008000L /* Sign */
|
||||
#define EFLAGS_RF 0x00010000L /* Resume */
|
||||
#define EFLAGS_V86_MASK 0x00020000L /* Virtual 8086 */
|
||||
#define EFLAGS_ALIGN_CHECK 0x00040000L /* Alignment Check */
|
||||
#define EFLAGS_VIF 0x00080000L /* Virtual Interrupt */
|
||||
#define EFLAGS_VIP 0x00100000L /* Virtual Interrupt Pending */
|
||||
#define EFLAGS_ID_MASK 0x00200000L /* Identification */
|
||||
|
||||
/* EFLAGS sanitize masks */
|
||||
#define EFLAGS_KERNELMODE 0x003F0FD7L
|
||||
#define EFLAGS_USERMODE 0x003F4DD7L
|
||||
|
||||
/* Context control flags */
|
||||
#define CONTEXT_ARCHITECTURE 0x00010000
|
||||
#define CONTEXT_CONTROL (CONTEXT_ARCHITECTURE | 0x01)
|
||||
@@ -143,10 +168,6 @@
|
||||
/* XTOS Kernel stack guard pages */
|
||||
#define KERNEL_STACK_GUARD_PAGES 1
|
||||
|
||||
/* Processor structures size */
|
||||
#define KPROCESSOR_STRUCTURES_SIZE ((2 * KERNEL_STACK_SIZE) + (GDT_ENTRIES * sizeof(KGDTENTRY)) + sizeof(KTSS) + \
|
||||
sizeof(KPROCESSOR_BLOCK) + MM_PAGE_SIZE)
|
||||
|
||||
/* Kernel frames */
|
||||
#define KTRAP_FRAME_ALIGN 0x08
|
||||
#define KTRAP_FRAME_SIZE sizeof(KTRAP_FRAME)
|
||||
@@ -432,9 +453,10 @@ typedef struct _KPROCESSOR_CONTROL_BLOCK
|
||||
PKTHREAD CurrentThread;
|
||||
PKTHREAD IdleThread;
|
||||
PKTHREAD NextThread;
|
||||
UCHAR CpuNumber;
|
||||
UCHAR Number;
|
||||
ULONG_PTR SetMember;
|
||||
CPU_IDENTIFICATION CpuId;
|
||||
CPU_FEATURES CpuFeatures;
|
||||
KPROCESSOR_STATE ProcessorState;
|
||||
KSPIN_LOCK_QUEUE LockQueue[MaximumLock];
|
||||
ULONG_PTR MultiThreadProcessorSet;
|
||||
@@ -448,28 +470,17 @@ typedef struct _KPROCESSOR_CONTROL_BLOCK
|
||||
|
||||
/* Processor Block structure definition */
|
||||
typedef struct _KPROCESSOR_BLOCK
|
||||
{
|
||||
union
|
||||
{
|
||||
THREAD_INFORMATION_BLOCK ThreadInformationBlock;
|
||||
struct
|
||||
{
|
||||
PKGDTENTRY GdtBase;
|
||||
PKTSS TssBase;
|
||||
PKPROCESSOR_BLOCK Self;
|
||||
PKPROCESSOR_CONTROL_BLOCK CurrentPrcb;
|
||||
};
|
||||
};
|
||||
PKIDTENTRY IdtBase;
|
||||
KRUNLEVEL RunLevel;
|
||||
PKIDTENTRY IdtBase;
|
||||
PKGDTENTRY GdtBase;
|
||||
PKTSS TssBase;
|
||||
KPROCESSOR_CONTROL_BLOCK Prcb;
|
||||
ULONG Irr;
|
||||
ULONG IrrActive;
|
||||
ULONG Idr;
|
||||
ULONG ContextSwitches;
|
||||
KAFFINITY SetMember;
|
||||
ULONG StallScaleFactor;
|
||||
UCHAR CpuNumber;
|
||||
} KPROCESSOR_BLOCK, *PKPROCESSOR_BLOCK;
|
||||
|
||||
/* Thread Environment Block (TEB) structure definition */
|
||||
|
@@ -14,48 +14,16 @@
|
||||
|
||||
|
||||
/* Pages related definitions */
|
||||
#define MM_PAGE_MASK (MM_PAGE_SIZE - 1)
|
||||
#define MM_PAGE_MASK 0xFFF
|
||||
#define MM_PAGE_SHIFT 12
|
||||
#define MM_PAGE_SIZE 4096
|
||||
|
||||
/* Page directory and page base addresses */
|
||||
#define MM_PTE_BASE 0xC0000000
|
||||
#define MM_PDE_BASE 0xC0600000
|
||||
|
||||
/* PTE shift values */
|
||||
#define MM_PTE_SHIFT 3
|
||||
#define MM_PTI_SHIFT 12
|
||||
#define MM_PDI_SHIFT 21
|
||||
#define MM_PPI_SHIFT 30
|
||||
|
||||
/* Page directory and page base legacy address */
|
||||
#define MM_PDE_LEGACY_BASE 0xC0300000
|
||||
|
||||
/* PTE legacy shift values */
|
||||
#define MM_PTE_LEGACY_SHIFT 2
|
||||
#define MM_PDI_LEGACY_SHIFT 22
|
||||
|
||||
/* Minimum number of physical pages needed by the system */
|
||||
#define MM_MINIMUM_PHYSICAL_PAGES 1100
|
||||
|
||||
/* Default number of secondary colors */
|
||||
#define MM_DEFAULT_SECONDARY_COLORS 64
|
||||
|
||||
/* Number of HAL allocation descriptors */
|
||||
#define MM_HARDWARE_ALLOCATION_DESCRIPTORS 64
|
||||
|
||||
/* Kernel HAL heap initial start address */
|
||||
#define MM_HARDWARE_HEAP_START_ADDRESS ((PVOID)(((ULONG_PTR)MM_HARDWARE_VA_START) + 1024 * 1024))
|
||||
|
||||
/* HAL memory pool virtual address start */
|
||||
#define MM_HARDWARE_VA_START 0xFFC00000
|
||||
|
||||
/* Maximum physical address used by HAL allocations */
|
||||
#define MM_MAXIMUM_PHYSICAL_ADDRESS 0xFFFFFFFF
|
||||
|
||||
/* Trampoline code address */
|
||||
#define MM_TRAMPOLINE_ADDRESS 0x80000
|
||||
|
||||
/* Page size enumeration list */
|
||||
typedef enum _PAGE_SIZE
|
||||
{
|
||||
@@ -64,26 +32,8 @@ typedef enum _PAGE_SIZE
|
||||
Size4M
|
||||
} PAGE_SIZE, *PPAGE_SIZE;
|
||||
|
||||
/* Legacy Page Table entry structure definition (PML2) */
|
||||
typedef struct _HARDWARE_LEGACY_PTE
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG Writable:1;
|
||||
ULONG Owner:1;
|
||||
ULONG WriteThrough:1;
|
||||
ULONG CacheDisable:1;
|
||||
ULONG Accessed:1;
|
||||
ULONG Dirty:1;
|
||||
ULONG LargePage:1;
|
||||
ULONG Global:1;
|
||||
ULONG CopyOnWrite:1;
|
||||
ULONG Prototype:1;
|
||||
ULONG Reserved0:1;
|
||||
ULONG PageFrameNumber:20;
|
||||
} HARDWARE_LEGACY_PTE, *PHARDWARE_LEGACY_PTE;
|
||||
|
||||
/* Page Table entry structure definition (PML3) */
|
||||
typedef struct _HARDWARE_MODERN_PTE
|
||||
/* Page Table entry structure definition (with PAE support) */
|
||||
typedef struct _HARDWARE_PTE
|
||||
{
|
||||
ULONGLONG Valid:1;
|
||||
ULONGLONG Writable:1;
|
||||
@@ -101,117 +51,10 @@ typedef struct _HARDWARE_MODERN_PTE
|
||||
ULONGLONG Reserved1:14;
|
||||
ULONGLONG SoftwareWsIndex:11;
|
||||
ULONGLONG NoExecute:1;
|
||||
} HARDWARE_MODERN_PTE, *PHARDWARE_MODERN_PTE;
|
||||
|
||||
/* Generic Page Table entry union to abstract PML2 and PML3 formats */
|
||||
typedef union _HARDWARE_PTE
|
||||
{
|
||||
ULONGLONG Long;
|
||||
HARDWARE_LEGACY_PTE Pml2;
|
||||
HARDWARE_MODERN_PTE Pml3;
|
||||
} HARDWARE_PTE, *PHARDWARE_PTE;
|
||||
|
||||
/* Page map information structure definition */
|
||||
typedef struct _MMPAGEMAP_INFO
|
||||
{
|
||||
BOOLEAN Xpa;
|
||||
ULONG PteBase;
|
||||
ULONG PdeBase;
|
||||
ULONG PdiShift;
|
||||
ULONG PteShift;
|
||||
} MMPAGEMAP_INFO, *PMMPAGEMAP_INFO;
|
||||
|
||||
/* Legacy Page Table Entry hardware structure definition (PML2) */
|
||||
typedef struct _MMPML2_PTE_HARDWARE
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG Writable:1;
|
||||
ULONG Owner:1;
|
||||
ULONG WriteThrough:1;
|
||||
ULONG CacheDisable:1;
|
||||
ULONG Accessed:1;
|
||||
ULONG Dirty:1;
|
||||
ULONG LargePage:1;
|
||||
ULONG Global:1;
|
||||
ULONG CopyOnWrite:1;
|
||||
ULONG Prototype:1;
|
||||
ULONG Write:1;
|
||||
ULONG PageFrameNumber:20;
|
||||
} MMPML2_PTE_HARDWARE, *PMMPML2_PTE_HARDWARE;
|
||||
|
||||
/* Legacy Page Table Entry list structure definition (PML2) */
|
||||
typedef struct _MMPML2_PTE_LIST
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG OneEntry:1;
|
||||
ULONG Reserved0:8;
|
||||
ULONG Prototype:1;
|
||||
ULONG Reserved1:1;
|
||||
ULONG NextEntry:20;
|
||||
} MMPML2_PTE_LIST, *PMMPML2_PTE_LIST;
|
||||
|
||||
/* Legacy Page Table Entry subsection structure definition (PML2) */
|
||||
typedef struct _MMPML2_PTE_PROTOTYPE
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG ProtoAddressLow:7;
|
||||
ULONG ReadOnly:1;
|
||||
ULONG WhichPool:1;
|
||||
ULONG Prototype:1;
|
||||
ULONG ProtoAddressHigh:21;
|
||||
} MMPML2_PTE_PROTOTYPE, *PMMPML2_PTE_PROTOTYPE;
|
||||
|
||||
/* Legacy Page Table Entry software structure definition (PML2) */
|
||||
typedef struct _MMPML2_PTE_SOFTWARE
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG PageFileLow:4;
|
||||
ULONG Protection:5;
|
||||
ULONG Prototype:1;
|
||||
ULONG Transition:1;
|
||||
ULONG PageFileHigh:20;
|
||||
} MMPML2_PTE_SOFTWARE, *PMMPML2_PTE_SOFTWARE;
|
||||
|
||||
/* Legacy Page Table Entry subsection structure definition (PML2) */
|
||||
typedef struct _MMPML2_PTE_SUBSECTION
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG SubsectionAddressLow:4;
|
||||
ULONG Protection:5;
|
||||
ULONG Prototype:1;
|
||||
ULONG SubsectionAddressHigh:20;
|
||||
ULONG WhichPool:1;
|
||||
} MMPML2_PTE_SUBSECTION, *PMMPML2_PTE_SUBSECTION;
|
||||
|
||||
/* Legacy Page Table Entry transition structure definition (PML2) */
|
||||
typedef struct _MMPML2_PTE_TRANSITION
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG Write:1;
|
||||
ULONG Owner:1;
|
||||
ULONG WriteThrough:1;
|
||||
ULONG CacheDisable:1;
|
||||
ULONG Protection:5;
|
||||
ULONG Prototype:1;
|
||||
ULONG Transition:1;
|
||||
ULONG PageFrameNumber:20;
|
||||
} MMPML2_PTE_TRANSITION, *PMMPML2_PTE_TRANSITION;
|
||||
|
||||
/* Legacy Page Table Entry union definition (PML2) */
|
||||
typedef union _MMPML2_PTE
|
||||
{
|
||||
ULONG Long;
|
||||
HARDWARE_PTE Flush;
|
||||
MMPML2_PTE_HARDWARE Hard;
|
||||
MMPML2_PTE_PROTOTYPE Proto;
|
||||
MMPML2_PTE_SOFTWARE Soft;
|
||||
MMPML2_PTE_TRANSITION Trans;
|
||||
MMPML2_PTE_SUBSECTION Subsect;
|
||||
MMPML2_PTE_LIST List;
|
||||
} MMPML2_PTE, *PMMPML2_PTE;
|
||||
|
||||
/* Page Table Entry hardware structure definition (PML3) */
|
||||
typedef struct _MMPML3_PTE_HARDWARE
|
||||
/* Page Table Entry on PAE enabled system */
|
||||
typedef struct _MMPTE_HARDWARE
|
||||
{
|
||||
ULONGLONG Valid:1;
|
||||
ULONGLONG Writable:1;
|
||||
@@ -226,59 +69,59 @@ typedef struct _MMPML3_PTE_HARDWARE
|
||||
ULONGLONG Prototype:1;
|
||||
ULONGLONG Write:1;
|
||||
ULONGLONG PageFrameNumber:26;
|
||||
ULONGLONG Reserved0:25;
|
||||
ULONGLONG Reserved1:25;
|
||||
ULONGLONG NoExecute:1;
|
||||
} MMPML3_PTE_HARDWARE, *PMMPML3_PTE_HARDWARE;
|
||||
} MMPTE_HARDWARE, *PMMPTE_HARDWARE;
|
||||
|
||||
/* Page Table Entry list structure definition (PML3) */
|
||||
typedef struct _MMPML3_PTE_LIST
|
||||
/* Page Table Entry list structure definition (with PAE support) */
|
||||
typedef struct _MMPTE_LIST
|
||||
{
|
||||
ULONGLONG Valid:1;
|
||||
ULONGLONG OneEntry:1;
|
||||
ULONGLONG Reserved0:8;
|
||||
ULONGLONG Reserved1:8;
|
||||
ULONGLONG Prototype:1;
|
||||
ULONGLONG Reserved1:21;
|
||||
ULONGLONG Reserved2:21;
|
||||
ULONGLONG NextEntry:32;
|
||||
} MMPML3_PTE_LIST, *PMMPML3_PTE_LIST;
|
||||
} MMPTE_LIST, *PMMPTE_LIST;
|
||||
|
||||
/* Page Table Entry subsection structure definition (PML3) */
|
||||
typedef struct _MMPML3_PTE_PROTOTYPE
|
||||
/* Page Table Entry subsection structure definition (with PAE support) */
|
||||
typedef struct _MMPTE_PROTOTYPE
|
||||
{
|
||||
ULONGLONG Valid:1;
|
||||
ULONGLONG Reserved0:7;
|
||||
ULONGLONG Reserved1:7;
|
||||
ULONGLONG ReadOnly:1;
|
||||
ULONGLONG Reserved1:1;
|
||||
ULONGLONG Reserved2:1;
|
||||
ULONGLONG Prototype:1;
|
||||
ULONGLONG Protection:5;
|
||||
ULONGLONG Reserved2:16;
|
||||
ULONGLONG Reserved3:16;
|
||||
ULONGLONG ProtoAddress:32;
|
||||
} MMPML3_PTE_PROTOTYPE, *PMMPML3_PTE_PROTOTYPE;
|
||||
} MMPTE_PROTOTYPE, *PMMPTE_PROTOTYPE;
|
||||
|
||||
/* Page Table Entry software structure definition (PML3) */
|
||||
typedef struct _MMPML3_PTE_SOFTWARE
|
||||
/* Page Table Entry software structure definition (with PAE support) */
|
||||
typedef struct _MMPTE_SOFTWARE
|
||||
{
|
||||
ULONGLONG Valid:1;
|
||||
ULONGLONG PageFileLow:4;
|
||||
ULONGLONG Protection:5;
|
||||
ULONGLONG Prototype:1;
|
||||
ULONGLONG Transition:1;
|
||||
ULONGLONG Reserved0:20;
|
||||
ULONGLONG Reserved1:20;
|
||||
ULONGLONG PageFileHigh:32;
|
||||
} MMPML3_PTE_SOFTWARE, *PMMPML3_PTE_SOFTWARE;
|
||||
} MMPTE_SOFTWARE, *PMMPTE_SOFTWARE;
|
||||
|
||||
/* Page Table Entry subsection structure definition (PML3) */
|
||||
typedef struct _MMPML3_PTE_SUBSECTION
|
||||
/* Page Table Entry subsection structure definition (with PAE support) */
|
||||
typedef struct _MMPTE_SUBSECTION
|
||||
{
|
||||
ULONGLONG Valid:1;
|
||||
ULONGLONG Reserved0:4;
|
||||
ULONGLONG Reserved1:4;
|
||||
ULONGLONG Protection:5;
|
||||
ULONGLONG Prototype:1;
|
||||
ULONGLONG Reserved1:21;
|
||||
ULONGLONG Reserved2:21;
|
||||
ULONGLONG SubsectionAddress:32;
|
||||
} MMPML3_PTE_SUBSECTION, *PMMPML3_PTE_SUBSECTION;
|
||||
} MMPTE_SUBSECTION, *PMMPTE_SUBSECTION;
|
||||
|
||||
/* Page Table Entry transition structure definition (PML3) */
|
||||
typedef struct _MMPML3_PTE_TRANSITION
|
||||
/* Page Table Entry transition structure definition (with PAE support) */
|
||||
typedef struct _MMPTE_TRANSITION
|
||||
{
|
||||
ULONGLONG Valid:1;
|
||||
ULONGLONG Write:1;
|
||||
@@ -290,29 +133,128 @@ typedef struct _MMPML3_PTE_TRANSITION
|
||||
ULONGLONG Transition:1;
|
||||
ULONGLONG PageFrameNumber:26;
|
||||
ULONGLONG Unused:26;
|
||||
} MMPML3_PTE_TRANSITION, *PMMPML3_PTE_TRANSITION;
|
||||
} MMPTE_TRANSITION, *PMMPTE_TRANSITION;
|
||||
|
||||
/* Page Table Entry union definition (PML3) */
|
||||
typedef union _MMPML3_PTE
|
||||
{
|
||||
ULONGLONG Long;
|
||||
HARDWARE_PTE Flush;
|
||||
MMPML3_PTE_HARDWARE Hardware;
|
||||
MMPML3_PTE_PROTOTYPE Prototype;
|
||||
MMPML3_PTE_SOFTWARE Software;
|
||||
MMPML3_PTE_TRANSITION Transition;
|
||||
MMPML3_PTE_SUBSECTION Subsection;
|
||||
MMPML3_PTE_LIST List;
|
||||
} MMPML3_PTE, *PMMPML3_PTE;
|
||||
|
||||
/* Generic Page Table Entry union to abstract PML2 and PML3 formats */
|
||||
/* Page Table Entry structure definition (with PAE support) */
|
||||
typedef union _MMPTE
|
||||
{
|
||||
ULONGLONG Long;
|
||||
MMPML2_PTE Pml2;
|
||||
MMPML3_PTE Pml3;
|
||||
HARDWARE_PTE Flush;
|
||||
MMPTE_HARDWARE Hardware;
|
||||
MMPTE_PROTOTYPE Prototype;
|
||||
MMPTE_SOFTWARE Software;
|
||||
MMPTE_TRANSITION Transition;
|
||||
MMPTE_SUBSECTION Subsection;
|
||||
MMPTE_LIST List;
|
||||
} MMPTE, *PMMPTE;
|
||||
|
||||
/* Legacy Page Table entry structure definition (without PAE support) */
|
||||
typedef struct _HARDWARE_LEGACY_PTE
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG Writable:1;
|
||||
ULONG Owner:1;
|
||||
ULONG WriteThrough:1;
|
||||
ULONG CacheDisable:1;
|
||||
ULONG Accessed:1;
|
||||
ULONG Dirty:1;
|
||||
ULONG LargePage:1;
|
||||
ULONG Global:1;
|
||||
ULONG CopyOnWrite:1;
|
||||
ULONG Prototype:1;
|
||||
ULONG Reserved0:1;
|
||||
ULONG PageFrameNumber:20;
|
||||
} HARDWARE_LEGACY_PTE, *PHARDWARE_LEGACY_PTE;
|
||||
|
||||
/* Legacy Page Table Entry on non-PAE system */
|
||||
typedef struct _MMPTE_LEGACY_HARDWARE
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG Writable:1;
|
||||
ULONG Owner:1;
|
||||
ULONG WriteThrough:1;
|
||||
ULONG CacheDisable:1;
|
||||
ULONG Accessed:1;
|
||||
ULONG Dirty:1;
|
||||
ULONG LargePage:1;
|
||||
ULONG Global:1;
|
||||
ULONG CopyOnWrite:1;
|
||||
ULONG Prototype:1;
|
||||
ULONG Write:1;
|
||||
ULONG PageFrameNumber:20;
|
||||
} MMPTE_LEGACY_HARDWARE, *PMMPTE_LEGACY_HARDWARE;
|
||||
|
||||
/* Legacy Page Table Entry list structure definition (without PAE support) */
|
||||
typedef struct _MMPTE_LEGACY_LIST
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG OneEntry:1;
|
||||
ULONG Reserved1:8;
|
||||
ULONG Prototype:1;
|
||||
ULONG Reserved2:1;
|
||||
ULONG NextEntry:20;
|
||||
} MMPTE_LEGACY_LIST, *PMMPTE_LEGACY_LIST;
|
||||
|
||||
/* Legacy Page Table Entry prototype structure definition (without PAE support) */
|
||||
typedef struct _MMPTE_LEGACY_PROTOTYPE
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG ProtoAddressLow:7;
|
||||
ULONG ReadOnly:1;
|
||||
ULONG WhichPool:1;
|
||||
ULONG Prototype:1;
|
||||
ULONG ProtoAddressHigh:21;
|
||||
} MMPTE_LEGACY_PROTOTYPE, *PMMPTE_LEGACY_PROTOTYPE;
|
||||
|
||||
/* Legacy Page Table Entry software structure definition (without PAE support) */
|
||||
typedef struct _MMPTE_LEGACY_SOFTWARE
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG PageFileLow:4;
|
||||
ULONG Protection:5;
|
||||
ULONG Prototype:1;
|
||||
ULONG Transition:1;
|
||||
ULONG PageFileHigh:20;
|
||||
} MMPTE_LEGACY_SOFTWARE, *PMMPTE_LEGACY_SOFTWARE;
|
||||
|
||||
/* Legacy Page Table Entry subsection structure definition (without PAE support) */
|
||||
typedef struct _MMPTE_LEGACY_SUBSECTION
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG SubsectionAddressLow:4;
|
||||
ULONG Protection:5;
|
||||
ULONG Prototype:1;
|
||||
ULONG SubsectionAddressHigh:20;
|
||||
ULONG WhichPool:1;
|
||||
} MMPTE_LEGACY_SUBSECTION, *PMMPTE_LEGACY_SUBSECTION;
|
||||
|
||||
/* Legacy Page Table Entry transition structure definition (without PAE support) */
|
||||
typedef struct _MMPTE_LEGACY_TRANSITION
|
||||
{
|
||||
ULONG Valid:1;
|
||||
ULONG Write:1;
|
||||
ULONG Owner:1;
|
||||
ULONG WriteThrough:1;
|
||||
ULONG CacheDisable:1;
|
||||
ULONG Protection:5;
|
||||
ULONG Prototype:1;
|
||||
ULONG Transition:1;
|
||||
ULONG PageFrameNumber:20;
|
||||
} MMPTE_LEGACY_TRANSITION, *PMMPTE_LEGACY_TRANSITION;
|
||||
|
||||
/* Legacy Page Table Entry structure definition (without PAE support) */
|
||||
typedef union _MMPTE_LEGACY
|
||||
{
|
||||
ULONG Long;
|
||||
HARDWARE_LEGACY_PTE Flush;
|
||||
MMPTE_LEGACY_HARDWARE Hardware;
|
||||
MMPTE_LEGACY_PROTOTYPE Prototype;
|
||||
MMPTE_LEGACY_SOFTWARE Software;
|
||||
MMPTE_LEGACY_TRANSITION Transition;
|
||||
MMPTE_LEGACY_SUBSECTION Subsection;
|
||||
MMPTE_LEGACY_LIST List;
|
||||
} MMPTE_LEGACY, *PMMPTE_LEGACY;
|
||||
|
||||
/* Page Frame Number structure definition */
|
||||
typedef struct _MMPFN
|
||||
{
|
||||
|
@@ -13,35 +13,22 @@
|
||||
|
||||
|
||||
/* Architecture-specific enumeration lists forward references */
|
||||
typedef enum _APIC_DM APIC_DM, *PAPIC_DM;
|
||||
typedef enum _APIC_DSH APIC_DSH, *PAPIC_DSH;
|
||||
typedef enum _APIC_MODE APIC_MODE, *PAPIC_MODE;
|
||||
typedef enum _APIC_REGISTER APIC_REGISTER, *PAPIC_REGISTER;
|
||||
typedef enum _CPU_VENDOR CPU_VENDOR, *PCPU_VENDOR;
|
||||
typedef enum _CPUID_FEATURES_EXTENDED CPUID_FEATURES_EXTENDED, *PCPUID_FEATURES_EXTENDED;
|
||||
typedef enum _CPUID_FEATURES_STANDARD1 CPUID_FEATURES_STANDARD1, *PCPUID_FEATURES_STANDARD1;
|
||||
typedef enum _CPUID_FEATURES_STANDARD7_LEAF0 CPUID_FEATURES_STANDARD7_LEAF0, *PCPUID_FEATURES_STANDARD7_LEAF0;
|
||||
typedef enum _CPUID_FEATURES_STANDARD7_LEAF1 CPUID_FEATURES_STANDARD7_LEAF1, *PCPUID_FEATURES_STANDARD7_LEAF1;
|
||||
typedef enum _CPUID_FEATURES CPUID_FEATURES, *PCPUID_FEATURES;
|
||||
typedef enum _CPUID_REQUESTS CPUID_REQUESTS, *PCPUID_REQUESTS;
|
||||
typedef enum _PAGE_SIZE PAGE_SIZE, *PPAGE_SIZE;
|
||||
typedef enum _PIC_I8259_ICW1_INTERRUPT_MODE PIC_I8259_ICW1_INTERRUPT_MODE, *PPIC_I8259_ICW1_INTERRUPT_MODE;
|
||||
typedef enum _PIC_I8259_ICW1_INTERVAL PIC_I8259_ICW1_INTERVAL, *PPIC_I8259_ICW1_INTERVAL;
|
||||
typedef enum _PIC_I8259_ICW1_OPERATING_MODE PIC_I8259_ICW1_OPERATING_MODE, *PPIC_I8259_ICW1_OPERATING_MODE;
|
||||
typedef enum _PIC_I8259_ICW4_BUFFERED_MODE PIC_I8259_ICW4_BUFFERED_MODE, *PPIC_I8259_ICW4_BUFFERED_MODE;
|
||||
typedef enum _PIC_I8259_ICW4_EOI_MODE PIC_I8259_ICW4_EOI_MODE, *PPIC_I8259_ICW4_EOI_MODE;
|
||||
typedef enum _PIC_I8259_ICW4_SYSTEM_MODE PIC_I8259_ICW4_SYSTEM_MODE, *PPIC_I8259_ICW4_SYSTEM_MODE;
|
||||
typedef enum _TRAMPOLINE_TYPE TRAMPOLINE_TYPE, *PTRAMPOLINE_TYPE;
|
||||
|
||||
/* Architecture-specific structures forward references */
|
||||
typedef struct _CONTEXT CONTEXT, *PCONTEXT;
|
||||
typedef struct _CPU_IDENTIFICATION CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
|
||||
typedef struct _CPU_FEATURES CPU_FEATURES, *PCPU_FEATURES;
|
||||
typedef struct _CPUID_REGISTERS CPUID_REGISTERS, *PCPUID_REGISTERS;
|
||||
typedef struct _CPUID_SIGNATURE CPUID_SIGNATURE, *PCPUID_SIGNATURE;
|
||||
typedef struct _FN_SAVE_FORMAT FN_SAVE_FORMAT, *PFN_SAVE_FORMAT;
|
||||
typedef struct _FX_SAVE_AREA FX_SAVE_AREA, *PFX_SAVE_AREA;
|
||||
typedef struct _FX_SAVE_FORMAT FX_SAVE_FORMAT, *PFX_SAVE_FORMAT;
|
||||
typedef struct _HARDWARE_LEGACY_PTE HARDWARE_LEGACY_PTE, *PHARDWARE_LEGACY_PTE;
|
||||
typedef struct _HARDWARE_MODERN_PTE HARDWARE_MODERN_PTE, *PHARDWARE_MODERN_PTE;
|
||||
typedef struct _HARDWARE_PTE HARDWARE_PTE, *PHARDWARE_PTE;
|
||||
typedef struct _KDESCRIPTOR KDESCRIPTOR, *PKDESCRIPTOR;
|
||||
typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
|
||||
typedef struct _KGDTENTRY KGDTENTRY, *PKGDTENTRY;
|
||||
@@ -56,36 +43,25 @@ typedef struct _KSWITCH_FRAME KSWITCH_FRAME, *PKSWITCH_FRAME;
|
||||
typedef struct _KTHREAD_INIT_FRAME KTHREAD_INIT_FRAME, *PKTHREAD_INIT_FRAME;
|
||||
typedef struct _KTRAP_FRAME KTRAP_FRAME, *PKTRAP_FRAME;
|
||||
typedef struct _KTSS KTSS, *PKTSS;
|
||||
typedef struct _MMPAGEMAP_INFO MMPAGEMAP_INFO, *PMMPAGEMAP_INFO;
|
||||
typedef struct _MMPFN MMPFN, *PMMPFN;
|
||||
typedef struct _MMPML2_PTE_HARDWARE MMPML2_PTE_HARDWARE, *PMMPML2_PTE_HARDWARE;
|
||||
typedef struct _MMPML2_PTE_LIST MMPML2_PTE_LIST, *PMMPML2_PTE_LIST;
|
||||
typedef struct _MMPML2_PTE_PROTOTYPE MMPML2_PTE_PROTOTYPE, *PMMPML2_PTE_PROTOTYPE;
|
||||
typedef struct _MMPML2_PTE_SOFTWARE MMPML2_PTE_SOFTWARE, *PMMPML2_PTE_SOFTWARE;
|
||||
typedef struct _MMPML2_PTE_SUBSECTION MMPML2_PTE_SUBSECTION, *PMMPML2_PTE_SUBSECTION;
|
||||
typedef struct _MMPML2_PTE_TRANSITION MMPML2_PTE_TRANSITION, *PMMPML2_PTE_TRANSITION;
|
||||
typedef struct _MMPML3_PTE_HARDWARE MMPML3_PTE_HARDWARE, *PMMPML3_PTE_HARDWARE;
|
||||
typedef struct _MMPML3_PTE_LIST MMPML3_PTE_LIST, *PMMPML3_PTE_LIST;
|
||||
typedef struct _MMPML3_PTE_PROTOTYPE MMPML3_PTE_PROTOTYPE, *PMMPML3_PTE_PROTOTYPE;
|
||||
typedef struct _MMPML3_PTE_SOFTWARE MMPML3_PTE_SOFTWARE, *PMMPML3_PTE_SOFTWARE;
|
||||
typedef struct _MMPML3_PTE_SUBSECTION MMPML3_PTE_SUBSECTION, *PMMPML3_PTE_SUBSECTION;
|
||||
typedef struct _MMPML3_PTE_TRANSITION MMPML3_PTE_TRANSITION, *PMMPML3_PTE_TRANSITION;
|
||||
typedef struct _MMPTE_HARDWARE MMPTE_HARDWARE, *PMMPTE_HARDWARE;
|
||||
typedef struct _MMPTE_LEGACY_HARDWARE MMPTE_LEGACY_HARDWARE, *PMMPTE_LEGACY_HARDWARE;
|
||||
typedef struct _MMPTE_LEGACY_LIST MMPTE_LEGACY_LIST, *PMMPTE_LEGACY_LIST;
|
||||
typedef struct _MMPTE_LEGACY_PROTOTYPE MMPTE_LEGACY_PROTOTYPE, *PMMPTE_LEGACY_PROTOTYPE;
|
||||
typedef struct _MMPTE_LEGACY_SOFTWARE MMPTE_LEGACY_SOFTWARE, *PMMPTE_LEGACY_SOFTWARE;
|
||||
typedef struct _MMPTE_LEGACY_SUBSECTION MMPTE_LEGACY_SUBSECTION, *PMMPTE_LEGACY_SUBSECTION;
|
||||
typedef struct _MMPTE_LEGACY_TRANSITION MMPTE_LEGACY_TRANSITION, *PMMPTE_LEGACY_TRANSITION;
|
||||
typedef struct _MMPTE_LIST MMPTE_LIST, *PMMPTE_LIST;
|
||||
typedef struct _MMPTE_PROTOTYPE MMPTE_PROTOTYPE, *PMMPTE_PROTOTYPE;
|
||||
typedef struct _MMPTE_SOFTWARE MMPTE_SOFTWARE, *PMMPTE_SOFTWARE;
|
||||
typedef struct _MMPTE_SUBSECTION MMPTE_SUBSECTION, *PMMPTE_SUBSECTION;
|
||||
typedef struct _MMPTE_TRANSITION MMPTE_TRANSITION, *PMMPTE_TRANSITION;
|
||||
typedef struct _THREAD_ENVIRONMENT_BLOCK THREAD_ENVIRONMENT_BLOCK, *PTHREAD_ENVIRONMENT_BLOCK;
|
||||
|
||||
/* Unions forward references */
|
||||
typedef union _APIC_BASE_REGISTER APIC_BASE_REGISTER, *PAPIC_BASE_REGISTER;
|
||||
typedef union _APIC_COMMAND_REGISTER APIC_COMMAND_REGISTER, *PAPIC_COMMAND_REGISTER;
|
||||
typedef union _APIC_LVT_REGISTER APIC_LVT_REGISTER, *PAPIC_LVT_REGISTER;
|
||||
typedef union _APIC_SPURIOUS_REGISTER APIC_SPURIOUS_REGISTER, *PAPIC_SPURIOUS_REGISTER;
|
||||
typedef union _HARDWARE_PTE HARDWARE_PTE, *PHARDWARE_PTE;
|
||||
typedef union _MMPML2_PTE MMPML2_PTE, *PMMPML2_PTE;
|
||||
typedef union _MMPML3_PTE MMPML3_PTE, *PMMPML3_PTE;
|
||||
typedef union _MMPTE MMPDE, *PMMPDE;
|
||||
typedef union _MMPTE MMPPE, *PMMPPE;
|
||||
typedef union _MMPTE MMPTE, *PMMPTE;
|
||||
typedef union _PIC_I8259_ICW1 PIC_I8259_ICW1, *PPIC_I8259_ICW1;
|
||||
typedef union _PIC_I8259_ICW2 PIC_I8259_ICW2, *PPIC_I8259_ICW2;
|
||||
typedef union _PIC_I8259_ICW3 PIC_I8259_ICW3, *PPIC_I8259_ICW3;
|
||||
typedef union _PIC_I8259_ICW4 PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
||||
typedef union _MMPTE_LEGACY MMPDE_LEGACY, *PMMPDE_LEGACY;
|
||||
typedef union _MMPTE_LEGACY MMPTE_LEGACY, *PMMPTE_LEGACY;
|
||||
|
||||
#endif /* __XTDK_I686_XTSTRUCT_H */
|
||||
|
@@ -1,23 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: sdk/xtdk/kdfuncs.h
|
||||
* DESCRIPTION: XTOS kernel debugger routine definitions
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTDK_KDFUNCS_H
|
||||
#define __XTDK_KDFUNCS_H
|
||||
|
||||
#include <xtdefs.h>
|
||||
#include <xttypes.h>
|
||||
|
||||
|
||||
/* Kernel debugger routines forward references */
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
DbgPrint(PCWSTR Format,
|
||||
...);
|
||||
|
||||
#endif /* __XTDK_KDFUNCS_H */
|
@@ -1,45 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: sdk/xtdk/kdtypes.h
|
||||
* DESCRIPTION: Kernel Debugger data structures
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTDK_KDTYPES_H
|
||||
#define __XTDK_KDTYPES_H
|
||||
|
||||
#include <xtbase.h>
|
||||
#include <xtstruct.h>
|
||||
#include <rtltypes.h>
|
||||
|
||||
|
||||
/* Number of debug providers */
|
||||
#define KDBG_PROVIDERS_COUNT 2
|
||||
|
||||
/* Debug providers bitmask definitions */
|
||||
#define DEBUG_PROVIDER_COMPORT 0x00000001
|
||||
#define DEBUG_PROVIDER_FRAMEBUFFER 0x00000002
|
||||
|
||||
/* Kernel routine callbacks */
|
||||
typedef XTSTATUS (XTAPI *PKD_INIT_ROUTINE)();
|
||||
typedef VOID (*PKD_PRINT_ROUTINE)(IN PCWSTR Format, IN ...);
|
||||
|
||||
/* Debug mode structure definition */
|
||||
typedef struct _KD_DEBUG_MODE
|
||||
{
|
||||
BOOLEAN Enabled;
|
||||
ULONG Mode;
|
||||
ULONG ComPortAddress;
|
||||
ULONG ComPortNumber;
|
||||
ULONG ComPortBaudRate;
|
||||
} KD_DEBUG_MODE, *PKD_DEBUG_MODE;
|
||||
|
||||
/* Kernel debugger dispatch table structure definition */
|
||||
typedef struct _KD_DISPATCH_TABLE
|
||||
{
|
||||
LIST_ENTRY ListEntry;
|
||||
RTL_PRINT_CONTEXT PrintContext;
|
||||
} KD_DISPATCH_TABLE, *PKD_DISPATCH_TABLE;
|
||||
|
||||
#endif /* __XTDK_KDTYPES_H */
|
@@ -16,44 +16,26 @@
|
||||
|
||||
|
||||
/* Kernel services routines forward references */
|
||||
XTCLINK
|
||||
XTFASTCALL
|
||||
VOID
|
||||
KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_LEVEL LockLevel);
|
||||
|
||||
XTCLINK
|
||||
XTFASTCALL
|
||||
VOID
|
||||
KeAcquireSpinLock(IN OUT PKSPIN_LOCK SpinLock);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
XTSTATUS
|
||||
KeAcquireSystemResource(IN SYSTEM_RESOURCE_TYPE ResourceType,
|
||||
OUT PSYSTEM_RESOURCE_HEADER *ResourceHeader);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
KeCancelTimer(IN PKTIMER Timer);
|
||||
|
||||
XTCLINK
|
||||
XTFASTCALL
|
||||
KRUNLEVEL
|
||||
KeGetCurrentRunLevel(VOID);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
XTSTATUS
|
||||
KeGetSystemResource(IN SYSTEM_RESOURCE_TYPE ResourceType,
|
||||
OUT PSYSTEM_RESOURCE_HEADER *ResourceHeader);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
KeGetTimerState(IN PKTIMER Timer);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
KeInitializeApc(IN PKAPC Apc,
|
||||
@@ -65,54 +47,45 @@ KeInitializeApc(IN PKAPC Apc,
|
||||
IN KPROCESSOR_MODE ApcMode,
|
||||
IN PVOID Context);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
KeInitializeDpc(IN PKDPC Dpc,
|
||||
IN PKDEFERRED_ROUTINE DpcRoutine,
|
||||
IN PVOID DpcContext);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
KeInitializeSemaphore(IN PKSEMAPHORE Semaphore,
|
||||
IN LONG Count,
|
||||
IN LONG Limit);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
KeInitializeThreadedDpc(IN PKDPC Dpc,
|
||||
IN PKDEFERRED_ROUTINE DpcRoutine,
|
||||
IN PVOID DpcContext);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
KeInitializeTimer(OUT PKTIMER Timer,
|
||||
IN KTIMER_TYPE Type);
|
||||
|
||||
XTCLINK
|
||||
XTFASTCALL
|
||||
VOID
|
||||
KeLowerRunLevel(IN KRUNLEVEL RunLevel);
|
||||
|
||||
XTCLINK
|
||||
XTFASTCALL
|
||||
KRUNLEVEL
|
||||
KeRaiseRunLevel(IN KRUNLEVEL RunLevel);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
LONG
|
||||
KeReadSemaphoreState(IN PKSEMAPHORE Semaphore);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
LONG
|
||||
KeReleaseSemaphore(IN PKSEMAPHORE Semaphore,
|
||||
@@ -120,28 +93,19 @@ KeReleaseSemaphore(IN PKSEMAPHORE Semaphore,
|
||||
IN LONG Adjustment,
|
||||
IN BOOLEAN Wait);
|
||||
|
||||
XTCLINK
|
||||
XTFASTCALL
|
||||
VOID
|
||||
KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_LEVEL LockLevel);
|
||||
|
||||
XTCLINK
|
||||
XTFASTCALL
|
||||
VOID
|
||||
KeReleaseSpinLock(IN OUT PKSPIN_LOCK SpinLock);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
KeReleaseSystemResource(IN PSYSTEM_RESOURCE_HEADER ResourceHeader);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
KeSetTargetProcessorDpc(IN PKDPC Dpc,
|
||||
IN CCHAR Number);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
KeSetTimer(IN PKTIMER Timer,
|
||||
@@ -149,12 +113,10 @@ KeSetTimer(IN PKTIMER Timer,
|
||||
IN LONG Period,
|
||||
IN PKDPC Dpc);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
KeSignalCallDpcDone(IN PVOID SystemArgument);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
KeSignalCallDpcSynchronize(IN PVOID SystemArgument);
|
||||
|
@@ -183,14 +183,6 @@ typedef enum _MODE
|
||||
MaximumMode
|
||||
} MODE, *PMODE;
|
||||
|
||||
/* System resource types */
|
||||
typedef enum _SYSTEM_RESOURCE_TYPE
|
||||
{
|
||||
SystemResourceInvalid,
|
||||
SystemResourceAcpi,
|
||||
SystemResourceFrameBuffer
|
||||
} SYSTEM_RESOURCE_TYPE, *PSYSTEM_RESOURCE_TYPE;
|
||||
|
||||
/* Wait type */
|
||||
typedef enum _WAIT_TYPE
|
||||
{
|
||||
@@ -198,14 +190,6 @@ typedef enum _WAIT_TYPE
|
||||
WaitAny
|
||||
} WAIT_TYPE, *PWAIT_TYPE;
|
||||
|
||||
/* Kernel UBSAN data types enumeration list */
|
||||
typedef enum _KUBSAN_DATA_TYPE
|
||||
{
|
||||
DataTypeInt,
|
||||
DataTypeFloat,
|
||||
DataTypeUnknown = 0xFFFF
|
||||
} KUBSAN_DATA_TYPE, *PKUBSAN_DATA_TYPE;
|
||||
|
||||
/* Kernel routine callbacks */
|
||||
typedef EXCEPTION_DISPOSITION (XTCDECL *PEXCEPTION_ROUTINE)(IN PEXCEPTION_RECORD ExceptionRecord, IN PVOID EstablisherFrame, IN OUT PCONTEXT ContextRecord, IN OUT PVOID DispatcherContext);
|
||||
typedef VOID (XTAPI *PKDEFERRED_ROUTINE)(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2);
|
||||
@@ -381,35 +365,25 @@ typedef struct _KPROCESS
|
||||
LIST_ENTRY ProfileListHead;
|
||||
ULONG_PTR DirectoryTable[2];
|
||||
USHORT IopmOffset;
|
||||
UCHAR Iopl;
|
||||
VOLATILE KAFFINITY ActiveProcessors;
|
||||
ULONG KernelTime;
|
||||
ULONG UserTime;
|
||||
LIST_ENTRY ReadyListHead;
|
||||
SINGLE_LIST_ENTRY SwapListEntry;
|
||||
PVOID VdmTrapHandler;
|
||||
LIST_ENTRY ThreadListHead;
|
||||
KSPIN_LOCK ProcessLock;
|
||||
KAFFINITY Affinity;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
BOOLEAN AutoAlignment;
|
||||
BOOLEAN DisableBoost;
|
||||
BOOLEAN DisableQuantum;
|
||||
LONG AutoAlignment:1;
|
||||
LONG DisableBoost:1;
|
||||
LONG DisableQuantum:1;
|
||||
LONG ReservedFlags:29;
|
||||
};
|
||||
LONG ProcessFlags;
|
||||
};
|
||||
ULONG_PTR StackCount;
|
||||
SCHAR BasePriority;
|
||||
SCHAR Quantum;
|
||||
UCHAR State;
|
||||
UCHAR ThreadSeed;
|
||||
UCHAR PowerState;
|
||||
UCHAR IdealNode;
|
||||
UCHAR Spare;
|
||||
ULONG_PTR StackCount;
|
||||
} KPROCESS, *PKPROCESS;
|
||||
|
||||
/* Thread control block structure definition */
|
||||
@@ -422,13 +396,7 @@ typedef struct _KTHREAD
|
||||
PVOID StackBase;
|
||||
PVOID StackLimit;
|
||||
KSPIN_LOCK ThreadLock;
|
||||
|
||||
ULONG ContextSwitches;
|
||||
VOLATILE UCHAR State;
|
||||
UCHAR NpxState;
|
||||
KRUNLEVEL WaitRunLevel;
|
||||
KPROCESSOR_MODE WaitMode;
|
||||
PTHREAD_ENVIRONMENT_BLOCK EnvironmentBlock;
|
||||
volatile UCHAR State;
|
||||
union
|
||||
{
|
||||
KAPC_STATE ApcState;
|
||||
@@ -443,8 +411,13 @@ typedef struct _KTHREAD
|
||||
};
|
||||
};
|
||||
KSPIN_LOCK ApcQueueLock;
|
||||
ULONG ContextSwitches;
|
||||
LONG_PTR WaitStatus;
|
||||
union
|
||||
{
|
||||
PKWAIT_BLOCK WaitBlockList;
|
||||
PKGATE GateObject;
|
||||
};
|
||||
BOOLEAN Alertable;
|
||||
BOOLEAN WaitNext;
|
||||
UCHAR WaitReason;
|
||||
@@ -458,191 +431,43 @@ typedef struct _KTHREAD
|
||||
SINGLE_LIST_ENTRY SwapListEntry;
|
||||
};
|
||||
PKQUEUE Queue;
|
||||
ULONG WaitTime;
|
||||
CHAR PreviousMode;
|
||||
SHORT SpecialApcDisable;
|
||||
PTHREAD_ENVIRONMENT_BLOCK EnvironmentBlock;
|
||||
union
|
||||
{
|
||||
KTIMER Timer;
|
||||
struct
|
||||
{
|
||||
UCHAR TimerFill[KTIMER_LENGTH];
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
SHORT KernelApcDisable;
|
||||
SHORT SpecialApcDisable;
|
||||
LONG AutoAlignment:1;
|
||||
LONG DisableBoost:1;
|
||||
LONG ReservedFlags:30;
|
||||
};
|
||||
LONG ThreadFlags;
|
||||
};
|
||||
};
|
||||
ULONG CombinedApcDisable;
|
||||
};
|
||||
KTIMER Timer;
|
||||
KWAIT_BLOCK WaitBlock[KTHREAD_WAIT_BLOCK + 1];
|
||||
UCHAR NpxState;
|
||||
KRUNLEVEL WaitRunLevel;
|
||||
LIST_ENTRY QueueListEntry;
|
||||
PKTRAP_FRAME TrapFrame;
|
||||
PVOID CallbackStack;
|
||||
PVOID ServiceTable;
|
||||
ULONG KernelLimit;
|
||||
UCHAR ApcStateIndex;
|
||||
BOOLEAN Preempted;
|
||||
BOOLEAN ProcessReadyQueue;
|
||||
BOOLEAN KernelStackResident;
|
||||
CHAR Saturation;
|
||||
UCHAR IdealProcessor;
|
||||
SCHAR BasePriority;
|
||||
UCHAR Spare4;
|
||||
SCHAR PriorityDecrement;
|
||||
SCHAR Quantum;
|
||||
BOOLEAN SystemAffinityActive;
|
||||
CHAR PreviousMode;
|
||||
UCHAR ResourceIndex;
|
||||
UCHAR DisableBoost;
|
||||
KAFFINITY UserAffinity;
|
||||
BOOLEAN StackResident;
|
||||
PKPROCESS Process;
|
||||
KAFFINITY Affinity;
|
||||
PVOID ServiceTable;
|
||||
PKAPC_STATE ApcStatePointer[2];
|
||||
KAPC_STATE SavedApcState;
|
||||
PVOID CallbackStack;
|
||||
PVOID SubSystemThread;
|
||||
PKTRAP_FRAME TrapFrame;
|
||||
ULONG KernelTime;
|
||||
ULONG UserTime;
|
||||
KAPC SuspendApc;
|
||||
KSEMAPHORE SuspendSemaphore;
|
||||
PVOID TlsArray;
|
||||
PVOID LegoData;
|
||||
LIST_ENTRY ThreadListEntry;
|
||||
UCHAR LargeStack;
|
||||
UCHAR PowerState;
|
||||
UCHAR NpxIrql;
|
||||
UCHAR Spare5;
|
||||
BOOLEAN AutoAlignment;
|
||||
UCHAR Iopl;
|
||||
CCHAR FreezeCount;
|
||||
CCHAR SuspendCount;
|
||||
UCHAR Spare0[1];
|
||||
UCHAR UserIdealProcessor;
|
||||
UCHAR Spare2[3];
|
||||
ULONG KernelLimit;
|
||||
BOOLEAN StackResident;
|
||||
} KTHREAD, *PKTHREAD;
|
||||
|
||||
/* System resource common header structure definition */
|
||||
typedef struct _SYSTEM_RESOURCE_HEADER
|
||||
{
|
||||
LIST_ENTRY ListEntry;
|
||||
SYSTEM_RESOURCE_TYPE ResourceType;
|
||||
BOOLEAN ResourceLocked;
|
||||
ULONG ResourceSize;
|
||||
PVOID PhysicalAddress;
|
||||
PVOID VirtualAddress;
|
||||
} SYSTEM_RESOURCE_HEADER, *PSYSTEM_RESOURCE_HEADER;
|
||||
|
||||
/* ACPI system resource structure definition */
|
||||
typedef struct _SYSTEM_RESOURCE_ACPI
|
||||
{
|
||||
SYSTEM_RESOURCE_HEADER Header;
|
||||
PVOID ApicBase;
|
||||
} SYSTEM_RESOURCE_ACPI, *PSYSTEM_RESOURCE_ACPI;
|
||||
|
||||
/* FrameBuffer system resource structure definition */
|
||||
typedef struct _SYSTEM_RESOURCE_FRAMEBUFFER
|
||||
{
|
||||
SYSTEM_RESOURCE_HEADER Header;
|
||||
ULONG_PTR BufferSize;
|
||||
UINT Width;
|
||||
UINT Height;
|
||||
UINT Depth;
|
||||
UINT PixelsPerScanLine;
|
||||
UINT BitsPerPixel;
|
||||
UINT Pitch;
|
||||
PVOID Font;
|
||||
struct
|
||||
{
|
||||
USHORT BlueShift;
|
||||
USHORT BlueSize;
|
||||
USHORT GreenShift;
|
||||
USHORT GreenSize;
|
||||
USHORT RedShift;
|
||||
USHORT RedSize;
|
||||
USHORT ReservedShift;
|
||||
USHORT ReservedSize;
|
||||
} Pixels;
|
||||
} SYSTEM_RESOURCE_FRAMEBUFFER, *PSYSTEM_RESOURCE_FRAMEBUFFER;
|
||||
|
||||
/* Kernel UBSAN source location structure definition */
|
||||
typedef struct _KUBSAN_SOURCE_LOCATION
|
||||
{
|
||||
PCCHAR FileName;
|
||||
union
|
||||
{
|
||||
ULONG Reported;
|
||||
struct
|
||||
{
|
||||
UINT Line;
|
||||
UINT Column;
|
||||
};
|
||||
};
|
||||
} KUBSAN_SOURCE_LOCATION, *PKUBSAN_SOURCE_LOCATION;
|
||||
|
||||
/* Kernel UBSAN type descriptor structure definition */
|
||||
typedef struct _KUBSAN_TYPE_DESCRIPTOR
|
||||
{
|
||||
USHORT DataType;
|
||||
USHORT TypeInfo;
|
||||
CHAR TypeName[1];
|
||||
} KUBSAN_TYPE_DESCRIPTOR, *PKUBSAN_TYPE_DESCRIPTOR;
|
||||
|
||||
/* Kernel UBSAN float cast overflow data structure definition */
|
||||
typedef struct _KUBSAN_FLOAT_CAST_OVERFLOW_DATA
|
||||
{
|
||||
KUBSAN_SOURCE_LOCATION Location;
|
||||
PKUBSAN_TYPE_DESCRIPTOR LhsType;
|
||||
PKUBSAN_TYPE_DESCRIPTOR RhsType;
|
||||
} KUBSAN_FLOAT_CAST_OVERFLOW_DATA, *PKUBSAN_FLOAT_CAST_OVERFLOW_DATA;
|
||||
|
||||
/* Kernel UBSAN function type mismatch data structure definition */
|
||||
typedef struct _KUBSAN_FUNCTION_TYPE_MISMATCH_DATA
|
||||
{
|
||||
KUBSAN_SOURCE_LOCATION Location;
|
||||
PKUBSAN_TYPE_DESCRIPTOR Type;
|
||||
} KUBSAN_FUNCTION_TYPE_MISMATCH_DATA, *PKUBSAN_FUNCTION_TYPE_MISMATCH_DATA;
|
||||
|
||||
/* Kernel UBSAN invalid builtin data structure definition */
|
||||
typedef struct _KUBSAN_INVALID_BUILTIN_DATA
|
||||
{
|
||||
KUBSAN_SOURCE_LOCATION Location;
|
||||
UCHAR Kind;
|
||||
} KUBSAN_INVALID_BUILTIN_DATA, *PKUBSAN_INVALID_BUILTIN_DATA;
|
||||
|
||||
/* Kernel UBSAN shift out of bounds data structure definition */
|
||||
typedef struct _KUBSAN_SHIFT_OUT_OF_BOUNDS_DATA
|
||||
{
|
||||
KUBSAN_SOURCE_LOCATION Location;
|
||||
PKUBSAN_TYPE_DESCRIPTOR LhsType;
|
||||
PKUBSAN_TYPE_DESCRIPTOR RhsType;
|
||||
} KUBSAN_SHIFT_OUT_OF_BOUNDS_DATA, *PKUBSAN_SHIFT_OUT_OF_BOUNDS_DATA;
|
||||
|
||||
/* Kernel UBSAN out of bounds data structure definition */
|
||||
typedef struct _KUBSAN_OUT_OF_BOUNDS_DATA
|
||||
{
|
||||
KUBSAN_SOURCE_LOCATION Location;
|
||||
PKUBSAN_TYPE_DESCRIPTOR ArrayType;
|
||||
PKUBSAN_TYPE_DESCRIPTOR IndexType;
|
||||
} KUBSAN_OUT_OF_BOUNDS_DATA, *PKUBSAN_OUT_OF_BOUNDS_DATA;
|
||||
|
||||
/* Kernel UBSAN overflow data structure definition */
|
||||
typedef struct _KUBSAN_OVERFLOW_DATA
|
||||
{
|
||||
KUBSAN_SOURCE_LOCATION Location;
|
||||
PKUBSAN_TYPE_DESCRIPTOR Type;
|
||||
} KUBSAN_OVERFLOW_DATA, *PKUBSAN_OVERFLOW_DATA;
|
||||
|
||||
/* Kernel UBSAN type mismatch data structure definition */
|
||||
typedef struct _KUBSAN_TYPE_MISMATCH_DATA
|
||||
{
|
||||
KUBSAN_SOURCE_LOCATION Location;
|
||||
PKUBSAN_TYPE_DESCRIPTOR Type;
|
||||
ULONG Alignment;
|
||||
UCHAR TypeCheckKind;
|
||||
} KUBSAN_TYPE_MISMATCH_DATA, *PKUBSAN_TYPE_MISMATCH_DATA;
|
||||
|
||||
/* Kernel UBSAN type mismatch data structure definition */
|
||||
typedef struct _KUBSAN_TYPE_MISMATCH_DATA_V1
|
||||
{
|
||||
KUBSAN_SOURCE_LOCATION Location;
|
||||
PKUBSAN_TYPE_DESCRIPTOR Type;
|
||||
UCHAR LogAlignment;
|
||||
UCHAR TypeCheckKind;
|
||||
} KUBSAN_TYPE_MISMATCH_DATA_V1, *PKUBSAN_TYPE_MISMATCH_DATA_V1;
|
||||
|
||||
#endif /* __XTDK_KEFUNCS_H */
|
||||
|
@@ -10,18 +10,8 @@
|
||||
#define __XTDK_MMTYPES_H
|
||||
|
||||
#include <xtbase.h>
|
||||
#include ARCH_HEADER(xtstruct.h)
|
||||
|
||||
|
||||
/* Page map routines structure definition */
|
||||
typedef CONST STRUCT _CMMPAGEMAP_ROUTINES
|
||||
{
|
||||
VOID (XTAPI *ClearPte)(PHARDWARE_PTE PtePointer);
|
||||
BOOLEAN (XTAPI *PteValid)(PHARDWARE_PTE PtePointer);
|
||||
VOID (XTAPI *SetPteCaching)(PHARDWARE_PTE PtePointer, BOOLEAN CacheDisable, BOOLEAN WriteThrough);
|
||||
VOID (XTAPI *SetPte)(PHARDWARE_PTE PtePointer, PFN_NUMBER PageFrameNumber, BOOLEAN Writable);
|
||||
} CMMPAGEMAP_ROUTINES, *PCMMPAGEMAP_ROUTINES;
|
||||
|
||||
/* Color tables structure definition */
|
||||
typedef struct _MMCOLOR_TABLES
|
||||
{
|
||||
|
@@ -15,77 +15,16 @@
|
||||
|
||||
|
||||
/* Power Manager routine callbacks */
|
||||
typedef VOID (XTFASTCALL *PPROCESSOR_IDLE_FUNCTION)(IN PPROCESSOR_POWER_STATE PowerState);
|
||||
typedef XTSTATUS (XTFASTCALL *PSET_PROCESSOR_THROTTLE)(IN UCHAR Throttle);
|
||||
|
||||
/* Processor IDLE times structure definition */
|
||||
typedef struct _PROCESSOR_IDLE_TIMES
|
||||
{
|
||||
ULONGLONG StartTime;
|
||||
ULONGLONG EndTime;
|
||||
ULONG IdleHandlerReserved[4];
|
||||
} PROCESSOR_IDLE_TIMES, *PPROCESSOR_IDLE_TIMES;
|
||||
|
||||
/* Processor performance state structure definition */
|
||||
typedef struct _PROCESSOR_PERF_STATE
|
||||
{
|
||||
UCHAR PercentFrequency;
|
||||
UCHAR MinCapacity;
|
||||
USHORT Power;
|
||||
UCHAR IncreaseLevel;
|
||||
UCHAR DecreaseLevel;
|
||||
USHORT Flags;
|
||||
ULONG IncreaseTime;
|
||||
ULONG DecreaseTime;
|
||||
ULONG IncreaseCount;
|
||||
ULONG DecreaseCount;
|
||||
ULONGLONG PerformanceTime;
|
||||
} PROCESSOR_PERF_STATE, *PPROCESSOR_PERF_STATE;
|
||||
typedef VOID (XTFASTCALL *PPROCESSOR_IDLE_FUNCTION)(PPROCESSOR_POWER_STATE PowerState);
|
||||
|
||||
/* Processor power state structure definition */
|
||||
typedef struct _PROCESSOR_POWER_STATE
|
||||
{
|
||||
PPROCESSOR_IDLE_FUNCTION IdleFunction;
|
||||
ULONG Idle0TimeLimit;
|
||||
ULONG Idle0LastTime;
|
||||
PVOID IdleHandlers;
|
||||
PVOID IdleState;
|
||||
ULONG IdleHandlersCount;
|
||||
ULONGLONG LastCheck;
|
||||
PROCESSOR_IDLE_TIMES IdleTimes;
|
||||
ULONG IdleTime1;
|
||||
ULONG PromotionCheck;
|
||||
ULONG IdleTime2;
|
||||
UCHAR CurrentThrottle;
|
||||
UCHAR ThermalThrottleLimit;
|
||||
UCHAR CurrentThrottleIndex;
|
||||
UCHAR ThermalThrottleIndex;
|
||||
ULONG PerfSystemTime;
|
||||
ULONG PerfIdleTime;
|
||||
ULONG LastSysTime;
|
||||
ULONGLONG TotalIdleStateTime[3];
|
||||
ULONG TotalIdleTransitions[3];
|
||||
ULONGLONG PreviousC3StateTime;
|
||||
UCHAR KneeThrottleIndex;
|
||||
UCHAR ThrottleLimitIndex;
|
||||
UCHAR PerfStatesCount;
|
||||
UCHAR ProcessorMinThrottle;
|
||||
UCHAR ProcessorMaxThrottle;
|
||||
UCHAR LastBusyPercentage;
|
||||
UCHAR LastC3Percentage;
|
||||
UCHAR LastAdjustedBusyPercentage;
|
||||
ULONG PromotionCount;
|
||||
ULONG DemotionCount;
|
||||
ULONG ErrorCount;
|
||||
ULONG RetryCount;
|
||||
ULONG Flags;
|
||||
LARGE_INTEGER PerfCounterFrequency;
|
||||
ULONG PerfTickCount;
|
||||
KTIMER PerfTimer;
|
||||
KDPC PerfDpc;
|
||||
PPROCESSOR_PERF_STATE PerfStates;
|
||||
PSET_PROCESSOR_THROTTLE PerfSetThrottle;
|
||||
ULONG LastC3UserTime;
|
||||
} PROCESSOR_POWER_STATE, *PPROCESSOR_POWER_STATE;
|
||||
|
||||
#endif /* __XTDK_POTYPES_H */
|
||||
|
@@ -15,356 +15,290 @@
|
||||
#include <rtltypes.h>
|
||||
|
||||
|
||||
/* Routines used by XTLDR */
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInitializeListHead(IN PLIST_ENTRY ListHead);
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInsertHeadList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry);
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInsertTailList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry);
|
||||
|
||||
XTAPI
|
||||
UCHAR
|
||||
RtlReadRegisterByte(IN VOLATILE PVOID Register);
|
||||
|
||||
XTAPI
|
||||
ULONG
|
||||
RtlReadRegisterLong(IN VOLATILE PVOID Register);
|
||||
|
||||
XTAPI
|
||||
USHORT
|
||||
RtlReadRegisterShort(IN VOLATILE PVOID Register);
|
||||
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlRemoveEntryList(IN PLIST_ENTRY Entry);
|
||||
|
||||
|
||||
/* Runtime Library routines forward references */
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlClearAllBits(IN PRTL_BITMAP BitMap);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlClearBit(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Bit);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlClearBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN ULONG_PTR Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
ULONG
|
||||
RtlClearSetBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
RtlCompareGuids(IN PGUID Guid1,
|
||||
IN PGUID Guid2);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlCompareMemory(IN PCVOID LeftBuffer,
|
||||
IN PCVOID RightBuffer,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlCompareString(IN PCSTR String1,
|
||||
IN PCSTR String2,
|
||||
RtlCompareString(IN CONST PCHAR String1,
|
||||
IN CONST PCHAR String2,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlCompareStringInsensitive(IN PCSTR String1,
|
||||
IN PCSTR String2,
|
||||
RtlCompareStringInsensitive(IN CONST PCHAR String1,
|
||||
IN CONST PCHAR String2,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlCompareWideString(IN PCWSTR String1,
|
||||
IN PCWSTR String2,
|
||||
RtlCompareWideString(IN CONST PWCHAR String1,
|
||||
IN CONST PWCHAR String2,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlCompareWideStringInsensitive(IN PCWSTR String1,
|
||||
IN PCWSTR String2,
|
||||
RtlCompareWideStringInsensitive(IN CONST PWCHAR String1,
|
||||
IN CONST PWCHAR String2,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlConcatenateString(OUT PCHAR Destination,
|
||||
IN PCHAR Source,
|
||||
IN SIZE_T Count);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PWCHAR
|
||||
RtlConcatenateWideString(OUT PWCHAR Destination,
|
||||
IN PWCHAR Source,
|
||||
IN SIZE_T Count);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
LARGE_INTEGER
|
||||
RtlConvertToLargeInteger32(IN LONG Value);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
LARGE_INTEGER
|
||||
RtlConvertToLargeIntegerUnsigned32(IN ULONG Value);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlCopyMemory(OUT PVOID Destination,
|
||||
IN PCVOID Source,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlCopyString(IN PCHAR Destination,
|
||||
IN PCSTR Source,
|
||||
IN PCCHAR Source,
|
||||
IN ULONG Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlCopyWideString(IN PWCHAR Destination,
|
||||
IN PCWSTR Source,
|
||||
IN CONST PWCHAR Source,
|
||||
IN ULONG Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
LARGE_INTEGER
|
||||
RtlDivideLargeInteger(IN LARGE_INTEGER Dividend,
|
||||
IN ULONG Divisor,
|
||||
OUT PULONG Remainder);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
RtlFindClearBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
RtlFindSetBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCSTR
|
||||
RtlFindString(IN PCSTR Source,
|
||||
IN PCSTR Search);
|
||||
XTSTATUS
|
||||
RtlFormatWideString(IN PRTL_PRINT_CONTEXT Context,
|
||||
IN PCWSTR Format,
|
||||
IN VA_LIST ArgumentList);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCSTR
|
||||
RtlFindStringInsensitive(IN PCSTR Source,
|
||||
IN PCSTR Search);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCWSTR
|
||||
RtlFindWideString(IN PCWSTR Source,
|
||||
IN PCWSTR Search);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCWSTR
|
||||
RtlFindWideStringInsensitive(IN PCWSTR Source,
|
||||
IN PCWSTR Search);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlInitializeBitMap(IN PRTL_BITMAP BitMap,
|
||||
IN PULONG_PTR Buffer,
|
||||
IN ULONG Size);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInitializeListHead(IN PLIST_ENTRY ListHead);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInsertHeadList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInsertTailList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
RtlListEmpty(IN PLIST_ENTRY ListHead);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
RtlListLoop(IN PLIST_ENTRY ListHead);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlMoveMemory(OUT PVOID Destination,
|
||||
IN PCVOID Source,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
LARGE_INTEGER
|
||||
RtlMultiplyLargeInteger(IN LARGE_INTEGER Multiplicand,
|
||||
IN LONG Multiplier);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlRemoveEntryList(IN PLIST_ENTRY Entry);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlReverseString(IN OUT PCHAR String,
|
||||
IN ULONG Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlReverseWideString(IN OUT PWCHAR String,
|
||||
IN ULONG Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
RtlSameMemory(IN PCVOID LeftBuffer,
|
||||
IN PCVOID RightBuffer,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlSetAllBits(IN PRTL_BITMAP BitMap);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlSetBit(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Bit);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlSetBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN ULONG_PTR Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
ULONG
|
||||
RtlSetClearBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlSetMemory(OUT PVOID Destination,
|
||||
IN UCHAR Byte,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlStringLength(IN PCSTR String,
|
||||
RtlStringLength(IN CONST PCHAR String,
|
||||
IN SIZE_T MaxLength);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlStringToWideString(OUT PWCHAR Destination,
|
||||
IN PCSTR *Source,
|
||||
IN CONST PCHAR *Source,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
RtlTestBit(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Bit);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlTokenizeString(IN PCHAR String,
|
||||
IN PCSTR Delimiter,
|
||||
IN CONST PCHAR Delimiter,
|
||||
IN OUT PCHAR *SavePtr);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PWCHAR
|
||||
RtlTokenizeWideString(IN PWCHAR String,
|
||||
IN PCWSTR Delimiter,
|
||||
IN CONST PWCHAR Delimiter,
|
||||
IN OUT PWCHAR *SavePtr);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
CHAR
|
||||
RtlToLowerCharacter(IN CHAR Character);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
WCHAR
|
||||
RtlToLowerWideCharacter(IN WCHAR Character);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
CHAR
|
||||
RtlToUpperCharacter(IN CHAR Character);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
WCHAR
|
||||
RtlToUpperWideCharacter(IN WCHAR Character);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlTrimLeftString(IN PCHAR String);
|
||||
RtlTrimLeftString(IN CONST PCHAR String);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PWCHAR
|
||||
RtlTrimLeftWideString(IN PWCHAR String);
|
||||
RtlTrimLeftWideString(IN CONST PWCHAR String);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlTrimRightString(IN PCHAR String);
|
||||
RtlTrimRightString(IN CONST PCHAR String);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PWCHAR
|
||||
RtlTrimRightWideString(IN PWCHAR String);
|
||||
RtlTrimRightWideString(IN CONST PWCHAR String);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlTrimString(IN PCHAR String);
|
||||
RtlTrimString(IN CONST PCHAR String);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PWCHAR
|
||||
RtlTrimWideString(IN PWCHAR String);
|
||||
RtlTrimWideString(IN CONST PWCHAR String);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlWideStringLength(IN PCWSTR String,
|
||||
RtlWideStringLength(IN CONST PWCHAR String,
|
||||
IN SIZE_T MaxLength);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlWriteRegisterByte(IN VOLATILE PVOID Register,
|
||||
IN UCHAR Value);
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
RtlWriteRegisterLong(IN VOLATILE PVOID Register,
|
||||
IN ULONG Value);
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
RtlWriteRegisterShort(IN VOLATILE PVOID Register,
|
||||
IN USHORT Value);
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
RtlZeroMemory(OUT PVOID Destination,
|
||||
|
@@ -56,17 +56,17 @@ typedef XTSTATUS (*PWRITE_WIDE_CHARACTER)(IN WCHAR Character);
|
||||
/* Variable types enumeration list */
|
||||
typedef enum _RTL_VARIABLE_TYPE
|
||||
{
|
||||
TypeUnknown,
|
||||
TypeAnsiString,
|
||||
TypeBoolean,
|
||||
TypeChar,
|
||||
TypeFloat,
|
||||
TypeGuid,
|
||||
TypeInteger,
|
||||
TypeString,
|
||||
TypeUnicodeString,
|
||||
TypeWideChar,
|
||||
TypeWideString
|
||||
Unknown,
|
||||
AnsiString,
|
||||
Boolean,
|
||||
Char,
|
||||
Float,
|
||||
Guid,
|
||||
Integer,
|
||||
String,
|
||||
UnicodeString,
|
||||
WideChar,
|
||||
WideString
|
||||
} RTL_VARIABLE_TYPE, *PRTL_VARIABLE_TYPE;
|
||||
|
||||
/* Bit Map structure definition */
|
||||
|
@@ -32,9 +32,6 @@ typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
|
||||
/* Page Frame Number */
|
||||
typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
|
||||
|
||||
/* Physical address */
|
||||
typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;
|
||||
|
||||
/* 128-bit buffer containing a unique identifier value */
|
||||
typedef struct _GUID
|
||||
{
|
||||
|
@@ -7,7 +7,6 @@
|
||||
*/
|
||||
|
||||
/* Base XT headers */
|
||||
#include <xtcompat.h>
|
||||
#include <xtdefs.h>
|
||||
#include <xtstatus.h>
|
||||
#include <xttarget.h>
|
||||
@@ -38,6 +37,14 @@
|
||||
#include ARCH_HEADER(ketypes.h)
|
||||
#include ARCH_HEADER(mmtypes.h)
|
||||
|
||||
/* XT Kernel runtime routines */
|
||||
#include <hlfuncs.h>
|
||||
#include <rtlfuncs.h>
|
||||
|
||||
/* Architecture specific XT kernel routines */
|
||||
#include ARCH_HEADER(arfuncs.h)
|
||||
#include ARCH_HEADER(hlfuncs.h)
|
||||
|
||||
/* Boot Manager specific structures */
|
||||
#include <bltarget.h>
|
||||
#include <bltypes.h>
|
||||
|
@@ -1,41 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: sdk/xtdk/xtcompat.h
|
||||
* DESCRIPTION: C/C++ compatibility macros
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTDK_XTCOMPAT_H
|
||||
#define __XTDK_XTCOMPAT_H
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
/* C++ definitions */
|
||||
#define XTCLINK extern "C"
|
||||
#define NULLPTR nullptr
|
||||
|
||||
/* C++ boolean type */
|
||||
typedef bool BOOLEAN, *PBOOLEAN;
|
||||
#define TRUE true
|
||||
#define FALSE false
|
||||
|
||||
/* C++ widechar type */
|
||||
typedef wchar_t wchar;
|
||||
#else
|
||||
/* C definitions */
|
||||
#define XTCLINK
|
||||
#define NULLPTR ((void *)0)
|
||||
|
||||
/* C boolean type */
|
||||
typedef enum _BOOLEAN
|
||||
{
|
||||
FALSE = 0,
|
||||
TRUE = 1
|
||||
} BOOLEAN, *PBOOLEAN;
|
||||
|
||||
/* C widechar type */
|
||||
typedef unsigned short wchar;
|
||||
#endif
|
||||
|
||||
#endif /* __XTDK_XTCOMPAT_H */
|
@@ -11,16 +11,16 @@
|
||||
|
||||
|
||||
/* Debugging macros */
|
||||
#define CHECKPOINT DebugPrint(L"Checkpoint reached at %s:%d\n", __RELFILE__, __LINE__);
|
||||
#define CHECKPOINT DebugPrint(L"Checkpoint reached at %s:%d\n", __FILE__, __LINE__);
|
||||
#define DEPRECATED DebugPrint(L"Called deprecated routine '%s()' at %s:%d\n", \
|
||||
__FUNCTION__, __RELFILE__, __LINE__);
|
||||
__FUNCTION__, __FILE__, __LINE__);
|
||||
#define UNIMPLEMENTED DebugPrint(L"Called unimplemented routine '%s()' at %s:%d\n", \
|
||||
__FUNCTION__, __RELFILE__, __LINE__);
|
||||
__FUNCTION__, __FILE__, __LINE__);
|
||||
|
||||
/* XTOS platform debugging macros */
|
||||
#ifdef DBG
|
||||
#define DEBUG 1
|
||||
#define DebugPrint(Format, ...) DbgPrint(Format, __VA_ARGS__);
|
||||
#define DebugPrint(Format, ...) if(KeDbgPrint) KeDbgPrint(Format, __VA_ARGS__);
|
||||
#else
|
||||
#define DEBUG 0
|
||||
#define DebugPrint(Format, ...) ((VOID)NULL)
|
||||
|
@@ -16,7 +16,6 @@
|
||||
#define XTAPI __stdcall
|
||||
#define XTCDECL __cdecl
|
||||
#define XTFASTCALL __fastcall
|
||||
#define XTVECTORCALL __vectorcall
|
||||
#define XTINLINE __inline
|
||||
#define XTASSEMBLY __attribute__((naked))
|
||||
#define XTINTERRUPT __attribute__((interrupt))
|
||||
@@ -29,6 +28,10 @@
|
||||
#define UNION union
|
||||
#define VOLATILE volatile
|
||||
|
||||
/* NULL values */
|
||||
#define NULL ((PVOID) 0)
|
||||
#define NULL64 ((VOID * PVOID) 0)
|
||||
|
||||
/* Type limits */
|
||||
#define MINCHAR 0x80
|
||||
#define MAXCHAR 0x7F
|
||||
@@ -51,29 +54,32 @@
|
||||
|
||||
/* Preprocessor macros for defining an additional compiler attributes */
|
||||
#define ALIGN(Alignment) __attribute__((aligned(Alignment)))
|
||||
#define PACKED __attribute__((packed))
|
||||
#define PACK __attribute__((packed))
|
||||
#define SEGMENT(Segment) __attribute__((section(Segment)))
|
||||
#define USED __attribute__((__used__))
|
||||
|
||||
/* Macro for calculating size of an array */
|
||||
#define ARRAY_SIZE(Array) (sizeof(Array) / sizeof(*Array))
|
||||
|
||||
/* Macros for concatenating two strings */
|
||||
/* Macro for concatenating two strings */
|
||||
#define CONCAT_STRING(Str1, Str2) Str1##Str2
|
||||
#define CONCATENATE(Str1, Str2) CONCAT_STRING(Str1, Str2)
|
||||
|
||||
/* Macro for accessing the base address of a structure from a structure member */
|
||||
#define CONTAIN_RECORD(Address, Type, Field) ((Type *)((char *)(Address) - FIELD_OFFSET(Type, Field)))
|
||||
#define CONTAIN_RECORD(Address, Type, Field) ((Type *)(((ULONG_PTR)Address) - (ULONG_PTR)(&(((Type *)0)->Field))))
|
||||
|
||||
/* EFI size to pages conversion macro */
|
||||
#define EFI_SIZE_TO_PAGES(Size) (((Size) >> EFI_PAGE_SHIFT) + (((Size) & EFI_PAGE_MASK) ? 1 : 0))
|
||||
|
||||
/* Macro for calculating byte offset of a field in the structure */
|
||||
#define FIELD_OFFSET(Structure, Field) __builtin_offsetof(Structure, Field)
|
||||
#define FIELD_OFFSET(Structure, Field) ((LONG)(LONG_PTR)&(((Structure *)0)->Field))
|
||||
|
||||
/* Macro for calculating size of a field in the structure */
|
||||
#define FIELD_SIZE(Structure, Field) (sizeof(((Structure *)0)->Field))
|
||||
|
||||
/* Macro that yields field type in the structure */
|
||||
#define FIELD_TYPE(Structure, Field) (((Structure*)0)->Field)
|
||||
|
||||
/* Macro that page-aligns a virtual address */
|
||||
#define PAGE_ALIGN(VirtualAddress) ((PVOID)((ULONG_PTR)VirtualAddress & ~MM_PAGE_MASK))
|
||||
|
||||
@@ -91,8 +97,7 @@
|
||||
#define SIGNATURE32(A, B, C, D) (SIGNATURE16(A, B) | (SIGNATURE16(C, D) << 16))
|
||||
#define SIGNATURE64(A, B, C, D, E, F, G, H) (SIGNATURE32(A, B, C, D) | ((UINT64)(SIGNATURE32(E, F, G, H)) << 32))
|
||||
|
||||
/* XT size <-> pages conversion macro */
|
||||
#define PAGES_TO_SIZE(Pages) ((Pages) << MM_PAGE_SHIFT)
|
||||
/* XT size to pages conversion macro */
|
||||
#define SIZE_TO_PAGES(Size) (((Size) >> MM_PAGE_SHIFT) + (((Size) & (MM_PAGE_MASK)) ? 1 : 0))
|
||||
|
||||
/* Macros for concatenating strings */
|
||||
|
@@ -48,7 +48,7 @@ typedef enum _LOADER_MEMORY_TYPE
|
||||
LoaderBBTMemory,
|
||||
LoaderReserve,
|
||||
LoaderXIPRom,
|
||||
LoaderHardwareCachedMemory,
|
||||
LoaderHALCachedMemory,
|
||||
LoaderMaximum
|
||||
} LOADER_MEMORY_TYPE, *PLOADER_MEMORY_TYPE;
|
||||
|
||||
@@ -61,6 +61,11 @@ typedef enum _SYSTEM_FIRMWARE_TYPE
|
||||
SystemFirmwarePcat
|
||||
} SYSTEM_FIRMWARE_TYPE, *PSYSTEM_FIRMWARE_TYPE;
|
||||
|
||||
/* Hardware information block */
|
||||
typedef struct _HARDWARE_INFORMATION_BLOCK
|
||||
{
|
||||
} HARDWARE_INFORMATION_BLOCK, *PHARDWARE_INFORMATION_BLOCK;
|
||||
|
||||
/* PCAT Firmware information block */
|
||||
typedef struct _PCAT_FIRMWARE_INFORMATION
|
||||
{
|
||||
@@ -85,20 +90,36 @@ typedef struct _FIRMWARE_INFORMATION_BLOCK
|
||||
};
|
||||
} FIRMWARE_INFORMATION_BLOCK, *PFIRMWARE_INFORMATION_BLOCK;
|
||||
|
||||
/* Boot Loader FrameBuffer information block */
|
||||
typedef struct _LOADER_GRAPHICS_INFORMATION_BLOCK
|
||||
{
|
||||
BOOLEAN Initialized;
|
||||
PVOID Address;
|
||||
ULONG_PTR BufferSize;
|
||||
UINT Width;
|
||||
UINT Height;
|
||||
UINT PixelsPerScanLine;
|
||||
UINT BitsPerPixel;
|
||||
UINT Pitch;
|
||||
PVOID Font;
|
||||
} LOADER_GRAPHICS_INFORMATION_BLOCK, *PLOADER_GRAPHICS_INFORMATION_BLOCK;
|
||||
|
||||
/* Boot Loader information block */
|
||||
typedef struct _LOADER_INFORMATION_BLOCK
|
||||
{
|
||||
PVOID DbgPrint;
|
||||
ULONG PageMapLevel;
|
||||
LOADER_GRAPHICS_INFORMATION_BLOCK FrameBuffer;
|
||||
} LOADER_INFORMATION_BLOCK, *PLOADER_INFORMATION_BLOCK;
|
||||
|
||||
/* Boot Loader memory mapping information */
|
||||
typedef struct _LOADER_MEMORY_DESCRIPTOR
|
||||
typedef struct _LOADER_MEMORY_MAPPING
|
||||
{
|
||||
LIST_ENTRY ListEntry;
|
||||
LOADER_MEMORY_TYPE MemoryType;
|
||||
ULONG BasePage;
|
||||
ULONG PageCount;
|
||||
} LOADER_MEMORY_DESCRIPTOR, *PLOADER_MEMORY_DESCRIPTOR;
|
||||
} LOADER_MEMORY_MAPPING, *PLOADER_MEMORY_MAPPING;
|
||||
|
||||
/* Loader provided information needed by the kernel to initialize */
|
||||
typedef struct _KERNEL_INITIALIZATION_BLOCK
|
||||
@@ -110,7 +131,7 @@ typedef struct _KERNEL_INITIALIZATION_BLOCK
|
||||
LIST_ENTRY LoadOrderListHead;
|
||||
LIST_ENTRY MemoryDescriptorListHead;
|
||||
LIST_ENTRY BootDriverListHead;
|
||||
LIST_ENTRY SystemResourcesListHead;
|
||||
HARDWARE_INFORMATION_BLOCK HardwareInformation;
|
||||
LOADER_INFORMATION_BLOCK LoaderInformation;
|
||||
FIRMWARE_INFORMATION_BLOCK FirmwareInformation;
|
||||
} KERNEL_INITIALIZATION_BLOCK, *PKERNEL_INITIALIZATION_BLOCK;
|
||||
|
@@ -7,7 +7,6 @@
|
||||
*/
|
||||
|
||||
/* Base XT headers */
|
||||
#include <xtcompat.h>
|
||||
#include <xtdefs.h>
|
||||
#include <xtstatus.h>
|
||||
#include <xttarget.h>
|
||||
@@ -31,7 +30,6 @@
|
||||
#include <extypes.h>
|
||||
#include <hltypes.h>
|
||||
#include <iotypes.h>
|
||||
#include <kdtypes.h>
|
||||
#include <ketypes.h>
|
||||
#include <ldrtypes.h>
|
||||
#include <mmtypes.h>
|
||||
@@ -48,9 +46,9 @@
|
||||
/* XT routines */
|
||||
#include <exfuncs.h>
|
||||
#include <hlfuncs.h>
|
||||
#include <kdfuncs.h>
|
||||
#include <kefuncs.h>
|
||||
#include <rtlfuncs.h>
|
||||
|
||||
/* Architecture specific XT routines */
|
||||
#include ARCH_HEADER(arfuncs.h)
|
||||
#include ARCH_HEADER(hlfuncs.h)
|
||||
|
@@ -48,22 +48,11 @@
|
||||
|
||||
/* XT status code definitions */
|
||||
#define STATUS_SUCCESS ((XTSTATUS) 0x00000000L)
|
||||
#define STATUS_END_OF_MEDIA ((XTSTATUS) 0x8000001EL)
|
||||
#define STATUS_RESOURCE_LOCKED ((XTSTATUS) 0xC0000000L)
|
||||
#define STATUS_UNSUCCESSFUL ((XTSTATUS) 0xC0000001L)
|
||||
#define STATUS_NOT_IMPLEMENTED ((XTSTATUS) 0xC0000002L)
|
||||
#define STATUS_ACCESS_VIOLATION ((XTSTATUS) 0xC0000005L)
|
||||
#define STATUS_IN_PAGE_ERROR ((XTSTATUS) 0xC0000006L)
|
||||
#define STATUS_INVALID_HANDLE ((XTSTATUS) 0xC0000008L)
|
||||
#define STATUS_BAD_INITIAL_STACK ((XTSTATUS) 0xC0000009L)
|
||||
#define STATUS_INVALID_PARAMETER ((XTSTATUS) 0xC000000DL)
|
||||
#define STATUS_END_OF_FILE ((XTSTATUS) 0xC0000011L)
|
||||
#define STATUS_NO_MEMORY ((XTSTATUS) 0xC0000017L)
|
||||
#define STATUS_PORT_DISCONNECTED ((XTSTATUS) 0xC0000037L)
|
||||
#define STATUS_CRC_ERROR ((XTSTATUS) 0xC000003FL)
|
||||
#define STATUS_INSUFFICIENT_RESOURCES ((XTSTATUS) 0xC000009AL)
|
||||
#define STATUS_DEVICE_NOT_READY ((XTSTATUS) 0xC00000A3L)
|
||||
#define STATUS_NOT_SUPPORTED ((XTSTATUS) 0xC00000BBL)
|
||||
#define STATUS_TIMEOUT ((XTSTATUS) 0x00000102L)
|
||||
#define STATUS_IO_DEVICE_ERROR ((XTSTATUS) 0xC0000185L)
|
||||
#define STATUS_NOT_FOUND ((XTSTATUS) 0xC0000225L)
|
||||
|
@@ -14,6 +14,7 @@
|
||||
|
||||
/* Enumeration lists forward references */
|
||||
typedef enum _ADJUST_REASON ADJUST_REASON, *PADJUST_REASON;
|
||||
typedef enum _BOOLEAN BOOLEAN, *PBOOLEAN;
|
||||
typedef enum _EXCEPTION_DISPOSITION EXCEPTION_DISPOSITION, *PEXCEPTION_DISPOSITION;
|
||||
typedef enum _EFI_ALLOCATE_TYPE EFI_ALLOCATE_TYPE, *PEFI_ALLOCATE_TYPE;
|
||||
typedef enum _EFI_FRAMEWORK_CPU_DESIGNATION EFI_FRAMEWORK_CPU_DESIGNATION, *PEFI_FRAMEWORK_CPU_DESIGNATION;
|
||||
@@ -38,7 +39,6 @@ typedef enum _EFI_TIMER_DELAY EFI_TIMER_DELAY, *PEFI_TIMER_DELAY;
|
||||
typedef enum _EFI_UART_PARITY_TYPE EFI_UART_PARITY_TYPE, *PEFI_UART_PARITY_TYPE;
|
||||
typedef enum _EFI_UART_STOP_BITS_TYPE EFI_UART_STOP_BITS_TYPE, *PEFI_UART_STOP_BITS_TYPE;
|
||||
typedef enum _EFI_UNIVERSA_GRAPHICS_BLT_OPERATION EFI_UNIVERSA_GRAPHICS_BLT_OPERATION, *PEFI_UNIVERSA_GRAPHICS_BLT_OPERATION;
|
||||
typedef enum _HAL_APIC_MODE HAL_APIC_MODE, *PHAL_APIC_MODE;
|
||||
typedef enum _KAPC_ENVIRONMENT KAPC_ENVIRONMENT, *PKAPC_ENVIRONMENT;
|
||||
typedef enum _KDPC_IMPORTANCE KDPC_IMPORTANCE, *PKDPC_IMPORTANCE;
|
||||
typedef enum _KEVENT_TYPE KEVENT_TYPE, *PKEVENT_TYPE;
|
||||
@@ -46,31 +46,16 @@ typedef enum _KOBJECTS KOBJECTS, *PKOBJECTS;
|
||||
typedef enum _KPROCESS_STATE KPROCESS_STATE, *PKPROCESS_STATE;
|
||||
typedef enum _KTHREAD_STATE KTHREAD_STATE, *PKTHREAD_STATE;
|
||||
typedef enum _KTIMER_TYPE KTIMER_TYPE, *PKTIMER_TYPE;
|
||||
typedef enum _KUBSAN_DATA_TYPE KUBSAN_DATA_TYPE, *PKUBSAN_DATA_TYPE;
|
||||
typedef enum _LOADER_MEMORY_TYPE LOADER_MEMORY_TYPE, *PLOADER_MEMORY_TYPE;
|
||||
typedef enum _MODE MODE, *PMODE;
|
||||
typedef enum _RTL_VARIABLE_TYPE RTL_VARIABLE_TYPE, *PRTL_VARIABLE_TYPE;
|
||||
typedef enum _SYSTEM_FIRMWARE_TYPE SYSTEM_FIRMWARE_TYPE, *PSYSTEM_FIRMWARE_TYPE;
|
||||
typedef enum _SYSTEM_RESOURCE_TYPE SYSTEM_RESOURCE_TYPE, *PSYSTEM_RESOURCE_TYPE;
|
||||
typedef enum _WAIT_TYPE WAIT_TYPE, *PWAIT_TYPE;
|
||||
|
||||
/* Structures forward references */
|
||||
typedef struct _ACPI_CACHE_LIST ACPI_CACHE_LIST, *PACPI_CACHE_LIST;
|
||||
typedef struct _ACPI_DESCRIPTION_HEADER ACPI_DESCRIPTION_HEADER, *PACPI_DESCRIPTION_HEADER;
|
||||
typedef struct _ACPI_FADT ACPI_FADT, *PACPI_FADT;
|
||||
typedef struct _ACPI_MADT ACPI_MADT, *PACPI_MADT;
|
||||
typedef struct _ACPI_MADT_TABLE_LOCAL_APIC ACPI_MADT_TABLE_LOCAL_APIC, *PACPI_MADT_TABLE_LOCAL_APIC;
|
||||
typedef struct _ACPI_RSDP ACPI_RSDP, *PACPI_RSDP;
|
||||
typedef struct _ACPI_RSDT ACPI_RSDT, *PACPI_RSDT;
|
||||
typedef struct _ACPI_SUBTABLE_HEADER ACPI_SUBTABLE_HEADER, *PACPI_SUBTABLE_HEADER;
|
||||
typedef struct _ACPI_SYSTEM_INFO ACPI_SYSTEM_INFO, *PACPI_SYSTEM_INFO;
|
||||
typedef struct _ACPI_TIMER_INFO ACPI_TIMER_INFO, *PACPI_TIMER_INFO;
|
||||
typedef struct _ACPI_XSDT ACPI_XSDT, *PACPI_XSDT;
|
||||
typedef struct _ANSI_STRING ANSI_STRING, *PANSI_STRING;
|
||||
typedef struct _ANSI_STRING32 ANSI_STRING32, *PANSI_STRING32;
|
||||
typedef struct _ANSI_STRING64 ANSI_STRING64, *PANSI_STRING64;
|
||||
typedef struct _CPPORT CPPORT, *PCPPORT;
|
||||
typedef const struct _CMMPAGEMAP_ROUTINES CMMPAGEMAP_ROUTINES, *PCMMPAGEMAP_ROUTINES;
|
||||
typedef struct _CSTRING CSTRING, *PCSTRING;
|
||||
typedef struct _EFI_1394_DEVICE_PATH EFI_1394_DEVICE_PATH, *PEFI_1394_DEVICE_PATH;
|
||||
typedef struct _EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR, *PEFI_ACPI_ADDRESS_SPACE_DESCRIPTOR;
|
||||
@@ -233,14 +218,9 @@ typedef struct _EXCEPTION_RECORD EXCEPTION_RECORD, *PEXCEPTION_RECORD;
|
||||
typedef struct _EXCEPTION_REGISTRATION_RECORD EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD;
|
||||
typedef struct _FIRMWARE_INFORMATION_BLOCK FIRMWARE_INFORMATION_BLOCK, *PFIRMWARE_INFORMATION_BLOCK;
|
||||
typedef struct _FLOAT128 FLOAT128, *PFLOAT128;
|
||||
typedef struct _GENERIC_ADDRESS GENERIC_ADDRESS, *PGENERIC_ADDRESS;
|
||||
typedef struct _GUID GUID, *PGUID;
|
||||
typedef struct _HL_FRAMEBUFFER_DATA HL_FRAMEBUFFER_DATA, *PHL_FRAMEBUFFER_DATA;
|
||||
typedef struct _HL_SCROLL_REGION_DATA HL_SCROLL_REGION_DATA, *PHL_SCROLL_REGION_DATA;
|
||||
typedef struct _KAPC KAPC, *PKAPC;
|
||||
typedef struct _KAPC_STATE KAPC_STATE, *PKAPC_STATE;
|
||||
typedef struct _KD_DEBUG_MODE KD_DEBUG_MODE, *PKD_DEBUG_MODE;
|
||||
typedef struct _KD_DISPATCH_TABLE KD_DISPATCH_TABLE, *PKD_DISPATCH_TABLE;
|
||||
typedef struct _KDPC KDPC, *PKDPC;
|
||||
typedef struct _KDPC_DATA KDPC_DATA, *PKDPC_DATA;
|
||||
typedef struct _KERNEL_INITIALIZATION_BLOCK KERNEL_INITIALIZATION_BLOCK, *PKERNEL_INITIALIZATION_BLOCK;
|
||||
@@ -254,16 +234,6 @@ typedef struct _KSERVICE_DESCRIPTOR_TABLE KSERVICE_DESCRIPTOR_TABLE, *PKSERVICE_
|
||||
typedef struct _KSPIN_LOCK_QUEUE KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
|
||||
typedef struct _KTHREAD KTHREAD, *PKTHREAD;
|
||||
typedef struct _KTIMER KTIMER, *PKTIMER;
|
||||
typedef struct _KUBSAN_FLOAT_CAST_OVERFLOW_DATA KUBSAN_FLOAT_CAST_OVERFLOW_DATA, *PKUBSAN_FLOAT_CAST_OVERFLOW_DATA;
|
||||
typedef struct _KUBSAN_FUNCTION_TYPE_MISMATCH_DATA KUBSAN_FUNCTION_TYPE_MISMATCH_DATA, *PKUBSAN_FUNCTION_TYPE_MISMATCH_DATA;
|
||||
typedef struct _KUBSAN_INVALID_BUILTIN_DATA KUBSAN_INVALID_BUILTIN_DATA, *PKUBSAN_INVALID_BUILTIN_DATA;
|
||||
typedef struct _KUBSAN_OUT_OF_BOUNDS_DATA KUBSAN_OUT_OF_BOUNDS_DATA, *PKUBSAN_OUT_OF_BOUNDS_DATA;
|
||||
typedef struct _KUBSAN_OVERFLOW_DATA KUBSAN_OVERFLOW_DATA, *PKUBSAN_OVERFLOW_DATA;
|
||||
typedef struct _KUBSAN_SHIFT_OUT_OF_BOUNDS_DATA KUBSAN_SHIFT_OUT_OF_BOUNDS_DATA, *PKUBSAN_SHIFT_OUT_OF_BOUNDS_DATA;
|
||||
typedef struct _KUBSAN_SOURCE_LOCATION KUBSAN_SOURCE_LOCATION, *PKUBSAN_SOURCE_LOCATION;
|
||||
typedef struct _KUBSAN_TYPE_DESCRIPTOR KUBSAN_TYPE_DESCRIPTOR, *PKUBSAN_TYPE_DESCRIPTOR;
|
||||
typedef struct _KUBSAN_TYPE_MISMATCH_DATA KUBSAN_TYPE_MISMATCH_DATA, *PKUBSAN_TYPE_MISMATCH_DATA;
|
||||
typedef struct _KUBSAN_TYPE_MISMATCH_DATA_V1 KUBSAN_TYPE_MISMATCH_DATA_V1, *PKUBSAN_TYPE_MISMATCH_DATA_V1;
|
||||
typedef struct _KWAIT_BLOCK KWAIT_BLOCK, *PKWAIT_BLOCK;
|
||||
typedef struct _LDR_DATA_TABLE_ENTRY LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
|
||||
typedef struct _LIST_ENTRY LIST_ENTRY, *PLIST_ENTRY;
|
||||
@@ -271,7 +241,7 @@ typedef struct _LIST_ENTRY32 LIST_ENTRY32, *PLIST_ENTRY32;
|
||||
typedef struct _LIST_ENTRY64 LIST_ENTRY64, *PLIST_ENTRY64;
|
||||
typedef struct _LOADER_GRAPHICS_INFORMATION_BLOCK LOADER_GRAPHICS_INFORMATION_BLOCK, *PLOADER_GRAPHICS_INFORMATION_BLOCK;
|
||||
typedef struct _LOADER_INFORMATION_BLOCK LOADER_INFORMATION_BLOCK, *PLOADER_INFORMATION_BLOCK;
|
||||
typedef struct _LOADER_MEMORY_DESCRIPTOR LOADER_MEMORY_DESCRIPTOR, *PLOADER_MEMORY_DESCRIPTOR;
|
||||
typedef struct _LOADER_MEMORY_MAPPING LOADER_MEMORY_MAPPING, *PLOADER_MEMORY_MAPPING;
|
||||
typedef struct _M128 M128, *PM128;
|
||||
typedef struct _MMCOLOR_TABLES MMCOLOR_TABLES, *PMMCOLOR_TABLES;
|
||||
typedef struct _MMPFNENTRY MMPFNENTRY, *PMMPFNENTRY;
|
||||
@@ -303,14 +273,8 @@ typedef struct _PECOFF_IMAGE_ROM_HEADER PECOFF_IMAGE_ROM_HEADER, *PPECOFF_IMAGE_
|
||||
typedef struct _PECOFF_IMAGE_ROM_OPTIONAL_HEADER PECOFF_IMAGE_ROM_OPTIONAL_HEADER, *PPECOFF_IMAGE_ROM_OPTIONAL_HEADER;
|
||||
typedef struct _PECOFF_IMAGE_SECTION_HEADER PECOFF_IMAGE_SECTION_HEADER, *PPECOFF_IMAGE_SECTION_HEADER;
|
||||
typedef struct _PECOFF_IMAGE_VXD_HEADER PECOFF_IMAGE_VXD_HEADER, *PPECOFF_IMAGE_VXD_HEADER;
|
||||
typedef struct _PROCESSOR_IDENTITY PROCESSOR_IDENTITY, *PPROCESSOR_IDENTITY;
|
||||
typedef struct _PROCESSOR_POWER_STATE PROCESSOR_POWER_STATE, *PPROCESSOR_POWER_STATE;
|
||||
typedef struct _RTL_BITMAP RTL_BITMAP, *PRTL_BITMAP;
|
||||
typedef struct _RTL_PRINT_CONTEXT RTL_PRINT_CONTEXT, *PRTL_PRINT_CONTEXT;
|
||||
typedef struct _RTL_PRINT_FORMAT_PROPERTIES RTL_PRINT_FORMAT_PROPERTIES, *PRTL_PRINT_FORMAT_PROPERTIES;
|
||||
typedef struct _SINGLE_LIST_ENTRY SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
|
||||
typedef struct _SMBIOS_TABLE_HEADER SMBIOS_TABLE_HEADER, *PSMBIOS_TABLE_HEADER;
|
||||
typedef struct _SMBIOS3_TABLE_HEADER SMBIOS3_TABLE_HEADER, *PSMBIOS3_TABLE_HEADER;
|
||||
typedef struct _STRING STRING, *PSTRING;
|
||||
typedef struct _STRING32 STRING32, *PSTRING32;
|
||||
typedef struct _STRING64 STRING64, *PSTRING64;
|
||||
|
@@ -29,7 +29,6 @@
|
||||
#define MEMORY_ALIGNMENT 8
|
||||
#define MM_USERPAGE_TABLES 1536
|
||||
#define MM_VIRTUAL_PAGESIZE 20
|
||||
#define STACK_ALIGNMENT 4
|
||||
#elif defined(__amd64__) || defined(__x86_64__)
|
||||
#define _ARCH amd64
|
||||
#define _ARCH_AMD64 1
|
||||
@@ -44,7 +43,6 @@
|
||||
#define MEMORY_ALIGNMENT 16
|
||||
#define MM_USERPAGE_TABLES 4194304
|
||||
#define MM_VIRTUAL_PAGESIZE 52
|
||||
#define STACK_ALIGNMENT 16
|
||||
#else
|
||||
#error Unknown architecture
|
||||
#endif
|
||||
|
@@ -10,7 +10,6 @@
|
||||
#define __XTDK_XTTYPES_H
|
||||
|
||||
#include <xttarget.h>
|
||||
#include <xtcompat.h>
|
||||
|
||||
|
||||
/* Standard C types */
|
||||
@@ -129,7 +128,7 @@ typedef CHAR SZ, *PSZ;
|
||||
typedef const CHAR CSZ, *PCSZ;
|
||||
|
||||
/* UNICODE character types */
|
||||
typedef wchar WCHAR, *PWCHAR;
|
||||
typedef USHORT WCHAR, *PWCHAR;
|
||||
typedef WCHAR *PWCH, *LPWCH;
|
||||
typedef const WCHAR *PCWCH, *LPCWCH;
|
||||
typedef WCHAR *PWSTR, *LPWSTR, *NWPSTR;
|
||||
@@ -150,6 +149,13 @@ typedef LPCWSTR PCTSTR, LPCTSTR;
|
||||
typedef LPUWSTR PUTSTR, LPUTSTR;
|
||||
typedef LPCUWSTR PCUTSTR, LPCUTSTR;
|
||||
|
||||
/* Boolean type */
|
||||
typedef enum _BOOLEAN
|
||||
{
|
||||
FALSE = 0,
|
||||
TRUE = 1
|
||||
} BOOLEAN, *PBOOLEAN;
|
||||
|
||||
/* 128-bit floats structure */
|
||||
typedef struct _FLOAT128
|
||||
{
|
||||
|
@@ -356,7 +356,6 @@
|
||||
#define EFI_RNG_PROTOCOL_GUID {0x3152BCA5, 0xEADE, 0x433D, {0x86, 0x2E, 0xC0, 0x1C, 0xDC, 0x29, 0x1F, 0x44}}
|
||||
#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID {0x964E5B22, 0x6459, 0x11D2, {0x8E, 0x39, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B}}
|
||||
#define EFI_SIMPLE_NETWORK_PROTOCOL_GUID {0xA19832B9, 0xAC25, 0x11D3, {0x9A, 0x2D, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D}}
|
||||
#define EFI_SIMPLE_POINTER_PROTOCOL_GUID {0x31878C87, 0x0B75, 0x11D5, {0x9A, 0x4F, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D}}
|
||||
#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID {0x387477C1, 0x69C7, 0x11D2, {0x8E, 0x39, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B}}
|
||||
#define EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID {0xDD9E7534, 0x7762, 0x4698, {0x8C, 0x14, 0xF5, 0x85, 0x17, 0xA6, 0x25, 0xAA}}
|
||||
#define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID {0x387477C2, 0x69C7, 0x11D2, {0x8E, 0x39, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B}}
|
||||
@@ -635,9 +634,9 @@ typedef EFI_STATUS (*PEFI_FREE_POOL)(IN PVOID Buffer);
|
||||
typedef VOID (*PEFI_EVENT_NOTIFY)(IN EFI_EVENT Event, IN PVOID Context);
|
||||
typedef EFI_STATUS (*PEFI_CREATE_EVENT)(IN UINT32 Type, IN EFI_TPL NotifyTpl, IN PEFI_EVENT_NOTIFY NotifyFunction, IN PVOID NotifyContext, OUT PEFI_EVENT Event);
|
||||
typedef EFI_STATUS (*PEFI_GET_MEMORY_MAP)(IN OUT PUINT_PTR MemoryMapSize, IN OUT PEFI_MEMORY_DESCRIPTOR MemoryMap, OUT PUINT_PTR MapKey, OUT PUINT_PTR DescriptorSize, OUT PUINT32 DescriptorVersion);
|
||||
typedef EFI_STATUS (*PEFI_GET_VARIABLE)(IN PWCHAR VariableName, IN PEFI_GUID VendorGuid, OUT PUINT32 Attributes, IN OUT PUINT_PTR DataSize, OUT PVOID Data);
|
||||
typedef EFI_STATUS (*PEFI_GET_VARIABLE)(IN PUINT16 VariableName, IN PEFI_GUID VendorGuid, OUT PUINT32 Attributes, IN OUT PUINT_PTR DataSize, OUT PVOID Data);
|
||||
typedef EFI_STATUS (*PEFI_GET_NEXT_HIGH_MONO_COUNT)(OUT PUINT32 HighCount);
|
||||
typedef EFI_STATUS (*PEFI_GET_NEXT_VARIABLE_NAME)(IN OUT PUINT_PTR VariableNameSize, IN OUT PWCHAR VariableName, IN OUT PEFI_GUID VendorGuid);
|
||||
typedef EFI_STATUS (*PEFI_GET_NEXT_VARIABLE_NAME)(IN OUT PUINT_PTR VariableNameSize, IN OUT PUINT16 VariableName, IN OUT PEFI_GUID VendorGuid);
|
||||
typedef EFI_STATUS (*PEFI_GET_TIME)(OUT PEFI_TIME Time, OUT PEFI_TIME_CAPABILITIES Capabilities);
|
||||
typedef EFI_STATUS (*PEFI_SET_TIME)(IN PEFI_TIME Time);
|
||||
typedef EFI_STATUS (*PEFI_SET_TIMER)(IN EFI_EVENT Event, IN EFI_TIMER_DELAY Type, IN UINT64 TriggerTime);
|
||||
@@ -649,13 +648,13 @@ typedef EFI_STATUS (*PEFI_WAIT_FOR_EVENT)(IN UINT_PTR NumberOfEvents, IN PEFI_EV
|
||||
typedef EFI_STATUS (*PEFI_QUERY_CAPSULE_CAPABILITIES)(IN PEFI_CAPSULE_HEADER *CapsuleHeaderArray, IN UINT_PTR CapsuleCount, OUT PUINT64 MaximumCapsuleSize, OUT PEFI_RESET_TYPE ResetType);
|
||||
typedef EFI_STATUS (*PEFI_QUERY_VARIABLE_INFO)(IN UINT32 Attributes, OUT PUINT64 MaximumVariableStorageSize, OUT PUINT64 RemainingVariableStorageSize, OUT PUINT64 MaximumVariableSize);
|
||||
typedef EFI_STATUS (*PEFI_RAISE_TPL)(IN EFI_TPL NewTpl);
|
||||
typedef EFI_STATUS (*PEFI_RESET_SYSTEM)(IN EFI_RESET_TYPE ResetType, IN EFI_STATUS ResetStatus, IN UINT_PTR DataSize, IN PWCHAR ResetData);
|
||||
typedef EFI_STATUS (*PEFI_RESET_SYSTEM)(IN EFI_RESET_TYPE ResetType, IN EFI_STATUS ResetStatus, IN UINT_PTR DataSize, IN PUINT16 ResetData);
|
||||
typedef EFI_STATUS (*PEFI_RESTORE_TPL)(IN EFI_TPL OldTpl);
|
||||
typedef EFI_STATUS (*PEFI_UPDATE_CAPSULE)(IN PEFI_CAPSULE_HEADER *CapsuleHeaderArray, IN UINT_PTR CapsuleCount, IN EFI_PHYSICAL_ADDRESS ScatterGatherList);
|
||||
typedef EFI_STATUS (*PEFI_SET_VARIABLE)(IN PWCHAR VariableName, IN PEFI_GUID VendorGuid, IN UINT32 Attributes, IN UINT_PTR DataSize, IN PVOID Data);
|
||||
typedef EFI_STATUS (*PEFI_SET_VARIABLE)(IN PUINT16 VariableName, IN PEFI_GUID VendorGuid, IN UINT32 Attributes, IN UINT_PTR DataSize, IN PVOID Data);
|
||||
typedef EFI_STATUS (*PEFI_SET_VIRTUAL_ADDRESS_MAP)(IN UINT_PTR MemoryMapSize, IN UINT_PTR DescriptorSize, IN UINT32 DescriptorVersion, IN PEFI_MEMORY_DESCRIPTOR VirtualMap);
|
||||
typedef EFI_STATUS (*PEFI_GET_WAKEUP_TIME)(OUT BOOLEAN Enabled, OUT BOOLEAN Pending, OUT PEFI_TIME Time);
|
||||
typedef EFI_STATUS (*PEFI_SET_WAKEUP_TIME)(IN BOOLEAN Enable, IN PEFI_TIME Time);
|
||||
typedef EFI_STATUS (*PEFI_GET_WAKEUP_TIME)(OUT UCHAR Enabled, OUT UCHAR Pending, OUT PEFI_TIME Time);
|
||||
typedef EFI_STATUS (*PEFI_SET_WAKEUP_TIME)(IN UCHAR Enable, IN PEFI_TIME Time);
|
||||
typedef EFI_STATUS (*PEFI_INSTALL_PROTOCOL_INTERFACE)(IN OUT PEFI_HANDLE Handle, IN PEFI_GUID Protocol, IN EFI_INTERFACE_TYPE InterfaceType, IN PVOID Interface);
|
||||
typedef EFI_STATUS (*PEFI_REINSTALL_PROTOCOL_INTERFACE)(IN EFI_HANDLE Handle, IN PEFI_GUID Protocol, IN PVOID OldInterface, IN PVOID NewInterface);
|
||||
typedef EFI_STATUS (*PEFI_UNINSTALL_PROTOCOL_INTERFACE)(IN EFI_HANDLE Handle, IN PEFI_GUID Protocol, IN PVOID Interface);
|
||||
@@ -666,15 +665,15 @@ typedef EFI_STATUS (*PEFI_LOCATE_DEVICE_PATH)(IN PEFI_GUID Protocol, IN OUT PEFI
|
||||
typedef EFI_STATUS (*PEFI_LOCATE_HANDLE_BUFFER)(IN EFI_LOCATE_SEARCH_TYPE SearchType, IN PEFI_GUID Protocol, IN PVOID SearchKey, IN OUT PUINT_PTR NoHandles, OUT PEFI_HANDLE *Buffer);
|
||||
typedef EFI_STATUS (*PEFI_LOCATE_PROTOCOL)(IN PEFI_GUID Protocol, IN PVOID Registration, OUT PVOID *Interface);
|
||||
typedef EFI_STATUS (*PEFI_INSTALL_CONFIGURATION_TABLE)(IN PEFI_GUID Guid, IN PVOID Table);
|
||||
typedef EFI_STATUS (*PEFI_IMAGE_LOAD)(IN BOOLEAN BootPolicy, IN EFI_HANDLE ParentImageHandle, IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, IN PVOID SourceBuffer, IN UINT_PTR SourceSize, OUT PEFI_HANDLE ImageHandle);
|
||||
typedef EFI_STATUS (*PEFI_IMAGE_LOAD)(IN UCHAR BootPolicy, IN EFI_HANDLE ParentImageHandle, IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, IN PVOID SourceBuffer, IN UINT_PTR SourceSize, OUT PEFI_HANDLE ImageHandle);
|
||||
typedef EFI_STATUS (*PEFI_IMAGE_UNLOAD)(IN EFI_HANDLE ImageHandle);
|
||||
typedef EFI_STATUS (*PEFI_IMAGE_START)(IN EFI_HANDLE ImageHandle, OUT PUINT_PTR ExitDataSize, OUT PWCHAR *ExitData);
|
||||
typedef EFI_STATUS (*PEFI_EXIT)(IN EFI_HANDLE ImageHandle, IN EFI_STATUS ExitStatus, IN UINT_PTR ExitDataSize, IN PWCHAR ExitData);
|
||||
typedef EFI_STATUS (*PEFI_IMAGE_START)(IN EFI_HANDLE ImageHandle, OUT PUINT_PTR ExitDataSize, OUT PUINT16 *ExitData);
|
||||
typedef EFI_STATUS (*PEFI_EXIT)(IN EFI_HANDLE ImageHandle, IN EFI_STATUS ExitStatus, IN UINT_PTR ExitDataSize, IN PUINT16 ExitData);
|
||||
typedef EFI_STATUS (*PEFI_EXIT_BOOT_SERVICES)(IN EFI_HANDLE ImageHandle, IN UINT_PTR MapKey);
|
||||
typedef EFI_STATUS (*PEFI_GET_NEXT_MONOTONIC_COUNT)(OUT PUINT64 Count);
|
||||
typedef EFI_STATUS (*PEFI_STALL)(IN UINT_PTR Microseconds);
|
||||
typedef EFI_STATUS (*PEFI_SET_WATCHDOG_TIMER)(IN UINT_PTR Timeout, IN UINT64 WatchdogCode, IN UINT_PTR DataSize, IN PWCHAR WatchdogData);
|
||||
typedef EFI_STATUS (*PEFI_CONNECT_CONTROLLER)(IN EFI_HANDLE ControllerHandle, IN PEFI_HANDLE DriverImageHandle, IN PEFI_DEVICE_PATH_PROTOCOL RemainingDevicePath, IN BOOLEAN Recursive);
|
||||
typedef EFI_STATUS (*PEFI_SET_WATCHDOG_TIMER)(IN UINT_PTR Timeout, IN UINT64 WatchdogCode, IN UINT_PTR DataSize, IN PUINT16 WatchdogData);
|
||||
typedef EFI_STATUS (*PEFI_CONNECT_CONTROLLER)(IN EFI_HANDLE ControllerHandle, IN PEFI_HANDLE DriverImageHandle, IN PEFI_DEVICE_PATH_PROTOCOL RemainingDevicePath, IN UCHAR Recursive);
|
||||
typedef EFI_STATUS (*PEFI_DISCONNECT_CONTROLLER)(IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE DriverImageHandle, IN EFI_HANDLE ChildHandle);
|
||||
typedef EFI_STATUS (*PEFI_OPEN_PROTOCOL)(IN EFI_HANDLE Handle, IN PEFI_GUID Protocol, OUT PVOID *Interface, IN EFI_HANDLE AgentHandle, IN EFI_HANDLE ControllerHandle, IN UINT32 Attributes);
|
||||
typedef EFI_STATUS (*PEFI_CLOSE_PROTOCOL)(IN EFI_HANDLE Handle, IN PEFI_GUID Protocol, IN EFI_HANDLE AgentHandle, IN EFI_HANDLE ControllerHandle);
|
||||
@@ -685,18 +684,18 @@ typedef EFI_STATUS (*PEFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES)(IN OUT PEFI_HA
|
||||
typedef EFI_STATUS (*PEFI_CALCULATE_CRC32)(IN PVOID Data, IN UINT_PTR DataSize, OUT PUINT32 Crc32);
|
||||
typedef EFI_STATUS (*PEFI_COPY_MEM)(IN OUT PVOID Destination, IN PVOID Source, IN UINT_PTR Length);
|
||||
typedef EFI_STATUS (*PEFI_SET_MEM)(IN OUT PVOID Buffer, IN UINT_PTR Size, IN UINT8 Value);
|
||||
typedef EFI_STATUS (*PEFI_INPUT_RESET)(IN PEFI_SIMPLE_TEXT_INPUT_PROTOCOL This, IN BOOLEAN ExtendedVerification);
|
||||
typedef EFI_STATUS (*PEFI_INPUT_RESET)(IN PEFI_SIMPLE_TEXT_INPUT_PROTOCOL This, IN UCHAR ExtendedVerification);
|
||||
typedef EFI_STATUS (*PEFI_INPUT_READ_KEY)(IN PEFI_SIMPLE_TEXT_INPUT_PROTOCOL This, OUT PEFI_INPUT_KEY Key);
|
||||
typedef EFI_STATUS (*PEFI_TEXT_RESET)(IN PEFI_SIMPLE_TEXT_OUTPUT_PROTOCOL This, IN BOOLEAN ExtendedVerification);
|
||||
typedef EFI_STATUS (*PEFI_TEXT_OUTPUT_STRING)(IN PEFI_SIMPLE_TEXT_OUTPUT_PROTOCOL This, IN PWCHAR String);
|
||||
typedef EFI_STATUS (*PEFI_TEXT_TEST_STRING)(IN PEFI_SIMPLE_TEXT_OUTPUT_PROTOCOL This, IN PWCHAR String);
|
||||
typedef EFI_STATUS (*PEFI_TEXT_RESET)(IN PEFI_SIMPLE_TEXT_OUTPUT_PROTOCOL This, IN UCHAR ExtendedVerification);
|
||||
typedef EFI_STATUS (*PEFI_TEXT_OUTPUT_STRING)(IN PEFI_SIMPLE_TEXT_OUTPUT_PROTOCOL This, IN PUINT16 String);
|
||||
typedef EFI_STATUS (*PEFI_TEXT_TEST_STRING)(IN PEFI_SIMPLE_TEXT_OUTPUT_PROTOCOL This, IN PUINT16 String);
|
||||
typedef EFI_STATUS (*PEFI_TEXT_QUERY_MODE)(IN PEFI_SIMPLE_TEXT_OUTPUT_PROTOCOL This, IN UINT_PTR ModeNumber, OUT PUINT_PTR Columns, OUT PUINT_PTR Rows);
|
||||
typedef EFI_STATUS (*PEFI_TEXT_SET_MODE)(IN PEFI_SIMPLE_TEXT_OUTPUT_PROTOCOL This, IN UINT_PTR ModeNumber);
|
||||
typedef EFI_STATUS (*PEFI_TEXT_SET_ATTRIBUTE)(IN PEFI_SIMPLE_TEXT_OUTPUT_PROTOCOL This, IN UINT_PTR Attribute);
|
||||
typedef EFI_STATUS (*PEFI_TEXT_CLEAR_SCREEN)(IN PEFI_SIMPLE_TEXT_OUTPUT_PROTOCOL This);
|
||||
typedef EFI_STATUS (*PEFI_TEXT_SET_CURSOR_POSITION)(IN PEFI_SIMPLE_TEXT_OUTPUT_PROTOCOL This, IN UINT_PTR Column, IN UINT_PTR Row);
|
||||
typedef EFI_STATUS (*PEFI_TEXT_ENABLE_CURSOR)(IN PEFI_SIMPLE_TEXT_OUTPUT_PROTOCOL This, IN BOOLEAN Enable);
|
||||
typedef EFI_STATUS (*PEFI_INPUT_RESET_EX)(IN PEFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL This, IN BOOLEAN ExtendedVerification);
|
||||
typedef EFI_STATUS (*PEFI_TEXT_ENABLE_CURSOR)(IN PEFI_SIMPLE_TEXT_OUTPUT_PROTOCOL This, IN UCHAR Enable);
|
||||
typedef EFI_STATUS (*PEFI_INPUT_RESET_EX)(IN PEFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL This, IN UCHAR ExtendedVerification);
|
||||
typedef EFI_STATUS (*PEFI_INPUT_READ_KEY_EX)(IN PEFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL This, OUT PEFI_KEY_DATA KeyData);
|
||||
typedef EFI_STATUS (*PEFI_SET_STATE)(IN PEFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL This, IN PUINT8 KeyToggleState);
|
||||
typedef EFI_STATUS (*PEFI_KEY_NOTIFY_FUNCTION)(IN PEFI_KEY_DATA KeyData);
|
||||
@@ -738,11 +737,11 @@ typedef EFI_STATUS (*EFI_PCI_IO_PROTOCOL_GET_BAR_ATTRIBUTES)(IN PEFI_PCI_IO_PROT
|
||||
typedef EFI_STATUS (*EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GET_ATTRIBUTES)(IN PEFI_PCI_ROOT_BRIDGE_IO_PROTOCOL This, OUT PUINT64 Supports, OUT PUINT64 Attributes);
|
||||
typedef EFI_STATUS (*EFI_PCI_IO_PROTOCOL_SET_BAR_ATTRIBUTES)(IN PEFI_PCI_IO_PROTOCOL This, IN UINT64 Attributes, IN UINT8 BarIndex, IN OUT PUINT64 Offset, IN OUT PUINT64 Length);
|
||||
typedef EFI_STATUS (*EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_SET_ATTRIBUTES)(IN PEFI_PCI_ROOT_BRIDGE_IO_PROTOCOL This, IN UINT64 Attributes, IN OUT PUINT64 ResourceBase, IN OUT PUINT64 ResourceLength);
|
||||
typedef EFI_STATUS (*PEFI_BLOCK_RESET)(IN PEFI_BLOCK_IO_PROTOCOL This, IN BOOLEAN ExtendedVerification);
|
||||
typedef EFI_STATUS (*PEFI_BLOCK_RESET)(IN PEFI_BLOCK_IO_PROTOCOL This, IN UCHAR ExtendedVerification);
|
||||
typedef EFI_STATUS (*PEFI_BLOCK_READ)(IN PEFI_BLOCK_IO_PROTOCOL This, IN UINT32 MediaId, IN EFI_LBA LBA, IN UINT_PTR BufferSize, OUT PVOID Buffer);
|
||||
typedef EFI_STATUS (*PEFI_BLOCK_WRITE)(IN PEFI_BLOCK_IO_PROTOCOL This, IN UINT32 MediaId, IN EFI_LBA LBA, IN UINT_PTR BufferSize, IN PVOID Buffer);
|
||||
typedef EFI_STATUS (*PEFI_BLOCK_FLUSH)(IN PEFI_BLOCK_IO_PROTOCOL This);
|
||||
typedef EFI_STATUS (*PEFI_BLOCK_RESET_EX)(IN PEFI_BLOCK_IO2_PROTOCOL This, IN BOOLEAN ExtendedVerification);
|
||||
typedef EFI_STATUS (*PEFI_BLOCK_RESET_EX)(IN PEFI_BLOCK_IO2_PROTOCOL This, IN UCHAR ExtendedVerification);
|
||||
typedef EFI_STATUS (*PEFI_BLOCK_READ_EX)(IN PEFI_BLOCK_IO2_PROTOCOL This, IN UINT32 MediaId, IN EFI_LBA LBA, IN OUT PEFI_BLOCK_IO2_TOKEN Token, IN UINT_PTR BufferSize, OUT PVOID Buffer);
|
||||
typedef EFI_STATUS (*PEFI_BLOCK_WRITE_EX)(IN PEFI_BLOCK_IO2_PROTOCOL This, IN UINT32 MediaId, IN EFI_LBA LBA, IN OUT PEFI_BLOCK_IO2_TOKEN Token, IN UINT_PTR BufferSize, IN PVOID Buffer);
|
||||
typedef EFI_STATUS (*PEFI_BLOCK_FLUSH_EX)(IN PEFI_BLOCK_IO2_PROTOCOL This, IN OUT PEFI_BLOCK_IO2_TOKEN Token);
|
||||
@@ -753,7 +752,7 @@ typedef EFI_STATUS (*PEFI_DISK_READ_EX)(IN PEFI_DISK_IO2_PROTOCOL This, IN UINT3
|
||||
typedef EFI_STATUS (*PEFI_DISK_WRITE_EX)(IN PEFI_DISK_IO2_PROTOCOL This, IN UINT32 MediaId, IN UINT64 Offset, IN OUT PEFI_DISK_IO2_TOKEN Token, IN UINT_PTR BufferSize, IN PVOID Buffer);
|
||||
typedef EFI_STATUS (*PEFI_DISK_FLUSH_EX)(IN PEFI_DISK_IO2_PROTOCOL This, IN OUT PEFI_DISK_IO2_TOKEN Token);
|
||||
typedef EFI_STATUS (*PEFI_VOLUME_OPEN)(IN PEFI_SIMPLE_FILE_SYSTEM_PROTOCOL This, OUT PEFI_FILE_HANDLE *Root);
|
||||
typedef EFI_STATUS (*PEFI_FILE_OPEN)(IN PEFI_FILE_HANDLE File, OUT PEFI_FILE_HANDLE *NewHandle, IN PWCHAR FileName, IN UINT64 OpenMode, IN UINT64 Attributes);
|
||||
typedef EFI_STATUS (*PEFI_FILE_OPEN)(IN PEFI_FILE_HANDLE File, OUT PEFI_FILE_HANDLE *NewHandle, IN PUINT16 FileName, IN UINT64 OpenMode, IN UINT64 Attributes);
|
||||
typedef EFI_STATUS (*PEFI_FILE_CLOSE)(IN PEFI_FILE_HANDLE File);
|
||||
typedef EFI_STATUS (*PEFI_FILE_DELETE)(IN PEFI_FILE_HANDLE File);
|
||||
typedef EFI_STATUS (*PEFI_FILE_READ)(IN PEFI_FILE_HANDLE File, IN OUT PUINT_PTR BufferSize, OUT PVOID Buffer);
|
||||
@@ -763,7 +762,7 @@ typedef EFI_STATUS (*PEFI_FILE_GET_POSITION)(IN PEFI_FILE_HANDLE File, OUT PUINT
|
||||
typedef EFI_STATUS (*PEFI_FILE_GET_INFO)(IN PEFI_FILE_HANDLE File, IN PEFI_GUID InformationType, IN OUT PUINT_PTR BufferSize, OUT PVOID Buffer);
|
||||
typedef EFI_STATUS (*PEFI_FILE_SET_INFO)(IN PEFI_FILE_HANDLE File, IN PEFI_GUID InformationType, IN UINT_PTR BufferSize, IN PVOID Buffer);
|
||||
typedef EFI_STATUS (*PEFI_FILE_FLUSH)(IN PEFI_FILE_HANDLE File);
|
||||
typedef EFI_STATUS (*PEFI_FILE_OPEN_EX)(IN PEFI_FILE_HANDLE File, OUT PEFI_FILE_HANDLE *NewHandle, IN PWCHAR FileName, IN UINT64 OpenMode, IN UINT64 Attributes, IN OUT PEFI_FILE_IO_TOKEN Token);
|
||||
typedef EFI_STATUS (*PEFI_FILE_OPEN_EX)(IN PEFI_FILE_HANDLE File, OUT PEFI_FILE_HANDLE *NewHandle, IN PUINT16 FileName, IN UINT64 OpenMode, IN UINT64 Attributes, IN OUT PEFI_FILE_IO_TOKEN Token);
|
||||
typedef EFI_STATUS (*PEFI_FILE_READ_EX)(IN PEFI_FILE_HANDLE File, IN OUT PEFI_FILE_IO_TOKEN Token);
|
||||
typedef EFI_STATUS (*PEFI_FILE_WRITE_EX)(IN PEFI_FILE_HANDLE File, IN OUT PEFI_FILE_IO_TOKEN Token);
|
||||
typedef EFI_STATUS (*PEFI_FILE_FLUSH_EX)(IN PEFI_FILE_HANDLE File, IN OUT PEFI_FILE_IO_TOKEN Token);
|
||||
@@ -807,10 +806,10 @@ typedef EFI_STATUS (*PEFI_SERVICE_BINDING_DESTROY_CHILD)(IN PEFI_SERVICE_BINDING
|
||||
typedef EFI_STATUS (*PEFI_DRIVER_BINDING_PROTOCOL_SUPPORTED)(IN PEFI_DRIVER_BINDING_PROTOCOL This, IN EFI_HANDLE ControllerHandle, IN PEFI_DEVICE_PATH_PROTOCOL RemainingDevicePath);
|
||||
typedef EFI_STATUS (*PEFI_DRIVER_BINDING_PROTOCOL_START)(IN PEFI_DRIVER_BINDING_PROTOCOL This, IN EFI_HANDLE ControllerHandle, IN PEFI_DEVICE_PATH_PROTOCOL RemainingDevicePath);
|
||||
typedef EFI_STATUS (*PEFI_DRIVER_BINDING_PROTOCOL_STOP)(IN PEFI_DRIVER_BINDING_PROTOCOL This, IN EFI_HANDLE ControllerHandle, IN UINT_PTR NumberOfChildren, IN PEFI_HANDLE ChildHandleBuffer);
|
||||
typedef EFI_STATUS (*PEFI_COMPONENT_NAME_GET_DRIVER_NAME)(IN PEFI_COMPONENT_NAME_PROTOCOL This, IN PUINT8 Language, OUT PWCHAR *DriverName);
|
||||
typedef EFI_STATUS (*PEFI_COMPONENT_NAME_GET_CONTROLLER_NAME)(IN PEFI_COMPONENT_NAME_PROTOCOL This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle, IN PUINT8 Language, OUT PWCHAR *ControllerName);
|
||||
typedef EFI_STATUS (*PEFI_COMPONENT_NAME2_GET_DRIVER_NAME)(IN PEFI_COMPONENT_NAME2_PROTOCOL This, IN PUINT8 Language, OUT PWCHAR *DriverName);
|
||||
typedef EFI_STATUS (*PEFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)(IN PEFI_COMPONENT_NAME2_PROTOCOL This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle, IN PUINT8 Language, OUT PWCHAR *ControllerName);
|
||||
typedef EFI_STATUS (*PEFI_COMPONENT_NAME_GET_DRIVER_NAME)(IN PEFI_COMPONENT_NAME_PROTOCOL This, IN PUINT8 Language, OUT PUINT16 *DriverName);
|
||||
typedef EFI_STATUS (*PEFI_COMPONENT_NAME_GET_CONTROLLER_NAME)(IN PEFI_COMPONENT_NAME_PROTOCOL This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle, IN PUINT8 Language, OUT PUINT16 *ControllerName);
|
||||
typedef EFI_STATUS (*PEFI_COMPONENT_NAME2_GET_DRIVER_NAME)(IN PEFI_COMPONENT_NAME2_PROTOCOL This, IN PUINT8 Language, OUT PUINT16 *DriverName);
|
||||
typedef EFI_STATUS (*PEFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)(IN PEFI_COMPONENT_NAME2_PROTOCOL This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle, IN PUINT8 Language, OUT PUINT16 *ControllerName);
|
||||
typedef EFI_STATUS (*PEFI_RNG_GET_INFO)(IN PEFI_RNG_PROTOCOL This, IN OUT PUINT_PTR RNGAlgorithmListSize, OUT PEFI_GUID RNGAlgorithmList);
|
||||
typedef EFI_STATUS (*PEFI_RNG_GET_RNG)(IN PEFI_RNG_PROTOCOL This, IN PEFI_GUID RNGAlgorithm, IN UINT_PTR RNGValueLength, OUT PUINT8 RNGValue);
|
||||
typedef EFI_STATUS (*PEFI_PLATFORM_DRIVER_OVERRIDE_GET_DRIVER)(IN PEFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL This, IN EFI_HANDLE ControllerHandle, IN OUT PEFI_HANDLE DriverImageHandle);
|
||||
@@ -846,7 +845,7 @@ typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_START)(IN PEFI_PXE_BASE_CODE_PROTOCOL Th
|
||||
typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_STOP)(IN PEFI_PXE_BASE_CODE_PROTOCOL This);
|
||||
typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_DHCP)(IN PEFI_PXE_BASE_CODE_PROTOCOL This, IN UCHAR SortOffers);
|
||||
typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_DISCOVER)(IN PEFI_PXE_BASE_CODE_PROTOCOL This, IN UINT16 Type, IN PUINT16 Layer, IN UCHAR UseBis, IN OUT PEFI_PXE_BASE_CODE_DISCOVER_INFO Info);
|
||||
typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_MTFTP)(IN PEFI_PXE_BASE_CODE_PROTOCOL This, IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation, IN OUT PVOID *BufferPtr, IN UCHAR Overwrite, IN OUT PUINT64 BufferSize, IN PUINT_PTR BlockSize, IN PEFI_IP_ADDRESS ServerIp, IN PWCHAR Filename, IN PEFI_PXE_BASE_CODE_MTFTP_INFO Info, IN UCHAR DontUseBuffer);
|
||||
typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_MTFTP)(IN PEFI_PXE_BASE_CODE_PROTOCOL This, IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation, IN OUT PVOID *BufferPtr, IN UCHAR Overwrite, IN OUT PUINT64 BufferSize, IN PUINT_PTR BlockSize, IN PEFI_IP_ADDRESS ServerIp, IN PUINT8 Filename, IN PEFI_PXE_BASE_CODE_MTFTP_INFO Info, IN UCHAR DontUseBuffer);
|
||||
typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_UDP_WRITE)(IN PEFI_PXE_BASE_CODE_PROTOCOL This, IN UINT16 OpFlags, IN PEFI_IP_ADDRESS DestIp, IN PUINT16 DestPort, IN PEFI_IP_ADDRESS GatewayIp, IN PEFI_IP_ADDRESS SrcIp, IN OUT PUINT16 SrcPort, IN PUINT_PTR HeaderSize, IN PVOID HeaderPtr, IN PUINT_PTR BufferSize, IN PVOID BufferPtr);
|
||||
typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_UDP_READ)(IN PEFI_PXE_BASE_CODE_PROTOCOL This, IN UINT16 OpFlags, IN OUT PEFI_IP_ADDRESS DestIp, IN OUT PUINT16 DestPort, IN OUT PEFI_IP_ADDRESS SrcIp, IN OUT PUINT16 SrcPort, IN PUINT_PTR HeaderSize, IN PVOID HeaderPtr, IN OUT PUINT_PTR BufferSize, IN PVOID BufferPtr);
|
||||
typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_SET_IP_FILTER)(IN PEFI_PXE_BASE_CODE_PROTOCOL This, IN PEFI_PXE_BASE_CODE_IP_FILTER NewFilter);
|
||||
@@ -953,7 +952,7 @@ typedef struct _EFI_TIME_CAPABILITIES
|
||||
{
|
||||
UINT32 Resolution;
|
||||
UINT32 Accuracy;
|
||||
BOOLEAN SetsToZero;
|
||||
UCHAR SetsToZero;
|
||||
} EFI_TIME_CAPABILITIES, *PEFI_TIME_CAPABILITIES;
|
||||
|
||||
/* EFI Open Protocol Information Entry */
|
||||
@@ -1073,14 +1072,14 @@ typedef struct _EFI_SIMPLE_TEXT_OUTPUT_MODE
|
||||
INT32 Attribute;
|
||||
INT32 CursorColumn;
|
||||
INT32 CursorRow;
|
||||
BOOLEAN CursorVisible;
|
||||
UCHAR CursorVisible;
|
||||
} EFI_SIMPLE_TEXT_OUTPUT_MODE, *PEFI_SIMPLE_TEXT_OUTPUT_MODE;
|
||||
|
||||
/* The keystroke information for the key that was pressed */
|
||||
typedef struct _EFI_INPUT_KEY
|
||||
{
|
||||
UINT16 ScanCode;
|
||||
WCHAR UnicodeChar;
|
||||
UINT16 UnicodeChar;
|
||||
} EFI_INPUT_KEY, *PEFI_INPUT_KEY;
|
||||
|
||||
/* EFI Key State information */
|
||||
@@ -1112,7 +1111,7 @@ typedef struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
|
||||
typedef struct _EFI_SYSTEM_TABLE
|
||||
{
|
||||
EFI_TABLE_HEADER Hdr;
|
||||
PWCHAR FirmwareVendor;
|
||||
PUINT16 FirmwareVendor;
|
||||
UINT32 FirmwareRevision;
|
||||
EFI_HANDLE ConsoleInHandle;
|
||||
PEFI_SIMPLE_TEXT_INPUT_PROTOCOL ConIn;
|
||||
@@ -1459,7 +1458,7 @@ typedef struct _EFI_CDROM_DEVICE_PATH
|
||||
typedef struct _EFI_FILEPATH_DEVICE_PATH
|
||||
{
|
||||
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||
WCHAR PathName[1];
|
||||
UINT16 PathName[1];
|
||||
} EFI_FILEPATH_DEVICE_PATH, *PEFI_FILEPATH_DEVICE_PATH;
|
||||
|
||||
/* Media Protocol device path node */
|
||||
@@ -1688,11 +1687,11 @@ typedef struct _EFI_BLOCK_DEVICE_DATA
|
||||
typedef struct _EFI_BLOCK_IO_MEDIA
|
||||
{
|
||||
UINT32 MediaId;
|
||||
BOOLEAN RemovableMedia;
|
||||
BOOLEAN MediaPresent;
|
||||
BOOLEAN LogicalPartition;
|
||||
BOOLEAN ReadOnly;
|
||||
BOOLEAN WriteCaching;
|
||||
UCHAR RemovableMedia;
|
||||
UCHAR MediaPresent;
|
||||
UCHAR LogicalPartition;
|
||||
UCHAR ReadOnly;
|
||||
UCHAR WriteCaching;
|
||||
UINT32 BlockSize;
|
||||
UINT32 IoAlign;
|
||||
EFI_LBA LastBlock;
|
||||
@@ -1800,7 +1799,7 @@ typedef struct _EFI_FILE_INFO
|
||||
EFI_TIME LastAccessTime;
|
||||
EFI_TIME ModificationTime;
|
||||
UINT64 Attribute;
|
||||
WCHAR FileName[1];
|
||||
UINT16 FileName[1];
|
||||
} EFI_FILE_INFO, *PEFI_FILE_INFO;
|
||||
|
||||
/* EFI File System Info structure */
|
||||
@@ -2322,7 +2321,7 @@ typedef struct _EFI_GPT_PARTITION_ENTRY
|
||||
EFI_LBA StartingLBA;
|
||||
EFI_LBA EndingLBA;
|
||||
UINT64 Attributes;
|
||||
WCHAR PartitionName[36];
|
||||
UINT16 PartitionName[36];
|
||||
} EFI_GPT_PARTITION_ENTRY, *PEFI_GPT_PARTITION_ENTRY;
|
||||
|
||||
/* EFI file header */
|
||||
|
@@ -11,23 +11,23 @@ include_directories(
|
||||
|
||||
# Specify list of library source code files
|
||||
list(APPEND LIBXTLDR_SOURCE
|
||||
${XTLDR_SOURCE_DIR}/library/modproto.cc)
|
||||
${XTLDR_SOURCE_DIR}/library/modproto.c)
|
||||
|
||||
# Specify list of source code files
|
||||
list(APPEND XTLDR_SOURCE
|
||||
${XTLDR_SOURCE_DIR}/arch/${ARCH}/memory.cc
|
||||
${XTLDR_SOURCE_DIR}/bootutil.cc
|
||||
${XTLDR_SOURCE_DIR}/config.cc
|
||||
${XTLDR_SOURCE_DIR}/console.cc
|
||||
${XTLDR_SOURCE_DIR}/data.cc
|
||||
${XTLDR_SOURCE_DIR}/debug.cc
|
||||
${XTLDR_SOURCE_DIR}/efiutils.cc
|
||||
${XTLDR_SOURCE_DIR}/memory.cc
|
||||
${XTLDR_SOURCE_DIR}/protocol.cc
|
||||
${XTLDR_SOURCE_DIR}/shell.cc
|
||||
${XTLDR_SOURCE_DIR}/textui.cc
|
||||
${XTLDR_SOURCE_DIR}/volume.cc
|
||||
${XTLDR_SOURCE_DIR}/xtldr.cc)
|
||||
${XTLDR_SOURCE_DIR}/arch/${ARCH}/memory.c
|
||||
${XTLDR_SOURCE_DIR}/config.c
|
||||
${XTLDR_SOURCE_DIR}/console.c
|
||||
${XTLDR_SOURCE_DIR}/debug.c
|
||||
${XTLDR_SOURCE_DIR}/efiutils.c
|
||||
${XTLDR_SOURCE_DIR}/globals.c
|
||||
${XTLDR_SOURCE_DIR}/hardware.c
|
||||
${XTLDR_SOURCE_DIR}/memory.c
|
||||
${XTLDR_SOURCE_DIR}/protocol.c
|
||||
${XTLDR_SOURCE_DIR}/shell.c
|
||||
${XTLDR_SOURCE_DIR}/textui.c
|
||||
${XTLDR_SOURCE_DIR}/volume.c
|
||||
${XTLDR_SOURCE_DIR}/xtldr.c)
|
||||
|
||||
# Link static XTLDR library
|
||||
add_library(libxtldr ${LIBXTLDR_SOURCE})
|
||||
@@ -49,5 +49,6 @@ set_install_target(xtldr efi/boot)
|
||||
|
||||
# Set loader entrypoint and subsystem
|
||||
set_entrypoint(xtldr "BlStartXtLoader")
|
||||
set_imagebase(xtldr ${BASEADDRESS_XTLDR})
|
||||
set_linker_map(xtldr TRUE)
|
||||
set_subsystem(xtldr efi_application)
|
275
xtldr/arch/amd64/memory.c
Normal file
275
xtldr/arch/amd64/memory.c
Normal file
@@ -0,0 +1,275 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/arch/amd64/memory.c
|
||||
* DESCRIPTION: XT Boot Loader AMD64 specific memory management
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtldr.h>
|
||||
|
||||
|
||||
/**
|
||||
* Maps boot loader related code and builds page map.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @param SelfMapAddress
|
||||
* Supplies a virtual address of the page tables.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlBuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR SelfMapAddress)
|
||||
{
|
||||
PLIST_ENTRY ListEntry, ModulesList, ModulesListEntry;
|
||||
PXTBL_MEMORY_MAPPING Mapping;
|
||||
PXTBL_MODULE_INFO ModuleInfo;
|
||||
EFI_PHYSICAL_ADDRESS Address;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Allocate pages for the Page Map */
|
||||
Status = BlAllocateMemoryPages(1, &Address);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Assign and zero-fill memory used by page mappings */
|
||||
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
||||
RtlZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
||||
|
||||
/* Add page mapping itself to memory mapping */
|
||||
Status = BlpSelfMapPml(PageMap, SelfMapAddress);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* PML mapping failed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get list of XTLDR modules */
|
||||
ModulesList = BlGetModulesList();
|
||||
ModulesListEntry = ModulesList->Flink;
|
||||
while(ModulesListEntry != ModulesList)
|
||||
{
|
||||
/* Get module info */
|
||||
ModuleInfo = CONTAIN_RECORD(ModulesListEntry, XTBL_MODULE_INFO, Flink);
|
||||
|
||||
/* Map module code */
|
||||
Status = BlMapVirtualMemory(PageMap, ModuleInfo->ModuleBase, ModuleInfo->ModuleBase,
|
||||
EFI_SIZE_TO_PAGES(ModuleInfo->ModuleSize), LoaderFirmwareTemporary);
|
||||
|
||||
/* Check if mapping succeeded */
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Mapping module code failed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get next module */
|
||||
ModulesListEntry = ModulesListEntry->Flink;
|
||||
}
|
||||
|
||||
/* Make sure boot loader image base and size are set */
|
||||
if(BlpStatus.LoaderBase && BlpStatus.LoaderSize)
|
||||
{
|
||||
/* Map boot loader code as well */
|
||||
Status = BlMapVirtualMemory(PageMap, BlpStatus.LoaderBase, BlpStatus.LoaderBase,
|
||||
EFI_SIZE_TO_PAGES(BlpStatus.LoaderSize), LoaderFirmwareTemporary);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Mapping boot loader code failed */
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Boot loader image information re not available */
|
||||
return STATUS_EFI_PROTOCOL_ERROR;
|
||||
}
|
||||
|
||||
/* Iterate through and map all the mappings*/
|
||||
BlDebugPrint(L"Mapping and dumping EFI memory:\n");
|
||||
ListEntry = PageMap->MemoryMap.Flink;
|
||||
while(ListEntry != &PageMap->MemoryMap)
|
||||
{
|
||||
/* Take mapping from the list */
|
||||
Mapping = CONTAIN_RECORD(ListEntry, XTBL_MEMORY_MAPPING, ListEntry);
|
||||
|
||||
/* Check if virtual address is set */
|
||||
if(Mapping->VirtualAddress)
|
||||
{
|
||||
/* Dump memory mapping */
|
||||
BlDebugPrint(L" Type=%02lu, PhysicalBase=%.16P, VirtualBase=%.16P, Pages=%llu\n", Mapping->MemoryType,
|
||||
Mapping->PhysicalAddress, Mapping->VirtualAddress, Mapping->NumberOfPages);
|
||||
|
||||
/* Map memory */
|
||||
Status = BlMapPage(PageMap, (UINT_PTR)Mapping->VirtualAddress,
|
||||
(UINT_PTR)Mapping->PhysicalAddress, Mapping->NumberOfPages);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failed */
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
/* Take next element */
|
||||
ListEntry = ListEntry->Flink;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the actual virtual memory mapping.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @param VirtualAddress
|
||||
* Supplies a virtual address of the mapping.
|
||||
*
|
||||
* @param PhysicalAddress
|
||||
* Supplies a physical address of the mapping.
|
||||
*
|
||||
* @param NumberOfPages
|
||||
* Supplies a number of the pages of the mapping.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlMapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN UINT_PTR VirtualAddress,
|
||||
IN UINT_PTR PhysicalAddress,
|
||||
IN UINT NumberOfPages)
|
||||
{
|
||||
SIZE_T Pml1Entry, Pml2Entry, Pml3Entry, Pml4Entry, Pml5Entry;
|
||||
PHARDWARE_PTE Pml1, Pml2, Pml3, Pml4, Pml5;
|
||||
SIZE_T PageFrameNumber;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Set the Page Frame Number (PFN) */
|
||||
PageFrameNumber = PhysicalAddress >> EFI_PAGE_SHIFT;
|
||||
|
||||
/* Do the recursive mapping */
|
||||
while(NumberOfPages > 0)
|
||||
{
|
||||
/* Calculate the indices in the various Page Tables from the virtual address */
|
||||
Pml5Entry = (VirtualAddress & ((ULONGLONG)0x1FF << 48)) >> 48;
|
||||
Pml4Entry = (VirtualAddress & ((ULONGLONG)0x1FF << 39)) >> 39;
|
||||
Pml3Entry = (VirtualAddress & ((ULONGLONG)0x1FF << 30)) >> 30;
|
||||
Pml2Entry = (VirtualAddress & ((ULONGLONG)0x1FF << 21)) >> 21;
|
||||
Pml1Entry = (VirtualAddress & ((ULONGLONG)0x1FF << 12)) >> 12;
|
||||
|
||||
/* Check page map level */
|
||||
if(PageMap->PageMapLevel == 5)
|
||||
{
|
||||
/* Five level Page Map */
|
||||
Pml5 = ((PHARDWARE_PTE)(PageMap->PtePointer));
|
||||
|
||||
/* Get PML4 */
|
||||
Status = BlpGetNextPageTable(PageMap, Pml5, Pml5Entry, &Pml4);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failure */
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Four level Page Map */
|
||||
Pml4 = ((PHARDWARE_PTE)(PageMap->PtePointer));
|
||||
}
|
||||
|
||||
/* Get PML3 */
|
||||
Status = BlpGetNextPageTable(PageMap, Pml4, Pml4Entry, &Pml3);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get PML 2 */
|
||||
Status = BlpGetNextPageTable(PageMap, Pml3, Pml3Entry, &Pml2);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get PML1 */
|
||||
Status = BlpGetNextPageTable(PageMap, Pml2, Pml2Entry, &Pml1);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Set paging entry settings */
|
||||
Pml1[Pml1Entry].PageFrameNumber = PageFrameNumber;
|
||||
Pml1[Pml1Entry].Valid = 1;
|
||||
Pml1[Pml1Entry].Writable = 1;
|
||||
|
||||
/* Take next virtual address and PFN */
|
||||
VirtualAddress += EFI_PAGE_SIZE;
|
||||
PageFrameNumber++;
|
||||
|
||||
/* Decrease number of pages left */
|
||||
NumberOfPages--;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a recursive self mapping for all PML levels.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @param SelfMapAddress
|
||||
* Supplies a virtual address of the page tables.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR SelfMapAddress)
|
||||
{
|
||||
ULONGLONG PmlIndex;
|
||||
|
||||
/* Check page map level */
|
||||
if(PageMap->PageMapLevel == 5)
|
||||
{
|
||||
/* Self-mapping for PML5 is not supported */
|
||||
BlDebugPrint(L"PML5 self-mapping not supported yet!\n");
|
||||
return STATUS_EFI_UNSUPPORTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Calculate PML index based on provided self map address */
|
||||
PmlIndex = (SelfMapAddress >> 39) & 0x1FF;
|
||||
|
||||
/* Add self-mapping for PML4 */
|
||||
((PHARDWARE_PTE)PageMap->PtePointer)[PmlIndex].PageFrameNumber = (UINT_PTR)PageMap->PtePointer / EFI_PAGE_SIZE;
|
||||
((PHARDWARE_PTE)PageMap->PtePointer)[PmlIndex].Valid = 1;
|
||||
((PHARDWARE_PTE)PageMap->PtePointer)[PmlIndex].Writable = 1;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
289
xtldr/arch/i686/memory.c
Normal file
289
xtldr/arch/i686/memory.c
Normal file
@@ -0,0 +1,289 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/arch/i686/memory.c
|
||||
* DESCRIPTION: XT Boot Loader i686 specific memory management
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtldr.h>
|
||||
|
||||
|
||||
/**
|
||||
* Maps boot loader related code and builds page map.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlBuildPageMap(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR SelfMapAddress)
|
||||
{
|
||||
PLIST_ENTRY ListEntry, ModulesList, ModulesListEntry;
|
||||
EFI_PHYSICAL_ADDRESS Address, DirectoryAddress;
|
||||
PXTBL_MODULE_INFO ModuleInfo;
|
||||
PXTBL_MEMORY_MAPPING Mapping;
|
||||
EFI_STATUS Status;
|
||||
ULONG Index;
|
||||
|
||||
/* Allocate pages for the Page Map */
|
||||
Status = BlAllocateMemoryPages(1, &Address);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Assign and zero-fill memory used by page mappings */
|
||||
PageMap->PtePointer = (PVOID)(UINT_PTR)Address;
|
||||
RtlZeroMemory(PageMap->PtePointer, EFI_PAGE_SIZE);
|
||||
|
||||
/* Allocate pages for the Page Directory */
|
||||
Status = BlAllocateMemoryPages(4, &DirectoryAddress);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Zero fill memory used by Page Directory */
|
||||
RtlZeroMemory((PVOID)DirectoryAddress, EFI_PAGE_SIZE * 4);
|
||||
|
||||
/* Set the page directory into the PDPT and mark it present */
|
||||
for(Index = 0; Index < 4; Index++)
|
||||
{
|
||||
/* Set paging entry settings */
|
||||
((PHARDWARE_PTE)PageMap->PtePointer)[Index].PageFrameNumber = DirectoryAddress / EFI_PAGE_SIZE;
|
||||
((PHARDWARE_PTE)PageMap->PtePointer)[Index].Valid = 1;
|
||||
|
||||
/* Next valid PFN address */
|
||||
DirectoryAddress += EFI_PAGE_SIZE;
|
||||
}
|
||||
|
||||
/* Add page mapping itself to memory mapping */
|
||||
Status = BlpSelfMapPml(PageMap, SelfMapAddress);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* PML mapping failed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get list of XTLDR modules */
|
||||
ModulesList = BlGetModulesList();
|
||||
ModulesListEntry = ModulesList->Flink;
|
||||
while(ModulesListEntry != ModulesList)
|
||||
{
|
||||
/* Get module info */
|
||||
ModuleInfo = CONTAIN_RECORD(ModulesListEntry, XTBL_MODULE_INFO, Flink);
|
||||
|
||||
/* Map module code */
|
||||
Status = BlMapVirtualMemory(PageMap, ModuleInfo->ModuleBase, ModuleInfo->ModuleBase,
|
||||
EFI_SIZE_TO_PAGES(ModuleInfo->ModuleSize), LoaderFirmwareTemporary);
|
||||
|
||||
/* Check if mapping succeeded */
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Mapping module code failed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get next module */
|
||||
ModulesListEntry = ModulesListEntry->Flink;
|
||||
}
|
||||
|
||||
/* Make sure boot loader image base and size are set */
|
||||
if(BlpStatus.LoaderBase && BlpStatus.LoaderSize)
|
||||
{
|
||||
/* Map boot loader code as well */
|
||||
Status = BlMapVirtualMemory(PageMap, BlpStatus.LoaderBase, BlpStatus.LoaderBase,
|
||||
EFI_SIZE_TO_PAGES(BlpStatus.LoaderSize), LoaderFirmwareTemporary);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Mapping boot loader code failed */
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Boot loader image information re not available */
|
||||
return STATUS_EFI_PROTOCOL_ERROR;
|
||||
}
|
||||
|
||||
/* Iterate through and map all the mappings*/
|
||||
BlDebugPrint(L"Mapping and dumping EFI memory:\n");
|
||||
ListEntry = PageMap->MemoryMap.Flink;
|
||||
while(ListEntry != &PageMap->MemoryMap)
|
||||
{
|
||||
/* Take mapping from the list */
|
||||
Mapping = CONTAIN_RECORD(ListEntry, XTBL_MEMORY_MAPPING, ListEntry);
|
||||
|
||||
/* Check if virtual address is set */
|
||||
if(Mapping->VirtualAddress)
|
||||
{
|
||||
/* Dump memory mapping */
|
||||
BlDebugPrint(L" Type=%02lu, PhysicalBase=%.8P, VirtualBase=%.8P, Pages=%llu\n", Mapping->MemoryType,
|
||||
Mapping->PhysicalAddress, Mapping->VirtualAddress, Mapping->NumberOfPages);
|
||||
|
||||
/* Map memory */
|
||||
Status = BlMapPage(PageMap, (UINT_PTR)Mapping->VirtualAddress,
|
||||
(UINT_PTR)Mapping->PhysicalAddress, Mapping->NumberOfPages);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failed */
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
/* Take next element */
|
||||
ListEntry = ListEntry->Flink;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the actual virtual memory mapping.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @param VirtualAddress
|
||||
* Supplies a virtual address of the mapping.
|
||||
*
|
||||
* @param PhysicalAddress
|
||||
* Supplies a physical address of the mapping.
|
||||
*
|
||||
* @param NumberOfPages
|
||||
* Supplies a number of the pages of the mapping.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlMapPage(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN UINT_PTR VirtualAddress,
|
||||
IN UINT_PTR PhysicalAddress,
|
||||
IN UINT NumberOfPages)
|
||||
{
|
||||
SIZE_T Pml1Entry, Pml2Entry, Pml3Entry;
|
||||
PHARDWARE_PTE Pml1, Pml2, Pml3;
|
||||
SIZE_T PageFrameNumber;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Set the Page Frame Number (PFN) */
|
||||
PageFrameNumber = PhysicalAddress >> EFI_PAGE_SHIFT;
|
||||
|
||||
/* Do the recursive mapping */
|
||||
while(NumberOfPages > 0)
|
||||
{
|
||||
/* Calculate the indices in the various Page Tables from the virtual address */
|
||||
Pml3Entry = (VirtualAddress & ((ULONGLONG)0x1FF << 30)) >> 30;
|
||||
Pml2Entry = (VirtualAddress & ((ULONGLONG)0x1FF << 21)) >> 21;
|
||||
Pml1Entry = (VirtualAddress & ((ULONGLONG)0x1FF << 12)) >> 12;
|
||||
|
||||
/* Check page map level */
|
||||
if(PageMap->PageMapLevel == 3)
|
||||
{
|
||||
/* Three level Page Map */
|
||||
Pml3 = ((PHARDWARE_PTE)(PageMap->PtePointer));
|
||||
|
||||
/* Get PML2 */
|
||||
Status = BlpGetNextPageTable(PageMap, Pml3, Pml3Entry, &Pml2);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failure */
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Two level Page Map */
|
||||
Pml2 = ((PHARDWARE_PTE)(PageMap->PtePointer));
|
||||
}
|
||||
|
||||
/* Get PML1 */
|
||||
Status = BlpGetNextPageTable(PageMap, Pml2, Pml2Entry, &Pml1);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory mapping failure */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Set paging entry settings */
|
||||
Pml1[Pml1Entry].PageFrameNumber = PageFrameNumber;
|
||||
Pml1[Pml1Entry].Valid = 1;
|
||||
Pml1[Pml1Entry].Writable = 1;
|
||||
|
||||
/* Take next virtual address and PFN */
|
||||
VirtualAddress += EFI_PAGE_SIZE;
|
||||
PageFrameNumber++;
|
||||
|
||||
/* Decrease number of pages left */
|
||||
NumberOfPages--;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a recursive self mapping for all PML levels.
|
||||
*
|
||||
* @param PageMap
|
||||
* Supplies a pointer to the page mapping structure.
|
||||
*
|
||||
* @param SelfMapAddress
|
||||
* Supplies a virtual address of the page tables.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlpSelfMapPml(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
IN ULONG_PTR SelfMapAddress)
|
||||
{
|
||||
ULONGLONG PmlIndex;
|
||||
PHARDWARE_PTE Pml;
|
||||
ULONG Index;
|
||||
|
||||
/* Check page map level */
|
||||
if(PageMap->PageMapLevel == 3)
|
||||
{
|
||||
/* Calculate PML index based on provided self map address */
|
||||
PmlIndex = (SelfMapAddress >> 21) & 0x1FF;
|
||||
|
||||
/* Get Page Directory */
|
||||
Pml = (PHARDWARE_PTE)(((PHARDWARE_PTE)PageMap->PtePointer)[SelfMapAddress >> 30].PageFrameNumber * EFI_PAGE_SIZE);
|
||||
|
||||
/* Add self-mapping for PML3 (PAE enabled) */
|
||||
for(Index = 0; Index < 4; Index++)
|
||||
{
|
||||
Pml[PmlIndex + Index].PageFrameNumber = ((PHARDWARE_PTE)PageMap->PtePointer)[Index].PageFrameNumber;
|
||||
Pml[PmlIndex + Index].Valid = 1;
|
||||
Pml[PmlIndex + Index].Writable = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Calculate PML index based on provided self map address */
|
||||
PmlIndex = (SelfMapAddress >> 22);
|
||||
|
||||
/* Add self-mapping for PML2 (PAE disabled) */
|
||||
((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[PmlIndex].PageFrameNumber = (UINT_PTR)PageMap->PtePointer / EFI_PAGE_SIZE;
|
||||
((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[PmlIndex].Valid = 1;
|
||||
((PHARDWARE_LEGACY_PTE)PageMap->PtePointer)[PmlIndex].Writable = 1;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
655
xtldr/config.c
Normal file
655
xtldr/config.c
Normal file
@@ -0,0 +1,655 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/config.c
|
||||
* DESCRIPTION: XT Boot Loader Configuration
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtldr.h>
|
||||
|
||||
|
||||
/**
|
||||
* Returns a boolean value of the specified configuration key.
|
||||
*
|
||||
* @param ConfigName
|
||||
* Specifies the configuration key to return its boolean representation.
|
||||
*
|
||||
* @return This routine returns a boolean representation of the configuration value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
BlGetConfigBooleanValue(IN CONST PWCHAR ConfigName)
|
||||
{
|
||||
PWCHAR Value;
|
||||
|
||||
/* Get config value */
|
||||
Value = BlGetConfigValue(ConfigName);
|
||||
|
||||
/* Check if option is enabled */
|
||||
if(RtlCompareWideStringInsensitive(Value, L"ENABLED", 0) == 0 ||
|
||||
RtlCompareWideStringInsensitive(Value, L"ON", 0) == 0 ||
|
||||
RtlCompareWideStringInsensitive(Value, L"TRUE", 0) == 0 ||
|
||||
RtlCompareWideStringInsensitive(Value, L"YES", 0) == 0)
|
||||
{
|
||||
/* This option is enabled */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Return FALSE by default */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a value of the specified configuration key.
|
||||
*
|
||||
* @param ConfigName
|
||||
* Specifies the configuration key to return its value.
|
||||
*
|
||||
* @return This routine returns a pointer to the configuration value, or NULL if key was not found.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
PWCHAR
|
||||
BlGetConfigValue(IN CONST PWCHAR ConfigName)
|
||||
{
|
||||
PXTBL_CONFIG_ENTRY ConfigEntry;
|
||||
PLIST_ENTRY ConfigListEntry;
|
||||
SIZE_T KeyLength, ValueLength;
|
||||
EFI_STATUS Status;
|
||||
PWCHAR Value;
|
||||
|
||||
/* Get config entry name length */
|
||||
KeyLength = RtlWideStringLength(ConfigName, 0);
|
||||
|
||||
/* Iterate through config entries */
|
||||
ConfigListEntry = BlpConfig.Flink;
|
||||
while(ConfigListEntry != &BlpConfig)
|
||||
{
|
||||
/* Get config entry */
|
||||
ConfigEntry = CONTAIN_RECORD(ConfigListEntry, XTBL_CONFIG_ENTRY, Flink);
|
||||
|
||||
/* Check if requested configuration found */
|
||||
if(RtlCompareWideStringInsensitive(ConfigEntry->Name, ConfigName, KeyLength) == 0)
|
||||
{
|
||||
/* Get value length */
|
||||
ValueLength = RtlWideStringLength(ConfigEntry->Value, 0);
|
||||
|
||||
/* Allocate memory for value */
|
||||
Status = BlAllocateMemoryPool((ValueLength + 1) * sizeof(WCHAR), (PVOID *)&Value);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure, return NULL */
|
||||
BlDebugPrint(L"ERROR: Memory allocation failure (Status Code: 0x%zX)\n", Status);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Copy value and return it */
|
||||
RtlCopyMemory(Value, ConfigEntry->Value, ValueLength * sizeof(WCHAR));
|
||||
Value[ValueLength] = L'\0';
|
||||
return Value;
|
||||
}
|
||||
|
||||
/* Move to the next config entry */
|
||||
ConfigListEntry = ConfigListEntry->Flink;
|
||||
}
|
||||
|
||||
/* Config entry not found, return NULL */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates existing configuration value.
|
||||
*
|
||||
* @param ConfigName
|
||||
* Specifies the configuration key to update.
|
||||
*
|
||||
* @param ConfigValue
|
||||
* Specifies the new configuration value.
|
||||
*
|
||||
* @return This routine returns status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlSetConfigValue(IN CONST PWCHAR ConfigName,
|
||||
IN CONST PWCHAR ConfigValue)
|
||||
{
|
||||
PXTBL_CONFIG_ENTRY ConfigEntry;
|
||||
PLIST_ENTRY ConfigListEntry;
|
||||
EFI_STATUS Status;
|
||||
SIZE_T Length;
|
||||
|
||||
/* Get config entry name length */
|
||||
Length = RtlWideStringLength(ConfigName, 0);
|
||||
|
||||
/* Iterate through config entries */
|
||||
ConfigListEntry = BlpConfig.Flink;
|
||||
while(ConfigListEntry != &BlpConfig)
|
||||
{
|
||||
/* Get config entry */
|
||||
ConfigEntry = CONTAIN_RECORD(ConfigListEntry, XTBL_CONFIG_ENTRY, Flink);
|
||||
|
||||
/* Check if requested configuration found */
|
||||
if(RtlCompareWideStringInsensitive(ConfigEntry->Name, ConfigName, Length) == 0)
|
||||
{
|
||||
/* Check new config value length */
|
||||
Length = RtlWideStringLength(ConfigValue, 0);
|
||||
|
||||
/* Reallocate memory for new config value */
|
||||
Status = BlFreeMemoryPool(ConfigEntry->Value);
|
||||
if(Status == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Successfully freed memory, allocate a new pool */
|
||||
Status = BlAllocateMemoryPool((Length + 1) * sizeof(WCHAR), (PVOID *)&ConfigEntry->Value);
|
||||
}
|
||||
|
||||
/* Check memory reallocation status */
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to reallocate memory */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Update config value */
|
||||
RtlCopyMemory(ConfigEntry->Value, ConfigValue, Length * sizeof(WCHAR));
|
||||
ConfigEntry->Value[Length] = L'\0';
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/* Move to the next config entry */
|
||||
ConfigListEntry = ConfigListEntry->Flink;
|
||||
}
|
||||
|
||||
/* Config entry not found */
|
||||
return STATUS_EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads and parses XTLDR configuration file.
|
||||
*
|
||||
* @return This routine returns status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlpLoadConfiguration()
|
||||
{
|
||||
PLIST_ENTRY SectionListEntry;
|
||||
EFI_STATUS Status;
|
||||
PCHAR ConfigData;
|
||||
|
||||
/* Initialize configuration pointer */
|
||||
RtlInitializeListHead(&BlpConfigSections);
|
||||
|
||||
/* Read data from configuration file */
|
||||
Status = BlpReadConfigFile(XTBL_LOADER_DIRECTORY_PATH, L"XTLDR.INI", &ConfigData);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to read config file, try with architecture specific directory */
|
||||
Status = BlpReadConfigFile(XTBL_ARCH_LOADER_DIRECTORY_PATH, L"XTLDR.INI", &ConfigData);
|
||||
}
|
||||
|
||||
/* Check if configuration was read successfully */
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to load configuration */
|
||||
BlDebugPrint(L"Failed to load FS0:/EFI/BOOT/XTLDR/XTLDR.INI configuration file (Status Code: 0x%zX)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Parse configuration data */
|
||||
Status = BlpParseConfigFile(ConfigData, &BlpConfigSections);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to parse configuration */
|
||||
BlDebugPrint(L"Failed to parse FS0:/EFI/BOOT/XTLDR/XTLDR.INI configuration file (Status Code: 0x%zX)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Iterate through config sections */
|
||||
SectionListEntry = BlpConfigSections.Flink;
|
||||
while(SectionListEntry != &BlpConfigSections)
|
||||
{
|
||||
/* Get config section */
|
||||
PXTBL_CONFIG_SECTION Section = CONTAIN_RECORD(SectionListEntry, XTBL_CONFIG_SECTION, Flink);
|
||||
|
||||
/* Look for global XTLDR configuration section */
|
||||
if(RtlCompareWideStringInsensitive(Section->SectionName, L"XTLDR", 5) == 0)
|
||||
{
|
||||
/* Update global configuration */
|
||||
BlpUpdateConfiguration(&Section->Options);
|
||||
|
||||
/* Remove XTLDR section from the list */
|
||||
RtlRemoveEntryList(SectionListEntry);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Move to the next section */
|
||||
SectionListEntry = SectionListEntry->Flink;
|
||||
}
|
||||
|
||||
/* Update boot menu OS list */
|
||||
BlpMenuList = &BlpConfigSections;
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses command line arguments and updates global configuration.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlpParseCommandLine(VOID)
|
||||
{
|
||||
EFI_GUID LIPGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID;
|
||||
PEFI_LOADED_IMAGE_PROTOCOL LoadedImage;
|
||||
PWCHAR Argument, Key, LastArg, Value;
|
||||
PXTBL_CONFIG_ENTRY Option;
|
||||
EFI_STATUS Status;
|
||||
SIZE_T KeyLength, ValueLength;
|
||||
LIST_ENTRY Config;
|
||||
|
||||
/* Initialize configuration list */
|
||||
RtlInitializeListHead(&Config);
|
||||
|
||||
/* Handle loaded image protocol */
|
||||
Status = EfiSystemTable->BootServices->HandleProtocol(EfiImageHandle, &LIPGuid, (PVOID *)&LoadedImage);
|
||||
if(Status == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Check if launched from UEFI shell */
|
||||
if(LoadedImage && LoadedImage->LoadOptions)
|
||||
{
|
||||
/* Tokenize provided options */
|
||||
Argument = RtlTokenizeWideString(LoadedImage->LoadOptions, L" ", &LastArg);
|
||||
|
||||
/* Iterate over all arguments passed to boot loader */
|
||||
while(Argument != NULL)
|
||||
{
|
||||
/* Store key name */
|
||||
Key = Argument;
|
||||
|
||||
/* Find end of the key */
|
||||
while(*Argument != L'=' && *Argument != L'\0' && *Argument != L'\n')
|
||||
{
|
||||
/* Advance to the next character */
|
||||
Argument++;
|
||||
}
|
||||
|
||||
/* Mark end of the key and advance to the next character */
|
||||
*Argument = L'\0';
|
||||
Argument++;
|
||||
|
||||
/* Store value */
|
||||
Value = Argument;
|
||||
|
||||
/* Find end of the value */
|
||||
while(*Argument != L'\0' && *Argument != L'\n')
|
||||
{
|
||||
/* Advance to the next character */
|
||||
Argument++;
|
||||
}
|
||||
|
||||
/* Mark end of the value and advance to the next character */
|
||||
*Argument = L'\0';
|
||||
Argument++;
|
||||
|
||||
/* Get length of the key and its value */
|
||||
KeyLength = RtlWideStringLength(Key, 0);
|
||||
ValueLength = RtlWideStringLength(Value, 0);
|
||||
|
||||
/* Check if argument is valid */
|
||||
if(KeyLength == 0 || ValueLength == 0)
|
||||
{
|
||||
/* Invalid argument, skip to the next one */
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Allocate memory for new option */
|
||||
Status = BlAllocateMemoryPool(sizeof(XTBL_CONFIG_ENTRY), (PVOID*)&Option);
|
||||
if(Status == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Allocate more memory for option name */
|
||||
Status = BlAllocateMemoryPool(sizeof(WCHAR) * (KeyLength + 1), (PVOID*)&Option->Name);
|
||||
if(Status == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Allocate even more memory for option value */
|
||||
Status = BlAllocateMemoryPool(sizeof(WCHAR) * (ValueLength + 1), (PVOID*)&Option->Value);
|
||||
}
|
||||
}
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Some memory allocation failed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Set entry name and value */
|
||||
RtlCopyMemory(Option->Name, Key, (KeyLength * sizeof(WCHAR)));
|
||||
RtlCopyMemory(Option->Value, Value, (ValueLength * sizeof(WCHAR)));
|
||||
Option->Name[KeyLength] = L'\0';
|
||||
Option->Value[ValueLength] = L'\0';
|
||||
|
||||
/* Add entry to the list */
|
||||
RtlInsertTailList(&Config, &Option->Flink);
|
||||
|
||||
/* Take next argument */
|
||||
Argument = RtlTokenizeWideString(NULL, L" ", &LastArg);
|
||||
}
|
||||
|
||||
/* Update global configuration */
|
||||
BlpUpdateConfiguration(&Config);
|
||||
}
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses configuration INI file.
|
||||
*
|
||||
* @param RawConfig
|
||||
* Suplies a pointer to configuration INI file to be parsed.
|
||||
*
|
||||
* @param Configuration
|
||||
* Supplies a pointer to memory region where parsed configuration will be stored.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlpParseConfigFile(IN CONST PCHAR RawConfig,
|
||||
OUT PLIST_ENTRY Configuration)
|
||||
{
|
||||
SIZE_T SectionLength, KeyLength, ValueLength;
|
||||
PCHAR InputData, Key, SectionName, Value;
|
||||
PXTBL_CONFIG_SECTION Section;
|
||||
PXTBL_CONFIG_ENTRY Option;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Initialize pointers */
|
||||
InputData = RawConfig;
|
||||
Section = NULL;
|
||||
Option = NULL;
|
||||
SectionName = NULL;
|
||||
Key = NULL;
|
||||
Value = NULL;
|
||||
|
||||
/* Analyze configuration data until end of file is reached */
|
||||
while(*InputData != '\0')
|
||||
{
|
||||
if(*InputData == ';' || *InputData == '#')
|
||||
{
|
||||
/* Skip comment until end of the line */
|
||||
while(*InputData != '\0' && *InputData != '\n')
|
||||
{
|
||||
/* Advance to the next character */
|
||||
InputData++;
|
||||
}
|
||||
}
|
||||
else if(*InputData == ' ' || *InputData == '\t' || *InputData == '\r' || *InputData == '\n')
|
||||
{
|
||||
/* Skip whitespaces */
|
||||
InputData++;
|
||||
}
|
||||
else if(*InputData == '[')
|
||||
{
|
||||
/* Skip leading bracket */
|
||||
InputData++;
|
||||
|
||||
/* Store section name */
|
||||
SectionName = InputData;
|
||||
|
||||
/* Find end of the section name */
|
||||
while(*InputData != ']' && *InputData != '\0' && *InputData != '\n')
|
||||
{
|
||||
/* Advance to the next character */
|
||||
InputData++;
|
||||
}
|
||||
|
||||
/* Check if end of the section name is reached */
|
||||
if(*InputData != ']')
|
||||
{
|
||||
/* Section name does not end */
|
||||
return STATUS_EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* Mark end of the section name and advance to the next character */
|
||||
*InputData = '\0';
|
||||
InputData++;
|
||||
|
||||
/* Remove leading and trailing spaces from section name */
|
||||
SectionName = RtlTrimString(SectionName);
|
||||
|
||||
/* Find length of the section name */
|
||||
SectionLength = RtlStringLength(SectionName, 0);
|
||||
|
||||
/* Allocate memory for new section */
|
||||
Status = BlAllocateMemoryPool(sizeof(XTBL_CONFIG_SECTION), (PVOID*)&Section);
|
||||
if(Status == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Allocate more memory for section name */
|
||||
Status = BlAllocateMemoryPool(sizeof(WCHAR) * (SectionLength + 1), (PVOID*)&Section->SectionName);
|
||||
}
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Some memory allocation failed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Initialize new section and convert its name to wide string */
|
||||
RtlInitializeListHead(&Section->Options);
|
||||
RtlStringToWideString(Section->SectionName, &SectionName, SectionLength);
|
||||
|
||||
/* Ensure string is NULL-terminated and add new section to the configuration list */
|
||||
Section->SectionName[SectionLength] = L'\0';
|
||||
RtlInsertTailList(Configuration, &Section->Flink);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Store key */
|
||||
Key = InputData;
|
||||
|
||||
/* Find end of the key */
|
||||
while(*InputData != '=' && *InputData != '\0' && *InputData != '\n')
|
||||
{
|
||||
/* Advance to the next character */
|
||||
InputData++;
|
||||
}
|
||||
|
||||
/* Check if end of the key is reached */
|
||||
if(*InputData != '=')
|
||||
{
|
||||
/* Key name does not end */
|
||||
return STATUS_EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* Mark end of the key and advance to the next character */
|
||||
*InputData = 0;
|
||||
InputData++;
|
||||
|
||||
/* Skip all leading spaces in the value */
|
||||
while(*InputData == ' ')
|
||||
{
|
||||
/* Advance to the next character */
|
||||
InputData++;
|
||||
}
|
||||
|
||||
/* Store value */
|
||||
Value = InputData;
|
||||
|
||||
/* Find end of the value */
|
||||
while(*InputData != '\0' && *InputData != '\n')
|
||||
{
|
||||
/* Advance to the next character */
|
||||
InputData++;
|
||||
}
|
||||
|
||||
/* Mark end of the value and advance to the next character */
|
||||
*InputData = 0;
|
||||
InputData++;
|
||||
|
||||
/* Remove leading and trailing spaces from key and value */
|
||||
Key = RtlTrimString(Key);
|
||||
Value = RtlTrimString(Value);
|
||||
|
||||
/* Find length of the key and its value */
|
||||
KeyLength = RtlStringLength(Key, 0);
|
||||
ValueLength = RtlStringLength(Value, 0);
|
||||
|
||||
/* Allocate memory for new option */
|
||||
Status = BlAllocateMemoryPool(sizeof(XTBL_CONFIG_ENTRY), (PVOID*)&Option);
|
||||
if(Status == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Allocate more memory for option name */
|
||||
Status = BlAllocateMemoryPool(sizeof(WCHAR) * (KeyLength + 1), (PVOID*)&Option->Name);
|
||||
if(Status == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Allocate even more memory for option value */
|
||||
Status = BlAllocateMemoryPool(sizeof(WCHAR) * (ValueLength + 1), (PVOID*)&Option->Value);
|
||||
}
|
||||
}
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Some memory allocation failed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Remove leading quotes from the value */
|
||||
if(*Value == '"' || *Value == '\'')
|
||||
{
|
||||
Value++;
|
||||
}
|
||||
|
||||
/* Remove trailing quotes from the value */
|
||||
if(Value[ValueLength - 2] == '"' || Value[ValueLength - 2] == '\'')
|
||||
{
|
||||
Value[ValueLength - 2] = '\0';
|
||||
}
|
||||
|
||||
/* Convert key and value to wide strings */
|
||||
RtlStringToWideString(Option->Name, &Key, RtlStringLength(Key, 0) + 1);
|
||||
RtlStringToWideString(Option->Value, &Value, RtlStringLength(Value, 0) + 1);
|
||||
|
||||
/* Ensure strings are NULL-terminated and add new option to the list */
|
||||
Option->Name[KeyLength] = L'\0';
|
||||
Option->Value[ValueLength] = L'\0';
|
||||
RtlInsertTailList(&Section->Options, &Option->Flink);
|
||||
}
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads configuration file from the specified directory on the FS0:/ drive.
|
||||
*
|
||||
* @param ConfigDirectory
|
||||
* Specifies a path to the directory containing the configuration file.
|
||||
*
|
||||
* @param ConfigFile
|
||||
* Specifies the name of the configuration file.
|
||||
*
|
||||
* @param ConfigData
|
||||
* Provides a buffer to store the data read from the configuration file.
|
||||
*
|
||||
* @return This routine returns status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlpReadConfigFile(IN CONST PWCHAR ConfigDirectory,
|
||||
IN CONST PWCHAR ConfigFile,
|
||||
OUT PCHAR *ConfigData)
|
||||
{
|
||||
PEFI_FILE_HANDLE DirHandle, FsHandle;
|
||||
EFI_HANDLE DiskHandle;
|
||||
EFI_STATUS Status;
|
||||
SIZE_T FileSize;
|
||||
|
||||
/* Open EFI volume */
|
||||
Status = BlOpenVolume(NULL, &DiskHandle, &FsHandle);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to open a volume */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Open specified directory, containing the configuration file and close the FS immediately */
|
||||
Status = FsHandle->Open(FsHandle, &DirHandle, ConfigDirectory, EFI_FILE_MODE_READ, 0);
|
||||
FsHandle->Close(FsHandle);
|
||||
|
||||
/* Check if directory opened successfully */
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to open directory */
|
||||
BlCloseVolume(DiskHandle);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Read configuration file and close directory */
|
||||
Status = BlReadFile(DirHandle, ConfigFile, (PVOID *)ConfigData, &FileSize);
|
||||
DirHandle->Close(DirHandle);
|
||||
|
||||
/* Close EFI volume */
|
||||
BlCloseVolume(DiskHandle);
|
||||
|
||||
/* Return read status */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds new XTLDR configuration entries to the global configuration list. Existing entries are not overwritten.
|
||||
*
|
||||
* @param NewConfig
|
||||
* Supplies a pointer to a linked list containing new configuration entries.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
BlpUpdateConfiguration(IN PLIST_ENTRY NewConfig)
|
||||
{
|
||||
PXTBL_CONFIG_ENTRY ConfigEntry;
|
||||
PLIST_ENTRY ConfigListEntry, NextListEntry;
|
||||
|
||||
/* Iterate through new config entries */
|
||||
ConfigListEntry = NewConfig->Flink;
|
||||
while(ConfigListEntry != NewConfig)
|
||||
{
|
||||
/* Get new config entry */
|
||||
ConfigEntry = CONTAIN_RECORD(ConfigListEntry, XTBL_CONFIG_ENTRY, Flink);
|
||||
|
||||
/* Get next config entry */
|
||||
NextListEntry = ConfigListEntry->Flink;
|
||||
|
||||
/* Make sure config entry does not exist yet */
|
||||
if(BlGetConfigValue(ConfigEntry->Name) == NULL)
|
||||
{
|
||||
/* Remove new config entry from input list and put it into global config list */
|
||||
RtlRemoveEntryList(&ConfigEntry->Flink);
|
||||
RtlInsertTailList(&BlpConfig, &ConfigEntry->Flink);
|
||||
}
|
||||
|
||||
/* Move to the next new config entry */
|
||||
ConfigListEntry = NextListEntry;
|
||||
}
|
||||
}
|
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/console.cc
|
||||
* FILE: xtldr/console.c
|
||||
* DESCRIPTION: EFI console support
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtldr.hh>
|
||||
#include <xtldr.h>
|
||||
|
||||
|
||||
/**
|
||||
@@ -21,19 +21,19 @@
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Console::ClearLine(IN ULONGLONG LineNo)
|
||||
BlClearConsoleLine(IN ULONGLONG LineNo)
|
||||
{
|
||||
UINT_PTR Index, ResX, ResY;
|
||||
|
||||
/* Query console mode */
|
||||
QueryMode(&ResX, &ResY);
|
||||
BlQueryConsoleMode(&ResX, &ResY);
|
||||
|
||||
/* Set cursor position and clear line */
|
||||
SetCursorPosition(0, LineNo);
|
||||
BlSetCursorPosition(0, LineNo);
|
||||
for(Index = 0; Index < ResX; Index++)
|
||||
{
|
||||
/* Clear line */
|
||||
Write(L" ");
|
||||
BlConsoleWrite(L" ");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,10 +46,10 @@ Console::ClearLine(IN ULONGLONG LineNo)
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Console::ClearScreen()
|
||||
BlClearConsoleScreen()
|
||||
{
|
||||
/* Clear screen */
|
||||
XtLoader::GetEfiSystemTable()->ConOut->ClearScreen(XtLoader::GetEfiSystemTable()->ConOut);
|
||||
EfiSystemTable->ConOut->ClearScreen(EfiSystemTable->ConOut);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -61,9 +61,9 @@ Console::ClearScreen()
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Console::DisableCursor()
|
||||
BlDisableConsoleCursor()
|
||||
{
|
||||
XtLoader::GetEfiSystemTable()->ConOut->EnableCursor(XtLoader::GetEfiSystemTable()->ConOut, FALSE);
|
||||
EfiSystemTable->ConOut->EnableCursor(EfiSystemTable->ConOut, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -75,39 +75,9 @@ Console::DisableCursor()
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Console::EnableCursor()
|
||||
BlEnableConsoleCursor()
|
||||
{
|
||||
XtLoader::GetEfiSystemTable()->ConOut->EnableCursor(XtLoader::GetEfiSystemTable()->ConOut, TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* This routine initializes the EFI console.
|
||||
*
|
||||
* @return This routine returns status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Console::InitializeConsole()
|
||||
{
|
||||
/* Clear console buffers */
|
||||
XtLoader::GetEfiSystemTable()->ConIn->Reset(XtLoader::GetEfiSystemTable()->ConIn, TRUE);
|
||||
XtLoader::GetEfiSystemTable()->ConOut->Reset(XtLoader::GetEfiSystemTable()->ConOut, TRUE);
|
||||
XtLoader::GetEfiSystemTable()->StdErr->Reset(XtLoader::GetEfiSystemTable()->StdErr, TRUE);
|
||||
|
||||
/* Make sure that current console mode is 80x25 characters, as some broken EFI implementations might
|
||||
* set different mode that do not fit on the screen, causing a text to be displayed offscreen */
|
||||
if(XtLoader::GetEfiSystemTable()->ConOut->Mode->Mode != 0)
|
||||
{
|
||||
/* Set console mode to 0, which is standard, 80x25 text mode */
|
||||
SetMode(0);
|
||||
}
|
||||
|
||||
/* Clear screen and enable cursor */
|
||||
SetAttributes(EFI_TEXT_BGCOLOR_BLACK | EFI_TEXT_FGCOLOR_LIGHTGRAY);
|
||||
ClearScreen();
|
||||
EnableCursor();
|
||||
EfiSystemTable->ConOut->EnableCursor(EfiSystemTable->ConOut, TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -125,30 +95,30 @@ Console::InitializeConsole()
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Console::Print(IN PCWSTR Format,
|
||||
BlConsolePrint(IN PUSHORT Format,
|
||||
IN ...)
|
||||
{
|
||||
RTL_PRINT_CONTEXT ConsolePrintContext, SerialPrintContext;
|
||||
VA_LIST Arguments;
|
||||
|
||||
/* Initialise the print contexts */
|
||||
ConsolePrintContext.WriteWideCharacter = PutChar;
|
||||
SerialPrintContext.WriteWideCharacter = Debug::PutChar;
|
||||
ConsolePrintContext.WriteWideCharacter = BlpConsolePutChar;
|
||||
SerialPrintContext.WriteWideCharacter = BlpDebugPutChar;
|
||||
|
||||
/* Initialise the va_list */
|
||||
VA_START(Arguments, Format);
|
||||
|
||||
/* Format and print the string to the stdout */
|
||||
RTL::WideString::FormatWideString(&ConsolePrintContext, (PWCHAR)Format, Arguments);
|
||||
RtlFormatWideString(&ConsolePrintContext, (PWCHAR)Format, Arguments);
|
||||
|
||||
/* Print to serial console only if not running under OVMF */
|
||||
if(RTL::WideString::CompareWideString(XtLoader::GetEfiSystemTable()->FirmwareVendor, L"EDK II", 6) != 0)
|
||||
if(RtlCompareWideString(EfiSystemTable->FirmwareVendor, L"EDK II", 6) != 0)
|
||||
{
|
||||
/* Check if debugging enabled and if EFI serial port is fully initialized */
|
||||
if(DEBUG && Debug::SerialPortReady())
|
||||
if(DEBUG && (BlpStatus.SerialPort.Flags & COMPORT_FLAG_INIT))
|
||||
{
|
||||
/* Format and print the string to the serial console */
|
||||
RTL::WideString::FormatWideString(&SerialPrintContext, (PWCHAR)Format, Arguments);
|
||||
RtlFormatWideString(&SerialPrintContext, (PWCHAR)Format, Arguments);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,35 +127,50 @@ Console::Print(IN PCWSTR Format,
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a character to the default EFI console.
|
||||
* Displays the string on the device at the current cursor location.
|
||||
*
|
||||
* @param Character
|
||||
* The integer promotion of the character to be written.
|
||||
* @param String
|
||||
* The string to be displayed.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
XTSTATUS
|
||||
Console::PutChar(IN WCHAR Character)
|
||||
VOID
|
||||
BlConsoleWrite(IN PUSHORT String)
|
||||
{
|
||||
WCHAR Buffer[2];
|
||||
|
||||
/* Check if character is a newline ('\n') */
|
||||
if(Character == L'\n')
|
||||
{
|
||||
/* Print carriage return ('\r') as well */
|
||||
PutChar(L'\r');
|
||||
EfiSystemTable->ConOut->OutputString(EfiSystemTable->ConOut, String);
|
||||
}
|
||||
|
||||
/* Write character to the screen console */
|
||||
Buffer[0] = Character;
|
||||
Buffer[1] = 0;
|
||||
XtLoader::GetEfiSystemTable()->ConOut->OutputString(XtLoader::GetEfiSystemTable()->ConOut, Buffer);
|
||||
/**
|
||||
* This routine initializes the EFI console.
|
||||
*
|
||||
* @return This routine returns status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
BlInitializeConsole()
|
||||
{
|
||||
/* Clear console buffers */
|
||||
EfiSystemTable->ConIn->Reset(EfiSystemTable->ConIn, TRUE);
|
||||
EfiSystemTable->ConOut->Reset(EfiSystemTable->ConOut, TRUE);
|
||||
EfiSystemTable->StdErr->Reset(EfiSystemTable->StdErr, TRUE);
|
||||
|
||||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
/* Make sure that current console mode is 80x25 characters, as some broken EFI implementations might
|
||||
* set different mode that do not fit on the screen, causing a text to be displayed offscreen */
|
||||
if(EfiSystemTable->ConOut->Mode->Mode != 0)
|
||||
{
|
||||
/* Set console mode to 0, which is standard, 80x25 text mode */
|
||||
BlSetConsoleMode(0);
|
||||
}
|
||||
|
||||
/* Clear screen and enable cursor */
|
||||
BlSetConsoleAttributes(EFI_TEXT_BGCOLOR_BLACK | EFI_TEXT_FGCOLOR_LIGHTGRAY);
|
||||
BlClearConsoleScreen();
|
||||
BlEnableConsoleCursor();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -203,11 +188,10 @@ Console::PutChar(IN WCHAR Character)
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Console::QueryMode(OUT PUINT_PTR ResX,
|
||||
BlQueryConsoleMode(OUT PUINT_PTR ResX,
|
||||
OUT PUINT_PTR ResY)
|
||||
{
|
||||
XtLoader::GetEfiSystemTable()->ConOut->QueryMode(XtLoader::GetEfiSystemTable()->ConOut,
|
||||
XtLoader::GetEfiSystemTable()->ConOut->Mode->Mode, ResX, ResY);
|
||||
EfiSystemTable->ConOut->QueryMode(EfiSystemTable->ConOut, EfiSystemTable->ConOut->Mode->Mode, ResX, ResY);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -222,9 +206,9 @@ Console::QueryMode(OUT PUINT_PTR ResX,
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Console::ReadKeyStroke(OUT PEFI_INPUT_KEY Key)
|
||||
BlReadKeyStroke(OUT PEFI_INPUT_KEY Key)
|
||||
{
|
||||
XtLoader::GetEfiSystemTable()->ConIn->ReadKeyStroke(XtLoader::GetEfiSystemTable()->ConIn, Key);
|
||||
EfiSystemTable->ConIn->ReadKeyStroke(EfiSystemTable->ConIn, Key);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -236,9 +220,9 @@ Console::ReadKeyStroke(OUT PEFI_INPUT_KEY Key)
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Console::ResetInputBuffer()
|
||||
BlResetConsoleInputBuffer()
|
||||
{
|
||||
XtLoader::GetEfiSystemTable()->ConIn->Reset(XtLoader::GetEfiSystemTable()->ConIn, FALSE);
|
||||
EfiSystemTable->ConIn->Reset(EfiSystemTable->ConIn, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -253,9 +237,26 @@ Console::ResetInputBuffer()
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Console::SetAttributes(IN ULONGLONG Attributes)
|
||||
BlSetConsoleAttributes(IN ULONGLONG Attributes)
|
||||
{
|
||||
XtLoader::GetEfiSystemTable()->ConOut->SetAttribute(XtLoader::GetEfiSystemTable()->ConOut, Attributes);
|
||||
EfiSystemTable->ConOut->SetAttribute(EfiSystemTable->ConOut, Attributes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the output console device to the requested mode.
|
||||
*
|
||||
* @param Mode
|
||||
* Supplies a text mode number to set.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlSetConsoleMode(IN ULONGLONG Mode)
|
||||
{
|
||||
return EfiSystemTable->ConOut->SetMode(EfiSystemTable->ConOut, Mode);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -273,42 +274,40 @@ Console::SetAttributes(IN ULONGLONG Attributes)
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Console::SetCursorPosition(IN ULONGLONG PosX,
|
||||
BlSetCursorPosition(IN ULONGLONG PosX,
|
||||
IN ULONGLONG PosY)
|
||||
{
|
||||
XtLoader::GetEfiSystemTable()->ConOut->SetCursorPosition(XtLoader::GetEfiSystemTable()->ConOut, PosX, PosY);
|
||||
EfiSystemTable->ConOut->SetCursorPosition(EfiSystemTable->ConOut, PosX, PosY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the output console device to the requested mode.
|
||||
* Writes a character to the default EFI console.
|
||||
*
|
||||
* @param Mode
|
||||
* Supplies a text mode number to set.
|
||||
* @param Character
|
||||
* The integer promotion of the character to be written.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
Console::SetMode(IN ULONGLONG Mode)
|
||||
XTSTATUS
|
||||
BlpConsolePutChar(IN USHORT Character)
|
||||
{
|
||||
return XtLoader::GetEfiSystemTable()->ConOut->SetMode(XtLoader::GetEfiSystemTable()->ConOut, Mode);
|
||||
USHORT Buffer[2];
|
||||
|
||||
/* Check if character is a newline ('\n') */
|
||||
if(Character == L'\n')
|
||||
{
|
||||
/* Print carriage return ('\r') as well */
|
||||
BlpConsolePutChar(L'\r');
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays the string on the device at the current cursor location.
|
||||
*
|
||||
* @param String
|
||||
* The string to be displayed.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Console::Write(IN PCWSTR String)
|
||||
{
|
||||
XtLoader::GetEfiSystemTable()->ConOut->OutputString(XtLoader::GetEfiSystemTable()->ConOut, (PWSTR)String);
|
||||
/* Write character to the screen console */
|
||||
Buffer[0] = Character;
|
||||
Buffer[1] = 0;
|
||||
EfiSystemTable->ConOut->OutputString(EfiSystemTable->ConOut, Buffer);
|
||||
|
||||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
270
xtldr/debug.c
Normal file
270
xtldr/debug.c
Normal file
@@ -0,0 +1,270 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/debug.c
|
||||
* DESCRIPTION: XT Boot Loader debugging support
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtldr.h>
|
||||
|
||||
|
||||
/**
|
||||
* This routine formats the input string and prints it out to the debug ports.
|
||||
*
|
||||
* @param Format
|
||||
* The formatted string that is to be written to the output.
|
||||
*
|
||||
* @param ...
|
||||
* Depending on the format string, this routine might expect a sequence of additional arguments.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
BlDebugPrint(IN PUSHORT Format,
|
||||
IN ...)
|
||||
{
|
||||
RTL_PRINT_CONTEXT ConsolePrintContext, SerialPrintContext;
|
||||
VA_LIST Arguments;
|
||||
|
||||
/* Check if debugging enabled and if EFI serial port is fully initialized */
|
||||
if(DEBUG)
|
||||
{
|
||||
/* Initialize the print contexts */
|
||||
ConsolePrintContext.WriteWideCharacter = BlpConsolePutChar;
|
||||
SerialPrintContext.WriteWideCharacter = BlpDebugPutChar;
|
||||
|
||||
/* Initialise the va_list */
|
||||
VA_START(Arguments, Format);
|
||||
|
||||
/* Check if serial debug port is enabled */
|
||||
if((BlpStatus.DebugPort & XTBL_DEBUGPORT_SERIAL) && (BlpStatus.SerialPort.Flags & COMPORT_FLAG_INIT))
|
||||
{
|
||||
/* Format and print the string to the serial console */
|
||||
RtlFormatWideString(&SerialPrintContext, (PWCHAR)Format, Arguments);
|
||||
}
|
||||
|
||||
/* Check if screen debug port is enabled and Boot Services are still available */
|
||||
if((BlpStatus.DebugPort & XTBL_DEBUGPORT_SCREEN) && (BlpStatus.BootServices == TRUE))
|
||||
{
|
||||
/* Format and print the string to the screen */
|
||||
RtlFormatWideString(&ConsolePrintContext, (PWCHAR)Format, Arguments);
|
||||
}
|
||||
|
||||
/* Clean up the va_list */
|
||||
VA_END(Arguments);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a character to the serial console.
|
||||
*
|
||||
* @param Character
|
||||
* The integer promotion of the character to be written.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
XTSTATUS
|
||||
BlpDebugPutChar(IN USHORT Character)
|
||||
{
|
||||
USHORT Buffer[2];
|
||||
|
||||
/* Write character to the serial console */
|
||||
Buffer[0] = Character;
|
||||
Buffer[1] = 0;
|
||||
HlComPortPutByte(&BlpStatus.SerialPort, Buffer[0]);
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* This routine initializes the XTLDR debug console.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlpInitializeDebugConsole()
|
||||
{
|
||||
ULONG PortAddress, PortNumber, BaudRate;
|
||||
PWCHAR DebugConfiguration, DebugPort, LastPort;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Set default serial port options */
|
||||
PortAddress = 0;
|
||||
PortNumber = 0;
|
||||
BaudRate = 0;
|
||||
|
||||
/* Get debug configuration */
|
||||
DebugConfiguration = BlGetConfigValue(L"DEBUG");
|
||||
|
||||
/* Make sure any debug options are provided and debug console is not initialized yet */
|
||||
if(DebugConfiguration && BlpStatus.DebugPort == 0)
|
||||
{
|
||||
/* Find all debug ports */
|
||||
DebugPort = RtlTokenizeWideString(DebugConfiguration, L";", &LastPort);
|
||||
|
||||
/* Iterate over all debug ports */
|
||||
while(DebugPort != NULL)
|
||||
{
|
||||
/* Check what port is set for debugging */
|
||||
if(RtlCompareWideStringInsensitive(DebugPort, L"COM", 3) == 0)
|
||||
{
|
||||
/* Read COM port number */
|
||||
DebugPort += 3;
|
||||
while(*DebugPort >= '0' && *DebugPort <= '9')
|
||||
{
|
||||
/* Get port number */
|
||||
PortNumber *= 10;
|
||||
PortNumber += *DebugPort - '0';
|
||||
DebugPort++;
|
||||
}
|
||||
|
||||
/* Check if custom COM port address supplied */
|
||||
if(PortNumber == 0 && RtlCompareWideStringInsensitive(DebugPort, L":0x", 3) == 0)
|
||||
{
|
||||
/* COM port address provided */
|
||||
DebugPort += 3;
|
||||
while((*DebugPort >= '0' && *DebugPort <= '9') ||
|
||||
(*DebugPort >= 'A' && *DebugPort <= 'F') ||
|
||||
(*DebugPort >= 'a' && *DebugPort <= 'f'))
|
||||
{
|
||||
/* Get port address */
|
||||
PortAddress *= 16;
|
||||
if(*DebugPort >= '0' && *DebugPort <= '9')
|
||||
{
|
||||
PortAddress += *DebugPort - '0';
|
||||
}
|
||||
else if(*DebugPort >= 'A' && *DebugPort <= 'F')
|
||||
{
|
||||
PortAddress += *DebugPort - 'A' + 10;
|
||||
}
|
||||
else if(*DebugPort >= 'a' && *DebugPort <= 'f')
|
||||
{
|
||||
PortAddress += *DebugPort - 'a' + 10;
|
||||
}
|
||||
DebugPort++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Look for additional COM port parameters */
|
||||
if(*DebugPort == ',')
|
||||
{
|
||||
/* Baud rate provided */
|
||||
DebugPort++;
|
||||
while(*DebugPort >= '0' && *DebugPort <= '9')
|
||||
{
|
||||
/* Get baud rate */
|
||||
BaudRate *= 10;
|
||||
BaudRate += *DebugPort - '0';
|
||||
DebugPort++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Enable debug port */
|
||||
BlpStatus.DebugPort |= XTBL_DEBUGPORT_SERIAL;
|
||||
}
|
||||
else if(RtlCompareWideStringInsensitive(DebugPort, L"SCREEN", 5) == 0)
|
||||
{
|
||||
/* Enable debug port */
|
||||
BlpStatus.DebugPort |= XTBL_DEBUGPORT_SCREEN;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Unsupported debug port specified */
|
||||
BlConsolePrint(L"ERROR: Unsupported debug port ('%S') specified\n", DebugPort);
|
||||
BlSleepExecution(3000);
|
||||
}
|
||||
|
||||
/* Take next debug port */
|
||||
DebugPort = RtlTokenizeWideString(NULL, L";", &LastPort);
|
||||
}
|
||||
|
||||
/* Check if serial debug port is enabled */
|
||||
if(BlpStatus.DebugPort & XTBL_DEBUGPORT_SERIAL)
|
||||
{
|
||||
/* Try to initialize COM port */
|
||||
Status = BlpInitializeSerialPort(PortNumber, PortAddress, BaudRate);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Remove serial debug port, as COM port initialization failed and return */
|
||||
BlpStatus.DebugPort &= ~XTBL_DEBUGPORT_SERIAL;
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* This routine initializes the serial debug console.
|
||||
*
|
||||
* @param PortNumber
|
||||
* Supplies a port number.
|
||||
*
|
||||
* @param PortAddress
|
||||
* Supplies an address of the COM port.
|
||||
*
|
||||
* @param BaudRate
|
||||
* Supplies an optional port baud rate.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
BlpInitializeSerialPort(IN ULONG PortNumber,
|
||||
IN ULONG PortAddress,
|
||||
IN ULONG BaudRate)
|
||||
{
|
||||
EFI_STATUS EfiStatus;
|
||||
XTSTATUS Status;
|
||||
|
||||
/* Print debug message depending on port settings */
|
||||
if(PortAddress)
|
||||
{
|
||||
BlConsolePrint(L"Initializing serial console at COM port address: 0x%lX\n", PortAddress);
|
||||
}
|
||||
else
|
||||
{
|
||||
BlConsolePrint(L"Initializing serial console at port COM%d\n", PortNumber);
|
||||
}
|
||||
|
||||
/* Initialize COM port */
|
||||
Status = HlInitializeComPort(&BlpStatus.SerialPort, PortNumber, UlongToPtr(PortAddress), BaudRate);
|
||||
|
||||
/* Port not found under supplied address */
|
||||
if(Status == STATUS_NOT_FOUND && PortAddress)
|
||||
{
|
||||
/* This might be PCI(E) serial controller, try to activate I/O space access first */
|
||||
EfiStatus = BlpActivateSerialIOController();
|
||||
if(EfiStatus == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Try to reinitialize COM port */
|
||||
BlConsolePrint(L"Enabled I/O space access for all PCI(E) serial controllers found\n");
|
||||
Status = HlInitializeComPort(&BlpStatus.SerialPort, PortNumber, UlongToPtr(PortAddress), BaudRate);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check COM port initialization status code */
|
||||
if(Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* Serial port initialization failed, mark as not ready */
|
||||
return STATUS_EFI_NOT_READY;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/efiutils.cc
|
||||
* FILE: xtldr/efiutils.c
|
||||
* DESCRIPTION: EFI related routines for XT Boot Loader
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtldr.hh>
|
||||
#include <xtldr.h>
|
||||
|
||||
|
||||
/**
|
||||
@@ -18,35 +18,29 @@
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
EfiUtils::EnterFirmwareSetup()
|
||||
BlEnterFirmwareSetup()
|
||||
{
|
||||
EFI_GUID Guid = EFI_GLOBAL_VARIABLE_GUID;
|
||||
PULONGLONG SetupSupport = NULLPTR;
|
||||
PULONGLONG SetupSupport;
|
||||
ULONGLONG Indications;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Check if booting into firmware interface is supported */
|
||||
Status = GetEfiVariable(&Guid, L"OsIndicationsSupported", (PVOID*)&SetupSupport);
|
||||
Status = BlGetEfiVariable(&Guid, L"OsIndicationsSupported", (PVOID*)&SetupSupport);
|
||||
if(Status != STATUS_EFI_SUCCESS || !(*SetupSupport & EFI_OS_INDICATIONS_BOOT_TO_FW_UI))
|
||||
{
|
||||
/* Reboot into firmware setup is not supported */
|
||||
Debug::Print(L"WARNING: Reboot into firmware setup interface not supported\n");
|
||||
if(SetupSupport)
|
||||
{
|
||||
Memory::FreePool((PVOID)SetupSupport);
|
||||
}
|
||||
BlDebugPrint(L"WARNING: Reboot into firmware setup interface not supported\n");
|
||||
return STATUS_EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
Memory::FreePool((PVOID)SetupSupport);
|
||||
|
||||
/* Get the value of OsIndications variable */
|
||||
Indications = 0;
|
||||
Status = GetEfiVariable(&Guid, L"OsIndications", (PVOID*)&Indications);
|
||||
Status = BlGetEfiVariable(&Guid, L"OsIndications", (PVOID)&Indications);
|
||||
|
||||
/* Enable FW setup on next boot */
|
||||
Indications |= EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
|
||||
Status = SetEfiVariable(&Guid, L"OsIndications", (PVOID)&Indications, sizeof(Indications));
|
||||
Status = BlSetEfiVariable(&Guid, L"OsIndications", (PVOID)&Indications, sizeof(Indications));
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to update OsIndications variable */
|
||||
@@ -54,7 +48,7 @@ EfiUtils::EnterFirmwareSetup()
|
||||
}
|
||||
|
||||
/* Reboot into firmware setup */
|
||||
RebootSystem();
|
||||
BlRebootSystem();
|
||||
|
||||
/* Must not reach this point, just make the compiler happy */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
@@ -69,33 +63,33 @@ EfiUtils::EnterFirmwareSetup()
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
EfiUtils::ExitBootServices()
|
||||
BlExitBootServices()
|
||||
{
|
||||
PEFI_MEMORY_MAP MemoryMap;
|
||||
EFI_STATUS Status;
|
||||
ULONG Counter;
|
||||
|
||||
/* Boot Services might be partially shutdown, so mark them as unavailable */
|
||||
XtLoader::DisableBootServices();
|
||||
BlpStatus.BootServices = FALSE;
|
||||
|
||||
/* Allocate buffer for EFI memory map */
|
||||
Status = Memory::AllocatePool(sizeof(EFI_MEMORY_MAP), (PVOID*)&MemoryMap);
|
||||
Status = BlAllocateMemoryPool(sizeof(EFI_MEMORY_MAP), (PVOID*)&MemoryMap);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure */
|
||||
Debug::Print(L"ERROR: Memory allocation failure (Status Code: 0x%zX)\n", Status);
|
||||
BlDebugPrint(L"ERROR: Memory allocation failure (Status Code: 0x%zX)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Zero fill the buffer and initialize counter */
|
||||
RTL::Memory::ZeroMemory(MemoryMap, sizeof(EFI_MEMORY_MAP));
|
||||
RtlZeroMemory(MemoryMap, sizeof(EFI_MEMORY_MAP));
|
||||
Counter = 0xFF;
|
||||
|
||||
/* Attempt to exit boot services */
|
||||
while(Counter > 0)
|
||||
{
|
||||
/* Get memory map each time as it can change between two calls */
|
||||
Status = Memory::GetMemoryMap(MemoryMap);
|
||||
Status = BlGetMemoryMap(MemoryMap);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to get new memory map */
|
||||
@@ -103,8 +97,7 @@ EfiUtils::ExitBootServices()
|
||||
}
|
||||
|
||||
/* Exit boot services */
|
||||
Status = XtLoader::GetEfiSystemTable()->BootServices->ExitBootServices(XtLoader::GetEfiImageHandle(),
|
||||
MemoryMap->MapKey);
|
||||
Status = EfiSystemTable->BootServices->ExitBootServices(EfiImageHandle, MemoryMap->MapKey);
|
||||
if(Status == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
break;
|
||||
@@ -133,26 +126,25 @@ EfiUtils::ExitBootServices()
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
EfiUtils::GetConfigurationTable(IN PEFI_GUID TableGuid,
|
||||
BlGetConfigurationTable(IN PEFI_GUID TableGuid,
|
||||
OUT PVOID *Table)
|
||||
{
|
||||
SIZE_T Index;
|
||||
|
||||
/* Iterate through all system configuration tables */
|
||||
for(Index = 0; Index < XtLoader::GetEfiSystemTable()->NumberOfTableEntries; Index++)
|
||||
for(Index = 0; Index < EfiSystemTable->NumberOfTableEntries; Index++)
|
||||
{
|
||||
/* Check if this table matches requested table */
|
||||
if(RTL::Guid::CompareGuids((PGUID)&(XtLoader::GetEfiSystemTable()->ConfigurationTable[Index].VendorGuid),
|
||||
(PGUID)TableGuid))
|
||||
if(RtlCompareGuids((PGUID)&(EfiSystemTable->ConfigurationTable[Index].VendorGuid), (PGUID)TableGuid))
|
||||
{
|
||||
/* Found requested table, return success */
|
||||
*Table = XtLoader::GetEfiSystemTable()->ConfigurationTable[Index].VendorTable;
|
||||
*Table = EfiSystemTable->ConfigurationTable[Index].VendorTable;
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
/* Table not found */
|
||||
*Table = NULLPTR;
|
||||
*Table = NULL;
|
||||
return STATUS_EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
@@ -174,17 +166,17 @@ EfiUtils::GetConfigurationTable(IN PEFI_GUID TableGuid,
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
EfiUtils::GetEfiVariable(IN PEFI_GUID Vendor,
|
||||
IN PCWSTR VariableName,
|
||||
BlGetEfiVariable(IN PEFI_GUID Vendor,
|
||||
IN PWCHAR VariableName,
|
||||
OUT PVOID *VariableValue)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
PVOID Buffer;
|
||||
UINT_PTR Size = 0;
|
||||
UINT_PTR Size;
|
||||
|
||||
/* Allocate a buffer for storing a variable's value */
|
||||
Size = EFI_MAXIMUM_VARIABLE_SIZE * sizeof(PWCHAR);
|
||||
Status = Memory::AllocatePool(Size, (PVOID*)&Buffer);
|
||||
Status = BlAllocateMemoryPool(Size, (PVOID*)&Buffer);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure */
|
||||
@@ -192,8 +184,7 @@ EfiUtils::GetEfiVariable(IN PEFI_GUID Vendor,
|
||||
}
|
||||
|
||||
/* Attempt to get variable value */
|
||||
Status = XtLoader::GetEfiSystemTable()->RuntimeServices->GetVariable((PWCHAR)VariableName, Vendor, NULLPTR,
|
||||
&Size, Buffer);
|
||||
Status = EfiSystemTable->RuntimeServices->GetVariable(VariableName, Vendor, NULL, &Size, Buffer);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to get variable, probably not found such one */
|
||||
@@ -219,7 +210,7 @@ EfiUtils::GetEfiVariable(IN PEFI_GUID Vendor,
|
||||
*/
|
||||
XTCDECL
|
||||
ULONGLONG
|
||||
EfiUtils::GetRandomValue(IN OUT PULONGLONG RNGBuffer)
|
||||
BlGetRandomValue(IN OUT PULONGLONG RNGBuffer)
|
||||
{
|
||||
/* Recalculate RNG buffer with XORSHIFT */
|
||||
*RNGBuffer ^= *RNGBuffer >> 12;
|
||||
@@ -239,21 +230,21 @@ EfiUtils::GetRandomValue(IN OUT PULONGLONG RNGBuffer)
|
||||
*/
|
||||
XTCDECL
|
||||
INT_PTR
|
||||
EfiUtils::GetSecureBootStatus()
|
||||
BlGetSecureBootStatus()
|
||||
{
|
||||
EFI_GUID VarGuid = EFI_GLOBAL_VARIABLE_GUID;
|
||||
INT_PTR SecureBootStatus = 0;
|
||||
INT_PTR VarValue = 0;
|
||||
UCHAR VarValue = 0;
|
||||
UINT_PTR Size;
|
||||
|
||||
Size = sizeof(INT_PTR);
|
||||
if(XtLoader::GetEfiSystemTable()->RuntimeServices->GetVariable((PWCHAR)L"SecureBoot", &VarGuid,
|
||||
NULLPTR, &Size, &VarValue) == STATUS_EFI_SUCCESS)
|
||||
Size = sizeof(VarValue);
|
||||
if(EfiSystemTable->RuntimeServices->GetVariable(L"SecureBoot", &VarGuid,
|
||||
NULL, &Size, &VarValue) == STATUS_EFI_SUCCESS)
|
||||
{
|
||||
SecureBootStatus = VarValue;
|
||||
Size = sizeof(INT_PTR);
|
||||
if((XtLoader::GetEfiSystemTable()->RuntimeServices->GetVariable((PWCHAR)L"SetupMode", &VarGuid,
|
||||
NULLPTR, &Size, &VarValue) == STATUS_EFI_SUCCESS) && VarValue != 0)
|
||||
SecureBootStatus = (INT_PTR)VarValue;
|
||||
|
||||
if((EfiSystemTable->RuntimeServices->GetVariable(L"SetupMode", &VarGuid,
|
||||
NULL, &Size, &VarValue) == STATUS_EFI_SUCCESS) && VarValue != 0)
|
||||
{
|
||||
SecureBootStatus = -1;
|
||||
}
|
||||
@@ -275,7 +266,7 @@ EfiUtils::GetSecureBootStatus()
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
EfiUtils::InitializeEntropy(PULONGLONG RNGBuffer)
|
||||
BlInitializeEntropy(PULONGLONG RNGBuffer)
|
||||
{
|
||||
EFI_GUID RngGuid = EFI_RNG_PROTOCOL_GUID;
|
||||
PEFI_RNG_PROTOCOL Rng;
|
||||
@@ -283,11 +274,11 @@ EfiUtils::InitializeEntropy(PULONGLONG RNGBuffer)
|
||||
ULONGLONG Seed;
|
||||
|
||||
/* Initialize variables */
|
||||
Rng = NULLPTR;
|
||||
Rng = NULL;
|
||||
Seed = 0;
|
||||
|
||||
/* Locate RNG protocol */
|
||||
Status = XtLoader::GetEfiSystemTable()->BootServices->LocateProtocol(&RngGuid, NULLPTR, (PVOID *)&Rng);
|
||||
Status = EfiSystemTable->BootServices->LocateProtocol(&RngGuid, NULL, (PVOID *)&Rng);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to locate RNG protocol, return status code */
|
||||
@@ -295,7 +286,7 @@ EfiUtils::InitializeEntropy(PULONGLONG RNGBuffer)
|
||||
}
|
||||
|
||||
/* Get RNG value using the default algorithm */
|
||||
Status = Rng->GetRNG(Rng, NULLPTR, 8, (PUCHAR)&Seed);
|
||||
Status = Rng->GetRNG(Rng, NULL, 8, (PUCHAR)&Seed);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
/* Failed to get RNG value, return status code */
|
||||
@@ -328,14 +319,13 @@ EfiUtils::InitializeEntropy(PULONGLONG RNGBuffer)
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
EfiUtils::LoadEfiImage(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath,
|
||||
BlLoadEfiImage(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath,
|
||||
IN PVOID ImageData,
|
||||
IN SIZE_T ImageSize,
|
||||
OUT PEFI_HANDLE ImageHandle)
|
||||
{
|
||||
/* Load EFI image */
|
||||
return XtLoader::GetEfiSystemTable()->BootServices->LoadImage(FALSE, XtLoader::GetEfiImageHandle(), DevicePath,
|
||||
ImageData, ImageSize, ImageHandle);
|
||||
return EfiSystemTable->BootServices->LoadImage(FALSE, EfiImageHandle, DevicePath, ImageData, ImageSize, ImageHandle);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -347,10 +337,10 @@ EfiUtils::LoadEfiImage(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath,
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
EfiUtils::RebootSystem()
|
||||
BlRebootSystem()
|
||||
{
|
||||
/* Reboot machine */
|
||||
return XtLoader::GetEfiSystemTable()->RuntimeServices->ResetSystem(EfiResetCold, STATUS_EFI_SUCCESS, 0, NULLPTR);
|
||||
return EfiSystemTable->RuntimeServices->ResetSystem(EfiResetCold, STATUS_EFI_SUCCESS, 0, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -374,8 +364,8 @@ EfiUtils::RebootSystem()
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
EfiUtils::SetEfiVariable(IN PEFI_GUID Vendor,
|
||||
IN PCWSTR VariableName,
|
||||
BlSetEfiVariable(IN PEFI_GUID Vendor,
|
||||
IN PWCHAR VariableName,
|
||||
IN PVOID VariableValue,
|
||||
IN UINT_PTR Size)
|
||||
{
|
||||
@@ -383,8 +373,7 @@ EfiUtils::SetEfiVariable(IN PEFI_GUID Vendor,
|
||||
|
||||
/* Set EFI variable */
|
||||
Attributes = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS;
|
||||
return XtLoader::GetEfiSystemTable()->RuntimeServices->SetVariable((PWCHAR)VariableName, Vendor, Attributes,
|
||||
Size, VariableValue);
|
||||
return EfiSystemTable->RuntimeServices->SetVariable(VariableName, Vendor, Attributes, Size, VariableValue);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -396,10 +385,10 @@ EfiUtils::SetEfiVariable(IN PEFI_GUID Vendor,
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
EfiUtils::ShutdownSystem()
|
||||
BlShutdownSystem()
|
||||
{
|
||||
/* Shutdown machine */
|
||||
return XtLoader::GetEfiSystemTable()->RuntimeServices->ResetSystem(EfiResetShutdown, STATUS_EFI_SUCCESS, 0, NULLPTR);
|
||||
return EfiSystemTable->RuntimeServices->ResetSystem(EfiResetShutdown, STATUS_EFI_SUCCESS, 0, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -414,9 +403,9 @@ EfiUtils::ShutdownSystem()
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
EfiUtils::SleepExecution(IN ULONG_PTR Milliseconds)
|
||||
BlSleepExecution(IN ULONG_PTR Milliseconds)
|
||||
{
|
||||
XtLoader::GetEfiSystemTable()->BootServices->Stall(Milliseconds * 1000);
|
||||
EfiSystemTable->BootServices->Stall(Milliseconds * 1000);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -431,9 +420,9 @@ EfiUtils::SleepExecution(IN ULONG_PTR Milliseconds)
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
EfiUtils::StartEfiImage(IN EFI_HANDLE ImageHandle)
|
||||
BlStartEfiImage(IN EFI_HANDLE ImageHandle)
|
||||
{
|
||||
return XtLoader::GetEfiSystemTable()->BootServices->StartImage(ImageHandle, NULLPTR, NULLPTR);
|
||||
return EfiSystemTable->BootServices->StartImage(ImageHandle, NULL, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -454,9 +443,9 @@ EfiUtils::StartEfiImage(IN EFI_HANDLE ImageHandle)
|
||||
*/
|
||||
XTCDECL
|
||||
EFI_STATUS
|
||||
EfiUtils::WaitForEfiEvent(IN UINT_PTR NumberOfEvents,
|
||||
BlWaitForEfiEvent(IN UINT_PTR NumberOfEvents,
|
||||
IN PEFI_EVENT Event,
|
||||
OUT PUINT_PTR Index)
|
||||
{
|
||||
return XtLoader::GetEfiSystemTable()->BootServices->WaitForEvent(NumberOfEvents, Event, Index);
|
||||
return EfiSystemTable->BootServices->WaitForEvent(NumberOfEvents, Event, Index);
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user