Revision 3c85e74f

b/target-i386/kvm.c
173 173
}
174 174
#endif /* CONFIG_KVM_PARA */
175 175

  
176
typedef struct HWPoisonPage {
177
    ram_addr_t ram_addr;
178
    QLIST_ENTRY(HWPoisonPage) list;
179
} HWPoisonPage;
180

  
181
static QLIST_HEAD(, HWPoisonPage) hwpoison_page_list =
182
    QLIST_HEAD_INITIALIZER(hwpoison_page_list);
183

  
184
static void kvm_unpoison_all(void *param)
185
{
186
    HWPoisonPage *page, *next_page;
187

  
188
    QLIST_FOREACH_SAFE(page, &hwpoison_page_list, list, next_page) {
189
        QLIST_REMOVE(page, list);
190
        qemu_ram_remap(page->ram_addr, TARGET_PAGE_SIZE);
191
        qemu_free(page);
192
    }
193
}
194

  
176 195
#ifdef KVM_CAP_MCE
196
static void kvm_hwpoison_page_add(ram_addr_t ram_addr)
197
{
198
    HWPoisonPage *page;
199

  
200
    QLIST_FOREACH(page, &hwpoison_page_list, list) {
201
        if (page->ram_addr == ram_addr) {
202
            return;
203
        }
204
    }
205
    page = qemu_malloc(sizeof(HWPoisonPage));
206
    page->ram_addr = ram_addr;
207
    QLIST_INSERT_HEAD(&hwpoison_page_list, page, list);
208
}
209

  
177 210
static int kvm_get_mce_cap_supported(KVMState *s, uint64_t *mce_cap,
178 211
                                     int *max_banks)
179 212
{
......
233 266
                hardware_memory_error();
234 267
            }
235 268
        }
269
        kvm_hwpoison_page_add(ram_addr);
236 270
        kvm_mce_inject(env, paddr, code);
237 271
    } else
238 272
#endif /* KVM_CAP_MCE */
......
263 297
                    "QEMU itself instead of guest system!: %p\n", addr);
264 298
            return 0;
265 299
        }
300
        kvm_hwpoison_page_add(ram_addr);
266 301
        kvm_mce_inject(first_cpu, paddr, code);
267 302
    } else
268 303
#endif /* KVM_CAP_MCE */
......
571 606
        fprintf(stderr, "e820_add_entry() table is full\n");
572 607
        return ret;
573 608
    }
609
    qemu_register_reset(kvm_unpoison_all, NULL);
574 610

  
575 611
    return 0;
576 612
}

Also available in: Unified diff