4 * Copyright (C) 2003 Eric Kohl
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #ifndef __AMD64_AMD64_H_
22 #define __AMD64_AMD64_H_
24 #define STACK64ADDR 0x74000 /* The 64-bit stack top will be at 0x74000 */
26 /* Long mode selectors */
29 #define RMODE_CS 0x20 /* RMode code selector, base 0 limit 64k */
30 #define RMODE_DS 0x28 /* RMode data selector, base 0 limit 64k */
33 #define VA_MASK 0x0000FFFFFFFFFFFFUL
36 ((((ULONGLONG)p) >> PAGE_SHIFT) & 0xfffffffULL)
38 #define VAtoPXI(va) ((((ULONG64)va) >> PXI_SHIFT) & 0x1FF)
39 #define VAtoPPI(va) ((((ULONG64)va) >> PPI_SHIFT) & 0x1FF)
40 #define VAtoPDI(va) ((((ULONG64)va) >> PDI_SHIFT) & 0x1FF)
41 #define VAtoPTI(va) ((((ULONG64)va) >> PTI_SHIFT) & 0x1FF)
43 #define HYPERSPACE_BASE 0xfffff70000000000ULL
44 #define HAL_BASE 0xffffffff80000000ULL
45 #define APIC_BASE 0xfffffffffee00000ULL // FIXME
47 #define APIC_PHYS_BASE 0xfee00000
49 #define NUM_PAGES_KERNEL
52 typedef struct _PAGE_DIRECTORY_AMD64
54 HARDWARE_PTE Pde
[512];
55 } PAGE_DIRECTORY_AMD64
, *PPAGE_DIRECTORY_AMD64
;
61 asm volatile ("lgdt %0\n" : : "m"(*(short*)gdt
));
66 KiGetGdtEntry(PVOID pGdt
, USHORT Index
)
68 return (PKGDTENTRY64
)((ULONG64
)pGdt
+ (Index
& ~RPL_MASK
));
73 KiInitGdtEntry(PKGDTENTRY64 Entry
, ULONG64 Base
, ULONG Limit
, UCHAR Type
, UCHAR Dpl
)
75 Entry
->Bits
.Type
= Type
;
76 Entry
->Bits
.Present
= 1;
77 Entry
->Bits
.Dpl
= Dpl
;
78 Entry
->BaseLow
= (USHORT
)(Base
& 0xFFFF);
79 Entry
->Bytes
.BaseMiddle
= (UCHAR
)(Base
>> 16);
80 Entry
->Bytes
.BaseHigh
= (UCHAR
)(Base
>> 24);
81 Entry
->BaseUpper
= (ULONG
)(Base
>> 32);
82 Entry
->LimitLow
= (USHORT
)(Limit
& 0xFFFF);
83 Entry
->Bits
.LimitHigh
= (ULONG
)((Limit
>> 16) & 0xf);
84 Entry
->MustBeZero
= 0;
87 VOID
FrLdrSetupGdtIdt();
91 #endif /* __AMD64_AMD64_H_ */