From 33d68464b2b1df4d5217c58001cfe7f11fa680b5 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Tue, 5 Mar 2019 19:54:14 +0100 Subject: [PATCH] LONG MODE MULTIBOOT WORKS gsp! --- boot/loader/loader.asm | 61 ++++++++++++++++----------------- boot/loader/mem/management.inc | 28 +++++++++++++++ build/obj/boot/loader.bin | Bin 12644 -> 12649 bytes 3 files changed, 57 insertions(+), 32 deletions(-) diff --git a/boot/loader/loader.asm b/boot/loader/loader.asm index 586d18e..09b565b 100644 --- a/boot/loader/loader.asm +++ b/boot/loader/loader.asm @@ -38,7 +38,7 @@ _start: mov es, ax ; And es because it is jealous ;mov [Bootdrv], dl xor dl, dl - jmp 0x0000:main ; pas sûr + jmp 0x0000:_loader ; pas sûr ;; Magnificent multiboot header for GRUB ------------------------------------ ;; MB_header: @@ -60,7 +60,7 @@ MB_start: push eax ; 2nd argument is magic number push ebx ; 1st argument multiboot info pointer mov ecx, eax - call main + call _loader add esp, 8 ; Cleanup arguments "A la MIPS" jmp Die ; Aufwiedersehen @@ -79,42 +79,39 @@ Die: jmp $ ;; THE CODE ----------------------------------------------------------------- ;; -main: - call MB_check +; ---------------------------------------------------------------------------- ; +; _loader ; +; ; +; This is the function that initiates the launch of OS/K. It verifies that ; +; Grub has properly loaded this loader and makes the appropriate setup so ; +; that the kernel will work properly ; +; ; +; Why this original design ? Because it works well and prevent us to cause ; +; triple faults by aligment error or too long jumps (yup, it can be a problem); +; ; +; ---------------------------------------------------------------------------- ; +_loader: + jmp lbegin + +%include "boot/loader/multiboot/check.inc" +lbegin: + call MB_check + jmp lnext + +%include "boot/loader/cpu/cpuid.inc" +lnext: call Check_cpuid call Is64Bits + jmp lnext2 +%include "boot/loader/mem/structures.inc" +lnext2: call Setup_paging + jmp lnext3 +%include "boot/loader/mem/management.inc" - ;; Registering paging - mov eax, PML4_table - mov cr3, eax ; Load PML4 to cr3 - - mov eax, cr4 - or eax, 1 << 5 - mov cr4, eax ; Enable PAE - - ;; Activate long mode - mov ecx, 0xC0000080 ; address of MSR - rdmsr ; read MSR - or eax, 1 << 8 ; LME = 1. (Long Mode Enable) - wrmsr ; write MSR - - ;; Enable paging - mov eax, cr0 - or eax, 1 << 31 ; make MSR bit 31 (PG = Paging) to 1 : - ; |1|000000000000000000000000000000 - ; | - ; `------ Paging bit - mov cr0, eax - +lnext3: mov dword [0xb8000], 0x2f4b2f4f ret -;; INCLUDES ----------------------------------------------------------------- ;; -%include "boot/loader/cpu/cpuid.inc" -%include "boot/loader/multiboot/check.inc" -%include "boot/loader/mem/structures.inc" -%include "boot/loader/mem/management.inc" - diff --git a/boot/loader/mem/management.inc b/boot/loader/mem/management.inc index 3790a9d..3634666 100644 --- a/boot/loader/mem/management.inc +++ b/boot/loader/mem/management.inc @@ -52,3 +52,31 @@ Setup_paging: jne .map_p2_table ; else map the next entry ret + +; ---------------------------------------------------------------------------- ; +; Enable long mode and paging ; +; ---------------------------------------------------------------------------- ; +Go64: + ;; Registering paging + mov eax, PML4_table + mov cr3, eax ; Load PML4 to cr3 + + mov eax, cr4 + or eax, 1 << 5 + mov cr4, eax ; Enable PAE + + ;; Activate long mode + mov ecx, 0xC0000080 ; address of MSR + rdmsr ; read MSR + or eax, 1 << 8 ; LME = 1. (Long Mode Enable) + wrmsr ; write MSR + + ;; Enable paging + mov eax, cr0 + or eax, 1 << 31 ; make MSR bit 31 (PG = Paging) to 1 : + ; |1|000000000000000000000000000000 + ; | + ; `------ Paging bit + mov cr0, eax + + ret diff --git a/build/obj/boot/loader.bin b/build/obj/boot/loader.bin index 182a3e209f7fadaa2e907c05e87f344e1c0f846e..faf31098a145ef011cb83636a3ffd826bcb67367 100644 GIT binary patch delta 155 zcmaEo^fGBezSwKt#-B_Z)@qkB9^PQ^`oxQO|NsAgZ8dR+g8u9Ib0RtqnldmbFa*q< z6A?Jq@Tt17mtC8UhDx9FO>`!7$!{kz;J`Jj*!YtHsI>IS;T<0sCbp^b96rv<(7?^$ukWpY7yy`? BMb7{L delta 150 zcmaEv^dxCQzW9q41_p)~DImfML@YI6VA!F-IN8ilo%=W|LjyO1zrMHr;fbvZCNDGp z|NlQHqVu3B1A_uXz}z_zfpaZSlrSFNVEEDxDAo9rX~SCWQXt>pr5%v3!N|e5@rsOr p#10KX0fy!i%!@S`1%QStLOFty`3=SRKwQVhpA1Y445d#F0|5RJH?jZ#