Revision 64bf3f4e target-i386/kvm.c

b/target-i386/kvm.c
686 686
}
687 687

  
688 688
#ifdef KVM_CAP_SET_GUEST_DEBUG
689
static int kvm_patch_opcode_byte(CPUState *env, target_ulong addr, uint8_t val)
690
{
691
    target_phys_addr_t phys_page_addr;
692
    unsigned long pd;
693
    uint8_t *ptr;
694

  
695
    phys_page_addr = cpu_get_phys_page_debug(env, addr & TARGET_PAGE_MASK);
696
    if (phys_page_addr == -1)
697
        return -EINVAL;
698

  
699
    pd = cpu_get_physical_page_desc(phys_page_addr);
700
    if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM &&
701
        (pd & ~TARGET_PAGE_MASK) != IO_MEM_ROM && !(pd & IO_MEM_ROMD))
702
        return -EINVAL;
703

  
704
    ptr = phys_ram_base + (pd & TARGET_PAGE_MASK)
705
                        + (addr & ~TARGET_PAGE_MASK);
706
    *ptr = val;
707
    return 0;
708
}
709

  
710 689
int kvm_arch_insert_sw_breakpoint(CPUState *env, struct kvm_sw_breakpoint *bp)
711 690
{
691
    const static uint8_t int3 = 0xcc;
692

  
712 693
    if (cpu_memory_rw_debug(env, bp->pc, (uint8_t *)&bp->saved_insn, 1, 0) ||
713
        kvm_patch_opcode_byte(env, bp->pc, 0xcc))
694
        cpu_memory_rw_debug(env, bp->pc, (uint8_t *)&int3, 1, 1))
714 695
        return -EINVAL;
715 696
    return 0;
716 697
}
......
720 701
    uint8_t int3;
721 702

  
722 703
    if (cpu_memory_rw_debug(env, bp->pc, &int3, 1, 0) || int3 != 0xcc ||
723
        kvm_patch_opcode_byte(env, bp->pc, bp->saved_insn))
704
        cpu_memory_rw_debug(env, bp->pc, (uint8_t *)&bp->saved_insn, 1, 1))
724 705
        return -EINVAL;
725 706
    return 0;
726 707
}

Also available in: Unified diff