aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/boot32.s122
1 files changed, 61 insertions, 61 deletions
diff --git a/src/boot32.s b/src/boot32.s
index 04b509f..251065e 100644
--- a/src/boot32.s
+++ b/src/boot32.s
@@ -14,8 +14,8 @@ _start:
call check_cpuid
call check_long_mode
- //call setup_page_tables
- //call enable_paging
+ call setup_page_tables
+ call enable_paging
//lgdt [gdt64.pointer]
//jmp gdt64.code_segment:long_mode_start
@@ -29,7 +29,7 @@ check_multiboot:
jne .no_multiboot
ret
.no_multiboot:
- mov 'M', %al
+ mov $'M', %al
jmp error
check_cpuid:
@@ -47,7 +47,7 @@ check_cpuid:
je .no_cpuid
ret
.no_cpuid:
- mov 'C', %al
+ mov $'C', %al
jmp error
check_long_mode:
@@ -63,71 +63,71 @@ check_long_mode:
ret
.no_long_mode:
- mov 'L', %al
+ mov $'L', %al
jmp error
-//setup_page_tables:
-// mov eax, page_table_l3
-// or eax, 0b11 ; present, writable
-// mov [page_table_l4], eax
-//
-// mov eax, page_table_l2
-// or eax, 0b11 ; present, writable
-// mov [page_table_l3], eax
-//
-// mov ecx, 0 ; counter
-//.loop:
-//
-// mov eax, 0x200000 ; 2MiB
-// mul ecx
-// or eax, 0b10000011 ; present, writable, huge page
-// mov [page_table_l2 + ecx * 8], eax
-//
-// inc ecx ; increment counter
-// cmp ecx, 512 ; checks if the whole table is mapped
-// jne .loop ; if not, continue
-//
-// ret
-//
-//enable_paging:
-// ; pass page table location to cpu
-// mov eax, page_table_l4
-// mov cr3, eax
-//
-// ; enable PAE
-// mov eax, cr4
-// or eax, 1 << 5
-// mov cr4, eax
-//
-// ; enable long mode
-// mov ecx, 0xC0000080
-// rdmsr
-// or eax, 1 << 8
-// wrmsr
-//
-// ; enable paging
-// mov eax, cr0
-// or eax, 1 << 31
-// mov cr0, eax
-//
-// ret
+setup_page_tables:
+ mov $page_table_l3, %eax
+ or $0b11 , %eax // present, writable
+ mov %eax, (page_table_l4)
+
+ mov $page_table_l2, %eax
+ or $0b11, %eax // present, writable
+ mov %eax, (page_table_l3)
+
+ mov $0, %ecx // counter
+.loop:
+
+ mov $0x200000, %eax // 2MiB
+ mul %ecx
+ or $0b10000011, %eax // present, writable, huge page
+ mov %eax, +page_table_l2(,%ecx,8)
+
+ inc %ecx // increment counter
+ cmp $512, %ecx // checks if the whole table is mapped
+ jne .loop // if not, continue
+
+ ret
+
+enable_paging:
+ // pass page table location to cpu
+ mov $page_table_l4, %eax
+ mov %eax, %cr3
+
+ // enable PAE
+ mov %cr4, %eax
+ or $(1 << 5), %eax
+ mov %eax, %cr4
+
+ // enable long mode
+ mov $0xC0000080, %ecx
+ rdmsr
+ or $(1 << 8), %eax
+ wrmsr
+
+ // enable paging
+ mov %cr0, %eax
+ or $(1 << 31), %eax
+ mov %eax, %cr0
+
+ ret
error:
// // print "ERR: X" where X is the error code
movl $0x4f524f45, 0xb8000
- // mov dword [0xb8004], 0x4f3a4f52
- // mov dword [0xb8008], 0x4f204f20
- // mov byte [0xb800a], al
+ movl $0x4f3a4f52, 0xb8004
+ movl $0x4f204f20, 0xb8008
+ movb %al, 0xb800a
hlt
-//section .bss
-//align 4096
-//page_table_l4:
-// resb 4096
-//page_table_l3:
-// resb 4096
-//page_table_l2:
-// resb 4096
+.section .bss
+.align 4096
+page_table_l4:
+ .skip 4096
+page_table_l3:
+ .skip 4096
+page_table_l2:
+ .skip 4096
//stack_bottom:
// resb 4096 * 4
//stack_top: