diff --git a/.gitignore b/.gitignore index e0c5b73..9b168cc 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ # Test files test-*.c loader_dism.asm +qemu.log # Object files *.o diff --git a/Makefile b/Makefile index 27b8da5..14af716 100644 --- a/Makefile +++ b/Makefile @@ -84,7 +84,7 @@ make_disk: @echo ${CL2}[make_disk]${CL} OK${CL3} testloader: loader - @qemu-system-x86_64 -hda build/bin/disk.img -d cpu_reset & + @qemu-system-x86_64 -hda build/bin/disk.img -d cpu_reset,guest_errors,pcall -s -S -enable-kvm 2> qemu.log & @ndisasm $(OBJDIR)/boot/loader.bin -b 32 > loader_dism.asm diff --git a/boot/loader/cpu/cpuid.asm b/boot/loader/cpu/cpuid.asm deleted file mode 100644 index 89c1bde..0000000 --- a/boot/loader/cpu/cpuid.asm +++ /dev/null @@ -1,65 +0,0 @@ -;=----------------------------------------------------------------------------=; -; GNU GPL OS/K ; -; ; -; Desc: Basic realmode CPU Detection ; -; (x86_64 architecture only) ; -; ; -; ; -; Copyright © 2018-2019 The OS/K Team ; -; ; -; This file is part of OS/K. ; -; ; -; OS/K is free software: you can redistribute it and/or modify ; -; it under the terms of the GNU General Public License as published by ; -; the Free Software Foundation, either version 3 of the License, or ; -; (at your option) any later version. ; -; ; -; OS/K is distributed in the hope that it will be useful, ; -; but WITHOUT ANY WARRANTY; without even the implied warranty of ; -; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; -; GNU General Public License for more details. ; -; ; -; You should have received a copy of the GNU General Public License ; -; along with OS/K. If not, see . ; -;=----------------------------------------------------------------------------=; - -[BITS 16] - -;; GLOBAL DATA -NoLongMode db 0x0A, 0x0D, "ERROR : Your computer is not designed for x64 OS", 0 - -;; TEXT - -Is64bits: -;-----------------------------------------------------------------------; -; Checks if the CPU is compatible with 64-bits operating systems ; -; If the 21th bit of the eax register is set, then CPUID is supported ; -; We then test CPUID's result to see if long mode is supported ; -;-----------------------------------------------------------------------; - pushfd ; recovering the flags in eax - pop eax - mov ecx, eax - xor eax, 0x200000 - push eax - popfd - pushfd - pop eax - xor eax, ecx - shr eax, 21 - and eax, 1 ; magical spell of murta - push ecx - popfd - test eax, eax - jz .NonCompat ; if (CPUID non supporté) goto NonCompat - mov eax, 0x80000000 - cpuid - cmp eax, 0x80000001 - jb .NonCompat ; if (eax <= 0x80000001) goto NonCompat - mov eax, 0x80000001 - cpuid - test edx, 1 << 29 - jz .NonCompat ; if (edx != 1 << 29) goto NonCompat - ret ; back to mbr.s -.NonCompat: - stc - ret diff --git a/boot/loader/io/rmmem.asm b/boot/loader/io/rmmem.asm deleted file mode 100644 index 865b9a9..0000000 --- a/boot/loader/io/rmmem.asm +++ /dev/null @@ -1,113 +0,0 @@ -;=----------------------------------------------------------------------------=; -; GNU GPL OS/K ; -; ; -; Desc: Basic Memory Realmode Driver ; -; (x86_64 architecture only) ; -; ; -; ; -; Copyright © 2018-2019 The OS/K Team ; -; ; -; This file is part of OS/K. ; -; ; -; OS/K is free software: you can redistribute it and/or modify ; -; it under the terms of the GNU General Public License as published by ; -; the Free Software Foundation, either version 3 of the License, or ; -; (at your option) any later version. ; -; ; -; OS/K is distributed in the hope that it will be useful, ; -; but WITHOUT ANY WARRANTY; without even the implied warranty of ; -; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; -; GNU General Public License for more details. ; -; ; -; You should have received a copy of the GNU General Public License ; -; along with OS/K. If not, see . ; -;=----------------------------------------------------------------------------=; - -[BITS 16] - -;; GDT WITH DOC -GDT64: - NULL_SELECTOR: ;; null selector within 64 bits - dw GDT_LENGTH ; limit of GDT - dw GDT64 ; linear address of GDT - dd 0x0 ; - - CODE_SELECTOR: ;; 32-bit code selector (ring 0) - dw 0x0000FFFF ; Segment Limit - db 0x0, 0x0, 0x0 ; Base Address - db 10011010b ; |7|6|5|4|3|2|1|0| - ; | | | | | | | `----- 1 when segment used. - ; | | | | | | `------ 1 when writable. - ; | | | | | `------- 1 if "conformant". Don't know what is it... spectral ? xD - ; | | | | `-------- 1 always - ; | | | `--------- 1 for segment descriptor, 0 for system descriptor - ; | | `---------- DPL !!! 0 for ring 0 - ; | `----------- DPL (2/2) - ; `------------ 1 if in physical memory, 0 if page fault - db 11001111b ; |7|6|5|4|3|2|1|0| - ; | | | | | | | `----- Limit 16 - ; | | | | | | `------ Limit 17 - ; | | | | | `------- Limit 18 - ; | | | | `-------- Limit 19 - ; | | | `--------- available for use - ; | | `---------- 0 always - ; | `----------- size of data. 1 for 32bits - ; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko) - db 0x0 ; Base Address - - DATA_SELECTOR: ;; flat data selector (ring 0) - dw 0x0000FFFF ; Segment Limit - db 0x0, 0x0, 0x0 ; Base Address - db 10010010b ; |7|6|5|4|3|2|1|0| - ; | | | | | | | `----- 1 when segment used. - ; | | | | | | `------ 1 when writable. - ; | | | | | `------- expansion direction. 1 for a LIFO - ; | | | | `-------- 1 always - ; | | | `--------- 1 for segment descriptor, 0 for system descriptor - ; | | `---------- DPL !!! 0 for ring 0 - ; | `----------- DPL (2/2) - ; `------------ 1 if in physical memory, 0 if page fault - db 10001111b ; |7|6|5|4|3|2|1|0| - ; | | | | | | | `----- Limit 16 - ; | | | | | | `------ Limit 17 - ; | | | | | `------- Limit 18 - ; | | | | `-------- Limit 19 - ; | | | `--------- available for use - ; | | `---------- 0 always - ; | `----------- size of data. 1 for 32bits - ; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko) - db 0x0 ; Base Address - - LONG_SELECTOR: ;; 64-bit code selector (ring 0) - dw 0x0000FFFF ; Segment Limit - db 0x0, 0x0, 0x0 ; Base Address - db 10011010b ; |7|6|5|4|3|2|1|0| - ; | | | | | | | `----- 1 when segment used. - ; | | | | | | `------ 1 when writable. - ; | | | | | `------- 1 if "conformant". Don't know what is it... spectral ? xD - ; | | | | `-------- 1 always - ; | | | `--------- 1 for segment descriptor, 0 for system descriptor - ; | | `---------- DPL !!! 0 for ring 0 - ; | `----------- DPL (2/2) - ; `------------ 1 if in physical memory, 0 if page fault - db 10101111b ; |7|6|5|4|3|2|1|0| - ; | | | | | | | `----- Limit 16 - ; | | | | | | `------ Limit 17 - ; | | | | | `------- Limit 18 - ; | | | | `-------- Limit 19 - ; | | | `--------- available for use - ; | | `---------- 0 always - ; | `----------- size of data. 1 for 32bits - ; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko) - db 0x0 ; Base Address - GDT_LENGTH: - -;; TEXT - -set_a20: - push ax - in al, 0x92 - or al, 2 - out 0x92, al - pop ax - ret diff --git a/boot/loader/io/rmterm.asm b/boot/loader/io/rmterm.asm deleted file mode 100644 index 275ff71..0000000 --- a/boot/loader/io/rmterm.asm +++ /dev/null @@ -1,70 +0,0 @@ -;=----------------------------------------------------------------------------=; -; GNU GPL OS/K ; -; ; -; Desc: Basic realmode terminal functions ; -; (x86_64 architecture only) ; -; ; -; ; -; Copyright © 2018-2019 The OS/K Team ; -; ; -; This file is part of OS/K. ; -; ; -; OS/K is free software: you can redistribute it and/or modify ; -; it under the terms of the GNU General Public License as published by ; -; the Free Software Foundation, either version 3 of the License, or ; -; (at your option) any later version. ; -; ; -; OS/K is distributed in the hope that it will be useful, ; -; but WITHOUT ANY WARRANTY; without even the implied warranty of ; -; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; -; GNU General Public License for more details. ; -; ; -; You should have received a copy of the GNU General Public License ; -; along with OS/K. If not, see . ; -;=----------------------------------------------------------------------------=; - -[BITS 16] - -disable_cursor: - pushf - push eax - push edx - mov dx, 0x3D4 - mov al, 0xA ; low cursor shape register - out dx, al - inc dx - mov al, 0x20 ; bits 6-7 unused, bit 5 disables the cursor, bits 0-4 control the cursor shape - out dx, al - pop edx - pop eax - popf - ret - -get_dimensions: - push eax - push ebx - mov ah, 0x0F - int 0x10 - mov [VGA_HEIGHT], ah - mov [VIDEO_MODE], al - pop ebx - pop eax - ret - -PrintB: -;---------------------------------------------------; -; Print out a simple string. ; -; ; -; DS:SI = String to print ; -; ; -; Returns: None ; -; ; -;---------------------------------------------------; - lodsb ; Load byte from ds:si to al - or al, al ; If al is empty stop looping - jz .done ; Done looping and return - mov ah, 0x0e ; Teletype output - int 0x10 ; Video interupt - jmp PrintB ; Loop untill string is null - .done: - ret diff --git a/boot/loader/loader.asm b/boot/loader/loader.asm index 0b9da7f..1fb8f51 100644 --- a/boot/loader/loader.asm +++ b/boot/loader/loader.asm @@ -29,7 +29,7 @@ [global _start] [ORG 0x100000] ; Where GRUB loads us. -%include "boot/loader/multiboot.inc" +%include "boot/loader/multiboot/header.inc" ;; Normal entry point, but a little bit unused since we never use it because... _start: @@ -59,18 +59,41 @@ MB_start: popf push eax ; 2nd argument is magic number push ebx ; 1st argument multiboot info pointer + mov ecx, eax call main add esp, 8 ; Cleanup arguments "A la MIPS" jmp Die ; Aufwiedersehen -;; THE HOLE ----------------------------------------------------------------- ;; +;; THE HOLES ---------------------------------------------------------------- ;; +Error: + mov dword [0xb8000], 0x4f524f45 + mov dword [0xb8004], 0x4f3a4f52 + mov dword [0xb8008], 0x4f204f20 + mov byte [0xb800a], al + jmp Die + Die: cli hlt ; die nooooow ;jmp 0xF000:0xFFF0 jmp $ -;; THE CODE ------------------------------------------------------------------;; +;; THE CODE ----------------------------------------------------------------- ;; main: + call MB_check + + call Check_cpuid + call Is64Bits + + call Setup_paging + call Go64 + + 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" - jmp Die diff --git a/boot/loader/multiboot.inc b/boot/loader/multiboot.inc deleted file mode 100644 index 8874596..0000000 --- a/boot/loader/multiboot.inc +++ /dev/null @@ -1,33 +0,0 @@ -;=----------------------------------------------------------------------------=; -; GNU GPL OS/K ; -; ; -; Desc: Multiboot header ; -; (x86_64 architecture only) ; -; ; -; ; -; Copyright © 2018-2019 The OS/K Team ; -; ; -; This file is part of OS/K. ; -; ; -; OS/K is free software: you can redistribute it and/or modify ; -; it under the terms of the GNU General Public License as published by ; -; the Free Software Foundation, either version 3 of the License, or ; -; (at your option) any later version. ; -; ; -; OS/K is distributed in the hope that it will be useful, ; -; but WITHOUT ANY WARRANTY; without even the implied warranty of ; -; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; -; GNU General Public License for more details. ; -; ; -; You should have received a copy of the GNU General Public License ; -; along with OS/K. If not, see . ; -;=----------------------------------------------------------------------------=; - -;; MULTIBOOT HEADER -MB_AOUT_KLUDGE equ 1 << 16 ; We are not an ELF executable -MB_ALIGN equ 1 << 0 ; Ask to align loaded modules on page boundaries -MB_MEMINFO equ 1 << 1 ; Ask to provide memory map -MB_HEADER_MAGIC equ 0x1BADB002 -MB_HEADER_FLAGS equ MB_AOUT_KLUDGE|MB_ALIGN|MB_MEMINFO -CHECKSUM equ -(MB_HEADER_MAGIC + MB_HEADER_FLAGS) -KERNEL_STACK equ 0x00200000 ; Stack starts at the 2mb address & grows down diff --git a/build/obj/boot/loader.bin b/build/obj/boot/loader.bin index c5b1e9d..8721f45 100644 Binary files a/build/obj/boot/loader.bin and b/build/obj/boot/loader.bin differ