From 3b3996b3998f1c254303c0ba78d7f76cb8be87cc Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 23 Oct 2014 21:52:39 +0000 Subject: [PATCH] [FREELDR] Move the BIOS call buffer to physical address 0x4000, making another page available at the top, moving the margin down to 0x9E000. Should fix boot with machines that have a large EBDA. CORE-8692 #comment please retest. svn path=/trunk/; revision=64945 --- reactos/boot/freeldr/freeldr/arch/i386/i386bug.c | 3 +-- reactos/boot/freeldr/freeldr/arch/i386/pcmem.c | 13 ++++++------- .../freeldr/freeldr/include/arch/pc/x86common.h | 3 ++- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/i386bug.c b/reactos/boot/freeldr/freeldr/arch/i386/i386bug.c index d31796d16de..d8d5d8944bf 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/i386bug.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/i386bug.c @@ -108,8 +108,7 @@ i386PrintExceptionText(ULONG TrapIndex, PKTRAP_FRAME TrapFrame, PKSPECIAL_REGIST i386_ScreenPosX = 0; i386_ScreenPosY = 0; - PrintText("An error occured in FreeLoader\n" - VERSION"\n" + PrintText("An error occured in " VERSION "\n" "Report this error to the ReactOS Development mailing list \n\n" "0x%02lx: %s\n", TrapIndex, i386ExceptionDescriptionText[TrapIndex]); #ifdef _M_IX86 diff --git a/reactos/boot/freeldr/freeldr/arch/i386/pcmem.c b/reactos/boot/freeldr/freeldr/arch/i386/pcmem.c index 76601e4118a..0c2d3cbb0ef 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/pcmem.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/pcmem.c @@ -32,7 +32,6 @@ DBG_DEFAULT_CHANNEL(MEMORY); #define STACK_BASE_PAGE (STACKLOW / PAGE_SIZE) #define FREELDR_BASE_PAGE (FREELDR_BASE / PAGE_SIZE) #define DISKBUF_BASE_PAGE (DISKREADBUFFER / PAGE_SIZE) -#define BIOSBUF_BASE_PAGE (BIOSCALLBUFFER / PAGE_SIZE) #define STACK_PAGE_COUNT (FREELDR_BASE_PAGE - STACK_BASE_PAGE) #define FREELDR_PAGE_COUNT (DISKBUF_BASE_PAGE - FREELDR_BASE_PAGE) @@ -45,11 +44,10 @@ ULONG PcBiosMapCount; FREELDR_MEMORY_DESCRIPTOR PcMemoryMap[MAX_BIOS_DESCRIPTORS + 1] = { { LoaderFirmwarePermanent, 0x00, 1 }, // realmode int vectors - { LoaderFirmwareTemporary, 0x01, STACK_BASE_PAGE - 1 }, // freeldr stack + cmdline + { LoaderFirmwareTemporary, 0x01, STACK_BASE_PAGE - 1 }, // freeldr stack, cmdline, BIOS call buffer { LoaderOsloaderStack, STACK_BASE_PAGE, FREELDR_BASE_PAGE - STACK_BASE_PAGE }, // prot mode stack. { LoaderLoadedProgram, FREELDR_BASE_PAGE, FREELDR_PAGE_COUNT }, // freeldr image { LoaderFirmwareTemporary, DISKBUF_BASE_PAGE, DISKBUF_PAGE_COUNT }, // Disk read buffer for int 13h. DISKREADBUFFER - { LoaderFirmwareTemporary, BIOSBUF_BASE_PAGE, BIOSBUF_PAGE_COUNT }, // BIOSCALLBUFFER { LoaderFirmwarePermanent, 0x9F, 0x1 }, // EBDA { LoaderFirmwarePermanent, 0xA0, 0x50 }, // ROM / Video { LoaderSpecialMemory, 0xF0, 0x10 }, // ROM / Video @@ -203,13 +201,14 @@ PcMemGetBiosMemoryMap(PFREELDR_MEMORY_DESCRIPTOR MemoryMap, ULONG MaxMemoryMapSi bit value at address 0x413 inside the BDA, which gives us the usable size in KB */ Size = (*(PUSHORT)(ULONG_PTR)0x413) * 1024; - if (Size < 0x9F000) + if (Size < MEMORY_MARGIN) { FrLdrBugCheckWithMessage( MEMORY_INIT_FAILURE, __FILE__, __LINE__, - "The BIOS reported a usable memory range up to 0x%x, which is too small!\n", + "The BIOS reported a usable memory range up to 0x%x, which is too small!\n\n" + "If you see this, please report to the ReactOS team!", Size); } @@ -230,13 +229,13 @@ PcMemGetBiosMemoryMap(PFREELDR_MEMORY_DESCRIPTOR MemoryMap, ULONG MaxMemoryMapSi { /* Check if this is high enough */ ULONG EbdaBase = (ULONG)Regs.w.es << 4; - if (EbdaBase < 0x9F000) + if (EbdaBase < MEMORY_MARGIN) { FrLdrBugCheckWithMessage( MEMORY_INIT_FAILURE, __FILE__, __LINE__, - "The location of your EBDA is 0x%lx, which is too low!\n" + "The location of your EBDA is 0x%lx, which is too low!\n\n" "If you see this, please report to the ReactOS team!", EbdaBase); } diff --git a/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h b/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h index b238a8fd97a..325c1b233a6 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h +++ b/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h @@ -9,6 +9,7 @@ #define PDP_ADDRESS HEX(2000) /* One page PDP page table */ #define PD_ADDRESS HEX(3000) /* One page PD page table */ //#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) @@ -16,7 +17,7 @@ #define FREELDR_BASE HEX(F800) #define FREELDR_PE_BASE HEX(10000) #define DISKREADBUFFER HEX(8E000) /* Buffer to store data read in from the disk via the BIOS */ -#define BIOSCALLBUFFER HEX(9E000) /* Buffer to store temporary data for any Int386() call */ +#define MEMORY_MARGIN HEX(9E000) /* Highest usable address */ /* 9F000- 9FFFF is reserved for the EBDA */ #define DISKREADBUFFER_SIZE HEX(10000)