Merge freeldr from amd64 branch:
[reactos.git] / reactos / boot / freeldr / freeldr / include / arch / amd64 / amd64.h
index d398b18..801daaa 100644 (file)
 #ifndef __AMD64_AMD64_H_
 #define __AMD64_AMD64_H_
 
+#define STACK64ADDR    0x74000 /* The 64-bit stack top will be at 0x74000 */
 
+/* Long mode selectors */
+#define LMODE_CS       0x10
+#define LMODE_DS       0x18
+#define RMODE_CS       0x20    /* RMode code selector, base 0 limit 64k */
+#define RMODE_DS       0x28    /* RMode data selector, base 0 limit 64k */
+
+#define VA_MASK 0x0000FFFFFFFFFFFFUL
+
+#define PtrToPfn(p) \
+    ((((ULONGLONG)p) >> PAGE_SHIFT) & 0xfffffffULL)
+
+#define VAtoPXI(va) ((((ULONG64)va) >> PXI_SHIFT) & 0x1FF)
+#define VAtoPPI(va) ((((ULONG64)va) >> PPI_SHIFT) & 0x1FF)
+#define VAtoPDI(va) ((((ULONG64)va) >> PDI_SHIFT) & 0x1FF)
+#define VAtoPTI(va) ((((ULONG64)va) >> PTI_SHIFT) & 0x1FF)
+
+#define HYPERSPACE_BASE             0xfffff70000000000ULL
+#define HAL_BASE                    0xffffffff80000000ULL
+#define APIC_BASE                   0xfffffffffee00000ULL // FIXME
+
+#define APIC_PHYS_BASE              0xfee00000
+
+#define NUM_PAGES_KERNEL 
+
+#ifndef ASM
+typedef struct _PAGE_DIRECTORY_AMD64
+{
+    HARDWARE_PTE Pde[512];
+} PAGE_DIRECTORY_AMD64, *PPAGE_DIRECTORY_AMD64;
+
+VOID
+FORCEINLINE
+__lgdt(void *gdt)
+{
+    asm volatile ("lgdt %0\n" : : "m"(*(short*)gdt));
+}
+
+PKGDTENTRY64
+FORCEINLINE
+KiGetGdtEntry(PVOID pGdt, USHORT Index)
+{
+    return (PKGDTENTRY64)((ULONG64)pGdt + (Index & ~RPL_MASK));
+}
+
+VOID
+FORCEINLINE
+KiInitGdtEntry(PKGDTENTRY64 Entry, ULONG64 Base, ULONG Limit, UCHAR Type, UCHAR Dpl)
+{
+    Entry->Bits.Type = Type;
+    Entry->Bits.Present = 1;
+    Entry->Bits.Dpl = Dpl;
+    Entry->BaseLow = (USHORT)(Base & 0xFFFF);
+    Entry->Bytes.BaseMiddle = (UCHAR)(Base >> 16);
+    Entry->Bytes.BaseHigh = (UCHAR)(Base >> 24);
+    Entry->BaseUpper = (ULONG)(Base >> 32);
+    Entry->LimitLow = (USHORT)(Limit & 0xFFFF);
+    Entry->Bits.LimitHigh = (ULONG)((Limit >> 16) & 0xf);
+    Entry->MustBeZero = 0;
+}
+
+VOID FrLdrSetupGdtIdt();
+
+#endif
 
 #endif /* __AMD64_AMD64_H_ */