static int kvm_handle_debug(PowerPCCPU *cpu, struct kvm_run *run)

{

    CPUState *cs = CPU(cpu);

    CPUPPCState *env = &cpu->env;

    struct kvm_debug_exit_arch *arch_info = &run->debug.arch;

    int handle = 0;



    if (kvm_find_sw_breakpoint(cs, arch_info->address)) {

        handle = 1;

    } else {

        /* QEMU is not able to handle debug exception, so inject

         * program exception to guest;

         * Yes program exception NOT debug exception !!

         * For software breakpoint QEMU uses a privileged instruction;

         * So there cannot be any reason that we are here for guest

         * set debug exception, only possibility is guest executed a

         * privileged / illegal instruction and that's why we are

         * injecting a program interrupt.

         */



        cpu_synchronize_state(cs);

        /* env->nip is PC, so increment this by 4 to use

         * ppc_cpu_do_interrupt(), which set srr0 = env->nip - 4.

         */

        env->nip += 4;

        cs->exception_index = POWERPC_EXCP_PROGRAM;

        env->error_code = POWERPC_EXCP_INVAL;

        ppc_cpu_do_interrupt(cs);

    }



    return handle;

}

static int kvm_handle_debug(PowerPCCPU *cpu, struct kvm_run *run)

{

    CPUState *cs = CPU(cpu);

    CPUPPCState *env = &cpu->env;

    struct kvm_debug_exit_arch *arch_info = &run->debug.arch;

    int handle = 0;



    if (kvm_find_sw_breakpoint(cs, arch_info->address)) {

        handle = 1;

    } else {

        



















        cpu_synchronize_state(cs);

        





        env->nip += 4;

        cs->exception_index = POWERPC_EXCP_PROGRAM;

        env->error_code = POWERPC_EXCP_INVAL;

        ppc_cpu_do_interrupt(cs);

    }



    return handle;

}

    if (kvm_find_sw_breakpoint(cs, arch_info->address)) {
static int FUNC_0(PowerPCCPU *VAR_0, struct kvm_run *VAR_1)

{

    CPUState *cs = CPU(VAR_0);

    CPUPPCState *env = &VAR_0->env;

    struct kvm_debug_exit_arch *VAR_2 = &VAR_1->debug.arch;

    int VAR_3 = 0;



    if (kvm_find_sw_breakpoint(cs, VAR_2->address)) {

        VAR_3 = 1;

    } else {

        



















        cpu_synchronize_state(cs);

        





        env->nip += 4;

        cs->exception_index = POWERPC_EXCP_PROGRAM;

        env->error_code = POWERPC_EXCP_INVAL;

        ppc_cpu_do_interrupt(cs);

    }



    return VAR_3;

}

static int FUNC_0(PowerPCCPU *VAR_0, struct kvm_run *VAR_1)
{ CPUState *cs = CPU(VAR_0); CPUPPCState *env = &VAR_0->env; struct kvm_debug_exit_arch *VAR_2 = &VAR_1->debug.arch; int VAR_3 = 0; if (kvm_find_sw_breakpoint(cs, VAR_2->address)) { VAR_3 = 1; } else { cpu_synchronize_state(cs); env->nip += 4; cs->exception_index = POWERPC_EXCP_PROGRAM; env->error_code = POWERPC_EXCP_INVAL; ppc_cpu_do_interrupt(cs); } return VAR_3; }