From 72cd63f817d5405f7f7339e3d389cee73c189b33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Mon, 2 Mar 2015 22:23:27 +0000 Subject: [PATCH 1/9] m48t59: move ISA ports/memory regions registration to QOM constructor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -device m48t59_isa can now be used to create a fully functional nvram. Signed-off-by: Hervé Poussineau CC: Andreas Färber Signed-off-by: Mark Cave-Ayland --- hw/timer/m48t59.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c index 31509d5c28..967a31319f 100644 --- a/hw/timer/m48t59.c +++ b/hw/timer/m48t59.c @@ -658,10 +658,9 @@ M48t59State *m48t59_init(qemu_irq IRQ, hwaddr mem_base, d = SYSBUS_M48T59(dev); state = &d->state; sysbus_connect_irq(s, 0, IRQ); - memory_region_init_io(&d->io, OBJECT(d), &m48t59_io_ops, state, - "m48t59", 4); if (io_base != 0) { - memory_region_add_subregion(get_system_io(), io_base, &d->io); + memory_region_add_subregion(get_system_io(), io_base, + sysbus_mmio_get_region(dev, 1)); } if (mem_base != 0) { sysbus_mmio_map(s, 0, mem_base); @@ -687,11 +686,6 @@ M48t59State *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size, d = ISA_M48T59(isadev); s = &d->state; - memory_region_init_io(&d->io, OBJECT(d), &m48t59_io_ops, s, "m48t59", 4); - if (io_base != 0) { - isa_register_ioport(isadev, &d->io, io_base); - } - return s; } @@ -715,19 +709,28 @@ static void m48t59_isa_realize(DeviceState *dev, Error **errp) isa_init_irq(isadev, &s->IRQ, 8); m48t59_realize_common(s, errp); + memory_region_init_io(&d->io, OBJECT(dev), &m48t59_io_ops, s, "m48t59", 4); + if (s->io_base != 0) { + isa_register_ioport(isadev, &d->io, s->io_base); + } + + return 0; } static int m48t59_init1(SysBusDevice *dev) { M48t59SysBusState *d = SYSBUS_M48T59(dev); + Object *o = OBJECT(dev); M48t59State *s = &d->state; Error *err = NULL; sysbus_init_irq(dev, &s->IRQ); - memory_region_init_io(&s->iomem, OBJECT(d), &nvram_ops, s, - "m48t59.nvram", s->size); + memory_region_init_io(&s->iomem, o, &nvram_ops, s, "m48t59.nvram", + s->size); + memory_region_init_io(&d->io, o, &m48t59_io_ops, s, "m48t59", 4); sysbus_init_mmio(dev, &s->iomem); + sysbus_init_mmio(dev, &d->io); m48t59_realize_common(s, &err); if (err != NULL) { error_free(err); @@ -751,8 +754,6 @@ static void m48t59_isa_class_init(ObjectClass *klass, void *data) dc->realize = m48t59_isa_realize; dc->reset = m48t59_reset_isa; dc->props = m48t59_isa_properties; - /* Reason: needs to be wired up by m48t59_init_isa() */ - dc->cannot_instantiate_with_device_add_yet = true; } static const TypeInfo m48t59_isa_info = { From 051ddccde29924cb200df3bca3db8c1a2aa10974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Mon, 2 Mar 2015 22:23:27 +0000 Subject: [PATCH 2/9] m48t59: register a QOM type for each nvram type we support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As m48t59 devices can only be created with m48t59_init() or m48t59_init_isa(), we know exactly which nvram types are required. Register only those three types. Remove .model and .size properties as they can be infered from nvram name. Rename type to 'isa-*' (and 'sysbus-*') to do like other devices ISA devices (isa-ide, isa-parallel, isa-serial...) Signed-off-by: Hervé Poussineau CC: Andreas Färber Signed-off-by: Mark Cave-Ayland --- hw/timer/m48t59.c | 242 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 167 insertions(+), 75 deletions(-) diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c index 967a31319f..c46b63c5a9 100644 --- a/hw/timer/m48t59.c +++ b/hw/timer/m48t59.c @@ -2,6 +2,7 @@ * QEMU M48T59 and M48T08 NVRAM emulation for PPC PREP and Sparc platforms * * Copyright (c) 2003-2005, 2007 Jocelyn Mayer + * Copyright (c) 2013 Hervé Poussineau * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -37,12 +38,35 @@ #define NVRAM_PRINTF(fmt, ...) do { } while (0) #endif +#define TYPE_M48TXX_SYS_BUS "sysbus-m48txx" +#define M48TXX_SYS_BUS_GET_CLASS(obj) \ + OBJECT_GET_CLASS(M48txxSysBusDeviceClass, (obj), TYPE_M48TXX_SYS_BUS) +#define M48TXX_SYS_BUS_CLASS(klass) \ + OBJECT_CLASS_CHECK(M48txxSysBusDeviceClass, (klass), TYPE_M48TXX_SYS_BUS) +#define M48TXX_SYS_BUS(obj) \ + OBJECT_CHECK(M48txxSysBusState, (obj), TYPE_M48TXX_SYS_BUS) + +#define TYPE_M48TXX_ISA "isa-m48txx" +#define M48TXX_ISA_GET_CLASS(obj) \ + OBJECT_GET_CLASS(M48txxISADeviceClass, (obj), TYPE_M48TXX_ISA) +#define M48TXX_ISA_CLASS(klass) \ + OBJECT_CLASS_CHECK(M48txxISADeviceClass, (klass), TYPE_M48TXX_ISA) +#define M48TXX_ISA(obj) \ + OBJECT_CHECK(M48txxISAState, (obj), TYPE_M48TXX_ISA) + /* * The M48T02, M48T08 and M48T59 chips are very similar. The newer '59 has * alarm and a watchdog timer and related control registers. In the * PPC platform there is also a nvram lock function. */ +typedef struct M48txxInfo { + const char *isa_name; + const char *sysbus_name; + uint32_t model; /* 2 = m48t02, 8 = m48t08, 59 = m48t59 */ + uint32_t size; +} M48txxInfo; + /* * Chipset docs: * http://www.st.com/stonline/products/literature/ds/2410/m48t02.pdf @@ -54,7 +78,6 @@ struct M48t59State { /* Hardware parameters */ qemu_irq IRQ; MemoryRegion iomem; - uint32_t io_base; uint32_t size; /* RTC management */ time_t time_offset; @@ -72,26 +95,45 @@ struct M48t59State { uint8_t lock; }; -#define TYPE_ISA_M48T59 "m48t59_isa" -#define ISA_M48T59(obj) \ - OBJECT_CHECK(M48t59ISAState, (obj), TYPE_ISA_M48T59) - -typedef struct M48t59ISAState { +typedef struct M48txxISAState { ISADevice parent_obj; - M48t59State state; + uint32_t io_base; MemoryRegion io; -} M48t59ISAState; +} M48txxISAState; -#define SYSBUS_M48T59(obj) \ - OBJECT_CHECK(M48t59SysBusState, (obj), TYPE_SYSBUS_M48T59) +typedef struct M48txxISADeviceClass { + ISADeviceClass parent_class; + M48txxInfo info; +} M48txxISADeviceClass; -typedef struct M48t59SysBusState { +typedef struct M48txxSysBusState { SysBusDevice parent_obj; - M48t59State state; MemoryRegion io; -} M48t59SysBusState; +} M48txxSysBusState; + +typedef struct M48txxSysBusDeviceClass { + SysBusDeviceClass parent_class; + M48txxInfo info; +} M48txxSysBusDeviceClass; + +static M48txxInfo m48txx_info[] = { + { + .sysbus_name = "sysbus-m48t02", + .model = 2, + .size = 0x800, + },{ + .sysbus_name = "sysbus-m48t08", + .model = 8, + .size = 0x2000, + },{ + .isa_name = "isa-m48t59", + .model = 59, + .size = 0x2000, + } +}; + /* Fake timer functions */ @@ -616,7 +658,7 @@ static void m48t59_reset_common(M48t59State *NVRAM) static void m48t59_reset_isa(DeviceState *d) { - M48t59ISAState *isa = ISA_M48T59(d); + M48txxISAState *isa = M48TXX_ISA(d); M48t59State *NVRAM = &isa->state; m48t59_reset_common(NVRAM); @@ -624,7 +666,7 @@ static void m48t59_reset_isa(DeviceState *d) static void m48t59_reset_sysbus(DeviceState *d) { - M48t59SysBusState *sys = SYSBUS_M48T59(d); + M48txxSysBusState *sys = M48TXX_SYS_BUS(d); M48t59State *NVRAM = &sys->state; m48t59_reset_common(NVRAM); @@ -646,47 +688,59 @@ M48t59State *m48t59_init(qemu_irq IRQ, hwaddr mem_base, { DeviceState *dev; SysBusDevice *s; - M48t59SysBusState *d; + M48txxSysBusState *d; M48t59State *state; + int i; - dev = qdev_create(NULL, TYPE_SYSBUS_M48T59); - qdev_prop_set_uint32(dev, "model", model); - qdev_prop_set_uint32(dev, "size", size); - qdev_prop_set_uint32(dev, "io_base", io_base); - qdev_init_nofail(dev); - s = SYS_BUS_DEVICE(dev); - d = SYSBUS_M48T59(dev); - state = &d->state; - sysbus_connect_irq(s, 0, IRQ); - if (io_base != 0) { - memory_region_add_subregion(get_system_io(), io_base, - sysbus_mmio_get_region(dev, 1)); - } - if (mem_base != 0) { - sysbus_mmio_map(s, 0, mem_base); + for (i = 0; i < ARRAY_SIZE(m48txx_info); i++) { + if (!m48txx_info[i].sysbus_name || + m48txx_info[i].size != size || + m48txx_info[i].model != model) { + continue; + } + + dev = qdev_create(NULL, m48txx_info[i].sysbus_name); + qdev_init_nofail(dev); + s = SYS_BUS_DEVICE(dev); + d = M48TXX_SYS_BUS(s); + state = &d->state; + sysbus_connect_irq(s, 0, IRQ); + if (io_base != 0) { + memory_region_add_subregion(get_system_io(), io_base, + sysbus_mmio_get_region(s, 1)); + } + if (mem_base != 0) { + sysbus_mmio_map(s, 0, mem_base); + } + + return state; } - return state; + assert(false); + return NULL; } M48t59State *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size, int model) { - M48t59ISAState *d; - ISADevice *isadev; DeviceState *dev; - M48t59State *s; + int i; - isadev = isa_create(bus, TYPE_ISA_M48T59); - dev = DEVICE(isadev); - qdev_prop_set_uint32(dev, "model", model); - qdev_prop_set_uint32(dev, "size", size); - qdev_prop_set_uint32(dev, "io_base", io_base); - qdev_init_nofail(dev); - d = ISA_M48T59(isadev); - s = &d->state; + for (i = 0; i < ARRAY_SIZE(m48txx_info); i++) { + if (!m48txx_info[i].isa_name || + m48txx_info[i].size != size || + m48txx_info[i].model != model) { + continue; + } - return s; + dev = DEVICE(isa_create(bus, m48txx_info[i].isa_name)); + qdev_prop_set_uint32(dev, "iobase", io_base); + qdev_init_nofail(dev); + return &M48TXX_ISA(dev)->state; + } + + assert(false); + return NULL; } static void m48t59_realize_common(M48t59State *s, Error **errp) @@ -703,27 +757,31 @@ static void m48t59_realize_common(M48t59State *s, Error **errp) static void m48t59_isa_realize(DeviceState *dev, Error **errp) { + M48txxISADeviceClass *u = M48TXX_ISA_GET_CLASS(dev); ISADevice *isadev = ISA_DEVICE(dev); - M48t59ISAState *d = ISA_M48T59(dev); + M48txxISAState *d = M48TXX_ISA(dev); M48t59State *s = &d->state; + s->model = u->info.model; + s->size = u->info.size; isa_init_irq(isadev, &s->IRQ, 8); m48t59_realize_common(s, errp); memory_region_init_io(&d->io, OBJECT(dev), &m48t59_io_ops, s, "m48t59", 4); - if (s->io_base != 0) { - isa_register_ioport(isadev, &d->io, s->io_base); + if (d->io_base != 0) { + isa_register_ioport(isadev, &d->io, d->io_base); } - - return 0; } static int m48t59_init1(SysBusDevice *dev) { - M48t59SysBusState *d = SYSBUS_M48T59(dev); + M48txxSysBusDeviceClass *u = M48TXX_SYS_BUS_GET_CLASS(dev); + M48txxSysBusState *d = M48TXX_SYS_BUS(dev); Object *o = OBJECT(dev); M48t59State *s = &d->state; Error *err = NULL; + s->model = u->info.model; + s->size = u->info.size; sysbus_init_irq(dev, &s->IRQ); memory_region_init_io(&s->iomem, o, &nvram_ops, s, "m48t59.nvram", @@ -741,13 +799,11 @@ static int m48t59_init1(SysBusDevice *dev) } static Property m48t59_isa_properties[] = { - DEFINE_PROP_UINT32("size", M48t59ISAState, state.size, -1), - DEFINE_PROP_UINT32("model", M48t59ISAState, state.model, -1), - DEFINE_PROP_UINT32("io_base", M48t59ISAState, state.io_base, 0), + DEFINE_PROP_UINT32("iobase", M48txxISAState, io_base, 0x74), DEFINE_PROP_END_OF_LIST(), }; -static void m48t59_isa_class_init(ObjectClass *klass, void *data) +static void m48txx_isa_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -756,41 +812,77 @@ static void m48t59_isa_class_init(ObjectClass *klass, void *data) dc->props = m48t59_isa_properties; } -static const TypeInfo m48t59_isa_info = { - .name = TYPE_ISA_M48T59, - .parent = TYPE_ISA_DEVICE, - .instance_size = sizeof(M48t59ISAState), - .class_init = m48t59_isa_class_init, -}; +static void m48txx_isa_concrete_class_init(ObjectClass *klass, void *data) +{ + M48txxISADeviceClass *u = M48TXX_ISA_CLASS(klass); + M48txxInfo *info = data; -static Property m48t59_properties[] = { - DEFINE_PROP_UINT32("size", M48t59SysBusState, state.size, -1), - DEFINE_PROP_UINT32("model", M48t59SysBusState, state.model, -1), - DEFINE_PROP_UINT32("io_base", M48t59SysBusState, state.io_base, 0), - DEFINE_PROP_END_OF_LIST(), -}; + u->info = *info; +} -static void m48t59_class_init(ObjectClass *klass, void *data) +static void m48txx_sysbus_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); k->init = m48t59_init1; dc->reset = m48t59_reset_sysbus; - dc->props = m48t59_properties; } -static const TypeInfo m48t59_info = { - .name = TYPE_SYSBUS_M48T59, - .parent = TYPE_SYS_BUS_DEVICE, - .instance_size = sizeof(M48t59SysBusState), - .class_init = m48t59_class_init, +static void m48txx_sysbus_concrete_class_init(ObjectClass *klass, void *data) +{ + M48txxSysBusDeviceClass *u = M48TXX_SYS_BUS_CLASS(klass); + M48txxInfo *info = data; + + u->info = *info; +} + +static const TypeInfo m48txx_sysbus_type_info = { + .name = TYPE_M48TXX_SYS_BUS, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(M48txxSysBusState), + .abstract = true, + .class_init = m48txx_sysbus_class_init, +}; + +static const TypeInfo m48txx_isa_type_info = { + .name = TYPE_M48TXX_ISA, + .parent = TYPE_ISA_DEVICE, + .instance_size = sizeof(M48txxISAState), + .abstract = true, + .class_init = m48txx_isa_class_init, }; static void m48t59_register_types(void) { - type_register_static(&m48t59_info); - type_register_static(&m48t59_isa_info); + TypeInfo sysbus_type_info = { + .parent = TYPE_M48TXX_SYS_BUS, + .class_size = sizeof(M48txxSysBusDeviceClass), + .class_init = m48txx_sysbus_concrete_class_init, + }; + TypeInfo isa_type_info = { + .parent = TYPE_M48TXX_ISA, + .class_size = sizeof(M48txxISADeviceClass), + .class_init = m48txx_isa_concrete_class_init, + }; + int i; + + type_register_static(&m48txx_sysbus_type_info); + type_register_static(&m48txx_isa_type_info); + + for (i = 0; i < ARRAY_SIZE(m48txx_info); i++) { + if (m48txx_info[i].sysbus_name) { + sysbus_type_info.name = m48txx_info[i].sysbus_name; + sysbus_type_info.class_data = &m48txx_info[i]; + type_register(&sysbus_type_info); + } + + if (m48txx_info[i].isa_name) { + isa_type_info.name = m48txx_info[i].isa_name; + isa_type_info.class_data = &m48txx_info[i]; + type_register(&isa_type_info); + } + } } type_init(m48t59_register_types) From 43745328881e839124d3d589644732cb65052819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Mon, 2 Mar 2015 22:23:27 +0000 Subject: [PATCH 3/9] m48t59: add a Nvram interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Hervé Poussineau CC: Andreas Färber Signed-off-by: Mark Cave-Ayland --- hw/timer/m48t59.c | 59 +++++++++++++++++++++++++++++++++++++++ include/hw/timer/m48t59.h | 24 ++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c index c46b63c5a9..c5e74cec2f 100644 --- a/hw/timer/m48t59.c +++ b/hw/timer/m48t59.c @@ -798,6 +798,24 @@ static int m48t59_init1(SysBusDevice *dev) return 0; } +static uint32_t m48txx_isa_read(Nvram *obj, uint32_t addr) +{ + M48txxISAState *d = M48TXX_ISA(obj); + return m48t59_read(&d->state, addr); +} + +static void m48txx_isa_write(Nvram *obj, uint32_t addr, uint32_t val) +{ + M48txxISAState *d = M48TXX_ISA(obj); + m48t59_write(&d->state, addr, val); +} + +static void m48txx_isa_toggle_lock(Nvram *obj, int lock) +{ + M48txxISAState *d = M48TXX_ISA(obj); + m48t59_toggle_lock(&d->state, lock); +} + static Property m48t59_isa_properties[] = { DEFINE_PROP_UINT32("iobase", M48txxISAState, io_base, 0x74), DEFINE_PROP_END_OF_LIST(), @@ -806,10 +824,14 @@ static Property m48t59_isa_properties[] = { static void m48txx_isa_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); + NvramClass *nc = NVRAM_CLASS(klass); dc->realize = m48t59_isa_realize; dc->reset = m48t59_reset_isa; dc->props = m48t59_isa_properties; + nc->read = m48txx_isa_read; + nc->write = m48txx_isa_write; + nc->toggle_lock = m48txx_isa_toggle_lock; } static void m48txx_isa_concrete_class_init(ObjectClass *klass, void *data) @@ -820,13 +842,35 @@ static void m48txx_isa_concrete_class_init(ObjectClass *klass, void *data) u->info = *info; } +static uint32_t m48txx_sysbus_read(Nvram *obj, uint32_t addr) +{ + M48txxSysBusState *d = M48TXX_SYS_BUS(obj); + return m48t59_read(&d->state, addr); +} + +static void m48txx_sysbus_write(Nvram *obj, uint32_t addr, uint32_t val) +{ + M48txxSysBusState *d = M48TXX_SYS_BUS(obj); + m48t59_write(&d->state, addr, val); +} + +static void m48txx_sysbus_toggle_lock(Nvram *obj, int lock) +{ + M48txxSysBusState *d = M48TXX_SYS_BUS(obj); + m48t59_toggle_lock(&d->state, lock); +} + static void m48txx_sysbus_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); + NvramClass *nc = NVRAM_CLASS(klass); k->init = m48t59_init1; dc->reset = m48t59_reset_sysbus; + nc->read = m48txx_sysbus_read; + nc->write = m48txx_sysbus_write; + nc->toggle_lock = m48txx_sysbus_toggle_lock; } static void m48txx_sysbus_concrete_class_init(ObjectClass *klass, void *data) @@ -837,12 +881,22 @@ static void m48txx_sysbus_concrete_class_init(ObjectClass *klass, void *data) u->info = *info; } +static const TypeInfo nvram_info = { + .name = TYPE_NVRAM, + .parent = TYPE_INTERFACE, + .class_size = sizeof(NvramClass), +}; + static const TypeInfo m48txx_sysbus_type_info = { .name = TYPE_M48TXX_SYS_BUS, .parent = TYPE_SYS_BUS_DEVICE, .instance_size = sizeof(M48txxSysBusState), .abstract = true, .class_init = m48txx_sysbus_class_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_NVRAM }, + { } + } }; static const TypeInfo m48txx_isa_type_info = { @@ -851,6 +905,10 @@ static const TypeInfo m48txx_isa_type_info = { .instance_size = sizeof(M48txxISAState), .abstract = true, .class_init = m48txx_isa_class_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_NVRAM }, + { } + } }; static void m48t59_register_types(void) @@ -867,6 +925,7 @@ static void m48t59_register_types(void) }; int i; + type_register_static(&nvram_info); type_register_static(&m48txx_sysbus_type_info); type_register_static(&m48txx_isa_type_info); diff --git a/include/hw/timer/m48t59.h b/include/hw/timer/m48t59.h index 8217522291..ddbbda26af 100644 --- a/include/hw/timer/m48t59.h +++ b/include/hw/timer/m48t59.h @@ -1,6 +1,9 @@ #ifndef NVRAM_H #define NVRAM_H +#include "qemu-common.h" +#include "qom/object.h" + /* NVRAM helpers */ typedef uint32_t (*nvram_read_t)(void *private, uint32_t addr); typedef void (*nvram_write_t)(void *private, uint32_t addr, uint32_t val); @@ -34,4 +37,25 @@ M48t59State *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size, M48t59State *m48t59_init(qemu_irq IRQ, hwaddr mem_base, uint32_t io_base, uint16_t size, int type); +#define TYPE_NVRAM "nvram" + +#define NVRAM_CLASS(klass) \ + OBJECT_CLASS_CHECK(NvramClass, (klass), TYPE_NVRAM) +#define NVRAM_GET_CLASS(obj) \ + OBJECT_GET_CLASS(NvramClass, (obj), TYPE_NVRAM) +#define NVRAM(obj) \ + INTERFACE_CHECK(Nvram, (obj), TYPE_NVRAM) + +typedef struct Nvram { + Object parent; +} Nvram; + +typedef struct NvramClass { + InterfaceClass parent; + + uint32_t (*read)(Nvram *obj, uint32_t addr); + void (*write)(Nvram *obj, uint32_t addr, uint32_t val); + void (*toggle_lock)(Nvram *obj, int lock); +} NvramClass; + #endif /* !NVRAM_H */ From 3168824682058457344faecdbe7014caa0e8dd6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Mon, 2 Mar 2015 22:23:27 +0000 Subject: [PATCH 4/9] m48t59: let init functions return a Nvram object MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove left-overs from header file. Move some functions only used by PReP to hw/ppc/prep.c Signed-off-by: Hervé Poussineau CC: Andreas Färber Signed-off-by: Mark Cave-Ayland --- hw/ppc/ppc.c | 161 -------------------------------------- hw/ppc/prep.c | 161 +++++++++++++++++++++++++++++++++++--- hw/sparc/sun4m.c | 8 +- hw/sparc64/sun4u.c | 10 ++- hw/timer/m48t59.c | 30 +++---- include/hw/timer/m48t59.h | 38 ++------- 6 files changed, 177 insertions(+), 231 deletions(-) diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c index 5ce565d5ec..99db56c8d0 100644 --- a/hw/ppc/ppc.c +++ b/hw/ppc/ppc.c @@ -1318,167 +1318,6 @@ void PPC_debug_write (void *opaque, uint32_t addr, uint32_t val) } } -/*****************************************************************************/ -/* NVRAM helpers */ -static inline uint32_t nvram_read (nvram_t *nvram, uint32_t addr) -{ - return (*nvram->read_fn)(nvram->opaque, addr); -} - -static inline void nvram_write (nvram_t *nvram, uint32_t addr, uint32_t val) -{ - (*nvram->write_fn)(nvram->opaque, addr, val); -} - -static void NVRAM_set_byte(nvram_t *nvram, uint32_t addr, uint8_t value) -{ - nvram_write(nvram, addr, value); -} - -static uint8_t NVRAM_get_byte(nvram_t *nvram, uint32_t addr) -{ - return nvram_read(nvram, addr); -} - -static void NVRAM_set_word(nvram_t *nvram, uint32_t addr, uint16_t value) -{ - nvram_write(nvram, addr, value >> 8); - nvram_write(nvram, addr + 1, value & 0xFF); -} - -static uint16_t NVRAM_get_word(nvram_t *nvram, uint32_t addr) -{ - uint16_t tmp; - - tmp = nvram_read(nvram, addr) << 8; - tmp |= nvram_read(nvram, addr + 1); - - return tmp; -} - -static void NVRAM_set_lword(nvram_t *nvram, uint32_t addr, uint32_t value) -{ - nvram_write(nvram, addr, value >> 24); - nvram_write(nvram, addr + 1, (value >> 16) & 0xFF); - nvram_write(nvram, addr + 2, (value >> 8) & 0xFF); - nvram_write(nvram, addr + 3, value & 0xFF); -} - -uint32_t NVRAM_get_lword (nvram_t *nvram, uint32_t addr) -{ - uint32_t tmp; - - tmp = nvram_read(nvram, addr) << 24; - tmp |= nvram_read(nvram, addr + 1) << 16; - tmp |= nvram_read(nvram, addr + 2) << 8; - tmp |= nvram_read(nvram, addr + 3); - - return tmp; -} - -static void NVRAM_set_string(nvram_t *nvram, uint32_t addr, const char *str, - uint32_t max) -{ - int i; - - for (i = 0; i < max && str[i] != '\0'; i++) { - nvram_write(nvram, addr + i, str[i]); - } - nvram_write(nvram, addr + i, str[i]); - nvram_write(nvram, addr + max - 1, '\0'); -} - -int NVRAM_get_string (nvram_t *nvram, uint8_t *dst, uint16_t addr, int max) -{ - int i; - - memset(dst, 0, max); - for (i = 0; i < max; i++) { - dst[i] = NVRAM_get_byte(nvram, addr + i); - if (dst[i] == '\0') - break; - } - - return i; -} - -static uint16_t NVRAM_crc_update (uint16_t prev, uint16_t value) -{ - uint16_t tmp; - uint16_t pd, pd1, pd2; - - tmp = prev >> 8; - pd = prev ^ value; - pd1 = pd & 0x000F; - pd2 = ((pd >> 4) & 0x000F) ^ pd1; - tmp ^= (pd1 << 3) | (pd1 << 8); - tmp ^= pd2 | (pd2 << 7) | (pd2 << 12); - - return tmp; -} - -static uint16_t NVRAM_compute_crc (nvram_t *nvram, uint32_t start, uint32_t count) -{ - uint32_t i; - uint16_t crc = 0xFFFF; - int odd; - - odd = count & 1; - count &= ~1; - for (i = 0; i != count; i++) { - crc = NVRAM_crc_update(crc, NVRAM_get_word(nvram, start + i)); - } - if (odd) { - crc = NVRAM_crc_update(crc, NVRAM_get_byte(nvram, start + i) << 8); - } - - return crc; -} - -#define CMDLINE_ADDR 0x017ff000 - -int PPC_NVRAM_set_params (nvram_t *nvram, uint16_t NVRAM_size, - const char *arch, - uint32_t RAM_size, int boot_device, - uint32_t kernel_image, uint32_t kernel_size, - const char *cmdline, - uint32_t initrd_image, uint32_t initrd_size, - uint32_t NVRAM_image, - int width, int height, int depth) -{ - uint16_t crc; - - /* Set parameters for Open Hack'Ware BIOS */ - NVRAM_set_string(nvram, 0x00, "QEMU_BIOS", 16); - NVRAM_set_lword(nvram, 0x10, 0x00000002); /* structure v2 */ - NVRAM_set_word(nvram, 0x14, NVRAM_size); - NVRAM_set_string(nvram, 0x20, arch, 16); - NVRAM_set_lword(nvram, 0x30, RAM_size); - NVRAM_set_byte(nvram, 0x34, boot_device); - NVRAM_set_lword(nvram, 0x38, kernel_image); - NVRAM_set_lword(nvram, 0x3C, kernel_size); - if (cmdline) { - /* XXX: put the cmdline in NVRAM too ? */ - pstrcpy_targphys("cmdline", CMDLINE_ADDR, RAM_size - CMDLINE_ADDR, cmdline); - NVRAM_set_lword(nvram, 0x40, CMDLINE_ADDR); - NVRAM_set_lword(nvram, 0x44, strlen(cmdline)); - } else { - NVRAM_set_lword(nvram, 0x40, 0); - NVRAM_set_lword(nvram, 0x44, 0); - } - NVRAM_set_lword(nvram, 0x48, initrd_image); - NVRAM_set_lword(nvram, 0x4C, initrd_size); - NVRAM_set_lword(nvram, 0x50, NVRAM_image); - - NVRAM_set_word(nvram, 0x54, width); - NVRAM_set_word(nvram, 0x56, height); - NVRAM_set_word(nvram, 0x58, depth); - crc = NVRAM_compute_crc(nvram, 0x00, 0xF8); - NVRAM_set_word(nvram, 0xFC, crc); - - return 0; -} - /* CPU device-tree ID helpers */ int ppc_get_vcpu_dt_id(PowerPCCPU *cpu) { diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c index 15df7f3dae..9290846bd6 100644 --- a/hw/ppc/prep.c +++ b/hw/ppc/prep.c @@ -181,7 +181,7 @@ static const MemoryRegionOps PPC_XCSR_ops = { /* Fake super-io ports for PREP platform (Intel 82378ZB) */ typedef struct sysctrl_t { qemu_irq reset_irq; - M48t59State *nvram; + Nvram *nvram; uint8_t state; uint8_t syscontrol; int contiguous_map; @@ -235,13 +235,17 @@ static void PREP_io_800_writeb (void *opaque, uint32_t addr, uint32_t val) break; case 0x0810: /* Password protect 1 register */ - if (sysctrl->nvram != NULL) - m48t59_toggle_lock(sysctrl->nvram, 1); + if (sysctrl->nvram != NULL) { + NvramClass *k = NVRAM_GET_CLASS(sysctrl->nvram); + (k->toggle_lock)(sysctrl->nvram, 1); + } break; case 0x0812: /* Password protect 2 register */ - if (sysctrl->nvram != NULL) - m48t59_toggle_lock(sysctrl->nvram, 2); + if (sysctrl->nvram != NULL) { + NvramClass *k = NVRAM_GET_CLASS(sysctrl->nvram); + (k->toggle_lock)(sysctrl->nvram, 2); + } break; case 0x0814: /* L2 invalidate register */ @@ -360,6 +364,144 @@ static const MemoryRegionPortio prep_portio_list[] = { static PortioList prep_port_list; +/*****************************************************************************/ +/* NVRAM helpers */ +static inline uint32_t nvram_read(Nvram *nvram, uint32_t addr) +{ + NvramClass *k = NVRAM_GET_CLASS(sysctrl->nvram); + return (k->read)(nvram, addr); +} + +static inline void nvram_write(Nvram *nvram, uint32_t addr, uint32_t val) +{ + NvramClass *k = NVRAM_GET_CLASS(sysctrl->nvram); + (k->write)(nvram, addr, val); +} + +static void NVRAM_set_byte(Nvram *nvram, uint32_t addr, uint8_t value) +{ + nvram_write(nvram, addr, value); +} + +static uint8_t NVRAM_get_byte(Nvram *nvram, uint32_t addr) +{ + return nvram_read(nvram, addr); +} + +static void NVRAM_set_word(Nvram *nvram, uint32_t addr, uint16_t value) +{ + nvram_write(nvram, addr, value >> 8); + nvram_write(nvram, addr + 1, value & 0xFF); +} + +static uint16_t NVRAM_get_word(Nvram *nvram, uint32_t addr) +{ + uint16_t tmp; + + tmp = nvram_read(nvram, addr) << 8; + tmp |= nvram_read(nvram, addr + 1); + + return tmp; +} + +static void NVRAM_set_lword(Nvram *nvram, uint32_t addr, uint32_t value) +{ + nvram_write(nvram, addr, value >> 24); + nvram_write(nvram, addr + 1, (value >> 16) & 0xFF); + nvram_write(nvram, addr + 2, (value >> 8) & 0xFF); + nvram_write(nvram, addr + 3, value & 0xFF); +} + +static void NVRAM_set_string(Nvram *nvram, uint32_t addr, const char *str, + uint32_t max) +{ + int i; + + for (i = 0; i < max && str[i] != '\0'; i++) { + nvram_write(nvram, addr + i, str[i]); + } + nvram_write(nvram, addr + i, str[i]); + nvram_write(nvram, addr + max - 1, '\0'); +} + +static uint16_t NVRAM_crc_update (uint16_t prev, uint16_t value) +{ + uint16_t tmp; + uint16_t pd, pd1, pd2; + + tmp = prev >> 8; + pd = prev ^ value; + pd1 = pd & 0x000F; + pd2 = ((pd >> 4) & 0x000F) ^ pd1; + tmp ^= (pd1 << 3) | (pd1 << 8); + tmp ^= pd2 | (pd2 << 7) | (pd2 << 12); + + return tmp; +} + +static uint16_t NVRAM_compute_crc (Nvram *nvram, uint32_t start, uint32_t count) +{ + uint32_t i; + uint16_t crc = 0xFFFF; + int odd; + + odd = count & 1; + count &= ~1; + for (i = 0; i != count; i++) { + crc = NVRAM_crc_update(crc, NVRAM_get_word(nvram, start + i)); + } + if (odd) { + crc = NVRAM_crc_update(crc, NVRAM_get_byte(nvram, start + i) << 8); + } + + return crc; +} + +#define CMDLINE_ADDR 0x017ff000 + +static int PPC_NVRAM_set_params (Nvram *nvram, uint16_t NVRAM_size, + const char *arch, + uint32_t RAM_size, int boot_device, + uint32_t kernel_image, uint32_t kernel_size, + const char *cmdline, + uint32_t initrd_image, uint32_t initrd_size, + uint32_t NVRAM_image, + int width, int height, int depth) +{ + uint16_t crc; + + /* Set parameters for Open Hack'Ware BIOS */ + NVRAM_set_string(nvram, 0x00, "QEMU_BIOS", 16); + NVRAM_set_lword(nvram, 0x10, 0x00000002); /* structure v2 */ + NVRAM_set_word(nvram, 0x14, NVRAM_size); + NVRAM_set_string(nvram, 0x20, arch, 16); + NVRAM_set_lword(nvram, 0x30, RAM_size); + NVRAM_set_byte(nvram, 0x34, boot_device); + NVRAM_set_lword(nvram, 0x38, kernel_image); + NVRAM_set_lword(nvram, 0x3C, kernel_size); + if (cmdline) { + /* XXX: put the cmdline in NVRAM too ? */ + pstrcpy_targphys("cmdline", CMDLINE_ADDR, RAM_size - CMDLINE_ADDR, + cmdline); + NVRAM_set_lword(nvram, 0x40, CMDLINE_ADDR); + NVRAM_set_lword(nvram, 0x44, strlen(cmdline)); + } else { + NVRAM_set_lword(nvram, 0x40, 0); + NVRAM_set_lword(nvram, 0x44, 0); + } + NVRAM_set_lword(nvram, 0x48, initrd_image); + NVRAM_set_lword(nvram, 0x4C, initrd_size); + NVRAM_set_lword(nvram, 0x50, NVRAM_image); + + NVRAM_set_word(nvram, 0x54, width); + NVRAM_set_word(nvram, 0x56, height); + NVRAM_set_word(nvram, 0x58, depth); + crc = NVRAM_compute_crc(nvram, 0x00, 0xF8); + NVRAM_set_word(nvram, 0xFC, crc); + + return 0; +} + /* PowerPC PREP hardware initialisation */ static void ppc_prep_init(MachineState *machine) { @@ -372,8 +514,7 @@ static void ppc_prep_init(MachineState *machine) MemoryRegion *sysmem = get_system_memory(); PowerPCCPU *cpu = NULL; CPUPPCState *env = NULL; - nvram_t nvram; - M48t59State *m48t59; + Nvram *m48t59; #if 0 MemoryRegion *xcsr = g_new(MemoryRegion, 1); #endif @@ -549,10 +690,8 @@ static void ppc_prep_init(MachineState *machine) sysctrl->nvram = m48t59; /* Initialise NVRAM */ - nvram.opaque = m48t59; - nvram.read_fn = &m48t59_read; - nvram.write_fn = &m48t59_write; - PPC_NVRAM_set_params(&nvram, NVRAM_SIZE, "PREP", ram_size, ppc_boot_device, + PPC_NVRAM_set_params(m48t59, NVRAM_SIZE, "PREP", ram_size, + ppc_boot_device, kernel_base, kernel_size, kernel_cmdline, initrd_base, initrd_size, diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c index 09afccf860..d391f8e8a5 100644 --- a/hw/sparc/sun4m.c +++ b/hw/sparc/sun4m.c @@ -127,7 +127,7 @@ static void fw_cfg_boot_set(void *opaque, const char *boot_device, fw_cfg_add_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]); } -static void nvram_init(M48t59State *nvram, uint8_t *macaddr, +static void nvram_init(Nvram *nvram, uint8_t *macaddr, const char *cmdline, const char *boot_devices, ram_addr_t RAM_size, uint32_t kernel_size, int width, int height, int depth, @@ -137,6 +137,7 @@ static void nvram_init(M48t59State *nvram, uint8_t *macaddr, uint32_t start, end; uint8_t image[0x1ff0]; struct OpenBIOS_nvpart_v1 *part_header; + NvramClass *k = NVRAM_GET_CLASS(nvram); memset(image, '\0', sizeof(image)); @@ -170,8 +171,9 @@ static void nvram_init(M48t59State *nvram, uint8_t *macaddr, Sun_init_header((struct Sun_nvram *)&image[0x1fd8], macaddr, nvram_machine_id); - for (i = 0; i < sizeof(image); i++) - m48t59_write(nvram, i, image[i]); + for (i = 0; i < sizeof(image); i++) { + (k->write)(nvram, i, image[i]); + } } static DeviceState *slavio_intctl; diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c index b310588ff7..9873e399d2 100644 --- a/hw/sparc64/sun4u.c +++ b/hw/sparc64/sun4u.c @@ -130,7 +130,7 @@ static void fw_cfg_boot_set(void *opaque, const char *boot_device, fw_cfg_add_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]); } -static int sun4u_NVRAM_set_params(M48t59State *nvram, uint16_t NVRAM_size, +static int sun4u_NVRAM_set_params(Nvram *nvram, uint16_t NVRAM_size, const char *arch, ram_addr_t RAM_size, const char *boot_devices, uint32_t kernel_image, uint32_t kernel_size, @@ -144,6 +144,7 @@ static int sun4u_NVRAM_set_params(M48t59State *nvram, uint16_t NVRAM_size, uint32_t start, end; uint8_t image[0x1ff0]; struct OpenBIOS_nvpart_v1 *part_header; + NvramClass *k = NVRAM_GET_CLASS(nvram); memset(image, '\0', sizeof(image)); @@ -176,8 +177,9 @@ static int sun4u_NVRAM_set_params(M48t59State *nvram, uint16_t NVRAM_size, Sun_init_header((struct Sun_nvram *)&image[0x1fd8], macaddr, 0x80); - for (i = 0; i < sizeof(image); i++) - m48t59_write(nvram, i, image[i]); + for (i = 0; i < sizeof(image); i++) { + (k->write)(nvram, i, image[i]); + } return 0; } @@ -818,7 +820,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem, const struct hwdef *hwdef) { SPARCCPU *cpu; - M48t59State *nvram; + Nvram *nvram; unsigned int i; uint64_t initrd_addr, initrd_size, kernel_addr, kernel_size, kernel_entry; PCIBus *pci_bus, *pci_bus2, *pci_bus3; diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c index c5e74cec2f..08f0d57d7e 100644 --- a/hw/timer/m48t59.c +++ b/hw/timer/m48t59.c @@ -74,7 +74,7 @@ typedef struct M48txxInfo { * http://www.st.com/stonline/products/literature/od/7001/m48t59y.pdf */ -struct M48t59State { +typedef struct M48t59State { /* Hardware parameters */ qemu_irq IRQ; MemoryRegion iomem; @@ -93,7 +93,7 @@ struct M48t59State { /* NVRAM storage */ uint16_t addr; uint8_t lock; -}; +} M48t59State; typedef struct M48txxISAState { ISADevice parent_obj; @@ -240,9 +240,8 @@ static void set_up_watchdog(M48t59State *NVRAM, uint8_t value) } /* Direct access to NVRAM */ -void m48t59_write (void *opaque, uint32_t addr, uint32_t val) +static void m48t59_write(M48t59State *NVRAM, uint32_t addr, uint32_t val) { - M48t59State *NVRAM = opaque; struct tm tm; int tmp; @@ -410,9 +409,8 @@ void m48t59_write (void *opaque, uint32_t addr, uint32_t val) } } -uint32_t m48t59_read (void *opaque, uint32_t addr) +static uint32_t m48t59_read(M48t59State *NVRAM, uint32_t addr) { - M48t59State *NVRAM = opaque; struct tm tm; uint32_t retval = 0xFF; @@ -519,10 +517,8 @@ uint32_t m48t59_read (void *opaque, uint32_t addr) return retval; } -void m48t59_toggle_lock (void *opaque, int lock) +static void m48t59_toggle_lock(M48t59State *NVRAM, int lock) { - M48t59State *NVRAM = opaque; - NVRAM->lock ^= 1 << lock; } @@ -683,13 +679,11 @@ static const MemoryRegionOps m48t59_io_ops = { }; /* Initialisation routine */ -M48t59State *m48t59_init(qemu_irq IRQ, hwaddr mem_base, - uint32_t io_base, uint16_t size, int model) +Nvram *m48t59_init(qemu_irq IRQ, hwaddr mem_base, + uint32_t io_base, uint16_t size, int model) { DeviceState *dev; SysBusDevice *s; - M48txxSysBusState *d; - M48t59State *state; int i; for (i = 0; i < ARRAY_SIZE(m48txx_info); i++) { @@ -702,8 +696,6 @@ M48t59State *m48t59_init(qemu_irq IRQ, hwaddr mem_base, dev = qdev_create(NULL, m48txx_info[i].sysbus_name); qdev_init_nofail(dev); s = SYS_BUS_DEVICE(dev); - d = M48TXX_SYS_BUS(s); - state = &d->state; sysbus_connect_irq(s, 0, IRQ); if (io_base != 0) { memory_region_add_subregion(get_system_io(), io_base, @@ -713,15 +705,15 @@ M48t59State *m48t59_init(qemu_irq IRQ, hwaddr mem_base, sysbus_mmio_map(s, 0, mem_base); } - return state; + return NVRAM(s); } assert(false); return NULL; } -M48t59State *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size, - int model) +Nvram *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size, + int model) { DeviceState *dev; int i; @@ -736,7 +728,7 @@ M48t59State *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size, dev = DEVICE(isa_create(bus, m48txx_info[i].isa_name)); qdev_prop_set_uint32(dev, "iobase", io_base); qdev_init_nofail(dev); - return &M48TXX_ISA(dev)->state; + return NVRAM(dev); } assert(false); diff --git a/include/hw/timer/m48t59.h b/include/hw/timer/m48t59.h index ddbbda26af..cf80d20282 100644 --- a/include/hw/timer/m48t59.h +++ b/include/hw/timer/m48t59.h @@ -4,39 +4,6 @@ #include "qemu-common.h" #include "qom/object.h" -/* NVRAM helpers */ -typedef uint32_t (*nvram_read_t)(void *private, uint32_t addr); -typedef void (*nvram_write_t)(void *private, uint32_t addr, uint32_t val); -typedef struct nvram_t { - void *opaque; - nvram_read_t read_fn; - nvram_write_t write_fn; -} nvram_t; - -uint32_t NVRAM_get_lword (nvram_t *nvram, uint32_t addr); -int NVRAM_get_string (nvram_t *nvram, uint8_t *dst, uint16_t addr, int max); - -int PPC_NVRAM_set_params (nvram_t *nvram, uint16_t NVRAM_size, - const char *arch, - uint32_t RAM_size, int boot_device, - uint32_t kernel_image, uint32_t kernel_size, - const char *cmdline, - uint32_t initrd_image, uint32_t initrd_size, - uint32_t NVRAM_image, - int width, int height, int depth); - -#define TYPE_SYSBUS_M48T59 "m48t59" - -typedef struct M48t59State M48t59State; - -void m48t59_write (void *private, uint32_t addr, uint32_t val); -uint32_t m48t59_read (void *private, uint32_t addr); -void m48t59_toggle_lock (void *private, int lock); -M48t59State *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size, - int type); -M48t59State *m48t59_init(qemu_irq IRQ, hwaddr mem_base, - uint32_t io_base, uint16_t size, int type); - #define TYPE_NVRAM "nvram" #define NVRAM_CLASS(klass) \ @@ -58,4 +25,9 @@ typedef struct NvramClass { void (*toggle_lock)(Nvram *obj, int lock); } NvramClass; +Nvram *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size, + int type); +Nvram *m48t59_init(qemu_irq IRQ, hwaddr mem_base, + uint32_t io_base, uint16_t size, int type); + #endif /* !NVRAM_H */ From 6de0497385cbbbbd5f20ca712389b3691ea5c96d Mon Sep 17 00:00:00 2001 From: Mark Cave-Ayland Date: Mon, 2 Mar 2015 22:23:27 +0000 Subject: [PATCH 5/9] m48t59: introduce new base-year qdev property MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently the m48t59 device uses the hardware model in order to determine whether the year value is offset from the hardware value. As this will soon be required by the x59 model, create a qdev base-year property to represent the base year and update the callers appropriately. Reviewed-by: Hervé Poussineau CC: Andreas Färber Signed-off-by: Mark Cave-Ayland --- hw/ppc/ppc405_boards.c | 2 +- hw/ppc/prep.c | 2 +- hw/sparc/sun4m.c | 2 +- hw/sparc64/sun4u.c | 2 +- hw/timer/m48t59.c | 27 +++++++++++++++------------ include/hw/timer/m48t59.h | 5 +++-- 6 files changed, 22 insertions(+), 18 deletions(-) diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c index 1dcea7730e..ec6c4cbaf1 100644 --- a/hw/ppc/ppc405_boards.c +++ b/hw/ppc/ppc405_boards.c @@ -283,7 +283,7 @@ static void ref405ep_init(MachineState *machine) #ifdef DEBUG_BOARD_INIT printf("%s: register NVRAM\n", __func__); #endif - m48t59_init(NULL, 0xF0000000, 0, 8192, 8); + m48t59_init(NULL, 0xF0000000, 0, 8192, 1968, 8); /* Load kernel */ linux_boot = (kernel_filename != NULL); if (linux_boot) { diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c index 9290846bd6..7f52662d76 100644 --- a/hw/ppc/prep.c +++ b/hw/ppc/prep.c @@ -684,7 +684,7 @@ static void ppc_prep_init(MachineState *machine) pci_create_simple(pci_bus, -1, "pci-ohci"); } - m48t59 = m48t59_init_isa(isa_bus, 0x0074, NVRAM_SIZE, 59); + m48t59 = m48t59_init_isa(isa_bus, 0x0074, NVRAM_SIZE, 2000, 59); if (m48t59 == NULL) return; sysctrl->nvram = m48t59; diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c index d391f8e8a5..b879aa91eb 100644 --- a/hw/sparc/sun4m.c +++ b/hw/sparc/sun4m.c @@ -1014,7 +1014,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, lance_init(&nd_table[0], hwdef->le_base, ledma, ledma_irq); - nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0, 0x2000, 8); + nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0, 0x2000, 1968, 8); slavio_timer_init_all(hwdef->counter_base, slavio_irq[19], slavio_cpu_irq, smp_cpus); diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c index 9873e399d2..53aec80102 100644 --- a/hw/sparc64/sun4u.c +++ b/hw/sparc64/sun4u.c @@ -868,7 +868,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem, fd[i] = drive_get(IF_FLOPPY, 0, i); } fdctrl_init_isa(isa_bus, fd); - nvram = m48t59_init_isa(isa_bus, 0x0074, NVRAM_SIZE, 59); + nvram = m48t59_init_isa(isa_bus, 0x0074, NVRAM_SIZE, 2000, 59); initrd_size = 0; initrd_addr = 0; diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c index 08f0d57d7e..d3d80798ef 100644 --- a/hw/timer/m48t59.c +++ b/hw/timer/m48t59.c @@ -79,6 +79,7 @@ typedef struct M48t59State { qemu_irq IRQ; MemoryRegion iomem; uint32_t size; + int32_t base_year; /* RTC management */ time_t time_offset; time_t stop_time; @@ -387,11 +388,7 @@ static void m48t59_write(M48t59State *NVRAM, uint32_t addr, uint32_t val) tmp = from_bcd(val); if (tmp >= 0 && tmp <= 99) { get_time(NVRAM, &tm); - if (NVRAM->model == 8) { - tm.tm_year = from_bcd(val) + 68; // Base year is 1968 - } else { - tm.tm_year = from_bcd(val); - } + tm.tm_year = from_bcd(val) + NVRAM->base_year - 1900; set_time(NVRAM, &tm); } break; @@ -493,11 +490,7 @@ static uint32_t m48t59_read(M48t59State *NVRAM, uint32_t addr) case 0x07FF: /* year */ get_time(NVRAM, &tm); - if (NVRAM->model == 8) { - retval = to_bcd(tm.tm_year - 68); // Base year is 1968 - } else { - retval = to_bcd(tm.tm_year); - } + retval = to_bcd((tm.tm_year + 1900 - NVRAM->base_year) % 100); break; default: /* Check lock registers state */ @@ -680,7 +673,8 @@ static const MemoryRegionOps m48t59_io_ops = { /* Initialisation routine */ Nvram *m48t59_init(qemu_irq IRQ, hwaddr mem_base, - uint32_t io_base, uint16_t size, int model) + uint32_t io_base, uint16_t size, int base_year, + int model) { DeviceState *dev; SysBusDevice *s; @@ -694,6 +688,7 @@ Nvram *m48t59_init(qemu_irq IRQ, hwaddr mem_base, } dev = qdev_create(NULL, m48txx_info[i].sysbus_name); + qdev_prop_set_int32(dev, "base-year", base_year); qdev_init_nofail(dev); s = SYS_BUS_DEVICE(dev); sysbus_connect_irq(s, 0, IRQ); @@ -713,7 +708,7 @@ Nvram *m48t59_init(qemu_irq IRQ, hwaddr mem_base, } Nvram *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size, - int model) + int base_year, int model) { DeviceState *dev; int i; @@ -727,6 +722,7 @@ Nvram *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size, dev = DEVICE(isa_create(bus, m48txx_info[i].isa_name)); qdev_prop_set_uint32(dev, "iobase", io_base); + qdev_prop_set_int32(dev, "base-year", base_year); qdev_init_nofail(dev); return NVRAM(dev); } @@ -809,6 +805,7 @@ static void m48txx_isa_toggle_lock(Nvram *obj, int lock) } static Property m48t59_isa_properties[] = { + DEFINE_PROP_INT32("base-year", M48txxISAState, state.base_year, 0), DEFINE_PROP_UINT32("iobase", M48txxISAState, io_base, 0x74), DEFINE_PROP_END_OF_LIST(), }; @@ -852,6 +849,11 @@ static void m48txx_sysbus_toggle_lock(Nvram *obj, int lock) m48t59_toggle_lock(&d->state, lock); } +static Property m48t59_sysbus_properties[] = { + DEFINE_PROP_INT32("base-year", M48txxSysBusState, state.base_year, 0), + DEFINE_PROP_END_OF_LIST(), +}; + static void m48txx_sysbus_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -860,6 +862,7 @@ static void m48txx_sysbus_class_init(ObjectClass *klass, void *data) k->init = m48t59_init1; dc->reset = m48t59_reset_sysbus; + dc->props = m48t59_sysbus_properties; nc->read = m48txx_sysbus_read; nc->write = m48txx_sysbus_write; nc->toggle_lock = m48txx_sysbus_toggle_lock; diff --git a/include/hw/timer/m48t59.h b/include/hw/timer/m48t59.h index cf80d20282..3367923639 100644 --- a/include/hw/timer/m48t59.h +++ b/include/hw/timer/m48t59.h @@ -26,8 +26,9 @@ typedef struct NvramClass { } NvramClass; Nvram *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size, - int type); + int base_year, int type); Nvram *m48t59_init(qemu_irq IRQ, hwaddr mem_base, - uint32_t io_base, uint16_t size, int type); + uint32_t io_base, uint16_t size, int base_year, + int type); #endif /* !NVRAM_H */ From 0278377dde6a5a845e886567c1e68a77766a89b1 Mon Sep 17 00:00:00 2001 From: Mark Cave-Ayland Date: Mon, 2 Mar 2015 22:23:27 +0000 Subject: [PATCH 6/9] m48t59: add m48t59 sysbus device MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is for subsequent use by the sun4u machine. Reviewed-by: Hervé Poussineau Signed-off-by: Mark Cave-Ayland --- hw/timer/m48t59.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c index d3d80798ef..8ab683ddac 100644 --- a/hw/timer/m48t59.c +++ b/hw/timer/m48t59.c @@ -128,6 +128,10 @@ static M48txxInfo m48txx_info[] = { .sysbus_name = "sysbus-m48t08", .model = 8, .size = 0x2000, + },{ + .sysbus_name = "sysbus-m48t59", + .model = 59, + .size = 0x2000, },{ .isa_name = "isa-m48t59", .model = 59, From 9bb9f217f56b678f3ad2bddeb9894880ae0320b7 Mon Sep 17 00:00:00 2001 From: Mark Cave-Ayland Date: Mon, 2 Mar 2015 22:23:27 +0000 Subject: [PATCH 7/9] doc: minor updates to SPARC32 and SPARC64 documentation Signed-off-by: Mark Cave-Ayland --- qemu-doc.texi | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/qemu-doc.texi b/qemu-doc.texi index aabe8df2f3..f5b0dc4588 100644 --- a/qemu-doc.texi +++ b/qemu-doc.texi @@ -2052,7 +2052,7 @@ firmware implementation. The goal is to implement a 100% IEEE A sample Linux 2.6 series kernel and ram disk image are available on the QEMU web site. There are still issues with NetBSD and OpenBSD, but -some kernel versions work. Please note that currently older Solaris kernels +most kernel versions work. Please note that currently older Solaris kernels don't work probably due to interface issues between OpenBIOS and Solaris. @@ -2091,8 +2091,9 @@ Set the emulated machine type. Default is SS-5. Use the executable @file{qemu-system-sparc64} to simulate a Sun4u (UltraSPARC PC-like machine), Sun4v (T1 PC-like machine), or generic -Niagara (T1) machine. The emulator is not usable for anything yet, but -it can launch some kernels. +Niagara (T1) machine. The Sun4u emulator is mostly complete, being +able to run Linux, NetBSD and OpenBSD in headless (-nographic) mode. The +Sun4v and Niagara emulators are still a work in progress. QEMU emulates the following peripherals: From f2416d3ae4d38a078f0ff7662b26bed9b61f8096 Mon Sep 17 00:00:00 2001 From: Mark Cave-Ayland Date: Mon, 2 Mar 2015 22:23:27 +0000 Subject: [PATCH 8/9] MAINTAINERS: add myself as SPARC maintainer Acked-by: Peter Maydell Signed-off-by: Mark Cave-Ayland --- MAINTAINERS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 8c06739ff9..7ef487981f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -159,6 +159,7 @@ F: hw/sh4/ SPARC M: Blue Swirl +M: Mark Cave-Ayland S: Maintained F: target-sparc/ F: hw/sparc/ @@ -518,11 +519,13 @@ SPARC Machines -------------- Sun4m M: Blue Swirl +M: Mark Cave-Ayland S: Maintained F: hw/sparc/sun4m.c Sun4u M: Blue Swirl +M: Mark Cave-Ayland S: Maintained F: hw/sparc64/sun4u.c From f3b18f35a23c60edbda6420cd4bd30b8bb11ea80 Mon Sep 17 00:00:00 2001 From: Mark Cave-Ayland Date: Mon, 2 Mar 2015 22:23:27 +0000 Subject: [PATCH 9/9] sun4u: switch m48t59 NVRAM to MMIO access Real sun4u systems memory-map the NVRAM on the (ISA) ebus, so switch over to MMIO from ioport access whilst setting the base year to 1968 as used by Sun systems. This allows all SPARC64 OSs included in my tests to correctly detect the NVRAM IC and read the hardware clock correctly upon boot. Note that this also requires a corresponding OpenBIOS update to r1330 in order to switch the SPARC64 NVRAM accessors over from ioport to MMIO. Signed-off-by: Mark Cave-Ayland --- hw/sparc64/sun4u.c | 10 ++++++++-- pc-bios/openbios-ppc | Bin 746588 -> 746588 bytes pc-bios/openbios-sparc32 | Bin 381512 -> 381512 bytes pc-bios/openbios-sparc64 | Bin 1616768 -> 1616768 bytes roms/openbios | 2 +- 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c index 53aec80102..f027caf909 100644 --- a/hw/sparc64/sun4u.c +++ b/hw/sparc64/sun4u.c @@ -612,7 +612,7 @@ pci_ebus_init1(PCIDevice *pci_dev) 0, 0x1000000); pci_register_bar(pci_dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->bar0); memory_region_init_alias(&s->bar1, OBJECT(s), "bar1", get_system_io(), - 0, 0x1000); + 0, 0x4000); pci_register_bar(pci_dev, 1, PCI_BASE_ADDRESS_SPACE_IO, &s->bar1); return 0; } @@ -825,6 +825,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem, uint64_t initrd_addr, initrd_size, kernel_addr, kernel_size, kernel_entry; PCIBus *pci_bus, *pci_bus2, *pci_bus3; ISABus *isa_bus; + SysBusDevice *s; qemu_irq *ivec_irqs, *pbm_irqs; DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; DriveInfo *fd[MAX_FD]; @@ -868,8 +869,13 @@ static void sun4uv_init(MemoryRegion *address_space_mem, fd[i] = drive_get(IF_FLOPPY, 0, i); } fdctrl_init_isa(isa_bus, fd); - nvram = m48t59_init_isa(isa_bus, 0x0074, NVRAM_SIZE, 2000, 59); + /* Map NVRAM into I/O (ebus) space */ + nvram = m48t59_init(NULL, 0, 0, NVRAM_SIZE, 1968, 59); + s = SYS_BUS_DEVICE(nvram); + memory_region_add_subregion(get_system_io(), 0x2000, + sysbus_mmio_get_region(s, 0)); + initrd_size = 0; initrd_addr = 0; kernel_size = sun4u_load_kernel(machine->kernel_filename, diff --git a/pc-bios/openbios-ppc b/pc-bios/openbios-ppc index 994052f14d60856e34206fb9302ec453f85967b8..91e4193c2d21de3ed177d474ffc5d4446a9379ea 100644 GIT binary patch delta 23727 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 delta 25348 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 diff --git a/pc-bios/openbios-sparc32 b/pc-bios/openbios-sparc32 index 6d5a381a7f1e9da9527a4b0fcc5040775d352588..d693865c324f042ebfc2bae79e4c3f67ba29a717 100644 GIT binary patch delta 24729 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 delta 23922 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 t52miwCO=sxUq6K{c4(2i?N34kf&8{{M{3WljJ9 diff --git a/pc-bios/openbios-sparc64 b/pc-bios/openbios-sparc64 index 61bd46bf440ce9b6e2b4245d967312a08e4563a9..e5d9e5a7b158efa1f34903645feaddb44076a218 100644 GIT binary patch delta 52996 zcmce;eO#1P{{KJc0K;esGl(!CHzOE#DvoA|W-yhjREAV$qy__cLuELbA*nH=8B&>| zV;m~8DP6T)GrIXWs;6MMzPxc{PX+qcyOKb zJm-DR``o|JIoAcQPs?4OmNzV9_SYO6^10RM_D@O(HM*<@=?Q_yy?;_70!H;{F{8T4 z(Hz%-Y5`XeR09SOQ~?GO%mYLalmH?L zW&mW-6+MLj6TxIa6hR(f5J3(gnjjl6m>>-hLy!cBC5Qo-2_gV-1bRTc2BR+kh7gv z0x+IH5162V^#b4;f^&e01ZM!(5}X9&5gY;J6C48A2=)Q4BWMR)Pp}to1Ho=UD8Vj3 z7{N9GO$O^`08IvKBY-A@buEA}Ly?}3 z9O*U`)$)-8;W*jX%JW0z`HJ#%KjYx!`C>geD&SwMOEl&42|x|F9~dD@hxMS1GnhS`cdo<7CzQJya4X?NF`E(<-h z(l`{BEDqh6wGV!#)ikRezzOyOLI`#PXo_d;0?-uC+6JI0p0yc3Q#`8?KvO(xEr6zY zRvmz*cvdZdrg&C0fTnm>6@aFA);s`B@vIU6P4TQ50J3*kg#fa5S(5=|@3Qg$Wbd+a z0CLF7p`4WsAbXdU1|WNvl>~?-u^0f^yQ~NR*}E(~fb3o71pwK*%yWPQErZN60J3+P zCjn&dGLHa~N$e1S>|N$Q0NK0Db^zJC%)J1`-k}Pay8*)}gI$0t3AO>!2sQ)K2^s-p zA~V+l$V6t=0mwvV)&j^xW>y16PzF^1GLf0{0AwOFO8}!tYzBZ#WM(0NOl0O{0GY_l zJOG)<%pAa2${-s+CNeV(KqfLX2{4YtVgO_!Ga~?GA~W>>GLab<0AwOF&H*NB8DyLR zkcrGV2_O@haRiW0Vut`^A~W^@$V6te1IR>X>;;gC%-9W>L>cS?{Dxo~U^2mGz!ZW; zKmoy8z>NfTfSU+v0XGv=1EvyG0d66f2Ph;c0Zb#90U#5ZQ3xOtnK2naCNd)rKqfLH z2QZy7$Oe#!%t!-}iOfg>+(}|F05Xvo5dbog8F~Pj$n*;UGLh-$0JF6W($4_MM5dnv zkcmt`0w^W1LjW?7>H7d=BGcOeWFph|0u&R8`IEjIFo!bO1(-{)4KR;jGhjYJBcPIC zE#Mx4I>5aIwSfBwssUs|)2jevLeu8~$b_bs0LX-<&j64KO)mtH2~D32AQPIN2Otxg zo&z8gnw||H6Plg|AQPIN1RxWd9s?i~njQfl6Pm6EkO@t@03Z{Zb`C%$H0=z4OlaCk z0GZIVBLKyOqOH>o0bE*xr0oN&AZQ1yB-jghlwdbt6~QjRV+7j(bp)FMs|gwb^#p4H zj}z1Zo*<|NJV{UuSVK?+c#2>iU@bujU>(5>Km$P`U_HTPzy^XmfSVu(u#q4e@H9ah zpphU6AP8arO#~5uX9)CwXEnI;0^m7FjbJliJ3%902f89N z;8lVdfM$Y1z-t7P0k0F}0p1|U0lZ0&4fr2|G{A0xB!HJ72GBwf0eFi*57?u@unT}c z5S#hSAM}m`py#z-9?+_dU_z3m^-X&-Uv=ZzE{E1*Upp9S`;5~wEfOdk-fIky7 z0y+rR0{%i!2Y8>L7VuYsYQP5sRe%o(<^lE*lmPY<%mDZa3IPWQCIdbq$OC*#kOMeK zkPY~RAPsPcAPMj(K@6aiAOi3ifgbQT4N@-vJ|{Q_I81N`@CCt1z!8EYfG-IS0Rja3 z07nVh0mlgT0*({x2Am++1^9|!8{j0tX22Hz;Bs0I9!pc-(RpbGFc z!92hjf)cVee-r2d z=QT*V0QiC69N>&yGeHC(jzABH*I?)czz~9SfCPdwfJB0mfFyz= zfMkM001LrBz)*sAKnlTLK&k|{YgOOtzM*Rol}U1SfGmPqz;J?UzzBjWz(|65fNX*i zz$k(l04qTuU^KyGz!-u&z*Ph}fUyMGfU618067FnfN=ydfLwwIz<2^ZV1fpg3xI0~ z&H*M8oB>=*a1xM5a0HM~a0p-{*ax_dpdD~M!Ct@(1iJw=87#X1G#M=005lman*lT# zER6t~43@P3nhcgY08Iu!xU=>mYf7fG%H+)pqMP(@GzSV%Af;2jFI0A4=kXL+(^2V-~Ck}KQ8k8$O zJU>+YuPD!_l;{1*^A_bfQh5$^*SnP~K0H5E{I4j_r^wMcI9bPo)+b)a~n1(@_70bzejnxlqatEUg&eh7rzh2k8E6gJAiCl z{9XXrxcJ=wn%42V05q-Rw*hEc$8QGEw2p5C(6o+U3!rHoUk9LR9bXHeX&qk;plKan z1t1$2KMz1QF1`dnQ#^hKfNWfRA%JXL{A2*xxcEE(*|_)|fE@C2D92|5$i~H|0m#P1 zCjnwfECxU}ED#@f^C2_g3W+*f<{0F!CC;B#ke{EnZ>wT0GY+O zYQP9eQw1Qi7&i|3x=5_#?Me|+&nMLz%z$D6G7vMJp+W?aZHUp**Gy)0;)&g!Mr~}+YPz$)3pc*ih zpbBsc!8|}AK?z_Q!3+SINOK{8Or&`-fJ~%04?rf;oCBCn8Ds;&k^o+U7(fd_1mGzcF1auIr1^k7e4)8ufE#R*N)qoEO zssJAn%meHrC;{vzm;vw;6ao$qOa^>JkO%mfAO~=eARF)rK^ou?K@#9of*3$2K?LA4 z0zKew8VtGs_?+Mz;4r}%z!wB30Y?aq0KOzR1PBo90~{r22OJ~V3ph@&8*qYP7vL*` zZGe*mn*pZ?8UbAdYXN^Jr~~|ipce2?f@;8Nf-1n*1oHrA2uc9o5X=B{6BGizC72BO z7eOB2e+hB`X9=foA&s8k0i520+2QD=aEntM&_a8~JVX-zeiBEH#Jsne<2?@o1}ZcXnO zu<2%>MT&5D;8gTPzoV=J$&3hy=I`qU$ZQ(8h1qoar`Auf=-vcxH0lx&KNtz$-(b|m zBg_82Y*(VNSFmWOP50o~hNz)-DH(!dhUK4sb*0g+Ly7^9W;iUV2wSPMaT$KrQPw48 zcE<#CQf4T^q>MMa+ahJoJIegf@>7f6m#{M0t~*#dG$7*i=85#k z(;fVi+1b&+bsR;GK#jZje%lpcnovmoxj_w47M(2i`Yfvjatv~z2s22Ta1>yb(W9$3 z<_FP*7G!RCJkvUGmChAXXH5NRbw+pS`QjISdvvzM^XsnnJfYXIl{z~+pJ@wqd2At3 z3xogOYP{k_bkb}uY8X zsCVmv~(r25#dGG4|XIQDt_UE;%L>X-!To6WIn*xoiWOk!&xSkxY!Z0+~1+@qZZQ zupn_bGAZ_#1Ppt^ZG&IC)2BnBymA!DhL?r9JU=BLEl|6(x^CiS0iqX-C>7C@F)I+`e*`c1hyf zkZb6x!>O1YEFOvXLP>Go#C>Y=3KG{tNdc5xR+v6Ywm{C+S4ppqTcN|zM~Ab|3YNGL ziEE%_6qFS85ya|varH`k0&_RzgP%beNre1^Xy@0D|^kQIZTL zO?}h$QBsby#m?Z5KS9ZV8e7g{2p0W{5=MmDj5%hBv-hWSc_uWFqTr0#`?<&6AnP1zc(Le6l{Ip zF%XT!88WdHYKXEZ28#9tnjH_5%QG?xs7q_2Tn8+_qEM~_-MtE>K5Rm0EMa$;AQuAj ze^+=G8<7;FsxaXPq*?WUOp~Fdk?Y8b%L?g~J3dUmgf+-q>7)N%>y%0@!}pP)kuv-U zyCKV?X@=fcq)jf5QC|?rFHE z;C>DF8@OlSeh>E>xIx8oDwPhow!s;dQqx+x?R&Jq)CO!WW$i=ACTRWix=}Y6HO9U; zVJ*yWCkA6?18M*_y#X~EqK%cmE!noeVUS(fVo4=3pZAw+`&3qn#*NGet%4&(0@i^t z|Ar4^!!i-j>9+ZY+_L~d9qpytPRT}HX-xm2qjcMs*awHmHu_uXw*4|IoIpa}FWvSj zw&n>fMqMa6Fa&$y$hOjL-_#k?gFB77fxk2A!sM{S_B;fqk%;=Zi5V`B-4r$Lr^Hn{ zPo=x4J;uquf#Lw2e~!#{={D0v^*o`o8RWKH+rghdg5A8_K<>o0+Zp`f^Q|!! zd3?b>?}yGEFyEK9+DkZ=yfU&`t#O!3X*pTr-;QX;&N*Qes_2u|3vp^2%&noWI9ack zM=I+y+cH9Kv4{K(M-{`R88<|GJhB-*p*A@SWOrcmQr2Qh{BSM`vRiI8WE)(XM#{_M zi#)n0O|NssB26>W4xEHWbv1rzXdCN1QJg&*JASRw}x8BF39%X379G6E5){Krp{!P&HmRt{& zhDMs#veC9t>g0S~uZxo>0QIOhWDYb{_NjVI@A`{2&K|NI88#rpnGHB2_7yx{ES0Nm zG~{{6)ywus8*(%9tm!LyX`VymG;&GN>>(2&THi-BT$iX+3C*SDTnq6Uo38i=_vw!+ znAu(QaVm>+Fa9`vU=d;*C|d~1mMAmi@jtqKA1B`hlT%i?Vt>FO4`o;2SDvn)Fxhp_ z;voBErb9W%J~!Mk@Cjz)t8kFT2np@DtISu218{qRZ(zO77TW$Y_h{3A;~;xp#=DCS zF4Y%5-sXVUf3T2OWVkJ##Pg~$_ryBIMHT4u>J7&2??~6>(HWX;7M)BZuP9_1$PbX| zq&zRsg{$&2qGj0nEQ?uQS-dvEVz%jS-zDRkHz;ypOsCgD+4MWzBRZ$`-rc<6>--1j zRad)reqP7Rb?&i;v*Elk=Wv!@V#Bek`klZIr$pwi*67$IUe+RObkp&Bdb4r&9RDl3 z%H4Ki_0X&2h(<+~(X4hmyBc8~C|KfX6i7I-c#M1HSARkKO+9(Tl~+A8+-hkpF6)pw znnHAZ16>I@)dQO5v$Sx1%fF zJ*#UuZk9T`ri693mg3fJ*x$2L?z!!C{gUhcRc&#EKyz6B+2Qg|Lc3?-@Ylbw`0w+0 z&b<5mQ_4HA1{2!9^U37X0d%@jt z`X)Yasyq7Y-<$p-<>c>%@U8o8y19*S_`iOEvA@3I_$HYTJ&l|!{omJxNv+U?vz#uz zMei~o{95n{ck{P-eEwK>_qW$Dk9)+w3i*7Kd-=bR{lo5#e_hY#PH_+T-*?y_-5>n# zE@s%t4f}T`j91Kb`_9c`@4FMePsIlfw(nE>`S3l44rZg<-SGVo zgw-oCJC&#Z`_wQQZ*kjtk`-Tu+uxH6sfj%@y}d_`XT9-Ei~m5zztP<@h_P;W==t=4 zT{d0phpp8XgERQ;weH;W*RY;97N74Q%IAc;T^G^^_p~mlXb#CgJ4&ux&fxcTSkXLh zynW%N5MD9WYv(MSu^v$w!g4SOy`B&j6V6jxye<9Ns4%u$bVahPm~un^4jXO>)fpwn zj!joO-J4-#*E3#j@GdYhu6P_#>|&yO6pIxP#646AfLE(;@BSmPCW zEH=?%K|Jd()7HeZo21(o&uX=_QI)#zOVcZ9XAfbMlhnLpDs_GGcLsw=ii{63{mYFj zbsj_O1IW{uz^>=VjAD8Mn}w=2C$O90{Mbtp{2-JQeP1}(jJ(g>ErcyWPP zK9Z&Bi*I#z=?vm+Gcym9eGhAb?9NY@{olV;7be5npk}4c#blWG#7K6A^Aw{vXoU{A zJyy0>>Zl*h+Ifmu6pdkjW*%X_3dKC8oEoqvi2110rW{o^MjtbKPh7>eGv@KGxth&n zGEG+wdjXZMAIGYrQhL+K{lJD;L>qHi-Y7=wncqIo8^~u*==p7fy$dF@KZLLsy%{%Q_6)XpqAj`>%+41_Sh3;LF>sA{)y?d7 z+4Y^butLVCm3cF!F+DuV!dk@sfQZvY?1xY&f$Q)V&wvVkOTF+Ev&O6;ldzQQf(M37 z*Ib9@uF>2bn!8EZ?_w9CUNW>|Vy}Q9QBCD7Hwec}WO&PH(J~W*r%705vD*i~k5xYL z660*M>836h^|RPtP0zK2TLv5q-~K&XE*`-`%$bcoo%)!lpUvK3Ey8mjGYk9Om=hhM z?QXWr^fEF_@J~Kk^z=A8)}-^>$L~c3S{pLuqsvHyLW-eOFF&#hfMpv-g7%xZ`m2=P$Cq&a6wvyju7YTD& zIlpO&*EN@2;C#vh!d1zRqgr$BVXgeeG?8&H`z!G5y=*4`%{8LvJ`9q{ckGTG>hez+ z>cS|%nQ3y07nMk5Bb$2ASQv2ncwp+}pXL&O!4E1_f!sFvD zy7pq9&h?@$#BA5u+lwoV^?KWo%fe@N6j$h0=h<~nK&8N5YqPPuyW=kG^|CC+r$^b% zbp^iAj^gqjZ%@6PQQe~c2{r*b>h!+E)wuzkS~MSrjyx3ASO?vgh37)I?y)?NqT}(r zfKskEGOZjh*g{toxI)^I|4QifnxAALQb+UsEGFt}TqC7a;@a6E2f2Sqd5;na7D6pQDnZ6f0- zR>D)GMc^qmL~MDAO~iTu|K8gw3@eSPmO5ifu}P=1v^reaKUWyr;nv|(W%$j~4;LdS ztDlU=TrtQ^kO@mC!a{NU>;JmK@@SZ)6WwcB+VvF%9DS@%S0&v@*>6Xs$h^rBuiK2zx8vqUaOF>sWS9s&Tj8HAGs2){^4}d3?f#OW%N5 za0tscMt&UbH<%dH9b(g6zjb45YQ0UDzfiorj*Uq=Zj^kfJY*VF+5A~zKm)riCVz5+ zQ5Prk=l{z8LEYTtUndqfu#}km>yWlT!p}(8m!(4+gDV@x)AT^m_4R#va4iQUBbwfW-oGwcaIak{8^7OT#+{Y2ZdYzh0P znD`uK&BPhPvWYeFiB{3FiOu5^7kMqu%VF0$7b`cjmtyi)K0Tp3AA9ziZAM)`wB>4> z?wT)!dnDhyag7XtrHu!LP73B;>WFQ3p*z~ zzhyY4c)Negsu>@@N>pxVOZoUQ;>33LPqs<;cd*+p=27`F3+F6NIDXIm#GVyncVa2~ zN)+#8%fhboS08f;`!<#$&hKO<7Vr*uh0S0*H$u$Wh3(b2V(*$=(meK7>GZ40wkNll z1yO+9*W{{uwMndb9o1+SEw8h^JjW$!-azMEogiA?VCn3XH}D2~gRy^$jsF7+eZV_* z_r)wP-CcTF5)PWe*upZ!S6-H>!HnL(^@vg6Eh(Xb*Z3BTVmviN4BLY~g6r7BZjX~& zn=8i~bU1hhQ{{l$jbHdJV$L71uKrPU{sAR^-5dHgYh--fRI%xgthN8RA#!3ngMp=@ zaxWV`xCnFob~Wh2t?DM}!Zgvjho#+Akdyjl7Yzh0HQkg}o+XTFBLtU7#50mdtPNiZK9%*R|O0`Fig88boH6!$7I z`yDnfd`ujKI0;2*LRV-)p~CEAH|xKJOo$>A!~P*fhOpy`M9dhgf64amUmRn#;Jg_p zTg0Xt{i*oChe6gM4DYgc;@*;_)Q-=3lr~PXO*iIIZ{S_@Eg$0)o;H})@VmvZ_gEFb zdW3i5d#oG>stj*WJIiK#ONKY2Lk^3vW4z1%!rlmFA9=0&*gr$r`y%0EH2OQD;A2*p zotohc{@eXgvEBGOw}iBorph;u+zktIu-Kk~yAh7~iVfkmelkw9eXRDb@gR-|7$p-A zVw(bYmE_|YqWK`Z4X!uz6Bu;%JK;Zsq1PjN4q={u>n-|}H9ce%NwX}QWhX&9G*#gKaua$6Brsbbvy(E7d;>E%&9;@#>0~>~e-iIt(|Jeux z7YJh(i_v%DCNjk?797C|&JxhFH6z}p#kV8AQds`N(g!M+aL^ix=v?9NKoaF00ZP*O zJ;JP_;jb)4oc|k^6o>Rj3(My$mer{Ksh?w?;}Ww!XA`n;v4p!d3^X%T@oL{5AVCjPwpaW6%b1zAYq)PNG6GdNOp}blw z{sIFHdft{eRRq3Z6C$=`pp-=$Q(QxkYJ$i(!p1~=_M}XyrvC1EQF#RGhev*$p|)iw zUY?W(oWbv25Ic@wgZ!CSd~gIc_-w5>eS~cfyA3JhW%H+-cBm;n{UcJ~8veUGg#Sw% z`z*o`VEO%wxcb5B_L;+56hIYNKr|g?t7Q`(V@n2h$+Vc==$i6wvGo`mqff;u^vCDK z;bY3mt!)z*9LG%biKgQ?H2TB`iqm)k5a5mrij1^HayX% z1vjX{hblK4ZSv;LhMvDsWPHVv!=mJyCv}|2&o$7lhj4#c;SsK{P~A^Eh36|&|I_`V z?JE@S)2%3Iu5g6%bTRE479MkG7=)WHIcs1I?hFyOlPtBL*%|!g{Wmctl-SI zty@tqjPJAP1ejVJC#2#}*CEu5ZA(19jFJ4LICv5p{XMN->nR)?*nQqLUF^Xy7P0#b z4653A&fv$NA(>yy{s!mXkN+a9p?r+~W4zU^@CpAnEOqEqc$M#$aNGKdyfc$4Dczf$ zFRloP=x(-pV7Dy99*Z;x2d%;r%HzX7S%k(ZZV~T>^3nQ_9muD-@mn@7tPH*#-ihC` ze}=?$X*or$G?q2AF8S@K27E5*48Ap0*uH~Fe#syzzhf1d_jpjvI$Vh0;_e>b2z$*c zd_YuZJhrNRvE9DP_|oaN#rDc@#EG-tvFwzWTENBfGZ}hOpnltAVeKQz#;-DN$rY2% zv1`Ht#~fP%-c{$={19dor~l1H4a6O;g*Al#7BBHXjuRQ@u?~Oqn0N7cmJ)&+DADv2 z=0%ry`zMx+A$s^HmOgrdI-fqW$W-z?v?0ug4_FSoCHq=lHhR!#+L<@X8T=?ljJ?3p zuXL^A0oG=zaLFZD7ImZ1qkB55*|L$lqHVggIU8|a6|M^~j0cv9O^W-SXt}_WvJSX6 z3@*23y{|L3PO~qw=~82)>PETiL-5x+{;_erYAR96;_mWH}iYDY5hL=9& zHsKFqGyCRxIWZb$rgp6#W6`OT<;^w1n6Dh|)H(Qc1CJfLOTM!~S1{QuaxAssGc#=j zgkXnJ{B#FT{qIs@0OLc%&Bc7+03@<2H+KE8Q@38pqj43dg=E>7yd_scL)#2?n^?|x ze1E&GA;KPnRDtkdCuQ0tjn|&o3ZvZYx0YIp#6iZhxTUC(^H{b^m^m*5iAv62xNDa* ziqa6`8!^@zX}`{wZnvUYCmC@6-dbue@Q2$cVp|@HkC)_2IvlesE`OxmhA=K~uo3=) zGx)|HX+)*G443i39>VhzcVWV4Ymq%eZO8rhYl}{iTsBZ#h$zdRGq~?f*j9_^4&lSa zI~hDYD#a!zVKa7Ph?L(hrInY5 z@tOKJ52Fml;&2#WqU+`J% zWv+sb@zAj{#*S4gKd3cALYu`t7Qeapowy1k$!D=!+cNAn_>Fv@&j|l@a=E~2_rRsA zo5t2Q2P$lf;4$1&BrFj;K4;4g8Fu+T8i(-&;frUXV!4syy@1$cL<9R)>MHgLmyr(%^EL3){la79 z@?G`|59J(y1!@56PUt7jee^dQTY@Kj&xtK?V1rK%R4kM%@a;-KEw1NBl?Y#glQ z`SxHw&E)Gb;A>d@@xRDenL;GQD5|E$C{1v&C1g|XjNy2PBK$G3MP(^PQ4Gf$8evOT zr0vN(UfdST6A{!mWpk{O5-l1nx?=et2>hrva)Mdu9;`K@I~lv~QZqNoOq}$eskH{5yv#Z89}cZ5lHS&ALRTwJvXwh@ZE}2(>A+7FnD`Eh3xugQTA| zhG76!+DPSFXgN5wcDdNkJN5)Kq@GzWuMTGBrOlVeNYn><}HP7(RtqjXFek zsxqA{!+83YzItYv)A2a>xE{C27yLigo63B&PAactWYaAe#&5=jY0EHWcpOGTG(_l? z2<#C>SMsaak8;~!4sElP>4fJ>L@NQ&6O9Xl-(p4Xk=8+4J8k9UFh6G%(^a4g!%EE{ zb5^S(Z6`L}!z6aoaSafEfdxs%|dbf37sz}e|M!9XbcZ!Lb z*a~1rY4>BN5GD6aNTA2dH=aIl3WBkDzi{LFoMwx#X2B3#iy(~sOg<`1e)QMUn1xtk9uw96nf&}jy}xP`veNQ%1u=6t9}wRrKZ$k0#Qj~~b3Hu<``p-6 zyEE8s7p~zvp0~d(HVwy^7$bbcm2rM}`2S^0DYhkJ1iGR3>acT!V!13M`860?vq$pZ z!!cy5<}8~R>VNk;6w@fSW^>$viHW0>A-rIeGG&@ZDXUt`C}ms*M)7eFFdp>N$SJ5w1)Uyk8dWVfD0ob10tvJVE~7b9s1`b8(tvKOy$+VC+Q zc4+dxhPQnxtXHAj^5&=L;_hS3RkFFfEmvVz7FVEUl`ONOY#?7OHeJpCd9i2k;wf4L za`@z=(`c^n(Ln98X|X^?g@5X>y%U+5yxSti7THqr3yKEN}yhz=a zzxxN_AIE3ml4nFN9}}_TN%h`z$K#kyiNf&&RJd}v{-z4$1bFF6;j>g&`yTjPPpOID zJtGILO=r4Ivg@V%p!^C*{)v$@xMQL4=VDzd7NO%YQl^Qql|tb;onXoAAd}6#T51#bw3f^h93DhKZ@yVjen# z<66Etthm)s;SfJwi<&#ch&)W9*E*Cv{*upIr z6Z3h6Y564w4C6VOO>;hXqTj4GKE>paUogHD>N4SNQvb8V%4$Tt4IkIkT(T*SZ`GA8 zZ@i8_*l)SKgg6_S>JZDXx^&U(z$JMg-s0j z4Ufl-XDd>|)DM9vdaE^U3$CXydP7@vxGOFC4ZkL?7$0*oR2_d7hcABd`%?HE-PY(A zYrI>3!@pr{xp(6fJ^}a5SceMu%&dw6*LJ1Y{SKnL*XP=Gb>Ulr4LYClPQa!!e)jY@ zd>xE9G5toqLC&zQ8~JX&#p?Ckge4AR+;=mt;}r$of~kByzIqVNxA1I^ca(u!FanB& zu@LKGu{XDnZ)g2H=yu$rz;tv?<5_qyCkG+!s5p-3gFHqZb9sDb%-tNE@r%9IB0eP) z_o_A1kwt^>z!|?u4ns2N9=%WYiluv4D!%Mc{(^6p&rw!?`A|ietMLxLWbh_RDO1T5 z0bSWvvE~kp-c6$U4p@;*-Vg4;fP^~Zol>heS2}~cE>GB6Ty7VOi?O81?;9XeFFK0( zGSqa^U3?a2F5#JlQ%$ip6QfsR`gSiaa|!<}?BITb#oH)yXY+itP|a-q+|Ypt!MhJO zRSu=c@X-aP>8o#{?d7fl8ylrTy0abO7$vMBMt(Th|4sQy z0&B&Icx7*%p4Lx2Unk)Gjz9rXtqLM$!`xSZT_~KgS463=0XUC{B zNX{y47F~PUEIN3f9JSui1^fmMg#}f-5rbOZtf@&oK0#){%SVHum`-#Pj+D$2GEwn(=ezZF;pEpX@HcP@VC z;defI>yO()eeCp-?WeXyA1@aEhxq5R($(mOV(-~%u4h=I`xofGde(@tgx2tRvIq-m z_&c)kM=a&j;4ELtua`ykE#;*n%U4^Q&FxSG7q<}=^WmQhzd`m3lvaSH@-qC|#nfdS z?>TeDf@QcyLl$o@o8Q5W3J}*7%D38^{y3vf|~J!34d~GsF)+~LM=$xo_LxsH!s*!CuR_$D5S%HydMYb7o8AkjZ6vKjIaLCQ|L#15ZWl`jE zU1#)#O4Ya=Q{R;21A2Uq&>n%WN)!aZP*kiLR++4Y}<4dxpHXi)(7xP-lE&1 zb0uP-{mXd^+Qjt;dZ9^lJc1@_{#@jiN-Y0PqIf0RVAEOym|}UBzSizv`9E;tW2$P86-;e@3kNF>D`aVFTCV zo&Fe~6%v+))zL2Ate1xncz1XY*Yih1*(9(1DSm?i9|vrGnokJj&pqc2JcFiZw|WiF z@ekN*E1dbSH8}o1_^le@Wj4dp;m&6~nBBTy=WPv&>wl(M<0h4#8>X@Pd7J+^iBi5r zasAI8*0@9Cts46^uGhFzG_KLyHJYm_3QSZvuvl}o^Z~WP{-X(M_))ci{6{BgTrXW` z(0^1*a8zr#qiW0fk7cNW$Fu~;w2~iNrG;IOb)&j@7RX$;a z>(mAPC#+gPk>)xyS1BRleHv>8`%07lN-NM;%hmX=v@ZNgtI$_%TKEaoJvl&gM`-R; zsUHP6xj+kO(A>8*w@Y5-7YASdcM{w_%}`N zj7#cA#Hm%Pz^R>@dr)<|w2ZsfXsp$!OKXY0k5$9}uC>_Twe)}23jU7~YW(L~fj?iY z@)r{|x5%h^y0w~rv%uSQvmwIZoUWFD=JSEu)Dm`9N_l*~dWYf(c2=rY?7XdB4KJ@z z+}?EMBxl#+r>gOlYWRV2tHx>#4wM!sd_`xan$dyMHNraG5bNww<+SzXz?@tyU8mw6 znCsHmuJW8FjWs=UY#M8N=1_fVGH6QJCCqFS{^^Do=Y8rJ z>8!M?8QlAUDo7Q(Z<5AZx_ezJ-`l0Q2NtOn?QOUR)q-^1+pWewFie%lSr$LR0}o8s zSk2FQ;DHV;z^=Fl9(YsZPK`YpYc*Q5RWkh`!#UC)?7WYH6gPNasnTK;NQ{-bUWS2- zq`RPZsXwsPE(7T2*AiSVAMC7ZmT7_qoQguQPvvE5fjg`GD%S=?(G0^BQ-Ok=3&|}K zJ7yS?GnJ_zqm1|IVx=p8f)~X|+%CEyjyqA~orc&r3ME%<)y|k2(LBQt!=H&3{&K@~ z(RQaHO6te! zGlWe>XGo-s_e-13FP~mmyiaaF-!dG~8u~WY+a7 zGKBGNLj-@I0N%!#hDb4GCSn6+GOR{MJ7yZDFpu;pNjjuYjqaA-qFIPGN}q2Qa?FrE ze+g1Ak~s?NYy?)4pg1)fnJa=Qv!Xgu+<7;`3hsuSPlmaquT%OIEsGQ_-FF+N^wZk; zLFljudkMsHrC7J!5Fw6~81(BO8zxmp_Oq+?e$XMhN(`fzQVm-vsT71Y&}mYzMe)r>vpnSQO|58`EyAkTuNW-G&Nrlpwet;e zV&Qy)MFi&?28*rp4XNUtd*C|^pE@9vo~*Ws+)9J9pEB@+oz<1XS1H?0_~v8We^6-{ zCb}On%;421m_;<-gEBNIt#uEicJzk%q|Y@Uv7NoK=q>cleF!s1pH=!S(r3TVkT3S% zhxS!s(F|&=7_|UlmIbK%I|~eh*Eiq=9)Yk_7zT=mR~fG5OB`|-99)1JjdGwy1MWwS z>Sb#vLwpJJMvLVL6rbLYCd3#+w^X59s!)IqDJR=X?5aXDDFx_}1@OyQBYceu;mJ_S zBz-pNvoA!6p$sLKVa2@(WUD9%8e~wB1Ccu@ft)#L0GU8(6h#9H2VHV1K5UR)#{-B~ zTE!!Mxk|M36~WiI2x`BnHiY+oxJDg>Y8hR=c-%$FKvd)XJO zMN?-yKR!VCYtU#~-qdJIn?<*lnekymGDR=-$r{O@#wA$AQG#N`vKmqI zumR_DeB<`8p;U}pipG__#h3Od4Y|}XMSLj({Y%mIvCH7IEJx#7Wvp$P+VAQB zFwU1@bXUq~MbOnN*wmY0_#=v8y4Eg>6Fl(D2oYFj!0T~ke9bgiMe!qOg@6*D zd@jT4eqCzBBRWyE!jK*Hh(Tks>fVqc2eB*!e+2UeLvjT&$GlO@8cMNJod88E5o{Os zm4mAxr4uqojO-aDq34WAbqqv zw&aNW?;D%D`0DYxxpN(h7T&+QWS0TI{qWl#zgOUQ0DcGJH^N)8D{{m7-8N%dKmLqC zWZY;>g6l1~(dZq(Y`bR|pG*tgvu;JVShw6b48HZ3cj>}B@AybUlcZ(?wp9OS39c6ATG{qv=w;?Kr59|;{g{DFtfsH_+ z=>`0$i*1@|wMiKs$W7B2f$ea$ad61dh)&Tx&6JPtUaUoMI)tOhGzH6Q;6|yU$n+Mz zc2@kGZ#9j_^(y?a;+tDdFK|@5;Wo(P&$VweW%EG>(S6Po<4wBV^etn#!gvSDWD^;8 zpguNP5BzA#O+MjIKsF2SFd3oB1rgX)&mE@yAjb?;(Jz{$(;<8_kacXbG<3#0P525* z&4_Y}@rxptF;+~w(^QW{*1M2Xj|ki*Ylb*uF&M$crcu3Zs+9q;j$+d~=5ItAwRM7l zP$m1IOsZv7beCz|_y$d>+8xKzns$&SjcbuEezb0jHwxcfXoP_1 zybHC6HwfEI)H->l$I2h=P1_J?lS!d%CbSKKwpmi!tjn~`g0@_lE_gH^+8`sfNzru>jqBC6sND7_q+F`# zkR76V78)~vmyM<*o}d%mii>WUjbOY!kd9pxNyjA|vrX^dy{+|b)1ML8bGIptCt-h6 zVoEm^$qezM^+OUiFC{YCDqJNb1)Tbi{*;%N8xRQeRr|cF~T( z?H9hsqY}j{Wu{b-QD%zZL(L*kVT=)lWta|?B49BkiEU-3>o7G)(j;QaO=g~A7S?jp zII+6i6e+69O(x7x%LNS97s^eQ5I0nyu(`roVJc;IZ-XSX6{d5XI55W)1Ao^Xl)Fn9 z=Bk2oP2&(~eGE&@>baOXO`_3dcB z!taIe)IBIg&b`Pi8Hj2qX{JekrRsM|f0Jms7lp?>z877RsS{oInr2AXcAu$My1x5N z3-RrmbpZwyuxJ6=+#>?_BlmRYQoGMd;mQRd0Qf0aeP2qQ#V)#fj)EvMk9LW`11Mm#tc_fD zEQ>HUTSUj@Zq&Tz4)K4wvxiiM`BJz2oLF7MZs@Gx%OSPjMBJiNeiK5vTo2J2O zUW_Ke4BckDGUVuJgRnegn#afBkIu?53O7Gwx)qbJ`ymv=)_4Pkdxl38SA+bbq1rS` z(dKQhhNVCrfhDMOi?D5sx>Ag+F-4(YY&EDNzKN+pQFBG01_ie@J}h$+xeuH2GyQV9 z1OqvC#XWjurN(B} zShCz?z#qqc`LHP_@uEAXcI>6-UQ`DnrO~QXKMna}l^ei`RhjPy&Q0P}3 z56(x5USq9kKH@MCW5n88%yE2SUTex%O;|8M6&`PHTmgw}r>P&LF`8k6oTe#q>@_>l z5PsD`_ep{-6j4U@I8C+v<=cC;RYkXI(ESC-Y_AKM<%$lM(ig5TjDy9%6{hP^f}$0s z(w~<=_*S4`0VT8E1r4oWT#1^%f=LH8fg{$*;a9uTWE2s#cx+yY0fEK;4^hd&=`)6l zBZ%VH;E=e|w3lCR70r(#E&kZ?QPX4@Y+i+y3J9BYa@AF5^D1P~AsQy5=KEKf@}-y& zOA|C=h58a=#yT}|aUD{@%1ftGCP)%h&DcEbt25n*$)ZfpD`7xZqoFEA!D`gLKwT); ztu{GKWacz`F{N1;>rF{f1e1`=zRdw~hYW7`S+J+xlrFxn$IxpQol>Od zXCj8jq3FhppM~c>4m(!-vtY;LzpO|G`+g?vM=(~t?#D4?Z^DJ<6KI|yQSbzWFSAjo zLyZh>`dJ=35Inx)@?gn9ShRbp7B5=WYr${oxm>RCNmESJ&6dl9MaGlJwczq#$ud`L z+RNuYM*D)BYc7`)E+jX3eiqz}V2n!tlc?`hUE><*SjD%q41?CM8R#uqV~XTM?OH1N zu@&|wQ)?F7Q#CiWS6Lx0!`7miFlg3d*uAqBod;{b7FkWxHLk(qu^hjD~W zUh zidfY*W&MhD)wiVAxBayhmT=MZ4CX?MXnqE2v7dVeg`8<#hGOk#^-=oM5W^p4(VWpeh#~l$W5@>-Or)$vkk(yNfnb0#H0f;IK9UO zZF9NCAOf2(8Sd6Ph-TePsCwR%mv#4LvvI0H>%m;jtt3};w;H3xn&(ZaumZ~5zZE;G z=TYBo#W5+vIT(oYt10g468+Ii;vOy1GUox6Z_O3Wo6&wA;qzdXOrB0rUyYRaBD*V0$GC_^$DUa3*=Xps^P4k+PA?^ee_FHckDF3Kwj zf{+v4zlE`X`nRU|>(oqo8?Z=OYA)tEw^+$L!2GI?B9F=!b;`U(-58L;_|dxR@?@9u zG?x@c6+DXDTVxcia+~SS%g-;jVq3AzloWq?3tY@b7`9`G;e5T_G|Jg6GsTZqm|L49 z1dkR5RQGbFMQXeBwo_q?CU;p|T&`Wq2a`sXpVOnd&XOIf=l`6M6qg+vP~4w&)K1f||NRkL#xHkZCG8MhJJ7NX z!uYaW`VGSRGBU=>Ae~C#c=`V|cQx=$R#(3bB56hXJXdG~Vw>V?314mef=(v{WfD*! zey&rbL0TFV+6-`1bTr^s-c2#0T+6+xN zIAuIa6N7c+AEkl9p0P^{y4H++*AoNX#(b>GMWE(V4`rW#=fh6#NzB`FaOBeSle`nT zbQ28hNp5Gs=d@E!H3ne5*bt!6Dq0HxUH9|ac$5@wz;+4LORFqAGnYm>%h3wVc0LyH zPwDtvvcSq~tI&G6uD9qFUop@k0zGZmUb9qo-uMgi;qfC|uob~Y$xf`EudWY1h2b1h zL?qDx!}M?07rD3URind#T;9G7LxeaZXiZ*}0E&{&-`8g|$x6W#M;ERD8o)yJ?_jpyMpgwa6uZLr98 zq2-b;UIf3{PFlps9YyCw^wQHCj3NQ^!Z!M?gr3h|(nIYLeSEd(A*$rtlhuu$&qK&1 z-%`a)*?!(t77`t_F~!_`*_-P2emtg%l+n&tXtH~w=-b<{4D6x6HjKFh-x(oVx=k;c z*}r;vfMe#=`}osBbDbZd@NL-n);@#1V4Uiofh)rbh=(x1p!XRF7SS~hl43bjt>_uc zC82d_q0jVVeO9j-XS8GB8E&Ibw>X~31uqmsn<)vpxXTp2RYL4epG7G`Q_o^Yk5IyP zbl**$?U)!tvS&qh0n=B5?d^!zI{Rl|gT38z$X0wC*w?hn?4APbPLT~C?|%;5Ept%> zkhNO+qb+c9VU#m(0o4U!&4~PD0e&ZGJB(;@E@d#WK*+S5EiL5PLhc=iu6e}LQ%ot? zEkt1e*b_ui5TjHS!Sh(u+NH1NuQxziRk}wuYKZ)XB8u;X@UT?eiN36{P;sOABsz7M zK9(=lcZrxppb4{EZkKK`13b z4T^x161x$6yV*+kp9w1I!aazrby48Eu(l0*u*&SB@E(03%7c61__|~(#)1yU=hzG8 zyU4w_7b#VMh|V*8Pxfp15y6%s**DcuDFp@)B0$FmaW1e4{9CC6lNdZRUeRX{pmdFe0(&5x=qtKqw6I!mpa#k{ zNVB0EW1N8e6q{~9$4?Qd zb&_u}LyZ5Yy1As6aO9_O;6RBb^zt!kh;VmO z;1C8tJ0%VwB#hB@Sa@j1VYo2SncnR(Xoz}i59>3HviuZ=4fkQ}T?ea@kf#_4j4t>B z%mPwUy~K?v6wW|<4WJE`oEUJcprkgQJID6Xa8`2`}&IQtI9VUnu|&rtp+m+p#__H#rRj(-=y;LnzWhj~B8ArhMZ zIp%W@ncu~!Kt07O^z!J2cVUe%LGKo@aOf9$b#Ww`{RP~5ad*^q6eksk9CfA;G|xu0 zG{yzyGEW8~YmhPAtr^{kg^W1(D*F}U#E+pjzd|_$`?P;LdKyKTek4>i3j{BujJR6!|UIHG*s4^p4*0e@PEJz^H84su-`f%5=3@E#=bHF_|{-zAPN4=!~;UdQKs~j$C?NSY{Z6 z|065Ynu0Poo=eYFc%u}fa})jR8TJ1zI27i7Q4#rnr%x}v$R-J1aDzYN5SY6BVgGK9V)9kl;1 zWq`N;uVkR3K)3%y(Tk4%+k58Jr*WwwCSj^HCetIV3Mx;jd1U$ol^*Vr=@Z=&8msTp zgiK3G&&s8lCNqYshC~uJG1n*a=Qb#4ld#G!VCq*ArcZTH*N0*!k^B&g>54zhp|%cW2C$nukLmii}shv|nlivNj6^7(zrJ4{h4Wta09%}2UB zzqpLrDE2L6j_A>=s}r(*)F$B%?E>bb$WdIY>cO5aLY^Lw#b&ZcZ!5`HqSPli=pOsA zUOMi1E3auhximgUgeRBY*{xs}SNV@a+IjD~S;yrv8{^dVF?JUYS-eX&oZbn}KgL1h zMytwq3z*rck@XX7VB5+22^a}e=o9P%;uHs%;N&>QlS}Uw>0J7GC9~&aybNjnHojz&2OS^F)>d*Y5%b)e3NIsvSl!;wv+HDU0MX!>?bD5^NthA2<5ZhyxaCf(Y zyni5WG_HteLJiafGAa&{-eXhfJ=D#!m6`2nklA~%G5A!kGmf_QgjBYNLp){6+nSn} z$={p_)x$k8YX4NPE!}J3Maahq#Hac+c|wy*@2!{Fdo}9$R3~h&0-r&MvEKeEim19T zC2{w4DHv9;Q})m3KkuKD+H-oD(Y1X^g&Dy|ehtC#EdJ!u`>hhjLJIm6^ee(CnHGdM zHLx;unxDo;GV$cnvB0Kwrmor`rQ{xqZR%t-rTZ-kDZ44j45g(HI7M!zF(6C#D;D?1 zRGM1^RK6eYioht-2Ve=sxYu+~G2@o7Us%HIVr~ePCXO@`3&R(9UGQ^2ad1FsUNx59 z?~!Kp0=^MwVwI&YSQUPcw5u0z4Pyx7w^d_9a0PSi5H=HLjo+)Wp~%HfcqnM$d#M~mC^i%|veZ44)v%X@OwhOrR=tD( z=J9O6;H?v~w^(jySY(GUx*azrNxRkX})oR2YrhkY_@LSJf^^domz>1|I z_40cGUPc-}#Y#KY|gtRe1yyPU;iR>eYz`jO&2Bj(^J5IBPCNuwZU-18cRLdc#2{4ZWS6E?y@Dp=0S>HSemGreWT z?;6uvFt&2wL1P>s40sh>|Jri44OQ(GLPX9A#xDo^D%fmTP`mO_{6fw+cGyLQ` z4YhDDor5GLPJ=d&;S%U+(91EK7++Ld!%CzKbBGl#Zd%WK;^TjE>0?5c_^D)j%th`R zs0|*YhE3B&|9VR=P@|x%0#Ut>YM39^=Nr!|i~)5F!*)EIQC(2&SXMS>ggZ|41a082 z8?&_yoxlfpY~UU(+Ze&0_1M^S({I825sa^^Ca?+Un7IG^TRU}50CO0Z_cIIrA3lg2 zbJ#L&EAJKITaYXYv1e0=DNdh+Y7kHOOlY-ZGOIHIAu<`#VOlgfnKkmDBFCh8wako6 zYN%yAF6Yg{T3f%4tH1N>SeXB(Ky_#lTxqAXhfG;(G;%uh0+)gGbh_|NwhkZiL0(lc z{pKuY!P|dlv!n700=;tU4oLxIZPar%x1FhIu(n&n5lS}(*i=x&#lwd&<{p{~cj6@X z3|1LEei{oLXZpy(dkCfP(T369bJ@?pq+=2!v*WAqXo!2B2fh=OJ&(0Ogs~s7@zgP$ zO*4IDC2xmz%8>M*6Y9sOINt3*@AmG}%~Ux96N*2Ih7bl$P^SYRPouhv z(c9rTTe+CcGY!Wn&c(2M568_xIRa)-oV*xq;0wwq<@Tqsa`v@>Snf+;VJF(je+jVR zZaF}(z6>`a|8NN#Wg20Y?@Cn9W99Id;$4YL`EL)U#5)xHcSye8uyr1@(ns^yiS+I~ zHs+i%#lHCRW>GG4mbPSRYtxj)ZLLd|wtN?bKFMpDO(9D8WXf=LbUwSvG(sc)d?*_i zWaqQ_FcqtdmGj(s7ls>Py9>;sZ5KunJa8k#-gYUghpDI1kmcS>p;U~~b*NR=K-o({ z#6gbBu-YgyllL;7Z6?P-ZPZCa$Er=jMQXPCfQ_WM3~%HVlJ*P z$i|xhSHRbJsPhUm?56k?u(%$+#I@i>G7uV7AUC6dQJfIJPtmUd;LCJxe!hk9mFPr+ ze2wNeSF!|}@isu0$*WjS?-t|+bfbJ=D_R4(ku7LE--xRLg0q;Tp!_i0QB=E{Z7nXi z5t>0C64w|DlYw0r;~b27{Q?Lnn^(4X0rcTjcCdimBu{&CsbbNaTxKM0)nCh|GPQY6 z6*~ms^d=n4Un{05ECOIc*J42tAn!sDPf}nZR$?B3m?`m7Y9XYC;V!IF*dOR=lEJAK zi8eMsvDF~7wh_~GJ%t;E4aGQcP^yuw&fhBTHU7l4+IYIh&9oASBm!g1u7yKA=w>#| z5Lq`YxY~;EeTc~iZ%NhCu|;r>7$N_ML#`Ruu@tmvT`WdRw0#gGX! zv8lqgc~c)C&)guJ8b@`vXyrq={o9+_>gpKJ#&aD1lgrddBh4s1WGtN&Z)R1a{k#~@ z@%&FNqXi^9EfHLT<&A@<@EAn8cmg_5#MFSuoR%Qh5>`H@#=^_-6i};ik&ly$i9+#b z;vb40eALQ+4kQQk#1d99IwUX$QcDC|Sk*TK55SP8fSK_TNvyYnGF_8sTDquZ%F5MC zS1tC;xGV3w#t*{lc;arw6Kb=iB`a(w2sVpr=Zr<{H>*noBMde@j`BBv7qPU z;~byvTEfPdY<59Xxr<(sn7up@o=r3{kc7=aUJv@)$@_yx^>>1mCvtrhD$_Q{lEv7P zPibnt?#7lr{k09EX1bPE-Oc zRL=x^Tl4ZM*DY#oZC){>k3jRUHWrfaq~uaobM-_+ePH8@*qzYXOaD8ZWgq{O%S^~} zh^K)5L>o0+kNvu#PsRQuGshh$ZJ>v*hpBpbF`hzdVZ5dV=Q&9es#o8J%By~2m@~Jm zt))#V$H!^pG84Nw#8W_S625qG1DNxP!n`R=>fz~u%mF=c1DJCw^g?Rza5u1;iIY`v zk?P~*cAhbCSWd#ibQ#DcKcC!W%#zD6$bJ2bCoAR(eFo42oLWPFbi)Bn26M~6+!R$@ zWa2+^nJGRAN7)tR0QtbzmcyS7!rT;%oXgqxZzwq%)M{1jLTXdAm5Wz2H@8kXbw%6i zmAy`5id$3|pcuT68D9>otQ8^zj+zr{eH=fR89+a@vU%B(Rn03`O*wUWbIZyN3U5k^ zqDQq{FQ4@Kl*0QpB@r^5%uDWRokH+0?*m$j5&>Bb$+_qxK z*QsJd8g=bFV<5M+A=28Qs+7VnV6F~|Z)0_N#j7D>SLReW;(;D&gQf;id|ikVZBV>j zQ>_`~gz5$wIqv- zdbWqj`pvMSmsI!# z%$)`1P>iKr!zyeA{Cok3{r4*Da=NH%6$W-UrB-2{I9m(eh<(V}cCkB-&bW~!`G>2; zeWSY7NH}FdRXYnI))x%m-REE2#Ksl7gKJnDmWtjr*z#h*FdLzpkJeyQ+l@Dov5NGP zn*;3pZw4P&Moz)rec#Q@hsCku7Q{AizxhnmIc&i?{x`RPdK@2G0%MT+S%_G5Y~~j+ ze}PcN(QjiZi`az=H44thor-!)W}bP24?3^V!GiB5*sfpf%*0SaD( z&CE;&*CSYsUav=?!ME@ZIq}7kPq60SupWE)^D)}iVcEF!+4apKewIix3WrhzR1j_hFbZLT;_c6c`MM3-t@K>x)tW&qBuaFQDwPKTwJ>i z#Aew9wR|J9iYWXDB2uo~K(V2q4Eyg#@u`GIZ)2w*<{7&Uwgg>t--bN{p!Ier0};pD zVQB~t1#V}vt5cjp4ziPQvRlG)l}u-07yT$qrRolJzFofIKI0BH+XOax3t&(D)%U}9 zz~I`+%EL}iFG9pAb3p?+?i7aLz7su7Qs7Q0QTs3P0f5Z;h$8a*Y|sx*p}*|gD0bG9 z!;f8Z{-tQ;7Ux*V<3~_N7#-L&vT;w+4;GL5v9~|yM_epRDL*z^b2QTa6FXH0|CWXL zk_y1+Ebky5r89Ly0;WdR-)rU3+VAiKf+X3$i*0C@vQ98G$%EH`F>C_(`k`J=5CPiTq?J(BUCc%wI9Y{hB91ILW{j+N<3k&p?qWKdYnKfg{9d9_*ImMf#IXM0 zF81|_mk9Cqa&>Wv*U2G-+WM{LrlrPp%giM>ZM++{jnl@vK>}fUo`UnZ8!DZr1vfy9 z^AKR)0HMO!aDbO;Hvko@cK)f2gBzeCjOlyC7;xPK@g(6zc;v_y01cO&oB=j(OjcN3 zE~73f8841xT!?lBU_~&6FNjV7%Y84X;Zl|Y}d+w|#Fb3Z(850B{9n64{U3^mf2vohTab{ujwiqxd|TGLkWVY>q!fNy?T6t zl@Hwz!zbX#EwlU_;8tb`!IhMZC4P1}qNc46u%)_>O9_v%)^GU9{vex8b>CwZ?CJue zk%d*X`g_b#5V_2t%=&#qAamct_`vbkgD_G-s}WO5ZwdzTAY!P9JxT=BX#}Uf@3Vb; zCiwvj399`86e9p$Mf?H#$b|Q%!{=hmzw{7$#5kSq@Nl+qs@^T3+ohlw4Y`aPpTNUG zCk{g8>ASl#7{(yZJu!W*IUT(BUYuZ!e^RsviBn#8^n3UzXMJYcf0SzJQCQAu(27vsW zq5Q_C1`0e0jw2M|NIjI80{i{tE}V7M-N9cF*@9qOitJn9A8|;&1>rh3X(e#@Pj`Tu zr=MayrWRPoE;yLIPh&cOv#G}K%B}1s+85!GI^nq9+R7#rywRRng4Ig|Uc_rBM}#dL zXSmuH-fiLY7cXjUYc;+Tk@0%*Vjy@8Q7QtH!aQ{hGAQ4MLno+W8*404)&hn)x54(j zf^O-Dl3oVcj%T2j6^NMs7%qUG!T*`tuG*5LF+H3byAUE6nCj4GrRf43 z!iBL^ow}Ws4N0E^C$b$ZIHc<5Z-=YEl)fFz;Z?Tn@CqJTlIvIEeh$lz8!h7SjGlT9 zXRm!L*~q#B?l4aF9iY=it{uX&`gXwL+!R@i1Gh{QUILKW)+p9}t8oSpg;xzzgaaIU zMB#?pF=a$B>0a5zej*Q5&`0Grn-LVBn_Bbo^L;bz5A9yiVL4-`$zY02i*`- zFF@RlGb9(68-KSfz8ieRsCzeCX!^E=zx_NU^KC0da$sTY9;Wk&cMqI#j9hymCoHh{ z!q)wi*vs1TdtA}GTxOkYF5|O`W-~ssf|?xm9k>=Ui{9POhT}ChETbK&*b(G1G(qmlM;9fdSA!aC5PY{8lsUyI5UNDJ2oIMm%thPy;u~y#vYdIc}$uPDS?fa;OnfeM2T&q zi|Ucg&v(kU@5NP(*D-kssiB^cZRL02D&&03$?+$bx!)<_ePIRt3PMMGKHk_3T}%d^ zP%ST8-n_hR#ZCMduYX@c!I*+D!8f3@tV&{PegmWDesNWee=?jaev`7i`@1F9{aM-A z{U~=)>`mNB+GJBjxajdF=qVG~gzINVV2z!!bd!fXM<7oh?O%?!O&>eLM#}l&@Db*M zJG8!qSyeOwd?|?Zi6IKVjp4KKE%p^9$~63c_$}eD#2I4{E*2A*Iw4BK>%kN%Y3kd| z!N|;;#-rqF4e(uxWtdN77Ex6aj`Qe+tc>15wuv-e%)hW^#pn8^ehE07BIPP xtc1S5a9C7SiZA?pg?_f#a<{4R*W`J^!k4h=mFAP_g(oacFkSKcf+sEK{Xd*Z8S?-D delta 51679 zcmce;3w%>W`u~4s=;ai-ZFBN>Ie;qNc)X-9^p1tai~gzt5a=9&YaX{r+FS|No!Y zt7qmt^UO0d&s?547YKY%8~C6$xPaN7^RFAnhkg`_U(heZ78v?2Mc$%F8%18C$n!Fy z+5*G4uJ>Ioxlw^g}?>qK~N3oN#F$ZB5(kD6X*aNfgPX` z*Z{c%DxeR60?4yqSQnr#K?;yh&7P(!A4T4w$SxVdZZ^~frSk!D zYa3b(xQ@UHxSqfPSU{iy`~-Hu4Fop8LIM@Ah(G}>wqQsX;6{QJU4FSVqtaxRoFRSWeIaXq2$-vTXK!sL9jFJ}|CP<0_2nQsX+sxQ;Zg z1)-+NjZz-h4~%QnxC-OC)VNMDt|N_WfpP5~Qm<-ce>JXe8P}(b>z&5+TH|_&aji10 z-9zfthCHrs8S$r#>z&5+TH|_&ajgn9&AcTeywWxxwEKcW3}IC>;>_x0RS>`lngHDh z0svaxRSf`I-c^18E$^y&04?t-AApv3l@~zEyUGKg>nf7~@^zI7 zKp~060p#l{+X3Y3Dq{fhb(O6E@^zIFKnW>m0g$h&3d!2ko&A~0?2()CdpaF0@fgiA%pdPS> zzz1j|@B;22@Br>4a0BilZ~^Wns0RFozzMjAzyY|IKnDZ~?0~fdHo!Up6%Zm&0P8I{ zwF__`K?<;epc5bnl7MD{1mJ#xIN$+-cEE!KF~CNGR=`695x~O)Er3S|!hkSAGvHBz zAYcDX z7~o}sR>1EGB7j#2S^%#SgaI*vX25F%K|mWp6X11%0AMFU1KX3OAE2GU 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 diff --git a/roms/openbios b/roms/openbios index 038aa78d3c..b8dea39718 160000 --- a/roms/openbios +++ b/roms/openbios @@ -1 +1 @@ -Subproject commit 038aa78d3c331731733378a73e778ee620a5b9da +Subproject commit b8dea39718916f4d7d391cd1664314d52a45b872