aboutsummaryrefslogtreecommitdiff
path: root/target-s390x/interrupt.c
blob: 6c0024b426c2d7b5197bceb1bc3b1ca6c7bde3d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
 * QEMU S/390 Interrupt support
 *
 * Copyright IBM, Corp. 2012
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or (at your
 * option) any later version.  See the COPYING file in the top-level directory.
 */

#include "cpu.h"
#include "sysemu/kvm.h"

#if !defined(CONFIG_USER_ONLY)
/* service interrupts are floating therefore we must not pass an cpustate */
void s390_sclp_extint(uint32_t parm)
{
    S390CPU *dummy_cpu = s390_cpu_addr2state(0);
    CPUS390XState *env = &dummy_cpu->env;

    if (kvm_enabled()) {
#ifdef CONFIG_KVM
        kvm_s390_interrupt_internal(env, KVM_S390_INT_SERVICE, parm, 0, 1);
#endif
    } else {
        env->psw.addr += 4;
        cpu_inject_ext(env, EXT_SERVICE, parm, 0);
    }
}
#endif