User:Johnburger/Demo/Exec/LDT
From OSDev Wiki
< User:Johnburger | Demo
I wanted to define the Executive's LDT in source code, since it wouldn't be growing in size. As it turned out though, parts of it needed to be filled in at run-time anyway. The reserved entries are at the bottom.
; ; Exec/LDT.inc ; ; This is the Local Descriptor Table for the Executive SEGMENT Exec.LDT VSTART=0 ALIGN=16 USE32 ; This macro makes it easy to have a one-line invocation of LDT.Alloc ; The parameters are: GDT Entry, LDT Limit %macro LDT.Vars 2 %00 ISTRUC LDT.Alloc AT LDT.Alloc.Free, DW 0 AT LDT.Alloc.Limit, DW %2 DB 0 AT LDT.Alloc.Type, DB x86.Desc.Sys.Type.LDT AT LDT.Alloc.GDT, DW %1 IEND %endmacro Exec.LDT.Alias.Base EQU Exec.LDT.Base Exec.LDT.Alias.Limit EQU Exec.LDT.Limit Exec.LDT.Alias.Type EQU Type.Mem(Data, DPL0, RW) Exec.LDT.Alias.Gran EQU Gran.Mem(Byte, Small) Exec.LDT.IDT.Base EQU IDT.Base Exec.LDT.IDT.Limit EQU IDT.Max - 1 Exec.LDT.IDT.Type EQU Type.Mem(Data, DPL0, RW) Exec.LDT.IDT.Gran EQU Gran.Mem(Byte, Small) Exec.LDT.Stack.Top EQU Exec.Stack.Top ; Let's play with Expand-Down Descriptors Exec.LDT.Stack.Limit EQU (0-Exec.Stack.Size) >> 12 - 1 Exec.LDT.Stack.Type EQU Type.Mem(Stack, DPL0, RW) Exec.LDT.Stack.Gran EQU Gran.Mem(Gran, Big) Exec.LDT.Code.Base EQU Exec.Base Exec.LDT.Code.Limit EQU Exec.Limit Exec.LDT.Code.Type EQU Type.Mem(Code, DPL0, NoRW) Exec.LDT.Code.Gran EQU Gran.Mem(Byte, Def32) Exec.LDT: Exec.LDT.Vars LDT.Vars GDT.Exec.LDT, Exec.LDT.Limit Exec.LDT.Alias Desc.Mem Exec.LDT.Alias.Base, Exec.LDT.Alias.Limit, Exec.LDT.Alias.Type, Exec.LDT.Alias.Gran Exec.LDT.IDT Desc.Mem Exec.LDT.IDT.Base, Exec.LDT.IDT.Limit, Exec.LDT.IDT.Type, Exec.LDT.IDT.Gran Exec.LDT.Stack Desc.Mem Exec.LDT.Stack.Top, Exec.LDT.Stack.Limit, Exec.LDT.Stack.Type, Exec.LDT.Stack.Gran Exec.LDT.Code Desc.Mem Exec.LDT.Code.Base, Exec.LDT.Code.Limit, Exec.LDT.Code.Type, Exec.LDT.Code.Gran Exec.LDT.Double EQU $ Exec.LDT.Double.Stack Desc.Mem 0, 0, 0, 0 ; Stack for Double Fault handler Exec.LDT.Double.TSS Desc.Mem 0, 0, 0, 0 ; Alias for TSS to read Backlink Exec.LDT.Double.Alias Desc.Mem 0, 0, 0, 0 ; Alias for Faulting TSS Exec.LDT.BadStack EQU $ Exec.LDT.BadStack.Stack Desc.Mem 0, 0, 0, 0 ; Stack for BadStack Fault handler Exec.LDT.BadStack.TSS Desc.Mem 0, 0, 0, 0 ; Alias for TSS to read Backlink Exec.LDT.BadStack.Alias Desc.Mem 0, 0, 0, 0 ; Alias for Faulting TSS Exec.LDT.BadTSS EQU $ Exec.LDT.BadTSS.Stack Desc.Mem 0, 0, 0, 0 ; Stack for BadTSS Fault handler Exec.LDT.BadTSS.TSS Desc.Mem 0, 0, 0, 0 ; Alias for TSS to read Backlink Exec.LDT.BadTSS.Alias Desc.Mem 0, 0, 0, 0 ; Alias for Faulting TSS ; Note that this LDT cannot grow during run-time - there's other stuff directly after it! %if (Exec.LDT.Alias-Exec.LDT) != DT.Alias %error "Invalid Executive LDT alias" %endif