[FREELDR]
[reactos.git] / reactos / boot / freeldr / freeldr / include / arch / pc / x86common.h
1
2 #ifndef HEX
3 #define HEX(y) 0x##y
4 #endif
5
6 /* Memory layout */
7 #define STACK16ADDR HEX(6F00) /* The 16-bit stack top will be at 0000:6F00 */
8 #define BSS_START HEX(6F00)
9 #if defined(_USE_ML) || defined(_MSC_VER)
10 #define FREELDR_BASE HEX(f000)
11 #define FREELDR_PE_BASE HEX(10000)
12 #else
13 #define FREELDR_BASE HEX(8000)
14 #define FREELDR_PE_BASE HEX(9000)
15 #endif
16 #define STACK32ADDR HEX(78000) /* The 32-bit stack top will be at 7000:8000, or 0x78000 */
17 #define BIOSCALLBUFFER HEX(78000) /* Buffer to store temporary data for any Int386() call */
18 #define BIOSCALLBUFSEGMENT HEX(7800) /* Buffer to store temporary data for any Int386() call */
19 #define BIOSCALLBUFOFFSET HEX(0000) /* Buffer to store temporary data for any Int386() call */
20 #define FILESYSBUFFER HEX(80000) /* Buffer to store file system data (e.g. cluster buffer for FAT) */
21 #define DISKREADBUFFER HEX(90000) /* Buffer to store data read in from the disk via the BIOS */
22 #define DISKREADBUFFER_SIZE 512
23
24 /* These addresses specify the realmode "BSS section" layout */
25 #define BSS_RealModeEntry (BSS_START + 0)
26 #define BSS_CallbackAddress (BSS_START + 4)
27 #define BSS_CallbackReturn (BSS_START + 8)
28 #define BSS_RegisterSet (BSS_START + 16) /* size = 36 */
29 #define BSS_IntVector (BSS_START + 52)
30 #define BSS_PxeEntryPoint (BSS_START + 56)
31 #define BSS_PxeBufferSegment (BSS_START + 60)
32 #define BSS_PxeBufferOffset (BSS_START + 64)
33 #define BSS_PxeFunction (BSS_START + 68)
34 #define BSS_PxeResult (BSS_START + 72)
35 #define BSS_PnpBiosEntryPoint (BSS_START + 76)
36 #define BSS_PnpBiosDataSegment (BSS_START + 80)
37 #define BSS_PnpBiosBufferSegment (BSS_START + 84)
38 #define BSS_PnpBiosBufferOffset (BSS_START + 88)
39 #define BSS_PnpNodeSize (BSS_START + 92)
40 #define BSS_PnpNodeCount (BSS_START + 96)
41 #define BSS_PnpNodeNumber (BSS_START + 100)
42 #define BSS_PnpResult (BSS_START + 104)
43
44
45 /* Realmode function IDs */
46 #define FNID_Int386 0
47 #define FNID_SoftReboot 1
48 #define FNID_ChainLoadBiosBootSectorCode 2
49 #define FNID_PxeCallApi 3
50 #define FNID_PnpBiosGetDeviceNodeCount 4
51 #define FNID_PnpBiosGetDeviceNode 5
52
53 /* Layout of the REGS structure */
54 #define REGS_EAX 0
55 #define REGS_EBX 4
56 #define REGS_ECX 8
57 #define REGS_EDX 12
58 #define REGS_ESI 16
59 #define REGS_EDI 20
60 #define REGS_DS 24
61 #define REGS_ES 26
62 #define REGS_FS 28
63 #define REGS_GS 30
64 #define REGS_EFLAGS 32
65
66
67 // Flag Masks
68 #define I386FLAG_CF HEX(0001) // Carry Flag
69 #define I386FLAG_RESV1 HEX(0002) // Reserved - Must be 1
70 #define I386FLAG_PF HEX(0004) // Parity Flag
71 #define I386FLAG_RESV2 HEX(0008) // Reserved - Must be 0
72 #define I386FLAG_AF HEX(0010) // Auxiliary Flag
73 #define I386FLAG_RESV3 HEX(0020) // Reserved - Must be 0
74 #define I386FLAG_ZF HEX(0040) // Zero Flag
75 #define I386FLAG_SF HEX(0080) // Sign Flag
76 #define I386FLAG_TF HEX(0100) // Trap Flag (Single Step)
77 #define I386FLAG_IF HEX(0200) // Interrupt Flag
78 #define I386FLAG_DF HEX(0400) // Direction Flag
79 #define I386FLAG_OF HEX(0800) // Overflow Flag
80
81 #define CR0_PE_SET HEX(00000001) /* OR this value with CR0 to enable pmode */
82 #define CR0_PE_CLR HEX(FFFFFFFE) /* AND this value with CR0 to disable pmode */
83
84 /* Defines needed for switching between real and protected mode */
85 //#ifdef _M_IX86
86 #define NULL_DESC HEX(00) /* NULL descriptor */
87 #define PMODE_CS HEX(08) /* PMode code selector, base 0 limit 4g */
88 #define PMODE_DS HEX(10) /* PMode data selector, base 0 limit 4g */
89 #define RMODE_CS HEX(18) /* RMode code selector, base 0 limit 64k */
90 #define RMODE_DS HEX(20) /* RMode data selector, base 0 limit 64k */
91 //#endif
92
93 /* Makes "x" a global variable or label */
94 #define EXTERN(x) .global x; x: