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