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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
// SPDX-License-Identifier: GPL-2.0-only
/*
* Test for KVM_S390_IRQ - s390x IRQ injection API
*
* Verifies that VM-level interrupt types are correctly rejected when
* injected via the vCPU file descriptor, and that invalid arguments
* to vCPU-level interrupts are also rejected.
*
* Copyright IBM Corp. 2026
* Author: Gabriella Seifert <gseifert@linux.ibm.com>
*/
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include "kvm_util.h"
#include "test_util.h"
#include <linux/kvm.h>
static void test_vm_irq_on_vcpu_fails(struct kvm_vcpu *vcpu, __u64 type)
{
struct kvm_s390_irq irq = { .type = type };
int rc;
rc = __vcpu_ioctl(vcpu, KVM_S390_IRQ, &irq);
ksft_test_result(rc == -1 && errno == EINVAL,
"VM on VCPU IRQ type 0x%llx: expected %d, got %d\n",
type, EINVAL, errno);
}
static void test_vcpu_irq_bad_param_fails(struct kvm_vcpu *vcpu,
struct kvm_s390_irq *irq)
{
int rc;
rc = __vcpu_ioctl(vcpu, KVM_S390_IRQ, irq);
ksft_test_result(rc == -1 && errno == EINVAL,
"VCPU IRQ bad param type 0x%llx: expected %d got %d\n",
irq->type, EINVAL, errno);
}
int main(void)
{
struct kvm_s390_irq irq;
struct kvm_vcpu *vcpu;
struct kvm_vm *vm;
ksft_print_header();
ksft_set_plan(6);
vm = vm_create_with_one_vcpu(&vcpu, NULL);
test_vm_irq_on_vcpu_fails(vcpu, KVM_S390_INT_VIRTIO);
test_vm_irq_on_vcpu_fails(vcpu, KVM_S390_INT_SERVICE);
test_vm_irq_on_vcpu_fails(vcpu, KVM_S390_INT_IO_MIN);
memset(&irq, 0, sizeof(irq));
irq.type = KVM_S390_INT_EMERGENCY;
irq.u.emerg.code = 0xffff;
test_vcpu_irq_bad_param_fails(vcpu, &irq);
memset(&irq, 0, sizeof(irq));
irq.type = KVM_S390_INT_EXTERNAL_CALL;
irq.u.extcall.code = 0xffff;
test_vcpu_irq_bad_param_fails(vcpu, &irq);
memset(&irq, 0, sizeof(irq));
irq.type = 0xdeadbeef;
test_vcpu_irq_bad_param_fails(vcpu, &irq);
kvm_vm_free(vm);
ksft_finished();
}
|