2008-12-18 00:35:49 +03:00
|
|
|
From: Izik Eidus <izike@qumranet.com>
|
|
|
|
|
|
|
|
add support to memory above the pci hole
|
|
|
|
|
|
|
|
the new memory region is mapped after address 0x100000000,
|
|
|
|
the bios take the size of the memory after the 0x100000000 from
|
|
|
|
three new cmos bytes.
|
|
|
|
|
|
|
|
diff --git a/bios/rombios.c b/bios/rombios.c
|
|
|
|
index 1be0816..b70f249 100644
|
|
|
|
--- a/bios/rombios.c
|
|
|
|
+++ b/bios/rombios.c
|
|
|
|
@@ -4442,22 +4442,25 @@ BX_DEBUG_INT15("case default:\n");
|
2008-04-23 00:37:21 +04:00
|
|
|
#endif // BX_USE_PS2_MOUSE
|
2008-04-28 03:46:00 +04:00
|
|
|
|
|
|
|
|
2008-04-23 00:37:21 +04:00
|
|
|
-void set_e820_range(ES, DI, start, end, type)
|
|
|
|
+void set_e820_range(ES, DI, start, end, extra_start, extra_end, type)
|
|
|
|
Bit16u ES;
|
|
|
|
Bit16u DI;
|
|
|
|
Bit32u start;
|
|
|
|
Bit32u end;
|
|
|
|
+ Bit8u extra_start;
|
|
|
|
+ Bit8u extra_end;
|
|
|
|
Bit16u type;
|
|
|
|
{
|
|
|
|
write_word(ES, DI, start);
|
|
|
|
write_word(ES, DI+2, start >> 16);
|
|
|
|
- write_word(ES, DI+4, 0x00);
|
|
|
|
+ write_word(ES, DI+4, extra_start);
|
|
|
|
write_word(ES, DI+6, 0x00);
|
2008-04-28 03:46:00 +04:00
|
|
|
|
2008-04-23 00:37:21 +04:00
|
|
|
end -= start;
|
|
|
|
+ extra_end -= extra_start;
|
|
|
|
write_word(ES, DI+8, end);
|
|
|
|
write_word(ES, DI+10, end >> 16);
|
|
|
|
- write_word(ES, DI+12, 0x0000);
|
|
|
|
+ write_word(ES, DI+12, extra_end);
|
|
|
|
write_word(ES, DI+14, 0x0000);
|
2008-04-28 03:46:00 +04:00
|
|
|
|
2008-04-23 00:37:21 +04:00
|
|
|
write_word(ES, DI+16, type);
|
2008-12-18 00:35:49 +03:00
|
|
|
@@ -4470,7 +4473,9 @@ int15_function32(regs, ES, DS, FLAGS)
|
2008-04-23 00:37:21 +04:00
|
|
|
Bit16u ES, DS, FLAGS;
|
|
|
|
{
|
|
|
|
Bit32u extended_memory_size=0; // 64bits long
|
|
|
|
+ Bit32u extra_lowbits_memory_size=0;
|
|
|
|
Bit16u CX,DX;
|
|
|
|
+ Bit8u extra_highbits_memory_size=0;
|
2008-04-28 03:46:00 +04:00
|
|
|
|
2008-04-23 00:37:21 +04:00
|
|
|
BX_DEBUG_INT15("int15 AX=%04x\n",regs.u.r16.ax);
|
2008-04-28 03:46:00 +04:00
|
|
|
|
2008-12-18 00:35:49 +03:00
|
|
|
@@ -4544,11 +4549,18 @@ ASM_END
|
2008-04-23 00:37:21 +04:00
|
|
|
extended_memory_size += (1L * 1024 * 1024);
|
|
|
|
}
|
2008-04-28 03:46:00 +04:00
|
|
|
|
2008-04-23 00:37:21 +04:00
|
|
|
+ extra_lowbits_memory_size = inb_cmos(0x5c);
|
|
|
|
+ extra_lowbits_memory_size <<= 8;
|
|
|
|
+ extra_lowbits_memory_size |= inb_cmos(0x5b);
|
|
|
|
+ extra_lowbits_memory_size *= 64;
|
|
|
|
+ extra_lowbits_memory_size *= 1024;
|
|
|
|
+ extra_highbits_memory_size = inb_cmos(0x5d);
|
|
|
|
+
|
|
|
|
switch(regs.u.r16.bx)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
set_e820_range(ES, regs.u.r16.di,
|
2008-12-18 00:35:49 +03:00
|
|
|
- 0x0000000L, 0x0009f000L, 1);
|
|
|
|
+ 0x0000000L, 0x0009f000L, 0, 0, 1);
|
2008-04-23 00:37:21 +04:00
|
|
|
regs.u.r32.ebx = 1;
|
|
|
|
regs.u.r32.eax = 0x534D4150;
|
|
|
|
regs.u.r32.ecx = 0x14;
|
2008-12-18 00:35:49 +03:00
|
|
|
@@ -4557,7 +4569,7 @@ ASM_END
|
2008-04-23 00:37:21 +04:00
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
set_e820_range(ES, regs.u.r16.di,
|
2008-12-18 00:35:49 +03:00
|
|
|
- 0x0009f000L, 0x000a0000L, 2);
|
|
|
|
+ 0x0009f000L, 0x000a0000L, 0, 0, 2);
|
2008-04-23 00:37:21 +04:00
|
|
|
regs.u.r32.ebx = 2;
|
|
|
|
regs.u.r32.eax = 0x534D4150;
|
|
|
|
regs.u.r32.ecx = 0x14;
|
2008-12-18 00:35:49 +03:00
|
|
|
@@ -4566,7 +4578,7 @@ ASM_END
|
2008-04-23 00:37:21 +04:00
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
set_e820_range(ES, regs.u.r16.di,
|
|
|
|
- 0x000e8000L, 0x00100000L, 2);
|
|
|
|
+ 0x000e8000L, 0x00100000L, 0, 0, 2);
|
|
|
|
regs.u.r32.ebx = 3;
|
|
|
|
regs.u.r32.eax = 0x534D4150;
|
|
|
|
regs.u.r32.ecx = 0x14;
|
2008-12-18 00:35:49 +03:00
|
|
|
@@ -4577,7 +4589,7 @@ ASM_END
|
2008-04-28 03:46:00 +04:00
|
|
|
#if BX_ROMBIOS32
|
2008-04-23 00:37:21 +04:00
|
|
|
set_e820_range(ES, regs.u.r16.di,
|
|
|
|
0x00100000L,
|
|
|
|
- extended_memory_size - ACPI_DATA_SIZE, 1);
|
|
|
|
+ extended_memory_size - ACPI_DATA_SIZE ,0, 0, 1);
|
|
|
|
regs.u.r32.ebx = 4;
|
2008-04-28 03:46:00 +04:00
|
|
|
#else
|
|
|
|
set_e820_range(ES, regs.u.r16.di,
|
2008-12-18 00:35:49 +03:00
|
|
|
@@ -4593,7 +4605,7 @@ ASM_END
|
2008-04-23 00:37:21 +04:00
|
|
|
case 4:
|
|
|
|
set_e820_range(ES, regs.u.r16.di,
|
|
|
|
extended_memory_size - ACPI_DATA_SIZE,
|
|
|
|
- extended_memory_size, 3); // ACPI RAM
|
|
|
|
+ extended_memory_size ,0, 0, 3); // ACPI RAM
|
|
|
|
regs.u.r32.ebx = 5;
|
|
|
|
regs.u.r32.eax = 0x534D4150;
|
|
|
|
regs.u.r32.ecx = 0x14;
|
2008-12-18 00:35:49 +03:00
|
|
|
@@ -4603,7 +4615,20 @@ ASM_END
|
2008-04-23 00:37:21 +04:00
|
|
|
case 5:
|
|
|
|
/* 256KB BIOS area at the end of 4 GB */
|
|
|
|
set_e820_range(ES, regs.u.r16.di,
|
|
|
|
- 0xfffc0000L, 0x00000000L, 2);
|
|
|
|
+ 0xfffc0000L, 0x00000000L ,0, 0, 2);
|
|
|
|
+ if (extra_highbits_memory_size || extra_lowbits_memory_size)
|
|
|
|
+ regs.u.r32.ebx = 6;
|
|
|
|
+ else
|
|
|
|
+ regs.u.r32.ebx = 0;
|
|
|
|
+ regs.u.r32.eax = 0x534D4150;
|
|
|
|
+ regs.u.r32.ecx = 0x14;
|
|
|
|
+ CLEAR_CF();
|
|
|
|
+ return;
|
|
|
|
+ case 6:
|
|
|
|
+ /* Maping of memory above 4 GB */
|
|
|
|
+ set_e820_range(ES, regs.u.r16.di, 0x00000000L,
|
|
|
|
+ extra_lowbits_memory_size, 1, extra_highbits_memory_size
|
|
|
|
+ + 1, 1);
|
|
|
|
regs.u.r32.ebx = 0;
|
|
|
|
regs.u.r32.eax = 0x534D4150;
|
|
|
|
regs.u.r32.ecx = 0x14;
|