ReactOS 0.4.16-dev-1946-g52006dd
x86common.h
Go to the documentation of this file.
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(8000)
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 TEMPDATA16_BASE HEX(7000)
20#define TEMPCODE16_BASE HEX(7400)
21#define TEMPCODE_BASE HEX(200000)
22#define MEMORY_MARGIN HEX(88000) /* We need this much memory */
23
24#define BIOSCALLBUFSEGMENT (BIOSCALLBUFFER/16) /* Buffer to store temporary data for any Int386() call */
25#define BIOSCALLBUFOFFSET HEX(0000) /* Buffer to store temporary data for any Int386() call */
26#define BIOSCALLBUFSIZE PAGE_SIZE /* max is sizeof(VESA_SVGA_INFO) = 512 */
27#define MAX_FREELDR_PE_SIZE (MEMORY_MARGIN - FREELDR_PE_BASE - PAGE_SIZE)
28
29/* MAX_DISKREADBUFFER_SIZE is later passed to INT 13h, AH=42h.
30 According to https://en.wikipedia.org/wiki/INT_13H#INT_13h_AH.3D42h:_Extended_Read_Sectors_From_Drive
31 some BIOSes can only read a maximum of 127 sectors. (0xFE00 / 512 = 127)
32 Confirmed when booting from USB on Dell Latitude D531 and Lenovo ThinkPad X61. */
33#define MAX_DISKREADBUFFER_SIZE HEX(FE00)
34
35/* These addresses specify the realmode "BSS section" layout */
36#define BSS_RealModeEntry (BSS_START + 0)
37#define BSS_CallbackReturn (BSS_START + 4)
38#define BSS_RegisterSet (BSS_START + 8) /* size = 40 */
39#define BSS_IntVector (BSS_START + 52)
40#define BSS_PxeEntryPoint (BSS_START + 56)
41#define BSS_PxeBufferSegment (BSS_START + 60)
42#define BSS_PxeBufferOffset (BSS_START + 64)
43#define BSS_PxeFunction (BSS_START + 68)
44#define BSS_PxeResult (BSS_START + 72)
45#define BSS_PnpBiosEntryPoint (BSS_START + 76)
46#define BSS_PnpBiosDataSegment (BSS_START + 80)
47#define BSS_PnpBiosBufferSegment (BSS_START + 84)
48#define BSS_PnpBiosBufferOffset (BSS_START + 88)
49#define BSS_PnpNodeSize (BSS_START + 92)
50#define BSS_PnpNodeCount (BSS_START + 96)
51#define BSS_PnpNodeNumber (BSS_START + 100)
52#define BSS_PnpResult (BSS_START + 104)
53#define BSS_BootDrive (BSS_START + 108) // 1 byte
54#define BSS_BootPartition (BSS_START + 109) // 1 byte
55#define BSS_CurrentSegmentBaseAddress (BSS_START + 110) // 2 bytes
56
57
58/* Realmode function IDs */
59#define FNID_Int386 0
60#define FNID_Reboot 1
61#define FNID_Relocator16Boot 2
62#define FNID_PxeCallApi 3
63#define FNID_PnpBiosGetDeviceNodeCount 4
64#define FNID_PnpBiosGetDeviceNode 5
65#define FNID_PnpBiosGetDockStationInformation 6
66
67/* Flag Masks */
68#define CR0_PE_SET HEX(00000001) /* OR this value with CR0 to enable pmode */
69#define CR0_PE_CLR HEX(FFFFFFFE) /* AND this value with CR0 to disable pmode */
70
71/* Defines needed for switching between real and protected mode */
72//#ifdef _M_IX86
73#define NULL_DESC HEX(00) /* NULL descriptor */
74#define PMODE_CS HEX(08) /* PMode code selector, base 0 limit 4g */
75#define PMODE_DS HEX(10) /* PMode data selector, base 0 limit 4g */
76#define RMODE_CS HEX(18) /* RMode code selector, base 0 limit 64k */
77#define RMODE_DS HEX(20) /* RMode data selector, base 0 limit 64k */
78//#else
79/* Long mode selectors */
80#define LMODE_CS HEX(10)
81#define LMODE_DS HEX(18)
82#define L_RMODE_CS HEX(20)
83#define L_RMODE_DS HEX(28)
84#define CMODE_CS HEX(30)
85//#endif