|
|
|
@ -29,20 +29,27 @@ |
|
|
|
#include "isa.h" |
|
|
|
#include "pc.h" |
|
|
|
|
|
|
|
#define TYPE_ISA_DEBUGCON_DEVICE "isa-debugcon" |
|
|
|
#define ISA_DEBUGCON_DEVICE(obj) \ |
|
|
|
OBJECT_CHECK(ISADebugconState, (obj), TYPE_ISA_DEBUGCON_DEVICE) |
|
|
|
|
|
|
|
//#define DEBUG_DEBUGCON
|
|
|
|
|
|
|
|
typedef struct DebugconState { |
|
|
|
MemoryRegion io; |
|
|
|
CharDriverState *chr; |
|
|
|
uint32_t readback; |
|
|
|
} DebugconState; |
|
|
|
|
|
|
|
typedef struct ISADebugconState { |
|
|
|
ISADevice dev; |
|
|
|
ISADevice parent_obj; |
|
|
|
|
|
|
|
uint32_t iobase; |
|
|
|
DebugconState state; |
|
|
|
} ISADebugconState; |
|
|
|
|
|
|
|
static void debugcon_ioport_write(void *opaque, uint32_t addr, uint32_t val) |
|
|
|
static void debugcon_ioport_write(void *opaque, hwaddr addr, uint64_t val, |
|
|
|
unsigned width) |
|
|
|
{ |
|
|
|
DebugconState *s = opaque; |
|
|
|
unsigned char ch = val; |
|
|
|
@ -55,7 +62,7 @@ static void debugcon_ioport_write(void *opaque, uint32_t addr, uint32_t val) |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static uint32_t debugcon_ioport_read(void *opaque, uint32_t addr) |
|
|
|
static uint64_t debugcon_ioport_read(void *opaque, hwaddr addr, unsigned width) |
|
|
|
{ |
|
|
|
DebugconState *s = opaque; |
|
|
|
|
|
|
|
@ -66,6 +73,14 @@ static uint32_t debugcon_ioport_read(void *opaque, uint32_t addr) |
|
|
|
return s->readback; |
|
|
|
} |
|
|
|
|
|
|
|
static const MemoryRegionOps debugcon_ops = { |
|
|
|
.read = debugcon_ioport_read, |
|
|
|
.write = debugcon_ioport_write, |
|
|
|
.valid.min_access_size = 1, |
|
|
|
.valid.max_access_size = 1, |
|
|
|
.endianness = DEVICE_LITTLE_ENDIAN, |
|
|
|
}; |
|
|
|
|
|
|
|
static void debugcon_init_core(DebugconState *s) |
|
|
|
{ |
|
|
|
if (!s->chr) { |
|
|
|
@ -78,12 +93,14 @@ static void debugcon_init_core(DebugconState *s) |
|
|
|
|
|
|
|
static int debugcon_isa_initfn(ISADevice *dev) |
|
|
|
{ |
|
|
|
ISADebugconState *isa = DO_UPCAST(ISADebugconState, dev, dev); |
|
|
|
ISADebugconState *isa = ISA_DEBUGCON_DEVICE(dev); |
|
|
|
DebugconState *s = &isa->state; |
|
|
|
|
|
|
|
debugcon_init_core(s); |
|
|
|
register_ioport_write(isa->iobase, 1, 1, debugcon_ioport_write, s); |
|
|
|
register_ioport_read(isa->iobase, 1, 1, debugcon_ioport_read, s); |
|
|
|
memory_region_init_io(&s->io, &debugcon_ops, s, |
|
|
|
TYPE_ISA_DEBUGCON_DEVICE, 1); |
|
|
|
memory_region_add_subregion(isa_address_space_io(dev), |
|
|
|
isa->iobase, &s->io); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
@ -103,7 +120,7 @@ static void debugcon_isa_class_initfn(ObjectClass *klass, void *data) |
|
|
|
} |
|
|
|
|
|
|
|
static TypeInfo debugcon_isa_info = { |
|
|
|
.name = "isa-debugcon", |
|
|
|
.name = TYPE_ISA_DEBUGCON_DEVICE, |
|
|
|
.parent = TYPE_ISA_DEVICE, |
|
|
|
.instance_size = sizeof(ISADebugconState), |
|
|
|
.class_init = debugcon_isa_class_initfn, |
|
|
|
|