114 lines
7.6 KiB
NASM
114 lines
7.6 KiB
NASM
|
;=----------------------------------------------------------------------------=;
|
||
|
; 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 <https://www.gnu.org/licenses/>. ;
|
||
|
;=----------------------------------------------------------------------------=;
|
||
|
|
||
|
[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
|