root / pc-bios / bios-pq / 0002_e820-high-mem.patch @ ca7b25e3
History | View | Annotate | Download (5.2 kB)
1 |
From: Izik Eidus <izike@qumranet.com>
|
---|---|
2 |
|
3 |
add support to memory above the pci hole
|
4 |
|
5 |
the new memory region is mapped after address 0x100000000,
|
6 |
the bios take the size of the memory after the 0x100000000 from
|
7 |
three new cmos bytes.
|
8 |
|
9 |
diff --git a/bios/rombios.c b/bios/rombios.c
|
10 |
index 1be0816..b70f249 100644
|
11 |
--- a/bios/rombios.c
|
12 |
+++ b/bios/rombios.c
|
13 |
@@ -4442,22 +4442,25 @@ BX_DEBUG_INT15("case default:\n"); |
14 |
#endif // BX_USE_PS2_MOUSE |
15 |
|
16 |
|
17 |
-void set_e820_range(ES, DI, start, end, type)
|
18 |
+void set_e820_range(ES, DI, start, end, extra_start, extra_end, type)
|
19 |
Bit16u ES; |
20 |
Bit16u DI; |
21 |
Bit32u start; |
22 |
Bit32u end; |
23 |
+ Bit8u extra_start;
|
24 |
+ Bit8u extra_end;
|
25 |
Bit16u type; |
26 |
{ |
27 |
write_word(ES, DI, start); |
28 |
write_word(ES, DI+2, start >> 16); |
29 |
- write_word(ES, DI+4, 0x00);
|
30 |
+ write_word(ES, DI+4, extra_start);
|
31 |
write_word(ES, DI+6, 0x00); |
32 |
|
33 |
end -= start; |
34 |
+ extra_end -= extra_start;
|
35 |
write_word(ES, DI+8, end);
|
36 |
write_word(ES, DI+10, end >> 16); |
37 |
- write_word(ES, DI+12, 0x0000);
|
38 |
+ write_word(ES, DI+12, extra_end);
|
39 |
write_word(ES, DI+14, 0x0000); |
40 |
|
41 |
write_word(ES, DI+16, type);
|
42 |
@@ -4470,7 +4473,9 @@ int15_function32(regs, ES, DS, FLAGS)
|
43 |
Bit16u ES, DS, FLAGS; |
44 |
{ |
45 |
Bit32u extended_memory_size=0; // 64bits long |
46 |
+ Bit32u extra_lowbits_memory_size=0;
|
47 |
Bit16u CX,DX; |
48 |
+ Bit8u extra_highbits_memory_size=0;
|
49 |
|
50 |
BX_DEBUG_INT15("int15 AX=%04x\n",regs.u.r16.ax);
|
51 |
|
52 |
@@ -4544,11 +4549,18 @@ ASM_END
|
53 |
extended_memory_size += (1L * 1024 * 1024); |
54 |
} |
55 |
|
56 |
+ extra_lowbits_memory_size = inb_cmos(0x5c);
|
57 |
+ extra_lowbits_memory_size <<= 8;
|
58 |
+ extra_lowbits_memory_size |= inb_cmos(0x5b);
|
59 |
+ extra_lowbits_memory_size *= 64;
|
60 |
+ extra_lowbits_memory_size *= 1024;
|
61 |
+ extra_highbits_memory_size = inb_cmos(0x5d);
|
62 |
+
|
63 |
switch(regs.u.r16.bx)
|
64 |
{ |
65 |
case 0: |
66 |
set_e820_range(ES, regs.u.r16.di, |
67 |
- 0x0000000L, 0x0009f000L, 1);
|
68 |
+ 0x0000000L, 0x0009f000L, 0, 0, 1);
|
69 |
regs.u.r32.ebx = 1;
|
70 |
regs.u.r32.eax = 0x534D4150;
|
71 |
regs.u.r32.ecx = 0x14;
|
72 |
@@ -4557,7 +4569,7 @@ ASM_END
|
73 |
break;
|
74 |
case 1: |
75 |
set_e820_range(ES, regs.u.r16.di, |
76 |
- 0x0009f000L, 0x000a0000L, 2);
|
77 |
+ 0x0009f000L, 0x000a0000L, 0, 0, 2);
|
78 |
regs.u.r32.ebx = 2;
|
79 |
regs.u.r32.eax = 0x534D4150;
|
80 |
regs.u.r32.ecx = 0x14;
|
81 |
@@ -4566,7 +4578,7 @@ ASM_END
|
82 |
break;
|
83 |
case 2: |
84 |
set_e820_range(ES, regs.u.r16.di, |
85 |
- 0x000e8000L, 0x00100000L, 2);
|
86 |
+ 0x000e8000L, 0x00100000L, 0, 0, 2);
|
87 |
regs.u.r32.ebx = 3;
|
88 |
regs.u.r32.eax = 0x534D4150;
|
89 |
regs.u.r32.ecx = 0x14;
|
90 |
@@ -4577,7 +4589,7 @@ ASM_END
|
91 |
#if BX_ROMBIOS32
|
92 |
set_e820_range(ES, regs.u.r16.di, |
93 |
0x00100000L,
|
94 |
- extended_memory_size - ACPI_DATA_SIZE, 1);
|
95 |
+ extended_memory_size - ACPI_DATA_SIZE ,0, 0, 1);
|
96 |
regs.u.r32.ebx = 4;
|
97 |
#else
|
98 |
set_e820_range(ES, regs.u.r16.di, |
99 |
@@ -4593,7 +4605,7 @@ ASM_END
|
100 |
case 4: |
101 |
set_e820_range(ES, regs.u.r16.di, |
102 |
extended_memory_size - ACPI_DATA_SIZE, |
103 |
- extended_memory_size, 3); // ACPI RAM
|
104 |
+ extended_memory_size ,0, 0, 3); // ACPI RAM
|
105 |
regs.u.r32.ebx = 5;
|
106 |
regs.u.r32.eax = 0x534D4150;
|
107 |
regs.u.r32.ecx = 0x14;
|
108 |
@@ -4603,7 +4615,20 @@ ASM_END
|
109 |
case 5: |
110 |
/* 256KB BIOS area at the end of 4 GB */
|
111 |
set_e820_range(ES, regs.u.r16.di, |
112 |
- 0xfffc0000L, 0x00000000L, 2);
|
113 |
+ 0xfffc0000L, 0x00000000L ,0, 0, 2);
|
114 |
+ if (extra_highbits_memory_size || extra_lowbits_memory_size)
|
115 |
+ regs.u.r32.ebx = 6;
|
116 |
+ else
|
117 |
+ regs.u.r32.ebx = 0;
|
118 |
+ regs.u.r32.eax = 0x534D4150;
|
119 |
+ regs.u.r32.ecx = 0x14;
|
120 |
+ CLEAR_CF();
|
121 |
+ return;
|
122 |
+ case 6:
|
123 |
+ /* Maping of memory above 4 GB */
|
124 |
+ set_e820_range(ES, regs.u.r16.di, 0x00000000L,
|
125 |
+ extra_lowbits_memory_size, 1, extra_highbits_memory_size
|
126 |
+ + 1, 1);
|
127 |
regs.u.r32.ebx = 0;
|
128 |
regs.u.r32.eax = 0x534D4150;
|
129 |
regs.u.r32.ecx = 0x14;
|