1 
2 #ifndef HEX
3 #define HEX(y) 0x##y
4 #endif
5 
6 /* Memory layout */
7 #ifdef _M_AMD64
8 #define PML4_ADDRESS        HEX(1000) /* One page PML4 page table */
9 #define PDP_ADDRESS         HEX(2000) /* One page PDP page table */
10 #define PD_ADDRESS          HEX(3000) /* One page PD page table */
11 #endif
12 #define BIOSCALLBUFFER      HEX(4000) /* Buffer to store temporary data for any Int386() call */
13 #define STACK16ADDR         HEX(6F00) /* The 16-bit stack top will be at 0000:6F00 */
14 #define BSS_START           HEX(6F00)
15 #define STACKLOW            HEX(7000)
16 #define STACKADDR           HEX(F000) /* The 32/64-bit stack top will be at 0000:F000, or 0xF000 */
17 #define FREELDR_BASE        HEX(F800)
18 #define FREELDR_PE_BASE    HEX(10000)
19 #define MEMORY_MARGIN      HEX(88000) /* We need this much memory */
20 
21 #define BIOSCALLBUFSEGMENT (BIOSCALLBUFFER/16) /* Buffer to store temporary data for any Int386() call */
22 #define BIOSCALLBUFOFFSET   HEX(0000) /* Buffer to store temporary data for any Int386() call */
23 #define BIOSCALLBUFSIZE     PAGE_SIZE /* max is sizeof(VESA_SVGA_INFO) = 512 */
24 #define MAX_FREELDR_PE_SIZE (MEMORY_MARGIN - FREELDR_PE_BASE - PAGE_SIZE)
25 
26 /* MAX_DISKREADBUFFER_SIZE is later passed to INT 13h, AH=42h.
27    According to https://en.wikipedia.org/wiki/INT_13H#INT_13h_AH.3D42h:_Extended_Read_Sectors_From_Drive
28    some BIOSes can only read a maximum of 127 sectors. (0xFE00 / 512 = 127)
29    Confirmed when booting from USB on Dell Latitude D531 and Lenovo ThinkPad X61. */
30 #define MAX_DISKREADBUFFER_SIZE HEX(FE00)
31 
32 /* These addresses specify the realmode "BSS section" layout */
33 #define BSS_RealModeEntry        (BSS_START +  0)
34 #define BSS_CallbackReturn       (BSS_START +  4)
35 #define BSS_RegisterSet          (BSS_START +  8) /* size = 40 */
36 #define BSS_IntVector            (BSS_START + 52)
37 #define BSS_PxeEntryPoint        (BSS_START + 56)
38 #define BSS_PxeBufferSegment     (BSS_START + 60)
39 #define BSS_PxeBufferOffset      (BSS_START + 64)
40 #define BSS_PxeFunction          (BSS_START + 68)
41 #define BSS_PxeResult            (BSS_START + 72)
42 #define BSS_PnpBiosEntryPoint    (BSS_START + 76)
43 #define BSS_PnpBiosDataSegment   (BSS_START + 80)
44 #define BSS_PnpBiosBufferSegment (BSS_START + 84)
45 #define BSS_PnpBiosBufferOffset  (BSS_START + 88)
46 #define BSS_PnpNodeSize          (BSS_START + 92)
47 #define BSS_PnpNodeCount         (BSS_START + 96)
48 #define BSS_PnpNodeNumber        (BSS_START + 100)
49 #define BSS_PnpResult            (BSS_START + 104)
50 #define BSS_BootDrive            (BSS_START + 108) // 1 byte
51 #define BSS_BootPartition        (BSS_START + 109) // 1 byte
52 
53 
54 /* Realmode function IDs */
55 #define FNID_Int386 0
56 #define FNID_Reboot 1
57 #define FNID_Relocator16Boot 2
58 #define FNID_PxeCallApi 3
59 #define FNID_PnpBiosGetDeviceNodeCount  4
60 #define FNID_PnpBiosGetDeviceNode       5
61 #define FNID_PnpBiosGetDockStationInformation  6
62 
63 /* Flag Masks */
64 #define CR0_PE_SET    HEX(00000001)    /* OR this value with CR0 to enable pmode */
65 #define CR0_PE_CLR    HEX(FFFFFFFE)    /* AND this value with CR0 to disable pmode */
66 
67 /* Defines needed for switching between real and protected mode */
68 //#ifdef _M_IX86
69 #define NULL_DESC   HEX(00)    /* NULL descriptor */
70 #define PMODE_CS    HEX(08)    /* PMode code selector, base 0 limit 4g */
71 #define PMODE_DS    HEX(10)    /* PMode data selector, base 0 limit 4g */
72 #define RMODE_CS    HEX(18)    /* RMode code selector, base 0 limit 64k */
73 #define RMODE_DS    HEX(20)    /* RMode data selector, base 0 limit 64k */
74 //#else
75 /* Long mode selectors */
76 #define LMODE_CS HEX(10)
77 #define LMODE_DS HEX(18)
78 #define CMODE_CS HEX(30)
79 //#endif
80