@ -28,8 +28,8 @@
# include "hw/nvram/fw_cfg.h"
# include "qemu/uuid.h"
# define ACPI_GHES_ERRORS_FW_CFG_FILE "etc / hardware_errors"
# define ACPI_GHES_DATA_ADDR_FW_CFG_FILE "etc / hardware_errors_addr"
# define ACPI_HW_ERROR_FW_CFG_FILE "etc / hardware_errors"
# define ACPI_HW_ERROR_ADDR_FW_CFG_FILE "etc / hardware_errors_addr"
/* The max size in bytes for one error block */
# define ACPI_GHES_MAX_RAW_DATA_LENGTH (1 * KiB)
@ -234,7 +234,7 @@ static void build_ghes_error_table(GArray *hardware_errors, BIOSLinker *linker)
ACPI_GHES_MAX_RAW_DATA_LENGTH * ACPI_GHES_ERROR_SOURCE_COUNT ) ;
/* Tell guest firmware to place hardware_errors blob into RAM */
bios_linker_loader_alloc ( linker , ACPI_GHES_ERRORS _FW_CFG_FILE ,
bios_linker_loader_alloc ( linker , ACPI_HW_ERROR _FW_CFG_FILE ,
hardware_errors , sizeof ( uint64_t ) , false ) ;
for ( i = 0 ; i < ACPI_GHES_ERROR_SOURCE_COUNT ; i + + ) {
@ -243,17 +243,21 @@ static void build_ghes_error_table(GArray *hardware_errors, BIOSLinker *linker)
* corresponding " Generic Error Status Block "
*/
bios_linker_loader_add_pointer ( linker ,
ACPI_GHES_ERRORS_FW_CFG_FILE , sizeof ( uint64_t ) * i ,
sizeof ( uint64_t ) , ACPI_GHES_ERRORS_FW_CFG_FILE ,
error_status_block_offset + i * ACPI_GHES_MAX_RAW_DATA_LENGTH ) ;
ACPI_HW_ERROR_FW_CFG_FILE ,
sizeof ( uint64_t ) * i ,
sizeof ( uint64_t ) ,
ACPI_HW_ERROR_FW_CFG_FILE ,
error_status_block_offset +
i * ACPI_GHES_MAX_RAW_DATA_LENGTH ) ;
}
/*
* tell firmware to write hardware_errors GPA into
* hardware_errors_addr fw_cfg , once the former has been initialized .
*/
bios_linker_loader_write_pointer ( linker , ACPI_GHES_DATA_ADDR_FW_CFG_FILE ,
0 , sizeof ( uint64_t ) , ACPI_GHES_ERRORS_FW_CFG_FILE , 0 ) ;
bios_linker_loader_write_pointer ( linker , ACPI_HW_ERROR_ADDR_FW_CFG_FILE , 0 ,
sizeof ( uint64_t ) ,
ACPI_HW_ERROR_FW_CFG_FILE , 0 ) ;
}
/* Build Generic Hardware Error Source version 2 (GHESv2) */
@ -290,8 +294,10 @@ static void build_ghes_v2(GArray *table_data,
build_append_gas ( table_data , AML_AS_SYSTEM_MEMORY , 0x40 , 0 ,
4 /* QWord access */ , 0 ) ;
bios_linker_loader_add_pointer ( linker , ACPI_BUILD_TABLE_FILE ,
address_offset + GAS_ADDR_OFFSET , sizeof ( uint64_t ) ,
ACPI_GHES_ERRORS_FW_CFG_FILE , source_id * sizeof ( uint64_t ) ) ;
address_offset + GAS_ADDR_OFFSET ,
sizeof ( uint64_t ) ,
ACPI_HW_ERROR_FW_CFG_FILE ,
source_id * sizeof ( uint64_t ) ) ;
/* Notification Structure */
build_ghes_hw_error_notification ( table_data , notify ) ;
@ -308,9 +314,11 @@ static void build_ghes_v2(GArray *table_data,
build_append_gas ( table_data , AML_AS_SYSTEM_MEMORY , 0x40 , 0 ,
4 /* QWord access */ , 0 ) ;
bios_linker_loader_add_pointer ( linker , ACPI_BUILD_TABLE_FILE ,
address_offset + GAS_ADDR_OFFSET ,
sizeof ( uint64_t ) , ACPI_GHES_ERRORS_FW_CFG_FILE ,
( ACPI_GHES_ERROR_SOURCE_COUNT + source_id ) * sizeof ( uint64_t ) ) ;
address_offset + GAS_ADDR_OFFSET ,
sizeof ( uint64_t ) ,
ACPI_HW_ERROR_FW_CFG_FILE ,
( ACPI_GHES_ERROR_SOURCE_COUNT + source_id )
* sizeof ( uint64_t ) ) ;
/*
* Read Ack Preserve field
@ -346,11 +354,11 @@ void acpi_ghes_add_fw_cfg(AcpiGhesState *ags, FWCfgState *s,
GArray * hardware_error )
{
/* Create a read-only fw_cfg file for GHES */
fw_cfg_add_file ( s , ACPI_GHES_ERRORS _FW_CFG_FILE , hardware_error - > data ,
fw_cfg_add_file ( s , ACPI_HW_ERROR _FW_CFG_FILE , hardware_error - > data ,
hardware_error - > len ) ;
/* Create a read-write fw_cfg file for Address */
fw_cfg_add_file_callback ( s , ACPI_GHES_DATA _ADDR_FW_CFG_FILE , NULL , NULL ,
fw_cfg_add_file_callback ( s , ACPI_HW_ERROR _ADDR_FW_CFG_FILE , NULL , NULL ,
NULL , & ( ags - > ghes_addr_le ) , sizeof ( ags - > ghes_addr_le ) , false ) ;
ags - > present = true ;