diff options
| -rw-r--r-- | src/boot32.s | 122 |
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: |
