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
67 changed files with 248 additions and 84 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

@@ -57,16 +57,18 @@ ExectOS is in very early development stage, thus its requirements have been not
design, it requires a modern EFI enabled hardware. It is not possible currently to boot ExectOS on a legacy BIOS. design, it requires a modern EFI enabled hardware. It is not possible currently to boot ExectOS on a legacy BIOS.
# 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 |
| drivers | XT native drivers source code | | boot/bootsect | boot sector code (MBR & VBR) initializing the boot process |
| sdk/cmake | Host toolchain configuration and build-related functions | | boot/xtldr | XTOS boot loader source code |
| sdk/xtdk | XT Software Development Kit headers | | drivers | XT native drivers source code |
| services | integral subsystems services source code | | sdk/cmake | host toolchain configuration and build-related functions |
| subsystems | environment subsystems source code | | sdk/firmware | firmware enabling XTOS to boot on virtual machines |
| xtoskrnl | XTOS kernel source code | | sdk/xtdk | XT Software Development Kit headers |
| xtldr | XTOS boot loader source code | | services | integral subsystems services source code |
| subsystems | environment subsystems source code |
| xtoskrnl | XTOS kernel 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)
# This target starts up a QEMU+OVMF virtual machine using KVM accelerator if(CMAKE_HOST_LINUX)
add_custom_target(testefikvm # This target starts up a QEMU+OVMF virtual machine using KVM accelerator
DEPENDS install add_custom_target(testefikvm
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 DEPENDS install
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none 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
-drive file=${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_code_${ARCH}.fd,if=pflash,format=raw,unit=0,readonly=on -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_vars_${ARCH}.fd,if=pflash,format=raw,unit=1 -bios ${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_${ARCH}.fd
-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)
# This target starts up a QEMU+SEABIOS virtual machine using KVM accelerator if(CMAKE_HOST_LINUX)
add_custom_target(testkvm # This target starts up a QEMU+SEABIOS virtual machine using KVM accelerator
DEPENDS diskimg add_custom_target(testkvm
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 DEPENDS diskimg
-smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none 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
-hda ${EXECTOS_BINARY_DIR}/output/disk.img -smp 2,sockets=1,cores=1,threads=2 -m 4G -overcommit mem-lock=off -rtc clock=host,base=localtime,driftfix=none
-boot menu=on -d int -no-reboot -no-shutdown -serial stdio -hda ${EXECTOS_BINARY_DIR}/output/disk.img
VERBATIM USES_TERMINAL) -boot menu=on -d int -no-reboot -no-shutdown -serial stdio
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.