xref: /qemu/hw/misc/pvpanic-mmio.c (revision 06b40d250ecfa1633209c2e431a7a38acfd03a98)
1a89607c4SAlexander Graf /*
2a89607c4SAlexander Graf  * QEMU simulated pvpanic device (MMIO frontend)
3a89607c4SAlexander Graf  *
4a89607c4SAlexander Graf  * Copyright © 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
5a89607c4SAlexander Graf  *
6a89607c4SAlexander Graf  * SPDX-License-Identifier: GPL-2.0-or-later
7a89607c4SAlexander Graf  */
8a89607c4SAlexander Graf 
9a89607c4SAlexander Graf #include "qemu/osdep.h"
10a89607c4SAlexander Graf 
11a89607c4SAlexander Graf #include "hw/qdev-properties.h"
12a89607c4SAlexander Graf #include "hw/misc/pvpanic.h"
13a89607c4SAlexander Graf #include "hw/sysbus.h"
14a89607c4SAlexander Graf #include "standard-headers/misc/pvpanic.h"
15a89607c4SAlexander Graf 
16a89607c4SAlexander Graf OBJECT_DECLARE_SIMPLE_TYPE(PVPanicMMIOState, PVPANIC_MMIO_DEVICE)
17a89607c4SAlexander Graf 
18a89607c4SAlexander Graf #define PVPANIC_MMIO_SIZE 0x2
19a89607c4SAlexander Graf 
20a89607c4SAlexander Graf struct PVPanicMMIOState {
21a89607c4SAlexander Graf     SysBusDevice parent_obj;
22a89607c4SAlexander Graf 
23a89607c4SAlexander Graf     PVPanicState pvpanic;
24a89607c4SAlexander Graf };
25a89607c4SAlexander Graf 
pvpanic_mmio_initfn(Object * obj)26a89607c4SAlexander Graf static void pvpanic_mmio_initfn(Object *obj)
27a89607c4SAlexander Graf {
28a89607c4SAlexander Graf     PVPanicMMIOState *s = PVPANIC_MMIO_DEVICE(obj);
29a89607c4SAlexander Graf 
30a89607c4SAlexander Graf     pvpanic_setup_io(&s->pvpanic, DEVICE(s), PVPANIC_MMIO_SIZE);
31a89607c4SAlexander Graf     sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->pvpanic.mr);
32a89607c4SAlexander Graf }
33a89607c4SAlexander Graf 
34a89607c4SAlexander Graf static const Property pvpanic_mmio_properties[] = {
35a89607c4SAlexander Graf     DEFINE_PROP_UINT8("events", PVPanicMMIOState, pvpanic.events,
36a89607c4SAlexander Graf                       PVPANIC_PANICKED | PVPANIC_CRASH_LOADED),
37a89607c4SAlexander Graf };
38a89607c4SAlexander Graf 
pvpanic_mmio_class_init(ObjectClass * klass,const void * data)39*12d1a768SPhilippe Mathieu-Daudé static void pvpanic_mmio_class_init(ObjectClass *klass, const void *data)
40a89607c4SAlexander Graf {
41a89607c4SAlexander Graf     DeviceClass *dc = DEVICE_CLASS(klass);
42a89607c4SAlexander Graf 
43a89607c4SAlexander Graf     device_class_set_props(dc, pvpanic_mmio_properties);
44a89607c4SAlexander Graf     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
45a89607c4SAlexander Graf }
46a89607c4SAlexander Graf 
47a89607c4SAlexander Graf static const TypeInfo pvpanic_mmio_info = {
48a89607c4SAlexander Graf     .name          = TYPE_PVPANIC_MMIO_DEVICE,
49a89607c4SAlexander Graf     .parent        = TYPE_SYS_BUS_DEVICE,
50a89607c4SAlexander Graf     .instance_size = sizeof(PVPanicMMIOState),
51a89607c4SAlexander Graf     .instance_init = pvpanic_mmio_initfn,
52a89607c4SAlexander Graf     .class_init    = pvpanic_mmio_class_init,
53a89607c4SAlexander Graf };
54a89607c4SAlexander Graf 
pvpanic_register_types(void)55a89607c4SAlexander Graf static void pvpanic_register_types(void)
56a89607c4SAlexander Graf {
57a89607c4SAlexander Graf     type_register_static(&pvpanic_mmio_info);
58a89607c4SAlexander Graf }
59a89607c4SAlexander Graf 
60a89607c4SAlexander Graf type_init(pvpanic_register_types)
61