From 044f4c8b0ee90290b6cbbc616c4be3c8aeffcaab Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 12 Nov 2012 16:46:49 +0000 Subject: [PATCH 01/40] pseries: Fix incorrect initialization of interrupt controller Currently in the reset code for the XICS interrupt controller, we initialize the pending_priority field to 0 (most favored, by XICS convention). This is incorrect, since there is no pending interrupt, it should be set to least favored - 0xff. At the moment our XICS implementation doesn't get hurt by this edge case, but it does confuse the upcoming kernel XICS implementation. Signed-off-by: David Gibson Signed-off-by: Alexander Graf --- hw/xics.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/xics.c b/hw/xics.c index 1da310653b..edf58339c0 100644 --- a/hw/xics.c +++ b/hw/xics.c @@ -495,7 +495,7 @@ static void xics_reset(void *opaque) for (i = 0; i < icp->nr_servers; i++) { icp->ss[i].xirr = 0; - icp->ss[i].pending_priority = 0; + icp->ss[i].pending_priority = 0xff; icp->ss[i].mfrr = 0xff; /* Make all outputs are deasserted */ qemu_set_irq(icp->ss[i].output, 0); From bf3bc4c4e992fb9914e2f1f7e8a569394d298b57 Mon Sep 17 00:00:00 2001 From: Ben Herrenschmidt Date: Mon, 12 Nov 2012 16:46:50 +0000 Subject: [PATCH 02/40] pseries: Use #define for XICS base irq number Currently the lowest "real" irq number for the XICS irq controller (as opposed to numbers reserved for IPIs and other special purposes) is hard coded as 16 in two places - in xics_system_init() and in spapr.c. As well as being generally bad practice, we're going to need to change this number soon to fit in with the in-kernel XICS implementation. This patch adds a #define for this number to avoid future breakage. Signed-off-by: Michael Ellerman Signed-off-by: Ben Herrenschmidt Signed-off-by: David Gibson Signed-off-by: Alexander Graf --- hw/spapr.c | 2 +- hw/xics.c | 2 +- hw/xics.h | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/hw/spapr.c b/hw/spapr.c index ad3f0ea7fc..eafee0313d 100644 --- a/hw/spapr.c +++ b/hw/spapr.c @@ -801,7 +801,7 @@ static void ppc_spapr_init(QEMUMachineInitArgs *args) /* Set up Interrupt Controller */ spapr->icp = xics_system_init(XICS_IRQS); - spapr->next_irq = 16; + spapr->next_irq = XICS_IRQ_BASE; /* Set up EPOW events infrastructure */ spapr_events_init(spapr); diff --git a/hw/xics.c b/hw/xics.c index edf58339c0..b8887cd9c7 100644 --- a/hw/xics.c +++ b/hw/xics.c @@ -549,7 +549,7 @@ struct icp_state *xics_system_init(int nr_irqs) ics = g_malloc0(sizeof(*ics)); ics->nr_irqs = nr_irqs; - ics->offset = 16; + ics->offset = XICS_IRQ_BASE; ics->irqs = g_malloc0(nr_irqs * sizeof(struct ics_irq_state)); icp->ics = ics; diff --git a/hw/xics.h b/hw/xics.h index 6817268697..c3bf0083e2 100644 --- a/hw/xics.h +++ b/hw/xics.h @@ -28,6 +28,7 @@ #define __XICS_H__ #define XICS_IPI 0x2 +#define XICS_IRQ_BASE 0x10 struct icp_state; From 4aac82c34675fcbd3722dfc3a2d04c839215ec6b Mon Sep 17 00:00:00 2001 From: Michael Ellerman Date: Mon, 12 Nov 2012 16:46:52 +0000 Subject: [PATCH 03/40] pseries: Return the token when we register an RTAS call The kernel will soon be able to service some RTAS calls. However the choice of tokens will still be up to userspace. To support this have spapr_rtas_register() return the token that is allocated for an RTAS call, that allows the calling code to tell the kernel what the token value is. Signed-off-by: Michael Ellerman Signed-off-by: Benjamin Herrenschmidt Signed-off-by: David Gibson Signed-off-by: Alexander Graf --- hw/spapr.h | 2 +- hw/spapr_rtas.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hw/spapr.h b/hw/spapr.h index efe7f5758f..971a50ab02 100644 --- a/hw/spapr.h +++ b/hw/spapr.h @@ -320,7 +320,7 @@ static inline void rtas_st(target_ulong phys, int n, uint32_t val) typedef void (*spapr_rtas_fn)(sPAPREnvironment *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets); -void spapr_rtas_register(const char *name, spapr_rtas_fn fn); +int spapr_rtas_register(const char *name, spapr_rtas_fn fn); target_ulong spapr_rtas_call(sPAPREnvironment *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets); diff --git a/hw/spapr_rtas.c b/hw/spapr_rtas.c index 6d5c48a740..45294e8305 100644 --- a/hw/spapr_rtas.c +++ b/hw/spapr_rtas.c @@ -242,7 +242,7 @@ target_ulong spapr_rtas_call(sPAPREnvironment *spapr, return H_PARAMETER; } -void spapr_rtas_register(const char *name, spapr_rtas_fn fn) +int spapr_rtas_register(const char *name, spapr_rtas_fn fn) { int i; @@ -258,7 +258,7 @@ void spapr_rtas_register(const char *name, spapr_rtas_fn fn) rtas_next->name = name; rtas_next->fn = fn; - rtas_next++; + return (rtas_next++ - rtas_table) + TOKEN_BASE; } int spapr_rtas_device_tree_setup(void *fdt, hwaddr rtas_addr, From d36b66f7a420737dcc24de15b35a465ff6b1798d Mon Sep 17 00:00:00 2001 From: Ben Herrenschmidt Date: Mon, 12 Nov 2012 16:46:53 +0000 Subject: [PATCH 04/40] pseries: Allow RTAS tokens without a qemu handler Kernel-based RTAS calls will not have a qemu handler, but will still be registered in qemu in order to be assigned a token number and appear in the device-tree. Let's test for the name being NULL rather than the handler when deciding to skip an entry while building the device-tree Signed-off-by: Benjamin Herrenschmidt Signed-off-by: David Gibson Signed-off-by: Alexander Graf --- hw/spapr_rtas.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/spapr_rtas.c b/hw/spapr_rtas.c index 45294e8305..e618c2db53 100644 --- a/hw/spapr_rtas.c +++ b/hw/spapr_rtas.c @@ -301,7 +301,7 @@ int spapr_rtas_device_tree_setup(void *fdt, hwaddr rtas_addr, for (i = 0; i < TOKEN_MAX; i++) { struct rtas_call *call = &rtas_table[i]; - if (!call->fn) { + if (!call->name) { continue; } From 500efa2319d1f1074b1d61e5ceb7a0fd61d0831d Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 12 Nov 2012 16:46:54 +0000 Subject: [PATCH 05/40] pseries: Add tracepoints to the XICS interrupt controller This patch adds tracing / debugging calls to the XICS interrupt controller implementation used on the pseries machine. Signed-off-by: Ben Herrenschmidt Signed-off-by: David Gibson Signed-off-by: Alexander Graf --- hw/xics.c | 23 ++++++++++++++++++++--- trace-events | 13 +++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/hw/xics.c b/hw/xics.c index b8887cd9c7..33f99c7757 100644 --- a/hw/xics.c +++ b/hw/xics.c @@ -26,6 +26,7 @@ */ #include "hw.h" +#include "trace.h" #include "hw/spapr.h" #include "hw/xics.h" @@ -66,6 +67,8 @@ static void icp_check_ipi(struct icp_state *icp, int server) return; } + trace_xics_icp_check_ipi(server, ss->mfrr); + if (XISR(ss)) { ics_reject(icp->ics, XISR(ss)); } @@ -120,11 +123,13 @@ static void icp_set_mfrr(struct icp_state *icp, int server, uint8_t mfrr) static uint32_t icp_accept(struct icp_server_state *ss) { - uint32_t xirr; + uint32_t xirr = ss->xirr; qemu_irq_lower(ss->output); - xirr = ss->xirr; ss->xirr = ss->pending_priority << 24; + + trace_xics_icp_accept(xirr, ss->xirr); + return xirr; } @@ -134,6 +139,7 @@ static void icp_eoi(struct icp_state *icp, int server, uint32_t xirr) /* Send EOI -> ICS */ ss->xirr = (ss->xirr & ~CPPR_MASK) | (xirr & CPPR_MASK); + trace_xics_icp_eoi(server, xirr, ss->xirr); ics_eoi(icp->ics, xirr & XISR_MASK); if (!XISR(ss)) { icp_resend(icp, server); @@ -144,6 +150,8 @@ static void icp_irq(struct icp_state *icp, int server, int nr, uint8_t priority) { struct icp_server_state *ss = icp->ss + server; + trace_xics_icp_irq(server, nr, priority); + if ((priority >= CPPR(ss)) || (XISR(ss) && (ss->pending_priority <= priority))) { ics_reject(icp->ics, nr); @@ -153,6 +161,7 @@ static void icp_irq(struct icp_state *icp, int server, int nr, uint8_t priority) } ss->xirr = (ss->xirr & ~XISR_MASK) | (nr & XISR_MASK); ss->pending_priority = priority; + trace_xics_icp_raise(ss->xirr, ss->pending_priority); qemu_irq_raise(ss->output); } } @@ -217,10 +226,12 @@ static void set_irq_msi(struct ics_state *ics, int srcno, int val) { struct ics_irq_state *irq = ics->irqs + srcno; + trace_xics_set_irq_msi(srcno, srcno + ics->offset); + if (val) { if (irq->priority == 0xff) { irq->status |= XICS_STATUS_MASKED_PENDING; - /* masked pending */ ; + trace_xics_masked_pending(); } else { icp_irq(ics->icp, irq->server, srcno + ics->offset, irq->priority); } @@ -231,6 +242,7 @@ static void set_irq_lsi(struct ics_state *ics, int srcno, int val) { struct ics_irq_state *irq = ics->irqs + srcno; + trace_xics_set_irq_lsi(srcno, srcno + ics->offset); if (val) { irq->status |= XICS_STATUS_ASSERTED; } else { @@ -279,6 +291,8 @@ static void ics_write_xive(struct ics_state *ics, int nr, int server, irq->priority = priority; irq->saved_priority = saved_priority; + trace_xics_ics_write_xive(nr, srcno, server, priority); + if (irq->lsi) { write_xive_lsi(ics, srcno); } else { @@ -290,6 +304,7 @@ static void ics_reject(struct ics_state *ics, int nr) { struct ics_irq_state *irq = ics->irqs + nr - ics->offset; + trace_xics_ics_reject(nr, nr - ics->offset); irq->status |= XICS_STATUS_REJECTED; /* Irrelevant but harmless for LSI */ irq->status &= ~XICS_STATUS_SENT; /* Irrelevant but harmless for MSI */ } @@ -315,6 +330,8 @@ static void ics_eoi(struct ics_state *ics, int nr) int srcno = nr - ics->offset; struct ics_irq_state *irq = ics->irqs + srcno; + trace_xics_ics_eoi(nr); + if (irq->lsi) { irq->status &= ~XICS_STATUS_SENT; } diff --git a/trace-events b/trace-events index 6c6cbf10fd..6cb450a993 100644 --- a/trace-events +++ b/trace-events @@ -1022,3 +1022,16 @@ spapr_pci_rtas_ibm_change_msi(unsigned func, unsigned req) "func %u, requested % spapr_pci_rtas_ibm_query_interrupt_source_number(unsigned ioa, unsigned intr) "queries for #%u, IRQ%u" spapr_pci_msi_write(uint64_t addr, uint64_t data, uint32_t dt_irq) "@%"PRIx64"<=%"PRIx64" IRQ %u" spapr_pci_lsi_set(const char *busname, int pin, uint32_t irq) "%s PIN%d IRQ %u" + +# hw/xics.c +xics_icp_check_ipi(int server, uint8_t mfrr) "CPU %d can take IPI mfrr=%#x" +xics_icp_accept(uint32_t old_xirr, uint32_t new_xirr) "icp_accept: XIRR %#"PRIx32"->%#"PRIx32 +xics_icp_eoi(int server, uint32_t xirr, uint32_t new_xirr) "icp_eoi: server %d given XIRR %#"PRIx32" new XIRR %#"PRIx32 +xics_icp_irq(int server, int nr, uint8_t priority) "cpu %d trying to deliver irq %#"PRIx32" priority %#x" +xics_icp_raise(uint32_t xirr, uint8_t pending_priority) "raising IRQ new XIRR=%#x new pending priority=%#x" +xics_set_irq_msi(int srcno, int nr) "set_irq_msi: srcno %d [irq %#x]" +xics_masked_pending(void) "set_irq_msi: masked pending" +xics_set_irq_lsi(int srcno, int nr) "set_irq_lsi: srcno %d [irq %#x]" +xics_ics_write_xive(int nr, int srcno, int server, uint8_t priority) "ics_write_xive: irq %#x [src %d] server %#x prio %#x" +xics_ics_reject(int nr, int srcno) "reject irq %#x [src %d]" +xics_ics_eoi(int nr) "ics_eoi: irq %#x" From 22a2611c9cef4a8c8ad96fe17b3511a6cc5fb3a1 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 12 Nov 2012 16:46:55 +0000 Subject: [PATCH 06/40] pseries: Split xics irq configuration from state information Currently the XICS irq controller code has a per-irq state structure which amongst other things includes whether the interrupt is level or message triggered - this is configured by the platform code, and is not directly visible to the guest. This leads to a slightly awkward construct at reset time where we need to reset everything in the state structure _except_ the lsi/msi flag, which needs to retain the information given at platform init time. More importantly this flag will make matching the qemu state to the KVM state for the upcoming in-kernel XICS implementation more awkward. This patch, therefore, removes this flag from the per-irq state structure, instead adding a parallel array giving the lsi/msi configuration per irq. Signed-off-by: David Gibson Signed-off-by: Alexander Graf --- hw/xics.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/hw/xics.c b/hw/xics.c index 33f99c7757..55899ce77d 100644 --- a/hw/xics.c +++ b/hw/xics.c @@ -179,13 +179,13 @@ struct ics_irq_state { #define XICS_STATUS_REJECTED 0x4 #define XICS_STATUS_MASKED_PENDING 0x8 uint8_t status; - bool lsi; }; struct ics_state { int nr_irqs; int offset; qemu_irq *qirqs; + bool *islsi; struct ics_irq_state *irqs; struct icp_state *icp; }; @@ -254,9 +254,8 @@ static void set_irq_lsi(struct ics_state *ics, int srcno, int val) static void ics_set_irq(void *opaque, int srcno, int val) { struct ics_state *ics = (struct ics_state *)opaque; - struct ics_irq_state *irq = ics->irqs + srcno; - if (irq->lsi) { + if (ics->islsi[srcno]) { set_irq_lsi(ics, srcno, val); } else { set_irq_msi(ics, srcno, val); @@ -293,7 +292,7 @@ static void ics_write_xive(struct ics_state *ics, int nr, int server, trace_xics_ics_write_xive(nr, srcno, server, priority); - if (irq->lsi) { + if (ics->islsi[srcno]) { write_xive_lsi(ics, srcno); } else { write_xive_msi(ics, srcno); @@ -314,10 +313,8 @@ static void ics_resend(struct ics_state *ics) int i; for (i = 0; i < ics->nr_irqs; i++) { - struct ics_irq_state *irq = ics->irqs + i; - /* FIXME: filter by server#? */ - if (irq->lsi) { + if (ics->islsi[i]) { resend_lsi(ics, i); } else { resend_msi(ics, i); @@ -332,7 +329,7 @@ static void ics_eoi(struct ics_state *ics, int nr) trace_xics_ics_eoi(nr); - if (irq->lsi) { + if (ics->islsi[srcno]) { irq->status &= ~XICS_STATUS_SENT; } } @@ -354,7 +351,7 @@ void xics_set_irq_type(struct icp_state *icp, int irq, bool lsi) { assert(ics_valid_irq(icp->ics, irq)); - icp->ics->irqs[irq - icp->ics->offset].lsi = lsi; + icp->ics->islsi[irq - icp->ics->offset] = lsi; } static target_ulong h_cppr(PowerPCCPU *cpu, sPAPREnvironment *spapr, @@ -518,10 +515,8 @@ static void xics_reset(void *opaque) qemu_set_irq(icp->ss[i].output, 0); } + memset(ics->irqs, 0, sizeof(struct ics_irq_state) * ics->nr_irqs); for (i = 0; i < ics->nr_irqs; i++) { - /* Reset everything *except* the type */ - ics->irqs[i].server = 0; - ics->irqs[i].status = 0; ics->irqs[i].priority = 0xff; ics->irqs[i].saved_priority = 0xff; } @@ -568,6 +563,7 @@ struct icp_state *xics_system_init(int nr_irqs) ics->nr_irqs = nr_irqs; ics->offset = XICS_IRQ_BASE; ics->irqs = g_malloc0(nr_irqs * sizeof(struct ics_irq_state)); + ics->islsi = g_malloc0(nr_irqs * sizeof(bool)); icp->ics = ics; ics->icp = icp; From 639e8102ae71ce2e46ebeffc6080767e573c0c56 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 12 Nov 2012 16:46:57 +0000 Subject: [PATCH 07/40] pseries: Implement PAPR NVRAM The PAPR specification requires a certain amount of NVRAM, accessed via RTAS, which we don't currently implement in qemu. This patch addresses this deficiency, implementing the NVRAM as a VIO device, with some glue to instantiate it automatically based on a machine option. The machine option specifies a drive id, which is used to back the NVRAM, making it persistent. If nothing is specified, the driver instead simply allocates space for the NVRAM, which will not be persistent Signed-off-by: David Gibson Signed-off-by: Alexander Graf --- hw/ppc/Makefile.objs | 2 +- hw/spapr.c | 33 ++++++++ hw/spapr.h | 2 + hw/spapr_nvram.c | 196 +++++++++++++++++++++++++++++++++++++++++++ qemu-config.c | 4 + 5 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 hw/spapr_nvram.c diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs index 8fe21235f0..44921273c3 100644 --- a/hw/ppc/Makefile.objs +++ b/hw/ppc/Makefile.objs @@ -11,7 +11,7 @@ obj-y += ppc_newworld.o obj-$(CONFIG_PSERIES) += spapr.o spapr_hcall.o spapr_rtas.o spapr_vio.o obj-$(CONFIG_PSERIES) += xics.o spapr_vty.o spapr_llan.o spapr_vscsi.o obj-$(CONFIG_PSERIES) += spapr_pci.o pci-hotplug.o spapr_iommu.o -obj-$(CONFIG_PSERIES) += spapr_events.o +obj-$(CONFIG_PSERIES) += spapr_events.o spapr_nvram.o # PowerPC 4xx boards obj-y += ppc4xx_devs.o ppc4xx_pci.o ppc405_uc.o ppc405_boards.o obj-y += ppc440_bamboo.o diff --git a/hw/spapr.c b/hw/spapr.c index eafee0313d..d23aa9d7c1 100644 --- a/hw/spapr.c +++ b/hw/spapr.c @@ -657,6 +657,36 @@ static void spapr_cpu_reset(void *opaque) (spapr->htab_shift - 18); } +static void spapr_create_nvram(sPAPREnvironment *spapr) +{ + QemuOpts *machine_opts; + DeviceState *dev; + + dev = qdev_create(&spapr->vio_bus->bus, "spapr-nvram"); + + machine_opts = qemu_opts_find(qemu_find_opts("machine"), 0); + if (machine_opts) { + const char *drivename; + + drivename = qemu_opt_get(machine_opts, "nvram"); + if (drivename) { + BlockDriverState *bs; + + bs = bdrv_find(drivename); + if (!bs) { + fprintf(stderr, "No such block device \"%s\" for nvram\n", + drivename); + exit(1); + } + qdev_prop_set_drive_nofail(dev, "drive", bs); + } + } + + qdev_init_nofail(dev); + + spapr->nvram = (struct sPAPRNVRAM *)dev; +} + /* Returns whether we want to use VGA or not */ static int spapr_vga_init(PCIBus *pci_bus) { @@ -818,6 +848,9 @@ static void ppc_spapr_init(QEMUMachineInitArgs *args) } } + /* We always have at least the nvram device on VIO */ + spapr_create_nvram(spapr); + /* Set up PCI */ spapr_pci_rtas_init(); diff --git a/hw/spapr.h b/hw/spapr.h index 971a50ab02..600722f132 100644 --- a/hw/spapr.h +++ b/hw/spapr.h @@ -6,11 +6,13 @@ struct VIOsPAPRBus; struct sPAPRPHBState; +struct sPAPRNVRAM; struct icp_state; typedef struct sPAPREnvironment { struct VIOsPAPRBus *vio_bus; QLIST_HEAD(, sPAPRPHBState) phbs; + struct sPAPRNVRAM *nvram; struct icp_state *icp; hwaddr ram_limit; diff --git a/hw/spapr_nvram.c b/hw/spapr_nvram.c new file mode 100644 index 0000000000..641de485f9 --- /dev/null +++ b/hw/spapr_nvram.c @@ -0,0 +1,196 @@ +/* + * QEMU sPAPR NVRAM emulation + * + * Copyright (C) 2012 David Gibson, IBM Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include +#include + +#include "device_tree.h" +#include "hw/sysbus.h" +#include "hw/spapr.h" +#include "hw/spapr_vio.h" + +typedef struct sPAPRNVRAM { + VIOsPAPRDevice sdev; + uint32_t size; + uint8_t *buf; + BlockDriverState *drive; +} sPAPRNVRAM; + +#define MIN_NVRAM_SIZE 8192 +#define DEFAULT_NVRAM_SIZE 16384 +#define MAX_NVRAM_SIZE (UINT16_MAX * 16) + +static void rtas_nvram_fetch(sPAPREnvironment *spapr, + uint32_t token, uint32_t nargs, + target_ulong args, + uint32_t nret, target_ulong rets) +{ + sPAPRNVRAM *nvram = spapr->nvram; + hwaddr offset, buffer, len; + int alen; + void *membuf; + + if ((nargs != 3) || (nret != 2)) { + rtas_st(rets, 0, -3); + return; + } + + if (!nvram) { + rtas_st(rets, 0, -1); + rtas_st(rets, 1, 0); + return; + } + + offset = rtas_ld(args, 0); + buffer = rtas_ld(args, 1); + len = rtas_ld(args, 2); + + if (((offset + len) < offset) + || ((offset + len) > nvram->size)) { + rtas_st(rets, 0, -3); + rtas_st(rets, 1, 0); + return; + } + + membuf = cpu_physical_memory_map(buffer, &len, 1); + if (nvram->drive) { + alen = bdrv_pread(nvram->drive, offset, membuf, len); + } else { + assert(nvram->buf); + + memcpy(membuf, nvram->buf + offset, len); + alen = len; + } + cpu_physical_memory_unmap(membuf, len, 1, len); + + rtas_st(rets, 0, (alen < len) ? -1 : 0); + rtas_st(rets, 1, (alen < 0) ? 0 : alen); +} + +static void rtas_nvram_store(sPAPREnvironment *spapr, + uint32_t token, uint32_t nargs, + target_ulong args, + uint32_t nret, target_ulong rets) +{ + sPAPRNVRAM *nvram = spapr->nvram; + hwaddr offset, buffer, len; + int alen; + void *membuf; + + if ((nargs != 3) || (nret != 2)) { + rtas_st(rets, 0, -3); + return; + } + + if (!nvram) { + rtas_st(rets, 0, -1); + return; + } + + offset = rtas_ld(args, 0); + buffer = rtas_ld(args, 1); + len = rtas_ld(args, 2); + + if (((offset + len) < offset) + || ((offset + len) > nvram->size)) { + rtas_st(rets, 0, -3); + return; + } + + membuf = cpu_physical_memory_map(buffer, &len, 0); + if (nvram->drive) { + alen = bdrv_pwrite(nvram->drive, offset, membuf, len); + } else { + assert(nvram->buf); + + memcpy(nvram->buf + offset, membuf, len); + alen = len; + } + cpu_physical_memory_unmap(membuf, len, 0, len); + + rtas_st(rets, 0, (alen < len) ? -1 : 0); + rtas_st(rets, 1, (alen < 0) ? 0 : alen); +} + +static int spapr_nvram_init(VIOsPAPRDevice *dev) +{ + sPAPRNVRAM *nvram = (sPAPRNVRAM *)dev; + + if (nvram->drive) { + nvram->size = bdrv_getlength(nvram->drive); + } else { + nvram->size = DEFAULT_NVRAM_SIZE; + nvram->buf = g_malloc0(nvram->size); + } + + if ((nvram->size < MIN_NVRAM_SIZE) || (nvram->size > MAX_NVRAM_SIZE)) { + fprintf(stderr, "spapr-nvram must be between %d and %d bytes in size\n", + MIN_NVRAM_SIZE, MAX_NVRAM_SIZE); + return -1; + } + + spapr_rtas_register("nvram-fetch", rtas_nvram_fetch); + spapr_rtas_register("nvram-store", rtas_nvram_store); + + return 0; +} + +static int spapr_nvram_devnode(VIOsPAPRDevice *dev, void *fdt, int node_off) +{ + sPAPRNVRAM *nvram = (sPAPRNVRAM *)dev; + + return fdt_setprop_cell(fdt, node_off, "#bytes", nvram->size); +} + +static Property spapr_nvram_properties[] = { + DEFINE_SPAPR_PROPERTIES(sPAPRNVRAM, sdev), + DEFINE_PROP_DRIVE("drive", sPAPRNVRAM, drive), + DEFINE_PROP_END_OF_LIST(), +}; + +static void spapr_nvram_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + VIOsPAPRDeviceClass *k = VIO_SPAPR_DEVICE_CLASS(klass); + + k->init = spapr_nvram_init; + k->devnode = spapr_nvram_devnode; + k->dt_name = "nvram"; + k->dt_type = "nvram"; + k->dt_compatible = "qemu,spapr-nvram"; + dc->props = spapr_nvram_properties; +} + +static const TypeInfo spapr_nvram_type_info = { + .name = "spapr-nvram", + .parent = TYPE_VIO_SPAPR_DEVICE, + .instance_size = sizeof(sPAPRNVRAM), + .class_init = spapr_nvram_class_init, +}; + +static void spapr_nvram_register_types(void) +{ + type_register_static(&spapr_nvram_type_info); +} + +type_init(spapr_nvram_register_types) diff --git a/qemu-config.c b/qemu-config.c index aa78fb9ea7..de10051654 100644 --- a/qemu-config.c +++ b/qemu-config.c @@ -579,6 +579,10 @@ static QemuOptsList qemu_machine_opts = { .name = "usb", .type = QEMU_OPT_BOOL, .help = "Set on/off to enable/disable usb", + }, { + .name = "nvram", + .type = QEMU_OPT_STRING, + .help = "Drive backing persistent NVRAM", }, { /* End of list */ } }, From 4fd50339c0b55fa6387fa3c28f755c306997064c Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 12 Nov 2012 16:46:58 +0000 Subject: [PATCH 08/40] pseries: Update SLOF for NVRAM support Now that we have implemented PAPR compatible NVRAM interfaces in qemu, this updates the SLOF firmware to actually initialize and use the NVRAM as a PAPR guest firmware is expected to do. This SLOF update also includes an ugly but useful workaround for a bug in the SLES11 installer which caused it to fail under KVM. Signed-off-by: David Gibson Signed-off-by: Alexander Graf --- pc-bios/README | 2 +- pc-bios/slof.bin | Bin 878640 -> 880832 bytes roms/SLOF | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pc-bios/README b/pc-bios/README index 303713099e..eff3de7615 100644 --- a/pc-bios/README +++ b/pc-bios/README @@ -17,7 +17,7 @@ - SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware implementation for certain IBM POWER hardware. The sources are at https://github.com/dgibson/SLOF, and the image currently in qemu is - built from git tag qemu-slof-20120731. + built from git tag qemu-slof-20121018. - sgabios (the Serial Graphics Adapter option ROM) provides a means for legacy x86 software to communicate with an attached serial console as diff --git a/pc-bios/slof.bin b/pc-bios/slof.bin index 84ba6b83f3c7fe523cb0b0e73ae8522872d1feef..3410f4fff40ff4a93d8963bf63fd6c1439f8b19c 100644 GIT binary patch delta 287951 zcmdmR!SujG(+Orw1qUWtn6L;)h>1)r5MkN4ZBF;}1u48@lk0gMxDMT50E0s-Holl) zFJO?EVrYZN=>JvmR|#d0#pr{`hD>KhnjiHl{Fkp z%YHZhe^65+T>|M+)>2Lpd9 z$a1hf^_sN;77PpwARqtWWMHsJR*mpr5a0zV0EyK<`CVa=tlD6)kYR!M|6fZ%;x#GK zl@3jeH(n|-tgv77|G)KK)g8Y(893?}zpenQU&zql{r?x(hx&^d7#!y@yaAiFBZI*70u>Gki5HCw9To|U3=Inzrg$*$f>X-NM1~2IIecvDLGA(>Z2|Y+ zPg#(ALH=`W`gaE;Z;`Az!GnP>6eJGwuVdrCGa$JijSL4Yl2t!=Fz`(U$-ii1IN<&N z-v*GJMY5`f2LoR%NZkAX-z!itkXf7%v47k$;IsltRxFeE`RX!0oczW&n6YBAgP%HQ zfd>Oa$P0Ofipd3j@{ScXoXiy+oD2*V3~UN7?HMX8H5nLx+A~ztFf&(p|Nk%AAkR=> zz`(#bL7t(Y(Vn58L7w44eJ6v1WN0mmbA|W+uLnVHwNPYa00rsGgZ~R^IGC5ceE7fO z732Sg$pQWn^`N8=PUes#4^HMb4E3%F3_fn4q~4g!z+nC0|9?=PuJ2}GaG1vs)4|NZ zYW?81gszY|7*eh|6d3Li=B1@1Eb?y29t%!3_{iq{{OMy{{IF^ zT&9DWfknT8fw4xOy?%@1JO&MrL5}knd@K|h8bB@u<)hai2XQbjd;ReL50E24dCY@> z37q+1>VDKQFo4v8d<9aEs+NTawbSRZaB$Z%F))C`!14cunp?)GVUYO$Mx!zVL(OmN z3UE;{N4cWDlYs$T6de5j!Fs{}|DbTH*{5CcL-BuNO}%slJd73~g^@CYfc1j^e=RuC z!bq7x$ijNT|34O-I08wQ9TY|u&@k$-P-IvD4x`1dE2ig^Fe+GhFfd1g;4QHj|Id3|Bmw* zBrFse3P8yeHh^#YO>7!{{~5H zPp2{ii+(2qqvJdV9sN!QCJTpo|5tc0uxNr@4Ynjf8l1_HE%IPse2XqW-C!xZOnq$w zgPNWy0|UtUy2~Ju+`O1U=GVjjJ8G^QSNvxDf1rNxE0N!zgfc@JoFJ?n7#KkHg>?f1 z11ur@R{Vbgln{O={=YG?k%8lf;(tdE1_p%%@(eoGa~K%w8y+w$kY~`UpToYTelL@V z;~a(?4YCaN44_=$Fz^2z{av7Pol&5#!{?BOG%OFrQ|C9(wp9cebA;`-OwG0BFjMT7~L8NA} zMnJ_<28EhxDG?6_wz~-oSquyfvJ7Ai`k43vN(ATQJmWcvsYLvu~-@3=(me`~QJO0s{jmy)|So@c1<_ zOl}Sm#2WFh7c(eOG2$&i!3PZ@Go*-rfD!SpYZ)XQ<}vWRj%5(22L(#?A(7X%3>=_{ zL{9)O<}zsDNB|QW_A;m-5&)|$C;_~vWl#VmfERliG!O|O50nB}R)Q7CGH8G-LP`K0 zj_dxr5Rm{Z(0%7H=f8%9BEx|f^$ZfAhzBKtnkp%g=?)6e$j?BI=$Fh43JV@HSYU~0 zGfE=*MFxY!2W4A( zrvLvz<-K(RBzxD)QLX@GZ|j>37U1k(FI@qu1FXKQSwOS5%mR4^8|!KYM(cYF4)qN; z80xFpw>ZvWy3!!`|BQYELp_Vby#Egx?f!phj{EKAx8IL!T@QTKRvg$D!ENsuMp|NqaitPt&}=n_w<^$uE9n-wKeo5{S)uYpD3 z|Ns9b3=E78AR2@j7#Jn$85kH%7#JAAk|04SZutNIKM0pV`Lv?z!3HxhF!C@kFou9E zV_;zP0MSs4>SXU4HgR-R!rUyFT&!%!0>ijF{45b zs4)rZ|A7h&P=RCpQY8aaSb*9IHFeUUhGOCC{R~VV3=H7DV*QcN6*Z~S6`)p`_y3Pa zL8%+m;{vIDQP03+(W2I2v4DZe`~OF9A#I_^FacDc)*oiyGCiPyQC5$cfuVz$fx%LN z0n~;7^$BHqm?7a%tI57azX8;82NgOD3bo4Klk0;-Lu!_3SAZM@a$rpZq;#ucWv=+4 z_|Fm4c(G_;bg)QdDDYrl$^<#cqLHBh=Ai1M3<}==KYRs?D>5E{IOcQ3^auMmC1K5J zPzYFRs!ag-9At?F>;J!?ZUD$q?FI&3Q0Tn$WMHV-r(N+flYs+dDX7S;nX3#6p+r!r z_tTM~;AbL3h2va?kou(x4i0k}3P9#|X4Z1(cY_*93_D&XGcZ^>FzC+UtmT;L&A=e_ zQkj7PlmdQ&=tPEs+UytWEEpIVXJ$@6*T*O~y+nmWq`tmIds6+KkC#BLW$*w0buAMa z3SQbXFo4>$AjP2OY5l$z0U*sYGZ`Q~D0@)zmU$V-@Yjw1AN;guV0gXo{|n^42gq{o z|Nm2KV(i`r_Bfcn)Z7#!v> z=;${vs5;JLm@or0oU)XG5v1^?B4YtaEhrd%Dl!&0%=>=J$e zIFD6Dzk#6?N>@PX2q;|urIVp_F_cz?(*BO~Sbg*x81g{{q~kos33Ip^>KSXfoGY+d z>M-yB1j{T2rq{<97;3ZGx6~#^iC8c&q|`DxiOk?&D6o9Sz%iSfp`bI7p-{h@!N74I zV}X7*gPv6bgM#%!hC;`Aj0yUy85nAxRaZF9W6ZI7z`$btfPuk^fq~KL0E2>+0)s*A zy?Ss9+QNeS|Ai0+Hc%g)({V0?gaso*L9N0sk(rqc64w727_0v?D0J2`Fk0_rU<4WJ zIFHG}g8To*5KcBb?M?wI5$*s628JIXIgt8#5Ceok z4zOTg$VU%yT*2)y@868hM1~@(1_lG`g$zZYPyq$C!@PfUEOvnk?Y|6`iVOwyFMo;5 z26cxT7#P6$I+3BngMm2~l&>r58R`}44}Y%k{{OQVBv3zJ0#w#n)Fl51s7Pi|bZlbK zu}J>^AC%H7k{J{%k{K9lGMSgnI?2EQ5`(3DCx-tYKymBAz@Sni_hTI>%0Tj~r}L{WRS19>e?4qSTZm$fI|Z8^Pd+%zOHkbTmgzl@Bcq~L5>3D2=D)YzMxpz z{I~+7&td@sqs0LRE@%icfT9`X5SYH%CmHI&@dyh#@Be?+z+4A*7&IH!Uz%V6j+O%q z0w4!sahxfV;{?3_fBy)x#QXoB2;64YGe}q*VBo-R=#Pg;hH`lS|2`MVP?pYG1}3Wq z;4*>9`~UARP(FwCUQp`){ltQSA=CT+pB)wq45i-x|7-xI3-AAbR#-4FM0o%Iv%rFZ zp}@QT|DPEa3=GNM|Nl&|U|=Zr{{N=~lm$V>GN{x8rCv}L1eJc^QcshC5mf4d%6mw< z`3W+}-~0cc0C?Ri#K54V!oUEkz#N+x6|`F!RDP;3Fn}sJhrJ8}pkV-T&QW1tm>iKM zSikT83;k{eUdLVkA2=@if5&m&{~MrYW384qXi#qssB{HIx#K*B2cT>YG6&ooO<-W~ zU|`UxVPH3@Z_ofYK78gdDAXitUIN+InaRKaQeTrGCE_@bp#xmVacwWK&BY*D4>G`E@Baf9-2eAOOJPY1?*A(-v;UuT*!h2n?_36j+606pj&uGm0C_^c zl|jH^-+xfCZ(y;2LBL_&|CA0+21fk`h6;y$3=S5Y3`{>*7#KP;8JIw0(cb_6yMXk8 z0>q;6{|AsGEfN?^864*R`v8)FX?C2)z+;)fVBr1#zk;PE0~1JLXBH@0|IdJiGQ;FE z*(%cy%;eynygQqR6(kxkU0@c66vqKjL0G5k+1EyjVCNIbrXPh#rK%B7wERt3Lq9*@8 zb#T(@1EYxQAuzdt*KhLN!`z!E9I>ON+;J{$Pz{udh zz|X)l-GYTto$~@%RofB6=?mwxi%o9et=j&Bg;9@*Yg$E(6!WqdPSYB;8?ZATV4Mt{ zwVdw5$tW}3Ac9e1dIKjTivXx!2I`4`dT|~M=2JnPH4{*^3X;%nW?%%hMnMW{_Coqb zpbQRanf@v(}WT_P#^tqcqfd;dSMKKlQE^*sg!>nH#J*B|*L;=#Zm;=y1p z2(HNYe*pEy40`Gr81`7 zKhqf)etNS?R4@4d*s+O0##V`;)zULj{Ju8lkg4#L)UWo`J#k5JRgS69cQA5(BH9 z6GN+A5(BGU69X%#hXT@P2aZ6ZX^mDdcrN%D6v1#uXeMe*|G>p4!vmU< zfX|YF`UX%>D1gke%w`n;c?RMZh6Nx`{mg{8+57*03Cp@fko!2Ss~I?6YBMlc@FhuD zdNOc;-1*a+f#C-y0|(3v7-|I=v8k;Gk7;2j77WCu7`s}bV&c^bqdTG=kBdcwh&NdD z5z%U2FmVgOL#-Z5uvt2B3%vf#01xIDTnrp=4cOF&B}#yz1E%K%7Xt%c_2ETu_4S~* z#HYbliGdXqJ(iwMa81PP5hSFi9-d&p2~jgq;bkTR!|!Yc4$Eu?j-Qzf4A%7w9IyXF z5*aLUfz{R}YFK(EDp<%f2!MS5l8b@C;w1ye?+gYGOAZE(pIi(Kuj?5&e!PYxOi;!G zB~+Lh5Hsr;7*GWed`r7TjTiC^93Th%;6^wI7R<9Xf#GF+CIbU#m=ZLOiOXQ? z{}4y~eofdB#HxKE4M|`1_0>!wSS|jSs9|Z%zyVVDGM|Crr8fhE{wmNI3y7R&F)+N~U|_K1`2PcBk;Q9B+=49n@rr=~6skWt5eXZdd*Tu`EHx7q>Oq=8hQKt! z4T@)A0OfO>27t1kW}*T}A4nZ&xDym|_{tJcDBC(QuvmIMgp~{R;8G4$(bRe|1b|#z z>m^t6gPVcjrzcX;Y?r73(rCf;Py!Spa7(ix!Ec%U|9@q+yb3HQ!9xmELxUXZnWz9N z$SgROBwl(kFn}Cd!w?Yg`gc78M-78q2`HXHmK!iIFv1cC$X76fK*4SEh=JACiJ{ek zT?y3@+zbq$++gXIs9?$Q|3Ao_N)CAyP-?H?U=jf}36RYJM_+cL0w|ha+GaB_fD;9@ zyay$q+Jp#jNW9<%mt61y3gig5&oecsrmoIPi+PU^hk!s1CqHNkoc@eL?{k}J2*ir5+Mf9;6h|v zl!!nwcmc#Jqau(!+3XWq+8yFc1erho=%;aWZ=wM_hoWae& zh&9cC^B|-&0WE=>!N^bo8eN#d$WYqB$-p#&k)f=ElYw~#BSU!uBLlcptM_DvHhJX| zHEJ}uE8vdtfI5cj{|``^Z0Ys?Lj}8=(iBdHlAj(73^QIcFn|r`W?%#x&dtCCHk_M* z8L#8KAsM`W6}W~{3t^bPNsLhnU!n0xj8Vx6tC`R=2P!0L82*)^WD?|B5gahn?Zg?? z@MboUIR*^>|JN`u3ZR%Jm#6`*q%so~UV_2}S~$J{g^e~OoIrgI3r+@s7q1u?Kw$-{ zGJd>d5CDZ0-0g9R^^iu)Zw3xi-W=Ed>gmA1@%yu9wjE+KZPA47Kh-B0oJL>CSPE(gJW<^z#3YT8DrD zi|3%=vTr0w(3^n))a5u-28%h$l@QQY4$Rmf#GF51B0bDIPupr z{8VRPu;l*#!D99Q7caH{|MB7 zS_Xy-HSEk4HJnT$HOHJpY8jkFYL?YoiPUOXiM(L_|HI@tsNwhjheOl7m|35(NiU+PwY8b35US|IPP*Km?{KQi8|BG6; z=!%~j3=A+|)+}JIsPzo4aGWQb0`aY^0?4b9GKaYg zJab+%fEPMojh=sr8ZY%37(fZqg7g26AN&wU)q@Or$@%|>#moOMK!PAw{dmv7;4oKi zM+c~2JHfzE-(~>{UeJ8F3dpirZifIT2e}zNuNfF?JtEfCw+A>l&Q*wTnDhS)$PCbe z%O9NoKVWr8U7`kP`~xJHko=*Z5tOZ9sUPGrP&NXU7#5uWKfLJt{{zIXX|S$%vGV^1 zP)LDtOAUi|MFj(Ug8l+fdXPV%zW|gT=++m)~9E$@C%oWdH90JXtxG*p%!J^R; zmI(bp{W}H*3$FVAKS0AOU{`bf|6uXz|BIJgkl=a2_5TAXBI2=kk4N7Lo9gh!N6eY@&Ct9e+CB7^2*m4|9?2nlMndq z$TY#a`u~56dIkoDo@xfh3I_fqKNy)d{8VIG@iUQWfd@k_cuMZYL#7EY7@0PhvV*4K zm{!yoA-RJD$v z!7L=TkWQvW0>d9ruz}M7sQCQPz+fTu|Hq44kY=`p)c+4Jc7d`d14F~C|6e>948Xe$ zepLPcQ2VPI5e0UM8laW?Ftb1f5~z>@d9tCKfd%3*1MsR;NVL_nfP1cR4N%uw@c;ku zq90;;L;n9i9t;L|AudPs^*~KNiv$LEH|sS~4%Y`SUx7Ou;tCc8Sjq&204Se=Tn(yZ zEHnTA0QKWRDH}8`0&3WTvKFXU0}{upKNB>{n*ko>1(^xz%KZS18S*2dsvb0W3-Y~1 zCZhyss|0A_2gve-r48UtrUye7C&=e;i|Qc#J&+!-W3@rq2z~4hwSQ=lz`zJs4-H{Z z=z1{d*PjI$j+7w4(Sf1?++ty10L9^pZb+1X5^Bfl|NkNJsSi#Ia0i0Z00R>a3&Atr z2>YP%Z;^nc0f&VPR>N|JJ~+jrS;&IjLcO;*JP1)=4;rtDp)B}eSnuQ!V zECesTNB9tuz%3FO5bBZat49vf7poyz%!5G>98Aa-!Yo5c<-efO0m`1YAbKsN{=ay! z3(`2Tkoy1N#jO7?K%RI}_5XnfgC2O^|3}sT2heN_ZE<5MTpIEjSUec?!1EdCzJWRB zB{VTXvnw0eqWu3q5c*KFE2h5s|36-=X8>!o;Q#;OML#5tU*!M);K5)34)!1U|36?0 z3FN}%MK&ZPJQ$1?g5sNK_4N$Kthh9w1a%d}0&q!)C8$Bc>;X0FN7erq(BOp(%Oiy@ zikY_<*y=$+1~wF0yn^Fz79{>&RQ-S9!C($v1O{5!1YYDnkAVYRzf0k^1bfI>VC0(D zzZoEdOla{4nyp{}N5^_dqJl(+1$g@hq3C##&A88KAo3MK(h{xRc<)Aj=5S2&$!C zFfvqtf*ZufR%3x`O3-3Vu%Qc~hO!^70673;C_E}bE!>k8GhSqa$^%*O5>}9zsOE!a zA<(KsP`wT^9Ap?QVL}Qc53uhD6-E%Xo*O|PBB-_=T*~>9V6a~&hQZKQE!e^OkObY3 z$-vUl`TxHMgU3ve`WO5R4B)OFQr!;hm zkZ=_g4G{7F|3RLqRrRi@sBd9V@L=!*Hwr=^iMU50QXx;`sw+xC;iw6umAWwkQfqW103@DVqJ*$%pY~YR#=l>5iFPWFUTnAdW>*T;7QQz&r;JD}in;K52 z7{mV$ARmEz=D`pEt~p;YGIhLkWNH94UO|p=n8%+3&eGuE2RGjklZ+tOgIo@BF-S4o z)tL+oV28l^gCNbE|6jaV`TrY8+=C$qyiy#b2UJ19EO3~|w*XvGAFhB!$4D>AJBB_7m-69;ZkfD8pE9?&ousDc570yiYcK_wi>Fb{?> za1~pVAYJL$#MkoLpMl|r6a$Ba6oUXnJ_fw{0~As}su%=7Ayxm{k!b=*53D{DRp#kI>g#`@% zYciQcK)Jz#Ar>5ZppL4gB4d36D99|c{{MKv1u@hz>;DI^!CjD^4a=qQ7RLl`(fA>r7>bAXu80GAJ$|9`ypgg6`& zx0s<33vTgRIx;k%L~RzROo%y|0P6pPUA&N?!4fni*3G~G3Q9}u{~ti{3SxUOghTc> z=`%2Z918NiV-xoe%S^}|uVupj|DaM0R30EFN>GACjyiA|(210rKogfBAA2zPy#%Fb z%#h$-gDoWB2IoU68?eK<5v3$J`f!$#G2nv;pwU>r0TfTD@fZz0QvsAfKnajg+VEhA z-V1U(C{!##`~4e0dtMp-*JQ&ITr_yQ3oMjD_9400lQBG{V6r5MYJ| zR}J3KfaVZv!3;6irxD~(6m#qO85kU!IKN;RjMQdFXOrL)XrQ4+@b@wh1|5k29!S>w{{uAC z2G@vXLJU-ZfQRPSmz?C9+~dYLSB-+{d5(PM1*+G0%g? ztQrA40RZnBFmQm+-BD^P|Z`wlU$O_L`E|xi-VQ`f}&ZH33pVW zg>H?!6A5b3LJv7K>d_76ae78<6xZ;gsYQ-r}X_j1!3kQHSzEo zEJ&omLNJ4gba1^8kp>HsXs|GG=GNB;c#{~!@VLVmKZ4ao;HVQM%G`R$3S3a45X56J za%u+E6Viu~>j~nk36NglL$JiR%&!4D#0yVQC>Al~fDR9;VPIbaqLC^lR11+48MHKf zkq_F@d>-7bL+<8-mXU*o5J3G@u$`bG9;9Kn51>hn7qkBVcu@rzW%K@j{wI7s0LyF( zlHM0!y}SPZcrok$2hivos5tiie|{&%kY5~RwiVR;lK@R{fvR9o!vqw6pan6Y*|q6C zCX5b<+5y>*$QenDnY7d+hFZp&YW@FF!NGp4hQYbQlKcM;#|8!+(5e9aRsVlfYQ3mG z1e%d|*u%hK>A=8f>h=Hs4-N)SOHJ@R>=#qd|9>jj85AtJ|NjAN)cpTLf93x_m7X7( zKznGw`V<%#O*Q}jpYj5fQNUEQ{{R0i+zd<(O^^k8pa27f6|5;!t7#?T{r`RmXx;=SW&s{KK-7Jp zqpQ$o8j;n5+T|cVxQ<5}e*uZXgCER+#eOD(#1Bpe@F8BHwRWJs)(=hwct^j!+6n8z zP|!5E!yE?Cv?v2?1{<{O%~JFKf5&|n6igWY|L=Lhz&Ph610y(;qJk^xLG$Asb__!B&H20BG6NAIE*?-k31_|I_kM;QAM! z>HlY``Tw8ezH@6#82PXMx252BwPVADYl}gT(;`#){`ZoY2L8@H2p0hm4>pO>kjZ zjka8wiGjs}gHgi!|3e;-t1S-v|Nr9@V(#5>-`N0b_y7N`GeAR~3_PF|?%2do(o+T6 zZHhdd?gtqf$&#)BO}GDaWSZf@;HR0ukifw3(vfKfsP|ak9KZnT9fIc99q0Yu0q%h^ zFff4T(LrS<@?<}>zXo5|2U3G958gBcI;Bl$^DmcUjN9+nFlw;WgLcb+_MO+vgY3As zq2HNjpyRx9>3Zhb^a(5+@M9T3yY5F%Ics@b0XiQIbWYmnDQEv*G!Ktc&YZw)K-{OC zIXRA=at0b4W)OfKZ#T?NIdcFH(c?Mg%mF;)`9gMNoN@*l{&zgTWp=l>jskf{Gpd*YXJA{Z%KO4=+zCFR0(S>ok zz++Aen+9eE4zR20r9sCOLC(3D$BN0pK?0;Yq~VZVNVAJxO)_%@$U4}`y3ocn0|O%i1BPu3pe5i8 zJs|xr789^d=Lx4wy$u8Zf6zp60>l6R6%5T!5*R*!4j4889W_|d$)XUdaLBHrrG+U} z(?zdVler?K`;c8oi;G^UW`kT!Lv%$AgLg#*Ln;U8tS)RW1UK>*{(k}51`pZ}4{Pv) z!sv(Mf7L?o|Nk{Xr`Ldv9s}*R_x}H{6Sn)lB3bQ8O}&%|cn5wsGi3KYXmdRd(?EvR zq8X+NGtBxw|Nn|)@f6T$VKp4g%RmNKB(pr3oDd_*$UMF8DW^31QU)Q=_{H=MPdP=V zUwFzXB7-Bo1i1V^aVdh)X34R3%Hr zF$RdrdXSl*5CWxb(4he!KZ8Qf0d!JxD+AN(!wd}8_ZUDYnM63uWzf)X1ugkzIHBJP zK7BIBBH{mkkUx=6MbmF(V1yohU;}br&AwkEpylA8*tbYv`0udq|AmTXHU;nh{~b?Q zBrt#!F`+8@|Gy%cMZsa;{}mO@EFgsopz2tV)q&1qo_-*RQKa6Yfq|uFpB9oeAQKoA z9Of}_R5XJQXL$`ed)o(_DIhO^=Ik8y{nr7h_5S}~1)lVglfqrdY0;qIfdv~V$Qja%T21;0tq@BcfNnGB*9Z2$jTKV=Z9U|>+FSsEn*IwGoO zDU(ReevN>d70k=5kNp1+bsi(Alz@jA1H*sN$xdLeG_Wbmkz-&4rFBrB8k|EEVcFbdW)K-~|D25>ajLr!Z06<^-}|3cQKJ^o!`(ZIm${r_(ws0afU zSD@m^`~P3?nkNMR_fL>K=)k-U%nab^r47ssOco6c>>xGX|Nnv~aG^z)0BAKa1Gwn2 zoy*CtV$s0Rfa!!k;Pu@Q?SCStPY7pJneH%`leHdn68{`Xc?)t3C|!a&|DeDJAEXB= zkN0a=fR4AYSirymI-(AIu%6=o6QEA-@5KK%eklGo1Z{ou{{IJD&eqz$5&@kU1wLSM z4wC@rOe~Pu-v57sm#Kl+6;%x2v$^WM|Nl}2`?i6Bp{7#00;Cvp4i;Rj0w(qwyijj} z1Ot=JBZfB6d3Yfl95#!7GceV1Fp1P^T%Klgpn+k+@x=y~?u!j96BrnOzhdB+n8m;n zzSu*jR`cSu`UjV%)oMBf)M~JAu~^B#SjnbV|HR@Y15<6Jp;oP>k%*-OgTTg22A+wY z3>-DBm#5VnzdWs`<>IxPV;8U0EYS$4Si+!C(W>@jLni}YZKRe+{Y*_QO9ckz30Vvr z8?_jC>f^wgcrX}&t$`^6?PdX;EUhzrfe#~#ghf(Ah6jTY zc##XHk_pTlJS?DGGyOsgqe(sJ6iRSf1l8z@{~bZz@&5lET$6*?71az1^~$F!y#Id( zuN?r1)qo-#EcOGDFsh_0AnJaUg50@4ih*g-VFo799TFj&95yuzZchVk`KtB2J+0R3 z=CxWcj{r+8hD^qqmmmT5EtMW>PiiZiMCyMyYE3@Pz+nj*ySmQ6u#uaAr{?+1YxSu& zuhpu11XQXsC{(;qd$Qp*17EF$lSuszM=emqO*qNGfgE|Y*3dY!@)FtT$-pxGLoA~d z?+@@wjD;}_O!ZwGri;fh8e}qAX8!+Q-w*(bi5L1SLC0i)PiyyStYu(mG-qI_Okhz6 z;W}hjnccz^!r-D;!w_5%nsvx7G}}clgrPyMHaobYh9MesKE4C!q{$iv_AQQc8C)is zgUkXStqDFUbUNt7*m~$WRC}Q1Dq{l|=yDE*Hc)nMKDpQd6gB$u7#KiDf`Te<@CnQd z|Gxldc~Dm03qB*W5L9RTUI)GvDtI_$U=6vLpA za8NxDYK4FjEBNXP(1Ey|&d{?zv6pk-z>8%dwtNF+HE{6>Dk^Q27}`MXnF*YW9i~|` zicSZWmZ1G1ZJ-nCL4g6X6BIBtd$hp^iGogt1qB?qynFcnM`Pw<2awx9WuB!{!vV-C z^#3OQU}TtKy^vwX4@QO!)(;tWfbQ-1(a2B$3X30%3@d&rGAsa1J^Wx~X!ya%&|$&A zz%((DVa7y7hWZT?7#S*lFJzeD{r?-dRtQOBvD0p2sCSslz+rKKp&k@CAcxc(W8VTQ z5xoCHLw@n=ir)_zKnL@KcSO|GgI2{cM1UMRAG8BaDZ3K zSST_UfC9DtG28D7&;jDp3rZLz>T4Ss6+q{dL6ovy1!)CUXdt5z-~kUF=qWSQgAH+*#3=D%Aw!4t0R{%pF>wz27-T#c7^XPRVw3@i*WZ&8sbBg5 zbdY01%|4BQnmM0D>W_V{02v5bfX4$~#twE=wRDBPG6RFdoc~9_o=Ix-s80c1;GhF8 z;_B;fSLj)T7l4{1Fr+bnQ=&yu!wU}v9q_VZ@BjaHKs8E00#pZFPJtZP(8vHjTiAnv z4ZK_g5y))do`u7ve?9PkzR$h|6waV@2@dNVSXhHh2bpY<)X3n$pab3x;{E@h0Z7~; zsnGx==fR*2ZV-TM_5T0A0(2Iop9E-1;(rb_qcbhsAmxHV9*3x0yUJ+-H!0Z2n}pqurpuV3F|uv*TQb3!oae zW-0rYiq#AX^$igY7773VIL=|%QJKx6@S>hUk|Q($Qcl)pGgpLWH^@y)VPLR$$WSnS z!F6_-=?W{@S?Vnk{{M8C$58Mxo5F#wdkUO)U_{{z%a1Z65nm@=FIrBe?E4e$n}m-Y;x zO=-s$a5Au4bTV*;a60IL98#;mTmhQO)ox%o<~Wyu19XBkM4vi%n*}s+B!D&@cra*! zm-1R9{Qv9y|9=NGL4dDis^O@I+_eOXa8Sz*)XM^uXdnYXF=u_KvEYZ||3dHoe>Z|6 z+4|+;3{as7DrjDU&TZyoV3`P7pbT2;%fOH_gOh=!L6(8x^?U|~3QiV>F(u7=Orva-1qSwSg=F^*}-r z9P~nx582f)OIK{DVPLoJWMKL|pMe475Dx}b@N#Q#HxP87ck|;44+eGcZW)k6plZNP z%NiLe5s>+yqRRXKU*CFY*;NDbU1Kch2U%Cj%t93gZcxZgkY!-7NNQ{V^`t{pUG!>}GFMo%Fz`Z( zA60PFg8E>N^B8yyK$RFMF+j4u3WtP2twS)VkF*4I+mHAE|BwUtKL%{7c08KZ9`ne9+16 zj4j^(fA0l(92TvhejF&oEl{I1101b#3=*Kw1V!tMItC6<)K1>Rzz&Vxdc9grEb$AE zUPcBB83t}d^eTgQNq{T^Mepl61`f0+=7vXcGN?dShD347ZOEDJ;3!rFM={7TukFDn z`YA)=xJtSL0-I|0lo+?C|FbP_%+> z3z8A={{L$ONGV7JR7y=v;Lx4^cQz+?J*dAAibzl{`;o{{;QjySOHh=6ic-*YarFZh z@VR5v|67oV5k6{vM`gIfd$kwgf$C6i(A599kP3o$WRdeAJROm{~ugY zBmcVsbgJXz*9^=XxEUBhNzQ_sf&KNv|Eb`!oeyWEAjsfkcWOP{J#R!w1=HJ4m$Tx zqW%Zy0=IcgJG}q@_zLo(wddjtP?O4%fg$gu6$3-{D;5QiH!U+6SU~q6{H$VNs6Nf2 zFq4ykrTShAQ>e!wyU?^lb|AH(UM_l|EV+S`fxFh-xgz|0 z7xKJ8uKtB{Mg8gMicqhHdbyex&K0#@(G?Rp8JI0I8F(jpGO$}bU}V_vl7X=oX4Ep*CpaHx8Z|dtm1XR~DDAX-p z4ZdNnekrJNs{rmdK?{c|*20TDK)!uh!648e0y>D?Bfv77fvGn8l}LRzI1gX2p2@%% z-YsAi-lbqxn;j5PoBc?{GMj-DBws%b)E8h}Qw{1v)N?~Ck8I`&(9yITLFKj-0|Tf9 z4QfR|9H0o^Nc2LAfkA%`gFt=4Es@_gFznd35$gP-yG&KoUmtNXak+~&R{LE*yE)IgFs#L;)-7%85lNj zGVpu<{~ifi*YD88u;8TygTw+(2KEq6Xhp&8T~Xh?0el3z<2*(a3-15_^&9^G2i=|G zIFBKrLx_Q)&T}$oC{7CKd5i_Z$-5Nivp-F2Q?&M^*JbrKy^Au z4=9wp|NmQ3fBkcX1%m*C_y2!0UIl_1bT;t($qybJtzQPNw?VfzFfs^$ss>PI1Qq_E z66N(_1_|%~UqeCJ4OF6lvRm;IhImj(0jd@!$TP55dNZ(0;06yP6@W^W8Qcsk4e|^O zAT%d%L$<4q%ft!KZ(t(j-qc;O1 z=uo#A-3;s?L%`>IgYPx@Y732L2dINQUTQK(G;lJAfNB*`jRLj^Jn)RDOh63 z>H#?zRD6L-Ebt)P^w0)IiF)Yh8mQw{a~nE32pzZr2M_dQSx~JB3ZB=G86-gW#(Dq$ zqS**;#{BNEy$0bFr{MIn^skevlL1It9nQJ0{uV+km@ z>Z`LElt3Nz#yAEBa7UfhMX%ym3sVUDA-hlx7rjac7KM<*hwN%Olq+hMTUUfuyXb|c z955vf&lMHV85C-c zTUUV2RjKI;2FKS#Zw6+I1B?tCPBSoqS|6YTeI{@-@LO;*2tyWDey)W!k7A%90&W^L zurRQr#FwfYsEvb&Fo?y`6`*!c{ag))n*HosKy4q#ISe+SBh4*Z7`QzcWFezGiVTpO z^&bDOm>duzQ*Zs?|5xw-|F6K)IV(7wF9RiQP(=xfKWOr9ge31zfl$|hYm*=H4B!Dp zP;kwVXW&3e-Zexd?|QWK4N2axqz$SyLCG5uJfA$F$+-jS0B~})%w*7dnGG7aVNj~f zW>5g-p~?&vg;2IbcA@T&_An@ofYJr18mr|nuBi30t^ieSA?%8f9t$WQLpeaBJI0{8 zOAd5kPAzvdD6dVQoy4d*{mDK~QE%uKindM+Z8hDHFpP0VCq0o|Wtk<>V0BG=-AT2|+Z+O+5j4+fb|&}qitNj6ZY%~E?Y__9k- zaRJIFjiBMqOz8?sumAt+7Y8^v?q%@#!N|~K!N9-_8lM0SSTtrYE&vS$PGDrH0iDJ_ zfsvslA^8I+k1$S5WGJy{WGI=y$j~uS5p#tKz%QGT4QElfCPdPLz|^0 zBoLrC5EV9NGH}djWHwpU zFff5exqc=xbbtb6q9Oz6dV&H_0D1qv2X2~z911GZYB-pu-`>S82yq0YyN)X+{y}5H zqtP1@@~{{Ik4G{xRDdmWWGDf}#>7O18fXl(fMQ@`B14Dw|9hOEWC1#f4k;D{K#nk9 z$}R?q3HwD1ZPt4s0ns1}ndk%!FMx(`KrsZ05yyE98K9W=U|{g^{{MF(D0V>QiTD41 zk{0ryn=3vrR4{|*fE>L4|Cg*uX5Si;tYB7?{7VFMIRwbuntJvv^$ijZpcr+S3#zpK zddgVHGcbahLJ-aWSHMCEWH@MUM;2D@L$e<^q>!U)10=fsL8Hr~F%uG9peO;QQ&9On zF_EFbf|23GPe+Ch%LE2yQ1pO94w7a;(bO6DZ1vqG3dIb!0>wvX5Rn*mBM_`47!r3O1i@P z|G&hV`&iWn$Bj_M?@Be?c zf-;;3gD5yzfUK^m{shisj&uLtsCT|x;r;&)FL>6xih&ViruY9pjUcD}{==XOa*Kd< z6zKXy_AMZHfrd2Ldhb z|Nl^P*dV~7fuSCB8*}3>nD`jMEL~a*BY5p74}n zf1r7Xlv0cZvlP1p?tnHhG8ACRKce8VV{E0!1W2;{15K7bB$Og7*h`U{;8AUOuyBBm z17?_he-}G1ICWYyFgSq1x}u&z0TkY#3u3Tn_DBcKYS2Cc$q02NW7$^n$|EEpI#CW1zP z8yPAlFf#N>#mGXfx=RYgkZ2ZjXg!9FVt=v;GfA82=z6j5)A}@eNpqAAAcOC`kMo zAYmK=a|Ec00Oiv9ZV3m+ISewLnG6!33)39tfi^Sz|38D1LE;4`g8-<$L#lVc)ep=J zkbaOl$mN*}|G$9w3{>2LBJqdfzrr7ljG%$Sf*%VRFMw_!-GK>JovBQ%)kH|+jE%9U}Ak3a&ZDE%&i|XT z@C-}+{ttqnn-N}EC^CY*3@RK@id|6C8oh!5&6R*F2k887%}(tKaI?Hh8gdKUY~>2j z@BwH-2{cRqy1^GVOaPiYhWTMc-mU(|w?{?fw7T)B5HIpk*x+VCmcY|M#agb?jRlCow$G-v{c_GL$%U zFgB~st8!J+Ox`xcN!$GQI_ zK)wd~7&I{oI+_4f=Yz^s(AYmHMg5+|z%adGBBMclZ4;wHZ6l)sY#spQ9Pj^M1M8b_ zfFh*?bT?zVNd}zr>h@B?x=+{r@o0Y*3bXI0BuLTfRzd0n+D^VAXA2*lI=w&0~e_3 z_eKmXgY5=Q%z$jQNdEr;Y-2L}7Ep`Sf&p|*4g-$`3xfd2wV<@?{r|tOg(3rZ!U<&7 zWP@N4aH$2ZKM_k0>Osj3R*!;~Xo0){ayqDmT651BG{aK>TKn*#k)Z-yORz97YA;}5 z1f2~DN!b5mL4zEi8U-}ASAPt2_1E{r7mN%QuNN{D)I(AQkM#itSq4y7-uwTLm7vn* z_kPGtgrKDL`#uB5bcIev#d_FiENFoPBZGhi)HaZ-K`sU5V_0JTq4+=0VJ^cQ`$G(E z*7p_{RLo&eXpm#zsDJ!O1T+?_yyyQ1Py{&4VORhP^Xk2zs{ECR_y5nT)zu6Npeh$s zwR`{nq6^XoO7jumCQ~y5xXI)==l>PZoz@m}{(k^X<=3=;u5|u;7UWfMCAt7Kc<}oz zC}==I2MQkV|Nl(A|9@W#YMX-Ua8RKHN{^skm<`AU-v8m(4KaeIk3bO$j?4t3|5K{xFep^tW>Bye`TwCt`jJTe3j#^yMXvM%$&u}21zVm>C?3dev=${83zSMoZ}{r{r+FM~qe-$x?# z61zk|!(eqwR)fkBM(_WBeCwwlV5s}fzNKD*eT%~!28Et^42)He85FF(GcbDp|9BH7 z4_?*9z`!s=ib2AIp`Jkk%^+5gCH2)W0ziu*>QmUaSkL+Y$@~BB)aqsih3Y4um0X{5 ztrvg{{Tk~1|6c<**MjC4Kt%=z(=u3X1d1+DoP#nZD9Y>~WF~>~Tk`*09Z=@?{{LIh zrk=q$VDdxI3XxEQ3I_ILDGWLJ2@L5BpyMlkFfx=_ECkPW2U;AE|KR=qbE6G|bHM9^ z3=Ihkp@txRD0&t$fSU0o77Yx676;frfXwjz|JnETLxu*>h?V#MZ7kjA*l0W zk<@rX!~6daaFZ3J*rI`e3Wnxgm0heF$OpvR{pZPa>ck>;3;dcsK)8YJw`- z`g`nK9QS}`Ul<~4qz0wuod)e&t=Q1$VGkkzl(DVLZ zu~1~-gjBeXe^-FkHAwM6Zl1M%@c%!^?;tS=@LC60A!MzKNj?RQOoWS-b$` zY|yQ)U}x8{ZvjVR0|RJDc_FA-4yr^w7&yT5Fx7`aSIfQwFQ5YT2S7*YfV=?8Y5MaS z{yR1?SXkOKFgngl<)}DP!g7^Qo;2B_$29QQ%O%99xU+`dH2la&+K;_Iv1LQK0P1ZGx4Au?|3?OfK|9=afPzSjj z1{Wh(V{JXCe0>9Mlj73su;~AZ*`ACH9t>>Y z<#?cl1&APE^F$5;(9E&pECwEs1HJ$M2Y07oi5Apt0(HrYOBf|1I%F6@3yeW`%-K55 zV{mYs#b9Io|Nno`Rg<8qyFUANMg2?WWuQB1q3gXQdO&xpYBDf_RtM=fFxWcG`~Suw z6FdzB9(t>(mJ*qMXEnPfI~!!EZTbNg4v~6LG6o0uKJ5x{8iK6RO056;OT_#CpIFcW zJ5UsPFtC8rQ2p;80U$k~wB^CT0-i3bU;Ii0bRl8=+#jG>`~Qw}879=%-UhEw@L*t& zshJ14Ewe_JeGAA7-v8f#yHxduKj&6>Ft98I1rq2|%KGLX4xmC6bX%rH1A{HdBJcli zz^he2f#$)$AW$=hVV(E?H=-atP)C5*TU9?`P^fQaZ~%o5Y}Ckc?*A*G6a))o(9OH@ ztPBibkJdv{7|iqFjKlE%KX?{vy1+7a*7_!f7vBGWLsl_^mYzNSUE%%z_eW6E8ssui zIs%1$jU4+HNIH83>DS8r2QR$_72ox;7Xs>~*|$LI^-th*s6T^&0n~=Iwgb0XVn9Bt zsec9Tf_wje2|m55rsn6mdXQJ@Xa8VuocsTYbp-=sef1}iYI_C+>pTDdgBlE=dIMBa zfYf>ae+8b8sh@wt0Tjj#^Zq}nx4a|*3ZnYGCjvnA3OLA|FIUtr0j29N;3F164H)Eh z!E46<2WmK&m%Uc}KmBzLXOJsE z%Z?ov{hy#G$-v++k--HL=#X&_@Bc5r5m!_F6MU;HC>?{s91^K7K;>mU1E>kE-^>8Y zj|zwwe-6$RFgZ|+g9-{z$^cp5!N4Fx7cLfxv-v9rB?yCn!7bs#ts_K`#t^g$>(CxM$we@X}E2d8fW0V1{ z^M#H1GdHl4bhCN|dS6;c6+E5A0NM)Osm#F8!NR}*T6E+%j{&^-+i@O43TSaWh+p5y z09rR$zr|r5gM-D=|NlU#4|GLz%}VBFpfU$`VHSf*uQCH; z2MYru$Y6(g|L@c=cm#m^G|bFk2Z4%P@BjbbfEyT40_>0lkj^Klj|95M)G`%xLy#7O z0_bQ#(50!hnP7`SYju4<7qD6^1>L#Az}UkA$r{rOx)?=tkez9%`TsvCyUyW+oPZAs z4-f{K=KcTwndxV`7$v2bGAO|ORnfwxV5$87|C~;UhUq7|7-c1q6j-$U{|{0CvU3jS z^nYE9V)gY)BtT=4J~b>_BH*Rla~T|9p0Hs3{~zQ|WLMQHGl|r+Fo{^SK&D%JSpNT? z13CHN2gr4By-WZ9N7jdGH`sw7_0!qA8F{Bm^f0PS_vm3%nLHtgMWJSyHstE|2Jr3m z6D>ef!>r5|6)g-29t_M&L9-efpw@zI5(5jU9ET1OO|;0qu;ND}!wOIb^v6Pm4HgR- zR!rUyF9I4B-3Zc^1J(t)*%8#1U}O-metBU9sA&bR73!qHt-sg%L94F+Kvw4;`3zZ_ z0xn*v!5Io%#MDVwyr^ejvS@1j0a_gC{l6N#L>bY_Vc!BCRf&d9VuJhxvIOkh24zUy z%gS8wL-C&@sQGEpz~}(#*Lg57Wr8fQXk;h=m1`hNs*i%&aaE9_N0AY{@E24^gB!l} z(CH$OCQGFz29R$+mRPX<{~N-DpeqqV>X#~jW=;!0jp)wIWgegrFUNTdJ6sOH~xR{)1H9=H0J}F-vNzbf>ImEa_|5D zQ=mDKu>q<7UMuYk8JzlKT@R_Y?iyEsf&&z;px~%!hRm+jfO@Q;AXvb_1u7jq7}&v! z>-6`7Rtd0g0j=V7oX4O5YJS!Ke?1B0AW%5~l6RQ*|3jrFgF>z5Es^?W4+e+13^uiz z5&`<13=AMO4s#iFEH#Dx|F6_$Pyp?61eFJ%vS4yRvIKZ=9aIN`8Y=bBDN#`N1}(V( zMJQ-2%_^yh0W^jNx_}cjAz{tHzyN9zgC-_G&0gBSdQx~-fH3@;KH3oH~F9YB>xO|?V-Xv5pf zgZ~Ra@rZH_DCjO~%S49!IiO~&0|P?`D+8k?7XxF>E^W}VkCa*tcF^GtAa+&dpmYJ0PKMIOP+ApA`#a8K_0ex&$On~^j`J8N%;9FJXRPINuE1ug!@U0! zEVCGxULOOk%wgXGx+L3zfguHSVK(@(>}L!dpv$s56B!EiyBQ1|=P`oriq^AgU{J7L z$WZ7wk1+vsK{e>!ddGQ;IaUuCSU_z9D+UHes{;%QRtgLTwfE{7E_g67Sb%S@W?-|^ zZeZYaoXa2q8ojMm_$4wklR*MhM}t~+uDGL|4>sGOemr@Di!j1kDq$C@?TE*Zlwge+gDx50zkGVAjB@04k3x$H2h!fPsN2 z22IQXS&V^!Nd+bkasUGZBisR?1BO6yAocYi1_*;3V8OtUj~?W>g4?k@k!V5!JZ0NVdGTb@Azl%GNOj9Vl!ba*f@gIlB(^$hjk zZAjk#zk)9^sGlzZD(ft2l79qLBr_<2<}X1@xXanUK5F50Q=LaKW0jR+C{{Iy`a9`hC|HA>)>GA&mPXiX` z;JfG>89G3XD2oFO0?-TYnLv$4(AFrBVIVfB6+BCmfdO*NZH0}Nbs?TafwD0Acw&8%|6Lc4~|Dz(0Tv=vj*lm zu)`P`3P9Pg{?Y^saI_p?5CAz4i{ng@94FxY|NBRnCEox4MBp~Fo1HB7#K3W|Nq%x!N5@J{r}GfP`dE` z|7V2-14D%O|39FcehR$n|Nog`!N8F0{r?YW`mWgf|DO&}76cW`wb|@jK&cm$1wo}B zxYW~RU<8$Vpz-YVCq2JBG>$vOx1IK0m?>Nr;e*@Hd1dYu&%ww1XDqTTY z*Kr=h15h>xnFDHCgJ=&11|9HX{RRyNkeNPnK)X;iFM;gq%w%8ysjo?p0&T4A02i_x zYf3~<={|9}Pe|NSA5QdrW0`~OPI?EfbncK%=DJC{MB zHi6xw9%_l>oc{|zp3rY)5OCP{A5`ocfO4V3y#FbntMc?47%Ck0F*tzMVg6uYVCc+b zV1jPVaslZB1&BrC{|_KXS|l*&GC0ir_W>jU(+nCfvrJ$x08Il~YBDf^6n18TTBHAG zO#XOkLp`4W%MVak^9jnm0MRhaC&20eVq+1n!6Ci|yEt0~4)HAv3=FIcAPc59%w!a+ zM|S|r4eS~nU9gKg`Cu1!26wGM_JHJJm`}iE2Z#+92OTjD77%d5;bONZV0ny?@|c2M z+!G`W_8^!6CHMqV08M`eJxC=y@?MIFE{9=idDIF7^{hr^{rE5jD9oF!j?D=3&Xsc_uJ<5Dmk80(qdshs9y}As{uF zF;O6bLwo^>I4n8w2^6uQNPsxtC@sQ~Sc^G8N-!-ho`FLgYi_IO6DR?1qQW$&R06v} zr8p96DJ+W6VyMgjyE)+Es~$^`R^Uk76*wGPfg_Do;s}YVIS2>A!XF&eRSysnAQlAk z3Dn?-`&!hZ8KRtlPoVY$h>01ZwU{L{$bLS7I`9r=Obzuo#2axWx+cu>0_?G793E?% z0J0xT6ttbe?t^ylfCHvO+p#7tK7kG$?B;Z2K*j6P5=#dTgF0~}#!ehXd?${O=tK(% zu>V0NY8Q@jqzg?0$lW0IJvj1rFIWL)2u=O~l0X*ca`kajnB1D{y?w`GMg_*{50)@W z=;(n|F)%Q2`Go~J`dTRzXI7=!s;1~Dq@|W5XV|J%=qMDITqv*Aps} z0_+q%fpw7FD6kGvz#`-!nNDEc3I+x{kc;6#1GQi+q?sVFV#R+5fCQz$8b~DvPebb` zOh2$1DGhCaMHw`tHbA2UmS$iMfr~?<5YC6DC3JN#kE4r2_0_{1B&hX(fl1d89DLw3 z!aWD#{{R0$VtfJ{3>a8k{6qXfJdnp>Aq;c)255-E5F9~LqjB|ytUKrVzPGPndZcYqXteGUz> zjZh!Mf*f5QCJxQM0&{;S*Sjmg-?HUiyQ9HN+#xKO7XoNI|&~S|Y-;Ew~`# z6M%&XEVaW5LYM<#@^FXLLtO|f`QT9i%}%hOgc$&H*pdwljNl>!<}h#r3d{i~&W#!j z>_INB0U;iUqz8&herPeUaR&plk7o#j7DNl5056!qC$RAb1EVdN4I=miL?QhnffX~R z2drQe3*v#Mg%zOG8}10r4txT9khZeG#t#fEEAjs1%L^n9ZF(fn?yWt`(|kNhsOxC{Mrmn z+pxN9Gpve2ty1dYB{8fL#i&Za!HuXCw?GTrE#U0VC$I&Y1mFcSIA~yX6{xC$mS_J! zUO}&_K6NKPhcygp(X$;FSbIP0kFyzRPlhKVl^}=z@lOsG|1sm01W|{JS+;(n-icY ztOpqgtDRRQK!XaJM&NZB)PXRcZF|7L9vl+n>E{kE`9R?cPW;d`BB%v*_!?-zw;h`J zw?lLLcBuHa4-EWZjWC0EXiT55o>9&SJyGsxU|@0eMG8u^hTWQi=?~T;RjMGLfjtIJ z8w?B#P!GX!`3^{LMPLUsQSO9Bht>PcRx1fc1O=y95|GG=f~iTpfMD zMuLn5g#>ztE)8H{@egwig30r?fLMG2y9^i@bwNxp<`WQr^l$}sc`&fJMj&E99MU-v zST})z58e)&&b^(H8{RsG1@bOvvW6#5XrRH|z6+XKU^J|@g9R?koZT>eut-HO06?=? z|Nqzj|34Sxcs_V585Zm4u?Gn>K7l@$Ek0A|5{1_oA8Y3d3R#$v(#1O`TM%?Xtkf(*G zHNs+8$e@HUs6=CcmH_)~z zg3&Mw;UV{ekdO!{Y+0Vcya1g2h zX7IrP23C+lusWm`%|U3%09Utyfz8p`*);%MZ(x=P2Tw4tD2KqBr-;PL2(q7nPhev` z0|S?%lYdZ%l5TJal8e!s#|M8fu!0*ZP>p=hvha`q13S1C3o9I;^62_EE?{7Tv~)lU z_yqW&jZ~(^7Sk8(ViZe~facFb9tb_fcPem*$08m1=9sKfm%q=W<1PYE6~z5MuP=fiNMn4VQ{g)CxG6b zfVCH3+UEg@*9q2@KruwjreV19lj+-WNCwO+x4;J*)tR(MO;$4Xri> zU^L7D%O)_e`Fn$sFH?T@^wpagxtTWKn7(5(qg?%w6%4G-{-J*0+=1j5SfCw*76h<% z{ZXh@Fr&9@U|gMSKnKguu&cR08FhUHP5BEUZ7bl<& zhdB_vlM4yZdOiVoMufT?XU_zh|6q+em_A75#=wxu1PXdYI|S~L8w{)gKA8CtT%ChD z1Sg?UiJq8Y?PrX{3JE%RR|=X~1z?F6-Mo{~L=7|VmO@Clrnz`)_->F4U^ z>Ixn<0>vaawZi)QTp$rXfm0h8Sd6e#Zm_NojD|UQ0|Nt75ID3T`uU)V^3($cP9IM{ zZ@WZ4M_*{^gc8)SVKkUQr#Tq7K}zi)9Wjt;DC%Kp2UhFA^;t|`u!m8sUJ9E1*Gynw zH725mfu1CeD=@ISIr;=c+{!1w4GS2sOZWs%FJNFbg7+{GF$11WVc?4v*aTGw6@c?$ z4&AB1z~cy9URPqU& zF<@ZVP=WWcK!PX%bp|c-z$-6k`3mbB!fKeaQ1!5K7na!|#Rt6nH5S-e!NBb232up_ zSP0XI9-?PErYjspDu7`YVw7v(nt)FLrXNPb8~`hZV6`pG92g(wV0c~t_xIofBZv_h zcu2r{&(QJ?mb75i_BrTK6U-tE2SfWuFo&Yks1C2^6M(rCM#D;M7!9)+MxTX_FTlDp z7!H8ua=67%55YYMEtbxMJP0a)F-mk;KMIY8xg3^emufJuK?hh-q8v8N39Bn%#S%>4 zJ_QE0U~kWW@L*^G467938llAmOd~9)VRaZx{5&jif}24M3=Ghc9##yYtA~}Zur#qx z06H>!9zBSlaR@8%VFtkpPWXTa*ka7Y3G?aJ3y0xG|pfr|nRT%NwZt}dRAA+Gjd+ffqfMMxCa3tWUIBJk!i&@?Hy4C50x z5W&C!9gaX6_d^uz7ooWW=F^J@7+HN_eRrg&MDM(xfmjS345%l+^L|Nyfz=-5La^r$ z4#PRA2hI1e5)<6B11(GbUj;G&v*mUvfPoF{BXGk8vrf9y!NBF=80?`N;^^c9sTsjR zEDM^pWZ)CHw1R;R+%5uFTnGnVf|j75kOPmOTxMWk_HzWQ0viA;4=#h74txTz#0Sy< zYL*Yk0uG;_VsKf!2>N5I-ou3#Px=%c#b5=*M({eT;HJ=pDo@ z0Sv4@KDy98BqEAVK`S{}Zyi<)!1!=?otVC0AETHSEXlwsO=uGu-bsh4KddnQ!9Gy4 z13Y2|buI&+z*Pi<#48ki@XaNhWY+;!T<_>rd8=91%=GDV{ zE3gt8R{p^nim>Src+VT!f`xfxGpONeNnq!pyrmgMrn>-`)i>mCh$122ILWH!v`I zhJx$>V}#3LX%{w40c$y;C&i;4pb2Ro=z0o10kIVzgZKolaZKkph%|zA4eS|2`wBKf zbq!ki!lD$GCt&k7==NWSmYXnfT>78^Q4e2V0#gXn2(t*P5I!FR>#o5pf&~ODBzI*n zu!5WPAb%odc37p3G9buAH$Hv$-# zHDKD1LL8~&N1~)2h ztzcl*cZQh^4oMhAg~M z0ZpAqi4){`K7rdF3~bJhLC}?4pj-tKXJB9eFOJ|7*qFe;5)uj0 zunY!vXMevC*9dST0xuZ@2Qg%65udY+i5uJ8^lRYTkKFpGAqU|=!EGOTn58nm!Fkq{qdp3|KT z42;GgM}sj^5Ho`W_ykTifD$FRZ3_~BVm<+JXrf!aV!Fdsq=M}fG&`f```ggT-aD|| z1J2$I3=B|@!b)gZ4FC%<h`9ZMH5bI1}bs4PEJP55MuY%iEhyv~|0|UFA zAAHObY%D0z!g3ERL@@?2K<0r4CtyBSPEkq=%XSR zEf|>KgCY!k0)mhYP6EePFmS2Eheg1KLxLVuZG*VbTKho+1GA%FJ!~?7Pe2gb8+cH_ zz-(XxNgkj?2Fu5=MD+lz-LU-y10!Pi1nv=NLj|!&99E6P7E6Ic0+jzBTwr8Hv>xCF z2%rzEoP^dXuq6%;q1p2xwCDyK2wHw-!N3>`@+lZ2%!7q2H~>JaRWleE{6IcLZ+boI zU}Ot&4RCb?*R}`)U=Df&ZFxP0){-!bAA3wMxXmb5FAJUm;1k$>0J1~^+^s@x&_L4& zOy6Y#24-h0gCnrnC0OEzsehcnz#M@^{bNXvx*lUR@*h7v4F&>Knz6&P5Y zv5cy~8dew%I>5jZ0auSyr+`Q57%+!-9)Dn9(ucHcQ4=RLTRstBVD@&61V0t36FkEgpI^5h{>xWf_>q^8qBL^wpv5p!EW*EdY*a2E;}XSPF)vOmy|I8WbiEt2dzL z)H5(Z%Xy6Y045G?@4-qzm<4D-FR;;pfyLJ!vb+nFz$Bn~{n-ZwWFi0F$sy+vY za6O_8uR@Akh>%zaZSTQC?vw`u3w&spflojZvY$-g1_J|gs4`~p4XcQrLn}B~ z2!KNrR1CvrKQG#v|dPqD!0CEVV>_hP}wDg2I0MwiVH$&i2 z0NZf_RS5I(jTa0|aE~D+K3L6&?jW$wKvUn)w1e)k^9&5kj!s|)g6u~GHOyrjp@|RV zLa_g#r4uYM!yNWPfPqOFYz{~j!kib-LI~DJxCqq`HxHJ!R)7ZUK%*tl{0%oafq^9$ zHUxm=V+@BuTRG6w%)kI{L-Gl{fVQ6C<{e;Qih$SEaEA(N)r0%Md;%|_E`pWYD0MX` z`!+BzIb$;bsvkDa1*<5~^}m#0VD?2?nF`AV^{^m~0XQI#LJsCIw6st!aQOfO3urkbCz)l17jo~LYE!AN?>3PwS)CS5J7neT27#MLS9W^V6AuYbcZhTMreR_9$rB;!ty&j z`#6GJ0NQB*q8S(%qChmCz-y?(;fWLKbGSZsh&ou}TA=~%-yx=6VG=M4VI50YkizQu z*U;e{xJA%{1ikYCAKis!TUhQubT&W*8v~!fHVFn6C(vXR$brZUwxJr|2rw{*`oc02 zBBWprdjoBH!+i>^)nM{h!QCo8fj3Zx!h1uo{vFI^u(*D6f`K^*OLYiK^{|kDWDmrK zPPqOb3`{PN$w8D#38w!oG*{Ha41iVqFazEeFfh9q>4U=qIdQ@bfaDJN2tM5B;F&`{ zfp^fjhn49td)`5-SExPp0_QClm_lLIF{t2x<^q@xVW}6YL12Fc11CoJ4M`t*HihLP zSekhh6{yHj2kV}} zW`T~v#&-yH7!T}V;0baK_V)>M)x~Nsv|5IhjA&zc46xk^uqc43TTubd|A^Ipu!09x z4#1)WRcSg^ps0lAe^`4Twr~Kph6BcjyBIv~ zgBTuxjc$B^wtnG!=x8WRAGCu5uS-5cv){&g_&P*TPU92!D8R@X?%@etO8{~qL>v}( zAE7N4SjfP9_HhRztE0OkwCRAU4;JT;5)r&_0$eWCe*&4$z$bt{NboU%ktM_fvxfw8 z$R}_`j;Zfc2LlUeMFiMb20j64=+>4`8yJ{LJtA3&FeOSnSF<{^c z^@Da_b$y@{Jbd*6BGAU-mjDJ%Hy7{*(I9YP1`06H3J37u7@xqG0tVIqUuQ$GyFk5u z@NPXmfiE2lOnP87APtBRgmuedxdWD%ze4Kk0<82q!lm$f{0+557Tz`Wx5{i0T){ z{{|Upg17aKJ20|=SIsD)hQv2$rxlhxVQcz91(_MB>;}68G!`epz#Z=4>Fj|R1OWR0 z(wYSs3c`E>$6rhrcm$gMg%&{HD;U^3{lZ)!@rLjKtian3El*(fd|$x88~{1K3v50# zWZ?xDEYZWp2+?!Z_ZtjszM=Z{zW(5NM_35UHL&)>52(ekb^$C6z~!MWCYU_TfhR!C z1uVU7Sd>H3R6U;n%mSFf-=Vn#z0Y^kfq@Zj9#ZX!Y9OD$bEt!1ZBkt3T|dFV;!*GK z1NJ{C3ZX$LfUElr8580YfQ>J}91KhJ=0(>1Hi-Pd;+kN551H5`2hn{ z1T>d}94HK3sB~ii1GBFqI7K7JJ$&UPY|;bX>V{?ln1f*rp~V3Vpbam40zW~cWy*%& zTn(}a-e-iarT^J5J>V^)SiLE@ugE8GG=YK93zUw*7?E~hX#kyu%_+hh082ZB_^`CJ zkAZ>3$<;?1JRpkVKxjv0VZyX`pn@3MzF7$EcKlqxz#Iyn?m@WoKC~5p-XJ^tgMks; zEJpJeB(3rZK*~GB5ZBKO49uYc@R}zZvGWDo{6Ok>C4x*u;zO4)66}b9svZVD0hIEN zfluId#qft+bForvz{V}LQxH{Nu6U<@1EEt%yK#33(K1i7wmO@|-gAEkH#D9T@Q9vuw zp%%ei3gyF+9IXEYOOh~)@6BLf(S>*15FvsyNkYwq>EHE$fz`R*#}&E=17QHHbFdL@ zcInpv1}0xD9X)glVLpcW6jpG<#i0%Xb+^EaM_@jK8HAozeq}JQgu;7>2#3NfcuQsn z@$CyprvP4e{^np{4#mM)@8$j5|&0_1vjky1`AP`y5GYhQ~-ku@OPlqD@Y+B2t7LF!2$**_&5<#NWcpCdh`P9cLgIeY#AfC zoP?GS@1b!F>u%u&NH4$m^ji!x1IohYJj>+9(}2P{zhQ zy$KeVuznk?9|zCI&?*bsPlG$;1GKpWafk_@0IY+C-f@F<^k9`bEYbabG2P%NQppL6 zYxL0vSO|d{c%YDkPg@dkBsGA#P#1b6UoRF%g zUf|IIM%GZj5Kl;*hDfxqej6-mARz*e8UbAWz&{?0OrEgyhe&A!7WJs+#lQ`O2Q4&C zF{1S23r1EaS9eI&foU*YKP+VaESSFF7b1k=@~{wwl~1sch3R|v0x@{uALQu{4oHN3 zaC2ap3*9_e`3FfFeBAJI>Cc1d4!=PT0=HhE6J($@{}&jT!!dih0)L@t4_5NR9Qfx4 z1GBylW=9v+d_(W(UQS?O2}g8v>*1|~ztHjn-GaXw3{3iv^Z-sP@MajaIQZ+qz#b6} z>g2%ZXdvpKxg1u0L2@$#0|U692P>ZH`2=7c(7({$45=N^pAHO65nw|>k;5k-4DCOD zo4~*p;RA9QL>!jsV7)JJ)PTBa=-sV<0w_INsL^}^BH&Qq6ZmJqz~SNQ7@+Iw2W_T9 zEZ~A1Y$)(AfPu}|*Ez@l+)CyXFafLL6Zn_Gz#OUvT^|WeL*U91>=Fh(ffLYL6xQH@ zP20dqR!FWx>^6rbI#}X80$Z{L?)@OfnP4S5?Cc|0+PTNUFkSFHqbU3gmY3iL4DO!u zzaI=N9@v`XP=}wpz`$gLr8xoXA!DSi6AWxl5nlEFkbI0NZ~j9U4!{aHI3H>edX)W7 zU|^5%2@U|Al?93n2u7F(t2BQ?yJ4`Ic}U3D^9lTiR)XlwfzLk}*nF^b;r~PXgAfDw z1Yor>j1O}#G^hm`G#J=?BD^p?3bGfJ2+>Ep;TjVdnViA>evqFKK7y6Vur4(NSPf!9 z6Rc!C1a0)g3N~0sz~+}g*%O=y;rSC9^ssCQYd*j=z?u!v?20xqCCIRWf!WRuJgS9K z4j>vx5RW|F!NBV890Hn(2h9^8eD)t&(!sjW(4rGwaz0m>{^292qh>{alN5SI$2RQq|n;(LV3mDi! zePKEg9)(*7E@AlK=kP(NdjuJwjdl2R5461m$Oz5=7Z{krarf;7nV@Y{ zSW%DGwHIV6U|@m`;DMSK!jJ+_kO{O;P1y|!K%vXPzyKP1gwzF~sdbPbpCHqU=@b5f zy5x{yTS2A+49o`bwj#pkun>dw=wKe$BEY~B;E1_$8y3Z|;sCbL1{UHld1%|YUI5m{ z#kC{k-VFvO7tEnNL1tLmg9bIsVXrMf^I4d+>~CnAf|bOO9wF#Z2xvhCb1_UItYrr^ zSda;H4j*)x1SrU1l@!cJ5Cf489)&m%?ogOH%n=MsMlkn*$`hDDur@8Me1U2Zc+`8WD@{Qr=+Xn!1`(eCY%T=7J@hpK)B-dDTMtSq za0f$&QNDg)VE1vt*$}H2_z#U@xXYm}GH50cWQX!$QO&-Afz1cpy#NIfJk7w(fkqvs zhhH!j_xoK!%&#i5lTEPF#Of|o<5q2nsBV>Y4kf*cMEOmN@l3f;REBaNfcO750w|>fQA&TZh`HuhlUhAModCB{5es=>7QpH*m^zrxq18Nm02(F^iz?0y3{2tR&KJbtLXfR;f=m(h3`{=Y zLJcAz3^@cwkn;osn+Ldo0}+R%YUrWXf}AfvJI+ActReEI;1e161TF?JFd1M;6R@fQ z)&zw)jEhlYdIC36i3?euir8WcTl)x3EDU@Cu%R@V58+V#$fO7E89*EkZ57nxKDZoQ!}1AoL-R8%m%u7hSY-!GJMh{UYzdyn+32agDrUg*&_!kk*@t< zU=4yVX66%+f(#P~@-$4Jz>Abd2-M1gOwhe=-@tQkuz?jm0nkhy$R5~85UvUQZypS6 z;h0_1dU%lv4SED0n)om};Wt1dK{(5P0ocF`)I4|*4vPU;)c^`11_l;BftL)^*qOw* zgrVmNe)uq5fgRLfQDCrfhiPzW*nm2f(@_0(k5(2Kg2#h zfzuxt7{Nw>@(L*Cp+j>FkdZDyb_E8ua33tA6|l+@*2adFS5Simc|91|oWe0`aRFFQ z7pJ}%4D8_;l_}B&5NI(W$O-L>qu1gv3()E)f&UT=Y~h%r8t}>&nr5NR3Pg>-dxC-8 zs@~5Zw8Ie`NDu-kh@lNI*pbe#Tn8<8;FatpXz>CKA%S-a3`{oQ6>cCC5$3@{2Bz-E z3ysm4(p@C(jKf1gIA`I7NY>HKt@srTJ(d| zA%pq^rVtu*aE&lN%m?>07?|KoK|zTOTHe9N`e3aAm)`NuCb+9M^HIzUh0;|Pg=A48Uu#k2V(x#GcCm5N6 zF%2eE$qJya-+>*z2dkR!RAH(JrVL=QNhxq_~I0P1?&?pdib^&y(4z!YH z;1l44Bu+uTjOh)6NL3O>T?ndF8Q`-w0vJm;A*~9GrYUTTAADsdbZr^haza7A84T<` z;cnAKg_s1hVCjg+dQp%8($av>hZ0#Y3i3-#Z{TARt2c%o@VoT^15+@TY6Wfmg&^w- z2KESyQX7$;F{(l6P%k*6BM*yU@}7L0>Oe9y<~umvcaPe);ord3&55$2nsepLjW?X1qlEK zJ^^FM;FO>sX!#dp*&cG#2ns^y#vz3!qA4LHz`&{-v3=GiJ z4)ZBIkwIIdurdxN59>U_Cdc4q40LfN+yeB@Cz^TnI1Pf%w!wm2=mZ0k5mJSU5#-RI zh1HWV2gCRixHNEU9iLoqhSM|Fb{8l9k2+R;DJa4L5r>o+d;&(`h4OrYA`10T377^*_7D`YfQTDH zeQMMLPNae&0Z?(MdLu|K5fsUQh(n4GJ^>?ePm51bqyZ`pQx8rv2VhIC7+75#or1vbVc-)mge(IP6nOvJ6cTM4}p?iveH_R6YR%$PlZbr~?B_Kp2uZ zq#-RR8o|IC>=FbCAO=1G1IWmxplAU^9AYz{fB~dH5)|!VVDSxxx}SkhKo64L>jgy@ zfF&U6K@yM#gP`aRP)N9#LL~SE^q@tt=mm&4EF| z#UultpqKXLOSAtVg?`y7r4)K!5w8jK`{@oxB<)peP~BrECC`8vp^rR z-(OIyVfqItCNVC3NYO4RwqUw|G>8wKJ`_7J-2lWlfaE?wu?N!wKzw~j?I|eEFug#U zNzBLq+{xe*6xU!7&de)GEy_#G(akF>O3c;G%*zB@2CkEIVd?^=PmpGkQgy0~sbc9vw)_P*6gGL3H}V39O>i z^JSRWxwIh*eFY^vrZ>nisc~t5!-G#yqG0+4kT!M5@V( za`hUJb=iWF0Sp|Fu&989Kgb>iJ^?jIp)4p_0G9{56D-ZZC!h))LX?~Ulg~lXuL@0t zk{jUi$olIARAClefGH?PH2_*NNPd9JBO4%~0yza$P)YzMpNy&>Tw3!9N*TcAk@WNM z38+B&{(@2w(`U#r$#JPbGoVz(^aFBCVq7ZFWG1y>`U8->GBmkLotVxc4^j^f3O+%p z57P}md}XMG(h}1nzHCIzHVBvZcct8B)y*U|6HH4(0C6L?#u!4fp5>x}Ep-EVtgOMp8 zzApvd@DYG@0by%vU~NxW`{O$#NeIA>!+^CzK_N+E!eGsx9BG$_~; zc038V&Ve<|VAG0l^&JeXPW~>DkX|(+hM-I3>IE)Aibwb)7hK~3239+ePH?ip&b=ZdUh3#9fWILZYZW`Hh+ zhKC&bC>P8D;HU>Bc9_eRBtWMM!PZ(Ld<^S;z=q9Gk8wrx7-8KISQiw%jf`>a83%L= z6l_cvHV%irZv^hZ1V-j)b=aX;2nWJK2o?e`8s>8t4L4^3BU?0Rvv@3Y69X)69zdpc z1)((%eAqyF10zR(e{e{EzaM1DH(Hv2Wq0_m6eHvr;5_~aNapW+gSZQ+51gfioc=@-gNKwttu39Xe}rL;141bpJ)fY;3I?{|kRYgHghG@-G6p_DRSxipwvLbyGK4x< z8o=-Xq{9aH04%Y>LI&(`9)z^A;o@M65cdWMs$O7V zhwM+V0%rqI_@ES}xO~I|X|KQyhAnSIw?NH;fg{W@$P@X{edIKPWIiYxAnuZdY?nnO zK3Ei>1R0V~)Fv>nhB^8`&wnNXLIk%rOtUjW(9fSHKYK7g)P@Cy!cgx+ih4kIEg zfV5BGA%x4}>Kcr!F8;2;c94^a5e7r!P*5G3x?u)DQY)XJddKt$+DO?J)_#DM?YL@F zm^`@bM+!mp9Sm&FL9Q4_a6+RVnB*BFrWfcTMHDQeVGRLTiv)Hj0!)52 zG-6=#u+xQM^03+pE)Olypp}!LHnf(6@{>j0XMy~}2cNNojY-1{gajy`z%ob&L|`>E zLZR78;J^(A77y6AF3Pro^jRmH&;qBJG5I9o{} zF(pM8)DhNANiEAvPUTWkNKPrr&&8Ag9Ua02x<8m}yUl!7?U2crvgM{9n90FCz56pO z7yGm$ApZqS7nsE%A;UNA2&f?n?pe7zJ6kDexch}_Dwyb*=^0PIaFkPN`p?g-O4Aj- zuu4sL{le-tF@b%0_ZQX}UT|12Fff3|F?gqc`NC?&G&y1VhOeyB)4jj4%J72QL<|hR zpwS%O=_OxTwS=aDqLG1t0Y-DY0I4@~3Ipd%1_nV;gn&*VXN4*R$0q{=1E|yB1V2!b zfdP7q_B?QYU|^W{Vq&29^!?vh1r(t}%a|&_Cb9&8ZIosOZA4?47%1w@ngLEL42*Ul zJ3w~B?1a%E@gO9-!T#nGc@J_c0|U$Z3)8M}C^JS+@A=Lu%?S}~ylObz@GGm-^i$ti zWjP;$t!7|InEv5AtGOW5TwV~(2P!P43tZ*U$4cXuib0I_*qYwiFI8^xrra^qnU;-N9;y{Sc z16N863=E)Rj2}r{WBP)htYSj;AaRIk3=C?5AZMKT$tveH8{%mOMiA|c&^HHa4Y&sm7Zt#m$tlkmk4v<|l5c+04zyAk5k!EyC)^T1UC0|P@30|TQ4LVOm~0!9x821W;j_)J*f?_gkH^hb!#1&@G$8ipzi z42mRkUyzF!7#K?t>gPc{%=UqSfw3MTJ`sgOHy#z5g$(IM+0&c7`+4H~eK)tG9(l3`hghEQIpe zu!x+(z`(Q`AwCC^`oKF`nYJUuXM)Qc1_maOca9;%r$Zu=0d(IA(;ZN7f^6awgDRgM z`j1smXa+QFnNBb;F#Q54nqKh_lx0DMGDy7(0|T=(!qB;})Hj2Hff*@P&IA>LAoURp z49sQ-^)nVsfAEi0OlvMIOHE*4VD?4G&w`l;5|0DhukfE$-Vy3oCJ6=x=1PR}8Q>Nq z0|NudS-lAHS;)rE1sl`wpH`UOj71nBJ_B0LFd8s0u&5%$ z=fDCjfPsO<1mtQ^2=a+Rm4lZ>vUniGp!68^m<6vN5MJkqO!&2-71_oAFBnN@}(jZe97+3=k;tt?hCa8D)iWqCFtGL@)X#xc zsxk}=te`r88SH;P0SE9n+wf0j58P**pQ0J=`f$=Ffgzo6_eAU z4q^uRY!1SLX|P-Xa_CY-2-$+?c|hUAz`(W+CSK1c;0p^<1_lN;q;hp0tmrCXU|>Uv z<4F)Rz-fZ*GQ#2+u)5BIfq@OFu{0glVoPCQU}r(7p93;S7DOm8Ft8&vL1#l78w^{v zC$O@qvhbB>7No`(Bo>uqmSpDVZExXZi)7?WPc4ZDPu0d3XI7<7zr)3Lh6}<6O=C}A z&ds)EdJGSnc|B;#2;3M3Sp~v;0-*LW14taaSREt=!h8aZQVa|XpcD1c)yqM}(bcO# z5(K2N4Kf3S`2@h{K!YakSQr>!TM)s0bMR6_(B4aQ3qUg)n$vA~+1%?vc7W&J7#c5u zjAP&vU4!bxzXgx5fGY2(?4KleYzzzyukT}#FxHu?0>OqQ(K>Mlx z|NjrJD)$q)18sqYs)u{v63BjR z7TjTusU?{M+^)MpmBI~@n;MS44|}%F8+#vfk7HH#SE2zG=TU7*xxZQ zFo5C{Dh_uk=)4_J{G*G1Lk)>;a7oT5!2XMYfdRA=7+pQ+{y;d>gxqKKt(Yq&Y&7#amg_c>NBVY zxcD~gX@cVzG|Hgr;TD6U2Ae}cA*v4YKbi(k&=3a}4V)k!gW?!nJ!s`MHua#~1d4lf z^=U{R0ND?7DJLk~fD#2%11wE&f>DsUi<1d)6KTwb7FJt&nzHGqUc1rZl0 zB(PZkDnLM~7hU}_Xw?QyLvV9eAq6!=5S-Y#)ps+>R#6LbqeMJY%e%^ZFl zX^0=xA_A#50_A@sm-2&}L?8)tgFtZ%awwX`{BhV*H9x3f0#c7|4yfn_t($9d; zpCBlRuo(nuLSYdX0#(P@#Bo$MLZ}vl;tSON;u8?UQDh3?@Uak%5>psQPz&QIF@@_u z_G9sZFeq_h69*NgSj0s@l?^s=92ScpMKLV=!BHTBBhiV15*ro^MDws`KT#wLpy3QQ zUlh{=Ap7|Q#Bh}PVxXcIl&V1vfSbf8AO@N*0*Rv~QZZ1I3yVX=U?nEHIdvfWu^EIT zAB(|?SageVqzN%l3kqaDy2YSoI7qx6%^-0cb%8j{2k7c?q!n>ceGjq#&0=v-q6UdW z%>nrz95>=1AAls#HNboT)c}bFJ^=|FWxE8ZVS*(JBw#*9HNRd!5)}6!i_t8Q1l0vt z43fmrx|PC_@1;O}LM-M;gUb)lj18K_(izh~Sh9(ENrO@`s6~tFVgYGTO9v#5t`CR9 zK#RAf*~BG50g1&OG6K^tNU@1Y$>1nHWNfBMvx(KqfF^XYX$NgB0AWy;fJ6>BK4ox} zYBHeFQ*7!%!!+2;2hAqNGfXd)ViQb~1zCbcku0bQjKxsdFzf|{EGTHPnX_iPf;O9& zkt`^cf`S+==w(3#2uK_)=w;tb-yq2*mLv;GWLV6V1En#LJ~Z>>K+SQGIGTBKINF+W z9@8B@bBM_B3CKa~PxR_ju4lS|2b-9b9FE|Z+W|KLE80Fnk3N?4>7MW!dnv5843;>a_KF4MF)MSS=K6mcX#MbO*= z=t?C}f=0?UilA~In}tuNCxD_=2}h(T=}dR9W)qWA!Vx7(InxD{*~Gk*ny_aGCC~x^ z&;$&cdz5fA-Id-kSL-E3(K4Tk z%k+fT9H7`!0ab=r+^zy@%7JvEn+VEuAaQgPmrPHPW)qWA!BNJkyqLbh9PC#W9O0=d zGW~!to0ya;j!H?@VY-4ONFGOeQ_Y#)pv@*$uZknIRYCIzpk)ha@vjORo5m6Xs-S&& z#S9D#=;}e;04(a&K%J^I25k%tYB)Tk<}y9NkWEZV4b+puW?;kg3A*4QQv>y2u&7XH znI7B)*`AP#vn?j>v`T|EbF(!=-(?9ru zhxs+mOn3OeA!5QOpaGhD1I-+un}wqq*0g{*S2F}$nJ{TKOiwUi6Jyd`0IrmzG;tKz zT5ykQsX%mU#lXzcs)35EnckqvCMKl?8uh>uSlR+G9ojk&9oiw&8$c;a8#JDZO~;mL zW^7_o+BgO+bQE9)>Nr3Q)G2_AOn{0Un4XXWE+%zwl=Hfv^#Gt1!DxY~i=(Zj+cW)w zKATv*E+`{nakMUuwwNxcUdN(d4^(es6UR~R>p=>;dIt1rSr63l$7T?Y{HTYcfue`Q z19~XqgV07bXe3h)M~2kLQCRBZ=)vfNiaabH(8pFd%QEl@=;P?i8L&)OkY^LCHvlzz zuo!57BWewBl*I<1aeZv&;21eEfaD^~C^Ep2F%5CVwIPlMu_2CDk0Gep4tFS06dB@Z z1R3JUtA;olB}Sl30=EEB{~3YmIdpN*xStV@vegJjkQ(8r42*D$kbo9_fT!WmszYNt z(6}GEi$EuPfJVWviQ~u(#yE0=F^=NI1d-<8;ScVtnBYisCO8~qf+LPia73jEMpS~A z{qPBx;Bcua%X9%*HnDnB9NE+qGzSeToIr67ifT|n$-pOIilbX#3Ywe7rXEK@X$CSk zlOYBp3tUyr&3SP7(krgP_gT&F&fYqJp3F_b~)9M3^Wt}rUfCVgO!vkl% zfw620K=b7+d;+#hV2lGW#vK^r2b5ta0%I7!7(OsY28_`HV=RC%_P`i7V2m$NhCOT| z-(CkM;sIqiXuuc-(-oZA#F!i`U;+*>23&0bOe6xvsDLpVV2lnJV*=PbMu+MD-8n^B z_yimlOrPKZvS0;F#ReGTz;p+Fkj#nc4W8g2bht9T04(wZF7g2);>ZFMaeOmTTj9}f)HeeYkXV9A12F!Mz^AxZSBWKV?Y|#29P`D;5udc0W&r+Cf6;H#(?_?2;cn$m|yP+>KcRQ@?Z%Hnqxdci3ubQOHeRz zP%9rK4pR?xi6@8;TKxc`K|3@dTgnAIK|}f=^)Pdw>b*d#$2b|Lw;HkuGI^bt-T-Qa zdV$&pAVZ*vJ)nm8Y?xlKk`vV2^8wX^AmgCcz^;(>0kuv+;!vG%@iSnZEPMh!H^9w1 zCZ9Jj5nl#4D`5HoIX1C+UrQijLst*#j(3%tOIE%*;aafl2|E+hfY%9$Qu!Y0NP@&wc&X9{HjnI|R{3M%ig*dM9` zF)Gwy`UFs)FcdUE0CGDdS{g5b^fB-Wgn|lokT@h-5aOT_Wh~-h4$~KyvWXdmfodF3 zbVAHyU;r<(Q#61nhsNh$&!qdqslUnIL~b+}(HyyaUjQy-n4&jK5BLV|(nf=d7f_P~E%sx0rWYu)i7~}k zOjiJ9ikOh;4lW@6lIagX!YT+6Nps-vrPB|VnIb2NDtHv zpwbrP_E=Dk1c^i402eO+n`IOWYKnp6Vfw)8_yl4>DIO#a<})yWmYRdj>j3Mkj|GkV zfzkm)U*jdPIzE9|(1;gE9L#4xh=UrxAaTfA6ofb^j6mY(=73suAaQhaKu5NOGECnp z$tK7YCjhDJ;y~FX6>|k$9H>$Qi9-wll>y-PY8kO8#d7Zl3z zuoMN=4;Oy|4t=8pkcW}=ftShh2_%3#3=)UwgNbWQKVZowW|ROL7zeovY9GX5d;$p| zK1dv@4=z3fQn@A^fzmf%gAfTXpdx>!Uod48OG*UgHBb1htYF_yiI`K@Adzs7HtwOyA(fCdQQb0b*|w1C*A5_$&$JbC3_9 z=D~cB1nPc*#G&TF#iu~^Lw%M6_gNCuXUPy77?Y>VYqN@D!a^1M_~`0kHRt(m;(m zkV=U42$i6;3lc{+;RD#aMj4b=!2V^g(F<{SpF&Gk93xP$0} z+YH(|hAj`~z{+Hpdgy}W99Z2C@nPd7m^jD>po9fc&%g+pg<;?m$N?o>W>7O1q5&ZR zO1Yq*fQTau`T;J+l5#GJ8 zy$F`~(0o(`>R%(94-J|kP!eYbt)GJ!#J~vNaKa~01WKQvOa?IsAr5MLAR7b9D1Z%i~#p@Xm5}=J@SR%I=<}-*x;p&S)BMew9CS}<*!9GKHtOTSEn|KUp z92JX8OF-o>NCQYCs4W9cwk4qQ7bK2u0VvgCF{czq_9{hWFYq<-@E|S4k>yKqWcktq z(?5U)o=U$=7m#8TGb#h69gqXj9A1W_Y%4neE+1w11j;}s_93S(Xf`N&04X!dCBQ0K z_yo!=APuqdGhmT=K7k6*!LV4eN(F3?0L?WOpe_l>m1x0O0U9hTg=9{6bTjY?RDco= z7V%0@Cx7~6T~0w3K7mS|=>@WEVo8-avPmUq=NYmGp__FoaTMc~IEwMgA7F2r@Cj6b z_A_Deb`>Z%usFBM1w4Ps!Y5D_0(PrW6)0U{aZ?p&bOMVB)h%EXO!x$b&{o5I zgBG+k0$^9O@Cnq|fbEv50fh$^*VnXwGTTju~y1}1z0b?9b*DnK=i_A^wMpH}JqrYVd%w z3Ls`Sw1CZ&Y6O{q6clXWjjenFjnH0P;|j2PsYX!PVM*1EZ@}_KO`sJDSmc{Pi3^*! z4pbi~M`E$R39Z-!9Zdmhcs4>;ME z4PcRaK7lTflR$bvdO`b0!Or3n=mNE>LE=y+f#MeA)NWYq4^iKE6)evu&<$FagOnlR z;;>OLusQ~WdQd$q3NjU%A~`_0l7Ua4CuDkq0H;U_pFl6Dtq5`g#3}}mVvrMhK|9Vs z;t(Sd;-HogXh;&Oz893{8TbVHL4`3$9I75BK4A*jCKf({2}{7~ifN(LGxv zgSidVZDZgQmlQssW`Sa7=>;K7nbVULJ^P3?ioMfNGfx0i&LQ)U`N^&3t@T?C$3JO^TC<}sAz_b2LkkgS=M1v9( zNCiCWgHOakRsqVSAQkYe4?Z~zNkt6EOppqA)}IMV+DIxu{bW#Pm^lONSs6ZonV@zA zl8ShkOCcp8NCij)Nkt;e9q{4=3Hxpib%tR|b(m=%;$ffY&1AG=3k{Rhx zGiJey5AgYENGdWxYdskF1ZKgD5Ag9UNGh_R31}9)_y8Y6g`^@Id=w6!z${4d!NMmn zD`UDq7@IgFytDuxjD@5n2UHJ%tc8~r;4`m~RY3FLEO==#3lzCXDsn-UCCChTX#qZC z2T4U9XrTj01-!JFg;rXC$5%lr;HAYZP|ij&qX5)KVc-*(4KFP~rv@QcY6Z}IJR4qG zfKN$6GNTaGECZPVFD+)Hl@^7dvJ#{MURr?9O+z*VTCUB8mlojj{*Y7@fyxGu8Sv6# zHb?|XMKP$h1*w3S7PHYxi(+U#o((T8z(>&_n*mKyv*D!$_&h`;6(yh=8)OT-v;ZGv zgrovAKMBe}v*D!$sF#2ore)B=U=FOb03R-fYy`+_415A};H3rlbTDKU&>S`gURr=p zyhBn^4h{4<@X`W&W*(A?3b4EQ1m?g?3-BS2$SOby3gixWX#qY-5lKZAG$GG{mloio z?~qhfg9>Dj8Sv5qd`cCv3Q#o&QUNb5=74;MtO8oe&w-Z~bI?kQ8c-htWCpyn0H3#n zWJWDi#awu40Y3c^Nku(0%gu$C7U098kW@54i}|_m(gJ)!7m^BaFPVW)U@oMzkl_=U z3yN$c6)m9h7Ni1Re1OmCLskLmpMg}six2RLd`K!a2~wG zn1|NBXot2Q=D|x0@M)#UWwxIEsYj}X9V6 zLCtLjK7oa3l@Ii)Q-Ot`yo;nBHr=%lRNo_ugPL|AbI|fF+#FCqL)C+qH^W8@7lK+^ zPzg{#vVsf%83YP5WN}cv1ri6*NaAduRwo0W0BA)$_>^F1h_Zn~1|$xun~>E{0Cgup z5}*NYWC>6RfW$$G7g-#Xg+StA;&Ks40g?tz zP&|MP0>vq^ILN0UaZu1AiNk{$Ezxm;JOok?D({fg*K>kg2$BG$MkEPNkij5vP;(Pm z9Ap4U92Dfp;vjV(akNC*4eB9+#6cl~tRBQ?;Hwu{1nK}FNx*#oN_i>qooyClr098*GTH&Q2;Uz zNt_?#5RmyhK=~h80%QP40+cwA#Nh^^r4@dVI*@wwv;q?c#Wj*Se4uOxQV&lnpzvp4 zV1V7a37R8EF1dI?shNRKUEg9PhA3PBbi zCkoKfkRX?X#6kHMSp$d<5(lLLByl!SRDr}nX$VQ29~z=d(9)0~)SUVypddlg04u|n zpcOPtXALDB#>2rbdU4FdTP zNj+Q~6ctF~@F+t`jP(o*-Ox&62`JGZXD4Wbd5(#Q?oU1K9#- znpuWcjtGJHAoXZb2TKCWKmh|czn+0X2dMUWS%j9cflpvLG*Q>Xs%2QJUXGTkVR5`1EmgCF90)Q9lz6ek@p81pD+EeAAoZw; zx1IskKv|BKN@1ybIjCSm@&PPcE=NzKAfJLP09k~j9v;+ai4F}60Up%o zB_qrNP^v~!&j~UZWHBODgJK(APAo@D)Iy*{3sMhC)X1G!SoT{EQh;Ou+y`i>8Xh%h zshSm}A7lY2u92e#S}QL{N~GZQF9eEP20nompg2X+zzYfikT_bR69PE|Bn}D@B=y{2 zfAa~ffF>?j+7bfg7La<7JxJ<>r+~_TkOW%M$O#HckT@u@AZg$NMHNUKt)%0GiG$J# zl6oHKsPGE3v?2`3bs%#lfLw~Cfg4l~fFwW$B1M5PD0_j#S4`i~$0k<40^~qsd63UQ z@}Q7GG7mQJu>xc+vU-rmKKPco7h8iY0QnqA1FSo+669he zakxX#$_3a!$x2X&AgPCSu2-T*H7JTfwdP6?14#qir68Xpi9_zX;S*SiRxXHwd<60U zDElI-2bl{JM@s^5kF7wfHQ_!(OB1kO_exMcN3sC!Gf*}~7Kd4kmYoHmxo0IJ4S{nl z1FR%m3Cib42Ely>(ugb$vjCLnki=o-4rn7Paw8b#<5g&BOSl1SKcB!Vw8SL}aybK^ zz$#E~L9zf=P_05sbfO@KgVckf0!uDfg`T!RxdNoV9=*H(84Qv@OLStOLx3aom0;MHwa`Ak_K2VScO*Uz((O#p(RFkP*i~|MoWyaM7;`BpdpzL8R@C# z6Ica`Ya|J{OF?mpEDo{|WC2>DgQbbppg2WRFAh@2z$dU8l(w*>iPaznBiEWe(70I* zN&`p+@qtn;$RM;5O#&1$AaPKlLsBmRayUpF6ctF~k}z|S(i}MbOTa8fOLTCbp(Q#= zkij4eK-m!4XVAg%)o5u&5|kD|>OnNBdXW8m0;^FI1p_b00FVYykRxk=Rw}D;#PMph zIEF>#YD9qpiX?c0X7vk@{m4NCG5};TT7d&v+723*SPhC(B=u6DIAq`x0I!=s76*kS zNE{Th$l_3stpP;^NE|lw3v=ljkbxixXsrkvds>5*CSWb8HE3yq4;nRV(9#54JxCtO z{CZf?y9OyyfWin?WUfJrdnsu3x(2Plkpkr+kdM&{99SA!11)f1Eh#AwA2jp}zPu7S zj-iQY4O+n>1x?l9%Po=BL({|>v@`^(3)Y~OD{yg8?m-^p(P;vGSl4#lR=94lVP`gZLnEw3GvL-a53DqX2RbD8|=;(mqlWg*zA&&`1_5 zfcPK_Kq&!9y#RD&&pNb}zzGTuka|$eBB_TZ@pa%#4l2x{0CXfX~;QR|Q+7GysxjjuzCS-3dJCrBXyOZ)4QO9jyU4k)S^_ypF2G82+| z1(1axaaauk^)M)kjznp+$_i^upXQm5ycGLXXuF$ z7jqa|Lr zgU}K$EaX7`WkBxC3xX041M~uJq@d#g#UV%>Es=79q6#DqN{qHt16sJfM z@E`*D5J_C=z_cbdF)7%v$_9{rWa$Uf4Vu`*>R|=w2DBt11PVZqb)XnWavxkhTFffL z0t^&`Na}e&>KOP0HiFVRlKsk{hya!78$lK!X@FU<5u^Y~gAgcfgA4*yJxJ<#K>-UA z2gMYUdKOSbfW$%aNb1Ev#S};!TsnYqG_-(I1_^*9Kp~H$0T$yM(E=XU@7stL@UU`h zBU)~Ut4D5Zfb56G;6}740&NHe6(<`(sUOKfkc+wb1U7;~1j)y+E1@=maxap4F3{f#U(6`H=#uttRUWmR&uL=5;MqrP)H$}FIo>u%^(T1 zxP(=Do6xc)Y}{xQTFDLTbZi2}J(2~m%6Stg$dSZhAyK~xR8k{Jz$(>EptwU82W2CW zLqYi)SsWCU415Bc(c&KFpv|Ci0ZBc~L7PEQja;IuKrPq|N-RhkV7X&6C>1Q`Ib7~}vXi-n=t zY%^M-Qvsy~ka|$sLQ)TQC}?MA zR6!vOGXDT5|05d&3Sy81TH=CrCN`rbE_eu`B`$W513~7Xr6CazpMg(c3nEQG@}DXw zm4hTeE<+C@kT}R;NDhUi-Yw|0HZ+8`fYJn#df2?v7PK^>rT{VkWC18nku<=3wgoLs zh@O~!p$n-Wv;~v~ko2j6EC!i}mIl;7e2_R=U7-d_6CiOAjcg7mAVA`1NduZz>jk!; zr42Pulz}vWf*#2rxJS^^1`nv<0;vauJaULb#~ikxMYS4;4^j^*E*L?v2CX&0sTd>y zszZ=0hOOe-0*Z4aadntMXyu3qC}bG;1h#?_KazS_NxK!1Wy0GsgMik608 z>s7ac(gu=xL1^0A3Qt?0_-9~%&#G)iOI)y-`K@RL53KdS6_n_ZEPyQ?+zPS?NgVD_ zP?|v!XR8MVB`7FBL5L&)4?0jPMH1Hpr4f*NP@2IOa%hQB6BH#3d;*}u_mHP~V6}4n zHniFfHpj3H6y!)2!yL2?jBVs)pEZb~DE7@S# zW*b^!lmj^&WHBfNksSmIdXPBC=SbqPsM&^+80#4rVCzb@fwB*h23Q<#0~N(c;;?MF z4V2H3#9{4$ZD@%X?ql@C3yN}3t+@>?^}?EJ+t5-kJS5N(DQrA>8z?HUIS4(GfbI7PYV?E415CHL2-&? zu@WfgLE>nM5mpOsM@x*b>74CoB_^yg+YU;kNam{*fbHiK*bYgJ@S+!1EpG<}6|x49 z!5{~LN=#&NP@IFr(Gn@#V`zyK?y-8bRH_9t2ql#=Fu;8V3MnLuwLobBWHDM|gf&{X zgUmxx4~xp}(8LIz)YJkc9*{wxM296Vx5JA}P~U{9iYUB;Zi<<9UyrmgS0`34Wu3| zF~Y{Uc7WuO)WZ_v4p0<9#lh(x)>GPnmgwLXpd~tO5FcbQD0@N;0;LLA9PdC&jM|{I z15ytv=#V`&2UP!qBtQy~4AO>{;X6QagRBACFxi2ch#2@lQ35gtqz}m)xHu?nA&J8s zdIRKtBnd%K9D)o2B_bq?p{-Sc9iWm9Nxe2GQ8Dld>;$D1B=xYieMCa?=Fe&GgziUgz})q`0KN|#9DuqMJTv?4(byoevTt8bujCa?>wzL5g?6l4x4tzZiww6p?q&~8wp3pugCa>j1#iA7*HD6WxwrU%L? z415B+L2-)3;@xOz1r~Cw|t4T>Tp z^{{%bem5uxktIMr0yzleLnLvy#b}8UmUwrgB|6yf(r&aw2P>6#L(&|g(*xIlmgw|B zi3j8$v_uDY5L&?nk4jKtMDhU4q2S%)aB2pn?lY9M&1y14^Vw;@~I-b$a%orBbj2$U*Q_3Qde)iceqCmUN!_{?dKENgO+;XE=5bdaB)cL zg?EzRagUaGVI}4s^u!B_LXZdQL8%l=$+ZWR>XBRu8^+lSN(0E^pb%r=6WEKEcwr6S zy=aLS=AgaM#LES1l*n65pD-7x(XtmUQNkU7mMGakAp~*&$VW&HgF65%QNptAUbI9B z9eSu2*b6Fvuo;AwC=Eb-ki}?;5|;S(g3=C>Ij{!sUbI9BwOC*;I8lPq1GG5?_W>w~ zkqm-$e)b~Q5H9ppZf`-vAT>AoT{IP7tyNXeVbMTB3uMko(XQ9W0UVLrZk95ZZ^H=s-~g zvKXG`K;aKsJO>g0Nq`a=l1pK!eIHt)gQb;yXeA-sVzk5vR}Ts)B=h-Tn|k+wQzIx< zfigS;18lr#A1KivX@HgG`_K}j0Vs`tJOJ_`l6qL$+6M}9Bym^~U%wBnh=k?WeK->1 zK9EI72ElU2KD5LLOLY6tOF~e{fE)@*jEMFCJm}C8BP><#!;u*Gg8~f6L53iQFz^ZN zM^B8q(RXAXsHwyXZt~w50VA22FiZ45)M z&`LTZkcA-iXo(JPJ|xk>t8pXnAP7hUC~;x20F()kOFBhR{$=13IDl6D!j=pi00lY3 zXP{)spbHJ511O0OvH0vjJzAoJE#5i+iV7ryV2SYnTB3uEv>iZ8bZ~P(4nQ&omKYB} z(;R#d6t;Nl09vAh1>FI(L}v_gASfh2B_pNKOF!CEkXj` z6*~Y*j7Z|Jw%q}=#0cx*8~~*OB=xY7{R4NIruN zNE|>*bjG064^j^*xRBIKL(k+m07_d(4l)KODn5aOpfpsEqyd)A4x%L@V~_z1d;$m2 z5)s4)d;$m2(vS&A9Y{SWtza`BDXoC>p9v^#K^o8!3#@EE2u&=IA``I`@*rATQ36F3 z$Q)4q$7V4oWRXI`qytp{gEXKe7P!w)6AOb0C~iUOLA50|3qTG)wg8mhLF&=c3fyB0 zK>kP40Jj)q5t6tGEDAtr1=(WgO#4AlT0v6J0Si%3T0vG1t%MH33MkkhC~RBcL6D1) z4FUxj$OoXrg(MDlD9B+*;*ubB415BIK#2>;`FozyOOGB&>2h|H40%^o%G05jg7Q1_o152!MhVt@aZJ5yLRaww{c^G67k_E7#mct+y zBZeL%0vn5)EvX)e*G(&j)fi$e|zyBRL4xOh1B_W?&N(N08GD zC>g*uy&geJG_X}!M?m#Fk_E6hJpxKhNa7-(kO4UelxDz*3>?PrMdwG*(hMksz}@g8 zpfrGF5Il&`@;Pjs$`Md%Mph5f53(4P|B=Mu4n<2_Y#III1f*whO8pxp_4ImF8djyoWK;odZgrwda6aye}P|`qB z50447q+t#UAdq@ct&5!7V3pEQv@`?j&>TfeGv=TuW8f12-L-?M`V`1j=o&ZOO;b3MyDo9|QRi$spK}@iDYCW&u(Mau8Y?gPQ|#Fp@bShk|q4F;E;K zNx)qSN;^p6aEGE5V6a4d3>36T>fsIrMJbXv$YRi-+OZ5!ZbOoQyA-WpgF6T};8)q)@mpaKioAdo{q;vjh>ao8Z%F|OW7R1F)> zKMpFXku3(foPkf^ICAP`U|@jFI~+$#ys!{D4oZ|r=2(CdEyx^DB4uQlzIPiNXFY7D z{y17fv;ZYEkYZ56!V;Xv(GnIc!5s$`qDYp)LhU$O`hlLWQ7>>D6mLixU}FQv(Gn1> zp?e$@JxJ!%n$I;RWJaj;X95bj0hK{^jR7}6H9jRD8j+QRq!Hu3SKq(p& zQlL^0$zgDhprseM13=M_6tZlPv*haqK=vY+Y8FrnPJrScNdv5yJ%JYg7N7*jz$b75 zE&eT`@qYqDBRSLp6mlT-pmc#;EW=!S0(;s91p22PZ%lA!)D#2MwRV3A92A)OZ1vYA4VVnH4C+Kn_JqW3aO21X>!i%7FGo zPJn_O*iXyQ2pzvp4V1NzjodBg$umq@7Vqh=<8Nk3Na1z8t z5{ET(Poh=5uzu)CP*fnPhm{K_(Gn>q#C|@3lW3{b3gi%w#o$zmC}v?p{3p>0Fjz>O z1SL`=i`7650ht3zj7T9N0G%ePKZ%?g85kHiKtTi207`U78ek>oNwmbJ28vsddQe(H zQZE8M0^uZDTCoOs6r>)KRuFR$u>5@zWFV3ctU;+3qybbfAc@0$jFwicL5Ufp9+W1K z90WHXrGTnOiepe*BUu3JlDrVeVvvJDQG(5bXlVxSFtqXo)|om53IHVYq3)^|IE9j!7#M6o zJ_A_{N*l-)gDhm=6F3d>E|Nhupxglx2c;P#aXnC-0ul#B6|y;?8XP1JP8y)X16rNK z*0G&NOB=BDYNyf45vUIYPJ_}6lEtK@Nkd2iY$TG619jRKUO_khZv- zMoUX@hoYq=DUiV+bI{TfFDRFQ#6eMtWIo7VaG&BdD9Di{V2ScHT3WJ&)(NN4(h{t0 zISnenkj#OH5Gaa}#3ey#3gn;-pvntd5TO-dwxGlV(g4zkWDsmnQ1c`gNI9eKlwH?o(r6F*C z15|mPK}$riG08Kapha>J%%HO%`;f%7K>8W@1kR$BfUt(nSx^axq#kY#cwsG)1nl^$ zv!KL?Bo1pWpG8ZIuv~B!RDdC=mjXEiJMwdGkHsq`#bB881HoJC8d zutATrXo*w_S|p!EOQdEG!1nVAoJA`E;XVVU4J4o0fr1j`Gf-kg%C4|#|14T!gk`g{ zXo(TFB=KxLN@_%`2NRTXsrHQj>i4j)4o<&QH@DM^vjP{@?1bG0O7~vD?uxxe~ zl$ek#wgaUFkOs8G2+JMkKyi(v9@Y*x2P$}w#9`&iIZy~9#OoR08bEP`kboa!cMjwL zY~moFAc@0#b`C8u!aQ~kt+}rS3SowNK7n(fRElH}+(C#`3d(Q{a0}29Dcl0IL~0Mx z&%h^e4lR+|gUT6@I4F@K?HBB+ddJQv^w% zrD_R~g&=WI>cx`H&OuWzY-S&}kCU4iMyS2@0_Q;% zA^E@o=3`Le!e%jgi3u_o$PNzlfH&)Ir$@qyZFnNE%>+R~JD(MDl?n zs1^gM2c;Dx_59Gu*oz*p z;v!mFk%X297eVC(+@YY2HP8Wpi)e`jHlTSCo>;&pz(-mxqNNqsK<7oYv;sSs_##?b z0Xr1b{=Wzca%7)@;vD2NP-20*6mdM;MR3W57|?{R?!1VWhG3JS7eVGBnGf56e(?in z@ES=1wwUrFS|V}+#UTTqz$H)sAgOl-r5%tsC~+Z)gM9`P2gxIei^0qR)s_&CLGm9g z?k|B79g+sv6wW2ILP0!Te5aUrRPdjKtM!PZP(0_7fNQ2awH1GtMoi4Ms@CZM1MSpZ60*en3~97#QF zv;QTu0t!}JUP4V<^$akJFN6GvWDx8s_RF9|gvH{^XtkdUC)C&0@5~Weo~qkVDZD7u?5aX$x*Ks04(10G$6^po!=*TB3s`qRXHVfocH7k}D|a zK^CKxba0D7QGui$ZZTS7bOo>A0T~2JbjUu24wqd9B|0R7TtRUNQV;SuvU=!xR`4lk zNa{^NQNq9{a0N#ix*`GcKavJmfpZ095t2A;ndlX?v;yw1V#nh=C*lTZ?!Vl+uvIVL^Qr9*V71m&90kQy zP~0II95w)P z6%++X;;;hfDq13hn}e1Jp&NAT1+JncLRbh~19=BZ;2c;3Dkb&ivYv42jN(7+9z`(!&;)BL+t|2E91_lOqPzZnwLQ5mCM0*V_jlc@B zYoMq>awx1)x`v!aK=#9e?i$D^NE+Z4qoonJ#b{{+HWYIWEsem1k0w^&=L_m zO`xSAAy8B?@CjT8r4^*O7XzgQkT|GP0y_v4{-C%ADFjJ?N-QJ|u*7m5Tw)>G{T`qa z52PL~(ZL*a9hA+$7J$9Vzyt~bka|!eLpHx2+5@_dmgty3J_Tt2`2@)zxCLm5P8-Ar zsRt!GBn!mBhZ*n*Tn9xFk~x-857b`=B`zcla37;3E?8V%M@w8DARmD&#*(-|x#>Du z+JYtC>yUy8F$o2mroWDs=wRb^*U=IkJS5O+Ne_@uK@I{1IW~`>6kPQT3~(QyCpwrx zpr}9!I#^=7j+W?P4g%Q=A7lchEwBKezztBMLw69U6M6#_7f2R(fE>cWCvXFl7?H$5 z`4tqTH_#FzY(C%yTA~9DGJ(~Dq6ouLQt7m`(=}l0gLox{NAhg5$Gs0)-gJVze{_ z>#E&EOGB_hshglQgxm>*yA-V&H3Fq_kOiPbgw3I7X$bC6w1Nw^totS?Z9zQ%PXDmp z>@840LM1>g5x- z1xj?t7DK!5w?K&t$s8|GZUH$Iqz_3wd`JuD<{gY+S(hfZ+T3)}`J7EB3&+h~aeszKm3T3UfsLbuV<3T)QLRz4p2dPI3Ay~e@1M&!x#jv$wchEuzRO^D<|98-W z2zDsK9dHmKTD_oEYoG?j9kgr)YZ2W6g&dN_u=#^KXhl10dGH z9C{bzA0%;akcSxf1nTeN$gg)ni4jQyYzp-*T4MBuI_NH1VuZDz?t-Ee$sAbqeHW7E z5bb}s1Ssy1H26TH<}P~Tf`;5(kUWxlxH%wsBym^?dlx0GfF_|pE@9vkxC=@w*fhWs z3n&a37~nobODnL&C3itVi)0Qg7u-clE8t2C)c(Hf0g6s>@QI}|l-)id~k3KRxDf%|BQ3s&FXM@w9=(X9I*2O#+j=Ft0~M295q2Z|Dq z`5>QTIJBNm;65m|B58oR^gbxAk;MH$4g?v5mKb5HXYZpWMp&Y|k5+K`gX{yD14@j@ z?SEL`>^@pzgogxLV)O@D2r>vQF~UOvrKDqEFaYHWka|#JgoXq-|G~1^eYBDemL~3l z3M8bEfK@{GL5UPe9BwgMB2@rc2(lQI=%5yZ0+W*mod5U)?xQ6-Sc~O8TA~BBSU?Ss z`=DHcWHGFoz7I-_NaC=f`aW7>gsl_0{{!TIBn`0hsX*oAdtvQ=e^8t=@CiHsB@Wae0$tiD@Bl3_!tPmlfR-3x1oIIg&Ws0<;nkmMtHG(gu=xSP$tT z$N^w+Q22v07$}VS1RkO#Mp&cqAzEUDTY#1rVLhRTXeA@8$@LH|G4|Ah;t&)R;M9od zYQZf=ON{Wi2SpLs2Ox(tFuo2$V>X)WZ^W{X?`=8URY2AP0dGBbK;-1hNmw zAka)Es7QVU@(7YRY@N^}w8RKIobeGPF(TUka1CgQ5f;afKm`(#1+cX82$V>X#9<2) zAE71EKv0x0@CiIZNu;3k4^jw{Kue{8pb!9wg9;2J3*Zg{)!#_suoHeBp(S2eqI-mv zc!NM51-1Vlp`~8f)xD3G&DC@vTnfKi3fuc8v~!fV^Dx0i8~8`?dKDCjFx&~K6{LodV@ew1u_T}cUXM(7!(yq z7Qj6A7*wqzi3fwy4#*tvMUY4mu(J9wC{ZGb!ySZ@dKnmkL2(N*2$V>X93%<7@cJ>x zA|!KyLFEZZJt#3Ug5n=q=ELgg#~>dfX$S#@3`hf7VuUrrAA`~il6ts9(Mr-_P?Uho z0XZ1q(0ceGM~^}I6UiXh@cCo3#0Z;4e~cqBK1NH7A)qJ$S&TI?*7FHGMx;hi@?Z!7 zPo@BJmR4XP z^aL%fgj9g)e~>|_i2|M`o}i@(*ws`|(9#5KW5E-&xQDHde*#MNNFE4kOT z00lkBL7=EW5{DavmL_0xKTpuo1T67BK}!>`^}kO+DGg*kto;uQqNgC2fh3^WG8B~G z8TbUAf*gjFh=iaM5>L_6L?|e#Ki3ll#;64TwEJzlI zfqV*5kCuku4nj^tAp7AiLQ6z&2cadRFi^-a@CiHvMJW~sJwr=FupQRVKm`txLqTm! zQ2R&V8K`VB<=yq|40(B zxPOLJLV-L9*8obSNb18uQ3WyxEs?@K0Ll$W>NP<6LFz$?6zl;|_=7f~K$qb>1H~PZ zhHy~OgEXKeQdq;}87L}{)WdESeTJ4uVGWaKXo-}i9^^uh1!$?19~8tOaZr$hT?z^Z z1_sy=>NB)NrwNwk6L8B3Nzq94)QDDxv3~xJI%V zmL{H~q?LLGh6qs5fP4T-mDoZ8lvt1qf>pcE(b5WR-0(RlM3B@+g7_fwK|zir4j$G6 zwf~=^B^FpNc#f7>;1-~zl}Jz;0a*Yp(GYz|umvD-P>>^83=awPi=Z_@K?%|TN?h1N z0!NAV9F)kAEP$5n0?$E-5lI{#5}*)=h(q!p+{d6sB18g|EEys}iI9O$0AvpG2ncMg z#|w}=l6siWUZ5pXD^OYhnFC6UC>{gb&nNH#tr~@u)h|G)6v+aZ&t9ML0xj{vmTbL1OT4fseu0{J>*0I4UZAC3*bwRq9I5vODAgl5 zGzwGzfkFaD;(dXZcp>FVJ)gh}P!J*;1TB(ZfKnZjIILgr0+D*bi4?X<<^@{fg+GFyhKZ+u(e+=(Gn?a zBl1h6L<&y-uy+1Sw8RLDvzKUz5jM#D5-l;peGCdgBo9P^5+}$5pu~vm0oaw6FVPZR z6ev-FG=LHjk_KbwH2O=_M8u#5G8m*D6jDg)VU^iSw6p>%8DE|N`5(!pa0yT%!X}QE zh+uO+FVWHvJmk>Q5UdD)2}?t;_CH($C~+WL42mlTK7m)Ds74Zpsegr50>UhK1xj2< z>S0my3N3Bb%Yy_!7N93CXi&dGOGHf2pne5PE670&Y8`{jK}##JRWGm5(n=I4sz94i zUV#z^vO&%#-fXo4>El~VJ+yAh{ z@(N@TlEttR@D*AC1?zac0{H|C203m}U@X$$6Iko|Cr(GnM|NPdN$xL|1l zmWW^;fQr9HODnMM{cE(e0?PK__Wx^88bI;^tZDTclqQhGK^+FrSnq4J0te>f*Jx?Q z2Nd)Sd;+i0(+V_-U!#xz!*(#dMoTQPHr;Eqf(5ox;x#A@AvqN8Aha}O3yp%;ptJ&x z0#NuPwf|p(T#RH8tp0utDv*%GVNvrMl!%bT;p)-SPyi?dKp}yahB#sCe_o>{7TBt` z*Pv{LWC3g`#%oX_LK26KdcQ_XL$H;UuhG*GC}cqG|JP`V2yOvdK?Jkl4O-%YEi!q7 zmbhS1@CKCKkQ^Ef4T(39rr7kqJnWqCO-OIh5*(~FdxMtXV8QE!*y4sapy0-4KDaOg zB|>N(h6fucg(7LN2PGVkgFp!poN__&fY_M+1}!1N>W4RI2@xI=AoF16gY1WEKr78) zHR2nz1PXU3S^|{@r5lh#K?xC?L(vl=185K$qydySVJ>1|U=RWs3=&66pm2*p79pvR z23g3!C-4@O5V2VN7A+ydJp5JyZ4d$$L~lVU6v+ZuqI(NU8%W}C^=OF{R%pFNOQdjf z;E5Cz{tOHZu%Ld6mP%pEE#Bftq;Js^DI`@3yhSTTVa4}bw8RS^gm{aVdZR(96BMK% z8e5Q}B~o}ufE<7nLa>!HZ$XI{NgS4I>ffTLUQp10EJjYH3=9mgr895Q5-DtX##^*R z3J+0GT0*iI?jT4hikO6iC9b!i#Dt_F29y>+4gw`oY$1V`NMRM(TeL(P07?rCd;;%4 zxfgDJJz_)1J5cI{OE554g9;9i22d4^WHBG~P=a?Lhasu=133hw9+Vi7)Wg~s??4Vf zQV(`0Xb|EZD9Di{96@moG6*d(!b0dBT4FQ@sROA8B|2;tqa`}n{Q~a_K=~iZVpt-2 z2l6?RIP6%KcOZu$iNmtfJG8_IOI+{J5+kf%`3{j7A^8tBx$q7xF~SnjJG7z{ZZTRS zjRA!KC?wDlDQuGB9a>^kssP*1C-4rE8sR5lz$P8up(RGxTAp`kMJa5F?mJK-MG7If zk3nezNgTGmln5F41m1&aq`2p20VQ)jf%j-7rXwh1 zK5!)o>d$hy|>$$!MB{C$3!rK1t(Gnxvp=c#z3@9ytECwY;ghLUNknhn-z(9}( zKpM~zBW$_Fd$hy|>nprRON_Ab;`bm2Ab9|iChGYF-Xl^Y*h<)d@q4ty2pP5D6L^o7 z7~$e*i4pElP>>^844ZR!4=OQ{Cn2HhvIO3vrBb+q&=M&;sL>K>ASe-nLJmYDf*L-x z_Z}%Rg3}*t{l|N>A`=#*Aoa*&fZ&pgfluHAS|Wv+^8qc9!WN!<0F|UjA;Afog#3V( zN?|SD51^tHNdqjXKY&s%k~nO=$Op8<3k&KGXo(lR{sZKJ0FeKY41z5r`GA&s;TD4m z7$o(ul`S7oQ#CxOKcFRQSd@K$C2H6pL@YSz@ddV45GbfYB_@)`ptC9U0v|xB z3(105P#iMw348=4E+h@?P=h|AB`#-B>IbPuD*<8E?nkt=1zQ*L5uCO_@eghP!wQOz zXo(Bf@%RXG7?ML_A@mU~alux+d_*f5Ve3miBBw2o{ji|>h?clwL41(UK#2$`B;Y=S zB_gN?U?t{9w2~3-F|?8q>~NaC=*+$Xfe2rGI&p(RGR z#~_K38{XuK{W1N447(V7SL7$OL}Lt!Gf+r@3M6bk2c;P#hsA+{8l)aA&A|GGpU~0_ z)M51kpU@Ib94L-K27wAHY!;){ny|@=&!DJ6au96w)MvD`1hrV;Gsqs~qj^j~LCU}< z@EPP2EEa!8OEYnxxCg06OEWMZe?}|V;1(knY@iGg2ND1o1TqlWV(7s1XS6gE2jYX& zgB*;k9y-|g87&RKn){z2X#k!CKut1mf%F-z;DI&AKcf{qu*F25(F&e8P*i~&gqDWj z=76$0Qq;iK5`9L$R|dA2=rda4f-NTcj6D$vd`3${QK0MxauCR2NFgK$UF!20o`yi- z&%nSC4)PHLpTHMTVnNaXEBn8I6APkTfUWoVf>!Xrvga328bb0hZ286)v@`@Ckoba@ zh~hyCK@LJIc!YdF$(&E%3n;B1Sr89W2T~6zN02ODwQCzAvDH z2+1H=Pw5LQvzk*@{ zSsdh320nqWpfrReE(*$~AaS%b1TGIi0}@}+5|KS9@qjdd(gc>E{)$$xc!AmzAoZYf z1j%C9)c#jc+CUPA)fHdSPelQ{2xJf_`ygpZ0J$6_4oWo04uTd?UqL=ZQm+pRNsxL_ z8bVeNEug-F91Kwp$$zkQTVFwm3nBpuTn1QC`V}p4!5s<;awPR}ptuED3`#@TEJjO1 z2@YWU`2@bAB_dd}`zt67AX$(A3Sy82Xo(BfKlloA0FruGzW)je5hQWA2kOxhR{|&~ z8TbUgff5lGAAAEv1(HFqj>b2%G!z92dXPDww1lJ{cIMbOP@+dU6$KP0APt~Ihom6^ z2$Fi3&%U80x=@hALFRzc7Q$nQ0f}#*S`EpdL{JETG=LHvk~pkj z`G!`a!3LwgfkF_QdQbs|Bo2wndOm?~prAsMfcpRxB1qziAfJL91WJquAHX}G-_Q~x zJmerH9lY9w4efpdCDM8%3t(fr-_TMi+(BrGG!f)ekb^*p5u1ZRQHNwctSj~nDKUc6 zKWrBC8@yTs=ROA5K;(B27s()459d25ijc&Wp$_^EifbfsSjXf$S|VkG4M==POQo=5 z6TU-JDQpHD){^;-mPkP@8Bm%39TY`K7Q-4K-_a5yY+Ug>`hW!7Vo)kYHV72-415CL z(Gnx59j1fo1-_#tI#`JY5=I^cgC)`*Xo(9p@B0HSalzUFKhV+;+#Ha@klX*T%H{`J zB7$o`YjVNWqooyCNc=!A&_E%;z$fqnlvZFN0m^@{xcPyWSYZA9A7~{PtOWc4N<>IO z4O<=g11$}~9fX#Kl3;h-{{WR-Fc%@M5%>X0L`W9ELjoBUmIs1q#R@v_zNO zG2K9yU94UZ+TQ<(mdKJp`5vSXIWd7e0&SB01UV4d!JsGusRyM2u+Kq3!@yt+-97aa zWFE45P&Njw7x)QE14tTRiS;L1K>|wyKS35D83bDo@)H#2NaFA)LQ5N>pb!N)6jXUJ zf}#hl1p5h!LnMP><;735v;k|v{X|O}u!CxUfdT-@99XXUg|Qu-Ijhe+nY+K#`_(hMksK;098UucQO9^_L7K7n7LS`ACo{6Z_J zQa}y?sYgpgpd<&XHGiQMR3MAN;^>DK`G5=t83Zb*uvv_j=wd)V0;xwUs9;^OU!d%Z z6cVsSEx$mC6f6!3f6(w5D9Attp`}t-9RC6pU|2FZfF@uU{X!e6!jFuREK~Vy-7)N6K z4N5ae7QmwHH(FwZ9cc3#B{9|`){6WFm6S*Z!8L$N~A~*g3XBjMo*+5hk!x?Es?@Q4v|P9`7Z?&WFQToREj0&{(u4o$zoVL z;SXAg3F}Y%0VPr-^{^3=KWK@RB?D|fpTHlqRGJDhn1N5=52y%3au9n8$R&INe?W;5 z$%0@IAEX|X=#bRIDziT*iH?B*9QPpg;7v)|)#{Xt7~ zsUSYc0<=U2D`NkkB|5l6(Gp!6D9%CVfGRa4hf0IDeb(~{`~f98q#)9U#{FMV35cWt z7MFiP@<{4oO|rjei4HbD@E7C&B=s>tSjCA6k-u`x}yC5QFWSAPYeTfgFJ3ao8aIKeQwR8-)LdmSkXq@c%## zLox@}uK5Rwakx0RH4BOYK7oH|Nd`9G`41E$a19I$utE5LXvGYy!2O4oWMDnTf5=IO zfq?;B#eiz_e`rYt9@S_`CLLrj1E0WuP*flXHME2EACxwc914mlP|Em^mNH;b^WOlJ zbdfbcbLW3hv4JEGYasmx)on=P88G!A8c7^h;QmKTTN$9V3-SP{&V#52*QW5?`5%-9 zAQGTBVaR}{)&DpW*MGFc1#9d6ha@g|nokB56CjJx(v}hU2x5=~TH=DG(*J0Q3%0%d zKU(5~4L$z{S%l;PSXBN;NpuVhVK9%?gAy0ExCE6)NCt(2;vD2qP+CD&56$KO(b7r+ z$fpc^g5Y38G6x!!f(#(@kO$i{KtTr50E#1I4WPsW5=T#5F!k8$DnSO2J|uH8Kpq8| z14>&655Nc81sTv17u*MEi3=Jvf(+ObmmmWoae+M#jRHXiw6v88maXR#WB|nl!bPyb zb3q1BqC@flv^^rofR^Z>4KP6lP>3L@hg%Ga3M6r8yGf7%l;)5J+jT%L1O*XVq7#FO zqa`}H1!##b6BGgHiV$1}E0LTJRiH6MrP$Gp| z019PjwiIMQOQeDhpxztN6`)XoSh%#p<57K0Kmk~nk(SdbB95t2CE98lCDiPu9HS_(3v zrCzuNprAt10Ikgg89}KRNgS3|7|{}M7ARyuAqPsNpm>IP3{r5_3o@b=jqo@FrCuZp zV2OwkDfNO97d-CK5-;2ww8RVDb|lCMs!frbj&L7?QZSaPpz0iRYK_;{!7H$Dr;)QvP2`%x0JOFC{ z2r_}<2+5_;mX9D4TIz)xgjV#z;+_eXs-bb51&S(ANPrSAQrruC0R;`8AQSpMxXGZ@ z4AKBfrAQhCRiGNs5@{AF4ngWci4jRX^pqz-CbSYW8)OVfJt)nA)q}#Hfq}s|1|-8L z$b^>Yj6g02X#gcIum+Gi_|7ju@YO;{AqVX&3o?Nmh9nN15fWrVOIxtTHiF~ zGswY69)J}%%xGx{mbRE7X-FB~MuR0HX0$||w;-v9mCVc_4_Ku6 zs3->)R4izT3>MTZ=!p#EK#+qVi42~`U_s4-md4=bpx3@2bs%%lrybx1p(RG>A&!D9 zXw@&=0#G7F@)@i)WkE}%aP#4b6ci+gZHj^{XsHwymn>-2uZza?2_B#kB1m;B$byzA z;ZcE>DB%u9OO((~t{@9IQ6gpy;SNTtZK0!z^@1#Di4|5-vY;haxIv&qh#XR&kN`ym zT4IGB<|xPtDjks2!vcgAls1ubj|DVsu!2fTq{J!#S!F253QELC2IYc6nt@M{6%+$V z>S5&zD_WX_j-d&%BBx1E?tu=X39^C`6_N$eu`fYZw8WPTvlvtdA*qL+$0f*$miFN0 zpryU23{W>8V6)n*vfD#)6pCB73 z5n=HG8#oamQag05tsomHEg@M9^8gztZ6S##)I(D*8(QLm`G5_rgoJf|+0aTzSQM~< z5+jlYULXrW9sm`1NFERb-wezrSkH!*=z>5#0%-sxA|ws$kShxX!OZ|93-VwVfYJ(* zdJ_{+knst!fjo$;9^^of`Jl9d<)kq|HniFlx(HVgyqE{cAXw$ahE{NifP4zF04)u{ zLkJ}e)iW^Y!h8%Wp^$t4Yb&y$rHKrf4?qPDvU+Gq$`0~4l0%_GLxSLv6GtY@;{OU*hL@*A(v1L z3=D7wfr1uEJ={TPX($hr-$CY}r6E|!$c`w8Ao&lRs6ZOf3Zg7%_G1SnE+mU#y=d^p zFC=kT+maovfP(uNl<1Ju2UvjZ=M!W{OLTCbfqa6bApsP`Acuky7q*~ANn8vJu)#BS zv;qq5(0Wj!L$Uxmaw^CUFQGuG2~j|?qb0^XkU9oFL2w$z;vf!?1d{pCMSy}F&@>01 zw1d{if*fdx4xDO17Jw2RHVe=SC|EVk0SYN3i;Y2v5M&OBMu@|&yBFj@t1kUP3PBn` zi4L2^Xo(J%csW410bv1b2w9K=t+tE=MJ>a0l^}K@*hwdX9BAne*2CvOOMkH9oCB?J zgNvi3zi3dbf&7A&{y-gV1_r)*K@PO^X9-G2APpc#B6$Y7Y)+5^t%4zmECzsQycqZdIYG$^EjfX^5a7-el0mSc zMozTC5H{4v2}+kp>S1vYzK$82I9j@dMKLFO7XlX4oS@PZ$so7}MCl1G8|*<20r?Cq z@xskPOT4fs1BW2kd{Fp<*5iQ;1{s8wN}&sU1i^h0um-Tb@SMeomPoZgJ_VTrN{mQB zEdV(kLy!|KF(%Z5N=J|eP-;Zd0IPvH(Gpz`C`uUk1i3(o2w6R}2IfLbLp`9Z4^oeo zhG0GWdhm{8EI#8xOGIiQKFA;}i3rp_GItRNR! z8iM5xF0_IUoCraUATG2-1k1-Vti zhJ%V?kOojmhsDR-pb&u=1hR?&Hjc#&N;AmfpeO;E14_I|;+)WvP6WBpQYrM9WkGI8 zDuoZ0z?uZyXo*x5WH87AQ2s}<0M;bn1|?o3ao9K(cRgC_1sBC2gHTc_18k3nAU9ef zg=I5tP*fmU084b-Xo(bh%8ej5C`6FwI^hPPrBb*-Xo(b@dO;3FOQg`{vx3~95)j!z zpr`_=2PIyFcs=ZpDM4+@VZ%Q>XeAvigm^*450d%+5TmX$@UQi-J@&P=AK#3ArJ;yx_D2ihpSPA8s*P;!*%5Dv&{- zM1;*^P$h+AG4v)pL0+^pWDAN~kU7W&6v%#9!NLnl16VBJ1BE-11+apJ4^*NdiNpGt z;D!s5ILu?^25^*DEt{17?MCf1!(|91(F4DpMeq=l6WB~QGwKhq6nKq(b5pyVze}5 zUk^$QAcN5AO}NiMMIMsHu-w59N_0r#aP?@34lWL|2T485WA*%KMP3ms=s<}Ho6pb^ z9jx)lkCy1*7NaFP@PIbR!;mzGSnvu9B2d~wUi<_-e@9RNt;mBJBmmNY#b*MbM1~|@ z1PXcvK0yIcqJ(>_o`Jy-ypEkuPynr@D*^>2NCS?7-5Y~fdy!t zKv7g%py-utX|=mgwN-Bhnls|G}2<2%wdKu+9G4Kh3N0N~wU_KB;OI$FA3Zf-0m_r3&jXPMK0(Gb$ zDA6IA4~~0~z36xD6@#)DNCHQq6GTgNu(%gQOLVYYBZ!vhV1qw`&@>kWYpBD0j8+1| zHGmQ$HXooR#*%>P4jJrX^@cE?qZMpLpeO@*5R{g%ByK^pv{VGmRe~V%knD%G}#e0wp>m3t&w+A+$sXk4v;f2OAp#51}HN1KqnVD2$f2U}yOY3ZoTNaD&hi z5iBHxkrNTp5&>bfG*kj|AOoMEFenXyeGE$W3=D>lE4c;hh0zjG42TcX07@)K8emO3 zVYIXYOLW3$R}BXVYC7b?jTU2LsDM~N(-QNg)k^_ z!Cl0_UvhpYiq&@k``f)64?Qf~mhEtF4C1Y{txdQe&bsRyMkB=v@%f(#_C zfYz=kg~q)IC~+ZaFz5j#8a_c0kb%e+KpiTAmbeT+AqlboWFE45P@IFr5orr@s=5Jm zIfe+xKx7S|xCLndB_d=8feZkNgA7DgzhQbpKD(HdJ}9U`@*w@l@+YQG0LdGGLJA}g zN(;#H52hag$?HQ-w-XdWi{jEB(?5Xa*FXaVt+*%?n66L&vLEDekojnJPnpK_0I)oC zVX!DDCXnnebC})$lGg+2W8f16AK`#3A2EFcSROi8B?{`CBg+>|e*l&TWk!&Gw3?u- zW4b^gyV!I;DNZ&KK0#5CGGy%wraKg}i%IE#QangIT2?IEF}(mR4@#IId9*B6c47Jg zuspP-E(%Hq$mYM8egP~G*<36rik4H#8KxD1tOq4Cknx~=fuy}$V!8oX9u)Wte1c*i z8d=_8dICsZ8@hT(43zGX$vh2^2SDPW&_q@b z4K;DJP*aEI330SgtAN;BFDMQQDI^QjKt2XpfR@QCp@oAuD8!J|Ye5Hw#X+eb$w8H% zWW>NHC;`gMNa{5~xd$W;3Ss1iW+k-rk^luIk_I&pAEW`4UXU$-83ZaFk<_cUfZ~Qv zPy!Tk$m*dXB!L`4poWgh5vT^VAgY7}k)Q-x2&upviWWjuAY(ud1?fX_kQzuoNE{S$ zNDit}U|^WOsf=AjO6?9vE1#ewD2$O+cuap##x5qM2D#2oP!bfT$nqJ}1N+G8?1_lO2Xjv+SmgK5INe5&PD9IqZ50pMY;-G*;3V<4r z$3er;QfMItn+lXd3$YrI2O0PTr9mNsWPu{Ia*+n-O6ce=0|P@1C`EzPgY+S(SAfQd zG)NyasMQP|GN=KC07wHUq>wdi0eOK>P#TnZkbN*?xwcuLY$920lS>haAbh^3XgZ z0}3c)_0Ry3K?@LhXxl{w93Y4Qtc8S!v7iiEfXG3&P064ING-^NAO|%}-yp^*QqLzS z1InJrP5^lkqypq6Bqz&3tP+$#%Z9a}GyqZ$O617uAxD1+%7CgAB=hS)X#k`iR1>Ho zX^@2$^|GL-MAl$1U7?0utX>w{{*wh6fGiKqb+VwaMm7)Ho|FZJC9--@kTCEG%7RLM zWcAQAAPX`NSv|z#^@6f!VJr(x6tW-#ku`t{Hjo9NY>i}r479S81sRB}9u(3b^`MwQ zRu645$%4#d&OyX_9Vq{TG=L%#Sp#%unk>jbWD7u108$SsFOb#ifP$J&P!?n!vicv> z3u-~zs37@YP!?2fAj#K*VgO_wC<>9xlL93H20lSKkg>?>L8%rb4$_CL9_m3kP^$)6 zJt&|-<&GRkBeDi)_K*Wb9kK>ch=MEtX+%~J%{FpqF;ovKFhS};`jFI1f;tiNiYL@@R1n>xj#P(h`#ThK}hC^+=nILL1<|V9w49wB$9e~ zfPhK|W>66VO=ArorY~qf4iQjsfTR%~BH-cxQ5wJ<07{$4>Y+(Q9z-LF!$SnEln4Wr zd*BcOC0Zm6@DM>uwD1r?PP7aR3~&d5(j1aG@DM>uv+xiBr&&;{hlWTaC@vZJ1m!_# z5KAtSM@xg?<^lsBc%A`ymJF6Q6wuP34k!(Q)FaozAp2n}2^2sD7LpHOE>%EFtc{>J z1{nl$Fcya@pd~)o=?w~?AV)JFJUFa?miQV$aR{;il*q7I0CE75LC_P)1r@-F43Soh zK|v2P2UPGOsfUelDm0)C4#RznmKYmBaRo96l<2TI2;^WS3*ZhyOLTAt!P6Wl{23Tv zXQvA)pd~uEgU}LP6DSTr4gxt0n}b049mzqkIUsOUBZ>3ZgIo?W2$blMB;XdKCAub1 zc4XiaR0Jh1EEX$*9EN0$C`dm@JzCm=tRAp3t-D;6wwkL z^tLKNMYKc*4grvZAZZRUI1HCSEAe29G!;RK5y@g$kSd}jMp(XAL`#gY5LHA;jP(o* z&Cq$IK~gEa&kakYN@$4`?g6w!+6)b9aGx8S2f!CSBe~QOU$-$#0VbN02zdq7-6Ye z31ktHgJ7pIfJY&a#9?Vm3AJRbXHWwrHjo8qZ9-V8RszW*8wBzxNIhC&)Bxpo20lS$ zw8RKY?aFA05#rE#K0#$fY6NLzfVor|tz?8HB4towL~;;Z94#@z(uy)#VuXu>5+m}; zW4J+}G=O9QTmz28sEn2vp_haUDx)PvSXxm=Dlx(7zZL9nK0)wM6PCoHjF#x&4h2O8 zl0#uLn#!QWiX;yA09whY@B&o-gW?R7N|7|cT?$R5u$2)lpj-h`4@z{{9Ew%~!pZ|> z^b!!1);9TtnhJwGJ%u-v4Amgr!sPgP)P4z}_b7Njbm z5)jz}=*Wr+T4IC+DR{IL$zt%TQwBak6|}@?1PWo0I9g(?hwU~|0i{MHgJ6wD6|}?% z3n3M>#MlaobC3m~kV5tVsLufs2W3wr^P!bly`T!Hj7O4yTL6k{B=J^I0R%D#l<2To z0CE75de|CL6|_VLHy;!t$Yb_xpdbcW04f2oSpaeXk_GTM1|>!$ad;e~B}RA@gAyam zd{F-5gwDOHpcah`@Hj?GjIdO#f>tuZ)q@f#l7nDTsS3*GNaCQ70Jr~D(Nbv}D8DoC z396zeMrd5Bfwji{vv<5P`bks%WXV4HP9H3qT=->;YH^ff6Z_ zIq(odOQg2-pr8R6gqBL-J_DsvBn!BpLB}Q190C&2PcOJrgtOiPqNEU#%Ml$dTs=R}*0g4ik#UP&}I|!QE)zA_n+{b8%5$t1-If%pv$$xMkgM5f= z0d&Y#4J|RkeFiE@k%Ag7j#iSweGE#xNa|r{rVD}_p-2)PpaO`2Pf#5cBghVd`dA$l zB1r0C9#BV1q#d9*2bqJGNMR0DuSY9NVNsxtR+M&t$_J1^ActXd5GXMsIS4jdrjC{v zVZCN`ki(F79>PYm)X@?nY&<|6lo*jLfQ@FUqa{YT1!##8)-6{@O^k@+7t}#TDUt;p zpg0Hl7*u3p^D!tykkrExojNFyB8hi^;v8fSS|WvnbUmM-I$A321O+ij1IPi`EJjOo zuvD#%mgwMV0^|T>b3jcnkolkz6S@5lPZVfHCd?pEl0eC>P={)uB}P~jXrLuVnE4t= zi4mOtVA(?hM`F|f*^CsVouIg7;1kpUIRM#b(A)v;x*@5DMU4hpV(gp%ZU1XPQzNXM z4~ZK-K@GIT*ab=pAd5i`z-BRO;$r9mMHNUrTH1njYBeT+{Ey^P*l4u|$RcdwXo(J7 zH-IcaOLVXkwKUMu7A#w8z)C<^`yaOb9lV4Q$zs?Tjs_?(B8kHt3i2V6INThx#0VR5 z)c_?%B=z-h4WQJBBmuV=EiuA^P7_ozBB_@IWiJLkK~1#8XaFkGLE>nM5!%bH7t};c zbl}NrkOs6w2OD|0Ap2pdT@yX^g5nCK0hAb#Q#-VktcjNBxIsPz zsRt!4Z0ga{P}czl202jcRug0qHVr?fADGQ94ss&{XbAx%pg^t!T{9%8g%;J|9nB1U zf?A*$MK%svENG#{D6Cx5LW@yo*HBOk8l&(rD%hB^7RaNp5M*Fr;DM$+EpU_~2F>6W zpv5Q;DARx(idO8v%||VE>KS-JF#ytl7S(VI(4rbP0;7c-)eH;_a0@_Th~xoYQ04=f zk5*1W22|?#1hqgdvPgu_z)1rk_D!qkYV5x)J9LF(59v~D3OBJDkDM;WIvyvHd-p} z0mUuIAW-5$b`Z=UP~s}X;vm$-#Q;8x24oH>O<*&pW4c2#r-%-p$a|2}S>Pr%UV((6 z$a_#+Ad5ekK4Ct47#H{sb_NE+Mbb9OpcEL1xP|9LpFgoH0(!s#M04l%1%o+}+WfsZ*|NnmY|3^)-lE@E6 z27#LS$`wBp|2I}7Gbng4Yy=+|X(9jrzl9=0LrsE|$O}dWf%^Xp7iu_|m(~Ag-%^wO z!{YVB|39W1%;glZ0EGw$gG>aO24cTpYT&SFYWVT`Q3HcT0uuws^!f)s0zkT}pMq>z z^>w<;LUxDA0=^>C9U>TcraR2#WT^+~{eAHN2g?Ko29Q}63=9f2oXpE=>ZB_`=36>2 zF#JyZe*@&=-;Mtt{9gF~#Y?3Ifgg(h9WA&S7$;^juuSx1V5s3{-(soB;NZmY{|(4Y z5N=r1Ak%QDLB%HN|9^{QzlfTn1_2h03Zk?{Y&;~a)F zAbtZQLjj0>oz%ebdQk)T!2g#@4dCWY{q7e5^?TX3{NQ9@sNTb%P~ZBv!lHqR!6K>Q zhX=#TgCKqNDYq-Y;t5O)9tBB!dWl%?WvCC;WH1Qd%V1EylH)}{_}-KM z>Q_#;Tga|p#S4y!`X|3D>JNXe@L=G03)1={k)gqZf%hed?fw6sqz8l1RS^3{B140P zBEtbtY)uY`Q59!pU;xE7C>(z%{-5am|L<8327%0J#f%CG6`2eQAW6&2|NphS85kjo z{!Xk(kgjl;%aEhp$si97gSiX=V8fFd3@RARQfieM^lFotL_l)-oeT_)^B4?XYBLDv zuLQGIUT`un)Fww)OkZ%DU8z~C^KA;vQ0|9?vdMg~ye*LpH9 zt68ljQq!qiVadS2>%qVvQomY*!BUff(QzJwhLZz>O0PEqqkb0y*Gx|a28Vh7pMd0N zaxySlYBDf6%=`bKW{F3D_y7MM77G}_W_ths4_={f?)Y(#@x+gZj2C_~GT!*9$oSx=BjXDX zhK;qL5COTqre3 zPQM@xAPYg629zf}7n(oDvUvSoUwt4fkC^AffwY(=?z(oGSda3I9McpDE<$0 zn9E>deE^)bH-KGw_;bbdoDxQrgqKPU7L{J&9W|Umt7;XzL~1pem-#iYDE$Bbe+vjR zFff4XPtf|`3k(cQEg&%vW?*1k!@$7A17gE40|SGFg(3sk25ZpWZctkkJZkFMw`k92 zkO#TJaqoW@kmp|{H5gR?H%qBu{-IZs{7Xc?fq}ts-+zsl$_yN!z;M{d=;QtWzXZ(0 znq>AZAUDh8c>n)X0W#rbQiB1wsF=;Z1yo$rW=2;w650_4lB~fdk`%22KVB zkPQy={=Wd}eZ8o`q576tO1<|b5$m}O0UittHsGLlzFYwcdT{njyuH(M{Pa3!xIG~oSn4YkLUE8(>)#v}f zr3iMP|9$dOnL(nag?$UyxOt3grZ2e8E|UT(1ik@9zX~!dl2s@#7#vfd>O8c-kG5xLzz|sCaRZp}?_;(d4Bvg9X%N4UkW3 z7HfljT62Vb3&@uaP>U>3o%|PE;NfsG&r4;P@BcD@oGYjI=K&;*>R5n+(EI=IUh4z@ z|9Suaa{?Zbi?u6WJN~}_vUqwy38O^4_y6B#^cOQQI?Vgi1NO>8kT*EM-gxnlp`fN- zy3(av1$JP}V^BDpx7BH}RFf3XLieOMe@c#eD0qPn7 z@BhC(f|8&2|35llI~o}Zek^3D@L*s!+zHYE4zEUr0#KMaHZgR(RA%siT2=!NuV!UP zcrDQerwRc`c>TTrk_7p2ddn(ym3mP8JI?z($NT?(sNLEhy#N35gxLMN1>zp<3*P^K znL@=t4N*uAW`mU7zZL(VsHv2$`0e=rf;F`6vrb@O0M&ceOaK1>)s^*!A+`8##{UPv zb>hSSKYl3wuMg~C2B&m|dd<@n_4cPLJQx@RdN>&v>*qhN&~IQ+u%6GrSa0{h!Eqh~ zhr^8jFY0GL2&kUHpis|zxWa>B*g`TAILu`5u&!oc)R$)9s;_3>;xOxf z2`v6C5*WCr-w9*X5P*wRGcba)H%N4PKsY0(HU}gmK-mFQa)N96g$xDW|NqSe6~P`1 z6H37jRb)6YUEv|Sta1zc7Bq#i5QY7%Fon~s871X&ou1Y3I6bTBb$V9At-#>W^#4O; zHv6&KZ03sEY$=iH5^LF&l_V?}m|uX36eoxOSDYCB|MC9+{|u=71w|7WPhYx*-MIdx zQiF#LgR^u3!@Z`LnhXpT4D82J7_M)tRrb7;z+iH_hLb_4g1Mv#lo-I;pajT85WNaV z5*TJLMd*DT4AJ}je5K}#LlFHBnY{o1hw6k-H7!yi7A*{uzk52?gA#-Nq5uCu#lH1D z?F3NmX8-8_e{f>C#~=U-m6}>EEX~pSR7zruy}6$!-D~mAoQC-%?O5ymx_>P-ixG$3{Xx675)~@44^EotXk8+ z%)kQ5(GK(e3s@wBstM(VAk$IYeL$8&Qdp@W1Cq6M8eVELa9BV1{~KH&3jJGS{Q#7J z{w)ECdH?@6XS%^{P7!dU_oY%p#>=DzaBT*PCy>#g_yp6C4BhxMlOe$}0TS*nm>L>h zIyDs3W->4P>B$fQii00=3=E)7_YY16PEb;{fAs&q^?&UIkZY{}GYD8D>lA=!@Be=z zU)2BqpuZRtUH@Z05D`}@u($&C2|)4m8q})cU|t4mk9aU>nt~h)ldt|SuToR@Q)~JJ z77oejXPp??eL(3Elr~>KYKQ=*$ps7yAU|5)X9xiK`G?~FLQtBl-~WN(HzZAZytHTF z)CaXK_x*p&=H2u!8Jy#EI*6d5Lf90p1zvf|9(pg>81FEbf9rwgoS z7q5Q->Ry0asVEtlfq?Ki_Qa?A_w|G(#glA+_A|KMc!QmG-JB3WLgCX-7-3l>V#AME3VgibxkZjim; z&}sbtz`6la%!6_)$PH+r!~^oX<2(ivq!9Yhz{$W;-|zxt{}WhfIm}})_&uM20i@nx z-v2AGaC+VN{{gr`x$yss*9ZSkuUFyVoPJ|HyE->`e+&bt?aVS=ZVS5tR}Z8)E$DM( zy2loFWx*LgmN78AbZVIJLyLjI`~N%7=`~x}wUmA|zEEUf0L1~wTu|7)P->U}67&B5 zf6t4ghK}hcwy^K02l*1@BT!id^0oCnodci{26b{k=>n1t1i)J*KuHP|imx9vY?x5b zAmTWOVS!E4|Nj;(Iu9)NGYD85U|{iJ-~rd$4fPBHAhk6q>{}e>GHd{KXDu2S8NC0$ zz6mm?rWV|I@O%NX$b&)PB1jOTLAt_m4#N&mMzKiNO{ibWzQuz<2wVYzGRcp61`db0 z3@1Q|64YXV1>tm1e&<$dfNIn^F+E`$y9W4pnwJRC45Cgg1aUO$(#lm`U z!N=mkzzs_L4EoLg|AV{&s{3CgG8DmzF;I4f#omubh6eBd{}@3Ay#TZSgSRk%lLjLL zxCINgn1gAVehUM`>qiX-D!Ro}Kyh1h&$t2b(enSlWjq5ZcWg^29OM3>6S}!G$ z25trh%WMXYDWGJ&G60m!Kj^oDJC$>+m;V3%vYsKJdM|^5^b>GAma+f;RC;}A zvh-qLOab*YEfv7U0z(bAr=F!I1B(;G{~w^>d#Tj00aTg1=wx7cv66wqgF)FAB(A@Y zfdOQw<2(i#klq?@54{>Wh~D~@;C%MsMK%KyN`k1zFiZ)Yl0d=j{r^9Bizhe;q45U_ zLQqhF3K#GHe;Pq?=CF?;2AUdYc>n*$YyXHr08|)Fs6Uxuk*T}F`v1uc@Be?lPN-*K z0f}2=>K^d^|Mw|~Ei<8>fx{wG_lEcXzgIy56Y3dwEHZUJc>n)?+`~mJHh@ z1_4X$lNlhpYq}sKKrc8M*lIGRE1)$r57;g97<^u2pUeWW9rrQlgdB6wt2u665wf&F zuI9ORg+&7clf?oCCX0g%1vSsvx72zBS9t&byYodNLm8-?o8GgFT}GpZnYjX_qE>^g z%%XvT1*8L{x>A!t!TbN;Qkd##){GMMAg6&!3Crx0885pT_+VCooT|Tu0W_Rc2(~^` zx&q_`kn?L9oGTpXF~FQ`@gkdn%iCi5oAFInBepuyV*sc#BFww$rFNDrZ3206sZRdz5P)9ujs+h7YfQF77YvxHFeSz z77G}BK;tGJ3==v*;-Hi_c_BlM1*aavJJD77ooiAiF_<53(DS zHlPt;2(rV2q5mVuT(CPHGSq;43=#*~ZK$+`&-~ zY6gIMQ`Z0W6hH-7O^tK~s9*yX6JV?6f^&>w%|7i4@BjZJLAk?WAA=3Z3XrovPV!*r z4+J>@gX~PO8byW&psEvEEl)33;SdCOfc#k? z#XQKLNRBc9J8F(H*ioSH2RRDtIK}^pHG4sh`nMJ2D93pW8lbQQ84jxWrWdGiNP0Ig zFo0YLa*+o^A2`C$T?q=X$p;x~Kmj$mk)dJoLXc}^PJ&$9kjT&hGZbW?1lXzdP^W@S z289*OSs2e(RK2Lco{O>)(sv-MsiyM5pLrJ`G@vy>-q_@2gz+2gxw}- z2-1VgZJ=o}P^5zLc+DM1V+9tMgyXR*5@a@#dkT=;!-6dyCpR*5crZxxg7m#eWa#67 zMdtJZ6%Iu9scm3T(_>{|1Un7X#eya$PznY)Z(<_@2dEiUW6xdTIEmo{q%Evh@q&?o z!QueJoga+<1+5n{6x1($4Jwv+!Oh!D=?c&gvEyC_3l9c{m-~bw=2Mz99?`05in9HDHnfd>X!=(RbI%FA`K^j5*V8?y` z_rTOR&i(%YWPyb}qzl&A$iM-rQbFkyls`d@%G!oT1yGlup_YN6BH4YBelr6zXr#ws z-~TgEef0ts2@Fj5G(&wm!TbMz@EJ=C3=GV$W-utj;m+?JQ$Ya_jxbPuXJCLAGM1Wp zGe8+_q9PxtR1yPs6+op7yfR=3AYe9lcoK)%3m|5LjZOu*fh42b!IMQej9!5-S`=K> zk!CcwAArN?4M;|VXFE`h_5ig_!GWEu2kyH4Q2gEK{r`U{s9WJUkHG;HQP!XuuSM?x zc!J~r3xoInKeC_-%KQI+U(hs@g(6GCbc5~eBK08CERyw3c>n*e3NisC>$va#6_5!a zlPp^FZXitgebW2?fAIc(a4VXTnBu-o6%_P1JS+ME;aibRkU|vSveqB`{{fu;KvSmm z;PJD@nr7vS*Y_FNy#N2t1vLXfHLa!Q$%g8C;wd$mAN4@l!Eqjg%S(9%He09v|80~0 z|F7f_PXP@?)oMD4SbEtD{IqAVu*|l5@H3u)!-Cyz!_RsK0ZRr3#vk$w1{38O7(g8c zPy?C;RL_A&3hJSC8>l1zjSGNXg;Yv_(kW)8(}JjIA(hS#q{0eEr6UY(6Cqdgpv*iy zq=8W~8C2tdW|0>#_<&2wI%#lM50oA-Yxx%Nlqxvn!L__T!{mq1#vr7!1=a8+9t=X@ znh{j9Q|Q}faCHf`5bRrh4jjH^LR7Ir;2aDJZ&)i7RKy85%wyoFRc7A;FRB9?7-iuV z$HMwG2a03R(RT4N{g;enif(N$ID==^zkmrb|rJ%%(d$qxnpWv35;(tNw0}Ra84Q4#4!fJ}vSO8CLUUk!;24e)x1H61<4?L!GzMNsYo2M*Zn4dCt> z*d|CuK(v`4Igc3>(4cm<2Lm6tdPGU*q-FDZ@L(F)GDtSBz@E+dM8UDB$Z!D^0Vsu< z#R0|%pm{EPr~m&!v0xpg-vKJa6lgfeP*T|=p3<1eP*8nOK%-$HLxnyY1G5G9 z|NphBMj|?^85nfb7#J!w#ZxL6#5*h=GBj9p{{K^Vl1Ze|oq?g!!F>^Eco;P3=QxWo z1T(cq&1U)1=RnpU+KV5o4{P*Fz^2d$61U#j!ldSmTaIJj6uPY zgMqQ;wRJ@;C-XAUn3x9x14pYj152eQ`>|S2?+Vc5&&zrSh8j*Lk@^J@pvL5z`jru& zmgW=vRtDx;&WHfVc?=&wt3kjHsGrARP;pE=#nScv|C;AUBA`VGmg@ii)Vc>DIVb?` zpc)P)5zv4DD44+^=5iSnj1AuZKdr5=xm{78e7gdaPC#h@B=7zI(^QaJ@Bd!|LDA~a z^v}gYkp-LpUmg6vVY-6?hfaN?Is;2%Is*sT8=BD-$X;-q`(LJ}P9gvlCpFKLL_qCU z$GQJ{y#N1?usFuR2y%U`x{*i?yMbP#CL{8@{r?YW zNg!l67}^j5WfxHP0fj9%`#@%o5ZB_{wVh)VLxTOH|Nran$9=A_ z-m5pkgMmT9`~Mf#`hUMGK-1ukO$;%hy!L{Tp#WqtXnGKo%t3}(9AMz^{{K-_znOs@ zBYJM}J3s%VSXVgQoQyy#Iel1UDE#1zd~%2@i(yub}b< zl7SdhkmPPyEMVY@@L;F_w>v-z9Of~kfJ=6Hh6=F47QG1;`xzQ64lo!%%8C!HAj>Ay zGt^k@XV?G|vpB%u;QjyoTWiqLBSoeJP$YroB0-%xNzlr}32?*oUs&vCm;f#d4ub;d z{Zfb}`adl8GfY7e?}dmPa9HeTn1Li-3Kf^I*v~KrNjw%Ru3@pC;RTYoYdu)v0OJI( zOI!3n!L-5q|9f4F`wSJJwCu3=zfA)p!v@Plh7A>5ZAulK$CM_fq8u4mmD1a;isQ`D4U?aV- zoCE5LS~M~gLDifEr4km9BJeONXb6y{9#orwDx{iQ(BT1S1yi#}y8@K6YUUzF-$1F> zB2(`GsB!`g)`Kc1>;ESkV3iZ7N#Xtf!@=M485%4Y{{IL0XL3A4M@=;-MKglu)L%C> zoUnWJ|39eSv3L4k|Nr+N1`DeL42)La?FA;?VPLS9uzT?94+DpFl--8kG7JLN3JeUt zV;BrTf%4miLBgWNAOO-&Vqo$9|5nyQo`Gf39R`OVGLRJg>korR4J&iSZyAOFixz{3 z-!=>ppak0@NMkGL%dH;XY>iz!_xRnkH^%wOF z4IuiZQ^N(DL;wH3Olr6R>Lva3k7H15 z;i&NAA47(vrd`HQIfjCtc8nUJC4k=lKX!r&zX|mWJ)l+@Xw)5)FQ?lma2W8sv}53a zIynP0EiVtsrJw?o0bBxu`f{LtTmvUV52z2|JBLBxMJ7W-LnlLr_y3RJ13kg2K_?P& zFf9YcyY({$mhk@qRzJYYWZAcX(hR6EQvdvS1*ilAwJlK6%RX)J8Vpc~)E^W344MOA z@&5k^yy(J`;s5`dD(Q;pA8xUWF+Dmv{mm_QDYu8<-~wp?C7AkSpDRE$8pwirkIOLq z;I=5Nj18}5u&SwMxBy;X#lgG`RA)^$C}mXChb}F$c*ejI@*Lvong;M-_QaZH;OQI| zP$B`%m3aSu7&@((Q9&P+EiKg;SZZEagZp}+>H=1HG)@0s#Hd)W-@?FDlL|`T3<>%z z3@o78YW)`Qx=tQY6#&kI2@EzC4GfGf3=B%3Lf9gK;lIy328D`dHt=wf1w@_&A^-nB zXkHhhh5=a(6RH}PdIg9g7O)~%q=9JtRt6@}7(-2)GHA*uK))62I0OAwnB)HchdRyy zOWP=kR=Yp2ffl@rE zgaeI2S~P+dVm*Ec%D*5sDEm#QKPBM(|0#H>GPDfPcu{{!2qy3S{|Tf{ZU(O=;sLD! zu)gR20#x{dJPWETVDmieObiS!ni^hAkGack0G<`J%s$m&tIePQTA%}-R-4D50a~J7 zzt{uR!W8(C$-n^0@ZjhJWhG|j3K08eCIdrlLNsVh^a>~mz%Xdi!-au?38V%l2BJaz zPBd}IUMmX*23|A?28QXW_t@oGEEpJAr{~;bmjJOiz$}%TEa{4xZsm%amD&|G$BipM z>!v`fg=<}cD{51tD{9reE5ItjtG8;_Kst1wi4#y~uI7|+1*EO*4AaR3YF>c~`P#PR zidy&JirS3m3Xp?985}m)isBp4m=ShYFeABw5#kJ74rW183Q?&IN=25MCnIbaAWPR? zWWtucJr1r&esL&);rsa-X3(;?htu=#v5T6(G`z@UU_)^ss4Oi5tu|%=ZR-F9KN#1P zF)f>3aF1O?r6vV317nlKU;s*o7Rje3fKs<(6N3Vz2G9FAt(Z}S2i*Gwul>xM2};Er zARQpplN*9W>Or!g=P>Ysnz0UZAq^FfITkGjpr$692Sc7A zcqj!_$~nwqs97M#Afn&E0a`(CqTj&52GZy_j{&qe7QE~Y)J6iejU<)l{QqQ8#~=n; z0qMcO3!ZU-mGYoo1Wcg>xV;ClGr+-O0RyuKL!K)rYl5tFocBKmBnL`9&>#cXH&D5N z8Wrve3kGB3Ei90hK4^a4gCP&R0|BJQVc&lj@BjZbEKpp-2Wwn`oXjbJ;vDdlpgMF) z5L7OKf(;bp$Ym2KSiS%M*$9fP08rTkiXYhG5m20fdLN*b5gVErcxsktS6C!7utD6P z0}g*wKjp-N{0r+Yp$sqBCNUUTYG3F8MKH(}pe6z+@~t}=ctDndA{%63{k+GZ+PM(4 zU~vNXg^mfF3@o5Y@#+V5DwFpyFjPPGT~d=E5l~Yv5m1pVo>EgIC1U-bfzcwFfd!Pn zAdbrhPpRt9XW%lJypQz>zH9SDx0(k{A6zn*c zF{eR}fye$4gMsz`3muR`llhH)1E{WJ6|qcU-~ufo1O>+iIR-B4eGDS?CqLJN${U7- znGB$v7)&(`Q6ivzeFbL=Q)eCMj3pL@8U`;B5MRHWK@il}uVG;L0W!dG9?O+xIR*j! z8KCl=c}b(a^_yA+k015i3>Nj>pp~Y~H4XCCFX|f(FgVU*$!L(be$p7vz){0+sG^43 z!=llifklVAo`J!kiFrzWmxqJnJl29rZQmu83U(?r3=sh}oD2aK+~O&qrA3X|3_SJS z2N)doF`TJj5KpnTXW*&d$s__AL$Z!Ccwk-2zyfO7TFheLfJ96dc>E2Nq8;ZkKk)wl z8$3#8{g;6Y)KsZYyIlcFQ5NRdFz|UWWP&HcL5k~J z*tdB9{{uD{K7OO1&7)bu=BGW0xC1qp44VLiBx8|Lg{8O z4VsOsV0iH$gqy=Agh9dr#IIHG2ml2KXc-Ew;Bc7te}b(Ng8|t4niuM)fD$z*94Z~` zR4T)Lm()Gj5m5JPM?lqg@szrsyF{$Z8MvT{RtpqP9t;^1K{?3#|1a=BouvW?L(_fh zCmYQfq%0K}*g$QSndacdP%In786;+!GsuDlB{qmN$brJwq8zl3Dx(!-#-!`@3~Jzk zm<0@M7Uc|D9t;`a$$-h?3333cP-v9qdfY`9ip~KC< z;IQaV1!&KMeG+JSF9S~nr=3a#x9^f#&4_>+29E$xKB(W%Bw}4{@WA{3pDUn5)9~N= zgX28LJGc@KB%xY>@{x%5|3CFPFagJXe-h}Ga=rimRRNV8jq&xMk)^*n#Q8G7!~6g5 z4~_QLPe8@WL^}qa333deT^;C|9VI|hjkIR^0J;>J1#9+1T| z7#S)-dM4I`CJq=G8a6626gkdgP_fkf|36fl!KQw1l!&DrgV54U1}4z@KTx^oFz^2t zSRrbu$dCt;1Brvy7J|yh3I;@3iBwKXdH?@412mRe$;qHlsipR$Qd>NwHaj4oGE41A zMs0SGNM#nNPyo@OLLo?`R@+OYQuD=wP;CyIP)!L75WkkwAz-3BsJH*u2At^^Fff41 zKv16d{{I_%N;-I!6gs#F+GYo;8EUd2(>2o#(ila+yTj^1yTdv_wY5DrXm<#+<2=R# z`V9;mj`J8cfO^6X^B5`?vM{iKwqPcDT`8;Y2mtSr1Pz-lRAFG#?_^+fn8y$SDt{WY z85kNpFLcy*MKCzbV{id)k($R~GlBC$2PmCe*hBV)y#{S>0WBhT{696DLlWF8gvm`! z;83ZzU}Z3RsR(LUvOTF`V7O3Y#a&UW$e3lR${+%o_y;X@uuNcZ-Du0e1X^u3vzCDY zv_EF1EdvK=0rdn~1_4V22FA^`3@nxj3<5K488|C;GAPWf1&gs+-(?V)JePr|{_y9D z&2t&J>QzD8WRk(T+ERfbRd04J19&GKC|PWt%OJMUj)B4Y9s?7o_Jh@kSYue0LCj(% zg9xZ`25Pu@|Np)gyha1Gu~mwJq2BRw1&U8QSQrHL8yMIe=P~H$H!uh~%=@>)qV@lT zj+G3I7MTn(6)m8Wl@mOJ2MR*a_5n4x#QXm@ z&>m@UBO656Dlu>xfFv6-t)GBf%C^c1;QhBY4E+BS82n(jKCK?)HxP!&HDp?Uz@zVt_x~?nK3eHz-$Kv189*$%~JL)u#U9%|6dB7bvBG3-+*j&nD@V?vCf92 zK_1lZ1aF_oX^^wwsBZwTMz2o*8D6O=qhXQBAObSndY<(UP!FMEDJc8Kfwv5Sf~$gi z{$qzl{|y$}GcbiP$XI~(!mBa|NjGD;RDY1EDQ|VEez72pMXq!630%elY`^{#;PU zf>A?%E_jzJd>=5Vhy`!hE&t{N<1b;Mmux|2i1~u@Mbv1()R2;k_bh0#q0mvdq zbNn5+LF@hhA5Zlh@f47c>Z>1#KnM9BSnpJu5m@sZRPKO^WJ?DI*9nXa z4Kp1X3M?HM1ZFxi6k0Gaa9BDp6wF{`XxZq7;P6BzVh9dJuUh8AKAU{IrW10zG5MFVII_T5R4haj6Llo$*eGB0$1dUD>?3@Qtl8JP4N*e^QHW0;e}@&CVmM+2kdJO%~*1_l?$c?H6J8E zjf@S885lMkW?RV2ldXE>nl7MLK8t=w611gwP0potYBbJsI_4dso%q_S6$7buz4i| zlf`TX5ev|Kb3KDdMGK2U!qNstivtX%-v9rBgRkK~>j#V33>u)J36Q+S0tP|Q(3|)F zZ{UIgBwl|6G-UAx(prS>ynXFB{oZPJ^?K<15Xk=^e}F0mP*WOIIe_*RfWiT^=>ZfL zpfPGtSb@T$)1HB$M)pGhsGP6WWG@NTW;4?7W;kH6l7SIavw>}&pkY)?eHue8ZA|L_KiWrc=AaM*s4}Y#eH+cGk@9fIF zIj|v8P#8}Rh>-zL{)3C27E=KahG0lx3H3Y3gD{2QeevG^|AX(y1XrW1;O4WTrKV89 zgiO{Cu-Tk?P|(;nF&Kh^z;2PGv?P+3=-3V?#j`VZ?5a2*Uf$p*BJ zYZiFQEf5qN6Id7+K!?P5Fa&`sa!_ds3Py_-gAX1IA>bAas6ca^#~_0wSO3FA?^JUhoFhD1i_U1`k$PA7)^L>fu0=1IGhM4@k^$9@8C& zS;64Z8jyO>LKy44h5{9pSu6@5NsvMhhG6gtG9-;xKyn@o!Qkb?_4_0Os`s)e)XzNu zS`frhZ+p6;dM}HjV-o|9_FRVl4s#h?K$A@t$%Yah3~}I9eV|^91@sURaAy!S{aJtH zGkAc`gCPjKIuaDz);4TEYUE$80|jBdGN=O=2(ENMLF>T~2#)A_tN{lE{}gaC{C8{u z?+*r_+X4!Hr2hGZ*Hd#j#C1U73v!YNga1>IPH3bVcre63N;+tSfpmi+O#`IC`~S~} z-v9rbKotjgFvNgMB3SIg6bFFPmj{DCIL07p3^|DffcJ@k{0vHR4)gw+crf^b-Ct45 z0@_3fZfj1Eg6tIo&9Z@95Mh1q|NrWH42lj-|019+m|@WX3ejkAAc1W6{{I(z%pEwp zvtusA0=1Mu^&LnpC>QHD2$@Wa;t&x4jhcYwwP9X?v~U;5Gcbj4vuNaI{{OGv*#O$8 zdZ2=nUD2V5AqLcevA)m118U_s&SOXbO$S(aN*91y_n`A?7TPngSRZC!0XM4WGC06e zJZSXU`~S~S3t0w6(47HbBo00aef7`H}_f7eM9p z^anAF5-gx{fBFeV4wZTj20!o;R_nVAO5XqPgR_@)Ed!tT|NG#gum0BO3Ts&gEvvr_ zZXioQrJKb9_6v}j^&Yt91v%Vt9)r)qSO$su%-f(5C2*qy)}*Un`GEm6GzeN&i8eH7 z$W+70Bm$a4fpn|`K=Xn=-v94|(>Ex;I?nyy1Dfoyu!kJ+HGPc~hfaNmEQ2_xd+jjq z|Aqxp;0SSXnD>9l0x58~J3Gw#KchpIK}){@bjZd39`FD6!CMl+>s7%MrG8-Vft>EJ z?|%*`HNMD{DFE>u=P`(Y;>BVC+YS!~UvTbgv}LfesAS-1kY%v5n9EQXC!$M^N1e8t?!Oj)68c{b2kz z(fS}m0Vs=mF!+MIKMj8wz}1>X10(2=FKBD#jV(B(SsY++wphU6Vo}E+V$lF9kAVr~5bysF!9#);&<#!?PlAUEriV5#O28K5gBB_M2CaqPtqop-0SW_969IJm z4an=DRf`}mgQo64-nPgzJOOGs)y!9}05t)u=NMkF-VX}OFz`45C@y}VlqsmL1C1Rp zD0u(>w-S^Wy#N0>3o6t=aa4VeK>>7tPYkF<2g*nu3}IlWg0`-MDl><9|IdI*z3LPO z1&d_E8y*Z{U~j{kN1!AHY97ge6j>x2F?cY9p-eG@{5m-xMzx+55|LmZ-iEG-1D#XR z%D@Qn9cV%X>^taEZOFv!@5F`{(29%)>#Udj|5v~CML_+67vN3$HFFgLYMPZqK(#uk zFXO@B4Q|UcfKD-KWGLvUW?%%#)g&{C)YM7@1k}_^iFh!0fpZ#I(QF2$j@=B5^?Mlt zYU*Est^I>_9nuVp;0z`I5X^40V*oEmo&Yjjkp(ncEdcTqJJeIt53q8G)Hkp| zkKEX+4c-9{iX>13g1iFq8Yr?r2jFxjgNOVW^t&1UJM05R4&#Jc&)|ys1`kl{#-g^~ zV;xA&aUNp@Xz1J0lYz0)i$TFMlYz-`-~Su6_5tfaqxYb31dtxbx&JR%A7Johs6N1; zP~ULD!C?-AMs4kfb@g*UiRgEO2UmPx=a|9NIL`V102GP!&P<@)e*!hh3?;C|UKPm~ zo2DCZa!A&9Gk}il+0szW0PYey&SS^`wM6Q>89=G#f<9!36*TVyI`-M8R@J+rzF7n0 z3x^tcjddV(`V3$*RyfXL&;d0hEL9m8K`yso1^ebg&3=z{H4C&vK#hBlUeG$=jy(*F zp!jkDEts`f%E08o;0bPxHdZq*blNa5T5vh zL#HMKqXj6WAN&#l84Efo5i&^2P@>rj35FQXGQ(ZK!xe+UDcopu8QyW?DjGc#+M zM6g(70}D$~ixCo@$X3@q-dzE)+7(i~z^!Hy133fL=D#Oq&t+hSdW#3sw!bSnI2o8` z$TEpykpmxj=l%b0EMf!~T6==47SNWe1q>|6wI}RcNsG>a08lOJ!Qcw+Eq2H;iG*;n z*=cuzPp(mcjg*7ZDrn`s$aE1N4ng%r|1VfDFqqD?Wni5l%fMp&mw_FmbA~JfTZbHz zC?pj!GEC3l;V`aWWATsSf6XiF3d;mW(2NHIXxm9I7XxDjH;ZDe2554UMZuxz{~Pdm zP4gIREEpKfXWBC`&X9)`m)8Fon0nK}DUcCVs)6PuX4*r#MHQSZ3i_RlpqBE34mk!V zh}8^7I^-CfA#5?w7~B8_4n4ri+W&m`jg|9^l51A`OTjD1XEpyI=Wq22-9od7osF%1Eah#?yS z^O@tk|194B|09n6gKe(_m01t}{{W3QS^t*-wH$4Xy(W&ffoD zg3W8V&-%f{;=%v_AXmYfX%){wZI*}N<_1jM`~Nj?57Yu$38O600u{g34h-O#M{wgQ z@&66*SPH0_QEkKl@;-PmH8fa2%?@zTDE>OQpY=x#1A7UmwgN2% z)t3XU?`0HmoW*d!gTWcxv;$Qipwb)UuzJUN3@bbs9KgYVEa5nhVUGuc1Newm&@dBd z%~wq=yGiv@1_ema+0O+foLa?KBC|ai3hMvA5&?;WgLVM}mj{EZDo7qwch@Adn}j5= zfJ&qP_4n9K9Op8aG{`V8gfKXm>VcN9PN)I7o`C`E@&*Pyhk5^9I^-D`L3IE~4Ag@L ziJslH5C9=kKi}~o!40)waTGzAI{{S_Rtmm^qj-qUSTmi0E=Ya>e z3_*FJW`}kKXfvhMY>{~$74;~C&;9a`b3ZOI}0!~%>&Gih@j`J8gK+A(1=P}lJ|Npaawmk=f)dL15 z@BbIT4SVnZ7r@g5-v2Lvdng_99H0YWne`b!se)mO<1A1zy#O_kfx&U^{~K1{|NpQ0 z&YHz;z5oA%w*Da;;t8IJ@n8r(m;kzBM!%Us+F{=R29Pf-l8qER7(Bs625d7k zsEG}!SD-2)JQzH|GhU!(EGUtJHsno^XZ_G1$G`&OJIrIa(ILmc0UDEWXkvH+S`FpF zU<39)DA791V>r+t&%t7m@c%DJJ?M-VP#8DbvwpCsW8jz|$G`$=c}=uqVDMnD1`jG) zBrtF?z?=kjjsnOz;0|80k%0$;2M$M1kmmpuP#U0=<^BKnRgeQfa|57bu|YGlpk9Z? zJkX(8)|{Zk?*0Ei2gt#o^2Gc9bMP<`NRPw5{}-T+{sVHf1Ekwc`5HhcKOvWVw%}qL)T4tHe4rj5sPMCBF%__=2OYU#1s*5#{(lazqmm@i-W^bfq@<5o0*D`(s2SKQ^D+m49mR# ze^13M5ubo3DL^G6sBCHY&%psJ5WWB31{c*Jagdnz|BK+_0c&9hYNLYk7JLCHs6GG< z9M?h)A_7gRfeK7eMg#@d55@0_7KtnqJQ%FOmpm=wj$M~gtJ_m#T9MD8DQ-}T> z1}2am$9aqz7K$94;A4e+sP{BE%TbdkGdc=j{E*uK%x({E_dEP zkw#kv0Z^ng$TEn4B4wgI>jzLd;lW@AUJ(w~gc2EyJ=S*_azN4Q!C(e%D1p>C%wv22 zieRWO!2#b;&-%gp|21%-)xpRz5tM#F5!=DYGFiXA0n{62jOk!xnFb0Th~(cn4T)?s zy#GH2S9{+7|AO{zF@fYA=KXDGkcBPZWb^<9D=7OlFtSYmS?a-H0gg&=88RQ*c$yDt zJe>mfS5eCgi<#iVT0sQ`D0_mU!GpoV7gXwjHj-G(XZ&}^jCHdc8LMYEGVYq)$hh14 z|EHs%AuU*I%c7p4Uc~$VeeeJedTR?b5D954 zHxnTV@?SzjBHJAA|JT5Eb3-EA0`LFVpe5+P2^NX<3}}hyEh{J<9q0X#u}Fl==|J|y zzIo~W|L+oTW;+7jgWur6Uj!2})^5TE|t18SLo3$y0O6`(r7 zgTVxx+o3sy(Q)7ZE8v{6@BbM@X<-7cogp6kzXg=QVWmaA2ZIT?c%6Np9kiKfhV^{b zAE*`>gB!S=ifl_QI6(u^;0`FG!`}Y^u%ZdnvI7}vF_%FHQYM&yi!ewO{0H4(0;&@k z8`vP@QTB@%3_&$x!(Ns84p5`4hE*W|+!$t9RsbsdK|u$u2SBH9fG_j-_Yt(O%3&_U z8tZuhAq_GNETD$8b+u6fNG)iP8eD8Y2`lknZ~(U}Kv6RJuS&-R83xe)B_<0+Mu7=( z0U@AH*6YOoH$c<=uNx;v#R%1dS^}V=r)Ftbfd_*T5Afn#na z17im#c!CYovHJqj=fPkP9$WYR|G%WsE+C{*fpwwdqW=M)zy{6wf@ZuO=KXg7$%6s` zJR<`grL$PT$nd-Ie?9nYTu?ZGI{?sAgyCIba4X?oA!yJJVxbAxLeOZcrKU;;=!{(b z25{34JlhA_Oli@;z+V}XN;iX zMo_eZJNFO&|FFz70=IQQwKZsq2dJ0=%R@F#r3Z%>MfZ>JQxhXEq74A9h6DIqmbZ9V55y-gBODi zG&g`GahPV%ssV^za03vm_sD1P0rybL!48JhR{G!;ENnFfDBptZ)n?EKS7Tt!EsrZe z8bOwOFc^Uw0H8DkPCtnZ71MiUIn-IfCr*HOA=iVv1&RkyygPsRo?HM@gtEEIhr|pB2 zVj@FDH8?t8>p(8lgF8gljto8C|Nnw6iGrj@=pu1Yi2_Q4pd1EDbD&mc%`D}L7xD}e z;1+2O*|0I@BatEwUGD! zgHsb2f*2T9$S`m$m;-L2venFEH`#m}ywn`j4q|bf$Fv4CdZph9Y8x?t+DM>FE+)LR zXRv6@WMBZ@^fQ5zfdSSN289;5b!MjH=U~rtr6p^d-|37FAs^dJS1>n`s^O!-$ZCg0b zWvZFL$-ra5@c-JxOa>0?1^=&sZ1Mj8zXjAHw%)_QRX^vFNd2A{4i0k}IY6-t%5feH z3=Ux18$jJM9dPXGC^OW9u6}u7k<7pd%JCiyI^aYJn&WkBVmM*Fn1K;u5Cixe1rG)t za5h8?Rxv1m4E10z04EJlLFzE?{~Sni(E$(7fXoG%UsEduS~|q#!C(k(gjOW8C|EGp z|Npu2#Q+o|37bf|NoZ)DyA$o?@3fJh_0yNWJ0?n z=3fH?1EUNB10&D>{~$KQ9|i`7H&FJS)wjV}pJ9VMg9@~mWB?Uw9t?Vs3CRo$44}fQ z`W}k{$U;!*44RmAoX7Y9+I|8Mr{T z*bG?)9*`xF()w|Q^@9IDrm1r%)I;Lv?+FVACWuQCKvN1o9(w=(n`6Q7|0hV^dcpsn z;8qL6|6fr4FYo_HykD|Z2%u>dvTA802GD4~Nw z1D4o97pFAFGZ^T1fmX!+jnM`zrk?vZWP?0|j`#onGhWm)NLVcW|HWbs0}p7<3{n>9 zf?LE3Y8bc{%m(kO`TlibJ%h?Z8wM83YzFQIc?JcLgDf@we*w*xO^|0$aG1l;1IiJg zpaiY`2Q5SZImBV!ACCrk1_Mw7!eQSZ8w-a2-=Plv?*0EyiTD5SGeI5$sco!hFlqDz zpVrN2!NtHhv7W(XLOmxaxc{(#3Mf$gSTrywf(t140=3iNVi#IhDtiC_3mU3r1Z7%~ zq2B+0p8zE!@Be=hr{1u^)@G@6C?x;?2F~P}3>p(S8C*bX`#=R741;#y*XwsOu%j1n zAfNs|`2Pc_Km#=+KqKiB*cli=zMH@fY7Q|mOxVu=+EdFh;XZ>0=sfs|@(czO;~7|f z{AaKLrD}({3O0E+KD;9LL- z?gn`V4^UbGP1QNhWtamxfCyYz&1Fn!kY{iKN7p=tKi>a$zXVU1Ll+Yq0BLT_WMI+m zW?*rc%P?iZJO+-M26hwu2JrTQ2@C2ObhMip7#-$9)){*L|GF2Z$1)po*P8eL-QdoM z_y67C(IfBwd%y_}qz>6(4s-v5a@dUt^`P;Ug#S0dL--5~44_%`AMy+m;8rH+Bty_{ zpofqvu2#r_?tA$E-(lYWDGTJm+hQ0T_Wkb&O<>;#YO{luPl3t@4+azPx)JaH-(*1+ zgFNN^|9^s|0_zm-|Nkmp)H8rDqXgMw11TOE3?P*hXz9%7tDtc(i)5n@9tcLwPe<=Pw=)s_?3u@wkQW2idg&Sl7608{+ zPk<^d$9c>*944`}STHa}SSm1xOjKmN0$QD*KbI-oaW3-~koW{f#tRmSOgF#{-USRS z9t`Sm8%xJZ8|8D-&pH7nC9pYFI@Y9x~m4Muv$&#S=HCil=Q# z70-?-RXk@?@L(_mXG`n73@qAnL0On9qJxnUG%w8HFprt1VIdRb+@40J2NlcOlq!}V zQ>s|OreKk5vZG?D8R+&L0Xy8~as_Bz2Iz3P`udZg zb;Q5Gy;qQ{LCFTR)Cjb(TYo-iESM)mmivIlnHyr12&jA^7-Eki03H|y1uQ|@+RIpHFaR6mi(C9}a^cdpFb5eBbVdoEn z5`;yv@dFPA18}k0u#oWrsOfIe$aKT||5I>Z0<<IP`g1|9XPW>CZ&2FD z7To$5L2;-*7nGj=Wi&D}-GP+%(0Fb-~gA!zjWC6oO@U&eb;|=fsi@<$Y>j(d5dH?_S1Dcs?ED{-GJQ!5K zxf7NuL5UHT&_FAWEEpI>EE4OPZcJcgyn;w|D&XV}OHmH<{^o$XV-}!6Kya#5MGTnE z`x{`9$an-v4%~eJm86dQ{+hrNmgBs?8WxF6cPttikAOzJJQ!5Ki4auWOsHpM1YJ-8 zS!LA7^q~G}Sb;^d$p;SxJ@90T_y2#;i#d&VcrfU-LPO(>1>8X@@C6qR^O!)5kN*=G zneL!Q-*s?S0!5$q|9>tPiA)bH8X03O7BKv;_h3*0k5hnLGlP-&zW4t>cP1}nyx{%+ zPl)3rrVZdAT?js)Ed`SC1;9r*SR^t`0Qty+K@gnELB4jF$Dq=|$S?s?wKB_q^@7Lz z7>{@`D1%yd3|8Cz{|A`^IzOmtD?`142LnI2RMy|hzyRt}JIrJH191#v3@FaP!4El> zpT&bg30&Y=Br=|X8ScTL1P%emNxxg51~XVJWcXomfFZ?$fgfCQcQ7)5I#3J_^B8}? z(f~wlJ!sMla>}RvGzLbH103gZ>VOSL7y^z8Btt;w;fa9K4a5+z8Q_u27mSRTy#N2^ zK-LdZ#xTWL$|MwJd2*J~X5~K=Q463FXGf)$#5_lCf#6Cue22gS9 z{eM4rS)lj-Uu&SL^b91GDuT0*_y50pkX*gOgFy-0%>o(XIFF$PNp6D&gA#aj8YJg1 z@8=EB*e}RaAdi4N2J(~#11~teL9<{z8^~u9WC9Xkz5~U%_y3cx-oGo*5Q64o1#scx{r}${NE9%EPPAe1 zU{D0dHB?UvxN-m;X$mes6u{+&_y2!6V0%F0_7IB{z}?=utD7sJK4P#~$QT1j#k}Am z8C;+&0MFp)SSm8cSSB#&gYE?b-7g54Kmwhd!w};z@BfFHnV@v?{{_@6Mh^z=t)Q|) ze=0PQ@B6a`lt}9>pm`e<>>dm}U`3$34Jr{m7UCCG80=ylxp2Yd=J%+9*UyFsI6Jm5|M$Wn_&#xouayx`GlOiTZW zfLsg;El~dVV2}g1KoFL4fm1%nBJcm-YrqM!#e@S=cgTRvgw`vJ-v8%;6RJgGJ>v}z z1{p|e45eb31D=$(e(-;`_x~SjAch%(vJ*%>q(uj*q(DcVLwYrdj5jP=%w|~s2OWc= z0WR&d=Y#qXj4TjGNP`P6uvv_ZH^4)J^)2QG9t;}bUJXQx0N}Hc zED{WuEm}+^y#LPySFzR){?GLO|9uC@0TwN$GoTKGI1=J(0q_5F!K0~AIdB3+a{#!< zWBuU&Wbgmqb0DK6?^~+>i+6zZ)NuX+jg-`bPZ0p!r^~>=BEZ1F{Dy&n`2+(4iwOe* zO9a>f3z;5Rw3t?aGw!7U#&L%|8w`oaHR@BiPXfDE)~F=>FP zmqd;x4)6bvbOe=yI2JjY>i^FKCkpEa|EGHY|K`!K5L%?Rn1h4KgFzK64|SZV_y0La zEh0&9bfG$KCfM=T5B~Rg|Nr^};yBX-PzNCA0zvQpv-d*g?ZAmh5=$UfXbuCXAL|F88@InEKpbXPF96XX0V#MO@ha^7 ze>S+C4V42|M5u<%02fTw5B^W^{{I!a&DP8SsvbNO1`RQB@Bg#F6&6&k5>yHz%&G@9 zB4>cRN!Abk_jv#RasukI1gHi`%7!>h!u$U$$h0Up#3UfyOyv0dKLcF5SwHyS?fw5t zO~XQl28em)9uV_X!17SXiFnulp9Sq}f%369xV3_C9msLh!LGM{@W0>t{}&yIVMae7 zhKYm6j-iGzc>kXXE)k(}kVK8*xanZWTR-?e$NT^12OzWR!CjVv;4EeV(Wnfr@t}sX zc>kXXDO|ul7Kb<%)lhIrXZ_&+4DbJ+dmt^KPXZnc;*d0eT97^PU{D5!fcO93G9CHR5j)Tuy&vK|6f-;7{tJ-9#xIm30Q-~`~R;E z9t>iT&_Z!gz1a>A1|@L8;r;(t4|IHj8FZr_XbK86JOCPR0F8cuM#n%!C}^w#)SvsI z_)ihkMfPBj0H+`Q`Jk;N%vWCjgB-W(!N3AZxC{(jpuIs87#Ug|o0zxg&tqV;Sjf-; znhUN6^~XSlI?iLR@nB$u6gHqsq`;T9vVj|wpqkKe9`g#ACXjlNJ`V;~aLd^Op&s0Z zfU5TasR6Z&JQ$e4AqcV<YNH@qb z(9&|y9d+LSmxFTyWFUb#05Y(^Y|zojPyo`~v5=wABH3a?$3cdoj)x4zos0}6or(;l z9t?_*VmlGEC3^+9oM>QVsL^i#jq%T81l^Bz!lIF(22{6uFo=VDDcPMS?rcC4T8#$-Gr0K#aWKORSVFVD_y3;<10y*4K#LGSiOq4| z-#KVzfjtW~tG>a5ff<}2poYzX8Ro&j2yQ^YQmx~@zaeM_ffFNCJp*J!P7<60CL}Vn zfaVGyp<$`v!5|N*6QH363KdAm)g#~3%Ltjcgl8uvaM25Ln8Un3Hz0;taCk7tgDr+d z0Vp~kh9S&?I*QSQfdSkX0BuVGg$8I_65`Hviw2K+202K3F9Foh{AU2QB*KG14%|kw zNC1`9|0JLV6JrAt1A~qV0|O|5_%<;pK<_fw0UwV9=^MC!E~*6GJ^5HIA0Z_1jXwXLPdXOog#pE5F;K@k14Ziaj z6l%4-LAR!JfVRH$a5FH1P7p!1!Bmrh(Xoj^1Y`r~RASIQw;+Q-80r%+1#&&;pa_s& zm=7HGG4O!)=PEePVvy-!h8PaoR|8T6^}>rOFKC4x$eAE3LFZt2FbIGPSde&4t#l>04s&c`*x>DEvT$CTM>;C>$N(iE>J-1*$Y7jjqrhMIp}Ke z4A5$DgXI7JYmy}ey#N1S08XKx+n%8tr$9Xz@Jv`O(%J=^N4IFFU|NmbAO=>~Jo`O3vpkf6c zOQ0kAK)C=kSq55W&&VKP!%**C`bROV_*QO1=r*U|9^P>Pzf^C2deNq7+A0> z2Hzl$ocUq*F~Gf@`2R+uG6O@+Z|e$BVE|e&4VttDC1Owt0WJOj1r6xb63`Y-PzB{M z4;m~Bkb*^-LBM*!|G$uBdq|<8%phc8z2N^J3r-xtA`1={3uv%_Zbk*~&;Z3Fc!i0D z2Lm&>hgt7>xuU-LK>(;s0R;r;yjc$hMsV8;w&k(D`H{%)c?=9--39;H6+Ao`Siv$goPmJct23W0VNm< zhX0@~qY|J~c0ffXDBeKv1*+3JlNng`yFtzW|4$YsGYD8_|Nj@7&0?qB&A{k5_x}Y@ z`mxOZ{{~5HPp2{i3+QY}aJ|>bz+~Yt@Ba!91{QGd2y97$bOpLa9t@0-4wE870qE!^ zkUaQyt$NTbs-7xjkC5&%$ok0U#SAi_+0mNo#ucEM)%wM+L_o8uH8YgK2?AVOfX+Pw zEunw-{|6``fM#An2?11#fM#St7j%HC;|1~zI@WU-80#AzFf5Q~(5j!qzNLOI6X@dk z8x67y^`NaIj1Keu-_hR%8lhwqXs%`8sjogH(rgPkYS?iSgU$;%28JJw3>r0@%*z_) zGKjpaV-R=|$H3v&z@qrVkwF7gzBugrKcitUgFwyvQzD?Xm>vvV;I%ppwUE`y4SN|x zY8Gn*fYx!;RD-rYb4eyJWHB&+*2sc1fa@|A<_geBd5-J;`@9fmU;w!sX7S5%27wph z2undeL-&=#oc{(5@(iHJJ^-37t9Q600*dfzX9k7oYos_drtiq+;HhtpW#9n&GwMb_ zeH3WQ@81h(fdty?$k52lAhX~xgH8>zgI+DO6X<{w(D6|&3!NFXKrOghjUbVlQw$eC zqqsGk26~`1>7a8}AuTiuhFT5piW+YAEw!3KA`aloL>U-B>8&Ayfyb|bVRCbjAl8U~ zy_i9PiV<%C3O;BMnIT2|1B{4&UCST=szhGLG6>Xz0;T$p$ZJ~$@V*!H1n^=mg9eTS zFri^Dg9;)6aDXeQ7qyUS`4@W`G!O|O50nDf!QIOjvJ4t%3Bbc~-G3J%5`YD|?;Pg* z2i*>R0JM4t6!D-$P*Wu(0=g6n68Ra(5&e>xL1DpT1`8|^ZAM8%zsO*afSkak_#b@J z1Zcs7-J$>gUn?_cSY5OH0E%VM-8l8ir$j(m9F%QA_vC=ed(fg*P&p4O_d(^n^-Tr~ zaQ25b{;a-RUVvtAnFaC;HlXtutnV>6)HmE<043%UQ`^Zgw6{on9Xo72xwRQ%UKK(pyF@Ae+G-1dM%L`&ER#8XBNgYpof@5twz0f1tFfe+6XedT@1c(jC3=E7cP&HsPU~C2kMiHpvL28lZK>P;KMJ6>2k3>MH z|9k%r`&SUcz+kljyi)F8N(FcSqY8!=CQ$rA#R5QlDBA_J2-f@mKbs1M76qu70ccnT z$_8!wJ^;$q;6=xvmNbtItQQ12w5XzmO`*Pp!2#421r@ixv%no~&{YPEpxULLg~0*T zO9b^dK=R=JGROdMR}<0;chHA)HC;dlS=2DFZ*knmAmhQnpaBvGbt~%`Ku7p9s5s1G zPylsvJ5?CKhJ!L1=%97bf?JT`Aic~!(kSKO0P251B{>$0<|PShqi-#&kVV%24tr9|NpSVyTMKaI|LNs*7F!jKvyS% zh9@jj|NpPdW>5gF#sdvwfN~b7WA5a@;4=fXK6>f@{~(|Duz>coGbl_i=wcM9M|LLY zU~`avL1F5|@c$1eB0v~qn)mQF z2cSu7@QgcX$2Mp&viJXgpqZCY2GDq4O|5i=!(0Xja4kFkkx2di2M&&VKxeix1c3U6 z_4^-yBF_cfNCutx2ENbyAGi?>ZavNWe+Sl)0;vJ@6{Ywf*N=nxn=mm6P^#zDW?^6e zMJ;F~$ztjM|HwfA$^@XaHK&t-5flW|PjoTLN-kwkfJG%z;$xh{IsIQ3qgZ|Y5(x)~ zISf8EELtM{TDsbQ3u%x4~k&W zRV&~k4Aff|0T~4n1)tfRAQ1qT0i6H=I?r_i$T1i)rl73j{r`UlG#P`p-B=|5zo6aB z!0CVYg%j*Z6;M1t)i5wjckN+RR{)Jbg0g~R6QhE5D}%~U70@jd3=9r?83aJeCkJFn z*6;iOLcg1V*KybX2ae1B-*KGx{{|>JYqh*99Og01(eGw30FBu?&SQ80It&O@n1V7d zhz70Ytzlp{sc+B#-Lt~zGlxN;CRy_m$ezwj1_qFN(9Ae!i@OE){|g};Yf3~<={|9}Pe|NYS8P9!b3|F5*n{(sV8=l>3|DOR5UY~2HNOQQO|x*19a)2!#oBZ&{YT>CmEP3mNq}>^kiVJS#DiX zam@8e&2j6BT6gP;`t~27LfOP&27^V%O9sYHPX?xn=gm(#I2o90UN~1&dbvKS^>D7J z;c%|7q~kOLb8UxnMaN18=9-q>6%`DwPb!|fKB;-` zTv5ZITv2nvx}s(Qb44wKlZXWe14{*myV49!2If#N2D4f(=ZXsU7N(h=3=9<b*YtT`^2Q@mqAwKHlW?-&)zzp$`7js1|S8#;|7XwReHj@a% z7YrdC+zbq$VSac}avaof-1pxC*({I`K_P_Oyn2X%j&uHR(O(9dR{7@u8ou@Z-v%D) z1;u4OWC>nHP4X*|A9bLE%Ku4#;?n#7e;?4wTJQgD;PEZ}#sB~RsACXtoX6->!+Z#& zmZ4VpmB@3 zK`e)g1nlBXi-!OI!B|@Wz4;xz+$>VbIMSAUi->K|^~M*#R9t8W~oAE`tQw zXR(lB1;|bo4+gGGkS-JbW(Eb2YS2U&sI<~=VBmz(Tu_=9MAtAdn1nFgtOGULLH+gV zYvMSh>KS@oG&2Z5+kFj<$_yN}3hY}!m-Fd&GWa{rWss;zVOR$$#6V43PzX58W3YKq z&%k7{fFZ#9e=|6JfTln|O+&{y3?=%_4E_#t845r(`pbF-feG>qpi?*)JF*!VCfYM_ zfYgH80ie)+T@M=4js9W=M)08hzW*0GKsQ4xLfVP1k@SJ; zh?n*Z;9ERuI3?GiG#FqvYbXA{QL|gS0#x9E_CkPy7!+Xjppp($N`i_`P$>y2Awi`h zs6_ms_|FmC{eQu-O0uJZL9~8F4L8%O+5|+`nt_1{)M?%F z|NnoS7}~+bDUYm|fq`KK0|WB~WHAsMB36%S3AzIq7?^cH8jvx_0g!&d-<1^=Yzm;I zd*1*5!j5=-@zNT4>L(`y#}8=+2GDlC+2D@x-^z+)Hqe2;;KL~#toQwU06saV0kkvj z-<3u?1`bf0)M4+x6QB;xL^}o!STH)w`*#2oXBLW#ke=}xDGptTEB^ciogxHs3Fy#g z4+e%4kdX{F@H!z-s&$;l>`|-uOJp`DLKSP^s6oY!D)eg)6vPpAN`aQ%A&G>zmi zhY9K^R`6;$h(SzSz?Pso$`I30zi&d+gWC<@qd2_(|KZf%%TUh%a=qg`1``hkhCLP% z|1Ut>k?f9hna*Gu{`)H2aOT4m-v56$LJd9vRtxv-J8%I8kz?|K`4%+SgXCF`*PQhr zAASKB0ubN+c?0!r0GeYQz!sqR^tUIfV}5;wSor^d_y7MTkf{BwiWIdCpzH=UUj}Sm zJ&J+9exez;6tWff{{^sOO@;!nPe6qXG|E6XpL+j)3tpt;{r`^vSRJaFOVP{>ggWwu z_y7NE>LITD)rjOu3s?g5{{Im?F96ZNI0K8}h!B7$z@Hx>>d_P68}P~)h#bQnutyRZ z>I=}~gbR`YKY{09AW`x=1`=e95|9-B5h*1zvS2#u=T^9n5sr$5SPV&kpezg4r)dX0 zI%40SCy2cJ=LRhAg0hJB|JUHLZ;$~F^Zs0b5r|L$_Xz0pbcxm|=fo5QhB? zfEnif|E~+o<{6nVwf}e!YX31Hsr>>|I~#89zbQy+J78+-L2LBEjcCwRI`r5^P(=V5 z{s7e&pd|^Q3IWth2Gty(_BE)I05y+6UDO{785uw$Mvn6sdB7D!0)r~(Jn#-q2Jpl` zM2_KueglIl=(Z+@dH-L4j&ikhWXQJ!-P|;Xi-FNHgMkseB;!8=V{JBgyekE?C11aR zA=7alBWPl#0!l|f=>jO745f>qv?`SLcbvxvx{)j&v?c;%2k63KkR2eqKqa7l14Bw} zb`tv*(5`b!4F)DqC2zsNkW!l%B~q*CB{GAXp{~!S1sUux?>~5A3RKC1atP>{;(7}PhJ2VM_$~PU6J!DC*lf^w zcNPo`ncn~ZpRiy6?LYi~z=DAx!u$XK9Tp6rwR-@!h(Up-~0dn3V58ef=aP(C^y7|)+<oFsOxU z-v0+4s$iJjm&2h1YDk8F?rI06D^OYjwFtp!ikU%#ac>k{im$vtO(O?G>7tIsIH8qulfo6%LX5 z`WEd;^>;pA0?m7S|NpORnaEJ^(jMG7SO8KCnlY~5_aXqK8MH|Rl!!p`ps8$7OB6It z^wS=)0U5M(0n``-b(=w!d;iBgqy>~+Yo(pR^T{=Ttn0zcifZl}!&`%(;HYVaoHq*A44>;{do z{7U>k!!GInf6!)Pt70n!P;=F8(f|LTCaX0A0|Ur=H8Ua8<)FR9pa}nY@PEP2hyN>n zG5&A(rTD+&m*f8lzZ(B9_;v9A25^%XbamLm|1UrZ0_6K2ivJE;H!?c>s9`YdU}a#) z0A*xQTdKC&BcOiu2?mEb;7#1Bj`J8MfO}C(85ltdUn(*dfYgG5;in>F0qFh=Q0f7x zd6CFiV4=te-qcxBEfD|;zLy987l7jN<-`9KuNeO~Ozuf>02K_XmWd4cb3p6#92gin zSQ!{CxfmF0c4>p|vrMVw058%2u`?a#v8w1dFqA^+3Md@`r3;{RGL$Zc(yCC}-*Fx* z=v=jY&=9fXJjMxgxEbmhYq^{&uvzLb@BakLEC#06#~2tuWiqHl0T+*qP9ifn7z!+( zF>uW0W+>=PWGDoU3W0X}>UT5fSv4>ySTAHKbezYS02+gf{|Kl^W&quDqhpc$|34_Dg9?Apg3+2x=4G=^GBAL| zU@6~;;r|Cv&k!_>4mu|sR1JdULD2@v4Inn?l&l|&jNls*y#GJE30`B?T>k@fKKKRi z|Nk^#aXy=qLBgVup`-rj=L(Ah3<4Gp7!)iS7??oyu=oF8CqagR*r26mvosk%D~km{ zVlWFpRpks$21aBt@Bcqzk<*XEyuT+v^0oEPsw*JD_4^7)0qB|%{ceUF$9aq!YGj!! ztR8?yhW<`LlFM+M$JhduWAgt0w<7GNgoOp?|NnIi3}*Ew87z@KQh(`lg<}(g4#+YK z22gFmz)MDhLp?YiVL|8p|IZqj>%b0!X2beR6D+{da)3bqH)Y+VDkR|`wNuMVZ9fW`hP!xG@br{ zno6bK|NnrRN)_J!|Ez#Cq5goX+XCwj6-2sIS2dn<7FI)(>uyIEI9L0OX5=v4GavXE0%L8Zx1Qw zNMW4rP{|=Ny`zdl!#p#uB(ATfr5)YKvnBRL~82c)_nu_!gKWO`mDhm%`=L24dYE+;WF zmw|zyC^aWFu{f0>IWZ?kH#fB;BOj!LfuX1*u~-*mn{HVFNCeCWy8}4r4(OpCPd*y)0TaC00STm}|OB3y1vl<`$07X{{V-_48o|?tm5YGcd-082pSF z;y3v!IHDc8`M%W?%uYJHylf-bTfMMI48NxWH4}nCf|C!1kbd zte&5N2ZxV&=3vvn&%n!qL)-v|IJkp==^)-U44}>(776fG#hBs(-~*L0#RYMRpTO=Q zA@GG*5OZMR&%nUI&maVz#DhqHv_ddHgKz|hg+&~P1;QV2s0W=Kh8mS1`}r9}P!k16 zH`qa9I4l;s0#btMAPMjRn^?s6U{^2M0rHCjk3gR^%%rb|`86%H10 z93`C!j)F)PN4{4>PD9Y}2PZnU2JAji#}U-(I8wC+sE36mQEOlc(RxtaYvM?BS|ZpT zq=m!B+GvRjq#IKq%BQaXxsMf6@bwoW{eaz2b?SkE6 zYaG?IHI5LnMh|L`u?+kS*5Gmg<}pb4gX7-%2uKA?0>lPkeg;sljR8xL+TchNHsFCn zOml3o70LAs{0ugbpuh+TTO5^&Eshcsyt5sPLv3+5$o3AX{eevbjs}Q5O3;Bq2ZZ?< z?7<5fF@5ZSqdag#q#=0tgQLJ5Moy@G=2A03+nQz#R=t_1+jwH?aNu4BiUZ z4f4iOuz2I}nKzEa=#8WL_RhG0-C{o+sXY)!^%{hu2oD0^b6g8=WLmM2^VK|af7>*`oG>*Iwi=){R4+>U{q+QR?5RW5mC*tr~ z5=N2%nat0SfCaCpLkKrPIhAbQup$@j0L#8W!={I6N>HN8+7#0c0DN*8Tzpy3ZrbQ^HA_BY`uK(?X9B`8UOqH-IKI&d47h8?)I zzYRyrZaa>s*^VQv?7$(u4@cAVAh@-GB|9BN4kC!Rz#()HM^En{4vP=su=p^%WCRBx z%m#jjBVazLnK1psERGq|9cFNZ3EkQNQozq}8Mf z{wBjKNU$-yw3z(y)EpCjhDVU*9K&NskC)*QRN*720gs^u+<{bS40j|Z1`1EV-NL~$ z{rpT0extjP6v=QGob*AC0bzcI`%wLNAqj`!E@ZTZ;qHd%0<$>OxE?}E8HR^1CI*U# z@H0Gun*RvmONK`b(=%pq7*D>OEj#_dOb+hJyR$ht_>GQ$jtK|=86m;RZ*&CY_yC6K zjI%k~LE*tOy<;{<8WVHN^bfN+{(gGe~1yFh+lwJg- z7enbK9NU;0R%~Cfl*5e?WblV&P>JPGdIgkT38hy->D5qr4U}FBrPo2}^-y{Pl->xX zH$mymPD^Fz50u^urT0PU{ZRS)5R^(7_!%BT>fCyU_mDvb!AwXh zXH0-7U`&7+3=wCz1u1O=GoiTvYM@{yq`-$e{4P}eU1;urs$)!8;qL5grJ&*N7pkdX zqGzUO%)p>mJpIa1PWkDtE^=s0cm2ZZHobERr^xiuOB{ks9~h=@_{u6h{qz@BDSk#v zaGQmJVI#;kuIXnkacFTuf{cOT!}R}`IPCdegR=<(0}H71;F|7pnL|rR9_$GQMtN`v z!~jwYHgxf24r#s*P(db8e&d>c<}!yCmjXC1GB7GgOuNFNt_b!E0|NsyDD?Ol6~JKw zk_GV@43{jNZUA=UcUCEGMg>i-jX5eRF{4xE)RSt2+nCT5)SVdU)8JJt9UE>gA z`p7Un;3TJr3_l~(xe%SkLJSO0osSZxCtTwYtG^45GzJC+P-+Q8$lnInt_%zepfWE4 zA^r*)%nYECHXb4V6kPN$Fff2xWcdhjND&AXFGYwy0H;C*Z3bpg7)R>)w z5P$t)y25o1F)3ki!wBLZhSdTL3}E&Aj0r2I2VCb6^Lh*}GZ`2dKn<%s2>nkX5zW91 zYWEyRh`#`*R%ifRMu8bN1@pW!e!J%7$p2* zdch42vHCkO57jU*Fj^zzA(apV1H%CZ21ZYW_1b5Muwtw%`Q0Tl(HyQe}J7#NYF{4KZ@!oa}x zfq{YXB0~LRP`LmKi4+C~#)k;;doUlbU|?W;gAj+5kPHkAEes5dup}VMz|ZgiR-czJ zFfg$qG(6*&u5gP(to}7L+cOq0Ffhp=$wPh4_=kakNgW}6AC^YefYJ{_{3&>>fq{Xk zg@J*|1tIjkHVh0*M-lQ*pwY=7!N9*SU|{-;Q2!JXAk$gza0q(6h6Xv~5(Wll7KEbPpeh2C)roOksM$9S$+C`>@P&4hu0c{f7*Hq3(#3=GVN z5aO?3rN|2g2Ii9paY&n+fdLfz%;%7D{|jhL3G85CV7`XX@CsU>gUU7LdkFD+u$anW zU|>cn=wHEnJb{6M`8`5Cq}Kq+WX#{7;=T<046tSfqX+{73nNs5fuG?8G}kjVFfg#N zA&EoM7Xw2I0|SdFQU*FOeZf5rF|XIKqyUmvLg>2>ZO(wIZWe8XIHX&{z`#(!z`$aJ z5WnLw?LLQ?m$ zfPsOf97!CKAQ%`oFfg!mBg9`oOKX-t3=AyO;l4FG0x3qOAHB~ZSpN!|n?U>cS(YI* zzl0WSpi8P)RwKmUfGTHDE|XwjVA+fie+G3NO9lf2%RYqoOIR++VPIgngb;rYNo2+h zOg|VHSgyle2W|U83Nx0s2n~=fA*l5*z2gCgTK#KSTxKvZuyP~RJ%YwPD3!8GBgCIW zQ#;5*tcpnD&;VeRU|?WHDi)r=5~&LV1FIcE{Y!8wh(Q>9eHW`6LgHD#bccr=Vv>-) zECT~W3T1M4{?3200+JYis91(gY`Aj|j}<)`aE z;t-d52`j5NFfg#bL}o%pvCW3Knhw3=C{YmGMhhlO%_Mfeoqo{0f?Gm?tnWu(cqi(;L$_ zfb4q$Yo>$r%|f{6&V=a?K=OBBEs7}&3~Wdl<}t@~fhQbdUQeLzVcf#Nz=qUxdIL)* zpzyhXFc&gJ0%_y1A=Sac5!(x%aC~N)KKUbua6MxZr~%Btz+eOl3K-^RU`#_32d8F! z21d{dEKtu1U40o;JuElC)K`IOUj_ySSjh;sf}er04y;}n(whMbf(U*F#wpVUbl61d z`574hft4Vf1`c3;1}2czOwfK1NE1vv2u(e>kmhG#3PTeIm$v*2Oi@sAnA1T0BnEy4 zrZ@%$23L>;FbT+@AOjO9tU#SLkOLSP7~X;`2WbF>6-XSa9xh%neL)_lSUpo8)FP-p zX#a?TX&Rb1%)D7pakQ{xnujJ1Q@;o*4l^H|QurB|mVw2c5n&9ISOtv~m+)EJvn0 zeBcmcVpW*FK%Y}giWOudvJ1eq8b1ST!}JS{0!`EPzf*}mcjTLI6w+P zJ^;~326337sfSv?u>umZoS+cGqK}ggyFN}(1_pT$YR@T9NHg#=aDvhoNE~cF0|Q(f zG);>oCOARUu8a)A3=AL#FfcIO1Q(I~44e>$F>yWsr(z#|22M~|gN%k*32trhGjM)G zi+q?ksPM;PC6@ri%UqzWi) zVdlWZK@%n^NL~g-6Daj@drY73kwc7$I|1xv8GZ&HkXDdWV1Wbj5(7U2kHz$Y{~Tgc zJfM0Nn|#Ie2hQMvnHS_J}5Gic%z z*aZy+2DN06#i7oB2QnX2sX@($x#u0Ip&rXHeQ69E zKMOy@JBjHB)^dt6GrTjHexQp})R^HN$UsoX09_-@%IeV6THFg(Dxu$`(jZcFumX}r>Hl>dr&Q*h(!UYKjDoj z4({J01rID3ZfQ(c$mJB1x&`trvOK7oWZ-AGqHmpf(7SJap3t!>t8Sc~G)KmIn_H@-y7p0hI@}s*vPapq0$6 z3s8Ab^9@-Z=KdE@c@Q5-o)fZAnc+4AL>@H60PYw-qmmoiKf5gfl?PQ3Ncy><;dk2r zDi2CE$nv1(0|P(9Z4anCD7hlZ^MJAtNIn5756Xqe^5EiupW$`|R30>Hi7XFUa?Wsj z0#qJU86(R>7Bn&3UICV8y1iqX0y}7i@b&?)fE0MZ8c72`wBLFA22>st0Z8)DEh!AQ zKY-;W!6O>T@}LM};AglqT|SpnTnapXjU+7ySqjf^M**x|3OpNyEDuT_Ang`ld8Rua z(?5LS5M#O%0Oco4pD+!S`|e~w1uCW+G=c>hzyeZtKm(MZQW_eAupDq_23X!mVXJ9xD6TdTEL6S`*g`YtLy;BHEt00|_P8Fg=g^8oJ5Kn{R4x}D5 z#sKm&%qFO~D97{z9-LxKq8if^v_Q1Y^Z5HW>IBMA14aaPgSw6Qse- zW>HYZi(Csp^P?!Nb^xVUP!PeyK_wo@ZO~fdG$=iSYyx%nLE|5d+mbAdjJWKn&E+1DRt4 zS$xEB8dNwl@H2>k(ga8XW&unbR6&CbLbm|aE(eLDTL4N|AakJVPeT*Dm=;?4IRR~3 ziGgZ*kU>xla38=Ld*~K`+R;cBoBQhB_IPqLCL_ta2wRF23Z7(B9K0qf#5+@eg-jE`iGeZ6&Hu4C761sJ>sCW z1TqJv9wrVdlPVadr`mH08i|842}lvTW>6*piKA(j;F+Fa&nf050jtQ+94`SHm;iYS zY93^FDL;b*sHqGRhlL*4Tz&=#pXnD&!C6HDl*tgIi~=6eBrXBVWH1v!RU`vHg9K>o z1*9HgB0@bVK9FsKsRuQ_v8e~OTBct%WfL^vXOIAO^+1|omO)D)2~hVGBo48R;S5Z? z1nhi}PSBtyNCiwMs3rzE6EyMy5{K!8iMPOY!W#21ozSc&F$pzApMi-_0qgYPXOIAu zr64asbRvQPbxaQ-4k{@@>cN4}02h~(neOnJLyS>!y8UMkaU)4kuLGnE%~(lL?*b$a z@d`rw6R>tBDTpyfQlK;dQirBr3X}#w;%NG%)`0aVNh6gVpfU^GG-Tjs08P|@8wC)3 zkR~HY9ArKyXhAds140~><3Zx+>NiZkz{)AcBzI+&^M&}v-)l+HooFwa!fCf1)HWA0W(bzEe6hldOi&N42ozm z02l9poAv`{h7zd61=$R95vU4b;Ac<*m9ijln2TWI24FKx_!*Qyl>kTuOeeI~QUX;1 zAaR&ZnD`cOC1j+G9tNOtoq?Z08CEF4^ufgUz}%_~OQkRy!G#JxgECs)ISUhi0(L74 zKZA+^%nTJ!9Sm|E%nWERQ^gOOW?;6%#3SHlEP_!(5uN|LiMaR;y&Cj1Plu!;eu6IwB-!m0z9?J)5caB~)< z6IQ&#bV8e4b?d0mm4V>KeESpvE7vtD!ZfDy&q4nE(^N0@n%4doa79m69r` zf&iHa(+Ly*0kK<62Nq&#u#kb70Ii(VKxI6#2{7>xaEP(+GpH>9H>>OU8Pq^SA)xvI zVupYR)Te5o7zK$#T!9crOL2EW4JZbF1~pjM0b&lrU6?traDa(JV^0l~LS2y@2{#B< zR6#687z7J0m^joRb$CIkj#f~f1@!|N_!-pE3QD**q!M7^XHb6v3sQAh;6t5z7Frpp zqs>de#5H(eL8_4fGeZMCIYQff8tBOpCO!vdhNcM23{6mr927b*cR(vHO<2nt8VYA& z;vR4_*1*l!hL$P83n};+G+|X9%nX?L1DF|F@G#Xv4^zLvoP^JFf+6TU}k7T#unj2h-aY{l{PG#V19v#LkeXUeg^FdxEZik zAk-b8oC_Ma(FXMoL17Iw11`P*><(sr2JPwc@@%3e{0usvo)}0e%m`@xq62F+!Hj^3 zYk-Yl;b+ikfH^}4R;t6yfYt^&u(Akd226Yf*bI>Eu&e>o30BF^po5k*&Oya>HNYi? zlrE^=0J$1egE25LfQI%#9@q7mZlKF4CZ!8%^@HSL=7Q8S@H6PffaU9T(Q4Im(3(IO zR;$AFL9?VTtN{;p2Lr=7n0c^_0TYLr16soXvL7Z6GY2$`p~o=&s0XJYlPLG+IJ2*%4Z0TG(%XV z!2%5?p8&S6-Vl~UVfvvJkRf{Hz{Ei`bgm8TbuhutV2GY;pw*EfEE&V>hlztCEs9}! zs0kat2|t4&dTSBnT?T#zLs0z!@-|dEEI1AKfSu1|cm+%w8G)h?qz>i{kns%s3`XcV z4kj)G)rZ!aI0vl^jL-^DxVQ;aA6jeZ9JG)&f{jQ(-3u4@f$D=r2h5$&g4qbxbB5`I ziKjsIq30oJVQhpRO)&8qs6Mo4ISVZN$>4<=p#wui}h26*0^g`dHA515t0&tMEIr=VeU7TO*&ffer1FoKJN z;t&tL)ybx=DVq7%HX9#rC)fW|98;^6i$WW7CD z9IcvzHAYO(NM-G!D|CZIwBJe>-08Ux%Qv{C|Y5G)#D>R|@KDg&qo&Oz%n z6IfjeRSy>j?Ti9V!E!M$Oh4tp$zx=KR{Nia=4TUF0}g5eT>J(&;*3l{wF4+2Ky5w` z?Rc4hM!rDeFnuubH{ed44?lw`$Oe!KXcD>)b+aiftHMkK%^xuEGnk@{MxKX>i-4n% zg`dGxVS0fwrz;Fk|XW(ae4=RU|#i3Qzdk~Ezeh=C|d=Cl)B=I}Y*3f%UHHs__ z?TWt#$%B&y%wlLe<2}egBn=OsMbmqbJhC{nv-BP`E{P=m5bRHWhW8+S$l}nX@g7tX z!NpY=7#@NP1Ac}(Xch~DG7V@JasznIPzt=44z7`bK@=21Ao&wec@%>g7(^kbSuxys z0F?*LH6iI22NhEw{XZb`;4N^-@{m(;814!{Vr3+Bg=yd9FTtKtUh>SItAoHQK`u9KsMo9AV(DubW=&U|?w-vHHX!RRNKV(*4>K@2F$nv26 zA4ncL$$t+mLnuJg-#zFgKX_*&l70nfL;W6flK(y^pCHLALgV*7WRm|rD1RYID?t}M z+=ou`gLfz)$t#1RgMpvnK4g+#3cT9_Sst3a?*~AVKX_{@vOFldLHZ$U0Hp4t6*MZ) zMG^O*O9H@qnUM6WLX-b}$dUjl@Hq>}@}L3=WIi<`|jiX^WEO3ont(Cq&J6duU(&_y#3pxGb1dk0A#dMY5p18DXK zZ}LW#hZc_ypxGb1SrJKI54^XVpWy*C`-3+XBFXE68+ZH+51`rq0mwf{@&-`dgSTKK>jy8o;b(XV&HmsG$Vl?$piTTB{m|?WJ|_fO z9u!_6d1&^32&zw!pxnTpXP9HCB=c-Q2@qr+q`Wb*1tmsM z!huA%fhWj*27U%x(6As#91`CMark(U?GErrcnUv*Eoi6#q!!%_P-X*(qnTj`>XU)Q z(bU_4`eh(-boG##G8TRYJD2GJhTvsnc4%F!^PqB_fuF$+Z9EGuUNZfFC3u$E?#%Rn z-yC8_cAy>-C}be6V0Z^AIT-jE>_M&oi9=k05a)rJV6OpZ`M_B@(;bvK#hC0*OyA%J zw#PvNJYL4a&)}c~X8G_lIKX;H5IYV0q1o2~G@gLubGSID*Mm(QveKZQpTPmt{{tP^ z4lxm$W%(H#KplRNIMf#q34R6#P=_DX#z9vPDiA>8XzCq7WBMQ$K-9xs>YUcysM9#v`;Cuq? zIu?Eg7Z#W+Tx8%Z4X~^XKZ6UXLd4>BmjJMfnOxq$Omz7I)8h(i#9`6nssJ`Wg`dF{ zln}7^#}#d{2F%@VplCx<4_?;Iz|Y`@=1;iz5wNT3`5D|{iyR;!3Xdmu*aQG1b*cC&LG3kEcXJ9*nq^*EcXIg0tyyr!g>s9%`osYc!8=nka~1;aCpKC zGLBIXo5zIv&I=UoAcN2?24xqJ#SjZ1%j`iGgVHZZ9HJf}4oko2;-G~XAoIcIgdl?3 z3p8&Jl7MJHI0$Xt9v0zVpoNjxEPen>2;QJ_5M(0QDuhkmps)jpquJyQ8yZAc4{GXQ zQxEExf?NPHkAZ;!78l;28Jc>K26Tg915oG|gGO($sfQJ|=;}dDLTnbp;?9VH0W?qy z4?}NIU(8n3ON5kV1CA0#ND9&*1w4oZVUY8T=p_ zAH;H){veuD%*YRv(LrXS1&SYRh!D+f{sQ2_g@vENUjbIY23UaOmW7`ozy&NT!_N=^ zYJXuVdID0wDnM%Iz+4ru1xC$Zu1Ll@Mc+nZ? z0y8x*1Y&9+EW9D6!s8(jlqo=A05KIV9t2rlz{1ZE6ay|djDkSp=OC46CIrD+JLo3- znQq_#uC;?rrUwXciZKO;Oi#!G(Oaeoaf%s*fMyyH1{zL;HtRw_GYuedh=B<42*~ot zkP=vshs>D%K^JUA$P%!eQ3$AM>4{mmg@RH8s96h2Mj$pA^D~4BfIY_)x(6I!Cj1Ox zpkxXPW{5W#E`!ES82A~&Kq((24sjJiJOS*6dVYp5P-zZwH$*4g-C>~VT#z_KCqf)l zjDW<^)q|G*fW*<&!x8{QJ;DW`{)i|Rr-jRaoo2$%5DqFYKq{bG&x2AY13yDJZ1MthPv0;Y|^Vas@6_Cq5v9DRZhCVmC1k16~O zm^O+4)q%+NLkGMfKy@HU9A-aETw%HbJEs^^M9TCBj3BxJ9P%vu3=uuxgvk`i1Cfag zfyqQBfMuj2LA^1Mnb4&96gqeoSuqW?%OkR3`UgKwF{a2F(;d_}#iSxZK?W-9pvu7s znSq}n@(b8t6MlwBv_|-OQ1_34pCJlVw1O;xIUXj?0(QJt6sVO2l82fMb4U~{vSEP< z9Uh1RwK_oRVdlZa1Hk4yl53&bj9|Hr!Q)u@m zMhtoa1=Ji^ITZs+Bp~yl=D@`v4IFqw2A<(#K(#P74IqbMvlx_1u`D}@0gaDg69=7S z4mXDf;e%Mn0xK4NhS(l(qKcgXNmQ|Wzw(o#adW`+iU~hM9IOC? z2Ec5Pdl~o{;$ZbBI6@c<;o?WYg(=9?C*VZM!p{&7sV7tT8R9{c16YdUc+jXUmZCcz zRC9rR1+kss0yKZbgX$fSI3)NH;#1&u&Vl(Qegn)!@dv;Keo{PWUkOMz%v5NrH31Z< z$l_4HCctL)V79^3gCZNG9wrV`?*LAONeQ6L1B!EqJ@7C}0A(JKI9k{xz{Uz;i4c@1 z8Tc6zKw}Ibdtl|wY7O}q)9DSnVXnEPPjbD;V_nFJ&c(+4VE zK<0un2}m5K4<>#EtdA)%2Nt4<6X2{hFjjI0m?gu{kPI5D1(^eN_cQ3!LJE9cdJ07r7;ZQl8km`&k_;pcF&rVj0oGE< zg!gna;iuJPegMn*@H1qA1_?lpg9Q>aab}Ky%+9^C0eI zxB#stvp_8rkT}Gh2ys}07or~S{w!F}2%;V#4jMpf#B60{gC;7%8K#TAVGXZS34?jZ=S{MBSv@*&;4@zi_p95MOj$}4m{TguokjjBA zF@oBC0jBQ&Se_~8%=7}#KKUHbTmr}(XsA4c4(;T802kCbKfndG6lm0m0ZXl)D+4LE zb3Gu&<_3U`HOfWHR2M))nhg95xo9IsaPbVVexqDi3V{aYMQ|+fGvtD*0FX1G-hqp6 z0PADQeFBa;raX9)GY{6(gPL>!+Sx}ss3Scn@jR#o4SAdp4;o{TxTe6AD@G}&kr_2aYTHt3WEPzCH;S?yn0i3^? z3jctuG~s6`0!1At7|^UNLR-`Zv$9A6R-zYKK+G!Yft!UMq~Q9JpP>kc>xxAnt}2EW z-o-J~CnRu+Nfm=eg+UnPHjqcan4h5-GDye5&ro~^7PZA6z_zpSGnBA^qZY)1j~#@#h`{C zc(x5H{tOx-rJz|8P^hDe8$e7gEr2EB(jG9&grA`lR*FGm3f9>zg(Vuaj8M7(tdoVG zq4WwQoJ&7|O*bk7jckEzM>DAmt&tA1p-cc~Qke_bg!(d2!2n9i5EBd+gJO$;pP>vi z`v4M$xCJ2&YuP~5GrR+}G(hTMB{oDoLL9wl165Wa^$@=b!;faU2$O&m)kbBYCK5IW zfTn0bUPiO1oM*ZNWb<9Q4Y+iaDo1a8K%H6+*^g4s&rlA^jUYQ9o`HL^99A_CWv zN=+ z_ON)M0u&n{aWoH9AoavSNrVAz&=qi&GvQ~b0J#}t71S>mL9HZ^6JSkuh>;91@k$;@ zlB|@0(mGJu224v;g2pJZgjr<+Se~g8J`Gp70xEIK(!4>9O@59Wbrdpfrg#2_`B)?*aoR8(D)EY9;y%K z|0<~4s(yggF;xqI>H2EW+%uLat_HOcKv4q;UwGQ81~t4v;t=x@;%J2hEW=fUx&|Qk zKntGdV2|)KRHJ7sxP}ejwoUa8aN8!S29#z&`XTOs$7c;}ybIzEggB_13o1&X_JOTq z;Af}>&G=vwho*yC7g#k@3mHjFss$C;AY0K*0=2Y2E`o|bho-z*v=FEPRZbwAVMPnn zrEqb`#@Q5phB{EU2TR(k15J{E(g4U65RZV@9@l}It{`!!i4ZA%hB}b{u(+(g0Gtl% z`5Ed#eG+UcK+`^0#2Y}>2A0&(0BR$FQUSze@Kn$MO3ff~h|3V-paLKkB!R90)@ef5 zfS$cULBzn%&;XiE1vwO=p5Y=){0q2PHQ{GyKpWt?2v*6@(1hfUT8k z1VuC!W11kta!E~~b{w)XQ0tpOi2zv~Y(GCk6Da;b;?PjI2pW}Q;Adz8b$UVKVEqgX zaPb-7O3$bXRz1S>fifFNA1u4W^uffRfc4ckgQ_Gf{lsR__z*U6P#X!GIB44kHgVAE zJ8a^RVpkhB{|NU`GpPQ@;?d>{U^5gJPH$k0M^IU`~_Uo$?!9@ zfJ!b&6lZGj0jCGA7Epj-(*??jAos%D1MT~@z#zNh z2gn8JDnMllHgQnX45K#?;;eOM~sOIt*$TEKJ%V>q9_hLNW-voeWp;09LQI z|ADbORKRJ$grA`URtiGRy$mfrIzU+v`0!xIl<6P-a)>c?Ks%@%52h!mbBalIfO_4a6o;1EIw8j`u<$c<8ce?cT6okM z0}dUKNCBMH12%=Ja|2Y(1t|Xugx@6s<{NdPRVtUDl}Z;ZPNDvWi)&1i22W*n`9KXy znLfdrQ;eyr1{SDYGvKT>;9f0L7i6T}grA`cHeL%0E>Hqs;AiN96;3egVB&W`)`2v_ zs#};wQ1t-P2wJ>^9L_NDA0Uk^{0!YPV0U_T!#o5v0G2GeL3|_w;Nl<`fFd6)_`5s6 zK`g`1&Ug_z{v~b3V4$1fv*kgft=sL!q3p-1C9))o(W*LGWBc$^QC$~ zD-^LLfgbomqMknx9laV59lfA6)L3-%LeAM?;b-VA0P8U7h4qj?{s$Fi(81SUv}Gxm zVB(P8xC}o-FR0eWl4*OP-I3lspiC=n2rIo{7C@KF_rj6@EUIDRH^5zO6MlwXw79+s zF8}x$dePzB_W_$A!_UwM8bHPpJbf8plbQNzK*1x%)Heg1km~sv`q0|zm!a+TK1k05 zUXsDZK~aLu23WZd4e=|`aO*?r#DZE&aB_1>q%0oe~KO0l@8KL_HX{syp%jQU|M zJgAGVL0fA5u(5JzWW&Xmz-<5x;$pJ_+M({h0<{6HiE$a)*6&AaV!*{efRnNeKLdDh z2#XC9po0Jt6d*QC05y=1LiHNh&HM}#VAT?s&%gi|hgYE!K;;xR8=zI_1V|NXGyyHY zUxCg~PC(1=aB+BkpMWF3Pk`q43E=!LW;6jU!(Rb=o}Xa?T84*F5iM6=0rfN(_!%a`>M&>^!NpZz(J&Eo*DMwbCOSZp(!>y`4WObEDH^Uo z%Z-U>Ej+k5WUx|(pJ5`XKa0%<$SMM+i3^}MfF`4nY`6*?#hZxM7KDrMf%^fJTd~=2 z1MCOJiPP=9IK_=7!Frd_+;A1tj9}nrm;@X7ga#5^95M_j!_P1Y)WybP!6Xf^1x%A{ zAYPaRniEFy!bMO$2(kgRAPOW7wE-?30rSEnP@2PLLkZM|4yX-iW2Tp(v&fTR1tru5 zxcC}aj-CYSHDR;i1k{E*U>g`Gfm4>zWc0v-wxB12Dt#ocT!o240*i&8VX_3+K%>d9 z8U+^I(7>3C*6Y3s6E^@m6=VWryw7MdtRRG$08Q1C(Sq|TOgsc`0%U29(PYrjGsv|t z6QBj)WYDTckT^8BuENAC;3l*{eF5up!At-Zy$t*elVK47GXW+(2X4Y0a4iP%&lhli zjA@Drq$x55l;=SC2^5x~Y6pz@8K#6lkB|#2N#D-ZhB1tHJ?BQE4m9{U3-{$(7JsJT5*0ICjJM~W}nId>3L3t^dL?6 z8K#0v0EIA!W?*2r4vpohAX`D=Fqgr^Eubd3fE&g}Q(|8;R3EIfIt{JJ zg^TBaJ>WGBRN!Li#7;wN4P1w=beV>hl;Pr#6(&s6c0iKlG|+GZ$W7=zega9B(^(+u zrh`W5u&A4^162oU(|b(^Wf?5Jgz2DlOvsA$IYF@Kotu<&mfGq}@1(WhlUq8xEc5v=77QrBnFCK zh#+_fe-2tJR;XVP?MM&~)pe7SY9=Z(|e8Dl2JnZ0+C(v!UPe26~vOK7s2kD1y!+ip(oss21 z84n~6-G=)VlxUFTy`XmoJcVq-1z)|5EDeqRr_gPfa}Bp(2ZPLMow7cBUGUL^TI=q~xE&|R?L8@7?Qa=q}i2py))B4+dppkonME zu+Knkd}Mi$eIR-0F4$)v_aMoKfEEdYh>s*61xha zNFJK~!8aiz>CcCT?{jGO2bB)sbwSYLwG@;eLH7wmvi}QEt%0Py44OS(K(qe~P;?^6 zm&4?t*&lo%FOqx}C^$jJL$g2lhG-=DdeAf;NFJK~!Pgoi%R{r@3uyKS-@}X~-w4ef zFQC~Ud~ZCG{3Os26UcmM_J08y+e4C{4w_8`$wRaM3s81MmWQ_IUqG|}3s83+Nqz=2 zdR{=YKltigWO-0_WZ-9b3C;fC`;w95XF`+5OKA27-${%lKO5A{1nGxnfACecNb<9w z{(lL{{!H@=Vw@o)>XLyauWkT!%|pN7?jpQ4HlR%-XwU#;KD4xa1>d`M}@w0Z`30EKBabS!lBi|GL-;En9y z8{Uz0u7ZZ#D`+_iz7!luel@6G1=$QOM_+*=30WTGQjk2f9DR+}j9LvE>|o$$cnv8> z!Pl%KXaYI|C>YHXbWgk7^DmwzYK6?uR*N~Bx^T9Ytz@z z;u?GtG?M&QX!?GAV)}wYPI1Np$VIu}i_(#mLEFTyA3&7tnI7=q5#IJ_f}wsOhl{H17oxhxid9%)rmEU1s_O15PoiH)u`1t)NWHz|Zgo zQsx_d0C^hZc}SIO2r806=6(Rh8L~Jujck7~{eUi~7}E|5FkQa`HaQD**AB2d_!)M> z#^b?!1_rn|s7C|}4QQGF8q}m@;AhwgiW_8cXwz^PXk7`iI8^;EP+`ExpbhV8zJ_T4 zk0I ztRL#o-JraUEDkkyH>mM|EDlo-8k4~$j_z)lIiOOfk74>%R!+hCJ)j~CizD}d>LVfn~|_|4-HqC z&b=V7U{Svp)TqHSwzC(97x#h^E_iD(x&@Fq*QC9mP7;aY!-o93)mb6TI`N2 z4h_qFkX5zy2OudHkzhd%W8h~vfF7n$@q?fghHM@*4i16_n?Nl?XpRFZ1LfF*pgo=- zacGW%i-Qs_N=|_q^akWWkOh#e&#(?3(OZiaq_kwy)AoHQkus5J$97#VYfrC8q2HFgJ18UkJ%R{S$H;`tS)EiI)Azd56FS*-8Z0$30Vis#gJxL{Xy7bCTP&!0I6r-XE+2K_k#v4 zTpTnG2Pz~X>J68G`cEMBpcWHI9HJf}4w{U?CJvgu10NR(OQWF7!obgP7_>ePWH?kD z7N0#xZ0`;$<5qkn;D#%q(O|PN8I0+i&Ko*CpKMC?3vN%jVC>W8&Vd_CN zrg$>sVrpaws6nUDi#Lz~4EzkI&>aL-{{}>Z%mD>20|UbWsQNe17VR4lA4&cYwEy}R z+M<06N})*dhe277fuG?mq(#g4ar*mePI1OhV2bI}gXtftImH-1L%5%z+%I4*<5vjv z4MKf~P(L8lPYCr3OfmhIo1XBILu~rHYEFacW;L7=)6;4=S5B|5;S}GlR?F$Ylq3gg zB&0GhFla&&5QOAslmjj51Bt6cL?9$TqdX|RgTz@OA`p_FQ64mm3layF%@9G*I5DF< z-*khI9HPvO@++oaXyz1?k_Tl?S&Z}Q80B|NYvdI3k_TmV&|C&IoFPW>Gs=UKF=(y` zT^v;8g35Pv@f#519zbtGfl9MN`u&XZpf-g$$QAz~02F-;{EYITDhHc!Kc*+df-cHq z1eJ^oSad3YT2lyzg9zUK$`GhHxX@XQVO8PJ1G4?-2-=L!}J5Q*+o?O85KY+GHeEen)Sk9gQq9T@``ea zgU2%%7{nW<8%*c)R|KU7(3PVW42%p844e$0)CbC4><~K`DyA=(&M6MsVgM500l5>z z0L2jle**(3>>2nQK-DWqn1P{&gJ~JaleS9#|63+CWLRpJF#KR-5U^nQ|GzdfBH)MO z|A`e0ObPX?85kVqGPt}{X5g?%`v1Q+CA#7TCj)~;a-G3+fd!mW)178;3Qf;>$j%XD z!PJmpsnozw!^sd(!N8#C*ujx}^dGgY}^X1`h^~M36Z( zDbke=O$-VaiVO`e7#RfWAOEg+eenN>8V=@VuOI&Z;n%>R@X`+AUyJ0rh?klStQ^)4 z{{Nr8;5xf}J-EjQ%4H2qkZ=UK3uG=R{Hz}}F#Klxf54vU|Nq~L|4&#;)HVEe{C}aQ zQo7=I;{O{pvy>}-H~xQM-_XGD>*4<$*2(|>|6ch2Me-aD29SRmK}tn!+ZvY>Uj)&772_p^+!KfcrdUyCw zslcE((VjuTp@~7D(VjuURx$`Xq&RdqUfMHo z)H5Hhn0{a*yRu*eOaaIT^)N-#CopsHcz{wTC{#d}fKP;~5*R?b z4HA+YSU_n(X1c>XPL}!~^$ZUBOF_P7c=F;ugN6QbF#E;}c?Jo6Q1r}WIHSK9EOsOz znSuGG3_}1YeKs^TFjTNH=-4VWFjz1%FeYk(?ewTr0|&iGB}WUB2Lp>JC=@_}1WC7y zGwc%@7_1u@7?P_w7?S5SL^8azXYc^U6)4_nIA4iW$T8^DaK6;4u4CW>#h>+F4h9bf z=CdG!>i0fiaG3Z1!b^Jw4Ny>7FfcH_Zv6jX0w)6pC`e&J_d4qIar zOm~>e$r1x9Jdu-W182R2rDnZEV=@B+%*plL3=E(Q4@#yrbCfH7DE=?BKEMDcDI?%G4;)Jqz@c{dbH(%m6%Gj%+ob>h zU*BiYu;4CXuux=}&}hTJQGfVz#Sb|K0g%dxN(~It6*?IeS;38y>2bb{CT#o-iJCkC z(-$n@RAvmAzQ>nQ3MO>Nm+{2(H48a)roULoxq;Ku$yX;wHzzS~`ou+?YMkJTh`)jR z!o)z4dj1A(P=l0#zkwT6lYwaPASx)vK$yRQ0o3(FscN9&kOl`*6$BAy1huZQsAmS7 zi(F+fFfiCM@HenQ9fYXMAO^8xSm5sLY^9*#?iZ@5V4`QHXFUDFQBIBN21_{0IYAXQ z0|NsO!}JYbS*53+UcxEOCjc5fU|?Wi1C4dDPd{^vQ;Q2U;sP?Br($BD`1Ji>S$Sl& z85kJA)hhHDAqM^igsSNd$2pZ54W{!fyLgXQ#sWt`@MP`!+x z9wUg&I(@mVb! z1sK2+L=5~5oF>x`Eaw!Lgk>JkprQtnHiqdRmUD_TW=!W;!D%iC>S4toX(b>L5oB=8Q|NdKsGUenh>Dn2B6Lis3!yw1U2^>7(i_uka|!X4OtwtsRg7S zT^wyyBo|nozkvbNPhdcvSy0GdUNpb!CxqZ!Bu zT3>-p+yOfN)4&Ltr~$R!peAyGnxPE*4UC}XG)Nq3B3v9aaRD+BsvhPgM$j52kT_I5 zTpYHL9jcxS+&JfNU<9o^29N(hHNYg8CQLu@l~ddkv`ZXh9#kL9JZ4bW7$gqW1`}ri zt*yZ(er3ABDo!ybRv9o|&k9?k1~r!p)FoozZ(s$D0U-MqD$a(s2Ad0r$tECYW72WWH!*&vuWXbOxQGq-Yp zrocer=oY|23Qe3F#0QxV%FUqChI_~K534!Frl0%H!9HDe4X0obyx<2VR=83I26#mP zs$h}Dp#?ZMh(;2JRS?`2(;uwn6qf|mBgoRwVw`&dL>g4xAW6fj3+@#VX;5W=Bn_)I zxDP<2L7inJX;|ICeFH2#-FzJ<|8%>4b~YCN2JR2j7p&wIW8&nP{@@~~SUo3b)E*Q^ zpt1xML7)N~RMx`c4qPTPFfhQxVc8yCJ!oSG$Q*R_pcNA!adh>def&%e%Fsd|WC5hd z{{KJ76$}g-AU`uOFld0gh9cA7tmCv25`*-89T?yp#OV{JbEO=92xwPh@`4|rH=W=#M!vn-$;K~TE|)DZ-=XF#1nQ1h!MQ@X-o zE<*rjr?AT6ha-cA^#cZm=?AuRiq_-lVc9w{aDbAG1=j%&%cKT|8g4ATMsEhjS}!J% zTJL~>T2E-Nk(+_RG8@ua0X2lIPuJ}LS=gA#z|bJazyNA+Iqdu20Wv$Irdhe-rxK{^ z$D0Wf&~Ij7aNP4h2jp7|&a4Tb7E}HG&lTSP|AUe>D1aGZ-8ztZOQi+|5Df|u%cKTS z*KDFi0|U!TO$LUS*$f;nH5npmlA}bXAK1XDq7%Y-$gU!}g(-x=MX!dzyCNj>kX=Z! zi(UvrgIrCrcSQ}ebOoq=R*}r0Fxenjq#o4I0U3{MO+^EX0=W0x(!vC?CWPyd9mv3! znhXgc9f#~{xPmJ{P60I(Lt0$)K+XvDYLEj3d`*jUMGYtOvRW7A3Xrp2W-m3B@nhV=(GALDMGbmIluqae!u_%PP9kL7IIAm9;*}_zr-NF>=;-dF5 z-oYS*-9>MS3d*x3U5%@ zI__hfVUfVd02sZ1udYQx2#fdsKNBlb7!n}tzmlNN zllT8WwJ9kL4B$kQzyPwF5o8z0UXVS?vJBq;|JbIauplY@3p{Z06+f zd8x^u0ZOOfw8_c543r)__Bm*D+;h-eDCZ#ZqRv49IbDLxv01>t@nW8X0VqCRYBCxm zEOpSTnWH2!O`St-y44m=E)Gx@0y!4k8JZpt&d3=I4Qh}mD0uCg{{Oe0Q?~;Y*n94q7iY88twIO`riJkT>n`GjL2lFqcy@*p>kljVv|w5&n)-u_EFBV}~Y&4v?=b5*Sjf9T*Hi@vJ8B zb81b3bcF{4g9Av;I%>Mz4o;2wpRv_Z42mEb$0nA73eNwJLAo59{_n9&U|<6c>{;3{ z_=CF3y_pP*HQY=hpus;UhW}qc10mLo40+ZHpn(wPBb_!3!JRP-L7|!l_&RGC0zgGr z#~g;h4jG2fT2Jqa?mY}4wVB=(AuSGiAq);BeR4-S1 zQmb)Gq*8%F30$ghvnW(*u_%PP9_8i%WqK3h^qBeoK0_5{bP4;7;P^+!C5~)>SuBeZ_T=9dOLBP72 zqu#(_-v1cu{R{&2D_)6IFJVx!NU&h>{{JJkdI=~*EEv51{|K~5u;8$0-~h2*5e2{x zOHk$q`ON$O4_%uE1{P4^lF-8N%lrQiS^IhrA6EGM;I*#S0Edc2Ekk2PGAvZ;85khJ z!WxJiET9mv-pjy9%TUqZ%g|6+j}|mPxH&+<0uB{WqO<~NNYH?W&UZ~vH3tci@3PQhv)=pvcR`B;4RBiV{{Nj7Bo8W< z6IvRCWW4`>`wA)`K%-`_9{%4kL56_?ROo;Uj5}eB8aCDr3`~{^3{3T!9tMdj42%{D z4B(vS{r}rc5Zn9z*T40i5|*Gmgp~6btsXExo3@8jjpyrLkQ5~2P5-rXrGYt?sH zrej!9!+F8dB7uPslqEzA`&YZyXj?_mh>{{Kg$A{$f^{QvLJ z^m~T)|DPvnvM*RVEc%}UDmy^a1{TRRJEniQ#i`5*E?X@U{{IJ;ul10E=u0Bl71`e( zJ1+Wflf9Rb!TbMz@Y*2oI6Eh_B5nNtpr%H;0#vGl(lv7F4Vo7KRifVizleewG1hw- z>Otw<`~Mf#@V#tx^>ZZ{YU-pb9Op6ouwKl-2ui+|N)7b_)qB;R)MmcWvU$nCQQz{o zqA~&6Cdpt?sNiBz2xUEF7s~9S2Wp#ub2g}5;^m@OldN4)>t$RKnhMR;*`RhFs4W7? z&7hnek_>A1MOV~1Fju^EcQ63u>WXCcV>QXl6*XBB0o6}~7!>MPz7p|ZV4MhYQS}2B zg%D0qfp^Fbl=U~rGH_ThFfh-MW#9&-?-{ZTJfO13Vjd`ASx8j0uqAl^|GX2_9swmm zP<;Wa6{YwXz)dbtyBH=W0j??QSr`}^l^G;JrX?^mwAFVqFw|s7SAb%~XC8w>qX&bG z&7=SS^}7Tl!L{M@ssu}Q1_{dq1_loX1`fwr3_1;C_j@p!nfEk<)8a2n zHwZOMJHRO>CA5HnL7);O4#hC(1Jez_@(&mo1gfEOAPOok%rHIS0H?U50t179AV?gF zp`CSMgXt4M(hdv^0_spH5CxMCn0^2xoxs2#2pW$9Nr5o9-^kw}Trm9uNV##U z2$BL}P#2Pczd?AybcKVQVp75&w}Zx!Kyn}qlix5s04#rifk6N|{0Wj~fXQE&-T;;d z`Arlo10g`&XOQ_Xrf&et|6pJc5Qj*CNvOOC$MgpWImHfI1^-%D~5U|u=mi+ zsb}DCV212Lz|g=79ydkPz`)>rQZTOh0ylGm^0YJSq)#+YeTeiJ|<{y+3erCqb^p1?~O< zjfxAw2c$(ollP#|1FdcV#Wy4ocZ5R6E;Z6z!nsz=;EM3 zFOYiBAQ;$XAcDVv0W^dSQjabU9ja!4n!^v8FaQmagVxw04`IV4KnGiavNTi!$aqk4 zU;vHMfyU0!#X%dkLF&;h1|4()QjabUS`Z5w?Sq&T3^5<%BGBeUkOZ0rMo^{)VTcB} zdPdL~I7l2anuHMN0gs6(F@navKx3Wg`amHI5;vGW;R~lcWaM1F9yIa=N=@jhK`RVF z;^?jdjede`hp7jpdC;&pX!kcr9Ht&74!WQTWDZO{*uDG>jG%S697t0MU~!N^poRV* zgJ2q<1~I|Bjb;H8Z152z&%nSS0?sD<4NRbT!)6XB-az6IbGR88pcXKjKtr-0vdS+sfQTN02c=>y8?-$nZp9g zDcHn8qm&$=MbfY^00$0#0}Cv&pca6I8TcDma6}3Vj!0nvg%LK3LGyJmaghBYP#?2^ zXqW^jkU@Nq#h`T{*u+5-hREU|3qk5ZMGLYx%p6b=ge=|wN*N#xplStK0;&N#9*Zmv zwSW~AnaJWW^`I4HAaQ7j!lH&1G|2!GhlVIjoGp!^9x{ap)c^}>HqbN)C_O_pz{Nq+ zB%ovkQx9?oXeJaijRX>hsfUWQgX%?)#b{}Q9lpj86#k%~hWd;hRDdCCfQiEvlfevv zigSQ!AY}E>kl+BxV-p9hZbBAUglRyx7$$xJoK1uqI6*Znvd$UP70z>t)x#1GCvvI+ z`3PzNCx}MT2MSF722LD_iW9V`2b+4(ZV^mz<_69uU>8o`dY)5I3g#Lvv_+pHGp0X4 zb}bhUTe#4ZD9H5;{0&^7sYy)R8@SLm4#4aO_YpAF*Eev3%5!81P(*vQ z#qpvSXE61!QV41>tia_3&6j~33bGeeg~KK8fJ@@~20qYC2(nGkFy{kJ6NAK|Ch~(y z2?qWKK2RMF5(k+GYOcb>L6r?QaU69GAE>ToLJAU?%lJWag&-%Rg{=sP53&H%N&zKt zSgRVewh>tzlvx@08$>|eE@W|Nt6K!rwu6b=GB7ZJnq{C?hzKkW4#{=OP{8i84s4N0x_%h{yt{Jjfg*d02B@WCv6ps{mp zR2~!%Nb;~&yePx;1(!I*B|&KuNgA9A82B4RB_PtUlm_)RtW7U!05-jzAI)|l@ca;e z13#LrLZHxN;BNqTCy}fZ0)-w(9L*k3-x3t+0%*}H1S$hS>OuB^*S|v@CIoT_NCIRL zk_C`HAb*1Z+61aFXgw`RJ*@EpHAfhnaQPbqV0jxR4sr-cJt+F%=1=dr!pWTo>KDO< z7#M^>NsEEM0o=Dm76&;EBo50{Fr%SiAPBM=Sv{ye0IBzwZZLsOWcrrxoI=yzUE$=M z{`@;9Ka=o*=>k7E#iq+$<>Z|1{sScPV0yt1PBA9o7t6AgAj;D76&;D6!##%B8kH~Y@#0EG@%3udj{~D7Em4sRhS@cV1F|(Fc>pT2d~am z1LZx?YF&ZpAFgxyDG7r;%78Tc3d%1G3=E(~JgA%mFV7XL7XpPn0|SFF$Q>YYkUK%` zbg26#LFFOiT_9UQ6P1=p4IP%6xgOwgFC5ddps}!;dTH?TvYL6y*r#Wil53~)FW{8s zVgN521C1C>54giAQ*Xi4z+kbcp#wD5S;Nd+QL{iJpkgU#Zj93w=8DF61_tYuwGTji z5C+ZJHpnu7rlc4wl^QteyBHXLzh+>tb^8DR_eur^3$9#`AF>Pr4*UK$fX1NekAN1E zvTg+FHAw#dzb08ypnkE0h4=se+#oSfa4{}e?GAseD#jS2o zds3f#yP~F(K?^i%Xg%lue-8!@PpE?wKo%|FWMEpz)F1$|(2|3JaU+PG6?qLZv(0}3 zWbx)s1{Tl=-b;H11(05gqz3S;Bgiur+zgBxI2o8c7`QejFz|sR39^*+@aKx@4SXC5 zBA|(4$are42552^6xGuk?r<8^>$kAJ0!=4_rn10;q0m`dP^f`I1~fS8IG5oG$WlwC z1_{U%S?z@vozTUooD3EVTNs#LW-@q$c5v9#ykVYJ>%ly&){F644LjqtS}%uyS}*o3 zm2qlMELJfv)^~r@s^$J9Qt8g3P_b04{)zPg2CkZHO|8i%7&vOZwM49!GcZnm#lT^G zfPr!I3I@K-Cm47(oMPasZAb{%aEgJavWNdfO-qu!m#dWKlUMWSObsJ_ZwzI_pE=2x|aM|9UWRTm*?h*}fn)NFS)N z0$M5xS~3dCWS|*>=@0gCN;*SVjDr+{ECflwEp7b&0HhfdVGW!p>zWH4=P{_j#&{vl z2hB^GK;6O&wO5< zhJ`nBF)(e+WMBe$YXeh*fCmG+Aczgp2k|!BUJxG?lAsU+P1Jx=3OG6v7#Kj&@p|F( zpaw=E9>nBCZN>Bp_c*oc*`|W@g2u7E|NjHUBBW44P9~sz0^Q2sIS5ejH?S~BfMOD~ zJwU%f>If!#t*pMimAb3(gM=+6@f$j&qqJ8dVrnY#11r zKx6O@^O!smk{K8nUZgN^ST{9*r;lH(W)K2R9lx{zuRB+G!O6e?n?8PVnn4Ua+l#cU z1Ej7Zf&Jl+M1}&#CZ>>z1ojlr^l^_EW< zT8ILg69P@LI?Q9>sAy(Tm{9-!#p_H43l9b+@N6My?R`ZugTf1GgfCuJGYGthMl4JL zrO6-l|9^nWbjNv&77g|PUwAMuf!zm+-ilNPh5F>%^%WirjGZ6{zmWg`!y+)Sgsoil>04vMn|F|NoF@V5n87_Y$epWO?$_ zo`J*qKZAk8zJCWS7#P?1=EyQIg34|ahX4OT`W>47p8&-UNS_A-^IecfK~p&viVPb-3Amp5@$U-I z0(ucpJV5J%11~ih5W7@(SAe)ssRf`&mp29NvW6sRRt5$gRR#uM&?cCr|Nn!kdJ9UX zRsi0;m}RT5JI-+#KdHWK^`UD7@Iuz!1{rpcm3|$gbv?as?>LU}>x3 z7>mO6p2wUT84mLpBtWV`sVbxyG{?qVQIpKR1+=6eG_eG7JQy=FFkslmz`)=zkD&*o z|HWbgw&^_Kl&QC2;0NzfNC0n9YJQTy@Bw6k31}ffMJJ0wsKOz;ik228(0qNZCUZqd z_aQq_IuF%skgI8kt^lp@s$fXv05zDfxeyeipdtV?9SJJrLA45~z6OQS55@ngh2H=F zYl2!upa27{Sn&S;uM<>efua~T=RQ54fl)S`8PXucV;ab?S~SB{VTM`%=l@@kES>_Y zDnaQBw8WtzndQmkgcwmq=IMP;Ii=Z`G6;bR_30a)a*9m9@RU%$BT*7q1h9Op4aILrl$u{h3SIHBLlz~MNLAqP|%f&2+tiUo@m{Z>$3 z15Hpu^Wr|FyqLi7-(lbX3l+_53f}+!JD#wBWLTye6h;64gNwF(|5sErgVvAyUjS9d zf~?MZ!TkQ0hP)vYQ-0Oq?r$;w13NkS;Pe1p9(_p&XOHR}2%r7~mr~AF+Y~+Nlp%t`% z%oIX4N$@ua!uqnHejeESAcDVv5jqrs=r2LVq2{2AGl7Qj82B5|#aW;eb|~VYnL-wD zM+{Q~+X;w8C>lT`b&&Zj3=6n$IFt)I)`4Np2I$~4x&(Lx4~q}Dp*>-A^*o?$-B{G~ z;P3zs07^OHh?!8q z4buxgaEjFng2xx3Go=QIDNF&FIB4v_1u^ppA0hxb(+@FIDg+v)0f~Vc1%U{0$nXvW zWXdTTVZRV$sG**L0dyWlK0*U5l)zK2EeH*Qpm9Rb-X>7eosMu2Ts_G0#YpO*@dWBW zFswp|Lxy@87#Ki#Y#$Gj#RsNO_y`)zahSg1Bd1=HAUH`fFn}%rU}Qit02Cr1%Rp^- zA%r+c2!t6`7#JAk5aN)LILIV1qXj}-@W*zGPn_|L;GIpNQ8VbsF31efNE~=t7<3>B zx;SVQ3#1;J0^sVkK%=k>@arbv;-H25pur`mIsBlM02QF> z)4WiF;1+ALKk9Q6$hpo4Eg2^`&Y&_Fgw9Nl!# zKsIRb6kR>&KwQw6HM%%xfE%P9-JDMh3=Be`M2Ic{n(_p#C_yub5j5oq5=T?dC^7xO zDo!z^JzDaKpy7UyFVT$vMF~h8-3ZW38)&Q@rXCbZpb26eGir=qrU(4w6idQ6Q4E_G zf!PB!j|p_v2x$HtW)CcI{GsRzYUJxBto0WN_y%LyKK25CT><%Eed zgDeJl5zPYTJ_ZH`kT{z8%%I_F&>{>j28QXsblJG-`5Tx)`_(|6MK=SKghAryW`Gt1 zfIJIT4<3^TO{#;EHb@+*9wyELiUur6m<6;z!4)I{)c^|w7EpQuIUZ^OTpYCW10;^F zzF_)-Uz}o0EH%>wzHo{qv4FN;fy_nM5ArBT98EtfNDO2yntE1HdIO20t5<;7$7%q& zf>^Y^ffeLKP)MO009pnB5=S=xlrccDkFFk+F+k#I>e)bLA(o8920DC)2~?=UG(d9% zn*qdyY>>^6Cj1R-pp*`Z9H^B7U>*Do@J)bVJ_7?>d=1!y>1kIu1-t~I4LjG^IK?GF#U!#U z)D?mPU|CS36-gG>_!QIt$xhGz&dJXOYj_GefW#z0`jK?NTAzXu(+~XM6i)=D4p3}E zLkO1Y*gz#SNE{kMFmZNJ;DaI;O+7oPGy;jEtKR`mokr}SqwhhH4ATel2m^luJ7^mv zNF1gQD$bz+UKPZ|kpZQ__xOn#H*kWIEhvm&2Kj@W#@_(mQU?-;83Yqg0Y_;)Culb# zC>)^rAnO$Q8#vMCUg6@PasXL9xW&NVzzHh{p!Ntr#lcM*ka}pW!&>u#pf(=^!*tdk zoI>DcCz2X2XvOvD07N3H}KR<-|&r7 zjEScQDj>LF`i4Hxl@JYrJ3vNGukT|MW#MlSya3`!f|`*?7Qov5f-k_bpw>RJEQk-9 z?_!wt8*|1J)&~%h0L!9HM8bLkLIz-2P%{z9WLSSd$O9}33P2=TUXW^#y$N7hQ1Btk zLc0n=6<}Gk`AJxZL1+RBk6^88-zeBLqMqpI_1`G_n))f?mt(%-GA=wcK>-+ zC~+BpixdV1{j1wQDDqC%7s^X5*G)++%S=w?DppcR$t=#E?%&QMHho3`mxxkYW?p7- z228%JIJr1eH#0A@L^m-nMYlLPF^_Be+(2F?b|r9shJk?zbmTtB0WfS(RFYV%n^#tp zI6YEF(svF`r5NR z($gm@@XGM!WfpK*b6F`Ar6#5*Okd#6A}$3JDo!maEznKO$xJNfQc?ivp5CCyE5-_9 z*l8B zg6xEdgF*zZ9}>VwUH}Cwl37qDNRL8hUP)?EUSbY3YCsXq#S-G->NmY0npbZ7ya-+i z9wrv&={r(*gP6_qjHmOa@_H*c`}_E~I)}u&J3HIz=NFXdCl}=x7we}dC+k8Ekl;<_ z)z{>LDf0>Oj}H%W3 delta 290705 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

Pj_yU9ovfH!@EEC!V* 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 k;8o-?&@ Date: Wed, 10 Oct 2012 04:28:27 +0000 Subject: [PATCH 09/40] e500: Adding CCSR memory region All devices are also placed under CCSR memory region. The CCSR memory region is exported to pci device. The MSI interrupt generation is the main reason to export the CCSR region to PCI device. This put the requirement to move mpic under CCSR region, but logically all devices should be under CCSR. So this patch places all emulated devices under ccsr region. Signed-off-by: Bharat Bhushan Signed-off-by: Alexander Graf --- hw/ppc/e500.c | 63 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 6749ffffb3..85389335e5 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -46,13 +46,15 @@ /* TODO: parameterize */ #define MPC8544_CCSRBAR_BASE 0xE0000000ULL #define MPC8544_CCSRBAR_SIZE 0x00100000ULL -#define MPC8544_MPIC_REGS_BASE (MPC8544_CCSRBAR_BASE + 0x40000ULL) -#define MPC8544_SERIAL0_REGS_BASE (MPC8544_CCSRBAR_BASE + 0x4500ULL) -#define MPC8544_SERIAL1_REGS_BASE (MPC8544_CCSRBAR_BASE + 0x4600ULL) -#define MPC8544_PCI_REGS_BASE (MPC8544_CCSRBAR_BASE + 0x8000ULL) +#define MPC8544_MPIC_REGS_OFFSET 0x40000ULL +#define MPC8544_SERIAL0_REGS_OFFSET 0x4500ULL +#define MPC8544_SERIAL1_REGS_OFFSET 0x4600ULL +#define MPC8544_PCI_REGS_OFFSET 0x8000ULL +#define MPC8544_PCI_REGS_BASE (MPC8544_CCSRBAR_BASE + \ + MPC8544_PCI_REGS_OFFSET) #define MPC8544_PCI_REGS_SIZE 0x1000ULL #define MPC8544_PCI_IO 0xE1000000ULL -#define MPC8544_UTIL_BASE (MPC8544_CCSRBAR_BASE + 0xe0000ULL) +#define MPC8544_UTIL_OFFSET 0xe0000ULL #define MPC8544_SPIN_BASE 0xEF000000ULL struct boot_info @@ -267,13 +269,12 @@ static int ppce500_load_device_tree(CPUPPCState *env, /* XXX should contain a reasonable value */ qemu_devtree_setprop_cell(fdt, soc, "bus-frequency", 0); - snprintf(mpic, sizeof(mpic), "%s/pic@%llx", soc, - MPC8544_MPIC_REGS_BASE - MPC8544_CCSRBAR_BASE); + snprintf(mpic, sizeof(mpic), "%s/pic@%llx", soc, MPC8544_MPIC_REGS_OFFSET); qemu_devtree_add_subnode(fdt, mpic); qemu_devtree_setprop_string(fdt, mpic, "device_type", "open-pic"); qemu_devtree_setprop_string(fdt, mpic, "compatible", "chrp,open-pic"); - qemu_devtree_setprop_cells(fdt, mpic, "reg", MPC8544_MPIC_REGS_BASE - - MPC8544_CCSRBAR_BASE, 0x40000); + qemu_devtree_setprop_cells(fdt, mpic, "reg", MPC8544_MPIC_REGS_OFFSET, + 0x40000); qemu_devtree_setprop_cell(fdt, mpic, "#address-cells", 0); qemu_devtree_setprop_cell(fdt, mpic, "#interrupt-cells", 2); mpic_ph = qemu_devtree_alloc_phandle(fdt); @@ -286,17 +287,16 @@ static int ppce500_load_device_tree(CPUPPCState *env, * device it finds in the dt as serial output device. And we generate * devices in reverse order to the dt. */ - dt_serial_create(fdt, MPC8544_SERIAL1_REGS_BASE - MPC8544_CCSRBAR_BASE, + dt_serial_create(fdt, MPC8544_SERIAL1_REGS_OFFSET, soc, mpic, "serial1", 1, false); - dt_serial_create(fdt, MPC8544_SERIAL0_REGS_BASE - MPC8544_CCSRBAR_BASE, + dt_serial_create(fdt, MPC8544_SERIAL0_REGS_OFFSET, soc, mpic, "serial0", 0, true); snprintf(gutil, sizeof(gutil), "%s/global-utilities@%llx", soc, - MPC8544_UTIL_BASE - MPC8544_CCSRBAR_BASE); + MPC8544_UTIL_OFFSET); qemu_devtree_add_subnode(fdt, gutil); qemu_devtree_setprop_string(fdt, gutil, "compatible", "fsl,mpc8544-guts"); - qemu_devtree_setprop_cells(fdt, gutil, "reg", MPC8544_UTIL_BASE - - MPC8544_CCSRBAR_BASE, 0x1000); + qemu_devtree_setprop_cells(fdt, gutil, "reg", MPC8544_UTIL_OFFSET, 0x1000); qemu_devtree_setprop(fdt, gutil, "fsl,has-rstcr", NULL, 0); snprintf(pci, sizeof(pci), "/pci@%llx", MPC8544_PCI_REGS_BASE); @@ -422,6 +422,8 @@ void ppce500_init(PPCE500Params *params) qemu_irq **irqs, *mpic; DeviceState *dev; CPUPPCState *firstenv = NULL; + MemoryRegion *ccsr; + SysBusDevice *s; /* Setup CPUs */ if (params->cpu_model == NULL) { @@ -450,7 +452,8 @@ void ppce500_init(PPCE500Params *params) irqs[i][OPENPIC_OUTPUT_INT] = input[PPCE500_INPUT_INT]; irqs[i][OPENPIC_OUTPUT_CINT] = input[PPCE500_INPUT_CINT]; env->spr[SPR_BOOKE_PIR] = env->cpu_index = i; - env->mpic_cpu_base = MPC8544_MPIC_REGS_BASE + 0x20000; + env->mpic_cpu_base = MPC8544_CCSRBAR_BASE + + MPC8544_MPIC_REGS_OFFSET + 0x20000; ppc_booke_timers_init(env, 400000000, PPC_TIMER_E500); @@ -477,8 +480,12 @@ void ppce500_init(PPCE500Params *params) vmstate_register_ram_global(ram); memory_region_add_subregion(address_space_mem, 0, ram); + ccsr = g_malloc0(sizeof(MemoryRegion)); + memory_region_init(ccsr, "e500-ccsr", MPC8544_CCSRBAR_SIZE); + memory_region_add_subregion(address_space_mem, MPC8544_CCSRBAR_BASE, ccsr); + /* MPIC */ - mpic = mpic_init(address_space_mem, MPC8544_MPIC_REGS_BASE, + mpic = mpic_init(ccsr, MPC8544_MPIC_REGS_OFFSET, smp_cpus, irqs, NULL); if (!mpic) { @@ -487,25 +494,35 @@ void ppce500_init(PPCE500Params *params) /* Serial */ if (serial_hds[0]) { - serial_mm_init(address_space_mem, MPC8544_SERIAL0_REGS_BASE, + serial_mm_init(ccsr, MPC8544_SERIAL0_REGS_OFFSET, 0, mpic[12+26], 399193, serial_hds[0], DEVICE_BIG_ENDIAN); } if (serial_hds[1]) { - serial_mm_init(address_space_mem, MPC8544_SERIAL1_REGS_BASE, + serial_mm_init(ccsr, MPC8544_SERIAL1_REGS_OFFSET, 0, mpic[12+26], 399193, serial_hds[1], DEVICE_BIG_ENDIAN); } /* General Utility device */ - sysbus_create_simple("mpc8544-guts", MPC8544_UTIL_BASE, NULL); + dev = qdev_create(NULL, "mpc8544-guts"); + qdev_init_nofail(dev); + s = SYS_BUS_DEVICE(dev); + memory_region_add_subregion(ccsr, MPC8544_UTIL_OFFSET, + sysbus_mmio_get_region(s, 0)); /* PCI */ - dev = sysbus_create_varargs("e500-pcihost", MPC8544_PCI_REGS_BASE, - mpic[pci_irq_nrs[0]], mpic[pci_irq_nrs[1]], - mpic[pci_irq_nrs[2]], mpic[pci_irq_nrs[3]], - NULL); + dev = qdev_create(NULL, "e500-pcihost"); + qdev_init_nofail(dev); + s = SYS_BUS_DEVICE(dev); + sysbus_connect_irq(s, 0, mpic[pci_irq_nrs[0]]); + sysbus_connect_irq(s, 1, mpic[pci_irq_nrs[1]]); + sysbus_connect_irq(s, 2, mpic[pci_irq_nrs[2]]); + sysbus_connect_irq(s, 3, mpic[pci_irq_nrs[3]]); + memory_region_add_subregion(ccsr, MPC8544_PCI_REGS_OFFSET, + sysbus_mmio_get_region(s, 0)); + pci_bus = (PCIBus *)qdev_get_child_bus(dev, "pci.0"); if (!pci_bus) printf("couldn't create PCI controller!\n"); From 3eddc1be1ccb26387f8f960f8a3d8c417064a91f Mon Sep 17 00:00:00 2001 From: Bharat Bhushan Date: Wed, 10 Oct 2012 04:28:28 +0000 Subject: [PATCH 10/40] Adding BAR0 for e500 PCI controller PCI Root complex have TYPE-1 configuration header while PCI endpoint have type-0 configuration header. The type-1 configuration header have a BAR (BAR0). In Freescale PCI controller BAR0 is used for mapping pci address space to CCSR address space. This can used for 2 purposes: 1) for MSI interrupt generation 2) Allow CCSR registers access when configured as PCI endpoint, which I am not sure is a use case with QEMU-KVM guest. What I observed is that when guest read the size of BAR0 of host controller configuration header (TYPE1 header) then it always reads it as 0. When looking into the QEMU hw/ppce500_pci.c, I do not find the PCI controller device registering BAR0. I do not find any other controller also doing so may they do not use BAR0. There are two issues when BAR0 is not there (which I can think of): 1) There should be BAR0 emulated for PCI Root complex (TYPE1 header) and when reading the size of BAR0, it should give size as per real h/w. 2) Do we need this BAR0 inbound address translation? When BAR0 is of non-zero size then it will be configured for PCI address space to local address(CCSR) space translation on inbound access. The primary use case is for MSI interrupt generation. The device is configured with an address offsets in PCI address space, which will be translated to MSI interrupt generation MPIC registers. Currently I do not understand the MSI interrupt generation mechanism in QEMU and also IIRC we do not use QEMU MSI interrupt mechanism on e500 guest machines. But this BAR0 will be used when using MSI on e500. I can see one more issue, There are ATMUs emulated in hw/ppce500_pci.c, but i do not see these being used for address translation. So far that works because pci address space and local address space are 1:1 mapped. BAR0 inbound translation + ATMU translation will complete the address translation of inbound traffic. Signed-off-by: Bharat Bhushan [agraf: fix double variable assignment w/o read] Signed-off-by: Alexander Graf --- hw/ppc/e500-ccsr.h | 17 ++++++++++++++ hw/ppc/e500.c | 55 ++++++++++++++++++++++++++++++++++++++-------- hw/ppce500_pci.c | 29 +++++++++++++++++++++++- 3 files changed, 91 insertions(+), 10 deletions(-) create mode 100644 hw/ppc/e500-ccsr.h diff --git a/hw/ppc/e500-ccsr.h b/hw/ppc/e500-ccsr.h new file mode 100644 index 0000000000..f20f51bcd2 --- /dev/null +++ b/hw/ppc/e500-ccsr.h @@ -0,0 +1,17 @@ +#ifndef E500_CCSR_H +#define E500_CCSR_H + +#include "../sysbus.h" + +typedef struct PPCE500CCSRState { + /*< private >*/ + SysBusDevice parent; + /*< public >*/ + + MemoryRegion ccsr_space; +} PPCE500CCSRState; + +#define TYPE_CCSR "e500-ccsr" +#define CCSR(obj) OBJECT_CHECK(PPCE500CCSRState, (obj), TYPE_CCSR) + +#endif /* E500_CCSR_H */ diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 85389335e5..47e2d4169a 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -17,6 +17,7 @@ #include "config.h" #include "qemu-common.h" #include "e500.h" +#include "e500-ccsr.h" #include "net.h" #include "hw/hw.h" #include "hw/serial.h" @@ -422,8 +423,9 @@ void ppce500_init(PPCE500Params *params) qemu_irq **irqs, *mpic; DeviceState *dev; CPUPPCState *firstenv = NULL; - MemoryRegion *ccsr; + MemoryRegion *ccsr_addr_space; SysBusDevice *s; + PPCE500CCSRState *ccsr; /* Setup CPUs */ if (params->cpu_model == NULL) { @@ -480,12 +482,17 @@ void ppce500_init(PPCE500Params *params) vmstate_register_ram_global(ram); memory_region_add_subregion(address_space_mem, 0, ram); - ccsr = g_malloc0(sizeof(MemoryRegion)); - memory_region_init(ccsr, "e500-ccsr", MPC8544_CCSRBAR_SIZE); - memory_region_add_subregion(address_space_mem, MPC8544_CCSRBAR_BASE, ccsr); + dev = qdev_create(NULL, "e500-ccsr"); + object_property_add_child(qdev_get_machine(), "e500-ccsr", + OBJECT(dev), NULL); + qdev_init_nofail(dev); + ccsr = CCSR(dev); + ccsr_addr_space = &ccsr->ccsr_space; + memory_region_add_subregion(address_space_mem, MPC8544_CCSRBAR_BASE, + ccsr_addr_space); /* MPIC */ - mpic = mpic_init(ccsr, MPC8544_MPIC_REGS_OFFSET, + mpic = mpic_init(ccsr_addr_space, MPC8544_MPIC_REGS_OFFSET, smp_cpus, irqs, NULL); if (!mpic) { @@ -494,13 +501,13 @@ void ppce500_init(PPCE500Params *params) /* Serial */ if (serial_hds[0]) { - serial_mm_init(ccsr, MPC8544_SERIAL0_REGS_OFFSET, + serial_mm_init(ccsr_addr_space, MPC8544_SERIAL0_REGS_OFFSET, 0, mpic[12+26], 399193, serial_hds[0], DEVICE_BIG_ENDIAN); } if (serial_hds[1]) { - serial_mm_init(ccsr, MPC8544_SERIAL1_REGS_OFFSET, + serial_mm_init(ccsr_addr_space, MPC8544_SERIAL1_REGS_OFFSET, 0, mpic[12+26], 399193, serial_hds[1], DEVICE_BIG_ENDIAN); } @@ -509,7 +516,7 @@ void ppce500_init(PPCE500Params *params) dev = qdev_create(NULL, "mpc8544-guts"); qdev_init_nofail(dev); s = SYS_BUS_DEVICE(dev); - memory_region_add_subregion(ccsr, MPC8544_UTIL_OFFSET, + memory_region_add_subregion(ccsr_addr_space, MPC8544_UTIL_OFFSET, sysbus_mmio_get_region(s, 0)); /* PCI */ @@ -520,7 +527,7 @@ void ppce500_init(PPCE500Params *params) sysbus_connect_irq(s, 1, mpic[pci_irq_nrs[1]]); sysbus_connect_irq(s, 2, mpic[pci_irq_nrs[2]]); sysbus_connect_irq(s, 3, mpic[pci_irq_nrs[3]]); - memory_region_add_subregion(ccsr, MPC8544_PCI_REGS_OFFSET, + memory_region_add_subregion(ccsr_addr_space, MPC8544_PCI_REGS_OFFSET, sysbus_mmio_get_region(s, 0)); pci_bus = (PCIBus *)qdev_get_child_bus(dev, "pci.0"); @@ -595,3 +602,33 @@ void ppce500_init(PPCE500Params *params) kvmppc_init(); } } + +static int e500_ccsr_initfn(SysBusDevice *dev) +{ + PPCE500CCSRState *ccsr; + + ccsr = CCSR(dev); + memory_region_init(&ccsr->ccsr_space, "e500-ccsr", + MPC8544_CCSRBAR_SIZE); + return 0; +} + +static void e500_ccsr_class_init(ObjectClass *klass, void *data) +{ + SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); + k->init = e500_ccsr_initfn; +} + +static const TypeInfo e500_ccsr_info = { + .name = TYPE_CCSR, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(PPCE500CCSRState), + .class_init = e500_ccsr_class_init, +}; + +static void e500_register_types(void) +{ + type_register_static(&e500_ccsr_info); +} + +type_init(e500_register_types) diff --git a/hw/ppce500_pci.c b/hw/ppce500_pci.c index 2ff7438d09..54c72b4fd2 100644 --- a/hw/ppce500_pci.c +++ b/hw/ppce500_pci.c @@ -15,6 +15,7 @@ */ #include "hw.h" +#include "hw/ppc/e500-ccsr.h" #include "pci.h" #include "pci_host.h" #include "bswap.h" @@ -92,6 +93,19 @@ struct PPCE500PCIState { MemoryRegion pio; }; +#define TYPE_PPC_E500_PCI_BRIDGE "e500-host-bridge" +#define PPC_E500_PCI_BRIDGE(obj) \ + OBJECT_CHECK(PPCE500PCIBridgeState, (obj), TYPE_PPC_E500_PCI_BRIDGE) + +struct PPCE500PCIBridgeState { + /*< private >*/ + PCIDevice parent; + /*< public >*/ + + MemoryRegion bar0; +}; + +typedef struct PPCE500PCIBridgeState PPCE500PCIBridgeState; typedef struct PPCE500PCIState PPCE500PCIState; static uint64_t pci_reg_read4(void *opaque, hwaddr addr, @@ -310,6 +324,18 @@ static const VMStateDescription vmstate_ppce500_pci = { #include "exec-memory.h" +static int e500_pcihost_bridge_initfn(PCIDevice *d) +{ + PPCE500PCIBridgeState *b = PPC_E500_PCI_BRIDGE(d); + PPCE500CCSRState *ccsr = CCSR(container_get(qdev_get_machine(), + "/e500-ccsr")); + + memory_region_init_alias(&b->bar0, "e500-pci-bar0", &ccsr->ccsr_space, + 0, int128_get64(ccsr->ccsr_space.size)); + pci_register_bar(d, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &b->bar0); + return 0; +} + static int e500_pcihost_initfn(SysBusDevice *dev) { PCIHostState *h; @@ -355,6 +381,7 @@ static void e500_host_bridge_class_init(ObjectClass *klass, void *data) DeviceClass *dc = DEVICE_CLASS(klass); PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); + k->init = e500_pcihost_bridge_initfn; k->vendor_id = PCI_VENDOR_ID_FREESCALE; k->device_id = PCI_DEVICE_ID_MPC8533E; k->class_id = PCI_CLASS_PROCESSOR_POWERPC; @@ -364,7 +391,7 @@ static void e500_host_bridge_class_init(ObjectClass *klass, void *data) static const TypeInfo e500_host_bridge_info = { .name = "e500-host-bridge", .parent = TYPE_PCI_DEVICE, - .instance_size = sizeof(PCIDevice), + .instance_size = sizeof(PPCE500PCIBridgeState), .class_init = e500_host_bridge_class_init, }; From 8b1853e7d8c2bf8c6a9f023ab98ba0e8a38bd086 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 3 Dec 2012 16:42:13 +0000 Subject: [PATCH 11/40] pseries: Don't allow TCE (iommu) tables to be registered with duplicate LIOBNs The PAPR specification requires that every bus or device mediated by the IOMMU have a unique Logical IO Bus Number (LIOBN). This patch adds a check to enforce this, which will help catch errors in configuration earlier. Signed-off-by: David Gibson Signed-off-by: Alexander Graf --- hw/spapr_iommu.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/spapr_iommu.c b/hw/spapr_iommu.c index 02d78ccf28..3011b251d3 100644 --- a/hw/spapr_iommu.c +++ b/hw/spapr_iommu.c @@ -120,6 +120,12 @@ DMAContext *spapr_tce_new_dma_context(uint32_t liobn, size_t window_size) { sPAPRTCETable *tcet; + if (spapr_tce_find_by_liobn(liobn)) { + fprintf(stderr, "Attempted to create TCE table with duplicate" + " LIOBN 0x%x\n", liobn); + return NULL; + } + if (!window_size) { return NULL; } From 38898d7ed803cee5105246150725487add78cbd7 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Thu, 6 Dec 2012 15:59:27 +0100 Subject: [PATCH 12/40] openpic: Remove unused code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The openpic code had a few WIP bits left that nobody reanimated within the last few years. Remove that code. Signed-off-by: Alexander Graf Acked-by: Hervé Poussineau --- hw/openpic.c | 163 --------------------------------------------------- 1 file changed, 163 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index 8b3784a6bd..b30c853501 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -46,27 +46,8 @@ #define DPRINTF(fmt, ...) do { } while (0) #endif -#define USE_MPCxxx /* Intel model is broken, for now */ - -#if defined (USE_INTEL_GW80314) -/* Intel GW80314 I/O Companion chip */ - -#define MAX_CPU 4 -#define MAX_IRQ 32 -#define MAX_DBL 4 -#define MAX_MBX 4 -#define MAX_TMR 4 -#define VECTOR_BITS 8 -#define MAX_IPI 4 - -#define VID (0x00000000) - -#elif defined(USE_MPCxxx) - #define MAX_CPU 15 #define MAX_IRQ 128 -#define MAX_DBL 0 -#define MAX_MBX 0 #define MAX_TMR 4 #define VECTOR_BITS 8 #define MAX_IPI 4 @@ -149,12 +130,6 @@ enum mpic_ide_bits { IDR_P0 = 0, }; -#else -#error "Please select which OpenPic implementation is to be emulated" -#endif - -#define OPENPIC_PAGE_SIZE 4096 - #define BF_WIDTH(_bits_) \ (((_bits_) + (sizeof(uint32_t) * 8) - 1) / (sizeof(uint32_t) * 8)) @@ -250,19 +225,6 @@ typedef struct openpic_t { uint32_t ticc; /* Global timer current count register */ uint32_t tibc; /* Global timer base count register */ } timers[MAX_TMR]; -#if MAX_DBL > 0 - /* Doorbell registers */ - uint32_t dar; /* Doorbell activate register */ - struct { - uint32_t dmr; /* Doorbell messaging register */ - } doorbells[MAX_DBL]; -#endif -#if MAX_MBX > 0 - /* Mailbox registers */ - struct { - uint32_t mbr; /* Mailbox register */ - } mailboxes[MAX_MAILBOXES]; -#endif /* IRQ out is used when in bypass mode (not implemented) */ qemu_irq irq_out; int max_irq; @@ -470,19 +432,6 @@ static void openpic_reset (void *opaque) opp->timers[i].ticc = 0x00000000; opp->timers[i].tibc = 0x80000000; } - /* Initialise doorbells */ -#if MAX_DBL > 0 - opp->dar = 0x00000000; - for (i = 0; i < MAX_DBL; i++) { - opp->doorbells[i].dmr = 0x00000000; - } -#endif - /* Initialise mailboxes */ -#if MAX_MBX > 0 - for (i = 0; i < MAX_MBX; i++) { /* ? */ - opp->mailboxes[i].mbr = 0x00000000; - } -#endif /* Go out of RESET state */ opp->glbc = 0x00000000; } @@ -518,84 +467,6 @@ static inline void write_IRQreg_ipvp(openpic_t *opp, int n_IRQ, uint32_t val) opp->src[n_IRQ].ipvp); } -#if 0 // Code provision for Intel model -#if MAX_DBL > 0 -static uint32_t read_doorbell_register (openpic_t *opp, - int n_dbl, uint32_t offset) -{ - uint32_t retval; - - switch (offset) { - case DBL_IPVP_OFFSET: - retval = read_IRQreg_ipvp(opp, IRQ_DBL0 + n_dbl); - break; - case DBL_IDE_OFFSET: - retval = read_IRQreg_ide(opp, IRQ_DBL0 + n_dbl); - break; - case DBL_DMR_OFFSET: - retval = opp->doorbells[n_dbl].dmr; - break; - } - - return retval; -} - -static void write_doorbell_register (penpic_t *opp, int n_dbl, - uint32_t offset, uint32_t value) -{ - switch (offset) { - case DBL_IVPR_OFFSET: - write_IRQreg_ipvp(opp, IRQ_DBL0 + n_dbl, value); - break; - case DBL_IDE_OFFSET: - write_IRQreg_ide(opp, IRQ_DBL0 + n_dbl, value); - break; - case DBL_DMR_OFFSET: - opp->doorbells[n_dbl].dmr = value; - break; - } -} -#endif - -#if MAX_MBX > 0 -static uint32_t read_mailbox_register (openpic_t *opp, - int n_mbx, uint32_t offset) -{ - uint32_t retval; - - switch (offset) { - case MBX_MBR_OFFSET: - retval = opp->mailboxes[n_mbx].mbr; - break; - case MBX_IVPR_OFFSET: - retval = read_IRQreg_ipvp(opp, IRQ_MBX0 + n_mbx); - break; - case MBX_DMR_OFFSET: - retval = read_IRQreg_ide(opp, IRQ_MBX0 + n_mbx); - break; - } - - return retval; -} - -static void write_mailbox_register (openpic_t *opp, int n_mbx, - uint32_t address, uint32_t value) -{ - switch (offset) { - case MBX_MBR_OFFSET: - opp->mailboxes[n_mbx].mbr = value; - break; - case MBX_IVPR_OFFSET: - write_IRQreg_ipvp(opp, IRQ_MBX0 + n_mbx, value); - break; - case MBX_DMR_OFFSET: - write_IRQreg_ide(opp, IRQ_MBX0 + n_mbx, value); - break; - } -} -#endif -#endif /* 0 : Code provision for Intel model */ - static void openpic_gbl_write (void *opaque, hwaddr addr, uint32_t val) { openpic_t *opp = opaque; @@ -841,7 +712,6 @@ static void openpic_cpu_write_internal(void *opaque, hwaddr addr, dst = &opp->dst[idx]; addr &= 0xFF0; switch (addr) { -#if MAX_IPI > 0 case 0x40: /* IPIDR */ case 0x50: case 0x60: @@ -853,7 +723,6 @@ static void openpic_cpu_write_internal(void *opaque, hwaddr addr, openpic_set_irq(opp, opp->irq_ipi0 + idx, 1); openpic_set_irq(opp, opp->irq_ipi0 + idx, 0); break; -#endif case 0x80: /* PCTP */ dst->pctp = val & 0x0000000F; break; @@ -1109,20 +978,6 @@ static void openpic_save(QEMUFile* f, void *opaque) qemu_put_be32s(f, &opp->timers[i].tibc); } -#if MAX_DBL > 0 - qemu_put_be32s(f, &opp->dar); - - for (i = 0; i < MAX_DBL; i++) { - qemu_put_be32s(f, &opp->doorbells[i].dmr); - } -#endif - -#if MAX_MBX > 0 - for (i = 0; i < MAX_MAILBOXES; i++) { - qemu_put_be32s(f, &opp->mailboxes[i].mbr); - } -#endif - pci_device_save(&opp->pci_dev, f); } @@ -1176,20 +1031,6 @@ static int openpic_load(QEMUFile* f, void *opaque, int version_id) qemu_get_be32s(f, &opp->timers[i].tibc); } -#if MAX_DBL > 0 - qemu_get_be32s(f, &opp->dar); - - for (i = 0; i < MAX_DBL; i++) { - qemu_get_be32s(f, &opp->doorbells[i].dmr); - } -#endif - -#if MAX_MBX > 0 - for (i = 0; i < MAX_MAILBOXES; i++) { - qemu_get_be32s(f, &opp->mailboxes[i].mbr); - } -#endif - return pci_device_load(&opp->pci_dev, f); } @@ -1222,11 +1063,7 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, for (; i < OPENPIC_IRQ_TIM0; i++) { opp->src[i].type = IRQ_SPECIAL; } -#if MAX_IPI > 0 m = OPENPIC_IRQ_IPI0; -#else - m = OPENPIC_IRQ_DBL0; -#endif for (; i < m; i++) { opp->src[i].type = IRQ_TIMER; } From cdbb912a6f8b5f325df3a6fd42cb2843032050c9 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Fri, 7 Dec 2012 16:10:34 +0100 Subject: [PATCH 13/40] mpic: Unify numbering scheme MPIC interrupt numbers in Linux (device tree) and in QEMU are different, because QEMU takes the sparseness of the IRQ number space into account. Remove that cleverness and instead assume a flat number space. This makes the code easier to understand, because we are actually aligned with Linux on the view of our worlds. Signed-off-by: Alexander Graf --- hw/openpic.c | 290 ++++++++------------------------------------------ hw/ppc/e500.c | 4 +- 2 files changed, 45 insertions(+), 249 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index b30c853501..122ce7614f 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -46,11 +46,12 @@ #define DPRINTF(fmt, ...) do { } while (0) #endif -#define MAX_CPU 15 -#define MAX_IRQ 128 +#define MAX_CPU 15 +#define MAX_SRC 256 #define MAX_TMR 4 #define VECTOR_BITS 8 #define MAX_IPI 4 +#define MAX_IRQ (MAX_SRC + MAX_IPI + MAX_TMR) #define VID 0x03 /* MPIC version ID */ #define VENI 0x00000000 /* Vendor ID */ @@ -82,32 +83,25 @@ enum { #define MPIC_MAX_CPU 1 #define MPIC_MAX_EXT 12 #define MPIC_MAX_INT 64 -#define MPIC_MAX_MSG 4 -#define MPIC_MAX_MSI 8 -#define MPIC_MAX_TMR MAX_TMR -#define MPIC_MAX_IPI MAX_IPI -#define MPIC_MAX_IRQ (MPIC_MAX_EXT + MPIC_MAX_INT + MPIC_MAX_TMR + MPIC_MAX_MSG + MPIC_MAX_MSI + (MPIC_MAX_IPI * MPIC_MAX_CPU)) +#define MPIC_MAX_IRQ MAX_IRQ /* Interrupt definitions */ -#define MPIC_EXT_IRQ 0 -#define MPIC_INT_IRQ (MPIC_EXT_IRQ + MPIC_MAX_EXT) -#define MPIC_TMR_IRQ (MPIC_INT_IRQ + MPIC_MAX_INT) -#define MPIC_MSG_IRQ (MPIC_TMR_IRQ + MPIC_MAX_TMR) -#define MPIC_MSI_IRQ (MPIC_MSG_IRQ + MPIC_MAX_MSG) -#define MPIC_IPI_IRQ (MPIC_MSI_IRQ + MPIC_MAX_MSI) +/* IRQs, accessible through the IRQ region */ +#define MPIC_EXT_IRQ 0x00 +#define MPIC_INT_IRQ 0x10 +#define MPIC_MSG_IRQ 0xb0 +#define MPIC_MSI_IRQ 0xe0 +/* These are available through separate regions, but + for simplicity's sake mapped into the same number space */ +#define MPIC_TMR_IRQ 0x100 +#define MPIC_IPI_IRQ 0x104 #define MPIC_GLB_REG_START 0x0 #define MPIC_GLB_REG_SIZE 0x10F0 #define MPIC_TMR_REG_START 0x10F0 #define MPIC_TMR_REG_SIZE 0x220 -#define MPIC_EXT_REG_START 0x10000 -#define MPIC_EXT_REG_SIZE 0x180 -#define MPIC_INT_REG_START 0x10200 -#define MPIC_INT_REG_SIZE 0x800 -#define MPIC_MSG_REG_START 0x11600 -#define MPIC_MSG_REG_SIZE 0x100 -#define MPIC_MSI_REG_START 0x11C00 -#define MPIC_MSI_REG_SIZE 0x100 +#define MPIC_IRQ_REG_START 0x10000 +#define MPIC_IRQ_REG_SIZE (MAX_SRC * 0x20) #define MPIC_CPU_REG_START 0x20000 #define MPIC_CPU_REG_SIZE 0x100 + ((MAX_CPU - 1) * 0x1000) @@ -1205,193 +1199,44 @@ static uint32_t mpic_timer_read (void *opaque, hwaddr addr) return retval; } -static void mpic_src_ext_write (void *opaque, hwaddr addr, - uint32_t val) +static void mpic_src_irq_write(void *opaque, hwaddr addr, + uint64_t val, unsigned len) { openpic_t *mpp = opaque; - int idx = MPIC_EXT_IRQ; + int idx = addr / 0x20; - DPRINTF("%s: addr " TARGET_FMT_plx " <= %08x\n", __func__, addr, val); + DPRINTF("%s: addr " TARGET_FMT_plx " <= %08" PRIx64 "\n", + __func__, addr, val); if (addr & 0xF) return; - if (addr < MPIC_EXT_REG_SIZE) { - idx += (addr & 0xFFF0) >> 5; - if (addr & 0x10) { - /* EXDE / IFEDE / IEEDE */ - write_IRQreg_ide(mpp, idx, val); - } else { - /* EXVP / IFEVP / IEEVP */ - write_IRQreg_ipvp(mpp, idx, val); - } + if (addr & 0x10) { + /* EXDE / IFEDE / IEEDE */ + write_IRQreg_ide(mpp, idx, val); + } else { + /* EXVP / IFEVP / IEEVP */ + write_IRQreg_ipvp(mpp, idx, val); } } -static uint32_t mpic_src_ext_read (void *opaque, hwaddr addr) +static uint64_t mpic_src_irq_read(void *opaque, hwaddr addr, unsigned len) { openpic_t *mpp = opaque; uint32_t retval; - int idx = MPIC_EXT_IRQ; + int idx = addr / 0x20; DPRINTF("%s: addr " TARGET_FMT_plx "\n", __func__, addr); - retval = 0xFFFFFFFF; if (addr & 0xF) - return retval; + return -1; - if (addr < MPIC_EXT_REG_SIZE) { - idx += (addr & 0xFFF0) >> 5; - if (addr & 0x10) { - /* EXDE / IFEDE / IEEDE */ - retval = read_IRQreg_ide(mpp, idx); - } else { - /* EXVP / IFEVP / IEEVP */ - retval = read_IRQreg_ipvp(mpp, idx); - } - DPRINTF("%s: => %08x\n", __func__, retval); - } - - return retval; -} - -static void mpic_src_int_write (void *opaque, hwaddr addr, - uint32_t val) -{ - openpic_t *mpp = opaque; - int idx = MPIC_INT_IRQ; - - DPRINTF("%s: addr " TARGET_FMT_plx " <= %08x\n", __func__, addr, val); - if (addr & 0xF) - return; - - if (addr < MPIC_INT_REG_SIZE) { - idx += (addr & 0xFFF0) >> 5; - if (addr & 0x10) { - /* EXDE / IFEDE / IEEDE */ - write_IRQreg_ide(mpp, idx, val); - } else { - /* EXVP / IFEVP / IEEVP */ - write_IRQreg_ipvp(mpp, idx, val); - } - } -} - -static uint32_t mpic_src_int_read (void *opaque, hwaddr addr) -{ - openpic_t *mpp = opaque; - uint32_t retval; - int idx = MPIC_INT_IRQ; - - DPRINTF("%s: addr " TARGET_FMT_plx "\n", __func__, addr); - retval = 0xFFFFFFFF; - if (addr & 0xF) - return retval; - - if (addr < MPIC_INT_REG_SIZE) { - idx += (addr & 0xFFF0) >> 5; - if (addr & 0x10) { - /* EXDE / IFEDE / IEEDE */ - retval = read_IRQreg_ide(mpp, idx); - } else { - /* EXVP / IFEVP / IEEVP */ - retval = read_IRQreg_ipvp(mpp, idx); - } - DPRINTF("%s: => %08x\n", __func__, retval); - } - - return retval; -} - -static void mpic_src_msg_write (void *opaque, hwaddr addr, - uint32_t val) -{ - openpic_t *mpp = opaque; - int idx = MPIC_MSG_IRQ; - - DPRINTF("%s: addr " TARGET_FMT_plx " <= %08x\n", __func__, addr, val); - if (addr & 0xF) - return; - - if (addr < MPIC_MSG_REG_SIZE) { - idx += (addr & 0xFFF0) >> 5; - if (addr & 0x10) { - /* EXDE / IFEDE / IEEDE */ - write_IRQreg_ide(mpp, idx, val); - } else { - /* EXVP / IFEVP / IEEVP */ - write_IRQreg_ipvp(mpp, idx, val); - } - } -} - -static uint32_t mpic_src_msg_read (void *opaque, hwaddr addr) -{ - openpic_t *mpp = opaque; - uint32_t retval; - int idx = MPIC_MSG_IRQ; - - DPRINTF("%s: addr " TARGET_FMT_plx "\n", __func__, addr); - retval = 0xFFFFFFFF; - if (addr & 0xF) - return retval; - - if (addr < MPIC_MSG_REG_SIZE) { - idx += (addr & 0xFFF0) >> 5; - if (addr & 0x10) { - /* EXDE / IFEDE / IEEDE */ - retval = read_IRQreg_ide(mpp, idx); - } else { - /* EXVP / IFEVP / IEEVP */ - retval = read_IRQreg_ipvp(mpp, idx); - } - DPRINTF("%s: => %08x\n", __func__, retval); - } - - return retval; -} - -static void mpic_src_msi_write (void *opaque, hwaddr addr, - uint32_t val) -{ - openpic_t *mpp = opaque; - int idx = MPIC_MSI_IRQ; - - DPRINTF("%s: addr " TARGET_FMT_plx " <= %08x\n", __func__, addr, val); - if (addr & 0xF) - return; - - if (addr < MPIC_MSI_REG_SIZE) { - idx += (addr & 0xFFF0) >> 5; - if (addr & 0x10) { - /* EXDE / IFEDE / IEEDE */ - write_IRQreg_ide(mpp, idx, val); - } else { - /* EXVP / IFEVP / IEEVP */ - write_IRQreg_ipvp(mpp, idx, val); - } - } -} -static uint32_t mpic_src_msi_read (void *opaque, hwaddr addr) -{ - openpic_t *mpp = opaque; - uint32_t retval; - int idx = MPIC_MSI_IRQ; - - DPRINTF("%s: addr " TARGET_FMT_plx "\n", __func__, addr); - retval = 0xFFFFFFFF; - if (addr & 0xF) - return retval; - - if (addr < MPIC_MSI_REG_SIZE) { - idx += (addr & 0xFFF0) >> 5; - if (addr & 0x10) { - /* EXDE / IFEDE / IEEDE */ - retval = read_IRQreg_ide(mpp, idx); - } else { - /* EXVP / IFEVP / IEEVP */ - retval = read_IRQreg_ipvp(mpp, idx); - } - DPRINTF("%s: => %08x\n", __func__, retval); + if (addr & 0x10) { + /* EXDE / IFEDE / IEEDE */ + retval = read_IRQreg_ide(mpp, idx); + } else { + /* EXVP / IFEVP / IEEVP */ + retval = read_IRQreg_ipvp(mpp, idx); } + DPRINTF("%s: => %08x\n", __func__, retval); return retval; } @@ -1438,60 +1283,14 @@ static const MemoryRegionOps mpic_cpu_ops = { .endianness = DEVICE_BIG_ENDIAN, }; -static const MemoryRegionOps mpic_ext_ops = { - .old_mmio = { - .write = { openpic_buggy_write, - openpic_buggy_write, - mpic_src_ext_write, - }, - .read = { openpic_buggy_read, - openpic_buggy_read, - mpic_src_ext_read, - }, - }, +static const MemoryRegionOps mpic_irq_ops = { + .write = mpic_src_irq_write, + .read = mpic_src_irq_read, .endianness = DEVICE_BIG_ENDIAN, -}; - -static const MemoryRegionOps mpic_int_ops = { - .old_mmio = { - .write = { openpic_buggy_write, - openpic_buggy_write, - mpic_src_int_write, - }, - .read = { openpic_buggy_read, - openpic_buggy_read, - mpic_src_int_read, - }, + .impl = { + .min_access_size = 4, + .max_access_size = 4, }, - .endianness = DEVICE_BIG_ENDIAN, -}; - -static const MemoryRegionOps mpic_msg_ops = { - .old_mmio = { - .write = { openpic_buggy_write, - openpic_buggy_write, - mpic_src_msg_write, - }, - .read = { openpic_buggy_read, - openpic_buggy_read, - mpic_src_msg_read, - }, - }, - .endianness = DEVICE_BIG_ENDIAN, -}; - -static const MemoryRegionOps mpic_msi_ops = { - .old_mmio = { - .write = { openpic_buggy_write, - openpic_buggy_write, - mpic_src_msi_write, - }, - .read = { openpic_buggy_read, - openpic_buggy_read, - mpic_src_msi_read, - }, - }, - .endianness = DEVICE_BIG_ENDIAN, }; qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, @@ -1507,10 +1306,7 @@ qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, } const list[] = { {"glb", &mpic_glb_ops, MPIC_GLB_REG_START, MPIC_GLB_REG_SIZE}, {"tmr", &mpic_tmr_ops, MPIC_TMR_REG_START, MPIC_TMR_REG_SIZE}, - {"ext", &mpic_ext_ops, MPIC_EXT_REG_START, MPIC_EXT_REG_SIZE}, - {"int", &mpic_int_ops, MPIC_INT_REG_START, MPIC_INT_REG_SIZE}, - {"msg", &mpic_msg_ops, MPIC_MSG_REG_START, MPIC_MSG_REG_SIZE}, - {"msi", &mpic_msi_ops, MPIC_MSI_REG_START, MPIC_MSI_REG_SIZE}, + {"irq", &mpic_irq_ops, MPIC_IRQ_REG_START, MPIC_IRQ_REG_SIZE}, {"cpu", &mpic_cpu_ops, MPIC_CPU_REG_START, MPIC_CPU_REG_SIZE}, }; diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 47e2d4169a..f3e97d8bb5 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -502,13 +502,13 @@ void ppce500_init(PPCE500Params *params) /* Serial */ if (serial_hds[0]) { serial_mm_init(ccsr_addr_space, MPC8544_SERIAL0_REGS_OFFSET, - 0, mpic[12+26], 399193, + 0, mpic[42], 399193, serial_hds[0], DEVICE_BIG_ENDIAN); } if (serial_hds[1]) { serial_mm_init(ccsr_addr_space, MPC8544_SERIAL1_REGS_OFFSET, - 0, mpic[12+26], 399193, + 0, mpic[42], 399193, serial_hds[1], DEVICE_BIG_ENDIAN); } From b9b2aaa3c6926cf8af21fe75457ca6c6e0dc1f5d Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Fri, 7 Dec 2012 16:31:55 +0100 Subject: [PATCH 14/40] openpic: update to proper memory api The openpic code was still using the old mmio memory api. Convert it to be a generic memory api user and clean up some code that becomes redundant that way. Signed-off-by: Alexander Graf --- hw/openpic.c | 138 ++++++++++++++++++--------------------------------- 1 file changed, 48 insertions(+), 90 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index 122ce7614f..1d714f4d7c 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -461,7 +461,8 @@ static inline void write_IRQreg_ipvp(openpic_t *opp, int n_IRQ, uint32_t val) opp->src[n_IRQ].ipvp); } -static void openpic_gbl_write (void *opaque, hwaddr addr, uint32_t val) +static void openpic_gbl_write(void *opaque, hwaddr addr, uint64_t val, + unsigned len) { openpic_t *opp = opaque; IRQ_dst_t *dst; @@ -527,7 +528,7 @@ static void openpic_gbl_write (void *opaque, hwaddr addr, uint32_t val) } } -static uint32_t openpic_gbl_read (void *opaque, hwaddr addr) +static uint64_t openpic_gbl_read(void *opaque, hwaddr addr, unsigned len) { openpic_t *opp = opaque; uint32_t retval; @@ -584,7 +585,8 @@ static uint32_t openpic_gbl_read (void *opaque, hwaddr addr) return retval; } -static void openpic_timer_write (void *opaque, uint32_t addr, uint32_t val) +static void openpic_timer_write(void *opaque, hwaddr addr, uint64_t val, + unsigned len) { openpic_t *opp = opaque; int idx; @@ -615,7 +617,7 @@ static void openpic_timer_write (void *opaque, uint32_t addr, uint32_t val) } } -static uint32_t openpic_timer_read (void *opaque, uint32_t addr) +static uint64_t openpic_timer_read(void *opaque, hwaddr addr, unsigned len) { openpic_t *opp = opaque; uint32_t retval; @@ -648,7 +650,8 @@ static uint32_t openpic_timer_read (void *opaque, uint32_t addr) return retval; } -static void openpic_src_write (void *opaque, uint32_t addr, uint32_t val) +static void openpic_src_write(void *opaque, hwaddr addr, uint64_t val, + unsigned len) { openpic_t *opp = opaque; int idx; @@ -667,7 +670,7 @@ static void openpic_src_write (void *opaque, uint32_t addr, uint32_t val) } } -static uint32_t openpic_src_read (void *opaque, uint32_t addr) +static uint64_t openpic_src_read(void *opaque, uint64_t addr, unsigned len) { openpic_t *opp = opaque; uint32_t retval; @@ -749,7 +752,8 @@ static void openpic_cpu_write_internal(void *opaque, hwaddr addr, } } -static void openpic_cpu_write(void *opaque, hwaddr addr, uint32_t val) +static void openpic_cpu_write(void *opaque, hwaddr addr, uint64_t val, + unsigned len) { openpic_cpu_write_internal(opaque, addr, val, (addr & 0x1f000) >> 12); } @@ -833,96 +837,63 @@ static uint32_t openpic_cpu_read_internal(void *opaque, hwaddr addr, return retval; } -static uint32_t openpic_cpu_read(void *opaque, hwaddr addr) +static uint64_t openpic_cpu_read(void *opaque, hwaddr addr, unsigned len) { return openpic_cpu_read_internal(opaque, addr, (addr & 0x1f000) >> 12); } -static void openpic_buggy_write (void *opaque, - hwaddr addr, uint32_t val) -{ - printf("Invalid OPENPIC write access !\n"); -} - -static uint32_t openpic_buggy_read (void *opaque, hwaddr addr) -{ - printf("Invalid OPENPIC read access !\n"); - - return -1; -} - -static void openpic_writel (void *opaque, - hwaddr addr, uint32_t val) +static void openpic_write(void *opaque, hwaddr addr, uint64_t val, + unsigned len) { openpic_t *opp = opaque; - addr &= 0x3FFFF; DPRINTF("%s: offset %08x val: %08x\n", __func__, (int)addr, val); if (addr < 0x1100) { /* Global registers */ - openpic_gbl_write(opp, addr, val); + openpic_gbl_write(opp, addr, val, len); } else if (addr < 0x10000) { /* Timers registers */ - openpic_timer_write(opp, addr, val); + openpic_timer_write(opp, addr, val, len); } else if (addr < 0x20000) { /* Source registers */ - openpic_src_write(opp, addr, val); + openpic_src_write(opp, addr, val, len); } else { /* CPU registers */ - openpic_cpu_write(opp, addr, val); + openpic_cpu_write(opp, addr, val, len); } } -static uint32_t openpic_readl (void *opaque,hwaddr addr) +static uint64_t openpic_read(void *opaque, hwaddr addr, unsigned len) { openpic_t *opp = opaque; uint32_t retval; - addr &= 0x3FFFF; DPRINTF("%s: offset %08x\n", __func__, (int)addr); if (addr < 0x1100) { /* Global registers */ - retval = openpic_gbl_read(opp, addr); + retval = openpic_gbl_read(opp, addr, len); } else if (addr < 0x10000) { /* Timers registers */ - retval = openpic_timer_read(opp, addr); + retval = openpic_timer_read(opp, addr, len); } else if (addr < 0x20000) { /* Source registers */ - retval = openpic_src_read(opp, addr); + retval = openpic_src_read(opp, addr, len); } else { /* CPU registers */ - retval = openpic_cpu_read(opp, addr); + retval = openpic_cpu_read(opp, addr, len); } return retval; } -static uint64_t openpic_read(void *opaque, hwaddr addr, - unsigned size) -{ - openpic_t *opp = opaque; - - switch (size) { - case 4: return openpic_readl(opp, addr); - default: return openpic_buggy_read(opp, addr); - } -} - -static void openpic_write(void *opaque, hwaddr addr, - uint64_t data, unsigned size) -{ - openpic_t *opp = opaque; - - switch (size) { - case 4: return openpic_writel(opp, addr, data); - default: return openpic_buggy_write(opp, addr, data); - } -} - static const MemoryRegionOps openpic_ops = { .read = openpic_read, .write = openpic_write, .endianness = DEVICE_LITTLE_ENDIAN, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, }; static void openpic_save_IRQ_queue(QEMUFile* f, IRQ_queue_t *q) @@ -1131,7 +1102,8 @@ static void mpic_reset (void *opaque) mpp->glbc = 0x00000000; } -static void mpic_timer_write (void *opaque, hwaddr addr, uint32_t val) +static void mpic_timer_write(void *opaque, hwaddr addr, uint64_t val, + unsigned len) { openpic_t *mpp = opaque; int idx, cpu; @@ -1139,7 +1111,6 @@ static void mpic_timer_write (void *opaque, hwaddr addr, uint32_t val) DPRINTF("%s: addr " TARGET_FMT_plx " <= %08x\n", __func__, addr, val); if (addr & 0xF) return; - addr &= 0xFFFF; cpu = addr >> 12; idx = (addr >> 6) & 0x3; switch (addr & 0x30) { @@ -1164,7 +1135,7 @@ static void mpic_timer_write (void *opaque, hwaddr addr, uint32_t val) } } -static uint32_t mpic_timer_read (void *opaque, hwaddr addr) +static uint64_t mpic_timer_read(void *opaque, hwaddr addr, unsigned len) { openpic_t *mpp = opaque; uint32_t retval; @@ -1174,7 +1145,6 @@ static uint32_t mpic_timer_read (void *opaque, hwaddr addr) retval = 0xFFFFFFFF; if (addr & 0xF) return retval; - addr &= 0xFFFF; cpu = addr >> 12; idx = (addr >> 6) & 0x3; switch (addr & 0x30) { @@ -1242,45 +1212,33 @@ static uint64_t mpic_src_irq_read(void *opaque, hwaddr addr, unsigned len) } static const MemoryRegionOps mpic_glb_ops = { - .old_mmio = { - .write = { openpic_buggy_write, - openpic_buggy_write, - openpic_gbl_write, - }, - .read = { openpic_buggy_read, - openpic_buggy_read, - openpic_gbl_read, - }, - }, + .write = openpic_gbl_write, + .read = openpic_gbl_read, .endianness = DEVICE_BIG_ENDIAN, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, }; static const MemoryRegionOps mpic_tmr_ops = { - .old_mmio = { - .write = { openpic_buggy_write, - openpic_buggy_write, - mpic_timer_write, - }, - .read = { openpic_buggy_read, - openpic_buggy_read, - mpic_timer_read, - }, - }, + .write = mpic_timer_write, + .read = mpic_timer_read, .endianness = DEVICE_BIG_ENDIAN, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, }; static const MemoryRegionOps mpic_cpu_ops = { - .old_mmio = { - .write = { openpic_buggy_write, - openpic_buggy_write, - openpic_cpu_write, - }, - .read = { openpic_buggy_read, - openpic_buggy_read, - openpic_cpu_read, - }, - }, + .write = openpic_cpu_write, + .read = openpic_cpu_read, .endianness = DEVICE_BIG_ENDIAN, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, }; static const MemoryRegionOps mpic_irq_ops = { From a285f1ca703a434fa8edf584f94a1dc29067ab29 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Fri, 7 Dec 2012 16:45:40 +0100 Subject: [PATCH 15/40] openpic: combine mpic and openpic src handlers The MPIC source irq handler suddenly became identical to the standard OpenPIC source irq handler. Combine them into the same function. Signed-off-by: Alexander Graf --- hw/openpic.c | 52 +++++----------------------------------------------- 1 file changed, 5 insertions(+), 47 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index 1d714f4d7c..b671d9de33 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -100,8 +100,8 @@ enum { #define MPIC_GLB_REG_SIZE 0x10F0 #define MPIC_TMR_REG_START 0x10F0 #define MPIC_TMR_REG_SIZE 0x220 -#define MPIC_IRQ_REG_START 0x10000 -#define MPIC_IRQ_REG_SIZE (MAX_SRC * 0x20) +#define MPIC_SRC_REG_START 0x10000 +#define MPIC_SRC_REG_SIZE (MAX_SRC * 0x20) #define MPIC_CPU_REG_START 0x20000 #define MPIC_CPU_REG_SIZE 0x100 + ((MAX_CPU - 1) * 0x1000) @@ -1169,48 +1169,6 @@ static uint64_t mpic_timer_read(void *opaque, hwaddr addr, unsigned len) return retval; } -static void mpic_src_irq_write(void *opaque, hwaddr addr, - uint64_t val, unsigned len) -{ - openpic_t *mpp = opaque; - int idx = addr / 0x20; - - DPRINTF("%s: addr " TARGET_FMT_plx " <= %08" PRIx64 "\n", - __func__, addr, val); - if (addr & 0xF) - return; - - if (addr & 0x10) { - /* EXDE / IFEDE / IEEDE */ - write_IRQreg_ide(mpp, idx, val); - } else { - /* EXVP / IFEVP / IEEVP */ - write_IRQreg_ipvp(mpp, idx, val); - } -} - -static uint64_t mpic_src_irq_read(void *opaque, hwaddr addr, unsigned len) -{ - openpic_t *mpp = opaque; - uint32_t retval; - int idx = addr / 0x20; - - DPRINTF("%s: addr " TARGET_FMT_plx "\n", __func__, addr); - if (addr & 0xF) - return -1; - - if (addr & 0x10) { - /* EXDE / IFEDE / IEEDE */ - retval = read_IRQreg_ide(mpp, idx); - } else { - /* EXVP / IFEVP / IEEVP */ - retval = read_IRQreg_ipvp(mpp, idx); - } - DPRINTF("%s: => %08x\n", __func__, retval); - - return retval; -} - static const MemoryRegionOps mpic_glb_ops = { .write = openpic_gbl_write, .read = openpic_gbl_read, @@ -1242,8 +1200,8 @@ static const MemoryRegionOps mpic_cpu_ops = { }; static const MemoryRegionOps mpic_irq_ops = { - .write = mpic_src_irq_write, - .read = mpic_src_irq_read, + .write = openpic_src_write, + .read = openpic_src_read, .endianness = DEVICE_BIG_ENDIAN, .impl = { .min_access_size = 4, @@ -1264,7 +1222,7 @@ qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, } const list[] = { {"glb", &mpic_glb_ops, MPIC_GLB_REG_START, MPIC_GLB_REG_SIZE}, {"tmr", &mpic_tmr_ops, MPIC_TMR_REG_START, MPIC_TMR_REG_SIZE}, - {"irq", &mpic_irq_ops, MPIC_IRQ_REG_START, MPIC_IRQ_REG_SIZE}, + {"src", &mpic_irq_ops, MPIC_SRC_REG_START, MPIC_SRC_REG_SIZE}, {"cpu", &mpic_cpu_ops, MPIC_CPU_REG_START, MPIC_CPU_REG_SIZE}, }; From 780d16b77f992db81e90b7dd7474a9397ce393b9 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Fri, 7 Dec 2012 17:15:15 +0100 Subject: [PATCH 16/40] openpic: Convert subregions to memory api The "openpic" controller is currently using one big region and does subregion dispatching manually. Move this to the memory api. Signed-off-by: Alexander Graf --- hw/openpic.c | 106 +++++++++++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 45 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index b671d9de33..2a3b56af49 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -79,6 +79,15 @@ enum { #define OPENPIC_IRQ_MBX0 (OPENPIC_IRQ_DBL0 + OPENPIC_MAX_DBL) /* First mailbox IRQ */ #endif +#define OPENPIC_GLB_REG_START 0x0 +#define OPENPIC_GLB_REG_SIZE 0x10F0 +#define OPENPIC_TMR_REG_START 0x10F0 +#define OPENPIC_TMR_REG_SIZE 0x220 +#define OPENPIC_SRC_REG_START 0x10000 +#define OPENPIC_SRC_REG_SIZE (MAX_SRC * 0x20) +#define OPENPIC_CPU_REG_START 0x20000 +#define OPENPIC_CPU_REG_SIZE 0x100 + ((MAX_CPU - 1) * 0x1000) + /* MPIC */ #define MPIC_MAX_CPU 1 #define MPIC_MAX_EXT 12 @@ -842,53 +851,39 @@ static uint64_t openpic_cpu_read(void *opaque, hwaddr addr, unsigned len) return openpic_cpu_read_internal(opaque, addr, (addr & 0x1f000) >> 12); } -static void openpic_write(void *opaque, hwaddr addr, uint64_t val, - unsigned len) -{ - openpic_t *opp = opaque; +static const MemoryRegionOps openpic_glb_ops = { + .write = openpic_gbl_write, + .read = openpic_gbl_read, + .endianness = DEVICE_LITTLE_ENDIAN, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, +}; - DPRINTF("%s: offset %08x val: %08x\n", __func__, (int)addr, val); - if (addr < 0x1100) { - /* Global registers */ - openpic_gbl_write(opp, addr, val, len); - } else if (addr < 0x10000) { - /* Timers registers */ - openpic_timer_write(opp, addr, val, len); - } else if (addr < 0x20000) { - /* Source registers */ - openpic_src_write(opp, addr, val, len); - } else { - /* CPU registers */ - openpic_cpu_write(opp, addr, val, len); - } -} +static const MemoryRegionOps openpic_tmr_ops = { + .write = openpic_timer_write, + .read = openpic_timer_read, + .endianness = DEVICE_LITTLE_ENDIAN, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, +}; -static uint64_t openpic_read(void *opaque, hwaddr addr, unsigned len) -{ - openpic_t *opp = opaque; - uint32_t retval; +static const MemoryRegionOps openpic_cpu_ops = { + .write = openpic_cpu_write, + .read = openpic_cpu_read, + .endianness = DEVICE_LITTLE_ENDIAN, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, +}; - DPRINTF("%s: offset %08x\n", __func__, (int)addr); - if (addr < 0x1100) { - /* Global registers */ - retval = openpic_gbl_read(opp, addr, len); - } else if (addr < 0x10000) { - /* Timers registers */ - retval = openpic_timer_read(opp, addr, len); - } else if (addr < 0x20000) { - /* Source registers */ - retval = openpic_src_read(opp, addr, len); - } else { - /* CPU registers */ - retval = openpic_cpu_read(opp, addr, len); - } - - return retval; -} - -static const MemoryRegionOps openpic_ops = { - .read = openpic_read, - .write = openpic_write, +static const MemoryRegionOps openpic_src_ops = { + .write = openpic_src_write, + .read = openpic_src_read, .endianness = DEVICE_LITTLE_ENDIAN, .impl = { .min_access_size = 4, @@ -1009,12 +1004,33 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, { openpic_t *opp; int i, m; + struct { + const char *name; + MemoryRegionOps const *ops; + hwaddr start_addr; + ram_addr_t size; + } const list[] = { + {"glb", &openpic_glb_ops, OPENPIC_GLB_REG_START, OPENPIC_GLB_REG_SIZE}, + {"tmr", &openpic_tmr_ops, OPENPIC_TMR_REG_START, OPENPIC_TMR_REG_SIZE}, + {"src", &openpic_src_ops, OPENPIC_SRC_REG_START, OPENPIC_SRC_REG_SIZE}, + {"cpu", &openpic_cpu_ops, OPENPIC_CPU_REG_START, OPENPIC_CPU_REG_SIZE}, + }; /* XXX: for now, only one CPU is supported */ if (nb_cpus != 1) return NULL; opp = g_malloc0(sizeof(openpic_t)); - memory_region_init_io(&opp->mem, &openpic_ops, opp, "openpic", 0x40000); + + memory_region_init(&opp->mem, "openpic", 0x40000); + + for (i = 0; i < ARRAY_SIZE(list); i++) { + + memory_region_init_io(&opp->sub_io_mem[i], list[i].ops, opp, + list[i].name, list[i].size); + + memory_region_add_subregion(&opp->mem, list[i].start_addr, + &opp->sub_io_mem[i]); + } // isu_base &= 0xFFFC0000; opp->nb_cpus = nb_cpus; From 5861a33898bbddfd1a80c2e202cb9352e3b1ba62 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Fri, 7 Dec 2012 23:51:09 +0100 Subject: [PATCH 17/40] openpic: combine mpic and openpic irq raise functions The IRQ raise mechanisms of the OpenPIC and MPIC controllers is identical, just that the MPIC one can also raise critical interrupts. Combine those two and check for critical raise capability during runtime. Signed-off-by: Alexander Graf --- hw/openpic.c | 34 ++++++++++++++++------------------ hw/openpic.h | 3 +++ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index 2a3b56af49..d709e36b52 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -207,6 +207,9 @@ typedef struct openpic_t { PCIDevice pci_dev; MemoryRegion mem; + /* Behavior control */ + uint32_t flags; + /* Sub-regions */ MemoryRegion sub_io_mem[7]; @@ -234,9 +237,10 @@ typedef struct openpic_t { int irq_ipi0; int irq_tim0; void (*reset) (void *); - void (*irq_raise) (struct openpic_t *, int, IRQ_src_t *); } openpic_t; +static void openpic_irq_raise(openpic_t *opp, int n_CPU, IRQ_src_t *src); + static inline void IRQ_setbit (IRQ_queue_t *q, int n_IRQ) { set_bit(q->queue, n_IRQ); @@ -321,7 +325,7 @@ static void IRQ_local_pipe (openpic_t *opp, int n_CPU, int n_IRQ) return; } DPRINTF("Raise OpenPIC INT output cpu %d irq %d\n", n_CPU, n_IRQ); - opp->irq_raise(opp, n_CPU, src); + openpic_irq_raise(opp, n_CPU, src); } /* update pic state because registers for n_IRQ have changed value */ @@ -753,7 +757,7 @@ static void openpic_cpu_write_internal(void *opaque, hwaddr addr, IPVP_PRIORITY(src->ipvp) > dst->servicing.priority)) { DPRINTF("Raise OpenPIC INT output cpu %d irq %d\n", idx, n_IRQ); - opp->irq_raise(opp, idx, src); + openpic_irq_raise(opp, idx, src); } break; default: @@ -996,7 +1000,13 @@ static int openpic_load(QEMUFile* f, void *opaque, int version_id) static void openpic_irq_raise(openpic_t *opp, int n_CPU, IRQ_src_t *src) { - qemu_irq_raise(opp->dst[n_CPU].irqs[OPENPIC_OUTPUT_INT]); + int n_ci = IDR_CI0 - n_CPU; + + if ((opp->flags & OPENPIC_FLAG_IDE_CRIT) && test_bit(&src->ide, n_ci)) { + qemu_irq_raise(opp->dst[n_CPU].irqs[OPENPIC_OUTPUT_CINT]); + } else { + qemu_irq_raise(opp->dst[n_CPU].irqs[OPENPIC_OUTPUT_INT]); + } } qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, @@ -1059,7 +1069,6 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, openpic_save, openpic_load, opp); qemu_register_reset(openpic_reset, opp); - opp->irq_raise = openpic_irq_raise; opp->reset = openpic_reset; if (pmem) @@ -1068,18 +1077,6 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, return qemu_allocate_irqs(openpic_set_irq, opp, opp->max_irq); } -static void mpic_irq_raise(openpic_t *mpp, int n_CPU, IRQ_src_t *src) -{ - int n_ci = IDR_CI0 - n_CPU; - - if(test_bit(&src->ide, n_ci)) { - qemu_irq_raise(mpp->dst[n_CPU].irqs[OPENPIC_OUTPUT_CINT]); - } - else { - qemu_irq_raise(mpp->dst[n_CPU].irqs[OPENPIC_OUTPUT_INT]); - } -} - static void mpic_reset (void *opaque) { openpic_t *mpp = (openpic_t *)opaque; @@ -1265,7 +1262,8 @@ qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, mpp->dst[i].irqs = irqs[i]; mpp->irq_out = irq_out; - mpp->irq_raise = mpic_irq_raise; + /* Enable critical interrupt support */ + mpp->flags |= OPENPIC_FLAG_IDE_CRIT; mpp->reset = mpic_reset; register_savevm(NULL, "mpic", 0, 2, openpic_save, openpic_load, mpp); diff --git a/hw/openpic.h b/hw/openpic.h index f50a1e42bd..1232d1039c 100644 --- a/hw/openpic.h +++ b/hw/openpic.h @@ -11,6 +11,9 @@ enum { OPENPIC_OUTPUT_NB, }; +/* OpenPIC capability flags */ +#define OPENPIC_FLAG_IDE_CRIT (1 << 0) + qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, qemu_irq **irqs, qemu_irq irq_out); qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, From c38c0b8ad0551e470984f2ae7e8e54aae304ed4b Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sat, 8 Dec 2012 00:43:42 +0100 Subject: [PATCH 18/40] openpic: merge mpic and openpic timer handling The openpic and mpic timer handling code is basically the same. Merge them. Signed-off-by: Alexander Graf --- hw/openpic.c | 131 ++++++++++++--------------------------------------- 1 file changed, 31 insertions(+), 100 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index d709e36b52..80016a2039 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -195,7 +195,6 @@ enum IPVP_bits { #define IPVP_VECTOR(_ipvpr_) ((_ipvpr_) & IPVP_VECTOR_MASK) typedef struct IRQ_dst_t { - uint32_t tfrr; uint32_t pctp; /* CPU current task priority */ uint32_t pcsr; /* CPU sensitivity register */ IRQ_queue_t raised; @@ -533,9 +532,6 @@ static void openpic_gbl_write(void *opaque, hwaddr addr, uint64_t val, case 0x10E0: /* SPVE */ opp->spve = val & 0x000000FF; break; - case 0x10F0: /* TIFR */ - opp->tifr = val; - break; default: break; } @@ -587,9 +583,6 @@ static uint64_t openpic_gbl_read(void *opaque, hwaddr addr, unsigned len) case 0x10E0: /* SPVE */ retval = opp->spve; break; - case 0x10F0: /* TIFR */ - retval = opp->tifr; - break; default: break; } @@ -607,24 +600,28 @@ static void openpic_timer_write(void *opaque, hwaddr addr, uint64_t val, DPRINTF("%s: addr %08x <= %08x\n", __func__, addr, val); if (addr & 0xF) return; - addr -= 0x10; - addr &= 0xFFFF; - idx = (addr & 0xFFF0) >> 6; + idx = (addr >> 6) & 0x3; addr = addr & 0x30; - switch (addr) { - case 0x00: /* TICC */ + + if (addr == 0x0) { + /* TIFR (TFRR) */ + opp->tifr = val; + return; + } + switch (addr & 0x30) { + case 0x00: /* TICC (GTCCR) */ break; - case 0x10: /* TIBC */ + case 0x10: /* TIBC (GTBCR) */ if ((opp->timers[idx].ticc & 0x80000000) != 0 && (val & 0x80000000) == 0 && (opp->timers[idx].tibc & 0x80000000) != 0) opp->timers[idx].ticc &= ~0x80000000; opp->timers[idx].tibc = val; break; - case 0x20: /* TIVP */ + case 0x20: /* TIVP (GTIVPR) */ write_IRQreg_ipvp(opp, opp->irq_tim0 + idx, val); break; - case 0x30: /* TIDE */ + case 0x30: /* TIDE (GTIDR) */ write_IRQreg_ide(opp, opp->irq_tim0 + idx, val); break; } @@ -633,31 +630,35 @@ static void openpic_timer_write(void *opaque, hwaddr addr, uint64_t val, static uint64_t openpic_timer_read(void *opaque, hwaddr addr, unsigned len) { openpic_t *opp = opaque; - uint32_t retval; + uint32_t retval = -1; int idx; DPRINTF("%s: addr %08x\n", __func__, addr); - retval = 0xFFFFFFFF; - if (addr & 0xF) - return retval; - addr -= 0x10; - addr &= 0xFFFF; - idx = (addr & 0xFFF0) >> 6; - addr = addr & 0x30; - switch (addr) { - case 0x00: /* TICC */ + if (addr & 0xF) { + goto out; + } + idx = (addr >> 6) & 0x3; + if (addr == 0x0) { + /* TIFR (TFRR) */ + retval = opp->tifr; + goto out; + } + switch (addr & 0x30) { + case 0x00: /* TICC (GTCCR) */ retval = opp->timers[idx].ticc; break; - case 0x10: /* TIBC */ + case 0x10: /* TIBC (GTBCR) */ retval = opp->timers[idx].tibc; break; - case 0x20: /* TIPV */ + case 0x20: /* TIPV (TIPV) */ retval = read_IRQreg_ipvp(opp, opp->irq_tim0 + idx); break; - case 0x30: /* TIDE */ + case 0x30: /* TIDE (TIDR) */ retval = read_IRQreg_ide(opp, opp->irq_tim0 + idx); break; } + +out: DPRINTF("%s: => %08x\n", __func__, retval); return retval; @@ -930,7 +931,6 @@ static void openpic_save(QEMUFile* f, void *opaque) qemu_put_sbe32s(f, &opp->nb_cpus); for (i = 0; i < opp->nb_cpus; i++) { - qemu_put_be32s(f, &opp->dst[i].tfrr); qemu_put_be32s(f, &opp->dst[i].pctp); qemu_put_be32s(f, &opp->dst[i].pcsr); openpic_save_IRQ_queue(f, &opp->dst[i].raised); @@ -983,7 +983,6 @@ static int openpic_load(QEMUFile* f, void *opaque, int version_id) qemu_get_sbe32s(f, &opp->nb_cpus); for (i = 0; i < opp->nb_cpus; i++) { - qemu_get_be32s(f, &opp->dst[i].tfrr); qemu_get_be32s(f, &opp->dst[i].pctp); qemu_get_be32s(f, &opp->dst[i].pcsr); openpic_load_IRQ_queue(f, &opp->dst[i].raised); @@ -1100,7 +1099,6 @@ static void mpic_reset (void *opaque) /* Initialise IRQ destinations */ for (i = 0; i < MAX_CPU; i++) { mpp->dst[i].pctp = 0x0000000F; - mpp->dst[i].tfrr = 0x00000000; memset(&mpp->dst[i].raised, 0, sizeof(IRQ_queue_t)); mpp->dst[i].raised.next = -1; memset(&mpp->dst[i].servicing, 0, sizeof(IRQ_queue_t)); @@ -1115,73 +1113,6 @@ static void mpic_reset (void *opaque) mpp->glbc = 0x00000000; } -static void mpic_timer_write(void *opaque, hwaddr addr, uint64_t val, - unsigned len) -{ - openpic_t *mpp = opaque; - int idx, cpu; - - DPRINTF("%s: addr " TARGET_FMT_plx " <= %08x\n", __func__, addr, val); - if (addr & 0xF) - return; - cpu = addr >> 12; - idx = (addr >> 6) & 0x3; - switch (addr & 0x30) { - case 0x00: /* gtccr */ - break; - case 0x10: /* gtbcr */ - if ((mpp->timers[idx].ticc & 0x80000000) != 0 && - (val & 0x80000000) == 0 && - (mpp->timers[idx].tibc & 0x80000000) != 0) - mpp->timers[idx].ticc &= ~0x80000000; - mpp->timers[idx].tibc = val; - break; - case 0x20: /* GTIVPR */ - write_IRQreg_ipvp(mpp, MPIC_TMR_IRQ + idx, val); - break; - case 0x30: /* GTIDR & TFRR */ - if ((addr & 0xF0) == 0xF0) - mpp->dst[cpu].tfrr = val; - else - write_IRQreg_ide(mpp, MPIC_TMR_IRQ + idx, val); - break; - } -} - -static uint64_t mpic_timer_read(void *opaque, hwaddr addr, unsigned len) -{ - openpic_t *mpp = opaque; - uint32_t retval; - int idx, cpu; - - DPRINTF("%s: addr " TARGET_FMT_plx "\n", __func__, addr); - retval = 0xFFFFFFFF; - if (addr & 0xF) - return retval; - cpu = addr >> 12; - idx = (addr >> 6) & 0x3; - switch (addr & 0x30) { - case 0x00: /* gtccr */ - retval = mpp->timers[idx].ticc; - break; - case 0x10: /* gtbcr */ - retval = mpp->timers[idx].tibc; - break; - case 0x20: /* TIPV */ - retval = read_IRQreg_ipvp(mpp, MPIC_TMR_IRQ + idx); - break; - case 0x30: /* TIDR */ - if ((addr &0xF0) == 0XF0) - retval = mpp->dst[cpu].tfrr; - else - retval = read_IRQreg_ide(mpp, MPIC_TMR_IRQ + idx); - break; - } - DPRINTF("%s: => %08x\n", __func__, retval); - - return retval; -} - static const MemoryRegionOps mpic_glb_ops = { .write = openpic_gbl_write, .read = openpic_gbl_read, @@ -1193,8 +1124,8 @@ static const MemoryRegionOps mpic_glb_ops = { }; static const MemoryRegionOps mpic_tmr_ops = { - .write = mpic_timer_write, - .read = mpic_timer_read, + .write = openpic_timer_write, + .read = openpic_timer_read, .endianness = DEVICE_BIG_ENDIAN, .impl = { .min_access_size = 4, From 825463b38414c9afb657caee1ce20eff2d521317 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sat, 8 Dec 2012 00:58:54 +0100 Subject: [PATCH 19/40] openpic: combine openpic and mpic reset functions The openpic and mpic reset handlers are almost identical. Combine them and extract the differences into state variables. Signed-off-by: Alexander Graf --- hw/openpic.c | 103 +++++++++++++++++++++------------------------------ 1 file changed, 42 insertions(+), 61 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index 80016a2039..e94529b7cc 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -53,7 +53,6 @@ #define MAX_IPI 4 #define MAX_IRQ (MAX_SRC + MAX_IPI + MAX_TMR) #define VID 0x03 /* MPIC version ID */ -#define VENI 0x00000000 /* Vendor ID */ enum { IRQ_IPVP = 0, @@ -125,6 +124,14 @@ enum { #define FSL_BRR1_IPMJ (0x00 << 8) /* 8 bit IP major number */ #define FSL_BRR1_IPMN 0x00 /* 8 bit IP minor number */ +#define FREP_NIRQ_SHIFT 16 +#define FREP_NCPU_SHIFT 8 +#define FREP_VID_SHIFT 0 + +#define VID_REVISION_1_2 2 + +#define VENI_GENERIC 0x00000000 /* Generic Vendor ID */ + enum mpic_ide_bits { IDR_EP = 31, IDR_CI0 = 30, @@ -208,6 +215,13 @@ typedef struct openpic_t { /* Behavior control */ uint32_t flags; + uint32_t nb_irqs; + uint32_t vid; + uint32_t veni; /* Vendor identification register */ + uint32_t spve_mask; + uint32_t tifr_reset; + uint32_t ipvp_reset; + uint32_t ide_reset; /* Sub-regions */ MemoryRegion sub_io_mem[7]; @@ -215,8 +229,6 @@ typedef struct openpic_t { /* Global registers */ uint32_t frep; /* Feature reporting register */ uint32_t glbc; /* Global configuration register */ - uint32_t micr; /* MPIC interrupt configuration register */ - uint32_t veni; /* Vendor identification register */ uint32_t pint; /* Processor initialization register */ uint32_t spve; /* Spurious vector register */ uint32_t tifr; /* Timer frequency reporting register */ @@ -235,7 +247,6 @@ typedef struct openpic_t { int max_irq; int irq_ipi0; int irq_tim0; - void (*reset) (void *); } openpic_t; static void openpic_irq_raise(openpic_t *opp, int n_CPU, IRQ_src_t *src); @@ -412,17 +423,17 @@ static void openpic_reset (void *opaque) opp->glbc = 0x80000000; /* Initialise controller registers */ - opp->frep = ((OPENPIC_EXT_IRQ - 1) << 16) | ((MAX_CPU - 1) << 8) | VID; - opp->veni = VENI; + opp->frep = ((opp->nb_irqs -1) << FREP_NIRQ_SHIFT) | + ((opp->nb_cpus -1) << FREP_NCPU_SHIFT) | + (opp->vid << FREP_VID_SHIFT); + opp->pint = 0x00000000; - opp->spve = 0x000000FF; - opp->tifr = 0x003F7A00; - /* ? */ - opp->micr = 0x00000000; + opp->spve = -1 & opp->spve_mask; + opp->tifr = opp->tifr_reset; /* Initialise IRQ sources */ for (i = 0; i < opp->max_irq; i++) { - opp->src[i].ipvp = 0xA0000000; - opp->src[i].ide = 0x00000000; + opp->src[i].ipvp = opp->ipvp_reset; + opp->src[i].ide = opp->ide_reset; } /* Initialise IRQ destinations */ for (i = 0; i < MAX_CPU; i++) { @@ -499,9 +510,9 @@ static void openpic_gbl_write(void *opaque, hwaddr addr, uint64_t val, case 0x1000: /* FREP */ break; case 0x1020: /* GLBC */ - if (val & 0x80000000 && opp->reset) - opp->reset(opp); - opp->glbc = val & ~0x80000000; + if (val & 0x80000000) { + openpic_reset(opp); + } break; case 0x1080: /* VENI */ break; @@ -530,7 +541,7 @@ static void openpic_gbl_write(void *opaque, hwaddr addr, uint64_t val, } break; case 0x10E0: /* SPVE */ - opp->spve = val & 0x000000FF; + opp->spve = val & opp->spve_mask; break; default: break; @@ -912,9 +923,7 @@ static void openpic_save(QEMUFile* f, void *opaque) openpic_t *opp = (openpic_t *)opaque; unsigned int i; - qemu_put_be32s(f, &opp->frep); qemu_put_be32s(f, &opp->glbc); - qemu_put_be32s(f, &opp->micr); qemu_put_be32s(f, &opp->veni); qemu_put_be32s(f, &opp->pint); qemu_put_be32s(f, &opp->spve); @@ -964,9 +973,7 @@ static int openpic_load(QEMUFile* f, void *opaque, int version_id) if (version_id != 1) return -EINVAL; - qemu_get_be32s(f, &opp->frep); qemu_get_be32s(f, &opp->glbc); - qemu_get_be32s(f, &opp->micr); qemu_get_be32s(f, &opp->veni); qemu_get_be32s(f, &opp->pint); qemu_get_be32s(f, &opp->spve); @@ -1043,6 +1050,11 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, // isu_base &= 0xFFFC0000; opp->nb_cpus = nb_cpus; + opp->nb_irqs = OPENPIC_EXT_IRQ; + opp->vid = VID; + opp->veni = VENI_GENERIC; + opp->spve_mask = 0xFF; + opp->tifr_reset = 0x003F7A00; opp->max_irq = OPENPIC_MAX_IRQ; opp->irq_ipi0 = OPENPIC_IRQ_IPI0; opp->irq_tim0 = OPENPIC_IRQ_TIM0; @@ -1068,51 +1080,12 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, openpic_save, openpic_load, opp); qemu_register_reset(openpic_reset, opp); - opp->reset = openpic_reset; - if (pmem) *pmem = &opp->mem; return qemu_allocate_irqs(openpic_set_irq, opp, opp->max_irq); } -static void mpic_reset (void *opaque) -{ - openpic_t *mpp = (openpic_t *)opaque; - int i; - - mpp->glbc = 0x80000000; - /* Initialise controller registers */ - mpp->frep = 0x004f0002 | ((mpp->nb_cpus - 1) << 8); - mpp->veni = VENI; - mpp->pint = 0x00000000; - mpp->spve = 0x0000FFFF; - /* Initialise IRQ sources */ - for (i = 0; i < mpp->max_irq; i++) { - mpp->src[i].ipvp = 0x80800000; - mpp->src[i].ide = 0x00000001; - } - /* Set IDE for IPIs to 0 so we don't get spurious interrupts */ - for (i = mpp->irq_ipi0; i < (mpp->irq_ipi0 + MAX_IPI); i++) { - mpp->src[i].ide = 0; - } - /* Initialise IRQ destinations */ - for (i = 0; i < MAX_CPU; i++) { - mpp->dst[i].pctp = 0x0000000F; - memset(&mpp->dst[i].raised, 0, sizeof(IRQ_queue_t)); - mpp->dst[i].raised.next = -1; - memset(&mpp->dst[i].servicing, 0, sizeof(IRQ_queue_t)); - mpp->dst[i].servicing.next = -1; - } - /* Initialise timers */ - for (i = 0; i < MAX_TMR; i++) { - mpp->timers[i].ticc = 0x00000000; - mpp->timers[i].tibc = 0x80000000; - } - /* Go out of RESET state */ - mpp->glbc = 0x00000000; -} - static const MemoryRegionOps mpic_glb_ops = { .write = openpic_gbl_write, .read = openpic_gbl_read, @@ -1185,6 +1158,15 @@ qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, } mpp->nb_cpus = nb_cpus; + /* 12 external sources, 48 internal sources , 4 timer sources, + 4 IPI sources, 4 messaging sources, and 8 Shared MSI sources */ + mpp->nb_irqs = 80; + mpp->vid = VID_REVISION_1_2; + mpp->veni = VENI_GENERIC; + mpp->spve_mask = 0xFFFF; + mpp->tifr_reset = 0x00000000; + mpp->ipvp_reset = 0x80000000; + mpp->ide_reset = 0x00000001; mpp->max_irq = MPIC_MAX_IRQ; mpp->irq_ipi0 = MPIC_IPI_IRQ; mpp->irq_tim0 = MPIC_TMR_IRQ; @@ -1195,10 +1177,9 @@ qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, /* Enable critical interrupt support */ mpp->flags |= OPENPIC_FLAG_IDE_CRIT; - mpp->reset = mpic_reset; register_savevm(NULL, "mpic", 0, 2, openpic_save, openpic_load, mpp); - qemu_register_reset(mpic_reset, mpp); + qemu_register_reset(openpic_reset, mpp); return qemu_allocate_irqs(openpic_set_irq, mpp, mpp->max_irq); } From 35732cb41e8f8608bb0fd6ae023daee56d439bf1 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sat, 8 Dec 2012 01:04:48 +0100 Subject: [PATCH 20/40] openpic: unify memory api subregions The only difference between the "openpic" and "mpic" memory api subregion descriptors is the endianness. Unify them as openpic accessors with explicit endianness markers in their names. Signed-off-by: Alexander Graf --- hw/openpic.c | 108 ++++++++++++++++++++++++++------------------------- 1 file changed, 56 insertions(+), 52 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index e94529b7cc..623c8077de 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -867,7 +867,7 @@ static uint64_t openpic_cpu_read(void *opaque, hwaddr addr, unsigned len) return openpic_cpu_read_internal(opaque, addr, (addr & 0x1f000) >> 12); } -static const MemoryRegionOps openpic_glb_ops = { +static const MemoryRegionOps openpic_glb_ops_le = { .write = openpic_gbl_write, .read = openpic_gbl_read, .endianness = DEVICE_LITTLE_ENDIAN, @@ -877,7 +877,17 @@ static const MemoryRegionOps openpic_glb_ops = { }, }; -static const MemoryRegionOps openpic_tmr_ops = { +static const MemoryRegionOps openpic_glb_ops_be = { + .write = openpic_gbl_write, + .read = openpic_gbl_read, + .endianness = DEVICE_BIG_ENDIAN, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, +}; + +static const MemoryRegionOps openpic_tmr_ops_le = { .write = openpic_timer_write, .read = openpic_timer_read, .endianness = DEVICE_LITTLE_ENDIAN, @@ -887,7 +897,17 @@ static const MemoryRegionOps openpic_tmr_ops = { }, }; -static const MemoryRegionOps openpic_cpu_ops = { +static const MemoryRegionOps openpic_tmr_ops_be = { + .write = openpic_timer_write, + .read = openpic_timer_read, + .endianness = DEVICE_BIG_ENDIAN, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, +}; + +static const MemoryRegionOps openpic_cpu_ops_le = { .write = openpic_cpu_write, .read = openpic_cpu_read, .endianness = DEVICE_LITTLE_ENDIAN, @@ -897,7 +917,17 @@ static const MemoryRegionOps openpic_cpu_ops = { }, }; -static const MemoryRegionOps openpic_src_ops = { +static const MemoryRegionOps openpic_cpu_ops_be = { + .write = openpic_cpu_write, + .read = openpic_cpu_read, + .endianness = DEVICE_BIG_ENDIAN, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, +}; + +static const MemoryRegionOps openpic_src_ops_le = { .write = openpic_src_write, .read = openpic_src_read, .endianness = DEVICE_LITTLE_ENDIAN, @@ -907,6 +937,16 @@ static const MemoryRegionOps openpic_src_ops = { }, }; +static const MemoryRegionOps openpic_src_ops_be = { + .write = openpic_src_write, + .read = openpic_src_read, + .endianness = DEVICE_BIG_ENDIAN, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, +}; + static void openpic_save_IRQ_queue(QEMUFile* f, IRQ_queue_t *q) { unsigned int i; @@ -1026,10 +1066,14 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, hwaddr start_addr; ram_addr_t size; } const list[] = { - {"glb", &openpic_glb_ops, OPENPIC_GLB_REG_START, OPENPIC_GLB_REG_SIZE}, - {"tmr", &openpic_tmr_ops, OPENPIC_TMR_REG_START, OPENPIC_TMR_REG_SIZE}, - {"src", &openpic_src_ops, OPENPIC_SRC_REG_START, OPENPIC_SRC_REG_SIZE}, - {"cpu", &openpic_cpu_ops, OPENPIC_CPU_REG_START, OPENPIC_CPU_REG_SIZE}, + {"glb", &openpic_glb_ops_le, OPENPIC_GLB_REG_START, + OPENPIC_GLB_REG_SIZE}, + {"tmr", &openpic_tmr_ops_le, OPENPIC_TMR_REG_START, + OPENPIC_TMR_REG_SIZE}, + {"src", &openpic_src_ops_le, OPENPIC_SRC_REG_START, + OPENPIC_SRC_REG_SIZE}, + {"cpu", &openpic_cpu_ops_le, OPENPIC_CPU_REG_START, + OPENPIC_CPU_REG_SIZE}, }; /* XXX: for now, only one CPU is supported */ @@ -1086,46 +1130,6 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, return qemu_allocate_irqs(openpic_set_irq, opp, opp->max_irq); } -static const MemoryRegionOps mpic_glb_ops = { - .write = openpic_gbl_write, - .read = openpic_gbl_read, - .endianness = DEVICE_BIG_ENDIAN, - .impl = { - .min_access_size = 4, - .max_access_size = 4, - }, -}; - -static const MemoryRegionOps mpic_tmr_ops = { - .write = openpic_timer_write, - .read = openpic_timer_read, - .endianness = DEVICE_BIG_ENDIAN, - .impl = { - .min_access_size = 4, - .max_access_size = 4, - }, -}; - -static const MemoryRegionOps mpic_cpu_ops = { - .write = openpic_cpu_write, - .read = openpic_cpu_read, - .endianness = DEVICE_BIG_ENDIAN, - .impl = { - .min_access_size = 4, - .max_access_size = 4, - }, -}; - -static const MemoryRegionOps mpic_irq_ops = { - .write = openpic_src_write, - .read = openpic_src_read, - .endianness = DEVICE_BIG_ENDIAN, - .impl = { - .min_access_size = 4, - .max_access_size = 4, - }, -}; - qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, int nb_cpus, qemu_irq **irqs, qemu_irq irq_out) { @@ -1137,10 +1141,10 @@ qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, hwaddr start_addr; ram_addr_t size; } const list[] = { - {"glb", &mpic_glb_ops, MPIC_GLB_REG_START, MPIC_GLB_REG_SIZE}, - {"tmr", &mpic_tmr_ops, MPIC_TMR_REG_START, MPIC_TMR_REG_SIZE}, - {"src", &mpic_irq_ops, MPIC_SRC_REG_START, MPIC_SRC_REG_SIZE}, - {"cpu", &mpic_cpu_ops, MPIC_CPU_REG_START, MPIC_CPU_REG_SIZE}, + {"glb", &openpic_glb_ops_be, MPIC_GLB_REG_START, MPIC_GLB_REG_SIZE}, + {"tmr", &openpic_tmr_ops_be, MPIC_TMR_REG_START, MPIC_TMR_REG_SIZE}, + {"src", &openpic_src_ops_be, MPIC_SRC_REG_START, MPIC_SRC_REG_SIZE}, + {"cpu", &openpic_cpu_ops_be, MPIC_CPU_REG_START, MPIC_CPU_REG_SIZE}, }; mpp = g_malloc0(sizeof(openpic_t)); From e1d10851522d7262a266f95d54c48eb2b1d8eb9b Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sat, 8 Dec 2012 01:25:21 +0100 Subject: [PATCH 21/40] openpic: remove unused type variable The openpic source irqs are carrying around a type indicator that is never accessed by anything. Remove it. Signed-off-by: Alexander Graf --- hw/openpic.c | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index 623c8077de..91e87b7d48 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -168,13 +168,6 @@ static uint32_t openpic_cpu_read_internal(void *opaque, hwaddr addr, static void openpic_cpu_write_internal(void *opaque, hwaddr addr, uint32_t val, int idx); -enum { - IRQ_EXTERNAL = 0x01, - IRQ_INTERNAL = 0x02, - IRQ_TIMER = 0x04, - IRQ_SPECIAL = 0x08, -}; - typedef struct IRQ_queue_t { uint32_t queue[BF_WIDTH(MAX_IRQ)]; int next; @@ -184,7 +177,6 @@ typedef struct IRQ_queue_t { typedef struct IRQ_src_t { uint32_t ipvp; /* IRQ vector/priority register */ uint32_t ide; /* IRQ destination register */ - int type; int last_cpu; int pending; /* TRUE if IRQ is pending */ } IRQ_src_t; @@ -972,7 +964,6 @@ static void openpic_save(QEMUFile* f, void *opaque) for (i = 0; i < opp->max_irq; i++) { qemu_put_be32s(f, &opp->src[i].ipvp); qemu_put_be32s(f, &opp->src[i].ide); - qemu_put_sbe32s(f, &opp->src[i].type); qemu_put_sbe32s(f, &opp->src[i].last_cpu); qemu_put_sbe32s(f, &opp->src[i].pending); } @@ -1022,7 +1013,6 @@ static int openpic_load(QEMUFile* f, void *opaque, int version_id) for (i = 0; i < opp->max_irq; i++) { qemu_get_be32s(f, &opp->src[i].ipvp); qemu_get_be32s(f, &opp->src[i].ide); - qemu_get_sbe32s(f, &opp->src[i].type); qemu_get_sbe32s(f, &opp->src[i].last_cpu); qemu_get_sbe32s(f, &opp->src[i].pending); } @@ -1059,7 +1049,7 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, qemu_irq **irqs, qemu_irq irq_out) { openpic_t *opp; - int i, m; + int i; struct { const char *name; MemoryRegionOps const *ops; @@ -1102,20 +1092,7 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, opp->max_irq = OPENPIC_MAX_IRQ; opp->irq_ipi0 = OPENPIC_IRQ_IPI0; opp->irq_tim0 = OPENPIC_IRQ_TIM0; - /* Set IRQ types */ - for (i = 0; i < OPENPIC_EXT_IRQ; i++) { - opp->src[i].type = IRQ_EXTERNAL; - } - for (; i < OPENPIC_IRQ_TIM0; i++) { - opp->src[i].type = IRQ_SPECIAL; - } - m = OPENPIC_IRQ_IPI0; - for (; i < m; i++) { - opp->src[i].type = IRQ_TIMER; - } - for (; i < OPENPIC_MAX_IRQ; i++) { - opp->src[i].type = IRQ_INTERNAL; - } + for (i = 0; i < nb_cpus; i++) opp->dst[i].irqs = irqs[i]; opp->irq_out = irq_out; From 1945dbc15f0f1ffdc9a10526448e9eba7c599d98 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sat, 8 Dec 2012 01:49:52 +0100 Subject: [PATCH 22/40] openpic: convert simple reg operations to builtin bitops The openpic code has its own bitmap code to access bits inside of a bitmap. However, that is overkill when we simply want to check for a bit inside of a uint32_t. So instead, let's use normal bit masks and C builtin shifts and ands. Signed-off-by: Alexander Graf --- hw/openpic.c | 67 ++++++++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index 91e87b7d48..d2038d87cb 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -132,13 +132,12 @@ enum { #define VENI_GENERIC 0x00000000 /* Generic Vendor ID */ -enum mpic_ide_bits { - IDR_EP = 31, - IDR_CI0 = 30, - IDR_CI1 = 29, - IDR_P1 = 1, - IDR_P0 = 0, -}; +#define IDR_EP_SHIFT 31 +#define IDR_EP_MASK (1 << IDR_EP_SHIFT) +#define IDR_CI0_SHIFT 30 +#define IDR_CI1_SHIFT 29 +#define IDR_P1_SHIFT 1 +#define IDR_P0_SHIFT 0 #define BF_WIDTH(_bits_) \ (((_bits_) + (sizeof(uint32_t) * 8) - 1) / (sizeof(uint32_t) * 8)) @@ -181,13 +180,17 @@ typedef struct IRQ_src_t { int pending; /* TRUE if IRQ is pending */ } IRQ_src_t; -enum IPVP_bits { - IPVP_MASK = 31, - IPVP_ACTIVITY = 30, - IPVP_MODE = 29, - IPVP_POLARITY = 23, - IPVP_SENSE = 22, -}; +#define IPVP_MASK_SHIFT 31 +#define IPVP_MASK_MASK (1 << IPVP_MASK_SHIFT) +#define IPVP_ACTIVITY_SHIFT 30 +#define IPVP_ACTIVITY_MASK (1 << IPVP_ACTIVITY_SHIFT) +#define IPVP_MODE_SHIFT 29 +#define IPVP_MODE_MASK (1 << IPVP_MODE_SHIFT) +#define IPVP_POLARITY_SHIFT 23 +#define IPVP_POLARITY_MASK (1 << IPVP_POLARITY_SHIFT) +#define IPVP_SENSE_SHIFT 22 +#define IPVP_SENSE_MASK (1 << IPVP_SENSE_SHIFT) + #define IPVP_PRIORITY_MASK (0x1F << 16) #define IPVP_PRIORITY(_ipvpr_) ((int)(((_ipvpr_) & IPVP_PRIORITY_MASK) >> 16)) #define IPVP_VECTOR_MASK ((1 << VECTOR_BITS) - 1) @@ -310,7 +313,7 @@ static void IRQ_local_pipe (openpic_t *opp, int n_CPU, int n_IRQ) __func__, n_IRQ, n_CPU); return; } - set_bit(&src->ipvp, IPVP_ACTIVITY); + src->ipvp |= IPVP_ACTIVITY_MASK; IRQ_setbit(&dst->raised, n_IRQ); if (priority < dst->raised.priority) { /* An higher priority IRQ is already raised */ @@ -343,7 +346,7 @@ static void openpic_update_irq(openpic_t *opp, int n_IRQ) DPRINTF("%s: IRQ %d is not pending\n", __func__, n_IRQ); return; } - if (test_bit(&src->ipvp, IPVP_MASK)) { + if (src->ipvp & IPVP_MASK_MASK) { /* Interrupt source is disabled */ DPRINTF("%s: IRQ %d is disabled\n", __func__, n_IRQ); return; @@ -353,7 +356,7 @@ static void openpic_update_irq(openpic_t *opp, int n_IRQ) DPRINTF("%s: IRQ %d has 0 priority\n", __func__, n_IRQ); return; } - if (test_bit(&src->ipvp, IPVP_ACTIVITY)) { + if (src->ipvp & IPVP_ACTIVITY_MASK) { /* IRQ already active */ DPRINTF("%s: IRQ %d is already active\n", __func__, n_IRQ); return; @@ -367,18 +370,19 @@ static void openpic_update_irq(openpic_t *opp, int n_IRQ) if (src->ide == (1 << src->last_cpu)) { /* Only one CPU is allowed to receive this IRQ */ IRQ_local_pipe(opp, src->last_cpu, n_IRQ); - } else if (!test_bit(&src->ipvp, IPVP_MODE)) { + } else if (!(src->ipvp & IPVP_MODE_MASK)) { /* Directed delivery mode */ for (i = 0; i < opp->nb_cpus; i++) { - if (test_bit(&src->ide, i)) + if (src->ide & (1 << i)) { IRQ_local_pipe(opp, i, n_IRQ); + } } } else { /* Distributed delivery mode */ for (i = src->last_cpu + 1; i != src->last_cpu; i++) { if (i == opp->nb_cpus) i = 0; - if (test_bit(&src->ide, i)) { + if (src->ide & (1 << i)) { IRQ_local_pipe(opp, i, n_IRQ); src->last_cpu = i; break; @@ -395,11 +399,12 @@ static void openpic_set_irq(void *opaque, int n_IRQ, int level) src = &opp->src[n_IRQ]; DPRINTF("openpic: set irq %d = %d ipvp=%08x\n", n_IRQ, level, src->ipvp); - if (test_bit(&src->ipvp, IPVP_SENSE)) { + if (src->ipvp & IPVP_SENSE_MASK) { /* level-sensitive irq */ src->pending = level; - if (!level) - reset_bit(&src->ipvp, IPVP_ACTIVITY); + if (!level) { + src->ipvp &= ~IPVP_ACTIVITY_MASK; + } } else { /* edge-sensitive irq */ if (level) @@ -810,13 +815,13 @@ static uint32_t openpic_cpu_read_internal(void *opaque, hwaddr addr, retval = IPVP_VECTOR(opp->spve); } else { src = &opp->src[n_IRQ]; - if (!test_bit(&src->ipvp, IPVP_ACTIVITY) || + if (!(src->ipvp & IPVP_ACTIVITY_MASK) || !(IPVP_PRIORITY(src->ipvp) > dst->pctp)) { /* - Spurious level-sensitive IRQ * - Priorities has been changed * and the pending IRQ isn't allowed anymore */ - reset_bit(&src->ipvp, IPVP_ACTIVITY); + src->ipvp &= ~IPVP_ACTIVITY_MASK; retval = IPVP_VECTOR(opp->spve); } else { /* IRQ enter servicing state */ @@ -825,20 +830,20 @@ static uint32_t openpic_cpu_read_internal(void *opaque, hwaddr addr, } IRQ_resetbit(&dst->raised, n_IRQ); dst->raised.next = -1; - if (!test_bit(&src->ipvp, IPVP_SENSE)) { + if (!(src->ipvp & IPVP_SENSE_MASK)) { /* edge-sensitive IRQ */ - reset_bit(&src->ipvp, IPVP_ACTIVITY); + src->ipvp &= ~IPVP_ACTIVITY_MASK; src->pending = 0; } if ((n_IRQ >= opp->irq_ipi0) && (n_IRQ < (opp->irq_ipi0 + MAX_IPI))) { src->ide &= ~(1 << idx); - if (src->ide && !test_bit(&src->ipvp, IPVP_SENSE)) { + if (src->ide && !(src->ipvp & IPVP_SENSE_MASK)) { /* trigger on CPUs that didn't know about it yet */ openpic_set_irq(opp, n_IRQ, 1); openpic_set_irq(opp, n_IRQ, 0); /* if all CPUs knew about it, set active bit again */ - set_bit(&src->ipvp, IPVP_ACTIVITY); + src->ipvp |= IPVP_ACTIVITY_MASK; } } } @@ -1036,9 +1041,9 @@ static int openpic_load(QEMUFile* f, void *opaque, int version_id) static void openpic_irq_raise(openpic_t *opp, int n_CPU, IRQ_src_t *src) { - int n_ci = IDR_CI0 - n_CPU; + int n_ci = IDR_CI0_SHIFT - n_CPU; - if ((opp->flags & OPENPIC_FLAG_IDE_CRIT) && test_bit(&src->ide, n_ci)) { + if ((opp->flags & OPENPIC_FLAG_IDE_CRIT) && (src->ide & (1 << n_ci))) { qemu_irq_raise(opp->dst[n_CPU].irqs[OPENPIC_OUTPUT_CINT]); } else { qemu_irq_raise(opp->dst[n_CPU].irqs[OPENPIC_OUTPUT_INT]); From 6d544ee8ac2097c87fc97b53d6a1310d9daa0562 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sat, 8 Dec 2012 01:59:20 +0100 Subject: [PATCH 23/40] openpic: rename openpic_t to OpenPICState Rename the openpic_t struct to OpenPICState, so it adheres better to the current coding style rules. Signed-off-by: Alexander Graf --- hw/openpic.c | 68 ++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index d2038d87cb..d5c27052e9 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -204,7 +204,7 @@ typedef struct IRQ_dst_t { qemu_irq *irqs; } IRQ_dst_t; -typedef struct openpic_t { +typedef struct OpenPICState { PCIDevice pci_dev; MemoryRegion mem; @@ -242,9 +242,9 @@ typedef struct openpic_t { int max_irq; int irq_ipi0; int irq_tim0; -} openpic_t; +} OpenPICState; -static void openpic_irq_raise(openpic_t *opp, int n_CPU, IRQ_src_t *src); +static void openpic_irq_raise(OpenPICState *opp, int n_CPU, IRQ_src_t *src); static inline void IRQ_setbit (IRQ_queue_t *q, int n_IRQ) { @@ -261,7 +261,7 @@ static inline int IRQ_testbit (IRQ_queue_t *q, int n_IRQ) return test_bit(q->queue, n_IRQ); } -static void IRQ_check (openpic_t *opp, IRQ_queue_t *q) +static void IRQ_check(OpenPICState *opp, IRQ_queue_t *q) { int next, i; int priority; @@ -282,7 +282,7 @@ static void IRQ_check (openpic_t *opp, IRQ_queue_t *q) q->priority = priority; } -static int IRQ_get_next (openpic_t *opp, IRQ_queue_t *q) +static int IRQ_get_next(OpenPICState *opp, IRQ_queue_t *q) { if (q->next == -1) { /* XXX: optimize */ @@ -292,7 +292,7 @@ static int IRQ_get_next (openpic_t *opp, IRQ_queue_t *q) return q->next; } -static void IRQ_local_pipe (openpic_t *opp, int n_CPU, int n_IRQ) +static void IRQ_local_pipe(OpenPICState *opp, int n_CPU, int n_IRQ) { IRQ_dst_t *dst; IRQ_src_t *src; @@ -334,7 +334,7 @@ static void IRQ_local_pipe (openpic_t *opp, int n_CPU, int n_IRQ) } /* update pic state because registers for n_IRQ have changed value */ -static void openpic_update_irq(openpic_t *opp, int n_IRQ) +static void openpic_update_irq(OpenPICState *opp, int n_IRQ) { IRQ_src_t *src; int i; @@ -393,7 +393,7 @@ static void openpic_update_irq(openpic_t *opp, int n_IRQ) static void openpic_set_irq(void *opaque, int n_IRQ, int level) { - openpic_t *opp = opaque; + OpenPICState *opp = opaque; IRQ_src_t *src; src = &opp->src[n_IRQ]; @@ -415,7 +415,7 @@ static void openpic_set_irq(void *opaque, int n_IRQ, int level) static void openpic_reset (void *opaque) { - openpic_t *opp = (openpic_t *)opaque; + OpenPICState *opp = (OpenPICState *)opaque; int i; opp->glbc = 0x80000000; @@ -450,17 +450,17 @@ static void openpic_reset (void *opaque) opp->glbc = 0x00000000; } -static inline uint32_t read_IRQreg_ide(openpic_t *opp, int n_IRQ) +static inline uint32_t read_IRQreg_ide(OpenPICState *opp, int n_IRQ) { return opp->src[n_IRQ].ide; } -static inline uint32_t read_IRQreg_ipvp(openpic_t *opp, int n_IRQ) +static inline uint32_t read_IRQreg_ipvp(OpenPICState *opp, int n_IRQ) { return opp->src[n_IRQ].ipvp; } -static inline void write_IRQreg_ide(openpic_t *opp, int n_IRQ, uint32_t val) +static inline void write_IRQreg_ide(OpenPICState *opp, int n_IRQ, uint32_t val) { uint32_t tmp; @@ -470,7 +470,7 @@ static inline void write_IRQreg_ide(openpic_t *opp, int n_IRQ, uint32_t val) DPRINTF("Set IDE %d to 0x%08x\n", n_IRQ, opp->src[n_IRQ].ide); } -static inline void write_IRQreg_ipvp(openpic_t *opp, int n_IRQ, uint32_t val) +static inline void write_IRQreg_ipvp(OpenPICState *opp, int n_IRQ, uint32_t val) { /* NOTE: not fully accurate for special IRQs, but simple and sufficient */ /* ACTIVITY bit is read-only */ @@ -484,7 +484,7 @@ static inline void write_IRQreg_ipvp(openpic_t *opp, int n_IRQ, uint32_t val) static void openpic_gbl_write(void *opaque, hwaddr addr, uint64_t val, unsigned len) { - openpic_t *opp = opaque; + OpenPICState *opp = opaque; IRQ_dst_t *dst; int idx; @@ -547,7 +547,7 @@ static void openpic_gbl_write(void *opaque, hwaddr addr, uint64_t val, static uint64_t openpic_gbl_read(void *opaque, hwaddr addr, unsigned len) { - openpic_t *opp = opaque; + OpenPICState *opp = opaque; uint32_t retval; DPRINTF("%s: addr " TARGET_FMT_plx "\n", __func__, addr); @@ -599,10 +599,10 @@ static uint64_t openpic_gbl_read(void *opaque, hwaddr addr, unsigned len) return retval; } -static void openpic_timer_write(void *opaque, hwaddr addr, uint64_t val, +static void openpic_tmr_write(void *opaque, hwaddr addr, uint64_t val, unsigned len) { - openpic_t *opp = opaque; + OpenPICState *opp = opaque; int idx; DPRINTF("%s: addr %08x <= %08x\n", __func__, addr, val); @@ -635,9 +635,9 @@ static void openpic_timer_write(void *opaque, hwaddr addr, uint64_t val, } } -static uint64_t openpic_timer_read(void *opaque, hwaddr addr, unsigned len) +static uint64_t openpic_tmr_read(void *opaque, hwaddr addr, unsigned len) { - openpic_t *opp = opaque; + OpenPICState *opp = opaque; uint32_t retval = -1; int idx; @@ -675,7 +675,7 @@ out: static void openpic_src_write(void *opaque, hwaddr addr, uint64_t val, unsigned len) { - openpic_t *opp = opaque; + OpenPICState *opp = opaque; int idx; DPRINTF("%s: addr %08x <= %08x\n", __func__, addr, val); @@ -694,7 +694,7 @@ static void openpic_src_write(void *opaque, hwaddr addr, uint64_t val, static uint64_t openpic_src_read(void *opaque, uint64_t addr, unsigned len) { - openpic_t *opp = opaque; + OpenPICState *opp = opaque; uint32_t retval; int idx; @@ -719,7 +719,7 @@ static uint64_t openpic_src_read(void *opaque, uint64_t addr, unsigned len) static void openpic_cpu_write_internal(void *opaque, hwaddr addr, uint32_t val, int idx) { - openpic_t *opp = opaque; + OpenPICState *opp = opaque; IRQ_src_t *src; IRQ_dst_t *dst; int s_IRQ, n_IRQ; @@ -783,7 +783,7 @@ static void openpic_cpu_write(void *opaque, hwaddr addr, uint64_t val, static uint32_t openpic_cpu_read_internal(void *opaque, hwaddr addr, int idx) { - openpic_t *opp = opaque; + OpenPICState *opp = opaque; IRQ_src_t *src; IRQ_dst_t *dst; uint32_t retval; @@ -885,8 +885,8 @@ static const MemoryRegionOps openpic_glb_ops_be = { }; static const MemoryRegionOps openpic_tmr_ops_le = { - .write = openpic_timer_write, - .read = openpic_timer_read, + .write = openpic_tmr_write, + .read = openpic_tmr_read, .endianness = DEVICE_LITTLE_ENDIAN, .impl = { .min_access_size = 4, @@ -895,8 +895,8 @@ static const MemoryRegionOps openpic_tmr_ops_le = { }; static const MemoryRegionOps openpic_tmr_ops_be = { - .write = openpic_timer_write, - .read = openpic_timer_read, + .write = openpic_tmr_write, + .read = openpic_tmr_read, .endianness = DEVICE_BIG_ENDIAN, .impl = { .min_access_size = 4, @@ -957,7 +957,7 @@ static void openpic_save_IRQ_queue(QEMUFile* f, IRQ_queue_t *q) static void openpic_save(QEMUFile* f, void *opaque) { - openpic_t *opp = (openpic_t *)opaque; + OpenPICState *opp = (OpenPICState *)opaque; unsigned int i; qemu_put_be32s(f, &opp->glbc); @@ -1003,7 +1003,7 @@ static void openpic_load_IRQ_queue(QEMUFile* f, IRQ_queue_t *q) static int openpic_load(QEMUFile* f, void *opaque, int version_id) { - openpic_t *opp = (openpic_t *)opaque; + OpenPICState *opp = (OpenPICState *)opaque; unsigned int i; if (version_id != 1) @@ -1039,7 +1039,7 @@ static int openpic_load(QEMUFile* f, void *opaque, int version_id) return pci_device_load(&opp->pci_dev, f); } -static void openpic_irq_raise(openpic_t *opp, int n_CPU, IRQ_src_t *src) +static void openpic_irq_raise(OpenPICState *opp, int n_CPU, IRQ_src_t *src) { int n_ci = IDR_CI0_SHIFT - n_CPU; @@ -1053,7 +1053,7 @@ static void openpic_irq_raise(openpic_t *opp, int n_CPU, IRQ_src_t *src) qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, qemu_irq **irqs, qemu_irq irq_out) { - openpic_t *opp; + OpenPICState *opp; int i; struct { const char *name; @@ -1074,7 +1074,7 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, /* XXX: for now, only one CPU is supported */ if (nb_cpus != 1) return NULL; - opp = g_malloc0(sizeof(openpic_t)); + opp = g_malloc0(sizeof(OpenPICState)); memory_region_init(&opp->mem, "openpic", 0x40000); @@ -1115,7 +1115,7 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, int nb_cpus, qemu_irq **irqs, qemu_irq irq_out) { - openpic_t *mpp; + OpenPICState *mpp; int i; struct { const char *name; @@ -1129,7 +1129,7 @@ qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, {"cpu", &openpic_cpu_ops_be, MPIC_CPU_REG_START, MPIC_CPU_REG_SIZE}, }; - mpp = g_malloc0(sizeof(openpic_t)); + mpp = g_malloc0(sizeof(OpenPICState)); memory_region_init(&mpp->mem, "mpic", 0x40000); memory_region_add_subregion(address_space, base, &mpp->mem); From 5bac0701113f4de4fee053a3939b0f569a04b88c Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sat, 8 Dec 2012 02:18:58 +0100 Subject: [PATCH 24/40] openpic: remove irq_out The current openpic emulation contains half-ready code for bypass mode. Remove it, so that when someone wants to finish it they can start from a clean state. Signed-off-by: Alexander Graf --- hw/openpic.c | 8 ++------ hw/openpic.h | 4 ++-- hw/ppc/e500.c | 2 +- hw/ppc_newworld.c | 2 +- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index d5c27052e9..5116b3ee4d 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -237,8 +237,6 @@ typedef struct OpenPICState { uint32_t ticc; /* Global timer current count register */ uint32_t tibc; /* Global timer base count register */ } timers[MAX_TMR]; - /* IRQ out is used when in bypass mode (not implemented) */ - qemu_irq irq_out; int max_irq; int irq_ipi0; int irq_tim0; @@ -1051,7 +1049,7 @@ static void openpic_irq_raise(OpenPICState *opp, int n_CPU, IRQ_src_t *src) } qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, - qemu_irq **irqs, qemu_irq irq_out) + qemu_irq **irqs) { OpenPICState *opp; int i; @@ -1100,7 +1098,6 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, for (i = 0; i < nb_cpus; i++) opp->dst[i].irqs = irqs[i]; - opp->irq_out = irq_out; register_savevm(&opp->pci_dev.qdev, "openpic", 0, 2, openpic_save, openpic_load, opp); @@ -1113,7 +1110,7 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, } qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, - int nb_cpus, qemu_irq **irqs, qemu_irq irq_out) + int nb_cpus, qemu_irq **irqs) { OpenPICState *mpp; int i; @@ -1159,7 +1156,6 @@ qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, for (i = 0; i < nb_cpus; i++) mpp->dst[i].irqs = irqs[i]; - mpp->irq_out = irq_out; /* Enable critical interrupt support */ mpp->flags |= OPENPIC_FLAG_IDE_CRIT; diff --git a/hw/openpic.h b/hw/openpic.h index 1232d1039c..8a68f20d38 100644 --- a/hw/openpic.h +++ b/hw/openpic.h @@ -15,7 +15,7 @@ enum { #define OPENPIC_FLAG_IDE_CRIT (1 << 0) qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, - qemu_irq **irqs, qemu_irq irq_out); + qemu_irq **irqs); qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, - int nb_cpus, qemu_irq **irqs, qemu_irq irq_out); + int nb_cpus, qemu_irq **irqs); #endif /* __OPENPIC_H__ */ diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index f3e97d8bb5..3f6d58c307 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -493,7 +493,7 @@ void ppce500_init(PPCE500Params *params) /* MPIC */ mpic = mpic_init(ccsr_addr_space, MPC8544_MPIC_REGS_OFFSET, - smp_cpus, irqs, NULL); + smp_cpus, irqs); if (!mpic) { cpu_abort(env, "MPIC failed to initialize\n"); diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c index 664747ead3..b9c2cd8d1d 100644 --- a/hw/ppc_newworld.c +++ b/hw/ppc_newworld.c @@ -320,7 +320,7 @@ static void ppc_core99_init(QEMUMachineInitArgs *args) exit(1); } } - pic = openpic_init(&pic_mem, smp_cpus, openpic_irqs, NULL); + pic = openpic_init(&pic_mem, smp_cpus, openpic_irqs); if (PPC_INPUT(env) == PPC_FLAGS_INPUT_970) { /* 970 gets a U3 bus */ pci_bus = pci_pmac_u3_init(pic, get_system_memory(), get_system_io()); From d0b7263134dfd4d487698b639f2069951f3fdb26 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sat, 8 Dec 2012 05:17:14 +0100 Subject: [PATCH 25/40] openpic: convert to qdev This patch converts the OpenPIC device to qdev. Along the way it renames the "openpic" target to "raven" and the "mpic" target to "fsl_mpic_20", to better reflect the actual models they implement. This way we have a generic OpenPIC device now that can handle different flavors of the OpenPIC specification. Signed-off-by: Alexander Graf --- hw/openpic.c | 288 +++++++++++++++++++++++----------------------- hw/openpic.h | 8 +- hw/ppc/e500.c | 24 +++- hw/ppc_newworld.c | 25 +++- 4 files changed, 185 insertions(+), 160 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index 5116b3ee4d..591b2917ed 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -37,6 +37,7 @@ #include "ppc_mac.h" #include "pci.h" #include "openpic.h" +#include "sysbus.h" //#define DEBUG_OPENPIC @@ -54,30 +55,10 @@ #define MAX_IRQ (MAX_SRC + MAX_IPI + MAX_TMR) #define VID 0x03 /* MPIC version ID */ -enum { - IRQ_IPVP = 0, - IRQ_IDE, -}; - -/* OpenPIC */ -#define OPENPIC_MAX_CPU 2 -#define OPENPIC_MAX_IRQ 64 -#define OPENPIC_EXT_IRQ 48 -#define OPENPIC_MAX_TMR MAX_TMR -#define OPENPIC_MAX_IPI MAX_IPI - -/* Interrupt definitions */ -#define OPENPIC_IRQ_FE (OPENPIC_EXT_IRQ) /* Internal functional IRQ */ -#define OPENPIC_IRQ_ERR (OPENPIC_EXT_IRQ + 1) /* Error IRQ */ -#define OPENPIC_IRQ_TIM0 (OPENPIC_EXT_IRQ + 2) /* First timer IRQ */ -#if OPENPIC_MAX_IPI > 0 -#define OPENPIC_IRQ_IPI0 (OPENPIC_IRQ_TIM0 + OPENPIC_MAX_TMR) /* First IPI IRQ */ -#define OPENPIC_IRQ_DBL0 (OPENPIC_IRQ_IPI0 + (OPENPIC_MAX_CPU * OPENPIC_MAX_IPI)) /* First doorbell IRQ */ -#else -#define OPENPIC_IRQ_DBL0 (OPENPIC_IRQ_TIM0 + OPENPIC_MAX_TMR) /* First doorbell IRQ */ -#define OPENPIC_IRQ_MBX0 (OPENPIC_IRQ_DBL0 + OPENPIC_MAX_DBL) /* First mailbox IRQ */ -#endif +/* OpenPIC capability flags */ +#define OPENPIC_FLAG_IDE_CRIT (1 << 0) +/* OpenPIC address map */ #define OPENPIC_GLB_REG_START 0x0 #define OPENPIC_GLB_REG_SIZE 0x10F0 #define OPENPIC_TMR_REG_START 0x10F0 @@ -87,31 +68,37 @@ enum { #define OPENPIC_CPU_REG_START 0x20000 #define OPENPIC_CPU_REG_SIZE 0x100 + ((MAX_CPU - 1) * 0x1000) -/* MPIC */ -#define MPIC_MAX_CPU 1 -#define MPIC_MAX_EXT 12 -#define MPIC_MAX_INT 64 -#define MPIC_MAX_IRQ MAX_IRQ +/* Raven */ +#define RAVEN_MAX_CPU 2 +#define RAVEN_MAX_EXT 48 +#define RAVEN_MAX_IRQ 64 +#define RAVEN_MAX_TMR MAX_TMR +#define RAVEN_MAX_IPI MAX_IPI + +/* Interrupt definitions */ +#define RAVEN_FE_IRQ (RAVEN_MAX_EXT) /* Internal functional IRQ */ +#define RAVEN_ERR_IRQ (RAVEN_MAX_EXT + 1) /* Error IRQ */ +#define RAVEN_TMR_IRQ (RAVEN_MAX_EXT + 2) /* First timer IRQ */ +#define RAVEN_IPI_IRQ (RAVEN_TMR_IRQ + RAVEN_MAX_TMR) /* First IPI IRQ */ +/* First doorbell IRQ */ +#define RAVEN_DBL_IRQ (RAVEN_IPI_IRQ + (RAVEN_MAX_CPU * RAVEN_MAX_IPI)) + +/* FSL_MPIC_20 */ +#define FSL_MPIC_20_MAX_CPU 1 +#define FSL_MPIC_20_MAX_EXT 12 +#define FSL_MPIC_20_MAX_INT 64 +#define FSL_MPIC_20_MAX_IRQ MAX_IRQ /* Interrupt definitions */ /* IRQs, accessible through the IRQ region */ -#define MPIC_EXT_IRQ 0x00 -#define MPIC_INT_IRQ 0x10 -#define MPIC_MSG_IRQ 0xb0 -#define MPIC_MSI_IRQ 0xe0 +#define FSL_MPIC_20_EXT_IRQ 0x00 +#define FSL_MPIC_20_INT_IRQ 0x10 +#define FSL_MPIC_20_MSG_IRQ 0xb0 +#define FSL_MPIC_20_MSI_IRQ 0xe0 /* These are available through separate regions, but for simplicity's sake mapped into the same number space */ -#define MPIC_TMR_IRQ 0x100 -#define MPIC_IPI_IRQ 0x104 - -#define MPIC_GLB_REG_START 0x0 -#define MPIC_GLB_REG_SIZE 0x10F0 -#define MPIC_TMR_REG_START 0x10F0 -#define MPIC_TMR_REG_SIZE 0x220 -#define MPIC_SRC_REG_START 0x10000 -#define MPIC_SRC_REG_SIZE (MAX_SRC * 0x20) -#define MPIC_CPU_REG_START 0x20000 -#define MPIC_CPU_REG_SIZE 0x100 + ((MAX_CPU - 1) * 0x1000) +#define FSL_MPIC_20_TMR_IRQ 0x100 +#define FSL_MPIC_20_IPI_IRQ 0x104 /* * Block Revision Register1 (BRR1): QEMU does not fully emulate @@ -129,6 +116,7 @@ enum { #define FREP_VID_SHIFT 0 #define VID_REVISION_1_2 2 +#define VID_REVISION_1_3 3 #define VENI_GENERIC 0x00000000 /* Generic Vendor ID */ @@ -205,10 +193,11 @@ typedef struct IRQ_dst_t { } IRQ_dst_t; typedef struct OpenPICState { - PCIDevice pci_dev; + SysBusDevice busdev; MemoryRegion mem; /* Behavior control */ + uint32_t model; uint32_t flags; uint32_t nb_irqs; uint32_t vid; @@ -231,15 +220,15 @@ typedef struct OpenPICState { IRQ_src_t src[MAX_IRQ]; /* Local registers per output pin */ IRQ_dst_t dst[MAX_CPU]; - int nb_cpus; + uint32_t nb_cpus; /* Timer registers */ struct { uint32_t ticc; /* Global timer current count register */ uint32_t tibc; /* Global timer base count register */ } timers[MAX_TMR]; - int max_irq; - int irq_ipi0; - int irq_tim0; + uint32_t max_irq; + uint32_t irq_ipi0; + uint32_t irq_tim0; } OpenPICState; static void openpic_irq_raise(OpenPICState *opp, int n_CPU, IRQ_src_t *src); @@ -411,9 +400,9 @@ static void openpic_set_irq(void *opaque, int n_IRQ, int level) openpic_update_irq(opp, n_IRQ); } -static void openpic_reset (void *opaque) +static void openpic_reset(DeviceState *d) { - OpenPICState *opp = (OpenPICState *)opaque; + OpenPICState *opp = FROM_SYSBUS(typeof (*opp), sysbus_from_qdev(d)); int i; opp->glbc = 0x80000000; @@ -506,7 +495,7 @@ static void openpic_gbl_write(void *opaque, hwaddr addr, uint64_t val, break; case 0x1020: /* GLBC */ if (val & 0x80000000) { - openpic_reset(opp); + openpic_reset(&opp->busdev.qdev); } break; case 0x1080: /* VENI */ @@ -971,7 +960,7 @@ static void openpic_save(QEMUFile* f, void *opaque) qemu_put_sbe32s(f, &opp->src[i].pending); } - qemu_put_sbe32s(f, &opp->nb_cpus); + qemu_put_be32s(f, &opp->nb_cpus); for (i = 0; i < opp->nb_cpus; i++) { qemu_put_be32s(f, &opp->dst[i].pctp); @@ -984,8 +973,6 @@ static void openpic_save(QEMUFile* f, void *opaque) qemu_put_be32s(f, &opp->timers[i].ticc); qemu_put_be32s(f, &opp->timers[i].tibc); } - - pci_device_save(&opp->pci_dev, f); } static void openpic_load_IRQ_queue(QEMUFile* f, IRQ_queue_t *q) @@ -1020,7 +1007,7 @@ static int openpic_load(QEMUFile* f, void *opaque, int version_id) qemu_get_sbe32s(f, &opp->src[i].pending); } - qemu_get_sbe32s(f, &opp->nb_cpus); + qemu_get_be32s(f, &opp->nb_cpus); for (i = 0; i < opp->nb_cpus; i++) { qemu_get_be32s(f, &opp->dst[i].pctp); @@ -1034,7 +1021,7 @@ static int openpic_load(QEMUFile* f, void *opaque, int version_id) qemu_get_be32s(f, &opp->timers[i].tibc); } - return pci_device_load(&opp->pci_dev, f); + return 0; } static void openpic_irq_raise(OpenPICState *opp, int n_CPU, IRQ_src_t *src) @@ -1048,17 +1035,18 @@ static void openpic_irq_raise(OpenPICState *opp, int n_CPU, IRQ_src_t *src) } } -qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, - qemu_irq **irqs) +struct memreg { + const char *name; + MemoryRegionOps const *ops; + hwaddr start_addr; + ram_addr_t size; +}; + +static int openpic_init(SysBusDevice *dev) { - OpenPICState *opp; - int i; - struct { - const char *name; - MemoryRegionOps const *ops; - hwaddr start_addr; - ram_addr_t size; - } const list[] = { + OpenPICState *opp = FROM_SYSBUS(typeof (*opp), dev); + int i, j; + const struct memreg list_le[] = { {"glb", &openpic_glb_ops_le, OPENPIC_GLB_REG_START, OPENPIC_GLB_REG_SIZE}, {"tmr", &openpic_tmr_ops_le, OPENPIC_TMR_REG_START, @@ -1068,16 +1056,57 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, {"cpu", &openpic_cpu_ops_le, OPENPIC_CPU_REG_START, OPENPIC_CPU_REG_SIZE}, }; + const struct memreg list_be[] = { + {"glb", &openpic_glb_ops_be, OPENPIC_GLB_REG_START, + OPENPIC_GLB_REG_SIZE}, + {"tmr", &openpic_tmr_ops_be, OPENPIC_TMR_REG_START, + OPENPIC_TMR_REG_SIZE}, + {"src", &openpic_src_ops_be, OPENPIC_SRC_REG_START, + OPENPIC_SRC_REG_SIZE}, + {"cpu", &openpic_cpu_ops_be, OPENPIC_CPU_REG_START, + OPENPIC_CPU_REG_SIZE}, + }; + struct memreg const *list; - /* XXX: for now, only one CPU is supported */ - if (nb_cpus != 1) - return NULL; - opp = g_malloc0(sizeof(OpenPICState)); + switch (opp->model) { + case OPENPIC_MODEL_FSL_MPIC_20: + default: + opp->flags |= OPENPIC_FLAG_IDE_CRIT; + opp->nb_irqs = 80; + opp->vid = VID_REVISION_1_2; + opp->veni = VENI_GENERIC; + opp->spve_mask = 0xFFFF; + opp->tifr_reset = 0x00000000; + opp->ipvp_reset = 0x80000000; + opp->ide_reset = 0x00000001; + opp->max_irq = FSL_MPIC_20_MAX_IRQ; + opp->irq_ipi0 = FSL_MPIC_20_IPI_IRQ; + opp->irq_tim0 = FSL_MPIC_20_TMR_IRQ; + list = list_be; + break; + case OPENPIC_MODEL_RAVEN: + opp->nb_irqs = RAVEN_MAX_EXT; + opp->vid = VID_REVISION_1_3; + opp->veni = VENI_GENERIC; + opp->spve_mask = 0xFF; + opp->tifr_reset = 0x003F7A00; + opp->ipvp_reset = 0xA0000000; + opp->ide_reset = 0x00000000; + opp->max_irq = RAVEN_MAX_IRQ; + opp->irq_ipi0 = RAVEN_IPI_IRQ; + opp->irq_tim0 = RAVEN_TMR_IRQ; + list = list_le; + + /* Only UP supported today */ + if (opp->nb_cpus != 1) { + return -EINVAL; + } + break; + } memory_region_init(&opp->mem, "openpic", 0x40000); - for (i = 0; i < ARRAY_SIZE(list); i++) { - + for (i = 0; i < ARRAY_SIZE(list_le); i++) { memory_region_init_io(&opp->sub_io_mem[i], list[i].ops, opp, list[i].name, list[i].size); @@ -1085,83 +1114,48 @@ qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, &opp->sub_io_mem[i]); } - // isu_base &= 0xFFFC0000; - opp->nb_cpus = nb_cpus; - opp->nb_irqs = OPENPIC_EXT_IRQ; - opp->vid = VID; - opp->veni = VENI_GENERIC; - opp->spve_mask = 0xFF; - opp->tifr_reset = 0x003F7A00; - opp->max_irq = OPENPIC_MAX_IRQ; - opp->irq_ipi0 = OPENPIC_IRQ_IPI0; - opp->irq_tim0 = OPENPIC_IRQ_TIM0; - - for (i = 0; i < nb_cpus; i++) - opp->dst[i].irqs = irqs[i]; - - register_savevm(&opp->pci_dev.qdev, "openpic", 0, 2, - openpic_save, openpic_load, opp); - qemu_register_reset(openpic_reset, opp); - - if (pmem) - *pmem = &opp->mem; - - return qemu_allocate_irqs(openpic_set_irq, opp, opp->max_irq); -} - -qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, - int nb_cpus, qemu_irq **irqs) -{ - OpenPICState *mpp; - int i; - struct { - const char *name; - MemoryRegionOps const *ops; - hwaddr start_addr; - ram_addr_t size; - } const list[] = { - {"glb", &openpic_glb_ops_be, MPIC_GLB_REG_START, MPIC_GLB_REG_SIZE}, - {"tmr", &openpic_tmr_ops_be, MPIC_TMR_REG_START, MPIC_TMR_REG_SIZE}, - {"src", &openpic_src_ops_be, MPIC_SRC_REG_START, MPIC_SRC_REG_SIZE}, - {"cpu", &openpic_cpu_ops_be, MPIC_CPU_REG_START, MPIC_CPU_REG_SIZE}, - }; - - mpp = g_malloc0(sizeof(OpenPICState)); - - memory_region_init(&mpp->mem, "mpic", 0x40000); - memory_region_add_subregion(address_space, base, &mpp->mem); - - for (i = 0; i < sizeof(list)/sizeof(list[0]); i++) { - - memory_region_init_io(&mpp->sub_io_mem[i], list[i].ops, mpp, - list[i].name, list[i].size); - - memory_region_add_subregion(&mpp->mem, list[i].start_addr, - &mpp->sub_io_mem[i]); + for (i = 0; i < opp->nb_cpus; i++) { + opp->dst[i].irqs = g_new(qemu_irq, OPENPIC_OUTPUT_NB); + for (j = 0; j < OPENPIC_OUTPUT_NB; j++) { + sysbus_init_irq(dev, &opp->dst[i].irqs[j]); + } } - mpp->nb_cpus = nb_cpus; - /* 12 external sources, 48 internal sources , 4 timer sources, - 4 IPI sources, 4 messaging sources, and 8 Shared MSI sources */ - mpp->nb_irqs = 80; - mpp->vid = VID_REVISION_1_2; - mpp->veni = VENI_GENERIC; - mpp->spve_mask = 0xFFFF; - mpp->tifr_reset = 0x00000000; - mpp->ipvp_reset = 0x80000000; - mpp->ide_reset = 0x00000001; - mpp->max_irq = MPIC_MAX_IRQ; - mpp->irq_ipi0 = MPIC_IPI_IRQ; - mpp->irq_tim0 = MPIC_TMR_IRQ; + register_savevm(&opp->busdev.qdev, "openpic", 0, 2, + openpic_save, openpic_load, opp); - for (i = 0; i < nb_cpus; i++) - mpp->dst[i].irqs = irqs[i]; + sysbus_init_mmio(dev, &opp->mem); + qdev_init_gpio_in(&dev->qdev, openpic_set_irq, opp->max_irq); - /* Enable critical interrupt support */ - mpp->flags |= OPENPIC_FLAG_IDE_CRIT; - - register_savevm(NULL, "mpic", 0, 2, openpic_save, openpic_load, mpp); - qemu_register_reset(openpic_reset, mpp); - - return qemu_allocate_irqs(openpic_set_irq, mpp, mpp->max_irq); + return 0; } + +static Property openpic_properties[] = { + DEFINE_PROP_UINT32("model", OpenPICState, model, OPENPIC_MODEL_FSL_MPIC_20), + DEFINE_PROP_UINT32("nb_cpus", OpenPICState, nb_cpus, 1), + DEFINE_PROP_END_OF_LIST(), +}; + +static void openpic_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); + + k->init = openpic_init; + dc->props = openpic_properties; + dc->reset = openpic_reset; +} + +static TypeInfo openpic_info = { + .name = "openpic", + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(OpenPICState), + .class_init = openpic_class_init, +}; + +static void openpic_register_types(void) +{ + type_register_static(&openpic_info); +} + +type_init(openpic_register_types) diff --git a/hw/openpic.h b/hw/openpic.h index 8a68f20d38..e226d7b563 100644 --- a/hw/openpic.h +++ b/hw/openpic.h @@ -11,11 +11,7 @@ enum { OPENPIC_OUTPUT_NB, }; -/* OpenPIC capability flags */ -#define OPENPIC_FLAG_IDE_CRIT (1 << 0) +#define OPENPIC_MODEL_RAVEN 0 +#define OPENPIC_MODEL_FSL_MPIC_20 1 -qemu_irq *openpic_init (MemoryRegion **pmem, int nb_cpus, - qemu_irq **irqs); -qemu_irq *mpic_init (MemoryRegion *address_space, hwaddr base, - int nb_cpus, qemu_irq **irqs); #endif /* __OPENPIC_H__ */ diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 3f6d58c307..fa9b8ede4b 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -418,7 +418,7 @@ void ppce500_init(PPCE500Params *params) target_ulong dt_base = 0; target_ulong initrd_base = 0; target_long initrd_size=0; - int i=0; + int i = 0, j, k; unsigned int pci_irq_nrs[4] = {1, 2, 3, 4}; qemu_irq **irqs, *mpic; DeviceState *dev; @@ -492,13 +492,27 @@ void ppce500_init(PPCE500Params *params) ccsr_addr_space); /* MPIC */ - mpic = mpic_init(ccsr_addr_space, MPC8544_MPIC_REGS_OFFSET, - smp_cpus, irqs); + mpic = g_new(qemu_irq, 256); + dev = qdev_create(NULL, "openpic"); + qdev_prop_set_uint32(dev, "nb_cpus", smp_cpus); + qdev_prop_set_uint32(dev, "model", OPENPIC_MODEL_FSL_MPIC_20); + qdev_init_nofail(dev); + s = sysbus_from_qdev(dev); - if (!mpic) { - cpu_abort(env, "MPIC failed to initialize\n"); + k = 0; + for (i = 0; i < smp_cpus; i++) { + for (j = 0; j < OPENPIC_OUTPUT_NB; j++) { + sysbus_connect_irq(s, k++, irqs[i][j]); + } } + for (i = 0; i < 256; i++) { + mpic[i] = qdev_get_gpio_in(dev, i); + } + + memory_region_add_subregion(ccsr_addr_space, MPC8544_MPIC_REGS_OFFSET, + s->mmio[0].memory); + /* Serial */ if (serial_hds[0]) { serial_mm_init(ccsr_addr_space, MPC8544_SERIAL0_REGS_OFFSET, diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c index b9c2cd8d1d..8c2114e26f 100644 --- a/hw/ppc_newworld.c +++ b/hw/ppc_newworld.c @@ -67,6 +67,7 @@ #include "hw/usb.h" #include "blockdev.h" #include "exec-memory.h" +#include "sysbus.h" #define MAX_IDE_BUS 2 #define CFG_ADDR 0xf0000510 @@ -141,7 +142,7 @@ static void ppc_core99_init(QEMUMachineInitArgs *args) char *filename; qemu_irq *pic, **openpic_irqs; MemoryRegion *unin_memory = g_new(MemoryRegion, 1); - int linux_boot, i; + int linux_boot, i, j, k; MemoryRegion *ram = g_new(MemoryRegion, 1), *bios = g_new(MemoryRegion, 1); hwaddr kernel_base, initrd_base, cmdline_base = 0; long kernel_size, initrd_size; @@ -156,6 +157,8 @@ static void ppc_core99_init(QEMUMachineInitArgs *args) void *fw_cfg; void *dbdma; int machine_arch; + SysBusDevice *s; + DeviceState *dev; linux_boot = (kernel_filename != NULL); @@ -320,7 +323,25 @@ static void ppc_core99_init(QEMUMachineInitArgs *args) exit(1); } } - pic = openpic_init(&pic_mem, smp_cpus, openpic_irqs); + + pic = g_new(qemu_irq, 64); + + dev = qdev_create(NULL, "openpic"); + qdev_prop_set_uint32(dev, "model", OPENPIC_MODEL_RAVEN); + qdev_init_nofail(dev); + s = sysbus_from_qdev(dev); + pic_mem = s->mmio[0].memory; + k = 0; + for (i = 0; i < smp_cpus; i++) { + for (j = 0; j < OPENPIC_OUTPUT_NB; j++) { + sysbus_connect_irq(s, k++, openpic_irqs[i][j]); + } + } + + for (i = 0; i < 64; i++) { + pic[i] = qdev_get_gpio_in(dev, i); + } + if (PPC_INPUT(env) == PPC_FLAGS_INPUT_970) { /* 970 gets a U3 bus */ pci_bus = pci_pmac_u3_init(pic, get_system_memory(), get_system_io()); From dbbbfd6058dda61f57d1f72133aa54eb27330411 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sat, 8 Dec 2012 13:51:50 +0100 Subject: [PATCH 26/40] openpic: make brr1 model specific Now that we can properly distinguish between openpic model differences, let's move brr1 out of the raven code path. Signed-off-by: Alexander Graf --- hw/openpic.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/openpic.c b/hw/openpic.c index 591b2917ed..5bf16ea0a0 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -206,6 +206,7 @@ typedef struct OpenPICState { uint32_t tifr_reset; uint32_t ipvp_reset; uint32_t ide_reset; + uint32_t brr1; /* Sub-regions */ MemoryRegion sub_io_mem[7]; @@ -784,7 +785,7 @@ static uint32_t openpic_cpu_read_internal(void *opaque, hwaddr addr, addr &= 0xFF0; switch (addr) { case 0x00: /* Block Revision Register1 (BRR1) */ - retval = FSL_BRR1_IPID | FSL_BRR1_IPMJ | FSL_BRR1_IPMN; + retval = opp->brr1; break; case 0x80: /* PCTP */ retval = dst->pctp; @@ -1082,6 +1083,7 @@ static int openpic_init(SysBusDevice *dev) opp->max_irq = FSL_MPIC_20_MAX_IRQ; opp->irq_ipi0 = FSL_MPIC_20_IPI_IRQ; opp->irq_tim0 = FSL_MPIC_20_TMR_IRQ; + opp->brr1 = FSL_BRR1_IPID | FSL_BRR1_IPMJ | FSL_BRR1_IPMN; list = list_be; break; case OPENPIC_MODEL_RAVEN: @@ -1095,6 +1097,7 @@ static int openpic_init(SysBusDevice *dev) opp->max_irq = RAVEN_MAX_IRQ; opp->irq_ipi0 = RAVEN_IPI_IRQ; opp->irq_tim0 = RAVEN_TMR_IRQ; + opp->brr1 = -1; list = list_le; /* Only UP supported today */ From 732aa6ec2639ace8bcb0b27b9c0d71103bd1d153 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sat, 8 Dec 2012 14:18:00 +0100 Subject: [PATCH 27/40] openpic: add Shared MSI support The OpenPIC allows MSI access through shared MSI registers. Implement them for the MPC8544 MPIC, so we can support MSIs. Signed-off-by: Alexander Graf --- hw/openpic.c | 150 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 130 insertions(+), 20 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index 5bf16ea0a0..4bea1e7b10 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -38,6 +38,7 @@ #include "pci.h" #include "openpic.h" #include "sysbus.h" +#include "msi.h" //#define DEBUG_OPENPIC @@ -52,6 +53,7 @@ #define MAX_TMR 4 #define VECTOR_BITS 8 #define MAX_IPI 4 +#define MAX_MSI 8 #define MAX_IRQ (MAX_SRC + MAX_IPI + MAX_TMR) #define VID 0x03 /* MPIC version ID */ @@ -63,6 +65,8 @@ #define OPENPIC_GLB_REG_SIZE 0x10F0 #define OPENPIC_TMR_REG_START 0x10F0 #define OPENPIC_TMR_REG_SIZE 0x220 +#define OPENPIC_MSI_REG_START 0x1600 +#define OPENPIC_MSI_REG_SIZE 0x200 #define OPENPIC_SRC_REG_START 0x10000 #define OPENPIC_SRC_REG_SIZE (MAX_SRC * 0x20) #define OPENPIC_CPU_REG_START 0x20000 @@ -127,6 +131,12 @@ #define IDR_P1_SHIFT 1 #define IDR_P0_SHIFT 0 +#define MSIIR_OFFSET 0x140 +#define MSIIR_SRS_SHIFT 29 +#define MSIIR_SRS_MASK (0x7 << MSIIR_SRS_SHIFT) +#define MSIIR_IBS_SHIFT 24 +#define MSIIR_IBS_MASK (0x1f << MSIIR_IBS_SHIFT) + #define BF_WIDTH(_bits_) \ (((_bits_) + (sizeof(uint32_t) * 8) - 1) / (sizeof(uint32_t) * 8)) @@ -209,7 +219,7 @@ typedef struct OpenPICState { uint32_t brr1; /* Sub-regions */ - MemoryRegion sub_io_mem[7]; + MemoryRegion sub_io_mem[5]; /* Global registers */ uint32_t frep; /* Feature reporting register */ @@ -227,9 +237,14 @@ typedef struct OpenPICState { uint32_t ticc; /* Global timer current count register */ uint32_t tibc; /* Global timer base count register */ } timers[MAX_TMR]; + /* Shared MSI registers */ + struct { + uint32_t msir; /* Shared Message Signaled Interrupt Register */ + } msi[MAX_MSI]; uint32_t max_irq; uint32_t irq_ipi0; uint32_t irq_tim0; + uint32_t irq_msi; } OpenPICState; static void openpic_irq_raise(OpenPICState *opp, int n_CPU, IRQ_src_t *src); @@ -704,6 +719,68 @@ static uint64_t openpic_src_read(void *opaque, uint64_t addr, unsigned len) return retval; } +static void openpic_msi_write(void *opaque, hwaddr addr, uint64_t val, + unsigned size) +{ + OpenPICState *opp = opaque; + int idx = opp->irq_msi; + int srs, ibs; + + DPRINTF("%s: addr " TARGET_FMT_plx " <= %08x\n", __func__, addr, val); + if (addr & 0xF) { + return; + } + + switch (addr) { + case MSIIR_OFFSET: + srs = val >> MSIIR_SRS_SHIFT; + idx += srs; + ibs = (val & MSIIR_IBS_MASK) >> MSIIR_IBS_SHIFT; + opp->msi[srs].msir |= 1 << ibs; + openpic_set_irq(opp, idx, 1); + break; + default: + /* most registers are read-only, thus ignored */ + break; + } +} + +static uint64_t openpic_msi_read(void *opaque, hwaddr addr, unsigned size) +{ + OpenPICState *opp = opaque; + uint64_t r = 0; + int i, srs; + + DPRINTF("%s: addr " TARGET_FMT_plx "\n", __func__, addr); + if (addr & 0xF) { + return -1; + } + + srs = addr >> 4; + + switch (addr) { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: /* MSIRs */ + r = opp->msi[srs].msir; + /* Clear on read */ + opp->msi[srs].msir = 0; + break; + case 0x120: /* MSISR */ + for (i = 0; i < MAX_MSI; i++) { + r |= (opp->msi[i].msir ? 1 : 0) << i; + } + break; + } + + return r; +} + static void openpic_cpu_write_internal(void *opaque, hwaddr addr, uint32_t val, int idx) { @@ -932,6 +1009,26 @@ static const MemoryRegionOps openpic_src_ops_be = { }, }; +static const MemoryRegionOps openpic_msi_ops_le = { + .read = openpic_msi_read, + .write = openpic_msi_write, + .endianness = DEVICE_LITTLE_ENDIAN, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, +}; + +static const MemoryRegionOps openpic_msi_ops_be = { + .read = openpic_msi_read, + .write = openpic_msi_write, + .endianness = DEVICE_BIG_ENDIAN, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, +}; + static void openpic_save_IRQ_queue(QEMUFile* f, IRQ_queue_t *q) { unsigned int i; @@ -1039,6 +1136,7 @@ static void openpic_irq_raise(OpenPICState *opp, int n_CPU, IRQ_src_t *src) struct memreg { const char *name; MemoryRegionOps const *ops; + bool map; hwaddr start_addr; ram_addr_t size; }; @@ -1047,27 +1145,31 @@ static int openpic_init(SysBusDevice *dev) { OpenPICState *opp = FROM_SYSBUS(typeof (*opp), dev); int i, j; - const struct memreg list_le[] = { - {"glb", &openpic_glb_ops_le, OPENPIC_GLB_REG_START, - OPENPIC_GLB_REG_SIZE}, - {"tmr", &openpic_tmr_ops_le, OPENPIC_TMR_REG_START, - OPENPIC_TMR_REG_SIZE}, - {"src", &openpic_src_ops_le, OPENPIC_SRC_REG_START, - OPENPIC_SRC_REG_SIZE}, - {"cpu", &openpic_cpu_ops_le, OPENPIC_CPU_REG_START, - OPENPIC_CPU_REG_SIZE}, + struct memreg list_le[] = { + {"glb", &openpic_glb_ops_le, true, + OPENPIC_GLB_REG_START, OPENPIC_GLB_REG_SIZE}, + {"tmr", &openpic_tmr_ops_le, true, + OPENPIC_TMR_REG_START, OPENPIC_TMR_REG_SIZE}, + {"msi", &openpic_msi_ops_le, true, + OPENPIC_MSI_REG_START, OPENPIC_MSI_REG_SIZE}, + {"src", &openpic_src_ops_le, true, + OPENPIC_SRC_REG_START, OPENPIC_SRC_REG_SIZE}, + {"cpu", &openpic_cpu_ops_le, true, + OPENPIC_CPU_REG_START, OPENPIC_CPU_REG_SIZE}, }; - const struct memreg list_be[] = { - {"glb", &openpic_glb_ops_be, OPENPIC_GLB_REG_START, - OPENPIC_GLB_REG_SIZE}, - {"tmr", &openpic_tmr_ops_be, OPENPIC_TMR_REG_START, - OPENPIC_TMR_REG_SIZE}, - {"src", &openpic_src_ops_be, OPENPIC_SRC_REG_START, - OPENPIC_SRC_REG_SIZE}, - {"cpu", &openpic_cpu_ops_be, OPENPIC_CPU_REG_START, - OPENPIC_CPU_REG_SIZE}, + struct memreg list_be[] = { + {"glb", &openpic_glb_ops_be, true, + OPENPIC_GLB_REG_START, OPENPIC_GLB_REG_SIZE}, + {"tmr", &openpic_tmr_ops_be, true, + OPENPIC_TMR_REG_START, OPENPIC_TMR_REG_SIZE}, + {"msi", &openpic_msi_ops_be, true, + OPENPIC_MSI_REG_START, OPENPIC_MSI_REG_SIZE}, + {"src", &openpic_src_ops_be, true, + OPENPIC_SRC_REG_START, OPENPIC_SRC_REG_SIZE}, + {"cpu", &openpic_cpu_ops_be, true, + OPENPIC_CPU_REG_START, OPENPIC_CPU_REG_SIZE}, }; - struct memreg const *list; + struct memreg *list; switch (opp->model) { case OPENPIC_MODEL_FSL_MPIC_20: @@ -1083,7 +1185,9 @@ static int openpic_init(SysBusDevice *dev) opp->max_irq = FSL_MPIC_20_MAX_IRQ; opp->irq_ipi0 = FSL_MPIC_20_IPI_IRQ; opp->irq_tim0 = FSL_MPIC_20_TMR_IRQ; + opp->irq_msi = FSL_MPIC_20_MSI_IRQ; opp->brr1 = FSL_BRR1_IPID | FSL_BRR1_IPMJ | FSL_BRR1_IPMN; + msi_supported = true; list = list_be; break; case OPENPIC_MODEL_RAVEN: @@ -1099,6 +1203,8 @@ static int openpic_init(SysBusDevice *dev) opp->irq_tim0 = RAVEN_TMR_IRQ; opp->brr1 = -1; list = list_le; + /* Don't map MSI region */ + list[2].map = false; /* Only UP supported today */ if (opp->nb_cpus != 1) { @@ -1110,6 +1216,10 @@ static int openpic_init(SysBusDevice *dev) memory_region_init(&opp->mem, "openpic", 0x40000); for (i = 0; i < ARRAY_SIZE(list_le); i++) { + if (!list[i].map) { + continue; + } + memory_region_init_io(&opp->sub_io_mem[i], list[i].ops, opp, list[i].name, list[i].size); From a911b7a92064d17b862ae85fe8e5ec91b7ba1aa9 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sat, 8 Dec 2012 14:26:37 +0100 Subject: [PATCH 28/40] PPC: e500: Add MSI support Now that our interrupt controller supports MSIs, let's expose that feature to the guest through the device tree! Signed-off-by: Alexander Graf --- hw/ppc/e500.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index fa9b8ede4b..1034f93963 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -48,6 +48,7 @@ #define MPC8544_CCSRBAR_BASE 0xE0000000ULL #define MPC8544_CCSRBAR_SIZE 0x00100000ULL #define MPC8544_MPIC_REGS_OFFSET 0x40000ULL +#define MPC8544_MSI_REGS_OFFSET 0x41600ULL #define MPC8544_SERIAL0_REGS_OFFSET 0x4500ULL #define MPC8544_SERIAL1_REGS_OFFSET 0x4600ULL #define MPC8544_PCI_REGS_OFFSET 0x8000ULL @@ -127,8 +128,10 @@ static int ppce500_load_device_tree(CPUPPCState *env, char soc[128]; char mpic[128]; uint32_t mpic_ph; + uint32_t msi_ph; char gutil[128]; char pci[128]; + char msi[128]; uint32_t pci_map[7 * 8]; uint32_t pci_ranges[14] = { @@ -300,6 +303,25 @@ static int ppce500_load_device_tree(CPUPPCState *env, qemu_devtree_setprop_cells(fdt, gutil, "reg", MPC8544_UTIL_OFFSET, 0x1000); qemu_devtree_setprop(fdt, gutil, "fsl,has-rstcr", NULL, 0); + snprintf(msi, sizeof(msi), "/%s/msi@%llx", soc, MPC8544_MSI_REGS_OFFSET); + qemu_devtree_add_subnode(fdt, msi); + qemu_devtree_setprop_string(fdt, msi, "compatible", "fsl,mpic-msi"); + qemu_devtree_setprop_cells(fdt, msi, "reg", MPC8544_MSI_REGS_OFFSET, 0x200); + msi_ph = qemu_devtree_alloc_phandle(fdt); + qemu_devtree_setprop_cells(fdt, msi, "msi-available-ranges", 0x0, 0x100); + qemu_devtree_setprop_phandle(fdt, msi, "interrupt-parent", mpic); + qemu_devtree_setprop_cells(fdt, msi, "interrupts", + 0xe0, 0x0, + 0xe1, 0x0, + 0xe2, 0x0, + 0xe3, 0x0, + 0xe4, 0x0, + 0xe5, 0x0, + 0xe6, 0x0, + 0xe7, 0x0); + qemu_devtree_setprop_cell(fdt, msi, "phandle", msi_ph); + qemu_devtree_setprop_cell(fdt, msi, "linux,phandle", msi_ph); + snprintf(pci, sizeof(pci), "/pci@%llx", MPC8544_PCI_REGS_BASE); qemu_devtree_add_subnode(fdt, pci); qemu_devtree_setprop_cell(fdt, pci, "cell-index", 0); @@ -315,6 +337,7 @@ static int ppce500_load_device_tree(CPUPPCState *env, for (i = 0; i < 14; i++) { pci_ranges[i] = cpu_to_be32(pci_ranges[i]); } + qemu_devtree_setprop_cell(fdt, pci, "fsl,msi", msi_ph); qemu_devtree_setprop(fdt, pci, "ranges", pci_ranges, sizeof(pci_ranges)); qemu_devtree_setprop_cells(fdt, pci, "reg", MPC8544_PCI_REGS_BASE >> 32, MPC8544_PCI_REGS_BASE, 0, 0x1000); From 997505065dc92e533debf5cb23012ba4e673d387 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sat, 8 Dec 2012 14:27:26 +0100 Subject: [PATCH 29/40] PPC: e500: Declare pci bridge as bridge The new PCI host bridge device needs to identify itself as PCI host bridge. Declare it as such. Signed-off-by: Alexander Graf --- hw/ppce500_pci.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/ppce500_pci.c b/hw/ppce500_pci.c index 54c72b4fd2..e5343411be 100644 --- a/hw/ppce500_pci.c +++ b/hw/ppce500_pci.c @@ -330,9 +330,15 @@ static int e500_pcihost_bridge_initfn(PCIDevice *d) PPCE500CCSRState *ccsr = CCSR(container_get(qdev_get_machine(), "/e500-ccsr")); + pci_config_set_class(d->config, PCI_CLASS_BRIDGE_PCI); + d->config[PCI_HEADER_TYPE] = + (d->config[PCI_HEADER_TYPE] & PCI_HEADER_TYPE_MULTI_FUNCTION) | + PCI_HEADER_TYPE_BRIDGE; + memory_region_init_alias(&b->bar0, "e500-pci-bar0", &ccsr->ccsr_space, 0, int128_get64(ccsr->ccsr_space.size)); pci_register_bar(d, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &b->bar0); + return 0; } From 68d1e1f52d73ddcec4b0358f269d9a8c2ea216d9 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Thu, 6 Dec 2012 04:11:33 +0100 Subject: [PATCH 30/40] MSI-X: Fix endianness The MSI-X vector tables are usually stored in little endian in memory, so let's mark the accessors as such. This fixes MSI-X on e500 for me. Signed-off-by: Alexander Graf Acked-by: Michael S. Tsirkin --- hw/msix.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hw/msix.c b/hw/msix.c index 136ef09373..b57ae60491 100644 --- a/hw/msix.c +++ b/hw/msix.c @@ -180,8 +180,7 @@ static void msix_table_mmio_write(void *opaque, hwaddr addr, static const MemoryRegionOps msix_table_mmio_ops = { .read = msix_table_mmio_read, .write = msix_table_mmio_write, - /* TODO: MSIX should be LITTLE_ENDIAN. */ - .endianness = DEVICE_NATIVE_ENDIAN, + .endianness = DEVICE_LITTLE_ENDIAN, .valid = { .min_access_size = 4, .max_access_size = 4, @@ -198,8 +197,7 @@ static uint64_t msix_pba_mmio_read(void *opaque, hwaddr addr, static const MemoryRegionOps msix_pba_mmio_ops = { .read = msix_pba_mmio_read, - /* TODO: MSIX should be LITTLE_ENDIAN. */ - .endianness = DEVICE_NATIVE_ENDIAN, + .endianness = DEVICE_LITTLE_ENDIAN, .valid = { .min_access_size = 4, .max_access_size = 4, From dbe30e13e87a71e85e88ae3ffd3460173cbc8193 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Thu, 13 Dec 2012 00:44:22 +0100 Subject: [PATCH 31/40] openpic: fix minor coding style issues This patch removes all remaining occurences of spaces before function parameter indicating parenthesis. Signed-off-by: Alexander Graf --- hw/openpic.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/hw/openpic.c b/hw/openpic.c index 4bea1e7b10..25d5cd7e26 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -140,17 +140,17 @@ #define BF_WIDTH(_bits_) \ (((_bits_) + (sizeof(uint32_t) * 8) - 1) / (sizeof(uint32_t) * 8)) -static inline void set_bit (uint32_t *field, int bit) +static inline void set_bit(uint32_t *field, int bit) { field[bit >> 5] |= 1 << (bit & 0x1F); } -static inline void reset_bit (uint32_t *field, int bit) +static inline void reset_bit(uint32_t *field, int bit) { field[bit >> 5] &= ~(1 << (bit & 0x1F)); } -static inline int test_bit (uint32_t *field, int bit) +static inline int test_bit(uint32_t *field, int bit) { return (field[bit >> 5] & 1 << (bit & 0x1F)) != 0; } @@ -249,17 +249,17 @@ typedef struct OpenPICState { static void openpic_irq_raise(OpenPICState *opp, int n_CPU, IRQ_src_t *src); -static inline void IRQ_setbit (IRQ_queue_t *q, int n_IRQ) +static inline void IRQ_setbit(IRQ_queue_t *q, int n_IRQ) { set_bit(q->queue, n_IRQ); } -static inline void IRQ_resetbit (IRQ_queue_t *q, int n_IRQ) +static inline void IRQ_resetbit(IRQ_queue_t *q, int n_IRQ) { reset_bit(q->queue, n_IRQ); } -static inline int IRQ_testbit (IRQ_queue_t *q, int n_IRQ) +static inline int IRQ_testbit(IRQ_queue_t *q, int n_IRQ) { return test_bit(q->queue, n_IRQ); } From 76aec1f8b6549d14576a3eb739c731df8f678ffb Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Thu, 13 Dec 2012 12:48:14 +0100 Subject: [PATCH 32/40] openpic: Accelerate pending irq search When we're done with one interrupt, we need to search for the next pending interrupt in the queue. This search has grown quite big now that we have more than 256 possible irq lines. So let's memorize how many interrupts we have pending in our bitmaps, so that we can always bail out in the usual case - the one where we're all done. Signed-off-by: Alexander Graf --- hw/openpic.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/hw/openpic.c b/hw/openpic.c index 25d5cd7e26..3cbcea8eb3 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -169,6 +169,7 @@ typedef struct IRQ_queue_t { uint32_t queue[BF_WIDTH(MAX_IRQ)]; int next; int priority; + int pending; /* nr of pending bits in queue */ } IRQ_queue_t; typedef struct IRQ_src_t { @@ -251,11 +252,13 @@ static void openpic_irq_raise(OpenPICState *opp, int n_CPU, IRQ_src_t *src); static inline void IRQ_setbit(IRQ_queue_t *q, int n_IRQ) { + q->pending++; set_bit(q->queue, n_IRQ); } static inline void IRQ_resetbit(IRQ_queue_t *q, int n_IRQ) { + q->pending--; reset_bit(q->queue, n_IRQ); } @@ -271,6 +274,12 @@ static void IRQ_check(OpenPICState *opp, IRQ_queue_t *q) next = -1; priority = -1; + + if (!q->pending) { + /* IRQ bitmap is empty */ + goto out; + } + for (i = 0; i < opp->max_irq; i++) { if (IRQ_testbit(q, i)) { DPRINTF("IRQ_check: irq %d set ipvp_pr=%d pr=%d\n", @@ -281,6 +290,8 @@ static void IRQ_check(OpenPICState *opp, IRQ_queue_t *q) } } } + +out: q->next = next; q->priority = priority; } From eafb325fb11af21ed9df3f5a310fd26e70954318 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Wed, 12 Dec 2012 12:56:40 +0100 Subject: [PATCH 33/40] PPC: E500: PCI: Make first slot qdev settable Today the first slot id in our e500 pci implementation is hardcoded to 0x11. Keep it there as default, but allow users to change the default to a different id. Signed-off-by: Alexander Graf --- hw/ppce500_pci.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hw/ppce500_pci.c b/hw/ppce500_pci.c index e5343411be..4cd4edc85b 100644 --- a/hw/ppce500_pci.c +++ b/hw/ppce500_pci.c @@ -87,6 +87,7 @@ struct PPCE500PCIState { struct pci_inbound pib[PPCE500_PCI_NR_PIBS]; uint32_t gasket_time; qemu_irq irq[4]; + uint32_t first_slot; /* mmio maps */ MemoryRegion container; MemoryRegion iomem; @@ -361,7 +362,7 @@ static int e500_pcihost_initfn(SysBusDevice *dev) b = pci_register_bus(DEVICE(dev), NULL, mpc85xx_pci_set_irq, mpc85xx_pci_map_irq, s->irq, address_space_mem, - &s->pio, PCI_DEVFN(0x11, 0), 4); + &s->pio, PCI_DEVFN(s->first_slot, 0), 4); h->bus = b; pci_create_simple(b, 0, "e500-host-bridge"); @@ -401,12 +402,18 @@ static const TypeInfo e500_host_bridge_info = { .class_init = e500_host_bridge_class_init, }; +static Property pcihost_properties[] = { + DEFINE_PROP_UINT32("first_slot", PPCE500PCIState, first_slot, 0x11), + DEFINE_PROP_END_OF_LIST(), +}; + static void e500_pcihost_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); k->init = e500_pcihost_initfn; + dc->props = pcihost_properties; dc->vmsd = &vmstate_ppce500_pci; } From 05f57d9de8e99bf5f7ca762c6dc2f1e054c2074c Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Wed, 12 Dec 2012 12:58:12 +0100 Subject: [PATCH 34/40] PPC: E500: PCI: Make IRQ calculation more generic The IRQ line calculation is more or less hardcoded today. Instead, let's write it as an algorithmic function that theoretically allows an arbitrary number of PCI slots. Signed-off-by: Alexander Graf --- hw/ppce500_pci.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/hw/ppce500_pci.c b/hw/ppce500_pci.c index 4cd4edc85b..561a77661d 100644 --- a/hw/ppce500_pci.c +++ b/hw/ppce500_pci.c @@ -253,17 +253,10 @@ static const MemoryRegionOps e500_pci_reg_ops = { static int mpc85xx_pci_map_irq(PCIDevice *pci_dev, int irq_num) { - int devno = pci_dev->devfn >> 3, ret = 0; + int devno = pci_dev->devfn >> 3; + int ret; - switch (devno) { - /* Two PCI slot */ - case 0x11: - case 0x12: - ret = (irq_num + devno - 0x10) % 4; - break; - default: - printf("Error:%s:unknown dev number\n", __func__); - } + ret = (irq_num + devno) % 4; pci_debug("%s: devfn %x irq %d -> %d devno:%x\n", __func__, pci_dev->devfn, irq_num, ret, devno); From 347dd79dccf41a679115213da673dfd06c4c8cc8 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Wed, 12 Dec 2012 13:47:07 +0100 Subject: [PATCH 35/40] PPC: E500: Generate dt pci irq map dynamically Today we're hardcoding the PCI interrupt map in the e500 machine file. Instead, let's write it dynamically so that different machine types can have different slot properties. Signed-off-by: Alexander Graf --- hw/ppc/e500.c | 49 ++++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 1034f93963..ebb6d96689 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -66,25 +66,33 @@ struct boot_info uint32_t entry; }; -static void pci_map_create(void *fdt, uint32_t *pci_map, uint32_t mpic) +static uint32_t *pci_map_create(void *fdt, uint32_t mpic, int first_slot, + int nr_slots, int *len) { - int i; - const uint32_t tmp[] = { - /* IDSEL 0x11 J17 Slot 1 */ - 0x8800, 0x0, 0x0, 0x1, mpic, 0x2, 0x1, - 0x8800, 0x0, 0x0, 0x2, mpic, 0x3, 0x1, - 0x8800, 0x0, 0x0, 0x3, mpic, 0x4, 0x1, - 0x8800, 0x0, 0x0, 0x4, mpic, 0x1, 0x1, + int i = 0; + int slot; + int pci_irq; + int last_slot = first_slot + nr_slots; + uint32_t *pci_map; - /* IDSEL 0x12 J16 Slot 2 */ - 0x9000, 0x0, 0x0, 0x1, mpic, 0x3, 0x1, - 0x9000, 0x0, 0x0, 0x2, mpic, 0x4, 0x1, - 0x9000, 0x0, 0x0, 0x3, mpic, 0x2, 0x1, - 0x9000, 0x0, 0x0, 0x4, mpic, 0x1, 0x1, - }; - for (i = 0; i < (7 * 8); i++) { - pci_map[i] = cpu_to_be32(tmp[i]); + *len = nr_slots * 4 * 7 * sizeof(uint32_t); + pci_map = g_malloc(*len); + + for (slot = first_slot; slot < last_slot; slot++) { + for (pci_irq = 0; pci_irq < 4; pci_irq++) { + pci_map[i++] = cpu_to_be32(slot << 11); + pci_map[i++] = cpu_to_be32(0x0); + pci_map[i++] = cpu_to_be32(0x0); + pci_map[i++] = cpu_to_be32(pci_irq + 1); + pci_map[i++] = cpu_to_be32(mpic); + pci_map[i++] = cpu_to_be32(((pci_irq + slot) % 4) + 1); + pci_map[i++] = cpu_to_be32(0x1); + } } + + assert((i * sizeof(uint32_t)) == *len); + + return pci_map; } static void dt_serial_create(void *fdt, unsigned long long offset, @@ -132,7 +140,8 @@ static int ppce500_load_device_tree(CPUPPCState *env, char gutil[128]; char pci[128]; char msi[128]; - uint32_t pci_map[7 * 8]; + uint32_t *pci_map = NULL; + int len; uint32_t pci_ranges[14] = { 0x2000000, 0x0, 0xc0000000, @@ -329,8 +338,9 @@ static int ppce500_load_device_tree(CPUPPCState *env, qemu_devtree_setprop_string(fdt, pci, "device_type", "pci"); qemu_devtree_setprop_cells(fdt, pci, "interrupt-map-mask", 0xf800, 0x0, 0x0, 0x7); - pci_map_create(fdt, pci_map, qemu_devtree_get_phandle(fdt, mpic)); - qemu_devtree_setprop(fdt, pci, "interrupt-map", pci_map, sizeof(pci_map)); + pci_map = pci_map_create(fdt, qemu_devtree_get_phandle(fdt, mpic), + 0x11, 2, &len); + qemu_devtree_setprop(fdt, pci, "interrupt-map", pci_map, len); qemu_devtree_setprop_phandle(fdt, pci, "interrupt-parent", mpic); qemu_devtree_setprop_cells(fdt, pci, "interrupts", 24, 2); qemu_devtree_setprop_cells(fdt, pci, "bus-range", 0, 255); @@ -364,6 +374,7 @@ done: ret = fdt_size; out: + g_free(pci_map); return ret; } From 492ec48dc2d99ca13b24d554e1970af7e2581e23 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Wed, 12 Dec 2012 13:53:53 +0100 Subject: [PATCH 36/40] PPC: E500: Move PCI slot information into params We have a params struct that allows us to expose differences between e500 machine models. Include PCI slot information there, so we can have different machines with different PCI slot topology. Signed-off-by: Alexander Graf --- hw/ppc/e500.c | 4 +++- hw/ppc/e500.h | 2 ++ hw/ppc/e500plat.c | 2 ++ hw/ppc/mpc8544ds.c | 2 ++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index ebb6d96689..564f6548e4 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -339,7 +339,8 @@ static int ppce500_load_device_tree(CPUPPCState *env, qemu_devtree_setprop_cells(fdt, pci, "interrupt-map-mask", 0xf800, 0x0, 0x0, 0x7); pci_map = pci_map_create(fdt, qemu_devtree_get_phandle(fdt, mpic), - 0x11, 2, &len); + params->pci_first_slot, params->pci_nr_slots, + &len); qemu_devtree_setprop(fdt, pci, "interrupt-map", pci_map, len); qemu_devtree_setprop_phandle(fdt, pci, "interrupt-parent", mpic); qemu_devtree_setprop_cells(fdt, pci, "interrupts", 24, 2); @@ -569,6 +570,7 @@ void ppce500_init(PPCE500Params *params) /* PCI */ dev = qdev_create(NULL, "e500-pcihost"); + qdev_prop_set_uint32(dev, "first_slot", params->pci_first_slot); qdev_init_nofail(dev); s = SYS_BUS_DEVICE(dev); sysbus_connect_irq(s, 0, mpic[pci_irq_nrs[0]]); diff --git a/hw/ppc/e500.h b/hw/ppc/e500.h index 7ae87f4e21..f5ff27385b 100644 --- a/hw/ppc/e500.h +++ b/hw/ppc/e500.h @@ -9,6 +9,8 @@ typedef struct PPCE500Params { const char *kernel_cmdline; const char *initrd_filename; const char *cpu_model; + int pci_first_slot; + int pci_nr_slots; /* e500-specific params */ diff --git a/hw/ppc/e500plat.c b/hw/ppc/e500plat.c index 4cfb94061a..9365213aff 100644 --- a/hw/ppc/e500plat.c +++ b/hw/ppc/e500plat.c @@ -40,6 +40,8 @@ static void e500plat_init(QEMUMachineInitArgs *args) .kernel_cmdline = kernel_cmdline, .initrd_filename = initrd_filename, .cpu_model = cpu_model, + .pci_first_slot = 0x11, + .pci_nr_slots = 2, .fixup_devtree = e500plat_fixup_devtree, }; diff --git a/hw/ppc/mpc8544ds.c b/hw/ppc/mpc8544ds.c index e651661941..7e1761d20c 100644 --- a/hw/ppc/mpc8544ds.c +++ b/hw/ppc/mpc8544ds.c @@ -40,6 +40,8 @@ static void mpc8544ds_init(QEMUMachineInitArgs *args) .kernel_cmdline = kernel_cmdline, .initrd_filename = initrd_filename, .cpu_model = cpu_model, + .pci_first_slot = 0x11, + .pci_nr_slots = 2, .fixup_devtree = mpc8544ds_fixup_devtree, }; From 3bb7e02a9725a24e5bf915b35f914f82f5b07a1f Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Wed, 12 Dec 2012 14:58:30 +0100 Subject: [PATCH 37/40] PPC: E500plat: Make a lot of PCI slots available The ppce500 machine doesn't have to stick to hardware limitations, as it's defined as being fully device tree based. Thus we can change the initial PCI slot ID to 0x1 which gives us a whopping 31 PCI devices we can support with this machine now! Signed-off-by: Alexander Graf --- hw/ppc/e500plat.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hw/ppc/e500plat.c b/hw/ppc/e500plat.c index 9365213aff..2992bd9794 100644 --- a/hw/ppc/e500plat.c +++ b/hw/ppc/e500plat.c @@ -14,6 +14,7 @@ #include "e500.h" #include "../boards.h" #include "device_tree.h" +#include "hw/pci.h" static void e500plat_fixup_devtree(PPCE500Params *params, void *fdt) { @@ -40,8 +41,8 @@ static void e500plat_init(QEMUMachineInitArgs *args) .kernel_cmdline = kernel_cmdline, .initrd_filename = initrd_filename, .cpu_model = cpu_model, - .pci_first_slot = 0x11, - .pci_nr_slots = 2, + .pci_first_slot = 0x1, + .pci_nr_slots = PCI_SLOT_MAX - 1, .fixup_devtree = e500plat_fixup_devtree, }; From 9e2c12988bebca7b99c0cd064b23fb7ea6643c86 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Thu, 13 Dec 2012 01:16:24 +0100 Subject: [PATCH 38/40] PPC: e500: pci: Export slot2irq calculation We need the calculation method to get from a PCI slot ID to its respective interrupt line twice. Once in the internal map function and once when assembling the device tree. So let's extract the calculation to a separate function that can be called by both users. Signed-off-by: Alexander Graf --- hw/ppc/e500.c | 5 ++++- hw/ppce500_pci.c | 3 ++- hw/ppce500_pci.h | 9 +++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 hw/ppce500_pci.h diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 564f6548e4..af6b67143a 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -34,6 +34,7 @@ #include "hw/sysbus.h" #include "exec-memory.h" #include "host-utils.h" +#include "hw/ppce500_pci.h" #define BINARY_DEVICE_TREE_FILE "mpc8544ds.dtb" #define UIMAGE_LOAD_BASE 0 @@ -72,6 +73,7 @@ static uint32_t *pci_map_create(void *fdt, uint32_t mpic, int first_slot, int i = 0; int slot; int pci_irq; + int host_irq; int last_slot = first_slot + nr_slots; uint32_t *pci_map; @@ -85,7 +87,8 @@ static uint32_t *pci_map_create(void *fdt, uint32_t mpic, int first_slot, pci_map[i++] = cpu_to_be32(0x0); pci_map[i++] = cpu_to_be32(pci_irq + 1); pci_map[i++] = cpu_to_be32(mpic); - pci_map[i++] = cpu_to_be32(((pci_irq + slot) % 4) + 1); + host_irq = ppce500_pci_map_irq_slot(slot, pci_irq); + pci_map[i++] = cpu_to_be32(host_irq + 1); pci_map[i++] = cpu_to_be32(0x1); } } diff --git a/hw/ppce500_pci.c b/hw/ppce500_pci.c index 561a77661d..09e3507994 100644 --- a/hw/ppce500_pci.c +++ b/hw/ppce500_pci.c @@ -19,6 +19,7 @@ #include "pci.h" #include "pci_host.h" #include "bswap.h" +#include "ppce500_pci.h" #ifdef DEBUG_PCI #define pci_debug(fmt, ...) fprintf(stderr, fmt, ## __VA_ARGS__) @@ -256,7 +257,7 @@ static int mpc85xx_pci_map_irq(PCIDevice *pci_dev, int irq_num) int devno = pci_dev->devfn >> 3; int ret; - ret = (irq_num + devno) % 4; + ret = ppce500_pci_map_irq_slot(devno, irq_num); pci_debug("%s: devfn %x irq %d -> %d devno:%x\n", __func__, pci_dev->devfn, irq_num, ret, devno); diff --git a/hw/ppce500_pci.h b/hw/ppce500_pci.h new file mode 100644 index 0000000000..61f773ef30 --- /dev/null +++ b/hw/ppce500_pci.h @@ -0,0 +1,9 @@ +#ifndef PPCE500_PCI_H +#define PPCE500_PCI_H + +static inline int ppce500_pci_map_irq_slot(int devno, int irq_num) +{ + return (devno + irq_num) % 4; +} + +#endif From b162d02e9450201c656edce290f33994a6d2ad33 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 3 Dec 2012 16:42:14 +0000 Subject: [PATCH 39/40] target-ppc: Don't use hwaddr to represent hardware state The hwaddr type is somewhat vaguely defined as being able to contain bus addresses on the widest possible bus in the system. For that reason it's discouraged for representing specific pieces of persistent hardware state, which should instead use an explicit width type that matches the bits available in real hardware. In particular, because of the possibility that the size of hwaddr might change if different buses are added to the target in future, it's not suitable for use in vm state descriptions for savevm and migration. This patch purges such unwise uses of hwaddr from the ppc target code, which turns out to be just one. The ppcemb_tlb_t struct, used on a number of embedded ppc models to represent a TLB entry contains a hwaddr for the real address field. This patch changes it to be a fixed uint64_t which is suitable enough for all machine types which use this structure. Other uses of hwaddr in CPUPPCState turn out not to be problematic: htab_base and htab_mask are just used for the convenience of the TCG code; the underlying machine state is the SDR1 register, which is stored with a suitable type already. Likewise the mpic_cpu_base field is only used internally and does not represent fundamental hardware state which needs to be saved. Signed-off-by: David Gibson Signed-off-by: Alexander Graf --- target-ppc/cpu.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h index 5f1dc8b7d5..742d4f8ae3 100644 --- a/target-ppc/cpu.h +++ b/target-ppc/cpu.h @@ -355,7 +355,7 @@ struct ppc6xx_tlb_t { typedef struct ppcemb_tlb_t ppcemb_tlb_t; struct ppcemb_tlb_t { - hwaddr RPN; + uint64_t RPN; target_ulong EPN; target_ulong PID; target_ulong size; From a64ae610b978dfd8ccfb7f6c5d4cfe62d7542fbd Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 3 Dec 2012 16:42:16 +0000 Subject: [PATCH 40/40] pseries: Increase default NVRAM size If no image file for NVRAM is specified, the pseries machine currently creates a 16K non-persistent NVRAM by default. This basically works, but is not large enough for current firmware and guest kernels to create all the NVRAM partitions they would like to. Increasing the default size to 64K addresses this and stops the guest generating error messages. Signed-off-by: David Gibson Signed-off-by: Alexander Graf --- hw/spapr_nvram.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/spapr_nvram.c b/hw/spapr_nvram.c index 641de485f9..512bb8d5d1 100644 --- a/hw/spapr_nvram.c +++ b/hw/spapr_nvram.c @@ -37,7 +37,7 @@ typedef struct sPAPRNVRAM { } sPAPRNVRAM; #define MIN_NVRAM_SIZE 8192 -#define DEFAULT_NVRAM_SIZE 16384 +#define DEFAULT_NVRAM_SIZE 65536 #define MAX_NVRAM_SIZE (UINT16_MAX * 16) static void rtas_nvram_fetch(sPAPREnvironment *spapr,