On Thu, 7 May 2015 17:29:16 +0800 Shannon Zhao <zhaoshengl...@huawei.com> wrote:
> From: Shannon Zhao <shannon.z...@linaro.org> > > Add ToUUID macro, this is useful for generating PCIe ACPI table. > > Signed-off-by: Shannon Zhao <zhaoshengl...@huawei.com> > Signed-off-by: Shannon Zhao <shannon.z...@linaro.org> Reviewed-by: Igor Mammedov <imamm...@redhat.com> > --- > hw/acpi/aml-build.c | 46 > +++++++++++++++++++++++++++++++++++++++++++++ > include/hw/acpi/aml-build.h | 1 + > 2 files changed, 47 insertions(+) > > diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c > index a38a536..d9c9876 100644 > --- a/hw/acpi/aml-build.c > +++ b/hw/acpi/aml-build.c > @@ -961,6 +961,52 @@ Aml *aml_qword_memory(AmlDecode dec, AmlMinFixed > min_fixed, > addr_trans, len, flags); > } > > +static uint8_t Hex2Byte(const char *src) > +{ > + int hi = Hex2Digit(*src++); > + int lo = Hex2Digit(*src); > + > + g_assert(((hi >= 0) && (hi <= 15)) && ((lo >= 0) && (lo <= 15))); > + return (hi << 4) | lo; > +} > + > +/* > + * ACPI 3.0: 17.5.124 ToUUID (Convert String to UUID Macro) > + * e.g. UUID: aabbccdd-eeff-gghh-iijj-kkllmmnnoopp > + * call aml_touuid("aabbccdd-eeff-gghh-iijj-kkllmmnnoopp"); > + */ > +Aml *aml_touuid(const char *uuid) > +{ > + Aml *var = aml_bundle(0x11 /* BufferOp */, AML_BUFFER); > + > + /* format: aabbccdd-eeff-gghh-iijj-kkllmmnnoopp */ > + g_assert((strlen(uuid) == 36) && (uuid[8] == '-') && (uuid[13] == '-') > + && (uuid[18] == '-') && (uuid[23] == '-')); > + > + build_append_byte(var->buf, Hex2Byte(uuid + 6)); /* dd - at offset 00 */ > + build_append_byte(var->buf, Hex2Byte(uuid + 4)); /* cc - at offset 01 */ > + build_append_byte(var->buf, Hex2Byte(uuid + 2)); /* bb - at offset 02 */ > + build_append_byte(var->buf, Hex2Byte(uuid + 0)); /* aa - at offset 03 */ > + > + build_append_byte(var->buf, Hex2Byte(uuid + 11)); /* ff - at offset 04 */ > + build_append_byte(var->buf, Hex2Byte(uuid + 9)); /* ee - at offset 05 */ > + > + build_append_byte(var->buf, Hex2Byte(uuid + 16)); /* hh - at offset 06 */ > + build_append_byte(var->buf, Hex2Byte(uuid + 14)); /* gg - at offset 07 */ > + > + build_append_byte(var->buf, Hex2Byte(uuid + 19)); /* ii - at offset 08 */ > + build_append_byte(var->buf, Hex2Byte(uuid + 21)); /* jj - at offset 09 */ > + > + build_append_byte(var->buf, Hex2Byte(uuid + 24)); /* kk - at offset 10 */ > + build_append_byte(var->buf, Hex2Byte(uuid + 26)); /* ll - at offset 11 */ > + build_append_byte(var->buf, Hex2Byte(uuid + 28)); /* mm - at offset 12 */ > + build_append_byte(var->buf, Hex2Byte(uuid + 30)); /* nn - at offset 13 */ > + build_append_byte(var->buf, Hex2Byte(uuid + 32)); /* oo - at offset 14 */ > + build_append_byte(var->buf, Hex2Byte(uuid + 34)); /* pp - at offset 15 */ > + > + return var; > +} > + > void > build_header(GArray *linker, GArray *table_data, > AcpiTableHeader *h, const char *sig, int len, uint8_t rev) > diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h > index 69d7813..7399f04 100644 > --- a/include/hw/acpi/aml-build.h > +++ b/include/hw/acpi/aml-build.h > @@ -259,6 +259,7 @@ Aml *aml_buffer(int buffer_size, uint8_t *byte_list); > Aml *aml_resource_template(void); > Aml *aml_field(const char *name, AmlFieldFlags flags); > Aml *aml_varpackage(uint32_t num_elements); > +Aml *aml_touuid(const char *uuid); > > void > build_header(GArray *linker, GArray *table_data,