Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Nov 2022 07:28:05 GMT
From:      =?utf-8?Q?Corvin=20K=C3=B6hne?= <corvink@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 22a2e94f3805 - main - bhyve: use basl to load ACPI tables
Message-ID:  <202211150728.2AF7S58t046691@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by corvink:

URL: https://cgit.FreeBSD.org/src/commit/?id=22a2e94f3805195bf8195c81f7fda4157ebae372

commit 22a2e94f3805195bf8195c81f7fda4157ebae372
Author:     Corvin Köhne <corvink@FreeBSD.org>
AuthorDate: 2022-11-04 11:30:37 +0000
Commit:     Corvin Köhne <corvink@FreeBSD.org>
CommitDate: 2022-11-15 07:27:06 +0000

    bhyve: use basl to load ACPI tables
    
    Load the blobs compiled by iasl into a basl_table. The basl_table is a
    temporary buffer which copies the ACPI tables into guest memory for us.
    This allows us in the future to pass the blobs over the qemu fwcfg
    interface to the guest.
    
    Reviewed by:            jhb, markj
    Approved by:            manu (mentor)
    MFC after:              2 weeks
    Sponsored by:           Beckhoff Automation GmbH & Co. KG
    Differential Revision:  https://reviews.freebsd.org/D36986
---
 usr.sbin/bhyve/acpi.c | 52 +++++++++++++++++++++++++++------------------------
 1 file changed, 28 insertions(+), 24 deletions(-)

diff --git a/usr.sbin/bhyve/acpi.c b/usr.sbin/bhyve/acpi.c
index 55c8c9cb35fc..e823d2d41357 100644
--- a/usr.sbin/bhyve/acpi.c
+++ b/usr.sbin/bhyve/acpi.c
@@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/errno.h>
 #include <sys/stat.h>
 
+#include <err.h>
 #include <paths.h>
 #include <stdarg.h>
 #include <stdio.h>
@@ -838,18 +839,26 @@ static int
 basl_load(struct vmctx *ctx, int fd, uint64_t off)
 {
 	struct stat sb;
-	void *gaddr;
+	void *addr;
 
 	if (fstat(fd, &sb) < 0)
 		return (errno);
 
-	gaddr = paddr_guest2host(ctx, basl_acpi_base + off, sb.st_size);
-	if (gaddr == NULL)
+	addr = calloc(1, sb.st_size);
+	if (addr == NULL)
 		return (EFAULT);
 
-	if (read(fd, gaddr, sb.st_size) < 0)
+	if (read(fd, addr, sb.st_size) < 0)
 		return (errno);
 
+	struct basl_table *table;
+
+	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_append_bytes(table, addr, sb.st_size));
+
 	return (0);
 }
 
@@ -968,30 +977,25 @@ acpi_build(struct vmctx *ctx, int ncpu)
 	if (getenv("BHYVE_ACPI_KEEPTMPS"))
 		basl_keep_temps = 1;
 
-	err = basl_make_templates();
+	BASL_EXEC(basl_init());
+
+	BASL_EXEC(basl_make_templates());
 
 	/*
 	 * Run through all the ASL files, compiling them and
 	 * copying them into guest memory
 	 */
-	if (err == 0)
-		err = basl_compile(ctx, basl_fwrite_rsdp, 0);
-	if (err == 0)
-		err = basl_compile(ctx, basl_fwrite_rsdt, RSDT_OFFSET);
-	if (err == 0)
-		err = basl_compile(ctx, basl_fwrite_xsdt, XSDT_OFFSET);
-	if (err == 0)
-		err = basl_compile(ctx, basl_fwrite_madt, MADT_OFFSET);
-	if (err == 0)
-		err = basl_compile(ctx, basl_fwrite_fadt, FADT_OFFSET);
-	if (err == 0)
-		err = basl_compile(ctx, basl_fwrite_hpet, HPET_OFFSET);
-	if (err == 0)
-		err = basl_compile(ctx, basl_fwrite_mcfg, MCFG_OFFSET);
-	if (err == 0)
-		err = basl_compile(ctx, basl_fwrite_facs, FACS_OFFSET);
-	if (err == 0)
-		err = basl_compile(ctx, basl_fwrite_dsdt, DSDT_OFFSET);
+	BASL_EXEC(basl_compile(ctx, basl_fwrite_rsdp, 0));
+	BASL_EXEC(basl_compile(ctx, basl_fwrite_rsdt, RSDT_OFFSET));
+	BASL_EXEC(basl_compile(ctx, basl_fwrite_xsdt, XSDT_OFFSET));
+	BASL_EXEC(basl_compile(ctx, basl_fwrite_madt, MADT_OFFSET));
+	BASL_EXEC(basl_compile(ctx, basl_fwrite_fadt, FADT_OFFSET));
+	BASL_EXEC(basl_compile(ctx, basl_fwrite_hpet, HPET_OFFSET));
+	BASL_EXEC(basl_compile(ctx, basl_fwrite_mcfg, MCFG_OFFSET));
+	BASL_EXEC(basl_compile(ctx, basl_fwrite_facs, FACS_OFFSET));
+	BASL_EXEC(basl_compile(ctx, basl_fwrite_dsdt, DSDT_OFFSET));
+
+	BASL_EXEC(basl_finish());
 
-	return (err);
+	return (0);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202211150728.2AF7S58t046691>