summary refs log tree commit diff
path: root/tests/plugin_vm_state.c
blob: 450d324d0201d11c71019c16ee9701a5406b2caa (plain) (blame)
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
 * Copyright 2018 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "crosvm.h"

int main(int argc, char** argv) {
    struct crosvm *crosvm;
    int ret = crosvm_connect(&crosvm);
    if (ret) {
        fprintf(stderr, "failed to connect to crosvm: %d\n", ret);
        return 1;
    }

    struct kvm_pic_state pic_state;
    ret = crosvm_get_pic_state(crosvm, false, &pic_state);
    if (ret < 0) {
        fprintf(stderr, "failed to get initial PIC1 state: %d\n", ret);
        return 1;
    }

    if (pic_state.auto_eoi) {
        fprintf(stderr, "unexpected value of auto_eoi flag\n");
        return 1;
    }

    pic_state.auto_eoi = true;
    ret = crosvm_set_pic_state(crosvm, false, &pic_state);
    if (ret < 0) {
        fprintf(stderr, "failed to update PIC1 state: %d\n", ret);
        return 1;
    }

    ret = crosvm_get_pic_state(crosvm, false, &pic_state);
    if (ret < 0) {
        fprintf(stderr, "failed to get updated PIC1 state: %d\n", ret);
        return 1;
    }

    if (!pic_state.auto_eoi) {
        fprintf(stderr, "unexpected value of auto_eoi flag after update\n");
        return 1;
    }

    // Test retrieving and setting IOAPIC state.
    struct kvm_ioapic_state ioapic_state;
    ret = crosvm_get_ioapic_state(crosvm, &ioapic_state);
    if (ret < 0) {
        fprintf(stderr, "failed to get initial PIC1 state: %d\n", ret);
        return 1;
    }

    fprintf(stderr, "IOAPIC ID: %d\n", ioapic_state.id);

    if (ioapic_state.id != 0) {
        fprintf(stderr, "unexpected value of IOAPIC ID: %d\n", ioapic_state.id);
        return 1;
    }

    ioapic_state.id = 1;
    ret = crosvm_set_ioapic_state(crosvm, &ioapic_state);
    if (ret < 0) {
        fprintf(stderr, "failed to update PIC1 state: %d\n", ret);
        return 1;
    }

    ret = crosvm_get_ioapic_state(crosvm, &ioapic_state);
    if (ret < 0) {
        fprintf(stderr, "failed to get updated PIC1 state: %d\n", ret);
        return 1;
    }

    if (ioapic_state.id != 1) {
        fprintf(stderr, "unexpected value of IOAPIC ID after update: %d\n",
                ioapic_state.id);
        return 1;
    }

    // Test retrieving and setting PIT state.
    struct kvm_pit_state2 pit_state;
    ret = crosvm_get_pit_state(crosvm, &pit_state);
    if (ret < 0) {
        fprintf(stderr, "failed to get initial PIT state: %d\n", ret);
        return 1;
    }

    if (pit_state.flags & KVM_PIT_FLAGS_HPET_LEGACY) {
        fprintf(stderr, "unexpected value of KVM_PIT_FLAGS_HPET_LEGACY flag\n");
        return 1;
    }

    pit_state.flags |= KVM_PIT_FLAGS_HPET_LEGACY;
    ret = crosvm_set_pit_state(crosvm, &pit_state);
    if (ret < 0) {
        fprintf(stderr, "failed to update PIT state: %d\n", ret);
        return 1;
    }

    ret = crosvm_get_pit_state(crosvm, &pit_state);
    if (ret < 0) {
        fprintf(stderr, "failed to get updated PIT state: %d\n", ret);
        return 1;
    }

    if (!(pit_state.flags & KVM_PIT_FLAGS_HPET_LEGACY)) {
        fprintf(stderr,
                "unexpected value of KVM_PIT_FLAGS_HPET_LEGACY after update\n");
        return 1;
    }

    // Test retrieving and setting clock state.
    struct kvm_clock_data clock_data = { .clock = 0, .flags = -1U, };
    ret = crosvm_get_clock(crosvm, &clock_data);
    if (ret < 0) {
        fprintf(stderr, "failed to get initial clock state: %d\n", ret);
        return 1;
    }

    if (clock_data.clock == 0 || clock_data.flags != 0) {
        fprintf(stderr, "invalid clock data returned (%llu, %u)\n",
                clock_data.clock, clock_data.flags);
    }

    clock_data.clock += 10000000;

    ret = crosvm_set_clock(crosvm, &clock_data);
    if (ret < 0) {
        fprintf(stderr, "failed to update clock: %d\n", ret);
        return 1;
    }

    clock_data.flags = -1U;
    ret = crosvm_set_clock(crosvm, &clock_data);
    if (ret >= 0) {
        fprintf(stderr, "unexpected success updating clock\n");
        return 1;
    }

    return 0;
}