Revert "Revert "stuff""
This reverts commit 8ac808d1297edaeacf88f83a99591ff9b37b672b.
This commit is contained in:
parent
a7fc8e1eab
commit
810371a1df
|
@ -0,0 +1,70 @@
|
||||||
|
;=----------------------------------------------------------------------------=;
|
||||||
|
; 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 <https://www.gnu.org/licenses/>. ;
|
||||||
|
;=----------------------------------------------------------------------------=;
|
||||||
|
|
||||||
|
[BITS 32]
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------- ;
|
||||||
|
; 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 ;
|
||||||
|
; ---------------------------------------------------------------------------- ;
|
||||||
|
Is64Bits:
|
||||||
|
;; test if extended processor info in available
|
||||||
|
mov eax, 0x80000000 ; implicit argument for cpuid
|
||||||
|
cpuid ; get highest supported argument
|
||||||
|
cmp eax, 0x80000001 ; it needs to be at least 0x80000001
|
||||||
|
jb .no_64 ; if it's less, the CPU is too old for long mode
|
||||||
|
|
||||||
|
;; use extended info to test if long mode is available
|
||||||
|
mov eax, 0x80000001 ; argument for extended processor info
|
||||||
|
cpuid ; returns various feature bits in ecx and edx
|
||||||
|
test edx, 1 << 29 ; test if the LM-bit is set in the D-register
|
||||||
|
jz .no_64 ; If it's not set, there is no long mode
|
||||||
|
ret
|
||||||
|
.no_64:
|
||||||
|
mov al, "2" ; ERROR 1 : 64bits unsupported
|
||||||
|
jmp Error
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------- ;
|
||||||
|
; Check if CPUID is supported by flip the bit 21 (ID bit) in the FLAGS ;
|
||||||
|
; register. If we can flip, CPUID is available. ;
|
||||||
|
; ---------------------------------------------------------------------------- ;
|
||||||
|
Check_cpuid:
|
||||||
|
pushfd ; Copy FLAGS in to EAX via stack
|
||||||
|
pop eax
|
||||||
|
mov ecx, eax ; Copy to ECX as well for comparing later on
|
||||||
|
xor eax, 1 << 21 ; Flip the ID bit
|
||||||
|
push eax ; Copy EAX to FLAGS via the stack
|
||||||
|
popfd
|
||||||
|
pushfd ; Copy FLAGS back to EAX (with the flipped bit if CPUID is supported)
|
||||||
|
pop eax
|
||||||
|
push ecx ; flipping the flipped ID bit back if it was ever flipped like flipper
|
||||||
|
popfd
|
||||||
|
cmp eax, ecx ; VERITY MOMENT
|
||||||
|
je .no_cpuid
|
||||||
|
ret
|
||||||
|
.no_cpuid:
|
||||||
|
mov al, "1" ; ERROR 1 : CPUID UNSUPPORTED
|
||||||
|
jmp Error
|
|
@ -0,0 +1,54 @@
|
||||||
|
;=----------------------------------------------------------------------------=;
|
||||||
|
; GNU GPL OS/K ;
|
||||||
|
; ;
|
||||||
|
; Desc: Memory management from protected mode ;
|
||||||
|
; (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 <https://www.gnu.org/licenses/>. ;
|
||||||
|
;=----------------------------------------------------------------------------=;
|
||||||
|
|
||||||
|
[BITS 32]
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------- ;
|
||||||
|
; Constructor for the page tables in protected mode ;
|
||||||
|
; ---------------------------------------------------------------------------- ;
|
||||||
|
Setup_paging:
|
||||||
|
;; Map the first PML4 entry to PDP table
|
||||||
|
mov eax, PDP_table
|
||||||
|
or eax, 0b11 ; present + writable
|
||||||
|
mov [PML4_table], eax
|
||||||
|
|
||||||
|
;; Map the first PDP entry to PD table
|
||||||
|
mov eax, PD_table
|
||||||
|
or eax, 0b11 ; present + writable
|
||||||
|
mov [PDP_table], eax
|
||||||
|
|
||||||
|
;; Map each PD entry to a 'huge' 2MiB page
|
||||||
|
mov ecx, 0 ; counter variable
|
||||||
|
.map_p2_table:
|
||||||
|
;; map ecx-th PD entry to a huge page that starts at address 2MiB*ecx
|
||||||
|
mov eax, 0x200000
|
||||||
|
mul ecx ; start address of ecx-th page
|
||||||
|
or eax, 0b10000011 ; present + writable + huge
|
||||||
|
mov [PD_table + ecx * 8], eax
|
||||||
|
inc ecx
|
||||||
|
cmp ecx, 512 ; if counter == 512, the whole PD table is mapped
|
||||||
|
jne .map_p2_table ; else map the next entry
|
||||||
|
|
||||||
|
ret
|
|
@ -0,0 +1,113 @@
|
||||||
|
;=----------------------------------------------------------------------------=;
|
||||||
|
; GNU GPL OS/K ;
|
||||||
|
; ;
|
||||||
|
; Desc: Memory Design Structures ;
|
||||||
|
; (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 <https://www.gnu.org/licenses/>. ;
|
||||||
|
;=----------------------------------------------------------------------------=;
|
||||||
|
|
||||||
|
[BITS 32]
|
||||||
|
|
||||||
|
;; GDT WITH DOC
|
||||||
|
ALIGN 4
|
||||||
|
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:
|
||||||
|
|
||||||
|
;; EMPTY PAGE TABLES (identity of the first 1GiB)
|
||||||
|
ALIGN 4
|
||||||
|
PML4_table:
|
||||||
|
resb 4096
|
||||||
|
PDP_table:
|
||||||
|
resb 4096
|
||||||
|
PD_table:
|
||||||
|
resb 4096
|
|
@ -0,0 +1,35 @@
|
||||||
|
;=----------------------------------------------------------------------------=;
|
||||||
|
; GNU GPL OS/K ;
|
||||||
|
; ;
|
||||||
|
; Desc: Multiboot useful 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 <https://www.gnu.org/licenses/>. ;
|
||||||
|
;=----------------------------------------------------------------------------=;
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------- ;
|
||||||
|
; Multiboot check function to ensure we are launch by GRUB ;
|
||||||
|
; ---------------------------------------------------------------------------- ;
|
||||||
|
MB_check:
|
||||||
|
cmp ecx, MB_GRUB_MAGIC ; The magic number must be in ecx
|
||||||
|
jne .no_MB
|
||||||
|
ret
|
||||||
|
.no_MB:
|
||||||
|
mov al, "0" ; ERROR 0 : No multiboot
|
||||||
|
jmp Error
|
|
@ -0,0 +1,34 @@
|
||||||
|
;=----------------------------------------------------------------------------=;
|
||||||
|
; 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 <https://www.gnu.org/licenses/>. ;
|
||||||
|
;=----------------------------------------------------------------------------=;
|
||||||
|
|
||||||
|
;; 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_GRUB_MAGIC equ 0x2badb002
|
||||||
|
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
|
Loading…
Reference in New Issue