319
319
if ((env->mcg_cap & MCG_SER_P) && addr
320
320
&& (code == BUS_MCEERR_AR || code == BUS_MCEERR_AO)) {
321
if (qemu_ram_addr_from_host(addr, &ram_addr) ||
321
if (qemu_ram_addr_from_host(addr, &ram_addr) == NULL ||
322
322
!kvm_physical_memory_addr_from_host(c->kvm_state, addr, &paddr)) {
323
323
fprintf(stderr, "Hardware memory error for memory used by "
324
324
"QEMU itself instead of guest system!\n");
346
346
int kvm_arch_on_sigbus(int code, void *addr)
348
if ((first_cpu->mcg_cap & MCG_SER_P) && addr && code == BUS_MCEERR_AO) {
348
X86CPU *cpu = X86_CPU(first_cpu);
350
if ((cpu->env.mcg_cap & MCG_SER_P) && addr && code == BUS_MCEERR_AO) {
349
351
ram_addr_t ram_addr;
352
354
/* Hope we are lucky for AO MCE */
353
if (qemu_ram_addr_from_host(addr, &ram_addr) ||
354
!kvm_physical_memory_addr_from_host(CPU(first_cpu)->kvm_state,
355
if (qemu_ram_addr_from_host(addr, &ram_addr) == NULL ||
356
!kvm_physical_memory_addr_from_host(first_cpu->kvm_state,
356
358
fprintf(stderr, "Hardware memory error for memory used by "
357
359
"QEMU itself instead of guest system!: %p\n", addr);
360
362
kvm_hwpoison_page_add(ram_addr);
361
kvm_mce_inject(x86_env_get_cpu(first_cpu), paddr, code);
363
kvm_mce_inject(X86_CPU(first_cpu), paddr, code);
363
365
if (code == BUS_MCEERR_AO) {
791
792
qemu_register_reset(kvm_unpoison_all, NULL);
793
if (!QTAILQ_EMPTY(&list->head)) {
794
shadow_mem = qemu_opt_get_size(QTAILQ_FIRST(&list->head),
795
"kvm_shadow_mem", -1);
796
if (shadow_mem != -1) {
798
ret = kvm_vm_ioctl(s, KVM_SET_NR_MMU_PAGES, shadow_mem);
794
shadow_mem = qemu_opt_get_size(qemu_get_machine_opts(),
795
"kvm_shadow_mem", -1);
796
if (shadow_mem != -1) {
798
ret = kvm_vm_ioctl(s, KVM_SET_NR_MMU_PAGES, shadow_mem);
1617
1617
* reinject them via SET_GUEST_DEBUG.
1619
1619
if (reinject_trap ||
1620
(!kvm_has_robust_singlestep() && env->singlestep_enabled)) {
1621
ret = kvm_update_guest_debug(env, reinject_trap);
1620
(!kvm_has_robust_singlestep() && cs->singlestep_enabled)) {
1621
ret = kvm_update_guest_debug(cs, reinject_trap);
1858
1858
cs->interrupt_request &= ~CPU_INTERRUPT_MCE;
1860
kvm_cpu_synchronize_state(env);
1860
kvm_cpu_synchronize_state(cs);
1862
1862
if (env->exception_injected == EXCP08_DBLE) {
1863
1863
/* this means triple fault */
1888
1888
cs->halted = 0;
1890
1890
if (cs->interrupt_request & CPU_INTERRUPT_INIT) {
1891
kvm_cpu_synchronize_state(env);
1891
kvm_cpu_synchronize_state(cs);
1892
1892
do_cpu_init(cpu);
1894
1894
if (cs->interrupt_request & CPU_INTERRUPT_SIPI) {
1895
kvm_cpu_synchronize_state(env);
1895
kvm_cpu_synchronize_state(cs);
1896
1896
do_cpu_sipi(cpu);
1898
1898
if (cs->interrupt_request & CPU_INTERRUPT_TPR) {
1899
1899
cs->interrupt_request &= ~CPU_INTERRUPT_TPR;
1900
kvm_cpu_synchronize_state(env);
1900
kvm_cpu_synchronize_state(cs);
1901
1901
apic_handle_tpr_access_report(env->apic_state, env->eip,
1902
1902
env->tpr_access_type);
1935
int kvm_arch_insert_sw_breakpoint(CPUState *cpu, struct kvm_sw_breakpoint *bp)
1935
int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
1937
CPUX86State *env = &X86_CPU(cpu)->env;
1938
1937
static const uint8_t int3 = 0xcc;
1940
if (cpu_memory_rw_debug(env, bp->pc, (uint8_t *)&bp->saved_insn, 1, 0) ||
1941
cpu_memory_rw_debug(env, bp->pc, (uint8_t *)&int3, 1, 1)) {
1939
if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 1, 0) ||
1940
cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&int3, 1, 1)) {
1942
1941
return -EINVAL;
1947
int kvm_arch_remove_sw_breakpoint(CPUState *cpu, struct kvm_sw_breakpoint *bp)
1946
int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
1949
CPUX86State *env = &X86_CPU(cpu)->env;
1952
if (cpu_memory_rw_debug(env, bp->pc, &int3, 1, 0) || int3 != 0xcc ||
1953
cpu_memory_rw_debug(env, bp->pc, (uint8_t *)&bp->saved_insn, 1, 1)) {
1950
if (cpu_memory_rw_debug(cs, bp->pc, &int3, 1, 0) || int3 != 0xcc ||
1951
cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 1, 1)) {
1954
1952
return -EINVAL;
2043
2041
static int kvm_handle_debug(X86CPU *cpu,
2044
2042
struct kvm_debug_exit_arch *arch_info)
2044
CPUState *cs = CPU(cpu);
2046
2045
CPUX86State *env = &cpu->env;
2050
2049
if (arch_info->exception == 1) {
2051
2050
if (arch_info->dr6 & (1 << 14)) {
2052
if (env->singlestep_enabled) {
2051
if (cs->singlestep_enabled) {
2053
2052
ret = EXCP_DEBUG;
2184
2183
X86CPU *cpu = X86_CPU(cs);
2185
2184
CPUX86State *env = &cpu->env;
2187
kvm_cpu_synchronize_state(env);
2186
kvm_cpu_synchronize_state(cs);
2188
2187
return !(env->cr[0] & CR0_PE_MASK) ||
2189
2188
((env->segs[R_CS].selector & 3) != 3);