Compare commits
1 Commits
master
...
powershell
Author | SHA1 | Date | |
---|---|---|---|
b74c31f17c
|
@@ -1,8 +1,6 @@
|
|||||||
# XT Boot Sector
|
# XT Boot Sector
|
||||||
PROJECT(BOOTSECT)
|
PROJECT(BOOTSECT)
|
||||||
|
|
||||||
add_definitions("-DARCH_ESP_SOURCE=\\\"${ARCH}/cpu.S\\\"")
|
|
||||||
|
|
||||||
# Compile boot sectors
|
# Compile boot sectors
|
||||||
compile_bootsector(mbrboot ${BOOTSECT_SOURCE_DIR}/mbrboot.S 0x7C00 Start)
|
compile_bootsector(mbrboot ${BOOTSECT_SOURCE_DIR}/mbrboot.S 0x7C00 Start)
|
||||||
compile_bootsector(espboot ${BOOTSECT_SOURCE_DIR}/espboot.S 0x7C00 Start)
|
compile_bootsector(espboot ${BOOTSECT_SOURCE_DIR}/espboot.S 0x7C00 Start)
|
||||||
|
@@ -1,144 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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"
|
|
@@ -121,15 +121,15 @@ VerifyBiosParameterBlock:
|
|||||||
ja FsError
|
ja FsError
|
||||||
|
|
||||||
ReadExtraCode:
|
ReadExtraCode:
|
||||||
/* Read second VBR sector with extra boot code (3 sectors starting from sector 2) */
|
/* Read second VBR sector with extra boot code */
|
||||||
movl HiddenSectors - Start(%bp), %eax
|
movl HiddenSectors - Start(%bp), %eax
|
||||||
addl $0x02, %eax
|
addl $0x02, %eax
|
||||||
movw $0x03, %cx
|
movw $0x01, %cx
|
||||||
xorw %bx, %bx
|
xorw %bx, %bx
|
||||||
movw %bx, %es
|
movw %bx, %es
|
||||||
movw $0x7E00, %bx
|
movw $0x7E00, %bx
|
||||||
call ReadSectors
|
call ReadSectors
|
||||||
jmp StartExtraCode
|
jmp StartSectors
|
||||||
|
|
||||||
ReadSectors:
|
ReadSectors:
|
||||||
/* Check for extended BIOS functions and use it only if available */
|
/* Check for extended BIOS functions and use it only if available */
|
||||||
@@ -139,22 +139,18 @@ ReadSectors:
|
|||||||
movw $0x55AA, %bx
|
movw $0x55AA, %bx
|
||||||
movb DriveNumber - Start(%bp), %dl
|
movb DriveNumber - Start(%bp), %dl
|
||||||
int $0x13
|
int $0x13
|
||||||
jc .ReadCHS
|
jc ReadCHS
|
||||||
cmpw $0xAA55, %bx
|
cmpw $0xAA55, %bx
|
||||||
jne .ReadCHS
|
jne ReadCHS
|
||||||
testb $0x01, %cl
|
testb $0x01, %cl
|
||||||
jz .ReadCHS
|
jz ReadCHS
|
||||||
|
|
||||||
/* Verify drive size and determine whether to use CHS or LBA */
|
/* Verify drive size and determine whether to use CHS or LBA */
|
||||||
cmpl %edi, %eax
|
cmpl %edi, %eax
|
||||||
jnb .ReadLBA
|
jnb ReadLBA
|
||||||
|
|
||||||
.ReadCHS:
|
ReadCHS:
|
||||||
/* Read sectors using CHS */
|
/* Read sectors using CHS */
|
||||||
popal
|
|
||||||
|
|
||||||
.CHSLoop:
|
|
||||||
/* Read sector by sector using CHS */
|
|
||||||
pushw %cx
|
pushw %cx
|
||||||
pushal
|
pushal
|
||||||
xorl %edx, %edx
|
xorl %edx, %edx
|
||||||
@@ -180,11 +176,11 @@ ReadSectors:
|
|||||||
movw %es, %dx
|
movw %es, %dx
|
||||||
addw $0x20, %dx
|
addw $0x20, %dx
|
||||||
movw %dx, %es
|
movw %dx, %es
|
||||||
loop .CHSLoop
|
loop ReadCHS
|
||||||
popw %es
|
popw %es
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.ReadLBA:
|
ReadLBA:
|
||||||
/* Prepare DAP packet and read sectors using LBA */
|
/* Prepare DAP packet and read sectors using LBA */
|
||||||
popal
|
popal
|
||||||
pushw %cx
|
pushw %cx
|
||||||
@@ -213,19 +209,19 @@ ReadSectors:
|
|||||||
movw %dx, %es
|
movw %dx, %es
|
||||||
popw %bx
|
popw %bx
|
||||||
subw %si, %cx
|
subw %si, %cx
|
||||||
jnz .ReadLBA
|
jnz ReadLBA
|
||||||
popw %es
|
popw %es
|
||||||
ret
|
ret
|
||||||
|
|
||||||
DiskError:
|
DiskError:
|
||||||
/* Display disk error message and reboot */
|
/* Display disk error message and reboot */
|
||||||
movw $.MsgDiskError, %si
|
movw $msgDiskError, %si
|
||||||
call Print
|
call Print
|
||||||
jmp Reboot
|
jmp Reboot
|
||||||
|
|
||||||
FsError:
|
FsError:
|
||||||
/* Display FS error message and reboot */
|
/* Display FS error message and reboot */
|
||||||
movw $.MsgFsError, %si
|
movw $msgFsError, %si
|
||||||
call Print
|
call Print
|
||||||
jmp Reboot
|
jmp Reboot
|
||||||
|
|
||||||
@@ -233,297 +229,48 @@ Print:
|
|||||||
/* Simple routine to print messages */
|
/* Simple routine to print messages */
|
||||||
lodsb
|
lodsb
|
||||||
orb %al, %al
|
orb %al, %al
|
||||||
jz .DonePrint
|
jz DonePrint
|
||||||
movb $0x0E, %ah
|
movb $0x0E, %ah
|
||||||
movw $0x07, %bx
|
movw $0x07, %bx
|
||||||
int $0x10
|
int $0x10
|
||||||
jmp Print
|
jmp Print
|
||||||
.DonePrint:
|
DonePrint:
|
||||||
retw
|
retw
|
||||||
|
|
||||||
Reboot:
|
Reboot:
|
||||||
/* Display a message, wait for a key press and reboot */
|
/* Display a message, wait for a key press and reboot */
|
||||||
movw $.MsgAnyKey, %si
|
movw $msgAnyKey, %si
|
||||||
call Print
|
call Print
|
||||||
xorw %ax, %ax
|
xorw %ax, %ax
|
||||||
int $0x16
|
int $0x16
|
||||||
int $0x19
|
int $0x19
|
||||||
|
|
||||||
.MsgAnyKey:
|
msgAnyKey:
|
||||||
.ascii "Press any key to restart...\r\n\0"
|
.ascii "Press any key to restart\r\n"
|
||||||
|
|
||||||
.MsgDiskError:
|
msgDiskError:
|
||||||
.ascii "Disk error!\r\n\0"
|
.ascii "Disk error\r\n"
|
||||||
|
|
||||||
.MsgFsError:
|
msgFsError:
|
||||||
.ascii "File system error!\r\n\0"
|
.ascii "File system error\r\n"
|
||||||
|
|
||||||
/* Fill the rest of the VBR with zeros and add VBR signature at the end */
|
/* Fill the rest of the VBR with zeros and add VBR signature at the end */
|
||||||
.fill (510 - (. - Start)), 1, 0
|
.fill (510 - (. - Start)), 1, 0
|
||||||
.word 0xAA55
|
.word 0xAA55
|
||||||
|
|
||||||
|
|
||||||
StartExtraCode:
|
StartSectors:
|
||||||
/* Load XTLDR file from disk */
|
/* Print message */
|
||||||
call LoadStage2
|
movw $msgUnavailable, %si
|
||||||
|
|
||||||
/* 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
|
call Print
|
||||||
jmp Reboot
|
|
||||||
|
|
||||||
FileNotFound:
|
/* Wait for key press and reboot */
|
||||||
/* Display XTLDR not found message and reboot */
|
xorw %ax, %ax
|
||||||
movw $.MsgXtLdrNotFound, %si
|
int $0x16
|
||||||
call Print
|
int $0x19
|
||||||
jmp Reboot
|
|
||||||
|
|
||||||
Stage2NotLoaded:
|
msgUnavailable:
|
||||||
/* Clean up the stack and display XTLDR not found message and reboot */
|
.ascii "XTLDR requires EFI-based system!\r\nPress any key to restart\r\n"
|
||||||
popl %esi
|
|
||||||
jmp FileNotFound
|
|
||||||
|
|
||||||
.BootDirName:
|
/* Fill the rest of the extra VBR with zeros */
|
||||||
/* Boot directory name */
|
.fill (1024 - (. - Start)), 1, 0
|
||||||
.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"
|
|
||||||
|
@@ -1,124 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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"
|
|
@@ -4,7 +4,6 @@
|
|||||||
* FILE: boot/bootsect/amd64/mbrboot.S
|
* FILE: boot/bootsect/amd64/mbrboot.S
|
||||||
* DESCRIPTION: XT Boot Loader MBR boot code
|
* DESCRIPTION: XT Boot Loader MBR boot code
|
||||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||||
* Aiken Harris <aiken@codingworkshop.eu.org>
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.text
|
.text
|
||||||
@@ -42,7 +41,7 @@ RealStart:
|
|||||||
movw %ax, %ss
|
movw %ax, %ss
|
||||||
|
|
||||||
/* Print welcome message */
|
/* Print welcome message */
|
||||||
leaw .MsgXtosBoot, %si
|
leaw msgXtosBoot, %si
|
||||||
call Print
|
call Print
|
||||||
|
|
||||||
/* Get BIOS boot drive and partition table offset */
|
/* Get BIOS boot drive and partition table offset */
|
||||||
@@ -91,19 +90,19 @@ PartitionFound:
|
|||||||
|
|
||||||
InvalidSignature:
|
InvalidSignature:
|
||||||
/* Invalid signature error */
|
/* Invalid signature error */
|
||||||
leaw .MsgInvalidSignature, %si
|
leaw msgInvalidSignature, %si
|
||||||
call Print
|
call Print
|
||||||
jmp HaltSystem
|
jmp HaltSystem
|
||||||
|
|
||||||
PartitionNotFound:
|
PartitionNotFound:
|
||||||
/* Active partition not found error */
|
/* Active partition not found error */
|
||||||
leaw .MsgPartitionNotFound, %si
|
leaw msgPartitionNotFound, %si
|
||||||
call Print
|
call Print
|
||||||
jmp HaltSystem
|
jmp HaltSystem
|
||||||
|
|
||||||
VbrReadFail:
|
VbrReadFail:
|
||||||
/* VBR read failed error */
|
/* VBR read failed error */
|
||||||
leaw .MsgVbrReadFail, %si
|
leaw msgVbrReadFail, %si
|
||||||
call Print
|
call Print
|
||||||
jmp HaltSystem
|
jmp HaltSystem
|
||||||
|
|
||||||
@@ -137,16 +136,16 @@ DonePrint:
|
|||||||
/* Storage for the LBA start */
|
/* Storage for the LBA start */
|
||||||
.long 0
|
.long 0
|
||||||
|
|
||||||
.MsgInvalidSignature:
|
msgInvalidSignature:
|
||||||
.asciz "Invalid partition signature!"
|
.asciz "Invalid partition signature!"
|
||||||
|
|
||||||
.MsgPartitionNotFound:
|
msgPartitionNotFound:
|
||||||
.asciz "Bootable partition not found!"
|
.asciz "Bootable partition not found!"
|
||||||
|
|
||||||
.MsgVbrReadFail:
|
msgVbrReadFail:
|
||||||
.asciz "VBR read failed!"
|
.asciz "VBR read failed!"
|
||||||
|
|
||||||
.MsgXtosBoot:
|
msgXtosBoot:
|
||||||
.asciz "Starting XTOS boot loader...\r\n"
|
.asciz "Starting XTOS boot loader...\r\n"
|
||||||
|
|
||||||
/* Fill the rest of the MBR with zeros and add MBR signature at the end */
|
/* Fill the rest of the MBR with zeros and add MBR signature at the end */
|
||||||
|
@@ -16,7 +16,6 @@ list(APPEND LIBXTLDR_SOURCE
|
|||||||
# Specify list of source code files
|
# Specify list of source code files
|
||||||
list(APPEND XTLDR_SOURCE
|
list(APPEND XTLDR_SOURCE
|
||||||
${XTLDR_SOURCE_DIR}/arch/${ARCH}/memory.cc
|
${XTLDR_SOURCE_DIR}/arch/${ARCH}/memory.cc
|
||||||
${XTLDR_SOURCE_DIR}/biosutil.cc
|
|
||||||
${XTLDR_SOURCE_DIR}/bootutil.cc
|
${XTLDR_SOURCE_DIR}/bootutil.cc
|
||||||
${XTLDR_SOURCE_DIR}/config.cc
|
${XTLDR_SOURCE_DIR}/config.cc
|
||||||
${XTLDR_SOURCE_DIR}/console.cc
|
${XTLDR_SOURCE_DIR}/console.cc
|
||||||
@@ -39,9 +38,6 @@ add_executable(xtldr ${XTLDR_SOURCE})
|
|||||||
# Add linker libraries
|
# Add linker libraries
|
||||||
target_link_libraries(xtldr libxtos)
|
target_link_libraries(xtldr libxtos)
|
||||||
|
|
||||||
# Add linker options
|
|
||||||
target_link_options(xtldr PRIVATE /ALIGN:512)
|
|
||||||
|
|
||||||
# Set proper binary name and install target
|
# Set proper binary name and install target
|
||||||
if(ARCH STREQUAL "i686")
|
if(ARCH STREQUAL "i686")
|
||||||
set(BINARY_NAME "bootia32")
|
set(BINARY_NAME "bootia32")
|
||||||
@@ -53,6 +49,5 @@ set_install_target(xtldr efi/boot)
|
|||||||
|
|
||||||
# Set loader entrypoint and subsystem
|
# Set loader entrypoint and subsystem
|
||||||
set_entrypoint(xtldr "BlStartXtLoader")
|
set_entrypoint(xtldr "BlStartXtLoader")
|
||||||
set_imagebase(xtldr ${BASEADDRESS_XTLDR})
|
|
||||||
set_linker_map(xtldr TRUE)
|
set_linker_map(xtldr TRUE)
|
||||||
set_subsystem(xtldr efi_application)
|
set_subsystem(xtldr efi_application)
|
||||||
|
@@ -1,190 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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));
|
|
||||||
}
|
|
@@ -10,18 +10,6 @@
|
|||||||
#include <xtldr.hh>
|
#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 */
|
/* XT Boot Loader menu list */
|
||||||
PLIST_ENTRY Configuration::BootMenuList = NULLPTR;
|
PLIST_ENTRY Configuration::BootMenuList = NULLPTR;
|
||||||
|
|
||||||
|
@@ -15,25 +15,6 @@
|
|||||||
#include <libxtos.hh>
|
#include <libxtos.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
|
class BootUtils
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@@ -236,15 +236,6 @@ BlStartXtLoader(IN EFI_HANDLE ImageHandle,
|
|||||||
PWCHAR Modules;
|
PWCHAR Modules;
|
||||||
EFI_STATUS Status;
|
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 */
|
/* Initialize XTLDR and */
|
||||||
XtLoader::InitializeBootLoader(ImageHandle, SystemTable);
|
XtLoader::InitializeBootLoader(ImageHandle, SystemTable);
|
||||||
|
|
||||||
|
@@ -1,3 +1,2 @@
|
|||||||
# Set base addresses for all modules
|
# Set base addresses for all modules
|
||||||
set(BASEADDRESS_XTLDR 0x000000000000F800)
|
|
||||||
set(BASEADDRESS_XTOSKRNL 0x0000000140000000)
|
set(BASEADDRESS_XTOSKRNL 0x0000000140000000)
|
||||||
|
@@ -1,3 +1,2 @@
|
|||||||
# Set base addresses for all modules
|
# Set base addresses for all modules
|
||||||
set(BASEADDRESS_XTLDR 0x0000F800)
|
|
||||||
set(BASEADDRESS_XTOSKRNL 0x00400000)
|
set(BASEADDRESS_XTOSKRNL 0x00400000)
|
||||||
|
@@ -64,17 +64,11 @@ function(compile_bootsector NAME SOURCE BASEADDR ENTRYPOINT)
|
|||||||
set(BINARY_NAME "${NAME}.bin")
|
set(BINARY_NAME "${NAME}.bin")
|
||||||
set(OBJECT_NAME "${NAME}.obj")
|
set(OBJECT_NAME "${NAME}.obj")
|
||||||
|
|
||||||
get_directory_property(DEFS COMPILE_DEFINITIONS)
|
|
||||||
foreach(def ${DEFS})
|
|
||||||
list(APPEND ASM_DEFS "-D${def}")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
|
||||||
COMMAND ${CMAKE_ASM_COMPILER}
|
COMMAND ${CMAKE_ASM_COMPILER}
|
||||||
/nologo
|
/nologo
|
||||||
--target=i386-none-elf
|
--target=i386-none-elf
|
||||||
${ASM_DEFS}
|
|
||||||
-I${CMAKE_CURRENT_SOURCE_DIR}
|
-I${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
/Fo${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_NAME}
|
/Fo${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_NAME}
|
||||||
-c -- ${SOURCE}
|
-c -- ${SOURCE}
|
||||||
|
@@ -272,18 +272,11 @@ typedef struct _KIDTENTRY
|
|||||||
{
|
{
|
||||||
USHORT OffsetLow;
|
USHORT OffsetLow;
|
||||||
USHORT Selector;
|
USHORT Selector;
|
||||||
union
|
USHORT IstIndex:3;
|
||||||
{
|
USHORT Reserved0:5;
|
||||||
struct
|
USHORT Type:5;
|
||||||
{
|
USHORT Dpl:2;
|
||||||
USHORT IstIndex:3;
|
USHORT Present:1;
|
||||||
USHORT Reserved0:5;
|
|
||||||
USHORT Type:5;
|
|
||||||
USHORT Dpl:2;
|
|
||||||
USHORT Present:1;
|
|
||||||
};
|
|
||||||
USHORT Access;
|
|
||||||
};
|
|
||||||
USHORT OffsetMiddle;
|
USHORT OffsetMiddle;
|
||||||
ULONG OffsetHigh;
|
ULONG OffsetHigh;
|
||||||
ULONG Reserved1;
|
ULONG Reserved1;
|
||||||
|
@@ -58,6 +58,12 @@
|
|||||||
#define KIDT_ACCESS_RING0 0x00
|
#define KIDT_ACCESS_RING0 0x00
|
||||||
#define KIDT_ACCESS_RING3 0x60
|
#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 */
|
/* TSS Offsets */
|
||||||
#define KTSS_ESP0 0x04
|
#define KTSS_ESP0 0x04
|
||||||
#define KTSS_CR3 0x1C
|
#define KTSS_CR3 0x1C
|
||||||
@@ -278,18 +284,7 @@ typedef struct _KIDTENTRY
|
|||||||
{
|
{
|
||||||
USHORT Offset;
|
USHORT Offset;
|
||||||
USHORT Selector;
|
USHORT Selector;
|
||||||
union
|
USHORT Access;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
UCHAR Reserved;
|
|
||||||
UCHAR Type:4;
|
|
||||||
UCHAR Flag:1;
|
|
||||||
UCHAR Dpl:2;
|
|
||||||
UCHAR Present:1;
|
|
||||||
};
|
|
||||||
USHORT Access;
|
|
||||||
};
|
|
||||||
USHORT ExtendedOffset;
|
USHORT ExtendedOffset;
|
||||||
} KIDTENTRY, *PKIDTENTRY;
|
} KIDTENTRY, *PKIDTENTRY;
|
||||||
|
|
||||||
|
@@ -249,34 +249,34 @@ AR::ProcSup::InitializeIdt(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
|||||||
for(Vector = 0; Vector < IDT_ENTRIES; Vector++)
|
for(Vector = 0; Vector < IDT_ENTRIES; Vector++)
|
||||||
{
|
{
|
||||||
/* Set the IDT to handle unexpected interrupts */
|
/* Set the IDT to handle unexpected interrupts */
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, Vector, (PVOID)ArTrap0xFF, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, Vector, (PVOID)ArTrap0xFF, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setup IDT handlers for known interrupts and traps */
|
/* Setup IDT handlers for known interrupts and traps */
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x00, (PVOID)ArTrap0x00, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_INTERRUPT_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_INTERRUPT_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_TRAP_GATE);
|
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, AMD64_INTERRUPT_GATE);
|
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, AMD64_INTERRUPT_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0xE1, (PVOID)ArTrap0xE1, KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -636,9 +636,6 @@ AR::ProcSup::SetGdtEntryBase(IN PKGDTENTRY Gdt,
|
|||||||
* @param Access
|
* @param Access
|
||||||
* Supplies the gate access rights.
|
* Supplies the gate access rights.
|
||||||
*
|
*
|
||||||
* @param Type
|
|
||||||
* Supplies the gate type.
|
|
||||||
*
|
|
||||||
* @return This routine does not return any value.
|
* @return This routine does not return any value.
|
||||||
*
|
*
|
||||||
* @since XT 1.0
|
* @since XT 1.0
|
||||||
@@ -650,22 +647,15 @@ AR::ProcSup::SetIdtGate(IN PKIDTENTRY Idt,
|
|||||||
IN PVOID Handler,
|
IN PVOID Handler,
|
||||||
IN USHORT Selector,
|
IN USHORT Selector,
|
||||||
IN USHORT Ist,
|
IN USHORT Ist,
|
||||||
IN USHORT Dpl,
|
IN USHORT Access)
|
||||||
IN USHORT Type)
|
|
||||||
{
|
{
|
||||||
/* Set the handler's address */
|
/* Setup the gate */
|
||||||
Idt[Vector].OffsetLow = ((ULONG_PTR)Handler & 0xFFFF);
|
Idt[Vector].OffsetLow = ((ULONG_PTR)Handler & 0xFFFF);
|
||||||
Idt[Vector].OffsetMiddle = (((ULONG_PTR)Handler >> 16) & 0xFFFF);
|
Idt[Vector].OffsetMiddle = (((ULONG_PTR)Handler >> 16) & 0xFFFF);
|
||||||
Idt[Vector].OffsetHigh = (ULONG_PTR)Handler >> 32;
|
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].IstIndex = Ist;
|
||||||
Idt[Vector].Present = 1;
|
Idt[Vector].Present = 1;
|
||||||
Idt[Vector].Reserved1 = 0;
|
Idt[Vector].Selector = Selector;
|
||||||
Idt[Vector].Type = Type;
|
Idt[Vector].Type = 0xE;
|
||||||
}
|
}
|
||||||
|
@@ -242,34 +242,34 @@ AR::ProcSup::InitializeIdt(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
|||||||
for(Vector = 0; Vector < IDT_ENTRIES; Vector++)
|
for(Vector = 0; Vector < IDT_ENTRIES; Vector++)
|
||||||
{
|
{
|
||||||
/* Set the IDT to handle unexpected interrupts */
|
/* Set the IDT to handle unexpected interrupts */
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, Vector, (PVOID)ArTrap0xFF, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_INTERRUPT_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, Vector, (PVOID)ArTrap0xFF, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setup IDT handlers for known interrupts and traps */
|
/* Setup IDT handlers for known interrupts and traps */
|
||||||
SetIdtGate(ProcessorBlock->IdtBase, 0x00, (PVOID)ArTrap0x00, KGDT_R0_CODE, 0, KIDT_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_INTERRUPT_GATE);
|
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_ACCESS_RING3, I686_TRAP_GATE);
|
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_ACCESS_RING3, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING0, I686_TRAP_GATE);
|
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_ACCESS_RING3, I686_TRAP_GATE);
|
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_ACCESS_RING3, I686_TRAP_GATE);
|
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_ACCESS_RING3, I686_TRAP_GATE);
|
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_ACCESS_RING3, I686_TRAP_GATE);
|
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_ACCESS_RING3, I686_TRAP_GATE);
|
SetIdtGate(ProcessorBlock->IdtBase, 0x2E, (PVOID)ArTrap0x2E, KGDT_R0_CODE, 0, KIDT_INTERRUPT | KIDT_ACCESS_RING3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -656,9 +656,6 @@ AR::ProcSup::SetGdtEntryBase(IN PKGDTENTRY Gdt,
|
|||||||
* @param Access
|
* @param Access
|
||||||
* Supplies the gate access rights.
|
* Supplies the gate access rights.
|
||||||
*
|
*
|
||||||
* @param Type
|
|
||||||
* Supplies the gate type.
|
|
||||||
*
|
|
||||||
* @return This routine does not return any value.
|
* @return This routine does not return any value.
|
||||||
*
|
*
|
||||||
* @since XT 1.0
|
* @since XT 1.0
|
||||||
@@ -670,21 +667,13 @@ AR::ProcSup::SetIdtGate(IN PKIDTENTRY Idt,
|
|||||||
IN PVOID Handler,
|
IN PVOID Handler,
|
||||||
IN USHORT Selector,
|
IN USHORT Selector,
|
||||||
IN USHORT Ist,
|
IN USHORT Ist,
|
||||||
IN USHORT Dpl,
|
IN USHORT Access)
|
||||||
IN USHORT Type)
|
|
||||||
{
|
{
|
||||||
/* Set the handler's address */
|
/* Setup the gate */
|
||||||
Idt[Vector].Offset = (USHORT)((ULONG)Handler & 0xFFFF);
|
Idt[Vector].Offset = (USHORT)((ULONG)Handler & 0xFFFF);
|
||||||
Idt[Vector].ExtendedOffset = (USHORT)((ULONG)Handler >> 16);
|
Idt[Vector].ExtendedOffset = (USHORT)((ULONG)Handler >> 16);
|
||||||
|
Idt[Vector].Access = 0x8000 | (Access << 8);
|
||||||
/* Set the code segment selector */
|
|
||||||
Idt[Vector].Selector = 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -67,8 +67,7 @@ namespace AR
|
|||||||
IN PVOID Handler,
|
IN PVOID Handler,
|
||||||
IN USHORT Selector,
|
IN USHORT Selector,
|
||||||
IN USHORT Ist,
|
IN USHORT Ist,
|
||||||
IN USHORT Dpl,
|
IN USHORT Access);
|
||||||
IN USHORT Type);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -72,8 +72,7 @@ namespace AR
|
|||||||
IN PVOID Handler,
|
IN PVOID Handler,
|
||||||
IN USHORT Selector,
|
IN USHORT Selector,
|
||||||
IN USHORT Ist,
|
IN USHORT Ist,
|
||||||
IN USHORT Dpl,
|
IN USHORT Access);
|
||||||
IN USHORT Type);
|
|
||||||
STATIC XTAPI VOID SetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
STATIC XTAPI VOID SetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||||
IN PVOID KernelFaultStack);
|
IN PVOID KernelFaultStack);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user