Hello, is there a chance to modify the Bochs Bios used by KVM/Qemu virtualization? The bios is either available as a binary or as source: binary: located at downloads.sourceforge.net/project/kvm/qemu-kvm/0.11.0/qemu-kvm-0.11.0.tar.gz in the file /pc-bios/bios.bin, the source is also available source git clone git://git.kernel.org/pub/scm/virt/bochs/bochs.git - (revision 04387139e3b5ac97b5633cd40b3d87cdf45efd6c patched with some patches from the .tar.gz above) in the sub-directory "bios" - there you also can find the ACPI tables, probably rombios32.c?: /* RSDT */ memset(rsdt, 0, sizeof(*rsdt)); rsdt->table_offset_entry[0] = cpu_to_le32(fadt_addr); rsdt->table_offset_entry[1] = cpu_to_le32(madt_addr); rsdt->table_offset_entry[2] = cpu_to_le32(ssdt_addr); rsdt->table_offset_entry[3] = cpu_to_le32(hpet_addr); acpi_build_table_header((struct acpi_table_header *)rsdt, "RSDT", sizeof(*rsdt), 1); Thanks, Seb
For SLP 1.0 ie: for parallels (osx), I can patch one of the file (I forgot which one but it was ~12mb) for the DMI string For SLIC 2.0/2.1 not sure about that.
ttp://pages.wazoku.net/bochs_bios_added_HP_SLIC_TABLE.zip This archive contains pached binary BIOS and diff.
Modified BIOS exists and works You can try clone this repository git://gitorious.org/seabios/seabios.git
After some research, I have found that you could use qemu's acpitable parameter, like this: -acpitable sig=SLIC,oem_id=XXXXXX,oem_table_id=YYYYYYYYY,oem_rev=00000100,asl_compiler_id="INTL",asl_compiler_rev=20051117,data=/usr/share/qemu-kvm/SLIC.BIN However, there are two obstacles: 1. qemu before 0.13 would not adapt OEM_ID and OEM_TABLE_ID for other ACPI tables. Thus, SLP 2.x would fail. 2. Managing qemu or qemu-kvm with libvirt does not give you the chance to provide the acpitable parameter, so you would have to use a wrapper for qemu-kvm. Thus, the best solution is to create a patched bios.bin with SLIC 2.1 (example is for openSUSE 11.3 with kvm 0.12.5): 1. Get the sources of kvm for your distribution: zypper source-install kvm 2. Build kvm as provided by your distribution: rpmbuild -bc /usr/src/packages/SPECS/kvm.spec 3. Go to the source directory for the included Seabios: cd /usr/src/packages/BUILD/qemu-kvm-0.12.5/roms/seabios/src 4. Create a file slic.h from a binary SLIC file like this: xxd -i /tmp/SLIC.bin | grep -v len | sed 's/unsigned char.*/unsigned char SLIC[] = {/' > slic.h 5. Patch the source files like this (replacing XXXXXX and YYYYYYYY by your specific OEM_ID and OEM_TABLE_ID, respectively): Code: --- acpi.c.orig 2010-12-09 15:25:51.022725650 +0100 +++ acpi.c 2010-12-09 15:45:00.590973992 +0100 @@ -13,6 +13,8 @@ #include "pci_regs.h" // PCI_INTERRUPT_LINE #include "paravirt.h" +#include "slic.h" // SLIC + /****************************************************/ /* ACPI tables init */ @@ -287,9 +289,9 @@ h->length = cpu_to_le32(len); h->revision = rev; memcpy(h->oem_id, CONFIG_APPNAME6, 6); - memcpy(h->oem_table_id, CONFIG_APPNAME4, 4); - memcpy(h->asl_compiler_id, CONFIG_APPNAME4, 4); - memcpy(h->oem_table_id + 4, (void*)&sig, 4); + memcpy(h->oem_table_id, CONFIG_APPNAME8, 8); + memcpy(h->asl_compiler_id, CONFIG_APPNAME8, 4); +// memcpy(h->oem_table_id + 4, (void*)&sig, 4); h->oem_revision = cpu_to_le32(1); h->asl_compiler_revision = cpu_to_le32(1); h->checksum -= checksum(h, len); @@ -638,6 +640,8 @@ ACPI_INIT_TABLE(build_hpet()); ACPI_INIT_TABLE(build_srat()); + ACPI_INIT_TABLE(&SLIC); + u16 i, external_tables = qemu_cfg_acpi_additional_tables(); for(i = 0; i < external_tables; i++) { --- acpi-dsdt.dsl.orig 2010-12-09 15:04:58.930972494 +0100 +++ acpi-dsdt.dsl 2010-12-09 15:32:38.238723300 +0100 @@ -20,8 +20,8 @@ "acpi-dsdt.aml", // Output Filename "DSDT", // Signature 0x01, // DSDT Compliance Revision - "BXPC", // OEMID - "BXDSDT", // TABLE ID + "XXXXXX", // OEMID + "YYYYYYYYY", // TABLE ID 0x1 // OEM Revision ) { --- config.h.orig 2010-12-09 15:25:22.658721692 +0100 +++ config.h 2010-12-09 15:27:07.194722789 +0100 @@ -7,10 +7,10 @@ //#define CONFIG_CPUNAME8 "QEMUCPU " //#define CONFIG_APPNAME6 "QEMU " //#define CONFIG_APPNAME4 "QEMU" -#define CONFIG_APPNAME "Bochs" +#define CONFIG_APPNAME "XXXXXX" #define CONFIG_CPUNAME8 "BOCHSCPU" -#define CONFIG_APPNAME6 "BOCHS " -#define CONFIG_APPNAME4 "BXPC" +#define CONFIG_APPNAME6 "XXXXXX" +#define CONFIG_APPNAME8 "YYYYYYYY" // Configure as a coreboot payload. #define CONFIG_COREBOOT 0 6. Build the Seabios again (can take several times before it finishes O.K.): cd ..; make; make 7. Copy the resulting bios.bin into your kvm installation: cp out/bios.bin /usr/share/qemu-kvm/ 8. Have fun!
I have read the content of this Thread beacause I have to install a windows server 2003 standard r2 oem for HP in a virtual kvm / ubuntu server system on a Dell server. At the end i have not realized if is possible to do it so, I ask to TheFrickler: if you have a lot of time please tell me something more about this question, thanks in advance, nandinux. PS: I have tryed to get a non oem cd from Hp and Microsoft but they say me is not possible and thet I must buy win2003 another time.
Guys thank you all for your helpful instructions using these I successfully created my own ASUS SLIC 2.1 & SLP 1.0 Modded SeaBios for QEMU. It beats VMWare for speed hands down. Thank you
Hi mikeyspikey2011, May I ask, how have you done this? I have tried the instructions which are within this thread and some other by googling but I can't seem to get it to compile nor run. I am using Debian Squeeze (6) with stock KVM out of apt. I can't use the Windows loader solution due to KVM refuses to boot after you apply it. I have also tried the bochs_bios_added_HP_SLIC_TABLE.zip and after replacing the bios on the system, none of the KVM guests will boot not even the linux ones. I assume its not compatible with lastest KVM i.e. missing some key parts which is why I thought building a new one should fix this problem alais I havent managed to yet. So would you mind either telling me how you made this to work/compile? or can you give me the replacment bios's to just copy/replace on my host? Thanks in advance. *UPDATE* tracked down what the problem was... compiled sucessfuly now.. just in the middle of testing it all out. If/when it all works, I will provide some howto/instructions so others don't suffer the same pain as I have. hehe.
Thanks for information and patch code. I did working seabios 5.1 with dell slic and now server 2008 r2 is activated in KVM. I found page ttp://code.coreboot.org/p/seabios/downloads/ where is seabios sources. I also did tried to same with latest 6.2 but could not get in build.
testen, I am testing Proxmox 1.8 (Debian based) which uses KVM. I see that the guests machines uses SeaBios, but have no clue on how to patch it for testing. I am not an advance Linux person, but can follow instructions. Right now, I just need to understand which file needs to be replaced and where and with what. Any assistance is greatly appreciated. FYI, I can't believe the performance on Proxmox is much better than VMWare Hypervisor ESXi 4.1 and Hyper-V R2 SP1!
Thanks for the hint! I am patched a seabios from the git (v 6.3pre-alpha-bla-bla-bla) and my virtual Win2k8 R2 server was successfully activated. P.S. The third hunk from the original patch erroneously patch the wrong place of current seabios from the git. I am not guru in patch format, so I patch original acpi.c by hands and create diff (its working for me). Edited patch Code: --- acpi.c.orig 2011-08-15 22:37:49.000000000 +0700 +++ acpi.c 2011-08-16 10:26:13.837668295 +0700 @@ -197,6 +197,11 @@ #include "acpi-dsdt.hex" +#define CONFIG_OEM_SLIC +#ifdef CONFIG_OEM_SLIC +#include "acpi-slic.hex" +#endif + static void build_header(struct acpi_table_header *h, u32 sig, int len, u8 rev) { @@ -209,6 +214,10 @@ memcpy(h->oem_table_id + 4, (void*)&sig, 4); h->oem_revision = cpu_to_le32(1); h->asl_compiler_revision = cpu_to_le32(1); +#ifdef CONFIG_OEM_SLIC + if (sig == RSDT_SIGNATURE) // only RSDT is checked by win7 & vista + memcpy(h->oem_id, ((struct acpi_table_header*)SLIC)->oem_id, 14); +#endif h->checksum -= checksum(h, len); } @@ -639,6 +648,17 @@ ACPI_INIT_TABLE(build_hpet()); ACPI_INIT_TABLE(build_srat()); +#ifdef CONFIG_OEM_SLIC + { void *buf = malloc_high(sizeof(SLIC)); + if (!buf) + warn_noalloc(); + else { + memcpy(buf, SLIC, sizeof(SLIC)); + ACPI_INIT_TABLE(buf); + } + } +#endif + u16 i, external_tables = qemu_cfg_acpi_additional_tables(); for(i = 0; i < external_tables; i++) {
Hi Majestic, Sorry I didn't reply fast enough, I'm glad you figured it out though. Also just as a small thank you and to save everyone else the trouble, here it is: Asus SLIC 2.1 & SLP 1.0 QEMU SEABIOS http: //w w w.mediafire.com/?f86d6u6x5zd0nf0
ACPI SLIC HACK Patch for Seabios. Hi guys, I patched acpi.c for that you don't need any mods to kvm/qemu soft. It's a little hack of acpitable's parameters. When sig 5L1C is sent, BIOS inserts directly "data" in acpi table but copy oem_id and oem_table_id in RSDT table too. Like this : kvm -bios `patched bios` -acpitable sig=5L1C,data=`SLIC dump` look my diff n http : / /mrtaz . net / mrtaz / bios . bin Code: --- acpi.c.orig 2011-12-24 18:03:11.346256959 +0100 +++ acpi.c 2011-12-24 17:58:07.368750605 +0100 @@ -628,6 +628,11 @@ u16 i, external_tables = qemu_cfg_acpi_additional_tables(); + #define SLIC_SIGNATURE 0x43494C53 // SLIC + #define HACK_SLIC_SIGNATURE 0x43314C35 // HACK SLIC + struct acpi_table_header *slic; + slic = 0; + for(i = 0; i < external_tables; i++) { u16 len = qemu_cfg_next_acpi_table_len(); void *addr = malloc_high(len); @@ -635,7 +640,13 @@ warn_noalloc(); continue; } - ACPI_INIT_TABLE(qemu_cfg_next_acpi_table_load(addr, len)); + struct acpi_table_header *acpi_ext_table; + acpi_ext_table = qemu_cfg_next_acpi_table_load(addr, len); + if (acpi_ext_table->signature == HACK_SLIC_SIGNATURE) { + acpi_ext_table = acpi_ext_table+1; + slic = acpi_ext_table; + } + ACPI_INIT_TABLE(acpi_ext_table); if (tbl_idx == MAX_ACPI_TABLES) { warn_noalloc(); break; @@ -653,7 +664,19 @@ memset(rsdt, 0, rsdt_len); memcpy(rsdt->table_offset_entry, tables, sizeof(u32) * tbl_idx); - build_header((void*)rsdt, RSDT_SIGNATURE, rsdt_len, 1); + if (slic->signature == SLIC_SIGNATURE){ + rsdt->signature = RSDT_SIGNATURE; + rsdt->length = cpu_to_le32(rsdt_len); + rsdt->revision = 1; + memcpy(rsdt->oem_id, slic->oem_id, 6); + memcpy(rsdt->oem_table_id, slic->oem_table_id, 8); + memcpy(rsdt->asl_compiler_id, CONFIG_APPNAME4, 4); + rsdt->oem_revision = cpu_to_le32(1); + rsdt->asl_compiler_revision = cpu_to_le32(1); + rsdt->checksum -= checksum(rsdt, rsdt_len); + } else { + build_header((void*)rsdt, RSDT_SIGNATURE, rsdt_len, 1); + } // Build rsdp pointer table memset(rsdp, 0, sizeof(*rsdp)); Thx for comments.
I tried both methods, from mikeyspikey2011 and from MrTAZ as well. I'm successfully able to install a copy of Windows 7 Ent SP1, but right after the first reboot I get the BSOD as seen on the image. I'm using KVM on a Proxmox test box, the command line contains this extra parameter, where the bios is the one mikeyspikey2011 provided: -bios /path/slic-bios.bin View attachment 13122 Do you have any hints? Do I need some other parameter?