xref: /openbmc/qemu/hw/misc/debugexit.c (revision c122bca9)
1e28bee8eSPaolo Bonzini /*
2e28bee8eSPaolo Bonzini  * debug exit port emulation
3e28bee8eSPaolo Bonzini  *
4e28bee8eSPaolo Bonzini  * This program is free software; you can redistribute it and/or
5e28bee8eSPaolo Bonzini  * modify it under the terms of the GNU General Public License as
6e28bee8eSPaolo Bonzini  * published by the Free Software Foundation; either version 2 or
7e28bee8eSPaolo Bonzini  * (at your option) any later version.
8e28bee8eSPaolo Bonzini  */
9e28bee8eSPaolo Bonzini 
10b6a0aa05SPeter Maydell #include "qemu/osdep.h"
11e28bee8eSPaolo Bonzini #include "hw/isa/isa.h"
12a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h"
130b8fa32fSMarkus Armbruster #include "qemu/module.h"
14db1015e9SEduardo Habkost #include "qom/object.h"
15e28bee8eSPaolo Bonzini 
16e28bee8eSPaolo Bonzini #define TYPE_ISA_DEBUG_EXIT_DEVICE "isa-debug-exit"
17*8063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(ISADebugExitState, ISA_DEBUG_EXIT_DEVICE)
18e28bee8eSPaolo Bonzini 
19db1015e9SEduardo Habkost struct ISADebugExitState {
20e28bee8eSPaolo Bonzini     ISADevice parent_obj;
21e28bee8eSPaolo Bonzini 
22e28bee8eSPaolo Bonzini     uint32_t iobase;
23e28bee8eSPaolo Bonzini     uint32_t iosize;
24e28bee8eSPaolo Bonzini     MemoryRegion io;
25db1015e9SEduardo Habkost };
26e28bee8eSPaolo Bonzini 
debug_exit_read(void * opaque,hwaddr addr,unsigned size)27af71743aSLi Qiang static uint64_t debug_exit_read(void *opaque, hwaddr addr, unsigned size)
28af71743aSLi Qiang {
29af71743aSLi Qiang     return 0;
30af71743aSLi Qiang }
31af71743aSLi Qiang 
debug_exit_write(void * opaque,hwaddr addr,uint64_t val,unsigned width)32e28bee8eSPaolo Bonzini static void debug_exit_write(void *opaque, hwaddr addr, uint64_t val,
33e28bee8eSPaolo Bonzini                              unsigned width)
34e28bee8eSPaolo Bonzini {
35e28bee8eSPaolo Bonzini     exit((val << 1) | 1);
36e28bee8eSPaolo Bonzini }
37e28bee8eSPaolo Bonzini 
38e28bee8eSPaolo Bonzini static const MemoryRegionOps debug_exit_ops = {
39af71743aSLi Qiang     .read = debug_exit_read,
40e28bee8eSPaolo Bonzini     .write = debug_exit_write,
41e28bee8eSPaolo Bonzini     .valid.min_access_size = 1,
42e28bee8eSPaolo Bonzini     .valid.max_access_size = 4,
43e28bee8eSPaolo Bonzini     .endianness = DEVICE_LITTLE_ENDIAN,
44e28bee8eSPaolo Bonzini };
45e28bee8eSPaolo Bonzini 
debug_exit_realizefn(DeviceState * d,Error ** errp)46db895a1eSAndreas Färber static void debug_exit_realizefn(DeviceState *d, Error **errp)
47e28bee8eSPaolo Bonzini {
48db895a1eSAndreas Färber     ISADevice *dev = ISA_DEVICE(d);
49db895a1eSAndreas Färber     ISADebugExitState *isa = ISA_DEBUG_EXIT_DEVICE(d);
50e28bee8eSPaolo Bonzini 
513c161542SPaolo Bonzini     memory_region_init_io(&isa->io, OBJECT(dev), &debug_exit_ops, isa,
52e28bee8eSPaolo Bonzini                           TYPE_ISA_DEBUG_EXIT_DEVICE, isa->iosize);
53e28bee8eSPaolo Bonzini     memory_region_add_subregion(isa_address_space_io(dev),
54e28bee8eSPaolo Bonzini                                 isa->iobase, &isa->io);
55e28bee8eSPaolo Bonzini }
56e28bee8eSPaolo Bonzini 
57e28bee8eSPaolo Bonzini static Property debug_exit_properties[] = {
58c7bcc85dSPaolo Bonzini     DEFINE_PROP_UINT32("iobase", ISADebugExitState, iobase, 0x501),
59c7bcc85dSPaolo Bonzini     DEFINE_PROP_UINT32("iosize", ISADebugExitState, iosize, 0x02),
60e28bee8eSPaolo Bonzini     DEFINE_PROP_END_OF_LIST(),
61e28bee8eSPaolo Bonzini };
62e28bee8eSPaolo Bonzini 
debug_exit_class_initfn(ObjectClass * klass,void * data)63e28bee8eSPaolo Bonzini static void debug_exit_class_initfn(ObjectClass *klass, void *data)
64e28bee8eSPaolo Bonzini {
65e28bee8eSPaolo Bonzini     DeviceClass *dc = DEVICE_CLASS(klass);
66db895a1eSAndreas Färber 
67db895a1eSAndreas Färber     dc->realize = debug_exit_realizefn;
684f67d30bSMarc-André Lureau     device_class_set_props(dc, debug_exit_properties);
69125ee0edSMarcel Apfelbaum     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
70e28bee8eSPaolo Bonzini }
71e28bee8eSPaolo Bonzini 
72e28bee8eSPaolo Bonzini static const TypeInfo debug_exit_info = {
73e28bee8eSPaolo Bonzini     .name          = TYPE_ISA_DEBUG_EXIT_DEVICE,
74e28bee8eSPaolo Bonzini     .parent        = TYPE_ISA_DEVICE,
75e28bee8eSPaolo Bonzini     .instance_size = sizeof(ISADebugExitState),
76e28bee8eSPaolo Bonzini     .class_init    = debug_exit_class_initfn,
77e28bee8eSPaolo Bonzini };
78e28bee8eSPaolo Bonzini 
debug_exit_register_types(void)79e28bee8eSPaolo Bonzini static void debug_exit_register_types(void)
80e28bee8eSPaolo Bonzini {
81e28bee8eSPaolo Bonzini     type_register_static(&debug_exit_info);
82e28bee8eSPaolo Bonzini }
83e28bee8eSPaolo Bonzini 
84e28bee8eSPaolo Bonzini type_init(debug_exit_register_types)
85