2019-01-16 11:04:44 +01:00
|
|
|
;=----------------------------------------------------------------------------=;
|
|
|
|
; GNU GPL OS/K ;
|
|
|
|
; ;
|
|
|
|
; Desc: Kernel (second stage) Loader for OS/K ;
|
|
|
|
; (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
|
|
|
;=----------------------------------------------------------------------------=;
|
|
|
|
|
2019-01-17 14:09:08 +01:00
|
|
|
%define DEBUG
|
|
|
|
|
2019-02-12 14:58:26 +01:00
|
|
|
[BITS 32]
|
|
|
|
[global _start]
|
2019-03-05 00:15:08 +01:00
|
|
|
[ORG 0x100000] ; Where GRUB loads us.
|
2019-02-12 14:58:26 +01:00
|
|
|
|
2019-03-05 15:50:02 +01:00
|
|
|
%include "boot/loader/multiboot/header.inc"
|
2019-02-12 14:58:26 +01:00
|
|
|
|
2019-03-05 00:15:08 +01:00
|
|
|
;; Normal entry point, but a little bit unused since we never use it because...
|
2019-02-12 14:58:26 +01:00
|
|
|
_start:
|
2019-03-05 00:15:08 +01:00
|
|
|
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
|
2019-03-04 22:34:07 +01:00
|
|
|
;mov [Bootdrv], dl
|
2019-02-12 14:58:26 +01:00
|
|
|
xor dl, dl
|
2019-03-05 19:54:14 +01:00
|
|
|
jmp 0x0000:_loader ; pas sûr
|
2019-02-12 14:58:26 +01:00
|
|
|
|
2019-03-05 00:15:08 +01:00
|
|
|
;; Magnificent multiboot header for GRUB ------------------------------------ ;;
|
2019-03-04 22:34:07 +01:00
|
|
|
MB_header:
|
2019-02-15 15:47:56 +01:00
|
|
|
align 4
|
|
|
|
dd MB_HEADER_MAGIC
|
|
|
|
dd MB_HEADER_FLAGS
|
|
|
|
dd CHECKSUM
|
2019-03-05 00:15:08 +01:00
|
|
|
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
|
2019-02-12 14:58:26 +01:00
|
|
|
|
2019-03-05 00:15:08 +01:00
|
|
|
;; Multiboot entry point for Grub ------------------------------------------- ;;
|
2019-02-12 14:58:26 +01:00
|
|
|
MB_start:
|
2019-03-05 00:15:08 +01:00
|
|
|
mov esp, KERNEL_STACK ; Setup the stack
|
|
|
|
push 0 ; Reset EFLAGS
|
2019-02-12 14:58:26 +01:00
|
|
|
popf
|
2019-03-05 00:15:08 +01:00
|
|
|
push eax ; 2nd argument is magic number
|
|
|
|
push ebx ; 1st argument multiboot info pointer
|
2019-03-05 15:50:02 +01:00
|
|
|
mov ecx, eax
|
2019-03-05 19:54:14 +01:00
|
|
|
call _loader
|
2019-03-05 00:15:08 +01:00
|
|
|
add esp, 8 ; Cleanup arguments "A la MIPS"
|
|
|
|
jmp Die ; Aufwiedersehen
|
2019-01-16 11:04:44 +01:00
|
|
|
|
2019-03-05 15:50:02 +01:00
|
|
|
;; THE HOLES ---------------------------------------------------------------- ;;
|
|
|
|
Error:
|
|
|
|
mov dword [0xb8000], 0x4f524f45
|
|
|
|
mov dword [0xb8004], 0x4f3a4f52
|
|
|
|
mov dword [0xb8008], 0x4f204f20
|
|
|
|
mov byte [0xb800a], al
|
|
|
|
jmp Die
|
|
|
|
|
2019-01-16 11:04:44 +01:00
|
|
|
Die:
|
|
|
|
cli
|
2019-03-05 00:15:08 +01:00
|
|
|
hlt ; die nooooow
|
2019-03-04 22:34:07 +01:00
|
|
|
;jmp 0xF000:0xFFF0
|
|
|
|
jmp $
|
2019-01-16 11:04:44 +01:00
|
|
|
|
2019-03-05 15:50:02 +01:00
|
|
|
;; THE CODE ----------------------------------------------------------------- ;;
|
2019-03-05 19:54:14 +01:00
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------- ;
|
|
|
|
; _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:
|
2019-03-05 15:50:02 +01:00
|
|
|
call MB_check
|
2019-03-05 19:54:14 +01:00
|
|
|
jmp lnext
|
2019-03-05 15:50:02 +01:00
|
|
|
|
2019-03-05 19:54:14 +01:00
|
|
|
%include "boot/loader/cpu/cpuid.inc"
|
|
|
|
lnext:
|
2019-03-05 15:50:02 +01:00
|
|
|
call Check_cpuid
|
|
|
|
call Is64Bits
|
2019-03-05 19:54:14 +01:00
|
|
|
jmp lnext2
|
2019-03-05 15:50:02 +01:00
|
|
|
|
2019-03-05 19:54:14 +01:00
|
|
|
%include "boot/loader/mem/structures.inc"
|
|
|
|
lnext2:
|
2019-03-05 15:50:02 +01:00
|
|
|
call Setup_paging
|
2019-03-05 20:40:34 +01:00
|
|
|
call Go64
|
2019-03-05 19:54:14 +01:00
|
|
|
jmp lnext3
|
|
|
|
%include "boot/loader/mem/management.inc"
|
2019-03-05 19:11:35 +01:00
|
|
|
|
2019-03-05 19:54:14 +01:00
|
|
|
lnext3:
|
2019-03-05 15:50:02 +01:00
|
|
|
mov dword [0xb8000], 0x2f4b2f4f
|
|
|
|
ret
|
|
|
|
|