I followed mikelinux's steps I and finally got it working. Btw if your own SLIC produces and error, just search for the SLICs here on the board, there's a topic here somewhere that lists down all of them, just choose what you want. Also I didn't do the valid ranges, I just picked one from Dell and it produced the bin with no errors.
Now I'm trying to create my own BIOS.BIN for hours without success My System is (still) an Ubuntu 12.04 LTS so I'm currently using seabios-0.6.2 and not seabios-1.7.2. (I'm still not sure if 1.7.2 is working for my kvm/qemu) Accordingly to reply #39 of this thread (http : //forums.mydigitallife.net/threads/12401-Modified-Bios-for-KVM-Qemu-Bochs-Bios/page4?p=802664&viewfull=1#post802664): - I've tried 0.6.2 but the patch failed - so I've tried 1.7.2 and the patch was successful - My Mainboard has no SLIC so cannot use /sys/firmware/acpi/tables/SLIC but a Bios-file with a SLIC. - I tried P5GD2-X-ASUS-0601_SLIC.ROM with (maybe?) ASUS SLIC --> failed. - I tried M2N-SLI-DELUXE-1701_SLIC.BIN with (maybe?) ASUS SLIC --> failed. - I tried 1002_SLIC_HP_21.BIN with HP SLIC -> failed. The ASUS SLICS faield with "bios too big". The HP-SLICS (using "") with "ldut/romlayout32flat.lds:87: syntax error" ... and I did not found the specified "SONY-VAIO_2.1.BIN"-File everywhere. So please can anyone post a working bios.bin (or maybe tell me the way how to create it from an existing bios.bin using the same tools for the "real" bios hacks)
Thanks. Now I'ts clear why I got the message "bios too big" It also seems that the seabios 1.7.2 is well working on Ubuntu 12.04 LTS. I've just renamed /usr/share/seabios/bios.bin to bios.original.bin, copied the new to bios.slic.bin and created an symlink to bios.bin.
Update of page for 1.7.5? MikeLinux, Any chance of seeing this procedure updated to work with the Seabios 1.7.5 (as it breaks using that version)? Thanks!
I think the upgrade of pve-qemu-kvm 2.1-5 is what caused this but not sure. Looks like some newer info on patching in this thread. lists.gnu.org/archive/html/qemu-devel/2014-04/msg00879 Can't post link so add.html
For Seabios 1.7.5 Place patch and acpi-slic.hex in the src directory run 'patch -p1 <acpi_slic.patch' from src directory then make the project for proxmox 3.3: rename bios.bin to bios-256k.bin This patch still uses the 1.7.3 method as a fall back but if the acpi tables get loaded from rom files, then it rebuilds the table list with the loaded tables and the SLIC added. Code: diff -uNr ../src.orig/fw/acpi.c ./fw/acpi.c --- ../src.orig/fw/acpi.c 2014-05-28 22:09:15.000000000 +1000 +++ ./fw/acpi.c 2014-09-27 16:18:53.000000000 +1000 @@ -23,6 +23,8 @@ #include "src/fw/acpi-dsdt.hex" +#include "acpi-slic.hex" + static void build_header(struct acpi_table_header *h, u32 sig, int len, u8 rev) { @@ -35,6 +37,8 @@ h->oem_revision = cpu_to_le32(1); memcpy(h->asl_compiler_id, BUILD_APPNAME4, 4); h->asl_compiler_revision = cpu_to_le32(1); + if (sig == RSDT_SIGNATURE) // only RSDT is checked by win7 & vista + memcpy(h->oem_id, ((struct acpi_table_header*)SLIC)->oem_id, 14); h->checksum -= checksum(h, len); } @@ -590,6 +594,46 @@ PCI_DEVICE_END, }; +void +build_rsdp(struct fadt_descriptor_rev1 *fadt, u32 *tables, u32 tbl_idx, int makedsdt) +{ + if (makedsdt) + { + /* default DSDT */ + struct acpi_table_header *dsdt = malloc_high(sizeof(AmlCode)); + if (!dsdt) { + warn_noalloc(); + return; + } + memcpy(dsdt, AmlCode, sizeof(AmlCode)); + fill_dsdt(fadt, dsdt); + /* Strip out compiler-generated header if any */ + memset(dsdt, 0, sizeof *dsdt); + build_header(dsdt, DSDT_SIGNATURE, sizeof(AmlCode), 1); + } + + // Build final rsdt table + struct rsdt_descriptor_rev1 *rsdt; + size_t rsdt_len = sizeof(*rsdt) + sizeof(u32) * tbl_idx; + rsdt = malloc_high(rsdt_len); + if (!rsdt) { + warn_noalloc(); + return; + } + memset(rsdt, 0, rsdt_len); + memcpy(rsdt->table_offset_entry, tables, sizeof(u32) * tbl_idx); + build_header((void*)rsdt, RSDT_SIGNATURE, rsdt_len, 1); + + // Build rsdp pointer table + struct rsdp_descriptor rsdp; + memset(&rsdp, 0, sizeof(rsdp)); + rsdp.signature = cpu_to_le64(RSDP_SIGNATURE); + memcpy(rsdp.oem_id, BUILD_APPNAME6, 6); + rsdp.rsdt_physical_address = cpu_to_le32((u32)rsdt); + rsdp.checksum -= checksum(&rsdp, 20); + copy_acpi_rsdp(&rsdp); +} + #define MAX_ACPI_TABLES 20 void acpi_setup(void) @@ -624,6 +668,16 @@ if (pci->device == PCI_DEVICE_ID_INTEL_ICH9_LPC) ACPI_INIT_TABLE(build_mcfg_q35()); + //Add SLIC + void *buf = malloc_high(sizeof(SLIC)); + if(!buf) + warn_noalloc(); + else + { + memcpy(buf, SLIC, sizeof(SLIC)); + ACPI_INIT_TABLE(buf); + } + struct romfile_s *file = NULL; for (;;) { file = romfile_findprefix("acpi/", file); @@ -650,38 +704,51 @@ } } - if (CONFIG_ACPI_DSDT && fadt && !fadt->dsdt) { - /* default DSDT */ - struct acpi_table_header *dsdt = malloc_high(sizeof(AmlCode)); - if (!dsdt) { - warn_noalloc(); - return; - } - memcpy(dsdt, AmlCode, sizeof(AmlCode)); - fill_dsdt(fadt, dsdt); - /* Strip out compiler-generated header if any */ - memset(dsdt, 0, sizeof *dsdt); - build_header(dsdt, DSDT_SIGNATURE, sizeof(AmlCode), 1); - } + build_rsdp(fadt, tables, tbl_idx, CONFIG_ACPI_DSDT && fadt && !fadt->dsdt); +} - // Build final rsdt table - struct rsdt_descriptor_rev1 *rsdt; - size_t rsdt_len = sizeof(*rsdt) + sizeof(u32) * tbl_idx; - rsdt = malloc_high(rsdt_len); - if (!rsdt) { - warn_noalloc(); - return; - } - memset(rsdt, 0, rsdt_len); - memcpy(rsdt->table_offset_entry, tables, sizeof(u32) * tbl_idx); - build_header((void*)rsdt, RSDT_SIGNATURE, rsdt_len, 1); +void +acpi_add_slic(void) +{ + u32 tables[MAX_ACPI_TABLES], tbl_idx = 0; + struct fadt_descriptor_rev1 *fadt = NULL; - // Build rsdp pointer table - struct rsdp_descriptor rsdp; - memset(&rsdp, 0, sizeof(rsdp)); - rsdp.signature = cpu_to_le64(RSDP_SIGNATURE); - memcpy(rsdp.oem_id, BUILD_APPNAME6, 6); - rsdp.rsdt_physical_address = cpu_to_le32((u32)rsdt); - rsdp.checksum -= checksum(&rsdp, 20); - copy_acpi_rsdp(&rsdp); + //Copy Exsiting Tables + if (RsdpAddr && RsdpAddr->signature == RSDP_SIGNATURE) + { + struct rsdt_descriptor_rev1 *rsdt = (void*)RsdpAddr->rsdt_physical_address; + if (rsdt && rsdt->signature == RSDT_SIGNATURE) + { + void *end = (void*)rsdt + rsdt->length; + int i; + for (i=0; (void*)&rsdt->table_offset_entry < end; i++) + { + struct fadt_descriptor_rev1 *te = (void*)rsdt->table_offset_entry; + if(te) + { + tables[tbl_idx++] = (u32)(te); + if(te->signature == FACP_SIGNATURE) + fadt = te; + } + } + } + } + + if(fadt) + { + //Add SLIC + void *buf = malloc_high(sizeof(SLIC)); + if (!buf) + warn_noalloc(); + else + { + memcpy(buf, SLIC, sizeof(SLIC)); + tables[tbl_idx] = cpu_to_le32((u32)(buf)); + if(le32_to_cpu(tables[tbl_idx])) + tbl_idx++; + } + + RsdpAddr = NULL; + build_rsdp(fadt, tables, tbl_idx, 1); + } } diff -uNr ../src.orig/fw/paravirt.c ./fw/paravirt.c --- ../src.orig/fw/paravirt.c 2014-05-28 22:09:15.000000000 +1000 +++ ./fw/paravirt.c 2014-09-27 16:07:51.000000000 +1000 @@ -159,7 +159,10 @@ RsdpAddr = find_acpi_rsdp(); if (RsdpAddr) + { + acpi_add_slic(); return; + } /* If present, loader should have installed an RSDP. * Not installed? We might still be able to continue diff -uNr ../src.orig/util.h ./util.h --- ../src.orig/util.h 2014-05-28 22:09:15.000000000 +1000 +++ ./util.h 2014-09-27 16:07:32.000000000 +1000 @@ -62,6 +62,7 @@ // fw/acpi.c void acpi_setup(void); +void acpi_add_slic(void); // fw/biostable.c void copy_pir(void *pos);
Many thanks for all your efforts here. At first I got lost but finally I could build a bios-256k.bin based on Seabios 1.7.5 that seems to work in Proxmox 3.3. Maybe it is helpful for other noobs like me who get lost here when I describe what I did on Debian 7 to build it. 1) Basically I followed the Steps described in the posting #39 of this thread but I replaced 1.7.2 by 1.7.5 and I did not apply the SLIC patch to the source. 2) I copied the code from the posting #49 above into a file called "acpi_slic.patch" and copied that file to /biostemp/seaslic-master/seabios.submodule/src/ 3) I changed into the directory /biostemp/seaslic-master/seabios.submodule/src/ and ran "patch -p1 <acpi_slic.patch" 4) I installed some Debian Packages: aptitude install make build-essential iasl 5) I went back to /biostemp/seaslic-master/seabios.submodule and ran "make". 6) In a new subdirectory "out" I found my bios.bin, renamed it to "bios-256k.bin" and replaced the original file on my Proxmox server in /usr/share/kvm 7) I fired up a virtual Win7 machine, launched slic_toolkit inside of it and - SURPRISE SURPRISE - it detected a working SLIC. Now I could activate Many thanks to all of you for your great work!
Updated Patch for Seabios 1.7.5 Neatened the Code Clean up the memory of the old table list when rebuilt with SLIC Removed an unnecessary replacement of the DSDT table when the table list was being rebuild Added the option of adding a MSDM table to hold a Windows Serial This patch seems to make my VMs boot a little faster than my last patch. Use the same process as the last patch. Thank you silverado for expanding the instruction for the less experienced! If you want to have a MSDM table added with a Windows Serial: Apply Patch Edit win-serial.str in the src directory, putting your 29 character serial in-between the quotes Then make the project Note: The MSDM table will get it's OEM_ID & OEM_TABLE_ID from your SLIC table. Code: diff -uNr ../src.orig/fw/acpi.c ./fw/acpi.c --- ../src.orig/fw/acpi.c 2014-05-28 22:09:15.000000000 +1000 +++ ./fw/acpi.c 2014-09-28 23:23:06.000000000 +1000 @@ -23,18 +23,34 @@ #include "src/fw/acpi-dsdt.hex" +#include "acpi-slic.hex" +#include "win-serial.str" + static void build_header(struct acpi_table_header *h, u32 sig, int len, u8 rev) { h->signature = cpu_to_le32(sig); h->length = cpu_to_le32(len); h->revision = rev; - memcpy(h->oem_id, BUILD_APPNAME6, 6); - memcpy(h->oem_table_id, BUILD_APPNAME4, 4); - memcpy(h->oem_table_id + 4, (void*)&sig, 4); + if (sig == RSDT_SIGNATURE || sig == MSDM_SIGNATURE) + memcpy(h->oem_id, ((struct acpi_table_header*)SLIC)->oem_id, 14); + else + { + memcpy(h->oem_id, BUILD_APPNAME6, 6); + memcpy(h->oem_table_id, BUILD_APPNAME4, 4); + memcpy(h->oem_table_id + 4, (void*)&sig, 4); + } h->oem_revision = cpu_to_le32(1); - memcpy(h->asl_compiler_id, BUILD_APPNAME4, 4); - h->asl_compiler_revision = cpu_to_le32(1); + if(sig == MSDM_SIGNATURE) + { + memcpy(h->asl_compiler_id, "ASL ", 4); + h->asl_compiler_revision = cpu_to_le32(0x00040000); + } + else + { + memcpy(h->asl_compiler_id, BUILD_APPNAME4, 4); + h->asl_compiler_revision = cpu_to_le32(1); + } h->checksum -= checksum(h, len); } @@ -590,6 +606,69 @@ PCI_DEVICE_END, }; +static void * +build_slic(void) +{ + void *buf = malloc_high(sizeof(SLIC)); + if(buf) + { + memcpy(buf, SLIC, sizeof(SLIC)); + return buf; + } + else + warn_noalloc(); + return NULL; +} + +static void * +build_msdm(void) +{ + if(win_serial[0]) + { + struct acpi_table_msdm *msdm; + size_t msdm_len = sizeof(*msdm); + msdm = malloc_high(msdm_len); + if(msdm) + { + memset(msdm, 0, msdm_len); + msdm->msdm_version = cpu_to_le32(1); + msdm->msdm_data_type = cpu_to_le32(1); + msdm->msdm_data_length = cpu_to_le32(29); + memcpy(msdm->msdm_data, win_serial, 29); + build_header((void*)msdm, MSDM_SIGNATURE, msdm_len, 3); + return msdm; + } + else + warn_noalloc(); + } + return NULL; +} + +static void +build_rsdp(u32 *tables, u32 tbl_idx) +{ + // Build final rsdt table + struct rsdt_descriptor_rev1 *rsdt; + size_t rsdt_len = sizeof(*rsdt) + sizeof(u32) * tbl_idx; + rsdt = malloc_high(rsdt_len); + if (!rsdt) { + warn_noalloc(); + return; + } + memset(rsdt, 0, rsdt_len); + memcpy(rsdt->table_offset_entry, tables, sizeof(u32) * tbl_idx); + build_header((void*)rsdt, RSDT_SIGNATURE, rsdt_len, 1); + + // Build rsdp pointer table + struct rsdp_descriptor rsdp; + memset(&rsdp, 0, sizeof(rsdp)); + rsdp.signature = cpu_to_le64(RSDP_SIGNATURE); + memcpy(rsdp.oem_id, BUILD_APPNAME6, 6); + rsdp.rsdt_physical_address = cpu_to_le32((u32)rsdt); + rsdp.checksum -= checksum(&rsdp, 20); + copy_acpi_rsdp(&rsdp); +} + #define MAX_ACPI_TABLES 20 void acpi_setup(void) @@ -624,6 +703,9 @@ if (pci->device == PCI_DEVICE_ID_INTEL_ICH9_LPC) ACPI_INIT_TABLE(build_mcfg_q35()); + ACPI_INIT_TABLE(build_slic()); + ACPI_INIT_TABLE(build_msdm()); + struct romfile_s *file = NULL; for (;;) { file = romfile_findprefix("acpi/", file); @@ -664,24 +746,32 @@ build_header(dsdt, DSDT_SIGNATURE, sizeof(AmlCode), 1); } - // Build final rsdt table - struct rsdt_descriptor_rev1 *rsdt; - size_t rsdt_len = sizeof(*rsdt) + sizeof(u32) * tbl_idx; - rsdt = malloc_high(rsdt_len); - if (!rsdt) { - warn_noalloc(); - return; + build_rsdp(tables, tbl_idx); +} + +void +acpi_add_slic(void) +{ + u32 tables[MAX_ACPI_TABLES], tbl_idx = 0; + + //Copy Exsiting Tables + if (RsdpAddr && RsdpAddr->signature == RSDP_SIGNATURE) + { + struct rsdt_descriptor_rev1 *rsdt = (void*)RsdpAddr->rsdt_physical_address; + if (rsdt && rsdt->signature == RSDT_SIGNATURE) + { + void *end = (void*)rsdt + rsdt->length; + int i; + for (i=0; (void*)&rsdt->table_offset_entry < end; i++) + tables[tbl_idx++] = (u32)(rsdt->table_offset_entry); + } } - memset(rsdt, 0, rsdt_len); - memcpy(rsdt->table_offset_entry, tables, sizeof(u32) * tbl_idx); - build_header((void*)rsdt, RSDT_SIGNATURE, rsdt_len, 1); - // Build rsdp pointer table - struct rsdp_descriptor rsdp; - memset(&rsdp, 0, sizeof(rsdp)); - rsdp.signature = cpu_to_le64(RSDP_SIGNATURE); - memcpy(rsdp.oem_id, BUILD_APPNAME6, 6); - rsdp.rsdt_physical_address = cpu_to_le32((u32)rsdt); - rsdp.checksum -= checksum(&rsdp, 20); - copy_acpi_rsdp(&rsdp); + ACPI_INIT_TABLE(build_slic()); + ACPI_INIT_TABLE(build_msdm()); + + free((void*)RsdpAddr->rsdt_physical_address); + free(RsdpAddr); + RsdpAddr = NULL; + build_rsdp(tables, tbl_idx); } diff -uNr ../src.orig/fw/paravirt.c ./fw/paravirt.c --- ../src.orig/fw/paravirt.c 2014-05-28 22:09:15.000000000 +1000 +++ ./fw/paravirt.c 2014-09-28 23:25:37.000000000 +1000 @@ -159,7 +159,10 @@ RsdpAddr = find_acpi_rsdp(); if (RsdpAddr) + { + acpi_add_slic(); return; + } /* If present, loader should have installed an RSDP. * Not installed? We might still be able to continue diff -uNr ../src.orig/std/acpi.h ./std/acpi.h --- ../src.orig/std/acpi.h 2014-02-07 03:18:17.000000000 +1100 +++ ./std/acpi.h 2014-09-28 23:24:24.000000000 +1000 @@ -269,4 +269,15 @@ struct acpi_mcfg_allocation allocation[0]; } PACKED; +#define MSDM_SIGNATURE 0x4d44534d // MSDM +struct acpi_table_msdm { + ACPI_TABLE_HEADER_DEF; + u32 msdm_version; + u32 msdm_reserved; + u32 msdm_data_type; + u32 msdm_data_reserved; + u32 msdm_data_length; + u8 msdm_data[29]; +} PACKED; + #endif // acpi.h diff -uNr ../src.orig/util.h ./util.h --- ../src.orig/util.h 2014-05-28 22:09:15.000000000 +1000 +++ ./util.h 2014-09-27 16:07:32.000000000 +1000 @@ -62,6 +62,7 @@ // fw/acpi.c void acpi_setup(void); +void acpi_add_slic(void); // fw/biostable.c void copy_pir(void *pos); diff -uNr ../src.orig/win-serial.str ./win-serial.str --- ../src.orig/win-serial.str 1970-01-01 10:00:00.000000000 +1000 +++ ./win-serial.str 2014-09-28 23:17:57.000000000 +1000 @@ -0,0 +1 @@ +static char win_serial[] = "";
Thanks! That was a lot easier than what I did. LOL I downloaded pve-qemu-kvm from git and applied the patch from my post above. Worked fine too. One advantage is it may be able to use a different slic file per vm. Have not tested that and it may be of no use anyway.
patch to use slic from file now in Debian qemu BTW, the version of kvm / qemu 2.1 in Debian (and thus will probably get into other derived distros such as Ubuntu) is now carrying a patch which allows you to use the stock Seabios, and just specify - Code: qemu -acpitable file=/sys/firmware/acpi/tables/SLIC or similar. I call this using a wrapper script like this: Code: #!/bin/sh exec qemu-system-x86_64 -enable-kvm -acpitable file=/sys/firmware/acpi/tables/SLIC "$@" The original patch and related discussion thread on the qemu developer mailing list is here: lists.nongnu.org/archive/html/qemu-devel/2014-04/msg00879.html With a bit more development this patch stands a reasonable chance of being accepted into upstream qemu, which would be nice so that there would be no more BIOS or qemu patching required...
I tried following the instructions silverado posted but I get the following error: Code: Compile checking out/src/misc.o Compiling whole program out/ccode32flat.o Compiling whole program out/ccode16.o Building ld scripts Version: ?-20141124_145702-acmeinc Fixed space: 0xe05b-0x10000 total: 8101 slack: 11 Percent slack: 0.1% 16bit size: 35660 32bit segmented size: 2210 32bit flat size: 22080 32bit flat init size: 72000 Lowmem size: 2160 f-segment var size: 1634 Linking out/rom16.o Stripping out/rom16.strip.o Linking out/rom32seg.o Stripping out/rom32seg.strip.o Linking out/rom.o out/code32flat.o: In function `qemu_platform_setup': /root/biostemp/seaslic-master/seabios.submodule/src/fw/paravirt.c:163: undefined reference to `acpi_add_slic' make: *** [out/rom.o] Error 1 Am I missing something here?
Good news for proxmox 5. No longer need to patch. Just put slic.bin somewhere and add args: -acpitable sig=SLIC,file=path/to/slic.bin to /etc/pve/nodes/yournode/qemu-server/101.conf . With this you need to do this for each vm.
Does anyone have an updated procedure for Seabios 1.10.2 for Proxmox 5? The Procedure for 1.7.5 appears to fail. I was unable to run the .sh so I hand coded the modules. Compiles fine but fails to start in vm " Guest has not initialized the display yet" Update Using Zorin 12 - I am able to run the patch successfully, however same result. Will not startup in the vm. I can simply add the SLIC table, Dell oem string, compile and will activate. That's not the goal. I would like to see ( learn) how to properly add all the table so the tools report correctly. This really started out as a way into linux. I first did the VMware thing. Using the knowledge gathered her on MDL I was able to load a Dell SLIC into 6006.rom with the tools and eventually build an ESXI installation disk with dell 6006.rom. Ok Works.. Blew it away and now learning about Proxmox and Seabios. Much more fun... However I am stuck... not sure whats wrong. And Yes "args: -acpitable sig=SLIC,file=path/to/slic.bin to /etc/pve/nodes/yournode/qemu-server/101.conf ." works for 2008+ but fails to activate xp/2003 without the oem string.
Here is a little helper script that will update all Windows vm config files if needed. Assume you have created a dir /SLIC and placed the SLIC.BIN & Update.sh in there. And assume the node name is pve Create file named Update.sh with: for file in /etc/pve/nodes/pve/qemu-server/* do if grep -q "ostype: w" "${file}" then if grep -q "args: -acpitable" "${file}" then echo "ACPI Found in ${file}" else echo "ACPI NOT Found in ${file} - Updating" echo "args: -acpitable sig=SLIC,file=/SLIC/SLIC.BIN" >> "${file}" fi fi done To run from putty as root - sh /SLIC/Update.sh To run from Windows Get plink along with putty - plink [email protected] address sh /SLIC/Update.sh - enter the root pw when asked.