aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/bhyve/acpi.c32
-rw-r--r--usr.sbin/bhyve/basl.h23
2 files changed, 55 insertions, 0 deletions
diff --git a/usr.sbin/bhyve/acpi.c b/usr.sbin/bhyve/acpi.c
index 30b0a814c9d5..6cfd4462526a 100644
--- a/usr.sbin/bhyve/acpi.c
+++ b/usr.sbin/bhyve/acpi.c
@@ -693,6 +693,37 @@ build_rsdt(struct vmctx *const ctx)
}
static int
+build_spcr(struct vmctx *const ctx)
+{
+ ACPI_TABLE_SPCR spcr;
+ struct basl_table *table;
+
+ BASL_EXEC(basl_table_create(&table, ctx, ACPI_SIG_SPCR,
+ BASL_TABLE_ALIGNMENT));
+
+ memset(&spcr, 0, sizeof(spcr));
+ BASL_EXEC(basl_table_append_header(table, ACPI_SIG_SPCR, 1, 1));
+ spcr.InterfaceType = ACPI_DBG2_16550_COMPATIBLE;
+ basl_fill_gas(&spcr.SerialPort, ACPI_ADR_SPACE_SYSTEM_IO, 8, 0,
+ ACPI_GAS_ACCESS_WIDTH_LEGACY, 0x3F8);
+ spcr.InterruptType = ACPI_SPCR_INTERRUPT_TYPE_8259;
+ spcr.PcInterrupt = 4;
+ spcr.BaudRate = ACPI_SPCR_BAUD_RATE_115200;
+ spcr.Parity = ACPI_SPCR_PARITY_NO_PARITY;
+ spcr.StopBits = ACPI_SPCR_STOP_BITS_1;
+ spcr.FlowControl = 3; /* RTS/CTS | DCD */
+ spcr.TerminalType = ACPI_SPCR_TERMINAL_TYPE_VT_UTF8;
+ BASL_EXEC(basl_table_append_content(table, &spcr, sizeof(spcr)));
+
+ BASL_EXEC(basl_table_append_pointer(rsdt, ACPI_SIG_SPCR,
+ ACPI_RSDT_ENTRY_SIZE));
+ BASL_EXEC(basl_table_append_pointer(xsdt, ACPI_SIG_SPCR,
+ ACPI_XSDT_ENTRY_SIZE));
+
+ return (0);
+}
+
+static int
build_xsdt(struct vmctx *const ctx)
{
BASL_EXEC(
@@ -749,6 +780,7 @@ acpi_build(struct vmctx *ctx, int ncpu)
BASL_EXEC(build_hpet(ctx));
BASL_EXEC(build_mcfg(ctx));
BASL_EXEC(build_facs(ctx));
+ BASL_EXEC(build_spcr(ctx));
BASL_EXEC(build_dsdt(ctx));
BASL_EXEC(basl_finish());
diff --git a/usr.sbin/bhyve/basl.h b/usr.sbin/bhyve/basl.h
index fba921a46882..c4d0d9d26c0d 100644
--- a/usr.sbin/bhyve/basl.h
+++ b/usr.sbin/bhyve/basl.h
@@ -15,6 +15,29 @@
#define ACPI_GAS_ACCESS_WIDTH_DWORD 3
#define ACPI_GAS_ACCESS_WIDTH_QWORD 4
+#define ACPI_SPCR_INTERRUPT_TYPE_8259 0x1
+#define ACPI_SPCR_INTERRUPT_TYPE_APIC 0x2
+#define ACPI_SPCR_INTERRUPT_TYPE_SAPIC 0x4
+#define ACPI_SPCR_INTERRUPT_TYPE_GIC 0x8
+
+#define ACPI_SPCR_BAUD_RATE_9600 3
+#define ACPI_SPCR_BAUD_RATE_19200 4
+#define ACPI_SPCR_BAUD_RATE_57600 6
+#define ACPI_SPCR_BAUD_RATE_115200 7
+
+#define ACPI_SPCR_PARITY_NO_PARITY 0
+
+#define ACPI_SPCR_STOP_BITS_1 1
+
+#define ACPI_SPCR_FLOW_CONTROL_DCD 0x1
+#define ACPI_SPCR_FLOW_CONTROL_RTS_CTS 0x2
+#define ACPI_SPCR_FLOW_CONTROL_XON_XOFF 0x4
+
+#define ACPI_SPCR_TERMINAL_TYPE_VT100 0
+#define ACPI_SPCR_TERMINAL_TYPE_VT100_PLUS 1
+#define ACPI_SPCR_TERMINAL_TYPE_VT_UTF8 2
+#define ACPI_SPCR_TERMINAL_TYPE_ANSI 3
+
#define BHYVE_ACPI_BASE 0xf2400
#define BASL_TABLE_ALIGNMENT 0x10