diff --git a/kaleid/kernel/mm/gdt.asm b/kaleid/kernel/mm/gdt.asm new file mode 100644 index 0000000..6e4f380 --- /dev/null +++ b/kaleid/kernel/mm/gdt.asm @@ -0,0 +1,65 @@ +;=----------------------------------------------------------------------------=; +; GNU GPL OS/K ; +; ; +; Desc: Interrupt Descriptor Table related functions ; +; ; +; ; +; 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 64] + +extern gdtPtr + +global MmLoadGdt +global MmStoreGdt + +;; +;; Loads the GDT +;; +MmLoadGdt: + + ;; Loading the gdt via the gdtPtr pointer + lgdt [rel gdtPtr] + + ;; Reloading the segment registers + mov ax, si ; data segment + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + mov cs, di ; code segment + + ;; We must far jump because we changed the GDT + lea rax, [rel .next] + push rax + ret + +.next: + ;ltr dx ; the TSS + ret + +;; +;; Stores the GDT +;; +MmStoreGdt: + + ;; Loading the gdt via the gdtPtr pointer + sgdt [rel gdtPtr] + ret