[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC XEN PATCH v4 33/41] tools/libacpi, hvmloader: detect QEMU fw_cfg interface
Add a function in libacpi to detect QEMU fw_cfg interface. Limit the usage of fw_cfg interface to hvmloader now, so use stub functions for others. Signed-off-by: Haozhong Zhang <haozhong.zhang@xxxxxxxxx> --- Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: George Dunlap <George.Dunlap@xxxxxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx> Cc: Tim Deegan <tim@xxxxxxx> Cc: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/firmware/hvmloader/Makefile | 3 +- tools/firmware/hvmloader/util.c | 3 ++ tools/libacpi/build.c | 1 + tools/libacpi/libacpi.h | 4 +++ tools/libacpi/qemu_fw_cfg.c | 66 +++++++++++++++++++++++++++++++++++++++ tools/libacpi/qemu_stub.c | 39 +++++++++++++++++++++++ tools/libxl/Makefile | 3 +- 7 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 tools/libacpi/qemu_fw_cfg.c create mode 100644 tools/libacpi/qemu_stub.c diff --git a/tools/firmware/hvmloader/Makefile b/tools/firmware/hvmloader/Makefile index a5b4c32c1a..53b99e2c28 100644 --- a/tools/firmware/hvmloader/Makefile +++ b/tools/firmware/hvmloader/Makefile @@ -76,11 +76,12 @@ smbios.o: CFLAGS += -D__SMBIOS_DATE__="\"$(SMBIOS_REL_DATE)\"" ACPI_PATH = ../../libacpi DSDT_FILES = dsdt_anycpu.c dsdt_15cpu.c dsdt_anycpu_qemu_xen.c -ACPI_OBJS = $(patsubst %.c,%.o,$(DSDT_FILES)) build.o static_tables.o +ACPI_OBJS = $(patsubst %.c,%.o,$(DSDT_FILES)) build.o static_tables.o qemu_fw_cfg.o $(ACPI_OBJS): CFLAGS += -I. -DLIBACPI_STDUTILS=\"$(CURDIR)/util.h\" CFLAGS += -I$(ACPI_PATH) vpath build.c $(ACPI_PATH) vpath static_tables.c $(ACPI_PATH) +vpath qemu_fw_cfg.c $(ACPI_PATH) OBJS += $(ACPI_OBJS) hvmloader: $(OBJS) diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index e4a37b3310..be4b64a379 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -979,6 +979,9 @@ void hvmloader_acpi_build_tables(struct acpi_config *config, if ( !strncmp(xenstore_read("platform/acpi_laptop_slate", "0"), "1", 1) ) config->table_flags |= ACPI_HAS_SSDT_LAPTOP_SLATE; + if ( fw_cfg_exists() ) + config->table_flags |= ACPI_HAS_QEMU_XEN; + config->table_flags |= (ACPI_HAS_TCPA | ACPI_HAS_IOAPIC | ACPI_HAS_WAET | ACPI_HAS_PMTIMER | ACPI_HAS_BUTTONS | ACPI_HAS_VGA | diff --git a/tools/libacpi/build.c b/tools/libacpi/build.c index f2185589f8..46051c46ac 100644 --- a/tools/libacpi/build.c +++ b/tools/libacpi/build.c @@ -531,6 +531,7 @@ static int construct_secondary_tables(struct acpi_ctxt *ctxt, nr_tables += construct_passthrough_tables(ctxt, table_ptrs, nr_tables, config); + table_ptrs[nr_tables] = 0; return nr_tables; } diff --git a/tools/libacpi/libacpi.h b/tools/libacpi/libacpi.h index 748a7e4a73..80403f04ab 100644 --- a/tools/libacpi/libacpi.h +++ b/tools/libacpi/libacpi.h @@ -20,6 +20,8 @@ #ifndef __LIBACPI_H__ #define __LIBACPI_H__ +#include <stdbool.h> + #define ACPI_HAS_COM1 (1<<0) #define ACPI_HAS_COM2 (1<<1) #define ACPI_HAS_LPT1 (1<<2) @@ -104,6 +106,8 @@ struct acpi_config { int acpi_build_tables(struct acpi_ctxt *ctxt, struct acpi_config *config); +bool fw_cfg_exists(void); + #endif /* __LIBACPI_H__ */ /* diff --git a/tools/libacpi/qemu_fw_cfg.c b/tools/libacpi/qemu_fw_cfg.c new file mode 100644 index 0000000000..254d2f575d --- /dev/null +++ b/tools/libacpi/qemu_fw_cfg.c @@ -0,0 +1,66 @@ +/* + * libacpi/qemu_fw_cfg.c + * + * Driver of QEMU fw_cfg interface. The reference document can be found at + * https://github.com/qemu/qemu/blob/master/docs/specs/fw_cfg.txt. + * + * Copyright (C) 2017, Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License, version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; If not, see <http://www.gnu.org/licenses/>. + */ + +#include LIBACPI_STDUTILS +#include "libacpi.h" + +/* QEMU fw_cfg I/O ports on x86 */ +#define FW_CFG_PORT_SEL 0x510 +#define FW_CFG_PORT_DATA 0x511 + +/* QEMU fw_cfg entries */ +#define FW_CFG_SIGNATURE 0x0000 + +static inline void fw_cfg_select(uint16_t entry) +{ + outw(FW_CFG_PORT_SEL, entry); +} + +static inline void fw_cfg_read(void *buf, uint32_t len) +{ + while ( len-- ) + *(uint8_t *)(buf++) = inb(FW_CFG_PORT_DATA); +} + +static void fw_cfg_read_entry(uint16_t entry, void *buf, uint32_t len) +{ + fw_cfg_select(entry); + fw_cfg_read(buf, len); +} + +bool fw_cfg_exists(void) +{ + uint32_t sig; + + fw_cfg_read_entry(FW_CFG_SIGNATURE, &sig, sizeof(sig)); + + return sig == 0x554d4551 /* "QEMU" */; +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/tools/libacpi/qemu_stub.c b/tools/libacpi/qemu_stub.c new file mode 100644 index 0000000000..6506de2d9c --- /dev/null +++ b/tools/libacpi/qemu_stub.c @@ -0,0 +1,39 @@ +/* + * libacpi/qemu_stub.c + * + * Stub functions of QEMU drivers. QEMU drivers are only used with + * HVMLoader now. Add stub functions to ensure libacpi can be compiled + * with others. + * + * Copyright (C) 2017, Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License, version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; If not, see <http://www.gnu.org/licenses/>. + */ + +#include LIBACPI_STDUTILS +#include "libacpi.h" + +bool fw_cfg_exists(void) +{ + return false; +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index a6f2dbd1cf..b6a8f662ed 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -78,11 +78,12 @@ endif ACPI_PATH = $(XEN_ROOT)/tools/libacpi DSDT_FILES-$(CONFIG_X86) = dsdt_pvh.c -ACPI_OBJS = $(patsubst %.c,%.o,$(DSDT_FILES-y)) build.o static_tables.o +ACPI_OBJS = $(patsubst %.c,%.o,$(DSDT_FILES-y)) build.o static_tables.o qemu_stub.o $(DSDT_FILES-y): acpi $(ACPI_OBJS): CFLAGS += -I. -DLIBACPI_STDUTILS=\"$(CURDIR)/libxl_x86_acpi.h\" vpath build.c $(ACPI_PATH)/ vpath static_tables.c $(ACPI_PATH)/ +vpath qemu_stub.c $(ACPI_PATH)/ LIBXL_OBJS-$(CONFIG_X86) += $(ACPI_OBJS) .PHONY: acpi -- 2.15.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |