;=----------------------------------------------------------------------------=; ; GNU GPL OS/K ; ; ; ; Desc: Kernel (second stage) Loader for OS/K ; ; (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 . ; ;=----------------------------------------------------------------------------=; %define DEBUG [BITS 32] [global _start] [ORG 0x100000] ; Where GRUB loads us. %include "boot/loader/multiboot/header.inc" ;; NORMAL ENTRY POINT, BUT A LITTLE BIT UNUSED SINCE WE NEVER USE IT BECAUSE... _start: mov ax, cs ; correcting cs after the horrible far jump mov ds, ax ; hm... And ds too mov es, ax ; And es because it is jealous ;mov [Bootdrv], dl xor dl, dl jmp 0x0000:_loader ; pas sûr ;; MAGNIFICENT MULTIBOOT HEADER FOR GRUB ------------------------------------ ;; MB_header: align 4 dd MB_HEADER_MAGIC dd MB_HEADER_FLAGS dd CHECKSUM dd MB_header ; Header address dd _start ; Address of code entry point dd 00 ; (end of code) not necessary dd 00 ; (bss) not necessary dd MB_start ; entry address GRUB will start at ;; MULTIBOOT POINT ENTRY FOR GRUB ------------------------------------------- ;; MB_start: mov esp, KERNEL_STACK ; Setup the stack push 0 ; Reset EFLAGS popf push eax ; 2nd argument is magic number push ebx ; 1st argument multiboot info pointer mov ecx, eax call _loader add esp, 8 ; Cleanup arguments "A la MIPS" jmp Die ; Aufwiedersehen ;; THE HOLES ---------------------------------------------------------------- ;; ; ---------------------------------------------------------------------------- ; ; Prints 'ERR:XX' where 'XX' is the str in AX ; ; ---------------------------------------------------------------------------- ; Error: mov dword [0xb8000], 0x4f524f45 mov dword [0xb8004], 0x4f3a4f52 mov dword [0xb8008], 0x4f204f20 mov byte [0xb800a], al mov byte [0xb800c], ah mov byte [0xb800d], 0x4f jmp Die ; ---------------------------------------------------------------------------- ; ; Kills the mind of your computer to get it prostrated ; ; ---------------------------------------------------------------------------- ; Die: cli hlt ; die nooooow ;jmp 0xF000:0xFFF0 jmp $ ;; THE CODE ----------------------------------------------------------------- ;; ; ---------------------------------------------------------------------------- ; ; _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" %include "boot/loader/cpu/cpuid.inc" %include "boot/loader/mem/structures.inc" %include "boot/loader/mem/management.inc" lbegin: call MB_check call Check_cpuid call Is64Bits call CheckA20 call Setup_paging call Go64 lgdt [GDT64.pointer] jmp GDT64.code:l64 [BITS 64] %include "boot/loader/io/terminal.inc" %include "boot/loader/io/ata.inc" %include "boot/loader/cpu/cpu.inc" Salut db 0x09, " Booting OS/K ", 0x09, 0x0A, 0x0D, 0x0 ReadAttempt db 0x09, " Attempt to read a sector with ATA commands...", 0 l64: ;; Some cleanup mov ax, 0 mov ss, ax mov ds, ax mov es, ax mov fs, ax mov gs, ax ;; Hello world mov bl, 0x0A mov esi, Salut call write ;; Read ATA mov bl, 0x0F mov esi, ReadAttempt call write call temporize ;; Reading a sector of the disk mov bl, 1 mov bh, 1 call ata_read jmp Die