Squash commits for public release

This commit is contained in:
2025-02-12 09:54:05 -05:00
commit 7118adc514
1108 changed files with 80873 additions and 0 deletions

View File

@@ -0,0 +1,299 @@
MBOOT_PAGE_ALIGN equ 1<<0
MBOOT_MEM_INFO equ 1<<1
MBOOT_HEADER_MAGIC equ 0x1badb002
MBOOT_HEADER_FLAGS equ MBOOT_PAGE_ALIGN | MBOOT_MEM_INFO
MBOOT_CHECKSUM equ -(MBOOT_HEADER_MAGIC + MBOOT_HEADER_FLAGS)
section .multiboot
dd MBOOT_HEADER_MAGIC
dd MBOOT_HEADER_FLAGS
dd MBOOT_CHECKSUM
dd 0x00000000; header_addr
dd 0x00000000; load_addr
dd 0x00000000; load_end_addr
dd 0x00000000; bss_end_addr
dd 0x00000000; entry_addr
dd 0x00000000; mode_type
dd 0x00000000; width
dd 0x00000000; height
dd 0x00000000; depth
[bits 32]
section .xos_boot_text
extern main
extern PREKERNEL_STACK_TOP
global _start
_start:
global prekernel_entry
prekernel_entry:
cli
cld
; Setting up the stack.
mov ebp, PREKERNEL_STACK_TOP
mov esp, ebp
; Save entry point to one of callee-saved regs.
mov esi, ecx
; PAE is required for x86_64
call check_for_pae
; Checking for long mode.
call check_for_long_mode
; x86_64 required paging enabled, thus 1GB of physical memmory is mapped
; for booting the kernel without any problems.
call setup_tables
; Enabling long mode with a 32-bit compatibility submode.
call enable_long_mode
; Just give control to jumper.
jmp jump_to_entry64
CPUID_FEATURE_PAE equ (1 << 6)
check_for_pae:
push ebp
mov ebp, esp
push ebx
mov eax, 0x1
cpuid
test edx, CPUID_FEATURE_PAE
jz pae_unsupported
pop ebx
pop ebp
ret
pae_unsupported:
push pae_unsupported_msg
call early_boot_print_string
hlt
CPUID_FEATURE_LONG_MODE equ (1 << 29)
check_for_long_mode:
push ebp
mov ebp, esp
push ebx
mov eax, 0x80000001
cpuid
test edx, CPUID_FEATURE_LONG_MODE
jz long_mode_unsupported
pop ebx
pop ebp
ret
long_mode_unsupported:
push long_mode_unsupported_msg
call early_boot_print_string
hlt
setup_tables:
push ebp
mov ebp, esp
push edi
mov edi, table0
xor eax, eax
mov ecx, 4096
rep stosb
mov edi, table1
xor eax, eax
mov ecx, 4096
rep stosb
mov edi, table2
xor eax, eax
mov ecx, 4096
rep stosb
mov eax, table1
add eax, 0x3
mov DWORD [table0], eax
mov eax, table2
add eax, 0x3
mov DWORD [table1], eax
mov edi, table2
mov eax, 0x83
mov ecx, 512
.table_fillup_last:
mov DWORD [edi], eax
add eax, 0x200000
add edi, 8
loop .table_fillup_last
pop edi
pop ebp
ret
enable_long_mode:
push ebp
mov ebp, esp
; Setting table
mov eax, table0
mov cr3, eax
; Enabling PAE
mov eax, cr4
or eax, 1 << 5
mov cr4, eax
; Enabling Long Mode
mov ecx, 0xc0000080
rdmsr
or eax, 1 << 8
wrmsr
mov eax, cr0
or eax, 1 << 31
mov cr0, eax
pop ebp
ret
VIDEO_MEMORY equ 0xb8000
WHITE_ON_BLACK equ 0x0f
global early_boot_print_string
early_boot_print_string:
push ebp
mov ebp, esp
push esi
push ecx
mov esi, [ebp+8]
mov ecx, VIDEO_MEMORY
mov ah, WHITE_ON_BLACK
_print_string_loop:
lodsb; Load from esi to al then increment esi
test al, al
jz _print_string_end
mov [ecx], ax
add ecx, 2
jmp _print_string_loop
_print_string_end:
mov eax, esi
sub eax, [ebp+8]
pop ecx
pop esi
mov esp, ebp
pop ebp
ret
; Access bits
PRESENT equ 1 << 7
NOT_SYS equ 1 << 4
EXEC equ 1 << 3
DC equ 1 << 2
RW equ 1 << 1
ACCESSED equ 1 << 0
; Flags bits
GRAN_4K equ 1 << 7
SZ_32 equ 1 << 6
LONG_MODE equ 1 << 5
align 32
gdt_begin:
gdt_null:
dq 0x0
gdt_code:
dd 0xffff
db 0x0
db PRESENT | NOT_SYS | EXEC | RW
db GRAN_4K | LONG_MODE | 0xF
db 0x0
gdt_data:
dd 0xffff
db 0x0
db PRESENT | NOT_SYS | RW
db GRAN_4K | SZ_32 | 0xF
db 0x0
gdt_tss:
dd 0x00000068
dd 0x00cf8900
gdt_end:
gdt_descriptor:
dw gdt_end - gdt_begin - 1
dd gdt_begin
dd 0x0
CODE_SEG equ gdt_code - gdt_begin
DATA_SEG equ gdt_data - gdt_begin
jump_to_entry64:
lgdt [gdt_descriptor]
jmp CODE_SEG:main_entry64
[bits 64]
main_entry64:
cli
mov ax, DATA_SEG
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov edi, esi
mov esi, ebx
call main
hlt
global set_cr3
set_cr3:
mov cr3, rdi
ret
global jump_to_kernel
jump_to_kernel:
mov rax, cr3
mov cr3, rax
call rsi
jmp $
pae_unsupported_msg:
db "Required PAE Feature is unavailable, stopping...", 0
long_mode_unsupported_msg:
db "Required Long Mode Feature is unavailable, stopping...", 0
section .bss
table0:
align 4096
resb 4096
table1:
align 4096
resb 4096
table2:
align 4096
resb 4096