On Thu, 29 Jan 2015 16:02:47 +0800 Shannon Zhao <zhaoshengl...@huawei.com> wrote:
> 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. I've tried to follow APCI spec for definition block here, which should be identical to build_header(). What exactly is not the same? > > > > 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, ...); > > > >