static int version_test1(fwts_framework *fw) { char *str; fwts_release *release; release = fwts_release_get(); if (release) { bool not_ubuntu = strcmp(release->distributor, "Ubuntu"); fwts_release_free(release); /* Following is Ubuntu specific, so don't fail */ if (not_ubuntu) { fwts_skipped(fw, "Information not available with this kernel."); return FWTS_OK; } } if ((str = fwts_get("/proc/version_signature")) == NULL) fwts_skipped(fw, "Cannot get version signature info from " "/proc/version_signature"); else { fwts_chop_newline(str); fwts_log_info(fw, "Signature: %s", str); free(str); } fwts_infoonly(fw); return FWTS_OK; }
static int version_test3(fwts_framework *fw) { char *str; if ((str = fwts_get("/proc/cmdline")) == NULL) fwts_log_info(fw, "Cannot get version info from /proc/cmdline"); else { fwts_chop_newline(str); fwts_log_info(fw, "Kernel boot command line: %s", str); free(str); } fwts_infoonly(fw); return FWTS_OK; }
static int memory_mapdump_util(fwts_framework *fw) { fwts_list *memory_mapdump_memory_map_info; if ((memory_mapdump_memory_map_info = fwts_memory_map_table_load(fw)) == NULL) { fwts_log_warning(fw, "Cannot memory map table from /sys/firmware/memmap " "or kernel log."); return FWTS_ERROR; } fwts_memory_map_table_dump(fw, memory_mapdump_memory_map_info); fwts_memory_map_table_free(memory_mapdump_memory_map_info); fwts_infoonly(fw); return FWTS_OK; }
static int version_test4(fwts_framework *fw) { char *str; if (((str = fwts_get("/sys/module/acpi/parameters/acpica_version")) == NULL) && ((str = fwts_get("/proc/acpi/info")) == NULL)) fwts_log_info(fw, "Cannot get ACPI version info from " "/sys/module/acpi/parameters/acpica_version " "or /proc/acpi/info, system does not have ACPI."); else { fwts_chop_newline(str); fwts_log_info(fw, "ACPI Version: %s", str); free(str); } fwts_infoonly(fw); return FWTS_OK; }
static int romdump_test1(fwts_framework *fw) { uint8_t *mem; int i; if ((mem = fwts_mmap(BIOS_ROM_REGION_START, BIOS_ROM_REGION_SIZE)) == FWTS_MAP_FAILED) { fwts_log_error(fw, "Cannot mmap BIOS ROM region."); return FWTS_ERROR; } for (i = 0; i < BIOS_ROM_REGION_SIZE; i += 512) { /* Ensure we can safely read the memory */ if (fwts_safe_memread(mem + i, 512) != FWTS_OK) continue; if ((*(mem+i) == 0x55) && (*(mem+i+1) == 0xaa)) { int length = *(mem+i+2) << 9; fwts_log_info(fw, "Found ROM: %x..%x (%d bytes)", BIOS_ROM_REGION_START+i, BIOS_ROM_REGION_START+i+length, length); romdump_data(fw, mem+i, BIOS_ROM_REGION_START+i, length); fwts_log_nl(fw); } } fwts_log_info(fw, "BIOS ROM: %x..%x (%d bytes)", BIOS_ROM_START, BIOS_ROM_END, BIOS_ROM_SIZE); romdump_data(fw, mem+BIOS_ROM_OFFSET, BIOS_ROM_START, BIOS_ROM_SIZE); fwts_infoonly(fw); (void)fwts_munmap(mem, BIOS_ROM_REGION_SIZE); return FWTS_OK; }
static int ebdadump_test1(fwts_framework *fw) { off_t ebda_addr; uint8_t *mem; size_t len; if ((ebda_addr = fwts_ebda_get()) == FWTS_NO_EBDA) { fwts_log_error(fw, "Failed to local EBDA region."); return FWTS_ERROR; } len = BIOS_ROM_START - ebda_addr; if (ebda_addr > BIOS_ROM_START) { fwts_log_error(fw, "EBDA start address is greater than the " "BIOS ROM start address."); return FWTS_ERROR; } if ((mem = fwts_mmap(ebda_addr, len)) == FWTS_MAP_FAILED) { fwts_log_error(fw, "Cannot mmap BIOS ROM region."); return FWTS_ERROR; } fwts_log_info(fw, "EBDA region: %" PRIx32 "..%x (%zd bytes)", (uint32_t)ebda_addr, BIOS_ROM_START, len); ebdadump_data(fw, mem, ebda_addr, len); (void)fwts_munmap(mem, len); fwts_infoonly(fw); return FWTS_OK; }
static int acpidump_test1(fwts_framework *fw) { int i; fwts_infoonly(fw); if (fwts_iasl_init(fw) != FWTS_OK) { fwts_aborted(fw, "Failure to initialise iasl, aborting."); return FWTS_ERROR; } for (i = 0; i < ACPI_MAX_TABLES; i++) { fwts_acpi_table_info *table; fwts_list *output; char *provenance; if (fwts_acpi_get_table(fw, i, &table) != FWTS_OK) break; if (table == NULL) break; switch (table->provenance) { case FWTS_ACPI_TABLE_FROM_FILE: provenance = " (loaded from file)"; break; case FWTS_ACPI_TABLE_FROM_FIXUP: provenance = " (generated by fwts)"; break; default: provenance = ""; break; } fwts_log_info_verbatim(fw, "%s @ %lx (%zd bytes)%s", table->name, (unsigned long)table->addr, table->length, provenance); fwts_log_info_verbatim(fw, "----"); if (!strcmp(table->name, "RSDP")) { /* RSDP is a special case */ acpidump_rsdp(fw, table); } else if (table->has_aml) { /* Disassembling the AML bloats the output, so ignore */ uint8_t *data = (uint8_t *)table->data; fwts_acpi_table_header hdr; fwts_acpi_table_get_header(&hdr, data); acpidump_hdr(fw, &hdr, table->length); fwts_log_info_verbatim(fw, "Contains AML Object Code."); } else if (fwts_iasl_disassemble(fw, table, true, &output) != FWTS_OK) { /* Cannot find, assume standard table header */ uint8_t *data = (uint8_t *)table->data; fwts_acpi_table_header hdr; fwts_acpi_table_get_header(&hdr, data); acpidump_hdr(fw, &hdr, table->length); acpi_dump_raw_table(fw, table); } else { /* Successfully disassembled, so parse */ fwts_list_link *line; bool skip = false; bool unknown = false; fwts_list_foreach(line, output) { char *text = fwts_text_list_text(line); bool ignore = (strstr(text, "Raw Table Data:") != NULL); /* We don't want to emit this line */ if (strstr(text, "Unknown ACPI table signature") != NULL) { unknown = true; ignore = true; } /* and we want to ignore text in comments */ if (!strncmp(text, "/*", 2)) skip = true; if (!(ignore | skip | unknown)) fwts_log_info_verbatim(fw, "%s", fwts_text_list_text(line)); if (!strncmp(text, " */", 3)) skip = false; } fwts_text_list_free(output); if (unknown) acpi_dump_raw_table(fw, table); } fwts_log_nl(fw); }