os-k/boot/loader/loader.asm

176 lines
6.6 KiB
NASM
Raw Normal View History

2019-01-16 11:04:44 +01:00
;=----------------------------------------------------------------------------=;
; GNU GPL OS/K ;
; ;
; Desc: Kernel Loader for OS/K ;
2019-01-16 11:04:44 +01:00
; (x86_64 architecture only) ;
2019-02-06 15:34:39 +01:00
; ;
; ;
; 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 <https://www.gnu.org/licenses/>. ;
2019-01-16 11:04:44 +01:00
;=----------------------------------------------------------------------------=;
%include "boot/loader/multiboot/header.inc"
%include "boot/loader/multiboot/check.inc"
2019-03-09 21:46:09 +01:00
%include "boot/loader/cpu/cpu32.inc"
%include "boot/loader/mem/management.inc"
%include "boot/loader/io/terminal.inc"
%include "boot/loader/cpu/cpu.inc"
%include "boot/loader/mem/structures.inc"
2019-01-17 14:09:08 +01:00
global MB_start
2019-03-19 12:24:27 +01:00
global MB_header
extern StartKern
2019-02-12 14:58:26 +01:00
[BITS 32]
[section .multiboot]
2019-02-12 14:58:26 +01:00
;; MAGNIFICENT MULTIBOOT HEADER FOR GRUB ------------------------------------ ;;
MB_header:
ALIGN 4
dd MB_HEADER_MAGIC
dd MB_HEADER_FLAGS
dd CHECKSUM
2019-03-22 15:03:41 +01:00
times 5 dd 0x0
dd MB_VIDEO_MODE
dd MB_VIDEO_WIDTH
dd MB_VIDEO_HEIGHT
dd MB_VIDEO_DEPTH
2019-02-12 14:58:26 +01:00
[section .text]
;;MULTIBOOT POINT ENTRY FOR GRUB ------------------------------------------- ;;
2019-02-12 14:58:26 +01:00
MB_start:
mov esp, KERNEL_STACK ; Setup the stack
push 0 ; Reset EFLAGS
2019-02-12 14:58:26 +01:00
popf
mov [mbInfo], ebx
mov [mbMagic], eax
2019-03-08 09:44:09 +01:00
mov ecx, eax ; For debug
call _loader
add esp, 8 ; Cleanup arguments "A la MIPS"
2019-03-08 09:44:09 +01:00
jmp Die ; Aufwiedersehen, but never used
2019-01-16 11:04:44 +01:00
;; THE HOLES ---------------------------------------------------------------- ;;
; ---------------------------------------------------------------------------- ;
; Prints 'ERR:XX' where 'XX' is the str in AX ;
; ---------------------------------------------------------------------------- ;
Error:
mov word [.code], ax
push esi
mov bl, 0x0c
mov esi, .ergo
call write32
pop esi
jmp Die
2019-03-22 15:03:41 +01:00
.ergo : db 219, 219, 219, " OS/K Loader Error "
.code : db "00"
db 0x0
; ---------------------------------------------------------------------------- ;
; Kills the mind of your computer to get it prostrated ;
; ---------------------------------------------------------------------------- ;
2019-01-16 11:04:44 +01:00
Die:
cli
hlt ; die nooooow
jmp $
2019-01-16 11:04:44 +01:00
;; 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
2019-03-12 17:13:09 +01:00
LOGO db 219, 219, 219, " OS/K", 0
mbInfo dq 0
mbMagic dq 0
lbegin:
2019-03-08 09:44:09 +01:00
call clear ; Clear the screen
2019-03-22 15:03:41 +01:00
push esi ; Print the logo
mov bl, 0x0E
mov esi, LOGO
call write32
pop esi
2019-03-08 09:44:09 +01:00
;; BEGIN OF CHECKLIST
call MB_check ; Check Multiboot State, ERR 01
call Check_cpuid ; Check if cpuid supported, ERR 02
call Is64Bits ; Check if long mode available, ERR 03
call CheckA20 ; Check if A20 is correctly enable, ERR 04
2019-03-08 09:44:09 +01:00
;; BEGIN OF WORK
call Setup_paging ; Enable paging
call Go64 ; Prepare switch into long mode
2019-03-08 21:15:10 +01:00
;call disable_cursor
lgdt [GDT64.pointer]
2019-03-08 09:44:09 +01:00
jmp GDT64.code:_loader64 ; SWITCH
[BITS 64]
2019-03-08 09:44:09 +01:00
x64_K db "Now in x64 long mode", 0x0A, 0x0D, 0x0
GoKernel db "Launching Kernel...", 0
nokernel db 219, 219, 219, " Error 05 : Kernel returns",0
_loader64:
;; Some cleanup
mov ax, 0
mov ss, ax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
call bitemporize
2019-03-08 09:44:09 +01:00
mov qword [NextTRAM], TRAM+80*4 ; Because we don't want to overwrite
;; Hello world
mov bl, 0x0A
2019-03-08 09:44:09 +01:00
mov esi, x64_K
call write
mov bl, 0x0F
mov esi, GoKernel
call write
2019-03-08 09:44:09 +01:00
;; Launch the kernel !
2019-03-21 13:30:17 +01:00
;; XXX CHECK THE RAM BEFORE CALLING KERNEL !
2019-03-08 09:44:09 +01:00
call tritemporize ; Let time to see
mov rdi, [mbInfo]
mov rsi, [mbMagic]
call StartKern
2019-03-08 09:44:09 +01:00
;; We must never reach this point ------------------------------------------- ;;
call tritemporize ; Let time to see
call clear
mov bl, 0x0c
mov esi, nokernel ; Error 05
call write
jmp Die