/* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefField */ Aml *aml_field(const char *name, AmlFieldFlags flags) { Aml *var = aml_bundle(0x81 /* FieldOp */, AML_EXT_PACKAGE); build_append_namestring(var->buf, "%s", name); build_append_byte(var->buf, flags); return var; }
/* * 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); assert(strlen(uuid) == 36); assert(uuid[8] == '-'); assert(uuid[13] == '-'); assert(uuid[18] == '-'); assert(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; }
/* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefMethod */ Aml *aml_method(const char *name, int arg_count) { Aml *var = aml_bundle(0x14 /* MethodOp */, AML_PACKAGE); build_append_namestring(var->buf, "%s", name); build_append_byte(var->buf, arg_count); /* MethodFlags: ArgCount */ return var; }
/* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefDevice */ Aml *aml_device(const char *name_format, ...) { va_list ap; Aml *var = aml_bundle(0x82 /* DeviceOp */, AML_EXT_PACKAGE); va_start(ap, name_format); build_append_namestringv(var->buf, name_format, ap); va_end(ap); return var; }
/* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefField */ Aml *aml_field(const char *name, AmlAccessType type, AmlLockRule lock, AmlUpdateRule rule) { Aml *var = aml_bundle(0x81 /* FieldOp */, AML_EXT_PACKAGE); uint8_t flags = rule << 5 | type; flags |= lock << 4; /* LockRule at 4 bit offset */ build_append_namestring(var->buf, "%s", name); build_append_byte(var->buf, flags); return var; }
/* * ACPI 2.0b: 16.2.3.6.4.3 Unicode Macro (Convert Ascii String To Unicode) */ Aml *aml_unicode(const char *str) { int i = 0; Aml *var = aml_bundle(0x11 /* BufferOp */, AML_BUFFER); do { build_append_byte(var->buf, str[i]); build_append_byte(var->buf, 0); i++; } while (i <= strlen(str)); return var; }
/* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefProcessor */ Aml *aml_processor(uint8_t proc_id, uint32_t pblk_addr, uint8_t pblk_len, const char *name_format, ...) { va_list ap; Aml *var = aml_bundle(0x83 /* ProcessorOp */, AML_EXT_PACKAGE); va_start(ap, name_format); build_append_namestringv(var->buf, name_format, ap); va_end(ap); build_append_byte(var->buf, proc_id); /* ProcID */ build_append_int_noprefix(var->buf, pblk_addr, sizeof(pblk_addr)); build_append_byte(var->buf, pblk_len); /* PblkLen */ return var; }
/* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefBuffer * Pass byte_list as NULL to request uninitialized buffer to reserve space. */ Aml *aml_buffer(int buffer_size, uint8_t *byte_list) { int i; Aml *var = aml_bundle(0x11 /* BufferOp */, AML_BUFFER); for (i = 0; i < buffer_size; i++) { if (byte_list == NULL) { build_append_byte(var->buf, 0x0); } else { build_append_byte(var->buf, byte_list[i]); } } return var; }
/* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefMethod */ Aml *aml_method(const char *name, int arg_count, AmlSerializeFlag sflag) { Aml *var = aml_bundle(0x14 /* MethodOp */, AML_PACKAGE); int methodflags; /* * MethodFlags: * bit 0-2: ArgCount (0-7) * bit 3: SerializeFlag * 0: NotSerialized * 1: Serialized * bit 4-7: reserved (must be 0) */ assert(arg_count < 8); methodflags = arg_count | (sflag << 3); build_append_namestring(var->buf, "%s", name); build_append_byte(var->buf, methodflags); /* MethodFlags: ArgCount */ return var; }
/* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefPackage */ Aml *aml_package(uint8_t num_elements) { Aml *var = aml_bundle(0x12 /* PackageOp */, AML_PACKAGE); build_append_byte(var->buf, num_elements); return var; }
/* ACPI 1.0b: 6.4.1 ASL Macros for Resource Descriptors */ Aml *aml_resource_template(void) { /* ResourceTemplate is a buffer of Resources with EndTag at the end */ Aml *var = aml_bundle(0x11 /* BufferOp */, AML_RES_TEMPLATE); return var; }
/* ACPI 1.0b: 16.2.5.3 Type 1 Opcodes Encoding: DefWhile */ Aml *aml_while(Aml *predicate) { Aml *var = aml_bundle(0xA2 /* WhileOp */, AML_PACKAGE); aml_append(var, predicate); return var; }
/* ACPI 1.0b: 16.2.5.3 Type 1 Opcodes Encoding: DefElse */ Aml *aml_else(void) { Aml *var = aml_bundle(0xA1 /* ElseOp */, AML_PACKAGE); return var; }
/* ACPI 1.0b: 16.2.5.3 Type 1 Opcodes Encoding: DefIfElse */ Aml *aml_if(Aml *predicate) { Aml *var = aml_bundle(0xA0 /* IfOp */, AML_PACKAGE); aml_append(var, predicate); return var; }
/* ACPI 2.0a: 17.2.2 Data Objects Encoding: DefVarPackage */ Aml *aml_varpackage(uint32_t num_elements) { Aml *var = aml_bundle(0x13 /* VarPackageOp */, AML_PACKAGE); build_append_int(var->buf, num_elements); return var; }
/* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefBuffer */ Aml *aml_buffer(void) { Aml *var = aml_bundle(0x11 /* BufferOp */, AML_BUFFER); return var; }