From nobody Mon Dec 5 07:42:09 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4NQb9G0v7Fz4jfM9; Mon, 5 Dec 2022 07:42:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4NQb9G0HCVz4GYR; Mon, 5 Dec 2022 07:42:10 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1670226130; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=cVcjzO6av0AvAv/jIIAWARBuxk7Q6UUfq4tGohwpdSM=; b=h+9XreFZjm5rhuTVVYQXRjJnZZCv/aEmXHwUTxbpraU9z3E+Kl0p37YUtGa2yA0RIdPTfd 94LfdRn7KTrQrFP+OAD5V5n+2AnCQ5m2is6IiiXs+z5ETZ+P0Je9HuQSW+RjKbZy09ZNwh frYUx1GVhRe1BqNZMcsFybuNM+qOemgg6d59ul5aT5Tdb5/X0s9gZVaDT+HzeuBTFfyLlN TkUCt15prkhqxJjwDoSWYeAEmUcR4gSCsXbGpR7ISBgcPnthb/o7PeU4LKsvUirX/+tyfw Jb3vRapyAsRx+vdaGglOBioEycN0QxBygkkkfM5nB+bNSEeXKEVKKgeX26dZ6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1670226130; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=cVcjzO6av0AvAv/jIIAWARBuxk7Q6UUfq4tGohwpdSM=; b=d9LmPXWi7Am6dZvaZ+s5hw3YXg2xpgXIPElJYrUFRzJbwAl9xDyHzdYhN1cENC/pSMDJiY hqQ28zbOZfKK9uGHf6QjfZh59N/9V0TDgdLqIocoCQkURpVxf4D0LTQggKmIFd21lnjL9G qPwMGn44g+RwVGmnYSdv839BtQZQOHUdvAdiIg0ENcAqlN4//OjYkjB+qWDTYJEBTfE+ny Er7AnUrWRS24N9F/CUM/3hQ+1rLS4CR/WD0NH4d6PjAQhG9I94EDHXFYLOjtB+emOoxYQY jO+pHg9kp7c48EqTEEo3+F+Zo1+mpyw9hHTReRDcgLAaNOiBltZ8lzDeIusksg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1670226130; a=rsa-sha256; cv=none; b=TSTrW8YGiMUdA5Jc39+sLVJELM7/0MFyxJZuOcVVJQggDCU0Xu0fLaDo9ixcniITIT65Dz Ulz2kuTaBk0dsI/cfscUTazDAw0lIAKNPZxHXX8nbSKGsa+IjUo6y/jsYjY1hQ6M7eSx0B Km/DT2TEX9Hv3vx1xnscT8AFlFduuyE9JgIFO7gH98gyhecxVifVRuFVwdOhPYhbuB6BbJ AtCUvw7Fckedccmw8NJ2m+gf64KxqlO3DobfQi+g9Vc9GnbuqdHC5L1jXlVGPheJ9H7MpP Uqo17kChlk0pfHUPqsqrJMPRQDAkbh4tixC9cNxWdWunv5SrceJ3Ng7L0Pq5ww== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4NQb9F6JlxzpVL; Mon, 5 Dec 2022 07:42:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 2B57g9CC084179; Mon, 5 Dec 2022 07:42:09 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 2B57g9rm084178; Mon, 5 Dec 2022 07:42:09 GMT (envelope-from git) Date: Mon, 5 Dec 2022 07:42:09 GMT Message-Id: <202212050742.2B57g9rm084178@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: =?utf-8?Q?Corvin=20K=C3=B6hne?= Subject: git: dd7b7807c32a - stable/13 - bhyve: use dynamic ACPI table offsets List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: corvink X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: dd7b7807c32a63e77074e573055c718725376c83 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by corvink: URL: https://cgit.FreeBSD.org/src/commit/?id=dd7b7807c32a63e77074e573055c718725376c83 commit dd7b7807c32a63e77074e573055c718725376c83 Author: Corvin Köhne AuthorDate: 2022-04-06 09:10:44 +0000 Commit: Corvin Köhne CommitDate: 2022-12-05 07:39:44 +0000 bhyve: use dynamic ACPI table offsets Now that all ACPI tables are build by basl, basl can dynamically calculate the offset for each table. Reviewed by: jhb, markj (older version) Approved by: manu (mentor) MFC after: 2 weeks Sponsored by: Beckhoff Automation GmbH & Co. KG Differential Revision: https://reviews.freebsd.org/D37002 (cherry picked from commit 67654ffd4424a55ab04091f0ccdf472516c140d8) --- usr.sbin/bhyve/acpi.c | 71 +++++++++++---------------------------------------- usr.sbin/bhyve/basl.c | 17 ++++++++---- usr.sbin/bhyve/basl.h | 2 +- 3 files changed, 28 insertions(+), 62 deletions(-) diff --git a/usr.sbin/bhyve/acpi.c b/usr.sbin/bhyve/acpi.c index 0f215d3f508a..30b0a814c9d5 100644 --- a/usr.sbin/bhyve/acpi.c +++ b/usr.sbin/bhyve/acpi.c @@ -36,20 +36,6 @@ * * The tables are placed in the guest's ROM area just below 1MB physical, * above the MPTable. - * - * Layout (No longer correct at FADT and beyond due to properly - * calculating the size of the MADT to allow for changes to - * VM_MAXCPU above 21 which overflows this layout.) - * ------ - * RSDP -> 0xf2400 (36 bytes fixed) - * RSDT -> 0xf2440 (36 bytes + 4*7 table addrs, 4 used) - * XSDT -> 0xf2480 (36 bytes + 8*7 table addrs, 4 used) - * MADT -> 0xf2500 (depends on #CPUs) - * FADT -> 0xf2600 (268 bytes) - * HPET -> 0xf2740 (56 bytes) - * MCFG -> 0xf2780 (60 bytes) - * FACS -> 0xf27C0 (64 bytes) - * DSDT -> 0xf2800 (variable - can go up to 0x100000) */ #include @@ -78,32 +64,6 @@ __FBSDID("$FreeBSD$"); #include "pci_emul.h" #include "vmgenc.h" -/* - * Define the base address of the ACPI tables, the sizes of some tables, - * and the offsets to the individual tables, - */ -#define RSDT_OFFSET 0x040 -#define XSDT_OFFSET 0x080 -#define MADT_OFFSET 0x100 -/* - * The MADT consists of: - * 44 Fixed Header - * 8 * maxcpu Processor Local APIC entries - * 12 I/O APIC entry - * 2 * 10 Interrupt Source Override entries - * 6 Local APIC NMI entry - */ -#define MADT_SIZE roundup2((44 + basl_ncpu*8 + 12 + 2*10 + 6), 0x100) -#define FADT_OFFSET (MADT_OFFSET + MADT_SIZE) -#define FADT_SIZE 0x140 -#define HPET_OFFSET (FADT_OFFSET + FADT_SIZE) -#define HPET_SIZE 0x40 -#define MCFG_OFFSET (HPET_OFFSET + HPET_SIZE) -#define MCFG_SIZE 0x40 -#define FACS_OFFSET (MCFG_OFFSET + MCFG_SIZE) -#define FACS_SIZE 0x40 -#define DSDT_OFFSET (FACS_OFFSET + FACS_SIZE) - #define BHYVE_ASL_TEMPLATE "bhyve.XXXXXXX" #define BHYVE_ASL_SUFFIX ".aml" #define BHYVE_ASL_COMPILER "/usr/sbin/iasl" @@ -334,7 +294,7 @@ basl_end(struct basl_fio *in, struct basl_fio *out) } static int -basl_load(struct vmctx *ctx, int fd, uint64_t off) +basl_load(struct vmctx *ctx, int fd) { struct stat sb; void *addr; @@ -353,15 +313,14 @@ basl_load(struct vmctx *ctx, int fd, uint64_t off) uint8_t name[ACPI_NAMESEG_SIZE + 1] = { 0 }; memcpy(name, addr, sizeof(name) - 1 /* last char is '\0' */); - BASL_EXEC( - basl_table_create(&table, ctx, name, BASL_TABLE_ALIGNMENT, off)); + BASL_EXEC(basl_table_create(&table, ctx, name, BASL_TABLE_ALIGNMENT)); BASL_EXEC(basl_table_append_bytes(table, addr, sb.st_size)); return (0); } static int -basl_compile(struct vmctx *ctx, int (*fwrite_section)(FILE *), uint64_t offset) +basl_compile(struct vmctx *ctx, int (*fwrite_section)(FILE *)) { struct basl_fio io[2]; static char iaslbuf[3*MAXPATHLEN + 10]; @@ -395,7 +354,7 @@ basl_compile(struct vmctx *ctx, int (*fwrite_section)(FILE *), uint64_t offset) * Copy the aml output file into guest * memory at the specified location */ - err = basl_load(ctx, io[1].fd, offset); + err = basl_load(ctx, io[1].fd); } } basl_end(&io[0], &io[1]); @@ -453,7 +412,7 @@ basl_make_templates(void) static int build_dsdt(struct vmctx *const ctx) { - BASL_EXEC(basl_compile(ctx, basl_fwrite_dsdt, DSDT_OFFSET)); + BASL_EXEC(basl_compile(ctx, basl_fwrite_dsdt)); return (0); } @@ -465,7 +424,7 @@ build_facs(struct vmctx *const ctx) struct basl_table *table; BASL_EXEC(basl_table_create(&table, ctx, ACPI_SIG_FACS, - BASL_TABLE_ALIGNMENT_FACS, FACS_OFFSET)); + BASL_TABLE_ALIGNMENT_FACS)); memset(&facs, 0, sizeof(facs)); memcpy(facs.Signature, ACPI_SIG_FACS, ACPI_NAMESEG_SIZE); @@ -483,7 +442,7 @@ build_fadt(struct vmctx *const ctx) struct basl_table *table; BASL_EXEC(basl_table_create(&table, ctx, ACPI_SIG_FADT, - BASL_TABLE_ALIGNMENT, FADT_OFFSET)); + BASL_TABLE_ALIGNMENT)); memset(&fadt, 0, sizeof(fadt)); BASL_EXEC(basl_table_append_header(table, ACPI_SIG_FADT, 5, 1)); @@ -559,7 +518,7 @@ build_hpet(struct vmctx *const ctx) struct basl_table *table; BASL_EXEC(basl_table_create(&table, ctx, ACPI_SIG_HPET, - BASL_TABLE_ALIGNMENT, HPET_OFFSET)); + BASL_TABLE_ALIGNMENT)); memset(&hpet, 0, sizeof(hpet)); BASL_EXEC(basl_table_append_header(table, ACPI_SIG_HPET, 1, 1)); @@ -588,7 +547,7 @@ build_madt(struct vmctx *const ctx) struct basl_table *table; BASL_EXEC(basl_table_create(&table, ctx, ACPI_SIG_MADT, - BASL_TABLE_ALIGNMENT, MADT_OFFSET)); + BASL_TABLE_ALIGNMENT)); memset(&madt, 0, sizeof(madt)); BASL_EXEC(basl_table_append_header(table, ACPI_SIG_MADT, 1, 1)); @@ -663,7 +622,7 @@ build_mcfg(struct vmctx *const ctx) struct basl_table *table; BASL_EXEC(basl_table_create(&table, ctx, ACPI_SIG_MCFG, - BASL_TABLE_ALIGNMENT, MCFG_OFFSET)); + BASL_TABLE_ALIGNMENT)); memset(&mcfg, 0, sizeof(mcfg)); BASL_EXEC(basl_table_append_header(table, ACPI_SIG_MCFG, 1, 1)); @@ -690,7 +649,7 @@ build_rsdp(struct vmctx *const ctx) struct basl_table *table; BASL_EXEC(basl_table_create(&table, ctx, ACPI_RSDP_NAME, - BASL_TABLE_ALIGNMENT, 0)); + BASL_TABLE_ALIGNMENT)); memset(&rsdp, 0, sizeof(rsdp)); memcpy(rsdp.Signature, ACPI_SIG_RSDP, 8); @@ -723,8 +682,8 @@ build_rsdp(struct vmctx *const ctx) static int build_rsdt(struct vmctx *const ctx) { - BASL_EXEC(basl_table_create(&rsdt, ctx, ACPI_SIG_RSDT, - BASL_TABLE_ALIGNMENT, RSDT_OFFSET)); + BASL_EXEC( + basl_table_create(&rsdt, ctx, ACPI_SIG_RSDT, BASL_TABLE_ALIGNMENT)); /* Header */ BASL_EXEC(basl_table_append_header(rsdt, ACPI_SIG_RSDT, 1, 1)); @@ -736,8 +695,8 @@ build_rsdt(struct vmctx *const ctx) static int build_xsdt(struct vmctx *const ctx) { - BASL_EXEC(basl_table_create(&xsdt, ctx, ACPI_SIG_XSDT, - BASL_TABLE_ALIGNMENT, XSDT_OFFSET)); + BASL_EXEC( + basl_table_create(&xsdt, ctx, ACPI_SIG_XSDT, BASL_TABLE_ALIGNMENT)); /* Header */ BASL_EXEC(basl_table_append_header(xsdt, ACPI_SIG_XSDT, 1, 1)); diff --git a/usr.sbin/bhyve/basl.c b/usr.sbin/bhyve/basl.c index afc8252cc0e2..57d13d89e271 100644 --- a/usr.sbin/bhyve/basl.c +++ b/usr.sbin/bhyve/basl.c @@ -137,10 +137,18 @@ basl_fill_gas(ACPI_GENERIC_ADDRESS *const gas, const uint8_t space_id, } static int -basl_finish_install_guest_tables(struct basl_table *const table) +basl_finish_install_guest_tables(struct basl_table *const table, uint32_t *const off) { void *gva; + table->off = roundup2(*off, table->alignment); + *off = table->off + table->len; + if (*off <= table->off) { + warnx("%s: invalid table length 0x%8x @ offset 0x%8x", __func__, + table->len, table->off); + return (EFAULT); + } + /* * Install ACPI tables directly in guest memory for use by guests which * do not boot via EFI. EFI ROMs provide a pointer to the firmware @@ -304,6 +312,7 @@ int basl_finish(void) { struct basl_table *table; + uint32_t off = 0; if (STAILQ_EMPTY(&basl_tables)) { warnx("%s: no ACPI tables found", __func__); @@ -317,7 +326,7 @@ basl_finish(void) */ STAILQ_FOREACH(table, &basl_tables, chain) { BASL_EXEC(basl_finish_set_length(table)); - BASL_EXEC(basl_finish_install_guest_tables(table)); + BASL_EXEC(basl_finish_install_guest_tables(table, &off)); } STAILQ_FOREACH(table, &basl_tables, chain) { BASL_EXEC(basl_finish_patch_pointers(table)); @@ -554,8 +563,7 @@ basl_table_append_pointer(struct basl_table *const table, int basl_table_create(struct basl_table **const table, struct vmctx *ctx, - const uint8_t *const name, const uint32_t alignment, - const uint32_t off) + const uint8_t *const name, const uint32_t alignment) { struct basl_table *new_table; @@ -573,7 +581,6 @@ basl_table_create(struct basl_table **const table, struct vmctx *ctx, "etc/acpi/%s", name); new_table->alignment = alignment; - new_table->off = off; STAILQ_INIT(&new_table->checksums); STAILQ_INIT(&new_table->lengths); diff --git a/usr.sbin/bhyve/basl.h b/usr.sbin/bhyve/basl.h index e3f0621a1f69..fba921a46882 100644 --- a/usr.sbin/bhyve/basl.h +++ b/usr.sbin/bhyve/basl.h @@ -67,4 +67,4 @@ int basl_table_append_length(struct basl_table *table, uint8_t size); int basl_table_append_pointer(struct basl_table *table, const uint8_t src_signature[ACPI_NAMESEG_SIZE], uint8_t size); int basl_table_create(struct basl_table **table, struct vmctx *ctx, - const uint8_t *name, uint32_t alignment, uint32_t off); + const uint8_t *name, uint32_t alignment);