void find_acpi_cpu_names(unsigned char* dsdt, int length) { int i; for (i=0; i<length-7; i++) { if (dsdt[i] == 0x5B && dsdt[i+1] == 0x83) // ProcessorOP { uint8_t offset = i+2+(dsdt[i+2] >> 6) + 1, j; bool add_name = true; for (j=0; j<4; j++) { char c = dsdt[offset+j]; if (!aml_isvalidchar(c)) { add_name = false; verbose("Invalid characters found in ProcessorOP!\n"); break; } } if (add_name && dsdt[offset+5] < 32 ) { acpi_cpu_name[acpi_cpu_count] = malloc(5); memcpy(acpi_cpu_name[acpi_cpu_count], dsdt+offset, 4); verbose("Found %c%c%c%c (from DSDT)\n", acpi_cpu_name[acpi_cpu_count][0], acpi_cpu_name[acpi_cpu_count][1], acpi_cpu_name[acpi_cpu_count][2], acpi_cpu_name[acpi_cpu_count][3]); if (++acpi_cpu_count == 32) return; } } }
void get_acpi_cpu_names(unsigned char* dsdt, uint32_t length) { uint32_t i; // DBG("start finding cpu names. length %d\n", length); for (i=0; i<length-7; i++) { if (dsdt[i] == 0x5B && dsdt[i+1] == 0x83) // ProcessorOP { // DBG("dsdt: %x%x\n", dsdt[i], dsdt[i+1]); uint32_t offset = i + 3 + (dsdt[i+2] >> 6); bool add_name = true; uint8_t j; for (j=0; j<4; j++) { char c = dsdt[offset+j]; if( c == '\\') { offset = i + 8 + (dsdt[i+7] >> 6); c = dsdt[offset+j]; } if (!aml_isvalidchar(c)) { add_name = false; verbose("Invalid character found in ProcessorOP 0x%x!\n", c); break; } } if (add_name) { acpi_cpu_name[acpi_cpu_count] = malloc(4); memcpy(acpi_cpu_name[acpi_cpu_count], dsdt+offset, 4); i = offset + 5; if (acpi_cpu_count == 0) { verbose("Found ACPI CPU: %c%c%c%c\n", acpi_cpu_name[acpi_cpu_count]); } else { verbose("And %c%c%c%c\n", acpi_cpu_name[acpi_cpu_count]); } if (++acpi_cpu_count == 32) break; } }
int aml_fill_simple_name(char* buffer, const char* name) { int i, len = strlen(name), count = 0; for (i = 0; i < 4; i++) { if (i < len && aml_isvalidchar(name[i])) { buffer[count++] = name[i]; } else { buffer[3-i] = '_'; } } return 4; }
void get_acpi_cpu_names(unsigned char* dsdt, uint32_t length) { uint32_t i; for (i=0; i<length-7; i++) { if (dsdt[i] == 0x5B && dsdt[i+1] == 0x83) // ProcessorOP { uint32_t offset = i + 3 + (dsdt[i+2] >> 6); bool add_name = true; uint8_t j; for (j=0; j<4; j++) { char c = dsdt[offset+j]; if (!aml_isvalidchar(c)) { add_name = false; verbose("Invalid character found in ProcessorOP 0x%x!\n", c); break; } } if (add_name) { acpi_cpu_name[acpi_cpu_count] = malloc(4); memcpy(acpi_cpu_name[acpi_cpu_count], dsdt+offset, 4); i = offset + 5; if (acpi_cpu_count == 0) acpi_cpu_p_blk = dsdt[i] | (dsdt[i+1] << 8); verbose("Found ACPI CPU: %c%c%c%c\n", acpi_cpu_name[acpi_cpu_count][0], acpi_cpu_name[acpi_cpu_count][1], acpi_cpu_name[acpi_cpu_count][2], acpi_cpu_name[acpi_cpu_count][3]); if (++acpi_cpu_count == 32) return; } } }
int aml_get_names_count(const char* name) { int i, len = strlen(name), count = 0; for (i = 0; i < len; i++) { if (name[i] == '.') { count++; } else if (!aml_isvalidchar(name[i])) { len = i; break; } } if (count == 0 && len > 0) count++; return count; }
int aml_fill_name(struct aml_chunk* node, const char* name) { if (!node) return -1; int i, len = strlen(name), count = 0; for (i = 0; i < len; i++) { if (name[i] == '.') { count++; } else if (!aml_isvalidchar(name[i])) { len = i; break; } } if (count == 0 && len > 0) count++; int offset = 0; if (count == 1) { node->Length = 4; node->Buffer = malloc(node->Length); aml_fill_simple_name(node->Buffer, name); return node->Length; } if (count == 2) { node->Length = 2 + 8; node->Buffer = malloc(node->Length); node->Buffer[offset++] = '\\'; // Root node->Buffer[offset++] = 0x2e; // Double name } else { node->Length = 3 + count*4; node->Buffer[offset++] = '\\'; // Root node->Buffer[offset++] = 0x2f; // Multi name node->Buffer[offset++] = count; // Names count } int j = 0; for (i = 0; i < count; i++) { while (name[j] != '.') { if (j < len) { j++; } else { verbose("aml_fill_name: unexpected end of names path!"); return -1; } } offset += aml_fill_simple_name(node->Buffer + offset, name + j); } return offset; }