Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/bhyve/acpi.c
Show First 20 Lines • Show All 128 Lines • ▼ Show 20 Lines | |||||
/* | /* | ||||
* State for dsdt_line(), dsdt_indent(), and dsdt_unindent(). | * State for dsdt_line(), dsdt_indent(), and dsdt_unindent(). | ||||
*/ | */ | ||||
static FILE *dsdt_fp; | static FILE *dsdt_fp; | ||||
static int dsdt_indent_level; | static int dsdt_indent_level; | ||||
static int dsdt_error; | static int dsdt_error; | ||||
static struct basl_table *rsdt; | |||||
markj: `static`? | |||||
static struct basl_table *xsdt; | static struct basl_table *xsdt; | ||||
struct basl_fio { | struct basl_fio { | ||||
int fd; | int fd; | ||||
FILE *fp; | FILE *fp; | ||||
char f_name[MAXPATHLEN]; | char f_name[MAXPATHLEN]; | ||||
}; | }; | ||||
Show All 24 Lines | basl_fwrite_rsdp(FILE *fp) | ||||
EFFLUSH(fp); | EFFLUSH(fp); | ||||
return (0); | return (0); | ||||
err_exit: | err_exit: | ||||
return (errno); | return (errno); | ||||
} | } | ||||
static int | |||||
basl_fwrite_rsdt(FILE *fp) | |||||
{ | |||||
EFPRINTF(fp, "/*\n"); | |||||
EFPRINTF(fp, " * bhyve RSDT template\n"); | |||||
EFPRINTF(fp, " */\n"); | |||||
EFPRINTF(fp, "[0004]\t\tSignature : \"RSDT\"\n"); | |||||
EFPRINTF(fp, "[0004]\t\tTable Length : 00000000\n"); | |||||
EFPRINTF(fp, "[0001]\t\tRevision : 01\n"); | |||||
EFPRINTF(fp, "[0001]\t\tChecksum : 00\n"); | |||||
EFPRINTF(fp, "[0006]\t\tOem ID : \"BHYVE \"\n"); | |||||
EFPRINTF(fp, "[0008]\t\tOem Table ID : \"BVRSDT \"\n"); | |||||
EFPRINTF(fp, "[0004]\t\tOem Revision : 00000001\n"); | |||||
/* iasl will fill in the compiler ID/revision fields */ | |||||
EFPRINTF(fp, "[0004]\t\tAsl Compiler ID : \"xxxx\"\n"); | |||||
EFPRINTF(fp, "[0004]\t\tAsl Compiler Revision : 00000000\n"); | |||||
EFPRINTF(fp, "\n"); | |||||
/* Add in pointers to the MADT, FADT and HPET */ | |||||
EFPRINTF(fp, "[0004]\t\tACPI Table Address 0 : %08X\n", | |||||
basl_acpi_base + MADT_OFFSET); | |||||
EFPRINTF(fp, "[0004]\t\tACPI Table Address 1 : %08X\n", | |||||
basl_acpi_base + FADT_OFFSET); | |||||
EFPRINTF(fp, "[0004]\t\tACPI Table Address 2 : %08X\n", | |||||
basl_acpi_base + HPET_OFFSET); | |||||
EFPRINTF(fp, "[0004]\t\tACPI Table Address 3 : %08X\n", | |||||
basl_acpi_base + MCFG_OFFSET); | |||||
EFFLUSH(fp); | |||||
return (0); | |||||
err_exit: | |||||
return (errno); | |||||
} | |||||
/* | /* | ||||
* Helper routines for writing to the DSDT from other modules. | * Helper routines for writing to the DSDT from other modules. | ||||
*/ | */ | ||||
void | void | ||||
dsdt_line(const char *fmt, ...) | dsdt_line(const char *fmt, ...) | ||||
{ | { | ||||
va_list ap; | va_list ap; | ||||
▲ Show 20 Lines • Show All 382 Lines • ▼ Show 20 Lines | BASL_EXEC(basl_table_add_pointer(table, ACPI_SIG_FACS, | ||||
offsetof(ACPI_TABLE_FADT, Facs), sizeof(fadt.Facs))); | offsetof(ACPI_TABLE_FADT, Facs), sizeof(fadt.Facs))); | ||||
BASL_EXEC(basl_table_add_pointer(table, ACPI_SIG_DSDT, | BASL_EXEC(basl_table_add_pointer(table, ACPI_SIG_DSDT, | ||||
offsetof(ACPI_TABLE_FADT, Dsdt), sizeof(fadt.Dsdt))); | offsetof(ACPI_TABLE_FADT, Dsdt), sizeof(fadt.Dsdt))); | ||||
BASL_EXEC(basl_table_add_pointer(table, ACPI_SIG_FACS, | BASL_EXEC(basl_table_add_pointer(table, ACPI_SIG_FACS, | ||||
offsetof(ACPI_TABLE_FADT, XFacs), sizeof(fadt.XFacs))); | offsetof(ACPI_TABLE_FADT, XFacs), sizeof(fadt.XFacs))); | ||||
BASL_EXEC(basl_table_add_pointer(table, ACPI_SIG_DSDT, | BASL_EXEC(basl_table_add_pointer(table, ACPI_SIG_DSDT, | ||||
offsetof(ACPI_TABLE_FADT, XDsdt), sizeof(fadt.XDsdt))); | offsetof(ACPI_TABLE_FADT, XDsdt), sizeof(fadt.XDsdt))); | ||||
BASL_EXEC(basl_table_append_pointer(rsdt, ACPI_SIG_FADT, | |||||
ACPI_RSDT_ENTRY_SIZE)); | |||||
BASL_EXEC(basl_table_append_pointer(xsdt, ACPI_SIG_FADT, | BASL_EXEC(basl_table_append_pointer(xsdt, ACPI_SIG_FADT, | ||||
ACPI_XSDT_ENTRY_SIZE)); | ACPI_XSDT_ENTRY_SIZE)); | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
build_hpet(struct vmctx *const ctx) | build_hpet(struct vmctx *const ctx) | ||||
{ | { | ||||
ACPI_TABLE_HPET hpet; | ACPI_TABLE_HPET hpet; | ||||
struct basl_table *table; | struct basl_table *table; | ||||
BASL_EXEC(basl_table_create(&table, ctx, ACPI_SIG_HPET, | BASL_EXEC(basl_table_create(&table, ctx, ACPI_SIG_HPET, | ||||
BASL_TABLE_ALIGNMENT, HPET_OFFSET)); | BASL_TABLE_ALIGNMENT, HPET_OFFSET)); | ||||
memset(&hpet, 0, sizeof(hpet)); | memset(&hpet, 0, sizeof(hpet)); | ||||
BASL_EXEC(basl_table_append_header(table, ACPI_SIG_HPET, 1, 1)); | BASL_EXEC(basl_table_append_header(table, ACPI_SIG_HPET, 1, 1)); | ||||
hpet.Id = htole32(hpet_capabilities); | hpet.Id = htole32(hpet_capabilities); | ||||
basl_fill_gas(&hpet.Address, ACPI_ADR_SPACE_SYSTEM_MEMORY, 0, 0, | basl_fill_gas(&hpet.Address, ACPI_ADR_SPACE_SYSTEM_MEMORY, 0, 0, | ||||
ACPI_GAS_ACCESS_WIDTH_LEGACY, BHYVE_ADDRESS_HPET); | ACPI_GAS_ACCESS_WIDTH_LEGACY, BHYVE_ADDRESS_HPET); | ||||
hpet.Flags = ACPI_HPET_PAGE_PROTECT4; | hpet.Flags = ACPI_HPET_PAGE_PROTECT4; | ||||
BASL_EXEC(basl_table_append_content(table, &hpet, sizeof(hpet))); | BASL_EXEC(basl_table_append_content(table, &hpet, sizeof(hpet))); | ||||
BASL_EXEC(basl_table_append_pointer(rsdt, ACPI_SIG_HPET, | |||||
ACPI_RSDT_ENTRY_SIZE)); | |||||
BASL_EXEC(basl_table_append_pointer(xsdt, ACPI_SIG_HPET, | BASL_EXEC(basl_table_append_pointer(xsdt, ACPI_SIG_HPET, | ||||
ACPI_XSDT_ENTRY_SIZE)); | ACPI_XSDT_ENTRY_SIZE)); | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
build_madt(struct vmctx *const ctx) | build_madt(struct vmctx *const ctx) | ||||
▲ Show 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | build_madt(struct vmctx *const ctx) | ||||
madt_lapic_nmi.Header.Length = sizeof(madt_lapic_nmi); | madt_lapic_nmi.Header.Length = sizeof(madt_lapic_nmi); | ||||
madt_lapic_nmi.ProcessorId = 0xFF; | madt_lapic_nmi.ProcessorId = 0xFF; | ||||
madt_lapic_nmi.IntiFlags = htole16( | madt_lapic_nmi.IntiFlags = htole16( | ||||
ACPI_MADT_POLARITY_ACTIVE_HIGH | ACPI_MADT_TRIGGER_EDGE); | ACPI_MADT_POLARITY_ACTIVE_HIGH | ACPI_MADT_TRIGGER_EDGE); | ||||
madt_lapic_nmi.Lint = 1; | madt_lapic_nmi.Lint = 1; | ||||
BASL_EXEC(basl_table_append_bytes(table, &madt_lapic_nmi, | BASL_EXEC(basl_table_append_bytes(table, &madt_lapic_nmi, | ||||
sizeof(madt_lapic_nmi))); | sizeof(madt_lapic_nmi))); | ||||
BASL_EXEC(basl_table_append_pointer(rsdt, ACPI_SIG_MADT, | |||||
ACPI_RSDT_ENTRY_SIZE)); | |||||
BASL_EXEC(basl_table_append_pointer(xsdt, ACPI_SIG_MADT, | BASL_EXEC(basl_table_append_pointer(xsdt, ACPI_SIG_MADT, | ||||
ACPI_XSDT_ENTRY_SIZE)); | ACPI_XSDT_ENTRY_SIZE)); | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
build_mcfg(struct vmctx *const ctx) | build_mcfg(struct vmctx *const ctx) | ||||
Show All 10 Lines | build_mcfg(struct vmctx *const ctx) | ||||
BASL_EXEC(basl_table_append_content(table, &mcfg, sizeof(mcfg))); | BASL_EXEC(basl_table_append_content(table, &mcfg, sizeof(mcfg))); | ||||
memset(&mcfg_allocation, 0, sizeof(mcfg_allocation)); | memset(&mcfg_allocation, 0, sizeof(mcfg_allocation)); | ||||
mcfg_allocation.Address = htole64(pci_ecfg_base()); | mcfg_allocation.Address = htole64(pci_ecfg_base()); | ||||
mcfg_allocation.EndBusNumber = 0xFF; | mcfg_allocation.EndBusNumber = 0xFF; | ||||
BASL_EXEC(basl_table_append_bytes(table, &mcfg_allocation, | BASL_EXEC(basl_table_append_bytes(table, &mcfg_allocation, | ||||
sizeof(mcfg_allocation))); | sizeof(mcfg_allocation))); | ||||
BASL_EXEC(basl_table_append_pointer(rsdt, ACPI_SIG_MCFG, | |||||
ACPI_RSDT_ENTRY_SIZE)); | |||||
BASL_EXEC(basl_table_append_pointer(xsdt, ACPI_SIG_MCFG, | BASL_EXEC(basl_table_append_pointer(xsdt, ACPI_SIG_MCFG, | ||||
ACPI_XSDT_ENTRY_SIZE)); | ACPI_XSDT_ENTRY_SIZE)); | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
build_rsdt(struct vmctx *const ctx) | |||||
{ | |||||
BASL_EXEC(basl_table_create(&rsdt, ctx, ACPI_SIG_RSDT, | |||||
BASL_TABLE_ALIGNMENT, RSDT_OFFSET)); | |||||
/* Header */ | |||||
BASL_EXEC(basl_table_append_header(rsdt, ACPI_SIG_RSDT, 1, 1)); | |||||
/* Pointers (added by other build_XXX funcs) */ | |||||
return (0); | |||||
} | |||||
static int | |||||
build_xsdt(struct vmctx *const ctx) | build_xsdt(struct vmctx *const ctx) | ||||
{ | { | ||||
BASL_EXEC(basl_table_create(&xsdt, ctx, ACPI_SIG_XSDT, | BASL_EXEC(basl_table_create(&xsdt, ctx, ACPI_SIG_XSDT, | ||||
BASL_TABLE_ALIGNMENT, XSDT_OFFSET)); | BASL_TABLE_ALIGNMENT, XSDT_OFFSET)); | ||||
/* Header */ | /* Header */ | ||||
BASL_EXEC(basl_table_append_header(xsdt, ACPI_SIG_XSDT, 1, 1)); | BASL_EXEC(basl_table_append_header(xsdt, ACPI_SIG_XSDT, 1, 1)); | ||||
/* Pointers (added by other build_XXX funcs) */ | /* Pointers (added by other build_XXX funcs) */ | ||||
Show All 34 Lines | acpi_build(struct vmctx *ctx, int ncpu) | ||||
* Run through all the ASL files, compiling them and | * Run through all the ASL files, compiling them and | ||||
* copying them into guest memory | * copying them into guest memory | ||||
* | * | ||||
* According to UEFI Specification v6.3 chapter 5.1 the FADT should be | * According to UEFI Specification v6.3 chapter 5.1 the FADT should be | ||||
* the first table pointed to by XSDT. For that reason, build it as the | * the first table pointed to by XSDT. For that reason, build it as the | ||||
* first table after XSDT. | * first table after XSDT. | ||||
*/ | */ | ||||
BASL_EXEC(basl_compile(ctx, basl_fwrite_rsdp, 0)); | BASL_EXEC(basl_compile(ctx, basl_fwrite_rsdp, 0)); | ||||
BASL_EXEC(basl_compile(ctx, basl_fwrite_rsdt, RSDT_OFFSET)); | BASL_EXEC(build_rsdt(ctx)); | ||||
BASL_EXEC(build_xsdt(ctx)); | BASL_EXEC(build_xsdt(ctx)); | ||||
BASL_EXEC(build_fadt(ctx)); | BASL_EXEC(build_fadt(ctx)); | ||||
BASL_EXEC(build_madt(ctx)); | BASL_EXEC(build_madt(ctx)); | ||||
BASL_EXEC(build_hpet(ctx)); | BASL_EXEC(build_hpet(ctx)); | ||||
BASL_EXEC(build_mcfg(ctx)); | BASL_EXEC(build_mcfg(ctx)); | ||||
BASL_EXEC(build_facs(ctx)); | BASL_EXEC(build_facs(ctx)); | ||||
BASL_EXEC(build_dsdt(ctx)); | BASL_EXEC(build_dsdt(ctx)); | ||||
BASL_EXEC(basl_finish()); | BASL_EXEC(basl_finish()); | ||||
return (0); | return (0); | ||||
} | } |
static?