@@ -1296,6 +1296,24 @@ static void kvm_unpoison_all(void *param)
void kvm_hwpoison_page_add(ram_addr_t ram_addr)
{
HWPoisonPage *page;
+ struct RAMBlockInfo rb_info;
+
+ if (qemu_ram_block_info_from_addr(ram_addr, &rb_info)) {
+ size_t ps = rb_info.page_size;
+
+ if (ps > TARGET_PAGE_SIZE) {
+ uint64_t offset = QEMU_ALIGN_DOWN(ram_addr - rb_info.offset, ps);
+
+ if (rb_info.fd >= 0) {
+ error_report("Memory Error on large page from %s:%" PRIx64
+ "+%" PRIx64 " +%zx", rb_info.idstr, offset,
+ rb_info.fd_offset, ps);
+ } else {
+ error_report("Memory Error on large page from %s:%" PRIx64
+ " +%zx", rb_info.idstr, offset, ps);
+ }
+ }
+ }
QLIST_FOREACH(page, &hwpoison_page_list, list) {
if (page->ram_addr == ram_addr) {
@@ -110,6 +110,16 @@ int qemu_ram_get_fd(RAMBlock *rb);
size_t qemu_ram_pagesize(RAMBlock *block);
size_t qemu_ram_pagesize_largest(void);
+struct RAMBlockInfo {
+ char idstr[256];
+ ram_addr_t offset;
+ int fd;
+ uint64_t fd_offset;
+ size_t page_size;
+};
+bool qemu_ram_block_info_from_addr(ram_addr_t ram_addr,
+ struct RAMBlockInfo *block);
+
/**
* cpu_address_space_init:
* @cpu: CPU to add this address space to
@@ -1678,6 +1678,28 @@ size_t qemu_ram_pagesize_largest(void)
return largest;
}
+/* Copy RAMBlock information associated to the given ram_addr location */
+bool qemu_ram_block_info_from_addr(ram_addr_t ram_addr,
+ struct RAMBlockInfo *b_info)
+{
+ RAMBlock *rb;
+
+ assert(b_info);
+
+ RCU_READ_LOCK_GUARD();
+ rb = qemu_get_ram_block(ram_addr);
+ if (!rb) {
+ return false;
+ }
+
+ pstrcat(b_info->idstr, sizeof(b_info->idstr), rb->idstr);
+ b_info->offset = rb->offset;
+ b_info->fd = rb->fd;
+ b_info->fd_offset = rb->fd_offset;
+ b_info->page_size = rb->page_size;
+ return true;
+}
+
static int memory_try_enable_merging(void *addr, size_t len)
{
if (!machine_mem_merge(current_machine)) {
@@ -2389,6 +2389,9 @@ void kvm_arch_on_sigbus_vcpu(CPUState *c, int code, void *addr)
kvm_cpu_synchronize_state(c);
if (!acpi_ghes_memory_errors(ACPI_HEST_SRC_ID_SEA, paddr)) {
kvm_inject_arm_sea(c);
+ error_report("Guest Memory Error at QEMU addr %p and "
+ "GUEST addr 0x%" HWADDR_PRIx " of type %s injected",
+ addr, paddr, "BUS_MCEERR_AR");
} else {
error_report("failed to record the error");
abort();