13 Commits

Author SHA1 Message Date
b74c31f17c configure.ps1: Fix path handling and improve reliability
- Use $PSScriptRoot for reliable source directory detection
- Use Join-Path for proper path construction
- Validate BUILD_TYPE against Debug/Release
- Fix CMake argument quoting
- Use Write-Error for error messages
2025-10-10 16:26:28 +02:00
56a1a811b9 Fix multi-sector read using CHS mode 2025-10-10 15:10:42 +02:00
32bacdd228 Unify OVMF firmware and add WHPX targets 2025-10-10 11:00:11 +02:00
2d4c82cd29 Add initial WHPX support 2025-10-10 10:35:17 +02:00
e5611d8081 Add support for WHPX accelerator on Windows and introduce OVMF Pure EFI firmware 2025-10-09 17:35:03 +02:00
e52977fb63 Point contributors to gitea 2025-10-09 09:59:32 +02:00
11f096d9f3 Remove IDEAS and KNOWN_ISSUES migrated to Gitea 2025-10-09 09:57:30 +02:00
6e507be5e9 Add source directory include path for bootsector assembly 2025-10-09 09:25:50 +02:00
6a8a561484 Implement disk read and error handling in VBR 2025-10-07 20:09:36 +02:00
c5f522be4c Move XTLDR under boot directory 2025-10-06 12:08:36 +02:00
ce8041754b Document sdk/firmware directory 2025-10-05 22:41:32 +02:00
c4af89946b Restructure bootdata under boot directory 2025-10-05 22:37:03 +02:00
95fecfc095 Increase disk image size for FAT32 support 2025-10-05 22:01:12 +02:00
71 changed files with 256 additions and 155 deletions

View File

@@ -60,12 +60,10 @@ 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]") 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 the virtual disk image size (in MiB)
set_disk_image_size(32) set_disk_image_size(48)
# Build all subprojects # Build all subprojects
add_subdirectory(boot) add_subdirectory(boot)
add_subdirectory(bootdata)
add_subdirectory(drivers) add_subdirectory(drivers)
add_subdirectory(sdk) add_subdirectory(sdk)
add_subdirectory(xtldr)
add_subdirectory(xtoskrnl) add_subdirectory(xtoskrnl)

View File

@@ -9,8 +9,7 @@ porting drivers, fixing bugs, writing tests, creating documentation, or helping
love the help. love the help.
## Wish List ## Wish List
If you are looking for a way to contribute, but you are not sure where to start, check our [IDEAS](IDEAS.md) and If you are looking for a way to contribute, but you are not sure where to start, check our list of
[KNOWN ISSUES](KNOWN_ISSUES.md) pages for suggestions. We try to keep them up to date. You can also check a list of
[open issues](https://git.codingworkshop.eu.org/xt-sys/exectos/issues). If you find interesting task and you are serious [open issues](https://git.codingworkshop.eu.org/xt-sys/exectos/issues). If you find interesting task and you are serious
about tackling one, feel free to contact us. We will be able to provide a more detailed information and suggestions about tackling one, feel free to contact us. We will be able to provide a more detailed information and suggestions
towards getting started. towards getting started.

View File

@@ -1,9 +0,0 @@
## ExectOS Ideas
This is a list of ideas that migh but not must be realized.
### 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.
- [ ] 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.

View File

@@ -1,6 +0,0 @@
## ExectOS Known Issues
This is a list of well known bugs that exists in all master branch builds.
### XTLDR
- [ ] EFI Runtime Services are not mapped properly into higher half. They are mapped itself, but all pointers inside
that structure point to some physical address that is unavailable after paging is enabled.

View File

@@ -58,15 +58,17 @@ design, it requires a modern EFI enabled hardware. It is not possible currently
# Source structure # Source structure
| Directory | Description | | Directory | Description |
|-------------|----------------------------------------------------------| |------------------|--------------------------------------------------------------|
| bootdata | default configuration and data needed to boot XTOS | | 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 |
| drivers | XT native drivers source code | | drivers | XT native drivers source code |
| sdk/cmake | Host toolchain configuration and build-related functions | | sdk/cmake | host toolchain configuration and build-related functions |
| sdk/firmware | firmware enabling XTOS to boot on virtual machines |
| sdk/xtdk | XT Software Development Kit headers | | sdk/xtdk | XT Software Development Kit headers |
| services | integral subsystems services source code | | services | integral subsystems services source code |
| subsystems | environment subsystems source code | | subsystems | environment subsystems source code |
| xtoskrnl | XTOS kernel source code | | xtoskrnl | XTOS kernel source code |
| xtldr | XTOS boot loader source code |
# Build # Build
XTOS can only be built using [XTchain](https://git.codingworkshop.eu.org/xt-sys/xtchain), a dedicated toolchain designed XTOS can only be built using [XTchain](https://git.codingworkshop.eu.org/xt-sys/xtchain), a dedicated toolchain designed

View File

@@ -1 +1,3 @@
add_subdirectory(bootdata)
add_subdirectory(bootsect) add_subdirectory(bootsect)
add_subdirectory(xtldr)

View File

@@ -84,14 +84,146 @@ RealStart:
leaw -16(%bp), %sp leaw -16(%bp), %sp
sti sti
/* Print message */ /* Get drive number */
movw $msgUnavailable, %si cmpb $0xFF, DriveNumber - Start(%bp)
call Print jne GetDriveParameters
movb %dl, DriveNumber - Start(%bp)
/* Wait for key press and reboot */ GetDriveParameters:
xorw %ax, %ax /* Get drive parameters from the BIOS */
int $0x16 movb DriveNumber - Start(%bp), %dl
int $0x19 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 */
pushw %cx
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
popal
popw %cx
jc DiskError
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: Print:
/* Simple routine to print messages */ /* Simple routine to print messages */
@@ -105,9 +237,40 @@ Print:
DonePrint: DonePrint:
retw retw
msgUnavailable: Reboot:
.ascii "XTLDR requires EFI-based system!\r\nPress any key to restart\r\n" /* 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 the rest of the VBR with zeros and add VBR signature at the end */
.fill (510 - (. - Start)), 1, 0 .fill (510 - (. - Start)), 1, 0
.word 0xAA55 .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

View File

@@ -4,48 +4,41 @@
# DESCRIPTION: Project configuration script for preparing the build environment # DESCRIPTION: Project configuration script for preparing the build environment
# DEVELOPERS: Aiken Harris <harraiken91@gmail.com> # DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
# Check XTchain # Check XTchain
if (-not $env:XTCVER) { if (-not $env:XTCVER) {
Write-Host "XTChain not detected or corrupted!" Write-Error "XTChain not detected or corrupted!"
exit 1 exit 1
} }
# Set target architecture # Set target architecture defaulting to amd64
if ($env:TARGET) { $ARCH = if ($env:TARGET) { $env:TARGET } else { "amd64" }
$ARCH = $env:TARGET
} else {
$ARCH = "amd64"
}
# Set target build type # Set target build type defaulting to Debug
if (-not $env:BUILD_TYPE) { $env:BUILD_TYPE = if ($env:BUILD_TYPE -in @("Debug", "Release")) { $env:BUILD_TYPE } else { "Debug" }
$env:BUILD_TYPE = "DEBUG"
}
# Set variables # Set variables
$EXECTOS_SOURCE_DIR = (Get-Location).Path $EXECTOS_SOURCE_DIR = $PSScriptRoot
$EXECTOS_BINARY_DIR = "build-$($ARCH)-$($env:BUILD_TYPE.ToLower())" $EXECTOS_BINARY_DIR = Join-Path $EXECTOS_SOURCE_DIR "build-$ARCH-$($env:BUILD_TYPE.ToLower())"
# Create directories if needed # Create build directory
if ($EXECTOS_SOURCE_DIR -eq (Get-Location).Path) { if (-not (Test-Path $EXECTOS_BINARY_DIR)) {
Write-Host "Creating directories in $EXECTOS_BINARY_DIR" Write-Host "Creating build directory: $EXECTOS_BINARY_DIR"
New-Item -ItemType Directory -Path $EXECTOS_BINARY_DIR -Force | Out-Null New-Item -ItemType Directory -Path $EXECTOS_BINARY_DIR -Force | Out-Null
Set-Location -Path $EXECTOS_BINARY_DIR
} }
Set-Location $EXECTOS_BINARY_DIR
# Delete old cache # Delete old cache
Remove-Item -Path "CMakeCache.txt" -ErrorAction SilentlyContinue Remove-Item "CMakeCache.txt", "host-tools/CMakeCache.txt" -ErrorAction SilentlyContinue
Remove-Item -Path "host-tools/CMakeCache.txt" -ErrorAction SilentlyContinue
# Configure project using CMake # Configure project using CMake
& cmake -G Ninja -DARCH:STRING=$($ARCH) -DBUILD_TYPE:STRING=$($env:BUILD_TYPE) $EXECTOS_SOURCE_DIR & cmake -G Ninja "-DARCH:STRING=$ARCH" "-DBUILD_TYPE:STRING=$($env:BUILD_TYPE)" $EXECTOS_SOURCE_DIR
# Check if configuration succeeded # Check if configuration succeeded
if ($LASTEXITCODE -ne 0) { if ($LASTEXITCODE -ne 0) {
Write-Host "Configure script failed." Write-Error "Configure script failed."
exit 1 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."
} }
$ARCH | Out-File -Encoding ASCII -NoNewline "build.arch"
Write-Host "Configure completed. Run 'xbuild' to build ExectOS."

View File

@@ -23,36 +23,57 @@ endif()
find_program(QEMU_EMULATOR ${QEMU_COMMAND}) find_program(QEMU_EMULATOR ${QEMU_COMMAND})
if(QEMU_EMULATOR) if(QEMU_EMULATOR)
if(CMAKE_HOST_LINUX)
# This target starts up a QEMU+OVMF virtual machine using KVM accelerator # This target starts up a QEMU+OVMF virtual machine using KVM accelerator
add_custom_target(testefikvm add_custom_target(testefikvm
DEPENDS install 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 COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-EFI-KVM" -machine type=q35,kernel_irqchip=on,accel=kvm,mem-merge=off,vmport=off -enable-kvm -cpu host,-hypervisor,+topoext
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none -smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_code_${ARCH}.fd,if=pflash,format=raw,unit=0,readonly=on -bios ${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_${ARCH}.fd
-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 fat:rw:${EXECTOS_BINARY_DIR}/output/binaries
-boot menu=on -d int -M smm=off -no-reboot -no-shutdown -serial stdio -boot menu=on -d int -M smm=off -no-reboot -no-shutdown -serial stdio
VERBATIM USES_TERMINAL) VERBATIM USES_TERMINAL)
elseif(CMAKE_HOST_WIN32)
# This target starts up a QEMU+OVMF virtual machine using WHPX accelerator
add_custom_target(testefiwhpx
DEPENDS install
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-EFI-WHPX" -machine type=q35,kernel_irqchip=off,accel=whpx,mem-merge=off,vmport=off
-m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
-bios ${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_${ARCH}.fd
-hda fat:rw:${EXECTOS_BINARY_DIR}/output/binaries
-boot menu=on -d int -M smm=off -no-reboot -no-shutdown -serial stdio
VERBATIM USES_TERMINAL)
endif()
# This target starts up a QEMU+OVMF virtual machine using TCG accelerator # This target starts up a QEMU+OVMF virtual machine using TCG accelerator
add_custom_target(testefitcg add_custom_target(testefitcg
DEPENDS install DEPENDS install
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-EFI-TCG" -machine type=q35,accel=tcg -cpu max,-hypervisor COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-EFI-TCG" -machine type=q35,accel=tcg -cpu max,-hypervisor
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none -smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_code_${ARCH}.fd,if=pflash,format=raw,unit=0,readonly=on -bios ${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_${ARCH}.fd
-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 fat:rw:${EXECTOS_BINARY_DIR}/output/binaries
-boot menu=on -d int -no-reboot -no-shutdown -serial stdio -boot menu=on -d int -no-reboot -no-shutdown -serial stdio
VERBATIM USES_TERMINAL) VERBATIM USES_TERMINAL)
if(CMAKE_HOST_LINUX)
# This target starts up a QEMU+SEABIOS virtual machine using KVM accelerator # This target starts up a QEMU+SEABIOS virtual machine using KVM accelerator
add_custom_target(testkvm add_custom_target(testkvm
DEPENDS diskimg 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 COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-BIOS-KVM" -machine type=q35,kernel_irqchip=on,accel=kvm,mem-merge=off,vmport=off -enable-kvm -cpu host,-hypervisor,+topoext
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none -smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
-hda ${EXECTOS_BINARY_DIR}/output/disk.img -hda ${EXECTOS_BINARY_DIR}/output/disk.img
-boot menu=on -d int -no-reboot -no-shutdown -serial stdio -boot menu=on -d int -no-reboot -no-shutdown -serial stdio
VERBATIM USES_TERMINAL) VERBATIM USES_TERMINAL)
elseif(CMAKE_HOST_WIN32)
# This target starts up a QEMU+SEABIOS virtual machine using WHPX accelerator
add_custom_target(testwhpx
DEPENDS diskimg
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-BIOS-WHPX" -machine type=q35,kernel_irqchip=off,accel=whpx,mem-merge=off,vmport=off
-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()
# This target starts up a QEMU+SEABIOS virtual machine using TCG accelerator # This target starts up a QEMU+SEABIOS virtual machine using TCG accelerator
add_custom_target(testtcg add_custom_target(testtcg

View File

@@ -69,6 +69,7 @@ function(compile_bootsector NAME SOURCE BASEADDR ENTRYPOINT)
COMMAND ${CMAKE_ASM_COMPILER} COMMAND ${CMAKE_ASM_COMPILER}
/nologo /nologo
--target=i386-none-elf --target=i386-none-elf
-I${CMAKE_CURRENT_SOURCE_DIR}
/Fo${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_NAME} /Fo${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_NAME}
-c -- ${SOURCE} -c -- ${SOURCE}
COMMAND ${CMAKE_ASM_LINKER} COMMAND ${CMAKE_ASM_LINKER}

Binary file not shown.

Binary file not shown.

View File

@@ -394,13 +394,6 @@ typedef struct _CPU_IDENTIFICATION
USHORT Stepping; USHORT Stepping;
CPU_VENDOR Vendor; CPU_VENDOR Vendor;
UCHAR VendorName[13]; UCHAR VendorName[13];
UINT32 StandardFeaturesEcx;
UINT32 StandardFeaturesEdx;
UINT32 ExtendedFeaturesEcx;
UINT32 ExtendedFeaturesEdx;
UINT32 Standard7FeaturesEbx;
UINT32 Standard7FeaturesEcx;
UINT32 Standard7FeaturesEdx;
} CPU_IDENTIFICATION, *PCPU_IDENTIFICATION; } CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
/* CPUID registers */ /* CPUID registers */

View File

@@ -359,10 +359,6 @@ typedef struct _CPU_IDENTIFICATION
USHORT Stepping; USHORT Stepping;
CPU_VENDOR Vendor; CPU_VENDOR Vendor;
UCHAR VendorName[13]; UCHAR VendorName[13];
UINT32 StandardFeaturesEcx;
UINT32 StandardFeaturesEdx;
UINT32 ExtendedFeaturesEcx;
UINT32 ExtendedFeaturesEdx;
} CPU_IDENTIFICATION, *PCPU_IDENTIFICATION; } CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
/* CPUID registers */ /* CPUID registers */

View File

@@ -64,6 +64,9 @@ AR::ProcSup::IdentifyProcessor(VOID)
CPUID_REGISTERS CpuRegisters; CPUID_REGISTERS CpuRegisters;
CPUID_SIGNATURE CpuSignature; CPUID_SIGNATURE CpuSignature;
/* Not fully implemented yet */
UNIMPLEMENTED;
/* Get current processor control block */ /* Get current processor control block */
Prcb = KE::Processor::GetCurrentProcessorControlBlock(); Prcb = KE::Processor::GetCurrentProcessorControlBlock();
@@ -119,42 +122,7 @@ AR::ProcSup::IdentifyProcessor(VOID)
Prcb->CpuId.Vendor = CPU_VENDOR_UNKNOWN; Prcb->CpuId.Vendor = CPU_VENDOR_UNKNOWN;
} }
/* Get CPU standard features */ /* TODO: Store a list of CPU features in processor control block */
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
CpuRegisters.Leaf = CPUID_GET_STANDARD1_FEATURES;
CpuFunc::CpuId(&CpuRegisters);
/* Store CPU standard features in processor control block */
Prcb->CpuId.StandardFeaturesEcx = CpuRegisters.Ecx;
Prcb->CpuId.StandardFeaturesEdx = CpuRegisters.Edx;
/* Get CPU extended features */
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
CpuRegisters.Leaf = 0x80000001;
CpuFunc::CpuId(&CpuRegisters);
/* Store CPU extended features in processor control block */
Prcb->CpuId.ExtendedFeaturesEcx = CpuRegisters.Ecx;
Prcb->CpuId.ExtendedFeaturesEdx = CpuRegisters.Edx;
/* Get CPU leaf 7 features (subleaf 0) */
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
CpuRegisters.Leaf = CPUID_GET_STANDARD7_FEATURES;
CpuRegisters.SubLeaf = 0;
CpuFunc::CpuId(&CpuRegisters);
/* Store CPU leaf 7 features in processor control block */
Prcb->CpuId.Standard7FeaturesEbx = CpuRegisters.Ebx;
Prcb->CpuId.Standard7FeaturesEcx = CpuRegisters.Ecx;
Prcb->CpuId.Standard7FeaturesEdx = CpuRegisters.Edx;
/* Print CPU information */
DebugPrint(L"CPU: Vendor %hs, Family 0x%X, Model 0x%X, Stepping 0x%X\n",
Prcb->CpuId.VendorName,
Prcb->CpuId.Family,
Prcb->CpuId.Model,
Prcb->CpuId.Stepping);
} }
/** /**

View File

@@ -59,6 +59,9 @@ AR::ProcSup::IdentifyProcessor(VOID)
CPUID_REGISTERS CpuRegisters; CPUID_REGISTERS CpuRegisters;
CPUID_SIGNATURE CpuSignature; CPUID_SIGNATURE CpuSignature;
/* Not fully implemented yet */
UNIMPLEMENTED;
/* Get current processor control block */ /* Get current processor control block */
Prcb = KE::Processor::GetCurrentProcessorControlBlock(); Prcb = KE::Processor::GetCurrentProcessorControlBlock();
@@ -114,30 +117,7 @@ AR::ProcSup::IdentifyProcessor(VOID)
Prcb->CpuId.Vendor = CPU_VENDOR_UNKNOWN; Prcb->CpuId.Vendor = CPU_VENDOR_UNKNOWN;
} }
/* Get CPU standard features */ /* TODO: Store a list of CPU features in processor control block */
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
CpuRegisters.Leaf = CPUID_GET_STANDARD1_FEATURES;
CpuFunc::CpuId(&CpuRegisters);
/* Store CPU standard features in processor control block */
Prcb->CpuId.StandardFeaturesEcx = CpuRegisters.Ecx;
Prcb->CpuId.StandardFeaturesEdx = CpuRegisters.Edx;
/* Get CPU extended features */
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
CpuRegisters.Leaf = 0x80000001;
CpuFunc::CpuId(&CpuRegisters);
/* Store CPU extended features in processor control block */
Prcb->CpuId.ExtendedFeaturesEcx = CpuRegisters.Ecx;
Prcb->CpuId.ExtendedFeaturesEdx = CpuRegisters.Edx;
/* Print CPU information */
DebugPrint(L"CPU: Vendor %hs, Family 0x%X, Model 0x%X, Stepping 0x%X\n",
Prcb->CpuId.VendorName,
Prcb->CpuId.Family,
Prcb->CpuId.Model,
Prcb->CpuId.Stepping);
} }
/** /**