master
c 125 lines 3.75 KB
Raw
1 /*
2 * SPDX-License-Identifier: GPL-2.0-or-later
3 *
4 * uefi vars device - sysbus variant.
5 */
6 #include "qemu/osdep.h"
7 #include "migration/vmstate.h"
8
9 #include "hw/core/qdev-properties.h"
10 #include "hw/core/sysbus.h"
11
12 #include "hw/uefi/hardware-info.h"
13 #include "hw/uefi/var-service.h"
14 #include "hw/uefi/var-service-api.h"
15
16 OBJECT_DECLARE_SIMPLE_TYPE(uefi_vars_sysbus_state, UEFI_VARS_SYSBUS)
17
18 struct uefi_vars_sysbus_state {
19 SysBusDevice parent_obj;
20 struct uefi_vars_state state;
21 };
22
23 static const VMStateDescription vmstate_uefi_vars_sysbus = {
24 .name = TYPE_UEFI_VARS_SYSBUS,
25 .fields = (VMStateField[]) {
26 VMSTATE_STRUCT(state, uefi_vars_sysbus_state, 0,
27 vmstate_uefi_vars, uefi_vars_state),
28 VMSTATE_END_OF_LIST()
29 }
30 };
31
32 static const Property uefi_vars_sysbus_properties[] = {
33 DEFINE_PROP_SIZE("size", uefi_vars_sysbus_state, state.max_storage,
34 256 * 1024),
35 DEFINE_PROP_STRING("jsonfile", uefi_vars_sysbus_state, state.jsonfile),
36 DEFINE_PROP_STRING("pcapfile", uefi_vars_sysbus_state, state.pcapfile),
37 DEFINE_PROP_BOOL("force-secure-boot", uefi_vars_sysbus_state,
38 state.force_secure_boot, false),
39 DEFINE_PROP_BOOL("disable-custom-mode", uefi_vars_sysbus_state,
40 state.disable_custom_mode, false),
41 DEFINE_PROP_BOOL("use-pio", uefi_vars_sysbus_state,
42 state.use_pio, false),
43 };
44
45 static void uefi_vars_sysbus_init(Object *obj)
46 {
47 uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(obj);
48
49 uefi_vars_init(obj, &uv->state);
50 }
51
52 static void uefi_vars_sysbus_reset(DeviceState *dev)
53 {
54 uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(dev);
55
56 uefi_vars_hard_reset(&uv->state);
57 }
58
59 static void uefi_vars_sysbus_realize(DeviceState *dev, Error **errp)
60 {
61 uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(dev);
62 SysBusDevice *sysbus = SYS_BUS_DEVICE(dev);
63
64 sysbus_init_mmio(sysbus, &uv->state.mr);
65 uefi_vars_realize(&uv->state, errp);
66 }
67
68 static void uefi_vars_sysbus_class_init(ObjectClass *klass, const void *data)
69 {
70 DeviceClass *dc = DEVICE_CLASS(klass);
71
72 dc->realize = uefi_vars_sysbus_realize;
73 dc->vmsd = &vmstate_uefi_vars_sysbus;
74 dc->user_creatable = true;
75 device_class_set_legacy_reset(dc, uefi_vars_sysbus_reset);
76 device_class_set_props(dc, uefi_vars_sysbus_properties);
77 set_bit(DEVICE_CATEGORY_MISC, dc->categories);
78 }
79
80 /* generic: hardware discovery via FDT */
81 static const TypeInfo uefi_vars_sysbus_info = {
82 .name = TYPE_UEFI_VARS_SYSBUS,
83 .parent = TYPE_SYS_BUS_DEVICE,
84 .instance_size = sizeof(uefi_vars_sysbus_state),
85 .instance_init = uefi_vars_sysbus_init,
86 .class_init = uefi_vars_sysbus_class_init,
87 };
88 module_obj(TYPE_UEFI_VARS_SYSBUS);
89
90 static void uefi_vars_x64_realize(DeviceState *dev, Error **errp)
91 {
92 HARDWARE_INFO_SIMPLE_DEVICE hwinfo = {
93 .mmio_address = cpu_to_le64(0xfef10000),
94 };
95 SysBusDevice *sysbus = SYS_BUS_DEVICE(dev);
96
97 uefi_vars_sysbus_realize(dev, errp);
98
99 hardware_info_register(HardwareInfoQemuUefiVars,
100 &hwinfo, sizeof(hwinfo));
101 sysbus_mmio_map(sysbus, 0, hwinfo.mmio_address);
102 }
103
104 static void uefi_vars_x64_class_init(ObjectClass *klass, const void *data)
105 {
106 DeviceClass *dc = DEVICE_CLASS(klass);
107
108 dc->realize = uefi_vars_x64_realize;
109 }
110
111 /* x64: hardware discovery via etc/hardware-info fw_cfg */
112 static const TypeInfo uefi_vars_x64_info = {
113 .name = TYPE_UEFI_VARS_X64,
114 .parent = TYPE_UEFI_VARS_SYSBUS,
115 .class_init = uefi_vars_x64_class_init,
116 };
117 module_obj(TYPE_UEFI_VARS_X64);
118
119 static void uefi_vars_sysbus_register_types(void)
120 {
121 type_register_static(&uefi_vars_sysbus_info);
122 type_register_static(&uefi_vars_x64_info);
123 }
124
125 type_init(uefi_vars_sysbus_register_types)