Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


imported SEABIOS source tree
[palacios.git] / bios / seabios / palacios_fixes.patch
diff --git a/bios/seabios/palacios_fixes.patch b/bios/seabios/palacios_fixes.patch
new file mode 100644 (file)
index 0000000..427c4e8
--- /dev/null
@@ -0,0 +1,147 @@
+From 83f115d2f7f26dddcbbffe89aa8a7a97b28a6228 Mon Sep 17 00:00:00 2001
+From: Alexander Kudryavtsev <alexk@ispras.ru>
+Date: Mon, 12 Mar 2012 13:07:07 +0400
+Subject: [PATCH] Fixes needed to launch SEABIOS inside Palacios's VM: 1.
+ Allow to build ACPI tables without PIIX4 PM device 2.
+ Disable HPET table generation 3. Do not perform PCI setup
+ since it breaks Palacios 4. Do not initialize AP cores
+ since it breaks Palacios 5. Fix SRAT generation - do not
+ cut PCI hole since it is already cut off by Palacios
+
+---
+ src/acpi.c    |   44 +++++++++++++++++++++++++++++---------------
+ src/pciinit.c |    2 +-
+ src/smp.c     |    5 ++++-
+ 3 files changed, 34 insertions(+), 17 deletions(-)
+
+diff --git a/src/acpi.c b/src/acpi.c
+index 3d8b7c8..7d50990 100644
+--- a/src/acpi.c
++++ b/src/acpi.c
+@@ -262,18 +262,32 @@ build_fadt(struct pci_device *pci)
+     fadt->dsdt = cpu_to_le32((u32)dsdt);
+     fadt->model = 1;
+     fadt->reserved1 = 0;
+-    int pm_sci_int = pci_config_readb(pci->bdf, PCI_INTERRUPT_LINE);
++    int pm_sci_int;
++    if (pci)
++        pci_config_readb(pci->bdf, PCI_INTERRUPT_LINE);
++    else
++        pm_sci_int = 0;
+     fadt->sci_int = cpu_to_le16(pm_sci_int);
+-    fadt->smi_cmd = cpu_to_le32(PORT_SMI_CMD);
+-    fadt->pm1a_evt_blk = cpu_to_le32(PORT_ACPI_PM_BASE);
+-    fadt->pm1a_cnt_blk = cpu_to_le32(PORT_ACPI_PM_BASE + 0x04);
+-    fadt->pm_tmr_blk = cpu_to_le32(PORT_ACPI_PM_BASE + 0x08);
+-    fadt->pm1_evt_len = 4;
+-    fadt->pm1_cnt_len = 2;
+-    fadt->pm_tmr_len = 4;
++    if (pci) {
++        fadt->smi_cmd = cpu_to_le32(PORT_SMI_CMD);
++        fadt->pm1a_evt_blk = cpu_to_le32(PORT_ACPI_PM_BASE);
++        fadt->pm1a_cnt_blk = cpu_to_le32(PORT_ACPI_PM_BASE + 0x04);
++        fadt->pm_tmr_blk = cpu_to_le32(PORT_ACPI_PM_BASE + 0x08);
++        fadt->pm1_evt_len = 4;
++        fadt->pm1_cnt_len = 2;
++        fadt->pm_tmr_len = 4;
++        pci_init_device(fadt_init_tbl, pci, fadt);
++    } else {
++        fadt->smi_cmd = 0;
++        fadt->pm1a_evt_blk = 0;
++        fadt->pm1a_cnt_blk = 0;
++        fadt->pm_tmr_blk = 0;
++        fadt->pm1_evt_len = 0;
++        fadt->pm1_cnt_len = 0;
++        fadt->pm_tmr_len = 0;
++    }
+     fadt->plvl2_lat = cpu_to_le16(0xfff); // C2 state not supported
+     fadt->plvl3_lat = cpu_to_le16(0xfff); // C3 state not supported
+-    pci_init_device(fadt_init_tbl, pci, fadt);
+     /* WBINVD + PROC_C1 + SLP_BUTTON + FIX_RTC + RTC_S4 */
+     fadt->flags = cpu_to_le32((1 << 0) | (1 << 2) | (1 << 5) | (1 << 6) | (1 << 7));
+@@ -516,6 +530,7 @@ build_srat(void)
+     if (nb_numa_nodes == 0)
+         return NULL;
++
+     u64 *numadata = malloc_tmphigh(sizeof(u64) * (MaxCountCPUs + nb_numa_nodes));
+     if (!numadata) {
+         warn_noalloc();
+@@ -577,7 +592,7 @@ build_srat(void)
+         next_base = mem_base + mem_len;
+         /* Cut out the PCI hole */
+-        if (mem_base <= RamSize && next_base > RamSize) {
++        /*if (mem_base <= RamSize && next_base > RamSize) {
+             mem_len -= next_base - RamSize;
+             if (mem_len > 0) {
+                 acpi_build_srat_memory(numamem, mem_base, mem_len, i-1, 1);
+@@ -587,7 +602,7 @@ build_srat(void)
+             mem_base = 1ULL << 32;
+             mem_len = next_base - RamSize;
+             next_base += (1ULL << 32) - RamSize;
+-        }
++        }*/
+         acpi_build_srat_memory(numamem, mem_base, mem_len, i-1, 1);
+         numamem++;
+         slots++;
+@@ -623,9 +638,7 @@ acpi_bios_init(void)
+     // This code is hardcoded for PIIX4 Power Management device.
+     struct pci_device *pci = pci_find_init_device(acpi_find_tbl, NULL);
+-    if (!pci)
+-        // Device not found
+-        return;
++    // If no PIIX4 is found we will not build certain structures and init it.
+     // Build ACPI tables
+     u32 tables[MAX_ACPI_TABLES], tbl_idx = 0;
+@@ -640,7 +653,8 @@ acpi_bios_init(void)
+     ACPI_INIT_TABLE(build_fadt(pci));
+     ACPI_INIT_TABLE(build_ssdt());
+     ACPI_INIT_TABLE(build_madt());
+-    ACPI_INIT_TABLE(build_hpet());
++    if(pci)
++        ACPI_INIT_TABLE(build_hpet());
+     ACPI_INIT_TABLE(build_srat());
+     u16 i, external_tables = qemu_cfg_acpi_additional_tables();
+diff --git a/src/pciinit.c b/src/pciinit.c
+index 0d8758e..ef8ccda 100644
+--- a/src/pciinit.c
++++ b/src/pciinit.c
+@@ -575,7 +575,7 @@ static int pci_bios_init_root_regions(u32 start, u32 end)
+ void
+ pci_setup(void)
+ {
+-    if (CONFIG_COREBOOT || usingXen()) {
++    if (1 || CONFIG_COREBOOT || usingXen()) {
+         // PCI setup already done by coreboot or Xen - just do probe.
+         pci_probe_devices();
+         return;
+diff --git a/src/smp.c b/src/smp.c
+index 8c077a1..21e7437 100644
+--- a/src/smp.c
++++ b/src/smp.c
+@@ -81,7 +81,7 @@ smp_probe(void)
+         MaxCountCPUs = 1;
+         return;
+     }
+-
++#if 0
+     // Init the counter.
+     writel(&CountCPUs, 1);
+@@ -121,6 +121,9 @@ smp_probe(void)
+     // Restore memory.
+     *(u64*)BUILD_AP_BOOT_ADDR = old;
++#endif
+
++    CountCPUs = inb_cmos(CMOS_BIOS_SMP_COUNT) + 1; // Fix for Palacios
+     MaxCountCPUs = qemu_cfg_get_max_cpus();
+     if (!MaxCountCPUs || MaxCountCPUs < CountCPUs)
+-- 
+1.7.5.4