diff options
Diffstat (limited to 'src/bootloader/enter_kernel_backup')
-rw-r--r-- | src/bootloader/enter_kernel_backup | 87 |
1 files changed, 0 insertions, 87 deletions
diff --git a/src/bootloader/enter_kernel_backup b/src/bootloader/enter_kernel_backup deleted file mode 100644 index 7631f20..0000000 --- a/src/bootloader/enter_kernel_backup +++ /dev/null @@ -1,87 +0,0 @@ -[extern main] -[extern _kernel_stack_loc] -enter_longmode: -cli - -; TODO check if a20 is already set -mov al, 0x92 -or al, 2 -out 0x92, al - -lgdt [protected_gdt.descriptor] -mov eax, cr0 -or eax, 0x1 -mov cr0, eax - -mov eax, 0x8 -mov ds, eax - -jmp 0x8:init_longmode - -bits 32 -init_longmode: -mov ebp, 0xffff -mov esp, ebp -mov ax, PROTECTED_DATA_SEGMENT -mov ds, ax -mov ss, ax -mov es, ax -mov fs, ax -mov gs, ax - -mov edi, 0x3000 ; this is where our page tables will be -mov cr3, edi -mov eax, 0 ; what we'll be putting there -mov ecx, 4096 ; how many times we'll put it there -rep stosd ; kinda like memset(&edi, ecx, edi) -mov edi, cr3 - -mov DWORD [edi], 0x4003 ; pml4e[0] = pdpe -add edi, 0x1000 -mov DWORD [edi], 0x5003 ; pdpe[0] = pde -add edi, 0x1000 -mov DWORD [edi], 0x6003 ; pde[0] = pte -add edi, 0x1000 - -mov ebx, 0x00000003 ; the flags -mov ecx, 512; the loop counter, will map 2 mib - -.idmap_pte_loop: -mov DWORD [edi], ebx -add ebx, 0x1000 ; physical address. Should leave us at 0x7000 -add edi, 8 ; position in page table -loop .idmap_pte_loop - -mov eax, cr4 -or eax, 1 << 5 -mov cr4, eax - -mov ecx, 0xc0000080 -rdmsr -or eax, 1 << 8 -wrmsr - -mov eax, cr0 -or eax, 1 << 31 | 1 << 0 ; this is where we set paging and protected mode (respectively)! -mov cr0, eax - - -mov ecx, 0xc0000080 -rdmsr -or eax, 1 << 8 -wrmsr - -mov eax, cr0 -or eax, 1 << 31 -mov cr0, eax - -lgdt [long_gdt.descriptor] - -jmp LONG_CODE_SEGMENT:enter_kernel -enter_kernel: -bits 64 -mov rbp, _kernel_stack_loc -mov rsp, _kernel_stack_loc -call main ; where we actually call the kernel -jmp $ -ret |