xref: /openbmc/qemu/accel/qtest/qtest.c (revision 5a28fa5ba17254d0398a854657b47af3096bd86a)
1 /*
2  * QTest accelerator code
3  *
4  * Copyright IBM, Corp. 2011
5  *
6  * Authors:
7  *  Anthony Liguori   <aliguori@us.ibm.com>
8  *
9  * This work is licensed under the terms of the GNU GPL, version 2 or later.
10  * See the COPYING file in the top-level directory.
11  *
12  */
13 
14 #include "qemu/osdep.h"
15 #include "qemu/rcu.h"
16 #include "qapi/error.h"
17 #include "qemu/module.h"
18 #include "qemu/option.h"
19 #include "qemu/config-file.h"
20 #include "qemu/accel.h"
21 #include "system/accel-ops.h"
22 #include "system/qtest.h"
23 #include "system/cpus.h"
24 #include "qemu/guest-random.h"
25 #include "qemu/main-loop.h"
26 #include "hw/core/cpu.h"
27 #include "accel/dummy-cpus.h"
28 
29 static int64_t qtest_clock_counter;
30 
31 static int64_t qtest_get_virtual_clock(void)
32 {
33     return qatomic_read_i64(&qtest_clock_counter);
34 }
35 
36 static void qtest_set_virtual_clock(int64_t count)
37 {
38     qatomic_set_i64(&qtest_clock_counter, count);
39 }
40 
41 static int qtest_init_accel(AccelState *as, MachineState *ms)
42 {
43     return 0;
44 }
45 
46 static void qtest_accel_class_init(ObjectClass *oc, const void *data)
47 {
48     AccelClass *ac = ACCEL_CLASS(oc);
49     ac->name = "QTest";
50     ac->init_machine = qtest_init_accel;
51     ac->allowed = &qtest_allowed;
52 }
53 
54 #define TYPE_QTEST_ACCEL ACCEL_CLASS_NAME("qtest")
55 
56 static const TypeInfo qtest_accel_type = {
57     .name = TYPE_QTEST_ACCEL,
58     .parent = TYPE_ACCEL,
59     .class_init = qtest_accel_class_init,
60 };
61 module_obj(TYPE_QTEST_ACCEL);
62 
63 static void qtest_accel_ops_class_init(ObjectClass *oc, const void *data)
64 {
65     AccelOpsClass *ops = ACCEL_OPS_CLASS(oc);
66 
67     ops->create_vcpu_thread = dummy_start_vcpu_thread;
68     ops->get_virtual_clock = qtest_get_virtual_clock;
69     ops->set_virtual_clock = qtest_set_virtual_clock;
70     ops->handle_interrupt = generic_handle_interrupt;
71 };
72 
73 static const TypeInfo qtest_accel_ops_type = {
74     .name = ACCEL_OPS_NAME("qtest"),
75 
76     .parent = TYPE_ACCEL_OPS,
77     .class_init = qtest_accel_ops_class_init,
78     .abstract = true,
79 };
80 module_obj(ACCEL_OPS_NAME("qtest"));
81 
82 static void qtest_type_init(void)
83 {
84     type_register_static(&qtest_accel_type);
85     type_register_static(&qtest_accel_ops_type);
86 }
87 
88 type_init(qtest_type_init);
89