Author: hpoussin
Date: Tue Dec 30 11:53:09 2014
New Revision: 65905
URL:
http://svn.reactos.org/svn/reactos?rev=65905&view=rev
Log:
[FREELDR] Make the disk read buffer size dynamic
CORE-8772 CORE-8899 #resolve #comment Should be fixed in r65904. Thanks for reporting.
Modified:
trunk/reactos/boot/freeldr/freeldr/arch/i386/hwdisk.c
trunk/reactos/boot/freeldr/freeldr/arch/i386/pcmem.c
trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c
trunk/reactos/boot/freeldr/freeldr/include/arch/pc/machpc.h
trunk/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/hwdisk.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/hwdisk.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/hwdisk.c [iso-8859-1] Tue Dec 30 11:53:09
2014
@@ -119,7 +119,7 @@
ULONGLONG SectorOffset;
TotalSectors = (N + Context->SectorSize - 1) / Context->SectorSize;
- MaxSectors = DISKREADBUFFER_SIZE / Context->SectorSize;
+ MaxSectors = PcDiskReadBufferSize / Context->SectorSize;
SectorOffset = Context->SectorNumber + Context->SectorOffset;
ret = 1;
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/pcmem.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/pcmem.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/pcmem.c [iso-8859-1] Tue Dec 30 11:53:09
2014
@@ -40,6 +40,7 @@
BIOS_MEMORY_MAP PcBiosMemoryMap[MAX_BIOS_DESCRIPTORS];
ULONG PcBiosMapCount;
+ULONG PcDiskReadBufferSize;
FREELDR_MEMORY_DESCRIPTOR PcMemoryMap[MAX_BIOS_DESCRIPTORS + 1] =
{
@@ -201,7 +202,7 @@
bit value at address 0x413 inside the BDA, which gives us the usable size
in KB */
Size = (*(PUSHORT)(ULONG_PTR)0x413) * 1024;
- if (Size < MEMORY_MARGIN)
+ if (Size < DISKREADBUFFER || Size - DISKREADBUFFER < MIN_DISKREADBUFFER_SIZE)
{
FrLdrBugCheckWithMessage(
MEMORY_INIT_FAILURE,
@@ -211,6 +212,12 @@
"If you see this, please report to the ReactOS team!",
Size);
}
+ PcDiskReadBufferSize = (Size - DISKREADBUFFER) & ~0xfff;
+ if (PcDiskReadBufferSize > MAX_DISKREADBUFFER_SIZE)
+ {
+ PcDiskReadBufferSize = MAX_DISKREADBUFFER_SIZE;
+ }
+ TRACE("PcDiskReadBufferSize=0x%x\n", PcDiskReadBufferSize);
/* Get the address of the Extended BIOS Data Area (EBDA).
* Int 15h, AH=C1h
@@ -229,7 +236,7 @@
{
/* Check if this is high enough */
ULONG EbdaBase = (ULONG)Regs.w.es << 4;
- if (EbdaBase < MEMORY_MARGIN)
+ if (EbdaBase < DISKREADBUFFER || EbdaBase - DISKREADBUFFER <
MIN_DISKREADBUFFER_SIZE)
{
FrLdrBugCheckWithMessage(
MEMORY_INIT_FAILURE,
@@ -238,6 +245,11 @@
"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);
+ }
+ if (((EbdaBase - DISKREADBUFFER) & ~0xfff) < PcDiskReadBufferSize)
+ {
+ PcDiskReadBufferSize = (EbdaBase - DISKREADBUFFER) & ~0xfff;
+ TRACE("After EBDA check, PcDiskReadBufferSize=0x%x\n",
PcDiskReadBufferSize);
}
/* Calculate the (max) size of the EBDA */
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c [iso-8859-1] Tue Dec 30 11:53:09
2014
@@ -198,8 +198,8 @@
while (N > 0)
{
Length = N;
- if (Length > DISKREADBUFFER_SIZE)
- Length = DISKREADBUFFER_SIZE;
+ if (Length > PcDiskReadBufferSize)
+ Length = PcDiskReadBufferSize;
Sectors = (Length + Context->SectorSize - 1) / Context->SectorSize;
ret = MachDiskReadLogicalSectors(
Context->DriveNumber,
@@ -351,11 +351,11 @@
* harddisks. So, we set the buffer to known contents first, then try to
* read. If the BIOS reports success but the buffer contents haven't
* changed then we fail anyway */
- memset((PVOID) DISKREADBUFFER, 0xcd, DISKREADBUFFER_SIZE);
+ memset((PVOID) DISKREADBUFFER, 0xcd, PcDiskReadBufferSize);
while (MachDiskReadLogicalSectors(0x80 + DiskCount, 0ULL, 1, (PVOID)DISKREADBUFFER))
{
Changed = FALSE;
- for (i = 0; ! Changed && i < DISKREADBUFFER_SIZE; i++)
+ for (i = 0; ! Changed && i < PcDiskReadBufferSize; i++)
{
Changed = ((PUCHAR)DISKREADBUFFER)[i] != 0xcd;
}
@@ -366,7 +366,7 @@
break;
}
DiskCount++;
- memset((PVOID) DISKREADBUFFER, 0xcd, DISKREADBUFFER_SIZE);
+ memset((PVOID) DISKREADBUFFER, 0xcd, PcDiskReadBufferSize);
}
DiskReportError(TRUE);
TRACE("BIOS reports %d harddisk%s\n",
Modified: trunk/reactos/boot/freeldr/freeldr/include/arch/pc/machpc.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/inclu…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/include/arch/pc/machpc.h [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/include/arch/pc/machpc.h [iso-8859-1] Tue Dec 30
11:53:09 2014
@@ -63,5 +63,6 @@
extern BIOS_MEMORY_MAP PcBiosMemoryMap[];
extern ULONG PcBiosMapCount;
+extern ULONG PcDiskReadBufferSize;
/* EOF */
Modified: trunk/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/inclu…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h [iso-8859-1]
(original)
+++ trunk/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h [iso-8859-1] Tue Dec 30
11:53:09 2014
@@ -17,14 +17,14 @@
#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 MEMORY_MARGIN HEX(9A000) /* Highest usable address */
/* 9F000- 9FFFF is reserved for the EBDA */
#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 DISKREADBUFFER_SIZE (MEMORY_MARGIN - DISKREADBUFFER)
+#define MIN_DISKREADBUFFER_SIZE HEX(1000)
+#define MAX_DISKREADBUFFER_SIZE HEX(20000)
/* These addresses specify the realmode "BSS section" layout */
#define BSS_RealModeEntry (BSS_START + 0)