master
c 115 lines 2.73 KB
Raw
1 /*
2 * QEMU IGVM interface
3 *
4 * Copyright (C) 2023-2024 SUSE
5 *
6 * Authors:
7 * Roy Hopkins <roy.hopkins@randomman.co.uk>
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
12 #include "qemu/osdep.h"
13
14 #include "system/igvm.h"
15 #include "system/igvm-cfg.h"
16 #include "system/igvm-internal.h"
17 #include "system/reset.h"
18 #include "qom/object_interfaces.h"
19 #include "hw/core/qdev.h"
20 #include "hw/core/boards.h"
21
22 #include "trace.h"
23
24 static char *get_igvm(Object *obj, Error **errp)
25 {
26 IgvmCfg *igvm = IGVM_CFG(obj);
27 return g_strdup(igvm->filename);
28 }
29
30 static void set_igvm(Object *obj, const char *value, Error **errp)
31 {
32 IgvmCfg *igvm = IGVM_CFG(obj);
33 g_free(igvm->filename);
34 igvm->filename = g_strdup(value);
35 }
36
37 static ResettableState *igvm_reset_state(Object *obj)
38 {
39 IgvmCfg *igvm = IGVM_CFG(obj);
40 return &igvm->reset_state;
41 }
42
43 static void igvm_reset_enter(Object *obj, ResetType type)
44 {
45 trace_igvm_reset_enter(type);
46 }
47
48 static void igvm_reset_hold(Object *obj, ResetType type)
49 {
50 MachineState *ms = MACHINE(qdev_get_machine());
51 IgvmCfg *igvm = IGVM_CFG(obj);
52
53 trace_igvm_reset_hold(type);
54
55 /* cleanup existing memory regions first */
56 qigvm_cleanup_memory(igvm);
57 qigvm_process_file(igvm, ms, false, &error_fatal);
58 }
59
60 static void igvm_reset_exit(Object *obj, ResetType type)
61 {
62 trace_igvm_reset_exit(type);
63 }
64
65 static void igvm_complete(UserCreatable *uc, Error **errp)
66 {
67 IgvmCfg *igvm = IGVM_CFG(uc);
68
69 igvm->file = qigvm_file_init(igvm->filename, errp);
70 QTAILQ_INIT(&igvm->memory_regions);
71 }
72
73 OBJECT_DEFINE_TYPE_WITH_INTERFACES(IgvmCfg, igvm_cfg, IGVM_CFG, OBJECT,
74 { TYPE_USER_CREATABLE },
75 { TYPE_RESETTABLE_INTERFACE },
76 { NULL })
77
78 static void igvm_cfg_class_init(ObjectClass *oc, const void *data)
79 {
80 IgvmCfgClass *igvmc = IGVM_CFG_CLASS(oc);
81 ResettableClass *rc = RESETTABLE_CLASS(oc);
82 UserCreatableClass *uc = USER_CREATABLE_CLASS(oc);
83
84 object_class_property_add_str(oc, "file", get_igvm, set_igvm);
85 object_class_property_set_description(oc, "file",
86 "Set the IGVM filename to use");
87
88 igvmc->process = qigvm_process_file;
89
90 rc->get_state = igvm_reset_state;
91 rc->phases.enter = igvm_reset_enter;
92 rc->phases.hold = igvm_reset_hold;
93 rc->phases.exit = igvm_reset_exit;
94
95 uc->complete = igvm_complete;
96 }
97
98 static void igvm_cfg_init(Object *obj)
99 {
100 IgvmCfg *igvm = IGVM_CFG(obj);
101
102 igvm->file = -1;
103 qemu_register_resettable(obj);
104 }
105
106 static void igvm_cfg_finalize(Object *obj)
107 {
108 IgvmCfg *igvm = IGVM_CFG(obj);
109
110 qemu_unregister_resettable(obj);
111 if (igvm->file >= 0) {
112 igvm_free(igvm->file);
113 }
114 g_free(igvm->filename);
115 }