xref: /openbmc/qemu/hw/misc/debugexit.c (revision 3c161542)
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 
10e28bee8eSPaolo Bonzini #include "hw/hw.h"
11e28bee8eSPaolo Bonzini #include "hw/isa/isa.h"
12e28bee8eSPaolo Bonzini 
13e28bee8eSPaolo Bonzini #define TYPE_ISA_DEBUG_EXIT_DEVICE "isa-debug-exit"
14e28bee8eSPaolo Bonzini #define ISA_DEBUG_EXIT_DEVICE(obj) \
15e28bee8eSPaolo Bonzini      OBJECT_CHECK(ISADebugExitState, (obj), TYPE_ISA_DEBUG_EXIT_DEVICE)
16e28bee8eSPaolo Bonzini 
17e28bee8eSPaolo Bonzini typedef struct ISADebugExitState {
18e28bee8eSPaolo Bonzini     ISADevice parent_obj;
19e28bee8eSPaolo Bonzini 
20e28bee8eSPaolo Bonzini     uint32_t iobase;
21e28bee8eSPaolo Bonzini     uint32_t iosize;
22e28bee8eSPaolo Bonzini     MemoryRegion io;
23e28bee8eSPaolo Bonzini } ISADebugExitState;
24e28bee8eSPaolo Bonzini 
25e28bee8eSPaolo Bonzini static void debug_exit_write(void *opaque, hwaddr addr, uint64_t val,
26e28bee8eSPaolo Bonzini                              unsigned width)
27e28bee8eSPaolo Bonzini {
28e28bee8eSPaolo Bonzini     exit((val << 1) | 1);
29e28bee8eSPaolo Bonzini }
30e28bee8eSPaolo Bonzini 
31e28bee8eSPaolo Bonzini static const MemoryRegionOps debug_exit_ops = {
32e28bee8eSPaolo Bonzini     .write = debug_exit_write,
33e28bee8eSPaolo Bonzini     .valid.min_access_size = 1,
34e28bee8eSPaolo Bonzini     .valid.max_access_size = 4,
35e28bee8eSPaolo Bonzini     .endianness = DEVICE_LITTLE_ENDIAN,
36e28bee8eSPaolo Bonzini };
37e28bee8eSPaolo Bonzini 
38db895a1eSAndreas Färber static void debug_exit_realizefn(DeviceState *d, Error **errp)
39e28bee8eSPaolo Bonzini {
40db895a1eSAndreas Färber     ISADevice *dev = ISA_DEVICE(d);
41db895a1eSAndreas Färber     ISADebugExitState *isa = ISA_DEBUG_EXIT_DEVICE(d);
42e28bee8eSPaolo Bonzini 
43*3c161542SPaolo Bonzini     memory_region_init_io(&isa->io, OBJECT(dev), &debug_exit_ops, isa,
44e28bee8eSPaolo Bonzini                           TYPE_ISA_DEBUG_EXIT_DEVICE, isa->iosize);
45e28bee8eSPaolo Bonzini     memory_region_add_subregion(isa_address_space_io(dev),
46e28bee8eSPaolo Bonzini                                 isa->iobase, &isa->io);
47e28bee8eSPaolo Bonzini }
48e28bee8eSPaolo Bonzini 
49e28bee8eSPaolo Bonzini static Property debug_exit_properties[] = {
50e28bee8eSPaolo Bonzini     DEFINE_PROP_HEX32("iobase", ISADebugExitState, iobase, 0x501),
51e28bee8eSPaolo Bonzini     DEFINE_PROP_HEX32("iosize", ISADebugExitState, iosize, 0x02),
52e28bee8eSPaolo Bonzini     DEFINE_PROP_END_OF_LIST(),
53e28bee8eSPaolo Bonzini };
54e28bee8eSPaolo Bonzini 
55e28bee8eSPaolo Bonzini static void debug_exit_class_initfn(ObjectClass *klass, void *data)
56e28bee8eSPaolo Bonzini {
57e28bee8eSPaolo Bonzini     DeviceClass *dc = DEVICE_CLASS(klass);
58db895a1eSAndreas Färber 
59db895a1eSAndreas Färber     dc->realize = debug_exit_realizefn;
60e28bee8eSPaolo Bonzini     dc->props = debug_exit_properties;
61e28bee8eSPaolo Bonzini }
62e28bee8eSPaolo Bonzini 
63e28bee8eSPaolo Bonzini static const TypeInfo debug_exit_info = {
64e28bee8eSPaolo Bonzini     .name          = TYPE_ISA_DEBUG_EXIT_DEVICE,
65e28bee8eSPaolo Bonzini     .parent        = TYPE_ISA_DEVICE,
66e28bee8eSPaolo Bonzini     .instance_size = sizeof(ISADebugExitState),
67e28bee8eSPaolo Bonzini     .class_init    = debug_exit_class_initfn,
68e28bee8eSPaolo Bonzini };
69e28bee8eSPaolo Bonzini 
70e28bee8eSPaolo Bonzini static void debug_exit_register_types(void)
71e28bee8eSPaolo Bonzini {
72e28bee8eSPaolo Bonzini     type_register_static(&debug_exit_info);
73e28bee8eSPaolo Bonzini }
74e28bee8eSPaolo Bonzini 
75e28bee8eSPaolo Bonzini type_init(debug_exit_register_types)
76