static void do_ext_interrupt(CPUS390XState *env)

{

    S390CPU *cpu = s390_env_get_cpu(env);

    uint64_t mask, addr;

    LowCore *lowcore;

    ExtQueue *q;



    if (!(env->psw.mask & PSW_MASK_EXT)) {

        cpu_abort(CPU(cpu), "Ext int w/o ext mask\n");

    }



    lowcore = cpu_map_lowcore(env);



    if (env->pending_int & INTERRUPT_EXT_CLOCK_COMPARATOR) {

        lowcore->ext_int_code = cpu_to_be16(EXT_CLOCK_COMP);

        lowcore->cpu_addr = 0;

        env->pending_int &= ~INTERRUPT_EXT_CLOCK_COMPARATOR;

    } else if (env->pending_int & INTERRUPT_EXT_CPU_TIMER) {

        lowcore->ext_int_code = cpu_to_be16(EXT_CPU_TIMER);

        lowcore->cpu_addr = 0;

        env->pending_int &= ~INTERRUPT_EXT_CPU_TIMER;

    } else if (env->pending_int & INTERRUPT_EXT_SERVICE) {

        g_assert(env->ext_index >= 0);

        /*

         * FIXME: floating IRQs should be considered by all CPUs and

         *        shuld not get cleared by CPU reset.

         */

        q = &env->ext_queue[env->ext_index];

        lowcore->ext_int_code = cpu_to_be16(q->code);

        lowcore->ext_params = cpu_to_be32(q->param);

        lowcore->ext_params2 = cpu_to_be64(q->param64);

        lowcore->cpu_addr = cpu_to_be16(env->core_id | VIRTIO_SUBCODE_64);

        env->ext_index--;

        if (env->ext_index == -1) {

            env->pending_int &= ~INTERRUPT_EXT_SERVICE;

        }

    } else {

        g_assert_not_reached();

    }



    mask = be64_to_cpu(lowcore->external_new_psw.mask);

    addr = be64_to_cpu(lowcore->external_new_psw.addr);

    lowcore->external_old_psw.mask = cpu_to_be64(get_psw_mask(env));

    lowcore->external_old_psw.addr = cpu_to_be64(env->psw.addr);



    cpu_unmap_lowcore(lowcore);



    DPRINTF("%s: %" PRIx64 " %" PRIx64 "\n", __func__,

            env->psw.mask, env->psw.addr);



    load_psw(env, mask, addr);

}

static void do_ext_interrupt(CPUS390XState *env)

{

    S390CPU *cpu = s390_env_get_cpu(env);

    uint64_t mask, addr;

    LowCore *lowcore;

    ExtQueue *q;



    if (!(env->psw.mask & PSW_MASK_EXT)) {

        cpu_abort(CPU(cpu), "Ext int w/o ext mask\n");

    }



    lowcore = cpu_map_lowcore(env);



    if (env->pending_int & INTERRUPT_EXT_CLOCK_COMPARATOR) {

        lowcore->ext_int_code = cpu_to_be16(EXT_CLOCK_COMP);

        lowcore->cpu_addr = 0;

        env->pending_int &= ~INTERRUPT_EXT_CLOCK_COMPARATOR;

    } else if (env->pending_int & INTERRUPT_EXT_CPU_TIMER) {

        lowcore->ext_int_code = cpu_to_be16(EXT_CPU_TIMER);

        lowcore->cpu_addr = 0;

        env->pending_int &= ~INTERRUPT_EXT_CPU_TIMER;

    } else if (env->pending_int & INTERRUPT_EXT_SERVICE) {

        g_assert(env->ext_index >= 0);

        







        q = &env->ext_queue[env->ext_index];

        lowcore->ext_int_code = cpu_to_be16(q->code);

        lowcore->ext_params = cpu_to_be32(q->param);

        lowcore->ext_params2 = cpu_to_be64(q->param64);

        lowcore->cpu_addr = cpu_to_be16(env->core_id | VIRTIO_SUBCODE_64);

        env->ext_index--;

        if (env->ext_index == -1) {

            env->pending_int &= ~INTERRUPT_EXT_SERVICE;

        }

    } else {

        g_assert_not_reached();

    }



    mask = be64_to_cpu(lowcore->external_new_psw.mask);

    addr = be64_to_cpu(lowcore->external_new_psw.addr);

    lowcore->external_old_psw.mask = cpu_to_be64(get_psw_mask(env));

    lowcore->external_old_psw.addr = cpu_to_be64(env->psw.addr);



    cpu_unmap_lowcore(lowcore);



    DPRINTF("%s: %" PRIx64 " %" PRIx64 "\n", __func__,

            env->psw.mask, env->psw.addr);



    load_psw(env, mask, addr);

}

static void FUNC_0(CPUS390XState *VAR_0)

{

    S390CPU *cpu = s390_env_get_cpu(VAR_0);

    uint64_t mask, addr;

    LowCore *lowcore;

    ExtQueue *q;



    if (!(VAR_0->psw.mask & PSW_MASK_EXT)) {

        cpu_abort(CPU(cpu), "Ext int w/o ext mask\n");

    }



    lowcore = cpu_map_lowcore(VAR_0);



    if (VAR_0->pending_int & INTERRUPT_EXT_CLOCK_COMPARATOR) {

        lowcore->ext_int_code = cpu_to_be16(EXT_CLOCK_COMP);

        lowcore->cpu_addr = 0;

        VAR_0->pending_int &= ~INTERRUPT_EXT_CLOCK_COMPARATOR;

    } else if (VAR_0->pending_int & INTERRUPT_EXT_CPU_TIMER) {

        lowcore->ext_int_code = cpu_to_be16(EXT_CPU_TIMER);

        lowcore->cpu_addr = 0;

        VAR_0->pending_int &= ~INTERRUPT_EXT_CPU_TIMER;

    } else if (VAR_0->pending_int & INTERRUPT_EXT_SERVICE) {

        g_assert(VAR_0->ext_index >= 0);

        







        q = &VAR_0->ext_queue[VAR_0->ext_index];

        lowcore->ext_int_code = cpu_to_be16(q->code);

        lowcore->ext_params = cpu_to_be32(q->param);

        lowcore->ext_params2 = cpu_to_be64(q->param64);

        lowcore->cpu_addr = cpu_to_be16(VAR_0->core_id | VIRTIO_SUBCODE_64);

        VAR_0->ext_index--;

        if (VAR_0->ext_index == -1) {

            VAR_0->pending_int &= ~INTERRUPT_EXT_SERVICE;

        }

    } else {

        g_assert_not_reached();

    }



    mask = be64_to_cpu(lowcore->external_new_psw.mask);

    addr = be64_to_cpu(lowcore->external_new_psw.addr);

    lowcore->external_old_psw.mask = cpu_to_be64(get_psw_mask(VAR_0));

    lowcore->external_old_psw.addr = cpu_to_be64(VAR_0->psw.addr);



    cpu_unmap_lowcore(lowcore);



    DPRINTF("%s: %" PRIx64 " %" PRIx64 "\n", __func__,

            VAR_0->psw.mask, VAR_0->psw.addr);



    load_psw(VAR_0, mask, addr);

}

static void FUNC_0(CPUS390XState *VAR_0)
{ S390CPU *cpu = s390_env_get_cpu(VAR_0); uint64_t mask, addr; LowCore *lowcore; ExtQueue *q; if (!(VAR_0->psw.mask & PSW_MASK_EXT)) { cpu_abort(CPU(cpu), "Ext int w/o ext mask\n"); } lowcore = cpu_map_lowcore(VAR_0); if (VAR_0->pending_int & INTERRUPT_EXT_CLOCK_COMPARATOR) { lowcore->ext_int_code = cpu_to_be16(EXT_CLOCK_COMP); lowcore->cpu_addr = 0; VAR_0->pending_int &= ~INTERRUPT_EXT_CLOCK_COMPARATOR; } else if (VAR_0->pending_int & INTERRUPT_EXT_CPU_TIMER) { lowcore->ext_int_code = cpu_to_be16(EXT_CPU_TIMER); lowcore->cpu_addr = 0; VAR_0->pending_int &= ~INTERRUPT_EXT_CPU_TIMER; } else if (VAR_0->pending_int & INTERRUPT_EXT_SERVICE) { g_assert(VAR_0->ext_index >= 0); q = &VAR_0->ext_queue[VAR_0->ext_index]; lowcore->ext_int_code = cpu_to_be16(q->code); lowcore->ext_params = cpu_to_be32(q->param); lowcore->ext_params2 = cpu_to_be64(q->param64); lowcore->cpu_addr = cpu_to_be16(VAR_0->core_id | VIRTIO_SUBCODE_64); VAR_0->ext_index--; if (VAR_0->ext_index == -1) { VAR_0->pending_int &= ~INTERRUPT_EXT_SERVICE; } } else { g_assert_not_reached(); } mask = be64_to_cpu(lowcore->external_new_psw.mask); addr = be64_to_cpu(lowcore->external_new_psw.addr); lowcore->external_old_psw.mask = cpu_to_be64(get_psw_mask(VAR_0)); lowcore->external_old_psw.addr = cpu_to_be64(VAR_0->psw.addr); cpu_unmap_lowcore(lowcore); DPRINTF("%s: %" PRIx64 " %" PRIx64 "\n", __func__,
VAR_0->psw.mask, VAR_0->psw.addr); load_psw(VAR_0, mask, addr); }