forked from xt-sys/exectos
Compare commits
49 Commits
ed293c7e61
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
f538d035e2
|
|||
|
72b92f853e
|
|||
|
00b04f5405
|
|||
|
52afd31e77
|
|||
|
7f06abf236
|
|||
|
4f4df52d3d
|
|||
|
764fec4d75
|
|||
|
ca8a539c0e
|
|||
|
c206b443ed
|
|||
|
b19b27a621
|
|||
|
56b81f5d73
|
|||
|
1e99a3f4a9
|
|||
|
0a71bc3995
|
|||
|
13a9d4c522
|
|||
|
9bf867af95
|
|||
|
a7be533521
|
|||
|
fdbe157c18
|
|||
|
56a1a811b9
|
|||
|
32bacdd228
|
|||
|
2d4c82cd29
|
|||
|
e5611d8081
|
|||
|
e52977fb63
|
|||
|
11f096d9f3
|
|||
|
6e507be5e9
|
|||
|
6a8a561484
|
|||
|
c5f522be4c
|
|||
|
ce8041754b
|
|||
|
c4af89946b
|
|||
|
95fecfc095
|
|||
|
ec4e8c416c
|
|||
|
64733914f2
|
|||
|
4e7baf302c
|
|||
|
2f9a6b5548
|
|||
|
646e246ec6
|
|||
|
ae941d2761
|
|||
|
b40db0d1dd
|
|||
|
cf4c17df22
|
|||
|
f152e2bac7
|
|||
|
f81e895fe1
|
|||
|
370a635ee2
|
|||
|
4696faf86d
|
|||
|
332e57f305
|
|||
|
4ee3daa8f8
|
|||
|
ee82475aa3
|
|||
|
ff0caf93da
|
|||
|
20fd950ef4
|
|||
|
6e10089280
|
|||
|
9298aef87e
|
|||
|
6c66028800
|
@@ -60,11 +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]")
|
||||
|
||||
# Set the virtual disk image size (in MiB)
|
||||
set_disk_image_size(32)
|
||||
set_disk_image_size(48)
|
||||
|
||||
# Build all subprojects
|
||||
add_subdirectory(bootdata)
|
||||
add_subdirectory(boot)
|
||||
add_subdirectory(drivers)
|
||||
add_subdirectory(sdk)
|
||||
add_subdirectory(xtldr)
|
||||
add_subdirectory(xtoskrnl)
|
||||
|
||||
@@ -9,8 +9,7 @@ porting drivers, fixing bugs, writing tests, creating documentation, or helping
|
||||
love the help.
|
||||
|
||||
## 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
|
||||
[KNOWN ISSUES](KNOWN_ISSUES.md) pages for suggestions. We try to keep them up to date. You can also check a list of
|
||||
If you are looking for a way to contribute, but you are not sure where to start, check our list of
|
||||
[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
|
||||
towards getting started.
|
||||
|
||||
23
IDEAS.md
23
IDEAS.md
@@ -1,23 +0,0 @@
|
||||
## 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. This is partially done.
|
||||
- [ ] Implement editing boot menu entries directly from the boot menu. Changes should be runtime only (not stored on
|
||||
disk).
|
||||
|
||||
### 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.
|
||||
@@ -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.
|
||||
10
README.md
10
README.md
@@ -58,15 +58,17 @@ design, it requires a modern EFI enabled hardware. It is not possible currently
|
||||
|
||||
# Source structure
|
||||
| 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 |
|
||||
| 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 |
|
||||
| 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
|
||||
|
||||
3
boot/CMakeLists.txt
Normal file
3
boot/CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
add_subdirectory(bootdata)
|
||||
add_subdirectory(bootsect)
|
||||
add_subdirectory(xtldr)
|
||||
8
boot/bootsect/CMakeLists.txt
Normal file
8
boot/bootsect/CMakeLists.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
# XT Boot Sector
|
||||
PROJECT(BOOTSECT)
|
||||
|
||||
add_definitions("-DARCH_ESP_SOURCE=\\\"${ARCH}/cpu.S\\\"")
|
||||
|
||||
# Compile boot sectors
|
||||
compile_bootsector(mbrboot ${BOOTSECT_SOURCE_DIR}/mbrboot.S 0x7C00 Start)
|
||||
compile_bootsector(espboot ${BOOTSECT_SOURCE_DIR}/espboot.S 0x7C00 Start)
|
||||
144
boot/bootsect/amd64/cpu.S
Normal file
144
boot/bootsect/amd64/cpu.S
Normal file
@@ -0,0 +1,144 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: boot/bootsect/amd64/cpu.S
|
||||
* DESCRIPTION: Low-level support for CPU initialization
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
|
||||
BuildPageMap:
|
||||
/* Generate page map for first 1GB of memory */
|
||||
pushaw
|
||||
pushw %es
|
||||
cld
|
||||
movw $(0x1000 / 16), %ax
|
||||
movw %ax, %es
|
||||
xorw %di, %di
|
||||
movl $(0x2000 | 0x07), %eax
|
||||
stosl
|
||||
xorl %eax, %eax
|
||||
movw $1021, %cx
|
||||
rep stosl
|
||||
movw $(0x2000 / 16), %ax
|
||||
movw %ax, %es
|
||||
xorw %di, %di
|
||||
movl $(0x3000 | 0x07), %eax
|
||||
stosl
|
||||
xorl %eax, %eax
|
||||
movw $1021, %cx
|
||||
rep stosl
|
||||
movw $(0x3000 / 16), %ax
|
||||
movw %ax, %es
|
||||
xorw %di, %di
|
||||
movw $512, %cx
|
||||
movl $0x00000083, %eax
|
||||
.BuildPageMapLoop:
|
||||
/* Identity map 512 pages of 2MB */
|
||||
movl %eax, %es:(%di)
|
||||
addl $2097152, %eax
|
||||
addw $0x08, %di
|
||||
loop .BuildPageMapLoop
|
||||
popw %es
|
||||
popaw
|
||||
ret
|
||||
|
||||
InitializeCpu:
|
||||
/* Check if CPU supports CPUID, long mode and PAE */
|
||||
pushal
|
||||
pushfl
|
||||
popl %eax
|
||||
movl %eax, %ebx
|
||||
xorl $0x00200000, %eax
|
||||
pushl %eax
|
||||
popfl
|
||||
pushfl
|
||||
popl %eax
|
||||
cmpl %ebx, %eax
|
||||
je CpuUnsupported
|
||||
movl $0x01, %eax
|
||||
cpuid
|
||||
testl $0x40, %edx
|
||||
jz CpuUnsupported
|
||||
movl $0x80000000, %eax
|
||||
cpuid
|
||||
cmpl $0x80000000, %eax
|
||||
jbe CpuUnsupported
|
||||
movl $0x80000001, %eax
|
||||
cpuid
|
||||
testl $0x20000000, %edx
|
||||
jz CpuUnsupported
|
||||
popal
|
||||
call LoadGdt
|
||||
ret
|
||||
|
||||
LoadGdt:
|
||||
/* Load Global Descriptor Table */
|
||||
lgdt .GdtPointer
|
||||
ret
|
||||
|
||||
RunStage2:
|
||||
/* Switch to long mode and pass control to Stage 2 */
|
||||
call BuildPageMap
|
||||
call ParseExecutableHeader
|
||||
xorl %edx, %edx
|
||||
pushl %edx
|
||||
pushl %eax
|
||||
cli
|
||||
xorw %ax, %ax
|
||||
movw %ax, %ds
|
||||
movw %ax, %es
|
||||
movw %ax, %fs
|
||||
movw %ax, %gs
|
||||
movw %ax, %ss
|
||||
movl %cr4, %eax
|
||||
orl $0x00A0, %eax
|
||||
movl %eax, %cr4
|
||||
movl $0x00001000, %eax
|
||||
movl %eax, %cr3
|
||||
movl $0xC0000080, %ecx
|
||||
rdmsr
|
||||
orl $0x00000100, %eax
|
||||
wrmsr
|
||||
movl %cr0, %eax
|
||||
orl $0x80000001, %eax
|
||||
movl %eax, %cr0
|
||||
ljmp $0x10, $.Stage2LongMode
|
||||
.code64
|
||||
.Stage2LongMode:
|
||||
/* Set segments and stack, then jump to Stage 2 */
|
||||
movw $0x18, %ax
|
||||
movw %ax, %ds
|
||||
movw %ax, %es
|
||||
movw %ax, %ss
|
||||
xorw %ax, %ax
|
||||
movw %ax, %fs
|
||||
movw %ax, %gs
|
||||
popq %rax
|
||||
xorq %rbx, %rbx
|
||||
xorq %rcx, %rcx
|
||||
xorq %rdx, %rdx
|
||||
xorq %rsi, %rsi
|
||||
xorq %rdi, %rdi
|
||||
xorq %rbp, %rbp
|
||||
jmp *%rax
|
||||
|
||||
.code16
|
||||
.GdtDescriptor:
|
||||
/* Global Descriptor Table */
|
||||
.quad 0x0000000000000000
|
||||
.quad 0x0000000000000000
|
||||
.quad 0x00AF9A000000FFFF
|
||||
.quad 0x00CF92000000FFFF
|
||||
.quad 0x00009E000000FFFF
|
||||
.quad 0x000092000000FFFF
|
||||
.quad 0x00CF9B000000FFFF
|
||||
|
||||
.GdtPointer:
|
||||
/* Pointer to Global Descriptor Table */
|
||||
.word .GdtPointer - .GdtDescriptor - 1
|
||||
.long .GdtDescriptor
|
||||
|
||||
.Stage2FileName:
|
||||
/* Name of Stage 2 executable file */
|
||||
.ascii "BOOTX64 EFI"
|
||||
529
boot/bootsect/espboot.S
Normal file
529
boot/bootsect/espboot.S
Normal file
@@ -0,0 +1,529 @@
|
||||
/**
|
||||
* 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 (3 sectors starting from sector 2) */
|
||||
movl HiddenSectors - Start(%bp), %eax
|
||||
addl $0x02, %eax
|
||||
movw $0x03, %cx
|
||||
xorw %bx, %bx
|
||||
movw %bx, %es
|
||||
movw $0x7E00, %bx
|
||||
call ReadSectors
|
||||
jmp StartExtraCode
|
||||
|
||||
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
|
||||
|
||||
.CHSLoop:
|
||||
/* Read sector by sector 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 .CHSLoop
|
||||
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\0"
|
||||
|
||||
.MsgDiskError:
|
||||
.ascii "Disk error!\r\n\0"
|
||||
|
||||
.MsgFsError:
|
||||
.ascii "File system error!\r\n\0"
|
||||
|
||||
/* Fill the rest of the VBR with zeros and add VBR signature at the end */
|
||||
.fill (510 - (. - Start)), 1, 0
|
||||
.word 0xAA55
|
||||
|
||||
|
||||
StartExtraCode:
|
||||
/* Load XTLDR file from disk */
|
||||
call LoadStage2
|
||||
|
||||
/* Enable A20 gate */
|
||||
call EnableA20
|
||||
|
||||
/* Call architecture specific initialization code */
|
||||
call InitializeCpu
|
||||
|
||||
/* Jump to Stage2 */
|
||||
call RunStage2
|
||||
|
||||
Clear8042:
|
||||
/* Clear 8042 PS/2 buffer */
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
inb $0x64, %al
|
||||
cmpb $0xff, %al
|
||||
je .Clear8042_Done
|
||||
testb $0x02, %al
|
||||
jnz Clear8042
|
||||
.Clear8042_Done:
|
||||
ret
|
||||
|
||||
EnableA20:
|
||||
/* Enable A20 gate */
|
||||
pushaw
|
||||
call Clear8042
|
||||
movb $0xD1, %al
|
||||
outb %al, $0x64
|
||||
call Clear8042
|
||||
movb $0xDF, %al
|
||||
outb %al, $0x60
|
||||
call Clear8042
|
||||
movb $0xFF, %al
|
||||
outb %al, $0x64
|
||||
call Clear8042
|
||||
popaw
|
||||
ret
|
||||
|
||||
FindFatEntry:
|
||||
/* Find a file or directory in the FAT table */
|
||||
pushw %bx
|
||||
pushw %cx
|
||||
pushw %dx
|
||||
pushw %si
|
||||
pushw %di
|
||||
.FindFatCluster:
|
||||
/* Find FAT32 cluster holding the entry */
|
||||
cmp $0x0FFFFFF8, %eax
|
||||
jae .FindEntryFail
|
||||
pushl %eax
|
||||
movw $0x0200, %bx
|
||||
movw %bx, %es
|
||||
call ReadCluster
|
||||
popl %eax
|
||||
movb SectorsPerCluster - Start(%bp), %cl
|
||||
shlw $0x04, %cx
|
||||
xorw %di, %di
|
||||
.FindEntryLoop:
|
||||
/* Find the entry */
|
||||
movb %es:(%di), %al
|
||||
cmpb $0x00, %al
|
||||
je .FindEntryFail
|
||||
cmpb $0xE5, %al
|
||||
je .FindSkipEntry
|
||||
movb %es:0x0B(%di), %ah
|
||||
cmpb $0x0F, %ah
|
||||
je .FindSkipEntry
|
||||
pushw %di
|
||||
pushw %si
|
||||
pushw %cx
|
||||
movw $0x0B, %cx
|
||||
repe cmpsb
|
||||
popw %cx
|
||||
popw %si
|
||||
popw %di
|
||||
jnz .FindSkipEntry
|
||||
movw %es:0x1A(%di), %ax
|
||||
movw %es:0x14(%di), %dx
|
||||
shll $0x10, %edx
|
||||
orl %edx, %eax
|
||||
clc
|
||||
jmp .FindEntryDone
|
||||
.FindSkipEntry:
|
||||
/* Skip to the next entry */
|
||||
addw $0x20, %di
|
||||
decw %cx
|
||||
jnz .FindEntryLoop
|
||||
call GetFatEntry
|
||||
jmp .FindFatCluster
|
||||
.FindEntryFail:
|
||||
/* Error, file/directory not found */
|
||||
stc
|
||||
.FindEntryDone:
|
||||
/* Clean up the stack */
|
||||
popw %di
|
||||
popw %si
|
||||
popw %dx
|
||||
popw %cx
|
||||
popw %bx
|
||||
ret
|
||||
|
||||
GetFatEntry:
|
||||
/* Get FAT32 sector and offset from FAT table */
|
||||
shll $0x02, %eax
|
||||
movl %eax, %ecx
|
||||
xorl %edx, %edx
|
||||
movzwl BytesPerSector - Start(%bp), %ebx
|
||||
pushl %ebx
|
||||
divl %ebx
|
||||
movzwl ReservedSectors - Start(%bp), %ebx
|
||||
addl %ebx, %eax
|
||||
movl HiddenSectors - Start(%bp), %ebx
|
||||
addl %ebx, %eax
|
||||
popl %ebx
|
||||
decl %ebx
|
||||
andl %ebx, %ecx
|
||||
movzwl ExtendedFlags - Start(%bp), %ebx
|
||||
andw $0x0F, %bx
|
||||
jz LoadFatSector
|
||||
cmpb FatCopies - Start(%bp), %bl
|
||||
jae FsError
|
||||
pushl %eax
|
||||
movl BigSectorsPerFat - Start(%bp), %eax
|
||||
mull %ebx
|
||||
popl %edx
|
||||
addl %edx, %eax
|
||||
|
||||
LoadFatSector:
|
||||
/* Load FAT32 sector from disk */
|
||||
pushl %ecx
|
||||
movw $0x9000, %bx
|
||||
movw %bx, %es
|
||||
cmpl %esi, %eax
|
||||
je .LoadFatSectorDone
|
||||
movl %eax, %esi
|
||||
xorw %bx, %bx
|
||||
movw $0x01, %cx
|
||||
call ReadSectors
|
||||
.LoadFatSectorDone:
|
||||
/* Clean up the stack */
|
||||
popl %ecx
|
||||
movl %es:(%ecx), %eax
|
||||
andl $0x0FFFFFFF, %eax
|
||||
ret
|
||||
|
||||
LoadStage2:
|
||||
/* Load Stage2 executable, first find file in the path */
|
||||
movl $0xFFFFFFFF, %esi
|
||||
pushl %esi
|
||||
movl 0x7C2C, %eax
|
||||
movw $.EfiDirName, %si
|
||||
call FindFatEntry
|
||||
jc Stage2NotLoaded
|
||||
movw $.BootDirName, %si
|
||||
call FindFatEntry
|
||||
jc Stage2NotLoaded
|
||||
movw $.Stage2FileName, %si
|
||||
call FindFatEntry
|
||||
jc Stage2NotLoaded
|
||||
popl %esi
|
||||
/* Load XTLDR file from disk */
|
||||
cmpl $0x02, %eax
|
||||
jb FileNotFound
|
||||
cmpl $0x0FFFFFF8, %eax
|
||||
jae FileNotFound
|
||||
movw $(0xF800 / 16), %bx
|
||||
movw %bx, %es
|
||||
.LoadStage2Loop:
|
||||
/* Load file data from disk */
|
||||
pushl %eax
|
||||
xorw %bx, %bx
|
||||
pushw %es
|
||||
call ReadCluster
|
||||
popw %es
|
||||
xorw %bx, %bx
|
||||
movb SectorsPerCluster - Start(%bp), %bl
|
||||
shlw $0x05, %bx
|
||||
movw %es, %ax
|
||||
addw %bx, %ax
|
||||
movw %ax, %es
|
||||
popl %eax
|
||||
pushw %es
|
||||
call GetFatEntry
|
||||
popw %es
|
||||
cmpl $0x0FFFFFF8, %eax
|
||||
jb .LoadStage2Loop
|
||||
ret
|
||||
|
||||
ParseExecutableHeader:
|
||||
/* Parse Stage2 PE/COFF executable header */
|
||||
pushw %es
|
||||
movw $(0xF800 / 16), %ax
|
||||
movw %ax, %es
|
||||
movl %es:60, %eax
|
||||
addl $(4 + 20), %eax
|
||||
movl %es:16(%eax), %eax
|
||||
addl $0xF800, %eax
|
||||
popw %es
|
||||
ret
|
||||
|
||||
ReadCluster:
|
||||
/* Read FAT32 cluster from disk */
|
||||
decl %eax
|
||||
decl %eax
|
||||
xorl %edx, %edx
|
||||
movzbl SectorsPerCluster - Start(%bp), %ebx
|
||||
mull %ebx
|
||||
pushl %eax
|
||||
xorl %edx, %edx
|
||||
movzbl FatCopies - Start(%bp), %eax
|
||||
mull BigSectorsPerFat - Start(%bp)
|
||||
movzwl ReservedSectors - Start(%bp), %ebx
|
||||
addl %ebx, %eax
|
||||
addl HiddenSectors - Start(%bp), %eax
|
||||
popl %ebx
|
||||
addl %ebx, %eax
|
||||
xorw %bx, %bx
|
||||
movzbw SectorsPerCluster - Start(%bp), %cx
|
||||
call ReadSectors
|
||||
ret
|
||||
|
||||
/* Include architecture specific code */
|
||||
.include ARCH_ESP_SOURCE
|
||||
|
||||
CpuUnsupported:
|
||||
/* Display CPU unsupported message and reboot */
|
||||
popal
|
||||
movw $.MsgCpuUnsupported, %si
|
||||
call Print
|
||||
jmp Reboot
|
||||
|
||||
FileNotFound:
|
||||
/* Display XTLDR not found message and reboot */
|
||||
movw $.MsgXtLdrNotFound, %si
|
||||
call Print
|
||||
jmp Reboot
|
||||
|
||||
Stage2NotLoaded:
|
||||
/* Clean up the stack and display XTLDR not found message and reboot */
|
||||
popl %esi
|
||||
jmp FileNotFound
|
||||
|
||||
.BootDirName:
|
||||
/* Boot directory name */
|
||||
.ascii "BOOT "
|
||||
|
||||
.EfiDirName:
|
||||
/* EFI directory name */
|
||||
.ascii "EFI "
|
||||
|
||||
.MsgCpuUnsupported:
|
||||
.ascii "CPU not supported!\r\n\0"
|
||||
|
||||
.MsgXtLdrNotFound:
|
||||
.ascii "XTLDR Stage2 not found!\r\n\0"
|
||||
|
||||
/* Fill the rest of the extra VBR with zeros and add signature */
|
||||
.fill (2043 - (. - Start)), 1, 0
|
||||
.ascii "XTLDR"
|
||||
124
boot/bootsect/i686/cpu.S
Normal file
124
boot/bootsect/i686/cpu.S
Normal file
@@ -0,0 +1,124 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: boot/bootsect/i686/cpu.S
|
||||
* DESCRIPTION: Low-level support for CPU initialization
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
|
||||
BuildPageMap:
|
||||
/* Generate page map for first 16MB of memory */
|
||||
pushaw
|
||||
pushw %es
|
||||
cld
|
||||
movw $(0x1000 >> 0x04), %ax
|
||||
movw %ax, %es
|
||||
xorw %di, %di
|
||||
movl $(0x2000 | 0x03), %eax
|
||||
stosl
|
||||
movl $(0x3000 | 0x03), %eax
|
||||
stosl
|
||||
movl $(0x4000 | 0x03), %eax
|
||||
stosl
|
||||
movl $(0x5000 | 0x03), %eax
|
||||
stosl
|
||||
xorl %eax, %eax
|
||||
movw $(1024 - 4), %cx
|
||||
rep stosl
|
||||
movl $0x00000003, %eax
|
||||
movl $4, %edx
|
||||
movw $(0x2000 >> 0x04), %bx
|
||||
.BuildPageMapLoop:
|
||||
/* Identity map 1024 pages of 4KB */
|
||||
movw %bx, %es
|
||||
xorw %di, %di
|
||||
pushl %edx
|
||||
movw $1024, %cx
|
||||
.FillPageMapTable:
|
||||
/* Fill the page table */
|
||||
movl %eax, %es:(%di)
|
||||
addl $4096, %eax
|
||||
addw $0x04, %di
|
||||
loop .FillPageMapTable
|
||||
popl %edx
|
||||
addw $(0x1000 >> 0x04), %bx
|
||||
decl %edx
|
||||
jnz .BuildPageMapLoop
|
||||
popw %es
|
||||
popaw
|
||||
ret
|
||||
|
||||
InitializeCpu:
|
||||
/* Check if CPU supports CPUID */
|
||||
pushal
|
||||
pushfl
|
||||
popl %eax
|
||||
movl %eax, %ebx
|
||||
xorl $0x00200000, %eax
|
||||
pushl %eax
|
||||
popfl
|
||||
pushfl
|
||||
popl %eax
|
||||
cmpl %ebx, %eax
|
||||
je CpuUnsupported
|
||||
popal
|
||||
call LoadGdt
|
||||
ret
|
||||
|
||||
LoadGdt:
|
||||
/* Load Global Descriptor Table */
|
||||
lgdt .GdtPointer
|
||||
ret
|
||||
|
||||
RunStage2:
|
||||
/* Switch to protected mode and pass control to Stage 2 */
|
||||
call BuildPageMap
|
||||
call ParseExecutableHeader
|
||||
pushl %eax
|
||||
cli
|
||||
movl %cr0, %eax
|
||||
orl $0x01, %eax
|
||||
movl %eax, %cr0
|
||||
ljmp $0x08, $.Stage2ProtectedMode
|
||||
.code32
|
||||
.Stage2ProtectedMode:
|
||||
/* Set segments and stack, then jump to Stage 2 */
|
||||
movw $0x10, %ax
|
||||
movw %ax, %ds
|
||||
movw %ax, %es
|
||||
movw %ax, %ss
|
||||
xorw %ax, %ax
|
||||
movw %ax, %fs
|
||||
movw %ax, %gs
|
||||
popl %eax
|
||||
xorl %ebx, %ebx
|
||||
xorl %ecx, %ecx
|
||||
xorl %edx, %edx
|
||||
xorl %esi, %esi
|
||||
xorl %edi, %edi
|
||||
xorl %ebp, %ebp
|
||||
movl $0x1000, %ebx
|
||||
movl %ebx, %cr3
|
||||
movl %cr0, %ebx
|
||||
orl $0x80000000, %ebx
|
||||
movl %ebx, %cr0
|
||||
jmp *%eax
|
||||
|
||||
.code16
|
||||
.GdtDescriptor:
|
||||
/* Global Descriptor Table */
|
||||
.quad 0x0000000000000000
|
||||
.quad 0x00CF9A000000FFFF
|
||||
.quad 0x00CF92000000FFFF
|
||||
.quad 0x00009E000000FFFF
|
||||
.quad 0x000092000000FFFF
|
||||
|
||||
.GdtPointer:
|
||||
/* Pointer to Global Descriptor Table */
|
||||
.word .GdtPointer - .GdtDescriptor - 1
|
||||
.long .GdtDescriptor
|
||||
|
||||
.Stage2FileName:
|
||||
/* Name of Stage 2 executable file */
|
||||
.ascii "BOOTIA32EFI"
|
||||
154
boot/bootsect/mbrboot.S
Normal file
154
boot/bootsect/mbrboot.S
Normal file
@@ -0,0 +1,154 @@
|
||||
/**
|
||||
* 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>
|
||||
* Aiken Harris <aiken@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
|
||||
@@ -16,6 +16,7 @@ list(APPEND LIBXTLDR_SOURCE
|
||||
# Specify list of source code files
|
||||
list(APPEND XTLDR_SOURCE
|
||||
${XTLDR_SOURCE_DIR}/arch/${ARCH}/memory.cc
|
||||
${XTLDR_SOURCE_DIR}/biosutil.cc
|
||||
${XTLDR_SOURCE_DIR}/bootutil.cc
|
||||
${XTLDR_SOURCE_DIR}/config.cc
|
||||
${XTLDR_SOURCE_DIR}/console.cc
|
||||
@@ -38,6 +39,9 @@ add_executable(xtldr ${XTLDR_SOURCE})
|
||||
# Add linker libraries
|
||||
target_link_libraries(xtldr libxtos)
|
||||
|
||||
# Add linker options
|
||||
target_link_options(xtldr PRIVATE /ALIGN:512)
|
||||
|
||||
# Set proper binary name and install target
|
||||
if(ARCH STREQUAL "i686")
|
||||
set(BINARY_NAME "bootia32")
|
||||
@@ -49,5 +53,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)
|
||||
190
boot/xtldr/biosutil.cc
Normal file
190
boot/xtldr/biosutil.cc
Normal file
@@ -0,0 +1,190 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/biosutil.cc
|
||||
* DESCRIPTION: Legacy BIOS support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtldr.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Clears the entire screen and moves the cursor to the top-left corner.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
BiosUtils::ClearScreen()
|
||||
{
|
||||
VOLATILE PUSHORT VgaBuffer = (PUSHORT)0xB8000;
|
||||
USHORT Blank;
|
||||
UINT Index;
|
||||
|
||||
/* Set blank character */
|
||||
Blank = (0x0F << 8) | L' ';
|
||||
|
||||
/* Fill the entire screen with blank characters */
|
||||
for(Index = 0; Index < VgaWidth * VgaHeight; Index++)
|
||||
{
|
||||
VgaBuffer[Index] = Blank;
|
||||
}
|
||||
|
||||
/* Reset cursor position to the top-left corner */
|
||||
CursorX = 0;
|
||||
CursorY = 0;
|
||||
|
||||
/* Update the hardware cursor position */
|
||||
UpdateCursor();
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats the input string and prints it out to the screen.
|
||||
*
|
||||
* @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
|
||||
BiosUtils::Print(IN PCWSTR Format,
|
||||
IN ...)
|
||||
{
|
||||
RTL_PRINT_CONTEXT PrintContext;
|
||||
VA_LIST Arguments;
|
||||
|
||||
/* Initialise the print contexts */
|
||||
PrintContext.WriteWideCharacter = PutChar;
|
||||
|
||||
/* Initialise the va_list */
|
||||
VA_START(Arguments, Format);
|
||||
|
||||
/* Format and print the string to the stdout */
|
||||
RTL::WideString::FormatWideString(&PrintContext, (PWCHAR)Format, Arguments);
|
||||
|
||||
/* Clean up the va_list */
|
||||
VA_END(Arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a single wide character to the screen using legacy BIOS VGA text mode.
|
||||
*
|
||||
* @param Character
|
||||
* The wide character to be printed.
|
||||
*
|
||||
* @return This routine returns a status code.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
XTSTATUS
|
||||
BiosUtils::PutChar(IN WCHAR Character)
|
||||
{
|
||||
VOLATILE PUSHORT VgaBuffer = (PUSHORT)0xB8000;
|
||||
USHORT VgaCharacter;
|
||||
|
||||
/* Handle special characters */
|
||||
if(Character == L'\n')
|
||||
{
|
||||
/* Move to the next line */
|
||||
CursorX = 0;
|
||||
CursorY++;
|
||||
}
|
||||
else if(Character == L'\r')
|
||||
{
|
||||
/* Move to the beginning of the current line */
|
||||
CursorX = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Print character and move cursor to the right */
|
||||
VgaCharacter = (0x0F << 8) | (Character & 0xFF);
|
||||
VgaBuffer[CursorY * VgaWidth + CursorX] = VgaCharacter;
|
||||
CursorX++;
|
||||
}
|
||||
|
||||
/* Handle moving to the next line if cursor is at the end of the line */
|
||||
if(CursorX >= VgaWidth)
|
||||
{
|
||||
CursorX = 0;
|
||||
CursorY++;
|
||||
}
|
||||
|
||||
/* Handle scrolling if cursor is at the end of the screen */
|
||||
if(CursorY >= VgaHeight)
|
||||
{
|
||||
ScrollScreen();
|
||||
CursorY = VgaHeight - 1;
|
||||
}
|
||||
|
||||
/* Update the hardware cursor position */
|
||||
UpdateCursor();
|
||||
|
||||
/* Return success */
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scrolls the entire screen content up by one line and clears the last line.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
BiosUtils::ScrollScreen()
|
||||
{
|
||||
VOLATILE PUSHORT VgaBuffer = (PUSHORT)0xB8000;
|
||||
USHORT Blank;
|
||||
UINT Index;
|
||||
|
||||
/* Set blank character */
|
||||
Blank = (0x0F << 8) | L' ';
|
||||
|
||||
/* Move every line up by one */
|
||||
for(Index = 0; Index < (VgaHeight - 1) * VgaWidth; Index++)
|
||||
{
|
||||
VgaBuffer[Index] = VgaBuffer[Index + VgaWidth];
|
||||
}
|
||||
|
||||
/* Clear the last line */
|
||||
for(Index = (VgaHeight - 1) * VgaWidth; Index < VgaHeight * VgaWidth; Index++)
|
||||
{
|
||||
VgaBuffer[Index] = Blank;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the hardware cursor position on the screen.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
BiosUtils::UpdateCursor()
|
||||
{
|
||||
USHORT Position;
|
||||
|
||||
/* Calculate cursor position */
|
||||
Position = CursorY * VgaWidth + CursorX;
|
||||
|
||||
/* Send command to set the high byte of the cursor position */
|
||||
HL::IoPort::WritePort8(0x3D4, 0x0E);
|
||||
HL::IoPort::WritePort8(0x3D5, (UCHAR)((Position >> 8) & 0xFF));
|
||||
|
||||
/* Send command to set the low byte of the cursor position */
|
||||
HL::IoPort::WritePort8(0x3D4, 0x0F);
|
||||
HL::IoPort::WritePort8(0x3D5, (UCHAR)(Position & 0xFF));
|
||||
}
|
||||
@@ -362,6 +362,13 @@ Configuration::InitializeBootMenuList(IN ULONG MaxNameLength,
|
||||
return STATUS_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the XTLDR configuration subsystem.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
Configuration::InitializeConfiguration()
|
||||
@@ -615,7 +622,7 @@ Configuration::ParseConfigFile(IN CONST PCHAR RawConfig,
|
||||
SectionName = InputData;
|
||||
|
||||
/* Find end of the section name */
|
||||
while(*InputData != ']' && *InputData != '\0' && *InputData != '\n')
|
||||
while(*InputData != ']' && *InputData != '\0' && *InputData != '\r' && *InputData != '\n')
|
||||
{
|
||||
/* Advance to the next character */
|
||||
InputData++;
|
||||
@@ -665,7 +672,7 @@ Configuration::ParseConfigFile(IN CONST PCHAR RawConfig,
|
||||
Key = InputData;
|
||||
|
||||
/* Find end of the key */
|
||||
while(*InputData != '=' && *InputData != '\0' && *InputData != '\n')
|
||||
while(*InputData != '=' && *InputData != '\0' && *InputData != '\r' && *InputData != '\n')
|
||||
{
|
||||
/* Advance to the next character */
|
||||
InputData++;
|
||||
@@ -693,7 +700,7 @@ Configuration::ParseConfigFile(IN CONST PCHAR RawConfig,
|
||||
Value = InputData;
|
||||
|
||||
/* Find end of the value */
|
||||
while(*InputData != '\0' && *InputData != '\n')
|
||||
while(*InputData != '\0' && *InputData != '\r' && *InputData != '\n')
|
||||
{
|
||||
/* Advance to the next character */
|
||||
InputData++;
|
||||
@@ -10,6 +10,18 @@
|
||||
#include <xtldr.hh>
|
||||
|
||||
|
||||
/* Legacy BIOS cursor X position */
|
||||
USHORT BiosUtils::CursorX = 0;
|
||||
|
||||
/* Legacy BIOS cursor Y position */
|
||||
USHORT BiosUtils::CursorY = 0;
|
||||
|
||||
/* Legacy BIOS screen height */
|
||||
CONST USHORT BiosUtils::VgaHeight = 25;
|
||||
|
||||
/* Legacy BIOS screen width */
|
||||
CONST USHORT BiosUtils::VgaWidth = 80;
|
||||
|
||||
/* XT Boot Loader menu list */
|
||||
PLIST_ENTRY Configuration::BootMenuList = NULLPTR;
|
||||
|
||||
@@ -387,9 +387,16 @@ Debug::PutChar(IN WCHAR Character)
|
||||
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 (BOOLEAN)(SerialPort.Flags & COMPORT_FLAG_INIT);
|
||||
return (SerialPort.Flags & COMPORT_FLAG_INIT);
|
||||
}
|
||||
@@ -13,9 +13,27 @@
|
||||
#include <xtver.h>
|
||||
|
||||
#include <libxtos.hh>
|
||||
#include <globals.hh>
|
||||
|
||||
|
||||
class BiosUtils
|
||||
{
|
||||
private:
|
||||
STATIC USHORT CursorX;
|
||||
STATIC USHORT CursorY;
|
||||
STATIC CONST USHORT VgaHeight;
|
||||
STATIC CONST USHORT VgaWidth;
|
||||
|
||||
public:
|
||||
STATIC XTCDECL VOID ClearScreen();
|
||||
STATIC XTCDECL VOID Print(IN PCWSTR Format,
|
||||
IN ...);
|
||||
STATIC XTCDECL XTSTATUS PutChar(IN WCHAR Character);
|
||||
|
||||
private:
|
||||
STATIC XTCDECL VOID ScrollScreen();
|
||||
STATIC XTCDECL VOID UpdateCursor();
|
||||
};
|
||||
|
||||
class BootUtils
|
||||
{
|
||||
public:
|
||||
@@ -414,7 +414,6 @@ Xtos::InitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
{
|
||||
PKERNEL_INITIALIZATION_BLOCK LoaderBlock;
|
||||
EFI_PHYSICAL_ADDRESS Address;
|
||||
// PVOID RuntimeServices;
|
||||
EFI_STATUS Status;
|
||||
UINT BlockPages;
|
||||
UINT ParametersSize;
|
||||
@@ -445,20 +444,10 @@ Xtos::InitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap,
|
||||
/* Set LoaderInformation block properties */
|
||||
LoaderBlock->LoaderInformation.DbgPrint = (PVOID)XtLdrProtocol->Debug.Print;
|
||||
|
||||
/* Attempt to find virtual address of the EFI Runtime Services */
|
||||
// Status = XtLdrProtocol->GetVirtualAddress(MemoryMappings, &EfiSystemTable->RuntimeServices->Hdr, &RuntimeServices);
|
||||
// if(Status == STATUS_EFI_SUCCESS)
|
||||
// {
|
||||
/* Set FirmwareInformation block properties */
|
||||
LoaderBlock->FirmwareInformation.FirmwareType = SystemFirmwareEfi;
|
||||
LoaderBlock->FirmwareInformation.EfiFirmware.EfiVersion = 0; //EfiSystemTable->Hdr.Revision;
|
||||
// LoaderBlock->FirmwareInformation.EfiFirmware.EfiVersion = EfiSystemTable->Hdr.Revision;
|
||||
LoaderBlock->FirmwareInformation.EfiFirmware.EfiRuntimeServices = NULLPTR;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// /* Set invalid firmware type to indicate that kernel cannot rely on FirmwareInformation block */
|
||||
// LoaderBlock->FirmwareInformation.FirmwareType = SystemFirmwareInvalid;
|
||||
// }
|
||||
|
||||
/* Copy parameters to kernel initialization block */
|
||||
LoaderBlock->KernelParameters = (PWCHAR)((UINT_PTR)*VirtualAddress + sizeof(KERNEL_INITIALIZATION_BLOCK));
|
||||
@@ -663,7 +652,7 @@ Xtos::RunBootSequence(IN PEFI_FILE_HANDLE BootDir,
|
||||
/* Add kernel image memory mapping */
|
||||
Status = XtLdrProtocol->Memory.MapVirtualMemory(&PageMap, ImageContext->VirtualAddress,
|
||||
ImageContext->PhysicalAddress, ImageContext->ImagePages,
|
||||
LoaderExceptionBlock); // 0 is LoaderExceptionBlock?! Should be LoaderSystemCode?
|
||||
LoaderSystemCode);
|
||||
if(Status != STATUS_EFI_SUCCESS)
|
||||
{
|
||||
return Status;
|
||||
@@ -9,6 +9,13 @@
|
||||
#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()
|
||||
@@ -17,6 +24,13 @@ XtLoader::DisableBootServices()
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 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()
|
||||
@@ -24,6 +38,13 @@ 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()
|
||||
@@ -31,6 +52,13 @@ 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()
|
||||
@@ -38,6 +66,19 @@ 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,
|
||||
@@ -47,6 +88,13 @@ XtLoader::GetLoaderImageInformation(PVOID *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()
|
||||
@@ -143,6 +191,13 @@ XtLoader::RegisterBootMenu(IN PVOID BootMenuRoutine)
|
||||
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()
|
||||
@@ -181,6 +236,15 @@ BlStartXtLoader(IN EFI_HANDLE ImageHandle,
|
||||
PWCHAR Modules;
|
||||
EFI_STATUS Status;
|
||||
|
||||
/* Check if system is EFI-based and provided parameters are valid */
|
||||
if(ImageHandle == NULLPTR || SystemTable == NULLPTR)
|
||||
{
|
||||
/* Invalid parameters, print error message using BIOS calls and hang */
|
||||
BiosUtils::ClearScreen();
|
||||
BiosUtils::Print(L"XTLDR requires EFI-based system!");
|
||||
for(;;);
|
||||
}
|
||||
|
||||
/* Initialize XTLDR and */
|
||||
XtLoader::InitializeBootLoader(ImageHandle, SystemTable);
|
||||
|
||||
@@ -4,48 +4,41 @@
|
||||
# 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!"
|
||||
Write-Error "XTChain not detected or corrupted!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Set target architecture
|
||||
if ($env:TARGET) {
|
||||
$ARCH = $env:TARGET
|
||||
} else {
|
||||
$ARCH = "amd64"
|
||||
}
|
||||
# Set target architecture defaulting to amd64
|
||||
$ARCH = if ($env:TARGET) { $env:TARGET } else { "amd64" }
|
||||
|
||||
# Set target build type
|
||||
if (-not $env:BUILD_TYPE) {
|
||||
$env:BUILD_TYPE = "DEBUG"
|
||||
}
|
||||
# Set target build type defaulting to Debug
|
||||
$env:BUILD_TYPE = if ($env:BUILD_TYPE -in @("Debug", "Release")) { $env:BUILD_TYPE } else { "Debug" }
|
||||
|
||||
# Set variables
|
||||
$EXECTOS_SOURCE_DIR = (Get-Location).Path
|
||||
$EXECTOS_BINARY_DIR = "build-$($ARCH)-$($env:BUILD_TYPE.ToLower())"
|
||||
$EXECTOS_SOURCE_DIR = $PSScriptRoot
|
||||
$EXECTOS_BINARY_DIR = Join-Path $EXECTOS_SOURCE_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"
|
||||
# Create build directory
|
||||
if (-not (Test-Path $EXECTOS_BINARY_DIR)) {
|
||||
Write-Host "Creating build directory: $EXECTOS_BINARY_DIR"
|
||||
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
|
||||
Remove-Item -Path "CMakeCache.txt" -ErrorAction SilentlyContinue
|
||||
Remove-Item -Path "host-tools/CMakeCache.txt" -ErrorAction SilentlyContinue
|
||||
Remove-Item "CMakeCache.txt", "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
|
||||
& 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."
|
||||
Write-Error "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."
|
||||
}
|
||||
|
||||
$ARCH | Out-File -Encoding ASCII -NoNewline "build.arch"
|
||||
Write-Host "Configure completed. Run 'xbuild' to build ExectOS."
|
||||
@@ -1,2 +1,3 @@
|
||||
# Set base addresses for all modules
|
||||
set(BASEADDRESS_XTLDR 0x000000000000F800)
|
||||
set(BASEADDRESS_XTOSKRNL 0x0000000140000000)
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
# Set base addresses for all modules
|
||||
set(BASEADDRESS_XTLDR 0x0000F800)
|
||||
set(BASEADDRESS_XTOSKRNL 0x00400000)
|
||||
|
||||
@@ -8,41 +8,79 @@ endif()
|
||||
# This target creates a disk image
|
||||
add_custom_target(diskimg
|
||||
DEPENDS install
|
||||
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
|
||||
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
|
||||
VERBATIM)
|
||||
|
||||
# This target starts up a BOCHS+OVMF virtual machine
|
||||
add_custom_target(bochsvm
|
||||
find_program(BOCHS_EMULATOR bochs)
|
||||
if(BOCHS_EMULATOR)
|
||||
# This target starts up a BOCHS+BIOS virtual machine
|
||||
add_custom_target(bochsvm
|
||||
DEPENDS diskimg
|
||||
COMMAND bochs -f ../sdk/firmware/bochsrc_${ARCH}.cfg -q -unlock
|
||||
VERBATIM USES_TERMINAL)
|
||||
endif()
|
||||
|
||||
# This target starts up a QEMU+OVMF virtual machine using KVM accelerator
|
||||
add_custom_target(testkvm
|
||||
find_program(QEMU_EMULATOR ${QEMU_COMMAND})
|
||||
if(QEMU_EMULATOR)
|
||||
if(CMAKE_HOST_LINUX)
|
||||
# This target starts up a QEMU+OVMF virtual machine using KVM accelerator
|
||||
add_custom_target(testefikvm
|
||||
DEPENDS install
|
||||
COMMAND ${QEMU_COMMAND} -name "ExectOS-${ARCH}-KVM" -machine type=q35,kernel_irqchip=on,accel=kvm,mem-merge=off,vmport=off -enable-kvm -cpu host,-hypervisor,+topoext
|
||||
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
|
||||
-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
|
||||
-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)
|
||||
|
||||
# This target starts up a QEMU+OVMF virtual machine using TCG accelerator
|
||||
add_custom_target(testtcg
|
||||
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}-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
|
||||
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
|
||||
add_custom_target(testefitcg
|
||||
DEPENDS install
|
||||
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
|
||||
-bios ${EXECTOS_SOURCE_DIR}/sdk/firmware/ovmf_${ARCH}.fd
|
||||
-hda fat:rw:${EXECTOS_BINARY_DIR}/output/binaries
|
||||
-boot menu=on -d int -no-reboot -no-shutdown -serial stdio
|
||||
VERBATIM USES_TERMINAL)
|
||||
|
||||
if(CMAKE_HOST_LINUX)
|
||||
# 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,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
|
||||
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
|
||||
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,18 +59,48 @@ function(add_module_linker_flags MODULE FLAGS)
|
||||
set_module_property(${MODULE} LINK_FLAGS ${FLAGS})
|
||||
endfunction()
|
||||
|
||||
# This function sets a property for specified module
|
||||
function(set_module_property MODULE PROPERTY FLAGS)
|
||||
if(NOT ${ARGC} EQUAL 3)
|
||||
message(FATAL_ERROR "Invalid number of arguments passwd to add_module_property() function")
|
||||
endif()
|
||||
get_target_property(VAL ${MODULE} ${PROPERTY})
|
||||
if(VAL)
|
||||
set(VAL "${VAL} ${FLAGS}")
|
||||
else()
|
||||
set(VAL "${FLAGS}")
|
||||
endif()
|
||||
set_property(TARGET ${MODULE} PROPERTY ${PROPERTY} ${VAL})
|
||||
# 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")
|
||||
|
||||
get_directory_property(DEFS COMPILE_DEFINITIONS)
|
||||
foreach(def ${DEFS})
|
||||
list(APPEND ASM_DEFS "-D${def}")
|
||||
endforeach()
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
|
||||
COMMAND ${CMAKE_ASM_COMPILER}
|
||||
/nologo
|
||||
--target=i386-none-elf
|
||||
${ASM_DEFS}
|
||||
-I${CMAKE_CURRENT_SOURCE_DIR}
|
||||
/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
|
||||
@@ -89,6 +119,20 @@ function(set_install_target TARGET DESTINATION)
|
||||
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)
|
||||
message(FATAL_ERROR "Invalid number of arguments passwd to add_module_property() function")
|
||||
endif()
|
||||
get_target_property(VAL ${MODULE} ${PROPERTY})
|
||||
if(VAL)
|
||||
set(VAL "${VAL} ${FLAGS}")
|
||||
else()
|
||||
set(VAL "${FLAGS}")
|
||||
endif()
|
||||
set_property(TARGET ${MODULE} PROPERTY ${PROPERTY} ${VAL})
|
||||
endfunction()
|
||||
|
||||
function(set_sdk_target FILENAME DESTINATION)
|
||||
install(DIRECTORY ${FILENAME} DESTINATION ${EXECTOS_BINARY_DIR}/output/sdk/${DESTINATION})
|
||||
endfunction()
|
||||
@@ -102,11 +146,3 @@ 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,8 +3,10 @@ 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)
|
||||
|
||||
@@ -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/ovmf_pure_amd64.fd", address=0x00000000, options=none
|
||||
romimage: file="../sdk/firmware/rombios.bin", address=0x00000000, options=none
|
||||
vgaromimage: file="../sdk/firmware/vgabios.bin"
|
||||
boot: floppy
|
||||
boot: disk
|
||||
floppy_bootsig_check: disabled=0
|
||||
floppya: type=1_44
|
||||
# no floppyb
|
||||
@@ -27,11 +27,7 @@ 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=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
|
||||
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
|
||||
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/ovmf_pure_i686.fd", address=0x00000000, options=none
|
||||
romimage: file="../sdk/firmware/rombios.bin", address=0x00000000, options=none
|
||||
vgaromimage: file="../sdk/firmware/vgabios.bin"
|
||||
boot: floppy
|
||||
boot: disk
|
||||
floppy_bootsig_check: disabled=0
|
||||
floppya: type=1_44
|
||||
# no floppyb
|
||||
@@ -27,11 +27,7 @@ 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=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
|
||||
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
|
||||
print_timestamps: enabled=0
|
||||
port_e9_hack: enabled=0
|
||||
private_colormap: enabled=0
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
sdk/firmware/rombios.bin
Normal file
BIN
sdk/firmware/rombios.bin
Normal file
Binary file not shown.
@@ -272,11 +272,18 @@ typedef struct _KIDTENTRY
|
||||
{
|
||||
USHORT OffsetLow;
|
||||
USHORT Selector;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
USHORT IstIndex:3;
|
||||
USHORT Reserved0:5;
|
||||
USHORT Type:5;
|
||||
USHORT Dpl:2;
|
||||
USHORT Present:1;
|
||||
};
|
||||
USHORT Access;
|
||||
};
|
||||
USHORT OffsetMiddle;
|
||||
ULONG OffsetHigh;
|
||||
ULONG Reserved1;
|
||||
|
||||
@@ -58,12 +58,6 @@
|
||||
#define KIDT_ACCESS_RING0 0x00
|
||||
#define KIDT_ACCESS_RING3 0x60
|
||||
|
||||
/* IDT gate types */
|
||||
#define KIDT_TASK 0x05
|
||||
#define KIDT_CALL 0x0C
|
||||
#define KIDT_INTERRUPT 0x0E
|
||||
#define KIDT_TRAP 0x0F
|
||||
|
||||
/* TSS Offsets */
|
||||
#define KTSS_ESP0 0x04
|
||||
#define KTSS_CR3 0x1C
|
||||
@@ -284,7 +278,18 @@ typedef struct _KIDTENTRY
|
||||
{
|
||||
USHORT Offset;
|
||||
USHORT Selector;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
UCHAR Reserved;
|
||||
UCHAR Type:4;
|
||||
UCHAR Flag:1;
|
||||
UCHAR Dpl:2;
|
||||
UCHAR Present:1;
|
||||
};
|
||||
USHORT Access;
|
||||
};
|
||||
USHORT ExtendedOffset;
|
||||
} KIDTENTRY, *PKIDTENTRY;
|
||||
|
||||
|
||||
@@ -15,14 +15,26 @@
|
||||
#define XTCLINK extern "C"
|
||||
#define NULLPTR nullptr
|
||||
|
||||
/* C++ types */
|
||||
/* 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 types */
|
||||
/* C boolean type */
|
||||
typedef enum _BOOLEAN
|
||||
{
|
||||
FALSE = 0,
|
||||
TRUE = 1
|
||||
} BOOLEAN, *PBOOLEAN;
|
||||
|
||||
/* C widechar type */
|
||||
typedef unsigned short wchar;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
|
||||
/* 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;
|
||||
|
||||
@@ -150,13 +150,6 @@ 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
|
||||
{
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtldr/includes/globals.hh
|
||||
* DESCRIPTION: XTLDR global variables
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#ifndef __XTLDR_GLOBALS_HH
|
||||
#define __XTLDR_GLOBALS_HH
|
||||
|
||||
#include <xtblapi.h>
|
||||
|
||||
|
||||
/* XT Boot Loader registered boot protocol list */
|
||||
EXTERN LIST_ENTRY BlpBootProtocols;
|
||||
|
||||
/* XT Boot Loader serial ports list */
|
||||
EXTERN ULONG BlComPortList[COMPORT_COUNT];
|
||||
|
||||
/* XT Boot Loader configuration list */
|
||||
EXTERN LIST_ENTRY BlpConfig;
|
||||
|
||||
/* XT Boot Loader loaded configuration */
|
||||
EXTERN LIST_ENTRY BlpConfigSections;
|
||||
|
||||
/* List of user-editable boot options */
|
||||
EXTERN PCWSTR BlpEditableConfigOptions[];
|
||||
|
||||
/* XT Boot Loader protocol */
|
||||
EXTERN XTBL_LOADER_PROTOCOL BlpLdrProtocol;
|
||||
|
||||
/* XT Boot Loader loaded modules list */
|
||||
EXTERN LIST_ENTRY BlpLoadedModules;
|
||||
|
||||
/* XT Boot Loader menu list */
|
||||
EXTERN PLIST_ENTRY BlpMenuList;
|
||||
|
||||
/* XT Boot Loader status data */
|
||||
EXTERN XTBL_STATUS BlpStatus;
|
||||
|
||||
/* List of available block devices */
|
||||
EXTERN LIST_ENTRY EfiBlockDevices;
|
||||
|
||||
/* EFI Image Handle */
|
||||
EXTERN EFI_HANDLE EfiImageHandle;
|
||||
|
||||
/* EFI System Table */
|
||||
EXTERN PEFI_SYSTEM_TABLE EfiSystemTable;
|
||||
|
||||
#endif /* __XTLDR_GLOBALS_HH */
|
||||
@@ -4,8 +4,8 @@ within the XTOS kernel space. It is responsible for various core services, such
|
||||
management, and process scheduling. The kernel contains the scheduler (sometimes referred to as the Dispatcher), the
|
||||
cache, object, and memory managers, the security manager, and other executive components described below.
|
||||
|
||||
All routines in the kernel are prefixed to indicate the subsystem they belong to, and their source code is organized
|
||||
into corresponding directories. These subsystems include:
|
||||
The source code of the kernel is organized into subsystem-specific directories. Each directory name also defines the
|
||||
corresponding C++ namespace in which the subsystem's classes and routines reside. These subsystems include:
|
||||
|
||||
* Ar - Architecture-specific Library
|
||||
* Ex - Kernel Executive
|
||||
@@ -56,13 +56,20 @@ routines, for use by other kernel components.
|
||||
|
||||
## Function Naming Convention
|
||||
All kernel functions adhere to a strict naming convention to enhance code readability and maintainability. The structure
|
||||
of a function name is generally composed of three parts: <Prefix><Operation><Object>
|
||||
of all public interfaces exposed by the kernel are generally composed of three parts:
|
||||
<Prefix><Operation><Object>
|
||||
|
||||
The prefix identifies the component to which the function belongs. Additionally, the prefix indicates the function's
|
||||
visibility. Private functions, which should not be called from outside their own module, have a 'p' appended to their
|
||||
prefix.
|
||||
|
||||
For example, consider the **KepInitializeStack()** routine:
|
||||
* **Kep** - The prefix indicates a private (p) routine belonging to the Core Kernel Library (Ke).
|
||||
The prefix identifies the component to which the function belongs. For example, consider the **KeInitializeThread()**
|
||||
routine:
|
||||
* **Ke** - The prefix indicates a routine belonging to the Core Kernel Library (Ke).
|
||||
* **Initialize** - The operation performed by the function.
|
||||
* **Stack** - The object on which the operation is performed.
|
||||
* **Thread** - The object on which the operation is performed.
|
||||
|
||||
For all C++ code inside the kernel the naming model has evolved. Consider the **KE::KThread::InitializeThread()**
|
||||
routine:
|
||||
* **KE** - The namespace replaces the prefix and indicates the subsystem. Namespaces are written in uppercase and no
|
||||
longer use the trailing p for private routines, because classes use C++ visibility to control access.
|
||||
* **KThread** - Within each namespace, related functionality is grouped into classes, which encapsulate variables and
|
||||
methods.
|
||||
* **InitializeThread** - Method names follow the `<Operation><Object>` pattern.
|
||||
|
||||
@@ -249,34 +249,34 @@ AR::ProcSup::InitializeIdt(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||
for(Vector = 0; Vector < IDT_ENTRIES; Vector++)
|
||||
{
|
||||
/* Set the IDT to handle unexpected interrupts */
|
||||
SetIdtGate(ProcessorBlock->IdtBase, Vector, (PVOID)ArTrap0xFF, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, Vector, (PVOID)ArTrap0xFF, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
}
|
||||
|
||||
/* Setup IDT handlers for known interrupts and traps */
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x00, (PVOID)ArTrap0x00, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x01, (PVOID)ArTrap0x01, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x02, (PVOID)ArTrap0x02, KGDT_R0_CODE, KIDT_IST_PANIC, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x03, (PVOID)ArTrap0x03, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x04, (PVOID)ArTrap0x04, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x05, (PVOID)ArTrap0x05, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x06, (PVOID)ArTrap0x06, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x07, (PVOID)ArTrap0x07, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x08, (PVOID)ArTrap0x08, KGDT_R0_CODE, KIDT_IST_PANIC, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x09, (PVOID)ArTrap0x09, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0A, (PVOID)ArTrap0x0A, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0B, (PVOID)ArTrap0x0B, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0C, (PVOID)ArTrap0x0C, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0D, (PVOID)ArTrap0x0D, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0E, (PVOID)ArTrap0x0E, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x10, (PVOID)ArTrap0x10, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x11, (PVOID)ArTrap0x11, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x12, (PVOID)ArTrap0x12, KGDT_R0_CODE, KIDT_IST_MCA, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x13, (PVOID)ArTrap0x13, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x1F, (PVOID)ArTrap0x1F, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2C, (PVOID)ArTrap0x2C, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2D, (PVOID)ArTrap0x2D, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2F, (PVOID)ArTrap0x2F, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0xE1, (PVOID)ArTrap0xE1, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x00, (PVOID)ArTrap0x00, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x01, (PVOID)ArTrap0x01, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x02, (PVOID)ArTrap0x02, KGDT_R0_CODE, KIDT_IST_PANIC, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x03, (PVOID)ArTrap0x03, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x04, (PVOID)ArTrap0x04, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x05, (PVOID)ArTrap0x05, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x06, (PVOID)ArTrap0x06, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x07, (PVOID)ArTrap0x07, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x08, (PVOID)ArTrap0x08, KGDT_R0_CODE, KIDT_IST_PANIC, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x09, (PVOID)ArTrap0x09, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0A, (PVOID)ArTrap0x0A, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0B, (PVOID)ArTrap0x0B, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0C, (PVOID)ArTrap0x0C, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0D, (PVOID)ArTrap0x0D, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0E, (PVOID)ArTrap0x0E, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x10, (PVOID)ArTrap0x10, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x11, (PVOID)ArTrap0x11, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x12, (PVOID)ArTrap0x12, KGDT_R0_CODE, KIDT_IST_MCA, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x13, (PVOID)ArTrap0x13, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x1F, (PVOID)ArTrap0x1F, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2C, (PVOID)ArTrap0x2C, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2D, (PVOID)ArTrap0x2D, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2F, (PVOID)ArTrap0x2F, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0xE1, (PVOID)ArTrap0xE1, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -636,6 +636,9 @@ AR::ProcSup::SetGdtEntryBase(IN PKGDTENTRY Gdt,
|
||||
* @param Access
|
||||
* Supplies the gate access rights.
|
||||
*
|
||||
* @param Type
|
||||
* Supplies the gate type.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
@@ -647,15 +650,22 @@ AR::ProcSup::SetIdtGate(IN PKIDTENTRY Idt,
|
||||
IN PVOID Handler,
|
||||
IN USHORT Selector,
|
||||
IN USHORT Ist,
|
||||
IN USHORT Access)
|
||||
IN USHORT Dpl,
|
||||
IN USHORT Type)
|
||||
{
|
||||
/* Setup the gate */
|
||||
/* Set the handler's address */
|
||||
Idt[Vector].OffsetLow = ((ULONG_PTR)Handler & 0xFFFF);
|
||||
Idt[Vector].OffsetMiddle = (((ULONG_PTR)Handler >> 16) & 0xFFFF);
|
||||
Idt[Vector].OffsetHigh = (ULONG_PTR)Handler >> 32;
|
||||
Idt[Vector].Dpl = Access;
|
||||
|
||||
/* Set the code segment selector */
|
||||
Idt[Vector].Selector = Selector;
|
||||
|
||||
/* Initialize the gate's attributes and flags */
|
||||
Idt[Vector].Access = 0;
|
||||
Idt[Vector].Dpl = Dpl;
|
||||
Idt[Vector].IstIndex = Ist;
|
||||
Idt[Vector].Present = 1;
|
||||
Idt[Vector].Selector = Selector;
|
||||
Idt[Vector].Type = 0xE;
|
||||
Idt[Vector].Reserved1 = 0;
|
||||
Idt[Vector].Type = Type;
|
||||
}
|
||||
|
||||
@@ -23,6 +23,25 @@ XTCDECL
|
||||
VOID
|
||||
AR::Traps::DispatchTrap(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Caught trap: 0x%.2llX with error code: %.4llX at RIP: 0x%.16llX\n"
|
||||
L"RAX: 0x%.16llX, RBX: 0x%.16llX, RCX: 0x%.16llX, RDX: 0x%.16llX\n"
|
||||
L"R8: 0x%.16llX, R9: 0x%.16llX, R10: 0x%.16llX, R11: 0x%.16llX\n"
|
||||
L"R12: 0x%.16llX, R13: 0x%.16llX, R14: 0x%.16llX, R15: 0x%.16llX\n"
|
||||
L"RBP: 0x%.16llX, RSP: 0x%.16llX, RDI: 0x%.16llX, RSI: 0x%.16llX\n"
|
||||
L"DR0: 0x%.16llX, DR1: 0x%.16llX, DR2: 0x%.16llX, DR3: 0x%.16llX\n"
|
||||
L"DR6: 0x%.16llX, DR7: 0x%.16llX\n"
|
||||
L"CR2: 0x%.16llX, CR3: 0x%.16llX, CS: 0x%.16llX, DS: 0x%.16hX\n"
|
||||
L"ES: 0x%.16hX, FS: 0x%.16hX, GS: 0x%.16hX, SS: 0x%.16llX\n",
|
||||
TrapFrame->Vector, TrapFrame->ErrorCode, TrapFrame->Rip,
|
||||
TrapFrame->Rax, TrapFrame->Rbx, TrapFrame->Rcx, TrapFrame->Rdx,
|
||||
TrapFrame->R8, TrapFrame->R9, TrapFrame->R10, TrapFrame->R11,
|
||||
TrapFrame->R12, TrapFrame->R13, TrapFrame->R14, TrapFrame->R15,
|
||||
TrapFrame->Rbp, TrapFrame->Rsp, TrapFrame->Rdi, TrapFrame->Rsi,
|
||||
TrapFrame->Dr0, TrapFrame->Dr1, TrapFrame->Dr2, TrapFrame->Dr3,
|
||||
TrapFrame->Dr6, TrapFrame->Dr7,
|
||||
TrapFrame->Cr2, TrapFrame->Cr3, TrapFrame->SegCs, TrapFrame->SegDs,
|
||||
TrapFrame->SegEs, TrapFrame->SegFs, TrapFrame->SegGs, TrapFrame->SegSs);
|
||||
|
||||
/* Check vector and call appropriate handler */
|
||||
switch(TrapFrame->Vector)
|
||||
{
|
||||
@@ -172,7 +191,7 @@ VOID
|
||||
AR::Traps::HandleTrap00(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Division-By-Zero Error (0x00)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x00);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -190,7 +209,7 @@ VOID
|
||||
AR::Traps::HandleTrap01(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Debug exception (0x01)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x01);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -208,7 +227,7 @@ VOID
|
||||
AR::Traps::HandleTrap02(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Non-Maskable-Interrupt (0x02)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x02);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -226,7 +245,7 @@ VOID
|
||||
AR::Traps::HandleTrap03(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled INT3 (0x03)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x03);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -244,7 +263,7 @@ VOID
|
||||
AR::Traps::HandleTrap04(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Overflow exception (0x04)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x04);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -262,7 +281,7 @@ VOID
|
||||
AR::Traps::HandleTrap05(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Bound-Range-Exceeded exception (0x05)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x05);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -280,7 +299,7 @@ VOID
|
||||
AR::Traps::HandleTrap06(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Invalid Opcode exception (0x06)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x06);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -298,7 +317,7 @@ VOID
|
||||
AR::Traps::HandleTrap07(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Device Not Available exception (0x07)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x07);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -316,7 +335,7 @@ VOID
|
||||
AR::Traps::HandleTrap08(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Double-Fault exception (0x08)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x08);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -334,7 +353,7 @@ VOID
|
||||
AR::Traps::HandleTrap09(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Segment-Overrun exception (0x09)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x09);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -352,7 +371,7 @@ VOID
|
||||
AR::Traps::HandleTrap0A(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Invalid-TSS exception (0x0A)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x0A);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -370,7 +389,7 @@ VOID
|
||||
AR::Traps::HandleTrap0B(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Segment-Not-Present exception (0x0B)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x0B);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -388,7 +407,7 @@ VOID
|
||||
AR::Traps::HandleTrap0C(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Stack-Segment-Fault exception (0x0C)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x0C);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -406,7 +425,7 @@ VOID
|
||||
AR::Traps::HandleTrap0D(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled General-Protection-Fault (0x0D)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x0D);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -424,7 +443,7 @@ VOID
|
||||
AR::Traps::HandleTrap0E(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Page-Fault exception (0x0E)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x0E);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -442,7 +461,7 @@ VOID
|
||||
AR::Traps::HandleTrap10(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled x87 Floating-Point exception (0x10)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x10);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -460,7 +479,7 @@ VOID
|
||||
AR::Traps::HandleTrap11(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Alignment-Check exception (0x11)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x11);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -478,7 +497,7 @@ VOID
|
||||
AR::Traps::HandleTrap12(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Machine-Check exception (0x12)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x12);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -496,7 +515,7 @@ VOID
|
||||
AR::Traps::HandleTrap13(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled SIMD Floating-Point exception (0x13)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x13);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -531,7 +550,7 @@ VOID
|
||||
AR::Traps::HandleTrap2C(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Assertion (0x2C)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x2C);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -549,7 +568,7 @@ VOID
|
||||
AR::Traps::HandleTrap2D(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Debug-Service-Request (0x2D)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x2D);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -601,7 +620,7 @@ VOID
|
||||
AR::Traps::HandleTrapFF(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Unexpected-Interrupt (0xFF)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0xFF);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -242,34 +242,34 @@ AR::ProcSup::InitializeIdt(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||
for(Vector = 0; Vector < IDT_ENTRIES; Vector++)
|
||||
{
|
||||
/* Set the IDT to handle unexpected interrupts */
|
||||
SetIdtGate(ProcessorBlock->IdtBase, Vector, (PVOID)ArTrap0xFF, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, Vector, (PVOID)ArTrap0xFF, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_INTERRUPT_GATE);
|
||||
}
|
||||
|
||||
/* Setup IDT handlers for known interrupts and traps */
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x00, (PVOID)ArTrap0x00, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x01, (PVOID)ArTrap0x01, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x02, (PVOID)ArTrap0x02, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x03, (PVOID)ArTrap0x03, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING3);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x04, (PVOID)ArTrap0x04, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING3);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x05, (PVOID)ArTrap0x05, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x06, (PVOID)ArTrap0x06, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x07, (PVOID)ArTrap0x07, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x08, (PVOID)ArTrap0x08, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x09, (PVOID)ArTrap0x09, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0A, (PVOID)ArTrap0x0A, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0B, (PVOID)ArTrap0x0B, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0C, (PVOID)ArTrap0x0C, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0D, (PVOID)ArTrap0x0D, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0E, (PVOID)ArTrap0x0E, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x10, (PVOID)ArTrap0x10, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x11, (PVOID)ArTrap0x11, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x12, (PVOID)ArTrap0x12, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x13, (PVOID)ArTrap0x13, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2A, (PVOID)ArTrap0x2A, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING3);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2B, (PVOID)ArTrap0x2B, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING3);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2C, (PVOID)ArTrap0x2C, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING3);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2D, (PVOID)ArTrap0x2D, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING3);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2E, (PVOID)ArTrap0x2E, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING3);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x00, (PVOID)ArTrap0x00, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x01, (PVOID)ArTrap0x01, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x02, (PVOID)ArTrap0x02, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x03, (PVOID)ArTrap0x03, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x04, (PVOID)ArTrap0x04, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x05, (PVOID)ArTrap0x05, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x06, (PVOID)ArTrap0x06, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x07, (PVOID)ArTrap0x07, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x08, (PVOID)ArTrap0x08, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x09, (PVOID)ArTrap0x09, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0A, (PVOID)ArTrap0x0A, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0B, (PVOID)ArTrap0x0B, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0C, (PVOID)ArTrap0x0C, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0D, (PVOID)ArTrap0x0D, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0E, (PVOID)ArTrap0x0E, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x10, (PVOID)ArTrap0x10, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x11, (PVOID)ArTrap0x11, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x12, (PVOID)ArTrap0x12, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x13, (PVOID)ArTrap0x13, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2A, (PVOID)ArTrap0x2A, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2B, (PVOID)ArTrap0x2B, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2C, (PVOID)ArTrap0x2C, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2D, (PVOID)ArTrap0x2D, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2E, (PVOID)ArTrap0x2E, KGDT_R0_CODE, 0, KIDT_ACCESS_RING3, I686_TRAP_GATE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -656,6 +656,9 @@ AR::ProcSup::SetGdtEntryBase(IN PKGDTENTRY Gdt,
|
||||
* @param Access
|
||||
* Supplies the gate access rights.
|
||||
*
|
||||
* @param Type
|
||||
* Supplies the gate type.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
@@ -667,13 +670,21 @@ AR::ProcSup::SetIdtGate(IN PKIDTENTRY Idt,
|
||||
IN PVOID Handler,
|
||||
IN USHORT Selector,
|
||||
IN USHORT Ist,
|
||||
IN USHORT Access)
|
||||
IN USHORT Dpl,
|
||||
IN USHORT Type)
|
||||
{
|
||||
/* Setup the gate */
|
||||
/* Set the handler's address */
|
||||
Idt[Vector].Offset = (USHORT)((ULONG)Handler & 0xFFFF);
|
||||
Idt[Vector].ExtendedOffset = (USHORT)((ULONG)Handler >> 16);
|
||||
Idt[Vector].Access = 0x8000 | (Access << 8);
|
||||
|
||||
/* Set the code segment selector */
|
||||
Idt[Vector].Selector = Selector;
|
||||
|
||||
/* Initialize the gate's attributes and flags */
|
||||
Idt[Vector].Access = 0;
|
||||
Idt[Vector].Dpl = Dpl;
|
||||
Idt[Vector].Present = 1;
|
||||
Idt[Vector].Type = Type;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -23,6 +23,21 @@ XTCDECL
|
||||
VOID
|
||||
AR::Traps::DispatchTrap(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Caught trap: 0x%.2lX with error code: %.4lX at EIP: 0x%.8lX\n"
|
||||
L"EAX: 0x%.8lX, EBX: 0x%.8lX, ECX: 0x%.8lX, EDX: 0x%.8lX\n"
|
||||
L"EBP: 0x%.8lX, ESP: 0x%.8lX, EDI: 0x%.8lX, ESI: 0x%.8lX\n"
|
||||
L"DR0: 0x%.8lX, DR1: 0x%.8lX, DR2: 0x%.8lX, DR3: 0x%.8lX\n"
|
||||
L"DR6: 0x%.8lX, DR7: 0x%.8lX\n"
|
||||
L"CR2: 0x%.8lX, CR3: 0x%.8lX, CS: 0x%.8lX, DS: 0x%.8hX\n"
|
||||
L"ES: 0x%.8hX, FS: 0x%.8hX, GS: 0x%.8hX, SS: 0x%.8lX\n",
|
||||
TrapFrame->Vector, TrapFrame->ErrorCode, TrapFrame->Eip,
|
||||
TrapFrame->Eax, TrapFrame->Ebx, TrapFrame->Ecx, TrapFrame->Edx,
|
||||
TrapFrame->Ebp, TrapFrame->Esp, TrapFrame->Edi, TrapFrame->Esi,
|
||||
TrapFrame->Dr0, TrapFrame->Dr1, TrapFrame->Dr2, TrapFrame->Dr3,
|
||||
TrapFrame->Dr6, TrapFrame->Dr7,
|
||||
TrapFrame->Cr2, TrapFrame->Cr3, TrapFrame->SegCs, TrapFrame->SegDs,
|
||||
TrapFrame->SegEs, TrapFrame->SegFs, TrapFrame->SegGs, TrapFrame->SegSs);
|
||||
|
||||
/* Check vector and call appropriate handler */
|
||||
switch(TrapFrame->Vector)
|
||||
{
|
||||
@@ -144,7 +159,7 @@ VOID
|
||||
AR::Traps::HandleTrap00(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Division-By-Zero Error (0x00)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x00);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -162,7 +177,7 @@ VOID
|
||||
AR::Traps::HandleTrap01(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Debug exception (0x01)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x01);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -180,7 +195,7 @@ VOID
|
||||
AR::Traps::HandleTrap02(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Non-Maskable-Interrupt (0x02)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x02);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -198,7 +213,7 @@ VOID
|
||||
AR::Traps::HandleTrap03(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled INT3 (0x03)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x03);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -216,7 +231,7 @@ VOID
|
||||
AR::Traps::HandleTrap04(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Overflow exception (0x04)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x04);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -234,7 +249,7 @@ VOID
|
||||
AR::Traps::HandleTrap05(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Bound-Range-Exceeded exception (0x05)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x05);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -252,7 +267,7 @@ VOID
|
||||
AR::Traps::HandleTrap06(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Invalid Opcode exception (0x06)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x06);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -270,7 +285,7 @@ VOID
|
||||
AR::Traps::HandleTrap07(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Device Not Available exception (0x07)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x07);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -288,7 +303,7 @@ VOID
|
||||
AR::Traps::HandleTrap08(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Double-Fault exception (0x08)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x08);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -306,7 +321,7 @@ VOID
|
||||
AR::Traps::HandleTrap09(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Segment-Overrun exception (0x09)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x09);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -324,7 +339,7 @@ VOID
|
||||
AR::Traps::HandleTrap0A(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Invalid-TSS exception (0x0A)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x0A);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -342,7 +357,7 @@ VOID
|
||||
AR::Traps::HandleTrap0B(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Segment-Not-Present exception (0x0B)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x0B);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -360,7 +375,7 @@ VOID
|
||||
AR::Traps::HandleTrap0C(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Stack-Segment-Fault exception (0x0C)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x0C);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -378,7 +393,7 @@ VOID
|
||||
AR::Traps::HandleTrap0D(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled General-Protection-Fault (0x0D)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x0D);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -396,7 +411,7 @@ VOID
|
||||
AR::Traps::HandleTrap0E(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Page-Fault exception (0x0E)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x0E);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -414,7 +429,7 @@ VOID
|
||||
AR::Traps::HandleTrap10(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled x87 Floating-Point exception (0x10)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x10);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -432,7 +447,7 @@ VOID
|
||||
AR::Traps::HandleTrap11(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Alignment-Check exception (0x11)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x11);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -450,7 +465,7 @@ VOID
|
||||
AR::Traps::HandleTrap12(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Machine-Check exception (0x12)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x12);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -468,7 +483,7 @@ VOID
|
||||
AR::Traps::HandleTrap13(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled SIMD Floating-Point exception (0x13)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x13);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -520,7 +535,7 @@ VOID
|
||||
AR::Traps::HandleTrap2C(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Assertion (0x2C)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x2C);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -538,7 +553,7 @@ VOID
|
||||
AR::Traps::HandleTrap2D(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Debug-Service-Request (0x2D)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0x2D);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -573,7 +588,7 @@ VOID
|
||||
AR::Traps::HandleTrapFF(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Handled Unexpected-Interrupt (0xFF)!\n");
|
||||
for(;;);
|
||||
KE::Crash::Panic(0xFF);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -67,7 +67,8 @@ namespace AR
|
||||
IN PVOID Handler,
|
||||
IN USHORT Selector,
|
||||
IN USHORT Ist,
|
||||
IN USHORT Access);
|
||||
IN USHORT Dpl,
|
||||
IN USHORT Type);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -72,7 +72,8 @@ namespace AR
|
||||
IN PVOID Handler,
|
||||
IN USHORT Selector,
|
||||
IN USHORT Ist,
|
||||
IN USHORT Access);
|
||||
IN USHORT Dpl,
|
||||
IN USHORT Type);
|
||||
STATIC XTAPI VOID SetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||
IN PVOID KernelFaultStack);
|
||||
|
||||
|
||||
@@ -17,12 +17,61 @@ namespace KE
|
||||
{
|
||||
class SpinLock
|
||||
{
|
||||
private:
|
||||
STATIC KSPIN_LOCK DispatcherLockQueue;
|
||||
STATIC KSPIN_LOCK PfnLockQueue;
|
||||
STATIC KSPIN_LOCK SystemSpaceLockQueue;
|
||||
|
||||
public:
|
||||
STATIC XTFASTCALL VOID AcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_LEVEL LockLevel);
|
||||
STATIC XTFASTCALL VOID AcquireSpinLock(IN OUT PKSPIN_LOCK SpinLock);
|
||||
STATIC XTAPI VOID InitializeAllLocks();
|
||||
STATIC XTAPI VOID InitializeLockQueues();
|
||||
STATIC XTAPI VOID InitializeSpinLock(IN PKSPIN_LOCK SpinLock);
|
||||
STATIC XTFASTCALL VOID ReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_LEVEL LockLevel);
|
||||
STATIC XTFASTCALL VOID ReleaseSpinLock(IN OUT PKSPIN_LOCK SpinLock);
|
||||
STATIC XTFASTCALL BOOLEAN TestSpinLock(IN PKSPIN_LOCK SpinLock);
|
||||
};
|
||||
|
||||
class QueuedSpinLockGuard
|
||||
{
|
||||
private:
|
||||
KSPIN_LOCK_QUEUE_LEVEL QueuedLockLevel;
|
||||
|
||||
public:
|
||||
QueuedSpinLockGuard(IN OUT KSPIN_LOCK_QUEUE_LEVEL LockLevel)
|
||||
{
|
||||
QueuedLockLevel = LockLevel;
|
||||
KE::SpinLock::AcquireQueuedSpinLock(QueuedLockLevel);
|
||||
}
|
||||
|
||||
~QueuedSpinLockGuard()
|
||||
{
|
||||
KE::SpinLock::ReleaseQueuedSpinLock(QueuedLockLevel);
|
||||
}
|
||||
|
||||
QueuedSpinLockGuard(const QueuedSpinLockGuard&) = delete;
|
||||
QueuedSpinLockGuard& operator=(const QueuedSpinLockGuard&) = delete;
|
||||
};
|
||||
|
||||
class SpinLockGuard
|
||||
{
|
||||
private:
|
||||
PKSPIN_LOCK SpinLock;
|
||||
|
||||
public:
|
||||
SpinLockGuard(IN OUT PKSPIN_LOCK SpinLock)
|
||||
{
|
||||
KE::SpinLock::AcquireSpinLock(SpinLock);
|
||||
}
|
||||
|
||||
~SpinLockGuard()
|
||||
{
|
||||
KE::SpinLock::ReleaseSpinLock(SpinLock);
|
||||
}
|
||||
|
||||
SpinLockGuard(const SpinLockGuard&) = delete;
|
||||
SpinLockGuard& operator=(const SpinLockGuard&) = delete;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -12,12 +12,6 @@
|
||||
/* Kernel initialization block passed by boot loader */
|
||||
PKERNEL_INITIALIZATION_BLOCK KE::BootInformation::InitializationBlock = {};
|
||||
|
||||
/* Kernel boot resources list */
|
||||
LIST_ENTRY KE::SystemResources::ResourcesListHead;
|
||||
|
||||
/* Kernel boot resources lock */
|
||||
KSPIN_LOCK KE::SystemResources::ResourcesLock;
|
||||
|
||||
/* Kernel initial process */
|
||||
EPROCESS KE::KProcess::InitialProcess;
|
||||
|
||||
@@ -26,3 +20,18 @@ ETHREAD KE::KThread::InitialThread = {};
|
||||
|
||||
/* Kernel UBSAN active frame flag */
|
||||
BOOLEAN KE::KUbsan::ActiveFrame = FALSE;
|
||||
|
||||
/* Kernel dispatcher lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::DispatcherLockQueue;
|
||||
|
||||
/* Kernel PFN lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::PfnLockQueue;
|
||||
|
||||
/* Kernel system space lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::SystemSpaceLockQueue;
|
||||
|
||||
/* Kernel boot resources list */
|
||||
LIST_ENTRY KE::SystemResources::ResourcesListHead;
|
||||
|
||||
/* Kernel boot resources lock */
|
||||
KSPIN_LOCK KE::SystemResources::ResourcesLock;
|
||||
|
||||
@@ -24,7 +24,7 @@ BOOLEAN
|
||||
KE::KUbsan::CheckReport(PKUBSAN_SOURCE_LOCATION Location)
|
||||
{
|
||||
/* Make sure, this error should be reported */
|
||||
return (BOOLEAN)!ActiveFrame;
|
||||
return !ActiveFrame;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
* FILE: xtoskrnl/ke/spinlock.cc
|
||||
* DESCRIPTION: Spinlocks support
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
* Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtos.hh>
|
||||
@@ -56,6 +57,48 @@ KE::SpinLock::AcquireSpinLock(IN OUT PKSPIN_LOCK SpinLock)
|
||||
AR::CpuFunc::ReadWriteBarrier();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes all kernel spinlocks.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
KE::SpinLock::InitializeAllLocks()
|
||||
{
|
||||
/* Initialize all spin locks */
|
||||
InitializeSpinLock(&DispatcherLockQueue);
|
||||
InitializeSpinLock(&PfnLockQueue);
|
||||
InitializeSpinLock(&SystemSpaceLockQueue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes spinlock queues for current processor.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
KE::SpinLock::InitializeLockQueues()
|
||||
{
|
||||
PKPROCESSOR_CONTROL_BLOCK ControlBlock;
|
||||
|
||||
/* Get current processor control block */
|
||||
ControlBlock = KE::Processor::GetCurrentProcessorControlBlock();
|
||||
|
||||
/* Initialize PCB lock queues */
|
||||
ControlBlock->LockQueue[DispatcherLock].Lock = &DispatcherLockQueue;
|
||||
ControlBlock->LockQueue[DispatcherLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[PfnLock].Lock = &PfnLockQueue;
|
||||
ControlBlock->LockQueue[PfnLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[SystemSpaceLock].Lock = &SystemSpaceLockQueue;
|
||||
ControlBlock->LockQueue[SystemSpaceLock].Next = NULLPTR;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes a kernel spinlock object.
|
||||
*
|
||||
@@ -112,3 +155,29 @@ KE::SpinLock::ReleaseSpinLock(IN OUT PKSPIN_LOCK SpinLock)
|
||||
/* Add an explicit memory barrier */
|
||||
AR::CpuFunc::ReadWriteBarrier();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a kernel spin lock.
|
||||
*
|
||||
* @param SpinLock
|
||||
* Supplies a pointer to the kernel spin lock.
|
||||
*
|
||||
* @return This routine returns TRUE if the lock is free, FALSE otherwise.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTFASTCALL
|
||||
BOOLEAN
|
||||
TestSpinLock(IN PKSPIN_LOCK SpinLock)
|
||||
{
|
||||
/* Check if the lock is free */
|
||||
if(*SpinLock)
|
||||
{
|
||||
/* Spinlock is busy, yield processor and return FALSE */
|
||||
AR::CpuFunc::YieldProcessor();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Spinlock is free, return TRUE */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ MM::PageMap::GetPteAddress(PVOID Address)
|
||||
|
||||
/* Calculate offset and return PTE address */
|
||||
Offset = ((((ULONG_PTR)(Address)) >> MM_PTI_SHIFT) << PageMapInfo.PteShift);
|
||||
return (PMMPTE)(MM_PTE_BASE + Offset);
|
||||
return (PMMPTE)(PageMapInfo.PteBase + Offset);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -126,7 +126,7 @@ XTAPI
|
||||
BOOLEAN
|
||||
MM::Init::VerifyMemoryTypeFree(LOADER_MEMORY_TYPE MemoryType)
|
||||
{
|
||||
return (BOOLEAN)((MemoryType == LoaderFree) || (MemoryType == LoaderFirmwareTemporary) ||
|
||||
return ((MemoryType == LoaderFree) || (MemoryType == LoaderFirmwareTemporary) ||
|
||||
(MemoryType == LoaderLoadedProgram) || (MemoryType == LoaderOsloaderStack));
|
||||
}
|
||||
|
||||
@@ -144,7 +144,7 @@ XTAPI
|
||||
BOOLEAN
|
||||
MM::Init::VerifyMemoryTypeInvisible(LOADER_MEMORY_TYPE MemoryType)
|
||||
{
|
||||
return (BOOLEAN)((MemoryType == LoaderFirmwarePermanent) ||
|
||||
return ((MemoryType == LoaderFirmwarePermanent) ||
|
||||
(MemoryType == LoaderSpecialMemory) ||
|
||||
(MemoryType == LoaderBBTMemory));
|
||||
}
|
||||
|
||||
@@ -313,7 +313,7 @@ RTL::BitMap::FindBits(IN PRTL_BITMAP BitMap,
|
||||
while(BitOffset + Length < BitMapEnd)
|
||||
{
|
||||
/* Increment offset */
|
||||
BitOffset += CountBits(BitMap, BitMap->Size - BitOffset, BitOffset, (BOOLEAN)!SetBits);
|
||||
BitOffset += CountBits(BitMap, BitMap->Size - BitOffset, BitOffset, !SetBits);
|
||||
if(BitOffset + Length > BitMapEnd)
|
||||
{
|
||||
/* No match found, break loop execution */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user