Update to the latest Bochs BIOS
[qemu] / pc-bios / bios-pq / 0002_e820-high-mem.patch
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;