diff --git a/.gitignore b/.gitignore index 0f4af35a1..fffd440d2 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ qemu-nbd.pod *.d .pc patches +pc-bios/bios-pq/status diff --git a/pc-bios/README b/pc-bios/README index ac8fc4726..bacf6c38b 100644 --- a/pc-bios/README +++ b/pc-bios/README @@ -1,5 +1,7 @@ -- The PC BIOS comes from the Bochs project - (http://bochs.sourceforge.net/). A patch from bios.diff was applied. +- The PC BIOS comes from the Bochs project (http://bochs.sourceforge.net/). + The patches in bios-pq have been applied. The binary is based on the revision + in bios-pq/HEAD with the patches in bios-pq/series applied. The git repo + that HEAD refers to is located at http://repo.or.cz/w/bochs-mirror.git - The VGA BIOS and the Cirrus VGA BIOS come from the LGPL VGA bios project (http://www.nongnu.org/vgabios/). diff --git a/pc-bios/bios-pq/0001_bx-qemu.patch b/pc-bios/bios-pq/0001_bx-qemu.patch new file mode 100644 index 000000000..ffca6b9ae --- /dev/null +++ b/pc-bios/bios-pq/0001_bx-qemu.patch @@ -0,0 +1,11 @@ +--- bochs-2.3.7.orig/bios/rombios.h ++++ bochs-2.3.7/bios/rombios.h +@@ -19,7 +19,7 @@ + // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + /* define it to include QEMU specific code */ +-//#define BX_QEMU ++#define BX_QEMU + + #ifndef LEGACY + # define BX_ROMBIOS32 1 diff --git a/pc-bios/bios.diff b/pc-bios/bios-pq/0002_e820-high-mem.patch similarity index 78% rename from pc-bios/bios.diff rename to pc-bios/bios-pq/0002_e820-high-mem.patch index da510db80..2886e8566 100644 --- a/pc-bios/bios.diff +++ b/pc-bios/bios-pq/0002_e820-high-mem.patch @@ -1,17 +1,16 @@ ---- bochs-2.3.7.orig/bios/rombios.h -+++ bochs-2.3.7/bios/rombios.h -@@ -19,7 +19,7 @@ - // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - /* define it to include QEMU specific code */ --//#define BX_QEMU -+#define BX_QEMU - - #ifndef LEGACY - # define BX_ROMBIOS32 1 ---- bochs-2.3.7.orig/bios/rombios.c -+++ bochs-2.3.7/bios/rombios.c -@@ -4404,22 +4404,25 @@ +From: Izik Eidus + +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"); #endif // BX_USE_PS2_MOUSE @@ -40,7 +39,7 @@ write_word(ES, DI+14, 0x0000); write_word(ES, DI+16, type); -@@ -4432,7 +4435,9 @@ +@@ -4470,7 +4473,9 @@ int15_function32(regs, ES, DS, FLAGS) Bit16u ES, DS, FLAGS; { Bit32u extended_memory_size=0; // 64bits long @@ -50,7 +49,7 @@ BX_DEBUG_INT15("int15 AX=%04x\n",regs.u.r16.ax); -@@ -4506,11 +4511,18 @@ +@@ -4544,11 +4549,18 @@ ASM_END extended_memory_size += (1L * 1024 * 1024); } @@ -65,21 +64,21 @@ { case 0: set_e820_range(ES, regs.u.r16.di, -- 0x0000000L, 0x0009fc00L, 1); -+ 0x0000000L, 0x0009fc00L, 0, 0, 1); +- 0x0000000L, 0x0009f000L, 1); ++ 0x0000000L, 0x0009f000L, 0, 0, 1); regs.u.r32.ebx = 1; regs.u.r32.eax = 0x534D4150; regs.u.r32.ecx = 0x14; -@@ -4519,7 +4531,7 @@ +@@ -4557,7 +4569,7 @@ ASM_END break; case 1: set_e820_range(ES, regs.u.r16.di, -- 0x0009fc00L, 0x000a0000L, 2); -+ 0x0009fc00L, 0x000a0000L, 0, 0, 2); +- 0x0009f000L, 0x000a0000L, 2); ++ 0x0009f000L, 0x000a0000L, 0, 0, 2); regs.u.r32.ebx = 2; regs.u.r32.eax = 0x534D4150; regs.u.r32.ecx = 0x14; -@@ -4528,7 +4540,7 @@ +@@ -4566,7 +4578,7 @@ ASM_END break; case 2: set_e820_range(ES, regs.u.r16.di, @@ -88,7 +87,7 @@ regs.u.r32.ebx = 3; regs.u.r32.eax = 0x534D4150; regs.u.r32.ecx = 0x14; -@@ -4539,7 +4551,7 @@ +@@ -4577,7 +4589,7 @@ ASM_END #if BX_ROMBIOS32 set_e820_range(ES, regs.u.r16.di, 0x00100000L, @@ -97,7 +96,7 @@ regs.u.r32.ebx = 4; #else set_e820_range(ES, regs.u.r16.di, -@@ -4555,7 +4567,7 @@ +@@ -4593,7 +4605,7 @@ ASM_END case 4: set_e820_range(ES, regs.u.r16.di, extended_memory_size - ACPI_DATA_SIZE, @@ -106,7 +105,7 @@ regs.u.r32.ebx = 5; regs.u.r32.eax = 0x534D4150; regs.u.r32.ecx = 0x14; -@@ -4565,7 +4577,20 @@ +@@ -4603,7 +4615,20 @@ ASM_END case 5: /* 256KB BIOS area at the end of 4 GB */ set_e820_range(ES, regs.u.r16.di, @@ -128,18 +127,3 @@ regs.u.r32.ebx = 0; regs.u.r32.eax = 0x534D4150; regs.u.r32.ecx = 0x14; ---- bochs-2.3.7.orig/bios/rombios32.c -+++ bochs-2.3.7/bios/rombios32.c -@@ -479,7 +479,12 @@ - sipi_vector = AP_BOOT_ADDR >> 12; - writel(APIC_BASE + APIC_ICR_LOW, 0x000C4600 | sipi_vector); - -+#ifndef BX_QEMU - delay_ms(10); -+#else -+ while (cmos_readb(0x5f) + 1 != readw((void *)CPU_COUNT_ADDR)) -+ ; -+#endif - - smp_cpus = readw((void *)CPU_COUNT_ADDR); - } diff --git a/pc-bios/bios-pq/0003_smp-startup-poll.patch b/pc-bios/bios-pq/0003_smp-startup-poll.patch new file mode 100644 index 000000000..cd1a3ff03 --- /dev/null +++ b/pc-bios/bios-pq/0003_smp-startup-poll.patch @@ -0,0 +1,21 @@ +From: Avi Kivity + +instead of timing out, wait until all cpus are up + +diff --git a/bios/rombios32.c b/bios/rombios32.c +index ef98a41..05ba40d 100644 +--- a/bios/rombios32.c ++++ b/bios/rombios32.c +@@ -512,7 +512,12 @@ void smp_probe(void) + sipi_vector = AP_BOOT_ADDR >> 12; + writel(APIC_BASE + APIC_ICR_LOW, 0x000C4600 | sipi_vector); + ++#ifndef BX_QEMU + delay_ms(10); ++#else ++ while (cmos_readb(0x5f) + 1 != readw(&smp_cpus)) ++ ; ++#endif + } + BX_INFO("Found %d cpu(s)\n", readw(&smp_cpus)); + } diff --git a/pc-bios/bios-pq/0004_no-stack-protector.patch b/pc-bios/bios-pq/0004_no-stack-protector.patch new file mode 100644 index 000000000..a5f7bbc15 --- /dev/null +++ b/pc-bios/bios-pq/0004_no-stack-protector.patch @@ -0,0 +1,21 @@ +Disable stack protector for BIOS + +Some distro GCCs (like Ubuntu) enable stack protection by default. Since the +BIOS doesn't link against libgcc, this results in undefined references unless +the stack protector is disabled. + +Signed-off-by: Anthony Liguori + +diff --git a/bios/Makefile.in b/bios/Makefile.in +index af674b4..5c7bd4f 100644 +--- a/bios/Makefile.in ++++ b/bios/Makefile.in +@@ -41,7 +41,7 @@ RANLIB = @RANLIB@ + + BCC = bcc + GCC = gcc +-GCC32 = gcc -m32 ++GCC32 = gcc -m32 -fno-stack-protector + AS86 = as86 + + BX_INCDIRS = -I.. -I$(srcdir)/.. -I../iodev -I$(srcdir)/../iodev diff --git a/pc-bios/bios-pq/HEAD b/pc-bios/bios-pq/HEAD new file mode 100644 index 000000000..251c98520 --- /dev/null +++ b/pc-bios/bios-pq/HEAD @@ -0,0 +1 @@ +8d4e158f0ea5fa00fa0276f487ff21609fbb0894 diff --git a/pc-bios/bios-pq/series b/pc-bios/bios-pq/series new file mode 100644 index 000000000..96a4f9d8d --- /dev/null +++ b/pc-bios/bios-pq/series @@ -0,0 +1,4 @@ +0001_bx-qemu.patch +0002_e820-high-mem.patch +0003_smp-startup-poll.patch +0004_no-stack-protector.patch diff --git a/pc-bios/bios.bin b/pc-bios/bios.bin index 715aed365..4aa218b28 100644 Binary files a/pc-bios/bios.bin and b/pc-bios/bios.bin differ