#endif
/* Memory layout */
-//#ifdef _M_AMD64
+#ifdef _M_AMD64
#define PML4_ADDRESS HEX(1000) /* One page PML4 page table */
#define PDP_ADDRESS HEX(2000) /* One page PDP page table */
#define PD_ADDRESS HEX(3000) /* One page PD page table */
-//#endif
+#endif
+#define BIOSCALLBUFFER HEX(4000) /* Buffer to store temporary data for any Int386() call */
#define STACK16ADDR HEX(6F00) /* The 16-bit stack top will be at 0000:6F00 */
#define BSS_START HEX(6F00)
+#define STACKLOW HEX(7000)
+#define STACKADDR HEX(F000) /* The 32/64-bit stack top will be at 0000:F000, or 0xF000 */
#define FREELDR_BASE HEX(F800)
#define FREELDR_PE_BASE HEX(10000)
-#define DISKREADBUFFER HEX(80000) /* Buffer to store data read in from the disk via the BIOS */
-#define STACKLOWLIMIT HEX(90000)
-#define STACK32ADDR HEX(98000) /* The 32-bit stack top will be at 9000:8000, or 0xA8000 */
-#define STACK64ADDR HEX(98000) /* The 64-bit stack top will be at 98000 */
-#define BIOSCALLBUFFER HEX(98000) /* Buffer to store temporary data for any Int386() call */
-#define DISKREADBUFFER_SIZE HEX(10000)
+#define MEMORY_MARGIN HEX(88000) /* We need this much memory */
#define BIOSCALLBUFSEGMENT (BIOSCALLBUFFER/16) /* Buffer to store temporary data for any Int386() call */
#define BIOSCALLBUFOFFSET HEX(0000) /* Buffer to store temporary data for any Int386() call */
#define BIOSCALLBUFSIZE PAGE_SIZE /* max is sizeof(VESA_SVGA_INFO) = 512 */
-#define MAX_FREELDR_PE_SIZE (DISKREADBUFFER - FREELDR_PE_BASE)
+#define MAX_FREELDR_PE_SIZE (MEMORY_MARGIN - FREELDR_PE_BASE - PAGE_SIZE)
+
+/* MAX_DISKREADBUFFER_SIZE is later passed to INT 13h, AH=42h.
+ According to https://en.wikipedia.org/wiki/INT_13H#INT_13h_AH.3D42h:_Extended_Read_Sectors_From_Drive
+ some BIOSes can only read a maximum of 127 sectors. (0xFE00 / 512 = 127)
+ Confirmed when booting from USB on Dell Latitude D531 and Lenovo ThinkPad X61. */
+#define MAX_DISKREADBUFFER_SIZE HEX(FE00)
/* These addresses specify the realmode "BSS section" layout */
#define BSS_RealModeEntry (BSS_START + 0)
/* Defines needed for switching between real and protected mode */
//#ifdef _M_IX86
-#define NULL_DESC HEX(00) /* NULL descriptor */
+#define NULL_DESC HEX(00) /* NULL descriptor */
#define PMODE_CS HEX(08) /* PMode code selector, base 0 limit 4g */
#define PMODE_DS HEX(10) /* PMode data selector, base 0 limit 4g */
#define RMODE_CS HEX(18) /* RMode code selector, base 0 limit 64k */
#define LMODE_DS HEX(18)
#define CMODE_CS HEX(30)
//#endif
-
-/* Makes "x" a global variable or label */
-#define EXTERN(x) .global x; x: