#define align16(sz) (((sz) + 15) & ~15)
#define fixed_strcpy(d, s) strncpy((d), (s), sizeof(d))
-/* MADT parameters for filling in bios_info structure for DSDT. */
-uint32_t madt_csum_addr, madt_lapic0_addr;
-
extern struct acpi_20_rsdp Rsdp;
extern struct acpi_20_rsdt Rsdt;
extern struct acpi_20_xsdt Xsdt;
extern struct acpi_20_fadt Fadt;
extern struct acpi_20_facs Facs;
+/*
+ * Located at ACPI_INFO_PHYSICAL_ADDRESS.
+ *
+ * This must match the Field("BIOS"....) definition in the DSDT.
+ */
+struct acpi_info {
+ uint8_t com1_present:1; /* 0[0] - System has COM1? */
+ uint8_t com2_present:1; /* 0[1] - System has COM2? */
+ uint8_t lpt1_present:1; /* 0[2] - System has LPT1? */
+ uint8_t hpet_present:1; /* 0[3] - System has HPET? */
+ uint32_t pci_min, pci_len; /* 4, 8 - PCI I/O hole boundaries */
+ uint32_t madt_csum_addr; /* 12 - Address of MADT checksum */
+ uint32_t madt_lapic0_addr; /* 16 - Address of first MADT LAPIC struct */
+};
+
/*
* Alternative DSDTs we get linked against. A cover-all DSDT for up to the
* implementation-defined maximum number of VCPUs, and an alternative for use
return (inb(0x88) == 0x1F);
}
-static struct acpi_20_madt *construct_madt(void)
+static struct acpi_20_madt *construct_madt(struct acpi_info *info)
{
struct acpi_20_madt *madt;
struct acpi_20_madt_intsrcovr *intsrcovr;
io_apic->ioapic_addr = IOAPIC_BASE_ADDRESS;
lapic = (struct acpi_20_madt_lapic *)(io_apic + 1);
- madt_lapic0_addr = (uint32_t)lapic;
+ info->madt_lapic0_addr = (uint32_t)lapic;
for ( i = 0; i < nr_processor_objects; i++ )
{
memset(lapic, 0, sizeof(*lapic));
madt->header.length = (unsigned char *)lapic - (unsigned char *)madt;
set_checksum(madt, offsetof(struct acpi_header, checksum),
madt->header.length);
- madt_csum_addr = (uint32_t)&madt->header.checksum;
+ info->madt_csum_addr = (uint32_t)&madt->header.checksum;
return madt;
}
return hpet;
}
-static int construct_secondary_tables(unsigned long *table_ptrs)
+static int construct_secondary_tables(unsigned long *table_ptrs,
+ struct acpi_info *info)
{
int nr_tables = 0;
struct acpi_20_madt *madt;
/* MADT. */
if ( (hvm_info->nr_vcpus > 1) || hvm_info->apic_mode )
{
- madt = construct_madt();
+ madt = construct_madt(info);
if (!madt) return -1;
table_ptrs[nr_tables++] = (unsigned long)madt;
}
void acpi_build_tables(unsigned int physical)
{
+ struct acpi_info *acpi_info = (struct acpi_info *)ACPI_INFO_PHYSICAL_ADDRESS;
struct acpi_20_rsdp *rsdp;
struct acpi_20_rsdt *rsdt;
struct acpi_20_xsdt *xsdt;
offsetof(struct acpi_header, checksum),
sizeof(struct acpi_20_fadt));
- nr_secondaries = construct_secondary_tables(secondary_tables);
+ nr_secondaries = construct_secondary_tables(secondary_tables, acpi_info);
if ( nr_secondaries < 0 )
goto oom;
rsdt->header.length);
/*
- * Fill in low-memory data structures: bios_info_table and RSDP.
+ * Fill in low-memory data structures: acpi_info and RSDP.
*/
rsdp = (struct acpi_20_rsdp *)physical;
offsetof(struct acpi_20_rsdp, extended_checksum),
sizeof(struct acpi_20_rsdp));
+ memset(acpi_info, 0, sizeof(*acpi_info));
+ acpi_info->com1_present = uart_exists(0x3f8);
+ acpi_info->com2_present = uart_exists(0x2f8);
+ acpi_info->lpt1_present = lpt_exists(0x378);
+ acpi_info->hpet_present = hpet_exists(ACPI_HPET_ADDRESS);
+ acpi_info->pci_min = pci_mem_start;
+ acpi_info->pci_len = pci_mem_end - pci_mem_start;
+
return;
oom:
static void rombios_setup_bios_info(void)
{
- struct bios_info *bios_info;
-
- bios_info = (struct bios_info *)BIOS_INFO_PHYSICAL_ADDRESS;
- memset(bios_info, 0, sizeof(*bios_info));
- bios_info->com1_present = uart_exists(0x3f8);
- bios_info->com2_present = uart_exists(0x2f8);
- bios_info->lpt1_present = lpt_exists(0x378);
- bios_info->hpet_present = hpet_exists(ACPI_HPET_ADDRESS);
- bios_info->madt_csum_addr = madt_csum_addr;
- bios_info->madt_lapic0_addr = madt_lapic0_addr;
+ struct rombios_info *info;
+
+ info = (struct rombios_info *)BIOS_INFO_PHYSICAL_ADDRESS;
+ memset(info, 0, sizeof(*info));
}
static void rombios_relocate(void)
{
uint32_t bioshigh;
- struct bios_info *bios_info;
+ struct rombios_info *info;
bioshigh = rombios_highbios_setup();
- bios_info = (struct bios_info *)BIOS_INFO_PHYSICAL_ADDRESS;
- bios_info->bios32_entry = bioshigh;
-}
-
-static void rombios_finish_bios_info(void)
-{
- struct bios_info *bios_info;
-
- bios_info = (struct bios_info *)BIOS_INFO_PHYSICAL_ADDRESS;
- bios_info->pci_min = pci_mem_start;
- bios_info->pci_len = pci_mem_end - pci_mem_start;
+ info = (struct rombios_info *)BIOS_INFO_PHYSICAL_ADDRESS;
+ info->bios32_entry = bioshigh;
}
/*
.optionrom_end = OPTIONROM_PHYSICAL_END,
.bios_info_setup = rombios_setup_bios_info,
- .bios_info_finish = rombios_finish_bios_info,
+ .bios_info_finish = NULL,
.bios_relocate = rombios_relocate,
#define PFFLAG_ROM_LOCK 1 /* Sets whether ROM memory area is RW or RO */
/* Located at BIOS_INFO_PHYSICAL_ADDRESS. */
-struct bios_info {
- uint8_t com1_present:1; /* 0[0] - System has COM1? */
- uint8_t com2_present:1; /* 0[1] - System has COM2? */
- uint8_t lpt1_present:1; /* 0[2] - System has LPT1? */
- uint8_t hpet_present:1; /* 0[3] - System has HPET? */
- uint32_t pci_min, pci_len; /* 4, 8 - PCI I/O hole boundaries */
- uint32_t madt_csum_addr; /* 12 - Address of MADT checksum */
- uint32_t madt_lapic0_addr; /* 16 - Address of first MADT LAPIC struct */
- uint32_t bios32_entry; /* 20 - Entry point for 32-bit BIOS */
+struct rombios_info {
+ uint32_t bios32_entry; /* 0 - Entry point for 32-bit BIOS */
};
-#define BIOSINFO_OFF_bios32_entry 20
+#define BIOSINFO_OFF_bios32_entry 0
#endif