ghes.c (d0dddab40e472ba62b5f43f11cc7dba085dabe71) ghes.c (1c81f5735af3e2356bb75482a58786a4f26d8300)
1/*
2 * Support for generating APEI tables and recording CPER for Guests
3 *
4 * Copyright (c) 2020 HUAWEI TECHNOLOGIES CO., LTD.
5 *
6 * Author: Dongjiu Geng <gengdongjiu@huawei.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 372 unchanged lines hidden (view full) ---

381{
382 /* Create a read-only fw_cfg file for GHES */
383 fw_cfg_add_file(s, ACPI_GHES_ERRORS_FW_CFG_FILE, hardware_error->data,
384 hardware_error->len);
385
386 /* Create a read-write fw_cfg file for Address */
387 fw_cfg_add_file_callback(s, ACPI_GHES_DATA_ADDR_FW_CFG_FILE, NULL, NULL,
388 NULL, &(ags->ghes_addr_le), sizeof(ags->ghes_addr_le), false);
1/*
2 * Support for generating APEI tables and recording CPER for Guests
3 *
4 * Copyright (c) 2020 HUAWEI TECHNOLOGIES CO., LTD.
5 *
6 * Author: Dongjiu Geng <gengdongjiu@huawei.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 372 unchanged lines hidden (view full) ---

381{
382 /* Create a read-only fw_cfg file for GHES */
383 fw_cfg_add_file(s, ACPI_GHES_ERRORS_FW_CFG_FILE, hardware_error->data,
384 hardware_error->len);
385
386 /* Create a read-write fw_cfg file for Address */
387 fw_cfg_add_file_callback(s, ACPI_GHES_DATA_ADDR_FW_CFG_FILE, NULL, NULL,
388 NULL, &(ags->ghes_addr_le), sizeof(ags->ghes_addr_le), false);
389
390 ags->present = true;
389}
390
391int acpi_ghes_record_errors(uint8_t source_id, uint64_t physical_address)
392{
393 uint64_t error_block_addr, read_ack_register_addr, read_ack_register = 0;
394 uint64_t start_addr;
395 bool ret = -1;
396 AcpiGedState *acpi_ged_state;

--- 41 unchanged lines hidden (view full) ---

438 ret = acpi_ghes_record_mem_error(error_block_addr,
439 physical_address);
440 } else
441 error_report("can not find Generic Error Status Block");
442 }
443
444 return ret;
445}
391}
392
393int acpi_ghes_record_errors(uint8_t source_id, uint64_t physical_address)
394{
395 uint64_t error_block_addr, read_ack_register_addr, read_ack_register = 0;
396 uint64_t start_addr;
397 bool ret = -1;
398 AcpiGedState *acpi_ged_state;

--- 41 unchanged lines hidden (view full) ---

440 ret = acpi_ghes_record_mem_error(error_block_addr,
441 physical_address);
442 } else
443 error_report("can not find Generic Error Status Block");
444 }
445
446 return ret;
447}
448
449bool acpi_ghes_present(void)
450{
451 AcpiGedState *acpi_ged_state;
452 AcpiGhesState *ags;
453
454 acpi_ged_state = ACPI_GED(object_resolve_path_type("", TYPE_ACPI_GED,
455 NULL));
456
457 if (!acpi_ged_state) {
458 return false;
459 }
460 ags = &acpi_ged_state->ghes_state;
461 return ags->present;
462}