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
|
/*
* SPDX-License-Identifier: GPL-2.0-or-later
*
* uefi vars device - sysbus variant.
*/
#include "qemu/osdep.h"
#include "migration/vmstate.h"
#include "hw/qdev-properties.h"
#include "hw/sysbus.h"
#include "hw/uefi/hardware-info.h"
#include "hw/uefi/var-service.h"
#include "hw/uefi/var-service-api.h"
OBJECT_DECLARE_SIMPLE_TYPE(uefi_vars_sysbus_state, UEFI_VARS_SYSBUS)
struct uefi_vars_sysbus_state {
SysBusDevice parent_obj;
struct uefi_vars_state state;
};
static const VMStateDescription vmstate_uefi_vars_sysbus = {
.name = TYPE_UEFI_VARS_SYSBUS,
.fields = (VMStateField[]) {
VMSTATE_STRUCT(state, uefi_vars_sysbus_state, 0,
vmstate_uefi_vars, uefi_vars_state),
VMSTATE_END_OF_LIST()
}
};
static const Property uefi_vars_sysbus_properties[] = {
DEFINE_PROP_SIZE("size", uefi_vars_sysbus_state, state.max_storage,
256 * 1024),
DEFINE_PROP_STRING("jsonfile", uefi_vars_sysbus_state, state.jsonfile),
DEFINE_PROP_BOOL("force-secure-boot", uefi_vars_sysbus_state,
state.force_secure_boot, false),
DEFINE_PROP_BOOL("disable-custom-mode", uefi_vars_sysbus_state,
state.disable_custom_mode, false),
DEFINE_PROP_BOOL("use-pio", uefi_vars_sysbus_state,
state.use_pio, false),
};
static void uefi_vars_sysbus_init(Object *obj)
{
uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(obj);
uefi_vars_init(obj, &uv->state);
}
static void uefi_vars_sysbus_reset(DeviceState *dev)
{
uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(dev);
uefi_vars_hard_reset(&uv->state);
}
static void uefi_vars_sysbus_realize(DeviceState *dev, Error **errp)
{
uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(dev);
SysBusDevice *sysbus = SYS_BUS_DEVICE(dev);
sysbus_init_mmio(sysbus, &uv->state.mr);
uefi_vars_realize(&uv->state, errp);
}
static void uefi_vars_sysbus_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
dc->realize = uefi_vars_sysbus_realize;
dc->vmsd = &vmstate_uefi_vars_sysbus;
dc->user_creatable = true;
device_class_set_legacy_reset(dc, uefi_vars_sysbus_reset);
device_class_set_props(dc, uefi_vars_sysbus_properties);
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
}
/* generic: hardware discovery via FDT */
static const TypeInfo uefi_vars_sysbus_info = {
.name = TYPE_UEFI_VARS_SYSBUS,
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(uefi_vars_sysbus_state),
.instance_init = uefi_vars_sysbus_init,
.class_init = uefi_vars_sysbus_class_init,
};
module_obj(TYPE_UEFI_VARS_SYSBUS);
static void uefi_vars_x64_realize(DeviceState *dev, Error **errp)
{
HARDWARE_INFO_SIMPLE_DEVICE hwinfo = {
.mmio_address = cpu_to_le64(0xfef10000),
};
SysBusDevice *sysbus = SYS_BUS_DEVICE(dev);
uefi_vars_sysbus_realize(dev, errp);
hardware_info_register(HardwareInfoQemuUefiVars,
&hwinfo, sizeof(hwinfo));
sysbus_mmio_map(sysbus, 0, hwinfo.mmio_address);
}
static void uefi_vars_x64_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
dc->realize = uefi_vars_x64_realize;
}
/* x64: hardware discovery via etc/hardware-info fw_cfg */
static const TypeInfo uefi_vars_x64_info = {
.name = TYPE_UEFI_VARS_X64,
.parent = TYPE_UEFI_VARS_SYSBUS,
.class_init = uefi_vars_x64_class_init,
};
module_obj(TYPE_UEFI_VARS_X64);
static void uefi_vars_sysbus_register_types(void)
{
type_register_static(&uefi_vars_sysbus_info);
type_register_static(&uefi_vars_x64_info);
}
type_init(uefi_vars_sysbus_register_types)
|