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