On 2015/1/22 22:50, Igor Mammedov wrote: > Signed-off-by: Igor Mammedov <imamm...@redhat.com> > --- > hw/acpi/acpi-build-utils.c | 47 > ++++++++++++++++++++++++++++++++++++++ > hw/i386/acpi-build.c | 1 - > include/hw/acpi/acpi-build-utils.h | 8 +++++++ > 3 files changed, 55 insertions(+), 1 deletion(-) > > diff --git a/hw/acpi/acpi-build-utils.c b/hw/acpi/acpi-build-utils.c > index b19d370..58f88cd 100644 > --- a/hw/acpi/acpi-build-utils.c > +++ b/hw/acpi/acpi-build-utils.c > @@ -26,6 +26,7 @@ > #include <string.h> > #include "hw/acpi/acpi-build-utils.h" > #include "qemu/bswap.h" > +#include "hw/acpi/bios-linker-loader.h" > > GArray *build_alloc_array(void) > { > @@ -312,6 +313,21 @@ void aml_append(AcpiAml *parent_ctx, AcpiAml child) > build_prepend_int(child.buf, child.buf->len); > build_package(child.buf, child.op); > break; > + case DEF_BLOCK: { > + uint8_t *start = (uint8_t *)parent_ctx->buf->data + > + parent_ctx->buf->len; > + uint32_t le32_len = cpu_to_le32(child.buf->len); > + > + /* create linker entry for the DefinitionBlock */ > + bios_linker_loader_add_checksum(parent_ctx->linker, > + ACPI_BUILD_TABLE_FILE, > + parent_ctx->buf->data, > + start, child.buf->len, start + 9 /* checksum offset */); > + > + /* set DefinitionBlock length at TableLength offset*/ > + memcpy(child.buf->data + 4, &le32_len, sizeof le32_len); > + break; > + } > default: > break; > } > @@ -843,3 +859,34 @@ AcpiAml acpi_qword_memory(acpiDecode dec, acpiMinFixed > min_fixed, > dec, addr_gran, addr_min, addr_max, > addr_trans, len, flags); > } > + > +/* ACPI 5.0: 20.2.1 Table and Table Header Encoding */ > +AcpiAml acpi_def_block(const char *signature, uint8_t revision, > + const char *oem_id, const char *oem_table_id, > + uint32_t oem_revision) > +{ > + int len; > + AcpiAml var = aml_allocate_internal(0, DEF_BLOCK); > + > + assert(strlen(signature) == 4); > + g_array_append_vals(var.buf, signature, 4); > + build_append_value(var.buf, 0, 4); /* Length place holder */ > + build_append_byte(var.buf, revision); > + build_append_byte(var.buf, 0); /* place holder for Checksum */ > + > + len = strlen(oem_id); > + assert(len <= 6); > + g_array_append_vals(var.buf, oem_id, len); > + g_array_append_vals(var.buf, "\0\0\0\0\0\0\0\0", 6 - len); > + > + len = strlen(oem_table_id); > + assert(len <= 8); > + g_array_append_vals(var.buf, oem_table_id, len); > + g_array_append_vals(var.buf, "\0\0\0\0\0\0\0\0", 8 - len); > + > + build_append_value(var.buf, oem_revision, 4); > + g_array_append_vals(var.buf, ACPI_BUILD_APPNAME4, 4); /* asl_compiler_id > */ > + build_append_value(var.buf, 1, 4); /* asl_compiler_revision */ > + > + return var; > +}
This function is similar with build_header() in hw/i386/acpi-build.c But the format of omt_id, oem_table_id, asl_compiler_id are not exactly same. Maybe we should make it consistent. > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index 4572c21..9ff8d72 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -270,7 +270,6 @@ static void acpi_get_pci_info(PcPciInfo *info) > #define ACPI_BUILD_APPNAME6 "BOCHS " > #define ACPI_BUILD_APPNAME4 "BXPC" > > -#define ACPI_BUILD_TABLE_FILE "etc/acpi/tables" > #define ACPI_BUILD_RSDP_FILE "etc/acpi/rsdp" > #define ACPI_BUILD_TPMLOG_FILE "etc/tpm/log" > > diff --git a/include/hw/acpi/acpi-build-utils.h > b/include/hw/acpi/acpi-build-utils.h > index 5e8db3d..868d439 100644 > --- a/include/hw/acpi/acpi-build-utils.h > +++ b/include/hw/acpi/acpi-build-utils.h > @@ -11,12 +11,17 @@ typedef enum { > EXT_PACKAGE, > BUFFER, > RES_TEMPLATE, > + DEF_BLOCK, > } AcpiBlockFlags; > > +#define ACPI_BUILD_TABLE_FILE "etc/acpi/tables" > +#define ACPI_BUILD_APPNAME4 "BXPC" > + > typedef struct AcpiAml { > GArray *buf; > uint8_t op; > AcpiBlockFlags block_flags; > + GArray *linker; > } AcpiAml; > > typedef enum { > @@ -146,6 +151,9 @@ AcpiAml acpi_qword_memory(acpiDecode dec, acpiMinFixed > min_fixed, > uint64_t len); > > /* Block ASL object primitives */ > +AcpiAml acpi_def_block(const char *signature, uint8_t revision, > + const char *oem_id, const char *oem_table_id, > + uint32_t oem_revision); > AcpiAml acpi_if(AcpiAml predicate); > AcpiAml acpi_method(const char *name, int arg_count); > AcpiAml GCC_FMT_ATTR(1, 2) acpi_scope(const char *name_format, ...); >