;=----------------------------------------------------------------------------=; ; 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 . ; ;=----------------------------------------------------------------------------=; [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