From af11110bb83166473064389faa27e8c6703b2008 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 22 Nov 2012 11:34:44 +0100 Subject: [PATCH 001/300] apci: switch piix4 to memory api Signed-off-by: Gerd Hoffmann --- hw/acpi_piix4.c | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index 519269a013..320e045938 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -28,6 +28,7 @@ #include "range.h" #include "ioport.h" #include "fw_cfg.h" +#include "exec-memory.h" //#define DEBUG @@ -55,7 +56,7 @@ struct pci_status { typedef struct PIIX4PMState { PCIDevice dev; - IORange ioport; + MemoryRegion io; ACPIREGS ar; APMState apm; @@ -109,10 +110,10 @@ static void pm_tmr_timer(ACPIREGS *ar) pm_update_sci(s); } -static void pm_ioport_write(IORange *ioport, uint64_t addr, unsigned width, - uint64_t val) +static void pm_ioport_write(void *opaque, hwaddr addr, uint64_t val, + unsigned width) { - PIIX4PMState *s = container_of(ioport, PIIX4PMState, ioport); + PIIX4PMState *s = opaque; if (width != 2) { PIIX4_DPRINTF("PM write port=0x%04x width=%d val=0x%08x\n", @@ -138,10 +139,9 @@ static void pm_ioport_write(IORange *ioport, uint64_t addr, unsigned width, (unsigned int)val); } -static void pm_ioport_read(IORange *ioport, uint64_t addr, unsigned width, - uint64_t *data) +static uint64_t pm_ioport_read(void *opaque, hwaddr addr, unsigned width) { - PIIX4PMState *s = container_of(ioport, PIIX4PMState, ioport); + PIIX4PMState *s = opaque; uint32_t val; switch(addr) { @@ -162,12 +162,17 @@ static void pm_ioport_read(IORange *ioport, uint64_t addr, unsigned width, break; } PIIX4_DPRINTF("PM readw port=0x%04x val=0x%04x\n", (unsigned int)addr, val); - *data = val; + return val; } -static const IORangeOps pm_iorange_ops = { +static const MemoryRegionOps pm_io_ops = { .read = pm_ioport_read, .write = pm_ioport_write, + .valid.min_access_size = 1, + .valid.max_access_size = 4, + .impl.min_access_size = 1, + .impl.max_access_size = 4, + .endianness = DEVICE_LITTLE_ENDIAN, }; static void apm_ctrl_changed(uint32_t val, void *arg) @@ -193,15 +198,13 @@ static void pm_io_space_update(PIIX4PMState *s) { uint32_t pm_io_base; - if (s->dev.config[0x80] & 1) { - pm_io_base = le32_to_cpu(*(uint32_t *)(s->dev.config + 0x40)); - pm_io_base &= 0xffc0; + pm_io_base = le32_to_cpu(*(uint32_t *)(s->dev.config + 0x40)); + pm_io_base &= 0xffc0; - /* XXX: need to improve memory and ioport allocation */ - PIIX4_DPRINTF("PM: mapping to 0x%x\n", pm_io_base); - iorange_init(&s->ioport, &pm_iorange_ops, pm_io_base, 64); - ioport_register(&s->ioport); - } + memory_region_transaction_begin(); + memory_region_set_enabled(&s->io, s->dev.config[0x80] & 1); + memory_region_set_address(&s->io, pm_io_base); + memory_region_transaction_commit(); } static void pm_write_config(PCIDevice *d, @@ -456,6 +459,10 @@ static int piix4_pm_initfn(PCIDevice *dev) register_ioport_write(s->smb_io_base, 64, 1, smb_ioport_writeb, &s->smb); register_ioport_read(s->smb_io_base, 64, 1, smb_ioport_readb, &s->smb); + memory_region_init_io(&s->io, &pm_io_ops, s, "piix4-pm", 64); + memory_region_set_enabled(&s->io, false); + memory_region_add_subregion(get_system_io(), 0, &s->io); + acpi_pm_tmr_init(&s->ar, pm_tmr_timer); acpi_gpe_init(&s->ar, GPE_LEN); From cacaab8bdd74608361a488aac600d609dafd53e5 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 22 Nov 2012 12:08:22 +0100 Subject: [PATCH 002/300] apci: switch ich9 to memory api Signed-off-by: Gerd Hoffmann --- hw/acpi_ich9.c | 44 +++++++++++++++++++++++++++----------------- hw/acpi_ich9.h | 1 + 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c index 61034d3bd7..bf361ece5d 100644 --- a/hw/acpi_ich9.c +++ b/hw/acpi_ich9.c @@ -29,6 +29,7 @@ #include "sysemu.h" #include "acpi.h" #include "kvm.h" +#include "exec-memory.h" #include "ich9.h" @@ -217,30 +218,34 @@ static uint32_t pm_ioport_read_fallback(void *opaque, uint32_t addr, int len) return val; } +static const MemoryRegionOps pm_io_ops = { + .old_portio = (MemoryRegionPortio[]) { + { .offset = 0, .len = ICH9_PMIO_SIZE, .size = 1, + .read = pm_ioport_readb, .write = pm_ioport_writeb }, + { .offset = 0, .len = ICH9_PMIO_SIZE, .size = 2, + .read = pm_ioport_readw, .write = pm_ioport_writew }, + { .offset = 0, .len = ICH9_PMIO_SIZE, .size = 4, + .read = pm_ioport_readl, .write = pm_ioport_writel }, + PORTIO_END_OF_LIST(), + }, + .valid.min_access_size = 1, + .valid.max_access_size = 4, + .impl.min_access_size = 1, + .impl.max_access_size = 4, + .endianness = DEVICE_LITTLE_ENDIAN, +}; + void ich9_pm_iospace_update(ICH9LPCPMRegs *pm, uint32_t pm_io_base) { ICH9_DEBUG("to 0x%x\n", pm_io_base); assert((pm_io_base & ICH9_PMIO_MASK) == 0); - if (pm->pm_io_base != 0) { - isa_unassign_ioport(pm->pm_io_base, ICH9_PMIO_SIZE); - } - - /* don't map at 0 */ - if (pm_io_base == 0) { - return; - } - - register_ioport_write(pm_io_base, ICH9_PMIO_SIZE, 1, pm_ioport_writeb, pm); - register_ioport_read(pm_io_base, ICH9_PMIO_SIZE, 1, pm_ioport_readb, pm); - register_ioport_write(pm_io_base, ICH9_PMIO_SIZE, 2, pm_ioport_writew, pm); - register_ioport_read(pm_io_base, ICH9_PMIO_SIZE, 2, pm_ioport_readw, pm); - register_ioport_write(pm_io_base, ICH9_PMIO_SIZE, 4, pm_ioport_writel, pm); - register_ioport_read(pm_io_base, ICH9_PMIO_SIZE, 4, pm_ioport_readl, pm); - pm->pm_io_base = pm_io_base; - acpi_gpe_blk(&pm->acpi_regs, pm_io_base + ICH9_PMIO_GPE0_STS); + memory_region_transaction_begin(); + memory_region_set_enabled(&pm->io, pm->pm_io_base != 0); + memory_region_set_address(&pm->io, pm->pm_io_base); + memory_region_transaction_commit(); } static int ich9_pm_post_load(void *opaque, int version_id) @@ -311,9 +316,14 @@ static void pm_powerdown_req(Notifier *n, void *opaque) void ich9_pm_init(ICH9LPCPMRegs *pm, qemu_irq sci_irq, qemu_irq cmos_s3) { + memory_region_init_io(&pm->io, &pm_io_ops, pm, "ich9-pm", ICH9_PMIO_SIZE); + memory_region_set_enabled(&pm->io, false); + memory_region_add_subregion(get_system_io(), 0, &pm->io); + acpi_pm_tmr_init(&pm->acpi_regs, ich9_pm_update_sci_fn); acpi_pm1_cnt_init(&pm->acpi_regs); acpi_gpe_init(&pm->acpi_regs, ICH9_PMIO_GPE0_LEN); + acpi_gpe_blk(&pm->acpi_regs, ICH9_PMIO_GPE0_STS); pm->irq = sci_irq; qemu_register_reset(pm_reset, pm); diff --git a/hw/acpi_ich9.h b/hw/acpi_ich9.h index 180c40673b..0a2ee6c83d 100644 --- a/hw/acpi_ich9.h +++ b/hw/acpi_ich9.h @@ -30,6 +30,7 @@ typedef struct ICH9LPCPMRegs { * PM1a_CNT_BLK = 2 in FADT so it is defined as uint16_t. */ ACPIREGS acpi_regs; + MemoryRegion io; uint32_t smi_en; uint32_t smi_sts; From a29028214c1d5d3571b27e6745f14534e6d8a662 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 23 Nov 2012 08:29:27 +0100 Subject: [PATCH 003/300] apci: switch vt82c686 to memory api Signed-off-by: Gerd Hoffmann --- hw/vt82c686.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/hw/vt82c686.c b/hw/vt82c686.c index 5d7c00cf4b..3fc6063d7d 100644 --- a/hw/vt82c686.c +++ b/hw/vt82c686.c @@ -24,6 +24,7 @@ #include "pm_smbus.h" #include "sysemu.h" #include "qemu-timer.h" +#include "exec-memory.h" typedef uint32_t pci_addr_t; #include "pci_host.h" @@ -159,6 +160,7 @@ static void vt82c686b_write_config(PCIDevice * d, uint32_t address, typedef struct VT686PMState { PCIDevice dev; + MemoryRegion io; ACPIREGS ar; APMState apm; PMSMBus smb; @@ -266,21 +268,32 @@ static uint32_t pm_ioport_readl(void *opaque, uint32_t addr) return val; } +static const MemoryRegionOps pm_io_ops = { + .old_portio = (MemoryRegionPortio[]) { + { .offset = 0, .len = 64, .size = 2, + .read = pm_ioport_readw, .write = pm_ioport_writew }, + { .offset = 0, .len = 64, .size = 4, + .read = pm_ioport_readl, .write = pm_ioport_writel }, + PORTIO_END_OF_LIST(), + }, + .valid.min_access_size = 1, + .valid.max_access_size = 4, + .impl.min_access_size = 1, + .impl.max_access_size = 4, + .endianness = DEVICE_LITTLE_ENDIAN, +}; + static void pm_io_space_update(VT686PMState *s) { uint32_t pm_io_base; - if (s->dev.config[0x80] & 1) { - pm_io_base = pci_get_long(s->dev.config + 0x40); - pm_io_base &= 0xffc0; + pm_io_base = pci_get_long(s->dev.config + 0x40); + pm_io_base &= 0xffc0; - /* XXX: need to improve memory and ioport allocation */ - DPRINTF("PM: mapping to 0x%x\n", pm_io_base); - register_ioport_write(pm_io_base, 64, 2, pm_ioport_writew, s); - register_ioport_read(pm_io_base, 64, 2, pm_ioport_readw, s); - register_ioport_write(pm_io_base, 64, 4, pm_ioport_writel, s); - register_ioport_read(pm_io_base, 64, 4, pm_ioport_readl, s); - } + memory_region_transaction_begin(); + memory_region_set_enabled(&s->io, s->dev.config[0x80] & 1); + memory_region_set_address(&s->io, pm_io_base); + memory_region_transaction_commit(); } static void pm_write_config(PCIDevice *d, @@ -429,6 +442,10 @@ static int vt82c686b_pm_initfn(PCIDevice *dev) apm_init(&s->apm, NULL, s); + memory_region_init_io(&s->io, &pm_io_ops, s, "vt82c686-pm", 64); + memory_region_set_enabled(&s->io, false); + memory_region_add_subregion(get_system_io(), 0, &s->io); + acpi_pm_tmr_init(&s->ar, pm_tmr_timer); acpi_pm1_cnt_init(&s->ar); From 77d58b1e47c8d1c661f98f12b47ab519d3561488 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 22 Nov 2012 12:12:30 +0100 Subject: [PATCH 004/300] apci: switch timer to memory api Signed-off-by: Gerd Hoffmann --- hw/acpi.c | 19 +++++++++++++++++-- hw/acpi.h | 5 +++-- hw/acpi_ich9.c | 5 +---- hw/acpi_piix4.c | 5 +---- hw/vt82c686.c | 6 +----- 5 files changed, 23 insertions(+), 17 deletions(-) diff --git a/hw/acpi.c b/hw/acpi.c index f4aca493fc..ba25c23bed 100644 --- a/hw/acpi.c +++ b/hw/acpi.c @@ -331,7 +331,7 @@ void acpi_pm_tmr_calc_overflow_time(ACPIREGS *ar) ar->tmr.overflow_time = (d + 0x800000LL) & ~0x7fffffLL; } -uint32_t acpi_pm_tmr_get(ACPIREGS *ar) +static uint32_t acpi_pm_tmr_get(ACPIREGS *ar) { uint32_t d = acpi_pm_tmr_get_clock(); return d & 0xffffff; @@ -344,10 +344,25 @@ static void acpi_pm_tmr_timer(void *opaque) ar->tmr.update_sci(ar); } -void acpi_pm_tmr_init(ACPIREGS *ar, acpi_update_sci_fn update_sci) +static uint64_t acpi_pm_tmr_read(void *opaque, hwaddr addr, unsigned width) +{ + return acpi_pm_tmr_get(opaque); +} + +static const MemoryRegionOps acpi_pm_tmr_ops = { + .read = acpi_pm_tmr_read, + .valid.min_access_size = 4, + .valid.max_access_size = 4, + .endianness = DEVICE_LITTLE_ENDIAN, +}; + +void acpi_pm_tmr_init(ACPIREGS *ar, acpi_update_sci_fn update_sci, + MemoryRegion *parent) { ar->tmr.update_sci = update_sci; ar->tmr.timer = qemu_new_timer_ns(vm_clock, acpi_pm_tmr_timer, ar); + memory_region_init_io(&ar->tmr.io, &acpi_pm_tmr_ops, ar, "acpi-tmr", 4); + memory_region_add_subregion(parent, 8, &ar->tmr.io); } void acpi_pm_tmr_reset(ACPIREGS *ar) diff --git a/hw/acpi.h b/hw/acpi.h index 7337f41857..91f42c3db1 100644 --- a/hw/acpi.h +++ b/hw/acpi.h @@ -84,6 +84,7 @@ typedef void (*acpi_update_sci_fn)(ACPIREGS *ar); struct ACPIPMTimer { QEMUTimer *timer; + MemoryRegion io; int64_t overflow_time; acpi_update_sci_fn update_sci; @@ -119,8 +120,8 @@ struct ACPIREGS { /* PM_TMR */ void acpi_pm_tmr_update(ACPIREGS *ar, bool enable); void acpi_pm_tmr_calc_overflow_time(ACPIREGS *ar); -uint32_t acpi_pm_tmr_get(ACPIREGS *ar); -void acpi_pm_tmr_init(ACPIREGS *ar, acpi_update_sci_fn update_sci); +void acpi_pm_tmr_init(ACPIREGS *ar, acpi_update_sci_fn update_sci, + MemoryRegion *parent); void acpi_pm_tmr_reset(ACPIREGS *ar); #include "qemu-timer.h" diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c index bf361ece5d..ec6d5f2b5a 100644 --- a/hw/acpi_ich9.c +++ b/hw/acpi_ich9.c @@ -170,9 +170,6 @@ static uint32_t pm_ioport_readl(void *opaque, uint32_t addr) uint32_t val; switch (addr & ICH9_PMIO_MASK) { - case ICH9_PMIO_PM1_TMR: - val = acpi_pm_tmr_get(&pm->acpi_regs); - break; case ICH9_PMIO_SMI_EN: val = pm->smi_en; break; @@ -320,7 +317,7 @@ void ich9_pm_init(ICH9LPCPMRegs *pm, qemu_irq sci_irq, qemu_irq cmos_s3) memory_region_set_enabled(&pm->io, false); memory_region_add_subregion(get_system_io(), 0, &pm->io); - acpi_pm_tmr_init(&pm->acpi_regs, ich9_pm_update_sci_fn); + acpi_pm_tmr_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io); acpi_pm1_cnt_init(&pm->acpi_regs); acpi_gpe_init(&pm->acpi_regs, ICH9_PMIO_GPE0_LEN); acpi_gpe_blk(&pm->acpi_regs, ICH9_PMIO_GPE0_STS); diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index 320e045938..75761a08a7 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -154,9 +154,6 @@ static uint64_t pm_ioport_read(void *opaque, hwaddr addr, unsigned width) case 0x04: val = s->ar.pm1.cnt.cnt; break; - case 0x08: - val = acpi_pm_tmr_get(&s->ar); - break; default: val = 0; break; @@ -463,7 +460,7 @@ static int piix4_pm_initfn(PCIDevice *dev) memory_region_set_enabled(&s->io, false); memory_region_add_subregion(get_system_io(), 0, &s->io); - acpi_pm_tmr_init(&s->ar, pm_tmr_timer); + acpi_pm_tmr_init(&s->ar, pm_tmr_timer, &s->io); acpi_gpe_init(&s->ar, GPE_LEN); s->powerdown_notifier.notify = piix4_pm_powerdown_req; diff --git a/hw/vt82c686.c b/hw/vt82c686.c index 3fc6063d7d..219cfaec72 100644 --- a/hw/vt82c686.c +++ b/hw/vt82c686.c @@ -252,14 +252,10 @@ static void pm_ioport_writel(void *opaque, uint32_t addr, uint32_t val) static uint32_t pm_ioport_readl(void *opaque, uint32_t addr) { - VT686PMState *s = opaque; uint32_t val; addr &= 0x0f; switch (addr) { - case 0x08: - val = acpi_pm_tmr_get(&s->ar); - break; default: val = 0; break; @@ -446,7 +442,7 @@ static int vt82c686b_pm_initfn(PCIDevice *dev) memory_region_set_enabled(&s->io, false); memory_region_add_subregion(get_system_io(), 0, &s->io); - acpi_pm_tmr_init(&s->ar, pm_tmr_timer); + acpi_pm_tmr_init(&s->ar, pm_tmr_timer, &s->io); acpi_pm1_cnt_init(&s->ar); pm_smbus_init(&s->dev.qdev, &s->smb); From afafe4bbe0cf7d3318e1ac7b40925561f86a6bd4 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 22 Nov 2012 13:17:57 +0100 Subject: [PATCH 005/300] apci: switch cnt to memory api Signed-off-by: Gerd Hoffmann --- hw/acpi.c | 38 ++++++++++++++++++++++++++++++-------- hw/acpi.h | 5 +++-- hw/acpi_ich9.c | 8 +------- hw/acpi_piix4.c | 8 +------- hw/vt82c686.c | 8 +------- 5 files changed, 36 insertions(+), 31 deletions(-) diff --git a/hw/acpi.c b/hw/acpi.c index ba25c23bed..956db95be4 100644 --- a/hw/acpi.c +++ b/hw/acpi.c @@ -372,13 +372,7 @@ void acpi_pm_tmr_reset(ACPIREGS *ar) } /* ACPI PM1aCNT */ -void acpi_pm1_cnt_init(ACPIREGS *ar) -{ - ar->wakeup.notify = acpi_notify_wakeup; - qemu_register_wakeup_notifier(&ar->wakeup); -} - -void acpi_pm1_cnt_write(ACPIREGS *ar, uint16_t val, char s4) +static void acpi_pm1_cnt_write(ACPIREGS *ar, uint16_t val) { ar->pm1.cnt.cnt = val & ~(ACPI_BITMASK_SLEEP_ENABLE); @@ -393,7 +387,7 @@ void acpi_pm1_cnt_write(ACPIREGS *ar, uint16_t val, char s4) qemu_system_suspend_request(); break; default: - if (sus_typ == s4) { /* S4 request */ + if (sus_typ == ar->pm1.cnt.s4_val) { /* S4 request */ monitor_protocol_event(QEVENT_SUSPEND_DISK, NULL); qemu_system_shutdown_request(); } @@ -413,6 +407,34 @@ void acpi_pm1_cnt_update(ACPIREGS *ar, } } +static uint64_t acpi_pm_cnt_read(void *opaque, hwaddr addr, unsigned width) +{ + ACPIREGS *ar = opaque; + return ar->pm1.cnt.cnt; +} + +static void acpi_pm_cnt_write(void *opaque, hwaddr addr, uint64_t val, + unsigned width) +{ + acpi_pm1_cnt_write(opaque, val); +} + +static const MemoryRegionOps acpi_pm_cnt_ops = { + .read = acpi_pm_cnt_read, + .write = acpi_pm_cnt_write, + .valid.min_access_size = 2, + .valid.max_access_size = 2, + .endianness = DEVICE_LITTLE_ENDIAN, +}; + +void acpi_pm1_cnt_init(ACPIREGS *ar, MemoryRegion *parent) +{ + ar->wakeup.notify = acpi_notify_wakeup; + qemu_register_wakeup_notifier(&ar->wakeup); + memory_region_init_io(&ar->pm1.cnt.io, &acpi_pm_cnt_ops, ar, "acpi-cnt", 2); + memory_region_add_subregion(parent, 4, &ar->pm1.cnt.io); +} + void acpi_pm1_cnt_reset(ACPIREGS *ar) { ar->pm1.cnt.cnt = 0; diff --git a/hw/acpi.h b/hw/acpi.h index 91f42c3db1..97aaab847c 100644 --- a/hw/acpi.h +++ b/hw/acpi.h @@ -96,7 +96,9 @@ struct ACPIPM1EVT { }; struct ACPIPM1CNT { + MemoryRegion io; uint16_t cnt; + uint8_t s4_val; }; struct ACPIGPE { @@ -139,8 +141,7 @@ void acpi_pm1_evt_power_down(ACPIREGS *ar); void acpi_pm1_evt_reset(ACPIREGS *ar); /* PM1a_CNT: piix and ich9 don't implement PM1b CNT. */ -void acpi_pm1_cnt_init(ACPIREGS *ar); -void acpi_pm1_cnt_write(ACPIREGS *ar, uint16_t val, char s4); +void acpi_pm1_cnt_init(ACPIREGS *ar, MemoryRegion *parent); void acpi_pm1_cnt_update(ACPIREGS *ar, bool sci_enable, bool sci_disable); void acpi_pm1_cnt_reset(ACPIREGS *ar); diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c index ec6d5f2b5a..7b6c2ef4dc 100644 --- a/hw/acpi_ich9.c +++ b/hw/acpi_ich9.c @@ -116,9 +116,6 @@ static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val) pm->acpi_regs.pm1.evt.en = val; pm_update_sci(pm); break; - case ICH9_PMIO_PM1_CNT: - acpi_pm1_cnt_write(&pm->acpi_regs, val, 0); - break; default: pm_ioport_write_fallback(opaque, addr, 2, val); break; @@ -138,9 +135,6 @@ static uint32_t pm_ioport_readw(void *opaque, uint32_t addr) case ICH9_PMIO_PM1_EN: val = pm->acpi_regs.pm1.evt.en; break; - case ICH9_PMIO_PM1_CNT: - val = pm->acpi_regs.pm1.cnt.cnt; - break; default: val = pm_ioport_read_fallback(opaque, addr, 2); break; @@ -318,7 +312,7 @@ void ich9_pm_init(ICH9LPCPMRegs *pm, qemu_irq sci_irq, qemu_irq cmos_s3) memory_region_add_subregion(get_system_io(), 0, &pm->io); acpi_pm_tmr_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io); - acpi_pm1_cnt_init(&pm->acpi_regs); + acpi_pm1_cnt_init(&pm->acpi_regs, &pm->io); acpi_gpe_init(&pm->acpi_regs, ICH9_PMIO_GPE0_LEN); acpi_gpe_blk(&pm->acpi_regs, ICH9_PMIO_GPE0_STS); diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index 75761a08a7..9d5e346ef3 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -129,9 +129,6 @@ static void pm_ioport_write(void *opaque, hwaddr addr, uint64_t val, acpi_pm1_evt_write_en(&s->ar, val); pm_update_sci(s); break; - case 0x04: - acpi_pm1_cnt_write(&s->ar, val, s->s4_val); - break; default: break; } @@ -151,9 +148,6 @@ static uint64_t pm_ioport_read(void *opaque, hwaddr addr, unsigned width) case 0x02: val = s->ar.pm1.evt.en; break; - case 0x04: - val = s->ar.pm1.cnt.cnt; - break; default: val = 0; break; @@ -461,6 +455,7 @@ static int piix4_pm_initfn(PCIDevice *dev) memory_region_add_subregion(get_system_io(), 0, &s->io); acpi_pm_tmr_init(&s->ar, pm_tmr_timer, &s->io); + acpi_pm1_cnt_init(&s->ar, &s->io); acpi_gpe_init(&s->ar, GPE_LEN); s->powerdown_notifier.notify = piix4_pm_powerdown_req; @@ -487,7 +482,6 @@ i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base, s = DO_UPCAST(PIIX4PMState, dev, dev); s->irq = sci_irq; - acpi_pm1_cnt_init(&s->ar); s->smi_irq = smi_irq; s->kvm_enabled = kvm_enabled; diff --git a/hw/vt82c686.c b/hw/vt82c686.c index 219cfaec72..15f0b6a91c 100644 --- a/hw/vt82c686.c +++ b/hw/vt82c686.c @@ -211,9 +211,6 @@ static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val) acpi_pm1_evt_write_en(&s->ar, val); pm_update_sci(s); break; - case 0x04: - acpi_pm1_cnt_write(&s->ar, val, 0); - break; default: break; } @@ -233,9 +230,6 @@ static uint32_t pm_ioport_readw(void *opaque, uint32_t addr) case 0x02: val = s->ar.pm1.evt.en; break; - case 0x04: - val = s->ar.pm1.cnt.cnt; - break; default: val = 0; break; @@ -443,7 +437,7 @@ static int vt82c686b_pm_initfn(PCIDevice *dev) memory_region_add_subregion(get_system_io(), 0, &s->io); acpi_pm_tmr_init(&s->ar, pm_tmr_timer, &s->io); - acpi_pm1_cnt_init(&s->ar); + acpi_pm1_cnt_init(&s->ar, &s->io); pm_smbus_init(&s->dev.qdev, &s->smb); From b5a7c024d2606e84e0bbe4a0e87d252dfda41479 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 22 Nov 2012 13:25:10 +0100 Subject: [PATCH 006/300] apci: switch evt to memory api Signed-off-by: Gerd Hoffmann --- hw/acpi.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- hw/acpi.h | 6 ++++-- hw/acpi_ich9.c | 18 +----------------- hw/acpi_piix4.c | 18 +----------------- hw/vt82c686.c | 18 +----------------- 5 files changed, 54 insertions(+), 55 deletions(-) diff --git a/hw/acpi.c b/hw/acpi.c index 956db95be4..e58e45f301 100644 --- a/hw/acpi.c +++ b/hw/acpi.c @@ -275,7 +275,7 @@ uint16_t acpi_pm1_evt_get_sts(ACPIREGS *ar) return ar->pm1.evt.sts; } -void acpi_pm1_evt_write_sts(ACPIREGS *ar, uint16_t val) +static void acpi_pm1_evt_write_sts(ACPIREGS *ar, uint16_t val) { uint16_t pm1_sts = acpi_pm1_evt_get_sts(ar); if (pm1_sts & val & ACPI_BITMASK_TIMER_STATUS) { @@ -285,7 +285,7 @@ void acpi_pm1_evt_write_sts(ACPIREGS *ar, uint16_t val) ar->pm1.evt.sts &= ~val; } -void acpi_pm1_evt_write_en(ACPIREGS *ar, uint16_t val) +static void acpi_pm1_evt_write_en(ACPIREGS *ar, uint16_t val) { ar->pm1.evt.en = val; qemu_system_wakeup_enable(QEMU_WAKEUP_REASON_RTC, @@ -310,6 +310,51 @@ void acpi_pm1_evt_reset(ACPIREGS *ar) qemu_system_wakeup_enable(QEMU_WAKEUP_REASON_PMTIMER, 0); } +static uint64_t acpi_pm_evt_read(void *opaque, hwaddr addr, unsigned width) +{ + ACPIREGS *ar = opaque; + switch (addr) { + case 0: + return acpi_pm1_evt_get_sts(ar); + case 2: + return ar->pm1.evt.en; + default: + return 0; + } +} + +static void acpi_pm_evt_write(void *opaque, hwaddr addr, uint64_t val, + unsigned width) +{ + ACPIREGS *ar = opaque; + switch (addr) { + case 0: + acpi_pm1_evt_write_sts(ar, val); + ar->pm1.evt.update_sci(ar); + break; + case 2: + acpi_pm1_evt_write_en(ar, val); + ar->pm1.evt.update_sci(ar); + break; + } +} + +static const MemoryRegionOps acpi_pm_evt_ops = { + .read = acpi_pm_evt_read, + .write = acpi_pm_evt_write, + .valid.min_access_size = 2, + .valid.max_access_size = 2, + .endianness = DEVICE_LITTLE_ENDIAN, +}; + +void acpi_pm1_evt_init(ACPIREGS *ar, acpi_update_sci_fn update_sci, + MemoryRegion *parent) +{ + ar->pm1.evt.update_sci = update_sci; + memory_region_init_io(&ar->pm1.evt.io, &acpi_pm_evt_ops, ar, "acpi-evt", 4); + memory_region_add_subregion(parent, 0, &ar->pm1.evt.io); +} + /* ACPI PM_TMR */ void acpi_pm_tmr_update(ACPIREGS *ar, bool enable) { diff --git a/hw/acpi.h b/hw/acpi.h index 97aaab847c..918d7f5bca 100644 --- a/hw/acpi.h +++ b/hw/acpi.h @@ -91,8 +91,10 @@ struct ACPIPMTimer { }; struct ACPIPM1EVT { + MemoryRegion io; uint16_t sts; uint16_t en; + acpi_update_sci_fn update_sci; }; struct ACPIPM1CNT { @@ -135,10 +137,10 @@ static inline int64_t acpi_pm_tmr_get_clock(void) /* PM1a_EVT: piix and ich9 don't implement PM1b. */ uint16_t acpi_pm1_evt_get_sts(ACPIREGS *ar); -void acpi_pm1_evt_write_sts(ACPIREGS *ar, uint16_t val); -void acpi_pm1_evt_write_en(ACPIREGS *ar, uint16_t val); void acpi_pm1_evt_power_down(ACPIREGS *ar); void acpi_pm1_evt_reset(ACPIREGS *ar); +void acpi_pm1_evt_init(ACPIREGS *ar, acpi_update_sci_fn update_sci, + MemoryRegion *parent); /* PM1a_CNT: piix and ich9 don't implement PM1b CNT. */ void acpi_pm1_cnt_init(ACPIREGS *ar, MemoryRegion *parent); diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c index 7b6c2ef4dc..3b5bac6d49 100644 --- a/hw/acpi_ich9.c +++ b/hw/acpi_ich9.c @@ -105,17 +105,7 @@ static uint32_t pm_ioport_readb(void *opaque, uint32_t addr) static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val) { - ICH9LPCPMRegs *pm = opaque; - switch (addr & ICH9_PMIO_MASK) { - case ICH9_PMIO_PM1_STS: - acpi_pm1_evt_write_sts(&pm->acpi_regs, val); - pm_update_sci(pm); - break; - case ICH9_PMIO_PM1_EN: - pm->acpi_regs.pm1.evt.en = val; - pm_update_sci(pm); - break; default: pm_ioport_write_fallback(opaque, addr, 2, val); break; @@ -125,16 +115,9 @@ static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val) static uint32_t pm_ioport_readw(void *opaque, uint32_t addr) { - ICH9LPCPMRegs *pm = opaque; uint32_t val; switch (addr & ICH9_PMIO_MASK) { - case ICH9_PMIO_PM1_STS: - val = acpi_pm1_evt_get_sts(&pm->acpi_regs); - break; - case ICH9_PMIO_PM1_EN: - val = pm->acpi_regs.pm1.evt.en; - break; default: val = pm_ioport_read_fallback(opaque, addr, 2); break; @@ -312,6 +295,7 @@ void ich9_pm_init(ICH9LPCPMRegs *pm, qemu_irq sci_irq, qemu_irq cmos_s3) memory_region_add_subregion(get_system_io(), 0, &pm->io); acpi_pm_tmr_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io); + acpi_pm1_evt_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io); acpi_pm1_cnt_init(&pm->acpi_regs, &pm->io); acpi_gpe_init(&pm->acpi_regs, ICH9_PMIO_GPE0_LEN); acpi_gpe_blk(&pm->acpi_regs, ICH9_PMIO_GPE0_STS); diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index 9d5e346ef3..d4e28c4fff 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -113,22 +113,12 @@ static void pm_tmr_timer(ACPIREGS *ar) static void pm_ioport_write(void *opaque, hwaddr addr, uint64_t val, unsigned width) { - PIIX4PMState *s = opaque; - if (width != 2) { PIIX4_DPRINTF("PM write port=0x%04x width=%d val=0x%08x\n", (unsigned)addr, width, (unsigned)val); } switch(addr) { - case 0x00: - acpi_pm1_evt_write_sts(&s->ar, val); - pm_update_sci(s); - break; - case 0x02: - acpi_pm1_evt_write_en(&s->ar, val); - pm_update_sci(s); - break; default: break; } @@ -138,16 +128,9 @@ static void pm_ioport_write(void *opaque, hwaddr addr, uint64_t val, static uint64_t pm_ioport_read(void *opaque, hwaddr addr, unsigned width) { - PIIX4PMState *s = opaque; uint32_t val; switch(addr) { - case 0x00: - val = acpi_pm1_evt_get_sts(&s->ar); - break; - case 0x02: - val = s->ar.pm1.evt.en; - break; default: val = 0; break; @@ -455,6 +438,7 @@ static int piix4_pm_initfn(PCIDevice *dev) memory_region_add_subregion(get_system_io(), 0, &s->io); acpi_pm_tmr_init(&s->ar, pm_tmr_timer, &s->io); + acpi_pm1_evt_init(&s->ar, pm_tmr_timer, &s->io); acpi_pm1_cnt_init(&s->ar, &s->io); acpi_gpe_init(&s->ar, GPE_LEN); diff --git a/hw/vt82c686.c b/hw/vt82c686.c index 15f0b6a91c..52f46f10ce 100644 --- a/hw/vt82c686.c +++ b/hw/vt82c686.c @@ -199,18 +199,8 @@ static void pm_tmr_timer(ACPIREGS *ar) static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val) { - VT686PMState *s = opaque; - addr &= 0x0f; switch (addr) { - case 0x00: - acpi_pm1_evt_write_sts(&s->ar, val); - pm_update_sci(s); - break; - case 0x02: - acpi_pm1_evt_write_en(&s->ar, val); - pm_update_sci(s); - break; default: break; } @@ -219,17 +209,10 @@ static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val) static uint32_t pm_ioport_readw(void *opaque, uint32_t addr) { - VT686PMState *s = opaque; uint32_t val; addr &= 0x0f; switch (addr) { - case 0x00: - val = acpi_pm1_evt_get_sts(&s->ar); - break; - case 0x02: - val = s->ar.pm1.evt.en; - break; default: val = 0; break; @@ -437,6 +420,7 @@ static int vt82c686b_pm_initfn(PCIDevice *dev) memory_region_add_subregion(get_system_io(), 0, &s->io); acpi_pm_tmr_init(&s->ar, pm_tmr_timer, &s->io); + acpi_pm1_evt_init(&s->ar, pm_tmr_timer, &s->io); acpi_pm1_cnt_init(&s->ar, &s->io); pm_smbus_init(&s->dev.qdev, &s->smb); From ca5d64b4b4fbb01e403f89ec9b399aaa69104b1e Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 22 Nov 2012 13:27:04 +0100 Subject: [PATCH 007/300] acpi: cleanup piix4 memory region Nothing left to do, everything handled by subregions, we can zap the reaw/write handlers now. Signed-off-by: Gerd Hoffmann --- hw/acpi_piix4.c | 41 +---------------------------------------- 1 file changed, 1 insertion(+), 40 deletions(-) diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index d4e28c4fff..cf8aa3d7d7 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -110,45 +110,6 @@ static void pm_tmr_timer(ACPIREGS *ar) pm_update_sci(s); } -static void pm_ioport_write(void *opaque, hwaddr addr, uint64_t val, - unsigned width) -{ - if (width != 2) { - PIIX4_DPRINTF("PM write port=0x%04x width=%d val=0x%08x\n", - (unsigned)addr, width, (unsigned)val); - } - - switch(addr) { - default: - break; - } - PIIX4_DPRINTF("PM writew port=0x%04x val=0x%04x\n", (unsigned int)addr, - (unsigned int)val); -} - -static uint64_t pm_ioport_read(void *opaque, hwaddr addr, unsigned width) -{ - uint32_t val; - - switch(addr) { - default: - val = 0; - break; - } - PIIX4_DPRINTF("PM readw port=0x%04x val=0x%04x\n", (unsigned int)addr, val); - return val; -} - -static const MemoryRegionOps pm_io_ops = { - .read = pm_ioport_read, - .write = pm_ioport_write, - .valid.min_access_size = 1, - .valid.max_access_size = 4, - .impl.min_access_size = 1, - .impl.max_access_size = 4, - .endianness = DEVICE_LITTLE_ENDIAN, -}; - static void apm_ctrl_changed(uint32_t val, void *arg) { PIIX4PMState *s = arg; @@ -433,7 +394,7 @@ static int piix4_pm_initfn(PCIDevice *dev) register_ioport_write(s->smb_io_base, 64, 1, smb_ioport_writeb, &s->smb); register_ioport_read(s->smb_io_base, 64, 1, smb_ioport_readb, &s->smb); - memory_region_init_io(&s->io, &pm_io_ops, s, "piix4-pm", 64); + memory_region_init(&s->io, "piix4-pm", 64); memory_region_set_enabled(&s->io, false); memory_region_add_subregion(get_system_io(), 0, &s->io); From a0f95659da77c8818ebd146bb1546ad152d0833e Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 23 Nov 2012 09:00:25 +0100 Subject: [PATCH 008/300] acpi: cleanup vt82c686 memory region Nothing left to do, everything handled by subregions, we can zap the reaw/write handlers now. Signed-off-by: Gerd Hoffmann --- hw/vt82c686.c | 61 +-------------------------------------------------- 1 file changed, 1 insertion(+), 60 deletions(-) diff --git a/hw/vt82c686.c b/hw/vt82c686.c index 52f46f10ce..99e6b2f9a9 100644 --- a/hw/vt82c686.c +++ b/hw/vt82c686.c @@ -197,65 +197,6 @@ static void pm_tmr_timer(ACPIREGS *ar) pm_update_sci(s); } -static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val) -{ - addr &= 0x0f; - switch (addr) { - default: - break; - } - DPRINTF("PM writew port=0x%04x val=0x%02x\n", addr, val); -} - -static uint32_t pm_ioport_readw(void *opaque, uint32_t addr) -{ - uint32_t val; - - addr &= 0x0f; - switch (addr) { - default: - val = 0; - break; - } - DPRINTF("PM readw port=0x%04x val=0x%02x\n", addr, val); - return val; -} - -static void pm_ioport_writel(void *opaque, uint32_t addr, uint32_t val) -{ - addr &= 0x0f; - DPRINTF("PM writel port=0x%04x val=0x%08x\n", addr, val); -} - -static uint32_t pm_ioport_readl(void *opaque, uint32_t addr) -{ - uint32_t val; - - addr &= 0x0f; - switch (addr) { - default: - val = 0; - break; - } - DPRINTF("PM readl port=0x%04x val=0x%08x\n", addr, val); - return val; -} - -static const MemoryRegionOps pm_io_ops = { - .old_portio = (MemoryRegionPortio[]) { - { .offset = 0, .len = 64, .size = 2, - .read = pm_ioport_readw, .write = pm_ioport_writew }, - { .offset = 0, .len = 64, .size = 4, - .read = pm_ioport_readl, .write = pm_ioport_writel }, - PORTIO_END_OF_LIST(), - }, - .valid.min_access_size = 1, - .valid.max_access_size = 4, - .impl.min_access_size = 1, - .impl.max_access_size = 4, - .endianness = DEVICE_LITTLE_ENDIAN, -}; - static void pm_io_space_update(VT686PMState *s) { uint32_t pm_io_base; @@ -415,7 +356,7 @@ static int vt82c686b_pm_initfn(PCIDevice *dev) apm_init(&s->apm, NULL, s); - memory_region_init_io(&s->io, &pm_io_ops, s, "vt82c686-pm", 64); + memory_region_init(&s->io, "vt82c686-pm", 64); memory_region_set_enabled(&s->io, false); memory_region_add_subregion(get_system_io(), 0, &s->io); From 76a7daf97458c55b8d8e6d4eadc5c46b16c705ce Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 22 Nov 2012 13:43:17 +0100 Subject: [PATCH 009/300] apci: switch ich9 gpe to memory api Signed-off-by: Gerd Hoffmann --- hw/acpi_ich9.c | 38 ++++++++++++++++++++++++++++---------- hw/acpi_ich9.h | 1 + 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c index 3b5bac6d49..5fc160a971 100644 --- a/hw/acpi_ich9.c +++ b/hw/acpi_ich9.c @@ -73,12 +73,7 @@ static void ich9_pm_update_sci_fn(ACPIREGS *regs) static void pm_ioport_writeb(void *opaque, uint32_t addr, uint32_t val) { - ICH9LPCPMRegs *pm = opaque; - switch (addr & ICH9_PMIO_MASK) { - case ICH9_PMIO_GPE0_STS ... (ICH9_PMIO_GPE0_STS + ICH9_PMIO_GPE0_LEN - 1): - acpi_gpe_ioport_writeb(&pm->acpi_regs, addr, val); - break; default: break; } @@ -88,13 +83,9 @@ static void pm_ioport_writeb(void *opaque, uint32_t addr, uint32_t val) static uint32_t pm_ioport_readb(void *opaque, uint32_t addr) { - ICH9LPCPMRegs *pm = opaque; uint32_t val = 0; switch (addr & ICH9_PMIO_MASK) { - case ICH9_PMIO_GPE0_STS ... (ICH9_PMIO_GPE0_STS + ICH9_PMIO_GPE0_LEN - 1): - val = acpi_gpe_ioport_readb(&pm->acpi_regs, addr); - break; default: val = 0; break; @@ -209,6 +200,29 @@ static const MemoryRegionOps pm_io_ops = { .endianness = DEVICE_LITTLE_ENDIAN, }; +static uint64_t ich9_gpe_readb(void *opaque, hwaddr addr, unsigned width) +{ + ICH9LPCPMRegs *pm = opaque; + return acpi_gpe_ioport_readb(&pm->acpi_regs, addr); +} + +static void ich9_gpe_writeb(void *opaque, hwaddr addr, uint64_t val, + unsigned width) +{ + ICH9LPCPMRegs *pm = opaque; + acpi_gpe_ioport_writeb(&pm->acpi_regs, addr, val); +} + +static const MemoryRegionOps ich9_gpe_ops = { + .read = ich9_gpe_readb, + .write = ich9_gpe_writeb, + .valid.min_access_size = 1, + .valid.max_access_size = 4, + .impl.min_access_size = 1, + .impl.max_access_size = 1, + .endianness = DEVICE_LITTLE_ENDIAN, +}; + void ich9_pm_iospace_update(ICH9LPCPMRegs *pm, uint32_t pm_io_base) { ICH9_DEBUG("to 0x%x\n", pm_io_base); @@ -297,8 +311,12 @@ void ich9_pm_init(ICH9LPCPMRegs *pm, qemu_irq sci_irq, qemu_irq cmos_s3) acpi_pm_tmr_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io); acpi_pm1_evt_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io); acpi_pm1_cnt_init(&pm->acpi_regs, &pm->io); + acpi_gpe_init(&pm->acpi_regs, ICH9_PMIO_GPE0_LEN); - acpi_gpe_blk(&pm->acpi_regs, ICH9_PMIO_GPE0_STS); + acpi_gpe_blk(&pm->acpi_regs, 0); + memory_region_init_io(&pm->io_gpe, &ich9_gpe_ops, pm, "apci-gpe0", + ICH9_PMIO_GPE0_LEN); + memory_region_add_subregion(&pm->io, ICH9_PMIO_GPE0_STS, &pm->io_gpe); pm->irq = sci_irq; qemu_register_reset(pm_reset, pm); diff --git a/hw/acpi_ich9.h b/hw/acpi_ich9.h index 0a2ee6c83d..f3b05d7229 100644 --- a/hw/acpi_ich9.h +++ b/hw/acpi_ich9.h @@ -31,6 +31,7 @@ typedef struct ICH9LPCPMRegs { */ ACPIREGS acpi_regs; MemoryRegion io; + MemoryRegion io_gpe; uint32_t smi_en; uint32_t smi_sts; From 10cc69b0de8e1756e6fbda4592c9d0ba3bce58fc Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 22 Nov 2012 13:51:35 +0100 Subject: [PATCH 010/300] apci: switch ich9 smi to memory api Signed-off-by: Gerd Hoffmann --- hw/acpi_ich9.c | 46 ++++++++++++++++++++++++++++++++++++---------- hw/acpi_ich9.h | 1 + 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c index 5fc160a971..0ed17da1eb 100644 --- a/hw/acpi_ich9.c +++ b/hw/acpi_ich9.c @@ -119,12 +119,7 @@ static uint32_t pm_ioport_readw(void *opaque, uint32_t addr) static void pm_ioport_writel(void *opaque, uint32_t addr, uint32_t val) { - ICH9LPCPMRegs *pm = opaque; - switch (addr & ICH9_PMIO_MASK) { - case ICH9_PMIO_SMI_EN: - pm->smi_en = val; - break; default: pm_ioport_write_fallback(opaque, addr, 4, val); break; @@ -134,14 +129,9 @@ static void pm_ioport_writel(void *opaque, uint32_t addr, uint32_t val) static uint32_t pm_ioport_readl(void *opaque, uint32_t addr) { - ICH9LPCPMRegs *pm = opaque; uint32_t val; switch (addr & ICH9_PMIO_MASK) { - case ICH9_PMIO_SMI_EN: - val = pm->smi_en; - break; - default: val = pm_ioport_read_fallback(opaque, addr, 4); break; @@ -223,6 +213,38 @@ static const MemoryRegionOps ich9_gpe_ops = { .endianness = DEVICE_LITTLE_ENDIAN, }; +static uint64_t ich9_smi_readl(void *opaque, hwaddr addr, unsigned width) +{ + ICH9LPCPMRegs *pm = opaque; + switch (addr) { + case 0: + return pm->smi_en; + case 4: + return pm->smi_sts; + default: + return 0; + } +} + +static void ich9_smi_writel(void *opaque, hwaddr addr, uint64_t val, + unsigned width) +{ + ICH9LPCPMRegs *pm = opaque; + switch (addr) { + case 0: + pm->smi_en = val; + break; + } +} + +static const MemoryRegionOps ich9_smi_ops = { + .read = ich9_smi_readl, + .write = ich9_smi_writel, + .valid.min_access_size = 4, + .valid.max_access_size = 4, + .endianness = DEVICE_LITTLE_ENDIAN, +}; + void ich9_pm_iospace_update(ICH9LPCPMRegs *pm, uint32_t pm_io_base) { ICH9_DEBUG("to 0x%x\n", pm_io_base); @@ -318,6 +340,10 @@ void ich9_pm_init(ICH9LPCPMRegs *pm, qemu_irq sci_irq, qemu_irq cmos_s3) ICH9_PMIO_GPE0_LEN); memory_region_add_subregion(&pm->io, ICH9_PMIO_GPE0_STS, &pm->io_gpe); + memory_region_init_io(&pm->io_smi, &ich9_smi_ops, pm, "apci-smi", + 8); + memory_region_add_subregion(&pm->io, ICH9_PMIO_SMI_EN, &pm->io_smi); + pm->irq = sci_irq; qemu_register_reset(pm_reset, pm); pm->powerdown_notifier.notify = pm_powerdown_req; diff --git a/hw/acpi_ich9.h b/hw/acpi_ich9.h index f3b05d7229..bc221d3cbc 100644 --- a/hw/acpi_ich9.h +++ b/hw/acpi_ich9.h @@ -32,6 +32,7 @@ typedef struct ICH9LPCPMRegs { ACPIREGS acpi_regs; MemoryRegion io; MemoryRegion io_gpe; + MemoryRegion io_smi; uint32_t smi_en; uint32_t smi_sts; From 4a522de0905c88160b6f93eb5d35883382a0c333 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 22 Nov 2012 14:01:20 +0100 Subject: [PATCH 011/300] acpi: cleanup ich9 memory region Nothing left to do, everything handled by subregions, we can zap the reaw/write handlers now. Signed-off-by: Gerd Hoffmann --- hw/acpi_ich9.c | 125 +------------------------------------------------ 1 file changed, 1 insertion(+), 124 deletions(-) diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c index 0ed17da1eb..db0d7a5063 100644 --- a/hw/acpi_ich9.c +++ b/hw/acpi_ich9.c @@ -42,10 +42,6 @@ do { printf("%s "fmt, __func__, ## __VA_ARGS__); } while (0) #define ICH9_DEBUG(fmt, ...) do { } while (0) #endif -static void pm_ioport_write_fallback(void *opaque, uint32_t addr, int len, - uint32_t val); -static uint32_t pm_ioport_read_fallback(void *opaque, uint32_t addr, int len); - static void pm_update_sci(ICH9LPCPMRegs *pm) { int sci_level, pm1a_sts; @@ -71,125 +67,6 @@ static void ich9_pm_update_sci_fn(ACPIREGS *regs) pm_update_sci(pm); } -static void pm_ioport_writeb(void *opaque, uint32_t addr, uint32_t val) -{ - switch (addr & ICH9_PMIO_MASK) { - default: - break; - } - - ICH9_DEBUG("port=0x%04x val=0x%04x\n", addr, val); -} - -static uint32_t pm_ioport_readb(void *opaque, uint32_t addr) -{ - uint32_t val = 0; - - switch (addr & ICH9_PMIO_MASK) { - default: - val = 0; - break; - } - ICH9_DEBUG("port=0x%04x val=0x%04x\n", addr, val); - return val; -} - -static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val) -{ - switch (addr & ICH9_PMIO_MASK) { - default: - pm_ioport_write_fallback(opaque, addr, 2, val); - break; - } - ICH9_DEBUG("port=0x%04x val=0x%04x\n", addr, val); -} - -static uint32_t pm_ioport_readw(void *opaque, uint32_t addr) -{ - uint32_t val; - - switch (addr & ICH9_PMIO_MASK) { - default: - val = pm_ioport_read_fallback(opaque, addr, 2); - break; - } - ICH9_DEBUG("port=0x%04x val=0x%04x\n", addr, val); - return val; -} - -static void pm_ioport_writel(void *opaque, uint32_t addr, uint32_t val) -{ - switch (addr & ICH9_PMIO_MASK) { - default: - pm_ioport_write_fallback(opaque, addr, 4, val); - break; - } - ICH9_DEBUG("port=0x%04x val=0x%08x\n", addr, val); -} - -static uint32_t pm_ioport_readl(void *opaque, uint32_t addr) -{ - uint32_t val; - - switch (addr & ICH9_PMIO_MASK) { - default: - val = pm_ioport_read_fallback(opaque, addr, 4); - break; - } - ICH9_DEBUG("port=0x%04x val=0x%08x\n", addr, val); - return val; -} - -static void pm_ioport_write_fallback(void *opaque, uint32_t addr, int len, - uint32_t val) - { - int subsize = (len == 4) ? 2 : 1; - IOPortWriteFunc *ioport_write = - (subsize == 2) ? pm_ioport_writew : pm_ioport_writeb; - - int i; - - for (i = 0; i < len; i += subsize) { - ioport_write(opaque, addr, val); - val >>= 8 * subsize; - } -} - -static uint32_t pm_ioport_read_fallback(void *opaque, uint32_t addr, int len) -{ - int subsize = (len == 4) ? 2 : 1; - IOPortReadFunc *ioport_read = - (subsize == 2) ? pm_ioport_readw : pm_ioport_readb; - - uint32_t val; - int i; - - val = 0; - for (i = 0; i < len; i += subsize) { - val <<= 8 * subsize; - val |= ioport_read(opaque, addr); - } - - return val; -} - -static const MemoryRegionOps pm_io_ops = { - .old_portio = (MemoryRegionPortio[]) { - { .offset = 0, .len = ICH9_PMIO_SIZE, .size = 1, - .read = pm_ioport_readb, .write = pm_ioport_writeb }, - { .offset = 0, .len = ICH9_PMIO_SIZE, .size = 2, - .read = pm_ioport_readw, .write = pm_ioport_writew }, - { .offset = 0, .len = ICH9_PMIO_SIZE, .size = 4, - .read = pm_ioport_readl, .write = pm_ioport_writel }, - PORTIO_END_OF_LIST(), - }, - .valid.min_access_size = 1, - .valid.max_access_size = 4, - .impl.min_access_size = 1, - .impl.max_access_size = 4, - .endianness = DEVICE_LITTLE_ENDIAN, -}; - static uint64_t ich9_gpe_readb(void *opaque, hwaddr addr, unsigned width) { ICH9LPCPMRegs *pm = opaque; @@ -326,7 +203,7 @@ static void pm_powerdown_req(Notifier *n, void *opaque) void ich9_pm_init(ICH9LPCPMRegs *pm, qemu_irq sci_irq, qemu_irq cmos_s3) { - memory_region_init_io(&pm->io, &pm_io_ops, pm, "ich9-pm", ICH9_PMIO_SIZE); + memory_region_init(&pm->io, "ich9-pm", ICH9_PMIO_SIZE); memory_region_set_enabled(&pm->io, false); memory_region_add_subregion(get_system_io(), 0, &pm->io); From 798512e5522685163c8d5fc5093aea19ae9cce06 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 23 Nov 2012 14:57:01 +0100 Subject: [PATCH 012/300] acpi: switch smbus to memory api Signed-off-by: Gerd Hoffmann --- hw/acpi_piix4.c | 5 ++--- hw/pm_smbus.c | 17 ++++++++++++---- hw/pm_smbus.h | 3 +-- hw/smbus_ich9.c | 52 ++++++++++++++----------------------------------- hw/vt82c686.c | 6 ++---- 5 files changed, 33 insertions(+), 50 deletions(-) diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index cf8aa3d7d7..9e6c97ebd3 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -391,8 +391,8 @@ static int piix4_pm_initfn(PCIDevice *dev) pci_conf[0x90] = s->smb_io_base | 1; pci_conf[0x91] = s->smb_io_base >> 8; pci_conf[0xd2] = 0x09; - register_ioport_write(s->smb_io_base, 64, 1, smb_ioport_writeb, &s->smb); - register_ioport_read(s->smb_io_base, 64, 1, smb_ioport_readb, &s->smb); + pm_smbus_init(&s->dev.qdev, &s->smb); + memory_region_add_subregion(get_system_io(), s->smb_io_base, &s->smb.io); memory_region_init(&s->io, "piix4-pm", 64); memory_region_set_enabled(&s->io, false); @@ -406,7 +406,6 @@ static int piix4_pm_initfn(PCIDevice *dev) s->powerdown_notifier.notify = piix4_pm_powerdown_req; qemu_register_powerdown_notifier(&s->powerdown_notifier); - pm_smbus_init(&s->dev.qdev, &s->smb); s->machine_ready.notify = piix4_pm_machine_ready; qemu_add_machine_init_done_notifier(&s->machine_ready); qemu_register_reset(piix4_reset, s); diff --git a/hw/pm_smbus.c b/hw/pm_smbus.c index 5d6046de5a..ea1380ca68 100644 --- a/hw/pm_smbus.c +++ b/hw/pm_smbus.c @@ -94,10 +94,11 @@ static void smb_transaction(PMSMBus *s) s->smb_stat |= 0x04; } -void smb_ioport_writeb(void *opaque, uint32_t addr, uint32_t val) +static void smb_ioport_writeb(void *opaque, hwaddr addr, uint64_t val, + unsigned width) { PMSMBus *s = opaque; - addr &= 0x3f; + SMBUS_DPRINTF("SMB writeb port=0x%04x val=0x%02x\n", addr, val); switch(addr) { case SMBHSTSTS: @@ -131,12 +132,11 @@ void smb_ioport_writeb(void *opaque, uint32_t addr, uint32_t val) } } -uint32_t smb_ioport_readb(void *opaque, uint32_t addr) +static uint64_t smb_ioport_readb(void *opaque, hwaddr addr, unsigned width) { PMSMBus *s = opaque; uint32_t val; - addr &= 0x3f; switch(addr) { case SMBHSTSTS: val = s->smb_stat; @@ -170,7 +170,16 @@ uint32_t smb_ioport_readb(void *opaque, uint32_t addr) return val; } +static const MemoryRegionOps pm_smbus_ops = { + .read = smb_ioport_readb, + .write = smb_ioport_writeb, + .valid.min_access_size = 1, + .valid.max_access_size = 1, + .endianness = DEVICE_LITTLE_ENDIAN, +}; + void pm_smbus_init(DeviceState *parent, PMSMBus *smb) { smb->smbus = i2c_init_bus(parent, "i2c"); + memory_region_init_io(&smb->io, &pm_smbus_ops, smb, "pm-smbus", 64); } diff --git a/hw/pm_smbus.h b/hw/pm_smbus.h index 4750a409f9..e3069bf7d4 100644 --- a/hw/pm_smbus.h +++ b/hw/pm_smbus.h @@ -3,6 +3,7 @@ typedef struct PMSMBus { i2c_bus *smbus; + MemoryRegion io; uint8_t smb_stat; uint8_t smb_ctl; @@ -15,7 +16,5 @@ typedef struct PMSMBus { } PMSMBus; void pm_smbus_init(DeviceState *parent, PMSMBus *smb); -void smb_ioport_writeb(void *opaque, uint32_t addr, uint32_t val); -uint32_t smb_ioport_readb(void *opaque, uint32_t addr); #endif /* !PM_SMBUS_H */ diff --git a/hw/smbus_ich9.c b/hw/smbus_ich9.c index 6940583bb6..54e7e1252d 100644 --- a/hw/smbus_ich9.c +++ b/hw/smbus_ich9.c @@ -40,7 +40,6 @@ typedef struct ICH9SMBState { PCIDevice dev; PMSMBus smb; - MemoryRegion mem_bar; } ICH9SMBState; static const VMStateDescription vmstate_ich9_smbus = { @@ -54,42 +53,23 @@ static const VMStateDescription vmstate_ich9_smbus = { } }; -static void ich9_smb_ioport_writeb(void *opaque, hwaddr addr, - uint64_t val, unsigned size) +static void ich9_smbus_write_config(PCIDevice *d, uint32_t address, + uint32_t val, int len) { - ICH9SMBState *s = opaque; - uint8_t hostc = s->dev.config[ICH9_SMB_HOSTC]; + ICH9SMBState *s = ICH9_SMB_DEVICE(d); - if ((hostc & ICH9_SMB_HOSTC_HST_EN) && !(hostc & ICH9_SMB_HOSTC_I2C_EN)) { - uint64_t offset = addr - s->dev.io_regions[ICH9_SMB_SMB_BASE_BAR].addr; - smb_ioport_writeb(&s->smb, offset, val); + pci_default_write_config(d, address, val, len); + if (range_covers_byte(address, len, ICH9_SMB_HOSTC)) { + uint8_t hostc = s->dev.config[ICH9_SMB_HOSTC]; + if ((hostc & ICH9_SMB_HOSTC_HST_EN) && + !(hostc & ICH9_SMB_HOSTC_I2C_EN)) { + memory_region_set_enabled(&s->smb.io, true); + } else { + memory_region_set_enabled(&s->smb.io, false); + } } } -static uint64_t ich9_smb_ioport_readb(void *opaque, hwaddr addr, - unsigned size) -{ - ICH9SMBState *s = opaque; - uint8_t hostc = s->dev.config[ICH9_SMB_HOSTC]; - - if ((hostc & ICH9_SMB_HOSTC_HST_EN) && !(hostc & ICH9_SMB_HOSTC_I2C_EN)) { - uint64_t offset = addr - s->dev.io_regions[ICH9_SMB_SMB_BASE_BAR].addr; - return smb_ioport_readb(&s->smb, offset); - } - - return 0xff; -} - -static const MemoryRegionOps lpc_smb_mmio_ops = { - .read = ich9_smb_ioport_readb, - .write = ich9_smb_ioport_writeb, - .endianness = DEVICE_LITTLE_ENDIAN, - .impl = { - .min_access_size = 1, - .max_access_size = 1, - }, -}; - static int ich9_smbus_initfn(PCIDevice *d) { ICH9SMBState *s = ICH9_SMB_DEVICE(d); @@ -109,15 +89,12 @@ static int ich9_smbus_initfn(PCIDevice *d) * Is there any OS that depends on them? */ - /* TODO smb_io_base */ pci_set_byte(d->config + ICH9_SMB_HOSTC, 0); /* TODO bar0, bar1: 64bit BAR support*/ - memory_region_init_io(&s->mem_bar, &lpc_smb_mmio_ops, s, "ich9-smbus-bar", - ICH9_SMB_SMB_BASE_SIZE); - pci_register_bar(d, ICH9_SMB_SMB_BASE_BAR, PCI_BASE_ADDRESS_SPACE_IO, - &s->mem_bar); pm_smbus_init(&d->qdev, &s->smb); + pci_register_bar(d, ICH9_SMB_SMB_BASE_BAR, PCI_BASE_ADDRESS_SPACE_IO, + &s->smb.io); return 0; } @@ -134,6 +111,7 @@ static void ich9_smb_class_init(ObjectClass *klass, void *data) dc->vmsd = &vmstate_ich9_smbus; dc->desc = "ICH9 SMBUS Bridge"; k->init = ich9_smbus_initfn; + k->config_write = ich9_smbus_write_config; } i2c_bus *ich9_smb_init(PCIBus *bus, int devfn, uint32_t smb_io_base) diff --git a/hw/vt82c686.c b/hw/vt82c686.c index 99e6b2f9a9..5016e954d3 100644 --- a/hw/vt82c686.c +++ b/hw/vt82c686.c @@ -351,8 +351,8 @@ static int vt82c686b_pm_initfn(PCIDevice *dev) pci_conf[0x90] = s->smb_io_base | 1; pci_conf[0x91] = s->smb_io_base >> 8; pci_conf[0xd2] = 0x90; - register_ioport_write(s->smb_io_base, 0xf, 1, smb_ioport_writeb, &s->smb); - register_ioport_read(s->smb_io_base, 0xf, 1, smb_ioport_readb, &s->smb); + pm_smbus_init(&s->dev.qdev, &s->smb); + memory_region_add_subregion(get_system_io(), s->smb_io_base, &s->smb.io); apm_init(&s->apm, NULL, s); @@ -364,8 +364,6 @@ static int vt82c686b_pm_initfn(PCIDevice *dev) acpi_pm1_evt_init(&s->ar, pm_tmr_timer, &s->io); acpi_pm1_cnt_init(&s->ar, &s->io); - pm_smbus_init(&s->dev.qdev, &s->smb); - return 0; } From 24fe083de67e0f736c54da4abda05f23ec37c51d Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 23 Nov 2012 14:58:04 +0100 Subject: [PATCH 013/300] acpi: fix piix4 smbus mapping Make write to the smbus base register and enable bit actually work. Signed-off-by: Gerd Hoffmann --- hw/acpi_piix4.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index 9e6c97ebd3..b1d5bf3d61 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -142,12 +142,29 @@ static void pm_io_space_update(PIIX4PMState *s) memory_region_transaction_commit(); } +static void smbus_io_space_update(PIIX4PMState *s) +{ + s->smb_io_base = le32_to_cpu(*(uint32_t *)(s->dev.config + 0x90)); + s->smb_io_base &= 0xffc0; + + memory_region_transaction_begin(); + memory_region_set_enabled(&s->smb.io, s->dev.config[0xd2] & 1); + memory_region_set_address(&s->smb.io, s->smb_io_base); + memory_region_transaction_commit(); +} + static void pm_write_config(PCIDevice *d, uint32_t address, uint32_t val, int len) { pci_default_write_config(d, address, val, len); - if (range_covers_byte(address, len, 0x80)) + if (range_covers_byte(address, len, 0x80) || + ranges_overlap(address, len, 0x40, 4)) { pm_io_space_update((PIIX4PMState *)d); + } + if (range_covers_byte(address, len, 0xd2) || + ranges_overlap(address, len, 0x90, 4)) { + smbus_io_space_update((PIIX4PMState *)d); + } } static void vmstate_pci_status_pre_save(void *opaque) @@ -392,6 +409,7 @@ static int piix4_pm_initfn(PCIDevice *dev) pci_conf[0x91] = s->smb_io_base >> 8; pci_conf[0xd2] = 0x09; pm_smbus_init(&s->dev.qdev, &s->smb); + memory_region_set_enabled(&s->smb.io, pci_conf[0xd2] & 1); memory_region_add_subregion(get_system_io(), s->smb_io_base, &s->smb.io); memory_region_init(&s->io, "piix4-pm", 64); From b65b93f24cb84923d2d7d43cf87d40bc88b6bdcd Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 23 Nov 2012 15:35:13 +0100 Subject: [PATCH 014/300] apci: switch piix4 gpe to memory api Signed-off-by: Gerd Hoffmann --- hw/acpi_piix4.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index b1d5bf3d61..c1a58d32c7 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -57,6 +57,7 @@ struct pci_status { typedef struct PIIX4PMState { PCIDevice dev; MemoryRegion io; + MemoryRegion io_gpe; ACPIREGS ar; APMState apm; @@ -500,7 +501,7 @@ static void piix4_pm_register_types(void) type_init(piix4_pm_register_types) -static uint32_t gpe_readb(void *opaque, uint32_t addr) +static uint64_t gpe_readb(void *opaque, hwaddr addr, unsigned width) { PIIX4PMState *s = opaque; uint32_t val = acpi_gpe_ioport_readb(&s->ar, addr); @@ -509,7 +510,8 @@ static uint32_t gpe_readb(void *opaque, uint32_t addr) return val; } -static void gpe_writeb(void *opaque, uint32_t addr, uint32_t val) +static void gpe_writeb(void *opaque, hwaddr addr, uint64_t val, + unsigned width) { PIIX4PMState *s = opaque; @@ -519,6 +521,16 @@ static void gpe_writeb(void *opaque, uint32_t addr, uint32_t val) PIIX4_DPRINTF("gpe write %x <== %d\n", addr, val); } +static const MemoryRegionOps piix4_gpe_ops = { + .read = gpe_readb, + .write = gpe_writeb, + .valid.min_access_size = 1, + .valid.max_access_size = 4, + .impl.min_access_size = 1, + .impl.max_access_size = 1, + .endianness = DEVICE_LITTLE_ENDIAN, +}; + static uint32_t pci_up_read(void *opaque, uint32_t addr) { PIIX4PMState *s = opaque; @@ -567,10 +579,10 @@ static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev, static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s) { - - register_ioport_write(GPE_BASE, GPE_LEN, 1, gpe_writeb, s); - register_ioport_read(GPE_BASE, GPE_LEN, 1, gpe_readb, s); - acpi_gpe_blk(&s->ar, GPE_BASE); + memory_region_init_io(&s->io_gpe, &piix4_gpe_ops, s, "apci-gpe0", + GPE_LEN); + memory_region_add_subregion(get_system_io(), GPE_BASE, &s->io_gpe); + acpi_gpe_blk(&s->ar, 0); register_ioport_read(PCI_UP_BASE, 4, 4, pci_up_read, s); register_ioport_read(PCI_DOWN_BASE, 4, 4, pci_down_read, s); From c84649ca66a32aadba20a8202062b02247270ee5 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 23 Nov 2012 15:37:05 +0100 Subject: [PATCH 015/300] acpi: remove acpi_gpe_blk With gpe being switched to memory api this is no longer needed. Signed-off-by: Gerd Hoffmann --- hw/acpi.c | 7 ------- hw/acpi.h | 2 -- hw/acpi_ich9.c | 1 - hw/acpi_piix4.c | 1 - 4 files changed, 11 deletions(-) diff --git a/hw/acpi.c b/hw/acpi.c index e58e45f301..ae29a59077 100644 --- a/hw/acpi.c +++ b/hw/acpi.c @@ -493,11 +493,6 @@ void acpi_gpe_init(ACPIREGS *ar, uint8_t len) ar->gpe.en = g_malloc0(len / 2); } -void acpi_gpe_blk(ACPIREGS *ar, uint32_t blk) -{ - ar->gpe.blk = blk; -} - void acpi_gpe_reset(ACPIREGS *ar) { memset(ar->gpe.sts, 0, ar->gpe.len / 2); @@ -523,7 +518,6 @@ void acpi_gpe_ioport_writeb(ACPIREGS *ar, uint32_t addr, uint32_t val) { uint8_t *cur; - addr -= ar->gpe.blk; cur = acpi_gpe_ioport_get_ptr(ar, addr); if (addr < ar->gpe.len / 2) { /* GPE_STS */ @@ -541,7 +535,6 @@ uint32_t acpi_gpe_ioport_readb(ACPIREGS *ar, uint32_t addr) uint8_t *cur; uint32_t val; - addr -= ar->gpe.blk; cur = acpi_gpe_ioport_get_ptr(ar, addr); val = 0; if (cur != NULL) { diff --git a/hw/acpi.h b/hw/acpi.h index 918d7f5bca..afda153d09 100644 --- a/hw/acpi.h +++ b/hw/acpi.h @@ -104,7 +104,6 @@ struct ACPIPM1CNT { }; struct ACPIGPE { - uint32_t blk; uint8_t len; uint8_t *sts; @@ -150,7 +149,6 @@ void acpi_pm1_cnt_reset(ACPIREGS *ar); /* GPE0 */ void acpi_gpe_init(ACPIREGS *ar, uint8_t len); -void acpi_gpe_blk(ACPIREGS *ar, uint32_t blk); void acpi_gpe_reset(ACPIREGS *ar); void acpi_gpe_ioport_writeb(ACPIREGS *ar, uint32_t addr, uint32_t val); diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c index db0d7a5063..c5978d33cc 100644 --- a/hw/acpi_ich9.c +++ b/hw/acpi_ich9.c @@ -212,7 +212,6 @@ void ich9_pm_init(ICH9LPCPMRegs *pm, qemu_irq sci_irq, qemu_irq cmos_s3) acpi_pm1_cnt_init(&pm->acpi_regs, &pm->io); acpi_gpe_init(&pm->acpi_regs, ICH9_PMIO_GPE0_LEN); - acpi_gpe_blk(&pm->acpi_regs, 0); memory_region_init_io(&pm->io_gpe, &ich9_gpe_ops, pm, "apci-gpe0", ICH9_PMIO_GPE0_LEN); memory_region_add_subregion(&pm->io, ICH9_PMIO_GPE0_STS, &pm->io_gpe); diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index c1a58d32c7..d2ba56e5bf 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -582,7 +582,6 @@ static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s) memory_region_init_io(&s->io_gpe, &piix4_gpe_ops, s, "apci-gpe0", GPE_LEN); memory_region_add_subregion(get_system_io(), GPE_BASE, &s->io_gpe); - acpi_gpe_blk(&s->ar, 0); register_ioport_read(PCI_UP_BASE, 4, 4, pci_up_read, s); register_ioport_read(PCI_DOWN_BASE, 4, 4, pci_down_read, s); From c177684c753a0b1337acebb7dbc6f3f3a9700321 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 23 Nov 2012 16:03:19 +0100 Subject: [PATCH 016/300] apci: switch piix4 pci hotplug to memory api Signed-off-by: Gerd Hoffmann --- hw/acpi_piix4.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index d2ba56e5bf..263338aa20 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -42,6 +42,9 @@ #define GPE_BASE 0xafe0 #define GPE_LEN 4 + +#define PCI_HOTPLUG_ADDR 0xae00 +#define PCI_HOTPLUG_SIZE 0x000f #define PCI_UP_BASE 0xae00 #define PCI_DOWN_BASE 0xae04 #define PCI_EJ_BASE 0xae08 @@ -58,6 +61,7 @@ typedef struct PIIX4PMState { PCIDevice dev; MemoryRegion io; MemoryRegion io_gpe; + MemoryRegion io_pci; ACPIREGS ar; APMState apm; @@ -574,6 +578,27 @@ static uint32_t pcirmv_read(void *opaque, uint32_t addr) return s->pci0_hotplug_enable; } +static const MemoryRegionOps piix4_pci_ops = { + .old_portio = (MemoryRegionPortio[]) { + { + .offset = PCI_UP_BASE - PCI_HOTPLUG_ADDR, .len = 4, .size = 4, + .read = pci_up_read, + },{ + .offset = PCI_DOWN_BASE - PCI_HOTPLUG_ADDR, .len = 4, .size = 4, + .read = pci_down_read, + },{ + .offset = PCI_EJ_BASE - PCI_HOTPLUG_ADDR, .len = 4, .size = 4, + .read = pci_features_read, + .write = pciej_write, + },{ + .offset = PCI_RMV_BASE - PCI_HOTPLUG_ADDR, .len = 4, .size = 4, + .read = pcirmv_read, + }, + PORTIO_END_OF_LIST() + }, + .endianness = DEVICE_LITTLE_ENDIAN, +}; + static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev, PCIHotplugState state); @@ -583,14 +608,10 @@ static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s) GPE_LEN); memory_region_add_subregion(get_system_io(), GPE_BASE, &s->io_gpe); - register_ioport_read(PCI_UP_BASE, 4, 4, pci_up_read, s); - register_ioport_read(PCI_DOWN_BASE, 4, 4, pci_down_read, s); - - register_ioport_write(PCI_EJ_BASE, 4, 4, pciej_write, s); - register_ioport_read(PCI_EJ_BASE, 4, 4, pci_features_read, s); - - register_ioport_read(PCI_RMV_BASE, 4, 4, pcirmv_read, s); - + memory_region_init_io(&s->io_pci, &piix4_pci_ops, s, "apci-pci-hotplug", + PCI_HOTPLUG_SIZE); + memory_region_add_subregion(get_system_io(), PCI_HOTPLUG_ADDR, + &s->io_pci); pci_bus_hotplug(bus, piix4_device_hotplug, &s->dev.qdev); } From 3f5bc9e8af8c9ee617b143e42ad4bd2feb379a19 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 23 Nov 2012 15:02:18 +0100 Subject: [PATCH 017/300] q35: update lpc pci config space according to configured devices Signed-off-by: Gerd Hoffmann --- hw/ich9.h | 1 + hw/lpc_ich9.c | 29 +++++++++++++++++++++++++++++ hw/smbus_ich9.c | 12 ------------ 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/hw/ich9.h b/hw/ich9.h index de491350c3..34e216f142 100644 --- a/hw/ich9.h +++ b/hw/ich9.h @@ -51,6 +51,7 @@ typedef struct ICH9LPCState { /* isa bus */ ISABus *isa_bus; MemoryRegion rbca_mem; + Notifier machine_ready; qemu_irq *pic; qemu_irq *ioapic; diff --git a/hw/lpc_ich9.c b/hw/lpc_ich9.c index 2fc83a496f..6585236148 100644 --- a/hw/lpc_ich9.c +++ b/hw/lpc_ich9.c @@ -60,6 +60,7 @@ #include "pam.h" #include "pci_internals.h" #include "exec-memory.h" +#include "sysemu.h" static int ich9_lpc_sci_irq(ICH9LPCState *lpc); @@ -456,6 +457,30 @@ static const MemoryRegionOps rbca_mmio_ops = { .endianness = DEVICE_LITTLE_ENDIAN, }; +static void ich9_lpc_machine_ready(Notifier *n, void *opaque) +{ + ICH9LPCState *s = container_of(n, ICH9LPCState, machine_ready); + uint8_t *pci_conf; + + pci_conf = s->d.config; + if (isa_is_ioport_assigned(0x3f8)) { + /* com1 */ + pci_conf[0x82] |= 0x01; + } + if (isa_is_ioport_assigned(0x2f8)) { + /* com2 */ + pci_conf[0x82] |= 0x02; + } + if (isa_is_ioport_assigned(0x378)) { + /* lpt */ + pci_conf[0x82] |= 0x04; + } + if (isa_is_ioport_assigned(0x3f0)) { + /* floppy */ + pci_conf[0x82] |= 0x08; + } +} + static int ich9_lpc_initfn(PCIDevice *d) { ICH9LPCState *lpc = ICH9_LPC_DEVICE(d); @@ -473,6 +498,10 @@ static int ich9_lpc_initfn(PCIDevice *d) ich9_cc_init(lpc); apm_init(&lpc->apm, ich9_apm_ctrl_changed, lpc); + + lpc->machine_ready.notify = ich9_lpc_machine_ready; + qemu_add_machine_init_done_notifier(&lpc->machine_ready); + return 0; } diff --git a/hw/smbus_ich9.c b/hw/smbus_ich9.c index 54e7e1252d..4194785d71 100644 --- a/hw/smbus_ich9.c +++ b/hw/smbus_ich9.c @@ -77,18 +77,6 @@ static int ich9_smbus_initfn(PCIDevice *d) /* TODO? D31IP.SMIP in chipset configuration space */ pci_config_set_interrupt_pin(d->config, 0x01); /* interrupt pin 1 */ - pci_set_byte(d->config + ICH9_SMB_HOSTC, 0); - - /* - * update parameters based on - * paralell_hds[0] - * serial_hds[0] - * serial_hds[0] - * fdc - * - * Is there any OS that depends on them? - */ - pci_set_byte(d->config + ICH9_SMB_HOSTC, 0); /* TODO bar0, bar1: 64bit BAR support*/ From 3e43749882c558875f70ac5deda39cdc9797e245 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 27 Nov 2012 08:24:42 +0100 Subject: [PATCH 018/300] acpi: drop debug port I'm pretty sure this isn't needed any more. I think this predates the switch to seabios, and the seabios DSDT table has a DBUG() aml macro which writes stuff to the seabios debug port (0x402). Signed-off-by: Gerd Hoffmann --- hw/acpi_piix4.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index 263338aa20..b03454e6c0 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -38,8 +38,6 @@ # define PIIX4_DPRINTF(format, ...) do { } while (0) #endif -#define ACPI_DBG_IO_ADDR 0xb044 - #define GPE_BASE 0xafe0 #define GPE_LEN 4 @@ -129,11 +127,6 @@ static void apm_ctrl_changed(uint32_t val, void *arg) } } -static void acpi_dbg_writel(void *opaque, uint32_t addr, uint32_t val) -{ - PIIX4_DPRINTF("ACPI: DBG: 0x%08x\n", val); -} - static void pm_io_space_update(PIIX4PMState *s) { uint32_t pm_io_base; @@ -400,8 +393,6 @@ static int piix4_pm_initfn(PCIDevice *dev) /* APM */ apm_init(&s->apm, apm_ctrl_changed, s); - register_ioport_write(ACPI_DBG_IO_ADDR, 4, 4, acpi_dbg_writel, s); - if (s->kvm_enabled) { /* Mark SMM as already inited to prevent SMM from running. KVM does not * support SMM mode. */ From f1ae2e3883c4ee3a9f91f484690abe42f5063d64 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 4 Dec 2012 14:39:16 +0100 Subject: [PATCH 019/300] add pc-1.4 Signed-off-by: Gerd Hoffmann --- hw/pc_piix.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/hw/pc_piix.c b/hw/pc_piix.c index aa3e7f40dc..040cd079ed 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -281,8 +281,8 @@ static void pc_xen_hvm_init(QEMUMachineInitArgs *args) } #endif -static QEMUMachine pc_machine_v1_3 = { - .name = "pc-1.3", +static QEMUMachine pc_machine_v1_4 = { + .name = "pc-1.4", .alias = "pc", .desc = "Standard PC", .init = pc_init_pci_1_3, @@ -290,6 +290,16 @@ static QEMUMachine pc_machine_v1_3 = { .is_default = 1, }; +static QEMUMachine pc_machine_v1_3 = { + .name = "pc-1.3", + .desc = "Standard PC", + .init = pc_init_pci_1_3, + .max_cpus = 255, + .compat_props = (GlobalProperty[]) { + { /* end of list */ } + }, +}; + #define PC_COMPAT_1_2 \ {\ .driver = "nec-usb-xhci",\ @@ -626,6 +636,7 @@ static QEMUMachine xenfv_machine = { static void pc_machine_init(void) { + qemu_register_machine(&pc_machine_v1_4); qemu_register_machine(&pc_machine_v1_3); qemu_register_machine(&pc_machine_v1_2); qemu_register_machine(&pc_machine_v1_1); From 8beba9304391189666df1b62b23a5101b3831317 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Sat, 17 Nov 2012 12:47:14 +0100 Subject: [PATCH 020/300] usb: Call wakeup when data becomes available for all devices with int eps This is necessary for proper interaction with the xhci controller, and it will allow other hcds to lower there frame timer while waiting for interrupt data. Signed-off-by: Hans de Goede Signed-off-by: Gerd Hoffmann --- hw/usb/dev-hub.c | 2 ++ hw/usb/dev-network.c | 7 +++++++ hw/usb/dev-wacom.c | 4 ++++ hw/usb/redirect.c | 4 ++++ 4 files changed, 17 insertions(+) diff --git a/hw/usb/dev-hub.c b/hw/usb/dev-hub.c index 9ee60dd412..470fbbb86c 100644 --- a/hw/usb/dev-hub.c +++ b/hw/usb/dev-hub.c @@ -184,6 +184,7 @@ static void usb_hub_detach(USBPort *port1) port->wPortStatus &= ~PORT_STAT_ENABLE; port->wPortChange |= PORT_STAT_C_ENABLE; } + usb_wakeup(s->intr); } static void usb_hub_child_detach(USBPort *port1, USBDevice *child) @@ -363,6 +364,7 @@ static void usb_hub_handle_control(USBDevice *dev, USBPacket *p, port->wPortChange |= PORT_STAT_C_RESET; /* set enable bit */ port->wPortStatus |= PORT_STAT_ENABLE; + usb_wakeup(s->intr); } break; case PORT_POWER: diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c index 14d9e5aa5b..30cb03373e 100644 --- a/hw/usb/dev-network.c +++ b/hw/usb/dev-network.c @@ -639,6 +639,8 @@ typedef struct USBNetState { unsigned int in_ptr, in_len; uint8_t in_buf[2048]; + USBEndpoint *intr; + char usbstring_mac[13]; NICState *nic; NICConf conf; @@ -851,6 +853,10 @@ static void *rndis_queue_response(USBNetState *s, unsigned int length) struct rndis_response *r = g_malloc0(sizeof(struct rndis_response) + length); + if (QTAILQ_EMPTY(&s->rndis_resp)) { + usb_wakeup(s->intr); + } + QTAILQ_INSERT_TAIL(&s->rndis_resp, r, entries); r->length = length; @@ -1349,6 +1355,7 @@ static int usb_net_initfn(USBDevice *dev) s->media_state = 0; /* NDIS_MEDIA_STATE_CONNECTED */; s->filter = 0; s->vendorid = 0x1234; + s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1); qemu_macaddr_default_if_unset(&s->conf.macaddr); s->nic = qemu_new_nic(&net_usbnet_info, &s->conf, diff --git a/hw/usb/dev-wacom.c b/hw/usb/dev-wacom.c index 08b416daa6..f7342b08c3 100644 --- a/hw/usb/dev-wacom.c +++ b/hw/usb/dev-wacom.c @@ -43,6 +43,7 @@ typedef struct USBWacomState { USBDevice dev; + USBEndpoint *intr; QEMUPutMouseEntry *eh_entry; int dx, dy, dz, buttons_state; int x, y; @@ -137,6 +138,7 @@ static void usb_mouse_event(void *opaque, s->dz += dz1; s->buttons_state = buttons_state; s->changed = 1; + usb_wakeup(s->intr); } static void usb_wacom_event(void *opaque, @@ -150,6 +152,7 @@ static void usb_wacom_event(void *opaque, s->dz += dz; s->buttons_state = buttons_state; s->changed = 1; + usb_wakeup(s->intr); } static inline int int_clamp(int val, int vmin, int vmax) @@ -337,6 +340,7 @@ static int usb_wacom_initfn(USBDevice *dev) USBWacomState *s = DO_UPCAST(USBWacomState, dev, dev); usb_desc_create_serial(dev); usb_desc_init(dev); + s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1); s->changed = 1; return 0; } diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c index 490c90fae1..9e7f6453f7 100644 --- a/hw/usb/redirect.c +++ b/hw/usb/redirect.c @@ -1644,6 +1644,10 @@ static void usbredir_interrupt_packet(void *priv, uint64_t id, return; } + if (QTAILQ_EMPTY(&dev->endpoint[EP2I(ep)].bufpq)) { + usb_wakeup(usb_ep_get(&dev->dev, USB_TOKEN_IN, ep & 0x0f)); + } + /* bufp_alloc also adds the packet to the ep queue */ bufp_alloc(dev, data, data_len, interrupt_packet->status, ep); } else { From be41efde3ca0372dbf7543e09ff473b4eec25057 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Sat, 17 Nov 2012 12:47:15 +0100 Subject: [PATCH 021/300] usb: Don't allow USB_RET_ASYNC for interrupt packets It is tempting to use USB_RET_ASYNC for interrupt packets, rather then the current NAK + polling approach, but this causes issues for migration, as an async completed packet will not getting written back to guest memory until the next poll time, and if a migration happens in between it will get lost! Make an exception for host devices, because: 1) host-linux actually uses async completion for interrupt endpoints 2) host devices don't migrate anyways Ideally we would convert host-linux.c to handle (input) interrupt endpoints in a buffered manner like it does for isoc endpoints, keeping multiple urbs submitted to ensure the devices timing requirements are met, as well as making its interrupt ep handling the same as other usb-devices. Signed-off-by: Hans de Goede Signed-off-by: Gerd Hoffmann --- hw/usb.h | 1 + hw/usb/core.c | 4 ++++ hw/usb/host-bsd.c | 1 + hw/usb/host-linux.c | 1 + 4 files changed, 7 insertions(+) diff --git a/hw/usb.h b/hw/usb.h index 7d6de69ec4..58f812f7d0 100644 --- a/hw/usb.h +++ b/hw/usb.h @@ -197,6 +197,7 @@ struct USBEndpoint { enum USBDeviceFlags { USB_DEV_FLAG_FULL_PATH, + USB_DEV_FLAG_IS_HOST, }; /* definition of a USB device */ diff --git a/hw/usb/core.c b/hw/usb/core.c index 52b53108cd..8e360d3ec0 100644 --- a/hw/usb/core.c +++ b/hw/usb/core.c @@ -406,7 +406,11 @@ void usb_handle_packet(USBDevice *dev, USBPacket *p) if (QTAILQ_EMPTY(&p->ep->queue) || p->ep->pipeline) { usb_process_one(p); if (p->status == USB_RET_ASYNC) { + /* hcd drivers cannot handle async for isoc */ assert(p->ep->type != USB_ENDPOINT_XFER_ISOC); + /* using async for interrupt packets breaks migration */ + assert(p->ep->type != USB_ENDPOINT_XFER_INT || + (dev->flags & USB_DEV_FLAG_IS_HOST)); usb_packet_set_state(p, USB_PACKET_ASYNC); QTAILQ_INSERT_TAIL(&p->ep->queue, p, queue); } else if (p->status == USB_RET_ADD_TO_QUEUE) { diff --git a/hw/usb/host-bsd.c b/hw/usb/host-bsd.c index 6473e8b747..dae0009378 100644 --- a/hw/usb/host-bsd.c +++ b/hw/usb/host-bsd.c @@ -292,6 +292,7 @@ static void usb_host_handle_destroy(USBDevice *opaque) static int usb_host_initfn(USBDevice *dev) { + dev->flags |= (1 << USB_DEV_FLAG_IS_HOST); return 0; } diff --git a/hw/usb/host-linux.c b/hw/usb/host-linux.c index aa77b7704d..bdafb6bc87 100644 --- a/hw/usb/host-linux.c +++ b/hw/usb/host-linux.c @@ -1476,6 +1476,7 @@ static int usb_host_initfn(USBDevice *dev) { USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev); + dev->flags |= (1 << USB_DEV_FLAG_IS_HOST); dev->auto_attach = 0; s->fd = -1; s->hub_fd = -1; From 386ab487ebc25d780ddfc4a9aea0b21c4a9aaa94 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Sat, 17 Nov 2012 12:47:16 +0100 Subject: [PATCH 022/300] usb: Allow overriding of usb_desc at the device level This allows devices to present a different set of descriptors based on device properties. Signed-off-by: Hans de Goede Signed-off-by: Gerd Hoffmann --- hw/usb.h | 1 + hw/usb/bus.c | 3 +++ 2 files changed, 4 insertions(+) diff --git a/hw/usb.h b/hw/usb.h index 58f812f7d0..268e6539aa 100644 --- a/hw/usb.h +++ b/hw/usb.h @@ -230,6 +230,7 @@ struct USBDevice { USBEndpoint ep_out[USB_MAX_ENDPOINTS]; QLIST_HEAD(, USBDescString) strings; + const USBDesc *usb_desc; /* Overrides class usb_desc if not NULL */ const USBDescDevice *device; int configuration; diff --git a/hw/usb/bus.c b/hw/usb/bus.c index 55d0edd5c3..8264c240ee 100644 --- a/hw/usb/bus.c +++ b/hw/usb/bus.c @@ -166,6 +166,9 @@ const char *usb_device_get_product_desc(USBDevice *dev) const USBDesc *usb_device_get_usb_desc(USBDevice *dev) { USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); + if (dev->usb_desc) { + return dev->usb_desc; + } return klass->usb_desc; } From 8082624099bce56a3139e6b9f72016c00fd10227 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Sat, 17 Nov 2012 12:47:17 +0100 Subject: [PATCH 023/300] ehci: Lower timer freq when the periodic schedule is idle Lower the timer freq if no iso schedule packets complete for 64 frames in a row. We can safely do this, without adding latency, because: 1) If there is isoc traffic this will never trigger 2) For async handled interrupt packets (only usb-host), the completion handler will immediately schedule the frame_timer from a bh 3) All devices using NAK to signal no data for interrupt endpoints now use wakeup, which will immediately schedule the frame_timer from a bh The advantage of this is that when we only have interrupt packets in the periodic schedule, async_stepdown can do its work and significantly lower the frequency at which the frame_timer runs. Signed-off-by: Hans de Goede Signed-off-by: Gerd Hoffmann --- hw/usb/hcd-ehci.c | 39 +++++++++++++++++++++++++++++++++------ hw/usb/hcd-ehci.h | 1 + 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c index 7df8e21ecb..7536837fb2 100644 --- a/hw/usb/hcd-ehci.c +++ b/hw/usb/hcd-ehci.c @@ -114,6 +114,7 @@ #define BUFF_SIZE 5*4096 // Max bytes to transfer per transaction #define MAX_QH 100 // Max allowable queue heads in a chain #define MIN_FR_PER_TICK 3 // Min frames to process when catching up +#define PERIODIC_ACTIVE 64 /* Internal periodic / asynchronous schedule state machine states */ @@ -738,6 +739,19 @@ static int ehci_register_companion(USBBus *bus, USBPort *ports[], return 0; } +static void ehci_wakeup_endpoint(USBBus *bus, USBEndpoint *ep) +{ + EHCIState *s = container_of(bus, EHCIState, bus); + uint32_t portsc = s->portsc[ep->dev->port->index]; + + if (portsc & PORTSC_POWNER) { + return; + } + + s->periodic_sched_active = PERIODIC_ACTIVE; + qemu_bh_schedule(s->async_bh); +} + static USBDevice *ehci_find_device(EHCIState *ehci, uint8_t addr) { USBDevice *dev; @@ -1188,9 +1202,10 @@ static void ehci_async_complete_packet(USBPort *port, USBPacket *packet) trace_usb_ehci_packet_action(p->queue, p, "wakeup"); p->async = EHCI_ASYNC_FINISHED; - if (p->queue->async) { - qemu_bh_schedule(p->queue->ehci->async_bh); + if (!p->queue->async) { + s->periodic_sched_active = PERIODIC_ACTIVE; } + qemu_bh_schedule(s->async_bh); } static void ehci_execute_complete(EHCIQueue *q) @@ -1344,6 +1359,8 @@ static int ehci_process_itd(EHCIState *ehci, uint32_t i, len, pid, dir, devaddr, endp; uint32_t pg, off, ptr1, ptr2, max, mult; + ehci->periodic_sched_active = PERIODIC_ACTIVE; + dir =(itd->bufptr[1] & ITD_BUFPTR_DIRECTION); devaddr = get_field(itd->bufptr[0], ITD_BUFPTR_DEVADDR); endp = get_field(itd->bufptr[0], ITD_BUFPTR_EP); @@ -2033,6 +2050,9 @@ static void ehci_advance_state(EHCIState *ehci, int async) case EST_WRITEBACK: assert(q != NULL); again = ehci_state_writeback(q); + if (!async) { + ehci->periodic_sched_active = PERIODIC_ACTIVE; + } break; default: @@ -2198,7 +2218,6 @@ static void ehci_frame_timer(void *opaque) if (ehci_periodic_enabled(ehci) || ehci->pstate != EST_INACTIVE) { need_timer++; - ehci->async_stepdown = 0; if (frames > ehci->maxframes) { skipped_frames = frames - ehci->maxframes; @@ -2222,18 +2241,25 @@ static void ehci_frame_timer(void *opaque) break; } } + if (ehci->periodic_sched_active) { + ehci->periodic_sched_active--; + } ehci_update_frindex(ehci, 1); ehci_advance_periodic_state(ehci); ehci->last_run_ns += FRAME_TIMER_NS; } } else { - if (ehci->async_stepdown < ehci->maxframes / 2) { - ehci->async_stepdown++; - } + ehci->periodic_sched_active = 0; ehci_update_frindex(ehci, frames); ehci->last_run_ns += FRAME_TIMER_NS * frames; } + if (ehci->periodic_sched_active) { + ehci->async_stepdown = 0; + } else if (ehci->async_stepdown < ehci->maxframes / 2) { + ehci->async_stepdown++; + } + /* Async is not inside loop since it executes everything it can once * called */ @@ -2301,6 +2327,7 @@ static USBPortOps ehci_port_ops = { static USBBusOps ehci_bus_ops = { .register_companion = ehci_register_companion, + .wakeup_endpoint = ehci_wakeup_endpoint, }; static int usb_ehci_post_load(void *opaque, int version_id) diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h index d8078f4555..772870b727 100644 --- a/hw/usb/hcd-ehci.h +++ b/hw/usb/hcd-ehci.h @@ -311,6 +311,7 @@ struct EHCIState { uint64_t last_run_ns; uint32_t async_stepdown; + uint32_t periodic_sched_active; bool int_req_by_async; }; From 427e3aa151c749225364d0c30640e2e3c1756d9d Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Sat, 17 Nov 2012 12:47:18 +0100 Subject: [PATCH 024/300] usb-tablet: Allow connecting to ehci Our ehci code has is capable of significantly lowering the wakeup rate for the hcd emulation while the device is idle. It is possible to add similar code ot the uhci emulation, but that simply is not there atm, and there is no reason why a (virtual) usb-tablet can not be a USB-2 device. Making usb-hid devices connect to the emulated ehci controller instead of the emulated uhci controller on vms which have both lowers the cpuload for a fully idle vm from 20% to 2-3% (on my laptop). An alternative implementation to using a property to select the tablet type, would be simply making it a new device type, ie usb-tablet2, but the downside of that is that this will require libvirt changes to be available through libvirt at all, and then management tools changes to become the default for new vms, where as using a property will automatically get any pc-1.3 type vms the lower cpuload. [ kraxel: adapt compat property for post-1.3 merge ] Signed-off-by: Hans de Goede Signed-off-by: Gerd Hoffmann tablet compat fixup Signed-off-by: Gerd Hoffmann --- hw/pc_piix.c | 9 +++++ hw/usb/dev-hid.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/hw/pc_piix.c b/hw/pc_piix.c index 040cd079ed..19e342aeb4 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -290,17 +290,26 @@ static QEMUMachine pc_machine_v1_4 = { .is_default = 1, }; +#define PC_COMPAT_1_3 \ + {\ + .driver = "usb-tablet",\ + .property = "usb_version",\ + .value = stringify(1),\ + } + static QEMUMachine pc_machine_v1_3 = { .name = "pc-1.3", .desc = "Standard PC", .init = pc_init_pci_1_3, .max_cpus = 255, .compat_props = (GlobalProperty[]) { + PC_COMPAT_1_3, { /* end of list */ } }, }; #define PC_COMPAT_1_2 \ + PC_COMPAT_1_3,\ {\ .driver = "nec-usb-xhci",\ .property = "msi",\ diff --git a/hw/usb/dev-hid.c b/hw/usb/dev-hid.c index 55266b18ef..87491284a8 100644 --- a/hw/usb/dev-hid.c +++ b/hw/usb/dev-hid.c @@ -46,6 +46,7 @@ typedef struct USBHIDState { USBDevice dev; USBEndpoint *intr; HIDState hid; + uint32_t usb_version; } USBHIDState; enum { @@ -131,6 +132,36 @@ static const USBDescIface desc_iface_tablet = { }, }; +static const USBDescIface desc_iface_tablet2 = { + .bInterfaceNumber = 0, + .bNumEndpoints = 1, + .bInterfaceClass = USB_CLASS_HID, + .bInterfaceProtocol = 0x02, + .ndesc = 1, + .descs = (USBDescOther[]) { + { + /* HID descriptor */ + .data = (uint8_t[]) { + 0x09, /* u8 bLength */ + USB_DT_HID, /* u8 bDescriptorType */ + 0x01, 0x00, /* u16 HID_class */ + 0x00, /* u8 country_code */ + 0x01, /* u8 num_descriptors */ + USB_DT_REPORT, /* u8 type: Report */ + 74, 0, /* u16 len */ + }, + }, + }, + .eps = (USBDescEndpoint[]) { + { + .bEndpointAddress = USB_DIR_IN | 0x01, + .bmAttributes = USB_ENDPOINT_XFER_INT, + .wMaxPacketSize = 8, + .bInterval = 4, /* 2 ^ (4-1) * 125 usecs = 1 ms */ + }, + }, +}; + static const USBDescIface desc_iface_keyboard = { .bInterfaceNumber = 0, .bNumEndpoints = 1, @@ -196,6 +227,23 @@ static const USBDescDevice desc_device_tablet = { }, }; +static const USBDescDevice desc_device_tablet2 = { + .bcdUSB = 0x0200, + .bMaxPacketSize0 = 64, + .bNumConfigurations = 1, + .confs = (USBDescConfig[]) { + { + .bNumInterfaces = 1, + .bConfigurationValue = 1, + .iConfiguration = STR_CONFIG_TABLET, + .bmAttributes = 0xa0, + .bMaxPower = 50, + .nif = 1, + .ifs = &desc_iface_tablet2, + }, + }, +}; + static const USBDescDevice desc_device_keyboard = { .bcdUSB = 0x0100, .bMaxPacketSize0 = 8, @@ -239,6 +287,20 @@ static const USBDesc desc_tablet = { .str = desc_strings, }; +static const USBDesc desc_tablet2 = { + .id = { + .idVendor = 0x0627, + .idProduct = 0x0001, + .bcdDevice = 0, + .iManufacturer = STR_MANUFACTURER, + .iProduct = STR_PRODUCT_TABLET, + .iSerialNumber = STR_SERIALNUMBER, + }, + .full = &desc_device_tablet, + .high = &desc_device_tablet2, + .str = desc_strings, +}; + static const USBDesc desc_keyboard = { .id = { .idVendor = 0x0627, @@ -508,6 +570,21 @@ static int usb_hid_initfn(USBDevice *dev, int kind) static int usb_tablet_initfn(USBDevice *dev) { + USBHIDState *us = DO_UPCAST(USBHIDState, dev, dev); + + switch (us->usb_version) { + case 1: + dev->usb_desc = &desc_tablet; + break; + case 2: + dev->usb_desc = &desc_tablet2; + break; + default: + error_report("Invalid usb version %d for usb-tabler (must be 1 or 2)", + us->usb_version); + return -1; + } + return usb_hid_initfn(dev, HID_TABLET); } @@ -562,8 +639,14 @@ static void usb_hid_class_initfn(ObjectClass *klass, void *data) uc->handle_control = usb_hid_handle_control; uc->handle_data = usb_hid_handle_data; uc->handle_destroy = usb_hid_handle_destroy; + uc->handle_attach = usb_desc_attach; } +static Property usb_tablet_properties[] = { + DEFINE_PROP_UINT32("usb_version", USBHIDState, usb_version, 2), + DEFINE_PROP_END_OF_LIST(), +}; + static void usb_tablet_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -572,8 +655,8 @@ static void usb_tablet_class_initfn(ObjectClass *klass, void *data) usb_hid_class_initfn(klass, data); uc->init = usb_tablet_initfn; uc->product_desc = "QEMU USB Tablet"; - uc->usb_desc = &desc_tablet; dc->vmsd = &vmstate_usb_ptr; + dc->props = usb_tablet_properties; } static TypeInfo usb_tablet_info = { From ac10027327e27c9b360452e01af3ef2147f5a26f Mon Sep 17 00:00:00 2001 From: Julien Grall Date: Wed, 19 Sep 2012 12:50:02 +0100 Subject: [PATCH 025/300] isa: Add isa_address_space_io() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This function permits to retrieve ISA IO address space. It will be usefull when we need to pass IO address space as argument. Signed-off-by: Julien Grall Acked-by: Avi Kivity Signed-off-by: Andreas Färber --- hw/isa-bus.c | 9 +++++++++ hw/isa.h | 1 + 2 files changed, 10 insertions(+) diff --git a/hw/isa-bus.c b/hw/isa-bus.c index 685fdc0f82..144a88e272 100644 --- a/hw/isa-bus.c +++ b/hw/isa-bus.c @@ -264,4 +264,13 @@ MemoryRegion *isa_address_space(ISADevice *dev) return get_system_memory(); } +MemoryRegion *isa_address_space_io(ISADevice *dev) +{ + if (dev) { + return isa_bus_from_device(dev)->address_space_io; + } + + return isabus->address_space_io; +} + type_init(isabus_register_types) diff --git a/hw/isa.h b/hw/isa.h index f9382e8367..9d719fa3c8 100644 --- a/hw/isa.h +++ b/hw/isa.h @@ -43,6 +43,7 @@ void isa_bus_irqs(ISABus *bus, qemu_irq *irqs); qemu_irq isa_get_irq(ISADevice *dev, int isairq); void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq); MemoryRegion *isa_address_space(ISADevice *dev); +MemoryRegion *isa_address_space_io(ISADevice *dev); ISADevice *isa_create(ISABus *bus, const char *name); ISADevice *isa_try_create(ISABus *bus, const char *name); ISADevice *isa_create_simple(ISABus *bus, const char *name); From 42d8a3cf960659069bd2b2d9c443dafd7585607f Mon Sep 17 00:00:00 2001 From: Julien Grall Date: Wed, 19 Sep 2012 12:50:03 +0100 Subject: [PATCH 026/300] hw/apm.c: Replace register_ioport_* MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace all register_ioport_*() with a MemoryRegion. This permits to use the new Memory stuff like listeners. Moreover, the PCI device is added as an argument for apm_init(), so we can register IO inside the PCI IO address space. Signed-off-by: Julien Grall Acked-by: Avi Kivity [AF: Rebased onto hwaddr and q35] Signed-off-by: Andreas Färber --- hw/acpi_piix4.c | 2 +- hw/apm.c | 23 ++++++++++++++++++----- hw/apm.h | 5 ++++- hw/lpc_ich9.c | 2 +- hw/vt82c686.c | 2 +- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index 519269a013..dbddde13ab 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -438,7 +438,7 @@ static int piix4_pm_initfn(PCIDevice *dev) pci_conf[0x3d] = 0x01; // interrupt pin 1 /* APM */ - apm_init(&s->apm, apm_ctrl_changed, s); + apm_init(dev, &s->apm, apm_ctrl_changed, s); register_ioport_write(ACPI_DBG_IO_ADDR, 4, 4, acpi_dbg_writel, s); diff --git a/hw/apm.c b/hw/apm.c index 2aead52a74..e988ad9939 100644 --- a/hw/apm.c +++ b/hw/apm.c @@ -22,6 +22,7 @@ #include "apm.h" #include "hw.h" +#include "pci.h" //#define DEBUG @@ -35,7 +36,8 @@ #define APM_CNT_IOPORT 0xb2 #define APM_STS_IOPORT 0xb3 -static void apm_ioport_writeb(void *opaque, uint32_t addr, uint32_t val) +static void apm_ioport_writeb(void *opaque, hwaddr addr, uint64_t val, + unsigned size) { APMState *apm = opaque; addr &= 1; @@ -51,7 +53,7 @@ static void apm_ioport_writeb(void *opaque, uint32_t addr, uint32_t val) } } -static uint32_t apm_ioport_readb(void *opaque, uint32_t addr) +static uint64_t apm_ioport_readb(void *opaque, hwaddr addr, unsigned size) { APMState *apm = opaque; uint32_t val; @@ -78,12 +80,23 @@ const VMStateDescription vmstate_apm = { } }; -void apm_init(APMState *apm, apm_ctrl_changed_t callback, void *arg) +static const MemoryRegionOps apm_ops = { + .read = apm_ioport_readb, + .write = apm_ioport_writeb, + .impl = { + .min_access_size = 1, + .max_access_size = 1, + }, +}; + +void apm_init(PCIDevice *dev, APMState *apm, apm_ctrl_changed_t callback, + void *arg) { apm->callback = callback; apm->arg = arg; /* ioport 0xb2, 0xb3 */ - register_ioport_write(APM_CNT_IOPORT, 2, 1, apm_ioport_writeb, apm); - register_ioport_read(APM_CNT_IOPORT, 2, 1, apm_ioport_readb, apm); + memory_region_init_io(&apm->io, &apm_ops, apm, "apm-io", 2); + memory_region_add_subregion(pci_address_space_io(dev), APM_CNT_IOPORT, + &apm->io); } diff --git a/hw/apm.h b/hw/apm.h index f7c741e327..5431b6d7c8 100644 --- a/hw/apm.h +++ b/hw/apm.h @@ -4,6 +4,7 @@ #include #include "qemu-common.h" #include "hw.h" +#include "memory.h" typedef void (*apm_ctrl_changed_t)(uint32_t val, void *arg); @@ -13,9 +14,11 @@ typedef struct APMState { apm_ctrl_changed_t callback; void *arg; + MemoryRegion io; } APMState; -void apm_init(APMState *s, apm_ctrl_changed_t callback, void *arg); +void apm_init(PCIDevice *dev, APMState *s, apm_ctrl_changed_t callback, + void *arg); extern const VMStateDescription vmstate_apm; diff --git a/hw/lpc_ich9.c b/hw/lpc_ich9.c index 2fc83a496f..7de5427a69 100644 --- a/hw/lpc_ich9.c +++ b/hw/lpc_ich9.c @@ -472,7 +472,7 @@ static int ich9_lpc_initfn(PCIDevice *d) lpc->isa_bus = isa_bus; ich9_cc_init(lpc); - apm_init(&lpc->apm, ich9_apm_ctrl_changed, lpc); + apm_init(d, &lpc->apm, ich9_apm_ctrl_changed, lpc); return 0; } diff --git a/hw/vt82c686.c b/hw/vt82c686.c index 5d7c00cf4b..7f11dbe782 100644 --- a/hw/vt82c686.c +++ b/hw/vt82c686.c @@ -427,7 +427,7 @@ static int vt82c686b_pm_initfn(PCIDevice *dev) register_ioport_write(s->smb_io_base, 0xf, 1, smb_ioport_writeb, &s->smb); register_ioport_read(s->smb_io_base, 0xf, 1, smb_ioport_readb, &s->smb); - apm_init(&s->apm, NULL, s); + apm_init(dev, &s->apm, NULL, s); acpi_pm_tmr_init(&s->ar, pm_tmr_timer); acpi_pm1_cnt_init(&s->ar); From c75e6d8e354c44e76045cb0de20cda1a4ce4d575 Mon Sep 17 00:00:00 2001 From: Julien Grall Date: Wed, 19 Sep 2012 12:50:06 +0100 Subject: [PATCH 027/300] hw/cirrus_vga.c: Replace register_ioport_* MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace all register_ioport_*() with the new Memory API. This permits to use the new Memory stuff like listeners. Signed-off-by: Julien Grall Acked-by: Avi Kivity [AF: Rebased onto hwaddr] Signed-off-by: Andreas Färber --- hw/cirrus_vga.c | 48 ++++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/hw/cirrus_vga.c b/hw/cirrus_vga.c index 9bef96e6d7..40efa8a523 100644 --- a/hw/cirrus_vga.c +++ b/hw/cirrus_vga.c @@ -197,6 +197,7 @@ typedef void (*cirrus_fill_t)(struct CirrusVGAState *s, typedef struct CirrusVGAState { VGACommonState vga; + MemoryRegion cirrus_vga_io; MemoryRegion cirrus_linear_io; MemoryRegion cirrus_linear_bitblt_io; MemoryRegion cirrus_mmio_io; @@ -2432,13 +2433,15 @@ static void cirrus_update_memory_access(CirrusVGAState *s) /* I/O ports */ -static uint32_t cirrus_vga_ioport_read(void *opaque, uint32_t addr) +static uint64_t cirrus_vga_ioport_read(void *opaque, hwaddr addr, + unsigned size) { CirrusVGAState *c = opaque; VGACommonState *s = &c->vga; int val, index; qemu_flush_coalesced_mmio_buffer(); + addr += 0x3b0; if (vga_ioport_invalid(s, addr)) { val = 0xff; @@ -2527,13 +2530,15 @@ static uint32_t cirrus_vga_ioport_read(void *opaque, uint32_t addr) return val; } -static void cirrus_vga_ioport_write(void *opaque, uint32_t addr, uint32_t val) +static void cirrus_vga_ioport_write(void *opaque, hwaddr addr, uint64_t val, + unsigned size) { CirrusVGAState *c = opaque; VGACommonState *s = &c->vga; int index; qemu_flush_coalesced_mmio_buffer(); + addr += 0x3b0; /* check port range access depending on color/monochrome mode */ if (vga_ioport_invalid(s, addr)) { @@ -2646,7 +2651,7 @@ static uint64_t cirrus_mmio_read(void *opaque, hwaddr addr, if (addr >= 0x100) { return cirrus_mmio_blt_read(s, addr - 0x100); } else { - return cirrus_vga_ioport_read(s, addr + 0x3c0); + return cirrus_vga_ioport_read(s, addr + 0x10, size); } } @@ -2658,7 +2663,7 @@ static void cirrus_mmio_write(void *opaque, hwaddr addr, if (addr >= 0x100) { cirrus_mmio_blt_write(s, addr - 0x100, val); } else { - cirrus_vga_ioport_write(s, addr + 0x3c0, val); + cirrus_vga_ioport_write(s, addr + 0x10, val, size); } } @@ -2784,8 +2789,19 @@ static const MemoryRegionOps cirrus_linear_io_ops = { }, }; +static const MemoryRegionOps cirrus_vga_io_ops = { + .read = cirrus_vga_ioport_read, + .write = cirrus_vga_ioport_write, + .endianness = DEVICE_LITTLE_ENDIAN, + .impl = { + .min_access_size = 1, + .max_access_size = 1, + }, +}; + static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci, - MemoryRegion *system_memory) + MemoryRegion *system_memory, + MemoryRegion *system_io) { int i; static int inited; @@ -2817,19 +2833,10 @@ static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci, s->bustype = CIRRUS_BUSTYPE_ISA; } - register_ioport_write(0x3c0, 16, 1, cirrus_vga_ioport_write, s); - - register_ioport_write(0x3b4, 2, 1, cirrus_vga_ioport_write, s); - register_ioport_write(0x3d4, 2, 1, cirrus_vga_ioport_write, s); - register_ioport_write(0x3ba, 1, 1, cirrus_vga_ioport_write, s); - register_ioport_write(0x3da, 1, 1, cirrus_vga_ioport_write, s); - - register_ioport_read(0x3c0, 16, 1, cirrus_vga_ioport_read, s); - - register_ioport_read(0x3b4, 2, 1, cirrus_vga_ioport_read, s); - register_ioport_read(0x3d4, 2, 1, cirrus_vga_ioport_read, s); - register_ioport_read(0x3ba, 1, 1, cirrus_vga_ioport_read, s); - register_ioport_read(0x3da, 1, 1, cirrus_vga_ioport_read, s); + /* Register ioport 0x3b0 - 0x3df */ + memory_region_init_io(&s->cirrus_vga_io, &cirrus_vga_io_ops, s, + "cirrus-io", 0x30); + memory_region_add_subregion(system_io, 0x3b0, &s->cirrus_vga_io); memory_region_init(&s->low_mem_container, "cirrus-lowmem-container", @@ -2900,7 +2907,7 @@ static int vga_initfn(ISADevice *dev) vga_common_init(s); cirrus_init_common(&d->cirrus_vga, CIRRUS_ID_CLGD5430, 0, - isa_address_space(dev)); + isa_address_space(dev), isa_address_space_io(dev)); s->ds = graphic_console_init(s->update, s->invalidate, s->screen_dump, s->text_update, s); @@ -2948,7 +2955,8 @@ static int pci_cirrus_vga_initfn(PCIDevice *dev) /* setup VGA */ vga_common_init(&s->vga); - cirrus_init_common(s, device_id, 1, pci_address_space(dev)); + cirrus_init_common(s, device_id, 1, pci_address_space(dev), + pci_address_space_io(dev)); s->vga.ds = graphic_console_init(s->vga.update, s->vga.invalidate, s->vga.screen_dump, s->vga.text_update, &s->vga); From 568fd159e4ca82d213706acd2cf4c94f27537096 Mon Sep 17 00:00:00 2001 From: Julien Grall Date: Wed, 19 Sep 2012 12:50:07 +0100 Subject: [PATCH 028/300] serial: Replace register_ioport_* MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace all register_ioport_*() with a MemoryRegion. This permits to use the new Memory stuff like listeners. For more flexibility, the IO address space is passed as an argument. Signed-off-by: Julien Grall Acked-by: Avi Kivity [AF: Rebased onto serial split] Signed-off-by: Andreas Färber --- hw/mips_mipssim.c | 3 ++- hw/serial.c | 4 ++-- hw/serial.h | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/hw/mips_mipssim.c b/hw/mips_mipssim.c index a95a3c1f11..20b5f1a58c 100644 --- a/hw/mips_mipssim.c +++ b/hw/mips_mipssim.c @@ -217,7 +217,8 @@ mips_mipssim_init(QEMUMachineInitArgs *args) /* A single 16450 sits at offset 0x3f8. It is attached to MIPS CPU INT2, which is interrupt 4. */ if (serial_hds[0]) - serial_init(0x3f8, env->irq[4], 115200, serial_hds[0]); + serial_init(0x3f8, env->irq[4], 115200, serial_hds[0], + get_system_io()); if (nd_table[0].used) /* MIPSnet uses the MIPS CPU INT0, which is interrupt 2. */ diff --git a/hw/serial.c b/hw/serial.c index 60283eab91..07a2a11931 100644 --- a/hw/serial.c +++ b/hw/serial.c @@ -718,7 +718,7 @@ const MemoryRegionOps serial_io_ops = { }; SerialState *serial_init(int base, qemu_irq irq, int baudbase, - CharDriverState *chr) + CharDriverState *chr, MemoryRegion *system_io) { SerialState *s; @@ -732,7 +732,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase, vmstate_register(NULL, base, &vmstate_serial, s); memory_region_init_io(&s->io, &serial_io_ops, s, "serial", 8); - memory_region_add_subregion(get_system_io(), base, &s->io); + memory_region_add_subregion(system_io, base, &s->io); return s; } diff --git a/hw/serial.h b/hw/serial.h index f1e3c4aaa7..ed1a5cd43e 100644 --- a/hw/serial.h +++ b/hw/serial.h @@ -89,7 +89,7 @@ void serial_set_frequency(SerialState *s, uint32_t frequency); /* legacy pre qom */ SerialState *serial_init(int base, qemu_irq irq, int baudbase, - CharDriverState *chr); + CharDriverState *chr, MemoryRegion *system_io); SerialState *serial_mm_init(MemoryRegion *address_space, hwaddr base, int it_shift, qemu_irq irq, int baudbase, From 258711c6448c44b60b0fecef1d3b09c71e23e304 Mon Sep 17 00:00:00 2001 From: Julien Grall Date: Wed, 19 Sep 2012 12:50:08 +0100 Subject: [PATCH 029/300] hw/pc.c: Replace register_ioport_* MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace all register_ioport_*() with portio_*() or a MemoryRegion. This permits to use the new Memory stuff like listeners. Signed-off-by: Julien Grall Acked-by: Avi Kivity [AF: Rebased onto hwaddr] Signed-off-by: Andreas Färber --- hw/pc.c | 49 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/hw/pc.c b/hw/pc.c index 2b5bbbfb30..b11e7c4adc 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -98,7 +98,8 @@ void gsi_handler(void *opaque, int n, int level) qemu_set_irq(s->ioapic_irq[n], level); } -static void ioport80_write(void *opaque, uint32_t addr, uint32_t data) +static void ioport80_write(void *opaque, hwaddr addr, uint64_t data, + unsigned size) { } @@ -116,7 +117,8 @@ void cpu_set_ferr(CPUX86State *s) qemu_irq_raise(ferr_irq); } -static void ioportF0_write(void *opaque, uint32_t addr, uint32_t data) +static void ioportF0_write(void *opaque, hwaddr addr, uint64_t data, + unsigned size) { qemu_irq_lower(ferr_irq); } @@ -567,6 +569,14 @@ int e820_add_entry(uint64_t address, uint64_t length, uint32_t type) return index; } +static const MemoryRegionPortio bochs_bios_portio_list[] = { + { 0x500, 1, 1, .write = bochs_bios_write, }, /* 0x500 */ + { 0x501, 1, 1, .write = bochs_bios_write, }, /* 0x501 */ + { 0x501, 2, 2, .write = bochs_bios_write, }, /* 0x501 */ + { 0x8900, 1, 1, .write = bochs_bios_write, }, /* 0x8900 */ + PORTIO_END_OF_LIST(), +}; + static void *bochs_bios_init(void) { void *fw_cfg; @@ -574,12 +584,11 @@ static void *bochs_bios_init(void) size_t smbios_len; uint64_t *numa_fw_cfg; int i, j; + PortioList *bochs_bios_port_list = g_new(PortioList, 1); - register_ioport_write(0x8900, 1, 1, bochs_bios_write, NULL); - - register_ioport_write(0x501, 1, 1, bochs_bios_write, NULL); - register_ioport_write(0x501, 1, 2, bochs_bios_write, NULL); - register_ioport_write(0x502, 1, 2, bochs_bios_write, NULL); + portio_list_init(bochs_bios_port_list, bochs_bios_portio_list, + NULL, "bochs-bios"); + portio_list_add(bochs_bios_port_list, get_system_io(), 0x0); fw_cfg = fw_cfg_init(BIOS_CFG_IOPORT, BIOS_CFG_IOPORT + 1, 0, 0); @@ -967,6 +976,24 @@ static void cpu_request_exit(void *opaque, int irq, int level) } } +static const MemoryRegionOps ioport80_io_ops = { + .write = ioport80_write, + .endianness = DEVICE_NATIVE_ENDIAN, + .impl = { + .min_access_size = 1, + .max_access_size = 1, + }, +}; + +static const MemoryRegionOps ioportF0_io_ops = { + .write = ioportF0_write, + .endianness = DEVICE_NATIVE_ENDIAN, + .impl = { + .min_access_size = 1, + .max_access_size = 1, + }, +}; + void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi, ISADevice **rtc_state, ISADevice **floppy, @@ -981,10 +1008,14 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi, qemu_irq *a20_line; ISADevice *i8042, *port92, *vmmouse, *pit = NULL; qemu_irq *cpu_exit_irq; + MemoryRegion *ioport80_io = g_new(MemoryRegion, 1); + MemoryRegion *ioportF0_io = g_new(MemoryRegion, 1); - register_ioport_write(0x80, 1, 1, ioport80_write, NULL); + memory_region_init_io(ioport80_io, &ioport80_io_ops, NULL, "ioport80", 1); + memory_region_add_subregion(isa_bus->address_space_io, 0x80, ioport80_io); - register_ioport_write(0xf0, 1, 1, ioportF0_write, NULL); + memory_region_init_io(ioportF0_io, &ioportF0_io_ops, NULL, "ioportF0", 1); + memory_region_add_subregion(isa_bus->address_space_io, 0xf0, ioportF0_io); /* * Check if an HPET shall be created. From 582299336879504353e60c7937fbc70fea93f3da Mon Sep 17 00:00:00 2001 From: Julien Grall Date: Wed, 19 Sep 2012 12:50:09 +0100 Subject: [PATCH 030/300] hw/dma.c: Replace register_ioport_* MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace all register_ioport_*() with the new Memory API functions. This permits to use the new Memory stuff like listeners. Signed-off-by: Julien Grall Acked-by: Avi Kivity [AF: Rebased onto hwaddr] Signed-off-by: Andreas Färber --- hw/dma.c | 106 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 36 deletions(-) diff --git a/hw/dma.c b/hw/dma.c index d6aeac2834..c2d7b21562 100644 --- a/hw/dma.c +++ b/hw/dma.c @@ -58,6 +58,8 @@ static struct dma_cont { int dshift; struct dma_regs regs[4]; qemu_irq *cpu_request_exit; + MemoryRegion channel_io; + MemoryRegion cont_io; } dma_controllers[2]; enum { @@ -149,7 +151,7 @@ static inline int getff (struct dma_cont *d) return ff; } -static uint32_t read_chan (void *opaque, uint32_t nport) +static uint64_t read_chan(void *opaque, hwaddr nport, unsigned size) { struct dma_cont *d = opaque; int ichan, nreg, iport, ff, val, dir; @@ -171,7 +173,8 @@ static uint32_t read_chan (void *opaque, uint32_t nport) return (val >> (d->dshift + (ff << 3))) & 0xff; } -static void write_chan (void *opaque, uint32_t nport, uint32_t data) +static void write_chan(void *opaque, hwaddr nport, uint64_t data, + unsigned size) { struct dma_cont *d = opaque; int iport, ichan, nreg; @@ -189,22 +192,23 @@ static void write_chan (void *opaque, uint32_t nport, uint32_t data) } } -static void write_cont (void *opaque, uint32_t nport, uint32_t data) +static void write_cont(void *opaque, hwaddr nport, uint64_t data, + unsigned size) { struct dma_cont *d = opaque; int iport, ichan = 0; iport = (nport >> d->dshift) & 0x0f; switch (iport) { - case 0x08: /* command */ + case 0x01: /* command */ if ((data != 0) && (data & CMD_NOT_SUPPORTED)) { - dolog ("command %#x not supported\n", data); + dolog("command %"PRIx64" not supported\n", data); return; } d->command = data; break; - case 0x09: + case 0x02: ichan = data & 3; if (data & 4) { d->status |= 1 << (ichan + 4); @@ -216,7 +220,7 @@ static void write_cont (void *opaque, uint32_t nport, uint32_t data) DMA_run(); break; - case 0x0a: /* single mask */ + case 0x03: /* single mask */ if (data & 4) d->mask |= 1 << (data & 3); else @@ -224,7 +228,7 @@ static void write_cont (void *opaque, uint32_t nport, uint32_t data) DMA_run(); break; - case 0x0b: /* mode */ + case 0x04: /* mode */ { ichan = data & 3; #ifdef DEBUG_DMA @@ -243,23 +247,23 @@ static void write_cont (void *opaque, uint32_t nport, uint32_t data) break; } - case 0x0c: /* clear flip flop */ + case 0x05: /* clear flip flop */ d->flip_flop = 0; break; - case 0x0d: /* reset */ + case 0x06: /* reset */ d->flip_flop = 0; d->mask = ~0; d->status = 0; d->command = 0; break; - case 0x0e: /* clear mask for all channels */ + case 0x07: /* clear mask for all channels */ d->mask = 0; DMA_run(); break; - case 0x0f: /* write mask for all channels */ + case 0x08: /* write mask for all channels */ d->mask = data; DMA_run(); break; @@ -277,7 +281,7 @@ static void write_cont (void *opaque, uint32_t nport, uint32_t data) #endif } -static uint32_t read_cont (void *opaque, uint32_t nport) +static uint64_t read_cont(void *opaque, hwaddr nport, unsigned size) { struct dma_cont *d = opaque; int iport, val; @@ -463,7 +467,7 @@ void DMA_schedule(int nchan) static void dma_reset(void *opaque) { struct dma_cont *d = opaque; - write_cont (d, (0x0d << d->dshift), 0); + write_cont(d, (0x06 << d->dshift), 0, 1); } static int dma_phony_handler (void *opaque, int nchan, int dma_pos, int dma_len) @@ -473,38 +477,68 @@ static int dma_phony_handler (void *opaque, int nchan, int dma_pos, int dma_len) return dma_pos; } + +static const MemoryRegionOps channel_io_ops = { + .read = read_chan, + .write = write_chan, + .endianness = DEVICE_NATIVE_ENDIAN, + .impl = { + .min_access_size = 1, + .max_access_size = 1, + }, +}; + +/* IOport from page_base */ +static const MemoryRegionPortio page_portio_list[] = { + { 0x01, 3, 1, .write = write_page, .read = read_page, }, + { 0x07, 1, 1, .write = write_page, .read = read_page, }, + PORTIO_END_OF_LIST(), +}; + +/* IOport from pageh_base */ +static const MemoryRegionPortio pageh_portio_list[] = { + { 0x01, 3, 1, .write = write_pageh, .read = read_pageh, }, + { 0x07, 3, 1, .write = write_pageh, .read = read_pageh, }, + PORTIO_END_OF_LIST(), +}; + +static const MemoryRegionOps cont_io_ops = { + .read = read_cont, + .write = write_cont, + .endianness = DEVICE_NATIVE_ENDIAN, + .impl = { + .min_access_size = 1, + .max_access_size = 1, + }, +}; + /* dshift = 0: 8 bit DMA, 1 = 16 bit DMA */ static void dma_init2(struct dma_cont *d, int base, int dshift, int page_base, int pageh_base, qemu_irq *cpu_request_exit) { - static const int page_port_list[] = { 0x1, 0x2, 0x3, 0x7 }; int i; d->dshift = dshift; d->cpu_request_exit = cpu_request_exit; - for (i = 0; i < 8; i++) { - register_ioport_write (base + (i << dshift), 1, 1, write_chan, d); - register_ioport_read (base + (i << dshift), 1, 1, read_chan, d); - } - for (i = 0; i < ARRAY_SIZE (page_port_list); i++) { - register_ioport_write (page_base + page_port_list[i], 1, 1, - write_page, d); - register_ioport_read (page_base + page_port_list[i], 1, 1, - read_page, d); - if (pageh_base >= 0) { - register_ioport_write (pageh_base + page_port_list[i], 1, 1, - write_pageh, d); - register_ioport_read (pageh_base + page_port_list[i], 1, 1, - read_pageh, d); - } - } - for (i = 0; i < 8; i++) { - register_ioport_write (base + ((i + 8) << dshift), 1, 1, - write_cont, d); - register_ioport_read (base + ((i + 8) << dshift), 1, 1, - read_cont, d); + + memory_region_init_io(&d->channel_io, &channel_io_ops, d, + "dma-chan", 8 << d->dshift); + memory_region_add_subregion(isa_address_space_io(NULL), + base, &d->channel_io); + + isa_register_portio_list(NULL, page_base, page_portio_list, d, + "dma-page"); + if (pageh_base >= 0) { + isa_register_portio_list(NULL, pageh_base, pageh_portio_list, d, + "dma-pageh"); } + + memory_region_init_io(&d->cont_io, &cont_io_ops, d, "dma-cont", + 8 << d->dshift); + memory_region_add_subregion(isa_address_space_io(NULL), + base + (8 << d->dshift), &d->cont_io); + qemu_register_reset(dma_reset, d); dma_reset(d); for (i = 0; i < ARRAY_SIZE (d->regs); ++i) { From 9fd2ecdc8cb2dc1a8a7c57b6c9c60bc9947b6a73 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Thu, 11 Oct 2012 14:20:23 +0200 Subject: [PATCH 031/300] virtfs-proxy-helper: use setresuid and setresgid The setfsuid and setfsgid system calls are obscure and they complicate the error checking (that glibc's warn_unused_result "feature" forces us to do). Switch to the standard setresuid and setresgid functions. Signed-off-by: Paolo Bonzini --- fsdev/virtfs-proxy-helper.c | 93 +++++++++++++++++++++++++------------ 1 file changed, 64 insertions(+), 29 deletions(-) diff --git a/fsdev/virtfs-proxy-helper.c b/fsdev/virtfs-proxy-helper.c index f9a8270ee9..df2a9392b1 100644 --- a/fsdev/virtfs-proxy-helper.c +++ b/fsdev/virtfs-proxy-helper.c @@ -272,31 +272,76 @@ static int send_status(int sockfd, struct iovec *iovec, int status) /* * from man 7 capabilities, section * Effect of User ID Changes on Capabilities: - * 4. If the file system user ID is changed from 0 to nonzero (see setfsuid(2)) - * then the following capabilities are cleared from the effective set: - * CAP_CHOWN, CAP_DAC_OVERRIDE, CAP_DAC_READ_SEARCH, CAP_FOWNER, CAP_FSETID, - * CAP_LINUX_IMMUTABLE (since Linux 2.2.30), CAP_MAC_OVERRIDE, and CAP_MKNOD - * (since Linux 2.2.30). If the file system UID is changed from nonzero to 0, - * then any of these capabilities that are enabled in the permitted set - * are enabled in the effective set. + * If the effective user ID is changed from nonzero to 0, then the permitted + * set is copied to the effective set. If the effective user ID is changed + * from 0 to nonzero, then all capabilities are are cleared from the effective + * set. + * + * The setfsuid/setfsgid man pages warn that changing the effective user ID may + * expose the program to unwanted signals, but this is not true anymore: for an + * unprivileged (without CAP_KILL) program to send a signal, the real or + * effective user ID of the sending process must equal the real or saved user + * ID of the target process. Even when dropping privileges, it is enough to + * keep the saved UID to a "privileged" value and virtfs-proxy-helper won't + * be exposed to signals. So just use setresuid/setresgid. */ -static int setfsugid(int uid, int gid) +static int setugid(int uid, int gid, int *suid, int *sgid) { + int retval; + /* - * We still need DAC_OVERRIDE because we don't change + * We still need DAC_OVERRIDE because we don't change * supplementary group ids, and hence may be subjected DAC rules */ cap_value_t cap_list[] = { CAP_DAC_OVERRIDE, }; - setfsgid(gid); - setfsuid(uid); + *suid = geteuid(); + *sgid = getegid(); + + if (setresgid(-1, gid, *sgid) == -1) { + retval = -errno; + goto err_out; + } + + if (setresuid(-1, uid, *suid) == -1) { + retval = -errno; + goto err_sgid; + } if (uid != 0 || gid != 0) { - return do_cap_set(cap_list, ARRAY_SIZE(cap_list), 0); + if (do_cap_set(cap_list, ARRAY_SIZE(cap_list), 0) < 0) { + retval = -errno; + goto err_suid; + } } return 0; + +err_suid: + if (setresuid(-1, *suid, *suid) == -1) { + abort(); + } +err_sgid: + if (setresgid(-1, *sgid, *sgid) == -1) { + abort(); + } +err_out: + return retval; +} + +/* + * This is used to reset the ugid back with the saved values + * There is nothing much we can do checking error values here. + */ +static void resetugid(int suid, int sgid) +{ + if (setresgid(-1, sgid, sgid) == -1) { + abort(); + } + if (setresuid(-1, suid, suid) == -1) { + abort(); + } } /* @@ -578,18 +623,15 @@ static int do_create_others(int type, struct iovec *iovec) v9fs_string_init(&path); v9fs_string_init(&oldpath); - cur_uid = geteuid(); - cur_gid = getegid(); retval = proxy_unmarshal(iovec, offset, "dd", &uid, &gid); if (retval < 0) { return retval; } offset += retval; - retval = setfsugid(uid, gid); + retval = setugid(uid, gid, &cur_uid, &cur_gid); if (retval < 0) { - retval = -errno; - goto err_out; + goto unmarshal_err_out; } switch (type) { case T_MKNOD: @@ -619,9 +661,10 @@ static int do_create_others(int type, struct iovec *iovec) } err_out: + resetugid(cur_uid, cur_gid); +unmarshal_err_out: v9fs_string_free(&path); v9fs_string_free(&oldpath); - setfsugid(cur_uid, cur_gid); return retval; } @@ -641,24 +684,16 @@ static int do_create(struct iovec *iovec) if (ret < 0) { goto unmarshal_err_out; } - cur_uid = geteuid(); - cur_gid = getegid(); - ret = setfsugid(uid, gid); + ret = setugid(uid, gid, &cur_uid, &cur_gid); if (ret < 0) { - /* - * On failure reset back to the - * old uid/gid - */ - ret = -errno; - goto err_out; + goto unmarshal_err_out; } ret = open(path.data, flags, mode); if (ret < 0) { ret = -errno; } -err_out: - setfsugid(cur_uid, cur_gid); + resetugid(cur_uid, cur_gid); unmarshal_err_out: v9fs_string_free(&path); return ret; From 89e0e9c71e608f3679f30e88d988903536c6f7f3 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Tue, 23 Oct 2012 20:42:56 -0200 Subject: [PATCH 032/300] user: Move *-user/qemu-types.h to main directory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The bsd-user/qemu-types.h and linux-user/qemu-types.h files are almost the same, but linux-user has the additional definitions of tswapal(). This moves the linux-user file to the main directory, so the same file can be used by linux-user and bsd-user. Signed-off-by: Eduardo Habkost Signed-off-by: Andreas Färber --- bsd-user/qemu-types.h | 24 ------------------------ linux-user/qemu-types.h => qemu-types.h | 0 2 files changed, 24 deletions(-) delete mode 100644 bsd-user/qemu-types.h rename linux-user/qemu-types.h => qemu-types.h (100%) diff --git a/bsd-user/qemu-types.h b/bsd-user/qemu-types.h deleted file mode 100644 index 1adda9fbdb..0000000000 --- a/bsd-user/qemu-types.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef QEMU_TYPES_H -#define QEMU_TYPES_H -#include "cpu.h" - -#ifdef TARGET_ABI32 -typedef uint32_t abi_ulong; -typedef int32_t abi_long; -#define TARGET_ABI_FMT_lx "%08x" -#define TARGET_ABI_FMT_ld "%d" -#define TARGET_ABI_FMT_lu "%u" -#define TARGET_ABI_BITS 32 -#else -typedef target_ulong abi_ulong; -typedef target_long abi_long; -#define TARGET_ABI_FMT_lx TARGET_FMT_lx -#define TARGET_ABI_FMT_ld TARGET_FMT_ld -#define TARGET_ABI_FMT_lu TARGET_FMT_lu -#define TARGET_ABI_BITS TARGET_LONG_BITS -/* for consistency, define ABI32 too */ -#if TARGET_ABI_BITS == 32 -#define TARGET_ABI32 1 -#endif -#endif -#endif diff --git a/linux-user/qemu-types.h b/qemu-types.h similarity index 100% rename from linux-user/qemu-types.h rename to qemu-types.h From ee9baa00f2623f1f627913f62d60f2888286319a Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Tue, 23 Oct 2012 22:54:34 -0200 Subject: [PATCH 033/300] user: Rename qemu-types.h to qemu-user-types.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The header file is specific for *-user, but I plan to introduce a more generic qemu-types.h file, so I'm renaming it. Signed-off-by: Eduardo Habkost Signed-off-by: Andreas Färber --- bsd-user/qemu.h | 2 +- cpu-all.h | 2 +- linux-user/qemu.h | 2 +- qemu-types.h => qemu-user-types.h | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename qemu-types.h => qemu-user-types.h (100%) diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h index 8a5ee3d81f..d2688995bd 100644 --- a/bsd-user/qemu.h +++ b/bsd-user/qemu.h @@ -11,7 +11,7 @@ #include #endif /* DEBUG_REMAP */ -#include "qemu-types.h" +#include "qemu-user-types.h" enum BSDType { target_freebsd, diff --git a/cpu-all.h b/cpu-all.h index c9c51b83ac..d6b2b19743 100644 --- a/cpu-all.h +++ b/cpu-all.h @@ -180,7 +180,7 @@ static inline void tswap64s(uint64_t *s) #if defined(CONFIG_USER_ONLY) #include -#include "qemu-types.h" +#include "qemu-user-types.h" /* On some host systems the guest address space is reserved on the host. * This allows the guest address space to be offset to a convenient location. diff --git a/linux-user/qemu.h b/linux-user/qemu.h index 5e53dca09e..ceddb3ce72 100644 --- a/linux-user/qemu.h +++ b/linux-user/qemu.h @@ -11,7 +11,7 @@ #include #endif /* DEBUG_REMAP */ -#include "qemu-types.h" +#include "qemu-user-types.h" #include "thunk.h" #include "syscall_defs.h" diff --git a/qemu-types.h b/qemu-user-types.h similarity index 100% rename from qemu-types.h rename to qemu-user-types.h From 90f0cfa410544727ac4e9c130f9e5032e1fb9b71 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Tue, 23 Oct 2012 21:19:18 -0200 Subject: [PATCH 034/300] ui/vnc-palette.c: Include headers it needs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Include: - for g_malloc0() - for memset() Some of those headers were probably being included by accident because some other headers were including qemu-common.h, but those headers should eventually stop including qemu-common.h. Signed-off-by: Eduardo Habkost Signed-off-by: Andreas Färber --- ui/vnc-palette.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/vnc-palette.c b/ui/vnc-palette.c index 63d5f64917..c130deee9d 100644 --- a/ui/vnc-palette.c +++ b/ui/vnc-palette.c @@ -27,6 +27,8 @@ */ #include "vnc-palette.h" +#include +#include static VncPaletteEntry *palette_find(const VncPalette *palette, uint32_t color, unsigned int hash) From ccff63cac4f0d391187c9ee9aa2cab754df80c41 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Tue, 23 Oct 2012 21:35:44 -0200 Subject: [PATCH 035/300] qapi/qmp-registry.c: Include headers it needs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Include: - for g_malloc0() - for strcmp() Some of those headers were probably being included by accident because some other headers were including qemu-common.h, but those headers should eventually stop including qemu-common.h. Signed-off-by: Eduardo Habkost Signed-off-by: Andreas Färber --- qapi/qmp-registry.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qapi/qmp-registry.c b/qapi/qmp-registry.c index 5414613377..c2c31b420d 100644 --- a/qapi/qmp-registry.c +++ b/qapi/qmp-registry.c @@ -12,6 +12,8 @@ * */ +#include +#include #include "qapi/qmp-core.h" static QTAILQ_HEAD(QmpCommandList, QmpCommand) qmp_commands = From 4d4922c339abf67e47c79068d343ed41a020b8e2 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Tue, 23 Oct 2012 21:37:20 -0200 Subject: [PATCH 036/300] qga/channel-posix.c: Include headers it needs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Include: - for errno - & for fcntl() - for exit() - "osdep.h" for qemu_open() Some of those headers were probably being included by accident because some other headers were including qemu-common.h, but those headers should eventually stop including qemu-common.h. Signed-off-by: Eduardo Habkost Signed-off-by: Igor Mammedov Signed-off-by: Andreas Färber --- qga/channel-posix.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/qga/channel-posix.c b/qga/channel-posix.c index d152827bcf..769a559456 100644 --- a/qga/channel-posix.c +++ b/qga/channel-posix.c @@ -1,5 +1,10 @@ #include #include +#include +#include +#include +#include +#include "osdep.h" #include "qemu_socket.h" #include "qga/channel.h" From cad32159663c5910098e10d64f4b5b10648b0095 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Tue, 23 Oct 2012 21:55:19 -0200 Subject: [PATCH 037/300] qlist.h: Do not include qemu-common.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I don't know why it was including it, as I don't see any code that depends on anything from qemu-common.h. Signed-off-by: Eduardo Habkost Signed-off-by: Andreas Färber --- qlist.h | 1 - 1 file changed, 1 deletion(-) diff --git a/qlist.h b/qlist.h index ae776f99c3..74089471df 100644 --- a/qlist.h +++ b/qlist.h @@ -15,7 +15,6 @@ #include "qobject.h" #include "qemu-queue.h" -#include "qemu-common.h" #include "qemu-queue.h" typedef struct QListEntry { From 394e1bb79591c2fbfc873e5ccc38e92a3ba992cf Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Tue, 23 Oct 2012 21:41:52 -0200 Subject: [PATCH 038/300] Create qemu-types.h for struct typedefs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of keeping all those struct typedefs in qemu-common.h, move it to a header that can be safely included by other headers, containing only the struct typedefs and not pulling in other dependencies. Also, move some of the qdev-core.h typedefs to the new file, too, so other headers don't need to include qdev-core.h only because of DeviceState and other typedefs. This will help us remove qemu-common.h dependencies from some headers later. Signed-off-by: Eduardo Habkost Signed-off-by: Andreas Färber --- hw/qdev-core.h | 11 +-------- qemu-common.h | 52 +----------------------------------------- qemu-types.h | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 61 deletions(-) create mode 100644 qemu-types.h diff --git a/hw/qdev-core.h b/hw/qdev-core.h index fff7f0f5ab..d672ccafe6 100644 --- a/hw/qdev-core.h +++ b/hw/qdev-core.h @@ -3,20 +3,11 @@ #include "qemu-queue.h" #include "qemu-option.h" +#include "qemu-types.h" #include "qemu/object.h" #include "hw/irq.h" #include "error.h" -typedef struct Property Property; - -typedef struct PropertyInfo PropertyInfo; - -typedef struct CompatProperty CompatProperty; - -typedef struct BusState BusState; - -typedef struct BusClass BusClass; - enum DevState { DEV_STATE_CREATED = 1, DEV_STATE_INITIALIZED, diff --git a/qemu-common.h b/qemu-common.h index cef264cc85..e67478607b 100644 --- a/qemu-common.h +++ b/qemu-common.h @@ -14,6 +14,7 @@ #include "compiler.h" #include "config-host.h" +#include "qemu-types.h" #if defined(__arm__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__) || defined(__ia64__) #define WORDS_ALIGNED @@ -21,15 +22,6 @@ #define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR) -typedef struct QEMUTimer QEMUTimer; -typedef struct QEMUFile QEMUFile; -typedef struct QEMUBH QEMUBH; -typedef struct DeviceState DeviceState; - -struct Monitor; -typedef struct Monitor Monitor; -typedef struct MigrationParams MigrationParams; - /* we put basic includes here to avoid repeating them in device drivers */ #include #include @@ -258,48 +250,6 @@ struct ParallelIOArg { typedef int (*DMA_transfer_handler) (void *opaque, int nchan, int pos, int size); -/* A load of opaque types so that device init declarations don't have to - pull in all the real definitions. */ -typedef struct NICInfo NICInfo; -typedef struct HCIInfo HCIInfo; -typedef struct AudioState AudioState; -typedef struct BlockDriverState BlockDriverState; -typedef struct DriveInfo DriveInfo; -typedef struct DisplayState DisplayState; -typedef struct DisplayChangeListener DisplayChangeListener; -typedef struct DisplaySurface DisplaySurface; -typedef struct PixelFormat PixelFormat; -typedef struct QemuConsole QemuConsole; -typedef struct CharDriverState CharDriverState; -typedef struct MACAddr MACAddr; -typedef struct NetClientState NetClientState; -typedef struct i2c_bus i2c_bus; -typedef struct ISABus ISABus; -typedef struct ISADevice ISADevice; -typedef struct SMBusDevice SMBusDevice; -typedef struct PCIHostState PCIHostState; -typedef struct PCIExpressHost PCIExpressHost; -typedef struct PCIBus PCIBus; -typedef struct PCIDevice PCIDevice; -typedef struct PCIExpressDevice PCIExpressDevice; -typedef struct PCIBridge PCIBridge; -typedef struct PCIEAERMsg PCIEAERMsg; -typedef struct PCIEAERLog PCIEAERLog; -typedef struct PCIEAERErr PCIEAERErr; -typedef struct PCIEPort PCIEPort; -typedef struct PCIESlot PCIESlot; -typedef struct MSIMessage MSIMessage; -typedef struct SerialState SerialState; -typedef struct PCMCIACardState PCMCIACardState; -typedef struct MouseTransformInfo MouseTransformInfo; -typedef struct uWireSlave uWireSlave; -typedef struct I2SCodec I2SCodec; -typedef struct SSIBus SSIBus; -typedef struct EventNotifier EventNotifier; -typedef struct VirtIODevice VirtIODevice; -typedef struct QEMUSGList QEMUSGList; -typedef struct SHPCDevice SHPCDevice; - typedef uint64_t pcibus_t; typedef enum LostTickPolicy { diff --git a/qemu-types.h b/qemu-types.h new file mode 100644 index 0000000000..fd532a268d --- /dev/null +++ b/qemu-types.h @@ -0,0 +1,61 @@ +#ifndef QEMU_TYPEDEFS_H +#define QEMU_TYPEDEFS_H + +/* A load of opaque types so that device init declarations don't have to + pull in all the real definitions. */ +typedef struct QEMUTimer QEMUTimer; +typedef struct QEMUFile QEMUFile; +typedef struct QEMUBH QEMUBH; + +struct Monitor; +typedef struct Monitor Monitor; +typedef struct MigrationParams MigrationParams; + +typedef struct Property Property; +typedef struct PropertyInfo PropertyInfo; +typedef struct CompatProperty CompatProperty; +typedef struct DeviceState DeviceState; +typedef struct BusState BusState; +typedef struct BusClass BusClass; + +typedef struct NICInfo NICInfo; +typedef struct HCIInfo HCIInfo; +typedef struct AudioState AudioState; +typedef struct BlockDriverState BlockDriverState; +typedef struct DriveInfo DriveInfo; +typedef struct DisplayState DisplayState; +typedef struct DisplayChangeListener DisplayChangeListener; +typedef struct DisplaySurface DisplaySurface; +typedef struct PixelFormat PixelFormat; +typedef struct QemuConsole QemuConsole; +typedef struct CharDriverState CharDriverState; +typedef struct MACAddr MACAddr; +typedef struct NetClientState NetClientState; +typedef struct i2c_bus i2c_bus; +typedef struct ISABus ISABus; +typedef struct ISADevice ISADevice; +typedef struct SMBusDevice SMBusDevice; +typedef struct PCIHostState PCIHostState; +typedef struct PCIExpressHost PCIExpressHost; +typedef struct PCIBus PCIBus; +typedef struct PCIDevice PCIDevice; +typedef struct PCIExpressDevice PCIExpressDevice; +typedef struct PCIBridge PCIBridge; +typedef struct PCIEAERMsg PCIEAERMsg; +typedef struct PCIEAERLog PCIEAERLog; +typedef struct PCIEAERErr PCIEAERErr; +typedef struct PCIEPort PCIEPort; +typedef struct PCIESlot PCIESlot; +typedef struct MSIMessage MSIMessage; +typedef struct SerialState SerialState; +typedef struct PCMCIACardState PCMCIACardState; +typedef struct MouseTransformInfo MouseTransformInfo; +typedef struct uWireSlave uWireSlave; +typedef struct I2SCodec I2SCodec; +typedef struct SSIBus SSIBus; +typedef struct EventNotifier EventNotifier; +typedef struct VirtIODevice VirtIODevice; +typedef struct QEMUSGList QEMUSGList; +typedef struct SHPCDevice SHPCDevice; + +#endif /* QEMU_TYPEDEFS_H */ From bcf7930105c26d09ae83cbd8b982d01bb421f215 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Tue, 23 Oct 2012 21:44:08 -0200 Subject: [PATCH 039/300] sysemu.h: Include qemu-types.h instead of qemu-common.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It just needs the Monitor and DeviceState typedefs, so it doesn't need all of qemu-common.h. Signed-off-by: Eduardo Habkost Signed-off-by: Andreas Färber --- sysemu.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sysemu.h b/sysemu.h index f5ac664067..ab1ef8be5f 100644 --- a/sysemu.h +++ b/sysemu.h @@ -2,7 +2,7 @@ #define SYSEMU_H /* Misc. things related to the system emulator. */ -#include "qemu-common.h" +#include "qemu-types.h" #include "qemu-option.h" #include "qemu-queue.h" #include "qemu-timer.h" From 23e3fbec3355e67dbf26e98bbe33ef354097df8e Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Tue, 4 Dec 2012 11:19:34 -0200 Subject: [PATCH 040/300] qdev: qdev_create(): use error_report() instead of hw_error() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit hw_error() is specific for fatal hardware emulation errors, not for internal errors related to the qdev object/class abstraction or object initialization. Replace it with an error_report() call, followed by abort(). This will also help reduce dependencies of the qdev code (as hw_error() is from cpus.o, and depends on the CPU list from exec.o). Signed-off-by: Eduardo Habkost Signed-off-by: Andreas Färber --- hw/qdev.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/hw/qdev.c b/hw/qdev.c index 788b4da55c..599382cab2 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -109,10 +109,12 @@ DeviceState *qdev_create(BusState *bus, const char *name) dev = qdev_try_create(bus, name); if (!dev) { if (bus) { - hw_error("Unknown device '%s' for bus '%s'\n", name, - object_get_typename(OBJECT(bus))); + error_report("Unknown device '%s' for bus '%s'\n", name, + object_get_typename(OBJECT(bus))); + abort(); } else { - hw_error("Unknown device '%s' for default sysbus\n", name); + error_report("Unknown device '%s' for default sysbus\n", name); + abort(); } } From 9f3fb5657b2133a408ccf40b4ab57dec9b4ce771 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Tue, 4 Dec 2012 17:34:38 -0200 Subject: [PATCH 041/300] target-i386/cpu.c: Coding style fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Use spaces instead of tabs on cpu_x86_cpuid(). - Use braces on 'if' statement cpu_x86_find_by_name(). Signed-off-by: Eduardo Habkost Reviewed-by: Igor Mammedov Signed-off-by: Andreas Färber --- target-i386/cpu.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index c6c2ca03a1..754af6840b 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1215,7 +1215,7 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model) char *s = g_strdup(cpu_model); char *featurestr, *name = strtok(s, ","); - /* Features to be added*/ + /* Features to be added */ uint32_t plus_features = 0, plus_ext_features = 0; uint32_t plus_ext2_features = 0, plus_ext3_features = 0; uint32_t plus_kvm_features = kvm_default_features, plus_svm_features = 0; @@ -1227,9 +1227,11 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model) uint32_t minus_7_0_ebx_features = 0; uint32_t numvalue; - for (def = x86_defs; def; def = def->next) - if (name && !strcmp(name, def->name)) + for (def = x86_defs; def; def = def->next) { + if (name && !strcmp(name, def->name)) { break; + } + } if (kvm_enabled() && name && strcmp(name, "host") == 0) { kvm_cpu_fill_host(x86_cpu_def); } else if (!def) { @@ -1835,17 +1837,17 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, } break; case 0x8000000A: - if (env->cpuid_ext3_features & CPUID_EXT3_SVM) { - *eax = 0x00000001; /* SVM Revision */ - *ebx = 0x00000010; /* nr of ASIDs */ - *ecx = 0; - *edx = env->cpuid_svm_features; /* optional features */ - } else { - *eax = 0; - *ebx = 0; - *ecx = 0; - *edx = 0; - } + if (env->cpuid_ext3_features & CPUID_EXT3_SVM) { + *eax = 0x00000001; /* SVM Revision */ + *ebx = 0x00000010; /* nr of ASIDs */ + *ecx = 0; + *edx = env->cpuid_svm_features; /* optional features */ + } else { + *eax = 0; + *ebx = 0; + *ecx = 0; + *edx = 0; + } break; case 0xC0000000: *eax = env->cpuid_xlevel2; From 8f961357d06a0beeb7d3efbde1d754d82ff6a300 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Tue, 4 Dec 2012 17:34:39 -0200 Subject: [PATCH 042/300] target-i386: Separate feature string parsing from CPU model lookup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of parsing the whole cpu_model string inside cpu_x86_find_by_name(), first split it into the CPU model name and the full feature string, then parse the feature string into pieces. When using CPU model classes, those two pieces of information will be used at different moments (CPU model name will be used to find CPU class, feature string will be used after CPU object was created), so making the split in two steps will make it easier to refactor the code later. This should also help on the CPU properties work, that will just need to replace the cpu_x86_parse_featurestr() logic (and can keep the CPU model lookup code as-is). Signed-off-by: Eduardo Habkost Reviewed-by: Igor Mammedov Signed-off-by: Andreas Färber --- target-i386/cpu.c | 69 +++++++++++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 754af6840b..7877df174e 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1208,13 +1208,32 @@ static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, void *opaque, cpu->env.tsc_khz = value / 1000; } -static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model) +static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *name) { - unsigned int i; x86_def_t *def; - char *s = g_strdup(cpu_model); - char *featurestr, *name = strtok(s, ","); + for (def = x86_defs; def; def = def->next) { + if (name && !strcmp(name, def->name)) { + break; + } + } + if (kvm_enabled() && name && strcmp(name, "host") == 0) { + kvm_cpu_fill_host(x86_cpu_def); + } else if (!def) { + return -1; + } else { + memcpy(x86_cpu_def, def, sizeof(*def)); + } + + return 0; +} + +/* Parse "+feature,-feature,feature=foo" CPU feature string + */ +static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features) +{ + unsigned int i; + char *featurestr; /* Single 'key=value" string being parsed */ /* Features to be added */ uint32_t plus_features = 0, plus_ext_features = 0; uint32_t plus_ext2_features = 0, plus_ext3_features = 0; @@ -1227,24 +1246,11 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model) uint32_t minus_7_0_ebx_features = 0; uint32_t numvalue; - for (def = x86_defs; def; def = def->next) { - if (name && !strcmp(name, def->name)) { - break; - } - } - if (kvm_enabled() && name && strcmp(name, "host") == 0) { - kvm_cpu_fill_host(x86_cpu_def); - } else if (!def) { - goto error; - } else { - memcpy(x86_cpu_def, def, sizeof(*def)); - } - add_flagname_to_bitmaps("hypervisor", &plus_features, &plus_ext_features, &plus_ext2_features, &plus_ext3_features, &plus_kvm_features, &plus_svm_features, &plus_7_0_ebx_features); - featurestr = strtok(NULL, ","); + featurestr = features ? strtok(features, ",") : NULL; while (featurestr) { char *val; @@ -1378,11 +1384,9 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model) if (x86_cpu_def->cpuid_7_0_ebx_features && x86_cpu_def->level < 7) { x86_cpu_def->level = 7; } - g_free(s); return 0; error: - g_free(s); return -1; } @@ -1492,11 +1496,25 @@ int cpu_x86_register(X86CPU *cpu, const char *cpu_model) CPUX86State *env = &cpu->env; x86_def_t def1, *def = &def1; Error *error = NULL; + char *name, *features; + gchar **model_pieces; memset(def, 0, sizeof(*def)); - if (cpu_x86_find_by_name(def, cpu_model) < 0) - return -1; + model_pieces = g_strsplit(cpu_model, ",", 2); + if (!model_pieces[0]) { + goto error; + } + name = model_pieces[0]; + features = model_pieces[1]; + + if (cpu_x86_find_by_name(def, name) < 0) { + goto error; + } + + if (cpu_x86_parse_featurestr(def, features) < 0) { + goto error; + } if (def->vendor1) { env->cpuid_vendor1 = def->vendor1; env->cpuid_vendor2 = def->vendor2; @@ -1553,9 +1571,14 @@ int cpu_x86_register(X86CPU *cpu, const char *cpu_model) if (error) { fprintf(stderr, "%s\n", error_get_pretty(error)); error_free(error); - return -1; + goto error; } + + g_strfreev(model_pieces); return 0; +error: + g_strfreev(model_pieces); + return -1; } #if !defined(CONFIG_USER_ONLY) From 9df694eeb8447ae5a302b4d40df9a8b91dfc61da Mon Sep 17 00:00:00 2001 From: Igor Mammedov Date: Mon, 22 Oct 2012 17:03:10 +0200 Subject: [PATCH 043/300] target-i386: Use define for cpuid vendor string size MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Igor Mammedov Reviewed-by: Eduardo Habkost Signed-off-by: Andreas Färber --- target-i386/cpu.c | 6 +++--- target-i386/cpu.h | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 7877df174e..a631ae9c87 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1106,13 +1106,13 @@ static char *x86_cpuid_get_vendor(Object *obj, Error **errp) char *value; int i; - value = (char *)g_malloc(12 + 1); + value = (char *)g_malloc(CPUID_VENDOR_SZ + 1); for (i = 0; i < 4; i++) { value[i ] = env->cpuid_vendor1 >> (8 * i); value[i + 4] = env->cpuid_vendor2 >> (8 * i); value[i + 8] = env->cpuid_vendor3 >> (8 * i); } - value[12] = '\0'; + value[CPUID_VENDOR_SZ] = '\0'; return value; } @@ -1123,7 +1123,7 @@ static void x86_cpuid_set_vendor(Object *obj, const char *value, CPUX86State *env = &cpu->env; int i; - if (strlen(value) != 12) { + if (strlen(value) != CPUID_VENDOR_SZ) { error_set(errp, QERR_PROPERTY_VALUE_BAD, "", "vendor", value); return; diff --git a/target-i386/cpu.h b/target-i386/cpu.h index 90ef1ff1e2..386c4f6d98 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -510,6 +510,8 @@ #define CPUID_7_0_EBX_ADX (1 << 19) #define CPUID_7_0_EBX_SMAP (1 << 20) +#define CPUID_VENDOR_SZ 12 + #define CPUID_VENDOR_INTEL_1 0x756e6547 /* "Genu" */ #define CPUID_VENDOR_INTEL_2 0x49656e69 /* "ineI" */ #define CPUID_VENDOR_INTEL_3 0x6c65746e /* "ntel" */ From 038d3d44598232f5aad40d1c84c215f38a21576c Mon Sep 17 00:00:00 2001 From: Peter Crosthwaite Date: Thu, 15 Nov 2012 16:32:53 +1000 Subject: [PATCH 044/300] sd: Send debug printfery to stderr not stdout Some debug printfs for SD are coming up in stdout. Redirected them to stderr instead. Signed-off-by: Peter Crosthwaite Reviewed-by: Peter Maydell Signed-off-by: Stefan Hajnoczi --- hw/sd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/sd.c b/hw/sd.c index 3c34d43ad4..607edba9c8 100644 --- a/hw/sd.c +++ b/hw/sd.c @@ -1439,8 +1439,8 @@ send_response: int i; DPRINTF("Response:"); for (i = 0; i < rsplen; i++) - printf(" %02x", response[i]); - printf(" state %d\n", sd->state); + fprintf(stderr, " %02x", response[i]); + fprintf(stderr, " state %d\n", sd->state); } else { DPRINTF("No response %d\n", sd->state); } From bb5b5c20b7f68c79e036cd3ec5e9e6362c112670 Mon Sep 17 00:00:00 2001 From: Peter Maydell Date: Sat, 20 Oct 2012 20:37:04 +0100 Subject: [PATCH 045/300] configure: Remove stray debug output Rather than printing a message saying we're silently falling back to gthread coroutines when running on MacOS, actually do it silently. Signed-off-by: Peter Maydell Signed-off-by: Stefan Hajnoczi --- configure | 2 -- 1 file changed, 2 deletions(-) diff --git a/configure b/configure index 994f7310b8..447e6ed976 100755 --- a/configure +++ b/configure @@ -2969,8 +2969,6 @@ EOF else coroutine_backend=gthread fi - else - echo "Silently falling back into gthread backend under darwin" fi elif test "$coroutine" = "gthread" ; then coroutine_backend=gthread From eac29d87c883fcbb54913ae20ed2bdccb4bcf7a3 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Fri, 2 Nov 2012 08:14:12 +0100 Subject: [PATCH 046/300] Fix spelling (prefered -> preferred) Signed-off-by: Stefan Weil Signed-off-by: Stefan Hajnoczi --- configure | 2 +- net/tap-win32.c | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/configure b/configure index 447e6ed976..79605d2b75 100755 --- a/configure +++ b/configure @@ -2130,7 +2130,7 @@ if test "$pixman" = "system"; then else if test ! -d ${source_path}/pixman/pixman; then echo "ERROR: pixman not present. Your options:" - echo " (1) Prefered: Install the pixman devel package (any recent" + echo " (1) Preferred: Install the pixman devel package (any recent" echo " distro should have packages as Xorg needs pixman too)." echo " (2) Fetch the pixman submodule, using:" echo " git submodule update --init pixman" diff --git a/net/tap-win32.c b/net/tap-win32.c index 8d2d32b1c3..f9bd74109c 100644 --- a/net/tap-win32.c +++ b/net/tap-win32.c @@ -565,7 +565,7 @@ static void tap_win32_free_buffer(tap_win32_overlapped_t *overlapped, } static int tap_win32_open(tap_win32_overlapped_t **phandle, - const char *prefered_name) + const char *preferred_name) { char device_path[256]; char device_guid[0x100]; @@ -581,8 +581,9 @@ static int tap_win32_open(tap_win32_overlapped_t **phandle, DWORD version_len; DWORD idThread; - if (prefered_name != NULL) - snprintf(name_buffer, sizeof(name_buffer), "%s", prefered_name); + if (preferred_name != NULL) { + snprintf(name_buffer, sizeof(name_buffer), "%s", preferred_name); + } rc = get_device_guid(device_guid, sizeof(device_guid), name_buffer, sizeof(name_buffer)); if (rc) From a93cf9dfba171aa94e3c4002d58abef2a3732bfb Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Fri, 2 Nov 2012 08:29:53 +0100 Subject: [PATCH 047/300] Fix comments (adress -> address, layed -> laid, wierd -> weird) Remove also a duplicated 'the'. Signed-off-by: Stefan Weil Signed-off-by: Stefan Hajnoczi --- slirp/ip_icmp.c | 2 +- tcg/tcg.h | 4 ++-- uri.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/slirp/ip_icmp.c b/slirp/ip_icmp.c index d571fd0b76..9f1cb08a18 100644 --- a/slirp/ip_icmp.c +++ b/slirp/ip_icmp.c @@ -352,7 +352,7 @@ icmp_error(struct mbuf *msrc, u_char type, u_char code, int minsize, ip->ip_ttl = MAXTTL; ip->ip_p = IPPROTO_ICMP; - ip->ip_dst = ip->ip_src; /* ip adresses */ + ip->ip_dst = ip->ip_src; /* ip addresses */ ip->ip_src = m->slirp->vhost_addr; (void ) ip_output((struct socket *)NULL, m); diff --git a/tcg/tcg.h b/tcg/tcg.h index 9481e35ab4..e7de8c00a3 100644 --- a/tcg/tcg.h +++ b/tcg/tcg.h @@ -290,8 +290,8 @@ typedef int TCGv_i64; #define TCG_CALL_DUMMY_TCGV MAKE_TCGV_I32(-1) #define TCG_CALL_DUMMY_ARG ((TCGArg)(-1)) -/* Conditions. Note that these are layed out for easy manipulation by - the the functions below: +/* Conditions. Note that these are laid out for easy manipulation by + the functions below: bit 0 is used for inverting; bit 1 is signed, bit 2 is unsigned, diff --git a/uri.c b/uri.c index dd922de339..138547b821 100644 --- a/uri.c +++ b/uri.c @@ -432,7 +432,7 @@ rfc3986_parse_host(URI *uri, const char **str) host = cur; /* - * IPv6 and future adressing scheme are enclosed between brackets + * IPv6 and future addressing scheme are enclosed between brackets */ if (*cur == '[') { cur++; @@ -1917,7 +1917,7 @@ done: * http://site1.com/docs/pic1.gif http://site1.com/docs/pic1.gif * * - * Note: if the URI reference is really wierd or complicated, it may be + * Note: if the URI reference is really weird or complicated, it may be * worthwhile to first convert it into a "nice" one by calling * uri_resolve (using 'base') before calling this routine, * since this routine (for reasonable efficiency) assumes URI has From 8367a14fd3c1ecd5551c91cd3f951ffc61ad7c12 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Fri, 2 Nov 2012 08:35:54 +0100 Subject: [PATCH 048/300] s390x: Spelling fixes (endianess -> endianness, occured -> occurred) Replace also "write into" by "write to". Signed-off-by: Stefan Weil Signed-off-by: Stefan Hajnoczi --- hw/s390x/sclp.h | 4 ++-- hw/s390x/sclpconsole.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/hw/s390x/sclp.h b/hw/s390x/sclp.h index fe89dadd68..231a38aa09 100644 --- a/hw/s390x/sclp.h +++ b/hw/s390x/sclp.h @@ -51,7 +51,7 @@ /* * Normally packed structures are not the right thing to do, since all code - * must take care of endianess. We cant use ldl_phys and friends for two + * must take care of endianness. We cannot use ldl_phys and friends for two * reasons, though: * - some of the embedded structures below the SCCB can appear multiple times * at different locations, so there is no fixed offset @@ -60,7 +60,7 @@ * alter the structure while we parse it. We cannot use ldl_p and friends * either without doing pointer arithmetics * So we have to double check that all users of sclp data structures use the - * right endianess wrappers. + * right endianness wrappers. */ typedef struct SCCBHeader { uint16_t length; diff --git a/hw/s390x/sclpconsole.c b/hw/s390x/sclpconsole.c index 0ec5623f57..fece878e88 100644 --- a/hw/s390x/sclpconsole.c +++ b/hw/s390x/sclpconsole.c @@ -179,8 +179,8 @@ static int read_event_data(SCLPEvent *event, EventBufferHeader *evt_buf_hdr, } /* triggered by SCLP's write_event_data - * - write console data into character layer - * returns < 0 if an error occured + * - write console data to character layer + * returns < 0 if an error occurred */ static ssize_t write_console_data(SCLPEvent *event, const uint8_t *buf, size_t len) From c47d08ceff8ac76ff857016c80a8864fcf45a7d6 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Fri, 2 Nov 2012 08:36:35 +1100 Subject: [PATCH 049/300] target-alpha: Remove t0, t1 from CPUAlphaState These fields are no longer (or were never?) used. Signed-off-by: Richard Henderson Signed-off-by: Stefan Hajnoczi --- target-alpha/cpu.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/target-alpha/cpu.h b/target-alpha/cpu.h index 34221fb184..9939d61ca8 100644 --- a/target-alpha/cpu.h +++ b/target-alpha/cpu.h @@ -280,13 +280,6 @@ struct CPUAlphaState { struct QEMUTimer *alarm_timer; uint64_t alarm_expire; -#if TARGET_LONG_BITS > HOST_LONG_BITS - /* temporary fixed-point registers - * used to emulate 64 bits target on 32 bits hosts - */ - target_ulong t0, t1; -#endif - /* Those resources are used only in QEMU core */ CPU_COMMON From d694516440ca31bbcc7ad73f5e99b45fbeb2a6e6 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Fri, 2 Nov 2012 08:36:36 +1100 Subject: [PATCH 050/300] target-m68k: Remove t1 from CPUM68KState This field is no longer used. Cc: Paul Brook Signed-off-by: Richard Henderson Signed-off-by: Stefan Hajnoczi --- target-m68k/cpu.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/target-m68k/cpu.h b/target-m68k/cpu.h index 780e2c94e7..f4fcdeee7a 100644 --- a/target-m68k/cpu.h +++ b/target-m68k/cpu.h @@ -103,9 +103,6 @@ typedef struct CPUM68KState { uint32_t rambar0; uint32_t cacr; - /* ??? remove this. */ - uint32_t t1; - int pending_vector; int pending_level; From dee17bf9e5d29bd08592c6fc47541aad70444bbc Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Fri, 2 Nov 2012 08:36:37 +1100 Subject: [PATCH 051/300] target-sparc: Remove t0, t1 from CPUSPARCState These fields are no longer used. Cc: Blue Swirl Signed-off-by: Richard Henderson Signed-off-by: Stefan Hajnoczi --- target-sparc/cpu.h | 1 - 1 file changed, 1 deletion(-) diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h index 042d52a310..375f20a71e 100644 --- a/target-sparc/cpu.h +++ b/target-sparc/cpu.h @@ -392,7 +392,6 @@ struct CPUSPARCState { target_ulong cc_dst; uint32_t cc_op; - target_ulong t0, t1; /* temporaries live across basic blocks */ target_ulong cond; /* conditional branch result (XXX: save it in a temporary register when possible) */ From 036f0f8356936dba36b952c16f477b3f04f54e37 Mon Sep 17 00:00:00 2001 From: Peter Crosthwaite Date: Mon, 19 Nov 2012 15:13:49 +1000 Subject: [PATCH 052/300] arm: a9mpcore: remove un-used ptimer_iomem field I'm guessing this is a hangover from a previous coreification of the mptimer sub-module. This field is completely unused - removed. Signed-off-by: Peter Crosthwaite Reviewed-by: Peter Maydell Signed-off-by: Stefan Hajnoczi --- hw/a9mpcore.c | 1 - 1 file changed, 1 deletion(-) diff --git a/hw/a9mpcore.c b/hw/a9mpcore.c index 824ff0a4de..f802de0824 100644 --- a/hw/a9mpcore.c +++ b/hw/a9mpcore.c @@ -19,7 +19,6 @@ typedef struct a9mp_priv_state { uint32_t old_timer_status[8]; uint32_t num_cpu; MemoryRegion scu_iomem; - MemoryRegion ptimer_iomem; MemoryRegion container; DeviceState *mptimer; DeviceState *gic; From 4dbd84e26f53d3283baa463f390f9623e8913e8f Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Thu, 22 Nov 2012 15:16:36 +0100 Subject: [PATCH 053/300] Clean up pci_drive_hot_add()'s use of BlockInterfaceType pci_drive_hot_add() parameter type has the wrong type: int instead of BlockInterfaceType. It's actually redundant, so we can just drop it. Signed-off-by: Markus Armbruster Signed-off-by: Stefan Hajnoczi --- hw/device-hotplug.c | 11 ++++------- hw/pci-hotplug.c | 7 +++---- sysemu.h | 3 +-- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/hw/device-hotplug.c b/hw/device-hotplug.c index eec0fe3148..6d9c080381 100644 --- a/hw/device-hotplug.c +++ b/hw/device-hotplug.c @@ -49,18 +49,16 @@ DriveInfo *add_init_drive(const char *optstr) } #if !defined(TARGET_I386) -int pci_drive_hot_add(Monitor *mon, const QDict *qdict, - DriveInfo *dinfo, int type) +int pci_drive_hot_add(Monitor *mon, const QDict *qdict, DriveInfo *dinfo) { /* On non-x86 we don't do PCI hotplug */ - monitor_printf(mon, "Can't hot-add drive to type %d\n", type); + monitor_printf(mon, "Can't hot-add drive to type %d\n", dinfo->type); return -1; } #endif void drive_hot_add(Monitor *mon, const QDict *qdict) { - int type; DriveInfo *dinfo = NULL; const char *opts = qdict_get_str(qdict, "opts"); @@ -72,14 +70,13 @@ void drive_hot_add(Monitor *mon, const QDict *qdict) monitor_printf(mon, "Parameter addr not supported\n"); goto err; } - type = dinfo->type; - switch (type) { + switch (dinfo->type) { case IF_NONE: monitor_printf(mon, "OK\n"); break; default: - if (pci_drive_hot_add(mon, qdict, dinfo, type)) { + if (pci_drive_hot_add(mon, qdict, dinfo)) { goto err; } } diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c index 0ca5546fc6..3bcfdcc1a6 100644 --- a/hw/pci-hotplug.c +++ b/hw/pci-hotplug.c @@ -111,15 +111,14 @@ static int scsi_hot_add(Monitor *mon, DeviceState *adapter, return 0; } -int pci_drive_hot_add(Monitor *mon, const QDict *qdict, - DriveInfo *dinfo, int type) +int pci_drive_hot_add(Monitor *mon, const QDict *qdict, DriveInfo *dinfo) { int dom, pci_bus; unsigned slot; PCIDevice *dev; const char *pci_addr = qdict_get_str(qdict, "pci_addr"); - switch (type) { + switch (dinfo->type) { case IF_SCSI: if (pci_read_devaddr(mon, pci_addr, &dom, &pci_bus, &slot)) { goto err; @@ -135,7 +134,7 @@ int pci_drive_hot_add(Monitor *mon, const QDict *qdict, } break; default: - monitor_printf(mon, "Can't hot-add drive to type %d\n", type); + monitor_printf(mon, "Can't hot-add drive to type %d\n", dinfo->type); goto err; } diff --git a/sysemu.h b/sysemu.h index f5ac664067..c1b370b781 100644 --- a/sysemu.h +++ b/sysemu.h @@ -145,8 +145,7 @@ extern unsigned int nb_prom_envs; /* pci-hotplug */ void pci_device_hot_add(Monitor *mon, const QDict *qdict); -int pci_drive_hot_add(Monitor *mon, const QDict *qdict, - DriveInfo *dinfo, int type); +int pci_drive_hot_add(Monitor *mon, const QDict *qdict, DriveInfo *dinfo); void do_pci_device_hot_remove(Monitor *mon, const QDict *qdict); /* generic hotplug */ From 993d46ce7e54f3d035d344ed1b145b13f9ac54b9 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Fri, 23 Nov 2012 07:26:04 +0100 Subject: [PATCH 054/300] Fix spelling in comments and documentation These spelling bugs were found by codespell: supressing -> suppressing transfered -> transferred Signed-off-by: Stefan Weil Signed-off-by: Stefan Hajnoczi --- hw/usb.h | 6 +++--- tests/qemu-iotests/iotests.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/hw/usb.h b/hw/usb.h index 7d6de69ec4..f05eb1797f 100644 --- a/hw/usb.h +++ b/hw/usb.h @@ -282,7 +282,7 @@ typedef struct USBDeviceClass { * Called from handle_packet(). * * Status gets stored in p->status, and if p->status == USB_RET_SUCCESS - * then the number of bytes transfered is stored in p->actual_length + * then the number of bytes transferred is stored in p->actual_length */ void (*handle_control)(USBDevice *dev, USBPacket *p, int request, int value, int index, int length, uint8_t *data); @@ -292,7 +292,7 @@ typedef struct USBDeviceClass { * Called from handle_packet(). * * Status gets stored in p->status, and if p->status == USB_RET_SUCCESS - * then the number of bytes transfered is stored in p->actual_length + * then the number of bytes transferred is stored in p->actual_length */ void (*handle_data)(USBDevice *dev, USBPacket *p); @@ -358,7 +358,7 @@ struct USBPacket { bool short_not_ok; bool int_req; int status; /* USB_RET_* status code */ - int actual_length; /* Number of bytes actually transfered */ + int actual_length; /* Number of bytes actually transferred */ /* Internal use by the USB layer. */ USBPacketState state; USBCombinedPacket *combined; diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py index b2eaf20f0b..0be5c7e13f 100644 --- a/tests/qemu-iotests/iotests.py +++ b/tests/qemu-iotests/iotests.py @@ -43,7 +43,7 @@ def qemu_img(*args): return subprocess.call(qemu_img_args + list(args), stdin=devnull, stdout=devnull) def qemu_img_verbose(*args): - '''Run qemu-img without supressing its output and return the exit code''' + '''Run qemu-img without suppressing its output and return the exit code''' return subprocess.call(qemu_img_args + list(args)) def qemu_io(*args): From 3528a3cba1f59de520fad7b1c843759e8655ea2c Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Fri, 23 Nov 2012 09:52:39 +0100 Subject: [PATCH 055/300] qemu-options: Fix space at EOL There's no need to add a space at the end of line. Moreover, it can make problems in some projects that store the help output into a file (and run couple of tests based on that) and have space at EOL forbidden. Signed-off-by: Michal Privoznik Reviewed-by: Peter Maydell Signed-off-by: Stefan Hajnoczi --- qemu-options.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qemu-options.hx b/qemu-options.hx index de43b1b48b..231cc4f55f 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -1331,7 +1331,7 @@ DEF("net", HAS_ARG, QEMU_OPTION_net, " connect the host TAP network interface to VLAN 'n'\n" #else "-net tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile][,helper=helper][,sndbuf=nbytes][,vnet_hdr=on|off][,vhost=on|off][,vhostfd=h][,vhostforce=on|off]\n" - " connect the host TAP network interface to VLAN 'n' \n" + " connect the host TAP network interface to VLAN 'n'\n" " use network scripts 'file' (default=" DEFAULT_NETWORK_SCRIPT ")\n" " to configure it and 'dfile' (default=" DEFAULT_NETWORK_DOWN_SCRIPT ")\n" " to deconfigure it\n" From 654598c944aa31cdbea435bd468055af9c918d16 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Fri, 23 Nov 2012 19:12:18 +0100 Subject: [PATCH 056/300] pc_sysfw: Plug memory leak on pc_fw_add_pflash_drv() error path Harmless, because we the error inevitably leads to another, fatal one in pc_system_flash_init(): PC system firmware (pflash) not available. Fix it anyway. Signed-off-by: Markus Armbruster Signed-off-by: Stefan Hajnoczi --- hw/pc_sysfw.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hw/pc_sysfw.c b/hw/pc_sysfw.c index 9d7c5f4003..40bced2322 100644 --- a/hw/pc_sysfw.c +++ b/hw/pc_sysfw.c @@ -98,7 +98,9 @@ static void pc_fw_add_pflash_drv(void) return; } - drive_init(opts, machine->use_scsi); + if (!drive_init(opts, machine->use_scsi)) { + qemu_opts_del(opts); + } } static void pc_system_flash_init(MemoryRegion *rom_memory, From b34d12d153e6e5c5e5e00eac510b054a94409deb Mon Sep 17 00:00:00 2001 From: Igor Mammedov Date: Mon, 22 Oct 2012 17:03:00 +0200 Subject: [PATCH 057/300] target-i386: Postpone cpuid_level update to realize time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Delay capping cpuid_level to 7 to realize time so property setters for cpuid_7_0_ebx_features and "level" could be used in any order/time between x86_cpu_initfn() and x86_cpu_realize(). Signed-off-by: Igor Mammedov Signed-off-by: Eduardo Habkost Signed-off-by: Andreas Färber --- target-i386/cpu.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index a631ae9c87..7be3ad82cb 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1381,9 +1381,6 @@ static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features) if (kvm_check_features_against_host(x86_cpu_def) && enforce_cpuid) goto error; } - if (x86_cpu_def->cpuid_7_0_ebx_features && x86_cpu_def->level < 7) { - x86_cpu_def->level = 7; - } return 0; error: @@ -2074,6 +2071,11 @@ static void x86_cpu_apic_init(X86CPU *cpu, Error **errp) void x86_cpu_realize(Object *obj, Error **errp) { X86CPU *cpu = X86_CPU(obj); + CPUX86State *env = &cpu->env; + + if (env->cpuid_7_0_ebx_features && env->cpuid_level < 7) { + env->cpuid_level = 7; + } #ifndef CONFIG_USER_ONLY qemu_register_reset(x86_cpu_machine_reset_cb, cpu); From 0be4835b4932f38167b611c2b311ebaaec98a8eb Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Fri, 2 Nov 2012 09:20:46 +1100 Subject: [PATCH 058/300] exec: Advise huge pages for the TCG code gen buffer After allocating 32MB or more contiguous memory, huge pages would seem to be ideal. Signed-off-by: Richard Henderson Signed-off-by: Blue Swirl --- exec.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/exec.c b/exec.c index 8435de0bd2..0594b07057 100644 --- a/exec.c +++ b/exec.c @@ -607,6 +607,8 @@ static inline void code_gen_alloc(size_t tb_size) exit(1); } + qemu_madvise(code_gen_buffer, code_gen_buffer_size, QEMU_MADV_HUGEPAGE); + /* Steal room for the prologue at the end of the buffer. This ensures (via the MAX_CODE_GEN_BUFFER_SIZE limits above) that direct branches from TB's to the prologue are going to be in range. It also means From 2aa1cb514cdce31ca68902d464cd03d31a76e998 Mon Sep 17 00:00:00 2001 From: Brad Smith Date: Mon, 19 Nov 2012 04:22:12 -0500 Subject: [PATCH 059/300] curses: Remove OpenBSD workaround I removed the same sort of workaround for OpenBSD within the configure script with commit 4dcc3f5876fa638d5c35bd47be3b717ea74cc2e7 but didn't bother to grep further to come across this same chunk of code in the curses code itself. So the following diff removes the same workaround chunk within the curses code. Signed-off-by: Brad Smith Signed-off-by: Blue Swirl --- ui/curses.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ui/curses.c b/ui/curses.c index b40b22307d..5dc0b2c95f 100644 --- a/ui/curses.c +++ b/ui/curses.c @@ -28,10 +28,6 @@ #include #endif -#ifdef __OpenBSD__ -#define resize_term resizeterm -#endif - #include "qemu-common.h" #include "console.h" #include "sysemu.h" From c3a43607d927e6a0ecce0b61e8297c1cfe604c14 Mon Sep 17 00:00:00 2001 From: Evgeny Voevodin Date: Wed, 21 Nov 2012 11:43:03 +0400 Subject: [PATCH 060/300] tcg/tcg.h: Duplicate global TCG gen_opc_ arrays into TCGContext. Signed-off-by: Evgeny Voevodin Signed-off-by: Blue Swirl --- tcg/tcg.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tcg/tcg.h b/tcg/tcg.h index 9481e35ab4..f6e255f775 100644 --- a/tcg/tcg.h +++ b/tcg/tcg.h @@ -455,6 +455,9 @@ struct TCGContext { uint16_t *gen_opc_ptr; TCGArg *gen_opparam_ptr; + target_ulong gen_opc_pc[OPC_BUF_SIZE]; + uint16_t gen_opc_icount[OPC_BUF_SIZE]; + uint8_t gen_opc_instr_start[OPC_BUF_SIZE]; #if defined(CONFIG_QEMU_LDST_OPTIMIZATION) && defined(CONFIG_SOFTMMU) /* labels info for qemu_ld/st IRs From 25983cad31969e3003eef77bc03a6700f46899d2 Mon Sep 17 00:00:00 2001 From: Evgeny Voevodin Date: Wed, 21 Nov 2012 11:43:04 +0400 Subject: [PATCH 061/300] TCG: Use gen_opc_pc from context instead of global variable. Signed-off-by: Evgeny Voevodin Signed-off-by: Blue Swirl --- target-alpha/translate.c | 4 ++-- target-arm/translate.c | 4 ++-- target-cris/translate.c | 6 +++--- target-i386/translate.c | 9 +++++---- target-lm32/translate.c | 4 ++-- target-m68k/translate.c | 4 ++-- target-microblaze/translate.c | 4 ++-- target-mips/translate.c | 4 ++-- target-openrisc/translate.c | 4 ++-- target-ppc/translate.c | 4 ++-- target-s390x/translate.c | 4 ++-- target-sh4/translate.c | 4 ++-- target-sparc/translate.c | 4 ++-- target-unicore32/translate.c | 4 ++-- target-xtensa/translate.c | 4 ++-- 15 files changed, 34 insertions(+), 33 deletions(-) diff --git a/target-alpha/translate.c b/target-alpha/translate.c index 4045f788ea..bcde367da6 100644 --- a/target-alpha/translate.c +++ b/target-alpha/translate.c @@ -3412,7 +3412,7 @@ static inline void gen_intermediate_code_internal(CPUAlphaState *env, while (lj < j) gen_opc_instr_start[lj++] = 0; } - gen_opc_pc[lj] = ctx.pc; + tcg_ctx.gen_opc_pc[lj] = ctx.pc; gen_opc_instr_start[lj] = 1; gen_opc_icount[lj] = num_insns; } @@ -3551,5 +3551,5 @@ CPUAlphaState * cpu_alpha_init (const char *cpu_model) void restore_state_to_opc(CPUAlphaState *env, TranslationBlock *tb, int pc_pos) { - env->pc = gen_opc_pc[pc_pos]; + env->pc = tcg_ctx.gen_opc_pc[pc_pos]; } diff --git a/target-arm/translate.c b/target-arm/translate.c index c42110ab0d..8ea8bbae3d 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -9840,7 +9840,7 @@ static inline void gen_intermediate_code_internal(CPUARMState *env, while (lj < j) gen_opc_instr_start[lj++] = 0; } - gen_opc_pc[lj] = dc->pc; + tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_condexec_bits[lj] = (dc->condexec_cond << 4) | (dc->condexec_mask >> 1); gen_opc_instr_start[lj] = 1; gen_opc_icount[lj] = num_insns; @@ -10043,6 +10043,6 @@ void cpu_dump_state(CPUARMState *env, FILE *f, fprintf_function cpu_fprintf, void restore_state_to_opc(CPUARMState *env, TranslationBlock *tb, int pc_pos) { - env->regs[15] = gen_opc_pc[pc_pos]; + env->regs[15] = tcg_ctx.gen_opc_pc[pc_pos]; env->condexec_bits = gen_opc_condexec_bits[pc_pos]; } diff --git a/target-cris/translate.c b/target-cris/translate.c index 0b0e86dbd1..745cd7acb4 100644 --- a/target-cris/translate.c +++ b/target-cris/translate.c @@ -3305,9 +3305,9 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb, } } if (dc->delayed_branch == 1) { - gen_opc_pc[lj] = dc->ppc | 1; + tcg_ctx.gen_opc_pc[lj] = dc->ppc | 1; } else { - gen_opc_pc[lj] = dc->pc; + tcg_ctx.gen_opc_pc[lj] = dc->pc; } gen_opc_instr_start[lj] = 1; gen_opc_icount[lj] = num_insns; @@ -3621,5 +3621,5 @@ CRISCPU *cpu_cris_init(const char *cpu_model) void restore_state_to_opc(CPUCRISState *env, TranslationBlock *tb, int pc_pos) { - env->pc = gen_opc_pc[pc_pos]; + env->pc = tcg_ctx.gen_opc_pc[pc_pos]; } diff --git a/target-i386/translate.c b/target-i386/translate.c index 8e676ba1a8..aea843cafe 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -7990,7 +7990,7 @@ static inline void gen_intermediate_code_internal(CPUX86State *env, while (lj < j) gen_opc_instr_start[lj++] = 0; } - gen_opc_pc[lj] = pc_ptr; + tcg_ctx.gen_opc_pc[lj] = pc_ptr; gen_opc_cc_op[lj] = dc->cc_op; gen_opc_instr_start[lj] = 1; gen_opc_icount[lj] = num_insns; @@ -8081,15 +8081,16 @@ void restore_state_to_opc(CPUX86State *env, TranslationBlock *tb, int pc_pos) qemu_log("RESTORE:\n"); for(i = 0;i <= pc_pos; i++) { if (gen_opc_instr_start[i]) { - qemu_log("0x%04x: " TARGET_FMT_lx "\n", i, gen_opc_pc[i]); + qemu_log("0x%04x: " TARGET_FMT_lx "\n", i, + tcg_ctx.gen_opc_pc[i]); } } qemu_log("pc_pos=0x%x eip=" TARGET_FMT_lx " cs_base=%x\n", - pc_pos, gen_opc_pc[pc_pos] - tb->cs_base, + pc_pos, tcg_ctx.gen_opc_pc[pc_pos] - tb->cs_base, (uint32_t)tb->cs_base); } #endif - env->eip = gen_opc_pc[pc_pos] - tb->cs_base; + env->eip = tcg_ctx.gen_opc_pc[pc_pos] - tb->cs_base; cc_op = gen_opc_cc_op[pc_pos]; if (cc_op != CC_OP_DYNAMIC) env->cc_op = cc_op; diff --git a/target-lm32/translate.c b/target-lm32/translate.c index af986499f2..fcafb06fb5 100644 --- a/target-lm32/translate.c +++ b/target-lm32/translate.c @@ -1054,7 +1054,7 @@ static void gen_intermediate_code_internal(CPULM32State *env, gen_opc_instr_start[lj++] = 0; } } - gen_opc_pc[lj] = dc->pc; + tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_instr_start[lj] = 1; gen_opc_icount[lj] = num_insns; } @@ -1172,7 +1172,7 @@ void cpu_dump_state(CPULM32State *env, FILE *f, fprintf_function cpu_fprintf, void restore_state_to_opc(CPULM32State *env, TranslationBlock *tb, int pc_pos) { - env->pc = gen_opc_pc[pc_pos]; + env->pc = tcg_ctx.gen_opc_pc[pc_pos]; } void lm32_translate_init(void) diff --git a/target-m68k/translate.c b/target-m68k/translate.c index b13be4899e..74772dd6a5 100644 --- a/target-m68k/translate.c +++ b/target-m68k/translate.c @@ -3021,7 +3021,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb, while (lj < j) gen_opc_instr_start[lj++] = 0; } - gen_opc_pc[lj] = dc->pc; + tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_instr_start[lj] = 1; gen_opc_icount[lj] = num_insns; } @@ -3121,5 +3121,5 @@ void cpu_dump_state(CPUM68KState *env, FILE *f, fprintf_function cpu_fprintf, void restore_state_to_opc(CPUM68KState *env, TranslationBlock *tb, int pc_pos) { - env->pc = gen_opc_pc[pc_pos]; + env->pc = tcg_ctx.gen_opc_pc[pc_pos]; } diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c index cce4494954..6803f735b1 100644 --- a/target-microblaze/translate.c +++ b/target-microblaze/translate.c @@ -1790,7 +1790,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb, while (lj < j) gen_opc_instr_start[lj++] = 0; } - gen_opc_pc[lj] = dc->pc; + tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_instr_start[lj] = 1; gen_opc_icount[lj] = num_insns; } @@ -2014,5 +2014,5 @@ MicroBlazeCPU *cpu_mb_init(const char *cpu_model) void restore_state_to_opc(CPUMBState *env, TranslationBlock *tb, int pc_pos) { - env->sregs[SR_PC] = gen_opc_pc[pc_pos]; + env->sregs[SR_PC] = tcg_ctx.gen_opc_pc[pc_pos]; } diff --git a/target-mips/translate.c b/target-mips/translate.c index 71c55bcadb..e1ea9687cc 100644 --- a/target-mips/translate.c +++ b/target-mips/translate.c @@ -15581,7 +15581,7 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb, while (lj < j) gen_opc_instr_start[lj++] = 0; } - gen_opc_pc[lj] = ctx.pc; + tcg_ctx.gen_opc_pc[lj] = ctx.pc; gen_opc_hflags[lj] = ctx.hflags & MIPS_HFLAG_BMASK; gen_opc_btarget[lj] = ctx.btarget; gen_opc_instr_start[lj] = 1; @@ -16002,7 +16002,7 @@ void cpu_state_reset(CPUMIPSState *env) void restore_state_to_opc(CPUMIPSState *env, TranslationBlock *tb, int pc_pos) { - env->active_tc.PC = gen_opc_pc[pc_pos]; + env->active_tc.PC = tcg_ctx.gen_opc_pc[pc_pos]; env->hflags &= ~MIPS_HFLAG_BMASK; env->hflags |= gen_opc_hflags[pc_pos]; switch (env->hflags & MIPS_HFLAG_BMASK_BASE) { diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c index f14da7bd1a..b7ad6a4ef6 100644 --- a/target-openrisc/translate.c +++ b/target-openrisc/translate.c @@ -1710,7 +1710,7 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu, gen_opc_instr_start[k++] = 0; } } - gen_opc_pc[k] = dc->pc; + tcg_ctx.gen_opc_pc[k] = dc->pc; gen_opc_instr_start[k] = 1; gen_opc_icount[k] = num_insns; } @@ -1832,5 +1832,5 @@ void cpu_dump_state(CPUOpenRISCState *env, FILE *f, void restore_state_to_opc(CPUOpenRISCState *env, TranslationBlock *tb, int pc_pos) { - env->pc = gen_opc_pc[pc_pos]; + env->pc = tcg_ctx.gen_opc_pc[pc_pos]; } diff --git a/target-ppc/translate.c b/target-ppc/translate.c index 987b04eda5..276edc82ed 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c @@ -9682,7 +9682,7 @@ static inline void gen_intermediate_code_internal(CPUPPCState *env, while (lj < j) gen_opc_instr_start[lj++] = 0; } - gen_opc_pc[lj] = ctx.nip; + tcg_ctx.gen_opc_pc[lj] = ctx.nip; gen_opc_instr_start[lj] = 1; gen_opc_icount[lj] = num_insns; } @@ -9810,5 +9810,5 @@ void gen_intermediate_code_pc (CPUPPCState *env, struct TranslationBlock *tb) void restore_state_to_opc(CPUPPCState *env, TranslationBlock *tb, int pc_pos) { - env->nip = gen_opc_pc[pc_pos]; + env->nip = tcg_ctx.gen_opc_pc[pc_pos]; } diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 993f20752c..ff2868f910 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -5163,7 +5163,7 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env, gen_opc_instr_start[lj++] = 0; } } - gen_opc_pc[lj] = dc.pc; + tcg_ctx.gen_opc_pc[lj] = dc.pc; gen_opc_cc_op[lj] = dc.cc_op; gen_opc_instr_start[lj] = 1; gen_opc_icount[lj] = num_insns; @@ -5240,7 +5240,7 @@ void gen_intermediate_code_pc (CPUS390XState *env, struct TranslationBlock *tb) void restore_state_to_opc(CPUS390XState *env, TranslationBlock *tb, int pc_pos) { int cc_op; - env->psw.addr = gen_opc_pc[pc_pos]; + env->psw.addr = tcg_ctx.gen_opc_pc[pc_pos]; cc_op = gen_opc_cc_op[pc_pos]; if ((cc_op != CC_OP_DYNAMIC) && (cc_op != CC_OP_STATIC)) { env->cc_op = cc_op; diff --git a/target-sh4/translate.c b/target-sh4/translate.c index 5497dede05..4def163dc4 100644 --- a/target-sh4/translate.c +++ b/target-sh4/translate.c @@ -2005,7 +2005,7 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb, while (ii < i) gen_opc_instr_start[ii++] = 0; } - gen_opc_pc[ii] = ctx.pc; + tcg_ctx.gen_opc_pc[ii] = ctx.pc; gen_opc_hflags[ii] = ctx.flags; gen_opc_instr_start[ii] = 1; gen_opc_icount[ii] = num_insns; @@ -2088,6 +2088,6 @@ void gen_intermediate_code_pc(CPUSH4State * env, struct TranslationBlock *tb) void restore_state_to_opc(CPUSH4State *env, TranslationBlock *tb, int pc_pos) { - env->pc = gen_opc_pc[pc_pos]; + env->pc = tcg_ctx.gen_opc_pc[pc_pos]; env->flags = gen_opc_hflags[pc_pos]; } diff --git a/target-sparc/translate.c b/target-sparc/translate.c index 2ae803695b..4f3a84473c 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -5284,7 +5284,7 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb, lj++; while (lj < j) gen_opc_instr_start[lj++] = 0; - gen_opc_pc[lj] = dc->pc; + tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_npc[lj] = dc->npc; gen_opc_instr_start[lj] = 1; gen_opc_icount[lj] = num_insns; @@ -5478,7 +5478,7 @@ void gen_intermediate_code_init(CPUSPARCState *env) void restore_state_to_opc(CPUSPARCState *env, TranslationBlock *tb, int pc_pos) { target_ulong npc; - env->pc = gen_opc_pc[pc_pos]; + env->pc = tcg_ctx.gen_opc_pc[pc_pos]; npc = gen_opc_npc[pc_pos]; if (npc == 1) { /* dynamic NPC: already stored */ diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c index 052bb45d70..32a426522c 100644 --- a/target-unicore32/translate.c +++ b/target-unicore32/translate.c @@ -2006,7 +2006,7 @@ static inline void gen_intermediate_code_internal(CPUUniCore32State *env, gen_opc_instr_start[lj++] = 0; } } - gen_opc_pc[lj] = dc->pc; + tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_instr_start[lj] = 1; gen_opc_icount[lj] = num_insns; } @@ -2203,5 +2203,5 @@ void cpu_dump_state(CPUUniCore32State *env, FILE *f, void restore_state_to_opc(CPUUniCore32State *env, TranslationBlock *tb, int pc_pos) { - env->regs[31] = gen_opc_pc[pc_pos]; + env->regs[31] = tcg_ctx.gen_opc_pc[pc_pos]; } diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index e5a3f49a75..21126fc396 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -2900,7 +2900,7 @@ static void gen_intermediate_code_internal( gen_opc_instr_start[lj++] = 0; } } - gen_opc_pc[lj] = dc.pc; + tcg_ctx.gen_opc_pc[lj] = dc.pc; gen_opc_instr_start[lj] = 1; gen_opc_icount[lj] = insn_count; } @@ -3028,5 +3028,5 @@ void cpu_dump_state(CPUXtensaState *env, FILE *f, fprintf_function cpu_fprintf, void restore_state_to_opc(CPUXtensaState *env, TranslationBlock *tb, int pc_pos) { - env->pc = gen_opc_pc[pc_pos]; + env->pc = tcg_ctx.gen_opc_pc[pc_pos]; } From c9c99c22d5f8e9cfa83260fbe236a57e7383d673 Mon Sep 17 00:00:00 2001 From: Evgeny Voevodin Date: Wed, 21 Nov 2012 11:43:05 +0400 Subject: [PATCH 062/300] TCG: Use gen_opc_icount from context instead of global variable. Signed-off-by: Evgeny Voevodin Signed-off-by: Blue Swirl --- target-alpha/translate.c | 2 +- target-arm/translate.c | 2 +- target-cris/translate.c | 2 +- target-i386/translate.c | 2 +- target-lm32/translate.c | 2 +- target-m68k/translate.c | 2 +- target-microblaze/translate.c | 2 +- target-mips/translate.c | 2 +- target-openrisc/translate.c | 2 +- target-ppc/translate.c | 2 +- target-s390x/translate.c | 2 +- target-sh4/translate.c | 2 +- target-sparc/translate.c | 2 +- target-unicore32/translate.c | 2 +- target-xtensa/translate.c | 2 +- translate-all.c | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/target-alpha/translate.c b/target-alpha/translate.c index bcde367da6..8b73fbb0eb 100644 --- a/target-alpha/translate.c +++ b/target-alpha/translate.c @@ -3414,7 +3414,7 @@ static inline void gen_intermediate_code_internal(CPUAlphaState *env, } tcg_ctx.gen_opc_pc[lj] = ctx.pc; gen_opc_instr_start[lj] = 1; - gen_opc_icount[lj] = num_insns; + tcg_ctx.gen_opc_icount[lj] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) gen_io_start(); diff --git a/target-arm/translate.c b/target-arm/translate.c index 8ea8bbae3d..4695d8b49b 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -9843,7 +9843,7 @@ static inline void gen_intermediate_code_internal(CPUARMState *env, tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_condexec_bits[lj] = (dc->condexec_cond << 4) | (dc->condexec_mask >> 1); gen_opc_instr_start[lj] = 1; - gen_opc_icount[lj] = num_insns; + tcg_ctx.gen_opc_icount[lj] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) diff --git a/target-cris/translate.c b/target-cris/translate.c index 745cd7acb4..6ec8c3c284 100644 --- a/target-cris/translate.c +++ b/target-cris/translate.c @@ -3310,7 +3310,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb, tcg_ctx.gen_opc_pc[lj] = dc->pc; } gen_opc_instr_start[lj] = 1; - gen_opc_icount[lj] = num_insns; + tcg_ctx.gen_opc_icount[lj] = num_insns; } /* Pretty disas. */ diff --git a/target-i386/translate.c b/target-i386/translate.c index aea843cafe..80fb695fc8 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -7993,7 +7993,7 @@ static inline void gen_intermediate_code_internal(CPUX86State *env, tcg_ctx.gen_opc_pc[lj] = pc_ptr; gen_opc_cc_op[lj] = dc->cc_op; gen_opc_instr_start[lj] = 1; - gen_opc_icount[lj] = num_insns; + tcg_ctx.gen_opc_icount[lj] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) gen_io_start(); diff --git a/target-lm32/translate.c b/target-lm32/translate.c index fcafb06fb5..4e029e06de 100644 --- a/target-lm32/translate.c +++ b/target-lm32/translate.c @@ -1056,7 +1056,7 @@ static void gen_intermediate_code_internal(CPULM32State *env, } tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_instr_start[lj] = 1; - gen_opc_icount[lj] = num_insns; + tcg_ctx.gen_opc_icount[lj] = num_insns; } /* Pretty disas. */ diff --git a/target-m68k/translate.c b/target-m68k/translate.c index 74772dd6a5..0762085568 100644 --- a/target-m68k/translate.c +++ b/target-m68k/translate.c @@ -3023,7 +3023,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb, } tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_instr_start[lj] = 1; - gen_opc_icount[lj] = num_insns; + tcg_ctx.gen_opc_icount[lj] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) gen_io_start(); diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c index 6803f735b1..d975756538 100644 --- a/target-microblaze/translate.c +++ b/target-microblaze/translate.c @@ -1792,7 +1792,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb, } tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_instr_start[lj] = 1; - gen_opc_icount[lj] = num_insns; + tcg_ctx.gen_opc_icount[lj] = num_insns; } /* Pretty disas. */ diff --git a/target-mips/translate.c b/target-mips/translate.c index e1ea9687cc..abecfb3f3b 100644 --- a/target-mips/translate.c +++ b/target-mips/translate.c @@ -15585,7 +15585,7 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb, gen_opc_hflags[lj] = ctx.hflags & MIPS_HFLAG_BMASK; gen_opc_btarget[lj] = ctx.btarget; gen_opc_instr_start[lj] = 1; - gen_opc_icount[lj] = num_insns; + tcg_ctx.gen_opc_icount[lj] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) gen_io_start(); diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c index b7ad6a4ef6..5b08314723 100644 --- a/target-openrisc/translate.c +++ b/target-openrisc/translate.c @@ -1712,7 +1712,7 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu, } tcg_ctx.gen_opc_pc[k] = dc->pc; gen_opc_instr_start[k] = 1; - gen_opc_icount[k] = num_insns; + tcg_ctx.gen_opc_icount[k] = num_insns; } if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) { diff --git a/target-ppc/translate.c b/target-ppc/translate.c index 276edc82ed..7fdde5fae7 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c @@ -9684,7 +9684,7 @@ static inline void gen_intermediate_code_internal(CPUPPCState *env, } tcg_ctx.gen_opc_pc[lj] = ctx.nip; gen_opc_instr_start[lj] = 1; - gen_opc_icount[lj] = num_insns; + tcg_ctx.gen_opc_icount[lj] = num_insns; } LOG_DISAS("----------------\n"); LOG_DISAS("nip=" TARGET_FMT_lx " super=%d ir=%d\n", diff --git a/target-s390x/translate.c b/target-s390x/translate.c index ff2868f910..b2774ee76b 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -5166,7 +5166,7 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env, tcg_ctx.gen_opc_pc[lj] = dc.pc; gen_opc_cc_op[lj] = dc.cc_op; gen_opc_instr_start[lj] = 1; - gen_opc_icount[lj] = num_insns; + tcg_ctx.gen_opc_icount[lj] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) { gen_io_start(); diff --git a/target-sh4/translate.c b/target-sh4/translate.c index 4def163dc4..ca76be53d4 100644 --- a/target-sh4/translate.c +++ b/target-sh4/translate.c @@ -2008,7 +2008,7 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb, tcg_ctx.gen_opc_pc[ii] = ctx.pc; gen_opc_hflags[ii] = ctx.flags; gen_opc_instr_start[ii] = 1; - gen_opc_icount[ii] = num_insns; + tcg_ctx.gen_opc_icount[ii] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) gen_io_start(); diff --git a/target-sparc/translate.c b/target-sparc/translate.c index 4f3a84473c..cbb8997de9 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -5287,7 +5287,7 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb, tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_npc[lj] = dc->npc; gen_opc_instr_start[lj] = 1; - gen_opc_icount[lj] = num_insns; + tcg_ctx.gen_opc_icount[lj] = num_insns; } } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c index 32a426522c..05626158fd 100644 --- a/target-unicore32/translate.c +++ b/target-unicore32/translate.c @@ -2008,7 +2008,7 @@ static inline void gen_intermediate_code_internal(CPUUniCore32State *env, } tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_instr_start[lj] = 1; - gen_opc_icount[lj] = num_insns; + tcg_ctx.gen_opc_icount[lj] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) { diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index 21126fc396..e93c2e6fa8 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -2902,7 +2902,7 @@ static void gen_intermediate_code_internal( } tcg_ctx.gen_opc_pc[lj] = dc.pc; gen_opc_instr_start[lj] = 1; - gen_opc_icount[lj] = insn_count; + tcg_ctx.gen_opc_icount[lj] = insn_count; } if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) { diff --git a/translate-all.c b/translate-all.c index d9c2e57861..177e95ab0c 100644 --- a/translate-all.c +++ b/translate-all.c @@ -148,7 +148,7 @@ int cpu_restore_state(TranslationBlock *tb, /* now find start of instruction before */ while (gen_opc_instr_start[j] == 0) j--; - env->icount_decr.u16.low -= gen_opc_icount[j]; + env->icount_decr.u16.low -= s->gen_opc_icount[j]; restore_state_to_opc(env, tb, j); From ab1103def476d985c08362df97ff9cb9c112adfc Mon Sep 17 00:00:00 2001 From: Evgeny Voevodin Date: Wed, 21 Nov 2012 11:43:06 +0400 Subject: [PATCH 063/300] TCG: Use gen_opc_instr_start from context instead of global variable. Signed-off-by: Evgeny Voevodin Signed-off-by: Blue Swirl --- target-alpha/translate.c | 6 +++--- target-arm/translate.c | 6 +++--- target-cris/translate.c | 6 +++--- target-i386/translate.c | 8 ++++---- target-lm32/translate.c | 6 +++--- target-m68k/translate.c | 6 +++--- target-microblaze/translate.c | 6 +++--- target-mips/translate.c | 6 +++--- target-openrisc/translate.c | 6 +++--- target-ppc/translate.c | 6 +++--- target-s390x/translate.c | 6 +++--- target-sh4/translate.c | 6 +++--- target-sparc/translate.c | 6 +++--- target-unicore32/translate.c | 6 +++--- target-xtensa/translate.c | 4 ++-- translate-all.c | 3 ++- 16 files changed, 47 insertions(+), 46 deletions(-) diff --git a/target-alpha/translate.c b/target-alpha/translate.c index 8b73fbb0eb..71fe1a1ab0 100644 --- a/target-alpha/translate.c +++ b/target-alpha/translate.c @@ -3410,10 +3410,10 @@ static inline void gen_intermediate_code_internal(CPUAlphaState *env, if (lj < j) { lj++; while (lj < j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } tcg_ctx.gen_opc_pc[lj] = ctx.pc; - gen_opc_instr_start[lj] = 1; + tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) @@ -3468,7 +3468,7 @@ static inline void gen_intermediate_code_internal(CPUAlphaState *env, j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; lj++; while (lj <= j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } else { tb->size = ctx.pc - pc_start; tb->icount = num_insns; diff --git a/target-arm/translate.c b/target-arm/translate.c index 4695d8b49b..3cf3604517 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -9838,11 +9838,11 @@ static inline void gen_intermediate_code_internal(CPUARMState *env, if (lj < j) { lj++; while (lj < j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_condexec_bits[lj] = (dc->condexec_cond << 4) | (dc->condexec_mask >> 1); - gen_opc_instr_start[lj] = 1; + tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } @@ -9977,7 +9977,7 @@ done_generating: j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; lj++; while (lj <= j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } else { tb->size = dc->pc - pc_start; tb->icount = num_insns; diff --git a/target-cris/translate.c b/target-cris/translate.c index 6ec8c3c284..60bdc241ef 100644 --- a/target-cris/translate.c +++ b/target-cris/translate.c @@ -3301,7 +3301,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb, if (lj < j) { lj++; while (lj < j) { - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } } if (dc->delayed_branch == 1) { @@ -3309,7 +3309,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb, } else { tcg_ctx.gen_opc_pc[lj] = dc->pc; } - gen_opc_instr_start[lj] = 1; + tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } @@ -3439,7 +3439,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb, j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; lj++; while (lj <= j) { - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } } else { tb->size = dc->pc - pc_start; diff --git a/target-i386/translate.c b/target-i386/translate.c index 80fb695fc8..f394ea69a5 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -7988,11 +7988,11 @@ static inline void gen_intermediate_code_internal(CPUX86State *env, if (lj < j) { lj++; while (lj < j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } tcg_ctx.gen_opc_pc[lj] = pc_ptr; gen_opc_cc_op[lj] = dc->cc_op; - gen_opc_instr_start[lj] = 1; + tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) @@ -8037,7 +8037,7 @@ static inline void gen_intermediate_code_internal(CPUX86State *env, j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; lj++; while (lj <= j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } #ifdef DEBUG_DISAS @@ -8080,7 +8080,7 @@ void restore_state_to_opc(CPUX86State *env, TranslationBlock *tb, int pc_pos) int i; qemu_log("RESTORE:\n"); for(i = 0;i <= pc_pos; i++) { - if (gen_opc_instr_start[i]) { + if (tcg_ctx.gen_opc_instr_start[i]) { qemu_log("0x%04x: " TARGET_FMT_lx "\n", i, tcg_ctx.gen_opc_pc[i]); } diff --git a/target-lm32/translate.c b/target-lm32/translate.c index 4e029e06de..e131ad1b5f 100644 --- a/target-lm32/translate.c +++ b/target-lm32/translate.c @@ -1051,11 +1051,11 @@ static void gen_intermediate_code_internal(CPULM32State *env, if (lj < j) { lj++; while (lj < j) { - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } } tcg_ctx.gen_opc_pc[lj] = dc->pc; - gen_opc_instr_start[lj] = 1; + tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } @@ -1110,7 +1110,7 @@ static void gen_intermediate_code_internal(CPULM32State *env, j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; lj++; while (lj <= j) { - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } } else { tb->size = dc->pc - pc_start; diff --git a/target-m68k/translate.c b/target-m68k/translate.c index 0762085568..11defc6e04 100644 --- a/target-m68k/translate.c +++ b/target-m68k/translate.c @@ -3019,10 +3019,10 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb, if (lj < j) { lj++; while (lj < j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } tcg_ctx.gen_opc_pc[lj] = dc->pc; - gen_opc_instr_start[lj] = 1; + tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) @@ -3078,7 +3078,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb, j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; lj++; while (lj <= j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } else { tb->size = dc->pc - pc_start; tb->icount = num_insns; diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c index d975756538..6ceff02a12 100644 --- a/target-microblaze/translate.c +++ b/target-microblaze/translate.c @@ -1788,10 +1788,10 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb, if (lj < j) { lj++; while (lj < j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } tcg_ctx.gen_opc_pc[lj] = dc->pc; - gen_opc_instr_start[lj] = 1; + tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } @@ -1902,7 +1902,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb, j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; lj++; while (lj <= j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } else { tb->size = dc->pc - pc_start; tb->icount = num_insns; diff --git a/target-mips/translate.c b/target-mips/translate.c index abecfb3f3b..65e6725cc9 100644 --- a/target-mips/translate.c +++ b/target-mips/translate.c @@ -15579,12 +15579,12 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb, if (lj < j) { lj++; while (lj < j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } tcg_ctx.gen_opc_pc[lj] = ctx.pc; gen_opc_hflags[lj] = ctx.hflags & MIPS_HFLAG_BMASK; gen_opc_btarget[lj] = ctx.btarget; - gen_opc_instr_start[lj] = 1; + tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) @@ -15662,7 +15662,7 @@ done_generating: j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; lj++; while (lj <= j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } else { tb->size = ctx.pc - pc_start; tb->icount = num_insns; diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c index 5b08314723..9ac999a9c8 100644 --- a/target-openrisc/translate.c +++ b/target-openrisc/translate.c @@ -1707,11 +1707,11 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu, if (k < j) { k++; while (k < j) { - gen_opc_instr_start[k++] = 0; + tcg_ctx.gen_opc_instr_start[k++] = 0; } } tcg_ctx.gen_opc_pc[k] = dc->pc; - gen_opc_instr_start[k] = 1; + tcg_ctx.gen_opc_instr_start[k] = 1; tcg_ctx.gen_opc_icount[k] = num_insns; } @@ -1787,7 +1787,7 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu, j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; k++; while (k <= j) { - gen_opc_instr_start[k++] = 0; + tcg_ctx.gen_opc_instr_start[k++] = 0; } } else { tb->size = dc->pc - pc_start; diff --git a/target-ppc/translate.c b/target-ppc/translate.c index 7fdde5fae7..653c2fdb1f 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c @@ -9680,10 +9680,10 @@ static inline void gen_intermediate_code_internal(CPUPPCState *env, if (lj < j) { lj++; while (lj < j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } tcg_ctx.gen_opc_pc[lj] = ctx.nip; - gen_opc_instr_start[lj] = 1; + tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } LOG_DISAS("----------------\n"); @@ -9781,7 +9781,7 @@ static inline void gen_intermediate_code_internal(CPUPPCState *env, j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; lj++; while (lj <= j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } else { tb->size = ctx.nip - pc_start; tb->icount = num_insns; diff --git a/target-s390x/translate.c b/target-s390x/translate.c index b2774ee76b..787e3c6963 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -5160,12 +5160,12 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env, if (lj < j) { lj++; while (lj < j) { - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } } tcg_ctx.gen_opc_pc[lj] = dc.pc; gen_opc_cc_op[lj] = dc.cc_op; - gen_opc_instr_start[lj] = 1; + tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) { @@ -5212,7 +5212,7 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env, j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; lj++; while (lj <= j) { - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } } else { tb->size = dc.pc - pc_start; diff --git a/target-sh4/translate.c b/target-sh4/translate.c index ca76be53d4..86493e1b03 100644 --- a/target-sh4/translate.c +++ b/target-sh4/translate.c @@ -2003,11 +2003,11 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb, if (ii < i) { ii++; while (ii < i) - gen_opc_instr_start[ii++] = 0; + tcg_ctx.gen_opc_instr_start[ii++] = 0; } tcg_ctx.gen_opc_pc[ii] = ctx.pc; gen_opc_hflags[ii] = ctx.flags; - gen_opc_instr_start[ii] = 1; + tcg_ctx.gen_opc_instr_start[ii] = 1; tcg_ctx.gen_opc_icount[ii] = num_insns; } if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) @@ -2061,7 +2061,7 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb, i = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; ii++; while (ii <= i) - gen_opc_instr_start[ii++] = 0; + tcg_ctx.gen_opc_instr_start[ii++] = 0; } else { tb->size = ctx.pc - pc_start; tb->icount = num_insns; diff --git a/target-sparc/translate.c b/target-sparc/translate.c index cbb8997de9..5859f2e801 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -5283,10 +5283,10 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb, if (lj < j) { lj++; while (lj < j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; tcg_ctx.gen_opc_pc[lj] = dc->pc; gen_opc_npc[lj] = dc->npc; - gen_opc_instr_start[lj] = 1; + tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } } @@ -5339,7 +5339,7 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb, j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; lj++; while (lj <= j) - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; #if 0 log_page_dump(); #endif diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c index 05626158fd..3951758fc8 100644 --- a/target-unicore32/translate.c +++ b/target-unicore32/translate.c @@ -2003,11 +2003,11 @@ static inline void gen_intermediate_code_internal(CPUUniCore32State *env, if (lj < j) { lj++; while (lj < j) { - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } } tcg_ctx.gen_opc_pc[lj] = dc->pc; - gen_opc_instr_start[lj] = 1; + tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } @@ -2117,7 +2117,7 @@ done_generating: j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; lj++; while (lj <= j) { - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } } else { tb->size = dc->pc - pc_start; diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index e93c2e6fa8..828b9cabb5 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -2897,11 +2897,11 @@ static void gen_intermediate_code_internal( if (lj < j) { lj++; while (lj < j) { - gen_opc_instr_start[lj++] = 0; + tcg_ctx.gen_opc_instr_start[lj++] = 0; } } tcg_ctx.gen_opc_pc[lj] = dc.pc; - gen_opc_instr_start[lj] = 1; + tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = insn_count; } diff --git a/translate-all.c b/translate-all.c index 177e95ab0c..2f616bf321 100644 --- a/translate-all.c +++ b/translate-all.c @@ -146,8 +146,9 @@ int cpu_restore_state(TranslationBlock *tb, if (j < 0) return -1; /* now find start of instruction before */ - while (gen_opc_instr_start[j] == 0) + while (s->gen_opc_instr_start[j] == 0) { j--; + } env->icount_decr.u16.low -= s->gen_opc_icount[j]; restore_state_to_opc(env, tb, j); From 94788f54e9deeaa2c82891a7d216fdd6e0e58749 Mon Sep 17 00:00:00 2001 From: Evgeny Voevodin Date: Wed, 21 Nov 2012 11:43:07 +0400 Subject: [PATCH 064/300] TCG: Remove unused global gen_opc_ arrays. Signed-off-by: Evgeny Voevodin Signed-off-by: Blue Swirl --- exec-all.h | 4 ---- translate-all.c | 4 ---- 2 files changed, 8 deletions(-) diff --git a/exec-all.h b/exec-all.h index 21aacdab50..b18d4ca534 100644 --- a/exec-all.h +++ b/exec-all.h @@ -70,10 +70,6 @@ typedef struct TranslationBlock TranslationBlock; #define OPPARAM_BUF_SIZE (OPC_BUF_SIZE * MAX_OPC_PARAM) -extern target_ulong gen_opc_pc[OPC_BUF_SIZE]; -extern uint8_t gen_opc_instr_start[OPC_BUF_SIZE]; -extern uint16_t gen_opc_icount[OPC_BUF_SIZE]; - #include "qemu-log.h" void gen_intermediate_code(CPUArchState *env, struct TranslationBlock *tb); diff --git a/translate-all.c b/translate-all.c index 2f616bf321..f22e3eedd2 100644 --- a/translate-all.c +++ b/translate-all.c @@ -33,10 +33,6 @@ /* code generation context */ TCGContext tcg_ctx; -target_ulong gen_opc_pc[OPC_BUF_SIZE]; -uint16_t gen_opc_icount[OPC_BUF_SIZE]; -uint8_t gen_opc_instr_start[OPC_BUF_SIZE]; - void cpu_gen_init(void) { tcg_context_init(&tcg_ctx); From 288fa40736e6eb63132d01aa6dc21ee831b796ae Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 27 Nov 2012 13:19:40 +0100 Subject: [PATCH 065/300] pixman: require 0.18.4 or newer When older versions are found the internal pixman version is prefered. Signed-off-by: Gerd Hoffmann Signed-off-by: Blue Swirl --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 994f7310b8..44034d66b9 100755 --- a/configure +++ b/configure @@ -2118,7 +2118,7 @@ fi # pixman support probe if test "$pixman" = ""; then - if $pkg_config pixman-1 > /dev/null 2>&1; then + if $pkg_config --atleast-version=0.18.4 pixman-1 > /dev/null 2>&1; then pixman="system" else pixman="internal" @@ -2129,7 +2129,7 @@ if test "$pixman" = "system"; then pixman_libs=`$pkg_config --libs pixman-1 2>/dev/null` else if test ! -d ${source_path}/pixman/pixman; then - echo "ERROR: pixman not present. Your options:" + echo "ERROR: pixman not present (or older than 0.18.4). Your options:" echo " (1) Prefered: Install the pixman devel package (any recent" echo " distro should have packages as Xorg needs pixman too)." echo " (2) Fetch the pixman submodule, using:" From 475363176c80feedb8feb5e335ba64de68c7b055 Mon Sep 17 00:00:00 2001 From: Peter Maydell Date: Wed, 31 Oct 2012 09:30:47 +0000 Subject: [PATCH 066/300] HACKING: List areas where we may rely on impdef C behaviour Add a section to HACKING saying which version of the C spec we use and describing the bits of implementation defined C compiler behaviour which C code in QEMU is allowed to rely on. Signed-off-by: Peter Maydell Signed-off-by: Blue Swirl --- HACKING | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/HACKING b/HACKING index 89a6b3ad44..6654d33249 100644 --- a/HACKING +++ b/HACKING @@ -123,3 +123,23 @@ gcc's printf attribute directive in the prototype. This makes it so gcc's -Wformat and -Wformat-security options can do their jobs and cross-check format strings with the number and types of arguments. + +6. C standard, implementation defined and undefined behaviors + +C code in QEMU should be written to the C99 language specification. A copy +of the final version of the C99 standard with corrigenda TC1, TC2, and TC3 +included, formatted as a draft, can be downloaded from: + http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf + +The C language specification defines regions of undefined behavior and +implementation defined behavior (to give compiler authors enough leeway to +produce better code). In general, code in QEMU should follow the language +specification and avoid both undefined and implementation defined +constructs. ("It works fine on the gcc I tested it with" is not a valid +argument...) However there are a few areas where we allow ourselves to +assume certain behaviors because in practice all the platforms we care about +behave in the same way and writing strictly conformant code would be +painful. These are: + * you may assume that integers are 2s complement representation + * you may assume that right shift of a signed integer duplicates + the sign bit (ie it is an arithmetic shift, not a logical shift) From 511c68d3af626cb0a39034cb77e7ac64d3a26c0c Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Tue, 4 Dec 2012 16:32:58 -0200 Subject: [PATCH 067/300] finally kill cpudef config section support The external CPU models were removed on QEMU 1.2, and the support for the "cpudef" config sections was documented as deprecated, but the actual removal of the config section was pending. Now that QEMU 1.3 was released, we can finally kill the support for cpudef config sections, and support only the built-in CPU models from target-i386/cpu.c. Signed-off-by: Eduardo Habkost Signed-off-by: Blue Swirl --- qemu-config.c | 49 ------------------------------------------------- 1 file changed, 49 deletions(-) diff --git a/qemu-config.c b/qemu-config.c index 10d1ba4176..aa78fb9ea7 100644 --- a/qemu-config.c +++ b/qemu-config.c @@ -417,54 +417,6 @@ static QemuOptsList qemu_trace_opts = { }, }; -static QemuOptsList qemu_cpudef_opts = { - .name = "cpudef", - .head = QTAILQ_HEAD_INITIALIZER(qemu_cpudef_opts.head), - .desc = { - { - .name = "name", - .type = QEMU_OPT_STRING, - },{ - .name = "level", - .type = QEMU_OPT_NUMBER, - },{ - .name = "vendor", - .type = QEMU_OPT_STRING, - },{ - .name = "family", - .type = QEMU_OPT_NUMBER, - },{ - .name = "model", - .type = QEMU_OPT_NUMBER, - },{ - .name = "stepping", - .type = QEMU_OPT_NUMBER, - },{ - .name = "feature_edx", /* cpuid 0000_0001.edx */ - .type = QEMU_OPT_STRING, - },{ - .name = "feature_ecx", /* cpuid 0000_0001.ecx */ - .type = QEMU_OPT_STRING, - },{ - .name = "extfeature_edx", /* cpuid 8000_0001.edx */ - .type = QEMU_OPT_STRING, - },{ - .name = "extfeature_ecx", /* cpuid 8000_0001.ecx */ - .type = QEMU_OPT_STRING, - },{ - .name = "xlevel", - .type = QEMU_OPT_NUMBER, - },{ - .name = "model_id", - .type = QEMU_OPT_STRING, - },{ - .name = "vendor_override", - .type = QEMU_OPT_NUMBER, - }, - { /* end of list */ } - }, -}; - QemuOptsList qemu_spice_opts = { .name = "spice", .head = QTAILQ_HEAD_INITIALIZER(qemu_spice_opts.head), @@ -700,7 +652,6 @@ static QemuOptsList *vm_config_groups[32] = { &qemu_rtc_opts, &qemu_global_opts, &qemu_mon_opts, - &qemu_cpudef_opts, &qemu_trace_opts, &qemu_option_rom_opts, &qemu_machine_opts, From fcc803d119a4c01a9b0ee5bda35fda1eeabffa33 Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Wed, 5 Dec 2012 07:15:20 +0400 Subject: [PATCH 068/300] target-xtensa: implement ATOMCTL SR ATOMCTL SR controls s32c1i opcode behavior depending on targeted memory type. See ISA, 4.3.12.4 for details. Signed-off-by: Max Filippov Signed-off-by: Blue Swirl --- target-xtensa/cpu.c | 2 ++ target-xtensa/cpu.h | 10 +++++++ target-xtensa/helper.c | 56 ++++++++++++++++++++++++++--------- target-xtensa/helper.h | 1 + target-xtensa/op_helper.c | 57 ++++++++++++++++++++++++++++++++++++ target-xtensa/overlay_tool.h | 6 ++++ target-xtensa/translate.c | 13 ++++++++ 7 files changed, 131 insertions(+), 14 deletions(-) diff --git a/target-xtensa/cpu.c b/target-xtensa/cpu.c index 9d01983d44..c6aa45ee6f 100644 --- a/target-xtensa/cpu.c +++ b/target-xtensa/cpu.c @@ -48,6 +48,8 @@ static void xtensa_cpu_reset(CPUState *s) XTENSA_OPTION_INTERRUPT) ? 0x1f : 0x10; env->sregs[VECBASE] = env->config->vecbase; env->sregs[IBREAKENABLE] = 0; + env->sregs[ATOMCTL] = xtensa_option_enabled(env->config, + XTENSA_OPTION_ATOMCTL) ? 0x28 : 0x15; env->pending_irq_level = 0; reset_mmu(env); diff --git a/target-xtensa/cpu.h b/target-xtensa/cpu.h index 74e98883bf..d240ab70d9 100644 --- a/target-xtensa/cpu.h +++ b/target-xtensa/cpu.h @@ -65,6 +65,7 @@ enum { XTENSA_OPTION_FP_COPROCESSOR, XTENSA_OPTION_MP_SYNCHRO, XTENSA_OPTION_CONDITIONAL_STORE, + XTENSA_OPTION_ATOMCTL, /* Interrupts and exceptions */ XTENSA_OPTION_EXCEPTION, @@ -128,6 +129,7 @@ enum { ITLBCFG = 91, DTLBCFG = 92, IBREAKENABLE = 96, + ATOMCTL = 99, IBREAKA = 128, DBREAKA = 144, DBREAKC = 160, @@ -193,6 +195,14 @@ enum { #define REGION_PAGE_MASK 0xe0000000 +#define PAGE_CACHE_MASK 0x700 +#define PAGE_CACHE_SHIFT 8 +#define PAGE_CACHE_INVALID 0x000 +#define PAGE_CACHE_BYPASS 0x100 +#define PAGE_CACHE_WT 0x200 +#define PAGE_CACHE_WB 0x400 +#define PAGE_CACHE_ISOLATE 0x600 + enum { /* Static vectors */ EXC_RESET, diff --git a/target-xtensa/helper.c b/target-xtensa/helper.c index d94bae210d..ecd0182281 100644 --- a/target-xtensa/helper.c +++ b/target-xtensa/helper.c @@ -390,6 +390,7 @@ int xtensa_tlb_lookup(const CPUXtensaState *env, uint32_t addr, bool dtlb, static unsigned mmu_attr_to_access(uint32_t attr) { unsigned access = 0; + if (attr < 12) { access |= PAGE_READ; if (attr & 0x1) { @@ -398,8 +399,22 @@ static unsigned mmu_attr_to_access(uint32_t attr) if (attr & 0x2) { access |= PAGE_WRITE; } + + switch (attr & 0xc) { + case 0: + access |= PAGE_CACHE_BYPASS; + break; + + case 4: + access |= PAGE_CACHE_WB; + break; + + case 8: + access |= PAGE_CACHE_WT; + break; + } } else if (attr == 13) { - access |= PAGE_READ | PAGE_WRITE; + access |= PAGE_READ | PAGE_WRITE | PAGE_CACHE_ISOLATE; } return access; } @@ -410,14 +425,17 @@ static unsigned mmu_attr_to_access(uint32_t attr) */ static unsigned region_attr_to_access(uint32_t attr) { - unsigned access = 0; - if ((attr < 6 && attr != 3) || attr == 14) { - access |= PAGE_READ | PAGE_WRITE; - } - if (attr > 0 && attr < 6) { - access |= PAGE_EXEC; - } - return access; + static const unsigned access[16] = { + [0] = PAGE_READ | PAGE_WRITE | PAGE_CACHE_WT, + [1] = PAGE_READ | PAGE_WRITE | PAGE_EXEC | PAGE_CACHE_WT, + [2] = PAGE_READ | PAGE_WRITE | PAGE_EXEC | PAGE_CACHE_BYPASS, + [3] = PAGE_EXEC | PAGE_CACHE_WB, + [4] = PAGE_READ | PAGE_WRITE | PAGE_EXEC | PAGE_CACHE_WB, + [5] = PAGE_READ | PAGE_WRITE | PAGE_EXEC | PAGE_CACHE_WB, + [14] = PAGE_READ | PAGE_WRITE | PAGE_CACHE_ISOLATE, + }; + + return access[attr & 0xf]; } static bool is_access_granted(unsigned access, int is_write) @@ -566,7 +584,7 @@ int xtensa_get_physical_addr(CPUXtensaState *env, bool update_tlb, } else { *paddr = vaddr; *page_size = TARGET_PAGE_SIZE; - *access = PAGE_READ | PAGE_WRITE | PAGE_EXEC; + *access = PAGE_READ | PAGE_WRITE | PAGE_EXEC | PAGE_CACHE_BYPASS; return 0; } } @@ -599,24 +617,34 @@ static void dump_tlb(FILE *f, fprintf_function cpu_fprintf, xtensa_tlb_get_entry(env, dtlb, wi, ei); if (entry->asid) { + static const char * const cache_text[8] = { + [PAGE_CACHE_BYPASS >> PAGE_CACHE_SHIFT] = "Bypass", + [PAGE_CACHE_WT >> PAGE_CACHE_SHIFT] = "WT", + [PAGE_CACHE_WB >> PAGE_CACHE_SHIFT] = "WB", + [PAGE_CACHE_ISOLATE >> PAGE_CACHE_SHIFT] = "Isolate", + }; unsigned access = attr_to_access(entry->attr); + unsigned cache_idx = (access & PAGE_CACHE_MASK) >> + PAGE_CACHE_SHIFT; if (print_header) { print_header = false; cpu_fprintf(f, "Way %u (%d %s)\n", wi, sz, sz_text); cpu_fprintf(f, - "\tVaddr Paddr ASID Attr RWX\n" - "\t---------- ---------- ---- ---- ---\n"); + "\tVaddr Paddr ASID Attr RWX Cache\n" + "\t---------- ---------- ---- ---- --- -------\n"); } cpu_fprintf(f, - "\t0x%08x 0x%08x 0x%02x 0x%02x %c%c%c\n", + "\t0x%08x 0x%08x 0x%02x 0x%02x %c%c%c %-7s\n", entry->vaddr, entry->paddr, entry->asid, entry->attr, (access & PAGE_READ) ? 'R' : '-', (access & PAGE_WRITE) ? 'W' : '-', - (access & PAGE_EXEC) ? 'X' : '-'); + (access & PAGE_EXEC) ? 'X' : '-', + cache_text[cache_idx] ? cache_text[cache_idx] : + "Invalid"); } } } diff --git a/target-xtensa/helper.h b/target-xtensa/helper.h index 1163c09836..5b4cd2700f 100644 --- a/target-xtensa/helper.h +++ b/target-xtensa/helper.h @@ -23,6 +23,7 @@ DEF_HELPER_3(waiti, void, env, i32, i32) DEF_HELPER_3(timer_irq, void, env, i32, i32) DEF_HELPER_2(advance_ccount, void, env, i32) DEF_HELPER_1(check_interrupts, void, env) +DEF_HELPER_3(check_atomctl, void, env, i32, i32) DEF_HELPER_2(wsr_rasid, void, env, i32) DEF_HELPER_FLAGS_3(rtlb0, TCG_CALL_NO_RWG_SE, i32, env, i32, i32) diff --git a/target-xtensa/op_helper.c b/target-xtensa/op_helper.c index ae0c09977b..0e0f21d1a2 100644 --- a/target-xtensa/op_helper.c +++ b/target-xtensa/op_helper.c @@ -415,6 +415,63 @@ void HELPER(check_interrupts)(CPUXtensaState *env) check_interrupts(env); } +/*! + * Check vaddr accessibility/cache attributes and raise an exception if + * specified by the ATOMCTL SR. + * + * Note: local memory exclusion is not implemented + */ +void HELPER(check_atomctl)(CPUXtensaState *env, uint32_t pc, uint32_t vaddr) +{ + uint32_t paddr, page_size, access; + uint32_t atomctl = env->sregs[ATOMCTL]; + int rc = xtensa_get_physical_addr(env, true, vaddr, 1, + xtensa_get_cring(env), &paddr, &page_size, &access); + + /* + * s32c1i never causes LOAD_PROHIBITED_CAUSE exceptions, + * see opcode description in the ISA + */ + if (rc == 0 && + (access & (PAGE_READ | PAGE_WRITE)) != (PAGE_READ | PAGE_WRITE)) { + rc = STORE_PROHIBITED_CAUSE; + } + + if (rc) { + HELPER(exception_cause_vaddr)(env, pc, rc, vaddr); + } + + /* + * When data cache is not configured use ATOMCTL bypass field. + * See ISA, 4.3.12.4 The Atomic Operation Control Register (ATOMCTL) + * under the Conditional Store Option. + */ + if (!xtensa_option_enabled(env->config, XTENSA_OPTION_DCACHE)) { + access = PAGE_CACHE_BYPASS; + } + + switch (access & PAGE_CACHE_MASK) { + case PAGE_CACHE_WB: + atomctl >>= 2; + case PAGE_CACHE_WT: + atomctl >>= 2; + case PAGE_CACHE_BYPASS: + if ((atomctl & 0x3) == 0) { + HELPER(exception_cause_vaddr)(env, pc, + LOAD_STORE_ERROR_CAUSE, vaddr); + } + break; + + case PAGE_CACHE_ISOLATE: + HELPER(exception_cause_vaddr)(env, pc, + LOAD_STORE_ERROR_CAUSE, vaddr); + break; + + default: + break; + } +} + void HELPER(wsr_rasid)(CPUXtensaState *env, uint32_t v) { v = (v & 0xffffff00) | 0x1; diff --git a/target-xtensa/overlay_tool.h b/target-xtensa/overlay_tool.h index e39505316b..50bf5735e9 100644 --- a/target-xtensa/overlay_tool.h +++ b/target-xtensa/overlay_tool.h @@ -42,6 +42,10 @@ #define XCHAL_VECBASE_RESET_VADDR 0 #endif +#ifndef XCHAL_HW_MIN_VERSION +#define XCHAL_HW_MIN_VERSION 0 +#endif + #define XCHAL_OPTION(xchal, qemu) ((xchal) ? XTENSA_OPTION_BIT(qemu) : 0) #define XTENSA_OPTIONS ( \ @@ -62,6 +66,8 @@ XCHAL_OPTION(XCHAL_HAVE_FP, XTENSA_OPTION_FP_COPROCESSOR) | \ XCHAL_OPTION(XCHAL_HAVE_RELEASE_SYNC, XTENSA_OPTION_MP_SYNCHRO) | \ XCHAL_OPTION(XCHAL_HAVE_S32C1I, XTENSA_OPTION_CONDITIONAL_STORE) | \ + XCHAL_OPTION(XCHAL_HAVE_S32C1I && XCHAL_HW_MIN_VERSION >= 230000, \ + XTENSA_OPTION_ATOMCTL) | \ /* Interrupts and exceptions */ \ XCHAL_OPTION(XCHAL_HAVE_EXCEPTIONS, XTENSA_OPTION_EXCEPTION) | \ XCHAL_OPTION(XCHAL_HAVE_VECBASE, XTENSA_OPTION_RELOCATABLE_VECTOR) | \ diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index 828b9cabb5..dc08de51ba 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -99,6 +99,7 @@ static const char * const sregnames[256] = { [ITLBCFG] = "ITLBCFG", [DTLBCFG] = "DTLBCFG", [IBREAKENABLE] = "IBREAKENABLE", + [ATOMCTL] = "ATOMCTL", [IBREAKA] = "IBREAKA0", [IBREAKA + 1] = "IBREAKA1", [DBREAKA] = "DBREAKA0", @@ -556,6 +557,11 @@ static void gen_wsr_ibreakenable(DisasContext *dc, uint32_t sr, TCGv_i32 v) gen_jumpi_check_loop_end(dc, 0); } +static void gen_wsr_atomctl(DisasContext *dc, uint32_t sr, TCGv_i32 v) +{ + tcg_gen_andi_i32(cpu_SR[sr], v, 0x3f); +} + static void gen_wsr_ibreaka(DisasContext *dc, uint32_t sr, TCGv_i32 v) { unsigned id = sr - IBREAKA; @@ -693,6 +699,7 @@ static void gen_wsr(DisasContext *dc, uint32_t sr, TCGv_i32 s) [ITLBCFG] = gen_wsr_tlbcfg, [DTLBCFG] = gen_wsr_tlbcfg, [IBREAKENABLE] = gen_wsr_ibreakenable, + [ATOMCTL] = gen_wsr_atomctl, [IBREAKA] = gen_wsr_ibreaka, [IBREAKA + 1] = gen_wsr_ibreaka, [DBREAKA] = gen_wsr_dbreaka, @@ -2317,10 +2324,15 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) int label = gen_new_label(); TCGv_i32 tmp = tcg_temp_local_new_i32(); TCGv_i32 addr = tcg_temp_local_new_i32(); + TCGv_i32 tpc; tcg_gen_mov_i32(tmp, cpu_R[RRI8_T]); tcg_gen_addi_i32(addr, cpu_R[RRI8_S], RRI8_IMM8 << 2); gen_load_store_alignment(dc, 2, addr, true); + + gen_advance_ccount(dc); + tpc = tcg_const_i32(dc->pc); + gen_helper_check_atomctl(cpu_env, tpc, addr); tcg_gen_qemu_ld32u(cpu_R[RRI8_T], addr, dc->cring); tcg_gen_brcond_i32(TCG_COND_NE, cpu_R[RRI8_T], cpu_SR[SCOMPARE1], label); @@ -2328,6 +2340,7 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) tcg_gen_qemu_st32(tmp, addr, dc->cring); gen_set_label(label); + tcg_temp_free(tpc); tcg_temp_free(addr); tcg_temp_free(tmp); } From 4e41d2f5830a76d3fe92b3d3b18cc9f2ee927770 Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Wed, 5 Dec 2012 07:15:21 +0400 Subject: [PATCH 069/300] target-xtensa: implement CACHEATTR SR In XEA1, the Options for Memory Protection and Translation and the corresponding TLB management instructions are not available. Instead, functionality similar to the Region Protection Option is available through the cache attribute register. See ISA, A.2.14 for details. Signed-off-by: Max Filippov Signed-off-by: Blue Swirl --- target-xtensa/cpu.c | 1 + target-xtensa/cpu.h | 2 ++ target-xtensa/helper.c | 21 ++++++++++++++++++++- target-xtensa/overlay_tool.h | 1 + target-xtensa/translate.c | 1 + 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/target-xtensa/cpu.c b/target-xtensa/cpu.c index c6aa45ee6f..035b07c1c5 100644 --- a/target-xtensa/cpu.c +++ b/target-xtensa/cpu.c @@ -48,6 +48,7 @@ static void xtensa_cpu_reset(CPUState *s) XTENSA_OPTION_INTERRUPT) ? 0x1f : 0x10; env->sregs[VECBASE] = env->config->vecbase; env->sregs[IBREAKENABLE] = 0; + env->sregs[CACHEATTR] = 0x22222222; env->sregs[ATOMCTL] = xtensa_option_enabled(env->config, XTENSA_OPTION_ATOMCTL) ? 0x28 : 0x15; diff --git a/target-xtensa/cpu.h b/target-xtensa/cpu.h index d240ab70d9..068ad69ee9 100644 --- a/target-xtensa/cpu.h +++ b/target-xtensa/cpu.h @@ -94,6 +94,7 @@ enum { XTENSA_OPTION_REGION_PROTECTION, XTENSA_OPTION_REGION_TRANSLATION, XTENSA_OPTION_MMU, + XTENSA_OPTION_CACHEATTR, /* Other */ XTENSA_OPTION_WINDOWED_REGISTER, @@ -129,6 +130,7 @@ enum { ITLBCFG = 91, DTLBCFG = 92, IBREAKENABLE = 96, + CACHEATTR = 98, ATOMCTL = 99, IBREAKA = 128, DBREAKA = 144, diff --git a/target-xtensa/helper.c b/target-xtensa/helper.c index ecd0182281..200fb43c28 100644 --- a/target-xtensa/helper.c +++ b/target-xtensa/helper.c @@ -438,6 +438,24 @@ static unsigned region_attr_to_access(uint32_t attr) return access[attr & 0xf]; } +/*! + * Convert cacheattr to PAGE_{READ,WRITE,EXEC} mask. + * See ISA, A.2.14 The Cache Attribute Register + */ +static unsigned cacheattr_attr_to_access(uint32_t attr) +{ + static const unsigned access[16] = { + [0] = PAGE_READ | PAGE_WRITE | PAGE_CACHE_WT, + [1] = PAGE_READ | PAGE_WRITE | PAGE_EXEC | PAGE_CACHE_WT, + [2] = PAGE_READ | PAGE_WRITE | PAGE_EXEC | PAGE_CACHE_BYPASS, + [3] = PAGE_EXEC | PAGE_CACHE_WB, + [4] = PAGE_READ | PAGE_WRITE | PAGE_EXEC | PAGE_CACHE_WB, + [14] = PAGE_READ | PAGE_WRITE | PAGE_CACHE_ISOLATE, + }; + + return access[attr & 0xf]; +} + static bool is_access_granted(unsigned access, int is_write) { switch (is_write) { @@ -584,7 +602,8 @@ int xtensa_get_physical_addr(CPUXtensaState *env, bool update_tlb, } else { *paddr = vaddr; *page_size = TARGET_PAGE_SIZE; - *access = PAGE_READ | PAGE_WRITE | PAGE_EXEC | PAGE_CACHE_BYPASS; + *access = cacheattr_attr_to_access( + env->sregs[CACHEATTR] >> ((vaddr & 0xe0000000) >> 27)); return 0; } } diff --git a/target-xtensa/overlay_tool.h b/target-xtensa/overlay_tool.h index 50bf5735e9..45205b8e67 100644 --- a/target-xtensa/overlay_tool.h +++ b/target-xtensa/overlay_tool.h @@ -91,6 +91,7 @@ XCHAL_OPTION(XCHAL_HAVE_XLT_CACHEATTR, \ XTENSA_OPTION_REGION_TRANSLATION) | \ XCHAL_OPTION(XCHAL_HAVE_PTP_MMU, XTENSA_OPTION_MMU) | \ + XCHAL_OPTION(XCHAL_HAVE_CACHEATTR, XTENSA_OPTION_CACHEATTR) | \ /* Other, TODO */ \ XCHAL_OPTION(XCHAL_HAVE_WINDOWED, XTENSA_OPTION_WINDOWED_REGISTER) | \ XCHAL_OPTION(XCHAL_HAVE_DEBUG, XTENSA_OPTION_DEBUG)) diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index dc08de51ba..eb4812099e 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -99,6 +99,7 @@ static const char * const sregnames[256] = { [ITLBCFG] = "ITLBCFG", [DTLBCFG] = "DTLBCFG", [IBREAKENABLE] = "IBREAKENABLE", + [CACHEATTR] = "CACHEATTR", [ATOMCTL] = "ATOMCTL", [IBREAKA] = "IBREAKA0", [IBREAKA + 1] = "IBREAKA1", From fe0bd475aa31e60674f7f53b85dc293108026202 Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Wed, 5 Dec 2012 07:15:22 +0400 Subject: [PATCH 070/300] target-xtensa: restrict available SRs by enabled options Beginning with the RA-2004.1 release, SR access instructions (rsr, wsr, xsr) are associated with their corresponding SR and raise illegal opcode exception in case the register is not configured for the core. Signed-off-by: Max Filippov Signed-off-by: Blue Swirl --- target-xtensa/cpu.h | 1 + target-xtensa/overlay_tool.h | 4 +- target-xtensa/translate.c | 230 +++++++++++++++++++---------------- 3 files changed, 130 insertions(+), 105 deletions(-) diff --git a/target-xtensa/cpu.h b/target-xtensa/cpu.h index 068ad69ee9..a73d32d898 100644 --- a/target-xtensa/cpu.h +++ b/target-xtensa/cpu.h @@ -416,6 +416,7 @@ void debug_exception_env(CPUXtensaState *new_env, uint32_t cause); #define XTENSA_OPTION_BIT(opt) (((uint64_t)1) << (opt)) +#define XTENSA_OPTION_ALL (~(uint64_t)0) static inline bool xtensa_option_bits_enabled(const XtensaConfig *config, uint64_t opt) diff --git a/target-xtensa/overlay_tool.h b/target-xtensa/overlay_tool.h index 45205b8e67..0b47029f8c 100644 --- a/target-xtensa/overlay_tool.h +++ b/target-xtensa/overlay_tool.h @@ -94,7 +94,9 @@ XCHAL_OPTION(XCHAL_HAVE_CACHEATTR, XTENSA_OPTION_CACHEATTR) | \ /* Other, TODO */ \ XCHAL_OPTION(XCHAL_HAVE_WINDOWED, XTENSA_OPTION_WINDOWED_REGISTER) | \ - XCHAL_OPTION(XCHAL_HAVE_DEBUG, XTENSA_OPTION_DEBUG)) + XCHAL_OPTION(XCHAL_HAVE_DEBUG, XTENSA_OPTION_DEBUG) |\ + XCHAL_OPTION(XCHAL_HAVE_THREADPTR, XTENSA_OPTION_THREAD_POINTER) | \ + XCHAL_OPTION(XCHAL_HAVE_PRID, XTENSA_OPTION_PROCESSOR_ID)) #ifndef XCHAL_WINDOW_OF4_VECOFS #define XCHAL_WINDOW_OF4_VECOFS 0x00000000 diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index eb4812099e..74b7b0f1aa 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -78,78 +78,102 @@ static TCGv_i32 cpu_UR[256]; #include "gen-icount.h" -static const char * const sregnames[256] = { - [LBEG] = "LBEG", - [LEND] = "LEND", - [LCOUNT] = "LCOUNT", - [SAR] = "SAR", - [BR] = "BR", - [LITBASE] = "LITBASE", - [SCOMPARE1] = "SCOMPARE1", - [ACCLO] = "ACCLO", - [ACCHI] = "ACCHI", - [MR] = "MR0", - [MR + 1] = "MR1", - [MR + 2] = "MR2", - [MR + 3] = "MR3", - [WINDOW_BASE] = "WINDOW_BASE", - [WINDOW_START] = "WINDOW_START", - [PTEVADDR] = "PTEVADDR", - [RASID] = "RASID", - [ITLBCFG] = "ITLBCFG", - [DTLBCFG] = "DTLBCFG", - [IBREAKENABLE] = "IBREAKENABLE", - [CACHEATTR] = "CACHEATTR", - [ATOMCTL] = "ATOMCTL", - [IBREAKA] = "IBREAKA0", - [IBREAKA + 1] = "IBREAKA1", - [DBREAKA] = "DBREAKA0", - [DBREAKA + 1] = "DBREAKA1", - [DBREAKC] = "DBREAKC0", - [DBREAKC + 1] = "DBREAKC1", - [EPC1] = "EPC1", - [EPC1 + 1] = "EPC2", - [EPC1 + 2] = "EPC3", - [EPC1 + 3] = "EPC4", - [EPC1 + 4] = "EPC5", - [EPC1 + 5] = "EPC6", - [EPC1 + 6] = "EPC7", - [DEPC] = "DEPC", - [EPS2] = "EPS2", - [EPS2 + 1] = "EPS3", - [EPS2 + 2] = "EPS4", - [EPS2 + 3] = "EPS5", - [EPS2 + 4] = "EPS6", - [EPS2 + 5] = "EPS7", - [EXCSAVE1] = "EXCSAVE1", - [EXCSAVE1 + 1] = "EXCSAVE2", - [EXCSAVE1 + 2] = "EXCSAVE3", - [EXCSAVE1 + 3] = "EXCSAVE4", - [EXCSAVE1 + 4] = "EXCSAVE5", - [EXCSAVE1 + 5] = "EXCSAVE6", - [EXCSAVE1 + 6] = "EXCSAVE7", - [CPENABLE] = "CPENABLE", - [INTSET] = "INTSET", - [INTCLEAR] = "INTCLEAR", - [INTENABLE] = "INTENABLE", - [PS] = "PS", - [VECBASE] = "VECBASE", - [EXCCAUSE] = "EXCCAUSE", - [DEBUGCAUSE] = "DEBUGCAUSE", - [CCOUNT] = "CCOUNT", - [PRID] = "PRID", - [ICOUNT] = "ICOUNT", - [ICOUNTLEVEL] = "ICOUNTLEVEL", - [EXCVADDR] = "EXCVADDR", - [CCOMPARE] = "CCOMPARE0", - [CCOMPARE + 1] = "CCOMPARE1", - [CCOMPARE + 2] = "CCOMPARE2", +typedef struct XtensaReg { + const char *name; + uint64_t opt_bits; +} XtensaReg; + +#define XTENSA_REG(regname, opt) { \ + .name = (regname), \ + .opt_bits = XTENSA_OPTION_BIT(opt), \ + } + +#define XTENSA_REG_BITS(regname, opt) { \ + .name = (regname), \ + .opt_bits = (opt), \ + } + +static const XtensaReg sregnames[256] = { + [LBEG] = XTENSA_REG("LBEG", XTENSA_OPTION_LOOP), + [LEND] = XTENSA_REG("LEND", XTENSA_OPTION_LOOP), + [LCOUNT] = XTENSA_REG("LCOUNT", XTENSA_OPTION_LOOP), + [SAR] = XTENSA_REG_BITS("SAR", XTENSA_OPTION_ALL), + [BR] = XTENSA_REG("BR", XTENSA_OPTION_BOOLEAN), + [LITBASE] = XTENSA_REG("LITBASE", XTENSA_OPTION_EXTENDED_L32R), + [SCOMPARE1] = XTENSA_REG("SCOMPARE1", XTENSA_OPTION_CONDITIONAL_STORE), + [ACCLO] = XTENSA_REG("ACCLO", XTENSA_OPTION_MAC16), + [ACCHI] = XTENSA_REG("ACCHI", XTENSA_OPTION_MAC16), + [MR] = XTENSA_REG("MR0", XTENSA_OPTION_MAC16), + [MR + 1] = XTENSA_REG("MR1", XTENSA_OPTION_MAC16), + [MR + 2] = XTENSA_REG("MR2", XTENSA_OPTION_MAC16), + [MR + 3] = XTENSA_REG("MR3", XTENSA_OPTION_MAC16), + [WINDOW_BASE] = XTENSA_REG("WINDOW_BASE", XTENSA_OPTION_WINDOWED_REGISTER), + [WINDOW_START] = XTENSA_REG("WINDOW_START", + XTENSA_OPTION_WINDOWED_REGISTER), + [PTEVADDR] = XTENSA_REG("PTEVADDR", XTENSA_OPTION_MMU), + [RASID] = XTENSA_REG("RASID", XTENSA_OPTION_MMU), + [ITLBCFG] = XTENSA_REG("ITLBCFG", XTENSA_OPTION_MMU), + [DTLBCFG] = XTENSA_REG("DTLBCFG", XTENSA_OPTION_MMU), + [IBREAKENABLE] = XTENSA_REG("IBREAKENABLE", XTENSA_OPTION_DEBUG), + [CACHEATTR] = XTENSA_REG("CACHEATTR", XTENSA_OPTION_CACHEATTR), + [ATOMCTL] = XTENSA_REG("ATOMCTL", XTENSA_OPTION_ATOMCTL), + [IBREAKA] = XTENSA_REG("IBREAKA0", XTENSA_OPTION_DEBUG), + [IBREAKA + 1] = XTENSA_REG("IBREAKA1", XTENSA_OPTION_DEBUG), + [DBREAKA] = XTENSA_REG("DBREAKA0", XTENSA_OPTION_DEBUG), + [DBREAKA + 1] = XTENSA_REG("DBREAKA1", XTENSA_OPTION_DEBUG), + [DBREAKC] = XTENSA_REG("DBREAKC0", XTENSA_OPTION_DEBUG), + [DBREAKC + 1] = XTENSA_REG("DBREAKC1", XTENSA_OPTION_DEBUG), + [EPC1] = XTENSA_REG("EPC1", XTENSA_OPTION_EXCEPTION), + [EPC1 + 1] = XTENSA_REG("EPC2", XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EPC1 + 2] = XTENSA_REG("EPC3", XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EPC1 + 3] = XTENSA_REG("EPC4", XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EPC1 + 4] = XTENSA_REG("EPC5", XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EPC1 + 5] = XTENSA_REG("EPC6", XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EPC1 + 6] = XTENSA_REG("EPC7", XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [DEPC] = XTENSA_REG("DEPC", XTENSA_OPTION_EXCEPTION), + [EPS2] = XTENSA_REG("EPS2", XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EPS2 + 1] = XTENSA_REG("EPS3", XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EPS2 + 2] = XTENSA_REG("EPS4", XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EPS2 + 3] = XTENSA_REG("EPS5", XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EPS2 + 4] = XTENSA_REG("EPS6", XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EPS2 + 5] = XTENSA_REG("EPS7", XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EXCSAVE1] = XTENSA_REG("EXCSAVE1", XTENSA_OPTION_EXCEPTION), + [EXCSAVE1 + 1] = XTENSA_REG("EXCSAVE2", + XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EXCSAVE1 + 2] = XTENSA_REG("EXCSAVE3", + XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EXCSAVE1 + 3] = XTENSA_REG("EXCSAVE4", + XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EXCSAVE1 + 4] = XTENSA_REG("EXCSAVE5", + XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EXCSAVE1 + 5] = XTENSA_REG("EXCSAVE6", + XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [EXCSAVE1 + 6] = XTENSA_REG("EXCSAVE7", + XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), + [CPENABLE] = XTENSA_REG("CPENABLE", XTENSA_OPTION_COPROCESSOR), + [INTSET] = XTENSA_REG("INTSET", XTENSA_OPTION_INTERRUPT), + [INTCLEAR] = XTENSA_REG("INTCLEAR", XTENSA_OPTION_INTERRUPT), + [INTENABLE] = XTENSA_REG("INTENABLE", XTENSA_OPTION_INTERRUPT), + [PS] = XTENSA_REG_BITS("PS", XTENSA_OPTION_ALL), + [VECBASE] = XTENSA_REG("VECBASE", XTENSA_OPTION_RELOCATABLE_VECTOR), + [EXCCAUSE] = XTENSA_REG("EXCCAUSE", XTENSA_OPTION_EXCEPTION), + [DEBUGCAUSE] = XTENSA_REG("DEBUGCAUSE", XTENSA_OPTION_DEBUG), + [CCOUNT] = XTENSA_REG("CCOUNT", XTENSA_OPTION_TIMER_INTERRUPT), + [PRID] = XTENSA_REG("PRID", XTENSA_OPTION_PROCESSOR_ID), + [ICOUNT] = XTENSA_REG("ICOUNT", XTENSA_OPTION_DEBUG), + [ICOUNTLEVEL] = XTENSA_REG("ICOUNTLEVEL", XTENSA_OPTION_DEBUG), + [EXCVADDR] = XTENSA_REG("EXCVADDR", XTENSA_OPTION_EXCEPTION), + [CCOMPARE] = XTENSA_REG("CCOMPARE0", XTENSA_OPTION_TIMER_INTERRUPT), + [CCOMPARE + 1] = XTENSA_REG("CCOMPARE1", + XTENSA_OPTION_TIMER_INTERRUPT), + [CCOMPARE + 2] = XTENSA_REG("CCOMPARE2", + XTENSA_OPTION_TIMER_INTERRUPT), }; -static const char * const uregnames[256] = { - [THREADPTR] = "THREADPTR", - [FCR] = "FCR", - [FSR] = "FSR", +static const XtensaReg uregnames[256] = { + [THREADPTR] = XTENSA_REG("THREADPTR", XTENSA_OPTION_THREAD_POINTER), + [FCR] = XTENSA_REG("FCR", XTENSA_OPTION_FP_COPROCESSOR), + [FSR] = XTENSA_REG("FSR", XTENSA_OPTION_FP_COPROCESSOR), }; void xtensa_translate_init(void) @@ -185,18 +209,18 @@ void xtensa_translate_init(void) } for (i = 0; i < 256; ++i) { - if (sregnames[i]) { + if (sregnames[i].name) { cpu_SR[i] = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUXtensaState, sregs[i]), - sregnames[i]); + sregnames[i].name); } } for (i = 0; i < 256; ++i) { - if (uregnames[i]) { + if (uregnames[i].name) { cpu_UR[i] = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUXtensaState, uregs[i]), - uregnames[i]); + uregnames[i].name); } } #define GEN_HELPER 2 @@ -452,6 +476,18 @@ static void gen_brcondi(DisasContext *dc, TCGCond cond, tcg_temp_free(tmp); } +static void gen_check_sr(DisasContext *dc, uint32_t sr) +{ + if (!xtensa_option_bits_enabled(dc->config, sregnames[sr].opt_bits)) { + if (sregnames[sr].name) { + qemu_log("SR %s is not configured\n", sregnames[sr].name); + } else { + qemu_log("SR %d is not implemented\n", sr); + } + gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE); + } +} + static void gen_rsr_ccount(DisasContext *dc, TCGv_i32 d, uint32_t sr) { gen_advance_ccount(dc); @@ -473,14 +509,10 @@ static void gen_rsr(DisasContext *dc, TCGv_i32 d, uint32_t sr) [PTEVADDR] = gen_rsr_ptevaddr, }; - if (sregnames[sr]) { - if (rsr_handler[sr]) { - rsr_handler[sr](dc, d, sr); - } else { - tcg_gen_mov_i32(d, cpu_SR[sr]); - } + if (rsr_handler[sr]) { + rsr_handler[sr](dc, d, sr); } else { - qemu_log("RSR %d not implemented, ", sr); + tcg_gen_mov_i32(d, cpu_SR[sr]); } } @@ -721,14 +753,10 @@ static void gen_wsr(DisasContext *dc, uint32_t sr, TCGv_i32 s) [CCOMPARE + 2] = gen_wsr_ccompare, }; - if (sregnames[sr]) { - if (wsr_handler[sr]) { - wsr_handler[sr](dc, sr, s); - } else { - tcg_gen_mov_i32(cpu_SR[sr], s); - } + if (wsr_handler[sr]) { + wsr_handler[sr](dc, sr, s); } else { - qemu_log("WSR %d not implemented, ", sr); + tcg_gen_mov_i32(cpu_SR[sr], s); } } @@ -1439,6 +1467,7 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) case 6: /*XSR*/ { TCGv_i32 tmp = tcg_temp_new_i32(); + gen_check_sr(dc, RSR_SR); if (RSR_SR >= 64) { gen_check_privilege(dc); } @@ -1447,9 +1476,6 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) gen_rsr(dc, cpu_R[RRR_T], RSR_SR); gen_wsr(dc, RSR_SR, tmp); tcg_temp_free(tmp); - if (!sregnames[RSR_SR]) { - TBD(); - } } break; @@ -1672,25 +1698,21 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) case 3: /*RST3*/ switch (OP2) { case 0: /*RSR*/ + gen_check_sr(dc, RSR_SR); if (RSR_SR >= 64) { gen_check_privilege(dc); } gen_window_check1(dc, RRR_T); gen_rsr(dc, cpu_R[RRR_T], RSR_SR); - if (!sregnames[RSR_SR]) { - TBD(); - } break; case 1: /*WSR*/ + gen_check_sr(dc, RSR_SR); if (RSR_SR >= 64) { gen_check_privilege(dc); } gen_window_check1(dc, RRR_T); gen_wsr(dc, RSR_SR, cpu_R[RRR_T]); - if (!sregnames[RSR_SR]) { - TBD(); - } break; case 2: /*SEXTu*/ @@ -1807,7 +1829,7 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) gen_window_check1(dc, RRR_R); { int st = (RRR_S << 4) + RRR_T; - if (uregnames[st]) { + if (uregnames[st].name) { tcg_gen_mov_i32(cpu_R[RRR_R], cpu_UR[st]); } else { qemu_log("RUR %d not implemented, ", st); @@ -1818,7 +1840,7 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) case 15: /*WUR*/ gen_window_check1(dc, RRR_T); - if (uregnames[RSR_SR]) { + if (uregnames[RSR_SR].name) { gen_wur(RSR_SR, cpu_R[RRR_T]); } else { qemu_log("WUR %d not implemented, ", RSR_SR); @@ -3000,8 +3022,8 @@ void cpu_dump_state(CPUXtensaState *env, FILE *f, fprintf_function cpu_fprintf, cpu_fprintf(f, "PC=%08x\n\n", env->pc); for (i = j = 0; i < 256; ++i) { - if (sregnames[i]) { - cpu_fprintf(f, "%s=%08x%c", sregnames[i], env->sregs[i], + if (xtensa_option_bits_enabled(env->config, sregnames[i].opt_bits)) { + cpu_fprintf(f, "%12s=%08x%c", sregnames[i].name, env->sregs[i], (j++ % 4) == 3 ? '\n' : ' '); } } @@ -3009,8 +3031,8 @@ void cpu_dump_state(CPUXtensaState *env, FILE *f, fprintf_function cpu_fprintf, cpu_fprintf(f, (j % 4) == 0 ? "\n" : "\n\n"); for (i = j = 0; i < 256; ++i) { - if (uregnames[i]) { - cpu_fprintf(f, "%s=%08x%c", uregnames[i], env->uregs[i], + if (xtensa_option_bits_enabled(env->config, uregnames[i].opt_bits)) { + cpu_fprintf(f, "%s=%08x%c", uregnames[i].name, env->uregs[i], (j++ % 4) == 3 ? '\n' : ' '); } } @@ -3018,7 +3040,7 @@ void cpu_dump_state(CPUXtensaState *env, FILE *f, fprintf_function cpu_fprintf, cpu_fprintf(f, (j % 4) == 0 ? "\n" : "\n\n"); for (i = 0; i < 16; ++i) { - cpu_fprintf(f, "A%02d=%08x%c", i, env->regs[i], + cpu_fprintf(f, " A%02d=%08x%c", i, env->regs[i], (i % 4) == 3 ? '\n' : ' '); } From 53593e90d13264dc88b3281ddf75ceaa641df05a Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Wed, 5 Dec 2012 07:15:23 +0400 Subject: [PATCH 071/300] target-xtensa: better control rsr/wsr/xsr access to SRs There are read-only (DEBUGCAUSE, PRID) and write-only (INTCLEAR) SRs, and INTERRUPT/INTSET SR allows rsr/wsr, but not xsr. Raise illeagal opcode exception on illegal access to these SRs. Signed-off-by: Max Filippov Signed-off-by: Blue Swirl --- target-xtensa/translate.c | 49 ++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index 74b7b0f1aa..3303e5f693 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -81,16 +81,27 @@ static TCGv_i32 cpu_UR[256]; typedef struct XtensaReg { const char *name; uint64_t opt_bits; + enum { + SR_R = 1, + SR_W = 2, + SR_X = 4, + SR_RW = 3, + SR_RWX = 7, + } access; } XtensaReg; -#define XTENSA_REG(regname, opt) { \ +#define XTENSA_REG_ACCESS(regname, opt, acc) { \ .name = (regname), \ .opt_bits = XTENSA_OPTION_BIT(opt), \ + .access = (acc), \ } +#define XTENSA_REG(regname, opt) XTENSA_REG_ACCESS(regname, opt, SR_RWX) + #define XTENSA_REG_BITS(regname, opt) { \ .name = (regname), \ .opt_bits = (opt), \ + .access = SR_RWX, \ } static const XtensaReg sregnames[256] = { @@ -151,15 +162,15 @@ static const XtensaReg sregnames[256] = { [EXCSAVE1 + 6] = XTENSA_REG("EXCSAVE7", XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT), [CPENABLE] = XTENSA_REG("CPENABLE", XTENSA_OPTION_COPROCESSOR), - [INTSET] = XTENSA_REG("INTSET", XTENSA_OPTION_INTERRUPT), - [INTCLEAR] = XTENSA_REG("INTCLEAR", XTENSA_OPTION_INTERRUPT), + [INTSET] = XTENSA_REG_ACCESS("INTSET", XTENSA_OPTION_INTERRUPT, SR_RW), + [INTCLEAR] = XTENSA_REG_ACCESS("INTCLEAR", XTENSA_OPTION_INTERRUPT, SR_W), [INTENABLE] = XTENSA_REG("INTENABLE", XTENSA_OPTION_INTERRUPT), [PS] = XTENSA_REG_BITS("PS", XTENSA_OPTION_ALL), [VECBASE] = XTENSA_REG("VECBASE", XTENSA_OPTION_RELOCATABLE_VECTOR), [EXCCAUSE] = XTENSA_REG("EXCCAUSE", XTENSA_OPTION_EXCEPTION), - [DEBUGCAUSE] = XTENSA_REG("DEBUGCAUSE", XTENSA_OPTION_DEBUG), + [DEBUGCAUSE] = XTENSA_REG_ACCESS("DEBUGCAUSE", XTENSA_OPTION_DEBUG, SR_R), [CCOUNT] = XTENSA_REG("CCOUNT", XTENSA_OPTION_TIMER_INTERRUPT), - [PRID] = XTENSA_REG("PRID", XTENSA_OPTION_PROCESSOR_ID), + [PRID] = XTENSA_REG_ACCESS("PRID", XTENSA_OPTION_PROCESSOR_ID, SR_R), [ICOUNT] = XTENSA_REG("ICOUNT", XTENSA_OPTION_DEBUG), [ICOUNTLEVEL] = XTENSA_REG("ICOUNTLEVEL", XTENSA_OPTION_DEBUG), [EXCVADDR] = XTENSA_REG("EXCVADDR", XTENSA_OPTION_EXCEPTION), @@ -476,7 +487,7 @@ static void gen_brcondi(DisasContext *dc, TCGCond cond, tcg_temp_free(tmp); } -static void gen_check_sr(DisasContext *dc, uint32_t sr) +static void gen_check_sr(DisasContext *dc, uint32_t sr, unsigned access) { if (!xtensa_option_bits_enabled(dc->config, sregnames[sr].opt_bits)) { if (sregnames[sr].name) { @@ -485,6 +496,16 @@ static void gen_check_sr(DisasContext *dc, uint32_t sr) qemu_log("SR %d is not implemented\n", sr); } gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE); + } else if (!(sregnames[sr].access & access)) { + static const char * const access_text[] = { + [SR_R] = "rsr", + [SR_W] = "wsr", + [SR_X] = "xsr", + }; + assert(access < ARRAY_SIZE(access_text) && access_text[access]); + qemu_log("SR %s is not available for %s\n", sregnames[sr].name, + access_text[access]); + gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE); } } @@ -679,14 +700,6 @@ static void gen_wsr_ps(DisasContext *dc, uint32_t sr, TCGv_i32 v) gen_jumpi_check_loop_end(dc, -1); } -static void gen_wsr_debugcause(DisasContext *dc, uint32_t sr, TCGv_i32 v) -{ -} - -static void gen_wsr_prid(DisasContext *dc, uint32_t sr, TCGv_i32 v) -{ -} - static void gen_wsr_icount(DisasContext *dc, uint32_t sr, TCGv_i32 v) { if (dc->icount) { @@ -744,8 +757,6 @@ static void gen_wsr(DisasContext *dc, uint32_t sr, TCGv_i32 s) [INTCLEAR] = gen_wsr_intclear, [INTENABLE] = gen_wsr_intenable, [PS] = gen_wsr_ps, - [DEBUGCAUSE] = gen_wsr_debugcause, - [PRID] = gen_wsr_prid, [ICOUNT] = gen_wsr_icount, [ICOUNTLEVEL] = gen_wsr_icountlevel, [CCOMPARE] = gen_wsr_ccompare, @@ -1467,7 +1478,7 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) case 6: /*XSR*/ { TCGv_i32 tmp = tcg_temp_new_i32(); - gen_check_sr(dc, RSR_SR); + gen_check_sr(dc, RSR_SR, SR_X); if (RSR_SR >= 64) { gen_check_privilege(dc); } @@ -1698,7 +1709,7 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) case 3: /*RST3*/ switch (OP2) { case 0: /*RSR*/ - gen_check_sr(dc, RSR_SR); + gen_check_sr(dc, RSR_SR, SR_R); if (RSR_SR >= 64) { gen_check_privilege(dc); } @@ -1707,7 +1718,7 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) break; case 1: /*WSR*/ - gen_check_sr(dc, RSR_SR); + gen_check_sr(dc, RSR_SR, SR_W); if (RSR_SR >= 64) { gen_check_privilege(dc); } From b7909d81f7658f64bba0faed83e7c2fd6a52fcba Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Wed, 5 Dec 2012 07:15:24 +0400 Subject: [PATCH 072/300] target-xtensa: implement MISC SR The Miscellaneous Special Registers Option provides zero to four scratch registers within the processor readable and writable by RSR, WSR, and XSR. These registers are privileged. They may be useful for some application-specific exception and interrupt processing tasks in the kernel. The MISC registers are undefined after reset. See ISA, 4.7.3 for details. Signed-off-by: Max Filippov Signed-off-by: Blue Swirl --- target-xtensa/cpu.h | 1 + target-xtensa/overlay_tool.h | 1 + target-xtensa/translate.c | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/target-xtensa/cpu.h b/target-xtensa/cpu.h index a73d32d898..08fd5bc395 100644 --- a/target-xtensa/cpu.h +++ b/target-xtensa/cpu.h @@ -153,6 +153,7 @@ enum { ICOUNTLEVEL = 237, EXCVADDR = 238, CCOMPARE = 240, + MISC = 244, }; #define PS_INTLEVEL 0xf diff --git a/target-xtensa/overlay_tool.h b/target-xtensa/overlay_tool.h index 0b47029f8c..dd4f51a7b7 100644 --- a/target-xtensa/overlay_tool.h +++ b/target-xtensa/overlay_tool.h @@ -95,6 +95,7 @@ /* Other, TODO */ \ XCHAL_OPTION(XCHAL_HAVE_WINDOWED, XTENSA_OPTION_WINDOWED_REGISTER) | \ XCHAL_OPTION(XCHAL_HAVE_DEBUG, XTENSA_OPTION_DEBUG) |\ + XCHAL_OPTION(XCHAL_NUM_MISC_REGS > 0, XTENSA_OPTION_MISC_SR) | \ XCHAL_OPTION(XCHAL_HAVE_THREADPTR, XTENSA_OPTION_THREAD_POINTER) | \ XCHAL_OPTION(XCHAL_HAVE_PRID, XTENSA_OPTION_PROCESSOR_ID)) diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index 3303e5f693..52edcefb05 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -179,6 +179,10 @@ static const XtensaReg sregnames[256] = { XTENSA_OPTION_TIMER_INTERRUPT), [CCOMPARE + 2] = XTENSA_REG("CCOMPARE2", XTENSA_OPTION_TIMER_INTERRUPT), + [MISC] = XTENSA_REG("MISC0", XTENSA_OPTION_MISC_SR), + [MISC + 1] = XTENSA_REG("MISC1", XTENSA_OPTION_MISC_SR), + [MISC + 2] = XTENSA_REG("MISC2", XTENSA_OPTION_MISC_SR), + [MISC + 3] = XTENSA_REG("MISC3", XTENSA_OPTION_MISC_SR), }; static const XtensaReg uregnames[256] = { From efdfac94f48f8589a0d60b650c7bed989a341eaa Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Wed, 5 Dec 2012 07:15:25 +0400 Subject: [PATCH 073/300] target-xtensa: add SR accessibility unit tests Signed-off-by: Max Filippov Signed-off-by: Blue Swirl --- tests/tcg/xtensa/Makefile | 1 + tests/tcg/xtensa/macros.inc | 2 +- tests/tcg/xtensa/test_sr.S | 90 +++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 tests/tcg/xtensa/test_sr.S diff --git a/tests/tcg/xtensa/Makefile b/tests/tcg/xtensa/Makefile index 0ff0ccfb8c..56cfe0f7b8 100644 --- a/tests/tcg/xtensa/Makefile +++ b/tests/tcg/xtensa/Makefile @@ -45,6 +45,7 @@ TESTCASES += test_rst0.tst TESTCASES += test_sar.tst TESTCASES += test_sext.tst TESTCASES += test_shift.tst +TESTCASES += test_sr.tst TESTCASES += test_timer.tst TESTCASES += test_windowed.tst diff --git a/tests/tcg/xtensa/macros.inc b/tests/tcg/xtensa/macros.inc index 23bf3e96c8..c9be1ce516 100644 --- a/tests/tcg/xtensa/macros.inc +++ b/tests/tcg/xtensa/macros.inc @@ -1,7 +1,7 @@ .macro test_suite name .data status: .word result -result: .space 20 +result: .space 256 .text .global main .align 4 diff --git a/tests/tcg/xtensa/test_sr.S b/tests/tcg/xtensa/test_sr.S new file mode 100644 index 0000000000..470c03dae2 --- /dev/null +++ b/tests/tcg/xtensa/test_sr.S @@ -0,0 +1,90 @@ +.include "macros.inc" + +test_suite sr + +.macro sr_op sym, op_sym, op_byte, sr + .if \sym + \op_sym a4, \sr + .else + .byte 0x40, \sr, \op_byte + .endif +.endm + +.macro test_sr_op sym, mask, op, op_byte, sr + movi a4, 0 + .if (\mask) + set_vector kernel, 0 + sr_op \sym, \op, \op_byte, \sr + .else + set_vector kernel, 2f +1: + sr_op \sym, \op, \op_byte, \sr + test_fail +2: + reset_ps + rsr a2, exccause + assert eqi, a2, 0 + rsr a2, epc1 + movi a3, 1b + assert eq, a2, a3 + .endif +.endm + +.macro test_sr_mask sr, sym, mask +test \sr + test_sr_op \sym, \mask & 1, rsr, 0x03, \sr + test_sr_op \sym, \mask & 2, wsr, 0x13, \sr + test_sr_op \sym, \mask & 4, xsr, 0x61, \sr +test_end +.endm + +.macro test_sr sr, conf + test_sr_mask \sr, \conf, 7 +.endm + +test_sr acchi, 1 +test_sr acclo, 1 +test_sr_mask /*atomctl*/99, 0, 0 +test_sr_mask /*br*/4, 0, 0 +test_sr_mask /*cacheattr*/98, 0, 0 +test_sr ccompare0, 1 +test_sr ccount, 1 +test_sr cpenable, 1 +test_sr dbreaka0, 1 +test_sr dbreakc0, 1 +test_sr_mask debugcause, 1, 1 +test_sr depc, 1 +test_sr dtlbcfg, 1 +test_sr epc1, 1 +test_sr epc2, 1 +test_sr eps2, 1 +test_sr exccause, 1 +test_sr excsave1, 1 +test_sr excsave2, 1 +test_sr excvaddr, 1 +test_sr ibreaka0, 1 +test_sr ibreakenable, 1 +test_sr icount, 1 +test_sr icountlevel, 1 +test_sr_mask /*intclear*/227, 0, 2 +test_sr_mask /*interrupt*/226, 0, 3 +test_sr intenable, 1 +test_sr itlbcfg, 1 +test_sr lbeg, 1 +test_sr lcount, 1 +test_sr lend, 1 +test_sr litbase, 1 +test_sr m0, 1 +test_sr misc0, 1 +test_sr_mask /*prefctl*/40, 0, 0 +test_sr_mask /*prid*/235, 0, 1 +test_sr ps, 1 +test_sr ptevaddr, 1 +test_sr rasid, 1 +test_sr sar, 1 +test_sr scompare1, 1 +test_sr vecbase, 1 +test_sr windowbase, 1 +test_sr windowstart, 1 + +test_suite_end From 5dacd229ebb46c236cb1dd0c65a4e4f2cfb55dfb Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Wed, 5 Dec 2012 07:15:26 +0400 Subject: [PATCH 074/300] target-xtensa: add s32c1i unit tests Signed-off-by: Max Filippov Signed-off-by: Blue Swirl --- tests/tcg/xtensa/Makefile | 1 + tests/tcg/xtensa/test_s32c1i.S | 39 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 tests/tcg/xtensa/test_s32c1i.S diff --git a/tests/tcg/xtensa/Makefile b/tests/tcg/xtensa/Makefile index 56cfe0f7b8..002fd871d9 100644 --- a/tests/tcg/xtensa/Makefile +++ b/tests/tcg/xtensa/Makefile @@ -42,6 +42,7 @@ endif TESTCASES += test_quo.tst TESTCASES += test_rem.tst TESTCASES += test_rst0.tst +TESTCASES += test_s32c1i.tst TESTCASES += test_sar.tst TESTCASES += test_sext.tst TESTCASES += test_shift.tst diff --git a/tests/tcg/xtensa/test_s32c1i.S b/tests/tcg/xtensa/test_s32c1i.S new file mode 100644 index 0000000000..4536015a84 --- /dev/null +++ b/tests/tcg/xtensa/test_s32c1i.S @@ -0,0 +1,39 @@ +.include "macros.inc" + +test_suite s32c1i + +test s32c1i_nowrite + movi a2, 1f + movi a3, 1 + wsr a3, scompare1 + movi a1, 2 + s32c1i a1, a2, 0 + assert ne, a1, a3 + l32i a1, a2, 0 + assert eqi, a1, 3 + +.data +.align 4 +1: + .word 3 +.text +test_end + +test s32c1i_write + movi a2, 1f + movi a3, 3 + wsr a3, scompare1 + movi a1, 2 + s32c1i a1, a2, 0 + assert eq, a1, a3 + l32i a1, a2, 0 + assert eqi, a1, 2 + +.data +.align 4 +1: + .word 3 +.text +test_end + +test_suite_end From f877d09e63bd94424dab049da75bc1cd601a7609 Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Wed, 5 Dec 2012 07:15:27 +0400 Subject: [PATCH 075/300] target-xtensa: use movcond where possible Use movcond for all sorts of conditional moves, ABS, CLAMPS, MIN/MAX opcodes. Signed-off-by: Max Filippov Signed-off-by: Blue Swirl --- target-xtensa/translate.c | 92 ++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 50 deletions(-) diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index 52edcefb05..5d8762c0ca 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -1403,12 +1403,14 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) case 1: /*ABS*/ { - int label = gen_new_label(); - tcg_gen_mov_i32(cpu_R[RRR_R], cpu_R[RRR_T]); - tcg_gen_brcondi_i32( - TCG_COND_GE, cpu_R[RRR_R], 0, label); - tcg_gen_neg_i32(cpu_R[RRR_R], cpu_R[RRR_T]); - gen_set_label(label); + TCGv_i32 zero = tcg_const_i32(0); + TCGv_i32 neg = tcg_temp_new_i32(); + + tcg_gen_neg_i32(neg, cpu_R[RRR_T]); + tcg_gen_movcond_i32(TCG_COND_GE, cpu_R[RRR_R], + cpu_R[RRR_T], zero, cpu_R[RRR_T], neg); + tcg_temp_free(neg); + tcg_temp_free(zero); } break; @@ -1755,22 +1757,20 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) { TCGv_i32 tmp1 = tcg_temp_new_i32(); TCGv_i32 tmp2 = tcg_temp_new_i32(); - int label = gen_new_label(); + TCGv_i32 zero = tcg_const_i32(0); tcg_gen_sari_i32(tmp1, cpu_R[RRR_S], 24 - RRR_T); tcg_gen_xor_i32(tmp2, tmp1, cpu_R[RRR_S]); tcg_gen_andi_i32(tmp2, tmp2, 0xffffffff << (RRR_T + 7)); - tcg_gen_mov_i32(cpu_R[RRR_R], cpu_R[RRR_S]); - tcg_gen_brcondi_i32(TCG_COND_EQ, tmp2, 0, label); tcg_gen_sari_i32(tmp1, cpu_R[RRR_S], 31); - tcg_gen_xori_i32(cpu_R[RRR_R], tmp1, - 0xffffffff >> (25 - RRR_T)); - - gen_set_label(label); + tcg_gen_xori_i32(tmp1, tmp1, 0xffffffff >> (25 - RRR_T)); + tcg_gen_movcond_i32(TCG_COND_EQ, cpu_R[RRR_R], tmp2, zero, + cpu_R[RRR_S], tmp1); tcg_temp_free(tmp1); tcg_temp_free(tmp2); + tcg_temp_free(zero); } break; @@ -1787,19 +1787,9 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) TCG_COND_LEU, TCG_COND_GEU }; - int label = gen_new_label(); - - if (RRR_R != RRR_T) { - tcg_gen_mov_i32(cpu_R[RRR_R], cpu_R[RRR_S]); - tcg_gen_brcond_i32(cond[OP2 - 4], - cpu_R[RRR_S], cpu_R[RRR_T], label); - tcg_gen_mov_i32(cpu_R[RRR_R], cpu_R[RRR_T]); - } else { - tcg_gen_brcond_i32(cond[OP2 - 4], - cpu_R[RRR_T], cpu_R[RRR_S], label); - tcg_gen_mov_i32(cpu_R[RRR_R], cpu_R[RRR_S]); - } - gen_set_label(label); + tcg_gen_movcond_i32(cond[OP2 - 4], cpu_R[RRR_R], + cpu_R[RRR_S], cpu_R[RRR_T], + cpu_R[RRR_S], cpu_R[RRR_T]); } break; @@ -1810,15 +1800,16 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) gen_window_check3(dc, RRR_R, RRR_S, RRR_T); { static const TCGCond cond[] = { - TCG_COND_NE, TCG_COND_EQ, + TCG_COND_NE, + TCG_COND_LT, TCG_COND_GE, - TCG_COND_LT }; - int label = gen_new_label(); - tcg_gen_brcondi_i32(cond[OP2 - 8], cpu_R[RRR_T], 0, label); - tcg_gen_mov_i32(cpu_R[RRR_R], cpu_R[RRR_S]); - gen_set_label(label); + TCGv_i32 zero = tcg_const_i32(0); + + tcg_gen_movcond_i32(cond[OP2 - 8], cpu_R[RRR_R], + cpu_R[RRR_T], zero, cpu_R[RRR_S], cpu_R[RRR_R]); + tcg_temp_free(zero); } break; @@ -1827,16 +1818,16 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) HAS_OPTION(XTENSA_OPTION_BOOLEAN); gen_window_check2(dc, RRR_R, RRR_S); { - int label = gen_new_label(); + TCGv_i32 zero = tcg_const_i32(0); TCGv_i32 tmp = tcg_temp_new_i32(); tcg_gen_andi_i32(tmp, cpu_SR[BR], 1 << RRR_T); - tcg_gen_brcondi_i32( - OP2 & 1 ? TCG_COND_EQ : TCG_COND_NE, - tmp, 0, label); - tcg_gen_mov_i32(cpu_R[RRR_R], cpu_R[RRR_S]); - gen_set_label(label); + tcg_gen_movcond_i32(OP2 & 1 ? TCG_COND_NE : TCG_COND_EQ, + cpu_R[RRR_R], tmp, zero, + cpu_R[RRR_S], cpu_R[RRR_R]); + tcg_temp_free(tmp); + tcg_temp_free(zero); } break; @@ -2127,15 +2118,16 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) gen_check_cpenable(dc, 0); { static const TCGCond cond[] = { - TCG_COND_NE, TCG_COND_EQ, + TCG_COND_NE, + TCG_COND_LT, TCG_COND_GE, - TCG_COND_LT }; - int label = gen_new_label(); - tcg_gen_brcondi_i32(cond[OP2 - 8], cpu_R[RRR_T], 0, label); - tcg_gen_mov_i32(cpu_FR[RRR_R], cpu_FR[RRR_S]); - gen_set_label(label); + TCGv_i32 zero = tcg_const_i32(0); + + tcg_gen_movcond_i32(cond[OP2 - 8], cpu_FR[RRR_R], + cpu_R[RRR_T], zero, cpu_FR[RRR_S], cpu_FR[RRR_R]); + tcg_temp_free(zero); } break; @@ -2144,16 +2136,16 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) HAS_OPTION(XTENSA_OPTION_BOOLEAN); gen_check_cpenable(dc, 0); { - int label = gen_new_label(); + TCGv_i32 zero = tcg_const_i32(0); TCGv_i32 tmp = tcg_temp_new_i32(); tcg_gen_andi_i32(tmp, cpu_SR[BR], 1 << RRR_T); - tcg_gen_brcondi_i32( - OP2 & 1 ? TCG_COND_EQ : TCG_COND_NE, - tmp, 0, label); - tcg_gen_mov_i32(cpu_FR[RRR_R], cpu_FR[RRR_S]); - gen_set_label(label); + tcg_gen_movcond_i32(OP2 & 1 ? TCG_COND_NE : TCG_COND_EQ, + cpu_FR[RRR_R], tmp, zero, + cpu_FR[RRR_S], cpu_FR[RRR_R]); + tcg_temp_free(tmp); + tcg_temp_free(zero); } break; From 24c35a504e8b09e697d0268bbefb2a329b901611 Mon Sep 17 00:00:00 2001 From: Peter Maydell Date: Fri, 12 Oct 2012 03:55:51 +0000 Subject: [PATCH 076/300] linux-user: Merge pread/pwrite into pread64/pwrite64 The Linux syscalls underlying pread() and pwrite() take a 64 bit offset on all architectures, even if some of them name the syscall "pread/pwrite" rather than "pread64/pwrite64" for historical reasons. So move the four QEMU target architectures (arm, i386, sparc, unicore32) which were defining TARGET_NR_pread/pwrite to define TARGET_NR_pread64/pwrite64 instead, and drop the TARGET_NR_pread/pwrite implementation code completely. (Based on examination of the kernel sources for the four architectures this patch affects.) Signed-off-by: Peter Maydell Signed-off-by: Blue Swirl --- linux-user/arm/syscall_nr.h | 4 ++-- linux-user/i386/syscall_nr.h | 4 ++-- linux-user/sparc/syscall_nr.h | 4 ++-- linux-user/strace.list | 6 ------ linux-user/syscall.c | 18 ------------------ linux-user/unicore32/syscall_nr.h | 4 ++-- 6 files changed, 8 insertions(+), 32 deletions(-) diff --git a/linux-user/arm/syscall_nr.h b/linux-user/arm/syscall_nr.h index 5356395659..42d68550dc 100644 --- a/linux-user/arm/syscall_nr.h +++ b/linux-user/arm/syscall_nr.h @@ -182,8 +182,8 @@ #define TARGET_NR_rt_sigtimedwait (177) #define TARGET_NR_rt_sigqueueinfo (178) #define TARGET_NR_rt_sigsuspend (179) -#define TARGET_NR_pread (180) -#define TARGET_NR_pwrite (181) +#define TARGET_NR_pread64 (180) +#define TARGET_NR_pwrite64 (181) #define TARGET_NR_chown (182) #define TARGET_NR_getcwd (183) #define TARGET_NR_capget (184) diff --git a/linux-user/i386/syscall_nr.h b/linux-user/i386/syscall_nr.h index 74abfcacb4..f0803050d8 100644 --- a/linux-user/i386/syscall_nr.h +++ b/linux-user/i386/syscall_nr.h @@ -182,8 +182,8 @@ #define TARGET_NR_rt_sigtimedwait 177 #define TARGET_NR_rt_sigqueueinfo 178 #define TARGET_NR_rt_sigsuspend 179 -#define TARGET_NR_pread 180 -#define TARGET_NR_pwrite 181 +#define TARGET_NR_pread64 180 +#define TARGET_NR_pwrite64 181 #define TARGET_NR_chown 182 #define TARGET_NR_getcwd 183 #define TARGET_NR_capget 184 diff --git a/linux-user/sparc/syscall_nr.h b/linux-user/sparc/syscall_nr.h index f201f9f788..061711cc03 100644 --- a/linux-user/sparc/syscall_nr.h +++ b/linux-user/sparc/syscall_nr.h @@ -62,8 +62,8 @@ #define TARGET_NR_getpagesize 64 /* Common */ #define TARGET_NR_msync 65 /* Common in newer 1.3.x revs... */ #define TARGET_NR_vfork 66 /* Common */ -#define TARGET_NR_pread 67 /* Linux Specific */ -#define TARGET_NR_pwrite 68 /* Linux Specific */ +#define TARGET_NR_pread64 67 /* Linux Specific */ +#define TARGET_NR_pwrite64 68 /* Linux Specific */ #define TARGET_NR_geteuid32 69 /* Linux sparc32, sbrk under SunOS */ #define TARGET_NR_getegid32 70 /* Linux sparc32, sstk under SunOS */ #define TARGET_NR_mmap 71 /* Common */ diff --git a/linux-user/strace.list b/linux-user/strace.list index af3c6a0cce..08f115d843 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -972,9 +972,6 @@ #ifdef TARGET_NR_prctl { TARGET_NR_prctl, "prctl" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_pread -{ TARGET_NR_pread, "pread" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_pread64 { TARGET_NR_pread64, "pread64" , NULL, NULL, NULL }, #endif @@ -993,9 +990,6 @@ #ifdef TARGET_NR_putpmsg { TARGET_NR_putpmsg, "putpmsg" , NULL, NULL, NULL }, #endif -#ifdef TARGET_NR_pwrite -{ TARGET_NR_pwrite, "pwrite" , NULL, NULL, NULL }, -#endif #ifdef TARGET_NR_pwrite64 { TARGET_NR_pwrite64, "pwrite64" , NULL, NULL, NULL }, #endif diff --git a/linux-user/syscall.c b/linux-user/syscall.c index e4291ed776..31d5276465 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -7449,24 +7449,6 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, goto unimplemented; #endif #endif -#ifdef TARGET_NR_pread - case TARGET_NR_pread: - if (regpairs_aligned(cpu_env)) - arg4 = arg5; - if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0))) - goto efault; - ret = get_errno(pread(arg1, p, arg3, arg4)); - unlock_user(p, arg2, ret); - break; - case TARGET_NR_pwrite: - if (regpairs_aligned(cpu_env)) - arg4 = arg5; - if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1))) - goto efault; - ret = get_errno(pwrite(arg1, p, arg3, arg4)); - unlock_user(p, arg2, 0); - break; -#endif #ifdef TARGET_NR_pread64 case TARGET_NR_pread64: if (regpairs_aligned(cpu_env)) { diff --git a/linux-user/unicore32/syscall_nr.h b/linux-user/unicore32/syscall_nr.h index 9c72d84d80..486b8c45a0 100644 --- a/linux-user/unicore32/syscall_nr.h +++ b/linux-user/unicore32/syscall_nr.h @@ -187,8 +187,8 @@ #define TARGET_NR_rt_sigtimedwait 177 #define TARGET_NR_rt_sigqueueinfo 178 #define TARGET_NR_rt_sigsuspend 179 -#define TARGET_NR_pread 180 -#define TARGET_NR_pwrite 181 +#define TARGET_NR_pread64 180 +#define TARGET_NR_pwrite64 181 #define TARGET_NR_chown 182 #define TARGET_NR_getcwd 183 #define TARGET_NR_capget 184 From e49d021e574c3ee8e443bcc84d1fb7dfb4c87c42 Mon Sep 17 00:00:00 2001 From: Peter Maydell Date: Fri, 7 Dec 2012 15:39:13 +0000 Subject: [PATCH 077/300] configure: Default to 'cc', not 'gcc' Default to 'cc' as our compiler, rather than 'gcc'. We used to have to insist on gcc when we still kept the CPU env in a fixed global register, but this is no longer necessary and we will now compile OK on clang as well as gcc. Using 'cc' should generally result in us using the most standard and maintained system compiler for the platform. (For instance on newer MacOS X 'gcc' exists but is an elderly compiler provided mostly for legacy reasons, and 'cc' (which is clang) is definitely the better choice.) On Linux there will generally be no user-visible change since cc will be gcc. This changeover necessitates a slight reworking of how we set the 'cc' variable, because GNU cross toolchains generally provide a '${cross_prefix}gcc' but not a '${cross_prefix}cc'. Signed-off-by: Peter Maydell Signed-off-by: Blue Swirl --- configure | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 44034d66b9..e5aedef788 100755 --- a/configure +++ b/configure @@ -116,7 +116,7 @@ audio_drv_list="" audio_card_list="ac97 es1370 sb16 hda" audio_possible_cards="ac97 es1370 sb16 cs4231a adlib gus hda" block_drv_whitelist="" -host_cc="gcc" +host_cc="cc" libs_softmmu="" libs_tools="" audio_pt_int="" @@ -250,7 +250,16 @@ done # Using uname is really, really broken. Once we have the right set of checks # we can eliminate its usage altogether. -cc="${CC-${cross_prefix}gcc}" +# Preferred compiler: +# ${CC} (if set) +# ${cross_prefix}gcc (if cross-prefix specified) +# system compiler +if test -z "${CC}${cross_prefix}"; then + cc="$host_cc" +else + cc="${CC-${cross_prefix}gcc}" +fi + ar="${AR-${cross_prefix}ar}" objcopy="${OBJCOPY-${cross_prefix}objcopy}" ld="${LD-${cross_prefix}ld}" From d281084d3e51f03999d12a506491a0c6f31b40e8 Mon Sep 17 00:00:00 2001 From: Alex Williamson Date: Mon, 10 Dec 2012 11:30:03 -0700 Subject: [PATCH 078/300] vfio-pci: Don't use kvm_irqchip_in_kernel kvm_irqchip_in_kernel() has an architecture specific meaning, so we shouldn't be using it to determine whether to enabled KVM INTx bypass. kvm_irqfds_enabled() seems most appropriate. Also use this to protect our other call to kvm_check_extension() as that explodes when KVM isn't enabled. Signed-off-by: Alex Williamson Cc: qemu-stable@nongnu.org --- hw/vfio_pci.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hw/vfio_pci.c b/hw/vfio_pci.c index 7c27834e06..fbfe670078 100644 --- a/hw/vfio_pci.c +++ b/hw/vfio_pci.c @@ -275,7 +275,7 @@ static void vfio_enable_intx_kvm(VFIODevice *vdev) int ret, argsz; int32_t *pfd; - if (!kvm_irqchip_in_kernel() || + if (!kvm_irqfds_enabled() || vdev->intx.route.mode != PCI_INTX_ENABLED || !kvm_check_extension(kvm_state, KVM_CAP_IRQFD_RESAMPLE)) { return; @@ -438,7 +438,8 @@ static int vfio_enable_intx(VFIODevice *vdev) * Only conditional to avoid generating error messages on platforms * where we won't actually use the result anyway. */ - if (kvm_check_extension(kvm_state, KVM_CAP_IRQFD_RESAMPLE)) { + if (kvm_irqfds_enabled() && + kvm_check_extension(kvm_state, KVM_CAP_IRQFD_RESAMPLE)) { vdev->intx.route = pci_device_route_intx_to_irq(&vdev->pdev, vdev->intx.pin); } From ff1562908d1da12362aa9e3f3bfc7ba0da8114a4 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 11 Dec 2012 08:24:30 +0100 Subject: [PATCH 079/300] seabios: update to e8a76b0f225bba5ba9d63ab227e0a37b3beb1059 This patch updates seabios to latest git master. Changes: (1) q35 patches merged. (2) some acpi cleanups. (3) fixes irq 8 conflict. (3) makes this a candidate for the stable branch Cc: qemu-stable@nongnu.org Signed-off-by: Gerd Hoffmann --- pc-bios/acpi-dsdt.aml | Bin 4540 -> 4438 bytes pc-bios/bios.bin | Bin 131072 -> 262144 bytes pc-bios/q35-acpi-dsdt.aml | Bin 0 -> 7458 bytes roms/seabios | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 pc-bios/q35-acpi-dsdt.aml diff --git a/pc-bios/acpi-dsdt.aml b/pc-bios/acpi-dsdt.aml index bb3dd83a56f84131f9c9f968cbee9385931cecd3..18b4dc1aa53859593604abe598b05784b116a360 100644 GIT binary patch delta 574 zcmdm^d`*eVCD`0uHizAVnY*n>jg-F>?BHKs32dzQI|{EXc(-IgqP>R~4=*x=C`fJg=xQ1J{26 zH&!HJPnOB&xFiju8`a|U0wN5J0}PFw85lhD8Q6UST>TgsEEt%b9YG9cXD1-V;pPG) z1$?9@zv8l&Gxv6KiHA9nnOTH0J~+gYVF?#MN4#@T@MM2(N#^J#^~nX?5_Vt_K@Kif zB?f^?hUg|Q7B?4XxcAr@L?pm^3qa;4EMS|Qz_5g2Aq(87Q`|E3(M@(f0U>bvSm1g< zF2&R%D8R+*&RD@*!OX#-)W86;)Ro2A-`5c4U{*#*Xu_-p`4g8hKbU{;Ff(u{34qOU zW0}03N6ZT9WKh81)W`IL38;+&s7=6|10L>^FR`0XuH^ONb)OB2Hv!iYP*iT5?7%+x y6mL5t!{m#6+LLSfY}tI+ef+$gCOh$2PyWLfJoy5j&g5!-V94_8Z2rZ6h!Fs+D3!_p delta 695 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 WNQ(5Ag=7s~Vr%* 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 literal 0 HcmV?d00001 diff --git a/roms/seabios b/roms/seabios index b1c35f2b28..e8a76b0f22 160000 --- a/roms/seabios +++ b/roms/seabios @@ -1 +1 @@ -Subproject commit b1c35f2b28cc0c94ebed8176ff61ac0e0b377798 +Subproject commit e8a76b0f225bba5ba9d63ab227e0a37b3beb1059 From 9fe3781f09f94f3ce76e52899bcdeb0d5164dbb1 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Tue, 4 Dec 2012 16:12:18 +0100 Subject: [PATCH 080/300] tests: use aio_poll() instead of aio_flush() in test-aio.c There has been confusion between various aio wait and flush functions. It's time to get rid of qemu_aio_flush() but in the aio test cases we really do want this low-level functionality. Therefore declare a local wait_for_aio() helper for the test cases. Drop the aio_flush() test case. Signed-off-by: Stefan Hajnoczi Acked-by: Paolo Bonzini Signed-off-by: Kevin Wolf --- tests/test-aio.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/tests/test-aio.c b/tests/test-aio.c index f53c908707..a8a4f0c6a5 100644 --- a/tests/test-aio.c +++ b/tests/test-aio.c @@ -15,6 +15,14 @@ AioContext *ctx; +/* Wait until there are no more BHs or AIO requests */ +static void wait_for_aio(void) +{ + while (aio_poll(ctx, true)) { + /* Do nothing */ + } +} + /* Simple callbacks for testing. */ typedef struct { @@ -78,14 +86,6 @@ static void test_notify(void) g_assert(!aio_poll(ctx, false)); } -static void test_flush(void) -{ - g_assert(!aio_poll(ctx, false)); - aio_notify(ctx); - aio_flush(ctx); - g_assert(!aio_poll(ctx, false)); -} - static void test_bh_schedule(void) { BHTestData data = { .n = 0 }; @@ -116,7 +116,7 @@ static void test_bh_schedule10(void) g_assert(aio_poll(ctx, true)); g_assert_cmpint(data.n, ==, 2); - aio_flush(ctx); + wait_for_aio(); g_assert_cmpint(data.n, ==, 10); g_assert(!aio_poll(ctx, false)); @@ -164,7 +164,7 @@ static void test_bh_delete_from_cb(void) qemu_bh_schedule(data1.bh); g_assert_cmpint(data1.n, ==, 0); - aio_flush(ctx); + wait_for_aio(); g_assert_cmpint(data1.n, ==, data1.max); g_assert(data1.bh == NULL); @@ -200,7 +200,7 @@ static void test_bh_delete_from_cb_many(void) g_assert_cmpint(data4.n, ==, 1); g_assert(data1.bh == NULL); - aio_flush(ctx); + wait_for_aio(); g_assert_cmpint(data1.n, ==, data1.max); g_assert_cmpint(data2.n, ==, data2.max); g_assert_cmpint(data3.n, ==, data3.max); @@ -219,7 +219,7 @@ static void test_bh_flush(void) qemu_bh_schedule(data.bh); g_assert_cmpint(data.n, ==, 0); - aio_flush(ctx); + wait_for_aio(); g_assert_cmpint(data.n, ==, 1); g_assert(!aio_poll(ctx, false)); @@ -281,7 +281,7 @@ static void test_flush_event_notifier(void) g_assert_cmpint(data.active, ==, 9); g_assert(aio_poll(ctx, false)); - aio_flush(ctx); + wait_for_aio(); g_assert_cmpint(data.n, ==, 10); g_assert_cmpint(data.active, ==, 0); g_assert(!aio_poll(ctx, false)); @@ -325,7 +325,7 @@ static void test_wait_event_notifier_noflush(void) g_assert_cmpint(data.n, ==, 2); event_notifier_set(&dummy.e); - aio_flush(ctx); + wait_for_aio(); g_assert_cmpint(data.n, ==, 2); g_assert_cmpint(dummy.n, ==, 1); g_assert_cmpint(dummy.active, ==, 0); @@ -346,7 +346,7 @@ static void test_wait_event_notifier_noflush(void) * - sometimes both the AioContext and the glib main loop wake * themselves up. Hence, some "g_assert(!aio_poll(ctx, false));" * are replaced by "while (g_main_context_iteration(NULL, false));". - * - there is no exact replacement for aio_flush's blocking wait. + * - there is no exact replacement for a blocking wait. * "while (g_main_context_iteration(NULL, true)" seems to work, * but it is not documented _why_ it works. For these tests a * non-blocking loop like "while (g_main_context_iteration(NULL, false)" @@ -637,7 +637,6 @@ int main(int argc, char **argv) g_test_init(&argc, &argv, NULL); g_test_add_func("/aio/notify", test_notify); - g_test_add_func("/aio/flush", test_flush); g_test_add_func("/aio/bh/schedule", test_bh_schedule); g_test_add_func("/aio/bh/schedule10", test_bh_schedule10); g_test_add_func("/aio/bh/cancel", test_bh_cancel); From 8a805c222caa0e20bf11d2267f726d0bb5917d94 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Tue, 4 Dec 2012 16:12:19 +0100 Subject: [PATCH 081/300] tests: avoid qemu_aio_flush() in test-thread-pool.c We need to eliminate calls to qemu_aio_flush() since the function is being removed. Most callers will use bdrv_drain_all() instead but test-thread-pool.c is lower level. Since the test uses the global AioContext we can loop on qemu_aio_wait() to wait for aio and bh activity to complete. Signed-off-by: Stefan Hajnoczi Acked-by: Paolo Bonzini Signed-off-by: Kevin Wolf --- tests/test-thread-pool.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/tests/test-thread-pool.c b/tests/test-thread-pool.c index fea0445fb4..ea8e676b0c 100644 --- a/tests/test-thread-pool.c +++ b/tests/test-thread-pool.c @@ -47,11 +47,19 @@ static void qemu_aio_wait_nonblocking(void) qemu_aio_wait(); } +/* Wait until all aio and bh activity has finished */ +static void qemu_aio_wait_all(void) +{ + while (qemu_aio_wait()) { + /* Do nothing */ + } +} + static void test_submit(void) { WorkerTestData data = { .n = 0 }; thread_pool_submit(worker_cb, &data); - qemu_aio_flush(); + qemu_aio_wait_all(); g_assert_cmpint(data.n, ==, 1); } @@ -63,7 +71,7 @@ static void test_submit_aio(void) /* The callbacks are not called until after the first wait. */ active = 1; g_assert_cmpint(data.ret, ==, -EINPROGRESS); - qemu_aio_flush(); + qemu_aio_wait_all(); g_assert_cmpint(active, ==, 0); g_assert_cmpint(data.n, ==, 1); g_assert_cmpint(data.ret, ==, 0); @@ -84,7 +92,7 @@ static void co_test_cb(void *opaque) data->ret = 0; active--; - /* The test continues in test_submit_co, after qemu_aio_flush... */ + /* The test continues in test_submit_co, after qemu_aio_wait_all... */ } static void test_submit_co(void) @@ -99,9 +107,9 @@ static void test_submit_co(void) g_assert_cmpint(active, ==, 1); g_assert_cmpint(data.ret, ==, -EINPROGRESS); - /* qemu_aio_flush will execute the rest of the coroutine. */ + /* qemu_aio_wait_all will execute the rest of the coroutine. */ - qemu_aio_flush(); + qemu_aio_wait_all(); /* Back here after the coroutine has finished. */ @@ -184,7 +192,7 @@ static void test_cancel(void) } /* Finish execution and execute any remaining callbacks. */ - qemu_aio_flush(); + qemu_aio_wait_all(); g_assert_cmpint(active, ==, 0); for (i = 0; i < 100; i++) { if (data[i].n == 3) { From d318aea9325c99b15c87a7c14865386c2fde0d2c Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Tue, 13 Nov 2012 16:35:08 +0100 Subject: [PATCH 082/300] block: Improve bdrv_aio_co_cancel_em Instead of waiting for all requests to complete, wait just for the specific request that should be cancelled. Signed-off-by: Kevin Wolf --- block.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/block.c b/block.c index c05875fe39..c7a1a3c85c 100644 --- a/block.c +++ b/block.c @@ -3778,12 +3778,20 @@ typedef struct BlockDriverAIOCBCoroutine { BlockDriverAIOCB common; BlockRequest req; bool is_write; + bool *done; QEMUBH* bh; } BlockDriverAIOCBCoroutine; static void bdrv_aio_co_cancel_em(BlockDriverAIOCB *blockacb) { - qemu_aio_flush(); + BlockDriverAIOCBCoroutine *acb = + container_of(blockacb, BlockDriverAIOCBCoroutine, common); + bool done = false; + + acb->done = &done; + while (!done) { + qemu_aio_wait(); + } } static const AIOCBInfo bdrv_em_co_aiocb_info = { @@ -3796,6 +3804,11 @@ static void bdrv_co_em_bh(void *opaque) BlockDriverAIOCBCoroutine *acb = opaque; acb->common.cb(acb->common.opaque, acb->req.error); + + if (acb->done) { + *acb->done = true; + } + qemu_bh_delete(acb->bh); qemu_aio_release(acb); } @@ -3834,6 +3847,7 @@ static BlockDriverAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs, acb->req.nb_sectors = nb_sectors; acb->req.qiov = qiov; acb->is_write = is_write; + acb->done = NULL; co = qemu_coroutine_create(bdrv_co_do_rw); qemu_coroutine_enter(co, acb); @@ -3860,6 +3874,8 @@ BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs, BlockDriverAIOCBCoroutine *acb; acb = qemu_aio_get(&bdrv_em_co_aiocb_info, bs, cb, opaque); + acb->done = NULL; + co = qemu_coroutine_create(bdrv_aio_flush_co_entry); qemu_coroutine_enter(co, acb); @@ -3888,6 +3904,7 @@ BlockDriverAIOCB *bdrv_aio_discard(BlockDriverState *bs, acb = qemu_aio_get(&bdrv_em_co_aiocb_info, bs, cb, opaque); acb->req.sector = sector_num; acb->req.nb_sectors = nb_sectors; + acb->done = NULL; co = qemu_coroutine_create(bdrv_aio_discard_co_entry); qemu_coroutine_enter(co, acb); From c57b6656c3168bccca7f78b3f740e9149893b3da Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Tue, 13 Nov 2012 16:35:13 +0100 Subject: [PATCH 083/300] aio: Get rid of qemu_aio_flush() There are no remaining users, and new users should probably be using bdrv_drain_all() in the first place. Signed-off-by: Kevin Wolf --- async.c | 5 ----- block/commit.c | 2 +- block/mirror.c | 2 +- block/stream.c | 2 +- main-loop.c | 5 ----- qemu-aio.h | 9 ++------- 6 files changed, 5 insertions(+), 20 deletions(-) diff --git a/async.c b/async.c index 3f0e8f367c..41ae0c1195 100644 --- a/async.c +++ b/async.c @@ -215,8 +215,3 @@ void aio_context_unref(AioContext *ctx) { g_source_unref(&ctx->source); } - -void aio_flush(AioContext *ctx) -{ - while (aio_poll(ctx, true)); -} diff --git a/block/commit.c b/block/commit.c index fae79582d4..e2bb1e241b 100644 --- a/block/commit.c +++ b/block/commit.c @@ -103,7 +103,7 @@ static void coroutine_fn commit_run(void *opaque) wait: /* Note that even when no rate limit is applied we need to yield - * with no pending I/O here so that qemu_aio_flush() returns. + * with no pending I/O here so that bdrv_drain_all() returns. */ block_job_sleep_ns(&s->common, rt_clock, delay_ns); if (block_job_is_cancelled(&s->common)) { diff --git a/block/mirror.c b/block/mirror.c index d6618a4b34..b1f5d4fa22 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -205,7 +205,7 @@ static void coroutine_fn mirror_run(void *opaque) } /* Note that even when no rate limit is applied we need to yield - * with no pending I/O here so that qemu_aio_flush() returns. + * with no pending I/O here so that bdrv_drain_all() returns. */ block_job_sleep_ns(&s->common, rt_clock, delay_ns); if (block_job_is_cancelled(&s->common)) { diff --git a/block/stream.c b/block/stream.c index 0c0fc7a13b..0dcd286035 100644 --- a/block/stream.c +++ b/block/stream.c @@ -108,7 +108,7 @@ static void coroutine_fn stream_run(void *opaque) wait: /* Note that even when no rate limit is applied we need to yield - * with no pending I/O here so that qemu_aio_flush() returns. + * with no pending I/O here so that bdrv_drain_all() returns. */ block_job_sleep_ns(&s->common, rt_clock, delay_ns); if (block_job_is_cancelled(&s->common)) { diff --git a/main-loop.c b/main-loop.c index c87624e621..7dba6f6e35 100644 --- a/main-loop.c +++ b/main-loop.c @@ -432,11 +432,6 @@ QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque) return aio_bh_new(qemu_aio_context, cb, opaque); } -void qemu_aio_flush(void) -{ - aio_flush(qemu_aio_context); -} - bool qemu_aio_wait(void) { return aio_poll(qemu_aio_context, true); diff --git a/qemu-aio.h b/qemu-aio.h index 3889fe97a4..31884a8f16 100644 --- a/qemu-aio.h +++ b/qemu-aio.h @@ -162,10 +162,6 @@ void qemu_bh_cancel(QEMUBH *bh); */ void qemu_bh_delete(QEMUBH *bh); -/* Flush any pending AIO operation. This function will block until all - * outstanding AIO operations have been completed or cancelled. */ -void aio_flush(AioContext *ctx); - /* Return whether there are any pending callbacks from the GSource * attached to the AioContext. * @@ -196,7 +192,7 @@ typedef int (AioFlushHandler)(void *opaque); /* Register a file descriptor and associated callbacks. Behaves very similarly * to qemu_set_fd_handler2. Unlike qemu_set_fd_handler2, these callbacks will - * be invoked when using either qemu_aio_wait() or qemu_aio_flush(). + * be invoked when using qemu_aio_wait(). * * Code that invokes AIO completion functions should rely on this function * instead of qemu_set_fd_handler[2]. @@ -211,7 +207,7 @@ void aio_set_fd_handler(AioContext *ctx, /* Register an event notifier and associated callbacks. Behaves very similarly * to event_notifier_set_handler. Unlike event_notifier_set_handler, these callbacks - * will be invoked when using either qemu_aio_wait() or qemu_aio_flush(). + * will be invoked when using qemu_aio_wait(). * * Code that invokes AIO completion functions should rely on this function * instead of event_notifier_set_handler. @@ -228,7 +224,6 @@ GSource *aio_get_g_source(AioContext *ctx); /* Functions to operate on the main QEMU AioContext. */ -void qemu_aio_flush(void); bool qemu_aio_wait(void); void qemu_aio_set_event_notifier(EventNotifier *notifier, EventNotifierHandler *io_read, From 7b272452398135e4f8e48341239705d03c82dae3 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Mon, 12 Nov 2012 17:05:39 +0100 Subject: [PATCH 084/300] block: Factor out bdrv_open_flags Signed-off-by: Kevin Wolf --- block.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/block.c b/block.c index c7a1a3c85c..c4f5566b5d 100644 --- a/block.c +++ b/block.c @@ -634,6 +634,26 @@ void bdrv_disable_copy_on_read(BlockDriverState *bs) bs->copy_on_read--; } +static int bdrv_open_flags(BlockDriverState *bs, int flags) +{ + int open_flags = flags | BDRV_O_CACHE_WB; + + /* + * Clear flags that are internal to the block layer before opening the + * image. + */ + open_flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING); + + /* + * Snapshots should be writable. + */ + if (bs->is_temporary) { + open_flags |= BDRV_O_RDWR; + } + + return open_flags; +} + /* * Common part for opening disk images and files */ @@ -665,20 +685,7 @@ static int bdrv_open_common(BlockDriverState *bs, const char *filename, bs->opaque = g_malloc0(drv->instance_size); bs->enable_write_cache = !!(flags & BDRV_O_CACHE_WB); - open_flags = flags | BDRV_O_CACHE_WB; - - /* - * Clear flags that are internal to the block layer before opening the - * image. - */ - open_flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING); - - /* - * Snapshots should be writable. - */ - if (bs->is_temporary) { - open_flags |= BDRV_O_RDWR; - } + open_flags = bdrv_open_flags(bs, flags); bs->read_only = !(open_flags & BDRV_O_RDWR); From f500a6d3c2b9ef0bb06d0080d91d8ed3c1d68f58 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Mon, 12 Nov 2012 17:35:27 +0100 Subject: [PATCH 085/300] block: Avoid second open for format probing This fixes problems that are caused by the additional open/close cycle of the existing format probing, for example related to qemu-nbd without -t option or file descriptor passing. Signed-off-by: Kevin Wolf --- block.c | 74 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/block.c b/block.c index c4f5566b5d..2ec3afebfe 100644 --- a/block.c +++ b/block.c @@ -518,22 +518,16 @@ BlockDriver *bdrv_find_protocol(const char *filename) return NULL; } -static int find_image_format(const char *filename, BlockDriver **pdrv) +static int find_image_format(BlockDriverState *bs, const char *filename, + BlockDriver **pdrv) { - int ret, score, score_max; + int score, score_max; BlockDriver *drv1, *drv; uint8_t buf[2048]; - BlockDriverState *bs; - - ret = bdrv_file_open(&bs, filename, 0); - if (ret < 0) { - *pdrv = NULL; - return ret; - } + int ret = 0; /* Return the raw BlockDriver * to scsi-generic devices or empty drives */ if (bs->sg || !bdrv_is_inserted(bs)) { - bdrv_delete(bs); drv = bdrv_find_format("raw"); if (!drv) { ret = -ENOENT; @@ -543,7 +537,6 @@ static int find_image_format(const char *filename, BlockDriver **pdrv) } ret = bdrv_pread(bs, 0, buf, sizeof(buf)); - bdrv_delete(bs); if (ret < 0) { *pdrv = NULL; return ret; @@ -657,7 +650,8 @@ static int bdrv_open_flags(BlockDriverState *bs, int flags) /* * Common part for opening disk images and files */ -static int bdrv_open_common(BlockDriverState *bs, const char *filename, +static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file, + const char *filename, int flags, BlockDriver *drv) { int ret, open_flags; @@ -691,12 +685,16 @@ static int bdrv_open_common(BlockDriverState *bs, const char *filename, /* Open the image, either directly or using a protocol */ if (drv->bdrv_file_open) { - ret = drv->bdrv_file_open(bs, filename, open_flags); - } else { - ret = bdrv_file_open(&bs->file, filename, open_flags); - if (ret >= 0) { - ret = drv->bdrv_open(bs, open_flags); + if (file != NULL) { + bdrv_swap(file, bs); + ret = 0; + } else { + ret = drv->bdrv_file_open(bs, filename, open_flags); } + } else { + assert(file != NULL); + bs->file = file; + ret = drv->bdrv_open(bs, open_flags); } if (ret < 0) { @@ -716,10 +714,7 @@ static int bdrv_open_common(BlockDriverState *bs, const char *filename, return 0; free_and_fail: - if (bs->file) { - bdrv_delete(bs->file); - bs->file = NULL; - } + bs->file = NULL; g_free(bs->opaque); bs->opaque = NULL; bs->drv = NULL; @@ -741,7 +736,7 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags) } bs = bdrv_new(""); - ret = bdrv_open_common(bs, filename, flags, drv); + ret = bdrv_open_common(bs, NULL, filename, flags, drv); if (ret < 0) { bdrv_delete(bs); return ret; @@ -796,6 +791,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags, int ret; /* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */ char tmp_filename[PATH_MAX + 1]; + BlockDriverState *file = NULL; if (flags & BDRV_O_SNAPSHOT) { BlockDriverState *bs1; @@ -855,25 +851,36 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags, bs->is_temporary = 1; } - /* Find the right image format driver */ - if (!drv) { - ret = find_image_format(filename, &drv); - } - - if (!drv) { - goto unlink_and_fail; - } - + /* Open image file without format layer */ if (flags & BDRV_O_RDWR) { flags |= BDRV_O_ALLOW_RDWR; } + ret = bdrv_file_open(&file, filename, bdrv_open_flags(bs, flags)); + if (ret < 0) { + return ret; + } + + /* Find the right image format driver */ + if (!drv) { + ret = find_image_format(file, filename, &drv); + } + + if (!drv) { + goto unlink_and_fail; + } + /* Open the image */ - ret = bdrv_open_common(bs, filename, flags, drv); + ret = bdrv_open_common(bs, file, filename, flags, drv); if (ret < 0) { goto unlink_and_fail; } + if (bs->file != file) { + bdrv_delete(file); + file = NULL; + } + /* If there is a backing file, use it */ if ((flags & BDRV_O_NO_BACKING) == 0) { ret = bdrv_open_backing_file(bs); @@ -895,6 +902,9 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags, return 0; unlink_and_fail: + if (file != NULL) { + bdrv_delete(file); + } if (bs->is_temporary) { unlink(filename); } From d567e62f98d5789ff4d273b924a0474931c71e8b Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 15 Nov 2012 13:12:14 +1100 Subject: [PATCH 086/300] virtio-blk: Remove duplicate property definition For the virtio-blk device (via virtio-pci) the property "config-wce" is defined in two places. First, it's defined from the DEFINE_VIRTIO_BLK_FEATURES macro, second it's defined directly in virtio-pci, just two lines above the call to that macro. The direct definition in virtio-pci.c is broken, since it operates on the 'config_wce' field of VirtIOBlkConf, which is never used anywhere else. Therefore, this patch removes both the extra property definition and the redundant field it works on. Cc: Kevin Wolf Cc: Anthony Liguori Cc: Paul 'Rusty' Russell Signed-off-by: David Gibson Signed-off-by: Stefan Hajnoczi --- hw/virtio-blk.h | 1 - hw/virtio-pci.c | 1 - 2 files changed, 2 deletions(-) diff --git a/hw/virtio-blk.h b/hw/virtio-blk.h index f0740d01af..651a000b9f 100644 --- a/hw/virtio-blk.h +++ b/hw/virtio-blk.h @@ -104,7 +104,6 @@ struct VirtIOBlkConf BlockConf conf; char *serial; uint32_t scsi; - uint32_t config_wce; }; #define DEFINE_VIRTIO_BLK_FEATURES(_state, _field) \ diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index 71f4fb5dc6..7684ac9a70 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -895,7 +895,6 @@ static Property virtio_blk_properties[] = { #ifdef __linux__ DEFINE_PROP_BIT("scsi", VirtIOPCIProxy, blk.scsi, 0, true), #endif - DEFINE_PROP_BIT("config-wce", VirtIOPCIProxy, blk.config_wce, 0, true), DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true), DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2), DEFINE_VIRTIO_BLK_FEATURES(VirtIOPCIProxy, host_features), From 1fe1fa510aa3d4eb1fb4246d4951ef48e4c949c2 Mon Sep 17 00:00:00 2001 From: Charles Arnold Date: Fri, 2 Nov 2012 09:54:24 -0600 Subject: [PATCH 087/300] block: vpc initialize the uuid footer field Initialize the uuid field in the footer with a generated uuid. Signed-off-by: Charles Arnold Reviewed-by: Paolo Bonzini Signed-off-by: Stefan Hajnoczi --- block/vpc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/block/vpc.c b/block/vpc.c index b6bf52f140..f14c6ae196 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -26,6 +26,9 @@ #include "block_int.h" #include "module.h" #include "migration.h" +#if defined(CONFIG_UUID) +#include +#endif /**************************************************************/ @@ -739,7 +742,9 @@ static int vpc_create(const char *filename, QEMUOptionParameter *options) footer->type = be32_to_cpu(disk_type); - /* TODO uuid is missing */ +#if defined(CONFIG_UUID) + uuid_generate(footer->uuid); +#endif footer->checksum = be32_to_cpu(vpc_checksum(buf, HEADER_SIZE)); From 258d2edbcd4bb5d267c96163333820332e1c14fa Mon Sep 17 00:00:00 2001 From: Charles Arnold Date: Tue, 30 Oct 2012 20:59:32 -0600 Subject: [PATCH 088/300] block: vpc support for ~2 TB disks The VHD specification allows for up to a 2 TB disk size. The current implementation in qemu emulates EIDE and ATA-2 hardware which only allows for up to 127 GB. This disk size limitation can be overridden by allowing up to 255 heads instead of the normal 4 bit limitation of 16. Doing so allows disk images to be created of up to nearly 2 TB. This change does not violate the VHD format specification nor does it change how smaller disks (ie, <=127GB) are defined. [Charles Arnold also writes: "In analyzing a 160 GB VHD fixed disk image created on Windows 2008 R2, it appears that MS is also ignoring the CHS values in the footer geometry field in whatever driver they use for accessing the image. The CHS values are set at 65535,16,255 which obviously doesn't represent an image size of 160 GB." -- Stefan] Signed-off-by: Charles Arnold Reviewed-by: Paolo Bonzini Signed-off-by: Stefan Hajnoczi --- block/vpc.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/block/vpc.c b/block/vpc.c index f14c6ae196..566e9a3b37 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -201,7 +201,8 @@ static int vpc_open(BlockDriverState *bs, int flags) bs->total_sectors = (int64_t) be16_to_cpu(footer->cyls) * footer->heads * footer->secs_per_cyl; - if (bs->total_sectors >= 65535 * 16 * 255) { + /* Allow a maximum disk size of approximately 2 TB */ + if (bs->total_sectors >= 65535LL * 255 * 255) { err = -EFBIG; goto fail; } @@ -527,19 +528,27 @@ static coroutine_fn int vpc_co_write(BlockDriverState *bs, int64_t sector_num, * Note that the geometry doesn't always exactly match total_sectors but * may round it down. * - * Returns 0 on success, -EFBIG if the size is larger than 127 GB + * Returns 0 on success, -EFBIG if the size is larger than ~2 TB. Override + * the hardware EIDE and ATA-2 limit of 16 heads (max disk size of 127 GB) + * and instead allow up to 255 heads. */ static int calculate_geometry(int64_t total_sectors, uint16_t* cyls, uint8_t* heads, uint8_t* secs_per_cyl) { uint32_t cyls_times_heads; - if (total_sectors > 65535 * 16 * 255) + /* Allow a maximum disk size of approximately 2 TB */ + if (total_sectors > 65535LL * 255 * 255) { return -EFBIG; + } if (total_sectors > 65535 * 16 * 63) { *secs_per_cyl = 255; - *heads = 16; + if (total_sectors > 65535 * 16 * 255) { + *heads = 255; + } else { + *heads = 16; + } cyls_times_heads = total_sectors / *secs_per_cyl; } else { *secs_per_cyl = 17; From c208e8c2d88eea2bbafc2850d8856525637e495d Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Fri, 2 Nov 2012 16:14:20 +0100 Subject: [PATCH 089/300] raw-posix: inline paio_ioctl into hdev_aio_ioctl clang now warns about an unused function: CC block/raw-posix.o block/raw-posix.c:707:26: warning: unused function paio_ioctl [-Wunused-function] static BlockDriverAIOCB *paio_ioctl(BlockDriverState *bs, int fd, ^ 1 warning generated. because the only use of paio_ioctl() is inside a #if defined(__linux__) guard and it is static now. Reported-by: Peter Maydell Signed-off-by: Paolo Bonzini Signed-off-by: Stefan Hajnoczi --- block/raw-posix.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/block/raw-posix.c b/block/raw-posix.c index 550c81f22b..abfedbea73 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -708,22 +708,6 @@ static BlockDriverAIOCB *paio_submit(BlockDriverState *bs, int fd, return thread_pool_submit_aio(aio_worker, acb, cb, opaque); } -static BlockDriverAIOCB *paio_ioctl(BlockDriverState *bs, int fd, - unsigned long int req, void *buf, - BlockDriverCompletionFunc *cb, void *opaque) -{ - RawPosixAIOData *acb = g_slice_new(RawPosixAIOData); - - acb->bs = bs; - acb->aio_type = QEMU_AIO_IOCTL; - acb->aio_fildes = fd; - acb->aio_offset = 0; - acb->aio_ioctl_buf = buf; - acb->aio_ioctl_cmd = req; - - return thread_pool_submit_aio(aio_worker, acb, cb, opaque); -} - static BlockDriverAIOCB *raw_aio_submit(BlockDriverState *bs, int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, BlockDriverCompletionFunc *cb, void *opaque, int type) @@ -1346,10 +1330,19 @@ static BlockDriverAIOCB *hdev_aio_ioctl(BlockDriverState *bs, BlockDriverCompletionFunc *cb, void *opaque) { BDRVRawState *s = bs->opaque; + RawPosixAIOData *acb; if (fd_open(bs) < 0) return NULL; - return paio_ioctl(bs, s->fd, req, buf, cb, opaque); + + acb = g_slice_new(RawPosixAIOData); + acb->bs = bs; + acb->aio_type = QEMU_AIO_IOCTL; + acb->aio_fildes = s->fd; + acb->aio_offset = 0; + acb->aio_ioctl_buf = buf; + acb->aio_ioctl_cmd = req; + return thread_pool_submit_aio(aio_worker, acb, cb, opaque); } #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) From 2d0d2837dcf786da415cf4165d37f4ddd684ff57 Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Tue, 20 Nov 2012 15:30:34 +0100 Subject: [PATCH 090/300] Support default block interfaces per QEMUMachine There are QEMUMachines that have neither IF_IDE nor IF_SCSI as a default/standard interface to their block devices / drives. Therefore, this patch introduces a new field default_block_type per QEMUMachine struct. The prior use_scsi field becomes thereby obsolete and is replaced through .default_block_type = IF_SCSI. This patch also changes the default for s390x to IF_VIRTIO and removes an early hack that converts IF_IDE drives. Other parties have already claimed interest (e.g. IF_SD for exynos) To create a sane default, for machines that dont specify a default_block_type, this patch makes IF_IDE = 0 and IF_NONE = 1. I checked all users of IF_NONE (blockdev.c and ww/device-hotplug.c) as well as IF_IDE and it seems that it is ok to change the defines - in other words, I found no obvious (to me) assumption in the code regarding IF_NONE==0. IF_NONE is only set if there is an explicit if=none. Without if=* the interface becomes IF_DEFAULT. I would suggest to have some additional care, e.g. by letting this patch sit some days in the block tree. Based on an initial patch from Einar Lueck Signed-off-by: Christian Borntraeger CC: Igor Mitsyanko CC: Markus Armbruster CC: Kevin Wolf Reviewed-by: Alexander Graf Acked-by: Igor Mitsyanko Reviewed-by: Markus Armbruster Signed-off-by: Stefan Hajnoczi --- blockdev.c | 4 ++-- blockdev.h | 9 +++++++-- hw/boards.h | 3 ++- hw/device-hotplug.c | 2 +- hw/highbank.c | 2 +- hw/leon3.c | 1 - hw/mips_jazz.c | 4 ++-- hw/pc_sysfw.c | 2 +- hw/puv3.c | 1 - hw/realview.c | 6 +++--- hw/s390-virtio.c | 17 ++--------------- hw/spapr.c | 2 +- hw/sun4m.c | 24 ++++++++++++------------ hw/versatilepb.c | 4 ++-- hw/vexpress.c | 4 ++-- hw/xilinx_zynq.c | 2 +- vl.c | 21 ++++++++++++--------- 17 files changed, 51 insertions(+), 57 deletions(-) diff --git a/blockdev.c b/blockdev.c index e73fd6e388..4a4d99f223 100644 --- a/blockdev.c +++ b/blockdev.c @@ -275,7 +275,7 @@ static bool do_check_io_limits(BlockIOLimit *io_limits) return true; } -DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi) +DriveInfo *drive_init(QemuOpts *opts, BlockInterfaceType block_default_type) { const char *buf; const char *file = NULL; @@ -325,7 +325,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi) return NULL; } } else { - type = default_to_scsi ? IF_SCSI : IF_IDE; + type = block_default_type; } max_devs = if_max_devs[type]; diff --git a/blockdev.h b/blockdev.h index 5f27b643be..d73d552a98 100644 --- a/blockdev.h +++ b/blockdev.h @@ -19,8 +19,13 @@ void blockdev_auto_del(BlockDriverState *bs); typedef enum { IF_DEFAULT = -1, /* for use with drive_add() only */ + /* + * IF_IDE must be zero, because we want QEMUMachine member + * block_default_type to default-initialize to IF_IDE + */ + IF_IDE = 0, IF_NONE, - IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN, + IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN, IF_COUNT } BlockInterfaceType; @@ -51,7 +56,7 @@ DriveInfo *drive_get_by_blockdev(BlockDriverState *bs); QemuOpts *drive_def(const char *optstr); QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file, const char *optstr); -DriveInfo *drive_init(QemuOpts *arg, int default_to_scsi); +DriveInfo *drive_init(QemuOpts *arg, BlockInterfaceType block_default_type); /* device-hotplug */ diff --git a/hw/boards.h b/hw/boards.h index 813d0e5109..c66fa16a9d 100644 --- a/hw/boards.h +++ b/hw/boards.h @@ -3,6 +3,7 @@ #ifndef HW_BOARDS_H #define HW_BOARDS_H +#include "blockdev.h" #include "qdev.h" typedef struct QEMUMachineInitArgs { @@ -24,7 +25,7 @@ typedef struct QEMUMachine { const char *desc; QEMUMachineInitFunc *init; QEMUMachineResetFunc *reset; - int use_scsi; + BlockInterfaceType block_default_type; int max_cpus; unsigned int no_serial:1, no_parallel:1, diff --git a/hw/device-hotplug.c b/hw/device-hotplug.c index 6d9c080381..839b9ea1d4 100644 --- a/hw/device-hotplug.c +++ b/hw/device-hotplug.c @@ -39,7 +39,7 @@ DriveInfo *add_init_drive(const char *optstr) if (!opts) return NULL; - dinfo = drive_init(opts, current_machine->use_scsi); + dinfo = drive_init(opts, current_machine->block_default_type); if (!dinfo) { qemu_opts_del(opts); return NULL; diff --git a/hw/highbank.c b/hw/highbank.c index afbb005422..e8e5bf0826 100644 --- a/hw/highbank.c +++ b/hw/highbank.c @@ -326,7 +326,7 @@ static QEMUMachine highbank_machine = { .name = "highbank", .desc = "Calxeda Highbank (ECX-1000)", .init = highbank_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, .max_cpus = 4, }; diff --git a/hw/leon3.c b/hw/leon3.c index 774273828f..ef83dffd85 100644 --- a/hw/leon3.c +++ b/hw/leon3.c @@ -212,7 +212,6 @@ static QEMUMachine leon3_generic_machine = { .name = "leon3_generic", .desc = "Leon-3 generic", .init = leon3_generic_hw_init, - .use_scsi = 0, }; static void leon3_machine_init(void) diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c index 0847427241..ea1416ae2f 100644 --- a/hw/mips_jazz.c +++ b/hw/mips_jazz.c @@ -324,14 +324,14 @@ static QEMUMachine mips_magnum_machine = { .name = "magnum", .desc = "MIPS Magnum", .init = mips_magnum_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, }; static QEMUMachine mips_pica61_machine = { .name = "pica61", .desc = "Acer Pica 61", .init = mips_pica61_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, }; static void mips_jazz_machine_init(void) diff --git a/hw/pc_sysfw.c b/hw/pc_sysfw.c index 40bced2322..d7ea3a5595 100644 --- a/hw/pc_sysfw.c +++ b/hw/pc_sysfw.c @@ -98,7 +98,7 @@ static void pc_fw_add_pflash_drv(void) return; } - if (!drive_init(opts, machine->use_scsi)) { + if (!drive_init(opts, machine->block_default_type)) { qemu_opts_del(opts); } } diff --git a/hw/puv3.c b/hw/puv3.c index 764799cff4..3d7734936b 100644 --- a/hw/puv3.c +++ b/hw/puv3.c @@ -122,7 +122,6 @@ static QEMUMachine puv3_machine = { .desc = "PKUnity Version-3 based on UniCore32", .init = puv3_init, .is_default = 1, - .use_scsi = 0, }; static void puv3_machine_init(void) diff --git a/hw/realview.c b/hw/realview.c index e789c159a9..8ea4ad7423 100644 --- a/hw/realview.c +++ b/hw/realview.c @@ -364,14 +364,14 @@ static QEMUMachine realview_eb_machine = { .name = "realview-eb", .desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)", .init = realview_eb_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, }; static QEMUMachine realview_eb_mpcore_machine = { .name = "realview-eb-mpcore", .desc = "ARM RealView Emulation Baseboard (ARM11MPCore)", .init = realview_eb_mpcore_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, .max_cpus = 4, }; @@ -385,7 +385,7 @@ static QEMUMachine realview_pbx_a9_machine = { .name = "realview-pbx-a9", .desc = "ARM RealView Platform Baseboard Explore for Cortex-A9", .init = realview_pbx_a9_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, .max_cpus = 4, }; diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c index ca1bb09816..7aca0c4aad 100644 --- a/hw/s390-virtio.c +++ b/hw/s390-virtio.c @@ -314,21 +314,6 @@ static void s390_init(QEMUMachineInitArgs *args) qdev_set_nic_properties(dev, nd); qdev_init_nofail(dev); } - - /* Create VirtIO disk drives */ - for(i = 0; i < MAX_BLK_DEVS; i++) { - DriveInfo *dinfo; - DeviceState *dev; - - dinfo = drive_get(IF_IDE, 0, i); - if (!dinfo) { - continue; - } - - dev = qdev_create((BusState *)s390_bus, "virtio-blk-s390"); - qdev_prop_set_drive_nofail(dev, "drive", dinfo->bdrv); - qdev_init_nofail(dev); - } } static QEMUMachine s390_machine = { @@ -336,6 +321,7 @@ static QEMUMachine s390_machine = { .alias = "s390", .desc = "VirtIO based S390 machine", .init = s390_init, + .block_default_type = IF_VIRTIO, .no_cdrom = 1, .no_floppy = 1, .no_serial = 1, @@ -352,3 +338,4 @@ static void s390_machine_init(void) } machine_init(s390_machine_init); + diff --git a/hw/spapr.c b/hw/spapr.c index ad3f0ea7fc..d955f02a3b 100644 --- a/hw/spapr.c +++ b/hw/spapr.c @@ -924,9 +924,9 @@ static QEMUMachine spapr_machine = { .desc = "pSeries Logical Partition (PAPR compliant)", .init = ppc_spapr_init, .reset = ppc_spapr_reset, + .block_default_type = IF_SCSI, .max_cpus = MAX_CPUS, .no_parallel = 1, - .use_scsi = 1, }; static void spapr_machine_init(void) diff --git a/hw/sun4m.c b/hw/sun4m.c index 1a786762aa..52cf82b681 100644 --- a/hw/sun4m.c +++ b/hw/sun4m.c @@ -1426,7 +1426,7 @@ static QEMUMachine ss5_machine = { .name = "SS-5", .desc = "Sun4m platform, SPARCstation 5", .init = ss5_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, .is_default = 1, }; @@ -1434,7 +1434,7 @@ static QEMUMachine ss10_machine = { .name = "SS-10", .desc = "Sun4m platform, SPARCstation 10", .init = ss10_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, .max_cpus = 4, }; @@ -1442,7 +1442,7 @@ static QEMUMachine ss600mp_machine = { .name = "SS-600MP", .desc = "Sun4m platform, SPARCserver 600MP", .init = ss600mp_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, .max_cpus = 4, }; @@ -1450,7 +1450,7 @@ static QEMUMachine ss20_machine = { .name = "SS-20", .desc = "Sun4m platform, SPARCstation 20", .init = ss20_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, .max_cpus = 4, }; @@ -1458,35 +1458,35 @@ static QEMUMachine voyager_machine = { .name = "Voyager", .desc = "Sun4m platform, SPARCstation Voyager", .init = vger_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, }; static QEMUMachine ss_lx_machine = { .name = "LX", .desc = "Sun4m platform, SPARCstation LX", .init = ss_lx_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, }; static QEMUMachine ss4_machine = { .name = "SS-4", .desc = "Sun4m platform, SPARCstation 4", .init = ss4_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, }; static QEMUMachine scls_machine = { .name = "SPARCClassic", .desc = "Sun4m platform, SPARCClassic", .init = scls_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, }; static QEMUMachine sbook_machine = { .name = "SPARCbook", .desc = "Sun4m platform, SPARCbook", .init = sbook_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, }; static const struct sun4d_hwdef sun4d_hwdefs[] = { @@ -1709,7 +1709,7 @@ static QEMUMachine ss1000_machine = { .name = "SS-1000", .desc = "Sun4d platform, SPARCserver 1000", .init = ss1000_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, .max_cpus = 8, }; @@ -1717,7 +1717,7 @@ static QEMUMachine ss2000_machine = { .name = "SS-2000", .desc = "Sun4d platform, SPARCcenter 2000", .init = ss2000_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, .max_cpus = 20, }; @@ -1896,7 +1896,7 @@ static QEMUMachine ss2_machine = { .name = "SS-2", .desc = "Sun4c platform, SPARCstation 2", .init = ss2_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, }; static void sun4m_register_types(void) diff --git a/hw/versatilepb.c b/hw/versatilepb.c index 25e652b1aa..4892c1d27a 100644 --- a/hw/versatilepb.c +++ b/hw/versatilepb.c @@ -358,14 +358,14 @@ static QEMUMachine versatilepb_machine = { .name = "versatilepb", .desc = "ARM Versatile/PB (ARM926EJ-S)", .init = vpb_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, }; static QEMUMachine versatileab_machine = { .name = "versatileab", .desc = "ARM Versatile/AB (ARM926EJ-S)", .init = vab_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, }; static void versatile_machine_init(void) diff --git a/hw/vexpress.c b/hw/vexpress.c index d93f057bff..e89694c86e 100644 --- a/hw/vexpress.c +++ b/hw/vexpress.c @@ -477,7 +477,7 @@ static QEMUMachine vexpress_a9_machine = { .name = "vexpress-a9", .desc = "ARM Versatile Express for Cortex-A9", .init = vexpress_a9_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, .max_cpus = 4, }; @@ -485,7 +485,7 @@ static QEMUMachine vexpress_a15_machine = { .name = "vexpress-a15", .desc = "ARM Versatile Express for Cortex-A15", .init = vexpress_a15_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, .max_cpus = 4, }; diff --git a/hw/xilinx_zynq.c b/hw/xilinx_zynq.c index 1f12a3d1ad..a4a71c2497 100644 --- a/hw/xilinx_zynq.c +++ b/hw/xilinx_zynq.c @@ -200,7 +200,7 @@ static QEMUMachine zynq_machine = { .name = "xilinx-zynq-a9", .desc = "Xilinx Zynq Platform Baseboard for Cortex-A9", .init = zynq_init, - .use_scsi = 1, + .block_default_type = IF_SCSI, .max_cpus = 1, .no_sdcard = 1 }; diff --git a/vl.c b/vl.c index a3ab3841a7..ee10d21c78 100644 --- a/vl.c +++ b/vl.c @@ -886,9 +886,9 @@ static int cleanup_add_fd(QemuOpts *opts, void *opaque) static int drive_init_func(QemuOpts *opts, void *opaque) { - int *use_scsi = opaque; + BlockInterfaceType *block_default_type = opaque; - return drive_init(opts, *use_scsi) == NULL; + return drive_init(opts, *block_default_type) == NULL; } static int drive_enable_snapshot(QemuOpts *opts, void *opaque) @@ -899,14 +899,15 @@ static int drive_enable_snapshot(QemuOpts *opts, void *opaque) return 0; } -static void default_drive(int enable, int snapshot, int use_scsi, +static void default_drive(int enable, int snapshot, + BlockInterfaceType block_default_type, BlockInterfaceType type, int index, const char *optstr) { QemuOpts *opts; if (type == IF_DEFAULT) { - type = use_scsi ? IF_SCSI : IF_IDE; + type = block_default_type; } if (!enable || drive_get_by_index(type, index)) { @@ -917,7 +918,7 @@ static void default_drive(int enable, int snapshot, int use_scsi, if (snapshot) { drive_enable_snapshot(opts, NULL); } - if (!drive_init(opts, use_scsi)) { + if (!drive_init(opts, type)) { exit(1); } } @@ -3770,14 +3771,16 @@ int main(int argc, char **argv, char **envp) /* open the virtual block devices */ if (snapshot) qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot, NULL, 0); - if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func, &machine->use_scsi, 1) != 0) + if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func, + &machine->block_default_type, 1) != 0) { exit(1); + } - default_drive(default_cdrom, snapshot, machine->use_scsi, + default_drive(default_cdrom, snapshot, machine->block_default_type, IF_DEFAULT, 2, CDROM_OPTS); - default_drive(default_floppy, snapshot, machine->use_scsi, + default_drive(default_floppy, snapshot, machine->block_default_type, IF_FLOPPY, 0, FD_OPTS); - default_drive(default_sdcard, snapshot, machine->use_scsi, + default_drive(default_sdcard, snapshot, machine->block_default_type, IF_SD, 0, SD_OPTS); register_savevm_live(NULL, "ram", 0, 4, &savevm_ram_handlers, NULL); From 3c42ea66888f149d72d600bab63624b2d849e4bf Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Thu, 22 Nov 2012 21:02:55 +0100 Subject: [PATCH 091/300] block: simplify default_drive Markus Armbruster pointed out that there is only one caller to default_drive with IF_DEFAULT as a type. Lets get rid of the block_default_type parameter and adopt the caller to do the right thing (asking the machine struct). Signed-off-by: Christian Borntraeger Reviewed-by: Markus Armbruster Signed-off-by: Stefan Hajnoczi --- vl.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/vl.c b/vl.c index ee10d21c78..6b3827cf06 100644 --- a/vl.c +++ b/vl.c @@ -899,17 +899,11 @@ static int drive_enable_snapshot(QemuOpts *opts, void *opaque) return 0; } -static void default_drive(int enable, int snapshot, - BlockInterfaceType block_default_type, - BlockInterfaceType type, int index, - const char *optstr) +static void default_drive(int enable, int snapshot, BlockInterfaceType type, + int index, const char *optstr) { QemuOpts *opts; - if (type == IF_DEFAULT) { - type = block_default_type; - } - if (!enable || drive_get_by_index(type, index)) { return; } @@ -3776,12 +3770,10 @@ int main(int argc, char **argv, char **envp) exit(1); } - default_drive(default_cdrom, snapshot, machine->block_default_type, - IF_DEFAULT, 2, CDROM_OPTS); - default_drive(default_floppy, snapshot, machine->block_default_type, - IF_FLOPPY, 0, FD_OPTS); - default_drive(default_sdcard, snapshot, machine->block_default_type, - IF_SD, 0, SD_OPTS); + default_drive(default_cdrom, snapshot, machine->block_default_type, 2, + CDROM_OPTS); + default_drive(default_floppy, snapshot, IF_FLOPPY, 0, FD_OPTS); + default_drive(default_sdcard, snapshot, IF_SD, 0, SD_OPTS); register_savevm_live(NULL, "ram", 0, 4, &savevm_ram_handlers, NULL); From 71c79813d83b5b45ba934cf995436063da458f66 Mon Sep 17 00:00:00 2001 From: Luiz Capitulino Date: Fri, 30 Nov 2012 10:52:04 -0200 Subject: [PATCH 092/300] block: bdrv_img_create(): add Error ** argument This commit adds an Error ** argument to bdrv_img_create() and set it appropriately on error. Callers of bdrv_img_create() pass NULL for the new argument and still rely on bdrv_img_create()'s return value. Next commits will change callers to use the Error object instead. Signed-off-by: Luiz Capitulino Signed-off-by: Kevin Wolf --- block.c | 22 +++++++++++++++++++++- block.h | 2 +- blockdev.c | 6 +++--- qemu-img.c | 2 +- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/block.c b/block.c index 2ec3afebfe..066bd66db0 100644 --- a/block.c +++ b/block.c @@ -4444,7 +4444,7 @@ bdrv_acct_done(BlockDriverState *bs, BlockAcctCookie *cookie) int bdrv_img_create(const char *filename, const char *fmt, const char *base_filename, const char *base_fmt, - char *options, uint64_t img_size, int flags) + char *options, uint64_t img_size, int flags, Error **errp) { QEMUOptionParameter *param = NULL, *create_options = NULL; QEMUOptionParameter *backing_fmt, *backing_file, *size; @@ -4457,6 +4457,7 @@ int bdrv_img_create(const char *filename, const char *fmt, drv = bdrv_find_format(fmt); if (!drv) { error_report("Unknown file format '%s'", fmt); + error_setg(errp, "Unknown file format '%s'", fmt); ret = -EINVAL; goto out; } @@ -4464,6 +4465,7 @@ int bdrv_img_create(const char *filename, const char *fmt, proto_drv = bdrv_find_protocol(filename); if (!proto_drv) { error_report("Unknown protocol '%s'", filename); + error_setg(errp, "Unknown protocol '%s'", filename); ret = -EINVAL; goto out; } @@ -4483,6 +4485,7 @@ int bdrv_img_create(const char *filename, const char *fmt, param = parse_option_parameters(options, create_options, param); if (param == NULL) { error_report("Invalid options for file format '%s'.", fmt); + error_setg(errp, "Invalid options for file format '%s'.", fmt); ret = -EINVAL; goto out; } @@ -4493,6 +4496,8 @@ int bdrv_img_create(const char *filename, const char *fmt, base_filename)) { error_report("Backing file not supported for file format '%s'", fmt); + error_setg(errp, "Backing file not supported for file format '%s'", + fmt); ret = -EINVAL; goto out; } @@ -4502,6 +4507,8 @@ int bdrv_img_create(const char *filename, const char *fmt, if (set_option_parameter(param, BLOCK_OPT_BACKING_FMT, base_fmt)) { error_report("Backing file format not supported for file " "format '%s'", fmt); + error_setg(errp, "Backing file format not supported for file " + "format '%s'", fmt); ret = -EINVAL; goto out; } @@ -4512,6 +4519,8 @@ int bdrv_img_create(const char *filename, const char *fmt, if (!strcmp(filename, backing_file->value.s)) { error_report("Error: Trying to create an image with the " "same filename as the backing file"); + error_setg(errp, "Error: Trying to create an image with the " + "same filename as the backing file"); ret = -EINVAL; goto out; } @@ -4523,6 +4532,8 @@ int bdrv_img_create(const char *filename, const char *fmt, if (!backing_drv) { error_report("Unknown backing file format '%s'", backing_fmt->value.s); + error_setg(errp, "Unknown backing file format '%s'", + backing_fmt->value.s); ret = -EINVAL; goto out; } @@ -4546,6 +4557,8 @@ int bdrv_img_create(const char *filename, const char *fmt, ret = bdrv_open(bs, backing_file->value.s, back_flags, backing_drv); if (ret < 0) { error_report("Could not open '%s'", backing_file->value.s); + error_setg_errno(errp, -ret, "Could not open '%s'", + backing_file->value.s); goto out; } bdrv_get_geometry(bs, &size); @@ -4555,6 +4568,7 @@ int bdrv_img_create(const char *filename, const char *fmt, set_option_parameter(param, BLOCK_OPT_SIZE, buf); } else { error_report("Image creation needs a size parameter"); + error_setg(errp, "Image creation needs a size parameter"); ret = -EINVAL; goto out; } @@ -4570,12 +4584,18 @@ int bdrv_img_create(const char *filename, const char *fmt, if (ret == -ENOTSUP) { error_report("Formatting or formatting option not supported for " "file format '%s'", fmt); + error_setg(errp,"Formatting or formatting option not supported for " + "file format '%s'", fmt); } else if (ret == -EFBIG) { error_report("The image size is too large for file format '%s'", fmt); + error_setg(errp, "The image size is too large for file format '%s'", + fmt); } else { error_report("%s: error while creating %s: %s", filename, fmt, strerror(-ret)); + error_setg(errp, "%s: error while creating %s: %s", filename, fmt, + strerror(-ret)); } } diff --git a/block.h b/block.h index 722c620590..ff54d15c86 100644 --- a/block.h +++ b/block.h @@ -345,7 +345,7 @@ int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf, int bdrv_img_create(const char *filename, const char *fmt, const char *base_filename, const char *base_fmt, - char *options, uint64_t img_size, int flags); + char *options, uint64_t img_size, int flags, Error **errp); void bdrv_set_buffer_alignment(BlockDriverState *bs, int align); void *qemu_blockalign(BlockDriverState *bs, size_t size); diff --git a/blockdev.c b/blockdev.c index 4a4d99f223..500f09116a 100644 --- a/blockdev.c +++ b/blockdev.c @@ -789,7 +789,7 @@ void qmp_transaction(BlockdevActionList *dev_list, Error **errp) ret = bdrv_img_create(new_image_file, format, states->old_bs->filename, states->old_bs->drv->format_name, - NULL, -1, flags); + NULL, -1, flags, NULL); if (ret) { error_set(errp, QERR_OPEN_FILE_FAILED, new_image_file); goto delete_and_fail; @@ -1264,7 +1264,7 @@ void qmp_drive_mirror(const char *device, const char *target, bdrv_get_geometry(bs, &size); size *= 512; ret = bdrv_img_create(target, format, - NULL, NULL, NULL, size, flags); + NULL, NULL, NULL, size, flags, NULL); } else { switch (mode) { case NEW_IMAGE_MODE_EXISTING: @@ -1275,7 +1275,7 @@ void qmp_drive_mirror(const char *device, const char *target, ret = bdrv_img_create(target, format, source->filename, source->drv->format_name, - NULL, -1, flags); + NULL, -1, flags, NULL); break; default: abort(); diff --git a/qemu-img.c b/qemu-img.c index e29e01b729..3896689060 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -362,7 +362,7 @@ static int img_create(int argc, char **argv) } ret = bdrv_img_create(filename, fmt, base_filename, base_fmt, - options, img_size, BDRV_O_FLAGS); + options, img_size, BDRV_O_FLAGS, NULL); out: if (ret) { return 1; From 9b37525a7dbc4f5eef0023fc92716259a3d94612 Mon Sep 17 00:00:00 2001 From: Luiz Capitulino Date: Fri, 30 Nov 2012 10:52:05 -0200 Subject: [PATCH 093/300] qemu-img: img_create(): pass Error object to bdrv_img_create() Signed-off-by: Luiz Capitulino Signed-off-by: Kevin Wolf --- qemu-img.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/qemu-img.c b/qemu-img.c index 3896689060..595b6f5136 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -301,6 +301,7 @@ static int img_create(int argc, char **argv) const char *filename; const char *base_filename = NULL; char *options = NULL; + Error *local_err = NULL; for(;;) { c = getopt(argc, argv, "F:b:f:he6o:"); @@ -361,8 +362,14 @@ static int img_create(int argc, char **argv) goto out; } - ret = bdrv_img_create(filename, fmt, base_filename, base_fmt, - options, img_size, BDRV_O_FLAGS, NULL); + bdrv_img_create(filename, fmt, base_filename, base_fmt, + options, img_size, BDRV_O_FLAGS, &local_err); + if (error_is_set(&local_err)) { + error_report("%s", error_get_pretty(local_err)); + error_free(local_err); + ret = -1; + } + out: if (ret) { return 1; From a930091189cedcc0023dd38f705e2a46e530f4a4 Mon Sep 17 00:00:00 2001 From: Luiz Capitulino Date: Fri, 30 Nov 2012 10:52:06 -0200 Subject: [PATCH 094/300] qemu-img: img_create(): drop unneeded goto and ret variable Signed-off-by: Luiz Capitulino Signed-off-by: Kevin Wolf --- qemu-img.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/qemu-img.c b/qemu-img.c index 595b6f5136..c4dae88e84 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -294,7 +294,7 @@ static int add_old_style_options(const char *fmt, QEMUOptionParameter *list, static int img_create(int argc, char **argv) { - int c, ret = 0; + int c; uint64_t img_size = -1; const char *fmt = "raw"; const char *base_fmt = NULL; @@ -351,15 +351,13 @@ static int img_create(int argc, char **argv) error_report("Invalid image size specified! You may use k, M, G or " "T suffixes for "); error_report("kilobytes, megabytes, gigabytes and terabytes."); - ret = -1; - goto out; + return 1; } img_size = (uint64_t)sval; } if (options && is_help_option(options)) { - ret = print_block_option_help(filename, fmt); - goto out; + return print_block_option_help(filename, fmt); } bdrv_img_create(filename, fmt, base_filename, base_fmt, @@ -367,13 +365,9 @@ static int img_create(int argc, char **argv) if (error_is_set(&local_err)) { error_report("%s", error_get_pretty(local_err)); error_free(local_err); - ret = -1; - } - -out: - if (ret) { return 1; } + return 0; } From 43e17041156ddecac8a7500648e71287ba270c0a Mon Sep 17 00:00:00 2001 From: Luiz Capitulino Date: Fri, 30 Nov 2012 10:52:07 -0200 Subject: [PATCH 095/300] qmp: qmp_transaction(): pass Error object to bdrv_img_create() Signed-off-by: Luiz Capitulino Signed-off-by: Kevin Wolf --- blockdev.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/blockdev.c b/blockdev.c index 500f09116a..6fb336294c 100644 --- a/blockdev.c +++ b/blockdev.c @@ -707,6 +707,7 @@ void qmp_transaction(BlockdevActionList *dev_list, Error **errp) int ret = 0; BlockdevActionList *dev_entry = dev_list; BlkTransactionStates *states, *next; + Error *local_err = NULL; QSIMPLEQ_HEAD(snap_bdrv_states, BlkTransactionStates) snap_bdrv_states; QSIMPLEQ_INIT(&snap_bdrv_states); @@ -786,12 +787,12 @@ void qmp_transaction(BlockdevActionList *dev_list, Error **errp) /* create new image w/backing file */ if (mode != NEW_IMAGE_MODE_EXISTING) { - ret = bdrv_img_create(new_image_file, format, - states->old_bs->filename, - states->old_bs->drv->format_name, - NULL, -1, flags, NULL); - if (ret) { - error_set(errp, QERR_OPEN_FILE_FAILED, new_image_file); + bdrv_img_create(new_image_file, format, + states->old_bs->filename, + states->old_bs->drv->format_name, + NULL, -1, flags, &local_err); + if (error_is_set(&local_err)) { + error_propagate(errp, local_err); goto delete_and_fail; } } From cf8f2426c55245f437a91f2fdabbed4ea24e7786 Mon Sep 17 00:00:00 2001 From: Luiz Capitulino Date: Fri, 30 Nov 2012 10:52:08 -0200 Subject: [PATCH 096/300] qmp: qmp_drive_mirror(): pass Error object to bdrv_img_create() Signed-off-by: Luiz Capitulino Signed-off-by: Kevin Wolf --- blockdev.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/blockdev.c b/blockdev.c index 6fb336294c..463f4c2094 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1264,8 +1264,8 @@ void qmp_drive_mirror(const char *device, const char *target, assert(format && drv); bdrv_get_geometry(bs, &size); size *= 512; - ret = bdrv_img_create(target, format, - NULL, NULL, NULL, size, flags, NULL); + bdrv_img_create(target, format, + NULL, NULL, NULL, size, flags, &local_err); } else { switch (mode) { case NEW_IMAGE_MODE_EXISTING: @@ -1273,18 +1273,18 @@ void qmp_drive_mirror(const char *device, const char *target, break; case NEW_IMAGE_MODE_ABSOLUTE_PATHS: /* create new image with backing file */ - ret = bdrv_img_create(target, format, - source->filename, - source->drv->format_name, - NULL, -1, flags, NULL); + bdrv_img_create(target, format, + source->filename, + source->drv->format_name, + NULL, -1, flags, &local_err); break; default: abort(); } } - if (ret) { - error_set(errp, QERR_OPEN_FILE_FAILED, target); + if (error_is_set(&local_err)) { + error_propagate(errp, local_err); return; } From d92ada2202a0730e396304908ff7b870168387d2 Mon Sep 17 00:00:00 2001 From: Luiz Capitulino Date: Fri, 30 Nov 2012 10:52:09 -0200 Subject: [PATCH 097/300] block: bdrv_img_create(): drop unused error handling code Signed-off-by: Luiz Capitulino Signed-off-by: Kevin Wolf --- block.c | 40 +++++----------------------------------- block.h | 6 +++--- 2 files changed, 8 insertions(+), 38 deletions(-) diff --git a/block.c b/block.c index 066bd66db0..b3faf3a463 100644 --- a/block.c +++ b/block.c @@ -4442,9 +4442,9 @@ bdrv_acct_done(BlockDriverState *bs, BlockAcctCookie *cookie) bs->total_time_ns[cookie->type] += get_clock() - cookie->start_time_ns; } -int bdrv_img_create(const char *filename, const char *fmt, - const char *base_filename, const char *base_fmt, - char *options, uint64_t img_size, int flags, Error **errp) +void bdrv_img_create(const char *filename, const char *fmt, + const char *base_filename, const char *base_fmt, + char *options, uint64_t img_size, int flags, Error **errp) { QEMUOptionParameter *param = NULL, *create_options = NULL; QEMUOptionParameter *backing_fmt, *backing_file, *size; @@ -4456,18 +4456,14 @@ int bdrv_img_create(const char *filename, const char *fmt, /* Find driver and parse its options */ drv = bdrv_find_format(fmt); if (!drv) { - error_report("Unknown file format '%s'", fmt); error_setg(errp, "Unknown file format '%s'", fmt); - ret = -EINVAL; - goto out; + return; } proto_drv = bdrv_find_protocol(filename); if (!proto_drv) { - error_report("Unknown protocol '%s'", filename); error_setg(errp, "Unknown protocol '%s'", filename); - ret = -EINVAL; - goto out; + return; } create_options = append_option_parameters(create_options, @@ -4484,9 +4480,7 @@ int bdrv_img_create(const char *filename, const char *fmt, if (options) { param = parse_option_parameters(options, create_options, param); if (param == NULL) { - error_report("Invalid options for file format '%s'.", fmt); error_setg(errp, "Invalid options for file format '%s'.", fmt); - ret = -EINVAL; goto out; } } @@ -4494,22 +4488,16 @@ int bdrv_img_create(const char *filename, const char *fmt, if (base_filename) { if (set_option_parameter(param, BLOCK_OPT_BACKING_FILE, base_filename)) { - error_report("Backing file not supported for file format '%s'", - fmt); error_setg(errp, "Backing file not supported for file format '%s'", fmt); - ret = -EINVAL; goto out; } } if (base_fmt) { if (set_option_parameter(param, BLOCK_OPT_BACKING_FMT, base_fmt)) { - error_report("Backing file format not supported for file " - "format '%s'", fmt); error_setg(errp, "Backing file format not supported for file " "format '%s'", fmt); - ret = -EINVAL; goto out; } } @@ -4517,11 +4505,8 @@ int bdrv_img_create(const char *filename, const char *fmt, backing_file = get_option_parameter(param, BLOCK_OPT_BACKING_FILE); if (backing_file && backing_file->value.s) { if (!strcmp(filename, backing_file->value.s)) { - error_report("Error: Trying to create an image with the " - "same filename as the backing file"); error_setg(errp, "Error: Trying to create an image with the " "same filename as the backing file"); - ret = -EINVAL; goto out; } } @@ -4530,11 +4515,8 @@ int bdrv_img_create(const char *filename, const char *fmt, if (backing_fmt && backing_fmt->value.s) { backing_drv = bdrv_find_format(backing_fmt->value.s); if (!backing_drv) { - error_report("Unknown backing file format '%s'", - backing_fmt->value.s); error_setg(errp, "Unknown backing file format '%s'", backing_fmt->value.s); - ret = -EINVAL; goto out; } } @@ -4556,7 +4538,6 @@ int bdrv_img_create(const char *filename, const char *fmt, ret = bdrv_open(bs, backing_file->value.s, back_flags, backing_drv); if (ret < 0) { - error_report("Could not open '%s'", backing_file->value.s); error_setg_errno(errp, -ret, "Could not open '%s'", backing_file->value.s); goto out; @@ -4567,9 +4548,7 @@ int bdrv_img_create(const char *filename, const char *fmt, snprintf(buf, sizeof(buf), "%" PRId64, size); set_option_parameter(param, BLOCK_OPT_SIZE, buf); } else { - error_report("Image creation needs a size parameter"); error_setg(errp, "Image creation needs a size parameter"); - ret = -EINVAL; goto out; } } @@ -4579,21 +4558,14 @@ int bdrv_img_create(const char *filename, const char *fmt, puts(""); ret = bdrv_create(drv, filename, param); - if (ret < 0) { if (ret == -ENOTSUP) { - error_report("Formatting or formatting option not supported for " - "file format '%s'", fmt); error_setg(errp,"Formatting or formatting option not supported for " "file format '%s'", fmt); } else if (ret == -EFBIG) { - error_report("The image size is too large for file format '%s'", - fmt); error_setg(errp, "The image size is too large for file format '%s'", fmt); } else { - error_report("%s: error while creating %s: %s", filename, fmt, - strerror(-ret)); error_setg(errp, "%s: error while creating %s: %s", filename, fmt, strerror(-ret)); } @@ -4606,6 +4578,4 @@ out: if (bs) { bdrv_delete(bs); } - - return ret; } diff --git a/block.h b/block.h index ff54d15c86..24bea09530 100644 --- a/block.h +++ b/block.h @@ -343,9 +343,9 @@ int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf, int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf, int64_t pos, int size); -int bdrv_img_create(const char *filename, const char *fmt, - const char *base_filename, const char *base_fmt, - char *options, uint64_t img_size, int flags, Error **errp); +void bdrv_img_create(const char *filename, const char *fmt, + const char *base_filename, const char *base_fmt, + char *options, uint64_t img_size, int flags, Error **errp); void bdrv_set_buffer_alignment(BlockDriverState *bs, int align); void *qemu_blockalign(BlockDriverState *bs, size_t size); From 23e956bfe6af6f71046772478ed08d4e5c9c62d4 Mon Sep 17 00:00:00 2001 From: Corey Bryant Date: Wed, 14 Nov 2012 17:53:16 -0500 Subject: [PATCH 098/300] tests: Add tests for fdsets Signed-off-by: Corey Bryant Reviewed-by: Kevin Wolf Signed-off-by: Stefan Hajnoczi --- tests/qemu-iotests/045 | 129 ++++++++++++++++++++++++++++++++++ tests/qemu-iotests/045.out | 5 ++ tests/qemu-iotests/group | 1 + tests/qemu-iotests/iotests.py | 12 ++++ 4 files changed, 147 insertions(+) create mode 100755 tests/qemu-iotests/045 create mode 100644 tests/qemu-iotests/045.out diff --git a/tests/qemu-iotests/045 b/tests/qemu-iotests/045 new file mode 100755 index 0000000000..2b6f1af27a --- /dev/null +++ b/tests/qemu-iotests/045 @@ -0,0 +1,129 @@ +#!/usr/bin/env python +# +# Tests for fdsets. +# +# Copyright (C) 2012 IBM Corp. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import os +import iotests +from iotests import qemu_img + +image0 = os.path.join(iotests.test_dir, 'image0') +image1 = os.path.join(iotests.test_dir, 'image1') +image2 = os.path.join(iotests.test_dir, 'image2') +image3 = os.path.join(iotests.test_dir, 'image3') +image4 = os.path.join(iotests.test_dir, 'image4') + +class TestFdSets(iotests.QMPTestCase): + + def setUp(self): + self.vm = iotests.VM() + qemu_img('create', '-f', iotests.imgfmt, image0, '128K') + qemu_img('create', '-f', iotests.imgfmt, image1, '128K') + qemu_img('create', '-f', iotests.imgfmt, image2, '128K') + qemu_img('create', '-f', iotests.imgfmt, image3, '128K') + qemu_img('create', '-f', iotests.imgfmt, image4, '128K') + self.file0 = open(image0, 'r') + self.file1 = open(image1, 'w+') + self.file2 = open(image2, 'r') + self.file3 = open(image3, 'r') + self.file4 = open(image4, 'r') + self.vm.add_fd(self.file0.fileno(), 1, 'image0:r') + self.vm.add_fd(self.file1.fileno(), 1, 'image1:w+') + self.vm.add_fd(self.file2.fileno(), 0, 'image2:r') + self.vm.add_fd(self.file3.fileno(), 2, 'image3:r') + self.vm.add_fd(self.file4.fileno(), 2, 'image4:r') + self.vm.add_drive("/dev/fdset/1") + self.vm.launch() + + def tearDown(self): + self.vm.shutdown() + self.file0.close() + self.file1.close() + self.file2.close() + self.file3.close() + self.file4.close() + os.remove(image0) + os.remove(image1) + os.remove(image2) + os.remove(image3) + os.remove(image4) + + def test_query_fdset(self): + result = self.vm.qmp('query-fdsets') + self.assert_qmp(result, 'return[0]/fdset-id', 2) + self.assert_qmp(result, 'return[1]/fdset-id', 1) + self.assert_qmp(result, 'return[2]/fdset-id', 0) + self.assert_qmp(result, 'return[0]/fds[0]/opaque', 'image3:r') + self.assert_qmp(result, 'return[0]/fds[1]/opaque', 'image4:r') + self.assert_qmp(result, 'return[1]/fds[0]/opaque', 'image0:r') + self.assert_qmp(result, 'return[1]/fds[1]/opaque', 'image1:w+') + self.assert_qmp(result, 'return[2]/fds[0]/opaque', 'image2:r') + self.vm.shutdown() + + def test_remove_fdset(self): + result = self.vm.qmp('remove-fd', fdset_id=2) + self.assert_qmp(result, 'return', {}) + result = self.vm.qmp('query-fdsets') + self.assert_qmp(result, 'return[0]/fdset-id', 1) + self.assert_qmp(result, 'return[1]/fdset-id', 0) + self.assert_qmp(result, 'return[0]/fds[0]/opaque', 'image0:r') + self.assert_qmp(result, 'return[0]/fds[1]/opaque', 'image1:w+') + self.assert_qmp(result, 'return[1]/fds[0]/opaque', 'image2:r') + self.vm.shutdown() + + def test_remove_fd(self): + result = self.vm.qmp('query-fdsets') + fd_image3 = result['return'][0]['fds'][0]['fd'] + result = self.vm.qmp('remove-fd', fdset_id=2, fd=fd_image3) + self.assert_qmp(result, 'return', {}) + result = self.vm.qmp('query-fdsets') + self.assert_qmp(result, 'return[0]/fdset-id', 2) + self.assert_qmp(result, 'return[1]/fdset-id', 1) + self.assert_qmp(result, 'return[2]/fdset-id', 0) + self.assert_qmp(result, 'return[0]/fds[0]/opaque', 'image4:r') + self.assert_qmp(result, 'return[1]/fds[0]/opaque', 'image0:r') + self.assert_qmp(result, 'return[1]/fds[1]/opaque', 'image1:w+') + self.assert_qmp(result, 'return[2]/fds[0]/opaque', 'image2:r') + self.vm.shutdown() + + def test_remove_fd_invalid_fdset(self): + result = self.vm.qmp('query-fdsets') + fd_image3 = result['return'][0]['fds'][0]['fd'] + result = self.vm.qmp('remove-fd', fdset_id=3, fd=fd_image3) + self.assert_qmp(result, 'error/class', 'GenericError') + self.assert_qmp(result, 'error/desc', + 'File descriptor named \'fdset-id:3, fd:%d\' not found' % fd_image3) + self.vm.shutdown() + + def test_remove_fd_invalid_fd(self): + result = self.vm.qmp('query-fdsets') + result = self.vm.qmp('remove-fd', fdset_id=2, fd=999) + self.assert_qmp(result, 'error/class', 'GenericError') + self.assert_qmp(result, 'error/desc', + 'File descriptor named \'fdset-id:2, fd:999\' not found') + self.vm.shutdown() + + def test_add_fd_invalid_fd(self): + result = self.vm.qmp('add-fd', fdset_id=2) + self.assert_qmp(result, 'error/class', 'GenericError') + self.assert_qmp(result, 'error/desc', + 'No file descriptor supplied via SCM_RIGHTS') + self.vm.shutdown() + +if __name__ == '__main__': + iotests.main(supported_fmts=['raw']) diff --git a/tests/qemu-iotests/045.out b/tests/qemu-iotests/045.out new file mode 100644 index 0000000000..3f8a935a08 --- /dev/null +++ b/tests/qemu-iotests/045.out @@ -0,0 +1,5 @@ +...... +---------------------------------------------------------------------- +Ran 6 tests + +OK diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index a4a9044f24..5b39785461 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -51,3 +51,4 @@ 042 rw auto quick 043 rw auto backing 044 rw auto +045 rw auto diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py index 0be5c7e13f..569ca3d804 100644 --- a/tests/qemu-iotests/iotests.py +++ b/tests/qemu-iotests/iotests.py @@ -79,6 +79,18 @@ class VM(object): self._num_drives += 1 return self + def add_fd(self, fd, fdset, opaque, opts=''): + '''Pass a file descriptor to the VM''' + options = ['fd=%d' % fd, + 'set=%d' % fdset, + 'opaque=%s' % opaque] + if opts: + options.append(opts) + + self._args.append('-add-fd') + self._args.append(','.join(options)) + return self + def launch(self): '''Launch the VM and establish a QMP connection''' devnull = open('/dev/null', 'rb') From 791bfa35ee00ca10b13bedfb048ffda385b151c7 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Tue, 4 Dec 2012 16:35:12 +0100 Subject: [PATCH 099/300] qemu-io: Implement write -c for compressed clusters This makes it easier to create images with both compressed and uncompressed clusters for testing. Signed-off-by: Kevin Wolf Signed-off-by: Stefan Hajnoczi --- qemu-io.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/qemu-io.c b/qemu-io.c index 92cdb2ab9c..b4b0898741 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -265,6 +265,18 @@ static int do_co_write_zeroes(int64_t offset, int count, int *total) } } +static int do_write_compressed(char *buf, int64_t offset, int count, int *total) +{ + int ret; + + ret = bdrv_write_compressed(bs, offset >> 9, (uint8_t *)buf, count >> 9); + if (ret < 0) { + return ret; + } + *total = count; + return 1; +} + static int do_load_vmstate(char *buf, int64_t offset, int count, int *total) { *total = bdrv_load_vmstate(bs, (uint8_t *)buf, offset, count); @@ -687,6 +699,7 @@ static void write_help(void) " Writes into a segment of the currently open file, using a buffer\n" " filled with a set pattern (0xcdcdcdcd).\n" " -b, -- write to the VM state rather than the virtual disk\n" +" -c, -- write compressed data with bdrv_write_compressed\n" " -p, -- use bdrv_pwrite to write the file\n" " -P, -- use different pattern to fill file\n" " -C, -- report statistics in a machine parsable format\n" @@ -703,7 +716,7 @@ static const cmdinfo_t write_cmd = { .cfunc = write_f, .argmin = 2, .argmax = -1, - .args = "[-bCpqz] [-P pattern ] off len", + .args = "[-bcCpqz] [-P pattern ] off len", .oneline = "writes a number of bytes at a specified offset", .help = write_help, }; @@ -712,6 +725,7 @@ static int write_f(int argc, char **argv) { struct timeval t1, t2; int Cflag = 0, pflag = 0, qflag = 0, bflag = 0, Pflag = 0, zflag = 0; + int cflag = 0; int c, cnt; char *buf = NULL; int64_t offset; @@ -720,11 +734,14 @@ static int write_f(int argc, char **argv) int total = 0; int pattern = 0xcd; - while ((c = getopt(argc, argv, "bCpP:qz")) != EOF) { + while ((c = getopt(argc, argv, "bcCpP:qz")) != EOF) { switch (c) { case 'b': bflag = 1; break; + case 'c': + cflag = 1; + break; case 'C': Cflag = 1; break; @@ -801,6 +818,8 @@ static int write_f(int argc, char **argv) cnt = do_save_vmstate(buf, offset, count, &total); } else if (zflag) { cnt = do_co_write_zeroes(offset, count, &total); + } else if (cflag) { + cnt = do_write_compressed(buf, offset, count, &total); } else { cnt = do_write(buf, offset, count, &total); } From 473c7f0255920bcaf37411990a3725898772817f Mon Sep 17 00:00:00 2001 From: Stefan Priebe Date: Fri, 30 Nov 2012 09:55:46 +0100 Subject: [PATCH 100/300] rbd: Fix race between aio completition and aio cancel This one fixes a race which qemu had also in iscsi block driver between cancellation and io completition. qemu_rbd_aio_cancel was not synchronously waiting for the end of the command. To archieve this it introduces a new status flag which uses -EINPROGRESS. Signed-off-by: Stefan Priebe Reviewed-by: Stefan Hajnoczi Signed-off-by: Kevin Wolf --- block/rbd.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/block/rbd.c b/block/rbd.c index f3becc7a8b..737bab16cc 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -77,6 +77,7 @@ typedef struct RBDAIOCB { int error; struct BDRVRBDState *s; int cancelled; + int status; } RBDAIOCB; typedef struct RADOSCB { @@ -376,12 +377,6 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb) RBDAIOCB *acb = rcb->acb; int64_t r; - if (acb->cancelled) { - qemu_vfree(acb->bounce); - qemu_aio_release(acb); - goto done; - } - r = rcb->ret; if (acb->cmd == RBD_AIO_WRITE || @@ -409,7 +404,6 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb) /* Note that acb->bh can be NULL in case where the aio was cancelled */ acb->bh = qemu_bh_new(rbd_aio_bh_cb, acb); qemu_bh_schedule(acb->bh); -done: g_free(rcb); } @@ -568,6 +562,12 @@ static void qemu_rbd_aio_cancel(BlockDriverAIOCB *blockacb) { RBDAIOCB *acb = (RBDAIOCB *) blockacb; acb->cancelled = 1; + + while (acb->status == -EINPROGRESS) { + qemu_aio_wait(); + } + + qemu_aio_release(acb); } static const AIOCBInfo rbd_aiocb_info = { @@ -639,8 +639,11 @@ static void rbd_aio_bh_cb(void *opaque) acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret)); qemu_bh_delete(acb->bh); acb->bh = NULL; + acb->status = 0; - qemu_aio_release(acb); + if (!acb->cancelled) { + qemu_aio_release(acb); + } } static int rbd_aio_discard_wrapper(rbd_image_t image, @@ -685,6 +688,7 @@ static BlockDriverAIOCB *rbd_start_aio(BlockDriverState *bs, acb->s = s; acb->cancelled = 0; acb->bh = NULL; + acb->status = -EINPROGRESS; if (cmd == RBD_AIO_WRITE) { qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size); From fbcad04d6bfdff937536eb23088a01a280a1a3af Mon Sep 17 00:00:00 2001 From: Fabien Chouteau Date: Mon, 10 Dec 2012 12:56:22 +0100 Subject: [PATCH 101/300] Fix error code checking for SetFilePointer() call An error has occurred if the return value is invalid_set_file_pointer and getlasterror doesn't return no_error. Signed-off-by: Fabien Chouteau Acked-by: Stefan Hajnoczi --- block/raw-win32.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/block/raw-win32.c b/block/raw-win32.c index 0c05c58c5a..ce207a3109 100644 --- a/block/raw-win32.c +++ b/block/raw-win32.c @@ -303,13 +303,24 @@ static int raw_truncate(BlockDriverState *bs, int64_t offset) { BDRVRawState *s = bs->opaque; LONG low, high; + DWORD dwPtrLow; low = offset; high = offset >> 32; - if (!SetFilePointer(s->hfile, low, &high, FILE_BEGIN)) - return -EIO; - if (!SetEndOfFile(s->hfile)) + + /* + * An error has occurred if the return value is INVALID_SET_FILE_POINTER + * and GetLastError doesn't return NO_ERROR. + */ + dwPtrLow = SetFilePointer(s->hfile, low, &high, FILE_BEGIN); + if (dwPtrLow == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR) { + fprintf(stderr, "SetFilePointer error: %d\n", GetLastError()); return -EIO; + } + if (SetEndOfFile(s->hfile) == 0) { + fprintf(stderr, "SetEndOfFile error: %d\n", GetLastError()); + return -EIO; + } return 0; } From bf471f7950e9dc9416747b2774eb712f63afe5a7 Mon Sep 17 00:00:00 2001 From: Peter Maydell Date: Tue, 11 Dec 2012 11:30:37 +0000 Subject: [PATCH 102/300] hw/arm_boot, exynos4210, highbank: Fix secondary boot GIC init Fix the code in the secondary CPU boot stubs so that it correctly initialises the GIC rather than relying on bugs or implementation dependent aspects of the QEMU GIC implementation: * set the GIC_PMR.Priority field to all-ones, so that all interrupts are passed through. The default of all-zeroes means all interrupts are masked, and QEMU only booted because of a bug in the priority masking in our GIC implementation. * add a barrier after GIC setup and before WFI to ensure that GIC config is complete before we go into a possible low power state. This isn't needed with the software GIC model but could be required when using KVM and executing this code on the real hardware CPU. Note that of the three secondary stub implementations, only the common generic one needs to support both v6 and v7 DSB encodings; highbank and exynos4210 will always be v7 CPUs. Signed-off-by: Peter Maydell Reviewed-by: Igor Mitsyanko --- hw/arm_boot.c | 17 ++++++++++++++--- hw/exynos4210.c | 10 +++++++--- hw/highbank.c | 7 +++++-- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/hw/arm_boot.c b/hw/arm_boot.c index 92e2cab476..ec3b8d5d12 100644 --- a/hw/arm_boot.c +++ b/hw/arm_boot.c @@ -44,11 +44,17 @@ static uint32_t bootloader[] = { * for an interprocessor interrupt and polling a configurable * location for the kernel secondary CPU entry point. */ +#define DSB_INSN 0xf57ff04f +#define CP15_DSB_INSN 0xee070f9a /* mcr cp15, 0, r0, c7, c10, 4 */ + static uint32_t smpboot[] = { - 0xe59f201c, /* ldr r2, gic_cpu_if */ - 0xe59f001c, /* ldr r0, startaddr */ + 0xe59f2028, /* ldr r2, gic_cpu_if */ + 0xe59f0028, /* ldr r0, startaddr */ 0xe3a01001, /* mov r1, #1 */ - 0xe5821000, /* str r1, [r2] */ + 0xe5821000, /* str r1, [r2] - set GICC_CTLR.Enable */ + 0xe3a010ff, /* mov r1, #0xff */ + 0xe5821004, /* str r1, [r2, 4] - set GIC_PMR.Priority to 0xff */ + DSB_INSN, /* dsb */ 0xe320f003, /* wfi */ 0xe5901000, /* ldr r1, [r0] */ 0xe1110001, /* tst r1, r1 */ @@ -65,6 +71,11 @@ static void default_write_secondary(ARMCPU *cpu, smpboot[ARRAY_SIZE(smpboot) - 1] = info->smp_bootreg_addr; smpboot[ARRAY_SIZE(smpboot) - 2] = info->gic_cpu_if_addr; for (n = 0; n < ARRAY_SIZE(smpboot); n++) { + /* Replace DSB with the pre-v7 DSB if necessary. */ + if (!arm_feature(&cpu->env, ARM_FEATURE_V7) && + smpboot[n] == DSB_INSN) { + smpboot[n] = CP15_DSB_INSN; + } smpboot[n] = tswap32(smpboot[n]); } rom_add_blob_fixed("smpboot", smpboot, sizeof(smpboot), diff --git a/hw/exynos4210.c b/hw/exynos4210.c index 00d4db8871..22148cd946 100644 --- a/hw/exynos4210.c +++ b/hw/exynos4210.c @@ -80,12 +80,16 @@ void exynos4210_write_secondary(ARMCPU *cpu, { int n; uint32_t smpboot[] = { - 0xe59f3024, /* ldr r3, External gic_cpu_if */ - 0xe59f2024, /* ldr r2, Internal gic_cpu_if */ - 0xe59f0024, /* ldr r0, startaddr */ + 0xe59f3034, /* ldr r3, External gic_cpu_if */ + 0xe59f2034, /* ldr r2, Internal gic_cpu_if */ + 0xe59f0034, /* ldr r0, startaddr */ 0xe3a01001, /* mov r1, #1 */ 0xe5821000, /* str r1, [r2] */ 0xe5831000, /* str r1, [r3] */ + 0xe3a010ff, /* mov r1, #0xff */ + 0xe5821004, /* str r1, [r2, #4] */ + 0xe5831004, /* str r1, [r3, #4] */ + 0xf57ff04f, /* dsb */ 0xe320f003, /* wfi */ 0xe5901000, /* ldr r1, [r0] */ 0xe1110001, /* tst r1, r1 */ diff --git a/hw/highbank.c b/hw/highbank.c index afbb005422..447e57d758 100644 --- a/hw/highbank.c +++ b/hw/highbank.c @@ -44,9 +44,12 @@ static void hb_write_secondary(ARMCPU *cpu, const struct arm_boot_info *info) 0xe210000f, /* ands r0, r0, #0x0f */ 0xe3a03040, /* mov r3, #0x40 - jump address is 0x40 + 0x10 * core id */ 0xe0830200, /* add r0, r3, r0, lsl #4 */ - 0xe59f2018, /* ldr r2, privbase */ + 0xe59f2024, /* ldr r2, privbase */ 0xe3a01001, /* mov r1, #1 */ - 0xe5821100, /* str r1, [r2, #256] */ + 0xe5821100, /* str r1, [r2, #256] - set GICC_CTLR.Enable */ + 0xe3a010ff, /* mov r1, #0xff */ + 0xe5821104, /* str r1, [r2, #260] - set GICC_PMR.Priority to 0xff */ + 0xf57ff04f, /* dsb */ 0xe320f003, /* wfi */ 0xe5901000, /* ldr r1, [r0] */ 0xe1110001, /* tst r1, r1 */ From cad065f18e1ca7694385f42f560da637d4e651b6 Mon Sep 17 00:00:00 2001 From: Peter Maydell Date: Tue, 11 Dec 2012 11:30:37 +0000 Subject: [PATCH 103/300] hw/arm_gic: Fix comparison with priority mask register The GIC spec states that only interrupts with higher priority than the value in the GICC_PMR priority mask register are passed through to the processor. We were incorrectly allowing through interrupts with a priority equal to the specified value: correct the comparison operation to match the spec. Signed-off-by: Peter Maydell Reviewed-by: Igor Mitsyanko --- hw/arm_gic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/arm_gic.c b/hw/arm_gic.c index f9e423f152..672d539996 100644 --- a/hw/arm_gic.c +++ b/hw/arm_gic.c @@ -73,7 +73,7 @@ void gic_update(GICState *s) } } level = 0; - if (best_prio <= s->priority_mask[cpu]) { + if (best_prio < s->priority_mask[cpu]) { s->current_pending[cpu] = best_irq; if (best_prio < s->running_priority[cpu]) { DPRINTF("Raised pending IRQ %d\n", best_irq); From ee3f095680e4f578f4f1371a90acc20375b48966 Mon Sep 17 00:00:00 2001 From: Peter Maydell Date: Tue, 11 Dec 2012 11:30:37 +0000 Subject: [PATCH 104/300] hw/arm_gic_common: Correct GICC_PMR reset value for newer GICs The GIC architecture specification for v1 and v2 GICs (as found on the Cortex-A9 and newer) states that the GICC_PMR reset value is zero; this differs from the 0xf0 reset value used on 11MPCore. The NVIC is different again in not having a CPU interface; since we share the GIC code we must force the priority mask field to allow through all interrupts. Signed-off-by: Peter Maydell Reviewed-by: Igor Mitsyanko --- hw/arm_gic_common.c | 6 +++++- hw/armv7m_nvic.c | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/hw/arm_gic_common.c b/hw/arm_gic_common.c index 8369309d21..73ae331807 100644 --- a/hw/arm_gic_common.c +++ b/hw/arm_gic_common.c @@ -127,7 +127,11 @@ static void arm_gic_common_reset(DeviceState *dev) int i; memset(s->irq_state, 0, GIC_MAXIRQ * sizeof(gic_irq_state)); for (i = 0 ; i < s->num_cpu; i++) { - s->priority_mask[i] = 0xf0; + if (s->revision == REV_11MPCORE) { + s->priority_mask[i] = 0xf0; + } else { + s->priority_mask[i] = 0; + } s->current_pending[i] = 1023; s->running_irq[i] = 1023; s->running_priority[i] = 0x100; diff --git a/hw/armv7m_nvic.c b/hw/armv7m_nvic.c index f0a2e7b5d2..4963678bf1 100644 --- a/hw/armv7m_nvic.c +++ b/hw/armv7m_nvic.c @@ -455,9 +455,11 @@ static void armv7m_nvic_reset(DeviceState *dev) nc->parent_reset(dev); /* Common GIC reset resets to disabled; the NVIC doesn't have * per-CPU interfaces so mark our non-existent CPU interface - * as enabled by default. + * as enabled by default, and with a priority mask which allows + * all interrupts through. */ s->gic.cpu_enabled[0] = 1; + s->gic.priority_mask[0] = 0x100; /* The NVIC as a whole is always enabled. */ s->gic.enabled = 1; systick_reset(s); From 79f5d67e9db35d53b478699393590392f7be03ac Mon Sep 17 00:00:00 2001 From: walimis Date: Tue, 11 Dec 2012 11:30:37 +0000 Subject: [PATCH 105/300] xilinx_zynq: Add one variable to avoid overwriting QSPI bus commit 7b482bcf xilinx_zynq: added QSPI controller Adds one QSPI controller, which has two spi buses, one is for spi0, and another is for spi1. But when initializing the spi1 bus, "dev" has been overwrited by the ssi_create_slave_no_init() function, so that qdev_get_child_bus() returns NULL and the last two m25p80 flashes won't be attached to the spi1 bus, but to main-system-bus. Here we add one variable to avoid overwriting. Signed-off-by: Liming Wang Reviewed-by: Peter Crosthwaite Signed-off-by: Peter Maydell --- hw/xilinx_zynq.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/hw/xilinx_zynq.c b/hw/xilinx_zynq.c index 1f12a3d1ad..49233d8e2e 100644 --- a/hw/xilinx_zynq.c +++ b/hw/xilinx_zynq.c @@ -57,6 +57,7 @@ static inline void zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq, DeviceState *dev; SysBusDevice *busdev; SSIBus *spi; + DeviceState *flash_dev; int i, j; int num_busses = is_qspi ? NUM_QSPI_BUSSES : 1; int num_ss = is_qspi ? NUM_QSPI_FLASHES : NUM_SPI_FLASHES; @@ -81,11 +82,11 @@ static inline void zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq, spi = (SSIBus *)qdev_get_child_bus(dev, bus_name); for (j = 0; j < num_ss; ++j) { - dev = ssi_create_slave_no_init(spi, "m25p80"); - qdev_prop_set_string(dev, "partname", "n25q128"); - qdev_init_nofail(dev); + flash_dev = ssi_create_slave_no_init(spi, "m25p80"); + qdev_prop_set_string(flash_dev, "partname", "n25q128"); + qdev_init_nofail(flash_dev); - cs_line = qdev_get_gpio_in(dev, 0); + cs_line = qdev_get_gpio_in(flash_dev, 0); sysbus_connect_irq(busdev, i * num_ss + j + 1, cs_line); } } From f47b48fb678581d6ee369cfe26b3513100b7d53e Mon Sep 17 00:00:00 2001 From: Daniel Sangorrin Date: Tue, 11 Dec 2012 11:30:38 +0000 Subject: [PATCH 106/300] hw/arm_gic: fix target CPUs affected by set enable/pending ops Fix a bug on the ARM GIC model where interrupts are not set pending on the correct target CPUs when they are triggered by writes to the Interrupt Set Enable or Set Pending registers. Signed-off-by: Daniel Sangorrin Signed-off-by: Peter Maydell --- hw/arm_gic.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hw/arm_gic.c b/hw/arm_gic.c index 672d539996..8d769de4f5 100644 --- a/hw/arm_gic.c +++ b/hw/arm_gic.c @@ -374,7 +374,8 @@ static void gic_dist_writeb(void *opaque, hwaddr offset, value = 0xff; for (i = 0; i < 8; i++) { if (value & (1 << i)) { - int mask = (irq < GIC_INTERNAL) ? (1 << cpu) : GIC_TARGET(irq); + int mask = + (irq < GIC_INTERNAL) ? (1 << cpu) : GIC_TARGET(irq + i); int cm = (irq < GIC_INTERNAL) ? (1 << cpu) : ALL_CPU_MASK; if (!GIC_TEST_ENABLED(irq + i, cm)) { @@ -417,7 +418,7 @@ static void gic_dist_writeb(void *opaque, hwaddr offset, for (i = 0; i < 8; i++) { if (value & (1 << i)) { - GIC_SET_PENDING(irq + i, GIC_TARGET(irq)); + GIC_SET_PENDING(irq + i, GIC_TARGET(irq + i)); } } } else if (offset < 0x300) { From 97331270e50f5858c82a0c6d146da81f5b776535 Mon Sep 17 00:00:00 2001 From: Jean-Christophe DUBOIS Date: Mon, 3 Dec 2012 12:55:57 +0000 Subject: [PATCH 107/300] exynos4210/mct: Avoid infinite loop on non incremental timers Check for a 0 "distance" value to avoid infinite loop when the expired FCR timer was not programed with auto-increment. With this change the behavior is coherent with the same type of code in the exynos4210_gfrc_restart() function in the same file. Linux seems to mostly use this timer with auto-increment which explain why it is not a problem most of the time. However other OS might have a problem with this if they don't use the auto-increment feature. Signed-off-by: Jean-Christophe DUBOIS Reviewed-by: Evgeny Voevodin Signed-off-by: Peter Maydell --- hw/exynos4210_mct.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/exynos4210_mct.c b/hw/exynos4210_mct.c index e79cd6ac01..37dbda92df 100644 --- a/hw/exynos4210_mct.c +++ b/hw/exynos4210_mct.c @@ -568,7 +568,7 @@ static void exynos4210_gfrc_event(void *opaque) /* Reload FRC to reach nearest comparator */ s->g_timer.curr_comp = exynos4210_gcomp_find(s); distance = exynos4210_gcomp_get_distance(s, s->g_timer.curr_comp); - if (distance > MCT_GT_COUNTER_STEP) { + if (distance > MCT_GT_COUNTER_STEP || !distance) { distance = MCT_GT_COUNTER_STEP; } exynos4210_gfrc_set_count(&s->g_timer, distance); From c474ced8fe6684265fbb6a3183eb0cbea561409f Mon Sep 17 00:00:00 2001 From: Dong Xu Wang Date: Thu, 6 Dec 2012 14:47:18 +0800 Subject: [PATCH 108/300] qemu-option: opt_set(): split it up into more functions The new functions are opts_accepts_any() and find_desc_by_name(), which are also going to be used by qemu_opts_validate() (see next commit). This also makes opt_set() slightly more readable. Signed-off-by: Luiz Capitulino Signed-off-by: Dong Xu Wang Signed-off-by: Kevin Wolf --- qemu-option.c | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/qemu-option.c b/qemu-option.c index 27891e74e7..375daaa4ad 100644 --- a/qemu-option.c +++ b/qemu-option.c @@ -602,26 +602,36 @@ static void qemu_opt_del(QemuOpt *opt) g_free(opt); } -static void opt_set(QemuOpts *opts, const char *name, const char *value, - bool prepend, Error **errp) +static bool opts_accepts_any(const QemuOpts *opts) +{ + return opts->list->desc[0].name == NULL; +} + +static const QemuOptDesc *find_desc_by_name(const QemuOptDesc *desc, + const char *name) { - QemuOpt *opt; - const QemuOptDesc *desc = opts->list->desc; - Error *local_err = NULL; int i; for (i = 0; desc[i].name != NULL; i++) { if (strcmp(desc[i].name, name) == 0) { - break; + return &desc[i]; } } - if (desc[i].name == NULL) { - if (i == 0) { - /* empty list -> allow any */; - } else { - error_set(errp, QERR_INVALID_PARAMETER, name); - return; - } + + return NULL; +} + +static void opt_set(QemuOpts *opts, const char *name, const char *value, + bool prepend, Error **errp) +{ + QemuOpt *opt; + const QemuOptDesc *desc; + Error *local_err = NULL; + + desc = find_desc_by_name(opts->list->desc, name); + if (!desc && !opts_accepts_any(opts)) { + error_set(errp, QERR_INVALID_PARAMETER, name); + return; } opt = g_malloc0(sizeof(*opt)); @@ -632,9 +642,7 @@ static void opt_set(QemuOpts *opts, const char *name, const char *value, } else { QTAILQ_INSERT_TAIL(&opts->head, opt, next); } - if (desc[i].name != NULL) { - opt->desc = desc+i; - } + opt->desc = desc; if (value) { opt->str = g_strdup(value); } From db97ceba1e17db59188e91b66e61bf84a6a71081 Mon Sep 17 00:00:00 2001 From: Dong Xu Wang Date: Thu, 6 Dec 2012 14:47:19 +0800 Subject: [PATCH 109/300] qemu-option: qemu_opts_validate(): fix duplicated code Use opts_accepts_any() and find_desc_by_name(). Signed-off-by: Luiz Capitulino Signed-off-by: Dong Xu Wang Signed-off-by: Kevin Wolf --- qemu-option.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/qemu-option.c b/qemu-option.c index 375daaa4ad..74321bbc13 100644 --- a/qemu-option.c +++ b/qemu-option.c @@ -1076,23 +1076,15 @@ void qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp) QemuOpt *opt; Error *local_err = NULL; - assert(opts->list->desc[0].name == NULL); + assert(opts_accepts_any(opts)); QTAILQ_FOREACH(opt, &opts->head, next) { - int i; - - for (i = 0; desc[i].name != NULL; i++) { - if (strcmp(desc[i].name, opt->name) == 0) { - break; - } - } - if (desc[i].name == NULL) { + opt->desc = find_desc_by_name(desc, opt->name); + if (!opt->desc) { error_set(errp, QERR_INVALID_PARAMETER, opt->name); return; } - opt->desc = &desc[i]; - qemu_opt_parse(opt, &local_err); if (error_is_set(&local_err)) { error_propagate(errp, local_err); From ad718d01ba0af531d10b0a8685cf5047edfd1891 Mon Sep 17 00:00:00 2001 From: Dong Xu Wang Date: Thu, 6 Dec 2012 14:47:20 +0800 Subject: [PATCH 110/300] qemu-option: qemu_opt_set_bool(): fix code duplication It will set opt->str in qemu_opt_set_bool, without opt->str, there will be some potential bugs. These are uses of opt->str, and what happens when it isn't set: * qemu_opt_get(): returns NULL, which means "not set". Bug can bite when value isn't the default value. * qemu_opt_parse(): passes NULL to parse_option_bool(), which treats it like "on". Wrong if the value is actually false. Bug can bite when qemu_opts_validate() runs after qemu_opt_set_bool(). * qemu_opt_del(): passes NULL to g_free(), which is just fine. * qemu_opt_foreach(): passes NULL to the callback, which is unlikely to be prepared for it. * qemu_opts_print(): prints NULL, which crashes on some systems. * qemu_opts_to_qdict(): passes NULL to qstring_from_str(), which crashes. It also makes qemu_opt_set_bool more readable by using find_desc_by_name and opts_accepts_any. It is based on Luiz's patch and uses Markus's comments. Discussions can be found at: http://lists.nongnu.org/archive/html/qemu-devel/2012-07/msg02716.html Signed-off-by: Dong Xu Wang Signed-off-by: Kevin Wolf --- qemu-option.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/qemu-option.c b/qemu-option.c index 74321bbc13..e0131ce7b1 100644 --- a/qemu-option.c +++ b/qemu-option.c @@ -677,30 +677,21 @@ int qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val) { QemuOpt *opt; const QemuOptDesc *desc = opts->list->desc; - int i; - - for (i = 0; desc[i].name != NULL; i++) { - if (strcmp(desc[i].name, name) == 0) { - break; - } - } - if (desc[i].name == NULL) { - if (i == 0) { - /* empty list -> allow any */; - } else { - qerror_report(QERR_INVALID_PARAMETER, name); - return -1; - } - } opt = g_malloc0(sizeof(*opt)); + opt->desc = find_desc_by_name(desc, name); + if (!opt->desc && !opts_accepts_any(opts)) { + qerror_report(QERR_INVALID_PARAMETER, name); + g_free(opt); + return -1; + } + opt->name = g_strdup(name); opt->opts = opts; - QTAILQ_INSERT_TAIL(&opts->head, opt, next); - if (desc[i].name != NULL) { - opt->desc = desc+i; - } opt->value.boolean = !!val; + opt->str = g_strdup(val ? "on" : "off"); + QTAILQ_INSERT_TAIL(&opts->head, opt, next); + return 0; } From dd39244978627e41a66b98d20eceddb1d7d25def Mon Sep 17 00:00:00 2001 From: Dong Xu Wang Date: Thu, 6 Dec 2012 14:47:21 +0800 Subject: [PATCH 111/300] introduce qemu_opts_create_nofail function While id is NULL, qemu_opts_create can not fail, so ignore errors is fine. Signed-off-by: Dong Xu Wang Signed-off-by: Kevin Wolf --- qemu-option.c | 9 +++++++++ qemu-option.h | 1 + 2 files changed, 10 insertions(+) diff --git a/qemu-option.c b/qemu-option.c index e0131ce7b1..1303188dbd 100644 --- a/qemu-option.c +++ b/qemu-option.c @@ -780,6 +780,15 @@ QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id, return opts; } +QemuOpts *qemu_opts_create_nofail(QemuOptsList *list) +{ + QemuOpts *opts; + Error *errp = NULL; + opts = qemu_opts_create(list, NULL, 0, &errp); + assert_no_error(errp); + return opts; +} + void qemu_opts_reset(QemuOptsList *list) { QemuOpts *opts, *next_opts; diff --git a/qemu-option.h b/qemu-option.h index ca729862d5..b0f8d1ecd6 100644 --- a/qemu-option.h +++ b/qemu-option.h @@ -133,6 +133,7 @@ int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque, QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id); QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id, int fail_if_exists, Error **errp); +QemuOpts *qemu_opts_create_nofail(QemuOptsList *list); void qemu_opts_reset(QemuOptsList *list); void qemu_opts_loc_restore(QemuOpts *opts); int qemu_opts_set(QemuOptsList *list, const char *id, From e478b448d7c36046462733ffaeaea0961575790a Mon Sep 17 00:00:00 2001 From: Dong Xu Wang Date: Thu, 6 Dec 2012 14:47:22 +0800 Subject: [PATCH 112/300] use qemu_opts_create_nofail We will use qemu_opts_create_nofail function, it can make code more readable. Signed-off-by: Dong Xu Wang Signed-off-by: Kevin Wolf --- blockdev.c | 2 +- hw/watchdog.c | 2 +- qemu-config.c | 4 ++-- qemu-img.c | 2 +- qemu-sockets.c | 16 ++++++++-------- vl.c | 12 +++++------- 6 files changed, 18 insertions(+), 20 deletions(-) diff --git a/blockdev.c b/blockdev.c index 463f4c2094..9a05e57009 100644 --- a/blockdev.c +++ b/blockdev.c @@ -568,7 +568,7 @@ DriveInfo *drive_init(QemuOpts *opts, BlockInterfaceType block_default_type) break; case IF_VIRTIO: /* add virtio block device */ - opts = qemu_opts_create(qemu_find_opts("device"), NULL, 0, NULL); + opts = qemu_opts_create_nofail(qemu_find_opts("device")); if (arch_type == QEMU_ARCH_S390X) { qemu_opt_set(opts, "driver", "virtio-blk-s390"); } else { diff --git a/hw/watchdog.c b/hw/watchdog.c index b52acedd98..5c82c17d09 100644 --- a/hw/watchdog.c +++ b/hw/watchdog.c @@ -66,7 +66,7 @@ int select_watchdog(const char *p) QLIST_FOREACH(model, &watchdog_list, entry) { if (strcasecmp(model->wdt_name, p) == 0) { /* add the device */ - opts = qemu_opts_create(qemu_find_opts("device"), NULL, 0, NULL); + opts = qemu_opts_create_nofail(qemu_find_opts("device")); qemu_opt_set(opts, "driver", p); return 0; } diff --git a/qemu-config.c b/qemu-config.c index aa78fb9ea7..54db9813e8 100644 --- a/qemu-config.c +++ b/qemu-config.c @@ -756,7 +756,7 @@ int qemu_global_option(const char *str) return -1; } - opts = qemu_opts_create(&qemu_global_opts, NULL, 0, NULL); + opts = qemu_opts_create_nofail(&qemu_global_opts); qemu_opt_set(opts, "driver", driver); qemu_opt_set(opts, "property", property); qemu_opt_set(opts, "value", str+offset+1); @@ -843,7 +843,7 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname) error_free(local_err); goto out; } - opts = qemu_opts_create(list, NULL, 0, NULL); + opts = qemu_opts_create_nofail(list); continue; } if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2) { diff --git a/qemu-img.c b/qemu-img.c index c4dae88e84..c989a52564 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -1934,7 +1934,7 @@ static int img_resize(int argc, char **argv) } /* Parse size */ - param = qemu_opts_create(&resize_options, NULL, 0, NULL); + param = qemu_opts_create_nofail(&resize_options); if (qemu_opt_set(param, BLOCK_OPT_SIZE, size)) { /* Error message already printed when size parsing fails */ ret = -1; diff --git a/qemu-sockets.c b/qemu-sockets.c index d314cf1d1b..c52a40a411 100644 --- a/qemu-sockets.c +++ b/qemu-sockets.c @@ -579,7 +579,7 @@ int inet_listen(const char *str, char *ostr, int olen, addr = inet_parse(str, errp); if (addr != NULL) { - opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL); + opts = qemu_opts_create_nofail(&dummy_opts); inet_addr_to_opts(opts, addr); qapi_free_InetSocketAddress(addr); sock = inet_listen_opts(opts, port_offset, errp); @@ -618,7 +618,7 @@ int inet_connect(const char *str, Error **errp) addr = inet_parse(str, errp); if (addr != NULL) { - opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL); + opts = qemu_opts_create_nofail(&dummy_opts); inet_addr_to_opts(opts, addr); qapi_free_InetSocketAddress(addr); sock = inet_connect_opts(opts, errp, NULL, NULL); @@ -652,7 +652,7 @@ int inet_nonblocking_connect(const char *str, addr = inet_parse(str, errp); if (addr != NULL) { - opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL); + opts = qemu_opts_create_nofail(&dummy_opts); inet_addr_to_opts(opts, addr); qapi_free_InetSocketAddress(addr); sock = inet_connect_opts(opts, errp, callback, opaque); @@ -795,7 +795,7 @@ int unix_listen(const char *str, char *ostr, int olen, Error **errp) char *path, *optstr; int sock, len; - opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL); + opts = qemu_opts_create_nofail(&dummy_opts); optstr = strchr(str, ','); if (optstr) { @@ -823,7 +823,7 @@ int unix_connect(const char *path, Error **errp) QemuOpts *opts; int sock; - opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL); + opts = qemu_opts_create_nofail(&dummy_opts); qemu_opt_set(opts, "path", path); sock = unix_connect_opts(opts, errp, NULL, NULL); qemu_opts_del(opts); @@ -840,7 +840,7 @@ int unix_nonblocking_connect(const char *path, g_assert(callback != NULL); - opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL); + opts = qemu_opts_create_nofail(&dummy_opts); qemu_opt_set(opts, "path", path); sock = unix_connect_opts(opts, errp, callback, opaque); qemu_opts_del(opts); @@ -891,7 +891,7 @@ int socket_connect(SocketAddress *addr, Error **errp, QemuOpts *opts; int fd; - opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL); + opts = qemu_opts_create_nofail(&dummy_opts); switch (addr->kind) { case SOCKET_ADDRESS_KIND_INET: inet_addr_to_opts(opts, addr->inet); @@ -922,7 +922,7 @@ int socket_listen(SocketAddress *addr, Error **errp) QemuOpts *opts; int fd; - opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL); + opts = qemu_opts_create_nofail(&dummy_opts); switch (addr->kind) { case SOCKET_ADDRESS_KIND_INET: inet_addr_to_opts(opts, addr->inet); diff --git a/vl.c b/vl.c index 6b3827cf06..3ebf01f8f1 100644 --- a/vl.c +++ b/vl.c @@ -1996,7 +1996,7 @@ static int balloon_parse(const char *arg) return -1; } else { /* create empty opts */ - opts = qemu_opts_create(qemu_find_opts("device"), NULL, 0, NULL); + opts = qemu_opts_create_nofail(qemu_find_opts("device")); } qemu_opt_set(opts, "driver", "virtio-balloon"); return 0; @@ -2246,14 +2246,14 @@ static int virtcon_parse(const char *devname) exit(1); } - bus_opts = qemu_opts_create(device, NULL, 0, NULL); + bus_opts = qemu_opts_create_nofail(device); if (arch_type == QEMU_ARCH_S390X) { qemu_opt_set(bus_opts, "driver", "virtio-serial-s390"); } else { qemu_opt_set(bus_opts, "driver", "virtio-serial-pci"); } - dev_opts = qemu_opts_create(device, NULL, 0, NULL); + dev_opts = qemu_opts_create_nofail(device); qemu_opt_set(dev_opts, "driver", "virtconsole"); snprintf(label, sizeof(label), "virtcon%d", index); @@ -3105,8 +3105,7 @@ int main(int argc, char **argv, char **envp) qemu_opt_set_bool(fsdev, "readonly", qemu_opt_get_bool(opts, "readonly", 0)); - device = qemu_opts_create(qemu_find_opts("device"), NULL, 0, - NULL); + device = qemu_opts_create_nofail(qemu_find_opts("device")); qemu_opt_set(device, "driver", "virtio-9p-pci"); qemu_opt_set(device, "fsdev", qemu_opt_get(opts, "mount_tag")); @@ -3126,8 +3125,7 @@ int main(int argc, char **argv, char **envp) } qemu_opt_set(fsdev, "fsdriver", "synth"); - device = qemu_opts_create(qemu_find_opts("device"), NULL, 0, - NULL); + device = qemu_opts_create_nofail(qemu_find_opts("device")); qemu_opt_set(device, "driver", "virtio-9p-pci"); qemu_opt_set(device, "fsdev", "v_synth"); qemu_opt_set(device, "mount_tag", "v_synth"); From b83c18e225cf82a21535561270b6dfd86b1c9031 Mon Sep 17 00:00:00 2001 From: Dong Xu Wang Date: Thu, 6 Dec 2012 14:47:23 +0800 Subject: [PATCH 113/300] create new function: qemu_opt_set_number Signed-off-by: Dong Xu Wang Signed-off-by: Kevin Wolf --- qemu-option.c | 22 ++++++++++++++++++++++ qemu-option.h | 1 + 2 files changed, 23 insertions(+) diff --git a/qemu-option.c b/qemu-option.c index 1303188dbd..94557cfde7 100644 --- a/qemu-option.c +++ b/qemu-option.c @@ -695,6 +695,28 @@ int qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val) return 0; } +int qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val) +{ + QemuOpt *opt; + const QemuOptDesc *desc = opts->list->desc; + + opt = g_malloc0(sizeof(*opt)); + opt->desc = find_desc_by_name(desc, name); + if (!opt->desc && !opts_accepts_any(opts)) { + qerror_report(QERR_INVALID_PARAMETER, name); + g_free(opt); + return -1; + } + + opt->name = g_strdup(name); + opt->opts = opts; + opt->value.uint = val; + opt->str = g_strdup_printf("%" PRId64, val); + QTAILQ_INSERT_TAIL(&opts->head, opt, next); + + return 0; +} + int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque, int abort_on_failure) { diff --git a/qemu-option.h b/qemu-option.h index b0f8d1ecd6..002dd07ee5 100644 --- a/qemu-option.h +++ b/qemu-option.h @@ -126,6 +126,7 @@ int qemu_opt_set(QemuOpts *opts, const char *name, const char *value); void qemu_opt_set_err(QemuOpts *opts, const char *name, const char *value, Error **errp); int qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val); +int qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val); typedef int (*qemu_opt_loopfunc)(const char *name, const char *value, void *opaque); int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque, int abort_on_failure); From 312a2ba0eb8ab19646517aeaa785475d3fbcfd51 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Thu, 6 Dec 2012 14:32:55 +0100 Subject: [PATCH 114/300] blkdebug: Allow usage without config file As soon as new rules can be set during runtime, as introduced by the next patch, blkdebug makes sense even without a config file. Signed-off-by: Kevin Wolf --- block/blkdebug.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/block/blkdebug.c b/block/blkdebug.c index d61ece86a9..c9041ec3d2 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -240,6 +240,11 @@ static int read_config(BDRVBlkdebugState *s, const char *filename) int ret; struct add_rule_data d; + /* Allow usage without config file */ + if (!*filename) { + return 0; + } + f = fopen(filename, "r"); if (f == NULL) { return -errno; From 9e35542b0fc3871caac15ccd57548b99df2c94b7 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Thu, 6 Dec 2012 14:32:56 +0100 Subject: [PATCH 115/300] blkdebug: Factor out remove_rule() The cleanup work to remove a rule depends on the type of the rule. It's easy for the existing rules as there is no data that must be cleaned up and is specific to a type yet, but the next patch will change this. Signed-off-by: Kevin Wolf --- block/blkdebug.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/block/blkdebug.c b/block/blkdebug.c index c9041ec3d2..859792b647 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -234,6 +234,18 @@ static int add_rule(QemuOpts *opts, void *opaque) return 0; } +static void remove_rule(BlkdebugRule *rule) +{ + switch (rule->action) { + case ACTION_INJECT_ERROR: + case ACTION_SET_STATE: + break; + } + + QLIST_REMOVE(rule, next); + g_free(rule); +} + static int read_config(BDRVBlkdebugState *s, const char *filename) { FILE *f; @@ -402,8 +414,7 @@ static void blkdebug_close(BlockDriverState *bs) for (i = 0; i < BLKDBG_EVENT_MAX; i++) { QLIST_FOREACH_SAFE(rule, &s->rules[i], next, next) { - QLIST_REMOVE(rule, next); - g_free(rule); + remove_rule(rule); } } } From 3c90c65d7adab49a41952ee14e1d65f81355e408 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Thu, 6 Dec 2012 14:32:57 +0100 Subject: [PATCH 116/300] blkdebug: Implement suspend/resume of AIO requests This allows more systematic AIO testing. The patch adds three new operations to blkdebug: * Setting a "breakpoint" on a blkdebug event. The next request that triggers this breakpoint is suspended and is tagged with a name. The breakpoint is removed after a request has triggered it. * A suspended request (identified by it's tag) can be resumed * It's possible to check whether a suspended request with a given tag exists. This can be used for waiting for an event. Ideally, we would instead tag requests right when they are created and set breakpoints for individual requests. However, at this point the block layer doesn't allow this easily, and breakpoints that trigger for any request already allow a lot of useful testing. Signed-off-by: Kevin Wolf --- block/blkdebug.c | 108 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 105 insertions(+), 3 deletions(-) diff --git a/block/blkdebug.c b/block/blkdebug.c index 859792b647..294e983306 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -29,8 +29,10 @@ typedef struct BDRVBlkdebugState { int state; int new_state; + QLIST_HEAD(, BlkdebugRule) rules[BLKDBG_EVENT_MAX]; QSIMPLEQ_HEAD(, BlkdebugRule) active_rules; + QLIST_HEAD(, BlkdebugSuspendedReq) suspended_reqs; } BDRVBlkdebugState; typedef struct BlkdebugAIOCB { @@ -39,6 +41,12 @@ typedef struct BlkdebugAIOCB { int ret; } BlkdebugAIOCB; +typedef struct BlkdebugSuspendedReq { + Coroutine *co; + char *tag; + QLIST_ENTRY(BlkdebugSuspendedReq) next; +} BlkdebugSuspendedReq; + static void blkdebug_aio_cancel(BlockDriverAIOCB *blockacb); static const AIOCBInfo blkdebug_aiocb_info = { @@ -49,6 +57,7 @@ static const AIOCBInfo blkdebug_aiocb_info = { enum { ACTION_INJECT_ERROR, ACTION_SET_STATE, + ACTION_SUSPEND, }; typedef struct BlkdebugRule { @@ -65,6 +74,9 @@ typedef struct BlkdebugRule { struct { int new_state; } set_state; + struct { + char *tag; + } suspend; } options; QLIST_ENTRY(BlkdebugRule) next; QSIMPLEQ_ENTRY(BlkdebugRule) active_next; @@ -226,6 +238,11 @@ static int add_rule(QemuOpts *opts, void *opaque) rule->options.set_state.new_state = qemu_opt_get_number(opts, "new_state", 0); break; + + case ACTION_SUSPEND: + rule->options.suspend.tag = + g_strdup(qemu_opt_get(opts, "tag")); + break; }; /* Add the rule */ @@ -240,6 +257,9 @@ static void remove_rule(BlkdebugRule *rule) case ACTION_INJECT_ERROR: case ACTION_SET_STATE: break; + case ACTION_SUSPEND: + g_free(rule->options.suspend.tag); + break; } QLIST_REMOVE(rule, next); @@ -406,6 +426,7 @@ static BlockDriverAIOCB *blkdebug_aio_writev(BlockDriverState *bs, return bdrv_aio_writev(bs->file, sector_num, qiov, nb_sectors, cb, opaque); } + static void blkdebug_close(BlockDriverState *bs) { BDRVBlkdebugState *s = bs->opaque; @@ -419,6 +440,27 @@ static void blkdebug_close(BlockDriverState *bs) } } +static void suspend_request(BlockDriverState *bs, BlkdebugRule *rule) +{ + BDRVBlkdebugState *s = bs->opaque; + BlkdebugSuspendedReq r; + + r = (BlkdebugSuspendedReq) { + .co = qemu_coroutine_self(), + .tag = g_strdup(rule->options.suspend.tag), + }; + + remove_rule(rule); + QLIST_INSERT_HEAD(&s->suspended_reqs, &r, next); + + printf("blkdebug: Suspended request '%s'\n", r.tag); + qemu_coroutine_yield(); + printf("blkdebug: Resuming request '%s'\n", r.tag); + + QLIST_REMOVE(&r, next); + g_free(r.tag); +} + static bool process_rule(BlockDriverState *bs, struct BlkdebugRule *rule, bool injected) { @@ -442,6 +484,10 @@ static bool process_rule(BlockDriverState *bs, struct BlkdebugRule *rule, case ACTION_SET_STATE: s->new_state = rule->options.set_state.new_state; break; + + case ACTION_SUSPEND: + suspend_request(bs, rule); + break; } return injected; } @@ -449,19 +495,72 @@ static bool process_rule(BlockDriverState *bs, struct BlkdebugRule *rule, static void blkdebug_debug_event(BlockDriverState *bs, BlkDebugEvent event) { BDRVBlkdebugState *s = bs->opaque; - struct BlkdebugRule *rule; + struct BlkdebugRule *rule, *next; bool injected; assert((int)event >= 0 && event < BLKDBG_EVENT_MAX); injected = false; s->new_state = s->state; - QLIST_FOREACH(rule, &s->rules[event], next) { + QLIST_FOREACH_SAFE(rule, &s->rules[event], next, next) { injected = process_rule(bs, rule, injected); } s->state = s->new_state; } +static int blkdebug_debug_breakpoint(BlockDriverState *bs, const char *event, + const char *tag) +{ + BDRVBlkdebugState *s = bs->opaque; + struct BlkdebugRule *rule; + BlkDebugEvent blkdebug_event; + + if (get_event_by_name(event, &blkdebug_event) < 0) { + return -ENOENT; + } + + + rule = g_malloc(sizeof(*rule)); + *rule = (struct BlkdebugRule) { + .event = blkdebug_event, + .action = ACTION_SUSPEND, + .state = 0, + .options.suspend.tag = g_strdup(tag), + }; + + QLIST_INSERT_HEAD(&s->rules[blkdebug_event], rule, next); + + return 0; +} + +static int blkdebug_debug_resume(BlockDriverState *bs, const char *tag) +{ + BDRVBlkdebugState *s = bs->opaque; + BlkdebugSuspendedReq *r; + + QLIST_FOREACH(r, &s->suspended_reqs, next) { + if (!strcmp(r->tag, tag)) { + qemu_coroutine_enter(r->co, NULL); + return 0; + } + } + return -ENOENT; +} + + +static bool blkdebug_debug_is_suspended(BlockDriverState *bs, const char *tag) +{ + BDRVBlkdebugState *s = bs->opaque; + BlkdebugSuspendedReq *r; + + QLIST_FOREACH(r, &s->suspended_reqs, next) { + if (!strcmp(r->tag, tag)) { + return true; + } + } + return false; +} + static int64_t blkdebug_getlength(BlockDriverState *bs) { return bdrv_getlength(bs->file); @@ -480,7 +579,10 @@ static BlockDriver bdrv_blkdebug = { .bdrv_aio_readv = blkdebug_aio_readv, .bdrv_aio_writev = blkdebug_aio_writev, - .bdrv_debug_event = blkdebug_debug_event, + .bdrv_debug_event = blkdebug_debug_event, + .bdrv_debug_breakpoint = blkdebug_debug_breakpoint, + .bdrv_debug_resume = blkdebug_debug_resume, + .bdrv_debug_is_suspended = blkdebug_debug_is_suspended, }; static void bdrv_blkdebug_init(void) From 41c695c749b84d40e53e64faadedc0392aaea07e Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Thu, 6 Dec 2012 14:32:58 +0100 Subject: [PATCH 117/300] qemu-io: Add AIO debugging commands This makes the blkdebug suspend/resume functionality available in qemu-io. Use it like this: $ ./qemu-io blkdebug::/tmp/test.qcow2 qemu-io> break write_aio req_a qemu-io> aio_write 0 4k qemu-io> blkdebug: Suspended request 'req_a' qemu-io> resume req_a blkdebug: Resuming request 'req_a' qemu-io> wrote 4096/4096 bytes at offset 0 4 KiB, 1 ops; 0:00:30.71 (133.359788 bytes/sec and 0.0326 ops/sec) Signed-off-by: Kevin Wolf --- block.c | 39 ++++++++++++++++++++++++++++++++ block.h | 5 +++++ block_int.h | 6 +++++ qemu-io.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 114 insertions(+) diff --git a/block.c b/block.c index b3faf3a463..0668c4be17 100644 --- a/block.c +++ b/block.c @@ -3045,7 +3045,46 @@ void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event) } drv->bdrv_debug_event(bs, event); +} +int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event, + const char *tag) +{ + while (bs && bs->drv && !bs->drv->bdrv_debug_breakpoint) { + bs = bs->file; + } + + if (bs && bs->drv && bs->drv->bdrv_debug_breakpoint) { + return bs->drv->bdrv_debug_breakpoint(bs, event, tag); + } + + return -ENOTSUP; +} + +int bdrv_debug_resume(BlockDriverState *bs, const char *tag) +{ + while (bs && bs->drv && !bs->drv->bdrv_debug_resume) { + bs = bs->file; + } + + if (bs && bs->drv && bs->drv->bdrv_debug_resume) { + return bs->drv->bdrv_debug_resume(bs, tag); + } + + return -ENOTSUP; +} + +bool bdrv_debug_is_suspended(BlockDriverState *bs, const char *tag) +{ + while (bs && bs->drv && !bs->drv->bdrv_debug_is_suspended) { + bs = bs->file; + } + + if (bs && bs->drv && bs->drv->bdrv_debug_is_suspended) { + return bs->drv->bdrv_debug_is_suspended(bs, tag); + } + + return false; } /**************************************************************/ diff --git a/block.h b/block.h index 24bea09530..893448a5fc 100644 --- a/block.h +++ b/block.h @@ -431,4 +431,9 @@ typedef enum { #define BLKDBG_EVENT(bs, evt) bdrv_debug_event(bs, evt) void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event); +int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event, + const char *tag); +int bdrv_debug_resume(BlockDriverState *bs, const char *tag); +bool bdrv_debug_is_suspended(BlockDriverState *bs, const char *tag); + #endif diff --git a/block_int.h b/block_int.h index 9deedb811a..bf3f79b3db 100644 --- a/block_int.h +++ b/block_int.h @@ -190,6 +190,12 @@ struct BlockDriver { void (*bdrv_debug_event)(BlockDriverState *bs, BlkDebugEvent event); + /* TODO Better pass a option string/QDict/QemuOpts to add any rule? */ + int (*bdrv_debug_breakpoint)(BlockDriverState *bs, const char *event, + const char *tag); + int (*bdrv_debug_resume)(BlockDriverState *bs, const char *tag); + bool (*bdrv_debug_is_suspended)(BlockDriverState *bs, const char *tag); + /* * Returns 1 if newly created images are guaranteed to contain only * zeros, 0 otherwise. diff --git a/qemu-io.c b/qemu-io.c index b4b0898741..1637773302 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -1671,6 +1671,67 @@ static const cmdinfo_t map_cmd = { .oneline = "prints the allocated areas of a file", }; +static int break_f(int argc, char **argv) +{ + int ret; + + ret = bdrv_debug_breakpoint(bs, argv[1], argv[2]); + if (ret < 0) { + printf("Could not set breakpoint: %s\n", strerror(-ret)); + } + + return 0; +} + +static const cmdinfo_t break_cmd = { + .name = "break", + .argmin = 2, + .argmax = 2, + .cfunc = break_f, + .args = "event tag", + .oneline = "sets a breakpoint on event and tags the stopped " + "request as tag", +}; + +static int resume_f(int argc, char **argv) +{ + int ret; + + ret = bdrv_debug_resume(bs, argv[1]); + if (ret < 0) { + printf("Could not resume request: %s\n", strerror(-ret)); + } + + return 0; +} + +static const cmdinfo_t resume_cmd = { + .name = "resume", + .argmin = 1, + .argmax = 1, + .cfunc = resume_f, + .args = "tag", + .oneline = "resumes the request tagged as tag", +}; + +static int wait_break_f(int argc, char **argv) +{ + while (!bdrv_debug_is_suspended(bs, argv[1])) { + qemu_aio_wait(); + } + + return 0; +} + +static const cmdinfo_t wait_break_cmd = { + .name = "wait_break", + .argmin = 1, + .argmax = 1, + .cfunc = wait_break_f, + .args = "tag", + .oneline = "waits for the suspension of a request", +}; + static int abort_f(int argc, char **argv) { abort(); @@ -1934,6 +1995,9 @@ int main(int argc, char **argv) add_command(&discard_cmd); add_command(&alloc_cmd); add_command(&map_cmd); + add_command(&break_cmd); + add_command(&resume_cmd); + add_command(&wait_break_cmd); add_command(&abort_cmd); add_args_command(init_args_command); From 67a7a0ebe5ef0f337d5f7e7e618b08c562a55da0 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Thu, 6 Dec 2012 14:32:59 +0100 Subject: [PATCH 118/300] qcow2: Move BLKDBG_EVENT out of the lock We want to use these events to suspend requests for testing concurrent AIO requests. Suspending requests while they are holding the CoMutex is rather boring for this purpose. Signed-off-by: Kevin Wolf --- block/qcow2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/qcow2.c b/block/qcow2.c index c1ff31f482..0a08ec74c7 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -835,8 +835,8 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, cur_nr_sectors * 512); } - BLKDBG_EVENT(bs->file, BLKDBG_WRITE_AIO); qemu_co_mutex_unlock(&s->lock); + BLKDBG_EVENT(bs->file, BLKDBG_WRITE_AIO); trace_qcow2_writev_data(qemu_coroutine_self(), (cluster_offset >> 9) + index_in_cluster); ret = bdrv_co_writev(bs->file, From 91d4093dce58e343e2336324794daa93517b86c2 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Thu, 6 Dec 2012 14:33:00 +0100 Subject: [PATCH 119/300] qemu-iotests: Test concurrent cluster allocations This adds some first tests for qcow2's dependency handling when two parallel write requests access the same cluster. Signed-off-by: Kevin Wolf --- tests/qemu-iotests/046 | 215 +++++++++++++++++++++++++++++++++++++ tests/qemu-iotests/046.out | 163 ++++++++++++++++++++++++++++ tests/qemu-iotests/group | 1 + 3 files changed, 379 insertions(+) create mode 100755 tests/qemu-iotests/046 create mode 100644 tests/qemu-iotests/046.out diff --git a/tests/qemu-iotests/046 b/tests/qemu-iotests/046 new file mode 100755 index 0000000000..e0176f42df --- /dev/null +++ b/tests/qemu-iotests/046 @@ -0,0 +1,215 @@ +#!/bin/bash +# +# Test concurrent cluster allocations +# +# Copyright (C) 2012 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# creator +owner=kwolf@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + _cleanup_test_img +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +_supported_fmt qcow2 +_supported_proto generic +_supported_os Linux + +CLUSTER_SIZE=64k +size=128M + +echo +echo "== creating backing file for COW tests ==" + +_make_test_img $size + +function backing_io() +{ + local offset=$1 + local sectors=$2 + local op=$3 + local pattern=0 + local cur_sec=0 + + for i in $(seq 0 $((sectors - 1))); do + cur_sec=$((offset / 65536 + i)) + pattern=$(( ( (cur_sec % 128) + (cur_sec / 128)) % 128 )) + + echo "$op -P $pattern $((cur_sec * 64))k 64k" + done +} + +backing_io 0 16 write | $QEMU_IO $TEST_IMG | _filter_qemu_io + +mv $TEST_IMG $TEST_IMG.base + +_make_test_img -b $TEST_IMG.base 6G + +echo +echo "== Some concurrent requests touching the same cluster ==" + +function overlay_io() +{ +# Allocate middle of cluster 1, then write to somewhere before and after it +cat < wrote 65536/65536 bytes at offset 0 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 65536 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 131072 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 196608 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 262144 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 327680 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 393216 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 458752 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 524288 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 589824 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 655360 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 720896 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 786432 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 851968 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 917504 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset 983040 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=6442450944 backing_file='TEST_DIR/t.IMGFMT.base' + +== Some concurrent requests touching the same cluster == +qemu-io> qemu-io> qemu-io> blkdebug: Suspended request 'A' +qemu-io> qemu-io> qemu-io> qemu-io> qemu-io> blkdebug: Resuming request 'A' +qemu-io> wrote 8192/8192 bytes at offset XXX +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 8192/8192 bytes at offset XXX +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 8192/8192 bytes at offset XXX +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> qemu-io> blkdebug: Suspended request 'A' +qemu-io> qemu-io> qemu-io> blkdebug: Resuming request 'A' +qemu-io> wrote 8192/8192 bytes at offset XXX +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 65536/65536 bytes at offset XXX +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> qemu-io> blkdebug: Suspended request 'A' +qemu-io> qemu-io> qemu-io> blkdebug: Resuming request 'A' +qemu-io> wrote 8192/8192 bytes at offset XXX +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 65536/65536 bytes at offset XXX +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 32768/32768 bytes at offset XXX +32 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> qemu-io> qemu-io> blkdebug: Suspended request 'A' +qemu-io> qemu-io> qemu-io> blkdebug: Resuming request 'A' +qemu-io> wrote 8192/8192 bytes at offset XXX +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 57344/57344 bytes at offset XXX +56 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 4096/4096 bytes at offset XXX +4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 32768/32768 bytes at offset XXX +32 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> qemu-io> discard 65536/65536 bytes at offset XXX +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> qemu-io> qemu-io> blkdebug: Suspended request 'A' +qemu-io> qemu-io> qemu-io> blkdebug: Resuming request 'A' +qemu-io> wrote 8192/8192 bytes at offset XXX +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 57344/57344 bytes at offset XXX +56 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 4096/4096 bytes at offset XXX +4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> wrote 65536/65536 bytes at offset XXX +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> qemu-io> discard 65536/65536 bytes at offset XXX +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> qemu-io> qemu-io> blkdebug: Suspended request 'A' +qemu-io> qemu-io> qemu-io> blkdebug: Resuming request 'A' +qemu-io> wrote 8192/8192 bytes at offset XXX +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 57344/57344 bytes at offset XXX +56 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> +== Verify image content == +qemu-io> read 65536/65536 bytes at offset 0 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 65536 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 73728 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 16384/16384 bytes at offset 81920 +16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 98304 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 106496 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 114688 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 122880 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 32768/32768 bytes at offset 131072 +32 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 163840 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 65536/65536 bytes at offset 172032 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 24576/24576 bytes at offset 237568 +24 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 32768/32768 bytes at offset 262144 +32 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 294912 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 303104 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 65536/65536 bytes at offset 311296 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 16384/16384 bytes at offset 376832 +16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 24576/24576 bytes at offset 393216 +24 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 417792 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 425984 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 57344/57344 bytes at offset 434176 +56 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 24576/24576 bytes at offset 491520 +24 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 516096 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 24576/24576 bytes at offset 524288 +24 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 548864 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 557056 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 57344/57344 bytes at offset 565248 +56 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 24576/24576 bytes at offset 622592 +24 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 647168 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 24576/24576 bytes at offset 655360 +24 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 679936 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 8192/8192 bytes at offset 688128 +8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 57344/57344 bytes at offset 696320 +56 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> read 32768/32768 bytes at offset 753664 +32 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-io> No errors were found on the image. +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index 5b39785461..a0307de06b 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -52,3 +52,4 @@ 043 rw auto backing 044 rw auto 045 rw auto +046 rw auto aio From 7ec81e56edc2b2007ce0ae3982aa5c18af9546ab Mon Sep 17 00:00:00 2001 From: David Gibson Date: Tue, 4 Dec 2012 11:38:38 +1100 Subject: [PATCH 120/300] Fix off-by-1 error in RAM migration code The code for migrating (or savevm-ing) memory pages starts off by creating a dirty bitmap and filling it with 1s. Except, actually, because bit addresses are 0-based it fills every bit except bit 0 with 1s and puts an extra 1 beyond the end of the bitmap, potentially corrupting unrelated memory. Oops. This patch fixes it. Signed-off-by: David Gibson Signed-off-by: Anthony Liguori --- arch_init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch_init.c b/arch_init.c index e6effe809a..b75a4c5580 100644 --- a/arch_init.c +++ b/arch_init.c @@ -568,7 +568,7 @@ static int ram_save_setup(QEMUFile *f, void *opaque) int64_t ram_pages = last_ram_offset() >> TARGET_PAGE_BITS; migration_bitmap = bitmap_new(ram_pages); - bitmap_set(migration_bitmap, 1, ram_pages); + bitmap_set(migration_bitmap, 0, ram_pages); migration_dirty_pages = ram_pages; bytes_transferred = 0; From 45e6cee42b98d10e2e14885ab656541a9ffd5187 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Tue, 4 Dec 2012 11:38:39 +1100 Subject: [PATCH 121/300] migration: Fix madvise breakage if host and guest have different page sizes madvise(DONTNEED) will throw away the contents of the whole page at the given address, even if the given length is less than the page size. One can argue about whether that's the correct behaviour, but that's what it's done for a long time in Linux at least. That means that the madvise() in ram_load(), on a setup where TARGET_PAGE_SIZE is smaller than the host page size, can throw away data in guest pages adjacent to the one it's actually processing right now, leading to guest memory corruption on an incoming migration. This patch therefore, disables the madvise() if the host page size is larger than TARGET_PAGE_SIZE. This means we don't get the benefits of that madvise() in this case, but a more complete fix is more difficult to accomplish. This at least fixes the guest memory corruption. Signed-off-by: David Gibson Reported-by: Alexey Kardashevskiy Signed-off-by: Anthony Liguori --- arch_init.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch_init.c b/arch_init.c index b75a4c5580..83dcc53ff5 100644 --- a/arch_init.c +++ b/arch_init.c @@ -840,7 +840,8 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id) memset(host, ch, TARGET_PAGE_SIZE); #ifndef _WIN32 if (ch == 0 && - (!kvm_enabled() || kvm_has_sync_mmu())) { + (!kvm_enabled() || kvm_has_sync_mmu()) && + getpagesize() <= TARGET_PAGE_SIZE) { qemu_madvise(host, TARGET_PAGE_SIZE, QEMU_MADV_DONTNEED); } #endif From 6f918e40e6b7f4e3dcf89c3e3f1001e965a683a1 Mon Sep 17 00:00:00 2001 From: Jason Baron Date: Mon, 29 Oct 2012 22:11:31 -0400 Subject: [PATCH 122/300] Fixup q35/ich9 Licenses Cleanup the q35/ich9 license headers. Signed-off-by: Jason Baron Signed-off-by: Michael S. Tsirkin Acked-by: Isaku Yamahata --- hw/acpi_ich9.c | 13 +++++++------ hw/lpc_ich9.c | 32 ++++++++------------------------ hw/smbus_ich9.c | 14 ++++++++------ 3 files changed, 23 insertions(+), 36 deletions(-) diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c index c5978d33cc..85d441c33c 100644 --- a/hw/acpi_ich9.c +++ b/hw/acpi_ich9.c @@ -2,6 +2,11 @@ * ACPI implementation * * Copyright (c) 2006 Fabrice Bellard + * Copyright (c) 2009 Isaku Yamahata + * VA Linux Systems Japan K.K. + * Copyright (C) 2012 Jason Baron + * + * This is based on acpi.c. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -14,13 +19,9 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see - */ -/* - * Copyright (c) 2009 Isaku Yamahata - * VA Linux Systems Japan K.K. - * Copyright (C) 2012 Jason Baron * - * This is based on acpi.c. + * Contributions after 2012-01-13 are licensed under the terms of the + * GNU GPL, version 2 or (at your option) any later version. */ #include "hw.h" #include "pc.h" diff --git a/hw/lpc_ich9.c b/hw/lpc_ich9.c index 878a43e92c..7a113633ed 100644 --- a/hw/lpc_ich9.c +++ b/hw/lpc_ich9.c @@ -1,5 +1,13 @@ /* + * QEMU ICH9 Emulation + * * Copyright (c) 2006 Fabrice Bellard + * Copyright (c) 2009, 2010, 2011 + * Isaku Yamahata + * VA Linux Systems Japan K.K. + * Copyright (C) 2012 Jason Baron + * + * This is based on piix_pci.c, but heavily modified. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,30 +27,6 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -/* - * QEMU ICH9 Emulation - * - * Copyright (c) 2009, 2010, 2011 - * Isaku Yamahata - * VA Linux Systems Japan K.K. - * Copyright (C) 2012 Jason Baron - * - * This is based on piix_pci.c, but heavily modified. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see - */ - #include "qemu-common.h" #include "hw.h" #include "range.h" diff --git a/hw/smbus_ich9.c b/hw/smbus_ich9.c index 4194785d71..d202664a36 100644 --- a/hw/smbus_ich9.c +++ b/hw/smbus_ich9.c @@ -2,6 +2,11 @@ * ACPI implementation * * Copyright (c) 2006 Fabrice Bellard + * Copyright (c) 2009 Isaku Yamahata + * VA Linux Systems Japan K.K. + * Copyright (C) 2012 Jason Baron + * + * This is based on acpi.c, but heavily rewritten. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -14,13 +19,10 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see - */ -/* - * Copyright (c) 2009 Isaku Yamahata - * VA Linux Systems Japan K.K. - * Copyright (C) 2012 Jason Baron * - * This is based on acpi.c, but heavily rewritten. + * Contributions after 2012-01-13 are licensed under the terms of the + * GNU GPL, version 2 or (at your option) any later version. + * */ #include "hw.h" #include "pc.h" From 89e6d68ef3c45b2c4e3199c3397b5525b752698d Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Mon, 12 Nov 2012 09:13:04 +0200 Subject: [PATCH 123/300] tap: reset vnet header size on open For tap, we currently assume the vnet header size is 10 (the default value) but that might not be the case if tap is persistent and has been used by qemu previously. To fix, set vnet header size correctly on open. Signed-off-by: Michael S. Tsirkin --- net/tap-linux.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/net/tap-linux.c b/net/tap-linux.c index c6521bec34..3eaedc40ad 100644 --- a/net/tap-linux.c +++ b/net/tap-linux.c @@ -39,6 +39,7 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required { struct ifreq ifr; int fd, ret; + int len = sizeof(struct virtio_net_hdr); TFR(fd = open(PATH_NET_TUN, O_RDWR)); if (fd < 0) { @@ -65,6 +66,13 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required close(fd); return -1; } + /* + * Make sure vnet header size has the default value: for a persistent + * tap it might have been modified e.g. by another instance of qemu. + * Ignore errors since old kernels do not support this ioctl: in this + * case the header size implicitly has the correct value. + */ + ioctl(fd, TUNSETVNETHDRSZ, &len); } if (ifname[0] != '\0') From c84a2b1aa5ccdddad03d25f58be5c94eba0d9db4 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Mon, 10 Dec 2012 22:52:11 +0200 Subject: [PATCH 124/300] get_maintainer.pl: update from linix 3.8 Signed-off-by: Michael S. Tsirkin --- scripts/get_maintainer.pl | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl index d9c48e0982..bf5342a08d 100755 --- a/scripts/get_maintainer.pl +++ b/scripts/get_maintainer.pl @@ -83,6 +83,8 @@ push(@signature_tags, "Signed-off-by:"); push(@signature_tags, "Reviewed-by:"); push(@signature_tags, "Acked-by:"); +my $signature_pattern = "\(" . join("|", @signature_tags) . "\)"; + # rfc822 email address - preloaded methods go here. my $rfc822_lwsp = "(?:(?:\\r\\n)?[ \\t])"; my $rfc822_char = '[\\000-\\377]'; @@ -95,7 +97,7 @@ my %VCS_cmds_git = ( "execute_cmd" => \&git_execute_cmd, "available" => '(which("git") ne "") && (-d ".git")', "find_signers_cmd" => - "git log --no-color --since=\$email_git_since " . + "git log --no-color --follow --since=\$email_git_since " . '--format="GitCommit: %H%n' . 'GitAuthor: %an <%ae>%n' . 'GitDate: %aD%n' . @@ -328,7 +330,8 @@ sub read_mailmap { # name1 # name1 name2 # (see man git-shortlog) - if (/^(.+)<(.+)>$/) { + + if (/^([^<]+)<([^>]+)>$/) { my $real_name = $1; my $address = $2; @@ -336,13 +339,13 @@ sub read_mailmap { ($real_name, $address) = parse_email("$real_name <$address>"); $mailmap->{names}->{$address} = $real_name; - } elsif (/^<([^\s]+)>\s*<([^\s]+)>$/) { + } elsif (/^<([^>]+)>\s*<([^>]+)>$/) { my $real_address = $1; my $wrong_address = $2; $mailmap->{addresses}->{$wrong_address} = $real_address; - } elsif (/^(.+)<([^\s]+)>\s*<([^\s]+)>$/) { + } elsif (/^(.+)<([^>]+)>\s*<([^>]+)>$/) { my $real_name = $1; my $real_address = $2; my $wrong_address = $3; @@ -353,7 +356,7 @@ sub read_mailmap { $mailmap->{names}->{$wrong_address} = $real_name; $mailmap->{addresses}->{$wrong_address} = $real_address; - } elsif (/^(.+)<([^\s]+)>\s*([^\s].*)<([^\s]+)>$/) { + } elsif (/^(.+)<([^>]+)>\s*(.+)\s*<([^>]+)>$/) { my $real_name = $1; my $real_address = $2; my $wrong_name = $3; @@ -472,7 +475,6 @@ my @subsystem = (); my @status = (); my %deduplicate_name_hash = (); my %deduplicate_address_hash = (); -my $signature_pattern; my @maintainers = get_maintainers(); @@ -920,7 +922,7 @@ sub get_maintainer_role { my $start = find_starting_index($index); my $end = find_ending_index($index); - my $role; + my $role = "unknown"; my $subsystem = $typevalue[$start]; if (length($subsystem) > 20) { $subsystem = substr($subsystem, 0, 17); @@ -1016,8 +1018,13 @@ sub add_categories { if ($email_list) { if (!$hash_list_to{lc($list_address)}) { $hash_list_to{lc($list_address)} = 1; - push(@list_to, [$list_address, - "open list${list_role}"]); + if ($list_additional =~ m/moderated/) { + push(@list_to, [$list_address, + "moderated list${list_role}"]); + } else { + push(@list_to, [$list_address, + "open list${list_role}"]); + } } } } From 29002d9e104913998265cfff95bb49f4b4a966e2 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 12 Dec 2012 13:07:29 +0200 Subject: [PATCH 125/300] pci: prepare makefiles for pci code reorganization To make it easier to move code around without breaking build at intermedite steps, tweak makefiles to look in pci/ and hw/ for include files, automatically. This will be reverted at the end of the reorganization. Signed-off-by: Michael S. Tsirkin --- Makefile | 1 + Makefile.target | 1 + Makefile.user | 1 + hw/pci/hw | 1 + 4 files changed, 4 insertions(+) create mode 120000 hw/pci/hw diff --git a/Makefile b/Makefile index 9ecbcbb0a7..b9a81d18a2 100644 --- a/Makefile +++ b/Makefile @@ -146,6 +146,7 @@ audio/audio.o audio/fmodaudio.o: QEMU_CFLAGS += $(FMOD_CFLAGS) QEMU_CFLAGS+=$(CURL_CFLAGS) QEMU_CFLAGS += -I$(SRC_PATH)/include +QEMU_CFLAGS+=-I$(SRC_PATH)/hw/pci -I$(SRC_PATH)/hw ui/cocoa.o: ui/cocoa.m diff --git a/Makefile.target b/Makefile.target index 927347bac2..fe2cc0d8b0 100644 --- a/Makefile.target +++ b/Makefile.target @@ -12,6 +12,7 @@ endif QEMU_CFLAGS += -I.. -I$(SRC_PATH)/target-$(TARGET_BASE_ARCH) -DNEED_CPU_H QEMU_CFLAGS+=-I$(SRC_PATH)/include +QEMU_CFLAGS+=-I$(SRC_PATH)/hw/pci -I$(SRC_PATH)/hw ifdef CONFIG_USER_ONLY # user emulator name diff --git a/Makefile.user b/Makefile.user index 9302d33245..045ecd3bea 100644 --- a/Makefile.user +++ b/Makefile.user @@ -11,6 +11,7 @@ $(call set-vpath, $(SRC_PATH)) QEMU_CFLAGS+=-I.. QEMU_CFLAGS += -I$(SRC_PATH)/include QEMU_CFLAGS += -DCONFIG_USER_ONLY +QEMU_CFLAGS+=-I$(SRC_PATH)/hw/pci -I$(SRC_PATH)/hw include $(SRC_PATH)/Makefile.objs diff --git a/hw/pci/hw b/hw/pci/hw new file mode 120000 index 0000000000..945c9b46d6 --- /dev/null +++ b/hw/pci/hw @@ -0,0 +1 @@ +. \ No newline at end of file From ca818cfbfd77e02ffac338866568ac07f6f5fd7d Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 12 Dec 2012 15:11:55 +0200 Subject: [PATCH 126/300] MAINTAINERS: add hw/pci/ to list of PCI files Signed-off-by: Michael S. Tsirkin --- MAINTAINERS | 1 + 1 file changed, 1 insertion(+) diff --git a/MAINTAINERS b/MAINTAINERS index 2ede20d60b..c1b16c5fe4 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -490,6 +490,7 @@ F: hw/omap* PCI M: Michael S. Tsirkin S: Supported +F: hw/pci/* F: hw/pci* F: hw/piix* From a7f3d65b65b8c86a5ff0c0abcfefb45e2ec6fe4c Mon Sep 17 00:00:00 2001 From: Pavel Hrdina Date: Tue, 11 Dec 2012 08:55:48 +0100 Subject: [PATCH 127/300] atapi: reset cdrom tray statuses on ide_reset Tray statuses should be also reseted. Some guests may lock the tray and after reset before any kernel is loaded the tray should be unlocked. Also if you reset the real computer the tray is closed. We should do the same in qemu. Signed-off-by: Pavel Hrdina Signed-off-by: Kevin Wolf --- hw/ide/core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hw/ide/core.c b/hw/ide/core.c index c4f93d0e47..1235612d95 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -1869,6 +1869,8 @@ static void ide_reset(IDEState *s) s->io_buffer_index = 0; s->cd_sector_size = 0; s->atapi_dma = 0; + s->tray_locked = 0; + s->tray_open = 0; /* ATA DMA state */ s->io_buffer_size = 0; s->req_nb_sectors = 0; From c3587ca1a25862628e06cc019f91e7b2dcef40bf Mon Sep 17 00:00:00 2001 From: Amit Shah Date: Thu, 29 Nov 2012 15:44:44 +0530 Subject: [PATCH 128/300] virtio-serial: use uint32_t to count ports Signed-off-by: Amit Shah --- hw/virtio-serial-bus.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c index 155da58dcd..30f450cd61 100644 --- a/hw/virtio-serial-bus.c +++ b/hw/virtio-serial-bus.c @@ -56,7 +56,7 @@ struct VirtIOSerial { struct { QEMUTimer *timer; - int nr_active_ports; + uint32_t nr_active_ports; struct { VirtIOSerialPort *port; uint8_t host_connected; @@ -637,7 +637,7 @@ static void virtio_serial_save(QEMUFile *f, void *opaque) static void virtio_serial_post_load_timer_cb(void *opaque) { - int i; + uint32_t i; VirtIOSerial *s = opaque; VirtIOSerialPort *port; uint8_t host_connected; From 2e575a86abc36764ef34030f423ef118914a01cc Mon Sep 17 00:00:00 2001 From: Amit Shah Date: Thu, 29 Nov 2012 17:02:14 +0530 Subject: [PATCH 129/300] virtio-serial: move active ports loading to separate function The virtio_serial_load() function became too big, split the code that gets the port info from the source into a separate function. Signed-off-by: Amit Shah --- hw/virtio-serial-bus.c | 96 ++++++++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 41 deletions(-) diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c index 30f450cd61..2e0fe3d66f 100644 --- a/hw/virtio-serial-bus.c +++ b/hw/virtio-serial-bus.c @@ -658,10 +658,60 @@ static void virtio_serial_post_load_timer_cb(void *opaque) s->post_load.connected = NULL; } +static int fetch_active_ports_list(QEMUFile *f, int version_id, + VirtIOSerial *s, uint32_t nr_active_ports) +{ + uint32_t i; + + s->post_load.nr_active_ports = nr_active_ports; + s->post_load.connected = + g_malloc0(sizeof(*s->post_load.connected) * nr_active_ports); + + /* Items in struct VirtIOSerialPort */ + for (i = 0; i < nr_active_ports; i++) { + VirtIOSerialPort *port; + uint32_t id; + + id = qemu_get_be32(f); + port = find_port_by_id(s, id); + if (!port) { + return -EINVAL; + } + + port->guest_connected = qemu_get_byte(f); + s->post_load.connected[i].port = port; + s->post_load.connected[i].host_connected = qemu_get_byte(f); + + if (version_id > 2) { + uint32_t elem_popped; + + qemu_get_be32s(f, &elem_popped); + if (elem_popped) { + qemu_get_be32s(f, &port->iov_idx); + qemu_get_be64s(f, &port->iov_offset); + + qemu_get_buffer(f, (unsigned char *)&port->elem, + sizeof(port->elem)); + virtqueue_map_sg(port->elem.in_sg, port->elem.in_addr, + port->elem.in_num, 1); + virtqueue_map_sg(port->elem.out_sg, port->elem.out_addr, + port->elem.out_num, 1); + + /* + * Port was throttled on source machine. Let's + * unthrottle it here so data starts flowing again. + */ + virtio_serial_throttle_port(port, false); + } + } + } + qemu_mod_timer(s->post_load.timer, 1); + return 0; +} + static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id) { VirtIOSerial *s = opaque; - VirtIOSerialPort *port; uint32_t max_nr_ports, nr_active_ports, ports_map; unsigned int i; int ret; @@ -705,48 +755,12 @@ static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id) qemu_get_be32s(f, &nr_active_ports); - s->post_load.nr_active_ports = nr_active_ports; - s->post_load.connected = - g_malloc0(sizeof(*s->post_load.connected) * nr_active_ports); - - /* Items in struct VirtIOSerialPort */ - for (i = 0; i < nr_active_ports; i++) { - uint32_t id; - - id = qemu_get_be32(f); - port = find_port_by_id(s, id); - if (!port) { - return -EINVAL; - } - - port->guest_connected = qemu_get_byte(f); - s->post_load.connected[i].port = port; - s->post_load.connected[i].host_connected = qemu_get_byte(f); - - if (version_id > 2) { - uint32_t elem_popped; - - qemu_get_be32s(f, &elem_popped); - if (elem_popped) { - qemu_get_be32s(f, &port->iov_idx); - qemu_get_be64s(f, &port->iov_offset); - - qemu_get_buffer(f, (unsigned char *)&port->elem, - sizeof(port->elem)); - virtqueue_map_sg(port->elem.in_sg, port->elem.in_addr, - port->elem.in_num, 1); - virtqueue_map_sg(port->elem.out_sg, port->elem.out_addr, - port->elem.out_num, 1); - - /* - * Port was throttled on source machine. Let's - * unthrottle it here so data starts flowing again. - */ - virtio_serial_throttle_port(port, false); - } + if (nr_active_ports) { + ret = fetch_active_ports_list(f, version_id, s, nr_active_ports); + if (ret) { + return ret; } } - qemu_mod_timer(s->post_load.timer, 1); return 0; } From bdb917bf8ab187b662c612ee6fb87479c0b82490 Mon Sep 17 00:00:00 2001 From: Amit Shah Date: Fri, 30 Nov 2012 00:54:44 +0530 Subject: [PATCH 130/300] virtio-serial: allocate post_load only at load-time This saves us a few bytes in the VirtIOSerial struct. Not a big savings, but since the entire structure is used only during a short while after migration, it's helpful to keep the struct cleaner and smaller. Signed-off-by: Amit Shah --- hw/virtio-serial-bus.c | 63 +++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c index 2e0fe3d66f..09d46593e2 100644 --- a/hw/virtio-serial-bus.c +++ b/hw/virtio-serial-bus.c @@ -36,6 +36,15 @@ struct VirtIOSerialBus { uint32_t max_nr_ports; }; +typedef struct VirtIOSerialPostLoad { + QEMUTimer *timer; + uint32_t nr_active_ports; + struct { + VirtIOSerialPort *port; + uint8_t host_connected; + } *connected; +} VirtIOSerialPostLoad; + struct VirtIOSerial { VirtIODevice vdev; @@ -54,14 +63,7 @@ struct VirtIOSerial { struct virtio_console_config config; - struct { - QEMUTimer *timer; - uint32_t nr_active_ports; - struct { - VirtIOSerialPort *port; - uint8_t host_connected; - } *connected; - } post_load; + struct VirtIOSerialPostLoad *post_load; }; static VirtIOSerialPort *find_port_by_id(VirtIOSerial *vser, uint32_t id) @@ -642,9 +644,12 @@ static void virtio_serial_post_load_timer_cb(void *opaque) VirtIOSerialPort *port; uint8_t host_connected; - for (i = 0 ; i < s->post_load.nr_active_ports; ++i) { - port = s->post_load.connected[i].port; - host_connected = s->post_load.connected[i].host_connected; + if (!s->post_load) { + return; + } + for (i = 0 ; i < s->post_load->nr_active_ports; ++i) { + port = s->post_load->connected[i].port; + host_connected = s->post_load->connected[i].host_connected; if (host_connected != port->host_connected) { /* * We have to let the guest know of the host connection @@ -654,8 +659,10 @@ static void virtio_serial_post_load_timer_cb(void *opaque) port->host_connected); } } - g_free(s->post_load.connected); - s->post_load.connected = NULL; + g_free(s->post_load->connected); + qemu_free_timer(s->post_load->timer); + g_free(s->post_load); + s->post_load = NULL; } static int fetch_active_ports_list(QEMUFile *f, int version_id, @@ -663,9 +670,14 @@ static int fetch_active_ports_list(QEMUFile *f, int version_id, { uint32_t i; - s->post_load.nr_active_ports = nr_active_ports; - s->post_load.connected = - g_malloc0(sizeof(*s->post_load.connected) * nr_active_ports); + s->post_load = g_malloc0(sizeof(*s->post_load)); + s->post_load->nr_active_ports = nr_active_ports; + s->post_load->connected = + g_malloc0(sizeof(*s->post_load->connected) * nr_active_ports); + + s->post_load->timer = qemu_new_timer_ns(vm_clock, + virtio_serial_post_load_timer_cb, + s); /* Items in struct VirtIOSerialPort */ for (i = 0; i < nr_active_ports; i++) { @@ -679,8 +691,8 @@ static int fetch_active_ports_list(QEMUFile *f, int version_id, } port->guest_connected = qemu_get_byte(f); - s->post_load.connected[i].port = port; - s->post_load.connected[i].host_connected = qemu_get_byte(f); + s->post_load->connected[i].port = port; + s->post_load->connected[i].host_connected = qemu_get_byte(f); if (version_id > 2) { uint32_t elem_popped; @@ -705,7 +717,7 @@ static int fetch_active_ports_list(QEMUFile *f, int version_id, } } } - qemu_mod_timer(s->post_load.timer, 1); + qemu_mod_timer(s->post_load->timer, 1); return 0; } @@ -1003,6 +1015,8 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *conf) vser->qdev = dev; + vser->post_load = NULL; + /* * Register for the savevm section with the virtio-console name * to preserve backward compat @@ -1010,9 +1024,6 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *conf) register_savevm(dev, "virtio-console", -1, 3, virtio_serial_save, virtio_serial_load, vser); - vser->post_load.timer = qemu_new_timer_ns(vm_clock, - virtio_serial_post_load_timer_cb, vser); - return vdev; } @@ -1025,9 +1036,11 @@ void virtio_serial_exit(VirtIODevice *vdev) g_free(vser->ivqs); g_free(vser->ovqs); g_free(vser->ports_map); - g_free(vser->post_load.connected); - qemu_free_timer(vser->post_load.timer); - + if (vser->post_load) { + g_free(vser->post_load->connected); + qemu_free_timer(vser->post_load->timer); + g_free(vser->post_load); + } virtio_cleanup(vdev); } From a75bf146503a94fb900e0dfa0529bd5d1be9fec5 Mon Sep 17 00:00:00 2001 From: Amit Shah Date: Thu, 13 Dec 2012 15:54:43 +0530 Subject: [PATCH 131/300] virtio-serial: delete timer if active during exit The post_load timer was being freed, but not deleted. This could cause problems when the timer is armed, but the device is hot-unplugged before the callback is executed. Signed-off-by: Amit Shah --- hw/virtio-serial-bus.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c index 09d46593e2..fc0166ca7f 100644 --- a/hw/virtio-serial-bus.c +++ b/hw/virtio-serial-bus.c @@ -1038,6 +1038,7 @@ void virtio_serial_exit(VirtIODevice *vdev) g_free(vser->ports_map); if (vser->post_load) { g_free(vser->post_load->connected); + qemu_del_timer(vser->post_load->timer); qemu_free_timer(vser->post_load->timer); g_free(vser->post_load); } From 580f5c000809108f51a77ae74709100d32be6ea5 Mon Sep 17 00:00:00 2001 From: Antoine Mathys Date: Thu, 13 Dec 2012 14:05:27 +0000 Subject: [PATCH 132/300] hw/ds1338.c: Correct bug in conversion to BCD. Signed-off-by: Antoine Mathys Signed-off-by: Peter Maydell --- hw/ds1338.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/ds1338.c b/hw/ds1338.c index b576d56438..faaa4a0a93 100644 --- a/hw/ds1338.c +++ b/hw/ds1338.c @@ -57,9 +57,9 @@ static void capture_current_time(DS1338State *s) } else { s->nvram[2] = to_bcd(now.tm_hour); } - s->nvram[3] = to_bcd(now.tm_wday) + 1; + s->nvram[3] = to_bcd(now.tm_wday + 1); s->nvram[4] = to_bcd(now.tm_mday); - s->nvram[5] = to_bcd(now.tm_mon) + 1; + s->nvram[5] = to_bcd(now.tm_mon + 1); s->nvram[6] = to_bcd(now.tm_year - 100); } From 95c9361598e66de42facdac64e614e3de85186f5 Mon Sep 17 00:00:00 2001 From: Antoine Mathys Date: Thu, 13 Dec 2012 14:05:27 +0000 Subject: [PATCH 133/300] hw/ds1338.c: Add definitions for various flags in the RTC registers. Signed-off-by: Antoine Mathys Signed-off-by: Peter Maydell --- hw/ds1338.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/ds1338.c b/hw/ds1338.c index faaa4a0a93..69018bc966 100644 --- a/hw/ds1338.c +++ b/hw/ds1338.c @@ -17,6 +17,12 @@ */ #define NVRAM_SIZE 64 +/* Flags definitions */ +#define SECONDS_CH 0x80 +#define HOURS_12 0x40 +#define HOURS_PM 0x20 +#define CTRL_OSF 0x20 + typedef struct { I2CSlave i2c; int64_t offset; From 59dda8e05b015471d456177141a7c2eeda3dab14 Mon Sep 17 00:00:00 2001 From: Antoine Mathys Date: Thu, 13 Dec 2012 14:05:27 +0000 Subject: [PATCH 134/300] hw/ds1338.c: Fix handling of HOURS register. Per the datasheet, the mapping between 12 and 24 hours modes is: 0 <-> 12 PM 1-12 <-> 1-12 AM 13-23 <-> 1-11 PM Signed-off-by: Antoine Mathys Signed-off-by: Peter Maydell --- hw/ds1338.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/hw/ds1338.c b/hw/ds1338.c index 69018bc966..0f887200f3 100644 --- a/hw/ds1338.c +++ b/hw/ds1338.c @@ -55,10 +55,15 @@ static void capture_current_time(DS1338State *s) qemu_get_timedate(&now, s->offset); s->nvram[0] = to_bcd(now.tm_sec); s->nvram[1] = to_bcd(now.tm_min); - if (s->nvram[2] & 0x40) { - s->nvram[2] = (to_bcd((now.tm_hour % 12)) + 1) | 0x40; - if (now.tm_hour >= 12) { - s->nvram[2] |= 0x20; + if (s->nvram[2] & HOURS_12) { + int tmp = now.tm_hour; + if (tmp == 0) { + tmp = 24; + } + if (tmp <= 12) { + s->nvram[2] = HOURS_12 | to_bcd(tmp); + } else { + s->nvram[2] = HOURS_12 | HOURS_PM | to_bcd(tmp - 12); } } else { s->nvram[2] = to_bcd(now.tm_hour); @@ -132,16 +137,18 @@ static int ds1338_send(I2CSlave *i2c, uint8_t data) now.tm_min = from_bcd(data & 0x7f); break; case 2: - if (data & 0x40) { - if (data & 0x20) { - data = from_bcd(data & 0x4f) + 11; - } else { - data = from_bcd(data & 0x1f) - 1; + if (data & HOURS_12) { + int tmp = from_bcd(data & (HOURS_PM - 1)); + if (data & HOURS_PM) { + tmp += 12; } + if (tmp == 24) { + tmp = 0; + } + now.tm_hour = tmp; } else { - data = from_bcd(data); + now.tm_hour = from_bcd(data & (HOURS_12 - 1)); } - now.tm_hour = data; break; case 3: now.tm_wday = from_bcd(data & 7) - 1; From ed3d37d287300b7bcdb4605b921e5ec593afd214 Mon Sep 17 00:00:00 2001 From: Antoine Mathys Date: Thu, 13 Dec 2012 14:05:28 +0000 Subject: [PATCH 135/300] hw/ds1338.c: Ensure state is properly initialized. Signed-off-by: Antoine Mathys Signed-off-by: Peter Maydell --- hw/ds1338.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/hw/ds1338.c b/hw/ds1338.c index 0f887200f3..d2f52fcbed 100644 --- a/hw/ds1338.c +++ b/hw/ds1338.c @@ -179,6 +179,17 @@ static int ds1338_init(I2CSlave *i2c) return 0; } +static void ds1338_reset(DeviceState *dev) +{ + DS1338State *s = FROM_I2C_SLAVE(DS1338State, I2C_SLAVE_FROM_QDEV(dev)); + + /* The clock is running and synchronized with the host */ + s->offset = 0; + memset(s->nvram, 0, NVRAM_SIZE); + s->ptr = 0; + s->addr_byte = false; +} + static void ds1338_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -188,6 +199,7 @@ static void ds1338_class_init(ObjectClass *klass, void *data) k->event = ds1338_event; k->recv = ds1338_recv; k->send = ds1338_send; + dc->reset = ds1338_reset; dc->vmsd = &vmstate_ds1338; } From 996e91f04b9cc55cf246052856abe9189a5a0f28 Mon Sep 17 00:00:00 2001 From: Antoine Mathys Date: Thu, 13 Dec 2012 14:05:28 +0000 Subject: [PATCH 136/300] hw/ds1338.c: Implement support for the control register. Signed-off-by: Antoine Mathys Signed-off-by: Peter Maydell --- hw/ds1338.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/hw/ds1338.c b/hw/ds1338.c index d2f52fcbed..94a2f549e4 100644 --- a/hw/ds1338.c +++ b/hw/ds1338.c @@ -125,7 +125,8 @@ static int ds1338_send(I2CSlave *i2c, uint8_t data) s->addr_byte = false; return 0; } - if (s->ptr < 8) { + if (s->ptr < 7) { + /* Time register. */ struct tm now; qemu_get_timedate(&now, s->offset); switch(s->ptr) { @@ -162,11 +163,19 @@ static int ds1338_send(I2CSlave *i2c, uint8_t data) case 6: now.tm_year = from_bcd(data) + 100; break; - case 7: - /* Control register. Currently ignored. */ - break; } s->offset = qemu_timedate_diff(&now); + } else if (s->ptr == 7) { + /* Control register. */ + + /* Ensure bits 2, 3 and 6 will read back as zero. */ + data &= 0xB3; + + /* Attempting to write the OSF flag to logic 1 leaves the + value unchanged. */ + data = (data & ~CTRL_OSF) | (data & s->nvram[s->ptr] & CTRL_OSF); + + s->nvram[s->ptr] = data; } else { s->nvram[s->ptr] = data; } From 871edc5fdba884929102b89d28ff363c94f0822d Mon Sep 17 00:00:00 2001 From: Antoine Mathys Date: Thu, 13 Dec 2012 14:05:28 +0000 Subject: [PATCH 137/300] hw/ds1338.c: Fix handling of DAY (wday) register. Per the datasheet, the DAY (wday) register is user defined. Implement this. Signed-off-by: Antoine Mathys Signed-off-by: Peter Maydell --- hw/ds1338.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/hw/ds1338.c b/hw/ds1338.c index 94a2f549e4..1aefa3ba04 100644 --- a/hw/ds1338.c +++ b/hw/ds1338.c @@ -26,6 +26,7 @@ typedef struct { I2CSlave i2c; int64_t offset; + uint8_t wday_offset; uint8_t nvram[NVRAM_SIZE]; int32_t ptr; bool addr_byte; @@ -33,12 +34,13 @@ typedef struct { static const VMStateDescription vmstate_ds1338 = { .name = "ds1338", - .version_id = 1, + .version_id = 2, .minimum_version_id = 1, .minimum_version_id_old = 1, .fields = (VMStateField[]) { VMSTATE_I2C_SLAVE(i2c, DS1338State), VMSTATE_INT64(offset, DS1338State), + VMSTATE_UINT8_V(wday_offset, DS1338State, 2), VMSTATE_UINT8_ARRAY(nvram, DS1338State, NVRAM_SIZE), VMSTATE_INT32(ptr, DS1338State), VMSTATE_BOOL(addr_byte, DS1338State), @@ -68,7 +70,7 @@ static void capture_current_time(DS1338State *s) } else { s->nvram[2] = to_bcd(now.tm_hour); } - s->nvram[3] = to_bcd(now.tm_wday + 1); + s->nvram[3] = (now.tm_wday + s->wday_offset) % 7 + 1; s->nvram[4] = to_bcd(now.tm_mday); s->nvram[5] = to_bcd(now.tm_mon + 1); s->nvram[6] = to_bcd(now.tm_year - 100); @@ -152,7 +154,13 @@ static int ds1338_send(I2CSlave *i2c, uint8_t data) } break; case 3: - now.tm_wday = from_bcd(data & 7) - 1; + { + /* The day field is supposed to contain a value in + the range 1-7. Otherwise behavior is undefined. + */ + int user_wday = (data & 7) - 1; + s->wday_offset = (user_wday - now.tm_wday + 7) % 7; + } break; case 4: now.tm_mday = from_bcd(data & 0x3f); @@ -194,6 +202,7 @@ static void ds1338_reset(DeviceState *dev) /* The clock is running and synchronized with the host */ s->offset = 0; + s->wday_offset = 0; memset(s->nvram, 0, NVRAM_SIZE); s->ptr = 0; s->addr_byte = false; From 1d3afd649bc77aa14bc2741e2da6475822d41c5f Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Fri, 7 Dec 2012 18:08:42 +0100 Subject: [PATCH 138/300] qcow2: Round QCowL2Meta.offset down to cluster boundary The offset within the cluster is already present as n_start and this is what the code uses. QCowL2Meta.offset is only needed at a cluster granularity. Signed-off-by: Kevin Wolf --- block/qcow2-cluster.c | 4 ++-- block/qcow2.h | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index e179211c57..d17a37c2fa 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -631,7 +631,7 @@ int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m) old_cluster = g_malloc(m->nb_clusters * sizeof(uint64_t)); /* copy content of unmodified sectors */ - start_sect = (m->offset & ~(s->cluster_size - 1)) >> 9; + start_sect = m->offset >> 9; if (m->n_start) { cow = true; qemu_co_mutex_unlock(&s->lock); @@ -966,7 +966,7 @@ again: .cluster_offset = keep_clusters == 0 ? alloc_cluster_offset : cluster_offset, .alloc_offset = alloc_cluster_offset, - .offset = alloc_offset, + .offset = alloc_offset & ~(s->cluster_size - 1), .n_start = keep_clusters == 0 ? n_start : 0, .nb_clusters = nb_clusters, .nb_available = MIN(requested_sectors, avail_sectors), diff --git a/block/qcow2.h b/block/qcow2.h index b4eb65470e..2a406a7e83 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -199,12 +199,34 @@ struct QCowAIOCB; /* XXX This could be private for qcow2-cluster.c */ typedef struct QCowL2Meta { + /** Guest offset of the first newly allocated cluster */ uint64_t offset; + + /** Host offset of the first cluster of the request */ uint64_t cluster_offset; + + /** Host offset of the first newly allocated cluster */ uint64_t alloc_offset; + + /** + * Number of sectors between the start of the first allocated cluster and + * the area that the guest actually writes to. + */ int n_start; + + /** + * Number of sectors from the start of the first allocated cluster to + * the end of the (possibly shortened) request + */ int nb_available; + + /** Number of newly allocated clusters */ int nb_clusters; + + /** + * Requests that overlap with this allocation and wait to be restarted + * when the allocating request has completed. + */ CoQueue dependent_requests; QLIST_ENTRY(QCowL2Meta) next_in_flight; From 593fb83cacf3818a5623f31a6c04c24d87519ad0 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Fri, 7 Dec 2012 18:08:43 +0100 Subject: [PATCH 139/300] qcow2: Introduce Qcow2COWRegion This makes it easier to address the areas for which a COW must be performed. As a nice side effect, the COW code in qcow2_alloc_cluster_link_l2 becomes really trivial. Signed-off-by: Kevin Wolf --- block/qcow2-cluster.c | 83 +++++++++++++++++++++++++++---------------- block/qcow2.h | 29 +++++++++++---- 2 files changed, 76 insertions(+), 36 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index d17a37c2fa..94b7f136fa 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -615,13 +615,41 @@ uint64_t qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs, return cluster_offset; } +static int perform_cow(BlockDriverState *bs, QCowL2Meta *m, Qcow2COWRegion *r) +{ + BDRVQcowState *s = bs->opaque; + int ret; + + if (r->nb_sectors == 0) { + return 0; + } + + qemu_co_mutex_unlock(&s->lock); + ret = copy_sectors(bs, m->offset / BDRV_SECTOR_SIZE, m->alloc_offset, + r->offset / BDRV_SECTOR_SIZE, + r->offset / BDRV_SECTOR_SIZE + r->nb_sectors); + qemu_co_mutex_lock(&s->lock); + + if (ret < 0) { + return ret; + } + + /* + * Before we update the L2 table to actually point to the new cluster, we + * need to be sure that the refcounts have been increased and COW was + * handled. + */ + qcow2_cache_depends_on_flush(s->l2_table_cache); + + return 0; +} + int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m) { BDRVQcowState *s = bs->opaque; int i, j = 0, l2_index, ret; - uint64_t *old_cluster, start_sect, *l2_table; + uint64_t *old_cluster, *l2_table; uint64_t cluster_offset = m->alloc_offset; - bool cow = false; trace_qcow2_cluster_link_l2(qemu_coroutine_self(), m->nb_clusters); @@ -631,36 +659,17 @@ int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m) old_cluster = g_malloc(m->nb_clusters * sizeof(uint64_t)); /* copy content of unmodified sectors */ - start_sect = m->offset >> 9; - if (m->n_start) { - cow = true; - qemu_co_mutex_unlock(&s->lock); - ret = copy_sectors(bs, start_sect, cluster_offset, 0, m->n_start); - qemu_co_mutex_lock(&s->lock); - if (ret < 0) - goto err; + ret = perform_cow(bs, m, &m->cow_start); + if (ret < 0) { + goto err; } - if (m->nb_available & (s->cluster_sectors - 1)) { - cow = true; - qemu_co_mutex_unlock(&s->lock); - ret = copy_sectors(bs, start_sect, cluster_offset, m->nb_available, - align_offset(m->nb_available, s->cluster_sectors)); - qemu_co_mutex_lock(&s->lock); - if (ret < 0) - goto err; + ret = perform_cow(bs, m, &m->cow_end); + if (ret < 0) { + goto err; } - /* - * Update L2 table. - * - * Before we update the L2 table to actually point to the new cluster, we - * need to be sure that the refcounts have been increased and COW was - * handled. - */ - if (cow) { - qcow2_cache_depends_on_flush(s->l2_table_cache); - } + /* Update L2 table. */ if (qcow2_need_accurate_refcounts(s)) { qcow2_cache_set_dependency(bs, s->l2_table_cache, @@ -957,19 +966,33 @@ again: * * avail_sectors: Number of sectors from the start of the first * newly allocated to the end of the last newly allocated cluster. + * + * nb_sectors: The number of sectors from the start of the first + * newly allocated cluster to the end of the aread that the write + * request actually writes to (excluding COW at the end) */ int requested_sectors = n_end - keep_clusters * s->cluster_sectors; int avail_sectors = nb_clusters << (s->cluster_bits - BDRV_SECTOR_BITS); + int alloc_n_start = keep_clusters == 0 ? n_start : 0; + int nb_sectors = MIN(requested_sectors, avail_sectors); *m = (QCowL2Meta) { .cluster_offset = keep_clusters == 0 ? alloc_cluster_offset : cluster_offset, .alloc_offset = alloc_cluster_offset, .offset = alloc_offset & ~(s->cluster_size - 1), - .n_start = keep_clusters == 0 ? n_start : 0, .nb_clusters = nb_clusters, - .nb_available = MIN(requested_sectors, avail_sectors), + .nb_available = nb_sectors, + + .cow_start = { + .offset = 0, + .nb_sectors = alloc_n_start, + }, + .cow_end = { + .offset = nb_sectors * BDRV_SECTOR_SIZE, + .nb_sectors = avail_sectors - nb_sectors, + }, }; qemu_co_queue_init(&m->dependent_requests); QLIST_INSERT_HEAD(&s->cluster_allocs, m, next_in_flight); diff --git a/block/qcow2.h b/block/qcow2.h index 2a406a7e83..1106b33206 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -196,6 +196,17 @@ typedef struct QCowCreateState { struct QCowAIOCB; +typedef struct Qcow2COWRegion { + /** + * Offset of the COW region in bytes from the start of the first cluster + * touched by the request. + */ + uint64_t offset; + + /** Number of sectors to copy */ + int nb_sectors; +} Qcow2COWRegion; + /* XXX This could be private for qcow2-cluster.c */ typedef struct QCowL2Meta { @@ -208,12 +219,6 @@ typedef struct QCowL2Meta /** Host offset of the first newly allocated cluster */ uint64_t alloc_offset; - /** - * Number of sectors between the start of the first allocated cluster and - * the area that the guest actually writes to. - */ - int n_start; - /** * Number of sectors from the start of the first allocated cluster to * the end of the (possibly shortened) request @@ -229,6 +234,18 @@ typedef struct QCowL2Meta */ CoQueue dependent_requests; + /** + * The COW Region between the start of the first allocated cluster and the + * area the guest actually writes to. + */ + Qcow2COWRegion cow_start; + + /** + * The COW Region between the area the guest actually writes to and the + * end of the last allocated cluster. + */ + Qcow2COWRegion cow_end; + QLIST_ENTRY(QCowL2Meta) next_in_flight; } QCowL2Meta; From cf5c1a231ee99ac21fe8258faf50bb1f65884343 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Fri, 7 Dec 2012 18:08:44 +0100 Subject: [PATCH 140/300] qcow2: Allocate l2meta dynamically As soon as delayed COW is introduced, the l2meta struct is needed even after completion of the request, so it can't live on the stack. Signed-off-by: Kevin Wolf --- block/qcow2.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index 0a08ec74c7..71f870d829 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -774,15 +774,11 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, QEMUIOVector hd_qiov; uint64_t bytes_done = 0; uint8_t *cluster_data = NULL; - QCowL2Meta l2meta = { - .nb_clusters = 0, - }; + QCowL2Meta *l2meta; trace_qcow2_writev_start_req(qemu_coroutine_self(), sector_num, remaining_sectors); - qemu_co_queue_init(&l2meta.dependent_requests); - qemu_iovec_init(&hd_qiov, qiov->niov); s->cluster_cache_offset = -1; /* disable compressed cache */ @@ -791,6 +787,9 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, while (remaining_sectors != 0) { + l2meta = g_malloc0(sizeof(*l2meta)); + qemu_co_queue_init(&l2meta->dependent_requests); + trace_qcow2_writev_start_part(qemu_coroutine_self()); index_in_cluster = sector_num & (s->cluster_sectors - 1); n_end = index_in_cluster + remaining_sectors; @@ -800,17 +799,17 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, } ret = qcow2_alloc_cluster_offset(bs, sector_num << 9, - index_in_cluster, n_end, &cur_nr_sectors, &l2meta); + index_in_cluster, n_end, &cur_nr_sectors, l2meta); if (ret < 0) { goto fail; } - if (l2meta.nb_clusters > 0 && + if (l2meta->nb_clusters > 0 && (s->compatible_features & QCOW2_COMPAT_LAZY_REFCOUNTS)) { qcow2_mark_dirty(bs); } - cluster_offset = l2meta.cluster_offset; + cluster_offset = l2meta->cluster_offset; assert((cluster_offset & 511) == 0); qemu_iovec_reset(&hd_qiov); @@ -847,12 +846,14 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, goto fail; } - ret = qcow2_alloc_cluster_link_l2(bs, &l2meta); + ret = qcow2_alloc_cluster_link_l2(bs, l2meta); if (ret < 0) { goto fail; } - run_dependent_requests(s, &l2meta); + run_dependent_requests(s, l2meta); + g_free(l2meta); + l2meta = NULL; remaining_sectors -= cur_nr_sectors; sector_num += cur_nr_sectors; @@ -862,7 +863,10 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, ret = 0; fail: - run_dependent_requests(s, &l2meta); + if (l2meta != NULL) { + run_dependent_requests(s, l2meta); + g_free(l2meta); + } qemu_co_mutex_unlock(&s->lock); From 060bee8943c27d4d53f65570fafaa2559fcd87c3 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Fri, 7 Dec 2012 18:08:45 +0100 Subject: [PATCH 141/300] qcow2: Drop l2meta.cluster_offset There's no real reason to have an l2meta for normal requests that don't allocate anything. Before we can get rid of it, we must return the host cluster offset in a different way. Signed-off-by: Kevin Wolf --- block/qcow2-cluster.c | 10 ++++++---- block/qcow2.c | 14 +++++++------- block/qcow2.h | 5 +---- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index 94b7f136fa..c4752ee812 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -856,7 +856,7 @@ static int do_alloc_cluster_offset(BlockDriverState *bs, uint64_t guest_offset, * Return 0 on success and -errno in error cases */ int qcow2_alloc_cluster_offset(BlockDriverState *bs, uint64_t offset, - int n_start, int n_end, int *num, QCowL2Meta *m) + int n_start, int n_end, int *num, uint64_t *host_offset, QCowL2Meta *m) { BDRVQcowState *s = bs->opaque; int l2_index, ret, sectors; @@ -929,7 +929,6 @@ again: /* If there is something left to allocate, do that now */ *m = (QCowL2Meta) { - .cluster_offset = cluster_offset, .nb_clusters = 0, }; qemu_co_queue_init(&m->dependent_requests); @@ -977,9 +976,11 @@ again: int alloc_n_start = keep_clusters == 0 ? n_start : 0; int nb_sectors = MIN(requested_sectors, avail_sectors); + if (keep_clusters == 0) { + cluster_offset = alloc_cluster_offset; + } + *m = (QCowL2Meta) { - .cluster_offset = keep_clusters == 0 ? - alloc_cluster_offset : cluster_offset, .alloc_offset = alloc_cluster_offset, .offset = alloc_offset & ~(s->cluster_size - 1), .nb_clusters = nb_clusters, @@ -1007,6 +1008,7 @@ again: assert(sectors > n_start); *num = sectors - n_start; + *host_offset = cluster_offset; return 0; diff --git a/block/qcow2.c b/block/qcow2.c index 71f870d829..66ca12f94e 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -799,7 +799,7 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, } ret = qcow2_alloc_cluster_offset(bs, sector_num << 9, - index_in_cluster, n_end, &cur_nr_sectors, l2meta); + index_in_cluster, n_end, &cur_nr_sectors, &cluster_offset, l2meta); if (ret < 0) { goto fail; } @@ -809,7 +809,6 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, qcow2_mark_dirty(bs); } - cluster_offset = l2meta->cluster_offset; assert((cluster_offset & 511) == 0); qemu_iovec_reset(&hd_qiov); @@ -1132,6 +1131,7 @@ static int preallocate(BlockDriverState *bs) { uint64_t nb_sectors; uint64_t offset; + uint64_t host_offset = 0; int num; int ret; QCowL2Meta meta; @@ -1139,18 +1139,18 @@ static int preallocate(BlockDriverState *bs) nb_sectors = bdrv_getlength(bs) >> 9; offset = 0; qemu_co_queue_init(&meta.dependent_requests); - meta.cluster_offset = 0; while (nb_sectors) { num = MIN(nb_sectors, INT_MAX >> 9); - ret = qcow2_alloc_cluster_offset(bs, offset, 0, num, &num, &meta); + ret = qcow2_alloc_cluster_offset(bs, offset, 0, num, &num, + &host_offset, &meta); if (ret < 0) { return ret; } ret = qcow2_alloc_cluster_link_l2(bs, &meta); if (ret < 0) { - qcow2_free_any_clusters(bs, meta.cluster_offset, meta.nb_clusters); + qcow2_free_any_clusters(bs, meta.alloc_offset, meta.nb_clusters); return ret; } @@ -1169,10 +1169,10 @@ static int preallocate(BlockDriverState *bs) * all of the allocated clusters (otherwise we get failing reads after * EOF). Extend the image to the last allocated sector. */ - if (meta.cluster_offset != 0) { + if (host_offset != 0) { uint8_t buf[512]; memset(buf, 0, 512); - ret = bdrv_write(bs->file, (meta.cluster_offset >> 9) + num - 1, buf, 1); + ret = bdrv_write(bs->file, (host_offset >> 9) + num - 1, buf, 1); if (ret < 0) { return ret; } diff --git a/block/qcow2.h b/block/qcow2.h index 1106b33206..24f100125c 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -213,9 +213,6 @@ typedef struct QCowL2Meta /** Guest offset of the first newly allocated cluster */ uint64_t offset; - /** Host offset of the first cluster of the request */ - uint64_t cluster_offset; - /** Host offset of the first newly allocated cluster */ uint64_t alloc_offset; @@ -336,7 +333,7 @@ void qcow2_encrypt_sectors(BDRVQcowState *s, int64_t sector_num, int qcow2_get_cluster_offset(BlockDriverState *bs, uint64_t offset, int *num, uint64_t *cluster_offset); int qcow2_alloc_cluster_offset(BlockDriverState *bs, uint64_t offset, - int n_start, int n_end, int *num, QCowL2Meta *m); + int n_start, int n_end, int *num, uint64_t *host_offset, QCowL2Meta *m); uint64_t qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs, uint64_t offset, int compressed_size); From f50f88b9fea09fef12cc293126cf45dcf0ef600b Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Fri, 7 Dec 2012 18:08:46 +0100 Subject: [PATCH 142/300] qcow2: Allocate l2meta only for cluster allocations Even for writes to already allocated clusters, an l2meta is allocated, though it stays effectively unused. After this patch, only allocating requests still have one. Each l2meta now describes an in-flight request that writes to clusters that are not yet hooked up in the L2 table. Signed-off-by: Kevin Wolf --- block/qcow2-cluster.c | 23 +++++++++-------------- block/qcow2.c | 32 +++++++++++++++++--------------- block/qcow2.h | 7 +++++-- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index c4752ee812..c2b59e7d6a 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -652,9 +652,7 @@ int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m) uint64_t cluster_offset = m->alloc_offset; trace_qcow2_cluster_link_l2(qemu_coroutine_self(), m->nb_clusters); - - if (m->nb_clusters == 0) - return 0; + assert(m->nb_clusters > 0); old_cluster = g_malloc(m->nb_clusters * sizeof(uint64_t)); @@ -856,7 +854,7 @@ static int do_alloc_cluster_offset(BlockDriverState *bs, uint64_t guest_offset, * Return 0 on success and -errno in error cases */ int qcow2_alloc_cluster_offset(BlockDriverState *bs, uint64_t offset, - int n_start, int n_end, int *num, uint64_t *host_offset, QCowL2Meta *m) + int n_start, int n_end, int *num, uint64_t *host_offset, QCowL2Meta **m) { BDRVQcowState *s = bs->opaque; int l2_index, ret, sectors; @@ -928,11 +926,6 @@ again: } /* If there is something left to allocate, do that now */ - *m = (QCowL2Meta) { - .nb_clusters = 0, - }; - qemu_co_queue_init(&m->dependent_requests); - if (nb_clusters > 0) { uint64_t alloc_offset; uint64_t alloc_cluster_offset; @@ -980,7 +973,9 @@ again: cluster_offset = alloc_cluster_offset; } - *m = (QCowL2Meta) { + *m = g_malloc0(sizeof(**m)); + + **m = (QCowL2Meta) { .alloc_offset = alloc_cluster_offset, .offset = alloc_offset & ~(s->cluster_size - 1), .nb_clusters = nb_clusters, @@ -995,8 +990,8 @@ again: .nb_sectors = avail_sectors - nb_sectors, }, }; - qemu_co_queue_init(&m->dependent_requests); - QLIST_INSERT_HEAD(&s->cluster_allocs, m, next_in_flight); + qemu_co_queue_init(&(*m)->dependent_requests); + QLIST_INSERT_HEAD(&s->cluster_allocs, *m, next_in_flight); } } @@ -1013,8 +1008,8 @@ again: return 0; fail: - if (m->nb_clusters > 0) { - QLIST_REMOVE(m, next_in_flight); + if (*m && (*m)->nb_clusters > 0) { + QLIST_REMOVE(*m, next_in_flight); } return ret; } diff --git a/block/qcow2.c b/block/qcow2.c index 66ca12f94e..08d92cc6e3 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -787,8 +787,7 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, while (remaining_sectors != 0) { - l2meta = g_malloc0(sizeof(*l2meta)); - qemu_co_queue_init(&l2meta->dependent_requests); + l2meta = NULL; trace_qcow2_writev_start_part(qemu_coroutine_self()); index_in_cluster = sector_num & (s->cluster_sectors - 1); @@ -799,7 +798,7 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, } ret = qcow2_alloc_cluster_offset(bs, sector_num << 9, - index_in_cluster, n_end, &cur_nr_sectors, &cluster_offset, l2meta); + index_in_cluster, n_end, &cur_nr_sectors, &cluster_offset, &l2meta); if (ret < 0) { goto fail; } @@ -845,14 +844,16 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, goto fail; } - ret = qcow2_alloc_cluster_link_l2(bs, l2meta); - if (ret < 0) { - goto fail; - } + if (l2meta != NULL) { + ret = qcow2_alloc_cluster_link_l2(bs, l2meta); + if (ret < 0) { + goto fail; + } - run_dependent_requests(s, l2meta); - g_free(l2meta); - l2meta = NULL; + run_dependent_requests(s, l2meta); + g_free(l2meta); + l2meta = NULL; + } remaining_sectors -= cur_nr_sectors; sector_num += cur_nr_sectors; @@ -1134,11 +1135,10 @@ static int preallocate(BlockDriverState *bs) uint64_t host_offset = 0; int num; int ret; - QCowL2Meta meta; + QCowL2Meta *meta; nb_sectors = bdrv_getlength(bs) >> 9; offset = 0; - qemu_co_queue_init(&meta.dependent_requests); while (nb_sectors) { num = MIN(nb_sectors, INT_MAX >> 9); @@ -1148,15 +1148,17 @@ static int preallocate(BlockDriverState *bs) return ret; } - ret = qcow2_alloc_cluster_link_l2(bs, &meta); + ret = qcow2_alloc_cluster_link_l2(bs, meta); if (ret < 0) { - qcow2_free_any_clusters(bs, meta.alloc_offset, meta.nb_clusters); + qcow2_free_any_clusters(bs, meta->alloc_offset, meta->nb_clusters); return ret; } /* There are no dependent requests, but we need to remove our request * from the list of in-flight requests */ - run_dependent_requests(bs->opaque, &meta); + if (meta != NULL) { + run_dependent_requests(bs->opaque, meta); + } /* TODO Preallocate data if requested */ diff --git a/block/qcow2.h b/block/qcow2.h index 24f100125c..6dc79b5af4 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -207,7 +207,10 @@ typedef struct Qcow2COWRegion { int nb_sectors; } Qcow2COWRegion; -/* XXX This could be private for qcow2-cluster.c */ +/** + * Describes an in-flight (part of a) write request that writes to clusters + * that are not referenced in their L2 table yet. + */ typedef struct QCowL2Meta { /** Guest offset of the first newly allocated cluster */ @@ -333,7 +336,7 @@ void qcow2_encrypt_sectors(BDRVQcowState *s, int64_t sector_num, int qcow2_get_cluster_offset(BlockDriverState *bs, uint64_t offset, int *num, uint64_t *cluster_offset); int qcow2_alloc_cluster_offset(BlockDriverState *bs, uint64_t offset, - int n_start, int n_end, int *num, uint64_t *host_offset, QCowL2Meta *m); + int n_start, int n_end, int *num, uint64_t *host_offset, QCowL2Meta **m); uint64_t qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs, uint64_t offset, int compressed_size); From 280d373579558f73a8b70e329d9a6206933d3809 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Fri, 7 Dec 2012 18:08:47 +0100 Subject: [PATCH 143/300] qcow2: Enable dirty flag in qcow2_alloc_cluster_link_l2 This is closer to where the dirty flag is really needed, and it avoids having checks for special cases related to cluster allocation directly in the writev loop. Signed-off-by: Kevin Wolf --- block/qcow2-cluster.c | 5 ++++- block/qcow2.c | 7 +------ block/qcow2.h | 2 ++ 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index c2b59e7d6a..7a038aca40 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -668,11 +668,14 @@ int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m) } /* Update L2 table. */ - + if (s->compatible_features & QCOW2_COMPAT_LAZY_REFCOUNTS) { + qcow2_mark_dirty(bs); + } if (qcow2_need_accurate_refcounts(s)) { qcow2_cache_set_dependency(bs, s->l2_table_cache, s->refcount_block_cache); } + ret = get_cluster_table(bs, m->offset, &l2_table, &l2_index); if (ret < 0) { goto err; diff --git a/block/qcow2.c b/block/qcow2.c index 08d92cc6e3..dbcc0fff97 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -222,7 +222,7 @@ static void report_unsupported_feature(BlockDriverState *bs, * updated successfully. Therefore it is not required to check the return * value of this function. */ -static int qcow2_mark_dirty(BlockDriverState *bs) +int qcow2_mark_dirty(BlockDriverState *bs) { BDRVQcowState *s = bs->opaque; uint64_t val; @@ -803,11 +803,6 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, goto fail; } - if (l2meta->nb_clusters > 0 && - (s->compatible_features & QCOW2_COMPAT_LAZY_REFCOUNTS)) { - qcow2_mark_dirty(bs); - } - assert((cluster_offset & 511) == 0); qemu_iovec_reset(&hd_qiov); diff --git a/block/qcow2.h b/block/qcow2.h index 6dc79b5af4..a60fcb429a 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -303,6 +303,8 @@ static inline bool qcow2_need_accurate_refcounts(BDRVQcowState *s) /* qcow2.c functions */ int qcow2_backing_read1(BlockDriverState *bs, QEMUIOVector *qiov, int64_t sector_num, int nb_sectors); + +int qcow2_mark_dirty(BlockDriverState *bs); int qcow2_update_header(BlockDriverState *bs); /* qcow2-refcount.c functions */ From 4e95314e2bb7baa64f2a9026df5e2649081b7060 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Fri, 7 Dec 2012 18:08:48 +0100 Subject: [PATCH 144/300] qcow2: Execute run_dependent_requests() without lock There's no reason for run_dependent_requests() to hold s->lock, and a later patch will require that in fact the lock is not held. Also, before this patch, run_dependent_requests() not only does what its name suggests, but also removes the l2meta from the list of in-flight requests. When changing this, it becomes an one-liner, so just inline it completely. Signed-off-by: Kevin Wolf --- block/qcow2.c | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index dbcc0fff97..8520bda21a 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -745,21 +745,6 @@ fail: return ret; } -static void run_dependent_requests(BDRVQcowState *s, QCowL2Meta *m) -{ - /* Take the request off the list of running requests */ - if (m->nb_clusters != 0) { - QLIST_REMOVE(m, next_in_flight); - } - - /* Restart all dependent requests */ - if (!qemu_co_queue_empty(&m->dependent_requests)) { - qemu_co_mutex_unlock(&s->lock); - qemu_co_queue_restart_all(&m->dependent_requests); - qemu_co_mutex_lock(&s->lock); - } -} - static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, int64_t sector_num, int remaining_sectors, @@ -845,7 +830,15 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, goto fail; } - run_dependent_requests(s, l2meta); + /* Take the request off the list of running requests */ + if (l2meta->nb_clusters != 0) { + QLIST_REMOVE(l2meta, next_in_flight); + } + + qemu_co_mutex_unlock(&s->lock); + qemu_co_queue_restart_all(&l2meta->dependent_requests); + qemu_co_mutex_lock(&s->lock); + g_free(l2meta); l2meta = NULL; } @@ -858,13 +851,16 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, ret = 0; fail: + qemu_co_mutex_unlock(&s->lock); + if (l2meta != NULL) { - run_dependent_requests(s, l2meta); + if (l2meta->nb_clusters != 0) { + QLIST_REMOVE(l2meta, next_in_flight); + } + qemu_co_queue_restart_all(&l2meta->dependent_requests); g_free(l2meta); } - qemu_co_mutex_unlock(&s->lock); - qemu_iovec_destroy(&hd_qiov); qemu_vfree(cluster_data); trace_qcow2_writev_done_req(qemu_coroutine_self(), ret); @@ -1152,7 +1148,7 @@ static int preallocate(BlockDriverState *bs) /* There are no dependent requests, but we need to remove our request * from the list of in-flight requests */ if (meta != NULL) { - run_dependent_requests(bs->opaque, meta); + QLIST_REMOVE(meta, next_in_flight); } /* TODO Preallocate data if requested */ From 226c3c26b9800b7c6a8d3100e1faad6d2b97b0f5 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Fri, 7 Dec 2012 18:08:49 +0100 Subject: [PATCH 145/300] qcow2: Factor out handle_dependencies() Signed-off-by: Kevin Wolf --- block/qcow2-cluster.c | 70 ++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index 7a038aca40..468ef1be56 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -753,38 +753,16 @@ out: } /* - * Allocates new clusters for the given guest_offset. - * - * At most *nb_clusters are allocated, and on return *nb_clusters is updated to - * contain the number of clusters that have been allocated and are contiguous - * in the image file. - * - * If *host_offset is non-zero, it specifies the offset in the image file at - * which the new clusters must start. *nb_clusters can be 0 on return in this - * case if the cluster at host_offset is already in use. If *host_offset is - * zero, the clusters can be allocated anywhere in the image file. - * - * *host_offset is updated to contain the offset into the image file at which - * the first allocated cluster starts. - * - * Return 0 on success and -errno in error cases. -EAGAIN means that the - * function has been waiting for another request and the allocation must be - * restarted, but the whole request should not be failed. + * Check if there already is an AIO write request in flight which allocates + * the same cluster. In this case we need to wait until the previous + * request has completed and updated the L2 table accordingly. */ -static int do_alloc_cluster_offset(BlockDriverState *bs, uint64_t guest_offset, - uint64_t *host_offset, unsigned int *nb_clusters) +static int handle_dependencies(BlockDriverState *bs, uint64_t guest_offset, + unsigned int *nb_clusters) { BDRVQcowState *s = bs->opaque; QCowL2Meta *old_alloc; - trace_qcow2_do_alloc_clusters_offset(qemu_coroutine_self(), guest_offset, - *host_offset, *nb_clusters); - - /* - * Check if there already is an AIO write request in flight which allocates - * the same cluster. In this case we need to wait until the previous - * request has completed and updated the L2 table accordingly. - */ QLIST_FOREACH(old_alloc, &s->cluster_allocs, next_in_flight) { uint64_t start = guest_offset >> s->cluster_bits; @@ -817,6 +795,42 @@ static int do_alloc_cluster_offset(BlockDriverState *bs, uint64_t guest_offset, abort(); } + return 0; +} + +/* + * Allocates new clusters for the given guest_offset. + * + * At most *nb_clusters are allocated, and on return *nb_clusters is updated to + * contain the number of clusters that have been allocated and are contiguous + * in the image file. + * + * If *host_offset is non-zero, it specifies the offset in the image file at + * which the new clusters must start. *nb_clusters can be 0 on return in this + * case if the cluster at host_offset is already in use. If *host_offset is + * zero, the clusters can be allocated anywhere in the image file. + * + * *host_offset is updated to contain the offset into the image file at which + * the first allocated cluster starts. + * + * Return 0 on success and -errno in error cases. -EAGAIN means that the + * function has been waiting for another request and the allocation must be + * restarted, but the whole request should not be failed. + */ +static int do_alloc_cluster_offset(BlockDriverState *bs, uint64_t guest_offset, + uint64_t *host_offset, unsigned int *nb_clusters) +{ + BDRVQcowState *s = bs->opaque; + int ret; + + trace_qcow2_do_alloc_clusters_offset(qemu_coroutine_self(), guest_offset, + *host_offset, *nb_clusters); + + ret = handle_dependencies(bs, guest_offset, nb_clusters); + if (ret < 0) { + return ret; + } + /* Allocate new clusters */ trace_qcow2_cluster_alloc_phys(qemu_coroutine_self()); if (*host_offset == 0) { @@ -828,7 +842,7 @@ static int do_alloc_cluster_offset(BlockDriverState *bs, uint64_t guest_offset, *host_offset = cluster_offset; return 0; } else { - int ret = qcow2_alloc_clusters_at(bs, *host_offset, *nb_clusters); + ret = qcow2_alloc_clusters_at(bs, *host_offset, *nb_clusters); if (ret < 0) { return ret; } From 044f4c8b0ee90290b6cbbc616c4be3c8aeffcaab Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 12 Nov 2012 16:46:49 +0000 Subject: [PATCH 146/300] 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 147/300] 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 148/300] 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 149/300] 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 150/300] 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 151/300] 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 152/300] 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 153/300] 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 literal 880832 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 F3DG!R5esGl`O3%!iK!EiX+M zw#jYqx=e`=a+d-Bgo*NA0Pn`0VjtRIK2Y{wm|wA;P>z_V?j+K#SjB0~hf!t^KP!{4 zp9=cy_aM`Ch96W|w%R*!04isPH@KP7Yo}3C^(^oYo2t$M|A-A%WdnB~YzylyB2LJ` zS{l|`M69um?r5DxsoX{*Vj zv(7M&rtZ5yZ;1X=Bl;KnrCGZEF%BpZ{ZAMAXI{EsLte_#^^cgCR-+6L%wcTSz?Uma{!_((f+g$^UHJ@1JGQ^&(Q5&e?G>xS1y~& z{e-`PEo=`qEBgL9&K_W1wU_I2Irej0SBx{~I8%To`6mUEpkKsAYzqp{AwYxsaJZD` z!aX6@Df@NA^HkGe72i9q(dsQ*Q(^x_I7baAdX|fC{8>3pHe+NycYaIfp+!N^xkc0a zfT|%@&cGOp1<~(!QNmvA&$3Np4=HKrn1Qz66C6hQo?d)2ocZg;_rsMpuaY~jCF;fZ z!<7vf=l>Bt2)>Br00y7;;@jdZPcObL&U2(*#NWM`SDACFz9I7|$ULE7yX7U!Cq5H) zyc}a07=V2DhZaEgPOF3E#=4G`_cnSSLE0Nu$5YT%&HL!{Ui9C44lUxct5%@@!v|om zBh~-)CGssn_=0<{k{O3v-Z-@AmiK|jhk+?-aEYwG0pGR)Yq7ZZuee>_itikvjd7U2 zCpkML+8ZKi<2S!Ab9+AU<96ViTp8GidA7D;5ysHm7WNGi?}_KCp+202v3MTGe4E#g zI1TffPq~cxc^|$dW|_@p)P9Z?vCfCRKT-C5y=*RMBWC+ZRlAF8us6JM$8$2r8|p5O zB^_`22yvC}i=J>_w8P7?hGgtR*s)$xiTPk9)*&i8?KmUCKH-@ADUxp4lD6QM?>MgU zSK>Qml^^hX2g#hTKFRYW>G>KT{B^1^PGKyD?eiJ~zt>DWXBcQd^F?kyi1gfM#InBM z*!vz4vOmA^oqv+m-+dx8E-b5Od;h2EHE+l)bMDLhEcrGr`95UGh{ymN`3uJ4Ba1Ec z80*=c4tboEwy|!9-1{-swvuT)=0dmfeg@`Ifzq8**%y=HuLz zmK(tO9QHxst9=a@;_U45@AKMgF4_?|FSuzyCnAq|JwRjOr(YMkxR4}Q&R|`bbp2QA zXBeQL-Mu%$1|9@Hh!Nzn@g3+x-Q4&2yZYSk|100tXUs6xy~j4<27hiJ$CYQo4H=jx z15;g|{^uFj1=uJo*xtXp#sM87*5EkDj5iopjybpvV~ZGer}`g=(R+)0>u{~COp4f})t;Fed_!2gv4*TYNa);x#2DJZi7!qqyJh}nqVk=ah5jHzg0mg|^9`HWbrJ<6+?V_@EixkWyY`H0<8@eP_p9~1}Owy!7%znliM2H3!8ZJr&^?cb_&%mT75xPLvAQzpuuM2R;!BWOR;({fU^#(r zK=d8pB(R0;59&7-9Y=h(?lEPH?o(VdcT~wOc)tPX8I`s0D@Q2}bN|@oob4 z60pv=pH?FOapWiPS`e<5+R7bOPBegL#VJu0uJzah=l&;Q-Dm^mWgC#zuod#+9kU-X zFAXTi_GPZC#o~$m116yk_N6?J;rPhiK^EqbeJbp3Ir|O8--~@y{Qo|P8<2K&F6P|o zYk#)aybm9);cU-#oSTEMx~2WlBDP<({m=TDzt_e%%y}vMu0gmY7`RLoF{Ho+-!2ip zytaaDO|^8yRmr%l7P!>rhmUAr3S_b=`!#Um=$U7 zZ)I$l&;Np+`VBpKYm0QfnEC=A7Vsd8b_<{v=m7dr4E@xDmjIp{z(+Fk(Q+O-TKp{L z%lmcP!JJs^J3>!l9gTIzxkv39JpKT$D&Tmer+^xOZvyL6;H%p`>otHh%rD;)>uM%%G3}k_ zK2I6(LsX2<`xwz<{Xj7tiC%S53fn`d~ulZ3F7iEGFLP)V*E@$QWxU) zJkDJ0LqX^7;E!L+D|QA*#X3`!^V!;$cs-l3G zW-PyY`b+p#>)C$wH)0JSFv31-V!-l8`?N;g=E2i>`!wtDKJA_T0@E+>X~5dU`jAzO zZQx17JYt{!bg5I-?F(fH_HZNc7vm<Ksp9%v zZfL%U2jPoNdo$-oSSx=ZTr2T9a8~KmFJu3W<74<+u^;yXtlMB+hcV;z8#l`KMz7ysJY-up z-oKcKaq;cBu-ZA;FPejst_#}XKRYl#JwqAp$vF22d30a+mpgeJ(8tWb{2uSmr~1vt088t~jr};Ma`N zUlP?PTRhDVlf?OqlbZ0FtWLvTbqkHf{@3682)OHOC(XC~+Hnn!#T$R!YgYq%JsYt< z#P#6ASF_A4FYN6Y)*U*@jUuY z8uU5VX+<9c|J)Z)_d2vG;&!GLGj1^E(@YP%tI@FnbSU;Wj5%1T^8Qu4e}eVVGnqm7 zFfpcCNt%WJf<84??>E|=yl%$j#Cu@aqlA5x!oQ*4AWgTgvF>)@1o~Ka+yg#a`d-!d z&Dci!euo%@``5X~WUGz^_aDK#!H2n)&;DenIevVfqx|t1=j-b3Svf`7-kby*5EK z{zc}?!WQstL}3d)^xtO@KP5!?SO)!b8!_i_>Mn<{E8&BTc#(C(`0@LiZ08Ejk#Rfh zpV&7I@=JrylVt)&FWT$i*pU4t_gmIyC+c;=pYfTak^Fy`gYoPAQD-ZG7FFf`1nX}H zKyykM|DVWiD%h_*Q3IXUyo-699XwBjUV)N&2{5>f-_M|z78gSIx9zB^T>!mPd$GE? z-Ggs@-qCP5#;O3XM{31gzcI!uPGdVgpyj*Y$2<+|ck047XT-MI5P)-}qWzE1t$?X>Z8%s3;29|JNzZ=ZNcY) z);nfC`%kvpCbW+jIDH76L~cW^2^RBNAazaBK6kVBXV_JFO&w%E#WD0J_d#!H^Rrd3 zFGwYRlJH^184w<8#k`99yHD@mi#sarhV7J=Y4^=$-vgQx@@Yx&_fPQIu~m3~A?ffM zTDRUu-xA+1gdJ>fwhG(6(b=BSjdp9feAht=p!__pH>eKEiaG&8`J`^>HGn$Tb)BF9 zuU}#uaT#ONJg~(3f=A#NM6Azc(T6ye?sm41=e90JKYW;dhM0S>jk2$RjYh=|;$7RQ zX90xiU-9i=@g9IkH2x8BhT#j@2Qo(TMywyO?ejV;+cJ0sP7kQ>;p_$cM3MF!34d3_=~^t_$Ij!j%A}qb{EHc% zKmMNUaCxp5UB~mRcFapjnEC>TdSjmu^pGa@4s)@7%W(tqfjDQZ=V?uGw`2d?#0k0> ziTpy&jT5WIxQWKh@r~u}i<&1h4%`PI%PWi%W5oP&`))-dx5vccj}t&<5Dxx)#4`g} zc>H*W#Dy^eXAb5!rAPulzsh)gBx3z&45RA;lOsP^E&=y3ncN1S*%AAv0+%t%InBfc znB-&cWGwTCF+r@4MEV5e686J$+hNAghDq2<#+U%Vw-9tZpp);$o<@zPuY;+T@5*Wj z-?VawH5Xf<2m3f!|94@JhR^zOJ=p9=&I&QEh<>Qxo!c*32LSv0i@axTj@@G1c@O70 zVVmaJiXrDaOVu;IcKFge`RuTMR>3N4Q|${Ei@pb&#Tl`X4-N49%<$6|bz7Lv#c0q& zqw0UxuxXm4Y!AP{F`6%t!P`S9<@oRFE@LD?M6XWY@x zasH5AK-$Hertf`Q%lW>h1HKyZfoR8AV+0-krVGcoy6@uH|BK=rtce>wNZ7EjXZ{8N z_gBQs=h)Z15w;wJFW28w;d8F=8F>Df=RN{6*f(UbDN}%h=;NJNGw&P^bKm3fNS%DF zSe=NzF5;g*3)|1d*vj(>_aYJZ-N9HWYNuF_Dbhk8GYv)Q5g4mK2ovN!<(7db)@*7P z!^Yl&t<~t`AoIi+6=|Jsay|8#;~v%t+CHVa-m){M>i#3e7<1nd`Ir-^JGn1?dLKXY zcnLfQ;wL`i&X^)55$ifJ`T(l&PYT$uhl_dHAdK1nn)b*(lE)YWb93&-wrkA8fU_kX zxIP8j#MwlP;2GbMxYLIQ*ta=%U>=6O62=hewVclQvMnHP=X2eAc`P&MI_KiuoXe;? zy9|ByEEi{bBKqx}pk_g53laP9Iw^cdk=A`Hx5@m8{_w2UIQKHNy_J^gy3^OvinO56 zzfxo94*iF9r`twQ_fQyss_QxzT@o*`ZEx?L*a>+r9u8X;8zg~U8H3nD2ura*st`s=@U4WjK`KJp z(Zk3Iu1QaB4>_m(KF&G$`f*yPB{z1eHpEwMoCb5!SWZF%ZdzmKMN*$sXJ3E}Shb#FIhG>5ybenT?c@DTLoU-FrSH?BDjTsW(F z|6+_GxWi&|&dcQf#9Q%4%khm#%*O~XXn7WQD|Yg{RQ*3RhG5M40nuX*({Y^Xn4o#? zwm-w2hI#sKFv9&P6KhFyMw#^0=A73KUy(=mZBf1d5M>cVGH#bQlJBL^ z(lGDx5Bk9)_!@{;;kp9m&jT3f%orH5yXXupjaP>bV|{}B6^AkYEWqB( z_j$e8FE8Wm((?0D!U13Ge8wT`X#b^Q|GDW)@Aan1*Kz4XSey8eH+|^|>`DKoH~S*3 ztH6)+Vv~0s^72S8h(;eQJO5?;_%0aRfS~jC=gv*r9DsBv*~H&}oX%YQ>ivYv?V)7d z`X1IN6i=`h;B#*H{r6tN+z;^YnWT7>Ew=q+Xd#{XX2N26uG=QPkt_}2I9K?D%*3;ByNqbgcH&ed?zYFjs)Atg);ZvY} z7X_Mgy?^Kh1ejyU;TKg!8@*<*`8()!=;#QqfMAd=k|DMX#_+kfF<;HvoVL$bG# z(=ZnR505(^NtyZ4{qL*!ulGOu<7a5hMSso`KH48ic?l=wzyH%0upjHf!-SuBL+Qj9 zDu-<47x5mQcM*-iH-IYAUObT?R*m2gWC;f!nqyEe?ojZ4&UBk zvK<$FuouYIJdX0wZ*KEh=lTdS?tK5h5aWALX!XF?4fjBRjN9>L&! z73sEnYp|!K5qyNcBwhKZNauIrFXC~h=tbfM)tkn$EBTs08a>X(L^|>p*jw0(Nb>)z z-ve2Jt=0H{!3Kq`bvxpTAG8L^_B`x#s`raeTrRx$&C652sJMKX_AmYddl`R0J|y#N z(;N(ag5-?&1sQ+h_V-rgE*W)2lN2$#F63tU_Wr7b!Z~I-Gd;UAf3ij;X*Y}Pa zz?XshDmLG6tP1-KzUx)}=`~*A{e9lM&_`>5uYhp%dg%JwKjdNUy`p!`N0Ilt?*W|^ z!|Ug;9x#VB2FS+xS@^Jg+@t&rzJsU%d-l$Cdkg7qw#Co^OByQBpZ#ClfWEebY%sFx z-+v$WX#Op11K`BI%pCGO(!CgY-tSezk2ibUErkcByc?%+e(kUB^WTPhQsiC|EUz8H z6!pO?{STPTmD0m$Sf)cQDtAZX&~iZ>ey^}}Dj!vL<$G|IP+BqkybO3d8s&F6USq%J zG4Op1ysibW$BfU2f1u$MjUT_pw@2VJ$NA|$eGB+`81hc~1A8qnZrrQ-~Z>ZAwGyZZTc^DV(n)s?7UUy!%P2M?!EW<@v-`=aj-%TDgketm}0NiKy~zx)!V)4Uz> zI}BN!p*??)S6ZL{KqzexY46iC;_=j7&n;=7Gta;0dAHtw*1IiSkNcnb=@jvhX~8lZ z@#5Xjy=BFHYu|RmbA1(s=i5*}^grUuea{?i_`R0@Ms-g7-hce?6zc3TAGqExK23H0 zy)8&b8^XW&M^+!$6)zN(2{_6JxC+9h{KFXZ;vW$mmhVrs4Xs^(=Y-M5bZP&)A9Qh> zpe=~L7}{Bvm%bUoi8lDR4~B5g$L~tC4e0{3!7pFX_bPq= zHe_H3WuHViiExHw0^u~m9)vWW7Z4sp*pKii!f}L0sPEzTO{D9nt*Gyj&SPDNagcN! z)`bfqGcOXJ4&>`ZQ_;is60cf;F&X1s)9+XKHUFo#;zhhS^wM0>OKpc$uJIPH`p>wJ_R}~^`=7n*noeDwYx>CLXR!zUJlWvn55yem0i@MZ+hgpSqrOf! zX`VwN`rRtbk=EURIKyLD`vYWiS3l#*0X*IJg1kpq&sITa9>G2EcV7PUoo~bMg!eki zpMwrX`s1pHUx(j+dE5TWXLFBTevoYW`+9>iux@pn>Vx@S3hN)F_lZ8NC0-uDUPJN^ zPUSw0xgYkXUz*SLt<>|mTPPp#rs2J~CAjBY$xJbCD#S*gZE?L z_5ZJ)WNQ8;A~>0T^Mx?s$<%^enRtvBvG6D2;}=eqiGMUce*Wjm#Gj9kZ`u+czqvg= zzM1FerS;u%G9G?w8Tz+=J08CE1M%@~6dl9ocHG(>7r%X?OnezWcWj7Q_CUW$kR?K0*5b{YDAyA1tZ&&K25@o0Q}H&ja;-?~2#AHQpNeEi!F$H%{8uuS}H zeEi)rW#Z4r$NwK?=nSlINBW#U$~)6{PFnsvH4}?- z#mC=YCjPx;JWK}%;kuvRjqzs<-FNw$V z{tac~50{Cbi;w?LW%S8^Dg*zAH^k%lBZ`iZ=l^yw8lPxs-|CO$he!MSCWb~w{L#q? ze{`?EXLNF8V0>x9Yw7Ch=vwdZ92x8z85qtFgkdvH)&9i2g}i^$P=X7@pZxINZ2xfI z(1GlDe&2!o$b=@`Gc*SLdxrP_&RD*0V7=ee-=7~J_xI%Q9UU3)^Y|a74&?6{>d!Bw zEXDBt-o7CezSJL|=$n`v_cyvC$A?Gv68v5Hv2mime=y&_U%^-TWBmj=0P311Ci?mZ zOA~hW4ab3dJ5W$5G$sy({777U7itw3pJ*8y8y#Ek-!v{Px~;RmwzhWlB+*RIF1#fbKf<@5e{p|3wL z8Joe@iJ_5we*fr!1K38@^rf;tDs@j`&bW^S%1^BO}H{j(m5%zdhEq67w?`-OBiGzDE zBk&K-YB(q1Lpcq5HJsA$n1(aO?+?!D`#B9SO8DV|gdeHWa9YB@=+tx#|KftYPp2e& zs8`>aK1@;RmH3&{u$MwSoQ`;+bJtQ$<&fx(T`;6W3}Gmw(Z?5U7cMm+~k^W zc#IzpD;*CVlY9@?O6cm*%Nae7DM_Xt9#ps^5>8wC5{;kMcnos)1TqwiA^K71q+pNqWD#KRdMqWKNK z(wDw@&a2GU5e|Al*8|oe<$b2so4=)_yMvQM?Phe(3<{j_*YLY?EnVBg`0~&o+M8LD zZ3{Xi%0D9|S$Pl5dGogH?9|9)>bf2+Z`PZ)ylu0Kzt-2E9H3pXlZ1x_eSZ}fl1$Cu zmhc^&O)6r^R5ahraj(*$rTRwbnO@>81V7rE?&Ie9~hq>OnJ$!mL1(4U11R{l|RE{ zaudb>kjhy!-s!PiF`W-h$$MG&a|*BZH+mnsFjO|q>kdRKd$K~ zy?O0zrnw+D6ixZgdleh`x4hr@0STv%d5dZ{cQtKSi4qXV>oH9yIo{ROY4OSV6933W z^w+LH&t5kt@qbkaah1==l4f1aK;Nyex?%GY;`{PFx?xKVrzo2l_6yk~CvGKNKJmW@5rXEr}k5*CU zWa?30!(Iv9xW*gZ8Xbw08I#PRDrPOYwNL z{+4chi`pHIKbI&I)_0}P>h(8s-l84d5Rf}qF%mEySHJYlO7{uH`^n>y z{>gJ1YW&|QoZ&s0@m{mJqoX_9($kDy*4D8-+uF2!OM6R~YYLe>Sub+Lc@0|1-^8(+||<5 zUd)#W{~qe}=6BpB+$TO<_dY5ARIOK$rJwvHQ>oqbBbhpdZMQ8wL3_OR1&M$7sF!qh z9ozI0Z{w%&`P5;Fcl=bo8U3eJUM#e6)A(z6{)gr3C46{%`U8E@E8(>1gAdBP+1=Le z(e^XGeF}C;W1Cs7rFO;NF7XnbOzF zKi-R7wv>gRWa?FKq#x+FbKbSh9ostF+QTIWa$tNZ;cutpfBdN8>7@{lPk+#!7mLFv zzaKv*>Bg`BRqbHR>Ij!-ooaV_Vyh$@^17!q3MSAiB8y; zfMYQ5-@zS`d=75fTiDc0DpK)9`t1{Ey!p$!&B6`jsDi+O_Yn^(kDD>UUWNfaL~qni zegbwHn>(5>c|r1jCgm++JJ?i%rbqKXa@<=e_LAhgzDL3jH+YL$dRm%yhNs`4Yl$!E zpMf6PR4_)^5l)Vd!?{*M>D>&4D;1D?W2y0yQncSLWM*hxArnY@2CC3vEC%%igs zZ+g}GZBP!SU%|hic%%70o1y!^q<)=)^5|a;J-7Jlc^iET|SHX zwX;WMQpV*Ne?F^n867uFpIi7jl@}X_Ewu7Ka@1ScaVPbO%F+E)6@HSbkDvFh;r`OH zMLW!*rahx$6ZruGNTxnFjegs)Q$;GMr}6WNUV*du$Z4g+%6)Xko8SHRPIVjv`A_?j z?=<%t{LbimK|{r3d^|m)_L|6_^LKsph*#Mh>gQ4W;q*zbVkM#ECn(?iDt~v962ON+ z2_2t(c|Wb?eZE%HrzHG*kAzmwhkGh2-bqpXgvwF8pP!|KKz=@U2{&1`bZu+f-qg-n z_)n1U^OpqP%}>wC`^=1lW@km`sb+t>d^v$PI?q7#S5p)}L3w9dDI%~V%)WN{NZ++= zZEI(0gM8*UEa6{+;QQ1?3C}3qMqhNEZv1uqH7EJX&YMz_{@AR9me1xB`AUg5`^VMe zytkmUy|mw&9dTCMH7eI;->2deRv2oWA%K6fsu=Enq`U=9?d=^hR5&%jAzbUjPmYm+}^ZJl@!OD{x$!g;raV2?-~Ma zlu05X!Q=RsGP$vF$>nQ+zmVsZ8=KoC6X$#VEWIRCCysgx*1m*!PE{@MpMz1CZlS;6yHN#egD`Xc?x>E&9s(QWPj5cF2Clo7PQtzX!9YWmCaeH#5>$DM7RyI8TtG zy>bHQ^sX=OPaVVfNqzu&1>H_hYWc=TE8psE^>`@4rzqUVQi9jUW0Rk!G@p})T7ffp zGJaeAtvu&9RrxVEE7$mA^*?vAqGC6p<|nA1!CQT-KUuuZr%xWEjLDSwKce&bbCezOB{aHcvF@vWl2w!~Y=6~3V5nxDY@2g(O$7g)UU!QhR)XJBt^A_AGPfUbuJg)ZZ( zYu_q~H$Cb6TJM(ls9pC=C&npqlW6~pj#JMZ@e-{~J6f~dO`F@@K%Y##=~sg98TcL8 zZmN-Ydefit-?_$Q{s9+Mm)_(BBlQLHaFnWYzkI~R}l zi*w%mJ6qnak^=Zc1ZPh&^%ptVcjO1*r~u!CvlM}JZiql0PQotka*hD_6)p%Irl|{B zx|&M*yBn7X4EVm(DxuZ;!E;{K4lEcUZ##qVpMVbQ*JfW?zqHWwo$=GP|0OBM`hkr< zR_>QNy~>>%tVGPSYX$yGgWfgb&)C*;O7AIyS&LlBv&J@@{C|74OAod5E;bqwo{7w`X;V8r1*E<3g9sZ%uF5yQ|L` z*qa?YT03^Zdm7^(u<_RBd*&~&{Gau)evjO!6tbIQ0Uc+Q1zN8!S9z7IWzv9{fKFSl zv37Yx<-+yTl+?q<6YH-=mz&?`1kUiCF37v-d()?8kJ|c>oA=KOyw&UDG>()1B{CkD zl)FUo*?iXF(|Q=bhsckRBUpOif1Z%=%e`24g#Tkpq#PTsoqSFSyy5#Y#!1+}TV&%w zGW8nmA792gY#V{{6XLV-(bi+k9*xTP=~i05Z`YkDz&lNdlBus$d9T{h(wzmRn5A!r zHz&MPC@AMEIe|C4=1=>IFY(sS*8e_vT;ij2eYL7MzFfX2e+Svdx0@n?Gkzm;S9 z!uWe?&|ARM2LcPptJw`D>jA0AT-Zyyk4^4 zecW5LrK83=xI&_zzaZ&fPhot!S))UI{(3>ut^BW(-GTKMo;HTyte&QK9sIO6Z%wly zcKk_wUE93`Kh_PlG&QLq>(*f|3T4UEKf&Kp6RN+p)04A8r`da_a`GN8r@#Y!*WA>l zo8~|l^AUNjlYEc#qCf7mfia-l@SRY(vU>j0Al7#}uo16^1&EN~LB2B*{*%h}KQv(6 zCcluSUn}Y6cQAj0;eED>{G+t&EO1ueQ@*@geJ%fE4HADs`5T3M_Nb&s<@n^ZH-Bx6 z-|N{~fw%GVYVVG2j7MuJD?cIr&ZCHA>MXtpiSfo3AO#HZuT^>b=(Kk&uis~}F}0yDqpPiG?^)s!v>2VtmjDItO0&njp4$J!^N{_>nk$BVZ7MgxBJ!`Za~X!fxH5}wLQ zX#6$4e&a%Myz$ZCOix=o{YK%fU5$^QJPQB0C_x|$^n>{cqI&S3u|INq%N@E=A%Hi! zj1SR#kD(ult`NGd{~P?5dL`cI`sc%5<%ZCDpus=YDsbi>bMP}>6?sc(j!F>n1oT-s zMyIp8X9+U!FPYtKd^fo`aY^7zPR-9`{zfMsO9amOpST?nS0(W!@U;?e<^Ge(oApNv z&HggEb#{7A@g6M>&Au`I%=r}+83N%a#21TX%~akm^EAF_?c6fpSNa4YN~Zp9+Doi- zjv2wua%AI>j@xrR-aPE*QUK(iko@lIw{50QekoRv!@O`4etGK(Ao|Mi1x%!~<;X%o7 z^cg+>a-;&|VrNTJ#9lLc{^gwH`<5@E<@;8vmuSYYL)+wbv{D*9@Yj4n!cWeMeIrxW zpq}Q3F+5+a_2xCl_-mf55Nd!&9~KIN`GBO;J#DkRcxT2{3KI1T%aGx)ORvoqN`)u z)*ac+=3L_Vg!Y^7w0iT~nm4y`Ho&jb{`m2W-gRzA343a;X_@NJ7x*aGa)BoNpFM~5 zwusk+;!V#!I7_g}R5`!NcY5IuX$|mMzUX*ndiOhL1fTgW3@+LqzH<@#2=8jq77FMw zd%)hoP~=kLx6oY@;DN2WKde;8d+cpIlJ-Nq-w zKTh%Og2&{x+@zN8KUcgFYq@1cv|z9t*`cbhqo8!8qCcQ!dpVu5-G>YG25ug z)P;h?JAAWVWzQ;#qsR3xXAeB5{I~HSY7aaOJG1!;`Oo$UUK@X+`JY?j&BG=oE6|M;h2`z}PI;dhl+gHm7W>BQ zDT<#^J6BRfGWC2f^jV`#w1W2h%sEMq&a<9}pKwdt9lFs!fIo3b@o7HOH?IFSNxFM~ zhrEAZ>301?>+Rqc37pBdi?1z?xAJV>Z2X*_(sEc{Lg!?BiI2{&rl%<$Pm2Bk{-}h} z`PAPm@#Y7Xne*?td_RC4xpSNK<{tSh9a`Xr5ju#~SGSiVv{lJ%ZH{a8A zqs!X)2WPx_T`}XZ^*iH(^-p_u`QeYwwI2E+3d^tzi)hxwBee9`{=qn?WSrp?3cX7f*5|2jP*`L8w~o;~SZ zi}R=*?Kl!0i}#G+F@0F#m+X{uG9v&2Ywm-(+9lgDjjz{I${5BVlQY6m1t2|wtlXuIf^DRg3 zk2SxYzcKoLoT^x`s}-kyD0`@#t=)cHka&|*m+xf7f~Gr~)M5$hW%;bVMGpq&Z+@cX zMExH>?yZ>L-C8(Z=`}exmJnDkpGOpP$UZ zztB^vXU*QT`IEu_6zh}iG5&&|b_(7o{-5SxC-qPoJ>ZwwN!l*Y&w}1&Go%83n*2IF z_e#e&4^tj%>FrA?mH2am+N&>gdW*Mi;ZwxA$41fr&#Jsx{a^IF%Jx+ROOM0v+ULbii8p;1o$vm14)bm8 z?Ueu34+{KwwEMOuE-Z}K&4X=y$JzPXAB&IulWKO)r;T9r{FfXbnj|0Q-Q!j^hW)d-#;ShM)$MlyoI~k zx?9C?adMlo{$%>W-hb2}`JKEik$3Y)*nH0Hu%}uh@F{tZ!hN14GVp8u0{Z0Ul>|#q zK$ppj(PjQEi~ohmnU>?|)OVA|A8J1_c{P4~n40bxn<>5@ml^s4-xnIA^Wv-(;+Pvr!Ui&r{qo@VtjJW;v%#h^ETr<+&?^)&oH zyde0EUrt`HGOx6JR=;0Xpqk-lh0$&GHF+|;7pLexrj{<7M~Z({ zuoM1YWxQ*s-0bF^TerG1|H;&1rSo5KP6DT&+u9@a*!<7hN%-U1DOGMh`K#87%C@aR z`Njv6gEIIW|H`%Rk1td#*xYhQ$-Gzby8OnMUmXwp7+dsoUx?oh-uP{L%lK?~zIh?Q z)6vy-ht$mVbBD+JT@>H+6y?A@2gf8dyuZS^Og^t+R}U~^;8i<`)d2E6gYkY>%zXOS zDu1VP5xh8mv!=atK5h2k*9*n)U&MOOu9*4suNwp|ivQOc%%??I01(jYsowZ?E9SMk z{{8dXU!RxqO~1X=dF_ii*ta>#OAqYZLlXWR_XEg$Ti#7BZC+>X6rIQYCRH>~&QWf{ zdjs=ce@qivvKytg2X@FDxtN*9CRS%@S z4DiI&Q_GF|)m^^cipu6?R2Dr>AEiuhJ3ESDf_-78e?QYJ`Apv#A8h@~>=9>oDBac{ z&E9bEW@l)>jjVg6J@^G18=I(5JORB?d+IwUy#*c3-719v+~q3CS5E%EhkYX59l^>L z7ZWPS>gV{fSn!q18-rB$I_L95^wrH;y*}N7T|wi zT_$j^7Co4*r1OW%x9US_^Z-APXLJVyzo#p)-w;Q&y1KJn-A&GAg?axQHGLNACC>14 z^tp94n-^Mr9)&*`$E5D0+@boo`{7JaeDb)Y8$V1QqIP(>^EltYykJYIA2B`8ZYk$MCuFLFjXI8lHJQ z(8oqzAO|V4k4^7beSU!b1oiGh%b;AN*VaRgUVFFv-}EagZFg6=oy;yYJ74WxlSg-N zq{_RyPt5v(<%^6*>3M~U%GDX-F+Bmju0K^vyv@rZ<6(NK1 zbr{+}pz$_7S$#~;PEQNG>RDGWqu=zewaa|03&E7=*c!oWdR_UQp0EAh_-*+YU_SQ_ zccBsXlYT(TKTCGuE^F|BAJ)&KcH!60z|PynMBoqLxgXQ?#qlrE&Py+Vz7#uC@+<$-3+WZ~T0f7Bzv%_aH{;jBhOm9N zOEnwpJE=!{VGr~g*>|k87&+r#Ed4#ba0>mg#ZE#cQ@3h=TX+=fAZFf$A`$-1&8UyXR!Z_?Inpf{c3g+^b5`f(#d*Bzh$?CPj}*;y%>40 z@x<&|qbrfYye>HKLrCxha``=dxBA;YQj;6=^BEtkeT@&UoF3eN5xQUDP2F5hI&l)? zaLhc#{BP#pa`s9_@?GO|=*E8=pKZJ}IdbE9WS(R2M&C79muzn9YPo}lEBL<}w493- zl{(lWBH)YlSF;<9Kh}RuzKkA=pUw&07XRadyu0+H#p%XZr8D)dRK@%jyY4E69*1YT z2v1qN!rJR6#d;<6l}oq}!)*vpre4p6Ofr4#VbY_o*ng9*JS=qCy1303qwA98_9gth z73)N$^I@lFwH<?d%j+k2Bt)_1im&ZoLclZ}m^Oeq;U0_;3C9 z8DHo%zW*!QYr_VLqbJZ8#utOTbPV@*Y+KXSvaJ}-^oGfug}*o_a5m1IpOJU-6PR4u zcQ)gQ- zuI7k#dT`Ic7bLuVlI%gd7$PM9>Sw5_^={bJh5LE1i}8-^=C|VqmhQXsV3=#SbWNw= zvvJ7ke>&yO+tJ8Mk;^r?uyN7oSNL=i`;+Rsa)bmRjuzvU~OofDds_sG7yA2StO8Lowe|;s?-O%g<&K!~=o1$u-Q;n>1)BfAjPX_TTf3Q`-0)rBfPEOH>+b36 zTcupv=Wp%(_(^=Zo|51_aIKUUx zALbWy?KdcNS-issyO;ZgEY!LBul)eSr_;1QPBt}iy;Ppk={Zh!=S&RWt5Vp1-qoQ8 zxJv0O(JLzFR!_%|l;WR~(9&(5YV$C+U;enjmEhNYVSF&XS{Bbq!Q<)!e_(x%;^--@ z&y4cbjTcIaAatUb(Mel7=^LsfUUWq=RsU^HPv3y~5!FXz z8udwOe1pWx@Cf)n)Of7p^RSuY_f-8!jUSYFTi>teNm(*|!(oj#_+EuS<}GM#>*x~I zl}y#0*Z3KUXK?VpzDnb9-#ONM0{BB3kNtlXZ}4>|H2xCqi`u+XqJgKbQ{r#LI$8H- z^F$$jg~n&-`xuG_@U@pTK8N_bLh)bFc=&mCZ0S<#0q_NlFGzfjUJ1`}4%0W{oXEBv zN!LPo^Vfx0C#D^`n+RsY@y`;Ov`Z>tA5J$>T^j$fCfSAuWg zFpc{I2!5S|m-O^&mT-JsPTo`5FDZPj#2b9}0gZ3v_*#Qs^C^w*m3V_+GokT^y=(X7 zC$b0jOl9}Q<-G?wHfc#Ln9OUv5~%E1sWO|V&Z`ynaUbmr%9D1iY!ljAVGq~N`J zB!4g#E5WUNpTZsYUdQdxcOXAd2AbgC`Z94ctFD2^V` zH_KuAb-2f0WMCk_XL27!;z9be9Hw7~`LS!?u{^afgEJVxJ*aSaOW(2>#f zf=kbFlBVC(t?5TCeYhz9P1@gIH{;Ta^BewimVU4}|4GGv(WMvVU-2tRe|^f*`-}4* z*7RDJUY!4&ruTR^;)B}oA~bEu;sThKY(?Lm zUbSa*bmGAHzAS&ydN_Yiewcw6&+<>v?_~P*kbi?4xo5I4&^Mtvgwy5o0|a+5fJ5UI zVI#Vh9~OLXSmIr8_*fG9nP5u91Gokb({E_-t~0niec)Qtmnk3L&>P@6*f%zU4^uOQ z{7I&kJ*s$cuEX#IMIrsLrXTl`@+I)>-tp}4Xx{+GrJVI{K)|g~e5ij2&I(kV z$&~+s!X5F_3P;_ze{^K;P{1j`%_!WAmkPnX%QU$l1l*Luop<=|83WUu%4a~pwF}&v zaB_X{9x!y@P(L*Lf&78dP(vqEZ&7{tCitnk+yNlOpV0iZ6rW?P#Gkhu()d=yyA3~x z*LHeSFU5!8wO!tXd32Xs2ur5k`~}5xl;Q*UH$R~9(}>?}T@&!TH6Htbx;BU4S84p5 zmq0xWlM~qq`%*g5`=%;Me>1+@h4gWJe?Hqk_AZLVlT5ww9Ea&Q|gV1*#0-0SDAhNZ!?@f^`Y|;ntg5XQG59<*dH_a3d;G;nU`74`HIScS5VH+ zYF}PCzF)DZ3!kO4FE>zbYIpPdobu(}`1bcpAPJ9zAi z+T5|_?czBK%Cmi~&zzKUqVp+#)?3g>87VnLXEfiboTR(*@LjFVEv-#=VGcnl@&x5Z z=i!!b=~P9feI-0x-lKDbA-Lbp_~Yh>G7h_S*asEf_-3K`d#(Jaye(To_ovw&>409F zXFuu-9j6XU=*n-EcbjjUe>OTFeEeu6pXh^>t#258kIf34y&Hd)^;XP#=gPY&5l=v$ z@yGm#7FxY6ba;+dEPN+jAi<~tJaZz?X&smCKA80KnTo2;jvd{d9ot)^?BepR-#h>Q zVM(`jdB-PT;;;5SH{(-De(i5oKMSpX7M6=Yaa_tbJ}kdbv8d$p2qC^29`QQ_=Sr*` zhi9;2@jLb4jI~Z&`$Y4t=)`xU+FJA=ZqN?K&l3NzjNfiQ&WTG>A9vqRPTr&ae+BeC z))(lezMXPsx4@a+F?qH6teA#hz`+J|Mg74yRq=h^x$pi@PXxUL{D+G1Tl+n6zBs<5oO3ug%14jZ6QDjYHA9PRcWSG8u2tiXa116Q-x6KQ~Bz?(+#V<;JOP|%PFA?w?z6 zz6>TVDj>`!xLUs^C{)rgU(fEz*RiWO5h4jU(e_OaPh-Z81Cs^$LwUfG$P?suc#7b< zP#7VuP7op>%=z>q{wYOvGnXoVeczCAWObr#Ydo4zY&nbu62VCIZXAJ&+NVE_s1jUF z#32M5`-ei@ni!kRAKKeDjQ$yVBIu~5wHrZag02=z(0LV519g^e`rF7gj#h)yClD?i)szq`on_cdsakPzuyRMu4hGCr}D^Pl{*$pwo(A zX8frM>ZT)m`}}ICXz(=;oiH&pJWTogiNU#$aE&h+!>~{p2Sx`dHR#(}Eru|lfU%sv zq0#5t{SpM2r3MmwjbjPCoZYAF z!nk|-h9@B(%j7MG3cibi{Ky0b^`QfW;rs#o&JQd_X5?Xk=8B+^ z*88=q$9(hy?!_CH;}!EF3D*yvZF{uP%Wqe)xuOjk4Zm}vYDcK2sh)Y z$6!H(Ak#*{6xTuW@0#pm9Z9@kgcyaOK-RJb5nW8Cm=6)>zRb#m@QT(Iqc7uQ(?Q<> zCJv;My$8csa#v%D0)59e#}Fnn80+Gm-Toc<2_8E8`bpKV@%P+|MnLCQMGNIWfY~4M zrM}kR;7grVxsH?x#&unbk(cIPs zEk{P()+VZ%+-&c+^t5#gVY@Zq044$B>q+}_CgLPaTT!B{P8kV(_)<#l7{Op5plrNB zP#TGrp>Zfr%}ktIZUzI5R@8zpA87a>!9oPOm_L%=hXGHjsJ}_U>rY1VyQ8AKhcUDc z$?!l3rbsr2MP-l5ly3QWVHjk<7z)57mx-~ec-4(8$ckbLI8>0Yu`uq3H6Ms|e+&XKzK9eyhD0d)*+AN;QFXr2B6g9CaAq8F zIsJVjue=;H#4wOuwIF3JxWLj+)uu`f=P_hbUmY9THz>b?DIzE(JC$J}x8NH0JaA3) zJ<_3>t!VCkwa{~}>y5eGAy#U^FqmQ27I#2ygE};UDyxCf1Q#gXQGOG{_YC_R{h_`7 zhK+unCTknXKpsJiPJ)Jb^dv~kk1=FYY64bg&G0CC(?%W+#!T2=E=Ph&y%LrXzq3$6 z*oajkrq(81JPdSYsae|jcRT;CP6*Ayd=j6rJnMaIx ztKW5gVW@w9(7YnU6O)L`%76pIBBw&FdOtAkWv%=>A*{XeFHnI{QtRF#>d8mO?7IhE+j5q5|MLzaQq1 z&nS>UWv?p*=wIviuM5CvFyR4(z#Gbe_uu08-|F}Omfzn{n$=KPC?!*sK^&|}n2|6Z zN7hk|!mr`qq(!+u$zP_OhlWxVtZ-@Qk(MUVTeYw{zusT#uk&y5Z>7S*ui@X-iCaX( zt{!j;j?3JXD?@c4E>npO3MkgzP%Y3Z5*M#k2~S3PFg#0naB3Wb#X*`tIZPaL||IL{WN;QAiqs!j}%X*EP62SUdvwTnoc ztpJzC8jRWs1CI1gnGy(cm!XE_PyIbC*L7NYBybrZyw$=k{^}xgini~L7xMk^)T&lB zax|72F~l+MP%=e{6l1ThIAU;}-w3T-Q`VzJmSNw(J$)mXIt`7`PB1YiN$R8#mxVY~ zOo}$%GHpC!*jnj>HKZ8vI8sO@^RN%UR;V)0E@~9p9Q=+v4g*z&yTUS>ycmy)3EGq2 zN4DP;o*-v+!m3vW+<{Wb#6)pAW0pxj8`+&;SwpaZ%;u1Ty9W0i(iVxKJs2hWbBSgg zV>7AG_#Io7$w5!y`-%)=89_KUM@2e7a5v9|hK6CD!>q{MgaDM7m_ReEyxZY1#H(b;#Jsi$G^7r=ulKKF7gB;J5I!O5 zhr)n?f~gwFTP5180EZrCR^_O{go$?c7sm3aI1lLP97LZ@b;5*~{@zVKxrsdHhL{=e zg-7ppxWm++N(vpCuD=hCvI$<-VI96=@8}r(jiIWcDbzbb-c>L^^aQ*zo)JuTPd~D- z-DPVfp*$hf(M;%i_Jnu5d z1Pe_f(-{&=)tzkCaTaPjxY5GWVE9K!gux68tFf?+i+N>!D`m*v5PKlNw7w+{_KChd z!+F*?u346i4&&4T+$I|umkB+hLdc`yYwK|iS^P-s09-jZgoQCJz*5F}odP6~6XQ_!&!EB(vudUZk;Ac=tqwU@Tj7k+DoWL8m4G=ZxX>cMGvZ@`n|{DlhTs}L8t}sS zf=N9lKa*w&a@WnN>A_1UI-iHs^SDxkLzY+I7$RQL*%KqBgbwOMXzZSz9sr8X0WCD1 zA18V9Ygb{VB(%iq)6|98gBBSjY8`+MRZMKjAX;sG|^I9y2<)lAGVr^Y~rB# zv%*qsaaJ{Z&#>52eRvhzq6v&;c!*SXNYqqT!P8Jd1btUWbJOOX?M+>8N82@Hjf48P z^lm2@I&?ZwVye}(8rLI4D7JQVb+++kfBIvS;zpn#rZMh{su%fBE?MmKxj8u z6eZX0!OB8Ew)g}YHHuO#F_bD%lsEtpgaas?RiY#j3*q}Ci4>)YqY-KcMkhukY106w z1@sJzB1+Q4KO3TEV3eaIl~ERxLkYBHB~ltiNgnq97U$t8N!=8aEOCvATi{x9Mq1Nd zO>OP83p-0+G)Sx?f0Rqa7nZYKP1~~gvSdrwT`lNvWLnWW3Gc6)94GC+cW4ZDW1(*! zlEae zRn8{CF2XNnv>$+CQJ+`RgCeg8%cr6POCC(jqEWDA2Q5C%c6dn?S@MpMMj|=4xcD9F zg~pN~QY#&X)2I?q!nZVvPb`cQd|^1l7Xe+00f3TNE&__O1-Ny1ET$2gef|Mhet`AcFe#{H`{?L?zl)YR#pla@i~9HyA))alTG6q{+p)NJb=)LfZCgQ5GtN&B z!wmfGP1ux{&Lxgy81e76BryDJ*Y)Rpzw-+G$&dNfg$-=8K?x; z2-bKT8W#s(wi^JFb0q;J*&~!7n#E7DRfn3@6%$p`f$L0=&S=L*7R1W0nAVu{b)gVb45Y>d6Rpm0;9(mfxWh_9 z5%3Vq1I#MQIMK)6ihOaVqMGKgy2OJXmfL}h25m7wxfe4Bg5H}M8o_2aEIFD?#|pSh z)PAx?dYkJcoXSN&q@^Q6%7PAvF|&B!D{d7YI#fzr`AfN%vL(PRACj?} zKz5eGDNo8v){S}aW?dHOgQfO9YPyIq_d;5F=OUR1G zCguVUdwYjR4=z*SEl~C(wXOn?!_fi+=-y?CK%*)!Hol3=i@c_gZ5UMel^3M}b93z8 z^|aer{I^ipR>r+l0^BH^SXaNcXjG-fi}o=V z3v`gmy%bW&)>}5A%emC~A?4Tsm2ss6c`z{30KIV|_hucI12{^|!HY!0Kq7NRg{X8D z2}_0;6Y9p&#d-Gu4=h*2n4kkASbd7o1}ts-hjCpIjX2#I*t~fvU1TQ|(f1NsOPVIe zLe)+rT>=%~K~YiPqd%7S;A6>}JxIKn~;=f(uXGW)w| ze`J%K|B>vVhHF5KNB*6X6R|SO;3_#O)gMD6*vSo}3S~*fQD>GbG1>7J^kV*HwJsX3 zcu3*0rJB;d*4}(tbPW_aS`!Lxg!DO2FxJ?tq;KGN(NN~gsU-oyeo>v1P6mPUm zgr|5#o-L}bGh3L5EbCt8oK7sIO2Pr^w?H4`Epi=&N#47mKTks!S(Ddt{;# zPDG))Y|{xVb$Nt(f()2Gt^CRsIr4*H%7n!XJ~)&g;G;Yk#hm!ba2FaU*Vfm`;1(L$ zseaO4%%zf9nW$>nHzP6;hb2x)IXc9Oi)dt-6`3`lJ`L*OP%f&`V5gKYTtuA4j*|B0 zmWZ!}8E0HsVXBp^b_g!RB2F&DJPs_R!!7)yZy1Xd1NTA&i^q_8%z_b`7_x}On>U;L z2G+pG&GUOQGh&LN6I+mT$1QmIp?~&H!i^M^ru<>?c96=~sAU5CvaIKKHyr|O{1kUY69jQx0u;u`-^;cqN0*P*OQ+IPK4fteZaSR=G!|^k!p!POu zJsHpoeJ}y{VhanLf&N}Rd?KB+P2FDhX`>@XF%uKZVCH%XW*j&zWZ_-Jwh#P}0A~qVr5=Xfp;KP90xfZN6!K^}{K;7|ZVHMA>BVKx17Ws;H5mcvp;SDSD?lBv#9r zh_x_+rxdSXl)cB?)#<)F%B+2)58F23_?6LDe0x0daxbWpU0flg5oaV`1rrY0jPCm# z!YP=FYACzuq`!2?2^G6fQ`ZiN?PKblstq~&^f(5Fhw_gQK%0~5Hf#u}2slOhkao7Q zW|nnmAXFbS?^?jX!kXF5x5}3$DH&>d=6P|s)d>uK^*2NEF&o1WPeqqLL2luGJsfM) z3OEl~REuz<*ifos9%d4fct<8SFVoQ|-Cj=>W97*A_i3YRYdif&^hu-3K;fD`BxtM( z9k;~4znu0!@qx`gQnb|Sn0x3_KU1N5p7kV*X4mz8n4_Y$i8PWR*44Ge-GYu(YJb4C zKi;QO<7>G@Hrf*+L%&$V-V7~=A>Ot(yZDWWzgfUUQ>jBuq_KN+0$YTjq(Ki_)H*Z& zEa~9J$Y3F80DGSLancyo2qJYJo*lutUQ8fp(*pg(vY~8GkT;P-@V;p?c9JZk<5oBU zHiVOKf)oxA@P;xj!!l8Lt&Feg;*`ch9$OE2jVv6A%Q!|RN}_RoV|bt>R_DP(v}uFZ z+Cq3}2S;fvMhTo>q)KD=BOOmJ$>$)b2bQGr)Ou5VbV)3A3hY^m5XN04Hg;|3elf6~ z&I>`^O$?5PFR>`dDQprt@v9x8qmjHBz8W*ifqWy^90~&aU1Yn6$Q$pv!?|TTWyHhG z?HH}(=9L5YVlirXFD>N;`d{|qDZ7{%+Kg*Pl+VVhMwXS*Xly{FrYue98{0QtCYsLn z#3XU~rHGbKVv#rw6~)&Dstbn$VO$u!vZa0RP`|$nH7C$zF-1~*eVO>RW#ZQbhh^8e z(n#0xsd?s z8|p&e|`o*@4++J>zzmZqqjq7ef*4O&zzr*c9HxN1Knq@mrg zuD&wX`8X2Z;rbhIs~-1p=OtbF)`lw=F_;GT5MWCqZ@CMYM!hI<@c}fcmBHIwWSo=+ zc$wK{pA6r?$@yP)`NfwT=oOocDoP2l`HB@WZWb}e&G1Ok56R8%t(Ls$Dy=h8B7q{w2)f&YOL@HYb6&qY+r*P0l8^!e&U1u8@ z9hw-WvSj?~T7Pr%)+UiUOgjW6A&0ZhFk3kRZc@G2d8)XA8fpwx3@XmbAc>S?7*Y;$ z2DJ_yRHD1RcmsgqC3gx(Z0YFkU;`~dw`sUJ9o+yWw8c<}uFO-?0#2&IR<{DB+QJ&i zWxZA;S^gI19T^>iTUB%NH2QYGZQHh%Ep52L6II=lAMC?X2~25mu8j5$XQdtC-#Amly ztRzrpD*HqT3@mP|N~5%~>nubU8S9RD=Et~$`;89n1!^(4v+Zs z2VF!21Is7?LT7N4+Sy^dgi1Ht*K)hrEzp!RgL6?@$=Fxp-{E&LYHq2nq#%$ziIjC8 zZd|BVeFB`Igy0OJ%vS)&qhKiR5A%fw~4{E+usR4 z7MU+T&F64E4XGTua5JtUqzwXjh>ow+PFyybv}F{?(xBl=K$s4(R`toJHlRH5-7CejAdRRijB6C=GlN z7AegeOj$>8)J_~mj<99!7ds6695+E>5;p-Fr;1R+9}EGpBw1q%F`h^(VD;Sq>=xFeh-Qs}UoHql*m zVOI^>$MCTl!dez@P?Rw}KnuFnxdYUOmgiVjqbTFUMb?g!`2}Pr5a~u(WFp0sHE99LshN<7DTs2_c6z2n=j=tdvp^y?t zZbz}+xi9e*R@wpe^N*LV zkR$w?%Pyb&AP%9?HIsZ2SLrMhI3!fz5;_bKovmeksCTW!AcLBvF%5#up4e6Tlbv?{ zTjfm}7X1lV#?YU#PZ$|iiLo*cr>tR-SsJ?J!C|_wZ~9GyqLp-2CB=^eH_g_1Sc%XkfPN9 zxL*1=9s4;*L_&CCW#V+vUFm5{$Q zAfJq8CJ>l|(FB{8i&q(l9dk$q%1 z)W+2#3(H!|Sz8)G)dz2lMpW3yq$_E4t%EDDCy%QeAnVi;6tQxguFZf_!j06$m0{Wg z?UmpQrUD*QvSSOCPt;;?R5mfsqhuO9%cM#QwY3d~Fp7-P?v{-ev=JIQ(_P5v2i_4) zszpy@n579`FOcbTexx7u!d~t>gB#74vgGEGgZ87R#nTgLKv+YllH99@P%Z0&7dDK`|B(apvq)Yu}R};hH zj$rKj)1M4dmrVqPB45)TO>Ns*LNkT2NxD@D{TwHgd45Q%34w(Oj?3-Ivb_#<0NVp< ztY7OQDDSC37QOf&DAe_PT}P$q6A*C+b{dCi36nw+i8Xudb;TV}LMSyWNt|+wZbsnA z4LtKBQil=xWqpZdnk5W_L$P>~q?-i^l2x4sLklD;fRMdSLSWIwq^Lv)jCrcx5)Dzv zyk)wI``F7PK}wG)FjP_;FNBM(V;6Cc*hwiN6ehPJ7BT}5g%~XhgGDEvuwX3zuvei7 zBh9buD(GeC$0H)$ik`P1BO@2#MT2v+D z8rhX1FeHb@IPkkH!^)YgvFJt1zk(ukh>4o_v4sqcz$ApPW#AQ*BMz?O*_&R!vz7*% zq5@fKxq}d_qqzI?rfYCfSDQ%&bVeYCA|aBzaxTkBia@b0!{~(DU!CVv#uly+ z5f36oZAAAw;^qcklRki(A8HeHE@?;uWuG{xM+(NJN!QsfWwaaH z9nyky!ynzR5$b2^OU$lgegzF3Pj!%0#^kk}i<$?++7+H4ABL8jaML7R8m?vX<(K92 za#p?wm-FdeUFG2|Mf0JmE9q8n&dk!;Z-QiyG2w2%lbeMH&b2BF?R3*SHx73r;WQ~S z;TlR38^^e-td%yTYfor9Q5k9C>)i#CiUCPD|B2fgNv0B^#tRzL+EQHm^d$_rT^o%- z>kw?bkb6H1&97-fyzGr-OWhGq2UQ>!!}y#7kFQ}urB^d;BA;Xq!|*_(mwu&$tr))I zMNR~eC4uf3>N#v|72Vnv=07hv)z`8gOwB&p=q+ZB-qh>5T__{x8<{+?2a6rFC6k@$ z^kELtNFmypmCQQkWQN~mCQK$=XvEf?Iz=O>Etdq=Tj;tOH;y?=jg@nl$21P>UNlnd zGHWOzfuQ-yF^4VaIw9h0TMMmge@Jos)sN6%3~+t zyC#Rm@&lVnO$PVv9gH5_ZU~_$*$k)g29}htgv|!Lx&2HmUa|uX&@3@x!ofziFWMAa z7;0L=lZVZ;%p_s~bgW$ECw+iarMrbsm{4MsvVW$Qn^$pCE?)a1;byG#M`f(Yq(#-( z|5jRBNYIGI83zlZ__49 zx{Q-AjebF4{0i0J-$g%b7VhVC7@k~rMc-D?J)y2SBTDfVR6`YOX+2(PHIz1C57zq8 z26TIJi2HQiGV!=BV0RtM3q{rkk@Xx|u1=%^WnXk4h}ba`yy(v&7)-VCObv^CgkZ_a z3tl66Xd{j$0)hMz5LE-*`wT=mijQMZG^P~tP~~_eAT4C-gFZl0nom-HhcrE|Zw=?8 z)$L)!s3ZmDajF$ql#iMhPJFtuDyF<36`70jEhmQ`&NXLA6Ja?Rl`4*suYagPAGW6x zx(i8@21fJaban}A=UCN@AaP~VZnwbmK`m^1jWIDPE|`}6AR3X#(5hi^3X326=UyV7 zn3}p#C9a-4-28iMsRWX9*Ek+uOQJ4-k{K;i@RCUja=!%btEA!MfV^p(!qxbE1FZ+~ zZ=BV2+Fy(k%^|KbpAA?it~3Ve3bhO;zAO!uwz1q37wwyDDpD^}jKa15&BVpZ&dZ^X z7*0YEE(DWbxE*qp}Xy@-FH;;baEp!Xu zOT%P&LmAaE#psEoEcUWy$-;YS7_UZ~OetPcHOmo)BU?W4KwE;P4Y2wOBZxnT1gMC{ zmSq-F+0;MvO%^@m1s|*oC2fK=Nuq5BxP6%lj71e4O%T>%uP1~9M^+d$sp_@J&h5e$ z5dqbg0@W7*;STaBmO3+OQ9);BH}d`gst8X`aMV@D1~OE&UPO5YY*u3$&QY;7b%7(; zSYV5-5f_lmp`4zjf?yQuNP-ph(6Ym_V1|eSWlExjiE_dhpTd*~g**%(+DI>^*42pW z0Vt}m+b3?zagDm&f{!HOENFBagiFR5WK54r(g`V@bdeDiTf6vMB*FC8WhnMr`ON>K zN)x6m43ePQ!=p8Ihe$M6<4ZZrZP#ejaAh8vnMoF>(4pKT{EH}v5UTj>fY%`mhv%B$ zbD`4+#pl9tUW#ILL4%#Eay$B3Nnp_{O(m&7Hu2P#Cfn(9YD4lRi)a92kyxQ8hx+4E znc+c@gUC&~21q!ZxS(+&jHu)5f*kH3f2fI<%185zBG)DXdEr9BVA8zWJkqjg8rVJD zxDit7>06ALW5L5s_*6XT%S}Z_9DwTK@$TD$TdYN%%pSH}+)J1w+J1&}q+|Q|DsdXx z8Ea_T1UKa}8yF}}z3bu|4R6?RH1Q8GlD6q^Nq`b+d25jxjOw0G8VE;w5og8`QR zplqz*Ymh?A-hqQf`65HI+&I7tk!EmT=fP}_M;7+c5I}-a*cTDj&~z_EHS?0Ew2_&t zeHxUhWhkEW;>tRn@yg;L3kOD4-19$*YZ^B}5O*j5{)BMk5s)`U`bQSBNx-je=qNP#hZkCVXX-)(>m(A2SOBbQE=nN7RPA(aROU zo89VjTs5izbQRFz7(av3U2yz^3lS~oB*x)*7d1LuDZ6lOG)Olda^sAz4oO3asTa>s zwbjJENg!7e4Calbdj z+XTHjgq7P{vGSgIIonAT>nM%QV{}_K`aeSci~}$Bhy5!w`tZo-CPU=?(u*L`LDq2I zJbv+RL}rKCnKYQ0V?$K;I#NA>ImKDZ5P?F?B@BA7V+PEXS#Ft9srndDiuAqo7if7( zlo#@Eu!wO_mLiyg{D)hpJVmmpd6M)QRW~#d=Vwsdih{-jNPLgE^^3A)& zi7Tu>$R-2SS%x(6JLwlhL=Q1fnE+ZcC+C(}Um%A*P;9Fxl)|j%PMldyo3R2?LZ0}S zyG#(NR_R(nP!j6Q!gR$Z1fPN&)dBk;2G%mm-ow9GWbfP1_#Ty5{(u8+J|4RdCwXE% zNCIVokN(kSEfxqGImphW24neD^Hv*nbxA@%mQclVL@hf$xku1YXHvV3LhU{HscRa+ zmriNum9}--nz{pj@XC6)4mOZog^}ag48!7z()?lm|D6SVrl{@^))vUfAt9$)C<1gk z9Tw@#QK;8hL5gRkU*L;MyVe)z90zFDS6Z^bfQs%Vd#dmoSDcY60^_1ySHQy~#FNSe zK7746Tc{Cy`av+n7NK;uS13V0XhVe4T`H&@1V-rLA5=k!l=B zl}e>jsid|OvYDF#iX_~yb?c!k6C$b&J4vRzVtX9hFlvHS-}7=kV7KAS>zKAX7I-)4 z-4Fta3u}*Hnw}gY>=*Zv&6|Y;56oqr4Re>`(wRcW%p&VF5DZe)E;Bp+<&%c>;#ZqY|Z!stx-UCRT@fNMWoTwNy4o>?D6*UM)RL5!B^`O_cF_i7CZ!b0}*%rp{ zsK;(@ip?EzZz!JVFmL`YTf+x;!HZa-I-wDu0Ro0T7 z0=_aR>9om_z{1Lz;4IOj>XB9$>kI@N=GrIp#T-f!eA}1em+$9NdKh6rfL{lwv7$cE zH{Nu;G~pAV>@{B#*?z%TD$^K3bXd5KB)nYJO_QSBVBD#|EY(kN%n}lMURBFKs``gm z;!6G0bh-)r2^aa6ZwnvgHV~lkWUA*77QsPD5;Vf`4?DlCzgLQ}L*n6U(+5 zW}y(@>K|`Zd|rrN@FXJ>LX+dtK+F0Y)bEicYH_hY4?y~PWO0W65hK}%&KM2~$7^kb#u>jR7PQylP2Box zo0r8Fl?3BN@l`Q!X>qc5MV;#UlkJ&OI3s~C(A0?_V|wdS?hpCBKIjX2akY5brRLzv z0kp=}ZLqz^dg4|H!+a@xP*pU(jBHzux$O*8tL+k{xZozEYAabpk8RvEkkrQ@6`>#Q zY(xVY%nhyTnyYlt>Z^3^t`QAfwj98C=<$5PNb?h%rLhn!1KBQVYQLIhAZ9f^fidRM zcMo6u1$K(uasn(>L#sJtT3Y9I0?S=8$<38WyHyO(eXk`Pjf|MmphDl?44zW?)Jh$K zWr-54Jgd$77}-$th26=({Rzoa>3w`#h%apO9xPn_j$mTsq#yX*j};B$jHp`Enw_X` zFGcbui^E;S<8Ny&D?3B_8zPc7y5yAKpst|>1!@L1=^GN=8$#R$(3P!VL7C9djB&1P za9jp56i>R98N*mU7cY(Mu(zQS1gaDkfv?*rl}gVzC<(RPfz(POc339~K*{7c$vd?b z@sXSD>1t_}XTPmfNqZ`7rz;jTZeE^sSr~hx-Xwc?MP#V^O3?#RD539X@VyMX$q;lu zKIX*4DFCKbgCD+RE6U;l!iB^v0zhvpa6QkSPT4fcnWxl->T4cb4>M+M3)OFp7+7Xd zUz*FvQHnxxXJsUY=56)QJ@~IG$Rgv=XNuo7J9hpZ#aTsi7&){29@tWm7na`kbD|Y< zomW3fl$F?dh43!;!qm<`5~E&>$YS)%6{X<%rO{N`(U4^s({qHXuoc2G+62KYp;d?q z)pM!sZfv$N?+}UJ$`;?sWK00R^P^k5R+Fi&0<8pfNtcUl5|lPo(=P-1g9Z|>_wKt( zgKX#N^dhvT-CblJtpVr9dLOmOYNM3}%n!9YTTDvIB`ZQXBIBD`HR5vUJ9M%6%4GtZ zVLxDK*c_YIf5%J+d*I4G#*Gs+Ahe>nLgX0!puY9bm14Km@d>y$X=sK3q9&T4#E1XF z+)6#qMx)x8!(VBdLGK~~ja71@4bSOma}RYs+V9jZ3St_DUm39J3x`wO&m`3g{mG@F zjx#`xKa>DyVxHqAtpXx7lLyM62%%j^k`1b9Fnj$TYl!V=PZ#>0h$A9jXk%bHQ)D9848 z=?td6iUyc|5F>qbUFRf{I|y45dH{iA(x~BWiGbW;V#11Hb*!6Z*2<%w=mVvG7zQBt z{_STqMmNWHo^I?N{_|D3LZsvm)nR!G=;8{l*Infm`UYE=Gu4^Xx(LDgSCe$da!(59 zj3C; z%=cc~MZ@qQa6U!|qCz4t_0M>r6^CLOND?7I?l9YGu-F?YhiD~42k}*l3ef<`DouzB zVB#1vjcU1*;Ok^_AQR=6{5(@DgfHeJl zMPnMFZ*UU;wPpxS(9!n_KsabLI%*TchE6B5%0O&OqDu{?1wl${R)-8mbZklN8iDQDz%%+{NeG?ePBVo3UHN73i z1g%>0(eZ2AoRYV@t~^+xcKnyKDcuq+kkD0l!+*nWBYF&mA-0DeYuyrDJcBsICS#~t z0xF)?&+hbiH0h2P_z!;*-oWP~YJ6tczhRzn}@3%smI(SB9JDBqi91t=vzD2RQHE41zLNwsW- z^ch?kA*~)b5XAA%9@$xDOr9Cq<&m{C{XbS2Fi?MC^_}q>5I&TZkPz;J9guM8#|ou3 z=R5v7pI5-hYoc?y`wACKE1$1eehmuqu@WQw2={UQ9uv6E{%_CGVFp|$Y80mC8n_zY z{ZV-G*7V~{{5Nv0W)JlRS7^LPC66saC8J7e^lpr~5Ie}~CTCI!hYi_$Oel_sF3ojS-u!_qxjubBqB3apnd-k5rA3*FL4)ebs_|AQgeQmbIH3qZ-ZI<34{3FMZ#_1#Zbkkejlw7GIel1EPy|@V5o?z$8K(C}H zv1K~jKNU90cD^u6?ASLekC-ti&j2L35{y$5tVGzAbQ8bq$+GWOz?NUWFmttg7hu0T zHQ35e9SX4D1=xoxU>`={P=M47J9Fs3tw0a-!wlW-(9EY}9$xxI21|Q0I&4z*XA9~X z!*_J6*gs*MP+$=Y9N(_ssX12E{=6pVnqR-Mip<2@oq(p*JsmjlfF5{93;c4fl~fIJ z;l`D{#hb-UUIi?{Z>b}M7xR_53`Tng4x1Ms>Y*IqHD>ykF&8mf5$Z%E9r?LyY$z5< z`2i_M2d{^WrNSGBNKQ8mH4enT!v6N?6rS_Tnfuf6`D=BcFL!)28DhpR7}%({YcSm} zP7q?tvr~^#GQ2cZ?JAh%7$KG_`qLij2~;t|r5|1Nbqn0-Ffa(K=;wtMR`5@kA@;IR z$?oSO+jo=gIg(FiCbx^hz)%BN$z2>H9=_%XQHG>64%CCCGG6C#e2fDFC=|UAR3De- zb|RnluqiKM98b@1-7{im703FvJQeNbTo;+COg{%Vg;sEKQ))Fwa}@BN`tzU5FcKRl z?#|;&8JWM4gSXBKhvO{7Slg4uv`FM%Pg>$qWVdMvzL{t(!AUfrvY9}lavf?7bYuh=QJ-@IE)>{ z2QYJ*mkAt}%ak-P6geyb3Ta*{a#$)A(!5mSAYD~uF?1@YHD$nM_6cPU4j_n(2XO3= zF|7L02-sI06V7zVS3SSYkwA1gJziubcJ zX&3rK_m}Sbr>}NjJp3M}HcAF<4BuO*3)D{PhaR&k)*n7hc5--f?C+8l^PgHBr0(&8 z>Fnrex<7+5zyq}uM>FBYOj5uAMu&sOw=z^5%iIWL;-*io{eV^#p7rH7xI*NY^^Nyu zec-8*XjCu|;H}#+Vk@H)&^5OFTn6V@L^J=>^TWEHIzOGET$QGHg@~JGu^+PTEE-wy z8gJ~6Q3{kJr1}2z6bD+jFx32vwgxYgnH21Vw0!Al!RKi{=$HepL5Jr@$Dq%8Nac|I z(Cu(`1akz?n>Y;mN}B~e0zC=!9V#r&*2!Bqz|ziID!DcaKsc62ce4Wp%!<$h1Kt(9 zAgSFHm*u|C>fYjYmXpa_tfu1ju^1n^l0V+89AJUII;Qcv(I|qF9Y6z*r2op%i86Qo?0uC z`hi^?B>5f@cNLNZ|F4oHk#<%9UrO$6&BIFF+Z@B1K6!&D*ANuSFhxY|7@n|x3VBSz zQM%@N)e{Ph{8?@Y0dt|L`SA;bB^y|`nBTy(l+1J|4_Vx4b?1Lt5;N$&Ip=dm>p>_O zzb^O4*Oxd5pDVKedF38Xyq6KxU@FUuU+)d;2F3_D_Vs8u=F3sDc8q z*m6OFayUD4BK#{*_D}Fi8DeL*j8K%ZAPXs_S9NC}8qUdS51?i4xe&@V2lKBDN|t?e zrh($({rAz#VgB1dE!x0ji3%V!p(b>H9w=sFXC!n)eCRO6!ZM1tvx{91HfNbW}nbjDF5Q=!*9Re z?NSwX(8~Dz{*;keN1KU^lE^M$w~&y5C$ncXtBT{%ZdTrbX>CeeK>7epD6tFaPP(=o zKB&4%M6;$$Ri)svt|hCiq$s9fAfAx~J+w!KQ}>Y2Ax3@r>Ah8ml8b;m{Ql{~m$?>! zG!X3N?7Jqfke^=bZi=PXttHls@0|m^C$7{O-pa&)CyW)~2>pZcq9MLR`TWJxADRxK zw2tGd{U~l4aLbG725o+gkM+`D?OqDggBPoj#Q+t048ivP&@0d03~`Dod%dM;cZq=e z)6-KNay?kiQjn#d^z+jP5w^k6PH{Qec91>kc##6$v>1nNa#fxFRaBTQ?Y?b3u?vB% zBQzq*Tc|~I!E!AeA}!ZSgY_CVg>I_$d!^>P{ymm{)nm;QhC!Cp=!`Hr$QeI!o~OQ%iOvmzERl zt27B^A;EkAJM$_HCj>n^|A__*x-1OD9J_5lMsVW<4yZGZo!i{vBiqGBy31|;rr2>{ zpT&RVFF077oO8!DeSZo^_B1EkzvXVZJvdRif`d^+hcQapkx{TB8JV$7DHbH7Y;vlG zJ`Q!@A_Y42WUqTn^8`kZVPLNep7#pJ&iYBK2iJcRIyJ*Pv(F!wsD^`*!-l^c+9KrWb|Q(H)q{A}K52 zdtfMuVZ0l6$cxDsq?Rtw7nZ@<8P56^)+p|Hz!G>3ie{N?F2cE(;iw<45_*EnFT#7M2!_0u}Wjz~%OVVtFGx6Ha1W-RiL*f;gT zAm9}>`v?&kaMlKpjKM(qJ%=@a(d{Fem_CnB-W@x2{84V6!t)T2lG6&Gr@}w!_6?=N zbY2%ZNJU=46b!MISUO_li|z{AK0lgXflVJ)ey$O-V|0}$2106xlVym#Iw(k$88h!Ohm4qQ^ zPIPeol#gV+)o$d^CoPVd7e1w}Qbw&}rAcO`vZc+em<3PS@vyN8&FE!E8b@qQ3oA*o zOss;nqrDamVN6T$dc`jC+v=e`Gs;N4*6P^w-P*f`b%$eV+g;y3nVp?nNmGyXC1MvVmZrg zeWa(klgWIOD`I6#i{mP+rr`?6XP*sdW=n7qK}_@cL`a6*3K3;^)<80O#eQPrpa#I? zIvz5_RAA&eCOj9-mId&xftwG~U`m4=PqK~0=1OaJ8uf2$E?CL6Zs0)0w?>T{*DHsn8TowjllR0|4M{6 zOd3Q}P_k{cN_zt9sqYNz&!w8QILb7HVOzw_g=vM$5(baP z&3AnD)n9+d(fyvBg+hOeQJ+vk)SZ1D(yF%%V@wfR3uM3pb#0>eraIo%{ZNp8Y zUAFFpJLsR&d4qe*{?A_bAF!41kQ5iml9g~^h&2Ai-r*d*-{|V{J!l0MWN=6_x#j8` zb7g@jQRZ8AG2A7lA)Df$-6jzUVs|ZWn|qG`k*`&{ytK#j3!;tQ9+=c;u)ipp(1SrU z6wYwmSCpzMvfVR75;T*546-F8ZcM@ZZ4yQ+l6KL_6m)**_PyG(UR~ z_R;wYi;E0NpE_CFkwO!)fL_sRP6OOnHTBV{cca6%iXZmw z%?TXq_h%DgV>JK30PLAbXpSn6K13E4u1t#y2&P>DumMl%&M}{O54e`o-3B?kXEdss zSRB4nzs^o@+kj)HM5Fiq$EO62fV{j2wnmEG>(Vh$Tqsx$bI7hfTv?y*P%q^D34FiA z+uU}NcYS?M=lu0K{JIZ$f+#mi-N`{j46N_RFb-YnuInNTjFBfDYjAji(?RioY?idV zg8=xtzK*qrQ)g?lNq{LVm#|wyDJ0xJ^aj+JIZ!pB{g&xt(wPt5&8fh!k4txl^nSdD znFI0zSaTQD_-pWN&zdkwvyCIQ(BFXFNP@(hcV8+tfwn7~+znE2zc=|ke-B)}cjMvB zl!-etEHlS-nCrM!r0v#r%EWCQW#T5z^>^W{&;d_8dyMRfXQ$255;cr0JHS!Gmi9X$ zZZB;$y)`tc`YQ(4KdS!W%vX$K-ZOy2cIxE%&rhHHC3zd$Y99ERkzrD0^4k0tMu}CZt31lpXk1XX*eM!SH}h6V0{hAwn<%gni%~O)%IvW(SN8fkoxm zb8nEZkYr^OrwDxrL}9m>eO7hZWf{Exvyg%v&CidX{qX$h_q%_wK7U=85>^l*HCFw6 z--9HVc)f_#IXl7?x)eT{lM-I&*fVP`Z|q;S-%|ck;dQ($*A$$cQXX;6uZ=dw8C`x;7-Q);1DMh7$jB`PNu^hWnqo+EGE9o z<=^G<5X{Q5@>q5}i;0l%se$*o0>!>%T9r8#InPycU#GYzSfiNsn)Ce7yz1@)zQ62d|F zXiD?UQ}u$1H>K#=mUoc-f?s$tV(bquiY{F$= zJCc{lRU?tSsuRikvlbMf`SRc4Jitkc+u698eR<4?ypSR9=@pXIMiK6^#k~zuyGhpaEx(`Yi9>1 zRtZ;ij~1_o$G@JRB7~L&AR8@?xII1d1waxksouxG&PPXwC$ERH4i9<98_+j;k}-DO z0GE289kODh_LYPT>PZINCe@dy;>%*NsY~e?fg!h&m1EG%@qcOG{wmO*I$6Zw+_$}`CWsAIU`F__n?j7%eZ#hGpnKz?q`eEe;xK^=D zfNsAxm93Fdy;w^NL{-EVd|YmmE1=mvQM=o|b<3jxre~XE-Ghw*O-va6VDe@X#sTW&B|IjRO z>dqeK?}(jks#>~@s|R*Kum_9D{AhMe2EVemd8I&4{q+86iS_Srm@Iw$Sv%9U`*>K7 zSNCD7I%BkJYUuQtn!-p3V}|tIJXGpqxCH-&87ndh+*DDioMzGlw*K29NZ6g2OSitG zv%eQZsXjtM)F{dsy*QfA=O@yg!9o9>ct`yb=jhw-#flHFL5Za<<0CO{65Io91uzu{ zFA*N|(JMRHfAVzq`^Q)@=(3|T}Mqn{cCsaI?+7)h66-6TYk=+-dW_Y7<~z zsXMi`RfE_w2-&*?rwc;K$Hd90z0?!_jI>D>!(MgF|FqoggeynS8( zDobsH|56fY%A^}xYi>Nuz1Xn65l^8Hk{26#q!wyg(~Czh5Pa^>yDt)S{QaIuk6wkO zmoL!S>mB}ZI_vZJAxk}e`Sj(BH4aJ&BMA*m5QX|pvKnUWx2PBsNHqPN&@o{td@YqebI02;3 zHHRh_Z(No$D-$9F&~}9UA4Z4{jm7#Al@vTfDuX2gZ+iCQ(b))2#V7O8>uJutQ|C@! zAK`>A<=)J7pTg(iT&DOI!p#ifDK72gLN%aU8PF~sK${|0aa;Gp30!qgatEG3${Owd_`{#OpO(A7 zRjBJt?@~KRjcgV4{ebt=;l_d+s+qW31yQeXd@EznGW*#-irjUT*EJkF&bj>(@9++sCE}27jCj9n9uO&?WIKj%Lw#I&9{} z&tYQxrDtYf;$uc}NZK8B^}OQ#2R9XBhh^hMEp!9IbVJjYd$zV|Y}aB}5YdQFa?Gjc zv*%^7{W#s7ljy_s8dt)rjA<8{Qt1 zsd6J*XyjW`SP`^5c-g`EA&yT$(S5wnfkptspwsCHVNCJR3yPox+ko1DCR04KWdq7> zG3sGyYrAR-n|fFzIWib7segzo5C=w~RFT^MC0gmD18;t1hyv7YDq`#fqlAItV z;L9nxcxPz;jbv-t4z0w1i86Ppfo$Ho+tn`_S7iLME_{=PL4Hw{iJvy0xkoyS!W20ED;GvMVjwH6%LA-mj3Ahxl)@^%t6aMR zF+V>&8z9`g;v?PKymOOb*kSn2pS=z`3owLoy!3SfCr`RG2(#i)#- zLI9KA64f%yuA&qFxdxAqJU(#-S2S#FF6xl{O#|czqQ4tWn~)DHs*?r1af=q2a1J48 zSGU5gN^+R`j3AoRIefDa92VvECnAxU^Y*|WhD2>B#asDcG@+2x^x~`umtgRuBW%aE zENXdqsH|zO9(2_+-Uy8|8xOGp;ZlRN`Oz$qL|p|AF>5`G_08F;B&0kxQ{^!skWqN@ z$H*K{5k<|I<+ad{9W|tjuVsL#6M^|ERLB@yiYL?rd^mcaGZtrNJ@k3mF7{@&xX%#N z(WJpNx-zwC=qskana@}TM(1M0xQ>)881Q}g23lN|a0X4FN{6JD&7=Vncl6;rJelA{_oD$@Wh1P?RXYF17Y!1g3KD|Mr26i?G)IzL8VrS3 zkR1oS5P+pGB@tCj3J^4`(BoW|-9u5&A~8icLI&niI!lR%IaiSrU!8=RQso z5-I`)DtSbz#PJ5EPD2+_%o8BWLT1O`?2x8*D^tPP>0bPUv(XsW_u)~GsFx{`X}Z9U zwwDvp3^4yWU-2!6M08L=d_v^mU;R)F@8LGl6f@HWL*r8^BG^p>!#HY`?-0O3(V&y4 zR3f@hKq1@kNOofEJ*;EkTAVeSg_~*_F$)`@2UAg#DV8`K?)Wk$-b@Ol2Y60TeGZ7=m>)m_nz2PV~u%Qy%10p?bY=ff$vt9S@XE_$opb zO^&=gvz4m}xTDQN=tZ{8Wa{Gbnv|n@kN@``PV?YPB95mcsXEoVf5OKU+fy}e{<3)! z`@kG}-I);hd&-NGjOmXrmt-9sL?)sv(do0)HFJfR`UDO29x!uX|5)IFg|{+;-v^#4 z8$`bA@(+-x=C(Zry)>s`4nMob!j`&0=gg{V{LQ&!pFNhP)23lE#p#?+PvO~ZyjD3G zYhGP0^n!2g8+g>gCI5qA6z;I_Xg+}7@&1E;*VoTbCpo?*$`yPN3&897#q<@61)7Ok{dO0YHA#u8vjU`v(JKRoDOFf?N< z&ZPo3k>_+;BNta7@yMQx({LonA1iWgi#ZvRq%HE>X;9;sU4Of(c0vdmDFej8&(r_qHZyT z(Ayb6BsW>?0XA-hsmwBEIEQp!=R(NWEop<(g%lu+fAPRDBs~QxNLW?k(ia~Qgiw}M zEp##+QS$?l^V*bz(=sQ%)OX37p>uC7>+W@7pgIfq_+m+K4zDbvFXIvGg#f6=<1-RJ3cE6$6v z;5RP*70(7H;40ZWQCsr2`jmFUL6zdHTtH3683kiNyqBf9C|44@V2CjyqMMT-=Nt7h zQC-@Ywsq8(^$UD}AggeOLb<3fNyY_z3i^{NF)%br-^@oHy1|u~JWcf-G>MS5xbJnq zyFxgV;zx%PV0t${Wcj}SST&G7Ktp>h84^#e2>@Qxf%>~Hna%vG1Lgs zCYjHI0R~lL$=%envt?*6wh*g4Nmba}u;VtPS^!Ylu2|Un|7dNw$KOSuwrDrDs)W{W zp^)aWRS18YV34?_V}<>}gF4M@WWk`ePA={2^DV+y&rUrv3xy_^SW8O*({K9*>WBV=Go+bB$|ZYHt2 z`9-#f57V=a0b@u+qj*HzizU)mDEg_AMC6`UGPRr&s~;SzZRyaQlR!{){Np_zK6?2S z?I7e=O8D#Z>er9euP5CX@MkEK`U~_a{}*x|mec@w7qvrq*8P`%_YMjg!RTLtoX2=@ z{2Tk2YXY%7Rbi;LNIJ^RJ30&*B+NcEK}D9odArWqwKZD{qx7@DQUrQy zoT1*}8_m*(zkBw>Zs7-V`i!4SwJKzEn@0d>l&N zOfBK4db#9oDY>N!!l^ZKpXOiw$8^qmOnE>!4&;CmntZsqzc+b@s?L74s%5drQmeh( z#Q1l3OjZoF*Zpeq`>=jGj0`&F#{ zQz`MsT;fmp+n@8d|L3ktNz;FQXXR@2ycaIddd|#CY=@k3MmpaXMJB=aNKs^XW%>9+5_lS+Rl(Zb2v!2t`K4Me`AE7rF! zHxylZeDeByq59*)j!!|PY3Lm8rzz+t{1>UJ_yNucmor%!tuoc;KWC61igB+f#ZMDT z^D!)XVTK2b2F+*b^e(A@L~lVh$fH+rlJc#6UnrXChsUqv1(Rr$I6#liK61^ zpeCccfsW_U4eCP_|K_aiwK1C+wix!x>#PW0WqL^uY(p$iRxJ$!5b#y|Q}2-|>fkka zcb=L$#O*)GIb0;PHjpCt3*)lfisdTeNKVt~k7aB*YfAws<~xukm)>^3w7}1R1noJmD_={<#|*$&Rec zs7`e6M>8r*B+^dxu9IaJWxNi86PG2xxLs zGe5d59L%Qh-h^}L!Qwujt<>HEZnrw3iJA1Z>QA+s7E2ZE#kYJb53#ZKHAxIn!LxeU>#<` z*kkg>{2~yy+Yfy1;GD()BIUnM4;irzwi+@|>=W4T;F!nY{NwAaoYpjr%F#gECxbx_ z#&aSO2jdF7MMqTZz~N+Ig0(Hr{wwXi8uoB%B}LTp{hvpUk~HQ}X5*tTBD__@!IJg* zjlA(dELg*4|20LBdI~TzIPh8SG76%UoyA%#L0HO7@sxnYcxA7#O!*yU879rS(PHUX zFpn17xQ8qU?WJzlo;s1Mb&!R~fXkfCK`f^lQ!nv4QOo$;%M}##s+|Orapsew5m#6E z68CV5=A#bO^i60@sFZYrb<$2uWUK@y8d=5G|7E8I#?jwQX4;wisY=6?l=C>+MdjgS ztlro`7TSUZQlcT@Nz-9R{~Eh(VL^HE>`%6=T%%Wlt26C*RyX32YEthLF2R!+k)p?1 zA2fcu*AFt_Nobluuq5d$iD+Wr$1=R1v%}@K^4Q)UJPf9YP=X_QLc+T!`^Jr}8{60=nh{a8;U0^SA!^AT zS8%91LqsU*h<%?uj^l)Hl<7bf1M{ibQN$Qo%amgH28Pk%njax5yd~$2J1ka6-b_-?Uz6dc>$`KmUZotVu*WI_YlCVXm zVs6eRhv)n7?AP2465ijH)3J%oA78^XZ=h|`s!!6Vzf+#^1M9voXBK^M?Sbo)Q)~dl znY^aL8414#24cZssJ0fNFYF4=Q;+cvRx?~FAK@*TArBvNZ`Jh&-gkAKZw0QXMAs>> zZXT)hNSm*1(+>y>vEy*b2VC+Ih~<&21lopfpe^u$FeK$UH??jLibx!ooZ{6LMb#;? zQUmw9Jwo_c+B=xZRdywkpLV+2Z5Ei}TIZrOAvr8F(6=~DHDSGw9EMgkciq&EfLC>t z6C_JdQ&a7d%GZ2**qqci77VTf|MwHWEtBT*#>U@pFAR@w;RBBYe)uJ2=Tu9u0=Vae zu7R2OAprb$&eaFuTgmC`$w{GL^mF~)27Ewb;EI?43 z%_)h=_Gy3s{NFaN+}*hH^#;E2!$vcZ@{Jwhe=O1V#DQG7%Ldg9JA`u9B)VtcJe8fo zr|k*Qf`WfT&c+pf!H1(qC4TH1e;^gvD8>&j&~0zRbw(EpFjc8EJE~uCdS2lj7}Vwt zNG_B~N^^6AGe>_vqGK_tpStC>(3M9}jh+#BBK9q=k1nn+j_^}qGIewc2~xL&eER0h z(cDsNXiU~Ffk&$cv)AWyyS#?`ndfLq)2jw(juluDy#GFcY6SSft^*Z3JM6mLb%26s z;;h*i3or1;BzidJzHl+ARAKyF5hyleg*|g76tK}D971urlBVLe?Q8Zgcei+llOMNb zoI#(NPyca_@T(ut$32|e9E{En&yt@PPLrk-;aF_DHDVd)g1CH3rzi{lI5|BpATTD) z&hhyS&x;{sg!O<5KDGO+gKB}qqKbWkFriuuXSv`dJG8U8xrGP(s0Kpy7-HYcj3KBu zURmar0z6|vbGc0{P};soZ&tiU`;Bx!`2t{gjy%wc<}1ApmMh>= z>C}1N9UM-qNeoyTsqBReJEV1;a?Lc+3Ew@>r(|0|0P|cYRDXt?IJaHcopDnufqFIu z`V7X|_#95xV{DrBjf;@{Q!`jwCX!c1j+nW;O*k<=JVFe_nfVaA>(S8yeP`p~8TkkO z0lx~JVMHQr5NCLPQq|+lqF9fd)?bwkVOpM@;2IOmQ(Q6tFZAP@W2{QlII{^uOCUQ! zUG@ka@!o^eYFI3TuA#~ErpbB?(0~oa)yV2bO*H|Hz7&nplZbfzWstughzSvit!vZh z+qC7g%StUE{BU()yGq1f39egJq+%#Ra4AHjp6X>igW>5GoYj)%V?36uV6FPSV-`$I z-;(VPVG72Mn+&|MN$KFOmgc=Gp+F9JgJY7Ln_u1D2Pz*}_Yjf6SQ9R7|4chs18)VO zQ+%Tt@_-%}G%$EZb{&<6h^ zhMr)X$hPt%jB6>@?UHQHrQ|0B$Ws}LEk5HTDDUK(z6@W@v!RrI$jFUiJ2*}H( zI23h{Y+5Ba-GzX>Yzv51MRj=x2NiEdh_wv=_lp4SWIWYFBelSPSdo_ru>{WxV$CIQ zuK)?9!e{c%;3E)*{i7=oyue4{^rJh#u>v23!`Zh?|IP&yb1z*0<058+lBM~n=@G;l zE*S5_Iu4TyQF@s|NQ<=j;3J;;$y?mKF$s9hrYZsn4s(23)PyHo{`tU{cmx(ayVj;& zwW!pX(Rfi=u;fJ80E^Yon;N?LGvkg8P$A3J5W8gDP3FEgL-n_(zd+wy7QunX;-h(% z8b6r0F7!o+pOy-cODA|@h1V_?a7Q~qc8e z!%N`6hEm9|sXDEN3GCqf zSixiPO~-bwW2!?#EG21Kqu_^yHm@+324#(bBN^0E3F%UR2AW5g5J7|Y&ha)uPmwRJ zh>pto@@a?p2nZT}P$URnE`KKK1u}Q&1`b@v>%Vy*TtGk43mS($Qsm!&4sH-W(h61R zj}-Zrkm@n5YqnbYwTI9b@3heapCSnFDwfki0M5xY`rXXtoOBVhIRREO+b5vT3Gk`R zMt6zd!*HKIn2W~y2|VeXy%Hrpxh`tu6S(PLLTrv^TPE{mo5xQcY4yUfLy|1oT*An* z33v7B*}EzB*ihWecFHo5%|t`fM39ru2ApJ9li0EiwW!hle!6V?Z`tcQT>?nR-LzF>J`U{fO1@_wX0+@2@ZOy|U zACsl=k^TXVEk-Y0-8av{^@*f2FrdtuqUB)2jXeNW zWM*5a0VqZi<{$M!~oP*%IOX)o&&A`=9K6NF@D>wN_aU-`livV}7BZ4b0 zZcyBUlNqpPQ&xQ0?4pUfz>7S%>8q9cQ@Vqx&-Y`59ZPj>74$&-61M{u?PYTlp#x!> z;1#RCgOGpdZr{3fg9{vPuDca$ypFY($EdynCFxM)D7CvA+k=|Jz+J8ne^E?&jw;Pw3+V$(?;f^R!rqnaJc| zg;25wMQOdk-OVsp_PR$v3ZuN?;;S4S5TJ~4-w@f%%urFi^nG6ffWzA7j4v=cBw`Ua zZ;CjN6mqm!;k9Mlw?7|4*5Q#rPn5%h==&hGGEo1p!BH}9Jf6X$5;6de4?H6`BOJ#; zndDar%GtSP^K=j;?7o3Sy0d@ZqT_qhG*OBLi^q-4QfX#mrE(qABAcBXyC)2$2o@ws zvy^$li+@|Uhln_j(dv;mZ?RDRfxV{-2Gs$era(*P*cZop#u=qZz*J!|ylI9|C(>y$ z+szJ)gi7@muM&dsvBR!cF0NfK-(n$^!PARyg8RX1z>^QIWx)*38n>|*5lsHiNchC@ z4?aGAyOmatU#>E~8YV&Di`uuaN(z_MYgEgv2I{WogyN?XFe$i&Ue(z{Bf9nG2 z>axtpv>H!eLn-J(*7|)2+>=9lv8oqgg$tl!tN`-$)xo{+7;suaq3QiP9UT_Cz|Vtr z1b1`q(-W(?@?Vw;PvDNl^0;I}5zId!XghP4szB>dtv!024j@bp0ELVW7?rm=joRVD!Q1#EkC~=rX9B z&%HVfk_f=)r1L;a3eX;C$zbdSTP^|f{Fp9Xc;ethS9)o&$yT0$t;ag=OM;-x zY`!9)r6b$91RdQ|VBl=};@o5JFKA~Ocshmjy;fR)>o+F|)emAu$BmQFdbc4J+|i70)(OprGX z64{0tUry}&i9)r;oQc=vh8;5=xzG>;*DLqvf<2OfBC!`kLt(HcA*Do}!K+2VNGNG~ z6)J5&fzWfFaH9y0ctjIVIQG$@T7OrM!=|#ZO~(`o`bSUgYKG{`dqclMcOx zODn=4>!EpRxMUb~bDx%_d&VvIqXXS?2OT@=ohH#ki@);p7~RCdJQWGP&B5b#9_~MR z^z892v{N9~H)YhV*irfct^Pzrc;FgCl>4^Sfux=cZ#qkj5(pLxe-d!t8jipjmT$57YT{Ex^OFGs5 z_w+sXcRu5x^L<^;`aPY_^&!RkdQOKLEJ$b2f6`YphW~}}<(I5+xQ?ey={bb|!&31R z)+SuG#%%d7EG^2kmFf*{N8#cUqiQSC>AnRxhEI>~TbqInWx`K}$9QK3fdAdt^V#!- z-oI%E(e)$KM|}|^B&Z2PSr9cX7@HV>7`Fk(iBU++&zB_}*1CMp=w$ zT)37dC9vIvcE~qgw>yKqEv+yAj!9b>-&!S>mgt16i)X6$m~3ng$?beyoI`tpo0QlPlthblXZT!nIPzbV+A4gq`%??OFv=0U09#()ci#ePC# z6d#F`KZOls6DQ4C<+d=05+*RWz_l0qH+Q3h{vrm3`ijdObVph8WPu7h$Ag^;8)U-= zVqja$OzIS&KI3=WwN*@a#yEjWVLI2CM(iM~!PxN8lV!W7Wx=KkeFn?=5{Vuj!MW*N zuXXFbnUx_nyble2(k>x)QDv31$uSZ!`&HC z^uyC1hc6!fFnsy+fA1=WN{5PeWf#?iEK&+kbgi#Ikr(|1P*9wm=54?T5@HaxaM=(85&<*6cNzVtaOE0DDerj?B`cPag z;%{tGG3fod#zct=`i-Zr1qIb26uiF4ehc}Z00qU32sIQuOiCyk$R|KSal>H^MG@~2 zC!z(j3NH=?)#8Y7Q{m7kA)jF}CuIPh01P+kUZFO&nMkJZYS^% zP!gpd7|_5E4CH*ah_zB6+on}3mkR>)K-;{|o_|+g)HM5IB78ob4u74^&+tSjksxpeDLT9n2ADty0tIkWuD^D;iVm6VV-}eLh0UCRb`ahj!R_#f0Yn|{Cnk09 zj}Kow<$D3$WnMo=(s&gfX+C5unIl4_g*ZEmwV`S z2wY}hujePaD~mI{&93|~z(>&K7^|BDOiYx}k0W5LZK*^bf-poL|0eWkQe?bX*2jIpR(Mj<4=Q!U{3wbyKT)VZSF6}N&T>zSZ0pLHXQ*!hYRXG6tgrk)4 zxIdqi9QK{L=zwIWP(E#z|Lk@D^BmK2gf-~s=z||ZnY`tZplg=_o-Osz=XGVkS_hx< zffedKrs9zAv3XM}9vONL9`ZAR4U7QAUcP$x=s(3;bX>PJnc`|wu`3Lkq{&9neV}p~ zMESsDfxz1kxUitp$GZj*z+V!o0hA(!3#5(yR0{Z0Q64Q}Gr`>=+^v5b+%3Tc@8Zha z7NZ4h!QS{D+g|C6=h*C~hN%FZPG-ZSquGhs`O-YNs_o|7AKAv+CGhdcdYtFk>)g!4 zdxGg?-}3yOapv7z$}9D5wR!LDQE$}SMx2HkroTGQyeA>g*J>8V0WqE%yJ$2Fy5Bn# z%jg-0W%LZfGI~a!jK1z$M%#B&Xl1}O&s1sBpQJ}GSG}Um0tV?H=;H;8cx%i~&Xu{v zyRLQS6{;mE6NmO0|E#$dGb1w~)6e=?6<{M4k(rJ|Ei+D&sm(8&OrF13E;@wAEyGY|UWp>7wZlEf2@82J# zW;xtIR_0z014eG3D|637HgapidH|QyY#=PFj>Zs~{z271S>_($geQHF8%V2Mgp*1i zftXkYw8xL z$_&&+%`jHh48%p|d4P+|KwDNl?9krR^N}0qs+o0yU2Dm0 z2&+iHIrmmWSkn?MdlOf5YqHyA&Yas2R`){+zvyVcAIxj3gkdo zj(0mOBj|IWEOXC8HgW@LRX40p$PKh*?se?g(g(RUaj##Kwae) znakXUypvH`Z;{)O_g$UakoU04#ogUXBp=tg4S5+3F15Vb-EPSHZiFj@{y}a--orY# zA+H_YT4mI2$jf%q5{2A`yw~3q8X>nK@Abnfw;?av4Uil1!rGiafE>t68o}Nka~t|z zqnXM-sN2wYCuQL;avS=ZAIV9P_=oQ--ahk@*^u|$A@7t~UF0_8Jsekc8}g3px(#{XjSmi! z=-*@*%WC?bpB90H+=je-$|-%2+mM$LDnf2UUULmjBf8U&m!2X?l>p?1yyo?g>o(-A zjUzzjorc1&6Xtn{+=jyE$9nWi(2?6vc={ghS-vzNx1q3XZhRjPwUJv>7_laBU0Hd| z3={_W5%3g2a_oc5hQJJmnm)*F2&@p7rEWuDGg&3bUo`~AA#4JSPJI;!j826-W;XPd z88bKgRiH1bn(Z^U8pw;xHzx=ySZX%Zy>~g~5s6+WALKUl+n>G8TOQ;F`mxWr1Cc+-tqBNd`Gd?rK-7e}BY%(?=*P_MoX0K& z@-g#9l^Ljq%yFgPJPgERW`(7P4ej)(uY*RT4ek5}u=0`H&`!RSrEWtzILOG~odr<0 zq20SmEb|Wf<~aC9BQp>dxXAvB>eIJ@IHaqbINh~#v-`HD z&UhW}ApQZ|nmXfk^WtJYG6Qu8m$~MWbd|Y*JeHe$kd)if$6Z0#HtM$YaUUXYx1mq) zV`1HfKH1^MAUE{EVxAn!Q1{Ui1-=f*cvK@<&VuX_KB(GEp7FZ*gL`g0dB*EFqxXDN z4fGKjk?BS=WY**f;tSmNs3uR4Ud#;S0oWiknHi{q%-U_0`3-$OXKW=6m0bQP&ef~hAJPrgv?z<+po&twWZcUz$iB5Ho1APGb{3xpM-Q$`* z=SRiz#kw_t_Vbp6!|fi|c-~JJg@lamagFG5)z9iSXfB$UWd}TS4)G|Ev9$PM%MsH! zi-ptKVm5~B(s<5*1Vpdj7EBdt)(2CkVK?vA9^>>srGq^6L{1ZgioPii`;Oc453 zrlyw4+zd@|d{1hcxf4(*#4-T~7;tvO%B5JQ9yX>|)nn^V5Y2#-4@U!>E!;GY1OmpN zjTx~Fccfs`{E$wGQx({yH^V4NzS^d@czW%CSf<9r zeEK?dHndd>O*>eQ#Rwx{rz*q7l zu=*6vk{^bk3L@>D&mfY}$9PzRJ_dJ$GLGuVM6lxo8ZGi>(W($?%@Guz7U;}@s^yv^ z=(JFO2&d)<-n>DC;DAJy2^@hD_`z_^#RwCeMF7gkRRLl*31!1zpcXr_*S)|QGwxv{ z3J+sF;%4Y94=}!%Dgis z6~kPH!7JlXDc=~qwR~_k6XhFvNAWg2EG8`WZo3t4P$VF{6uQ!2u}n>7#(!#R;-cW4sAMCe1|7YFZ&qnjwPMTOoKbEvh-(FJZ%pjLXF65 zRuFm@*B`Xj2>m&nU+WLc1XS`?6=ijwr%zoGi_uG5{DKD)ZUMc!gnthC?U3K#pi2*j z`TI-6rv}*cy*;@;6sp=n4HoRd?${0Xz7~3VemfQ+x8JC_UDqfB1B(rs!)L0B=0Kl- z5l&!pjEsn?S2C8VIs9;Xz?nc-F`t1b6Az>TXZ*exZ>%+ziB!2lH*tAZr{1W~@o*Y& z4twF$dxCepWde5t&ilCIRfFtLU~ZH_f8@Pg_b2eSm#O)UZ~{?L=6dnaa8N8$OTz2# z%NE-Tu}r;az7J=ErA#d?--lDaQl{pg_kGi`Io`H14YS5mZsKrUj!{ZmHUGRn?2!*Q zYyPn^O@0}GWX`H+*{1OwJP^Eb8oN8 z{gSy~uFAc`+&e3BF(K^=ue*n@M3Y6DOlSd`P_v-vQgU%kXhLp5QqfOM(Ik zpJ!Yfa1`EghPPbtF5)TSf^bNPoE+1^8bqjs%+2%{c&o?%x95ksk~j}?bP zH{ppbm|6^OcZ5LrGhC4D&Spo`1v;<$dO%Qwf|0myv zHl0LV9-F@Vv{tdLTudAtXq(ttN!z)YSbJ5m8@ZTxd{wcVxtN%JRk2&Sn7DpbvD>+r z*nd^AFLN=?gH^@ujjC3mF&kJ&1HKG0*pr&vi)} z_jJH2Q5r9X^sKCT5BFv)y!7z2^f2>=E)6kXE}1#G20C6xV4ui}yo~cPpce1E-XRO5Zhr#HpEkx8SoF^`z7p%Am}kB;mmd^zeuk;1bS0^zerj;401nJ-lHBxRA3z4_{aTuH`Jy!xL73%Q*|I z;s+BRSS6!BcEu2jp{6dL+KB}JI_-(o3}3y#iP!?Ff=;kI#u2D~*ejKAAkV?@F6X<$ zJ5VP4s=|o2cgZg)-DC8}{&@2Y&J9pK zU_QmYJiKN%)ghN$2-02Bkc`kb%Yz)~yaR3GG?Ia-7;PPfa|6dqVi@NJ-d5tvGiohh z!tQz78(8@!DX(VfsUOe+-J%1GC;{y2uLa=2VnE1#S8Fu7b<4xvE%%UZKeo%3FP{C7 zqEJ~!M`yWp}Y7g4^#n0uQB@S8Y8}CpiZb?CFx8U^oBV4-U^^&Om@dV*1aSx3Q zcLcF=&v8@mjE@=F%}%+mj1U;B!VE_5(QJtam?`lZpIuywr*~)wmum4stP$35=jCqR zz?OBryYl=IUjBBk|5zA-G@d_tfK8j+thY1#TioWO-qROe&m%xBW1b;#Q%I)gkDhjq z@lYlPI6t49ozJI%A4nJYkDS52jtiQ&25VCUCQpAul+PtAvBq5WEB4(63JH&1k9Xkj zfUEh{XRrGY7|O)l#<*l-h>U00>9f;kIPQCY=XUq)(`PSnvyo3A#rd-P`*%S>HXr2zj7TC~&}D z_Z)tu48wq`76xmbq`=+XZj7@U&c?}`jjudxG}h%zXTC{C8&6_SFgGGp4@3$Z|F)y+ zyXW2Whuw>(FCVQ$)eSGY`{e1$G8}~A|EJ@($0zR)Ck{keSsZ;JT_p#wR2!vBB-4bt zy>1s02~n!`?z6D=z~;AUimMtC92 zV3KT>&*56^W4i>AJCb_7@^4t16nKeC1c6sKTC3V%1Ap?A#OJHZ32 z`qUKmDm+pTccW)N!bJ7stL`7?v*}_o9lk%ioE|VONsE~68-FgVXM>B&q*tM_unbE{ z%FGm+rKB>LBDV1*VbMMHro5=x192HG#UYkfDGViaYlk8HmOgtNaEf^>676>n23%w*gJX{kd^0_v&=ZgeFZ=DiV3|m39LPIY33bM>mNd1EDqL>^eNV39G zirdqvw7~|D{J9FO?wOftN0n93g^a3+G<2Obpa>sJP8m5~qrosNG7v1i!3T!R^vi#1l*m}9enwg$cd81QlIXpd;J#}CyN zdz3I-;DinCuzpw0Uh+oJ3EY&fpfG94Lk90&;_V~MD83MZxcOWRQSfMy)~}@+z!pD@ zHjJ5w)8)|z*?jg-5OriW!h56BGd)|1uHktedX^}@ioRGN5#FzZBLlRR_vB&Dx$r4b zVF^wE6w*{LobsRhr>Gh#pf5PShW`{&?aWSrtkj!WEPn@IVcADNr7)=+hL9NcuWQED{C+?H5q8uP@&i>%v>9^$O_F*FqMu%`>9)S*?L=& z(^$ylSj{kQZVh;0^)7Y#p-Qv+7W2?V4OA4%$f&_{<$MVW8&M1U%cwMO?<#iM2cT!< z@zWd$@{O}TI2N!2u)sUF#>W0s(K!HY?zlQMAK)RegS`}3Xvz#|+qgny%i?;?)jcvf zz{X=2e7S_N`K@_Ki3X2>K5Y&F1p;~Z19bbk*L|2S7<-UR`HeMW3jxNw7*FU@wlwP4 zvBhLD8;-G`f9u|74;r?vP_Q(9Y$hrO;H;s1fn=$36yXPD_0n7%2G|~)q8?!0{t8dD z1vrLD7H}Ak(-G1dLm5XtVI)0Hc&#f8z?ykxLrrJpAhQdU1BKp2-)dM8w!qe#{r%E8 z^lE>f#pWYNF0x_1&+Yv5@>?|nl@deNy5k|NHU=hiDV`;Km!_4LJMG%xyu8*uc<=yw z`s%|N+P0xEl$d1Bn#^h;wz@aBFdQre)J>K;M3K*>*8|nMm?7_5OOPySRlho5+@m## zlRvN7dwAFQ>Q4C-6@VKUEwMvtm>mvgDUJzFWrk69wsL_wrspFn6-j08A359nkW>Yudd#2PVKQN@)ozRmD29iq zkD!U4X{&c;PhGqBn`@v0dAosln&IF$cSYnh2(_JM8vi+*uTiIX19w>&8Rodm&QQ4W zFeFT%Er2u+c=kA$rxaL8X&f|MN9YO2-?mP{EfSXoIpu|RIMi|XZ^aZeoG&|THnPX$ z4K5KI2lz2No*bUTbCekzWeV4Y5jqYaD<9gi4reD|&atdgPB!~I(0Zm?nz+C4!t@L`GIRg1&L@CIz zIoIx7sUjmWR3Xj0s8S2WPz|;6La9=E_c|_^zz117)xp&YM%qI3N?fkkhrj;>4tJ`F zXCt`@N`Y*8THRBK-gorT^Jak%T*(W(V|=ccUs8*Ge-V`rwo_VaC>A9&Tq%SRxL2Hz ziu=A)YX;U}@h%Du2B$DcrrA%;tcVR$BFi2@q93CLo&F$7>G^^;=VOqn2twq#9oxp0 zsf@ip?7z)ty)*|Y1=T6WcZp?F!E0NPPi|I04JsHQ_maY8Y0V-pey3uxiBPcxHKCb; z63j+;fI*owZI!bcL+6As%_c^VZ~(BnNcYtej%swftbkB3n(7dmOkZ80)JDp7)hVa_ z>m{|U83k8P5LE@gpPzz*VbNKdDQPLPX=v+Ajh!rE(|TZJ#qJg^pV-~r?KVcoP-;eJ zXLAOY@3u?}q*eXrP3VB#*X#wXY%d?d`S2g-xYhyhcWNQvWrPC4CUb=M>c{82<^cd1 z;uufwXaEu7jhg`33lXzo%4-K;`N_#4rpPx?bMSai>fmc!tO0w&A0~A0#`bRjCkPpy zjzyN>ZT)U|<8&uF_K)B`ak#AC7!^Pkk{(-2#0Ne;qgRX+P^fkYL`(|3eDw0^aQDRv znCRDaA>o*TjlYIpSuB{06o99N7A6?~NHlU2#a#z>R9LQHHNXoCI&dSd7@L*$8uw6h z<~5!H3Z?#{h+k5MngR9V-3(W>ums@mG5t%VN!T6({vanx_nW#Pf*vXN+U0qX{5| zQetDU)A>dS=UUzq*9L8&W994JBYWON)%~TDjX^z?(5!aV8wq~V53hPrVo*IBq|FyR zqYXjbjgbvM)!qSW>i*cE+EytOM15%zMiFfBxO1tviKkXv{TA5zq)f!0th5&Dmf$u) z;zP*=FbuT`$NqP{1EtG?-!^A*CwGkXecc6;ZXoPTFtr`*Q`v&4ZNP7~+;8dtP*3~G zkzeu?D<2M<5W!qw`Mdil{^l1Pw#_C@+8M*)H)&S+7s{*}05YJA^kmEzzv7xtPljKO zXy9-wJUaV@nN804+A=rVGS3k}E5Nwf=Kok_f7NEAi9%wt zj$sZO84Gzj1hKy6NB_nUqB^H5|I5XlXg$S|v(T!Hxj_gM21qW?$ZAVeSdBo9-8k2O zL=5snoaLE<50l1p+S#KSBt&6I8uab#A2uo%k>wNld}H&xXm zj@zc3p;2x{dp4t%+A9;Ssuyn{X>f`{n^_=b0~@%2gM++7V1))s2x4MJCxkXBb=4Tn z8s-g^VY;%_B@l(zLPOh~y;Di}oYmc<=RY~#mx-08eIAsASTEcg0j^yH?@UHS>Cc=A{O@PoXNWDY=+G>H!w^Vp9QboDsBlHeorE&wv(H$V!X<57JA+D2 zIowgU-U-B2V$adhAl)JOh1G%DxgJNc9-0njq=8H(U4HuU)zk0UEw!&_IAt_GM!RN1 z;^+^ixLG&UoyIa)4fJzulnn3z?cEdO(=_tEP9}Xz6z`h#5B4wglW&zD*k>YBK76w* zTs&LFRv@*BJ5;Wb>21FRX4^0ZylG>fInD+9=+Io z_-Yp(YLB1ozPyiP`(-32aylIJN^nB&R>KK}%#|Je5#QkktWg^m_1=3olEOnIn}p4%^JD5;a27L@6WN~!W8iw+ z!N-)vf^j}y;57hEr!0%v0~2sXz4f^OhWOKThR0MXMyYQ3$@dx^@eDf7OljaM+E-e7 z)HgF!mBThMMUX z@ZZhRz1MqD$;6Q?w9fUsn#^#p_zw?Z)?y&ZJ43lW z+MwCG4O)~%3`qY%vQEne`55-2E&kuQpSl)k#}j3&U|5iZSgja%kz30oP6fRdw4iRZ zohznwk4v6aBR*&Qp`sdNwOKd1LH0R0Q{Ui|04FrOC-y7tS@1`<0t*yr*_~A|e_7^q z)Zv7EW@U^6jH}s$P~v#h9TSu$2KWyv8ur;|b3NW{*2g?&@@l7aqYS4R-zXVe!=`_E zxzrpI+Ll;8KM!3|0A0C>OHUkGJ->?3&085`c`<~UYE2n|p8@AS$hm@1Wg%X{rdn9Q z^X6s=22BDZ2yS*R$X{b@b)!1Zz&e_wbr}k`Wg1=Fbp4bh3HBy&|5kZwvsDlVO0EQ0 z0jc3|$V+hPhV6Smb#8}Y-@>J&X}{eZ)!OI{Bg z2^v5eaR-~HS!dVT505N@Ts$i@neJb89n*i~`XCl*zO6H4pP*9E=FCliv<-<@eRCxv z<>tKwkkRwG5KM-5)n&d=Nz}`iID>0|um?@2*u870lx6oVi%Kqeb;G_3_#rgS7eDRt zRA>cOY_a3a6kp!okOAB+BR?JaA}k1g2e}EoY@0Z1x4*F<-#V`}rS zx_)mxm7CL8bk+BSiHj=kOpumfq%COwaA^l&zkD?zH|Nnefn=D6x6aPrf3dQJO|_o8 zA2?HiB+Tx;k8x;3CnFz8Y7+ZlEFtI)$863N$-G$@#JR+zdZfDdO1EDN#mP0CdM#h9 z;IdUrCLVJo+}5a;l&O)_4X7`OVu<&N5BbQft^+`rDJ>+W6wq=E6Hoey<0fEwI<%4y z>?F_xUMrB4W@^v|Ih{UpyCY}A>sH1!24NviLv1*zIb=`~!p{=I0{j;oBip@zRbZvL z1qt^x^_5yv2|FMlONZf8e2H6`N>v-w6;4jMyZlWRrpFLCI7N+30Km7HJ-8*4)5%ng z*Gp--(;NUTa0{zxJnLMreS7SrMbl|02Xy$G&U0hhvOU$sg-5$szx~-jvxX0rGt6O- z7Sx{1qtSc0hcCcdec2z(->@fZwBJ_&(h1DP6FZK&G>zkY+>0KK zV3xXglMt|CPk%eKSR3#H@OVWMYO8WkV$&nj;;T*-DH!DLgj11JY9|a3W}S2sQj=oA zFjus0cCd|MHbJpG!>y>R@MZY(pZ^RO+v)tx2zxo~1L0$R4o!+)SKaJD9>u&3KR^6{ zjl;mLPkz_|&pUhLPW`+FBkPDZKY!j>iI*V-Qz|69S8V!f&ofEk;mCAzRkf*>NR@L~ zmpv6jKq#}T5B)?i{4Ou+0oNdY#F`d8xAz~@u$C5#s1P(oKC<$Men%l0&(bf$8hfnRcD?A+8 z4)Gn(rCzr^yBNbZBm-97Zv_&uL5(ppqlB|rZ<`S9gUoICaD<@ixJY-o+q!)NuRGY$ z3@0(pB;b+)i<}}~8apf~ALOy8dbOn7?1D)A9*TXgj5*$uMK>fYaVs)yf4EffkU-5< zU{yuR-=%u{Ck#4+Lsq=8nEOQ+#HM3~hgRe*Co@c0e=1eT9)a#t4FW2KVz(n%Mvw76 zLTi{Hn#|>%+HYofaupx=^d#coxLq!XJ*8b4u)9o~IG@cf0xMu2-TzU9M656FcilK zVsdc(Fl2~j==2HEJf9BmKvJo6jN4%YSWZhy9+$r3ZjK9>JyrhSPu3#VC3O)y1&6!0&(k=^Ukx=xzYYLS?II^qYk3v@??mA>ZN$# zGkr8`|*kpa*gdc1qAr0-}g@>O~Q1IIr#%8TEi|a4BIE zQVqT_TbC(6A6-NHz*XiWtplT~2P zx^GzKKKk{r2{IK(BN>CAHg`kaxZt428!|YH55D^yFnWz zBkpwf=!krLALm-;EAjs9zBbojWEnBcruRE4n6?8cld@Tis{>h>MFVOwk&Gnjj-U3*V8dL-2G|fPr6GzalvIMm zm%dT-!lf!po#T@sR@(=d?~pOvtK|#to2DWg4GfGF0(1AVcqR(&0&_g^cshYq1t-6_ zFjKTK0xpbUP8DrKCI7z77)~bC!w<7JGk%QrD9W(R(A8Y-;No&^6})WLbKkzY_!p{# zuej1b=P6A4sj8YA4#y^48}_p-P7NhWCe}j^UaKE=*K;KozkdkWFL`I9F{YKR);aaQ zNlqtP(@;GvZTVm7T>}xc=QqnT#ui% z=xl$lckmt1OuLGRjb+HC$4!k=Arvu|TEVO^zm}qX<7W#6tfSdL$_kbCFt(JnX#Or%Mumg8rWCvx_uC|IXyj{K3E<+st%f_epngwk!pr=B^VV=lNd zY7*b{{0Bu4s8>=+dTGPc7e7qGX^CmQrHTual8|7;Dv0Grl!BQXnlCFLN)(a;I@72qfKIRpG0|m;9i!_%`@04}BDO9Lq5iX%dd@@RMRC6kh%%~Qbe zQh;C9S?Shr4Z>g*1UcRWbQwKL>pkKbv(~&GvV^70GpO@_$gPA{ z^40Czn|v^Ny7++DGI$nOl&5>fKkd{V+9n>fRUoxbH7BriWk=A&jHU$JWlVOU(tYDL z2+UA~YsIy_$D5m5Yd8RbE8PGgV6^eU8bP2Kbr@^jp3v|(l%F+GEn8&4qMx;Zopr;Z z;^rk!To*P!eEUK!>$*iG7ygFb%@+CpJI-Fs&C;zI;+)s6iN%6I;NCxu%3d`^N(G+R z_(q6JHNxM%$~tMt^rEOKjfJWgG=Ful^29>tIa)sU&nL96(~`yM64ke=74M>Haz4td z7tSs^)HfzJgIJHY0iv0Z2jy%T7YWT*lhjoQE7%^bO|w8swXAlV+I*E6k+Ey4mG`U6 zhEj5Q?%0l9&#Vy4?Dzmq`Y(?{W=(2|L!aE!tl*R0x&-VcrE_ca_zCtfP>4N|!Z{e-Yz@KZOCqM^JpMT@nwmG)#)H#gp-u2bkrjxjjP4#Y| zUZ0(u)}mcT_fg~w!qa@gK9ORzOVr;0_3w69){I)_W50&qdFkY?LL4=DGe0#+%(W#k zOkq15gF?d4Al5#*mi>r$;&^xO^mMWpo0kopKK*mz%|6bKg%9Z*0iREcHlqdFJs_e* z0sK@zTtr6)uOs^xcfG$vBszdTa=h|@YQokOkP(1pdxQdJ4v}n1rKN96P-L6I6G#a? zHaC~*F~RE|;2JSVddzue{Ws*u9nUA6ZQV5;;YrNd!q7z6r7_Zxl3`07GQ^S1MV|R% z?ao5Ar>Rr6ikB)Zcu5wl)twPyk^|wHDvx)Pzmr`zfQO;v+$XS&jlZWC8oLjjtmT|! zuKJ)|!&DWV!dk*WZ_gQxr0RJO7h;-OV|2@`he(3ii-R8+DztBoHD!)%BnkO7XAm%K7(xVPwj5Imx4%uE!+Z zGI5t)6a)oRb_Ndruq=jhGk#@9R*GUvOm#fy))$4#Z944HLXXSBN23P=^?b5}*me7} z*N7KJ7s#xn?CHT8#wlbnE{^2wgdNE}C^iCPr|_@U#hQSa9A{T}C{ROy*Ak;%Y3RoM z(h9gZ=DDEG5s&#s_pHjMw7D0U}~~9iN3egm7KfP3v@z5CY5Z=K&8! zsvn!aUnZL~bWy>%vxsqwHYKtF%Bvdd?KJE`X#YzS4l4$3;!r6~Z<3->4V(Xnm1xk* zV9H5p+S6)p1Big6@ZHUZw(V!$nM}X(yJaP1%!^U>6S2C%6kp-0#eEq0skXL&B(E@Q z4@Puk#r|roThHB$qZN-x)nb=n_}sSKrqA2`24HcNZ(EFnxCuR-tC!waoF(154JmD> zF^L6XDfxfdd)MwZjwMUg+I|~Fs5+f3z z0ZS^sjd|o3YonY37z49_SWOIP%lp)0 zN`RIEMHgGjs9$lUqp+YqV9uQZmsr3+eRQ@+b1K0zw@HC%SMYeq_ZSKD6eq3+wUDAP)R-ypky*uuA$_8mdWCjq6q)TocTd6*%qUhYElcd7M8gcjI4f{0JpA&(wrF#B&Zj&`|wyVHUUa;w_!nQ+?XUr z)0USN+6tTvaIpn8 zLADF$8rAS;_sX|{!h*Nl6~1kGf1L?#+FHJTGCVxQ25dfVTodKc-^9s?KA)zn>S|`Q zvS>Ej*j>F%3<34q%_Rgwq z-q(aObjky}OPJssS;|xHy}t?_k%0_qxb=(i?$i*p1J??s_usZ~n^Gx+x#e{9pEX*V zb)cAxV9Kuoy)&Zej-x0AQAnf1u|OUN+T}4$>_MDdD5C5{=9Y-upj>ow%n-7`y@A0Q z($6s;=~vPH|v^aArOf}V*t zOh&dF>Kuf@*s3ux4Mz=G9I(43cOhK*@2{Uf*~7^jBPfPI0NhH|0qUX+ zqA<9?w4yoMiiwtoxV}oquxtfE8ES;karL2~U}{?{0v+`NC@Js8r`V4ou@{0BZuuUW z@<&Pm+8@}pVb)k)(E=e6^25S7*;8kFXl{#h?7i*=_nq@~Bb|}cT>h}(VM-Ee%VD|* z03*yZ05)Ql-%;>uG5qEp6~DdjOcO7jR@&u3)2B~DLJA@ zu};>ODv;@R0!Y*fd9mwZMYV^58RUnPlw1!BMi)8B6gL*E8G-r1*pJ8OA6bShMw89q zNZt;4g3AFR4PF-t;)E=SxU1H zBtsx2AIZLh97|xAhqmGV!;KSIpG;5kkpvIcM)M|8E?FEH88quAvjEx~a@b9u2CV`@ z6Oz@HfM6$0T)ha=3+Lk$U(CqF4X-UL;&n4*#6=}`6+Pt)2wl~9(L8>I?w5mFW9*!$ zm^U`#YkX_8sXc6CX6uCJvTPn@cWCv#N_PYz8$}S;X11L{SYy~fLyVlyKH5!|IGc)o zpt{Qt1L6Gn29gb{(`IBzR-GabMjG8(zyOALh9KApwNcIbI%6nt~7tX%C$ht0^M3mCoK%Pslr0?x<0)){nS6noyKn%fwZ!v~3-c8IfT< zQ*Qq;dcM9o0A`xZ0OUozb`2)AZ%d~WtsMZ0L&BmF8^m2OMz>Rrm}~1bmb!gA0}&W+ zx4JE9opuzUKjg^K(H%>(r+I{%!l;`f1EoI&Bbh?tTMo&wxXrre@kdYheuVuKYcQ}6 zdRZ*QB)q1Y0sCfeYsi02T<=97H-fJvjEw9`kA2-Rj8H@0gG3OFXzN2ml=?@|L z9Oeujc8WP(pkBU!S(d2G>XBl@qgka}*YVhbrh+-z)y(__eAgW4!4kSagmmylDNI}- zfvNQQ;%-rWI?;0FX1C}LCk&&|al2Y?bYljg4l^fj{(^de{DtgmC)iT*Rzp23XK&aR zvPH^kO}A}9_KcK!!sU5c(NFHNmMNb6js2mkiiQNw^YVzpXDC%Z1bmbifgtdP?@G%-XOAEViB-8@9*; zaRfoMyyLy^t)_H)VYk4y3#S%n>ZMLNTB^{E7?V_oRW{4v=nC5^MlEZM=`*6G)SkyV zu5$PN^(5pA~xFE_;kjVxrHhB#YREu=(?6lc z8%n}u0k9Qe7`nb1cDoux{OKlA@<+@gD+mP8S`h(YMbDFGWy zB(|+g9KXtQ8ip`c6Gg;4-{^s=`9{(y{0EbMatDwPw221iUlUw1G1+nomS*t``*so< zY9>omeYXR?(tb?ak}y9g$)%uWC?G)zBD@4)NtX@EE<-7QQbKcScj4*A_w>EcBTt)Y z<3af>0d3|+p$A{#*)fiOEXcO7-@dpExfG_KD<+f%yS+5{_b$&nCm+Cl5$RU)}c zEL$ezvtp6eEfRc4Z_s&CKY1z4t2w>R3#ZOoUhBC|N9RFLCFsS>!&{fa3q-EyGgpc? z7a^%w&Bs!pT9Aet)R31c%q7=ht;BzxbH&6k5`dq6u-Fbr1Cve`{cy>ASYie&Ek=o{ zv==LW5{fW`jA@RVc(vuZCJ@%FmREw_wkz_KU@cYtzh!k`Gd-f!*UBM%sWeqHuiFu@ zC)@HiRGz7}cCcS`==>RU6>M#CuA{xae4?{gCT$0C)M&88Y8!xM$TsVa53vJf*_fUL z9f{i>idE>{0SRBrL!K}=z)eqvsGaw$fYH#iVD-L0{Ci6mT3^iVN!eknkFjf7Bs;bD zyPk%^mid^7SQILY^4h5K2}y4sqREt~or@Bt%`YZd9xodGe?PdV$Rx$ox!OW9GG8~la!=l^tAaKi9 z091JQn9Q(B@NADd7Mj#@!S@mj>y!5%Any-`xE(TGUOhbOPS4>6fkc)5_n{r>(-DO- zZzmk*<6r_wRb_R>SL~VMR=}K!zyNsuzF9<@IJ`CY1G8%I_)|t9xfu{BQeL><0H7dY zSgj%37N|;eCOV@&$-~nr)0=a$C>i#{^ZvubhX)V44^JOXaRE8v3Q|EKqg4pISUv|y z^e66K`(bH15<*#B9V!rEErNGLxqB+7dBeC?_Tt{QZCy!o72a+syfd$G6#WKSDD%um zkarSfE$izx^zJU~#%?UU!M7!FhJc#axb+*ZvD}Wbe^CN#@+`v&-J$CO43NXo+e#b% zSZHG_7W&!>T_90jXh+)`1L1Fvv$q>Oi?B)HZz%<9zB9ophN01@kWlz%N0EvgaO$k7wK~ctL zOm?heEvDT`0G9U#-Mm?@7+-bjHFiy7%W0E}_?8D`5qebO+Em`m4h)S`vg3=}yR$YR zp9(Q(LN%(ACNhma8g~`W<9A_2!0m9bT2WF_;{?+i!suZ&LF}R|xjrN{(>P4O6mB^_ znVRfy2mlNi4gIdtUe-LFb}w`6({09Rd2B8@G|4mx9an1!kd-E$XBR!o&oMsB*q!%i zuC;sJ4V2M8MwI3(lpy2DYk${Lvc+{5`Uq&QxuR8PcQCLs%iHG({##rcv4)hYyF6kcwHI8+N_~m?B zSh8?uvA`f>;F`V~=$b8WVeP_=E;RlnBVWe39o5s?Ckb)c-5N(vr*N(-&{FOI_%-aR zuxz>qj_Ei-6OW?Dlut_7`5s;pUSfE}X|m z349jO&RZ^NBpwZBiey5>x5S0Tpo97EZrBIjTzuBK`zT8UDj7<>g-~J@FL`otJkY=? z88;XnlMgLnALY9v{@B0|Q9;1*WOHYGE3_3DQtyh3P}J}SZ{f9#mATP`@r_4*`t;J)TJlMWbi;|Oc^C6Mr3rV3SVHKU8
6w&T%~ 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Π#tQJgH5AYNQuXvcb941 zvI+w{%zrCE8UC@~D9)GL!&es29y;Pzx_lNq1-^E~FP|Uk$L3%!8ns)v%W;~28u5b* ziqDMVe5vI)`}?0GepT1;OJTn@;$N;fUWfhuh+jVAcpmn?5x;EKahhL`_?6tA%S%{) zH{w@i2r;aC;eXGM_ze5W1;>g7+!0%$;#Un^oL#|B9`P?@h@$0-;8Sqi z{5kM2$6*#+Fw$R*xLg+Z!9P9XUmD`Eu^#xpDvtc3B@6!l`1)*}ahT07`1(kHb$j^2 zf(rPzQ)B=4PxL3u{=49gk^Zul(~m=cFQU2pk6Ah7{QrW-mA>Qj4e*yo`h#{Da{hne z!jb+8#O1P}55C!mUs;au*cj@xFf)pCVB2w+g>O}QSBC|Qzz-ksFE^Y%16~@%IVSHo z%))a<`pfEytNLH&;*Z@6{pUt?(}&50|7R5cAhajT!YfAczg%(@^I@SHmn&x-M~H>r z9qGT68}fyH@ViI+@`2Nz1ODh}+?_l+&Mtg*q@QWKIP=iII?}&w)a=+Ms{UWDxff9X zO|~D!xvJ{;47l3AzLa(x{o7>!k$$G(IQqNEdq(^!Y#%Lk@S{ikimKwLjq*I$;SB61 z=Z*AVa&=pX_BZ+Xh|gr*2F(9oM*Irh?p34sYn`0ur%lxH@QR{)f%$)L6z5C*Azy%b zy~z(#_#gd=R6))2P1OE!^u;a?%qAVBA1JQI>vH75WkC!2|2t~;@_dBH7Bq43u;qx) zR26FBqAt-=1mAbmUnh?)s}@a;cy*|b%%b;=;#}1nzQAkAMWqqH675Ax3;Y}( z=d$XMM)Ppdh0weDEb7P$(Eme9t_POySyx=0zh)qbmVKeW!S8pMwMX)?MK_P~xjf@u zz<#l4UghKJ$?;wEGX!<{=y6%}u;QwLMNf|Sy9c9&7yWU>k49Z&S@h~CpD&dit>6+w zU2n|P97jDieIw#T`Qf_d!x9BNH_HFcqT|qQs?J|u&N^NPe-GkFzm8IIiX&clRPpjC zeif2vVf=MUe}>Y3RQ0PqO(6Sq->BUy=G_aIf^Ybp*0Q|*~ z{>webr@;R<;+N$dhh4noD4%1Bqd1Fq9qBJ`I$nofT_4UA9LGFbe8fn9m77-!%HaBX z19?Qtf#4^N^j9N=XxSC~v=RRj<{6hwo&rB>#IJDi#}IGv$430B@u7af47fV3UM~H@ z{xc^GGmd43hixjG+os^c(=zcJ!R=M-1R+p8;%Z-8En@4q{Y z2xE(XIcj&Nd*S9W{L6&+{h_hw-@QI- z?85c#kF(EP6a6)H=Jeb4AH)5mHM|$H2Dg3IePj$zF0a8I`r#L8$MD=JZr0+5dZKUM zjb2#8`*UOX2kUV!Yz;TLkYDItgWt?sH^#eY{D9R0c67zLgS&0vC0J-)-ykT zl0>`V{I%z2}~!w(M` z4L=JyjL2tCqns-ES}=ZSX^eNV@VWZf8s5QL6Wz38YP^-ThEHUSODA0NZ9b!$xKXW$u>4I7R07;pW% zO@}|?6U!y~d2+PCk-vfRAL>ni3Ajdsx%xcS>dK zQ8)HZ+|eY%=ly4lomp91Ie!g)?@`Z0j(*f%&S~CjUE?z5#=|BYK)ugh_tA<3M_Yc@ z3@0^1MZ*>;F;ny$-U^>m9f1s0WhDV>d6ik{g}r&XI^;bIitDYetLBMKC3ro`|m56 zu^xEL_N=o%G%-?*%Bf5iuhWB7LdMsw+`Gd2uI8n;x{ zp1S6A{AN97#Ic93IcxpdPT>w4!@YR;j6u`}!beFnJAM)nO=xuF{0gU>^d5h%$7kVd z)}8;cu_NAd!kUwhJLZTrN1b#OH8Q`3p@(C=er(Me-y(J=*Y8+nh&Z;sVn%tmb0aG9 zF?EloDaPcC%J9&-21h&YYWO*__4sID3^j@lNyA@riVm*PVRbl#qNAA%Vf2%*QRg?D zeYziS1Q-tMaQ|d2OlHvpaz9jOcDd+D-{IJp1Hl^itc>1uQSI~m4#1LsOdr$P2Ob13 zSU-m2g6q!t_$@jd1~1@aH|+35YtQ+JODx(~7=_1T9=gmRV&;+Ij(qfyDcrT|KZ=pK zU_*3Nz`0`sQ~S`F=i)Pwbz>KvzO?~ zYeb)m45xQg_+g?rhz?JFXARGixKGC$fhS{?`^eD?;Jj~6z9<6jf8e}lc|O*-9;e`l z$MxHRzc--Y(eb!`6*#UvHj2N8<8l1~;JXL(?{Yk*kM4Uez-w%W3ok@?KZVy%$72;v z4893DW9&tL>@yEU2AuiuHP*>5;CsU%e}{+o1APA&r-pnI<{z;R2fU{auaKFKG8pIOJ@{FW~pX3GgL5gR{;q&f?9v z(L`zq>r3w9c+PrKv-Vx0BlwW*80FuHz(p5uP@h~qCT;D^9`5NoVo zOAZI4KGv@#M}jfF<39c|V2l&jpAHtP!-e3Xd_LiLJkDha`YRIjcYufL!0`&@&+%G_ zHC~4Yz(RRG0$vH|9|L=HfIkVw{U{#)_h6joasCV#KkswAia(?AdI5%G8P~rE#<7p{ zSHM&qzL0{?aeozt$FaEnZ(!$d%*R<9uCZ|$-wrHLpYa_XkLy1V9++?A|LS;L|L@=` zf0=LNS3B`WL}DjxqhxiLibt`^)i->kmlKb3fv^$Mt6= z=r084d~o_I{^U3=WqktqFa0m@cVUgkzav4<`OolNNsjKoKT!^fKwlj^9UHv z8Syxefra95UQr*5^9IhJ!2Ey13diI60}}Kc+d#W-I3yv?)d~8068I}&zWL4x{FnrO zMFM{qJWz+tS?9ocWQ&F2I9u$Uz)wlw+~)#y+u~aZoZ}eKPb^O0oF9RHP3)hbm+_5_ z`^5PPaT4bL#3!6S9*6x3<#S6yKDQ>sNjMHnya0W4eFE#3iPXf4aH8uI5AnxDYFWbk zS+>gQSwFu(zXzO99FA|GU&~Gd4~*Bc)15w6pJiu(zXxl)-48n+*Z&uIDE_qxajpjs z<@t?-_;)*fyxoNQFJt{f@mYWJSez8=9LPVFP`Bs-osjI8j4e^JR$y83HfimFdS#=#o&Q?zV&8~$L9IgM<&FP<78}q-@Qni zpV02N67;VmwEJp8oWF(RY;%5Czm4P{>+d!R^JJTQ65`yS&@S^2)Oj1pKh|zK;dq`t z1aSiMBrW}o)qh)#d!YW??h%f&?Hysh-QfxR&M@D8#{@nFz7y8Xu=-^pwLRzac35Ni zZ-0g3vHEPEkmvS2=+|P6$7h`bb=x5Y{-KTaJFH63^V;*Yfd04y{UzXBWBKfGb%MT? zpno7i{}T8btg-lSq#x+-8<~F~pEsVApy#-R;@klK_gLfYa{dR#@r@5V9vjCuJ_mkc zAkN>w0`2a|`5cJ9;|j-P@ps%iAr9|@?TIy(|Bf8nP`j6c?-S4`jN^{{Trd=$^$Ep) zJskf{6JhkGnC(NInIe!ia=syb<$Yf;(Z%NQU2hL-0te!jn zEv(;#^Z&e!^}8^~Kt8)vz^4NGg#3580osoR^ml-T;&;J0cVqeQx;YpgH`$2q2o{L5 z>(1bB#JU=*UnWw!?hl7Nc6{5F^J)*Q@pjJ#3&p<>JQV+G$K&xij(cH^$A17U6u$?4 zWI&%Vj=OO`n%r2w8~YT9zgq#EHHzi4Tf%;{+d0tY1Nww<-;Ku&)-)dfR>&wy9bB+Y+ zu=@$%fjaD71^+bGSp3}^V1etR-R}nvw7W+_{rA`v`arvToC+SubB~J?^f!Q~vBvV; z;}NhxK6|FX1M&CV3p|j|o~+L&u*Tx=`FXHV{F}kw8qhx(*6)=859G5~0X&e;UX=uW zJwe|BKL=|p|Gi!S3*`S6*79u|>)&#Cg8owQPX+Wm-iG4enZO?o^Su`)@Kp)?fCPS4 z0{?6Rzbt_#)(200>3bU-;uzd3G*EH$8)j9=0k3~1bxD|=Mv7p zxqnTF^Ir-4{sjJNn7=Jy+~0Owg8owp{E7trjRgKk0)HjUSF^r>`M-Mq1b%t~PpIeW zTNCuZ4|6^;9m;2)cO~!-C-8**VxNTlVxJenarWIVfhWwjeG~H8H(`ADO&G_06UK4h zggp1-{<1aJ*#5HLj^X_G{kO1>8}p!_fMEt`zOq+12|r+ z^=hnsnMfUQ1sw96hxh~hQ5c?UWBom#ALj4mxn-A)^#^XAz@H2AgLqzh`^Iq&x+a0Q z5;*e@#TkV8yLjyx(7%gy3Gt&6_*4SFB!M>)_-zTilfYjJ^LM8b_+AN|^ES}mLN%R);I#x^2M_gYCPCi-{|Bt`I?N{Mn+d!H{$Z@~ zIP+lT0DlmSdgkgEeE;exIAyHyIDN2y{$L*80{VlwpB{@f7Uz&O7{?~Y56ys`8sGzja@u~*&Ujz%qzXAL+8|x1{2do<4mx2ZIc@N`nxv~B|H-iPPw~t``1NtL+Vf}k~ zp4|ki9B(uD8^_i6@>olrqmL!S|AFreqxHn(+TbuSU&8MN55?(#2i`v(#r_5KM*{~r z+u@6`JdZvdjB|SUJgtAe^ysr3=WFV@)1&{<@woo;j>q-aCg`sZ>x(PFmtl?NS=<$j z`#_wN)dHL>pg*2<{`kiF;~!1ntn)tw^sj>j+C5>1aGVp$3H%&z&e2%EPIw9|aR2#4 z);G|v6Vu>8f*8&W5C$Pa6kIY1B{D#d*X*3AI{qmKR3)zDu5q> zH5UJ*JHhmRF#{j*Pm1ps!sqdFV1GQBadn)jVVsjE9GCq|cnX}?ps{>To&}o@@Y}!w z^*p%^UJK|sUV(a+c>E01;r*Wl*LBXqM;+e(dB>&B!dW-!lD^45dRb&pBG|v$J>QH{EhriVU5X$d5(F`dAJH|tp2A|!9wvb1rO{Or(6vl zsM{%WoQc)v6wa%V{zb>*`d7g9ylTN`zy9X9>(`j$A2dKF|bTfi>Rlb6|&W%un4M?2`eW2YXY1p8)oE0e%hG z-T{6GnCcgQAA|immGhb0^~-biFVL@3A9H#)-}t*0QJmj9F7**k8;TPf-vwzG=T#d= z_y_rNAkGI@f(PpS!Ce#hS>U=3aGC!HdHmFM5MIF_p>{vz^sWvIqJAUJXJc`M*An7< z3taCPqQAxQ$jA3hgx~6T0hZST!dd@NoEIFA$KiQ1aNT%XDuHhYekN8Kcl^n^owhR! z`7k~q7Vu+WLi&@y19_fyisJ=X)vwb|gGYTV|I;o63$(k2=c_=!*0jM7#Twfm*E|BI z=R+Aj@?RtK-1TdL@Tc%{U_O*tA04LxA92d8kDgb;v*4#=jpbA3z8k1pnRO5Jx6J+q zu1m{zCGZY7uZ`mEaz72l;XKJ~tY6FR1LL@Mh2z7z`T4o_IB;E`Dty#uEyrEgM>y+L zz#7YQZ67R}#OTr|%3NsPpNo93SQnhs#9j^e@7M+D)kQ=?Qf{J)zF)*i0b) zI_44Lhk*yiaUIVKAwB0w25YRI>sZe~eb({#9H`H_R~?Vl=Ztf}GgxEs&v*(f5dVy4 zzytBm;PEOj&(HiUxSl^eo?=|i{8z_aJ`05ZJ9uDzp2_)Kz#7Z*tO=(d#_{v^tc$?| zbv~;F9;owK4}%BVJ&VT^@_76{SO#k>pD7*(0&%7ea6A@g>Jsokou@tz9;ova>lUc< z*}M+PV2$N-Hji(Ce9qp{@mM}*H^Bq>oP7^?AfL1EcYGKJ4ws44hwp{SV2$PT;YYv% z`FuE`&L7D_9~j4vaJ~fc{D{qyjw*ek#_uP9D;&2`^emu^LVSXOxRUrO( zr#XGBZs&2X1>&D~DR`g`=gojG#Oms{XbOL0KAd+0%;boZMm(XOmF@5{+l}Q@+0pS> ze=9uh1^QL#g6n*m@R3g?e*NjjrSc434)nM3QaH}XjsiantLrcR!ZMNi*cmW^=XpL> z1rOnMvG^PQ)#+pX-SF>@$K!C`2I5?huzy{U zuzy`}TDaW{P7k+xK?|I@$MU~``FwU`ej(>opl%nw%kfyhE^L7xi8U7g!h6B=JaqfZ zghpEx@Oq`=!!*&iz84cjle`e8-3NA6p=N1Ni5$ZbqFfh|lwmj>G=2-G6jk z;t0PKT;;Q<3!nOWjJy5flL__wWI{bZl}4N+vBvWJR3U-K}LUnZPUH zfqbf$fETdF^7#zgSL3+210Qw!%okw-aXvGfz`NjwVU5RsF0B77`xVfCHj}{jN{DkC zcp(4J-W%g?-hQ?R9;oL(jDx=$Yb^hNV7npx8Q_8Z|KSpFj%_>+>lrvcT(T>8;Cbdt z_5}~r|B|D?3s__EFX3@7P=`xyh;dhkOIqN8{$7$$pU*9VK2V3xWfFK1{4lJsJU@3T zSfF2@t0w3<-$HRXzJWS_?zyo3AFJSLtg(FlnfdG*;5_bq6zgz5#UETIQvZAz40(>e zEa04npTioD|9h}doEIIB#rZtvVW2*r-vN9-tg-l?Uj?R*+XMK>^YhG`+{IrYJP#I% zGXox|!{?g`diG1T%c&Q&`;6nRUEyDl>(XI8Kl4!Z`b6prhd{pw>rg-9CnfNk!5P%m zVZ4UF(ceo?fXR+HDfz!lzy$LAm#rO-<@qnXo?n2~jr+e`g1-^x|L{CZ?)1Xz+^+-e z)~^8%jN`wpOyJzFb-x<$(eA&oea&5e|NXESZ@`EC-&u!{p4(~OfKPoFCdB(O?%Ms2 zePg@&swDzi65w=%;A0 z#Pxh#>u;tA`YJ7!xV{CZ^zY_4Q9nW%c# z@24yMA#>DCq%Kb-=riC-e;E5ueU=tWET8Ci*tPyCil8shVu|ZHE=qs+7b$|iM2jV^ z=eQ_6A32HimFSO+^;K}CKeA38;@4=g#N*F^Dg9C0cc^dBVu|aUU|R3y+vQPR1A30T z(jR>we8z9nVu{D^f@%Fr6hYsk#S+&Kz?A-&sE!jUb}L$9`sjD$wf-)upid9w@%Yid zAE5PYkNRAKz5uTD$GZN`OeW}=uhzTz&y*ANm6+bue`Y#C&v94ri;q%={Obw&2Ds9{ z?`Gd!uhx{1^k zSz0Xd_<1lD|HE#7xuQTZmbktMrt}}#fg;2&(PD|~r@*v6sypzD&a zE{@jMD1tsiizTjSzFHsU4ShaRZ>*oR`io|$gT9!cFN3T2(@}?@kNSbv;`vO+^j-Lj zU!}zo*Vn;R{7<<3{mLk>fPU8M|9%cW<2Pxs#N)TXRQ$i6rwIDU;?KCg6VpHC^j%sk zaeW_5#lQGAiV%N5izTLy{{0fA|D@Ajl^V)7(r3Vx{?qRGc2zb(pSSvImAZ-4RRvls z@qCJ4D*k7>6hU92#S+&~fhqkZb&8;`&|-<}t6*AxFGbMTXtBigGhj;pxict&zCnv6 zu5W^Ay*plAH5aKj)^psI{vY?E4)NOw`YyQEv;WlhXtBie8GvcM%jfDyys`f3l-2)J znnL_Ll#vbSvoZaFPM@R263gf60+`C@pQ`W~f07nUTwemy`YuJ#mua!Y^%XFsues}! ztEVIN#`;=J-=z-m>$F(n@f%<&{^wUx1pO>6mbiWnOzFQ6iJ)&qe{8I8Tm8TFse`@~ z*8gV#ocGh*{g$O={0;qo7GYGoOD}f346F2ua*ne;TAz2k3aj!$v9q&@s{Hy z%g3i2FIz6pNBtLHSMBoAwy51ojAtF6wtO*t=2^9TX#qZYJ;s?I`Am#UoY@%X_S83H zoI3J3%fFC!yk+@P`qZ~A_xX1$_xbl?yab)KMOc zxy-At^emq!!>7J)x#+Lq%PP+;m>=}lj9V__cumUk)U4BIVbwUwxLlL7`sLIye%^99 zE?rZwd^vsUCoNxGcf4r%vWDX&%YB@(<#OD(=Z^7vCy3+ABtjcHkq~l#!t#|v~HNBWV>-7B? zuR6~5ReafxzRH&sm;Qcr+;XYUS5uZRufj*azM8gN_Uo@^ESLIxmHDc67gymkP60;u zci!bA9iM?!`J@hWyaB89%c*1jO&F#3 z@mt_pKL?-sHjL6QmHu|Ym40asKJ|SVrGLX-jt^j!etBoeuN}8~IX+yQvicSD5&zn> z~GIUuw2dy*8zv>f8Ds{az45)72__S z>(Z7>KG$U|mwc|vS}y0u>vERMesNviav9(23YITneyGoNMVP?&URSdE6*Z?XTQ1ip z*HtW+`F!29<+49sSG9a8`^kLRPGFv2SGU~9pRru#&vgyUeVu15U&^>_w`sYr=bYs$ z=AFJ}x$Jk>@%2#tZOi?*bS&Rg;`hMyxVZE3bpxwkQGk#9XHzgrzeU6GG_1;J1@oXj z3#0UJASTbjXno)D0<6++`9;SkVU>Pq)A2H_(r-57_!O+x3!k?7%@;X+)#|q#cf1a( z;=iHmIOD1KTV@=eg;n~^*dF`Ke6_ydcpFyf<-W&k7hLPh@EK|Hp<9mJ8^39u0U$b2H-|Op^Z&Pr3=B4tH{q*`-%Y7WSqx3TW zub;Dg5%XYuT9z-#z$c%#T;}ujZOi38&-ES4eV)A-Z^38$f#otEzRs6b{@YLo{nyhl zf%)+D47k!?Iu4)utmP9a$8(ma=N!++IP+$lg5}#voJq^m(r(dm->;J8+ZNz6{xpp4 zm%AVS^%}V9*S0fGPaD$DTKyK>p7C2STJO#yU!Mn8@nw9!-nLxE@#|g7<$C7pJ50=Ja5QYF87^o$XYJfZ#U#DpD4g* zyLrpKp0BGs<#>C;q~&s)yrE?Ib`AK9Uxra}w(B@PWx33s8!DD>N1t)3FnWC5{JEhH zuH*OMQ{RBmdN&_#m<3n*rSz$9Ch$4SeV#4Lx6i_79QIGQD|s?6)$Zacryp4T8!j30 z8)=k&`$@-Buqyt(`m*E9OX;_ApFiH1v-)MTPS19fUf#FfShRYX|2LK_-+so$ zDO)b{_Qpz#OS{vS?=TJ@^}Ml~z-yMveS;h8mdiZ9k$I_l`urP~?@)lxcA1yb`~2rD zm+OifTb9fD@y530@;T0p9n0l7b7R+X*{^TxSuXqOjeW~ye%?5+{EhU{uWzufYJ4}# zIG%=8{oOI=IIYsleE3E_rY|@>t%~!etmBh0PM`S{EtmYiQL;S4{HULTQTh1%r(=5h z)Yq&&wS(hzSe56}f#b7Q@B7=ddYM1pn6q5w|2JBe%l!F9+wu(CW1bz$y}oC;>=)nY zCvf&d^-K1Pn}9W!{o%T2+}EdOxyXz>WH_E30qvo^B zx0`0c)i~}{h0pw(mivCqS-w5CwbyyAEoR@H53)$uH>)=L~(rQexx8NUFd^fE5Z zNpP*FPkqsHpMS~nou{0hHWa@S(>I)c+HxPiYWdDB_{^scqvN~lkY)p1=ih}-eG^9M z<+$2xfh+wA)|dJYOi16e`dv~^Kd}1EsY9G^(x~{mWF2Qaf%xC#>q@_3>`3zeUOM z0<6+6Dmu>BRs5|pj+bGTei!=8vjU^^G9SJ<4X*U^{^FZe%jNj?&AR1YKV!L!?>8Hk zuYeon(}Yp^Y>{z%4p!x}ko{!-Z5XBB>_Nvnuu8uRed;+rO26efj`v}eeu5bKZ_z0I z8<-#YIE>Qo!tKd3FiJn}+Wl5+d@oHqeZlHiKj-))tct&~=J=G=%XodOV)au0Z%tb+ z=Y?-Eo{GP;1fTiWW1QQQH!NQ=?)a?byJj6{om70efAy`o7?=3181KMmyYrUI`=hJzg2w6=i4dEC7*AnE#K9}|8~Z5*)P7$ z`lhWBk75E9ryZoU(kkmg5;%RZpqU&CE;XDf9N`oaH-D!)N@w~O>W#Cgk zX}R?4=Az|Wu`bk?VM2LMfvY@MF%Rl1F;1Vn8sjy`X?2{8<8{kr-rhW8`6|hC)^gvk zrsbPA;4_~VjP94aez>^}uJfT!eHTXSH+Q@TtMtnz9q(KIW{ESfd}Vd0{|=3cBlG_| zDa%(eF7o+K+VZSx_d6NOWj=f-Yk9T;pK)@QOWnT1@l^RN6Fu7r)ZshDn7#_1@k^Fx zJC2tv_w7zuzAWYRRoGCwHLKrU^mWVSbMx=aST3KNf2U#j@_G2of7Wt&zwn)=u>PzLc1p?Wj8YJlmGb^9J8x{gmFY3)@$5cAtaK_*s}hKDXqoUiy1W-tv`I_>5D4QSoJexut0Nj?A0- zlI6Rz?&M|5Wn6BVvRs}^xus&cyzjeZ+H%<+Z>d@?*8{iIEcgAbTP~lU-ZEpkT&LaA zh;in@el;zZ`_i|}S?=>`SuWQ_x3n#n`wzEtEcfHywS4zJeC9(N8ux+K%YBvaax*o) zdsGM}Qs3oxDlX^2@1`u5a0jPV+L zwp+B^_p4;N?^oIKJtWSQ<-T9cSJh{aCVaMAwOp=Ozsq<^FXQ;#y5)P!!DpNXOkf

w?hDP0TQ2>YOIa?*^SQL;K2FAR$#af*sr>gWz(<~Qd6-b1d|m5{@Ts4)T+Ux} zd|l~f9?q34m*c?Pl;wL${7Q_|XS>su`+ij|-*Xl|^)oQKUspQL*HxZ-&O1IA)4S`j zxt7&Wq@14HsW_guE%$kLEMJ~>aeA;S&&`{T_pN@)0+%lD#>x_vJXqw?|b3*ah_98bPCX}P=~|6b8@-)_nBy{Kcm6&TfSy5;yZtZH|Q zS;uRzO7HWmTfH2YzBiM=8ws54sCIq+P0O>a7xQny=zQFK`(7Jd#o22PKJ{G~t#|Y7 zdp&TakN(|a>id>&nTAh3uw3-F@?{lA^tX;%F8#VSW%+ilU$yqllwQXD)*86hm*G=iw_MJ%x6W8D z*L%0lTE1NdKI1ek_i^Sd-@6Q-`WB4JN3I`kowr=h@3*!sm+QS-JC^(L>RP@X`^k3u zFroSktX}f@J~z{Ovj2$l{c+2s-S4L?-@5^y`YcSK-S6kXReY)2_w$yotiorU0*unj zxO~4D>vn7~Vx?>z?} zb-S%>xqNSnli0*HwRgoog{(htD{)T0iZ0!}1*KNd2tk@_z8Prscl= z?4OR$?HQ+)z~>Wq+j2kd9n0l-bz9f+#Rd3mw+|CIUfnhTS9!|)oZGpX=ByXu+&*r( zTo2!#vRv}HJ#G1$^6(ia3lqra_MFxGe7K#?hxKBdg5^G+Ny}yby}f9;+?Tk$6ypu} zj9-RP?dIr{PgySW@b+oTVRu z)Ey}pJ+It#=^YtxrO!3tQ=fy;dUsuVN8ak?_<2Xca+#lZOj<7WxuY244ft%gWVwv* z9c9bqdsuf&SuXSZj!KMY;4}Voj5i#wT0W6=yk_~fZO7}D%W?jW8Ow9?PT#Ox=G7fd z%jGzK$DHM|pWe~3T;|~&Y)6fwuN(7KT;|&yUCVv^p5=bL`j*RlzGGmy%)=i5>vrG9 zJW&51q+kN`>IZ47mv(=UiSY(}#>rYP*C#*7S?=THEtmVNKPXtfZ4*A@Pg?#a`s78+ z<@u!_lq~mkC|kao{b!sCjH<)3ryQS#RpYgq{iMDQqxABA=La(}eE~l84HzA#44-^9 z#@QZu({i8xoaH+)Z|d7Hp?o@4znbk)-?iMw?^(W@+fzS)3B+&lWz{cvzNlCoT8w7A@bo4xjCoVM6V)uBs0E*5FfLvE0X>wtU}Nr{{K| z_-tRt?>YU9<-T7H%YD0SN5>h!XP$E~y4{N%pNCcY@si`6nBHB_{IF~F^10X#nXisB z1)uHqE%$jcFQwm>I_U2lhf#TM!MNlp7^UAY?RW-O>17_?nYDV^zwXRizF!$W;}>95 ze9809Ny|5te9GXVcBiafu5<3J#CR1x+nu&tt}E{3>nb15YnID(`<->mWuDwQW4W)x ztmUiA@R?83a=Bi;bIx*KpO)qOvHy(IhEes|GUs>)R`qMYs^fiFr5|_qGw&S4^vnbC zf0VI&*OcQ0SQSUU7yP55)oBoJ88Mp^RA-ht13=kw%q4GW%;U_({nqOkGyZXYua+TKEJDKxqKdR7vrfo+l<3! z{&mY&%{$((T*mjVS<6=z;4{t~OlZ7X;Hq6;AGV{ouTRHvd0yqNuH`<@zU4m8f#r)E z@R8?_*>9C+YJ=k`Se4KItS|K$7^Ro<#gDV#N-y_Yew?#hj;lY;TP~jq{J3DbXFequmCs7*$jdM)pZ(_@ufQt3&!7EMdO7d>xN5n4Z}i7C%YFWJ%jNk0;~C3+ zzZ#aWD#K^~?4QbW<*eg#uqw~DXB_XqD!uPl7hLO0PT#ZK=h?S>$+*)GEPs1`$nU06 z@#Q#kH@8z<&a-!?EKkodz(nfqwB=IgyEB$co$t8h+~Fr_%cVX)$ylDx!bhGz$-(IQxcj0%DS)f`c&gU(E$CT4g!iMrGT76#fDOoPZrTMbua$cBcJ1Wn2%)@7WDwfOj z%>10rxzDF#`2iBY2Oi3&Z}oD2Z+>9;zT6)D`YDadN3MH+I&QhVKmBRSayhR4 zG!x@+qxf0N4`3c_H)pvVCx2S7TVemgT;`^OnD}?(`klQ2egd z`|<5rF7J1K%6h1Le7gh7-`RqXe%&(;6KMCI6u64>PR6A^9pkRQ_hc-WcJIkrejwZ^ zP98?JyIIEZNm$kHfozZMmSB`#>VHoeTwDO5)voVv-SPv=@R?5oM(6M5=RHku6=wzWpuPp8_3r$B&pf!&`#js0%loW*SP!N5 zd3G&7unM2;4q$Yd}HSiL;Y_OqXyqq{Mn4Za&{zwEDf+ z9^;oRm+Po|%a+S^)V))dA1HY;FO|az#8hyK2C%jG)fzO>~&PR8=>8t@q>Yq?w}-4tpY>B*t`qLhSnl;~U+Fz(KNOdK-JiEy`gMQ7@;&C^ zqYn2^TJG~HTJGbQEcfxtmcN_ZGyYVJw;ZonF4ueaPg^eg>HSs9Wq-WCW_bZ_)NUO{ z)yKz~v0V1M`x};f{jBA09l&S5nwHCP=KfZUb9?INEtmc4{p{izN!w=?$3cWFXRX&Qa?|@1ls+1+UlkLKhMN?9X{h^EthARN8=XXEvSuXqO&-<3k@%HBf z%O!prSmz_>h4#4R^89U^d8z!DmKb0n)lSFwwBuRJ<$2w9&T`pL+l3gH_>(a%@%g&S zN9xlqTYez(V4hQ!%k@&blEB%Hil1d3j8nB-&V%imP<)0eGY?vwmt%If8~`U|$B zyg3mnX zEcbb~EI+shpZYdTD9?`7?^K0PeHTXMzeMt9JjM55e$@9Z&q%ui%MU3I^$*afIESVj zXFG~ZzaHT0if=7(GT?!JJ&?6}*)JZ*TfVFcANfB}fKl;fTppOT+~>pgmHyBMe8wrm zgz}jJS9+=Q0~N~;?ZIc9Y0D2|-sDxweLgkI4=cl`z5%21+5TR~XJJ)7>5k)bRxkU} z11+oHx8(Hmmiv6#mhU_1^j%n$kB{H8`aLu7nSbAMIX^xyuw2^xB{x(3I&7L?BK6A@ zOrYIgrepd!r_Wd}?fx=rxo7Ii6KZ$b>gE3SFRPaO{<3|Qr*F4z`C%RSY_|auYM1p;ao&@LPkqyJ-|n2{zTKAP z?-_^BIBgi+uDcKR%PzQXHw&NoK8)61Jme43DE)p#$5XIc?~d~ivL8w>$C(G&j^g{3 z;iKILbCyfL9?V<*o(6pCCt*~(+qnE6WL_%%;TibUmtmBCMbGgmSgkKOUWHZqad)15 zum-O6W%!Ig1Ech--Fg4P2Ds91H4dNpdCPb0Io^d;apXAgAYWH;HtjflKgI`+(<=RL z#Ax>+8pWl~4>2#r51*zG`ZP=+pNBHwN-yuzAIe%T@6#WOjjz0qcqni6hj-z#-2#k? zFVEdQG-qtHiqx3R=9%@^?99JLeST6S&9_m^y$DfCKmist; z%X3-y%x7S^)Zt;itn!ySJUnjs5mgE&QV-{1yybWSHqhUPC&5*Gx>1~>492ef);y@;>+BS<8L?b1}~T zvkt8oXMf1sG0wQ;ofs!3@4~41`~LPUm;LnNzU6*C3@l&a^8D2}xElAZ3-HnIuTn6o z-AU@mGcZao`^B%a;98%CPkqjE$>&#j%NKT>eiAkmzZlcApN!9bsCIq)vgLcyr@jKC z;%{@C>#GPQ`MmXJ^`S zpMTYInGc00jd>{oMC#Y$mdoe1zfM`cIs>2jwB?fjui3teFZUsT z&2|)*{C{1r{Jqog8NUb<%D-gwQqNzPE%*6UV!QyK@vAT@pZC@rr&ZkNS-1SX9j9-= zhVq=Xdb#iP>!#&LvR=$*&hq!99dB7K_nm${Z@JI2ZTadM_>A9$3FX-XSN-*Q_AQs^ zw0}LYT;8`n0<7amo{x-ME_ptZvi!BhI$-o5ie1vsUdCL5Jgxe{eE5m1;yyY?< z9+`~sy3-e9eAe-jw%jG!s zNW*fUC;Oq|?Aw9QcIRMpyY7AZBlA{&WEDR3+%BZ=fvfmOHsDh~fKmE=(nJ2=G+N(s zJO!)tQiuQMc1piI>-3of&eucwoaJ)f`R}~t%M0+4|9{h}I8x95p0xb$7?=7IjLzTH z^S`I8{-7DBuUh?P8OLj|s@;W+A%Aq-@+~@!r(t!w?taLl8LQuea^(4F)^ge3AC1*V zp8I+RI@VKWVua=HF_v}Cz_F7RmC@&g9&8Gp+1&0YN;tyu2+ zJ8ij)c~IZ5e0dcQd=KVFeG5jn>*mj+ZEzLm z??m5?>1Et|R=*2<#_wCcvg-K2a>?^Id|9{4{vgh8QZPDC*Y0o9Rxh82{w8Dj-?@B# zleJu~mwuD8T;4zarjWpkmLD|*pLv!nm*f9$_`2$skI%X)F2~j1R4w=Vy5(L!W4Z5F z!}52x;4{xz%VqxmrWxaGkNP>wk7_vHvfTH#ZTSx4PT#RyK8O8H*K)aj`%OQ_nK$zp zST3KdKE{_-J!M`!#`YE8CP(2!>ajG8npbi>d@O7AN7JW1Z}oD%c&q@f;!8aro3#As zCVa*zS}x=JSUJYwM*1ns_is5~vHWP}$N1Bh%jegR)hu5+>-2TYecfg(Kf3Gm+)mZa z*P&_ka$b9E&T_dg`dG_yInO>eZ@JgEE%$kLEI%d%pLOWLg!1fLz0Y%C`7s&zi1Rp& z8ehrt@o~$yFHs0R+gEzY^YOIh$JCrY3meGu@toC5o{#4(KbB$GZUIKMyB#t4q~$W- z9%sHve=OUhzHIsG41Dq_%Y7XxmLJRZsGqjn*P&{8t_Yv{I!vezGgdG2;qiv$a^87- z)^gu&)A9`4W4rS(p?2F=FV`oJcPy9dlgGQ3%X#_np5=0Ue!OqFJm>TH!1C1v_{g(M zqsB|dr8{o9)Tf)WT;5N0)0Rtpx*5xlor2GHb1;GWbn{lfY|`lqmdkOb%hy%@(%){; za-UDh@?sV~^I={ppJfL+UV&Bdiv`E4uu3n-t8NWk>E*cHty`X>&vs`l_jxuf&sE`5 z--HRZI|r`YWk0EJS-!FgpM2hO-)`ITV#VpZu%UK)Rxi&Xbo-Vs8Hdky2bRluzOB}ESLTFiHhYu{HT_3v2j^XXdd$GvBHu@9g18NdX_{Yk#8 z+Lg~GpB%S*S(UQl8`#_P$N<;P{=GtLZ5 zXuKNWs$Dt$JUMImag572P0MATKRIW)&!=Viac%gFLmSGcWA#3tuH{R{;WJLpa@mib z>|36pj{1S+$ESzKq+h?yS$=#O zKI7yq_xTho_xVg(etZKyf11(b~`csl+$-D z_x4P z%jN#bQ_NSzm*eVFtcT_W_{?+Ka;eW#Rm-J5Pt`0xf!i}q118kpS#Z_vsyuw^n=xK- zycOeYkNSDbPaJo=9pf3tJC?7KI98Y;XYsZT^3yHr{GgxfKmGK!yIQkt*<#=vij8*J6?v>`iA4Iw~8;vjo)!R zm0q5k`d!s>IdA@s?JK>UUw&7&{3Pbhe$80E&A8(Y%YD1EmM?BPJ*{fj*MH9PlX6Z! z4;$)lJEpHXeaCX2PuFsvPtS6nPv7#B>hMvA-_r#0`915Q`gIWVpgv`}Tu=T!ZMn4j z`;6r$wcs;O4kpxY9$dA1at1#21sKgMj!#-HwbdQRW4+~+xK`LdkTw_sJCn`Int!>T-YCuTlu zN9h-L9q+>`eW^a=Ptz#9?7vU5e@ZXc^G~NN&(s)TBK36Ia_QI88Ouv^@Tt$igxbwp zy<8_hU9eovYfl#~m-EikCChz2Wy?!__{^sQ6Ut}W>g7E9bk%aXANVxuq3ZU2sZZT< zxnKA6jO8-_pKe(05n$Tt46FOw2C*9pe8X1*7s@evRYohpPWO<{Zyjy&Rwa zkh6Mu9_9~u%lDghaSE2p_52@-F?JJ7xJ%4fu>-vE1h~ZTUex zr?0_=@?pMe9OZod?2P3yF3&bB_xf4Oi|jx1Y+CN?-?Ds*Ir!AiTQ1L0JlnQh?n^)0 zu{>9X&p2He)i2*}-*O*+V7bJ94p_&@P7+L{o*TDZ>i=BI@(&c9J_8%5|8rTZm*d!T zIm@N~&*d%O5^j`F0Y>%L$6>yTf1nPZ`7g&?{30poEex<-5TI3e>pEaH*2}C1LKACbC&x&TbBDg=PloU0H1kwU_yCz z!F9WEBYn^E6^zR`ean5jY)8fU0NaE9`Ei&)yU(YrUh4CF+H$GS^BK!!zCE9{-0O3e z%kk>@yyZSl!E&kd^OKhE(u2=_6)pGrlI6Z%Wy|Hb{rr^WQqSirmVclMpY76y>RAI< z_4jqCTYfCuD9()KvcEjvuw2e-&o?bUHV2>i%vruV<9N$*U!Qr)eLii=eH}WMpPGTs zc6%_PI`qL+9pwD={J`>J9zNo{K%?~1?hE6VzjK;G=+iK&-HCf0&%mlU$1o4-Stq5J z>)sdGzS2vcFBB|4xC)T37`Ml*jv!CQ` z%jI)~7dkPXflqxGM%8B`<#^9>-`~FF@_fi2xtWTyl>J2fKaN{2XWq$s#0Iu}%{`8NNmanYBXPlztKF^Znr`DZ*3O3Yk#p>Tj zIpa@TzEjuns^#*&;Ey%SmyA0-+gJUP`S8aX%QHQvZ&-e*#FfE>bWmWjB^B~3>Lr%G_n;ftDZdK2>$iT^@`(a`>T{M${rh>#<#~^O!E&i{f70^fGVmF{Xt_KG(l1%=+bvrz&!zOI zzyo#ev)^jI$$0grE&m|gD4#k^D9#MHiX+Fvej~=K@Y%0f%jG!PZ(1(<{zl!l-_2mVr;+hf)3dU}4DrG!CouOI(~krL6wYj?-tXUXEjb z%3A$SRrqN4PdUq%us!m;e6HIZpnmYPs)M&2rzby5+uKGnUKz|5L+qIbQu~)^Z=GX}Rz3oaM*Ejruze z6Y6gpJk;Ng#)atMsR39B*4L?+0J(Snl)eT7FszKHKfX zgxY04RJ-zd#GkpD;_@8SpT{kicK^(Flzv~<7w!Hz0~2WX&slJ#KdlI#`kdv`-#_Oq z_w5!eKaD=)FrIGLjmw|Q;JRJ<)H7eLcjNNsD!9_ib^f1gFa+Y}#|N;g zJ}0w3(7!Yeqx5q8e<>ByXW&!Md{rFTPhaBeil00OpL+INamoLsoaJk%qka-b<+I`_ z$BVEk&Kl~dpMp{P@s*BOV6~n)>Z>qHzuG+q^->L7>#3uD21e<9eH!3O@9QvY`R-Zx zjMKDS?i;_vI;lAF`Q1w`%jNyiOY@e?dG@7_<#HT;sT<>xPtWq*+VGiY-}0rcA%B@h z<+*g$@o~$ynsz*8xs3bEY0KZ8arzu=pw2Jnt^UZm(-$n4&+A{Fv|P>?FBdKM`IIa# zGjG)4Jo5ytU`_wV2)=mtJPRN-xh}y*y*N96w)fSnl(jwfwX$eC9a^ zqw|z@Ti~kQasfW|^Oi3c-nQK9JC@7)f|t9N%l`f{>!I59`S&d^vyRB;m2sFr{;#C0 zUfy54lD7Pm8hpmdSiZUppFC^1?5D5fEH8KAQ=hlINT0l5x%BImNy|@U-qe?1Lj5X( ztNN^E|EZs{+~--bT<$x)GHtonS1p%ue5Gc&&%bW@+5&v$(|`%(KMSt%_jPMperygt z^67%BeB}MtD?Q7X7T`0^z;e0Y_!qvc;w%{_m`MGF zR`Fe2K7UDBo?&~`r!ALx`Cip%-pFKkC~pHIi~$vk|<@56-h8Cbo{2Vxyx=I0<~d9F<1 zL~4+>T+aK0Y>XG+Q_s9q{&Id9@O8y~yG6^rzGS)7VNkYwE&I=QD=>jN45qDK-q#PR zFOFsReHJ3|LdI9%e?(-%km=o!*=H__jPDnz7^|BeHSLwZVz1LDaVb! z_AQs|x4#Z7Pcv`Cf0ahXk?Vw4$1Rumucj=Q&(~f}TP~kBy_&H+PoM3wf2v)%ZhSRo zxzy*?yyfp^KN)8dCQzSOi&lR|20ryA%L~NhWf+x@Z+FV_qZpU^X_!#ERd5yORQ8AZ zn&tBT>(#pDTT)K_jOB74?A38=mvbYI|&nNw+OD5DwT*m9QDa*Z{{Z{dPp3{~e!n_&31{2D& zZuN3M|Fs#*<@3bX8kWoFIIqoGF6WWg*guu$l5zOVXU_8dTaMEzeWvI5yybGdeXVV| z&$DB>T)(~6wcOW@?WlIosKIBR1DHVFUgyh7FV_jLr!1HE5wE8$m-`{FXDpX|Ue8*7 zCgUQX*9$NzpCxBFJ_)PxIi5cCB^afb^VjQTaHW@Ve|^ew8L!tXmdpL0*QYI)@p`># zxy*;xYnID6zFxQ7$Cf4sf ze)@XHa-V0{^0PAV8K)1U^4$K5jt^i}K6|Ey{C~!+UdHi%_`1@|_1OQUEq`at#mQJM zdHzq<^8c5)w}FnUxY9+drIysPg=rZ90{^vaV_u(gU zHm>*KC;Dyt`bOl*XTZkwKK#UxjeGhWw(-9jM4o&`k(ATV7;vLqpV9T^ZCuA`6XQ0% zF@Ze!7i?V9Px7|G|F0+?=qCdDE+!qD-qS_^%yOc%O~yefY_o zjbBYU$cJ(nd~}>MIcVcL4xAh+!JCmMpJ5xnVnpFgP5wg)A1lEr2l?b}T+cg`<2LT~ zd%?y(Glo3)6az?1Js(hbBT_@2F2ba5Mq<({J1MpSH|b-FK5XOK4;Q00-lgf88ho@L zF2-%VD~LSh>9ld(-eSVWySkAleG*AI`5oX!y*lnKW^8=(0P^IMwQ;@wT@S&t!)*RDYu|AcPWFmSV7x*tbv`db6Yv)=I%dfkr&n?AvIiW&9% z-;_u7W4$0hL(Z-Y2|*vUan+CYqS3}Z`jCyQ_STDL8}AxMp8Uf|%=WtS*NZ4{Lmp55 zn2oD`sTXk@S9Vn|I&IvOCt>4Tk(KgvBPl0O61X9cicji=W8*ae3@udlc=WP5EjrZHQ$A7@ax3c||X9!8Tb`1kJ1Zc zUz?4uNGkfUjq7pYi`uyIC-uIVjjMU5-q&g4tp(&MPr}Bvo%_0M+^e_S#%GZ)`6O-J z7BR1~w8MX1-*&fO>X5(Ia^EU3;!?=xKj;!QUu<_N*gMS4Rqg^XP1b_!@T-!rM zqm66%D?&D|_DSk1nr+yk6&CHYDL1NI?FI0F2sX>3|n8N#z8uV%%RA13=({Cd=`41v7=s&Pg z;X_Cb{wpXq=|_+l^eT?6uNbxI)q1(UV$8jobLPDDt4M3?L~}Z)Fg; zA!n>n(K9u0Z9kPE8*gh?^h^zUJ-#a2Y`noy^kEy<_D~tMaqVX+V>YhssxoflS`U?- zHomPJdFr7HiJ^yC8x+p_hWy(`6z(83=yiWpW^DQkNk{(K5+wXaoQNqz>sSMRuud-^Zf z_+6w!yZmg2q0buCUVqT0zngTV4yMW3{BkH2H%dOr2DoY7v7f7ZtJ zxbyefxRj4_=4^ajGxEd-kd*6}L7U#|mmwSXC82V{kr|=L`gZ}P5g@=(E z^xDp=qBgzSPphwrmEhgTv);}UJfrZ0jc?ZVcGZcZrPNnB zHok#;DG%#6_^AD~`YP6M;GRBnHhyaYdGZ-RQcgdEzzsfny;e13<9fVT4coX!KVsv0 zTvUzPxH{)nUo~dqp8Rrm)5D7sav~eweb)${z^=x&>#1Wu+uhQ)u1#ZgY z?zhxe=WY5fEq|eeUhP-Z05KA%k> zPd?;l%CF_2yas(Dggoh^NDSPQCuZZGJk+Z}@5$3?d%4j@r1|FRiZ`vvE(Jyp4aBbl@LgQbwKtZy55ZbAa`MppEPKH_&L~HIgy-hk%#k z-)z%|^2k#j>dC1017U?THE`XoK-9)RqUqzn%hlUiLeKhGZ^Fhs{#`bH+W_*UPa-MD z-vMsOspG~##>TZj4`ipn`)vGnt)HBY>veaa-^SaAk*A!L*O2G7A%zdxxSlTpyl>E7 zL~`;WKLgk6m%ylv>-At@%*H+bY=^zQl{VK`pJ+}?>E-QKyToBzp*xM_?r4sh<|I>2!gK^`qO{ZPV+1pO%~g zcWhkypJ^Ez*M4tW*2c9xPwTUB^&GZ-TF%Bj`hFYN<9FJCjeB|+wDG%|k*6Mpk(ATJ zNC|yd(U01=9@o>xY+Ub?Ps`i5^k1xZyacCSh!<>JovW;$&f7-+%JBpG=>Z$p?VTR9 z@mt4`Cw&M>nf6YnJ`DaBI>?j0tpv|0ocb{6^?08iv+-NU6@A>sYbZDQciQ;Ht=F8we0I5w{Lucl{gT#v8mSsT~(Hoecr|BP~zf6m4|KK(ZC@fomj zZMV}0Z9E)8p8SW97<$&@ar*ES_=t^r_AqMWAIc+7{!9&fs8N1k`nXO1IR|;r*9DLm z^m?6D7X)s|srPy68f{$ndtJ!JwLRB0+qmxcx;7i1nL(cNgl$~gVO`9|_4BW~xQ%Q5 z*LB+XI`Sp|gpJF2h-H@=qWs$G;1> zA&=g-xuDy|wI8@3Y2%x;JdTa)@qR(Z#y$G1jeGL<*?4yxdCK39q@4T%CG-j8Nk3@g zv$dQO8~^km^3+cfNx618z>Ri&6j@21v2h*e%%GkOdavF-8}A-Np7jnODOWG$ zGWckJIAf>;??#?{MoMtXM|{-A?_{3%n2mR7Ja6OLAI=!J@y!nM|I@uU$zSzsEtI^0R-+$(aRi%Gs>w`)pi~3%L$6>7$Ci-=^2& z;=%zN_w+D01wLfsUb}{E{PS9Gqrl6xYs{wCapQ$~8~5ZHw{f|DO}!OtT=z>5u%$PL zz>NA}z{WM7APX3J)9ng2+W6=DkSCuuBu2ZIKdSIBQiIRu2NfQ(>9rjO<0bS3Mc--T zIz9|0Y}}Kx%f|n@8F|W?L}JM4)$0H^o_x*vvJ*D!G0Up_8ApTQv;_xKOn_+rY<_Kw)NJ{J)jwQ(KC2J<%VwRhacb$japn{sOT>jO5f z<*yIgxR$fN(Z;o$^&uPAa@M!mxbFA*u#Nxq81m3VeGEyNey@)MH}tIgy}r}N>mB6D zCxOJE*ZVy6T{iBux7)@&`lO9}@;f$uFXdyseMk)Xmk%jCht!bg^Xxy;48}T+EEwxE}8_**=56*2BzB z8`tAvX2QnxxR}Xy7<}}&n8|)Ha8FLh#yvT+Hm=9-%sv~xc>sCpEobANoc%WL$;ont zJf56GHtzM;u#Mk4h&<~ZMN+Q6#(*3Ab^JCnZ{uD+j@!827rF?r$w$4fU4K!)#d&ljN14Y0?3np9*H5(@-BssBQ^McA>`r>Obq(A;|eD~lRm8Q zMw@RN>@j(hn=V-==R1D4hIE`Z0wMAvO7@6i$97eL>-@-=u#=;bTY* z`Y#3*K91C+k1L$~O!{UQznJox^y<9v#pGwwM-_btsX@O?$tk}NVbXUh`fv&TOA3!7 zHR-z*PI*oK8Ye%KKBMTnO6YS6XE~Ez;|_3x|I#7kF^(=KKa+k?;eAL=`f-Klkec)( z3Lijf(m$$j@-yl43Lh?^-=c8xGwA<@Fy$OWV)73wocv7sMuitj=m~?*B}`2EHiZX~ z8vK{MtZ?!(>0=6SE}>WFh%O;NlRly7qeu<@S3R$A@-yj^3hykTzgOW2q$Yiz!dcGb zujO<~=m!-&%bE1E6`n(C@*h<=%Ng{`8Wlc-)TA#coaGGqtMUpTLu$|`H6NBU=$EN; zn3uAcNgpLJqyEwm5`%t;rf0vH^j*l4p87E8TgDU~M{3e%72b{1pl@b-$R~-!q#smx zA5w$02@iZ!Dot zC_IYPl!tl9*%(7&%A@&o0XOKc*sbWPHE<0 z|4W1^=NJ-$e$f!}#Pdi@`jCrX#>Aw5Md1OYCVfod%_a0tD4hB>>AMupat8l}EDw1u ziz6}VGYV%pgMPsVg_r2_OZ^IGIg@@|;aQ|6|6zr*oJrrT@PQKgyuw+|q*whYpQ{`E zcLWqY%Ng|Z&nTR7ne@#remTn-^a~t?2a%feF@>|7K|g;);cX@K-3pJF&}+Q2gg&e2 zdEex({Nd%v5_+YF%lmBlrsox(TnYV{!iSKW{0YMzE+0l>v^Pb)5YHnq==F2k%g0OT z+g$ot!4mqg!W&EI;|gavgMUc%*DRJZLk zlYW)Lb4X44F@+ByHRoZG|V0n*4JLcaWO&0}9U|HR*>H-d{qm>t#8Ueq7Oy zl+fR#@KKw7XQRRkHvJqmAI;%yga6JpmwryLg#H>1V&BaPl+xQ}5{CIT<8|JhKldocv7sA%*9V zn)DkLPJSl+sKN(J=$9&d2&qY5P&msO{AUFeK8DnwPd6%@f7L>_lxF^+IT0+lh2rq zSBxt>Z{vEuXfE#?{5^RJHm>()=8>I2ulHx>(T)t<$&heH{k%pbW%M&I1l*w4`kB{k z<6541)RRe{L!SJ@Hm>zEFKXj|K88H$V>Yh!GcRuAT0iqTZQPS5VdI{Dx@_FjPq&Rb z)H~&Ikd)I8^=G!1a+5x5bwUe3ln{q)=TCp7;78~5}xXycxKhHTuEXV}I) z{fyYSr=L+9?+qi*_EJyf^i#0uWxN9V5MWDhIRd}~Homk?;XxY@5y%agv*#xHaf9xB0e3U9V?{k)?oY~wYQ zgZ!g5UZv}e*|=;!>El!2oi;uriahBPNQ`!AeKvL3xE}9K-8QcE*_5>L``VBv{|u6H z`pnw&`uR~)pN;GD$xS&MpG7+I@3(PJpMy58pAR+-*|2YA`htz?ewokPM!#In`anNFVB;Qr(8hJY%x|>u`;y3$59=?} zFZ0`MdTrTYjBTxGH6nLkNd-5l2{JwtV$)_7hIr-T>L!J)G zL3+o=clRkgW8+@ESsULytms*Pxq1g|dL94FAGC4({=)nr8`t(cpY<5>H#o>s{t+A3 zb~S&@#utqvPx`!#YkQv0`v!k)&+`j5-rS8m_$**z&}%zi5U}wEhlHRH+PIc;LCD6n zoh)dc0&lZ%Z9fabQ{Yh>_xQ(b+~X6U0`IhOc^;STO4zu+3wh#94gK6tn7D(ajGZjV z05|A8IkPsdpPMh}vvE)U+!T1fjeBwq*!XS-dCEDAq@0{1zzsRIA6PJIe*y2pX7+~ZGu82AGrq#XYt;0C?dzr!}}_3wy{*94F! z|4}3+|A!SmhScC6$}60yfopqSIBw$}eZj_cKVCt01|O}5D=3$NKae5ejQT4Yk(hF- ze!L(fdnRjN9~HdkZ$M+q(#`*}uBIivqw6{?kGv zoKe4s?I>dpiyCcQzelhrWaC;ti<)g*>tRuwjcYwD3fuVK_9IVuVn_@*wH_8xPllXY z4~sf&+|xtC#yvfB0XO*%BhPxfZF;X=$tiHh#=Z7tY}{*a*2Xgdp;!=Zgkx zdau2MHtw}|$i}_)vVA6hwNJZf#HRP!J30kEX5(Ia^EU3acihG^QRLCyE18(`sPWb(AkTUo8~56qvGL3Z@}%!WQm(x@;D-F# z-mdJo@k}0h@?rf3y;tv`jqiyfPkPp0uHI4L1|MzDSB}|uO#pfFVf`kbu)@cY8hk=p z&Vr3=KFus<(EFnVX4E&c9s}3}&337A zA=hUHz3!LhcnP1Z;?rs4UcCt$f3Q!{v;K1RIwka@iaulGdfnR0`VBet{&O?yDTn85 zT+Rp7Pk#yCjXd!|8`tBpdC11~cMs$_R-<0Mo^2kn={-5wK7-!lGiKv@AGJAe;~xFE zjeGSLY+UQD1+ZD~Wdj6e)VBm|ylq(FK^xcW=$4R;%jenT(`@6_N#u#Q*|^q2OW4LM z*dEeHZCvZWC1&ILyN)e!8`tmIwIpoZl+0aWim(zJ}#V-)7@_J-E1}f2$}T>7zD%-GIVlHtz9{+j!lmqVKeE zkAK3(FX&VBT{iCVXS

HU_)NgMb0J2rm7IPz>)#>Q)-3eO_F4gX5}g>o77dh|Kq zTguS)+w^*WK-#;(NBfP%gEqa_-XR;;<8JY=jn{;bXS+shypHW5K5FBB>X-PKjW=oi zFg5Lp^^v}S+~o{43>?0A}#1Rq`)!fS2Qw0nWN@J`KOk0rPu!@5@ zB7!Q_N!uNt``o=-Kl@jo(|}4T6MjBn@$vnEdIJ1=>fQV`|Mh3L$$a|yoBq6_LKP=c zAuh)M61Y&jqUDJ4mhgq7K1Ec7K@k;oqLwKB)!-k04*$E*E$*elH?NPlSn)!KOvTxD zr2-XCg*O+Ar(Z7?Qk&;D6nr9>dTc?m&{XVAZWf`K_(oL%g~IcS#c-2wQi;nO@}Nl< z#Yiep`Bb`C^IU3kA$$_$KkSH*;_q`H6?wBP|B*j=^EzMQ1j4(V!pUDcBAloYtSdcM zh?CcjU$M@A{3GewLlq)jys;rt6zN-9MBA-J(Uv|@h~HX#aWZ|P@~M=F-IWslXHw!L z_~(D-CgEG!-Xff9MKMoVDJSKkoKwkm`dD$i9hFhGun?hCE%@%7m887wQOLciI7)q- z?k$d;K3vS7nC}E3Z%25#@a^3y{CjUeJEzw?hkB!^_btlJf6n91Z0Ebq!c})bZ<{~d znfiWPJlrd~lTV6J@&|0=^1DgbdLML~C>A>oh?itJpXg?K@(w3(@^MGXT(%;U< z(?@EaE1=hRJTF4&``<{0oeB}Y!zskX)5j#umY*jj4!r{VIx(roBhcd!rN<-C`P*SNqmtamho% z=a!$?n@Y?|Mh}X+mh2Jpq+Sn-IChSZ(~$#x+wz#wi&f2~=-MtrER`P!&h_~rG&*ZQECw(ka%KU6%<`}=Bz4>T3X zkENc7#n%^$v2YH008d=6LNoaDIrxul*E)-d3$IE5JD0vlug74aX|lJ_>l;jMnUyRY z_6>zMiSF=W-(caGZ@BQfZ{(EEH+rhcH+HJSm&f?;k-Q;8Dm^Qi{?+MZI3axK^WJci zPmZzl8>f@!8fP41sY4h;9E;!~#~PS&+{Z-S4dlOc0rbC1+;n1rh^oGbvM6+)3JSOH*_KqXPbqQ3&aj>KK z!7ZuE!m`xncN$t9=>2H18F~*;@6n^ao1m*kT~}&z&2#5!>-yrEB>A2IU+F*hV?MyR z>DhXFl5*1aBd-cy`c>s4qrNc*{mOb_=XsWepNsDJ*$20z*Z*rn1mhKDR>{7sKlNWLNsg7}Jd>dPHsO*JPW*L0nhjdK9TY zdT1hxaV83fMY3>AbjL((6LrOLk_VOt*0IaC5_N`Eea);d_0=V=?|Q-QhZ80KOVt~; z+cnWl-cz)z4s|F!PKa~03AQlij=QB{&KK*8r@su_n*=`W*%RcG_C)zOUdxOhlzRy} z@I?=ud06V;b+$hs+n>iZ#_M+Yim?-GMWfqx@v<||?O*6Gn|dRX3_m8~@SW8$@%Ynh z8*LGCM3sEO^~HC7$8iB{sjQ<{bW_(cQS&X*OFaXlu2EM8I*6&dQc}bHbov17PRY4s9CF^^%6WRX@@XT$u2xt#MCH%t zRJ(J+>89dvYCGZ=_@_wJjb9=Oq?msrPZkUGY3c8|ao%ZPaY*_)_)Pk_Or;!`p>)fS zlIgWSf-XexVa!SC$KFUnwov3TT(236LdStmEyhHcF<4LPeNvCH)tpAsGR-K|9fS?OZu?$EC*5f^Em-mpB&F>p6v)9 z<~%%kkn?d&WWSIAA?lH_4rOA!fcW#~=rZL$<(B_1_a{JjuJS#1U;DpOb@=yX{F@#U z(Ot#y?b~X8(6g;F*|Y8PhMud8`?czR3+}g6CevSwMKNzRhDBwb{`lHx@nyuPXJA_| z8FErqkuvM4bonGV*Zd&0xiVQwn*crLwb&|g-K>Oob=Qd&#A2f62V2Dd{J(k@-0-gn zvGV7sS}`+OdG9XTG044N0#|O?&gEq_`A)jdjFialG|A9G@b`m?ZtgN!a}UmIUNt8Tc#C zXRnYZGKTr~km%$+%!#!pzw5-=2k968kc2;|ZOxHZq|hI4lE12E4)UGpIilf<##y=j*0LP+WG59Atqd#1}$P(kv!4lu4OQNN;W#I* zb-H`DRz7v=2GL0yD9n|1A+V0C<(Q=HMT$!jlo@MXw0CJYQ^W_i<A3C#jLo*wk6}IrJ@A)39it9u2k;r@TK&EH zi@e~gxt`(A=U`_o^}P=yQ^zC8)S~IhRKDV=YabJrCFE^VJnXJz>u-9Y2R4;&7Imqn zYa0+FMG+f?vFP-tu0{SBe9d>AzQR)&ch@@E!eZ9*A2;NCML3nIdhK=oJp;C?EO2R&iZ?9!2?+`>qLG zXn)-bn?b!p$%ii8LVHQQ`T;3RPx_M$w3GI2qK>wLaW{6#C-SG7#Q3QWQGlI@>|?^8 z{f-EnN{cx9t}TomiuS)0b;;eAX4*H2?ICwQOijOG8TP;Y@X-af0ev#S z_$0pvWB6$iKn$>&c{2Ykw(%oHw%R7rVk+uj-E!U+ls>{zvH3PaN0~ z^1pIvL;(3wQ?d%cPCDH%7ZDI8HG|1o}zGGV|A%pL1JI?$LGVId! zpxZ%u)FI{Wxo}S~ica<|`mwhlFebDk^m$nbNpU7tf3B<@)3$=%e#l219 z8QC94#X6}kpXg)VVV`&uDeD%v&Z7PR@(yHsCXD%|-6x)ChYx7)5ZD(u(*k*(g*)!g z&cibX+(YU|nnM~udH`u1(mtd?q>mzPK$=C{hj879Ic3UcBDBHwmXBl+OZl>h*EkM1 z*9hZh(1@vMQrH_QEmsaJ$DjJ7Uy|!D$V#6jeVO}AswpP^?iPq8s4woZKwmd;{~GJ@ zJ;W*BBZoyQT)Rv>g8t1?$Jk6I4X*FSbtO`)Yvz8R^w3SFw@KhZWz7$qO=36nG?o(U z<=UzM9ZP-DZ(=^yYb+Gw&+`kEg)&kW^j%Q(|8iHZ|MI&8h^1VwLoSrlvb47>YosiD zn<)QW8J8=28#z}$Ngbg+xn^ZtSX>s8I!n26A$_KlFJSPk%Ar_=x}#T%-JVtpc^UI6mcTh@aM*V>_=P1HYwu)JO`jY z8Bar3Qr4zoQ|bt1oct&0pYV)?{lL29KKB&$={C4}{yW+KrR|`;(S{WDj5axF6WTNT z#RLRJe`j<(+{2fB4BInfUp5FouTAV@Q+~rXmrHq|znJ*)L;{6mpQCQrVifh$4!yp| zbp>UDEOJhR9q!hBk8yf#yQ_fhL%-*?yDx9|WT4&EE{jVUARpzx^}R7M>lkUEgLB*4 z)>+$Seeh@OGx+1ZhyiDV4}E|@{1eV^72L16n`0XMy4iQy&w`9UZ%?dreCuaJY!7%h zrM`pt$Q#!We{UmihmG+a5es(zdSmZrf$c-*?;SXE=6WapPKTTXKx5 zXO89V>cQJeW9XG=5ph_;;Rdormw}am1o!RftI_Fa4jAjpK+rgPMp zGwS^Ge_ow``}K3w*?+dqi)F0wpVQ92Z9hky14f-a@28zyE6G@C^D?<#QD{1iwN&v7 zT=ycLkJ1(*uVaqdy=+XLH5l?^Ep}!O;{?#%%<~=LCcncNy0jnNb=b0D&|N`(q=h}d zOn%D7M$hs*{UYeFx{yEbywbVn)CaC$Tc@zM@v}N<*h;$d?Fae;=?7?&JRgC5M#jr0 zUlY}k@$S`FUobAh8pGM~>ZMy!TYtAqj{8Gm-HCakdiAx%;%ex1d*IS7+?VfZxwfJG z#%aSC zOlrv5IEAc6%vJvdW%K7Bb8#-D?0nY7dGI~$YS)uqKT5l5ZGLaLg1`7bl8a~8b||?x zzjNIJS*3rVoLH}TYrZDT%|oIxGUmqjG0}V0{*PhJS=$3b{9b47be+^ad`<`JK>boC z)(^Skx?Z(rz@a>AmMsN6yKzov)X!i(5O-`qB&Mu#NBwjyEpP zF?YYqp0M^c`l*R$Ic2+LTb*0T+pzPqF{V_N!!i2G z)+FjI%~F& z?0{!NaJE99gTws19DCHx`r_OB@{hUa&d@H*$$wlf=U9y0jzblXvh4cepW4^LZc^BX zNZkAIta zK3DcDY>uKyN^JAb!Tar6_(WOezGEVp_J5CMob;;|-0wnJUzXSFi+^~XvGR_WP~QRH z26unK7j!VTwm*F7mR|Jpj#q=t&S8;kt;W9Lbj+VutY}#JHJkxjB*gZXOSdG&r5WtS zIpICUGdo|bXz2YA@aTsg=W{j0EP;-%_%?7Y-0^@2^(?%mp{M4*HQbN0!Q4|yKOGf4 ziOM9NvyFqU4sA}fS97iwq4ogQ11BTN9z6SR56QD~f&14B|8}0?xM6(~``~Y5pBrZb zDjL$cPR8$VrJwF(Y=0d4>y!I^suV~=e!}cqSXL>&L zF+-lXClAJG1NXS7W2rCL19iB*`1`M?Q$J6pp=a6%G2RFM4{m?_@uTe1=&s3ih{fbw z`6lfMe&W;BkotFCr>BU`PYq<1wOT#_414f#{qf4?(t0O zcNaq^HM|EM4Z}Alc`g=m)ng7oT&$iIm5B%RJ<9Q3&(i6;*_KGoeg19gh->Xa)5KxO zeYG6_*vEqn_O0E;vvhxGj~r+nOz(z0L2k$#U0)pEBxCPQ$nS0)j)}kdBSa8tpKqaY zZxnuIT1+Hm495F-PQ3+s^#&aaeiI;oAD~vg=Zxx-~+_mI)D3{NRGa; zBEk8IXIZA&-($a><=>hIpDcLzUH-p)(yh0(0Q^w{|FVm>1%US%_!ku32>gJ7e@fxa z!1D%vy~OFODEsbZ)Z4)N;%~1CzXpE)oi2iSw)QyQ>3D1V4VP{qkL@=uI^NR~kM}IP5qkk2 znx8!(nz3)!#&NZ`RxE`rJ@2-6VtE95!?RjPp8rw$n@V?39e>{5sA(q{1NUIu)vI;g zD%Jk5vJ2Sqf7~G3cTj|o2Bb}M-?tZbBF}9mtKVgazIsz*_SW^avsdqf9m*WM#13pEr zy+}SA7;1*#kx?({p*Xrl(NtxAwsJwknR-C><8yD?7LU5iHCo^CRCW~Yikd5gbI_QtG#7S*QvRp`_vkoi^$QB z|89>QpK0+h`glmM`QPtcb7GAMsJ40M(8`|!D?)ntlk)@D-CT3y+|0vVcinsd=SQ{* z$Jrw?kPT1P&;F#(gxy5`m+;?O3|_;Si|;eh<`_$*e|=iML&Vs~vNy!1u%}JbY5E87 z0S@*0%a#OKx5KtlU&0)u?vaO_t6dst`{nPwF8hS{Xp`j2aD^26DOiqxm&{FK18AM?~oqN%>rn>Jxd%sxZnHZNwm^2kOjbG9DCCyn&!Q6L0VXBE zJLAYxwl<_nwqjAq7Nu;|Ve$vnA@Vom<~={}mBB0AGJdO!DFf{lD&QH5G437FUfZ{Q zB+vO4_P7_%J>;0l;=PIR=C&N3V^8_Mgzi(yR<2(;=J8yayr+C-tlI?=??)Lq22=OL zrf4(J8D&fPvG=$2hcnj~fAvoZQ0w~3)&1T){@2at!-M{V^8<7-Oj#mB?lWJ`50L2| z&Rgq?Z@eyfxpSDvrhgcOjK3kKd}wn%{ll4Rj)Q+Y?#4o{|E=Shy+`pGw%KYpI3A5AoW9>Ym{rY>ol(l#^9W*dmh-F?D-J*cHQprEb}ZGwL!n-<*Ga% zxuz)VKcBK{PU~DH+%x!?&(!(-H$I-+od0e@{ONzBDtUhY^|CtAw2x9>wBCV` zrjYt##Z%?_6KgB^OnKEEqK)Gzy!nS&j%}=wLT+sLSsnjb{vAG#`(${p=d=3~w6Sx{ zC*)1O?~)T^hJ4t+YriYnBCn!u$iR6yoU8f|#($AX5nz1CxD;}2VqAsfdG9bLQzEqFfVhC`C#>0J>`Oj~!??zw?7twrTH~a0a|PbR3ve8+L|V;q zxE@B^a__l*IZ*t4c&E68@0s9z+zZH8m*blETx%c3bFN(RDCDYyT-R&4a8CO!-lJ_R znOlr|@zlcUu>TKy;5om$Rs~H3%2#O`JpWq>V^VS!f2dHoM zl{pu%KM==$1Ian|tDTd&}G%fNj&gN%2%@UB6%+uplmpV~UO>r<)@xj%3& z-z?`H*kAjSk&Ik3)5am6TvzWAb(ABLbLWusp*Lt__e91pKTaRXU~T5-*{U65YZg9o z6nj^1-26l;(HKvq8*zpl&wo;v^PPAfWc8mN58L)ow${hQv`3Cs6&QO)UadNVeW&L! zW|z0OEF9%L58KFwr>`4hT!;4$gj`#d*)ISq{yg2wwG#HgKW~8>Nx1T%b6?cFlV+!iX)lU9Os_Ow-8$+?x||P1IKB6Pl9?H zm@B45j^e#(yf4B0VfZPW4XsFtPd0F0ELpp|V$V*259RnnDS>q@@~sbvdhV5_U?MEv zamfGjeRJ{btdHZV@`>KHk+*t6u|j&f2&W&Cb*G$pk$l=2f*k%XTp#bnv$B-Iok9?Ln3-q zyoCM2Es?dzf2*Q_Yrn`R+r}b2*i*o|Ec_M3Q_=_ADfhqKeUQpAye}Z*;R7%ZBwzIN82k49u9b8< z@Z5A2^zGXoLM$9ubX>M`TQt7C3wsIMu5H-fb-haOlc{^oAV0QYdSKNCEMJ+2uH)1j z&r(jMH`r$u_Sq)&)H3oY#{~7YJ-TM$_FHd$V&~XkeCL~k@h|=9(k(kr{c}U)Z*b1j zk#oRe>N6&~_OktWC-P#Z?V*6!^;+ckH~vgq-X6kOh7IrgGkH$fKX9pN#PuBR>*0DX z`yu={d`GeCewO|F|0x#9{Z1EO4E%25k6g-kfls-yCj7JPpFjUMxj%}2`#Nc4-#TJ3 z^0zVHdIT~iij&c!lS$Z7pcm`+_N~xo0{X0hKBvKMZVbn_e+c@#@tTJ1AA&w*3Vk9? zP2;%@=yRIVC-Oas&iMAlH$SmAjeS#TgYkGe(~13I*dc6=_J+N9r*{o}jU#nb-P7({ z23zsdhGOC~pQdbhFX9B#@XuiDur=BkXr@7jZu|<{(sqV2TP3ZsC)(U22dfJ7xr{Gq zU+25$%kh=P_=k-)@>-8GImRA8ljM7_YvH5d+v<|FYZfM_-~2>R3&xpKrU@&A==W6yaZeGvT$u9u!)8{;w9 z(RlCL$Z_Z?zjuwOgWj-~cxQ~h5WeklK9^H{+z=C={xbXM@EXyWnd`oD)w@&FvEDwP z*v>M0`P|SaoNqLV&m*>2*xphs-m*ljN+0=TL;D&r^GTfF_=`^s}bVHT>=6kgt!=G`81byf0pKeESmE__la_`Xw$qF!MdN(KyZ~U=L(smGlWY_yhP-`UL3YEi{EcZ~va(*pT!1HmnU9 z!|~abo_jFI$@vHK6y~3gX8f>OoUg)sgZJ!xLr4SA#Q;+7H75`IF-D_8Y`XE~FQzkb zj^85ppbsw;)i@J{_t8ZseHH9T^xiO%Nk7=ha_i*x1`df;+1il|#|6$k4aj*FvT%%? z^F8JFOJ5~coM>XqUXAgCZ}40*J=xRbyR-cYob#@Pt`3WC^xgH}SS>1e?tEVlFx0Vc zHTD`E#20h0&JPLSH{laN7X)6L{FVrTj#zc%7oy>jgP6Op_Wb5Syn}rO-vi$){RYY{ z+utMPcPwaAxPJ+3j_<$1K5q2p<+AoMM_dx#hxr_P@r+gRZ1C&Q5%*g};d1!T4(v<4 z551u;>(Ou3=)a{%>!XJz2gCOlvzez67i|@@le_8fYM%sqSqEbD1Mj{+P0ksV0r#O! z`SUsWniBiDy#=w@*2wYo#s9rh-IIyF=iuIlOV+$H?pqL&G3qLDVG-L&McCfn^d7;r z^@i0I;2RjpFc!;pMe;n4)4n7g+c!NPLw|_At)gl};=611VXjEt`M@20hy{WF#l9Ov zB{06zVy%ZL3;ROKS{uo``<(F@d_&QVGd9UMwzQmTk35rWv?pKM9(@mb7{{}*rK+4v z^gZZd{2b-p!n2~crzrPUX*t-~^@znQ_ATIC?#9fx_R*FH@J=xPRU;qh`>LqTeh+@} z4G{!3t(4D_-Qpq{?<4lq&-WO^8vfuOtj%8G`mgso?B~2Xl5yrn@~t`P3*K5Cdabw# zK9chc=~ju~%DzlLD9=$o(fXiVqcx(;ah8D{)}@_z6#gKC{+f1po)OF9I{X-HAKyM; zUzLkx%Z-^0!oMc%MCoHz=5WrdyLMhNx=UKxC~a*x42@qQuR z6MM^Dk5>|EtzJ1Ga` zOZDzt<;NU~SX<_?o>&z?8+b24-rHMdH)H%akay%zq`W z;kBY-1CFut`xf+H19Kzqzz;k_K5~7(lkc?u#a5Q1K5*|$nKmBbeYcI1ui%nDxo(0D z&XP9Bd4S*K;F@p9-D{QWq|$lHT_^E-L$MruIr|cQzv`H`4$$iB0{Qd==_xwu&4S=tn>H3eqSk8Q8NbOe~ zEk4tGnV7+LwBl(vZ0A5P)=5qg&+ztyqsTwZ*mV1rS&_kzk+d1*8OhEq#WmLQ^%pnS71+p z2<_1k;y$#EaVO(XEB4%h*zJ{s7cj2!QqCEuO!Bb@`RVqlh-%QeY2zm0{{4iWn1e#CcJgT%z`zhSvY zPGeoN@JC79TdeS(NPHHagQFhEjdjO=yiN=@TDRi>)}LrkddDvt)HA!W$hR?;F?R9& z47L8;cpK?uKjOJZ^ytLP^8P;ee!BQe^wI5ilg61>?We9_k9ZzE@l0et;sTycfQ)>u z1iI@+??tpXiQVVx zv%$X`ydD7mZs_5~()NHgf8M<7pxvc&SMovZ*JG~=-zcl0j@lD$3<1Be5PqSe)v5V0 z#`l4{0vLlChyFf)9PEvDB-17AVWPlxr$oIrmJHC%T<+E7qsm8>uzmWID%$48#jtC9R zqd&kQk9lG)_aEFbb&Iq^*Vo*#iS&^jct5ogaiPFDvsE|~_I%~C9XtG?Z$6EAcR$8X z4)tOFP44!G5>Gn5@Q}C~{y_GXQ>+>XO*8A~ebCn9KK#Z1mOjee=VV;|mKzi6vqWq= z*D&Y#ESUOXI~i+ny+J+6v$D_=-$RsZHNMN~_V=beYvB*(jK?`g^|aL7d&`pQ71+lc z3L}o^oXmNc^LJ|t_SbV_5;nfE<16B>j{C)dnD~U8tH^_8!?pN6Rk5Ohd7k|v-?BVW zS1Di24bLDp5a_##Bhblvm4^&Ct5JLu#rX3%RdPLoJ=~ey*{$fug!}AT-c|oeJB2K3 zcfk%JW8}chZuSMo0ryl+GuB}IvE%9>`yg_rsvy4=#`7-hqpzS(utugGWU)?8Z{gnB z$Bv*XA=?9;;rYdQOl*K_bYlVZ#cbnV0r%$c9_+n>=iDMkmdo!Hy5CCL;4{iKvcFyY z<0n)ZpDGhD?#ce;oIwnGTd$}x|HLw+=Q%;t6HIRRhj@>4(D^^;x>UKBRk7$MK z9s%eN;(KEU5x1=VQ4;wkJbS8Ja!~M@%{q4-wY(AW-!Yb<&e8uep5oa?+4s=tRO3RP z%iwcCIo?0^1<3<^BCDzksd*=!rGC>3xVHZ2ZM^5weN@^?dhw5vOYRfJ^huuclX1RC z|ELg;{G1F+%BK((66+HglOI))}lYc7#l13YydIyd6j|PkL+6v`@UZs zhb&UxEK43epZdN0J|yJ;U8;9g)p*}D^gUuu#B9OHnSjX7t|?IVzS%Wr*rv#km>U!E z`_Hy1F4y4hKDQVlE#msG<5~H)NP|??iL-2>{Op={T62tNeOQOQ@gncLXT*G+cvgNh z^BL6BT`P(myX1FkWPh-4&Z|$LZ`ZCr@+e8lXr(@qJ^m14EE(%(FL$5kKz`r(=p*uKvAE+^ z(S&onol5>b%vb2Y+hw0n58z#gs`-=qBGS*me|T$ZtSdNQla~IZ)tR|c`WpD2lJ)jS zVV^6tUe5PBe(=c^8>ai4@5Xn2TlYAyjp9(UwgxhbjkxEJyoPT;IMP2SuphBJvS(Iz zBa!(uf$L}Mf-);%d!3U!kaQ?yjinJ%h1L#Z1hrSlR)7Mv9 zgYSYBZ$e$wY@@6T&qmhXfx32Ju8#!d+Ay-eRzz;EE~LX8)1r~|{N4%Ai1VAx@F@d& zPu(2@g`eU0Cv%Xx-h>VBS`vUr#lR7@)Jg4_sINxAy>EM1J_g@P*VZ?n( zt~X-h!#_@-4(vP5UtfGp`ie-8n1O5Q`g87EHgew6F?;&yalNlSKGpuUyVnwjUlaKL?Q3#u$#aqii}(hqd`fL2a+k|KUWe-^aLvBF4%dC4S&VCb^BL#cU;8NABj10J z>%R|69jJc1i}s!0I=fr7w?V%1kgFbyiJPT==v^(Y32(=DK<0=w;e+D8?#1R}_A-9k z>Bc{juiK|Zs)j!w&Na%l82glc70&rS!9L|)hK_5|Z}*(-x5>ScW9TxQ73^ z@p{sse`O2|9@ShQgC-2y{weR}4q=Z5_2OLNrkF zhv$qtQ8v7Jg+RFrDAU<;m>Y%a2);&s(>w!R%QLE* z5v%v`e8c6~bGT8CX-TtRRAjylnj`owTKY}i`vuGQtQ~tcGYjhjKI@0Yla4*hdx)8md{)$c1D=uHi1&Z6pWkt`INGx|{;c~f4Dacq49??^ zM2285L(GpvqX$HDPtW+X>4S*J9+LCHO?c)azp1Th@SVXi_ILWa3i)1iYO}akpXE(% z{_(D<;#5~I@tm{6^P^odc6p(T_Q4DfNVBQ9ka&g{x%yMpEC2J)6ocmiw?Qi}np?o=5+ozva6kPx9>04RU?Z z3pw_z!ZV!d?lYzAES0atcpv(G1HU7VvBfizYD^&3d5<;f-Uxlkp;sk(Vm9iO*1La3c*k2`w+V+UcoYSFYG@ks@45Knfp&f{t~ict)DtN@+`k! zojNoh{^iem&?Ta0&B(Jot8Z-B-%@!AukAKXcJ0Bq<$Hn~MD-fzqy{>9X7dl6DXLOThXwg7W&yEzx%ilddSl5$iLkC zXDLy0Z+i%9&XD+E_jKP^5EqYNPQH5IYEgy0_TyYs4SC|a8tKKb5!g94eCLW4yoSAm zK)<37YgeRxq&{bEg&*&BRbVWjjQF5i2H#bi6vfn=kz{+qCs3zgUw(NS_SL5Qn|hjg zCcz)Vdf+Yj?OHs40lz=nw-##w@FqR@Rebp~($;t zlcPnPwV8Yibk~tjLWwt}f-F+uw1hh-U)Dv)`?+G-6Q9uiQtC6lY7{>-t+? z4DTRsqTh}T313WHE8{K5Q@#H+F&i??MLK7F@#TwICw#0ME2bGMUi)S?cs<=1#YsP%9%Xp2lG9F%E{CByB;l(42C%Ko3c7E6qA>sbyHk zJS6w-7=!It5uiTg`$I}kj7_AjnkF|vHzEsNX69AlJH%B5jwjB=JiFgIm+zPO8ZbW( zp?`mx5a@f%ft-UVE9|#FCZbX=CHV8eZ;2wYl^YU%`pY8baL!#To!R_jdH4<`-aW{sC_Ch(+>Tg= z@v{zjALlV*u$h(g9r#|Z8{56doG+i>%9wNYDazo=yXG=pr;C@IQw>Z|Js1KW{lrx8|ffD(pyyeN2Zy1 z0j^0aTj6U^_EFdh?0H1<6Nn*3ulZB4_@zH#zv%Je^N}N1ryN0i>dA4#KJvld>oKO3 z0e$GW`${Vi6W_3%IDFoSI}a3#?`J+#d^*8rIr(sXK>LQQf$Y4hape8XBla1EuL*FE z5PL*#xjJ1Xbwqo|{UK*wz>l@mgeu?6e&}6`F})MKz=tvE-ZgAX?ar0^{mLxY z=$ltyk1_WDs{L8W4Et=R9pfC_PuLc;J>)=k;Ol5(*y9O6=32@OEFjOM_VWI(e??5T z|7dYUwf~H(FX@jL;x>QYe2=|=7-QLY`C|wE$@0gmO=W5&Gn$>H5s^PEQ}Ca(EH z0?gMJ|L=R4!k-#GdbO0-K_4=rJwV|W>#i=)la&y zh%bffCuj%o6K_BC7<|A1o*}8oAgy2-;LYKtz!=9YV~6)zYdLc!UcujRTFP(F(I&Ac z)vz~RHNJOk0I^sA_8InMhAhGRUJLkJ4@p~o0{f+Rxv@o9+KJQ&*3;oM_EqJ+AOGfD zdkfo4pW8RDCW*AN556lhgg)gyl#=zml##xPdA1#S#H9g@gUNx&0sLKyP4b(h-JEmN z*YiwC`$Pg|RR7=%PX+%b5Z8A%A;tdiB==EL90y_ODm=t*b^P{v$|(El=wzqEd*B;B z?9bw?ho9#l@vib!svTk7-{94Nz6r9guwU4~zS_ICYMg#1CO-H($|1{GedK!>`?Pnt zG2{nj{6`wZ;bZJ~)kfJL4*DGNkMy4zpMNjpr@so~`Vn5E%tl=QSL(*SH*vt(RNaT? zK9?l~eZ|DXz+r==op2zdI@9ipQKxcT`>M0brer@tzt#I6Q!(LVj0u0}Bd@UKZ^HW| z<`9R!fv(V(H%kn*6n+fPxO^24qYSq4*dIP{QEY(f$)9!9xsNZufjg>r)AkOJBCDm3OA1YcWDP_ebh_6 zl3rllChg};ci6JU4_?gst}RX`pvMEy{SCx$ox}APcn!PDzT19&Q|0#anc2p@rI01c zZwR0to{-~@YlR%g-_=i(7j2v44?F|t$A6_Qu^(wmw4>f8**E^ZYXdxEeSq?Yd#j&{ ziIq~H4;}OWn;Q3We205$c+cwxx1AHuGlr6WkMkSm6VSAa9fj(pmqp zaye<-b`|Ab>skM?@&xbge~q#i`y!83mGJ+-i@d+5srt!qZ4nPZJyMKoU&Yu| z&bJsl&nB0g_QpfdKyBNGcVS=q#G-4JZuQ?H!+SGL;&X6>frDG|Ou1G*f5v#k z-z`Ep&_Bt#p~riB*Tgq$4^?$exi^GHy~Gc zCeqJ-fE+C62Nj<2);*%725n8&9;kW2DlxNw!6m zt@X;nzZqqvyl$IYe|Z{Ub=%)6+t2=%XV7F{wq8KG^!A@MaNUZtW%J!WUG_(b z@A%h-6Kl~&JFrKOzr!c(8*SMk`&FMEbJviO4uNNv6N6yKpZ9K#UO&+1Njv5m8Rv}h z^Mo5i<69`LIgEMQGuO?$cI}$aRqnz!yykQ5Mc;=rBj1Ybh;LY5Jk|>cKIhm!Fzuf$ z0=WY+hNw;*s#*EXpUZc8=u_brDxTpUB+jewnK@%L#8UYCJ!|p!X)A0Af5RE?*?M~l z)YW^%jk(!kn%dW_!Qbrc;$9xtD?DdU+s5@e@;Tpq3Y<|`N}hNY92& zK)>*8DG%nJm{@jO0yur-j#vF5)<>IxzlQ#O<4RW-NFRpp=d3UOMEVo(s^Xl& zc|^@A0bEaG9oT!VGv^lcP2rql9)IV??YoKLu&8ilOt9SroGF^P3w?Zw_rd3sjKf6n z9hJv>3KNgw{%MuR->jS1jrn_zL7?(KTm{m&kKL=S`qE}bVWn^ zHvHYqhhl=Z)sDJhQ{02&d6ji2KdH*&Z@5k@s*A4ck9KL7cF_iZ z+89d7fvUc{y|D z&OtU#TfH-kWsT?eKRyW`cyb=VS&qld9;g^nMKD_VGQr6f`TJGybbT{f$R^rVJ@paK4jMPxcHq_ za~pgYYa#=p4F*G##>Tl!eH_R^l12iz;(!{9!S z?|RWUi7_+Bq1s&i)-n8kA;#p7_dVPO|8{+@ujz)!ke6_t47}cL3uis(=KZJ9Nb-c=S-a%K_>JkjyJmMQNNH6@G}!Q#vH&i zU3`j=k9Ogh1$dD6a$eT$Gp4+sxR3i|)}!1+Uoz!Y;(QnH*=^=&#ALb?x(Aq+?LME~ z_u}^nw+RgYTpaN(2W|Yn{+u}WYB~XXmtg+!k8Yat=|ed`6_~yysetSGkVbj#5Z4#? z{b(rZ5DWdJPk%1vjpN|mmf*jdbmWisU{ASwLY=awX#@83ThZ6o^dx?(T|6_`w98r7 zwBK2e*NF9-$2tudQ(nsZIF>}7uL&M4&fxHtq*r>5JK20coadbJd*ai^!yXvFhaVcm z_7eM=2im!oDLyJcGB*&|4PV8$D0y%Ap%nBNNd-AUJg<)pyvsE<(Cwz&Ey>%7^FlkR-Pg1E9{zrb=Rod!wQ-L0j@8AzbB7~Kbhq2Nw^`YGxiMb`$ycjbuiXO z&Ds%r`bxa3oH3CyH8x;;x-0N*_wxJ|ja}FmopSSc6kK<-AA4E8#rQgzDl`qnV;m>%#n6wwZ z`L5@e6GVMbK8Lx&3O-kgInp-z?Zmst)13?YA|Ls@qFuWoaqXoqFfZ=}3+p)Za?c<`%VYhLABrW*uQM`c({c|5Wwn_5E zOuEw>YG-?!_CDz$lb9339C5EIeOG5vH#W)(yaT1 z6Qpd@X44;zZo+RDzDFE+J>1_n$NikR%M;I%{d{xWkF;xzMoVQ1JCEBf9`Sp zbF8R0@XMW=%v)jWUnw4V?%kwa+lFf|s%zoLk8o}*nL1GqmNj*PKEl^z-5X53n$i9% z-B{juM%#gYN!4TQ-#l>!`Et)U_Jhqufp^jNG@)M9Yc@kWf%hZSH?DjoDC#kEK>Mxp zbL)%7uOr<0#pj^wa_xnBD(dK1;pem^e$)GI|N0wznld5Jov!_p_R4!iIm>%C;U2BO z3yO9F_f!~ijwP>qe*P~psSkVybyN87DWiE!v?Fbl!fCaS84qJm2guderEG)m!2W<1>-XI7o!AE*_YrqaE}WgmDg?~AC#Nc zm$cqY41LLCcxHay2-iZJX18En3HHv)LeV(Rg-`IABfxeK z_nrGkVuDv7uvg4yZn`8Jw5Jf4G;fP@Tqm7NGaGg4f^LDkc@A3Kx8)1%o-N|MpZt$K zLJac%18nhW|F(1Vk9ZCK7Zb8XvXk-tBNIHImG?Y?dv>@wU)&<)a%FV$PX}!SY2~%i z;=F(UBPFkIffs&Xzml2-bT_2LyTv_|^dPMjGc>O(i z))Ti5_4FMn%BsJjUb_EduiVE(dnT`)X5l4#2fQ8xuZSzx>~xnt^9O?7Ez>i= zYobVtGR=H-Ag`8P#J~${5B@0kAefykd6f%#m)F^g`yTz3NV~k&it~Q&z^y~fM+=YD$rgODA(@b32CJIPBtzw8oqE9CMV zzggpn`Hn}nXgpn6`}54l+&L7hAoU`5X5AE3C zrWZ7Wh+_57409Jj=CJf0`Yjc|_)QKeA*< z=C{TqC$=mThI)HItQ>Yzt<)C9fhG$!>0T^^e1et?p6UOnlfAIB8yW@uBt?C}q zyZi^8$?F>ZSf(ZY63H9u^^%4Cm@nnVSUTwToq<%`3mcs+>Ye*MkrReJE*5<8Pxi5# zw}>w8`^V9Ozt~4Q8Q)FeGi-7;<`ts67xM~tg^EMlFt1R9d4*ccE7WZs>#WXm#(pgL zVP1T3-`2Z$9uGM6d>+8F{1VCled}RsjOEWR;&oS+P%rL%mT7#K31h(RKNsguI=kKL zc-DUg&+7j;I2d~h&-_n+eH`fBx()k*uN=3YeTukmzaxJ46e`Y1A2>%aHdp4e2lINO z+@Nm*vHHl6?XltKO^6Lm6Z-_Ny%77%O}Zsx?SWc%v;J6a}t|mW>(MI81*aUN$rNrDa3oHRH>XMw>k>5(l3FSG#CrKxMBRDo7 z)=6n@1^o=qx2*;*p{w-QICu$Pki1$I zFYp;D@{sRz;BWG1i}fGy{rvH;v^jJi^ER)e zJTay`kuC88;6IW$+UFCQAYl+|x2ItBB%R|L>|NcI4Ef^trV96^YZK1^3+wTnR`?da z6Xj&{8G!G@NHaZ1J^DW7`;^9bFibo)9Pc}@XYaLf%z=WZ9y?kfPh97kjDGoD^Embf zxp1+{Z_54PoinL_eitL1doSivm><4n0N)b%F)u9(hq~kd(e(+x;}K(yCK-@df{(vkjGo+pN_KGuI7We zHi2?ePRQO0UDigBF>%Z;^BX}QL~jBEU}i&58$N8)*?uML+N62J8m>u~rk1@ok| zZK(XB!-;VP*V@4DeE*i`ob#gyZgks&9N6m|VFxj{x&=Q!#&`{FN-xWMZfj0k*Gt&5 zj<&>l5&nh&^se2Xz@ih|LiAxL#+bCPG9OpTW=sTBO$@1G! zj56u$>th?^?i=VVN4*&Y>;!y~Yq6I+S(}`nU9BbK`W4YO%kL4n<56j+HqB1sVW&3ONvw_3>@*&BYJ;7I z`q*i-uv19dsR?#!V_j#t{-rfH7?0c>fr4Bk-MA5Z3Ua*_Y{os(F-BqigZEB9STp4W?OY$vgYq$(%eBkD&Yzpo%a#A8UbIl6zsCm*DL z(l7Zg06vrn-ch#av=4P)zr4BF8HC>&!dLqa(pPg<^_{q373}{FuDR&zpq~Q!RKs>| z9uFVg%=dHXD>sXKx8m7nQUtzzqIy$y9MB{`Ohy;O5w=v&ftHv0i5kXT!KH}bs6%aeMUI)z*N zvg246fU;@d02?%h-^rj4tY6>+duUI-@5lT3FZ;G;!-hamy&v3oo0BT+am(KP##{KD zbD|3>G4S`n&W2=XRNF_+l=|fGw1(vQoRg-nEPQf-GdU-MK0a${M*Ztf2g)J6erWbI zd3}OAUJc>;VtglI$o7UwOEa*hqEn4m<7LhW`Ybb2!OvF?eb)*8C;CcA^Of0}ui*Cy z{e9(7gOiDNf5f5N&<4>y@R>uG!sZsA>DuCC`S?sT{9=OVGpTDMP`InXUBA%vBGwi6 z^O+$Zi|eDY4_|+u$%D@<{0cr3l0K8r4L*b4=ioQ}jqbV?`c3`1b28{F^qIfLUu0Pc z-{?+8-TTN1S$t#mf5bPs%A8D_Z?OKeT|A2QB$vI6@z8iDYtAon4%0U-JAk>c@vmoy zJ#*1MT%P2PkLSXeY)8b}6poL7<%C2#Bge;c{+!bx+mTVIZ}YImmE-(yV|=f}HLba= zN$cXo~G z6MM&^o^R{M+B7~3biIT&tqt|%a@3>q=4WuPi|$9Uz6Wh@8`fjhH%`vz!Z$8axAr_) z=$Q7)WIbXX((2e#s*bUKv2Hb7o;5iZcgBhN4rkg^^~0U~ZuA2U@fBDPg=fAeR%Bo= z&2ZNU?Cn{9OGd+_0~y>W7vr?pJ^%Y((4M6ofw`RS%OEdwXnYZSE569K6!vJt-ZMK- zbW$Jc@|X00t>#glu2d(pu`LhlO#8~*cSLD_&pa?*Yt4xb*&VwN`|d7Y`dq`EkO$v& zxi+2>>=VBQ2!t8S^GtLnc$W|m*A$L8E)PMc;s3v+kw5l13oK(ki1W1kD2K{Z$s}UX zrD)d_4e!qYu4ogu!nh{1-Z_xbix_QkbQxZ=Z*$K}V#ELLK+M^c#IlnZzJ0MNNuDos z*DRix2P`PD>=@>@|QXlI}C*RCT+u`!6X+v=GT{yHnRX>hO+eig=ZKkMx^kBT`C zcMhWsmy_^lmhLKt~* zjsf?I_ol3){MHHANmCZytEVAK@K<*yc5+VC=&-0CN|07;iZuALs!-%cr-AxI})}aXIHG$P@ie80%tB za4Zpe8qW~;HXrmKMS7wCP_g&Ul=)#N3pSYW&GAD10PO?$_wjouLU)W2X$SH|ox^)M zF9ME-UBJ~-!va!T>t@l}XdAy3R7u}&i2)cIj&NelcBGU5H76QIo~8|6WM2i5(& zuFH%yx?(di+85tsI!;-5kT>Mn<4GgOd5!Kj-$a}JxcmEAjtAvj#$B*sg`BtHdV$Ia z7>IAl-RQ3mB~G#mei+A#`iVEy4!G~%m$&1jB;xjpOjI*DGB@ZyYqMV zqZMl%+SjLeC+;=w`zo?%^5A=KZe3mK4{ICOs0X1(I`iK#Eg zlER0u?vrB%c9FDnu7c|uQ zFVV4Xqkc7kltK6%zW3dMxwfI#z27yzUhef|+6}+Acmit^M_z-uIM8=;e$J%fTsG@( z?!AHFg@5BrI70hHP-pOLL|V2F#5R}1#@|32G29tCh=~$ME-()s9Lvt4QJ#oV#oDXwG@_zhAvmMueB7d_v66eq2nfSHvkNTdX z&J7VS5A2uLMt#sWr-xtai%R*@(cYC{PM!1fvG7Z1r?FR3FYFC{lkgiswrgS?KW!7* z(04dtpDiauzoPDitRpZ^&IUbgmLzn!llyP)Bn*ef4qz9(8{4iD~AGQ zOO!)_r5r-^75bPcgHDVS?!;WcOMN?F<8({;v@;*Y(<`47n6nyC#`TE;!ii{a@O(0N ze0qwQpD%V&_$+c$j&nYrH!h!#y&utstPf#-MAYl`c>ZJi)R=?sfAhKIy$PLcr#QcH z6wfn_JBMuNa|!2V-S#K&Dds3r8^-r!;KPOe2aE&tnqKLk6f!W zE8OCQnz~`5t3msljR(OqxxQ;bZ0#bvE6rPgxv~W@e7h^9VbXl8d%#|@&t`^mTLT9h z|A~D|ASmXL+ud;z>g$f&M+4cLG4}+1PSa+*cex)t4>?I|Z`zdw-bt}dNdL@9ZfIH% zgN(`boBk~pbFMfT`we9K4f1ow$Le>_jn%g$#~PgZ86o5yOTB7b3*@?Cku$qt(SlfP z$fl%6z(1Dya#9Oqe*}C(?a+5P@;t=fa_-97yx7%e^Kj(Rne6Jb2t0>dwnb~u;Ueq_#sPJV+yjQzjjToLO-<6|NE z$ENyYq5Q|Xon-tDF=hQnSB+~}d^971=gaj6kzcvvtp6BgfO3vOhL&ex^G~iC7wf`v z%Fm9x@CbfSMHyO#IZ2eErN>GBYvowx47m(8Nk{n$eJBTckl$CG`=UOSgZGI!iofz+ z6bXaa1E(n&3#uVg3u5vWSL8po2duZO)10$KU4F3lNoQN{E@wyYew0PP*?k22939DZ z_M)8`CC9WGA<&@iOpSmKzk32%2h8)zECO-TAfNhY67Nc5%qN7WO7U&?O-=-BFmH>1 zj(n&y#}k^Y2_EYE?&_Plp;h@!y&IgZoUf$ZkZY?=cFb{>|0Vtyj|YV=5huX@9R21{ z84r{3DU8ve&RXXD>K^s%2C)-Cw6AC<**?;y(DSZ%vUtD3vDp2XJ4u%|jN=_fYC~|y z5AdvjefFH|(6?mPmpCu5FA&dbqV75KFdvqL@kajQzKx=;ajYZOZnR=A%8kx-cz%d- ztksR*!{Ikmsi^mXrd5vfAbtx-TG&)PAMjZ~*;Vk|AbyjCwW%8?MsPp;ARyj{VPB=D zB3!fF$9}f^a{3C&bm+(z&<=QGw}9+lFt1gQy@>U3E$$1jzYz0Y=zor(ujxP5J&}v? zt#~d(8`3lvVzFNizTMg>_7#g`JoVCvcQ;&y-vDmrSop+lKKo*iuvBG3^aJfIFRVdv=U@Js zHdx4d{0r{aMtR}$A+!^_-8r?vnYZ!Yp1G0)excRJ$wJWdkeX`K=>>=BE z53ov?zOP--Pl8{hWTx2v4x^V>679H7BXH6IS743z1}4-)!%GTkO+628Yetz<)gg}QzGpjWq#?^Si%mHUu*XT$rk=Bz{2 zZ`5_?uNjvN%=3%oUY=jz`*&`8g0^R&qQ$r?>dJRwghzV<&&Ubd&lT-ssN<6MVU4!Q zqdkExScJqLf9y-dexi6*ncFVs=(zt7`d~ii$a%S3&NuWv8Ib!e21bZJCgMzlFK1w^ zFV^r(Zxhd)hatm6e&-U;(OsDLaB_07e-N^5#TYTC40An_zG0P^TP;CbSAl!V(SPy% zBi1O1xIo5H85hgAR>l)$d>vx`7P}gJTA4>f*{w0=!MxZ$;#vvwf;_D`Ss0&Ut`z-n zNkb9(w6TjaT83lY(6eYyF@_JZUO`X%mgFvu6);8!QWv2k)-!SMaq3CF;3wYGa@@r_ z^ksX^Bfn~u_m}7U=Obc_f^SZsZa#(k$`Ru?ko?^*<~AIs0PzmQXv?uzkmD31-io*u zaT|V&pVY7j?_;T3?$V6MRzWYw|JZY+KT!a>>p&MnaWIIzn6SoXlbdw^b3Ih3Jbx?j z3LWP-wiZP$G(HXSl)hs#Zboq(vZr(k=A?Tcc!=w*Sh`A^S z`;KEDiTYx^D=tpPF>uaFjdMBnq3_klu}*;Fu0a@|jy;jfabYMP2(vyyMbR&@toXZc zj>*=)$~BB@MH{Z_rzjKf6LW0fb*(psPpp%1fA2C!JhL<3(4f9AxW`ZMLIX_dFP;a)`Usg{c8be}_GR}h@E$VBzY(-z+QT#r8PAz-|^FEh- z2k)Ob9|U5yll70d>sq+i0sZL6uDTGh zcYdOw$WPRCn{TiO#phePh14GGq7|tiC>&zc2C-QeN z4B)l?^vPTgU2WRi&(?TOYJuHrVC!tyx<=U@+<2MC;Qy=RG`>jwh-*+ZI^XO}C zol*6LZ3D{{yi z^h?)P$KK`j&}jJ9H}Fl&#{=8yM<>VNub6ZE;$iJt8Ln-T*J$I|joq1{&`|ugAKw^g ze9g(x^=Nzt-&%wXg?yN=qAk{SpEsdl=Aw-5qCm9gYUqdhN4qq<(;T|zif>WpVfXy) zcVisu2|I{6(IanD=X)07I?52^s&6WN@T~HAzdYUXR}<(0##=(_mK~Yt(s=6*%9WAX2j+#A#l z73H;c!SY(Ls;C&|Q25dr+1c4rtt*yX8LX%-Dk-nJBe)V;l$MMg#!IAIQCunFHKlcB zlH5&~*FbG20xUAUrmm7CdMWO z>#D1RwUtE`6*vo47Og4`)|OV)mI^VPVOI*FcnK8M#YJ_cCBe$l%Icc6!IjW%>9X9f zkm!5t0{dfT--O6#W9l~Q$@N_d}ez(ps#yLg!vt zG_|rQI< z@;j zgu&NDiHNjoPyy7!j&N3K|H?|3PYAxYyi~}`>*Tqjs95MtIVx-Kn0j|nO%;6IQR&i} znrbRqRa7Z78ZYfJwYapR0yY^>-&G09QB-vYZB<-d3AM^aod@h(J^z|1Yc#{K{MWek zgqNK)rBx->HB-x7?NF}5hF-b`=~}cU3MsBY3BmbFq@6`M*Q}1#$#P;-pxf}EVPM&z>a4CR3Buc_7e`ldK;WG?}0cW-Yw-YiMI?)|A$;VPrFk8U!y!+cHVzb5;2owu!5w!J?I@V!??e zLEa{;Q(IT78j2MaMMB&#%xd=(g@S0O;chyOIQ-Q3l;~XsBooqc%qyrWDd?p#bXBp z6V8}6n=U896*JKX%?W0qpP3Z&8gIe=n%o6JSq)*2rO1)lYiMv~O?9PoWn`3nQEZOi zKRv(M1M~CTI0#AZuC7@n*-9}*JHbY|q^wx9&E?TGvw4kjp`O$V%UqqW!ki5vwe zC!M6o9M>^cSFNh5zFW$onre|h<({SF7CEk1y>ca-3_}aBTS1p+<@N>_94$;#)j;T- zqwW{-vl$T0B0Q>=*JmXBQ}8b;E=E6z0G>PnY+LI^cfLq6FTt9-6ra7}(tG_1jK!uq0r53a64 zbuBIv17Fb+>wu)gV56?OxVoYrF|I|?s+kyXSy@wbM@YRE&i;w#XA$wmqdnHXlH4dnd^eT7}E z_g9u<+=RvmE`}Z>T8(k4>r%Ww(Y|Q+s~c9ZlyKXWU}-E`ipCc{DxkYD3`Qe7EGk-F zcT~Uu)0|u75TU5%j@l`=xz%`Td34IHs!NXEHs#hkFs{A3Xf5#DZk@tD9Co>lm1r0X z5Dx6$w7OMI&_QsI&bLVvH~6))q5%fQuwc+_);xx6!^+W(x&uu&TeKh7pMKGMf;&k5V<&-Jm}xjyB7?lK=f zWj=Vl58iCYM}>Xx?RI>$k3GjsvD1(7DVOtn{O!D`olh{;2VdfYAGG6Read%iyPbZV zkDbT+)awc9c0Ln){A5C}oql449Y5d4f6kBF=`ZlH^94Ts%vTn+_B_kSo|An1ZE}X4 z&txBcFD$UrU%1DPPw}Cj;#04uAGh<#o@d8r_{cvq&rUzn$3C-1+39Ed@VO*xr@!QW zAAFx357qhLKK9QkvD4=?`QWWSc&8no^yg? z51&_j@J>5EZP)6RdRa3Gd|DRz;5+R2BR+O}q|8qLs86}HK5wUg%t!t$K7RXnhn-Jb)Q;n8Q3wN{6Tjn= z?{|IldOFk2=V>2(pUtq-KU?C1`?MR+rP%483;WQc<3sIk+!J==?hxbut|84iaG0{CIUl9E@qu<3OT9h{y6Jt{G8X>8b1l$r z>QJz-Wt#JTJ^{pK>Vlj8Q1X92?xx>wk?}UhG9=1F0f;5v{T;;8oc&$ewZtj(lJXvK z{nt5=xE6437w7KGF4iU7`?X>K0hPviN<>gNNp9r(-_+SjyXciRPz#;qUHx>x^~36V z1SkKU4yzC#obE^xes4N87wd`h>d#4j262A< zxgrj6O)=8h-J~7s6fD7dN~I&zMR_G}x;E|vdH&xmd^P=(p?@;;pYors|5waEj{H0G zoC|mTXWRd)<(~rmQ=tEa|3&(zK>rlzKl#5%|3T1y5cHq?pRWIZb$$41s1oKkFpbKNb3?LjMa+QvHWQ|Dn+T{F7AwVbFgV^q+W=>OUO%4~PB}{wM1H zy@s-+XE4soZdfPcaKm~L=XI}$Z|%maVE(SIei-**OBstXUUownenW<_Uc)*O=QXTP zeg@;de2)A6tNXLRHvg~I|DA&JKLzDK?tfzWe}(b?snGva=s)%()jtjTr$PVVNveN3 z^iPNW=bfbbp9cL;gZ^VqQvFYd{-;C#(I=_?XF&fmp#P|oRR0XR!`kx2=&x8KyC#n8H z=pTgsX(y@vW1;_8=zr=-s{c6XKMwkza+2yl9{P`m{v%FO{U<>G3DAG|Nvi)u=sywq z4?9WqKOg#^5B-Opr21a~{V#z2sVAxaS%_31cpPhSnvQI6nvXo`v>e&xv>n;+ zY&{xqwjCYo>^Pe1v>z>Ub|2l~bR2!s*?V-C(|L5i({(K196mPI={=Skz@F5B)MFb0 z>BpW7WFFfU2p-!X$ZB{EYkGDCvbmOLUIc5pP1-ZK*cQ@qjhTPqdyBjihL*{PC+zpv~ zAaf67?t#obkhupk_dw&4?*Tbkogc~J_MN$LFPk{`4D721evjab+*24JS}kE zQ(WJZ=KNkP^GQ1`vdv8g-1J4S=8E)b<;L~FbuM1!{{A3wz0AG;G>OM0ALldoerJE1 zxX;FX`V8_M;0#wqCVh z0d|$T>e?G71!qm0J#D7rOsid6Sy!|IaUC{!WL&1su#ZmBGFMPO#k0Q5VyJpbDSY$qxQ+cX`E@t;m;oW1);A*&PANk@2W}! zathqj@6le|<45JA?#~1^Rl}2Up70Cg8)q6e6aM0!i~oub6InQX@;{UD6%BP~z@>O7dFJ!`*$NBu*vqr~9{i1)y8+RJptGOl;>Y z`5%b5kVAW2?cwitN}TQD^&bA~CW(g;7kGG2fyDWH!9oxJn0y&V;i&d-_xEEGU+v+Y z+ei#`vheR49{#DYAFv3HhdlhyVWb%r;&{x%&k(=!6;~YRpI}gF|HxK}G5S}J{-e0W z=ONzd;U7!-F| z^rL{+d$`+Q;@WQD4{A8lB5VWxxQDyH(}cM`2mZ8&AIOvRl=DRo-?!Jr1IvJG{_tCv zoMG@`;BR~MAN9JpQv!Uyhkwu|@vXo=^>B9_foq$9YyQw#Ch1|%q(L72C#e!I0G{FD zhhi=shyoww;h*f5_;KJDc=(5qTZHF7jm5F@=Ds~(eI167~8|7b`SqZ*`NBp>fr~$QUucf+`~WW)bI~I z{L^g`Uk>^%&pwCqB_0I+?;icf%0A?;wF8HmUHZUNP$|Wu|8Jk1SLKJ_+$_NuwCLUz_tEjALI}L?Nai5kA8o;#9M(c^6&#&C64=&^F6#%`k@mB zzQV&lh)R0qtJU|eh{UsiulMMG-6e6_p~=HPXp=bkG<$ewr^NRHf5gMz4@!I|@c-rE zzmfb0&jS8$9{y{kZy5N?9^SJ<^1*${uX*@^c8O;Kf78Renq52{_a*{u0)C@M|Dm+A!+dY|@B<282E5qAySGXH?ZEHW@J@;2dWtqa>5_7$90&dn z3Hx01O5CMqyOi>T$ET-5;*|3l4_EsF1V#b>ClCL$Mbc*i{}&JcM9P^`2K*%t@7^ux z;U_8Yc=&I2xOh@8@Lwk6l+UZUMmc}$(f5QUAKLBn^hA3unss?;P_jpVXs-kz&!FKR zejq0COyHWI{01x;sPCY$9{q2meFCJ{+Mk1AK`zF7gD&&vyCFA&;B%#if0FOw4)Pgv zgNM8OGT_>B;3b~_9L|>XLEur3{*2ucM>J@Ihabw5_ypjaJ>1>T&Am3L&BH&)lJsal z2Wjoh$BGZ_p!GYQEt0+-xYllTh9rIvI2$9&bH|`gFW+uuhixG3_V9f%$%l5<+KrFf zT|6)X_z{o(6P0fU#yVQR^ReOsJqD+F^dBm{;6H;$dU#J%<~t8~(8Jw*CvXjR7(CI# zKWUNlLEzIo{7^*Vu>auM9==b)d@dNQjZ5crsSChw@#uT9Bn~?b*2X8@y%I+~8oXMg zPj~U;X5gE&dbC&47XW|2qd$nW2;}pqhwsDvB4h%8R>KcV{9)i)eRuccz%|2Aq~_V4iM-Tg=;A8p*??oTW3nO2AozSPtet}3mmDy_i$ko*WpAts4x z);iO;{dtsIGZ$h*czg|{M0|Rr(4A!}Onm3Usa{zqzQIyif=Q^g_?|{haTF0gi-S)9 z%qkQckk>fkJ3o%tJsrEkmln!Rt_!huw-c=ax0TMCT6r=JTR>MACh~U*u{V096bl=X zuW{Thp$m&@qWnw?;yVhXbu}VSZtcypsuGdCxL#XYTv%6*z26;7iB(pwDRu6sSX~Mg z%Ig%X)g@7<(48}L&El*q0pA)ZG!2q~kl$4)tgBvyud>vDNlD>~wT0Y+n)++sdf|5& z3h~V!+gZQ`&zw%RE>=c(Xr{c2G;#Gy% z1{)%y%ql8eVOU@=T9vdKbHQg$lw~QG`i71891NubMlw~@n)ZbytE*Ucb@)1wf=jAu zc?YQr-7n4*&Q#Y}w%B8ypRjOht5y}dUpo=>?kVq7->fNAUV~zBN-I`EOIV4U?8Bl$ zV5e?HAwQ_%6xOb-tt+h*nI=kvwq zj=0*Zo%nbSNhpr0KDF?~)tDPDWah$mB@gjYBjI4H9A$VqNqJP1y4!a2Zw$nTi)vTY ztnx~_wp4topmyd(1F_k&luHSLWX+`v@KlH2qM?xZctVW>f22#J2n8FS@=H9zfxueW zCedopNT@aVOai`F1S?SGgdd8Q&r$7-u(c- zw<_9VS+b(q7UFY1{A3h;58K+i&Nt0;;PP76K}Ex>DoDR(RV4Vys=^swdy0~-EUI0l zzROhTe(b}o;gyxBS$8;vobON6aku$mL*)9tCo;ZK1urjGPA)%71Y1?0krTy8i;HFw z%|aBP>2NEY_^?r;8cZ|IM`M@O3@jp)H0wUBDZWmIq_~rxZEz)lX<6Tl)?W|_A>2=P z$xl%fx&^UjrELDtdX%!Q7M+*u6fu7r#3|>ZIftGIz*iu_x#x=#AWnd*#uPppL=kw(~C>MF%A&Foj2t?A?a1V>AWG$Nn%>(qwu8$ zJ;oh^{zd~2O8gdyD>*Ul5cJ$Ei~JRi@t43?AmYP;l;^jEDG%*NT+%1-7%;x)G4x7$ z02uizy`&o*V>z)j;}W@@3f=e3It@yWWChyesT1>3v{3 zX$Hn}G3n`Vk9auF5WwdXM0&Xhy@B^gJdBt@;wi7-d@~Ls-$6lO7&Z^UDX%V19BJe` zi19->Og`@cBfTug*9&k?`VS;7-U++}hrwsC@^j@6(r$y5pNDY|gTgt{V6nsC zKS(@`m_gcMNEqi9y@p%~+`?zbB8l@p2F2%Ioa^*qUQBa_d|l!qjdKyFIjPh~rhr;auTcasChv!#+cqw(uExs>H*H86=;fOL4B3OD8X;IYa5o#04G7r4#4Gmm{*2 z%TW5EZa3B|()-ETiOUmknDVn+ba{3lO+J5;xROWVy}&K<3`+-YvClBJKRW*wq``j} z+aFzDg|`8>@qaQ;~)|r;<16l|Lw)`Vg1&Kg+~9>BmW2(kF1X&#Q45b~shFCz21}lL$U5 z5i##D4hDs*dadXScoF$NfJmp8cv=v677iodG~Q2o#V3Mu@JXA4NYm@RHi=(`Smz&+ z_#(ubeG>FbfX~HY=DPxzo^Kh_%-7Uc;ahQ;yi7jt0JHJ=g~Y>%85E!QaIWd~vn*aj zz8^?jm6ycR&j)VdpFYjNV@QKfy0T}OX#|;Xy6Mk~o_5yxM|l(Y%r|gZ?&-9%P9H~_ z^vZw2Od}}z6*wn-7zaa~|3GirS>;Q=((Lnks-(Y9;@M22{ZTmmO`}(Sp8jo#OZo(E z*1H|#26?`ZNY_jHZTgQT9!AWd@WVKtjKlDU)6DXc^rxBSqVPAt!;E}q?u+QmZ`qL{roKAlrAHzPUGauqoulIJ~9QHX~l^6A3$mc)ccOufuSK*IJ zT+u7}pE2kqenu4d-{P2p10kNm|7p${F+?2Sx_J8KEI;DkLBxEymWZK+|A0S-NXMHc zz6~*X8s&AyK46@qHt|0Iv++4$;7v#)-=EPRX*ZTXg0i!Sbv(?gpwB|2<9QMf8Mw61 zXXIakL-Hpz`Fxg+=r$ZCo(YWWk4!up82eunXTJAX@G!8)EjZ<6KVtI92gZKc#18}e zI}6?m?6HCP?*NIqX7KqP?Qo5So_09Zg3}ITEqD;v;(@q$|Du%(C=jq;c9whQU_GN3 zfYWX|{c>If9%hVS($hXVJ@qGj0b>M{z6_W~&-D(1KFS!uq>lsB>35I_{F@jfnDi~c zH2P#k-$r5tlYSd8oxY1i;4kj8(C_X~pAtcu^c{>5O#Yp~H2z{8Bk4sx7W&@)^h5U` z4f;iE_d`b@?MCVdt#onDsjud@a9K>Dyj-%2|0&tr^W@-G0U@gE`E zyNOSh3GDa}?i*+L!{b?ge z1o|Lj1e2cj*6CYF1o{wT1d~1w*b_L6c5Gihi4jct2(UN~lfDcXgGnC)b{-CsJ`Rk* zq;CesF@#Ak^cYB=@iH*#EBo=E2|3c7jMpVjdmtom7Qi?hMt_>|2{87jYCNzF=dfGG zXA%!HjiB(OIM?%S;ziK2|0S;SmH3&dz^36a@;x&P82dF7p9ieWf-eQ8<-3P`k?)x| zN?hifz?TD`g~Q~}@u#lu4y4IPjf=ueBPg7Gtd{T3qPz(D??_zft8jDNsQA1CdgdF( z!Ju%CCw2ZUya@j9NnG)l_*sL2TjW2BdRq9O#lBbPe;8@-KkIafEB*=}1Kh@coW#S3 z8KnGY(O-4`yLl1(Cre!MS2)MFHvV%Y9!AWd_+N%|jsKn?FM|JkiA(+o{C40v|80`K zO5$Or5ft8pbBlkT#r&DC^dGmKMZPRAoqs#hltK^%shnM;9r^WN!sQKZS|Mnrl!=1cq*#NK-ikDld7dX=xDU*SVv0z8Prl!xW6 z=Uav}<*AXl;;-;J;6WTFpLLR6*(Z)P`P?gU#Yf?rfCq7yeC`9L%hQ51`8*_X#Yf=} z0}tXb`MeCwX6K(u+~woh^D~Ku5j#!-A2|xC3vn3yM@D?`uLHN_JMsaE8~KhrXyZG}I)8;zPYeHXk4k#QCx|rpJT7r%ABArRJ`IOqhw-MJL!bel z@%JIpY-H2JKPxRO)hn}9QKqueJxB}d!GM-#9jH*^Av8>qxW}!j`F;YNVDhrieA}M%Kv_Wq&Mna zg3kfTN7^mHr^mo0p9`q3#cmfE{oNaFpo5$jtVE>SP2rT+Vz&#}4%qmACi$px*@`sz z|4HJi+$Ekh0=R{LRvB;$|EwCxNAcf=H27zk^+@5ZxNPA+DFe8L|D-X%weotS9cl2N zbiTxu{0h$lZsX7TW#j)t$w$fGfi(HQByq)G;hn%O{3rXA?_{%lc|Z71Hp^Gx?8j~V zn}J*8pRC#$C4U#_$p1TtbpKH}`yC7a3)6vH_+NOAxpE6kTk@CMuJt6;;QzfqWD?AIhh5wW|a2x;o zBp<~;h&1^>Byq)G;ah>*_^b9r@e%idkI|mIDe~azr-z6$X8tq`%X^3nWgPX@2;o;$LIniq9GYSA3d*+w}G6 zPp9tiq3^Wg)7k!5_)lklXTxU!x7cSo+hL3Sv(pVchBWM)P5x;(jB?D50JHGVR(6wq z@`ki$w%Oh)JnqAX?V&}l>{ozWzp3z1z%BeQ8Yk%$pEjh)$LKfTR5<?x+TmUU zFOc{{5?B7#EAdDB)4!?kr+{0^Yt|3@^LdMGnD0*|F6B(%dx6{dutV4E@K!3)G$fZ)K4%&AIq=i7WmJ&j3CShsi$(tk{B6CtZHQ z5B!-Qam8QZ^MG0GaB&zo%fQTc5wIj2Qhuic=ahe`fz!Ukm4AkrMo{$hPfgB!%0Bc@ z@(<%+P<&S4oHkMU@*4TyiRfA!CSC(f@SE~I4u{nrtZzllEp zOtWW#e=Bg>$h2FJq?dBOrR4dnKOcq99s}IcKFl5`aaW#1`!G8MJO_u7?`*cK7g+Ee zz?NC?cYWwtJ{I~*%Ix%)`0x*%06oiBl~*UuVdorTJi<5_I{6RyU_@Fue%37UQzb6T zC4tj!8vR>&lK%Yu^a*@rfBFQUJNwfo@b3WE%H`@zq$%f*B_3wlNl)PHFD>&L_Za zd}tryVH_HtIZQ3ZVU+Kj$-s1dqa;jo=Fq;Hf4-&g`M@pt&RGI{BMy`Q?ULTLb3(5< z5#Tm?Y9xIau`Yi-QWiVRQT2%OA}Bl0c?bzj{sjIK@FW~+9cCBKq3`eV5s{wdjNqI7K!t^PQOj!D$e zjedWo#P=FFVd%Bb$oGsL5@)^)=K7p=U>g533rGY$l!w8jH}XA`?FH#O86%kVhk81(O_0@LYPe?afHuNL|sFpWNQ6Vjv?`QX&#AL>s(GK@6oMT}FEJ|CFI z{~V4-NiXbVp)WJ&vn73$F@niI4ov6IHkSOG7$cbUEx>eo=12NA#t0_;HefnE>mliP zFh(%xcLUSun@I%v4#o&3eJ3!D{@gIqr0-&kVAA&j)9JU9D9!nR5raYhK{_yvepCU8 zK%dDN!KBXurqPd{LL$&-Ge$7!!@zWUVHeQnkr=_GXZ{-f7(NS-e}plDNgoBK(=$!_ z7-IyJz6qE{e_kqyK;O(5!K7~krqi<>C;e8&2qr!C)9DYA2=wiY5ls3HU>bcei$tK` z%NW6=?*gXNx049;hZ!Rn^dAz_=*N~3NOL|+WsG3bX9Cmc$F-6O^g+f5CVe(AjedMO zi9jD>j9}8|0n_Pad-7qvpdLscG3a|q2mV42oSOV&{plxENcuQq1e3lQm?qCe+5UXk zBB%$_Z#C%Sq=P)$7$cbc+kt8P&zJuE;cgNmnDl#r>GZOF{;-q82qyhuU>f}eAre8J zUd9LpeP=2#onHE9XS$#sNFVG^pC#M3&MY5#=CAP=??oU_XV`~6-=G(AgTBCrzN|m} zWI+e|s1JSIpx;9}&^IwgFzwR0*uRC`L>VfpT`_oT5PCCfb z;X~gET;o4|9_c{e#Tdbqrx%z;pPfOXG-p2}27`WoIxvm?qC66TK9ezmNuLEwrA1o~#i z2qt|SFr9uMi9o-VF@j0I1DHmCNgatm-_97pq-VM7^t~hk{a(fhCVdw$jXqRDBG4aZ zj9}0oAg0q(f6yODWsG3bX9CmdTS)}^AY%lRJ{y=$-$^3ShZrN6^m)KE`W)FF9>^Ee z1L-5c@5LdXJ6tO8FLTcZ@Q(rimW4iUr=Rl&;QI4gGwJYr_a}){KR#zkd>-jp2j%k= zFOq&9>504a1QF7lOG#&;zjU_54f+GjN4L*mq-oC<#t5c8w*u4X=PV=<=(jOOFzMTY z>GaD<1p3{K5ls5Mz;t@)&j&h5j9}7JUY%anuLHe;dI0@LsRljufjl3j`_Ko0>-=9K z9q6+dBN+006auExcajM7Va5n1eLgUae(op|fxdt-f=OQnOs9{L2=r0L2qt|Tm`=Z) zM4)eCj9}8Y0MqGdU(&ZRMlk8O0n_N`Ws?Z>I~XIF^t*xS^h-zt`VPhjCVeL`oj!sz z>AM&s81$F2?t1kr`)cX~`b+PVxRB5Ba9(GdV9b+TO8KiSI3H|m{MqmkH~3$cWT(Gu zun+wd;Ff$ZV?E2jVaR#eN?^2)Y#-i=;~e^4Mjpgnd7K2!`m_Rv$!8BRPI8<031Axk z&xGC6oXaV{#y^3N0B+%bd6o~(^0(1f06!ClA8a=fk? zY1l1HS+sIY;1BuWl*dwD;ZJ~9;xO9naF4`gxgdprd_O}(9ZY(*^TZAM+%>=~^5=3s z+#>&c>ZO(ATTMtK-}%aal%FU(hRc?6na}IFIE-?czZF=E1#bstDVO;jz}F9?U+{Hc zx?ZhFL(T>FA+pH7-~mbR%Ab9mqW`v}H}qQ24%|{+3w8sy=(R8fxJCYjY^QB_mJgpW zaEpBw<^#9bVd1C1EpjgW9Joc!D@NG)Ul9auk@E`rv&EiQd|%>*-L9m+Y4o2RMjGXE zrD5j;{t7NzmQ;)~7!W|4Ez7>T=jWvljN5oMu0Wxj6zo#rf>?Zd}M-$gY(^eiun zeHO8Ou$1E>);r?T{;C`osd{JPFH8O`AKaDD>vf5n`o06)mhUelZu0L0Zth=(~8F5B>Q*^z1Jz<+AuPA3pPa_}t<{ulgOsK8s6y@>S(%*m*I_(W38?BzwL~ zeC%`0a?rCa~mc@ z@Z5oXt_uQNF%ZuW0kil|{zBjuKKZnRrG3t4x!CAwAB!FGIli{x>|ZSHeEtF8w6j~j zj%p9{Kases7YV!!vGY>e)6%Xk zy+`sf_%FTJhyQWl9OE1Q^R-#PZm{6gtHOe_T=ECv%N7Ci{BXvDF{I(=%a%&qwZDfK z0Dl07A-@T&*XQ&sWJ9D~mdw7(U*Ip7w%-S~pU4ZGd=jt~8NKJ?1}T|e>U`2*-Ja^6J$ zx5#-D+j&jjw^$y~_oitQm-;4frfoVRvrk7DY2ei<*YBnC7%R7$A|thA9~7V%eMviY82DT3 zx5a^1;V}5z#&Wdy|830I;{Uhp1WsEUd~PRZsTa4Cf3Ag|b!CMGe*u_g=f`Ll=zIJ3 zB_3wlnUTO>L23dHQ=WssEcLE11l(eW!eziItHGzR0+?kyP`C~_?R*gqgbvxB6yA#j zapj*1e;Ale9@@cTpTcdxEqWEU1JA@^%6Sx+E>9F`*eyc;)NyIg$YhBtITbzqR+nGV zhk>W#F!GHo0%j?%$h8s=Bi70*Qh*fsOFkd>@-pO%Aky(pq>0xfvgP{_a9yuB(xiV> z;z}=t)6O%t=N*YFJ_>&qxP?y<{lrpUMa@3=^LD(r$p=3UT(i$7Sx7_9 z657+^&n2u|nteW#b}qS7;!>{!9tCcxk1Of37QI&b$bZLVd%kzjPbiO(?;ZJe{$-y7 ze*lN{6PzKWIpyhyEb^3xfZOOk2A+$< zlye_2TfT?weD2Hyu9t5VY262eeQf&;x2u{K6f4lz5$1k@2XT_mVSR#&vd{hw!W|60&*$00dxW>O@2hu2)3bVZ0 zCH@RzE#CzF^T5+_7qrFHY-zrmnh5N`~wO#U2<<%znbRf3n zOF8etVc5TV9573LsaEyKwL_vEs1Ad^%EISHV46KuJ*rmvx_lD#sJaC77CEacfahBH z$AL|-;H|)H^0Wh|Jjy;%oWsu5?B6ZzZS`T`_v0|^BW}yI;4BwQzR`PtTkILVSK_W6 z684O?0k`NCeF3;;Pt}h{jryLzcY>aE!<3)puG^siY1rW|D)s;lgZ{3Eeei9-ms{wM z1GC6qL%tUIYfhKAYX?WkUqc&PJVA# zMIHUYQZMSB0?sls^sRdZn5Dex_5we}LVpn0rhzygef!B7CXnW=9_52)1GnV6n);2v zVaU0fI@$1NfNOrM+OgFyNSyf~B=BuW*!a8)+~Pm04+FQzxn?kMOTKGPmAH}bnsnfn zeAg`W;lC2N)-HXw8EM#a4SkBZ%YQ}!SI=3ppZe^$r2h_L$|>bZ;Lk~1(!ZT5=?%Lj z@OE6M4o11Gc@vmTo)3Uq^1YijxO*Uw4{c)~Ea6EO$%2Sib_e#n0E@DREbxMEkbhXy;Ws zww~oqeWgGA2B);c`WFxpmwF}Ww*j*}AFba3-12->&vw9K&-za!F8RNmi8S)9{~Xc7 zI1K-6U_G+oKJ}$xA?Rr%lTQIKOF1?~fwL_)>05#6_K|Wn81}4h2OZ>Zcuvwwy%KmY z@G2Yz|9i54S?cdSvw>Uu_MXcmF8L#ckmlS&+gRjmq+XVK+8Fnt-)G0;qkvodFwW;7 ziyy{W?=0R$=@b0f zZs`7?^kTiBPn&whfX%nyJAmnYr2lW&1KcM6yTEO7(yuJ}-kT3R9fu*$y#>JZe5L&N z(g$@MN!s~d`VVns{}zdVTjJt=$9Y@fjBWXTAn6sKsN{3N;G^(^c0L=I0lyN5q1VO= zAAFM!{*({C(+7VYxWx_|-;}svhm9S;({Y$`zGv`hLK=47sO+QoD7+JwZG2cCE$!Z> z5y1aH?%oEzs_M)a-U$K1!J0^8n^vnEu$mx&1Q8De;qYZaQB%bZt#nLsazc)TB+UtO zQiC}vwfIp7`(bU1Hf`0RA8%jU@$GP@>QKjV=-j^ZWBSQ&Zf}Qaof_0TFEi8IQnk(d z|37Q3eb!!Q9Rh9VzH{I8?0Gl!?@RYS;I`fl;~DwgZS2bA*WfG{PkwhF0N#Y3n=i&|_u!@-)b=KSPl)Nh z3|h*g(>3^q8h~9?%I8Cj@1v)G_Tk+c*Xe%uD4vn-hi;A2NB9VEPkul2c}=hRe6JnP z@$V;2vL5=@o)=%jy~^s7MN9D-`#^}qE6S9 z=kRm+zoz*(`nl(~8aMp4-abs;9{wM`*x|$cK+X@()41Vd@Dy-Q`}N^A;2*-zk@Le_ zfIaBJ2Y}tw$U7>)vMIZ}HGGO&>kw_u;e$k39EMejooMW$5YW zJ@oh0`RVVw0Jvpu-(~rsT<$aVh518>@CH2mF@BDI?xUagrP~GkgC2V3)l-i5(T;rh zSAbI{H{IufdF=MS?*g~;)rM#0>mM|3@@4QJ1NY_YUo^e3+s$|;pI>U+@GV`bCm719*o0eB>UDQ%?xrHTVN~I14{VKOfl#%+v0CWIyl+J@iilV;U}> zzXN8=Q;TQHW9o~M$KXft+9%Jy#QFRng=g~lrN%X%2&eu%?dgL|$0PrPZ`XWuz4!s; z0RIOs*0|wsaF(Nw|6<@i{;M?~!+$fL$^UAN8~z602;9ei3vf@lJlF%=m+lB~Pq{q! z2=G4qobr0`NnloaeeV#SDd$%;uH}sI1HgUqJg4b(e!ri>Gx@xram^>fzXRM;?hpPL zxR3uha9@5|?wrdK&d*uI< zUf>@2|D*uiC;!91E%|>qfM?48n8vmI5&k%EpFH$$K6wrS_sR2p;68bN4&0LGd#n$X z=Vgs+c_RD-a8LQ}Wi*dGdr9k&XKx7HBhTI?z%6-xDCyS(dzWck%M;-#;2!<#Z3FI; zhxN`U&j4_rJdPj!KIJ&XCH8%Jo|zBK~kHP8ZeDbi~`Q-TpaF09>RRj0P^N{0jzkd*PkmsQbaIy7caP|>A@;pR;>yhW7 z6mXwBn}GY|=>~4=hxw;Gw`$zz$KV6Neex85`{a25xKExj;68c24&0LG2h=0w`G&@| zJQ2=v_sR1e;68bn51%}*0{6)C(MsU9JSXrBc|JN#<3=8XQx;GC`sn$XhV&-aeunesfT zaV<}Te+9TtKP*R|Jcoh%;co!<@c%?LaL>H%CmMiLr%t+`V1Dd$$MB4FKS3Go zd>K3m+?VcJ;H*n7{~Lf={LMV=C*GrRov#S*0q*0^^76@lU!4DsbUpe6ZP}LJ;A6mj z{8?V)<;wpQFwcDc!&SiFT1x*gdDDg*J`dLeTj#-9E~`Db=?5BnI|dq*%fl;hvGZl{ z6mU z?G^kVIa}kJ|Bnn#-X8vs%+d75p7AJrF4nl=V{r2G@cHybz_;M%=>OAZT&ek+?gCxmwd}Js(|rvz9jXYYPj~e}(d>NcJNSWMx?F05s4}JjH zdrR@3odiaGQeK4RdH!D$(A`SlnG{g~&NOZMAM+(}(GzZ6dgj-r|AnU4`6;1K#pze< z*YuKa+`IfYJM=7X%G1s(f=fRD%#vp%5(Yo+c6K zB_FtT=?})~H`HtTL%brm^hbbM{5LEn5%?eF6~Uz+2WHc^kqGoBctvpN|CyLYe{~gs zn&6+Sc|~yPDX&c*k_hy2#jQ)<49uoqj%U&*c|~yP*8{WZHDvZK2l~Uj zBDnmSzQzCDBP0U-FZM zM}0@@p-(#WZ{V5yQ@kR${M&$8{BIOFK)+e2OX*qeHhoAs&=2s6;PNj3v*tj{vjiZ`w~H(2wzo;L;xeX44-g5$F%{ir~`oy+!}NW)gw^2(Jh({V`w`{g(M8 z0{u9z2rm6eU>5x!3sFs=_79fQzf|kcYk&Syy+kbG|58JozMb(Q&r6aI+&c2SlmceS z)1m#(OY4C%xb&NWS@dbczn#PgF8u&7i@y6J5<#9kuLv&v9$*%I&u$WdelM>GF8vrV zi$2Tvq~Fggf=ho8m_@(sd=i2F5U&U>{SjameP11kK!2211ebmsm_^^O?ct>pLR~^n za+`ifJAs;DyqZ@8hyQpzFpK|f+TV_cBt~%Qn}J#MI}LqOs7vYB$LT+~nRJk+tqgrT zaEt%wCenevhgSqwo;)y{Ui;7S0*Mh^`n|v``a8A18h=EnOX>H==|B1u=^)R6GW3Ul zTl_z{mUN&$%qxN`&rx7D{Xr6e{ur+aF8v8$7X2gI-o{S~bqW3PYKLC*SQ8wtEkhs1 z=|83G%khRX^vO8=XTCx@@K5oI;K+Zx4VWeWr?vi%Zx-qj`o{)<--@5pPkwA4ux+LI zXCDVP=)n&G^YHmB)Bi*%{a8IP5C5@d;17G~PXP1q`CKhX%%F%ly<^q*&b-;ST7=g%jB^_Aks4*;|Hk1fYD zu2yM z@nF;E`4;rwh~rOcy*=?0jT=6i{>gFRwfH%D`%}vA!`~O@WB4CGrg1%v`+N_csZa7} zaP@f-n5ECh>q%4-yvz%OL;o^mvFUZaep%vq=o{kn`|I#b{yP69{8J8nm!@COD}pP} zW?+^)`;U?c{M&g&aOnqtS@d75A`$5Gydt>tdw|*WDH4HxFRutL{TMKt-pI3`#0U=k zmmdN4Abw7{f0^_?d>lB--l2c_ATTT4FZJM=avtIp!AbY!Bfu>BFSn5h^dhf^p6S~3 zdo=wCUJ)GruMo58pC?cgyi(08f=gcy%%cB_mgkj_#0U=kS4sa6evTf#+Th1uX$Efd z*X{2sN#G0)|5w%nv*`bi!z6I3IQ8T={cH;bR6&!>jU;C~C8 z{8RW@d|ug)Cri$+UBuUr^8l|1j-0O?0%p*wp(w}I@#m3td{^!SV-He};?!jak z{2zc*9-Xg)l8>6;zpyPOF3&*_;Xl^6=CA4%=*JyA#53gli?bY@au8?xK>mhLh@>8gIrm3N^vEX#XBQuZ9{|{wMfG3eS+|)dpS>9DnsH(vBKJ_>lj(N{u)38RHs* zzXuO&M-+X_<72odJ^P--6@3x!D}#RrIMdbndgU1I!RN1faUpLfzt6M$JaRt2K;w>_ z&o7D7|26#%_`h&ZoZjGn^A+HpbpPgQ;GTMSczzkYOY=AR()M3j0~?JW+j>Ay`q z_~^$R+|cuC(`)>1s~!9po}q`o-RR(k-jzqwzsf85>w0uZ)4w_njKQ(1SB*TH{yFLk z>HZI17##ZlQ47rC|5x=S0=-;I>HoDI*fjh!f7~I|1pn5Kiw{5M$N#+y{lAx?|3w-4 z|5*nAWf}ZeW$=?_@L!j~Un_&ZenAlbd*b`?4E?-OhWcAz-(8 z@Wa5CdGI5^mV5A{zG>T5w=qyL-xGDElAmKmbl5=Pf;ysEO2rlmur{Cz|LY6=DnQtIxk!*Wfb%qoD* zkiG$Fr>pk?^B0(S=BkFGd~=pbw_4NHtLp>2NEoTEe6k&PSI(K3SlU_WS=u-hoU90H zlflHquI%Qvld~rt$_JJ0qhH3P*rUPP<8y=R<(+ufb#s1v28=0vNAt;5LBq(5DNi2H z2DRfGg6iuERkO!|CBZm3I~W)Tzme)GPhM9DLZ-!EvJz>{DFh=kf;MDg_Nu#r`OQcZ z_u5|Z$Ml#6ZlhrG z_xe9goE-V=+hR@5t-Z61> zJtZhz~~TE}o`=v~3a!o5M&=yK`kw%W}P`ar%nkFqr)io}u4b;Ng{xg#gdt z!e=1QV-stk^FyNZFT9d}8Tk~QLocsDC$B&suRs^CKo74V?<|w3JXQwPqf`DW&$5`L z95$OYsDsfnOb6Lvs3@SUr3@iQI{=m;%Tvmc@_jaFV7ay8B~JLNW*IFkfNu6g2lP81 zGK@(+)Bi2cJV`#wo-S0KihlergJ#gD7Cyo93tk+b2$Bo`RPK+CUl`Oc9FzO+ zEc}98pKnhGQ;we>w6Xpb?m~T>7Rw_xkxUsBM zy{vd-WqToLEd)XO_Ua(LuMi-w>uGbezmXX)*X1t==8w!cKJWHBg0pFdtiq%e=ajZKJ_=o^d^fN>K%Y9L zE>TWrNMC=3^r_bNi3y4G>~9LEBhwk#snW~Q$@Fr~#Baw@6bu!Gsj42e*qeUB(Vk=#96U9L?td4imKrQZD2zvo$(#Fshs=1SPcEB}Z(H*<*j z+I#16_-oLgya0X-@;)@DfPA2R_4q(!iJ_uUrEb;+!5p^1`R;GM0NrdxdtPC%UF$2K zT#xU`cCDZC*vtJa1IJ&1>4w&=#>^IkEY3QO;&l8w_O&l z8yxH(4By$?73MO1UD>{^;Xp@vTV^N}8uC+gYX|!W2KZXDFl0BsvrF-RKY21J`l~v! zy_qghhaJ7W{ppUOOt?L>y?<~xV(g|rnAw`m4P^$INVX3*-5u#nM2$l~S6@57x2dPn0vHFrpM?(fP3 z3%2$T1q(WJxd6}Gw`ck|xcdWz5PXd8Wjq7Dn2=XDXPIYntu{Bfo`+wR^=#eN9#s$1 z_Tx(4CLI&M9@xbe4sXD6G3lM9(WISd$hz7On#|9^f1e%U%Oe6%ipHe zw{o%5xAE9LG9`4DJ;;0DQr^XKQqh2m9z3{_+vZ)S{3`*-WAk5C+)&3L@AVtTiXPNEI}Z5Kt>4nyzcrig z=)HyB6WG>FAN*{(C>hG@0zA3i?f{QUnpx7wB1rp=8u8(g?^uDGQj^9 z1MuJCiFMJDvx0gf?xb6>q70q_einX?JQah$Y`sbStSMA*u93LWo58;U%qP#Y8h7P+ zLG#h_Ckl8*ek=Y?H9s!Rq$gj~X+M_yGwbmT z`KzaCK2EyTXKQ+$uZVtD8TUN}{ELa`W~DzSr$UbPa-Y2P9tgOH^Pp9jlM0S+lR3D}BkA|mooXHq^AiL4_Ns8x zjOSM5)4MA-1#1_K1lQy@WuIHIDZO^VCP+P!z9v61<-9!SF7j#2Bj~jcB+XD!z<(^a zc3f?l@`b99GUa#guB1$x65t8`xNqOI=eZRli5v5joAPbi4IDDxbamkZnS|Q$ zuC{^X@K`J1|*TX9nZe%sbAxT$gNf?eA#%WrzAaKWy|HTg}u3m1^brVCJp zyKl~q9KR+%`ja*J;YQ3K?VkR^$nI-;vRYATo&i9l2{Mn+Qg<{+8tb<*n440=C{0a zckpncd(_*NKgAppY^inPj)T-U)^n;kpSQ4pIXm#7{#QL)@d)NQ1K2ax#eVYyugUf* z-hZk+z#7))3wRC^ygz;=p6^0A{a9?i{*?BP^42`x&3x(mb;B7@vrRasnudV`zaJnxWLc6{&?sAm#_+zPNmizI>istqwQu9Xk%{jH7 zfS$1~Q*CUVc`i5q2~q}`!(^G0R@U?Gf z@2Zi}`Zknp2));yyd%|Y>)q&_e#)owP3^%FriJ(eC#M86?6?wVLvfv1(nHyjCv1_v zGh}&|#Bs_tS(unOa7U_6+vL$}CSKbP-B({T@$0|Ow@>^GK5CEfZV$RzQ?gDrnVmB3 zCq~-O!}?~BV%*mEO-w+Z(~0-~+us+=X53YGRSo24O#BS8bgjB;;_0RB!8EReFI^s7 zpF|mbBpXzW%&e@-2SJGS@Lw!MxwKXUeXSwa(WX3q@ABZrd$$BP+|+pJ?0ZLoHntIa z_66^T@4ac)hHLWoKOJn^l|`GiJB9Wt1>Xn1_so<$^>F($te=}uUw_@P^>O-)O;yD4 z{O;DVP1W?p$_M;#rkiiJ%Epc&pduXs(ImG1clrG^x_wHHT*-}a0p*dA3PJjeja@N zI{0t+@q7SZ4}X8t)$rx;=ew@HG*5qi(>vkAr-26ko$cjK+X@#j&$}8ie;!~#j{XGwZu{=wHPF3dFj{!PU#jnbna_k|?9riR#+D7oa^Kf35EJ7pa>D=;l|e za1Y%yKp(%l99ONIUp3-hw++8~2kxnxQP7-&d$AMTPZc|WUfOpTW?eJ!%l}D#g|sT@ zulB;%(Ff9hy#ik+Yd@2$@uPlLE)9dq(Z==79Tx=^h%faTyg$YJYbO5ZZ$>xNFJ=9* z>UG7kV^e;98ugR$pRw!pvR|E6y=J@*eehSNUI+U}W*mXN1Qo2;txJQ7g`WzhYzlU- zc&a|AynSg9a{Yh&Lg*a%p$}l5QlFogpP%`UKLb{a=jv6TpEw_V+}iQVLhTnm7YyZR zyhLAh@N=_+!9V))b1TLwf`OanJ-6ah%Yz%(zj*{}>cbb^{o<$258nN$Ey0Z=yQkzo zH4@zP8TbLT%XRr}^feO`sk>f(1oiju$hIR(k!BbDms-yrIS3t{ay{F$H{^3BZ4Pt+ zpZSXp$;Y-|{S0|qzU`R`*wloXgDvi-K;LI%}n}Z2dw|!FtBN>g~_K=VZs{Ek~bqbobBl!|l4C*;5tf z6YxD#;a8@>r=Y(n{)c@{_@9w9e9zVJJsItL;E(8gc5PEWhyG_%nqz^R^Se@0^2gtm zYR(7nX=(H;(^K*zx7N4a{?9=;`o)*)ur~b=<+=SB#})L+&#j<;I`9tE1I%qd@{V98 zt^uxR(O)JXqkSjq^Sh_DUo-LV{{^~N{b=q*qK>#$>a4LEn$}~g4KGKBWEi9`a_3y^ z^}s`WP`GFGUij)BwH~_hu^_y2eQ^GA^h+1sSNk^UZ@l!u_NA8u^=PXwK7);Z8hd`w zPvF>YDcV1_QKLay3VwE+Ho|cRX_JVDO8~c8yL2_iHv5C>;jRlW8s4_x@hj&A)w{Yj zw>>f=)iClB#xz@%UjS|0uR9C1jQ{If(GU4zDg;d9L7J%M)f zi&LJ2-omAGCnomYE91^LPB$L+Ju%(`RmHtcZrsydHw}W?w?%@&E_h#4n6(-B+dVkO z`?dC5fZT(=0GxAnCK!AS_^<(SHTWUie$ay-1Acoc{$@b6H5ShK9mx6S5V*ZIW$^zxw zaxJcy4`w>L!fRKp2|K#F1~a)_*ge?4JzTf0?S|{Gjh5wuyFDR^{2Uq5Cs(Oy{OZ}lY6iB}HJL~ecas9B{0(ooXa^UzQ zmBizVsGpay?tNEY1S-+qksJ8G1jUU35&O@cUCtAng>kCl; zt~}Hg_DhuDq)%D=Qv?u__`M5!v^;etUCM?15_;c7Jl!n#`}C79@+WJCii-m5FG~*$ z2kD+ndfP2sgW22ABo_Bp%m+8fJ3cb55wxSh{#d>;kiSZNB_ z&vN-t&%~W{fhfIQEO&4Kyh3lZX9j286`!przu@w}O5+ayimQR!`KrY;_*dMZaYJwL z9|C9EF8_bfxS_|R@c9WY9{!a^Z-!p;uN(tC?L_OXu7G>UQ~4w=K0aU4xWi`({TqFZ z=7T$gn!=Pva3SX62Y}h>l8*Gh)ws^D@&h%6DwZwjb-EEgU*np8o#s=OEQ7BA?$KwJ zDMynpkWrqht8ww@p{h)IRTV(*$ye0_WpK*tqkp^%{uKu=;F)qBba11GLk?cRGwF{w zxTcq8!j?zVPpvIO|4WTKOxTF7ReZW2XpEjs*Lr?jTujyU5 z*z)UqP49K^0-i~~zYKoNk5>;kxaMD7D1+}UgS+V(K1V=LTh{iBI|S^fV87RsuNj3h zco}<}!E}6l%GleCr^?VjUj}~>xJUj(89gNS`S~Qu=qFJ|p2VRte7;i#|FIvJ={S#m zW~Lna0-jMWGkLY?`AqzvA3uw81hnTAehjtz5Bo_ucSAn99?fdd_#GN==5r84xGR5w zZ)*x~VmyyLZ%UTIjUUtL8hPII9?(-xoo<9PU5}qXyWZhXJA*uDKdf=hzvhU>Kd*7k zKf>9rQGORM)2^NUbI^L^teK_p6s`=l{14;c6fWd{F@6ZqxOqJuZ2TDCg1#LW8$Yb^ zo;V(js|Vt^8fSw~AzcHJJ}3{Jm7+A%9#GY+pC6Y5g>1HdhMGd{1Q9WuE5nGc&j zPa?>9gjWQY{unTe-i+t##z~Ce(w_uo(VKC8Ge~ z+w7;WIToj%wV8A^g&IfBSpy1}Iay1dSp|(d>CPI{cnVjW{*cC*j*TDFIMcE4Hxq_D zwR;>q)cBZ#OFlt=(7{u9CZ8h?-lp+!2X9w6htM&3C?EKoQ}5sfjWc~){=FJs@8Dw^ zZ+Gwm8qYiUA&rxt&HsqT_dED8jURGw=9BUtb?}oKKM}_{A4~dKyjtn1`B=<{q~f@l zZ#s89a0b_&Hv_Zy)bx@FeA;bwE&W3l%ua*c0f z6l;Fi<23Tv+%o$Xca{CN9_x$pO`)tMlNZ;37nD6d+za;8 zLOpfUj@SGqbPQ|3pUVc7avs3#=jG*lPVNc9dSL4z?A24>mLIwk-*fIt-Td&btKa*> zkp%Z>Ubvp;0Njml{qO!Z*4NGtDn<)8Ka72EzZ`um47jgtbl-b_IJz%r8{LQR{~rw= zM|$Y(ClyuTIc%HGhL z!%X+jkgn_j!FT?Qo9rye{u1UTIWwp@03Pdugy;-wm}4wQ*-v+h@8Zb^<)PQEcQs(` zI-u=LwuX&zXh2j3`Sy6>?x`=EJ$SOdjI^mwv+hirgg#zuM+Br-zf$&V?K(1kul|O8 zMv(m6ZtO?O2J3IyQ@woT)hQ3-+f(Si;)f&CD}K1^>QvjVtEWFT{Kpr+nEVp-e*eGD z+copw>W1HiwdW_W_v28I7}?f1?_-BiX4lNCYyH!p;$tu4Tl7Og#h>jD&i=E*!C43X zHaL4%p}h^)vxXn2IXtqvv+lr)TBnUc8)efvt%&P%#{1>nX{;TS&eG>*>a+D2>~8Ws z0h6vvgEd36_pKcdmW|8V2(UNVw~X~<`QCfgv%zB0;am>dN`dwO+xvTB`u$F%a9=Ri;A@v&J@MP6g&@&77EDPNroNmULmfK=9sMjwoXk#~SUPiJ;%iyZ zTpd(CbT9HhGpPKtFHXF1@;GSHQ-6W)o2$7e>%bRbci#@q2G8(oi2#!#*rUUJT;~T3 zOWX0GJ|pI}<_yV$o&lVOP4ByHw?>@lG|!0rlFK|O7R zXS*ycy!{vSyNqc31AN1~_g)ZGryi^9x$`2NPcY*|aA_e}x$4o%&3L|OImRR0Q-SyE z+YxWP3-$W00{4kkjej|ql{_Y8$T}8|&w!ojGj_)RYw#A=2B7C4-#-1HPId$XtM01Y zg!?YU8yJ~8GmpKKA3%8rHV-#GbU8p>VE;VqaH^C8WrE!&$DgHMg4FAOiT%q3*vk{a z*|$HrwqY&4JJ;`)Yy2!?v_+9;H}^xZj55yOFAw!VQ!0yl{VL#2i zWuC{JArr=qNl>NaNj$yX9atL z7o&f~_^G=l4r{xuz_}&=o%sYm_HhnK+sHjYr)V2lHfm4Tu0ybq>eD!zXg}$6oUv2c z5!%lYh{GW5=l>V`Z}M5RrBmQ3!m37H9pQ~Pk4Zb+i{&qRvL5ZsV zN589@^_hK5`gQskltE7(c8qguf=%~eU)FAXgYm*#oCy)6lDaPBU#Jq>7zw6*g>-mV zQXg0cwC!WhmZ}$J1|X=BTS8ad;o z9rlzD?nd9`1on3gQ;ikC5FGf*R-8xKP>mIx&3sl8|fdPMjE@E zG~Q{_Xq|u^q~F?Q(%_zC+JrqOu+w5W&>pzwZ5(<>xpQx63i_OtJS2xs&$0Rt64j0~ zNqN;8`|n@D%#wxNt1I$sq5@^!lV7jKg}h9(?uxGcOOlg?nBJnY=j z-JKZ>`}&7?JWQDB>))}pM{hM#^g`aIj)t*Mk->Q{!cX28x3EQrz9`N)@VY8Hm>UXL zueyN;(J-ZszHr0B>xoE8+a*reEeFS_v=dResTcmw8v+V}!jG{dC$7NGObL{%BQjGPIWo=^V7 z0Y5%7RR%xl$IseQ1}`K3S#S91-;^qYmy!QXW#m8mn9JvXvwdHZU##~WWIn7QcB-Gx z!&U6SdarNaR!}!*?ZuV*I!xU#@#}$IY~k<_v=5Wso16LU2_`;YU5cN1E*F1~!^6-M zW*SB=C%q_rnV7bC7)SW4(l@{3zOQo+srZ!xxKd`bf6B;D{bBT0F8z9) zpNi{2V+SL@jg{OZQ$kl$h`$1^>%A!_^&YtBp;&$qZsfKZRm_U`pL0yVpq*Lg;hb|o z<4If_E&4|^PCwI(0?=~S8hkVGwY8C)(Y!IET?cw2{}BQR?fAXBh)3lP7QxNMbZ4dT z%&-=}{vv&(2bRn3BKHuMD%?51&h8w0D<}aQW00{t-$EFpS99Ggl7h( z`@Lv?TH(zpf;t>Sy1sJ!e~SFiIjm{-lC+4c^(nlAJQcHwxM5v!5%3F&xLUW;^vNQA z&Pg4kOE<(g+z00t^AxpPx-z-6K^4M7;mkg{sNF8v5644=Zu@|a*_FA?@c6)v%#O@0 zXu7lA!?I7VWIx?)eZ{?V*`Zqo(pldYJC*V+*xC+J!9SbMocXpp&4juAfMiPp8O9^iQzJJQU9Z#_#WJmha-Ol%aOR7?ybNoE&5vAgTI{X zMBLCD{1?F3o;z}u-QV{X(0ce(E&)ChKS$2WWg0i>;*s)HZp7s*{M>Z!0Ol#j%DXh~ z^0^1NZO_N>O#b(2T+`PW{9k}GO;=8qJ8_r)FM(P7Wj&qzU(>jzH~18$>(RrM2Q}{S zpE3sAqlYPf2i&8FDc{w&%jbu{Z8>Z43^}K;zF75IeH(`TdMuY&_&Iv0x=P~?|Ef;l zo_tkxYuu$D08U$>PNRTyNAQ4VuLOSAK=%>vC&U$3%YjKbAnzlgWhTh9pl(^!ve zdk}u$&w6CrgTcQ7+{3^2fTq6~R|GTeb@z#=ad7EA5i<^!b2gc-;S-V@=#SxI;cA== z{6ri#-{#OCBpv1h zHv8$P(at^gJnbhMZ`SeTf_x)Ao%WhPa2E(_g@axZxAx z9(XnNGYvn!ivsW-Jos?d_gefM`Wdr;RpV#Um2nOBrM_L`CS8Mf0r%MFjK_ep95tWX zJnkXqjL&Oa^NH~9YTVFEd4T?h4!y>u-*4H;w8NkS|8oX-MR4t~0L-E{^D5`;Au)nW z{|GRfp5qJhALA9lp+Bo0m}kG_Sq;Fs8P3r&J_8Sew|Vdf{PZ$Tv*pQyj`AGj6~U25 z#v3;M0TO}!2(Jh({V`w`y_pv}XPm?cF8xVhHa(xge-3cZN19bH)TQ*) zn@xY1bl~4yhCT({rhkKUpkL1`f-BEvU>5zGQX~R>JFf^X{QxkVK2IXh%hf}_$Du!< z>G$%A;PM{>X7M-kTC?_(7$KsM?;~5T`7M9HB8&cS$aZBGbm#CVkTH$Rlc1aMxl@>% z6VBCN6E~$Zy}fuIz=__O!J*+qvrEX~R0-9xuqz|%cHl7DFl-5XGWjMOYE3LNjBFAu zgg~uG>piPB-n1@U(J|B!P8PO=ogKMM@hfN?RL-NUJNmksI&r4>wivgT--%n_&|rUW zsJIOc?#O8I`udxOvfDHLJCIX<*b;X4cHlJho{k|*W`~BlKb^*)vMbS?4#PFqUw7lC zRo86_=cc^bc9vrlhFe0CgP#$EkF(>k%jTyvc4lxeMbj1QQ`$IH z+8{?k6cgu^!R&bSQzfov7%T?qJ}6OZQJ2Q4($8hmw1jm34%FbH7~nG7;c_Z5%5drJ z?0{)pX6xcqTtFW7_V2XBAcIt#!KpIiWw3pAxcE#Y*q-f*ORzl^XE2!rB@B9IhnJs; z1U=cUJ#i6wQgIHGiQsTRokM9ZIb9ia6)jo=0N7M4{;4D=iJ#uyh4imD-Smy8Dhi-n zLyWm3do*qU^pmJK(;k;Zw^i#6%m6XQ^PaK%~bu*l>y=^aBEw3D3VZ0gE(Z0+mM z4Q0_fnBcPLa9HR+$6?5Q*Rnb4Xo=?tU4uSO-Zm+wTC5n$vb-|sGQ6}!#ki;kH*3rA zH%5j~Hd}LHL)aHKHHD3dt{nr3<`yYY4+j_8qDpN|57v&GL-4WP4HArizStzelhh#%i>eKZAmmQvKmlVjMy{UsBEsI6Mu3= zzAGQxF));q=zU#@4Ob;vniK0b-ncH&+??37e%*BmHm6Y8>_n^FvI*Cn4r%dK>y5S^ zl> z4xNBpPybFaf<$@{|H1`xz;$Rrc%w|(FAMQl>~Sp66zZjgLSId5q@^|QrL{KiH?CgQv=Qwef_bkRK%3xN{KcC%0oo^< zU_D!p7zeZ-3t$RRi)6n^PA?!6D>SI8LbXVyS!wY4jOq>cTwEf&FHs#=)WmQl?GuH7 z5 zi3YhE@K=N2HADPKjJ~bVuJp$!d!xwA9^xf3wCETbqHpW(yCl(tflWyY4uDEaD&&o( zC_P?8S2dL`iAlp`q^uV>am^!yhAEfu$f15^5`)SQEe;omMw*5)`I51OW+1Qd2Yj$( zmsqqk%xupNDOZ7_5!Z1#8G=wOh3)+)gB^W4a?q8sC?%~h)VH*@ogLYsrtW^`zN2e6 zfyJ*ToPLqcnY@*~LT3I25*hFeCRVR|*9PU%#4y8Tv-sHNvU z8Xi5cR&DL=$M8(*nqBpk36;bN6N9I+*BCuC)SE%~OLY$&tJniui1P+@i)v_D8?VL04@zobcw=wJZ5hc$ zsK{^JI7ekb%5zaT54~yjBN|dn7D9tIjZG(BC(_XYlTFauuu{+aLX>&v`eW15vINX^X>H%LZ1pPHf z0#0CDF=BCjInt;JJUNO{_lxD7baTLEvGms+HtJEiCiK8S1N{%?Fq49|-mNO}xKV44 zj(LbKezuo?7*RSGIoKO~jyOQS!6UR7)Yw-5cGg!nOSO{GG_QbBKUU0>Jr-8ZWK zk<>GfUib-KGs2OU2O$nkKX_{oTeex-#%XXsA?Ooy-y$H*SZ< z0MjXNl3PNw+MIDi^`qr6WmR}x{W~z&95VIB8=HAoBMCG-;T0?@shrY5l(DLGs~b%n zR)a;iLee*s1Qaa(j%W}5LnFY+7&&PT?NhNrwZQwuEJ9_5&N{?^;L>nOOJcA$)r29l zFVOOF0P1Cnnkak+YD;!#2(-{)7HLYKMEY46*!qIhd(7$}HOglVtHoC>NOz!zo*f!i zeewp2Ae<}2Ipt4fxL(ZF(queSNE-R-M@LOEws@&k7da=-?uhcQYLE;1dGkVyBhCKz z+>U_(9K(vneNM=_1wySE;cM2|v zs8229B0I5oEH#5=dJ0Hhx-!k-N(eyjX-P?2aFfT>0VZ90mB&VA6V2UXFK8ez!Yv6< zT<^|~;hYSZI1|CX0GYy=8Wvr#V8Norjb>sg#d$B3g!wv~93_kQywTYbV8W!Wc%%2NzDK$Wn?F23(c^oDD~382^ezmr{)fgHuViE z#{p%@1XoP(5_uZoK5m3skt}#)PE@t(p_Y*Lydsprurg!<7`xbFFgJuRrM$dp;tdQ= zFg;#mZY;%!rkGU$wZDr=%D$y&OkU27oTBtM(b=8LnCKLX$&h1}yh2+x275z6ui z=Y}^diZ}E938f}EVS zWU+kDv91%gM0RO9Q>7a?FjQkU)D{LOzIoh&xo_RU&xLIpt}n8Mrc|q)=>1^p$i0R)&~#(F19>uM{z`Zz5(g^^3nw zpTUkE&StqY$5_af4s#NP8J_{(60W8AH)QbnNp7fVwGn0VIV;^=#vDe7IctumR1G%+ zQq}aF%IWI$#w^BO{1XhS0BGmP&0wtAVXTMTPLR9`_KWP zhk8k|UR@H-mjUl3v4k%%ofXK978IRT+9rqpBWfzN(XN`ZD%rUs+uJ3?Ol;Q~ zy?KnQQ_Dgu$exx)Byt041giwaUbA+!5;i8Q)NNK7bil=wF?d!&(!Gn&GRm{E1a8o! zMK6^6R4>?K_Y1QRErP#1uT~Q~8c5{|(iqK}Jq#R@A-OJQL!=Wk4I%`lj*ZoxQQzl~d)WaXPDweTTlO0PUu~q5o zb3>_YzOaTS&Qwu3H2^n*4Vfm1%_5ynldBkOZ8~)$656wX%y_3+21`^L`2Rmk8AKBO zCoO}hFD+B0RznhL(r7={ApOA?Ta}-b=Fd*qz2Aame{_vl>xNhAmIwV7PSr`kGW(Es zsa;n+)s850^7?G-h?;aOhqRDr)7XBITy5S!53;|^dV`Y-Gi!~;V}WW4(UrwklFL?2 zk~YRyxiq(^bDy1LS`<-s*;J;(GusD-umz9{R(jus5eNC;)($qvm<;I6c4x6{bsEDo z*$bBD%yT@dp58U=ORrl*RXete=mXro*f%sk?C8Y&u#8{0H{>+Z2jiFslTTN~$UmS) zkwp_OzgCWt`h9m${2r_1TdYkJXShU86P;vz93u-gSyP#qOw`Kb= z9?xaB;xhq!Hep8pV1ik(B1cS?aVj9%y^5T(mcucsIf2Mit2%F%{V>16d4c(QazH9m z&J543?)sXmq`!{Yf@sNJb=M=2C%ZwGwxi0Y)0qK`3g@fkF|Lp?X|q&Sb~?nvT^T8- z_c3}`s~zmxV;=KV>zy7(1~S`v*|)SbjzwCGV>`M;8&o?6FN@)7eG7kvmAN9*!&sB< zLI;vNTo4OUR~k+|sStlt@H9ACY-DFV)_Yfj4GUbAGmM-ywp?jb96d}gE=hGt$zy+b z%x-k|d=m39`LnOKNkI_5@sw&!xnI^6o0<2Xy>o0&fLZgqBISo=0kZfX>nm2~s0cOA zOv+kc`Lcp<2Qe7y>58xci>YRVRb#kP31Ze9rIr^bLnd!JRCKEW(SNOyV`QtbQvRWs zjiOVP#;&~herol_?@w3+~P4hTx&QQ9H2bKetV9t5jWeFioh2VbTfg zD1D=bMcjG8{X1CS8W_xO$HwpQVmb)yJ;Z%uLYke^IXVeJ@>AR{0g-)ii>~O z;1+xX01KHPqO+@OHassB(xq&z8~LZ^0*#;%fA|bCc9WyYW+$QjD=C z5NTw?Th-2XXPcH`&MOn($C&u$WJh;LnoS;d!5OL5_7GDWv6zrfg=^GOF1AR;y52g^ zqB+)ZC=i!{EEn#h#<1M51q&D0{EO8owk@*LkgDT2L7Go@jG#OYCg4O7W;9AKWajz7 zM!Ga=^eh?H&CN2bMWR_%%U|l71`yj{GbC=lv}@C9oci*eiMa9<5w zV=)e1ZO!y$2D53YefS!74tFEcljonFU%*v=sRTQMxXGe`+Ik6@0+W(hUw2bYc?OI&XF&s8jQvDnxEk;7P2wHfN;njD;4SCf9xmEk8g zU4tDvu}IP}h)S9noUtWbv|2VsW90%p3%&lKHa-m|R21t7J*JH zhIIVTB#BOF1an%VsMAV86plIFGl`MIH{?ZKY z_x5k?pD_vlW$+0DO|c@x@QdFsHe#@MiRUf6LyR2Vg9cUh+$i3tr}4N!2lgpjR1hO( zn&>FSIOsVZkm*QLmpOYFG44AZzG{zJoV95&UCyv_d@E_J)(CBjDWa=r2{hOxLKnrA zWf9p8TQQ4qsSIF`o; zw@3cS1{X!B$|()1=(%+6wf|biWvnJi2JE0AxQC7%y+fR1R$o&zCT!lKFSQGz4|_%& zr8H9uF>;o#ox-BYlUQ_yX)KcMPVD1Z*}w*qF04aJJ{rTD=^WpW)$yjdbRDub?vojV zefo0k?;v!4Z`VM-?6d@H+%<}nu$Put{*Xds*BxEAb>IV?B9Bh&?!rd55>7)qFk}$p zbC_LPWTw1nwom*CW@@DT*m0D02+6Wfp$ewNUAe`?LP0~Zoy)Ys@6tVu{<0qjJ4qBtwHP-tFa4#t>j7rugv9^l>w24dEa$~gdYk0>ZpQzt&q z*g8l}C9cp-rQqn@0#T%^5h-4FmcuMMy{K4X-c1!Y z9H4ov>Q2-bNW^?|yvVMhw6XVbC2r*VxOH%nGwL|Tsju}=$3%@;UdltQc}IhVTs(m` zPZUpcVpsd^jN%v$9gX-im@&GCF{uVfuicvNy04_8j*QWHmoP4nUnighqDQ$gy?^CX zV+no0myqr~a*DIa%ZTwiC$)n~S)HxOQcRavx6(+`RCpz-v^;Rzc)_-kZ0u2x)*NW* zn4@ZHYfE<*Bki%mVy>{XCsu+iQmvPaq@^EcJO3*viZXo2W@pW0Ac74LQ-1Py)rfWt zH#5FzopciyR~g>BnTANx$%v~hp`)v!cjHKJtwcAa`defsT`$3;u5N~ro^&~N2VF0k z4ei99-*g7k2>5`Gt3o`?0{g1tsQ840g{sm0(9TZmGB*95otYvc)sXvr1*Izu24qvy0NoUzJEpHOWTR-1OX;gvlNP5`pIh^Iz;3&?Sw zjC7>)Dm~krd`^{#NFj!krMQdx3PJ=0DZM&+RG1ZNIF*F0oXxz$Znceu( zSggcIO%Od<6}=Ou#__GEIxR)>v}x69jD7Lm@Vx>vn@ws{Co5&t!Cuau6_lpwT-UD> zTMdry*`ye%O0$wokZr5gkTTKItzip!m5LzQQ?X(>Rjr1a+%TESLF5@mWbkGx%_5>= z09nsmQeJ?T8JiB$hVT+O>qd6kVJcZ=;x;UE zvBvTg9LQ`v&IvOZ>2rd5Stzg3_wDM;WV&r4HI6bb#Q#XzQgx+1b2>nrX={<8N?M6} zNt83K7<`DxFA|E>(2SYT3OUbSd|I<=)0*|HPKzW_^}m}KclNX6p=%5|!~n%aX-p@o zHK)%Zf#TF+T3mAqW4+)?TRdhi)7!0g`d$*<$D>CuIGFp0$&H(CxM|I%1gFa}AX&F@ zEjr14Lo2u$wFFd#?2>AecVRt#Dq#ZuF7ucrFXnFT9Ukb(C8ARx7gCahsU>Pw2qWh{ z%$^PncJ^)yg+RA%de+E(FT>F&H*n(e&DHE8EcwBgKQ69v6mr+2`%32u^}u~&@`V)~ z^G?#%*$S~9r=t|>pDi?M4c28$TZgZ_`nPxIFt^&j4IWm!Y|-Y|ZQig+HLy$2ysKG5 ztk7J~1KRYOKE4~yC-eCFltSdf+4y8u46hi~PTXj;s4aeErK&C`<3z0sIZGlXFl!aWXEu}fJ_IeD2)zXk^y0CXyK3~*m;?n4=SI&P%SvUMx4x%G1 zQ3^ZGWmiD9kE@>MofV}i0*#_mn4L6)QI74Bp2u%WBn>I86qdSKtg69} zzcRg7SihxMlrswN42l|xu%erCQROVl_{=y<_)_jm$Jd|u&Qq7TRkpdkZ)dkD}b&0ZFen&uAn z@5I&z(TUtPCh(s9znC=2nsk9IR2nxuSn@-?wHaz(AB{UmBK;X!n;|rPBuU#mxXCMn zwru&-iEB2eOuxG`X-&8m$JUgM@2r_pXWT85?j#ZSvPdcrRHx_1U{!M!)EHCOJdTQ*Z1QxejIF3D)uUHm6Ig?*Mp3mjt2`)Q9TaQHf{sqp5aY|X?HvQAUx@J~&Xb*| zd#m_H1sjEKLw&*rp302nJKGTP#UmxvB12NmWfM(GJD@b7G7E>u7czcPBj!Quti)1? zYVo3`g888W7b%I5937Fau9yuxwq<@N$(XUIvYs z)F;q4F}4*+WhOz%lr_!^iz8Jvc(GL`=OIW3MIQ{uiI#XRkYSj_L zFQVPRuJVB_7I)ZnS4VxS&(O7fDHDOY@gTTj+gH4csVcIgV#nARb*T%7-Wz$Y5oNXM zv3ooxCm-QNLTsq8I@A&S_}Z$tBz%f4m51DlRZ3OLxspb_#^R(Tt8yv5TICYU{yg*z z%{dg(Zg%3tvz9QA!IgB`20NiWbs~jv#L841F4%#@G`;VdEbSWKCR$+>*);(J=Dk`| zLEB}wb8;>kDmk~8)540&ONm7yqMRqj#!mGfs3kHh){SC0qAziVs)S@#bYo?4_oXx} zb)>u!wh!{S#YuFCte5A&gBz44#ctF@f-)gwUTGm}+o*-uRCaWTuCbz=_U}m3rxO~3 z?nqtgPTspLSTv!^A0**h%h^Vj9h)oveZ)~URyTHDStvO26^SHgUX+uobXGnR&Zn4D z)H|e!-I^tf!(tg~0*2#s3a6YbC5l&Fs85_6uBv2pZY#FZ1<}~Hmv%zWBqb@; zg?XHmsOq0ozkJm0%1Km%`PpF}r-UenUpz9CQpRT0waSRcB`rma>WXufs=jIUM4qcS zjA+D^0lIOv573RS1?%V*B5X}lrv`QyYm-2+j$RpGY2NB*^ImhdJ&BfW9vYlQ3(2uK zaxk$}rmS`}%2-J(8IE$UlFEwryudmJ$mU~`IXxH9#gT|G*8GCZevXJ@jUstjJ9{Fc z(iW=7j`@^6R4yVfT{A8+_K?SF5-9EGh-b{^Kx98hL~#QY8L^SeObSP2u__NL`#B;i zcAG&FJ?L7=u8mB$qduO}hE*S5sw~=ORV5@QCvU(wX4$5G$O3x*Hk_3ZeKAcNv1a*Y zuXc#)+tRW|=Iw?^F0zA4&uD8Rp;}u?Wu~JoUOb5(YxfZ^ZR~~-u1FDkmK`cniy}Hw zVU{+=OSOs-iRQJ)p;D~oT4dyPnL`!LMnrU^TI{DX>-#!IenepBF6l`PO{hI3#kwa{u1%CyTk>*k z!uBFXxv&8urU~1PL{vCV)1iu1d=!mHzr?kil2(<{FL5m=-T;yxsa(s^RI1KOqNH*y zr|8pdxm?S!XMGeMc`b4CXib?Gsoc`0UN})<(o@pAr7dlWY3_uSDY~UCR8|fZFSoSS zV6~W@qH;^SIC)|ynW9_To@NQ;pu|i{yu?ZAtxL(0QZH!{DFJ!9B~PB-I+b)wpOoHu zm2@qDl-|0Pbge*9Iv*B@oUSF1(p$%puD7vx(rxN5@|btm<5)Z$O4sWMrLVpvU0c+t ztM<(lyX45WM|@#}{6wY8Kb9g%?AVS8N|~p`43nBo&=!l%W>;)AMgi=7rc?Z^3lmm2 zkQ?6%W_XK#Lp@lp#_W$AA_i`9Rcp9*ax{27`O?&>ri~~HVKWKiiq@+C(q;U+pefbr zW1z|-_D4bd49NLJE5OvM`GZ7Mft+R$scN#D;%X!QjuW%5J_T&*!*U2t)tv)f^iIC?niC>oZ!fhagtXKLl{o%X z#f>K?2Y`i%4f5v**Q~>4jvF?tT8%%l(UlQ$oNb|ZD#*yAe_IDm5NX6Z4_pmdYa%e^ zb_O{{uw!dRCOx8;n31L0F~Q5MV^wuqQ*Q_M3}M2QU%~RzYsSIa52VInY&jYB%3n;v z=6`jZw~S5Y>~eP7)HVSpc{@&T8aZ-pOOP|n$7iSBTmHYLACySoz;Kj)&tt5 zvN-jL9Ct4F@qFK+k>C$@;j`baUNKVWZ(v6jlJG{sI3i3;QRRra#$OnVMMngxRQ)k5 z%m;^L!TB`JE!=dyg77S7%yWuj2z8|x1-)xSB*mk6@vkVHAumMn^THqLI#XVV;^&1q z?la|uD1Kf%`SVQkSdJG@$2db?h~k&43k}2M%*4J(=`dkkP8d<(#iD@EU-3yKTMB+! zBMGq53aPOG602{!QRzu3Z!!Afy|U(9xE_D%u5&QkwKbEV5bAsKrc9q4K+pKA@b!*< zT#b5qt$c7kKg6+@{7C%Tb=S(78aVu|V{1pYZ-L^H*Y|Pzvz)oyCxT4A#E&A(Li9mb8b(X6KeUtlrA&6IELo`G-}}JTGD-c9du# zw@ANYC{C^n*helO-b-9*FnT+3xl;&}=6hEb0p&=0{TG53l?WA21zksYq^Q@xj+~?! z+keKzc57k#1JtxTD{@@CSo*Z)k5uC{57i`#mE-)eY_{Q&wU@}5n8>d4y?&+ck5s4Qj9BE=n@=DNR2Sj_$lm*I#Wu#R}6*viUYc>MKQez!o!ul9nv=YrT9^hvg(Z(CpgPV5fFX3zAn?z_)%zLBBF zi&EC|wft`K;pA8)ACDU<3a7*>N{?^*iZ8V^II~g5?e0pKzP-%6%??dp>WvPAE&18O_Okl^YJ;v*`~gF#U5@W0r(&mu3IOk?u5FpE`%pI_;My=|*q z>``i!9yXTdb?V1I9KX0WIZ&Nh^- zwv*?4@nkvo`-(`a+fd#5bs0!O7#I$NN3qhCeyMg$yUT}0YGnPuUZ!wpP^Nw zEK6)nYqcrjRQbpEO3GQ&URG>>{$KXqZaJHUgwd z3JHJ|#F8ldQbZRBpaHN-)r~eakVp{O#9w6s{ArWP<`MQGc5m1Adf#9#_YKBuZ}tK9 zYHxPG&)wtq#K}xhRJW>|St=s)oCuEy4-XFy{|hGc3wwBs3t!eVMWvlm4PVydL1|}X zS&s*$osnfT+8I%nPVTn&pI!D3BSb}mv;N{PYgcxNY?Fvp15?RsXjv|BSC%<3VZedf z00fato|eVGjmv!D&6l~D69(6p=w?JOHk4?IgRQqAL}laf<@^+p|JMt;a=h0-c_?&^ z$cESi4-s^}+^a%CgBLA5YM|l~=)CxHp4`|ylr4{=69iNlN3Ed2iLp)`y6V9rq8JYf&>kJL;W@`PW&g2?kNS z4JQ@It%=X00+*2Mhi7i@@&!DD>9fG|L$~Ss0-k22z~SkY@eeD2WWTNtkfgg8f%2@t z7oh;ykDJNB_5oeRJ*^gMK77AoE zI8K;i45{NG9iCqIt}ZUFlH;^N@_0TRTp)`?@n{u@5~|><_QK5U-A*SAKq1Zg=AuG@ ze6&!&I@jMRGI1x}*FyNWan-NA5#~d)l;B{NgiiYkSJXM0AJrmL&yD0W<+=9Q7{d1l z7mWAXS1)wA>L7#g{JAF)f05WH~i3%t01wJ8+v+ovzUbo^{Yn+T&01$r-#n{s;8gFcon4hW-7FlMtRH4e`+G|xRP%4VF4pe;ShP+IrbWOg&S5M^12^96D-wFNm@2c zIZ457xMGEmBvmboe;cq>L={1MgF|dF6(GiKeF1MV(Y6dX`Rk6Ob>%|&YnQ(em(Fv) z$zRX8+PV<(*YobRYBKWI_uOk$UgWRuyVt7j%3pu(UaOufe~mD0$%izf3aGU$2dRZRsCdGsU(+);8|)Yd7CUrs5Wgo!bmvpnt86 ze-p|)M3gZ78Wv?4A-Wd79ZPoa5axv#WQ~K0{L1Lt6#rZlM?50jRcu3xya0NbC!kw?bhjS{NP|-!WsR9S;z|w$8cvPJoJnvP@OFMdhnGU2@ zz0kVMoVp%q59oMQtbQm@r&|&(nv4OSZTJKSD(Sm8PsNDje9qBQ7f+}|4^R`A6@d1S zLk$tgF0|@%ttH_Hft$&+jLyByegthFH`Mhmd2bOM56~NUSL@}MaqAc%6L|mFeo7xG z57Uems0WC8Tm1w^5pU7hQ@1mCBsX9*Lx&LLJp4dooSjrP0WCr@kfaZ zS^~NVo-q(l%&ikmV`1Gk4>#+s??c}2R&7CB(YG=&ytXiBTQlEx?%tjM{vN12SvZ>B z$ahq~xbAWxF5}MSB`kf&<2!ay4x%_oPw=;H{Or?_lDyz++*D_Uu>l~V5t3)nA%r#U z>a34vIv*n%jw$NlDJ*3g;cB%fVj?v7u{#A`Ll`jGASnwHSw^bAO{j#o2S_&wPA4u- z*rQp+R@OUYKlejU7Q5Re2?K-? z21*!Q>=*_IsK_0=6!$gZkY<(;fvwh8UIIU0EJXLYMpz^z(jWWCn%Lq38})(XH*th( zqqV=d)`5ZvwFT}Tuj0J8O)8m}g@3tuDU4C))(BgrE#0P}?K$p0Q?XVC4rYm&()HXp z!6_g&!y6)Yz({%(a2U@yH(l9%v6q^|nshbp+{1^Ua_bM~Df zk(EX-aEA?+bey$+)p)Hci=kbdiiD3-ZnqnM2Z(V?btF0hsUhkD6vlY~okomMQWV05 zYu=)txMS~ZJ-Hbt&oQP@bGahsSaoWIWMDd*gk|YDsonse*g=e_U|5CJ8#UbyicI^% znHFVp_pJ1nsF5I|eQy_?{ zodssnSZ$8+)YX$GR(&q6?%95Gt5$vO2^;67u;E-a4M8ppfqgM{+}M}<^GRRs#nt_` z+1wYaUha#Xm590Ghv;0}U0NASnXb0U8cWMtJA3X~;VUnq~`+dR3+f;$oNmhV@>#F#Fi1)qXX z-O6x$JOyE^!k7&c5gfcY=p!H;0Zkb)EsCW9nYi8aMqN6lbmZNFqJX&qc91*(HBB|ZgI7aSY)C=t$q2hU zc;zta3coft#P*Psz_%BxNu4G;mQC26=!bDmAX65_h73@Kizf~3SqrQHX0!mG7k;>$ zVV;Fj5<#+8K{Lx{*5tYIF%^IWc=#t7R@wk04ugAtK7b8XqXu*@g^o(*A{4>5Vgt~U zP7Yk=KY{6gB*1as3KgIee3G+lb9oN%=;Hii-fV~Yd3}Xzqo3Vudl`4ab&cyu_u_a8 z%WfKXBra6T$c(Ip3o?OAf3|(c1w<}>#|4xNti0m_DU12n%muu%=*^ixQF9=09V-fd zfA*q)?wqc}$!4JTbgmJpXu66JP!*i^lh!pcN^!= zf8%s6l+eAkogz-O!SLE)?{BOwjyEUgayiPF=T=l^)N_w(e@knQR>0}8X1yHLz8d*x z)TKd!+b{v;y4!RPovZZ>ZD8V8m5CnSh^Ec$!xnfRxd^g_YKUtN;HrkmF6souph!Jk zEPSwb0Tiu)FzSji(e(TA38GX5=`!bLTVg+S%D}ivp%JNpsShSYwHR81YAsYQ+|c0t z`IZ<7U4wCza)VH3Ck>+1I5TZBpU}#}NSMu)D1WELvP4p}Gr8j8 z#<--R@{fJ46z2Y+cOUKbvT_g~^*SwY!A!}9ZTBRJ^^6Ehwz;&r{DLJ;JP?Iy=>`D< z&RFYW4rjl5*{g81cCWh6#K=P?ViE%+XiIL=D_I&7Akl&)-pDVCpZbu!!O5H)#hIeW zfHHt;vjmQigC1A^an+JR4F%!0hQ}H*GnmlaAZs9UI3pGMy4W)hU&EvJ>KYlpj_7K^ zY=d=@K?Xv!EEAl2S86Zy@@?2-U{{IL-&R*hXzEGQtekcDKP5@JDW0Q=@r@~NoC&s$ zXGd|Mus5W*IxU&ovl=ipO61=(CCPNsu`pwWB=6Jy8R$`VATYUv2SExHH>h?#Yxdg~ zd(E1b?Z#+CitId)R#e`e`Lfv=D_C{EL{|Cm83)(jg_tcqimv7@CFfPglM;C2b&6)= zL!6lU+seP8cWmY0=pV0#SL#0P-k5LyA(0)S*JA@7TP0(wD34c|ZdoVCfx{FEHXGp? ztF9SZ**}Gsa^`XHf?YK+22208HI=-~tLtC`Jl^V#3l!9>oS1*vF$0wJ%m76=8x3Pk zP16ZEW>f3}SzKT9zutjIgj7i(%ao~Y`a`t`wu0D6Vf2~H1eQ(Y-1`11l*=xX^ zEq|{ue7<9K<^~crPhRRcaBS0HF?haMD3#Q;wMi=Rk~?3N;R!Jz`7dt5trRH2;2^JL z9|I~ZBZgWBDgc$W;BE+a=F70E2&I{XE{}c(H+O|nUxU~d^4Zdz#aTnqvrNa3xy}PHx;h#;*HY}Rln67_H1E;0Gq}k?E`W}}a$P;6|Ee93=xt-;MS(#`s z8>}j$nXmzEt2i3p*YG78jkM(6jBgAr%m7{UKkYJlOB@at;*F-98*?}?Bw-L_ccgn; zQby{EOQH47y>Y8ZN<^y&@D%n!iFpdqMUWd;k$@E%v<7Sy$?2`+Bjz}Yts?ImR;LA} zv8;ix1(3%GasvD3HY=>#5R@z(65Yr~2wFyB3`YX`*b0#^Ev4H+G7FBRi;V=RIwos? zshR}#+us~ye~~kjzaMF$bA0o;T?5XGa)FM0KWt+>dY)gLLsAGTlj?~E!mc4f`rMl6_-EqEkV|?n^KokREjU(&(SbsW^^0G66LzVxFB^m-OOfJn&=uAK~kQ9=* zd;{xhBI@!j*cYrIC>kQoMO{IZRLMkIe*=_U&61QX{=m54p)G0>q)x+OWlX)KIlDn> zy0yIa&HAQz+y3G4IxYtr_t~#D;0z9x3GxPGB{|f(}i_oj|2>j}faU*zpal@BGb&Uwxh))f~qc#%R43*FOu_ zPRp|+|1`expQdNu$=IrLA_dZHn;SZsn++HX|hG;u5#J1F1~QebnOP?H*a zoJ9-l$RBSZ8HJfM|90+DY0QC5IeSJ{gZr_pQlbIAZ~%G{`C=^KMcMjx*G;i zyfvZ&&H0e^o73FQBB*{IjBZq9z&l2lF)jNkhmFaDcF3ue(IK_{{rM83`?p1O^Y4fb zyZ%obDK>`aT-Ywept``8Ml=@+OzvOj77&De@%(1?K6Xu{mvOoZSK0j)-34khQ5llj zA2B*~q@)%q{#c1EhV({~TMR%rKgB*1<#@2XkvJECQQ?9dM3_VOY{Xyk^EVGwbb!4< z%>*^|X5xXnPDz|yZPZ)rih; zxdUOS0lpEm>FR(O8Z^PEu|em67&YjsltzUv{v-~FN=(kjmZ@&Y3`^NTxaV1CsSB!o zpgNXJbJy^ELsE8A(}!ZnHzEu*aiJKmZ;(BU`waB`&_GR~q0ml>#zj;o(C^MTmj|j( zPv{}C7&<23+&2HXcW?xC=N_G4<4>XY=0G$qovH5qVy1}!`tJqE)2$}gHEx8=WTL)M zNa<4ch-5L@YCJpf&B>QSo6c?6rkD&$J_O}43h{+fO#CT_h;k` z12k&7sS@A6xFtU*WPzfOu_zV~Ds{d5_XsUaPe#UXXT~S-)QbC^e=qb?ZIwM- zhD&~1va+cKhnEP$coRA4y7H2b%^LxEZyn55j(H2+iv^Hun_MqkH(g04Uvo8=3&`y| z8JbUV<}Mn?SZwu}9YJ5T{l&_mKh}~$TO<*eg=@9eri@OS z%xdbeDIn=37{2CQR`5fjjEP_~;|SPM+LsTxskl-Yqlf4*tqE6QkouZ#rMVrZe|YvA znGh`|=EF8oACZEjWp?m*3E1^;QD)`~msWL7wC`!pfZt*7v^|8u4mTYp{rcS1^Sjjy z3<@x~93S8oxkDt_ZC^1HBkv`16(!TQw0gg(_Wk>3C;x<-6)%||E3bL4sn+$;aeD}F z6Wq%dcQmvo=sD<~*e?AwF#$}bqwTUl`?P=FlQVhVI$?N=*J4$M;R^s0@=3?;#3CbH zzD%7r+!V#D&#$1f{(1Wu+!3x~pIYMFzhI-T#Zc|wRr~Y+mGVV!rZ0d6+<9B8HoSIs zay1PWCG0vtu0RJM#X6z5m0w0#fD$o+GB871L+F5boOprLGcxm~B*ZeVapTsa+t7_A zT@L!V;`6oMwB`Del^OORo*s=Yb$zJ&Hm+5YtGzrlH`Q!j!>S^3jJ%1_C9!0poH~LA zRLh7BDZ|qXI7CJuKo@)_*W2KGypFOzl+JPIFv52bdBfDIz>_YMHq$iPghB>4Ck^1m zvULImPP4e;ywa-#RsMGvK`HSJAylYgTqs5~*~hobs&Rps zQb<6)1}m!M;$5gYZX+@}M8SoBZ%agygc4knR-4{knopLiLJ7h12&x?|KoKN?+&*0md=a-8-waa4)014Q1!=l`=0zu&smn$o|&`oHwA|963_ z)@mzd-aQ`j?E^dUx8ZujQ%#g;9#62~c~uxxRhQRr7RXk*pKkrKU+o?oBP0bSTX2(- z8l)1|EPPNL)L{iRQh=B|#s?lNOPj0J%vVWB&wlk7Y5?+N!}Rg>x!m~;h5&UMM5b>4 zxZgYanysrx*H(JYb-mcfEg%o5#AowbvVV>Xg%6Iz)lWOqd)4b+!;7x`fiI!G=dy}j za$miwT*urxX~2L$-mi9`6d^x@ChA2W_vI=EDYv)@Tg<1%&r4PP-N%2QG=I40s$u>j zATMtM1cj~b6v*jKfS_;@$RYAVPbpo+{;7*j@(=_g;4X=UEs8c7v1tv2tZyM(5XOhtQT;_^76!9$sEtwY&>^ z>Yz>LjvT!tdq?LAg3Au8lPPm8aL6i#3V3a0d32$~m4ECKF*o?HQ0yxmKD?D=^DueK zFy;!zSOW6+7B?>s^o#1U&ij`Y|KIdUIPD?A=EW;&C>yN5##8;(5~P~P`Xl2;Ho#?n za#DZ#yj82UiZ$QuS)GY)h;i-Q{)!q=QbUXpZAO$X>IAIxP`&J9JZNn5`s_E4&hhV9 z?=AC|CdN92W*VBHPoT9kncFlM0URiC&IA3s*_6L@Pm?bod{F{pUSIT)wi-eK#1)y# zQS)iwWZ7_ML0|)S6@CSYA|UAx>wAykbiBE>r@=yquK4nylz|xC9aMKAPjV3g!dKOu z>Ms1MTT4v%jpLv8Sg_hZJ?%Y1l!I~y)0vwl;*M@85@y243U;9BgIx)Se(|bwyIlMD z{8NbNee6xhWsIl}Ax2|EWX9!>ANj|O+9wlHIqGw1e;%W0a9)I-dnh-6RJ3D&B|$~| zwQh%uWeW|TzWT=t%$WP^S4&_C8hqkze+dwT)LNJ-MaCn+_$W*OEYfDk#X)c_?{^Qd zKZaZKi2DoNG?=rO22`C3G#-V07Yxix#_+sHZ&_AA9)-`oI_I>XoJ9D_79wgQxp=ZO4=om)2k z(+fyADkf%f;=lX9RWkf{|Ere}^~=olB?P|ScgLp(!xM^##|NhXqQ-N1h-+tFV##W` zwmv%Po%(16T{rP-Y%Le3++U<{b#eh4(4#+KL18&zi6x)*arNbKAN=~@toKmgJg6SA zGu1JZQ1D$f)w}!bF1*FB9_%0D;_C14;_hMpe7X#=?%AC{JjKPOn{VvY<~sD|ab9Zr1>?qU`1XBmhVY zI#1XUj@r_I_?Hi_yY##N8iYzEf|MCDyGTblgjNz7^;lA)mA-+(=9wz)s=*odE+IW# z>_RrW+_UDTd!w5dxxe+cTOWd1cTb>a!~huyjz8E?A{_7l9dIy%tpM8qbP6j_GdMSJ z$UG!Q*1n^f1kk$6qf7Vx~YJM;C1_k2@9k`RO&dr;%GnR z6p?$1Z-DFkDPiins6txiD3l2cF?`c7-ik|b9Hef56qo_lo9`SWJwf*1%Z}_}l!72Y za{CQBD1OL;@V%zAgKoD(*q0Den>R z+PBibL1mCGLT>e`KIq@g=(heB|4+WpzdFOQ^URb$c!@jMSGG2H_m(#Is&AjPcefs+ zWh`~MCk9szo`_FHYi2$vwg%Ce#n#S`+84*|D`>WdXMN;(x;Ssm+)s)wt^7`kE_I)u zU%Uhka4TKsUQ%RpNsDauu)V{K<;%@fzhByTx>mhHUWOjdx1!u678pC%y|_NVf=h`n zatN{S`G?r_bc_hKgLMokk$Kj?>Yw!}JA(7`(f7E^8lv%sI1oVR^a-G>Znd8GUW?HW zf2*gP8(Ul36{lL~s#Bc}TYQGAgGI2jMh36im*_GyT4;q^CIi~i{iRdy5OMbn>PVL> zI|Y(1aT4J&ROY2JnDhbV_jCxx&6;7J6N^oN=Y+&Y0Or|zCMP~z@_hRI!|Dh5*A23J z@_cyB%VigMrU(A&;|wDbh@-&BL`}D}e>!}dgGWoeIwLGP0-e+35?$zV!e;{TmT|{r z-Wgr@(+)zwIL41LNSXSXV_Ye8epDE#ZbaJqT8DXPZTKX8w)NurTzeEk7PZHDp&8PmKyWIS&Wo zpx82Y0xrv^wexVcM^jnRnUhar%C$q*to1#k)C5;$=WqJ0UV$X9`{ z7%#eQ5`+5UN42KF+(w7}$J+d=74==%V)gK=YHO$UbaQWgBgSI#J)Ro!J=`WH)5PzV z9HS}a7YS8JZqV!Y`Y*6GY8+lfqNGsc*952H@gELg-Y4@%;T9~{N>EzU;c-`)ZYuMtBZH`9`D_; z3hx_S`+4iV_uuDay#Kz{fB(Jreu>X}?}c*jzyJOFaWD8gyj4K&z4t-%=z9k}`a3ft zKYk&w(dMGQL;v)%pugYy;645P+P_DQ_p8NM?l*e(!7qQgYULLf7au?VfmQVV4|wqE zm%sSMFRlEqD?UIIR{n=&j*Vk>@bHQ~u=o7_C7N)*S&Ch^?n@>8ts{`WEmrTp_e+I` ze}BOL{D*JQ8;n37{rV1meE|F!x<2@5d2?rTaq*)M^!*1Pe1!R3#z%jDk8j`0Kl=O2 zJO6+IE&juuFZK7URhC^|UbXRZ{6EM)`riLuwED}ezPY??^;!3asJ$;gu#debG4SL1 zx4imz`yc*c`|+yvkI>{}V_rV~;cp4k^?&*BaA)VQ|N7A*E06KY$HBXNyt?}Mk`T0i z_WrLw`XBVSz7OsFkJaL0^#M?7?fu~TYxq;>_%|BgGEnN;v-f{{Z2eirOXA%3SAG+y zwhwyY7{{3J6hxgxK5S|k1&u^@5%o~Lpcu>82 z|K2TGg1-*GZAgzfWRwR5U{(x&Gmc>`xbnAd?R|pJKZf7m68|s4?_b}+$HTvM3*$Tb z7Jyv|?cXo`ih70dhPStFeeluy@45Lz^D?}@vh`0GY|haSe`9b{QxTfky-)s%Z}fxL z?@#&h-@0|@&R_i%m_+5?e@O~Z{DOJ#111>2=+wMmLO*^&}K~lJ>@h>s_iNyyN6Gq6%ciJ5(b~Tv*)sV+& z3kFellpAFPjO#(O4=bRn<;;My6-7(2b9LnO3C@LDb-Ny_fB2i@^AD-K;dikiecj4z zgOGR})tQ+Zv<1b(^`-b~Na7_rGxNMG=~wv0oPJ)bGe*k{&j@3ISnG`4axigP&j?`R zz|dqNk6kAYao4nZ7CG~{S)AaH&}d?h0iawN0BvQH^Z@0`0O+(Z2>_HU1E9mgBmhvZ z41mrGlK?=u41hOUIoft~?aiCc1ZC#2z?5hxRDs)oz}X7An+G(94*5pTEuu`IDfXQ? z7E84D`PXZX6@?!;UmLu@6hf_(da$b*=^*&Gml2LL{uj-;MK~;3q(Rk=h<+nB{!T#I zp?DE6{L!G1;Jt|5DU7sHiCJw~vD|%ZFv$EWXH5M-0tW&h<;`OC}vJpm>a<|E_(U-8_ zU%Z5e|HYyA7GUbOXE5rYR_mW_(bK{0dxeTL%zAV?b+pqw;>54;{k|48DRbefq9&&X z73j8Pl^#@6eYy!nm0rLsB^ohE5t`%+fga&KrT{aE$%1i+d9;%a60=D!?U5B=CS$(C zq@HsrImdM!9%Ihg7B0f>>T+`>u^kvbz;wY4H5A9u2A#eoA{$>4SCOy6RF|$7&3Kt9 zwwyne7W0SFlA~YlHnWgdsNj*E2Uy2XQR_h~?~$R|vtY1@hbxrvsbBBLV;m%zeR^dS zoHCjg$fzBzOeyMz69V$Mk+q5lNMD)?D$Z;WP--=Ag zgJ|Sq#NMaFkEP9ztEly_q1KP)BU#RF*!xJ8j8)$1%PfVtb?@C@+=Ov)cz|NKET-(9 zD<$``CF}8b+fVnt!#h|ZX=8&~ zoJJjqV5K82`|on9Oq0WOT=wkYG%btgmi^;^tQT?8CK`p3m;!(sH?+ zn!E{-E~bA<=SeO}CpS2ce-A~>{Vt&jZrmF6fgK1^i-7pr^%uus%5~uA3HB9?@ALM` zy1I!uK{*_zn+^ULK*$W_N+QX~nB`K;kHsppEyB-4h21)SeV2qt{qXR` zkC1OfDyZY<$KrRk`pnI6+;rSJ1$r#!t{ehBn+nbF{N+i%d%}cN6l;g@nPej5Cr^-%TcodqEO_Ne1sy{6F+X&+FBM$})I{jk z*VySZZ(j_7ac#CdoT<(ZI97)1K$jp%#|IHtuX|VUiiy_LT^AjJ^(D^Nso7E!4V&DW zY{yikdV;~IEAiispDZdsE5|93V!oVvl9toSz%2Q4{z+Pp)j6A?pnsAU4AV;wbKgUm ztF)v5;1v3{{Szzb&xXW>s^R3Af+NTH@U6(JPn~^nR-(3Pd?XiYV(B}ZxYWtFCwLRg zNRs!%UYld23$O)9N_OfIQDQ)0aCgchqzVH~_3{7yzp6g|-#^j6{@*ET4XKQu`yAdK zm#y8sou?~%tfqnf%k_xUWR5KhieHnjiLJG*WZf|H5v zXfKf_fv+LRQ`7Es+}N_DIe~NsN0{^LSHJOHf|LVDkv1GIUi5kPvJ4LW3K2m#N0FPD zY&cLRJMc2T0{EleX%E^n2d`xfa`11hZNX&HwqSA+_#P2{AUX-+@{*5HUzHllN2y9< znF-YR_$@<|U3D1GqpQgI`Tmud3JL`zJ|10Q~RhChUtC;zOtY zzS>ydTiaRM(1FJnvw-MzfZMf&cg800XJqH`&YSAsJOPn5$2)x~HMwjYl+BWi!cH(;3cQG)*z)sxa{~#bt8HkjMt-#t{Sx#CYMN z>LSI)>r2Gv12+#88?@KI`^*6Fx?aJeqk=vVXdU zPcgOyJ4WBB?7@V+&3omhFMn>mO?oh6!BrwS*$P5Lff+s*(Ixvz!CWm2K(5GW)7UPk zZx#(1pia=5H*pne9m zLNa^SV4*F<7mwy#^B`0?Z*hC3*RAW5M#adZTBG+!-6>ZO^KcvUpmK3-HryH)S}L?d&b>+HFsY z%?kG-(dbN%n6MA0(`8e0m@gW)Uav$d zt+2EcY7?x(8PSazoO(Ba)W&WY1IW9jNl#(c1Y{pY~}&MfVTD zL(ySyU}z~cC|cSRK~fAP+B~g=5>F*RwRkAlu4s4)fy-QSpUeC=e4k`@Y$t?Mmn!Kr7)z*#=B~lilFZMvPZ{sYdfh1a} zKSV4)5KljmuOSn@cy<8gO8b>KNI`-^#yC!aa*~!or~r~t>EdZs?hB~W8LmJqu4Ul> z4v3lq*&w`V9Id(rr&~!+1}|?T3$v^@slbKeiYl+GRalHGz|m)13x~Q02wr&7Xz+(B zTfI2!-Tsw>j1z0`l?qcGh$l9(&JlzL8Kidqu(yaBzO3tgsfM<3ghcp=r0QaIJYzhy zEDIi5UREdCS~7{8mzj#@oOvoSm1Y&@1rzn9bHWSkNnR7xzGH_g1Mw1^L<68Pq>Ibf)FPx!?t<`I@N$Mk&UL?VKb1p--_a{dP6Cvhijft-DfkqqueFG# z40iIBuqf*YJSV~!%n$Xi1e#jVVANmfAei<5n~#T$VT}AK@r}U(O(oU%mP2_LCUtoL zy(S{zVN`{#2%YFx`ai|BhEdWV*=w7Bzr6O{>iX{X`giM_t83qWx4sI#-1zp}owZ%8 z`^NWwxdeTNJidVEDWYp#`-1OdISKkMzyABA17Zp+wyjF_j8I=-w zyjBP_s%1iF4O3B3hhDn=hjOJMN9e*#MZbhwiN~LcSS=Itt7w?=)dnNqwacGF;#z=h z{1f~S>KtyWdV;0T7Pyw&QA@W-T4jENM9P;iSgQ!Ajw4-|0+F*w%qWu5j;F~#{VoFUS2}sAwo5D9wH5Tkq|O2&LYnay00M^J{uFcf%Yv! zoE*MY(6lEKd#k|x$@9Q@!l3U~46{OcotG*PdeDC(Cn&VMzk#i<4^tjInVm~ai-!)Y z#Op`r;~$a-P<5CgMdy!dZSF9+e5Csmw+4n2jSce~{VEU6xxb7@<(Hi&%kDOJ(Ezj# zo)xDEkQPFt{DY0=kO z&{k7g(yhg`sGin}93!pHBa;wg-k36)w6HB!-xNB!zPq)saPNzD2WfcDg_Bs~L%d^_ zpaW!T9*`vk_#o&$vXSAEn5z@G(BQv|=Lj0-YGQ{^50Ik02Fr9dX|8|I;f7a7ZJf*t z^^nE-5`leKHK7AC7uFQkm88&83q&QaPUs#8Wy%Z8Qd@a5ELdr26bt^%>+Xc-5Y&Z$8~uEOniB;}A3SJnKcNgN0|wI88U?29hcon2HhX z3cPV$RY>H7f3x=FDUR9_|KPT!!U4afUh6tADCa`Fe$}D?&B*izzAK z^F{TVAy8h}_s_J3V$W@Y(6ZG(Q@VtZKZm-w>O<1`u=)^UFucIY?>U)=PGi<$Hs1mU zxg{oa5EV=&2Ib=4ElCE*%863W?;}UZC3DVfJ?1T;)M0(a+1G0qV@x;}f&`1;{-k}y zxp`Q~Q*$JY-g%D;Ds3NPEu6@)Mq$W~C|VG9jnoekpv=I-mP|a=p}0z%i&#yJ;$R0N zjekN9XfLx3QjX$Y9tlFEqY`&qsWHZn9V>7%6k!s&>TK}>%est(;B;uF_|5df|C>Jk zPiLd_!ZV$@?`CEW7k#T-&!ZTI#BZxKOL1Eq^e~jycqt zKRbTaFfLWF<2X6jJN_H_FMHnH{L>D>6 zIPy-(K6aJ;*(up)tA`I`jkPGU^N0EGH`2LRv(=YhMvC|H@3*6Z&pS*#{3Or*c{TE} zigoVjz_vkEL+wMu00|k1U6JbH_!P&(nPbe;tQNYB!w>DBu%*Ct;t1Ly*l}@yR!tEP z)}7f3NkO>>ijv=j?d#;S^xF};TPVOT$x#X_bi}DZ zg+23mXhma2n7Nma>u;d4YkCC*4_|#zsO3`U!6^Ys@pwq)015R0Y{23Z)|xq}kT*3h zWMML@$eyb@+FwX_Kq8Ei{h>Hf+UcTp3`>ulpCFL-;X~0$s^d=8nUlsGI9z3Mb%D?* zULP>erG+6gTB&mwis5Q3a9|XP8zWrg0xzWQ1CBWyX#v;rh~Y+S+S!q{tT*YI7&H*o z{C&CR=WKXZoRH)Q8Ud9)!IXdjv_NPW3jQ7Su^G3nZav!A`UA6J;&R@o9~a~{2Yvh?kDyDLkZt(gTkkp^z}kDDvsA!+W;9+!eqg1uYbfQiVx1jw!j zNh8e6QTWLQRge~%2gx5J7>q`ag_Jh-Z8^DfXKQXQQsk3#SQGa$AUn3m`D`f?fw?qv z=41hSaQG#M`b2}`R4pgGpXwSGg5m0IV-8V{lNekj36!iglg(! zUv`uH)9S2Kef2N?tLmwLv6ktpC9kF2&;8xZEcMjT_~T+8Tm z;*#G1caSR-o;0z$_XfuYU3hKH0UbD0m+>cObpqR$&Tc&h3V=z*pP%*+_hT2c{I*r- zu4Hr1>E_%2ru6dd|B};o@9KOk*9O1VcTlTJS5YCul=cDHwWiVEKUz&nDN81o^c z=y-B<^rx%K08O8qq)(9PFaq8y z0zc_KgmFCSyF6lM$*A%P_RDh+HBHV8>~WbXl^5}eur*2Wr&mk&{Cx#I%&Rw5^NXM4 zCCz5Ea&e9P5R612tqX}t@Q~4l&tF1P5a%toIBI{R8H9mArxuw`Vo$SL9kQ5n>`tW+ z864qjBlgqfMm=o#ZwlO(c--AVM7~_z6N=1N@bL3RPP(=lBOnX45@&ETyNXIc^O3*+ zX0j3;UM?B6f)Yo=!_x=`)HO*7^aQCCpG760tV>FCuLiucC@zt;f|Mm3PFx~uDf>zGjPWgQ-zTxK(PuhtPMF&np2>xmSZYmpU83UuDS z_l*8OabOx8LGWo;zvt$Fe2918aC&#ZeHuuzZ5C0EuGsdI6%=>HTJwJ2^<}CGWp;Ob z8Hp$@fm-`^uM>enjH$5Z&ujskFx*EeI||L_z6iU=z}^dtf$XQX=_sAfVB$v%&`f-YSl)!clM7wRU3=IN+8 zQ!9kK86!ydq|oO%q@EU9(mqKUb}a3atZG%P1Ds+M~ z2ki>jBA*aCdt^{G~<)TdgZQlDHQOpL)mlPDPBi7fDX$m``=ORfyDnU=cjpj=vrJee8wth65?CgO2>59>2@Vs~$~y|eZ=PuF($ zlnJzV*Z+16`vajM%Yo*P@clvQh+B**ql{xz3GfhN7xof-de}+tZ<0Ca@<3v@fMW0T>AmG9Gl}$v?gIBn z)8%*A>rn-Th%Q>XiP;|fb;D(sk~Gx;n-rE*s>G`xT4}3mkCvWp?6olkdplbj?I#H6 zg00ri$m-hf*H_lst82R}JL}tfTRZKIwas`-t{2$*R>mqVf*3r6&8@b3rt6T`-*!B? z@YiheYtH|Ihr<9_0C>}#e@5EHA=^=)Eg=8fG*83J9%Lz32)i;PH|(ZSaFBh7!+L?9 z+=R#1mA>|MaOt&0(+kgGosQHAfe}!aF@`>@AjB6nK9Y6g*IKt;(m&F54P&}Tp~zz2 zY-}wrZM0XPEVY-PK5{HwQF_wl(a!f>e+nFzuK(F7(ube&5xY2?ZZ*M_jNi;g*k!(Y z1FV1K+}DNq&o%Ny*aWT?=48*Yn6$xb$x103@7Y+xmM zU;_MjLaCSwv)j=Ee)ia$)n%?w`x*{U(nOo*$lta!&v*?}3-hj8bh=bPIHmr{$Rqv( z=MGHAD)cLlxnF2mV#5Jyhq;yH>bzQpdGIJcYV!J7KBC@2GTBpC#oy3)fKu&}^}Ht1 ztN0KFmY$WW03lTYLVk}1(GDPXPjCf=P{|IqA;u6eyrBJ1slYwsnGxqVzQLezrlHzV zPKjRaVVD`5(&1aqp)8JV{Oo8K%o*PZgvCV%(p3C$cby8+!Cfm3(jafI7mxb$=nQo* zx!M3~P-9T9q5Xln;4V*YgDV!#)CX16ecu2NlpI34qYc;zzp(*Vd^Ra=XV$0z>yIlw zmlPL?5vlJ2I;}qy(tIPPq`idpT@9X-_?w@ohBlzZm+>kt&fomhibK^UN)9dVe!*Ul z7iWKBt1dzvr>eEp_R{Jqq}5%G#lkAqjUcQ=r^vvPUA;czm940SsSt~o6t1o%l@$tz zx|9vG>rnxxNkw8TQkyRiW$MXgxxBurm%nN*k5^fFUO6M5dVlm)T;4BJXWYIbh9HOE z07H9q%m6J%z?<&@rU8$f=DLO||03?1RuIK@se-{JWy~vIDd|z11znRx))XAXY6SS8SAj_eud0RD3up6vKm#y5kLxsnSR(S zJ6q6BWQQ*~vY=1WAv?Kg7+sWCI6Y6n>^j4&S)&Sg?j%?7h>VK6P-T*p5jEncrSH|y z17Sqc^ZBj1Ql{soMX^;;q>*Y;d6w5{+ml&);zssWMbu_9FV{?`?cz!x3JQL5WEm2t z0ysJs%DJ_MAGRJ9l2fni0^a%aBhR;-7m*j4FwP)hLd3wviWQr1q#$?~0}s46!vx5v z_(UlthF?A8R28alSxliyu@c+)6;VaAk5tablMIku6p~F3%(XHArUa28N17VjLaDa2 ztjlG>wqxX=-3hzB_U-zf%624-7>3eFn}iWRHr&+)rA?j_HC`iP(`Gc=VG*gGl@U&1 zFOyfCB<8!3cRHW|yTVIdQwD!l!6y(xp(cjsJ4enGb)7YNtRLC-EC>{ztg3?(5xBK( z3r`pwtB$T1MwgM*_^Modk_9~OOB>z;dixg^h%7;HN9iOH?GRy8_PFs`yaRO?Ll)AoO<5sG(t^{qR^RWu>;q z@x`3*TcIRQ4mlKYllB9Hhxu&8&>IKNX_=DC{cK*Q-Asg?bHud8>rl_L$rGDYBRjO< zwS4jjo11dKU;WCpYDKy9iJz>7%u803c$eq+CwpaxkD&;Wg-uQty6y75wo+cywCpOx zRM<<;+fX*9!UhDfT-fk3zHOgeUnrJH8!Eg}g!j@$xd=}MS&@RYVXD-cw6V6jTN5Ty zeW{Z+xRfM>-d@A6CDFGslZNU+BvVZ92%3=kvI=ZGtG(zX25Q!94e($YFTrL!7p%!R zqU+&HmeE}?6~B<91s-&eQkZ9WJ!{B=F#B>ui`MOD;+E1V3Sp+?grv;U^}S<)PgxWq z+P`Wga*sBGB((}I=D@8IuJFt+8=*wgp0fjfwNXEw$Tz(s&>H9wwP8*G$;CyD5+b>V zEhnuQ3(Ow_Q006r_4|Jug|Vp7k5&rEJtq)yP2#7>06muQxdB zpF;+eTa`9&Qn*{{__W|tSR;lYBO@Zi8gC|2*C$1M)RTP7qUcfuTEvNbTf&I)I_X3z z)x~ow-JbGtF1!W9ji)B-I|2CKMR#p=0(Hl0(7LBc=kqx71UD(uGt17p@jFGMTDiO`xA5{y<}o)n16@E2VNPEs+rccThMZi0Pk0cExJoqLIAshN)^);6&#OWfZ$oN7yE9jaaBIDID zjl0`w+(6L2s7E=H8ci|K-pKW{BvJ?kS*MuKF@0oHCp&iy-F^hR&t@xKdX(0gphsy1 z&@ViK)1|LuEj@~-(sib|=oCG^_yqm%Wu*)LSBwu&6A&>f8yWs0g&;?&sy5N7s zT_DMwbldLI73`fN7thSB%!%vX3m!!l88)4^glPMgfBvhqtSxonHRgahfF@;OvU7&3-zQw%*8n5B6e17qg zaVGubRa^n!8E`{yKu_6&J?&XaK zLRx&hVrj$Z6(yJ5$)*j@?=HOk8O3508Z3JpnVFT~1ccxU+0v9`VI?&KCCr*f+$Rae_Ikb)VrYaClIW zGoL!O-A04e(#J>Ad|aBtaNQU;e+_*&x>+9%NA}^(=F)~&0`1&RoO9RJ#WP$OflXmda_z^|p$k#ivA!e9$Z^%ZqEB^~ql!B9T=pw^~i^6sfN-n zcZsYdzDN0&5nW>b{hNI(!bWH@p#~wTl&F=1kARP33~3tMKD8yPjgkb=s-AraUFEn> z3?kY4)hBOU_4s`ZO4WryZN(0CAQEd-m$S@8wbRNO9)b&RR3rKtS5B+ad>p$3N0pks zjsj-v1Zz4t2aB?MjyszESArYEyujt5z2Wug6}slp0zVfhYU<);3M>Ni15GPjS~}HG zGJP6pW<1>3;tRIn$wjJbRaj9c`&f0kAKFMxb{+-O7HSP63cd-63Qc?F8!W&~C(xH{ z`ci|C)mQ$D(+?O=hnl$Ty)uUmUyE+H_!@=C#m$i4)RpLYglf!_tVueS@tDd<8^178 z09mIR)*91+VwmTxnlop0zVs@UsPXXb*J!r8Bg zsuswy_z5G?(VByr)lzw4Z2 ztEru(C)2GAky(56tMwIL;%Y)W`BY!Gz_nP{pQF;6$gsz&I?%FuvNC7e1LCtK+%)Db?}na5KQ8+xrTWQ68!sgZV!Tg-`y3eUJfJRjy4O_fA&+RJGbJGbx zhDkpA72+yfRTe}TD7aHrRh*yVdWgUjnvkea4cnYr+1{Q`+hh!H0fW|I*x{hW+Iie2 z5Y4>Ga4H92P%w>HU+YrGRu%~226o>WL-fagkrVj!KF`QlR1xFb-UyKEXz< z2sm$$i(Y7t;s?{>@Zx$09DaUW(LYUHYrS(Cgo?P9dIiK!_N$%s-QPVx6h3yZDE1IM znb=0Q-HyYLEGcW}ka=E}y?Ra`p9%Mw-Z&iiw) z(ml3~KR_wOC^$-tkcZs;k`LCqoMlbkN6}JTCiyqr-cUs z^g9G^&0@3dG9xlS0UK4;7_cB&nZl51f3f>aIZhSId}!B5V00kPx{Ia$&>{B~S$Fn{ zdX`~QoQ|PJ)e1F7Z7D5!)}(+*mU048zer?yzbNbUw<96*{2t8i%?7?v-ebe3)-vi-6TdQax=KITp@hfW^1 zsei;#8F!z#cuM(BrC?H!D(~Y1NV1^D_&;2b_b~piW!>k*D4uI*E)5d3j{DE92OR_3FRyaHEfRB-%~)jDk7ea0Oiw2P{RBbl3;kBBe)kWKw?L>i&p%s zgvrt~X@AO5I#Oy>{6D;XYk4;k92BJhz^aik1Y*(Zssu*i1Uie=-V2R9mY7UYRTqt% zV#rjzL^`(IbCM}AEEfd@!bNsu)k`OBiS}izMyVdec#B(si1?sd{L-)7A{+PD1tq)iZIEbh~s2%4BnnII(yNC4(#fXl#HLC&&N=F;_|# z`V9CTYWo~k`-*;kZhCfc@^@ryc~fx0<%)o)94(A|0L}%|4`R($AO;~(`}u&wFv#O< zS%y<2rcRdQPjt@5k*p&}{m?BJMULLC>j}00Pn?aN$8Pw2L@&6UbD4TT&iXFVoKxc! zj)jLuZs1!24jj#EIQ z9;MR|r4cp4xmLqzG@z59h7+2bQlF@ICD!IG$&_5-tj7!Cfx@4Xf2c&c7{J$$M^(8> zMX-;2cZRPODl4QUgUeEmjC>H5!{7pk6DTC4 z49}1}tOQE(2gueqC53V|xAr!16Ss1jqu!O$2K4TpHb9tJ8%11dzAK}_Uy(ROr_eTB zpb3L5+F}gQyZ>)N_25e3LKA90$&m9##jYd&BHT!3CT_X%`4-pKLJ?$Ir}fnc_Iji~ZGmlDzoVm;ZlSWA6me`5 z87rA&%}FY>=)}3bAao;rd4J&YiMevagBQ@EG5XF|y+l^#Htl**-k?YvYIo1*?mC5P zmxJEr!JtQrFpp~F=IR}hNMMxIdzbBFobTH0mMQ|i&ngfYd^fC~#4UM+3|5^uG>hSn z>m+`oOQpcfWp{W!T6aOQ22)$2qVxhZRlSB?k)e zPnvy1HN#*}dI}HE#UjzrLttMISJZx)G>N5vyZkw5Dy)d{KAO{u1+{tVYb zg_^YquT{l$#MPg!FCaJzYQ-%^wv@4b)mk0P#5DV z{Kf!d1S>0_AT?6mBAZn2ozAgk$De6?C(N*J6x-N4kvpuR0SjH#v(d=?X!Zk$#k zv>vB^^6o}JW=@(l&^94hnOulrb72CMIDY-cpuDeD;u0GBa$+wKq7!s!q)|qM@-uT} z)q;3v4rx-RoG6x_Y_X?i(puvJ6%uT~Ti9i|2rkvVt#JaIr;WG{Bq}>&JZnwUW_14M zla&JSQ^fA548X~9*?Qrj=d<#fziouUd0q6((NO#}V9@nI4!5|2+@R23v-Ft+ih&|` zqSI#y44;hwr3;{d5{(U@Cw@w>>J)f%2&49z}A2ql(EY zMu);S9uUNE9lH6J-lAm^UniKfRN(VGFTf}7@>3o6C;Hw{%`>{dlk2O6b6Xn} z8&$4|ttC$1mMk>(ps{kBsFs~?8h83M?{O1>@FVf$V*VJg3u+!~!A5gu*b(WGiQTdm zBMhcr8{klk#1ag!YG%r4Ld9NbW=yX0!rJo9z?;e+>vX;)q7qRx79A6Hud$M5_AoS61SaAY6vljd2+ZjZU|q{;+EU z>}+2MQuL%PPW`}FtU_>o(Z9Y&mVYcL5z=zVU4gmG&>cyMrBgMo!j+~Z-P0Wa_ngCy%DqFYm+8G6$eF6 zXObB|zO?wO!%^7%g|jo7=3!2XEOY?Al7Jkbg_wa-IRqXBj+zcAVn9?Bj(TF~8 z225C6(1ubFA`+qdTA|k{klKD|NoB=QfESN6{sJ!DVmL$G%J6{|=|U^lAL8cn*O--v zwFw8UAu&9t^*P2~rV)f$Fm}QKA|DEJA-q}7o92D`K~fWEQ-*4PORpx}z`d~n#c)3H zItI#Ht$Vn}Lmde3R8vr(PY0_<>|5(7Xo;77>CQnMhq0Ev)y9tnA=(046{Y16sD_L% zUVZf=XGCHeSKwmtLCrZ^n!Ca*Cn(*z3blH3Pr`^>ha259Zp1R>IE1c zK*q@fF!pibBQEm+p?7F084){?AjV?^lI55%ZC5X3$AaM`tR~?diZs*x)HrPD8HraFHokl1FF~&?=Lgwr$|b{7vtD~q z!h61nPhWmuXjZD{0)*)=acQV7CW52d9&V0_+FpC&dOlVs4^G}!#SsKXMT+Rug*eB4GF&;QsFg1LpYn=0n&Cf}0#5>;$utFCPFx8^VL+ZHZd@@|ykM&_m2 zm5sHfoySWXdym$Z_MYzWejdHd0kIRvD}hDgpKx{YoS>ODASeC_(ytRN>G7pk9UsFi zftX4T93ZG=X`c^dY04qPMB&(#s17(8PxND-aGXa0bBOw0Muo~>c>}O^hiY&-|Fvh$H&_m&;toc0sR22_*WwWG|ulx2}k%L=4qyDlb0uJQ#GBzMjf{tK$@j`RD&wFP1dN*jkEpSoHTAo z3nD35qms|=4JL;-zB|clx|Nxo0dKOAb5UU>fzO>mD3k*Z*clDFY{GBn3j=SW>V^2q}4H)_vs0Gw>p+08M3 z$xV8aF=PfEMrskKGFHX2%Q=#~Qf;!nqANyJOD>z$+)tv7!Yjc>+9K~AO6I}kN7`1= zZx34myp1pg+6ew-7h~$ZId&ntAQCgaK#RJEnQcHtd$;-3-o})s@kuXDFc@~CE_uAfEy%l&?8n8BwM1vV7=g*+;n06 zF$S;?FKf$%sGUM|;KWUv3Qyzsa|>myGd>``p+_W3WKoOp-e~_!*KAV9?HMKhm9V8| zrczw88C{0WBiS|rsk(1ok0twqn7Xims>n@?Hpt%0LIr7Dw<=7?%acAXvDQt_k~`Fk z$GiKNu6_KiDK=tgwjILKslEhJy;4=n`NISN@D`s+Om}HM9|MHOS5;mhqWmG+l$R44 ze?l^sA#RTX!U}^I%TM8XsH=kTM0Oh|<0!`AJWS()H`c&1B8q$2g#yd4{TM{dBY*v9 zX&N4yDm0;uQ~A_2uu7?tG%THv^p|GFIoE?V$oBLU2R;v8_{qx?#_H;;f~wc4s!OZ_ zZSB)K!jz+xCP_soMzY$n^8?o~G&;QawR_e290zt1)#uLGuLpQHgh=&6ONdCyh~zJk zq4Wgm08wGNkWbAy_bo{9XkFraXoEZ8yH+ z-$0ESX+gH4T&qtjG<5H<>YX9_|L(B5hs+lI3d!mo?mka#I%X9VYdWw_VOT6Wwm1W` zfst@2n0QoJk<+kal?hwOdcUu!P^k69^Fu3DeX%25vDu)aFrY&WUZ++^Zkc#w7tysi zv|WUX8=Bi>FOj~4glW14Jd47$tq{nuHXw?)mGAhJ6f(#hTEv1}(IS%wYtDmg-0BS| zsz^Vw6&m|<&I%vUgLA7xY?_v;>eLY^R;8J^&`iCMkdAC$?)GrWmZ)27nC2jM7j0F3 zI~Q>A0G!|+nH3f$Fi7}HbTT^8wq1dTOgh6%ey|SPT1EWx*76{QruK8zb z(z+fn4XA(Ui~;_El5MRrwZ^rFu$x&do3GBHn}dyiCVBf|hjN{R2DyK9O(k@+Hx=W648icE^fMNlhMRoqUdWI;}A)#z7*fZ z)>OuctWD!4wp(Op8;mvYCGi$>pln)|Rfc>{N@e_avf()mN~kB_MpTAcb4z%mBN?q) zsv$+w4zqAlRLev}8G(~`5p7O71FArt0xpF9!5KQW;Fb}H?LiG{fB0A*Cu`l+UNg2@>UnrziH%i^*`%h|F6VBBQ73E zSM(W#XZ*zV@*2y3esI>KtPITgXJWv>{DwqviJN|2 zW9Q8ZQY%v{#kg_-hcuqdA|`n&2$DK4KEuWi2N!<9a;nn9b240fp~%T>dLnN4MGdwUrW*s!wgdMSd6*h zRuUng&*WMTT?~A~@I}!FELM-7E+fkD>{4=q*Gtw1$FsZI%+P7svL2^}k(%Q!A7M!s|&qHAh%<51GbA z>2C>*olXuST`~R30!;&M_5~ebh@pGZwcGWudXjka1e6i$8WSc1pQSmt>`Lkg&Gr zwcVAS_3b@mkY)+!QG6RCu6OH%Qspc}koi5FatTZ61Lxrp1yOZnV`(L|nquIe0|j$3X71})umXmf#R%k_r&GC zl!jTkBbDV^PH03Sys6mPifZnxFD-AZ+5MjoNel1%MS-ndFz}VV)wCVlNC^u{7`(Uw0$0Ewi$nf@|Tfv^ry}X;S&gwR@ z`AG$6-Xpewa5@GTfI;wo$s3cfvm=Zn9SbJ1^OHL)k+V43$~vuvd+UU;ovhPZBN+i@U8o9{7g9B&!Zqr0q;*CPnSjvY7X?~f&o(H+K739bP=<)G81 ze{3RZJ66^Ep42O%oHq|xDWBAMJ_R%}trrJGCPr$HHV5CLHcUMY9i(e??~ZwCcWzhW zOq!67PYfM!mBQxO#Md#Y_9i0(d!o?elN;tqh&fib5A=jF#YAUUvoYVlTRMmsR~Zxn zdMy5e`$*DX3bSL&@@5I|f8v=-L_^}B5a3izjlL8kBQHsz$Bd+;agCFm`6(6^emaba zLRuZL>6RW9=iJRH5YxRw!{PSJ!PfaK{^e2elQ{;=(s`!FJp&`+_#%`_l7qB+KSwO9 zfyCitG6dgrRBw@dVo+l!2-yqgbaeb8StW|Y#B$okR!x5#dP3o1k|C3>HcXaMXX(&k zw`{mJrokjY5ftZEG#Rh8@SqBrSV2yfrney#b0w2Dp~Q{DyxbJD%1cOpbI*a-#6Wl9mFDVK6W-PnR~VTwu5LxcZgJTOb;phI!f z;R?rD&w-J;23@MTTFAqJ)Oer{mjFJT+7_YiE2#67W4=+E^m<=BKW#qdu)C@!_lyxL z@zLF^WirR9@CJ#@6|tpuMXHBx4;jvPcD8nI-wroTYv$oq-;7sbW7I~MO(`GzLAiu- zZlJ1Pq@=t^DyLavGykXlGB=AA0Z(Kq6L8ju76z>(cIQrQ1&7Lt6W)nK~Erl@Gj=3-UY0sBMWKN z{x+BiYORe^lZS9P=i>AW1nFspEn|Tr>&ETEkRsnqo{N=vdn*lrXz zAt%&DXpSWokh8IgbUFt#AL532+61+YQNXK4==c1p)`WDpRZbGK)9W_vJM{8uC(wea zWzWlPZvRT_%0`{l0Es9(F9>+;Z}o-EY4H_6GeAe~yJ3OAS~Z%vP)Tlh5#Gfn8N$LX zT&=fEXhNcfhNX9KCY#ZaSQa+>NUVux5(ZM3ZrZda6Xw6$zSiUzgN$uJec#G-OW zDlFTDEW87u!dpw=KpbyB=RPvlexbDX<+oL?cg^kJa)|Lf0bXgncB-hQ zr$XxA@ZYQR!mSVfcl+Z0EN~(`EbrxT>lRe}G9D1Xl_Xvl#>0(C&}lPW-=vb)(QPX{ z&9;Xy3#r9P$W8y5;^vuDb8-`-*^x{)@uNtL_s%N-d@+Y18v-^EoRx;$OzOKp1{jf7 z!7IaePXP-sVfdTk-CzLonXNLA##{qft|2^ZsLr<>I`EzzuMyaTTb;0|dAW%w9;c93 z^0MC^c87iMx)0^~>Ej96R2u z8`)3s$w~-&^m0L-2c4Y;EM>iQKk3!yTM+^hoVaBQn>HdH!PTBOOMcPp`XR#g|Z0 z(D_X};~K3sBC7!wY$W7?`Oj5S256`6?kTQi>mMVJeZqR0Jyr^m@rc4)T4D7#4FuXU zd25__%#&Ec5*-J%X(-+1HH++!5>1m-49r*bqDUWk(Y-j$IA_GjlTyR$LqSwlJlYt_ z#a$(yfBbPK7PXzYqZf+@sk3yh5rdGPZrl-a!h^vWXgns_hPZ$vV{JXW`mL~WuXOt@ z@8!W|i4*R*3p1bpbWO;Hp7kG$Vs~YCy}h!7>}YF+b7s7iFZiu*{*XCG-Dki0Jp!mM z2J5SMxbnwsIzLu&T~b{8z}LRNfOMByecxreWW~={_-4kcIw87YnWzO(q>c$}qTwhW z44|(2@;6gCh5NV0HXoheDSnN!&fcsi5pX1Sf%zaPVW@kc8b&yb<}>rE7g*c}x*Ggh zL>RUF1Lq9yC{@byh7>@M_HZbnM&X=M5tq1@vL{&1sRIEu8iA3@rbaxNqElo+>gXLu}Bk^zXJ$Q@=+ zu3v3D-K-7{Va7u83wwgEZZe=;9U#N83+J+b={JpWvo6Q^?^P9G0us zpc*P+=yx7<+TAqn0qtYE{mDrT9WqrV7fF%IiYiLcIpH```0QhJNI;BJrki8vRN%Rc z2d5VZRt6JP;>a>V0hC9wBzgiEoP5=s5+Q2QWkr(+d(Jd8|B{Z1yUC{&CX|Q%q(**B z6a~QB*p=M+Y!{m?saPg$wf%B%a0wA@)Sf77O!i(Ugu#nSc2dbiBXP^emSirn-N)W;lSY$7=woG`991@S;3xQpx__3|Mi75Y1E- za*t>il{%fW0{8Tparfu zM=+z9iBQ(r#q|)OPbpc&xO;ok9YcMC`Aw?llhQb$td$q8&7eD#2r|Z^%(LFZ*Niml z4ak?m(WiDwW}uxix&<(o)|9XBShuCLg7*URM;T*&jAKI+BcAEtoWNu50pw5oxHz_I zm7Dhh_nva^+-x(^F>1mAC)5`Vlqx55Vl~O_d{rdUjhGyIUx1EjFh4^Q`deqWdhK7D@lVASt`A)p`90U*HnNGv=eW9;0G`D0 zGoIa20U=jr>n<>@#F2-}a3Aut0PC7WZSicAZ>h1(z=q*MYnZYvqPK)zt?260?U?GG zTDl;UV5QLl&J^n|4T=l!Ozj`D+iLKb{g2M@VSn|WTdx4Pbqm8p^bIaVIFiBHvXFI{ z4;Dr3wGaJt;h=}77v1OnsRV@1x(H4X0g?G5140*~Y!Y%_M%WKxUP6iqd5E)3{OqWE z3Ata(*!y-bdnCE3vu8+rtwFbGZ5GX*)0y10kQz4&F+2Se9G8)bja?b>8kT#avl#ZH zHKuxud^(gN#-#-00%$4ES{~a9(mRhA-ViL=w7($Islu5GKUX6L^&R z8EyFOgM#cmcA`E^QI0cxW{*kr{3^!E)U}fq3MI3L#i24k(++EeB~Ke1-2d}K2a!2Q<&MP zhJKgzgPn*@FU1ID5!@nF8@vGi$nI0YE$&4K~q{!IzpR z@8osHv1PKGnn)^2dq>x2mtIMCpHrk|z`yt5-*Rz!r19!@ZwvN)%O*MVRm)O4QWw=> zgd>xO26pKwGao0;O%M_l*C^gfS!e*$yF?d039}`WVtEtX z-1syK(2(T)^HueW0dO@XcO$6TPpmk0gkL4Jhqp+-0j-a<05*GpBzDfnf~Ba)tiERa ziQ&!fJ`F_YF^1i)gfL#)FdARkaNW-d@fP~$Dkgtx$P-zUGoqrM$Azm!9TwcA=x)S$ zsaAIXP(nr^WY5p5)j&RP6&Y^<6E!s8%m5lf@&+z+Xd=2@xN00;Uc>mvTovivur^@5&ZZhS8EYDLCpcyFK0tW13^v zwUh{Bl6s^rvA%=oTHL|9D)Oy$PAL2)1iya6`N*2*S|I>AU z@Y=;wfr~PxW(fa22rl;0iK3t&E@6|S{OkIJ1hP&Ak&c7tnu8>cGmmy!Bf22{N{4`v z{wcJihcA(8FzI3w@WO!rD~WQnh|Fx#r?7+~Nf4!txF$Vhw~?Aqm-pI-SP@yE?-zYs z^{BQ)lg%cDlu3qW&)N0d{PeYQ(Dlu~dAh#yM+t$gqkG1Z@~VTN{OjfChxu5#i|jR> z%|G6T@7d)EMsw=y1-v)m<7#SqbUi6M&(!U+x=F0_CG~gcUKQ~?R3;FS{agoDA1%S_X{D*a>!(56}Kz@M+cymOGinrtTzs+n#emVoVy<|d<+m{1B0 z`kBHPSf!5+O~dQxGoN83_DIj?jT59Y7gNZQjKktCWgaez%B)hL7g~6F2QqLb0<;9arxxCuPk0R zGcJ#6QifDcmmCr9Alc-dmcmdKplKWmW)CZ(xthgQI82_$&9O!27M>&V$$+UU1{pz{ zKCV36-9N;*W+Wn8rG9MF|9^Ym(jC{4q^ItgIkw7+@zUqmi%W9G4M-}y0YXyq0Ro^J z76`BbP;!qba|(q5P+|cERTT)Z-S$86-b-)1_sYM(KF7bnYwx}B_eEsn>)u;ckf?c_ z<2n*im5<2G$jHdZ$cRYyaems&p7@S&0I0GsCIogYCZVvWI*Uv!&xMej5>ikS=w698 znI+sDH6&rL#3QI79q*326ScHaahMJZGZ$^4=dR$03HXQwqI4aoIxZLsvSe$C44brL zXs`I21JT>BI^M`$Rx-x}>R5340V>G_BLzh7eR)#uzOIwulvg!$74QPIyF2TBwwu)K zQBs$Om@C=*qB*(igaExD)-V%T&?GSFTO`b64ceqIWF!;>4}Q)TrA2DRz zVFC6J73JvKWQ?Qt9{}ZS>Vspvf0ZNLE)vw7Gya80itZAPdCNEl3_G2-7#sqsHhc7b zA2!dslzKQ?1V~^^b1?tj?GJd%nZ}pV&70n@$@Rl01y##@S`V!CkRU~I^aTN8)9M$! z*5C}R^S*e~Td_d2+91UgHwVz;aJfVK|YU$_k-o+3z4)>pCXpb;`pc|0gbw-%Juk-dPQOqOlNe!;&P8!E} zxt6C~!LwJq!Z=ngQ9t=a@NQvrGtB!5fHgF1X>BBUy$AHueybA@(@CxTE|3Ds9ct{_ zSTryhkLIfeOZu*X+dLuVdeu)E%?T`s94bz!v2#AG@g0Hna=5vk&+C?3HngD8n*FAF z^j6OX?p*HbHu(ua!e$c=%1@Hchf!l^aztO>=LPX%p#d{RQ*7n9HGwj7^VzP%S8ASi zJGiL3=_1q;&P}+`7j5U(GZ)rA;6iC$L*CnTgsvpH&Wb?D0X<9Qi)1X(Ea;18hWQwt z*b-Zls1fJc;?KzD0<4P~=L1SHQwuQS`h2Iew|0eOHcZ*Ob~h!!nVfMrP6n|WahQYQ z!v)@ZYUz<3|BeRlu>oAP-gcT%2GAga9mbewZ1ZwuaRCZHF}3FnqB~aHa~HFc{E z-amM;afDtVSV4jrvyGE66C)R`Q8sk5h?7Mq|H$zc$Jc~Ixq~fas_q5sm=+h1|B0;E znMdm|d2)9)f%JvqRm#d2W1*hv5CmGMjO2XZ6F(xhcP}8a%<)wM?(w5Rw==|FbAqCH zGRGI;pzUj@N;_Yi;`R~u9bPohP{H{eYfWyEp&gBm!XKXaxmiEQ2eU_A!-5jGdD%fW zmj!?jB!VMZFH%NbI^(YMyOS5C4$bf3`|xtJxr}?57VMylmATcqH7Cv%M}yY;VjmY~ z_wK7S1JvPT3*>&#J~6ra6ZH?97EMzsR7-47n7(OUr@*2Wg-%+pD2h3s6fO+@4(5ie z$>v7l^*a|v#Wk4|@r=Y3bzlS%Kl$CaP4PVX#39zXff(BoJR6!J{2Nf?`p7{Lo+6=2ywi2CQ)O027aChi<}6`nWp{f1N=l;Hch-$cFYXYPfX(sEuXT<3%PW&-9Z>!_--g zu3%gS@n)K|X%7ammgD%(M8kvjQxyauDw7+!9iH=o2sSX*!bk188?P<_8y>gGLNWX5`@j*hM~BZgi!CsUHm(vx$*E0ylp+CBUyS3-UI8T z>njBO{|W2a;gEFUmU4tuXsB?+kmC!?zPqiV7~UtmixhwlqYS9MeOTwK`7aH@;QMIzo=>FEJyk<_2$pZyE-RK-bEf73#-Q#`-EY;U-y(6Y<_tP>?jY0DtP zl9ehkD>iP}h$9=rU=)Zdl27Yy*wRJDh5W%e6@8g0GseP7yCe9n(j>ynHGTY1nE+oa zr>TkQ>1Zw%nsv5lK~*f9L8f}C!if@g>`?4L48_GBUuc8;Uz#I-Y-@XWIv62xwE+qF zvnd>?THEq2LLylD$V4Fo(WK3j2*bw{nK3ZY1b_}U<4qTg(>7hhR_6o*$wiN3AWECB){Xxy4FdgVW8Pl-5Jtb+6m}!Tg}dyW(7={wscZ=TXqz5C zi6}cSy=x(O1Vn#;cVGODSvm^Fy~OtvNH`@j;uSkX`P7bIzG_;@^@5kUH?1o?!6ob( z13tXIqUWeQp~o9!?m^~ooeff{RwViK#FzI_wpMCjp6c1r`UX9aYh8Q{E9Bv^5^6~< z{>xjHhyQYUoLn4&%ZOY|O-*uQ;!dfj0D4aQtY7|J-DzIUwK9$q%S*an`nUPiP#?!U zXW!rh0oD3p$FWMxDk5EDkjX&v65rXF0hCW+l)z-+#rJRS`t6~-eKiw=FYuE z&js==2%djZ$=W(aX<2n0q=Im6W9#HVCE#$%VvU#1aYA-SB0h;JmG;_x<1Pp z^ykiC%oap=k|RFOTcZx57{JcRkz9>z5l44hL|NeH4q*>dHX|EYX=~O4(pTF@O*|#t zWFWhp!{Xch14Og^s`#QTQrPxZ8Ro5AT*mCVXVGS~e_X25n`g`i;kscP2G)oeZVT92 z5w8~n)=dM+*32pers|1x6IwwyrLJI)XJg#e(e6tNcsr)aDtfF1D-a#DjixYmV`)~cR`Sj#M+6P&^G17S2|eTp<$bd`gZar(!tsxxUR{c0Kd%iUE+DP3UciYDTh!9_mq5|{AJrcv0#YL6U0 z(;_*Cs4Zx)l6dpjL-UonCtFF{NPP(TxOP5DS?yU2d26p!Hr@6OA0|0rdLrGzxJY}9 zoeyPvh1`#8E2l7$n`qYrPXv*osNn*)iP)xFyNk`M2H!5Q8!XgunSDtE6-vY%TzS10 zeZJVP2G9*TTBr9>bMCm^{O{ShTjHBpusw|NBaGU9`h&GaEh}ZniJN*Zd6MgE7x+_* zww5zWXBhr7sADV|WCsly#&J4M=RRGdd2Vvrd=P;F$Zcr$9IW8V+-qH)T}$YXs6{}5 z@i&$sh;R2T0!sLV&DPZrDJvo6usuM6>~tCujBzOCa(-}qg&1ef-go$f+wlcv2sga= zHt%c(WX>pnS@V2B6!Nk7ETG(vor`N%6aiPMZF+P{(mX;^> zy(A@O39v7tHGFuHaoqv4v(9?Jz}EKjjaR!zO~n2>I@sTBVr4@&q-|f&Xqsl7J_YZ+ zL1{)~6)Pj=z{xNAcxZj*E&E^4+xhRqc1s@j@d+H7L^VoNP%I>L-Zv3?$^Y)$Uf~M7 z38y@3kHf>{;eVf`KQ-2!cFLu=@O3Wi8VvX~9NOFC$I#%W_bZo z_Gg9opDf(2FF?@~fM^i72#x}=g$5-iB@S16J*kR~{rXDubkKS7qgCT%UvDL9GT3Cf zW)b=yui_!Js+ftpIxCG3<&8*(9va9};;;GLgi;u)s2P_H^d>>xTr$@MwZ}C<-VC;t zp0_VhL~6ylAaAaq^a4e#9%H-N_e{4CRKQkOEL^A?6@92xvs`q$@coH;gFCWJ3uHC( z(siNTTzOy^%RXujn+n=tx0&c}LtS)c*^s)I?cVi?SgwKaL|FcWt9PSqKhRmlio%*Y)ImK&`_4qW~hEW|^J zJMK`hT$}G7;>HYnXO7z94xcg~rIC{_B_k%Ox|KZskA_5Xn4$y$P_P-t2Ih?g(7h!l zW9_=Yo$-)dRlTp$QVmY7+>g6jX&|*&y_?4-k1{51j02zPt;8{Y9wN>@F zziOT0-VDL_!=#Y{$09IuVu9Ef;gBqRSzr zwLpX1u=q&u3~stlbob?LB-Tz4C5>u~CBn8l+37?orWU-5WLf31kJB~jPwKEVD+^xp zmX>5;cTXEE(CEOSsUf8rIAvYRCIdJv#`k4^YM`vFOarAo8uZ43SzMe5hA`fsJ8y8f zcmw$m@Y?6NpcY95J(V`PrxlZ1mjuqhe!)wOPq_>`Cr=t~#M6U$jmTp#Q;tBav~hTu z765}Nr#*nUGw2-m`y+VxRt6%W5?*JsZd{s9t9i&gT?hfR0PpcsTfh_zK@s?Rt@{1S zR8IrVx5XeM7Zr+H1djZ}pT6+4Up$W%XJnEv*UdEvUgmhFIK*n+SYnLNRZEQV$*6f!J;vulON{Y} z7;9QG#wWt|X=02|_;G5Y;FEC=`7>H8rLRyiQjl*T3?K?Fx}{Jm7A2qt{BM_J9u{2J zqU_Sw*Tpk<=L`{Buz}c0Xk@{4y;L$vcwHQ|jvGrdh4fCHJd8s|FN9JonxLj(Bc9(! zmKe|PcPaeQk;HRDNlR@l^iC662}-TT6_m@-s_}r*h5`t?!lDrB|q3bk2A+*?7mI(t@p!m|H z;!BNXnJ+EAJgN9{V_7Cki?2*7zS3BhY1HDYlZvl4mSuvq_`^xX*YKP}z|8uj;tv}u zLKF)9^GU_m8!N&NwD`iL;-5EGgu1l&ImruQjrUiv819`D628=bbKz_5TdWIDUHLgqL^>2 z#=P~Dn0-a%<*TpsNn5@li|cP+so7YKdGn`Jwe)FY^$y#x8#^wLww$^y z{($(lmvA4#>zn%4DCj$3{&f}mICBh$%V7bNbFIVouH?xoYzw$csjga1HA!9s?lAXm zTasu7d`q$FWQU^`UagT!Gad!|usg+ZMLg;8Ojvat>%eQh2yJl_`y-t0ea*!V-dn}# zoI`;4fD?G#aBz6&7q9plWufEd`8}M-yf&b!>(&kbSH_|mf`0%*5v_!wWQwEJgmV;d z3d(ZlsC!NjNu=bbE-{gkA6Q~6Mg5f}#!~WMTVgC){X0vH*~7oK#ERwLSc;c7-YP6h z$+MOi3yW_oF&?H{=#8aVSp4^{WFjp72TP2H`6o+^NA!gy#v|grGY9Hlo!r~K`$WuOMj%z_0@#HFBUKbf3K$HV4pD^vr^6Xi`kfuxl_ z0I>vs^<;C0y$9eJCyM?$N_SL&VOMLqpwhh#gHPpJ*l^~tSAHc572e*aJwl{M0wj6x z!Kpc^SRCR~2C1M+-$a8i{h}Wy{Yw{af%-SmM)9S4yOR*A#sc%1vd;lf`+7jHFT7_E zK(bI!ffH+{dZYf3%S_}BarC&T-sZB;s7H6<8@n~_EUd3q|E@U&OSFZcQp zW~n&FqkAepxJM}hocKC0q{e_iC*XLL9WG(GC9vccATBfEJLAb9u$JnUMWw1247_?# znvvfr1=PTF!y-Ls5F(vcy&_4eVm!tn$gzDP%g$|gIC`Rw*az})IOe8;YyC%szHG#P z>9tx*HQNNE#C>Tr=FsfB6JyyY+5n*d;`{Qg-dP{Mk>?j&Z8w8H!YNR(dvOirIU+Zl zc5gc;c%5J>z4`0n>t|b7p`GF7Z*Yl=?J(}7qb7t1I_V7V-Ma_bQQl~e#*5i5_0#&x z;p3$-BCmgmWqi^-V~~3i8hJ$vK|hL77bjLCj@*e4yw!-r3R6fQJ7?5OJU8CCF z2|Y-@VJ2yx zQV?itX%$i6re7^FNrDLIu&DCMNh9e+XgxbLC?bJ-7%e~xEf!q}6-!2b-oM5)fRMna z5Pm=&X5}pLFff3DB&C{Z5Ox=AEz#AagsmJ^@SN)u%M0zRX)%Q^*bs>#H%wg`<1eYW zYZ0yIh>8#$eLSg;U8k68yh;jL4&t2&p%5uTw(`)4C+vkt5Mun(z6W0=eWC!{ge5hX z3Jn1DWg|7AlRbpSbb0S5{uTl8xZfI_V0aP;k*{?oORhx4V}OF8D}4r7LLb%p>li@D zGAWIycRuc7r-JvBO#M9`Kq(iR1YF3T(_jEmgrHv&i%$nEpj3lc4Pz^3vQsh9Vi+MsI4Y@uB5vcux+9Hs~#a%nJWTCgv z@2{PewM?lke#dS`HMRAE85vRG9OGho|$Jw11e(_p!`(t7%ytovZEqJy2v*`gbu($LujnI z{j#~SwRKR6PV;kH^oFx4xDhpuV(DSPCwFAhMDhrmo}Sc{VMfjd-lEbdtjtnn$H`jx zyt)y09#pm#wSrkhS`u&~VSN!nYaHRMITtC0smZWZf=)nXO_i9a!pAJ(V0ici-t;KN ze<=}A0a?*EZR0SGEBq%qjB1x8RUQ)$%}AO`sa5ZfWkbeQ_LzB8J`iEJgx?aU@B@F2 zg)}^e=4hDNJhK4iPx+Ef3qU;V9a_rLm${`LQgf7k__LppR0!w0CApC#w8G&S`M zdqDu=7B;mn7uB}ZK7db%r{sg<>(K~DyvW^)`r5e2SQoP#Ug~1zq&!g|dhttS6v`!V zwL>QmI{?RJsv*Hy=5FO*3a`?w)Iby{PVu| z?|AgF2lE?MhQ&pIf2zoCqyan9>CWt4%|y7X@D{K358Xq=b(mX9fHIuR+`GJpFwY1L z71hN*%7%%U&+<42HTIi$iUZu8kAGumw7G1Y*Ftg2Idnp}lp=`AOaOyM3Z72HfvlP0 zaN|XDg)h6+bWFnP8>Toe36L!Ypp44gX4Ee&1F>BY52u`_OOfA-9|y;&4oVqVme`)X z)0O16FHV|Sko$)7M4NAate$9D{$sjTYsena-4PS7q2@bptkhIs+)6$YYPgpQ*OyqZ zCym-x5Ns#tM{9`G!9e0QO<-+AQ|XA;qIdQgX_da=ZTR>N6a?_2b)h$Qw6E>kev$#%y)Oy|Zbxu1N(;B+Ukw$9Tpg5VpYW zVIrc2!DQsItRAAM%Y#3)4 zUT>)T#O2|wI8z*aA+8Ma*w^4`!o`z**g{DF#A_q&7yyM&Tq9l=QH6ZA$?)-sYvLgk zY%-7zmR6Tw%2e~Q2{f^VPYE8w3;c;Zw9M@zk_qH=;UHGR6YeL%m_&9!%j!Jkda}3< z%c#l^y>Y;WAQs|A#647oo(yqC*&EXr3O}k9W#=swVV8k_zt1Dy2k+OprQu zQcO@XyUHJu#o*__Hr|vK;jNGqf>FC})}G%e8+4TBIdaO^BTA^`GS%Do!+aaJMLLso ztceG!9xi6wsHW)RY}otVwyJNO5aHx8!UXhMnB3yw!g(=c*Mcfn&hlZDhl@yuXp1B- zl+J>8lwtOdhy5O;*UC))zKWYnSd%W#&290jSh9Gy{H)k|h~L|nC;O*-g6sOCG2bh< z)4e?HSGM6N%5D0ui{CyfmS6-uLoppe+GLwR=PQ6({PKF>cx5L3U|pP?$cYDc^?nG| z{o*S%(Wkm<@gttsq-Z;+1R@V{Q~Yi~I8lKononR45t&3ZZdX=EXWgr7Dh*)Elvi-E zXSQJGh{s@X;$RqJl@_YSme8QFa-L*EYBWao6)V*R$*+2<2Zb7A7`z8(tX*KqiVtmO zq}+a5JXCX!hv2Oe5d{ol8F#D5ssEs#oFsw0G-YAbfR}uOFAZspg<3lk2c9*w=a?@v zCgBOuy=XLe#P0XyuEyO<3zy4stFdR1FrLRT^w2o4;kz4E2nA+!L$&F1Pt8-0Aq+2_ z`1CDJq8TvV#Op2dpF*cX8=@MK-4IW9@TIH@-qe2Dc-WEGo4_RP)iX2zvvJMI^Yo*FCXV~Z)vPvYVlH&sTHUblK+w&CMi@#R02WurBcg1*XY z@a*O>uBNrl&KBBDsuKj)Dq|oKe-_SCY{ zd5x>3ic_x@l@ssBAM?nXHxZ5W+)kUBd81hjW|G|(oI6Wj3KL1=;iJ8UEmOfjSB~%THyGauZ23BVE?SaGl zbs=rSVye$|D#74wp)`w?dJue^Z8&B~k}nLSx}TE2Om*>kx^@-yxF|U351Oz;!-WAq zuYm$4L4?C29cQe#xK>ruv6@g7yP9l}Ruhu&xOxK=mdW6u&3z4RE-h5mb-guVl)dEx zWqmyG!#6Biu%Jn~u(Bc?X8B&?dl@oJZ7Ntb&83=cxHYxAqxXFFQy7uF!79Abop%I9 zi9`DN+UQXwwadEkF63>W7OdhOjDyc5Q#=yRb<(GiOMf(P-_H^8^O*{Ubqvy zRZiMU5A!05#E=q}n=0O;VwHz=QkZ+*J<$jnv#gkCU9u7ooHJfqB0M-Zaqe_UL~?hs z1`H*B7EJCAEff#r`w$}2bf+x?;m!cqb|uB>T0HIOSfh6EL@0OEC`Aq+5tkkcgjv0CC`*=3|F` zD%$FnEqtaTsZXKK6jr=~33=-9JwV@he9UM&pU{K>NekG2Fpxmn`ShX&H|FK&-paRG z{=yAbHFA2DfodYZs&>;>T-6-+RKH9l+qhGPDB8^cAz_DDUp0D6U!jUI-jyq^CCgsu zne0DQPr;I z5E!*!yAH%WFEhWT=cp?Nq*t3*m~viM&Z}?WUNP0!1`?*!Nn^6BzH|S6C)#!K*ex z6Q|mdST*vgsY%4rq7DdxVFxJw1~zTTC>;BxX;abyr4xExYhyRh1g0$omC%zcowelO zSb2aEiGE0xMA$7SU7RM6NL4}0lE4b$pYFlbR7YkjX&;k~7<>Z0Gi9@bv`W?w{;cf_ zPYJR|ODJ?tfEkHl(=BOr(jk%AVH`Om_Fu6QBch^Ki2#cmyJxOcLO}>fn~lT(UHFx9KvJhl5|BL{dKL)g zv00KGkSbS?^2u|a=Jo7fvv{I%FhG>sKvR|`{ff$o?c z@l+q@${ogfpNmqdt5W)RTO1za9EhDjR0t{yxgm*hck{HsV+k)P!|sZGBj2W+gVUV^ zKBKa<4uC^yTL8=#dgEFgL427Sgdx&k?79V$0H|v}piIXwkJs4oQ0QDT4w^8oS8PKf zV627xCzfDJ!n-UfsO{Hrtg?%11@Kt+c?trs1w}yrW0WzHtMAOkm0Kwa^6=4oQi&UDIMf_T5Pr z54^g-vxMoi1~P_Fd&2JF`jKoKKx3ue-j%iUR%w1ko1QlxjBHlN8QGZp*tu1*YOu0q4IJV}sA42Oi9?d025`8C&9xno9v~7XKfYY~OD!^7*AyFOfP`~}+&cOb z?^?y$G)yUaRPuGJR5}BP*a_NfRVdgOSbBl#ZvX= zzqpj22^8nl@Ao=p$hfA7*s-ayKIafk-;NsS~w^WuDRZFZCF(w|jE|EL%T>EjwIYz87 z5r+UzbJN1J#M83;jJE}5mY3^Z;CL4{=R7+cZ0)3xm$>TRF!q3&xYoBbmc3*!8>hML zGHO#xjr*{7ohDj@fPfE`dN33agC_A?D8VUNatR!I&ju*dz$tll2plwbd2$T@Z`YxT z{eeYprYIFSy*^^3MW2aqK(tkG)LuRSng|C+lqxuaMmQ?hWcII8u`0uQXy1K?>#|| z(G$pJ_xKpEl1<~k;Kr@0%)DF4k`wMPEsohSatLlUPS`oJT9rFU%_*glg>^b_%X|xo z8J;61!c1d9Fr2dE$&l%kn<5kUs3fniojfHa$MYWcD%tN?M|OqdRz1mL(?Iq_swAk0 z6lI?3@=l;4djZi?nJvcq_joTLKUZkWe~(H>`MIt?CBOxZ-{;g4dBpIJSj=KO zAVPqIiIy|y{&PMnx&QTj-y{99y|=ah9B&umqeTw3H}}8UKG@zWwhs^k1RpITqPG^= z+dnD}wl}u^;DKooaZuGFFSfUKUcDfQeFfs6tb~Ssw{fub?Z&~jZ^so`4Mlc#celUV z*hOQ%f3BiB~HiD$=<4IgA@-RTz+Bn)M+`&nEtWfYgsSWzs z?#ABN#pds}Hw{5rSo-hcCA`cb@NT`o2&>?ohY6|MCyT#x+mPvBU1pAppDt^0XNb1;pq2@@ntv zz5Qz7MPIL+lQ>D@s55C!8gKYZw?#^bQ9%!{(v7?Q{uZzR&BOIi6ck@OOGTRl~*xV>KHjj3`@#vP8 zb)nG520=ifz-4fb5&x>t50{6=F-^{&7Gvce zhzoQ^agqI`26Ve4G2Dg27DK&``%v1z?LGP;MJ37wUc@No2E`Jdm?AB4z@O9C4e^A5 zN+C88MsN*epV#n#!Y~j;N8ljBFYFT#eN+uZxCu$ma^;Uz=U=f=lJ_oIR4LdSZ5R!! zW>MU+?K~LHNUB$r@EtK=`%dfRTRK#0>`o9iK&@7uvo;dRHF>KzW;f9RY zxb9l20t|vx0v`;`nrcCv-X8Vmi)V0yecL>Qr@6u*)cN8_jKw#dSu%1|t^G+wBY6`1 zC|bQX;#Tb=Zd}!a!s{PV55Fq+&~?v%Pv{={mLgPI4TI&X&{??XoT=}mn+Dn;du*q@ zdXe?Yb%_wvW&&|eYA{xZtGC@Ayu+)AAV*W$mAB9C>#TrPU`C5)wApYZENYAJkL*}x zrEklfS2=|&aJ+pfjEA`4(!lIXIUq#hANiy)NN zA}6fQv9p>ZCOTC~bff52S7ww%gpDsdrMbvIt}-xAAAP*>4f2{ zqE}cL+&by=rsM<)V9X|s)eucwXfAw%mV`%4?s0I?rrnZmKUi5BE6Rb1HYF}~p(U;b zI*Bw7U%h+@A+y+jxxGh8lY0qK!yycn(|ea#?V=G;)S{3{0(-O9A2NPb(uTZEiUwrK z88(s$OZh)0ow?Ce4H1sGM@a+fwCDy~N9agn0db4{2a|&WKv+&)p`k9^x-a3K*oILc zLZ~*F(d{=omn|ygJg6oB0rvd}m%jDpNp~ovUC+|~|LSiw`B(qSI_~~f^?xz%zX-&4 zAHfA;(sc$l3XbWba}ocn8ltq74pQ+5uRrV|`dz%>e-sJbCA^~-VN-T0&OoubyRq}a zZ5W7Wat)6aZ1auq6>1k}tP#M!J9+F*Lr|GC2EBXGEXiD`$6`FMrv;;(>%L5m7O35c+F? ztzQ^oMIg%?Ji@`y$}LENxNM{NUhcSx!*4fU7U%Dp z2#zl=!$AYr*xlcMso_VtpYj%s;#d{jn#lMD9B|JO9{`Wi6k0Ngh94s7N9Cb+l=9*_ zh)dx`6%HjJGY-hDVdFl!OElew8^t98%ra5IM_E)~)`onS-AA;DvLk+pfESGStl-o2 zu<*}yp635&)qK6H&HCv^=rY+uQWtX>{N8{E zoRBJ+(?k*I4Ro-+vk)$j#kPHWUK7H?A{)yY0)i*5c$g-mXhbssB@Jb!Zzx{C9>vGj zLSa4!LkYt*JBP1M7_=mh2GM#uu$)Y(#mV#~FcO5Lm4Q${WY1ZJrbS>wdvg@@u;R`j z(qbFM!Uv4vo`^c^3kMw}U8e9+g-gJ6$0grkeV!K;sE1+cNO{oCK|>~1rZ-6G}% zmj^GgnuXmnGof@o^U=p^C~SvQk0l}z$duBAXjDY6#q}9Lq60jM5JT(&e43Pe@8fu{ zC<#eWlIBTLN=n$$ayVFsEEB%j**`pZ`G)^L-#>VP0YSy?nX1cuv9aZIBP#-zyMMT{ zu;BAoO0_q3{;khlE9LI)?7a&44@>zwdnmDO05o<1?v)Ta46hbF<{XL9ahl}fU?j!t z3N|gNw-Sw|7$6@J!tAAq-D|l$T#pMPjk=xY)o8#YK49TcHjh4m?+yo7VL@_p4^qQy z1M49BaFWAlcqvz!86gBIqr;P%y9`Vb3fXuk6jKCDDC95#v*Lyr8u8NBe|*;!MOsM4 zJL|S26pafR&WhW6TZVkVZk$b{|5g8pvQ!T}c?;CthBZgY|~ zuPrzx8ssD2JHzbLqKtm%5|Ty!>N1Mea`4hGa;n8E0Ll)hyoe3^%}%F1BBkQ?sSE%t zT+Y*!N4-e%7$bhuzv5MF67HG{cy}MX>kTe78}SNf&e7r5Z(e-$B3<0f*nF|oh(o?I zZHIvNUmZ2tk$4rsKYZC}M;wGX2TY6jMpSzH-;mlpM`6y9HL#w6fqb+j{a?>uZEPP% zI$oSlAZZ0Oj<@BL45@(hn3=KZXRn?+R`O|Y45+{JrNRV7A)v#3O1V7?QL%7Jq;iwB;LP;xm!=wl&{_h1;2Vnzy-F(b(gB@$yM z9+WRIg33dgvFF;-V<}LLGRabORSc7ExL0*!{bAfte?ZmN5aBKIA^y0D0L`2Pd(s|FqEZq^vK@heN#5GJGqAs~ zAzuYBm7bt!6?9Y2K!;J-j0~{6iMd_e89kJPMx6qo_QZGSq+GdRB2nWy zB}NS$Pue^J+G&ot_+KW4f3+nXJ`4|BhN8lg1*{#2NJ*B6U#eC~q-msTai?_nt}39d z%Cg^sLfE>O!fQlq(%K^55lv+1olA8Yr51*}Fb+{L4{4p@Du`#P#e(Nxs%z- zdRV?3h%D)+a#*f!>hK_l>OZ|HJ2q7*Kb*SjD|FqDNz3zSKtv?Qa5kT&6(Ke`nlN>G z4xq|aW>OBF6-pP^E(i%oM9^g_541IjH!RoSZF&7d4<8vq?d?pbrNmQBuz#YuV-*f2 zs;pf1b}ae@PrDr+ZR~AsJN2jwsg8*lpts=T`QtOO&Se5orLct3J&RS|877~Mp6f%- zOX|y#wJbEMD})=k5iIa5%f*>fBt)<10d*@P;Ql+VOXPa+1uC!Es86nyF@525xdn9D z#aH*gKdJH>{DyOZhwnM5()swYj~Kz(0Pu$4RVR~kvVaC#t+N``hWwYl0^A21JDQ8Ck&4q0sbVoMane0;R9~m z(l0R>a-!IFeGJjXa}`$^H%M7Zf@O8?C_)MdE?T?9)-AYe8D^f1tV zR9cvW%7pHwN$x)EyXMHH7eYDVjEgainj^&3Jbr&gcNL0lS}0t|W&9-Eg6%*h)Wt3A zAE8Z^E3f+yQ1FfG37n-PU#?p1w+uW6^D~6u8@*2jwmlJQ&KU4dbMM{5?b(6~6tI>B z6nStGXQZg_GT`{iYO!)KR0PW~oG4V%)7~%c&ulIfI5hyL)BQIK83=t9taAT%+iP?! znJSs3efL0$=yClGU_QI-ZKPC==Pl}Z(DSyR7SO1If~Xu8M;ts$vBU(3S(#KU^Mr>T zE>DK%t+%iWY<2N0`}qER_nYq>&h5?;%%O=u(>U^Vnztj9?{K;%4T*@xeJDDh^6vN= zZ{J+{d?7GcwKS=k!;2}GLk6}Gj>z|jK--vx*TpWOAy|K_cMS{Gj^0?yyA&W4m?q)A zOblb?-HOevgZ&pux`a&XGh1+lEDS-6cFe5aOJU#~dL1l$#8*?930jB+y z$FX(KIq=SS^4_8d`QU0LHYQxnx&@ksZKMllh|c(TQ}{d!e?Z6|LWz%`OBGTHJSw{F zx5XpblE&6ni@09s}#FsG>(XE3} zTvL3@phWOD1)2=EGnW;qPA#jswR8A2<{+zcbg=P-CvGIpz+ghJNX<^1`yNuAF+i_+aHKYXdTExS`BGP_G8<+B2HPu#@as*m=1&TZX zrQ$_g9vXNqT$Y0&FO=2<_C}j-=a&Zj?bayC@OG6+zV%uV9C$=|5b8WR4oevQ0ThPsx zxHYKE%JpF#bwX~kW;QntVOtfg2M$?3aE*((qPo^4YuifFiw+&z!wdEjf6k7}wT-X7Zc>Zdvd1 z(fR#QFb)ghw}$W<7UT>937LgGU^S%@atu?cTuI;Crfuw79D-u810os{Ax45R(M;30 z7z4@pV%QCa>zN34(ZEE2~IO$dKWL87U7C9XOf8P$7zVL_JA#e%tN$-_ksYo>PF# zC-LNPs}Q0!g_Yv$vu~d^#L!P>96yMz$kbXN#}g~&K>S6{Cw88H%w7~=GTEVN=6Y^c zoj90(e+u>>Y?}*NcOeR$GGK~o8SoM_H8*tzIMC{wTTKXu_&KS%@JY9`F|vVH-+y_u zvx)EscdE`X0$LqnZ}Zvi{^r+{TIal4=Q#uXUqL)6W_andu3nZ)pX=XM^?e+=4%=?$ zR?D1mUw6-;G)3+pPv;4Ry+SmHT@_|h(s!m-BGP~zW7fUBx_UKL8pBg+inJ$Gp**Ii zk+4j)c27;=^?;}|$c?oLDX@t7m*fkORVfVc;BdZ)PO6#~ZL zoeo1tahevkKsKE(CD3CSp5R4AIrg8<@e!ae8<(9M*lBQ8(Y;9bY5m>2Y+XpAoPUug zrJCZT3Sz(-#p>-2&#ijJup2P?PyGS@-1%?(`9`3?-TnaIL3A$g>8xKy4Oj?n4B=35zu@wWla;<@f|Akc=wno-&B&UGG-U9U zA-YHrrlYE^pcrPL4XnC=?nW}H+?%3I{zS+atZZyA&qXuH+N5t`sn(*(;%+nZCa2Ua zv3Cy3=$5b@$mdrd#5Gz^J4?V>X} z@1F=5(mNXT_auPey|w^>*<&H3Jgmg8e*ILK&_}=imHzerioe-A^uxI?RrxPb^>Uw1 zpLFVDFXY86GSEhOUG$G(;BY#Ep^+lVmWN`q|F-r130ABvjA{kDO%n!g;PUymbZZ7A zz_l06o=qQs$gBlezD_z1zEkyA7#cm$O%tX_Z?wdLV{-(S#9zTRP!xON4$nhR63-0cF(r>(!O(pduGsgEw&mIO@N}EvO1i zG5W2%V0~q9Sd%6?f)B7?J;PocP(H4}TvKS&(GbJCCV#0C$KKb36$E$=hWc3stmMOIn5t^qJyoj~FL7 zC3|7pyoKX#sgxZdTzGLw09TTW)_k2Hp74sX^!{i6OX>X2{!fjhup#sh5Lh?HEn__fhdE)EB0iUNqt^iTN4!2;yY`?=5FFIStp)ZDjO#VS$M(` zDwu?7f5H{N>UAkAV_rR$b74ue7A8r1Vc8DKKT%kg!+eY&%KHfFNP%CGNR@LcQ5)uc zPaz5mx3Mj+5qOUX)~N6^Bx^xs*yMw2K&|GTSg99Z?#2Vlv>{x`>C1DDDW`o5 zz@HgK(#a2Yfuwi?U|#QA@qr$gKud<-vPQqayryq?l_ZmWba~>5TzaS*?NMb`39oQ&AjRi-^q6wKFDE^eZ zpZ6pPk|Nh5VNN(E_6z;cCl|sA$ry2hHO!V@Fft2)8Ox#7>3$Kf3tUA~c+VKTi+Qs# zI`0mhhQJ4iqW*wQ$DB^1Nip_QiI0Y?iHuaXKOU=N(8?xLK5DG<&o}Lx`@0}!_-`1Q zbgp}G_R&XI2)8jhEk@sMZhk-d>mh7Mue-eyU*OAPzJE1>^L&3eoIh)~n=5l`bIZ_v z_qxaJd3l}Ss=c-Xx6;e&+xg?}WuDeVrJ{MUw$gYd;pPY)zOR?KH0ZR4a|qA9y9>4(x!$+9WCdY+o7 zegcqj3QR8?DCcj{uyd%McJf+!#9u_@BbTh6l zu*)Ii^$B?vGgwKpMdPczR|P_G%<%6sEKY=F9L^R?b4yE&qBun0e7K+ki=7JzwS}4a n0_otlr)w)$S8exwc?sWTX~zli_hI)!MYWj!y#2rb`}_X~fn#Au literal 878640 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

!upM( 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℘8 z-d3rG>JS=N9m54Du!HoC8P;&;1^4e@eQRJa+l!6g{*7!Pu=fz>jdAIAE>><)s;Uw> zp9>Z`1-=@gH~-|g`KK|iras^6W8YTP0#~4{eWDt&&})30=0kd@)_Y+lB#3RO@KJri zMpVzeD<{8It&Adw-Zi)z?*PCgM&GrnLRejj;lJs=!6^E*5C(Y!}Zy30GsykTAe#@HdVEO>=C z-QP3Z+qX<@4b!i^Wc#p9G?&>J1vcSD*-WNyW4tAy*~=&}7r({GU#3LnLb0&{B8O*D z)n}-eYjSAZx|;Njt_)wX=^E_Vk42J>K~⪻KJShn$5B?8Y>qVS?Ki-wee{%uA)fG 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

KPh<*}LOmI3vP|ab^g^f1JVJ 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 qKmsU;d%kc(#9Vw7nHKbR3GfTx@nPUTo~K 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 Date: Wed, 10 Oct 2012 04:28:27 +0000 Subject: [PATCH 154/300] 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 155/300] 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 156/300] 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 157/300] 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 158/300] 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 159/300] 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 160/300] 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 161/300] 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 162/300] 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 163/300] 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 164/300] 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 165/300] 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 166/300] 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 167/300] 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 168/300] 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 169/300] 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 170/300] 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 171/300] 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 172/300] 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 173/300] 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 174/300] 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 175/300] 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 176/300] 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 177/300] 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 178/300] 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 179/300] 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 180/300] 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 181/300] 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 182/300] 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 183/300] 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 184/300] 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 185/300] 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, From fbddfc727bde692f009a269e8e628d8c152b537b Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 14 Dec 2012 08:54:21 +0100 Subject: [PATCH 186/300] pixman: fix version check for PIXMAN_TYPE_BGRA Signed-off-by: Gerd Hoffmann Signed-off-by: Blue Swirl --- qemu-pixman.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qemu-pixman.c b/qemu-pixman.c index e46e1804f6..79e175b8d0 100644 --- a/qemu-pixman.c +++ b/qemu-pixman.c @@ -21,7 +21,7 @@ int qemu_pixman_get_type(int rshift, int gshift, int bshift) if (rshift == 0) { type = PIXMAN_TYPE_ABGR; } else { -#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0, 21, 8) +#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0, 16, 0) type = PIXMAN_TYPE_BGRA; #endif } From cb1d40d7ccfc18ba1fcb9e064402d930349ee047 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 14 Dec 2012 08:54:22 +0100 Subject: [PATCH 187/300] Revert "pixman: require 0.18.4 or newer" This reverts commit 288fa40736e6eb63132d01aa6dc21ee831b796ae. The only reason old pixman versions didn't work was the missing PIXMAN_TYPE_BGRA, which is properly #ifdef'ed now. So we don't have to require a minimum pixman version. Signed-off-by: Gerd Hoffmann Signed-off-by: Blue Swirl --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 38b1cc6b35..ecdb33a58e 100755 --- a/configure +++ b/configure @@ -2127,7 +2127,7 @@ fi # pixman support probe if test "$pixman" = ""; then - if $pkg_config --atleast-version=0.18.4 pixman-1 > /dev/null 2>&1; then + if $pkg_config pixman-1 > /dev/null 2>&1; then pixman="system" else pixman="internal" @@ -2138,7 +2138,7 @@ if test "$pixman" = "system"; then pixman_libs=`$pkg_config --libs pixman-1 2>/dev/null` else if test ! -d ${source_path}/pixman/pixman; then - echo "ERROR: pixman not present (or older than 0.18.4). Your options:" + echo "ERROR: pixman not present. Your options:" echo " (1) Preferred: Install the pixman devel package (any recent" echo " distro should have packages as Xorg needs pixman too)." echo " (2) Fetch the pixman submodule, using:" From f27b2e1dfe79f993567652411d1ba16295b99719 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 14 Dec 2012 08:54:23 +0100 Subject: [PATCH 188/300] pixman: update internal copy to pixman-0.28.2 Some w64 fixes by Stefan Weil found their way into 0.28.2, so update the internal copy to that version to improve windows support. Signed-off-by: Gerd Hoffmann Signed-off-by: Blue Swirl --- pixman | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixman b/pixman index 97336fad32..a5e5179b56 160000 --- a/pixman +++ b/pixman @@ -1 +1 @@ -Subproject commit 97336fad32acf802003855cd8bd6477fa49a12e3 +Subproject commit a5e5179b5624c99c812e9bf6e7b907e355a811e8 From bc210eb163b162ff2e94e5c8f4307715731257f8 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann <1087974@bugs.launchpad.net> Date: Fri, 14 Dec 2012 07:54:24 +0000 Subject: [PATCH 189/300] pixman: fix vnc tight png/jpeg support This patch adds an x argument to qemu_pixman_linebuf_fill so it can also be used to convert a partial scanline. Then fix tight + png/jpeg encoding by passing in the x+y offset, so the data is read from the correct screen location instead of the upper left corner. Cc: 1087974@bugs.launchpad.net Cc: qemu-stable@nongnu.org Reported-by: Tim Hardeneck Signed-off-by: Gerd Hoffmann Signed-off-by: Blue Swirl --- hw/vga.c | 2 +- qemu-pixman.c | 4 ++-- qemu-pixman.h | 2 +- ui/vnc-enc-tight.c | 4 ++-- ui/vnc.c | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/hw/vga.c b/hw/vga.c index 2b0200a164..c2661610e3 100644 --- a/hw/vga.c +++ b/hw/vga.c @@ -2413,7 +2413,7 @@ void ppm_save(const char *filename, struct DisplaySurface *ds, Error **errp) } linebuf = qemu_pixman_linebuf_create(PIXMAN_BE_r8g8b8, width); for (y = 0; y < height; y++) { - qemu_pixman_linebuf_fill(linebuf, ds->image, width, y); + qemu_pixman_linebuf_fill(linebuf, ds->image, width, 0, y); clearerr(f); ret = fwrite(pixman_image_get_data(linebuf), 1, pixman_image_get_stride(linebuf), f); diff --git a/qemu-pixman.c b/qemu-pixman.c index 79e175b8d0..e7263fb2bf 100644 --- a/qemu-pixman.c +++ b/qemu-pixman.c @@ -52,10 +52,10 @@ pixman_image_t *qemu_pixman_linebuf_create(pixman_format_code_t format, } void qemu_pixman_linebuf_fill(pixman_image_t *linebuf, pixman_image_t *fb, - int width, int y) + int width, int x, int y) { pixman_image_composite(PIXMAN_OP_SRC, fb, NULL, linebuf, - 0, y, 0, 0, 0, 0, width, 1); + x, y, 0, 0, 0, 0, width, 1); } pixman_image_t *qemu_pixman_mirror_create(pixman_format_code_t format, diff --git a/qemu-pixman.h b/qemu-pixman.h index bee55eb7da..3c05c83a7c 100644 --- a/qemu-pixman.h +++ b/qemu-pixman.h @@ -31,7 +31,7 @@ pixman_format_code_t qemu_pixman_get_format(PixelFormat *pf); pixman_image_t *qemu_pixman_linebuf_create(pixman_format_code_t format, int width); void qemu_pixman_linebuf_fill(pixman_image_t *linebuf, pixman_image_t *fb, - int width, int y); + int width, int x, int y); pixman_image_t *qemu_pixman_mirror_create(pixman_format_code_t format, pixman_image_t *image); void qemu_pixman_image_unref(pixman_image_t *image); diff --git a/ui/vnc-enc-tight.c b/ui/vnc-enc-tight.c index 9ae4cabffc..62d0fde77f 100644 --- a/ui/vnc-enc-tight.c +++ b/ui/vnc-enc-tight.c @@ -1212,7 +1212,7 @@ static int send_jpeg_rect(VncState *vs, int x, int y, int w, int h, int quality) buf = (uint8_t *)pixman_image_get_data(linebuf); row[0] = buf; for (dy = 0; dy < h; dy++) { - qemu_pixman_linebuf_fill(linebuf, vs->vd->server, w, dy); + qemu_pixman_linebuf_fill(linebuf, vs->vd->server, w, x, y + dy); jpeg_write_scanlines(&cinfo, row, 1); } qemu_pixman_image_unref(linebuf); @@ -1356,7 +1356,7 @@ static int send_png_rect(VncState *vs, int x, int y, int w, int h, if (color_type == PNG_COLOR_TYPE_PALETTE) { memcpy(buf, vs->tight.tight.buffer + (dy * w), w); } else { - qemu_pixman_linebuf_fill(linebuf, vs->vd->server, w, dy); + qemu_pixman_linebuf_fill(linebuf, vs->vd->server, w, x, y + dy); } png_write_row(png_ptr, buf); } diff --git a/ui/vnc.c b/ui/vnc.c index ba303626ad..04afcffc52 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -2569,7 +2569,7 @@ static int vnc_refresh_server_surface(VncDisplay *vd) uint8_t *server_ptr; if (vd->guest.format != VNC_SERVER_FB_FORMAT) { - qemu_pixman_linebuf_fill(tmpbuf, vd->guest.fb, width, y); + qemu_pixman_linebuf_fill(tmpbuf, vd->guest.fb, width, 0, y); guest_ptr = (uint8_t *)pixman_image_get_data(tmpbuf); } else { guest_ptr = guest_row; From 4b4496dbccc5f286f0ef411f0ff702d67cb95145 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 14 Dec 2012 08:54:25 +0100 Subject: [PATCH 190/300] console: clip update rectangle Signed-off-by: Gerd Hoffmann Signed-off-by: Blue Swirl --- console.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/console.h b/console.h index 50a0512f32..edb1950871 100644 --- a/console.h +++ b/console.h @@ -229,6 +229,16 @@ static inline void unregister_displaychangelistener(DisplayState *ds, static inline void dpy_gfx_update(DisplayState *s, int x, int y, int w, int h) { struct DisplayChangeListener *dcl; + int width = pixman_image_get_width(s->surface->image); + int height = pixman_image_get_height(s->surface->image); + + x = MAX(x, 0); + y = MAX(y, 0); + x = MIN(x, width); + y = MIN(y, height); + w = MIN(w, width - x); + h = MIN(h, height - y); + QLIST_FOREACH(dcl, &s->listeners, next) { if (dcl->dpy_gfx_update) { dcl->dpy_gfx_update(s, x, y, w, h); From 659f807c0a700317a7a0fae7a6e6ebfe68bfbbc4 Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Thu, 13 Dec 2012 04:13:41 +0400 Subject: [PATCH 191/300] target-xtensa: fix ITLB/DTLB page protection flags With MMU option xtensa architecture has two TLBs: ITLB and DTLB. ITLB is only used for code access, DTLB is only for data. However TLB entries in both TLBs have attribute field controlling write and exec access. These bits need to be properly masked off depending on TLB type before being used as tlb_set_page prot argument. Otherwise the following happens: (1) ITLB entry for some PFN gets invalidated (2) DTLB entry for the same PFN gets updated, attributes allow code execution (3) code at the page with that PFN is executed (possible due to step 2), entry for the TB is written into the jump cache (4) QEMU TLB entry for the PFN gets replaced with an entry for some other PFN (5) code in the TB from step 3 is executed (possible due to jump cache) and it accesses data, for which there's no DTLB entry, causing DTLB miss exception (6) re-translation of the TB from step 5 is attempted, but there's no QEMU TLB entry nor xtensa ITLB entry for that PFN, which causes ITLB miss exception at the TB start address (7) ITLB miss exception is handled by the guest, but execution is resumed from the beginning of the faulting TB (the point where ITLB miss occured), not from the point where DTLB miss occured, which is wrong. With that fix the above scenario causes ITLB miss exception (that used to be step 7) at step 3, right at the beginning of the TB. Signed-off-by: Max Filippov Cc: qemu-stable@nongnu.org Signed-off-by: Blue Swirl --- target-xtensa/helper.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/target-xtensa/helper.c b/target-xtensa/helper.c index 200fb43c28..bf05575eb5 100644 --- a/target-xtensa/helper.c +++ b/target-xtensa/helper.c @@ -522,7 +522,8 @@ static int get_physical_addr_mmu(CPUXtensaState *env, bool update_tlb, INST_FETCH_PRIVILEGE_CAUSE; } - *access = mmu_attr_to_access(entry->attr); + *access = mmu_attr_to_access(entry->attr) & + ~(dtlb ? PAGE_EXEC : PAGE_READ | PAGE_WRITE); if (!is_access_granted(*access, is_write)) { return dtlb ? (is_write ? From 44209fc4edfd92464eb0413acfd434b687be945a Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Sun, 2 Dec 2012 17:25:06 +0000 Subject: [PATCH 192/300] exec: fix coding style Fix coding style in areas to be moved by later patches. Signed-off-by: Blue Swirl --- exec.c | 178 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 110 insertions(+), 68 deletions(-) diff --git a/exec.c b/exec.c index 0594b07057..2e56a8ab07 100644 --- a/exec.c +++ b/exec.c @@ -79,6 +79,7 @@ #define SMC_BITMAP_USE_THRESHOLD 10 +/* Code generation and translation blocks */ static TranslationBlock *tbs; static int code_gen_max_blocks; TranslationBlock *tb_phys_hash[CODE_GEN_PHYS_HASH_SIZE]; @@ -207,21 +208,20 @@ static inline void map_exec(void *addr, long size) DWORD old_protect; VirtualProtect(addr, size, PAGE_EXECUTE_READWRITE, &old_protect); - } #else static inline void map_exec(void *addr, long size) { unsigned long start, end, page_size; - + page_size = getpagesize(); start = (unsigned long)addr; start &= ~(page_size - 1); - + end = (unsigned long)addr + size; end += page_size - 1; end &= ~(page_size - 1); - + mprotect((void *)start, end - start, PROT_READ | PROT_WRITE | PROT_EXEC); } @@ -241,10 +241,12 @@ static void page_init(void) #else qemu_real_host_page_size = getpagesize(); #endif - if (qemu_host_page_size == 0) + if (qemu_host_page_size == 0) { qemu_host_page_size = qemu_real_host_page_size; - if (qemu_host_page_size < TARGET_PAGE_SIZE) + } + if (qemu_host_page_size < TARGET_PAGE_SIZE) { qemu_host_page_size = TARGET_PAGE_SIZE; + } qemu_host_page_mask = ~(qemu_host_page_size - 1); #if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY) @@ -291,7 +293,7 @@ static void page_init(void) unsigned long startaddr, endaddr; int n; - n = fscanf (f, "%lx-%lx %*[^\n]\n", &startaddr, &endaddr); + n = fscanf(f, "%lx-%lx %*[^\n]\n", &startaddr, &endaddr); if (n == 2 && h2g_valid(startaddr)) { startaddr = h2g(startaddr) & TARGET_PAGE_MASK; @@ -591,6 +593,7 @@ static inline void *alloc_code_gen_buffer(void) static inline void *alloc_code_gen_buffer(void) { void *buf = g_malloc(code_gen_buffer_size); + if (buf) { map_exec(buf, code_gen_buffer_size); } @@ -737,8 +740,9 @@ static TranslationBlock *tb_alloc(target_ulong pc) TranslationBlock *tb; if (nb_tbs >= code_gen_max_blocks || - (code_gen_ptr - code_gen_buffer) >= code_gen_buffer_max_size) + (code_gen_ptr - code_gen_buffer) >= code_gen_buffer_max_size) { return NULL; + } tb = &tbs[nb_tbs++]; tb->pc = pc; tb->cflags = 0; @@ -766,8 +770,7 @@ static inline void invalidate_page_bitmap(PageDesc *p) } /* Set to NULL all the 'first_tb' fields in all PageDescs. */ - -static void page_flush_tb_1 (int level, void **lp) +static void page_flush_tb_1(int level, void **lp) { int i; @@ -776,14 +779,16 @@ static void page_flush_tb_1 (int level, void **lp) } if (level == 0) { PageDesc *pd = *lp; + for (i = 0; i < L2_SIZE; ++i) { pd[i].first_tb = NULL; invalidate_page_bitmap(pd + i); } } else { void **pp = *lp; + for (i = 0; i < L2_SIZE; ++i) { - page_flush_tb_1 (level - 1, pp + i); + page_flush_tb_1(level - 1, pp + i); } } } @@ -791,6 +796,7 @@ static void page_flush_tb_1 (int level, void **lp) static void page_flush_tb(void) { int i; + for (i = 0; i < V_L1_SIZE; i++) { page_flush_tb_1(V_L1_SHIFT / L2_BITS - 1, l1_map + i); } @@ -801,22 +807,24 @@ static void page_flush_tb(void) void tb_flush(CPUArchState *env1) { CPUArchState *env; + #if defined(DEBUG_FLUSH) printf("qemu: flush code_size=%ld nb_tbs=%d avg_tb_size=%ld\n", (unsigned long)(code_gen_ptr - code_gen_buffer), nb_tbs, nb_tbs > 0 ? ((unsigned long)(code_gen_ptr - code_gen_buffer)) / nb_tbs : 0); #endif - if ((unsigned long)(code_gen_ptr - code_gen_buffer) > code_gen_buffer_size) + if ((unsigned long)(code_gen_ptr - code_gen_buffer) + > code_gen_buffer_size) { cpu_abort(env1, "Internal error: code buffer overflow\n"); - + } nb_tbs = 0; - for(env = first_cpu; env != NULL; env = env->next_cpu) { - memset (env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof (void *)); + for (env = first_cpu; env != NULL; env = env->next_cpu) { + memset(env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof(void *)); } - memset (tb_phys_hash, 0, CODE_GEN_PHYS_HASH_SIZE * sizeof (void *)); + memset(tb_phys_hash, 0, CODE_GEN_PHYS_HASH_SIZE * sizeof(void *)); page_flush_tb(); code_gen_ptr = code_gen_buffer; @@ -831,9 +839,10 @@ static void tb_invalidate_check(target_ulong address) { TranslationBlock *tb; int i; + address &= TARGET_PAGE_MASK; - for(i = 0;i < CODE_GEN_PHYS_HASH_SIZE; i++) { - for(tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) { + for (i = 0; i < CODE_GEN_PHYS_HASH_SIZE; i++) { + for (tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) { if (!(address + TARGET_PAGE_SIZE <= tb->pc || address >= tb->pc + tb->size)) { printf("ERROR invalidate: address=" TARGET_FMT_lx @@ -850,8 +859,8 @@ static void tb_page_check(void) TranslationBlock *tb; int i, flags1, flags2; - for(i = 0;i < CODE_GEN_PHYS_HASH_SIZE; i++) { - for(tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) { + for (i = 0; i < CODE_GEN_PHYS_HASH_SIZE; i++) { + for (tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) { flags1 = page_get_flags(tb->pc); flags2 = page_get_flags(tb->pc + tb->size - 1); if ((flags1 & PAGE_WRITE) || (flags2 & PAGE_WRITE)) { @@ -864,12 +873,14 @@ static void tb_page_check(void) #endif + /* invalidate one TB */ static inline void tb_remove(TranslationBlock **ptb, TranslationBlock *tb, int next_offset) { TranslationBlock *tb1; - for(;;) { + + for (;;) { tb1 = *ptb; if (tb1 == tb) { *ptb = *(TranslationBlock **)((char *)tb1 + next_offset); @@ -884,7 +895,7 @@ static inline void tb_page_remove(TranslationBlock **ptb, TranslationBlock *tb) TranslationBlock *tb1; unsigned int n1; - for(;;) { + for (;;) { tb1 = *ptb; n1 = (uintptr_t)tb1 & 3; tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); @@ -905,12 +916,13 @@ static inline void tb_jmp_remove(TranslationBlock *tb, int n) tb1 = *ptb; if (tb1) { /* find tb(n) in circular list */ - for(;;) { + for (;;) { tb1 = *ptb; n1 = (uintptr_t)tb1 & 3; tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); - if (n1 == n && tb1 == tb) + if (n1 == n && tb1 == tb) { break; + } if (n1 == 2) { ptb = &tb1->jmp_first; } else { @@ -961,9 +973,10 @@ void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr) /* remove the TB from the hash list */ h = tb_jmp_cache_hash_func(tb->pc); - for(env = first_cpu; env != NULL; env = env->next_cpu) { - if (env->tb_jmp_cache[h] == tb) + for (env = first_cpu; env != NULL; env = env->next_cpu) { + if (env->tb_jmp_cache[h] == tb) { env->tb_jmp_cache[h] = NULL; + } } /* suppress this TB from the two jump lists */ @@ -972,10 +985,11 @@ void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr) /* suppress any remaining jumps to this TB */ tb1 = tb->jmp_first; - for(;;) { + for (;;) { n1 = (uintptr_t)tb1 & 3; - if (n1 == 2) + if (n1 == 2) { break; + } tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); tb2 = tb1->jmp_next[n1]; tb_reset_jump(tb1, n1); @@ -1031,8 +1045,9 @@ static void build_page_bitmap(PageDesc *p) it is not a problem */ tb_start = tb->pc & ~TARGET_PAGE_MASK; tb_end = tb_start + tb->size; - if (tb_end > TARGET_PAGE_SIZE) + if (tb_end > TARGET_PAGE_SIZE) { tb_end = TARGET_PAGE_SIZE; + } } else { tb_start = 0; tb_end = ((tb->pc + tb->size) & ~TARGET_PAGE_MASK); @@ -1123,8 +1138,9 @@ void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end, #endif /* TARGET_HAS_PRECISE_SMC */ p = page_find(start >> TARGET_PAGE_BITS); - if (!p) + if (!p) { return; + } if (!p->code_bitmap && ++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD && is_cpu_write_access) { @@ -1133,7 +1149,8 @@ void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end, } /* we remove all the TBs in the range [start, end[ */ - /* XXX: see if in some cases it could be faster to invalidate all the code */ + /* XXX: see if in some cases it could be faster to invalidate all + the code */ tb = p->first_tb; while (tb != NULL) { n = (uintptr_t)tb & 3; @@ -1183,8 +1200,9 @@ void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end, tb_phys_invalidate(tb, -1); if (env) { env->current_tb = saved_tb; - if (env->interrupt_request && env->current_tb) + if (env->interrupt_request && env->current_tb) { cpu_interrupt(env, env->interrupt_request); + } } } tb = tb_next; @@ -1215,6 +1233,7 @@ static inline void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len) { PageDesc *p; int offset, b; + #if 0 if (1) { qemu_log("modifying code at 0x%x size=%d EIP=%x PC=%08x\n", @@ -1225,13 +1244,15 @@ static inline void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len) } #endif p = page_find(start >> TARGET_PAGE_BITS); - if (!p) + if (!p) { return; + } if (p->code_bitmap) { offset = start & ~TARGET_PAGE_MASK; b = p->code_bitmap[offset >> 3] >> (offset & 7); - if (b & ((1 << len) - 1)) + if (b & ((1 << len) - 1)) { goto do_invalidate; + } } else { do_invalidate: tb_invalidate_phys_page_range(start, start + len, 1); @@ -1256,8 +1277,9 @@ static void tb_invalidate_phys_page(tb_page_addr_t addr, addr &= TARGET_PAGE_MASK; p = page_find(addr >> TARGET_PAGE_BITS); - if (!p) + if (!p) { return; + } tb = p->first_tb; #ifdef TARGET_HAS_PRECISE_SMC if (tb && pc != 0) { @@ -1329,12 +1351,13 @@ static inline void tb_alloc_page(TranslationBlock *tb, page fault + mprotect overhead) */ page_addr &= qemu_host_page_mask; prot = 0; - for(addr = page_addr; addr < page_addr + qemu_host_page_size; + for (addr = page_addr; addr < page_addr + qemu_host_page_size; addr += TARGET_PAGE_SIZE) { - p2 = page_find (addr >> TARGET_PAGE_BITS); - if (!p2) + p2 = page_find(addr >> TARGET_PAGE_BITS); + if (!p2) { continue; + } prot |= p2->flags; p2->flags &= ~PAGE_WRITE; } @@ -1376,20 +1399,23 @@ static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc, /* add in the page list */ tb_alloc_page(tb, 0, phys_pc & TARGET_PAGE_MASK); - if (phys_page2 != -1) + if (phys_page2 != -1) { tb_alloc_page(tb, 1, phys_page2); - else + } else { tb->page_addr[1] = -1; + } tb->jmp_first = (TranslationBlock *)((uintptr_t)tb | 2); tb->jmp_next[0] = NULL; tb->jmp_next[1] = NULL; /* init original jump addresses */ - if (tb->tb_next_offset[0] != 0xffff) + if (tb->tb_next_offset[0] != 0xffff) { tb_reset_jump(tb, 0); - if (tb->tb_next_offset[1] != 0xffff) + } + if (tb->tb_next_offset[1] != 0xffff) { tb_reset_jump(tb, 1); + } #ifdef DEBUG_TB_CHECK tb_page_check(); @@ -1416,8 +1442,9 @@ TranslationBlock *tb_find_pc(uintptr_t tc_ptr) uintptr_t v; TranslationBlock *tb; - if (nb_tbs <= 0) + if (nb_tbs <= 0) { return NULL; + } if (tc_ptr < (uintptr_t)code_gen_buffer || tc_ptr >= (uintptr_t)code_gen_ptr) { return NULL; @@ -1429,9 +1456,9 @@ TranslationBlock *tb_find_pc(uintptr_t tc_ptr) m = (m_min + m_max) >> 1; tb = &tbs[m]; v = (uintptr_t)tb->tc_ptr; - if (v == tc_ptr) + if (v == tc_ptr) { return tb; - else if (tc_ptr < v) { + } else if (tc_ptr < v) { m_max = m - 1; } else { m_min = m + 1; @@ -1450,11 +1477,12 @@ static inline void tb_reset_jump_recursive2(TranslationBlock *tb, int n) tb1 = tb->jmp_next[n]; if (tb1 != NULL) { /* find head of list */ - for(;;) { + for (;;) { n1 = (uintptr_t)tb1 & 3; tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); - if (n1 == 2) + if (n1 == 2) { break; + } tb1 = tb1->jmp_next[n1]; } /* we are now sure now that tb jumps to tb1 */ @@ -1462,12 +1490,13 @@ static inline void tb_reset_jump_recursive2(TranslationBlock *tb, int n) /* remove tb from the jmp_first list */ ptb = &tb_next->jmp_first; - for(;;) { + for (;;) { tb1 = *ptb; n1 = (uintptr_t)tb1 & 3; tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); - if (n1 == n && tb1 == tb) + if (n1 == n && tb1 == tb) { break; + } ptb = &tb1->jmp_next[n1]; } *ptb = tb->jmp_next[n]; @@ -1499,7 +1528,8 @@ void tb_invalidate_phys_addr(hwaddr addr) ram_addr_t ram_addr; MemoryRegionSection *section; - section = phys_page_find(address_space_memory.dispatch, addr >> TARGET_PAGE_BITS); + section = phys_page_find(address_space_memory.dispatch, + addr >> TARGET_PAGE_BITS); if (!(memory_region_is_ram(section->mr) || (section->mr->rom_device && section->mr->readable))) { return; @@ -1939,9 +1969,7 @@ hwaddr memory_region_section_get_iotlb(CPUArchState *env, * Walks guest process memory "regions" one by one * and calls callback function 'fn' for each region. */ - -struct walk_memory_regions_data -{ +struct walk_memory_regions_data { walk_memory_regions_fn fn; void *priv; uintptr_t start; @@ -1976,6 +2004,7 @@ static int walk_memory_regions_1(struct walk_memory_regions_data *data, if (level == 0) { PageDesc *pd = *lp; + for (i = 0; i < L2_SIZE; ++i) { int prot = pd[i].flags; @@ -1989,6 +2018,7 @@ static int walk_memory_regions_1(struct walk_memory_regions_data *data, } } else { void **pp = *lp; + for (i = 0; i < L2_SIZE; ++i) { pa = base | ((abi_ulong)i << (TARGET_PAGE_BITS + L2_BITS * level)); @@ -2015,6 +2045,7 @@ int walk_memory_regions(void *priv, walk_memory_regions_fn fn) for (i = 0; i < V_L1_SIZE; i++) { int rc = walk_memory_regions_1(&data, (abi_ulong)i << V_L1_SHIFT, V_L1_SHIFT / L2_BITS - 1, l1_map + i); + if (rc != 0) { return rc; } @@ -2035,7 +2066,7 @@ static int dump_region(void *priv, abi_ulong start, ((prot & PAGE_WRITE) ? 'w' : '-'), ((prot & PAGE_EXEC) ? 'x' : '-')); - return (0); + return 0; } /* dump memory mappings */ @@ -2051,8 +2082,9 @@ int page_get_flags(target_ulong address) PageDesc *p; p = page_find(address >> TARGET_PAGE_BITS); - if (!p) + if (!p) { return 0; + } return p->flags; } @@ -2115,28 +2147,34 @@ int page_check_range(target_ulong start, target_ulong len, int flags) return -1; } - end = TARGET_PAGE_ALIGN(start+len); /* must do before we loose bits in the next step */ + /* must do before we loose bits in the next step */ + end = TARGET_PAGE_ALIGN(start + len); start = start & TARGET_PAGE_MASK; for (addr = start, len = end - start; len != 0; len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) { p = page_find(addr >> TARGET_PAGE_BITS); - if( !p ) + if (!p) { return -1; - if( !(p->flags & PAGE_VALID) ) + } + if (!(p->flags & PAGE_VALID)) { return -1; + } - if ((flags & PAGE_READ) && !(p->flags & PAGE_READ)) + if ((flags & PAGE_READ) && !(p->flags & PAGE_READ)) { return -1; + } if (flags & PAGE_WRITE) { - if (!(p->flags & PAGE_WRITE_ORG)) + if (!(p->flags & PAGE_WRITE_ORG)) { return -1; + } /* unprotect the page if it was put read-only because it contains translated code */ if (!(p->flags & PAGE_WRITE)) { - if (!page_unprotect(addr, 0, NULL)) + if (!page_unprotect(addr, 0, NULL)) { return -1; + } } return 0; } @@ -4101,7 +4139,7 @@ void cpu_io_recompile(CPUArchState *env, uintptr_t retaddr) tb = tb_find_pc(retaddr); if (!tb) { - cpu_abort(env, "cpu_io_recompile: could not find TB for pc=%p", + cpu_abort(env, "cpu_io_recompile: could not find TB for pc=%p", (void *)retaddr); } n = env->icount_decr.u16.low + tb->icount; @@ -4130,8 +4168,9 @@ void cpu_io_recompile(CPUArchState *env, uintptr_t retaddr) } #endif /* This should never happen. */ - if (n > CF_COUNT_MASK) + if (n > CF_COUNT_MASK) { cpu_abort(env, "TB too big during recompile"); + } cflags = n | CF_LAST_IO; pc = tb->pc; @@ -4162,13 +4201,15 @@ void dump_exec_info(FILE *f, fprintf_function cpu_fprintf) cross_page = 0; direct_jmp_count = 0; direct_jmp2_count = 0; - for(i = 0; i < nb_tbs; i++) { + for (i = 0; i < nb_tbs; i++) { tb = &tbs[i]; target_code_size += tb->size; - if (tb->size > max_target_code_size) + if (tb->size > max_target_code_size) { max_target_code_size = tb->size; - if (tb->page_addr[1] != -1) + } + if (tb->page_addr[1] != -1) { cross_page++; + } if (tb->tb_next_offset[0] != 0xffff) { direct_jmp_count++; if (tb->tb_next_offset[1] != 0xffff) { @@ -4180,14 +4221,15 @@ void dump_exec_info(FILE *f, fprintf_function cpu_fprintf) cpu_fprintf(f, "Translation buffer state:\n"); cpu_fprintf(f, "gen code size %td/%zd\n", code_gen_ptr - code_gen_buffer, code_gen_buffer_max_size); - cpu_fprintf(f, "TB count %d/%d\n", + cpu_fprintf(f, "TB count %d/%d\n", nb_tbs, code_gen_max_blocks); cpu_fprintf(f, "TB avg target size %d max=%d bytes\n", nb_tbs ? target_code_size / nb_tbs : 0, max_target_code_size); cpu_fprintf(f, "TB avg host size %td bytes (expansion ratio: %0.1f)\n", nb_tbs ? (code_gen_ptr - code_gen_buffer) / nb_tbs : 0, - target_code_size ? (double) (code_gen_ptr - code_gen_buffer) / target_code_size : 0); + target_code_size ? (double) (code_gen_ptr - code_gen_buffer) + / target_code_size : 0); cpu_fprintf(f, "cross page TB count %d (%d%%)\n", cross_page, nb_tbs ? (cross_page * 100) / nb_tbs : 0); From 5a3165263ae6782a7fe712a0a0c29c17468b9b68 Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Sun, 2 Dec 2012 21:28:09 +0000 Subject: [PATCH 193/300] exec: extract TB watchpoint check Will be moved by the next patch. Signed-off-by: Blue Swirl --- exec.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/exec.c b/exec.c index 2e56a8ab07..a1f617d0e1 100644 --- a/exec.c +++ b/exec.c @@ -2987,12 +2987,24 @@ static const MemoryRegionOps notdirty_mem_ops = { .endianness = DEVICE_NATIVE_ENDIAN, }; +static void tb_check_watchpoint(CPUArchState *env) +{ + TranslationBlock *tb; + + tb = tb_find_pc(env->mem_io_pc); + if (!tb) { + cpu_abort(env, "check_watchpoint: could not find TB for pc=%p", + (void *)env->mem_io_pc); + } + cpu_restore_state(tb, env, env->mem_io_pc); + tb_phys_invalidate(tb, -1); +} + /* Generate a debug exception if a watchpoint has been hit. */ static void check_watchpoint(int offset, int len_mask, int flags) { CPUArchState *env = cpu_single_env; target_ulong pc, cs_base; - TranslationBlock *tb; target_ulong vaddr; CPUWatchpoint *wp; int cpu_flags; @@ -3011,13 +3023,7 @@ static void check_watchpoint(int offset, int len_mask, int flags) wp->flags |= BP_WATCHPOINT_HIT; if (!env->watchpoint_hit) { env->watchpoint_hit = wp; - tb = tb_find_pc(env->mem_io_pc); - if (!tb) { - cpu_abort(env, "check_watchpoint: could not find TB for " - "pc=%p", (void *)env->mem_io_pc); - } - cpu_restore_state(tb, env, env->mem_io_pc); - tb_phys_invalidate(tb, -1); + tb_check_watchpoint(env); if (wp->flags & BP_STOP_BEFORE_ACCESS) { env->exception_index = EXCP_DEBUG; cpu_loop_exit(env); From 5b6dd8683dc30e8e0970db3dd9176732dc819410 Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Sun, 2 Dec 2012 16:04:43 +0000 Subject: [PATCH 194/300] exec: move TB handling to translate-all.c Signed-off-by: Blue Swirl --- exec.c | 1713 +--------------------------------------------- translate-all.c | 1719 +++++++++++++++++++++++++++++++++++++++++++++++ translate-all.h | 34 + 3 files changed, 1755 insertions(+), 1711 deletions(-) create mode 100644 translate-all.h diff --git a/exec.c b/exec.c index a1f617d0e1..4c1246a9f9 100644 --- a/exec.c +++ b/exec.c @@ -1,5 +1,5 @@ /* - * virtual page mapping and translated block handling + * Virtual page mapping * * Copyright (c) 2003 Fabrice Bellard * @@ -38,62 +38,19 @@ #include "exec-memory.h" #if defined(CONFIG_USER_ONLY) #include -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) -#include -#if __FreeBSD_version >= 700104 -#define HAVE_KINFO_GETVMMAP -#define sigqueue sigqueue_freebsd /* avoid redefinition */ -#include -#include -#include -#define _KERNEL -#include -#undef _KERNEL -#undef sigqueue -#include -#endif -#endif #else /* !CONFIG_USER_ONLY */ #include "xen-mapcache.h" #include "trace.h" #endif #include "cputlb.h" +#include "translate-all.h" #include "memory-internal.h" -//#define DEBUG_TB_INVALIDATE -//#define DEBUG_FLUSH //#define DEBUG_UNASSIGNED - -/* make various TB consistency checks */ -//#define DEBUG_TB_CHECK - -//#define DEBUG_IOPORT //#define DEBUG_SUBPAGE -#if !defined(CONFIG_USER_ONLY) -/* TB consistency checks only implemented for usermode emulation. */ -#undef DEBUG_TB_CHECK -#endif - -#define SMC_BITMAP_USE_THRESHOLD 10 - -/* Code generation and translation blocks */ -static TranslationBlock *tbs; -static int code_gen_max_blocks; -TranslationBlock *tb_phys_hash[CODE_GEN_PHYS_HASH_SIZE]; -static int nb_tbs; -/* any access to the tbs or the page table must use this lock */ -spinlock_t tb_lock = SPIN_LOCK_UNLOCKED; - -uint8_t *code_gen_prologue; -static uint8_t *code_gen_buffer; -static size_t code_gen_buffer_size; -/* threshold to flush the translated code buffer */ -static size_t code_gen_buffer_max_size; -static uint8_t *code_gen_ptr; - #if !defined(CONFIG_USER_ONLY) int phys_ram_fd; static int in_migration; @@ -121,59 +78,6 @@ DEFINE_TLS(CPUArchState *,cpu_single_env); 2 = Adaptive rate instruction counting. */ int use_icount = 0; -typedef struct PageDesc { - /* list of TBs intersecting this ram page */ - TranslationBlock *first_tb; - /* in order to optimize self modifying code, we count the number - of lookups we do to a given page to use a bitmap */ - unsigned int code_write_count; - uint8_t *code_bitmap; -#if defined(CONFIG_USER_ONLY) - unsigned long flags; -#endif -} PageDesc; - -/* In system mode we want L1_MAP to be based on ram offsets, - while in user mode we want it to be based on virtual addresses. */ -#if !defined(CONFIG_USER_ONLY) -#if HOST_LONG_BITS < TARGET_PHYS_ADDR_SPACE_BITS -# define L1_MAP_ADDR_SPACE_BITS HOST_LONG_BITS -#else -# define L1_MAP_ADDR_SPACE_BITS TARGET_PHYS_ADDR_SPACE_BITS -#endif -#else -# define L1_MAP_ADDR_SPACE_BITS TARGET_VIRT_ADDR_SPACE_BITS -#endif - -/* Size of the L2 (and L3, etc) page tables. */ -#define L2_BITS 10 -#define L2_SIZE (1 << L2_BITS) - -#define P_L2_LEVELS \ - (((TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS - 1) / L2_BITS) + 1) - -/* The bits remaining after N lower levels of page tables. */ -#define V_L1_BITS_REM \ - ((L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS) - -#if V_L1_BITS_REM < 4 -#define V_L1_BITS (V_L1_BITS_REM + L2_BITS) -#else -#define V_L1_BITS V_L1_BITS_REM -#endif - -#define V_L1_SIZE ((target_ulong)1 << V_L1_BITS) - -#define V_L1_SHIFT (L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS - V_L1_BITS) - -uintptr_t qemu_real_host_page_size; -uintptr_t qemu_host_page_size; -uintptr_t qemu_host_page_mask; - -/* This is a multi-level map on the virtual address space. - The bottom level has pointers to PageDesc. */ -static void *l1_map[V_L1_SIZE]; - #if !defined(CONFIG_USER_ONLY) static MemoryRegionSection *phys_sections; @@ -195,180 +99,6 @@ static void *qemu_safe_ram_ptr(ram_addr_t addr); static MemoryRegion io_mem_watch; #endif -static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc, - tb_page_addr_t phys_page2); - -/* statistics */ -static int tb_flush_count; -static int tb_phys_invalidate_count; - -#ifdef _WIN32 -static inline void map_exec(void *addr, long size) -{ - DWORD old_protect; - VirtualProtect(addr, size, - PAGE_EXECUTE_READWRITE, &old_protect); -} -#else -static inline void map_exec(void *addr, long size) -{ - unsigned long start, end, page_size; - - page_size = getpagesize(); - start = (unsigned long)addr; - start &= ~(page_size - 1); - - end = (unsigned long)addr + size; - end += page_size - 1; - end &= ~(page_size - 1); - - mprotect((void *)start, end - start, - PROT_READ | PROT_WRITE | PROT_EXEC); -} -#endif - -static void page_init(void) -{ - /* NOTE: we can always suppose that qemu_host_page_size >= - TARGET_PAGE_SIZE */ -#ifdef _WIN32 - { - SYSTEM_INFO system_info; - - GetSystemInfo(&system_info); - qemu_real_host_page_size = system_info.dwPageSize; - } -#else - qemu_real_host_page_size = getpagesize(); -#endif - if (qemu_host_page_size == 0) { - qemu_host_page_size = qemu_real_host_page_size; - } - if (qemu_host_page_size < TARGET_PAGE_SIZE) { - qemu_host_page_size = TARGET_PAGE_SIZE; - } - qemu_host_page_mask = ~(qemu_host_page_size - 1); - -#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY) - { -#ifdef HAVE_KINFO_GETVMMAP - struct kinfo_vmentry *freep; - int i, cnt; - - freep = kinfo_getvmmap(getpid(), &cnt); - if (freep) { - mmap_lock(); - for (i = 0; i < cnt; i++) { - unsigned long startaddr, endaddr; - - startaddr = freep[i].kve_start; - endaddr = freep[i].kve_end; - if (h2g_valid(startaddr)) { - startaddr = h2g(startaddr) & TARGET_PAGE_MASK; - - if (h2g_valid(endaddr)) { - endaddr = h2g(endaddr); - page_set_flags(startaddr, endaddr, PAGE_RESERVED); - } else { -#if TARGET_ABI_BITS <= L1_MAP_ADDR_SPACE_BITS - endaddr = ~0ul; - page_set_flags(startaddr, endaddr, PAGE_RESERVED); -#endif - } - } - } - free(freep); - mmap_unlock(); - } -#else - FILE *f; - - last_brk = (unsigned long)sbrk(0); - - f = fopen("/compat/linux/proc/self/maps", "r"); - if (f) { - mmap_lock(); - - do { - unsigned long startaddr, endaddr; - int n; - - n = fscanf(f, "%lx-%lx %*[^\n]\n", &startaddr, &endaddr); - - if (n == 2 && h2g_valid(startaddr)) { - startaddr = h2g(startaddr) & TARGET_PAGE_MASK; - - if (h2g_valid(endaddr)) { - endaddr = h2g(endaddr); - } else { - endaddr = ~0ul; - } - page_set_flags(startaddr, endaddr, PAGE_RESERVED); - } - } while (!feof(f)); - - fclose(f); - mmap_unlock(); - } -#endif - } -#endif -} - -static PageDesc *page_find_alloc(tb_page_addr_t index, int alloc) -{ - PageDesc *pd; - void **lp; - int i; - -#if defined(CONFIG_USER_ONLY) - /* We can't use g_malloc because it may recurse into a locked mutex. */ -# define ALLOC(P, SIZE) \ - do { \ - P = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, \ - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); \ - } while (0) -#else -# define ALLOC(P, SIZE) \ - do { P = g_malloc0(SIZE); } while (0) -#endif - - /* Level 1. Always allocated. */ - lp = l1_map + ((index >> V_L1_SHIFT) & (V_L1_SIZE - 1)); - - /* Level 2..N-1. */ - for (i = V_L1_SHIFT / L2_BITS - 1; i > 0; i--) { - void **p = *lp; - - if (p == NULL) { - if (!alloc) { - return NULL; - } - ALLOC(p, sizeof(void *) * L2_SIZE); - *lp = p; - } - - lp = p + ((index >> (i * L2_BITS)) & (L2_SIZE - 1)); - } - - pd = *lp; - if (pd == NULL) { - if (!alloc) { - return NULL; - } - ALLOC(pd, sizeof(PageDesc) * L2_SIZE); - *lp = pd; - } - -#undef ALLOC - - return pd + (index & (L2_SIZE - 1)); -} - -static inline PageDesc *page_find(tb_page_addr_t index) -{ - return page_find_alloc(index, 0); -} #if !defined(CONFIG_USER_ONLY) @@ -476,178 +206,8 @@ bool memory_region_is_unassigned(MemoryRegion *mr) && mr != &io_mem_notdirty && !mr->rom_device && mr != &io_mem_watch; } - -#define mmap_lock() do { } while(0) -#define mmap_unlock() do { } while(0) #endif -#if defined(CONFIG_USER_ONLY) -/* Currently it is not recommended to allocate big chunks of data in - user mode. It will change when a dedicated libc will be used. */ -/* ??? 64-bit hosts ought to have no problem mmaping data outside the - region in which the guest needs to run. Revisit this. */ -#define USE_STATIC_CODE_GEN_BUFFER -#endif - -/* ??? Should configure for this, not list operating systems here. */ -#if (defined(__linux__) \ - || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \ - || defined(__DragonFly__) || defined(__OpenBSD__) \ - || defined(__NetBSD__)) -# define USE_MMAP -#endif - -/* Minimum size of the code gen buffer. This number is randomly chosen, - but not so small that we can't have a fair number of TB's live. */ -#define MIN_CODE_GEN_BUFFER_SIZE (1024u * 1024) - -/* Maximum size of the code gen buffer we'd like to use. Unless otherwise - indicated, this is constrained by the range of direct branches on the - host cpu, as used by the TCG implementation of goto_tb. */ -#if defined(__x86_64__) -# define MAX_CODE_GEN_BUFFER_SIZE (2ul * 1024 * 1024 * 1024) -#elif defined(__sparc__) -# define MAX_CODE_GEN_BUFFER_SIZE (2ul * 1024 * 1024 * 1024) -#elif defined(__arm__) -# define MAX_CODE_GEN_BUFFER_SIZE (16u * 1024 * 1024) -#elif defined(__s390x__) - /* We have a +- 4GB range on the branches; leave some slop. */ -# define MAX_CODE_GEN_BUFFER_SIZE (3ul * 1024 * 1024 * 1024) -#else -# define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1) -#endif - -#define DEFAULT_CODE_GEN_BUFFER_SIZE_1 (32u * 1024 * 1024) - -#define DEFAULT_CODE_GEN_BUFFER_SIZE \ - (DEFAULT_CODE_GEN_BUFFER_SIZE_1 < MAX_CODE_GEN_BUFFER_SIZE \ - ? DEFAULT_CODE_GEN_BUFFER_SIZE_1 : MAX_CODE_GEN_BUFFER_SIZE) - -static inline size_t size_code_gen_buffer(size_t tb_size) -{ - /* Size the buffer. */ - if (tb_size == 0) { -#ifdef USE_STATIC_CODE_GEN_BUFFER - tb_size = DEFAULT_CODE_GEN_BUFFER_SIZE; -#else - /* ??? Needs adjustments. */ - /* ??? If we relax the requirement that CONFIG_USER_ONLY use the - static buffer, we could size this on RESERVED_VA, on the text - segment size of the executable, or continue to use the default. */ - tb_size = (unsigned long)(ram_size / 4); -#endif - } - if (tb_size < MIN_CODE_GEN_BUFFER_SIZE) { - tb_size = MIN_CODE_GEN_BUFFER_SIZE; - } - if (tb_size > MAX_CODE_GEN_BUFFER_SIZE) { - tb_size = MAX_CODE_GEN_BUFFER_SIZE; - } - code_gen_buffer_size = tb_size; - return tb_size; -} - -#ifdef USE_STATIC_CODE_GEN_BUFFER -static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE] - __attribute__((aligned(CODE_GEN_ALIGN))); - -static inline void *alloc_code_gen_buffer(void) -{ - map_exec(static_code_gen_buffer, code_gen_buffer_size); - return static_code_gen_buffer; -} -#elif defined(USE_MMAP) -static inline void *alloc_code_gen_buffer(void) -{ - int flags = MAP_PRIVATE | MAP_ANONYMOUS; - uintptr_t start = 0; - void *buf; - - /* Constrain the position of the buffer based on the host cpu. - Note that these addresses are chosen in concert with the - addresses assigned in the relevant linker script file. */ -# if defined(__PIE__) || defined(__PIC__) - /* Don't bother setting a preferred location if we're building - a position-independent executable. We're more likely to get - an address near the main executable if we let the kernel - choose the address. */ -# elif defined(__x86_64__) && defined(MAP_32BIT) - /* Force the memory down into low memory with the executable. - Leave the choice of exact location with the kernel. */ - flags |= MAP_32BIT; - /* Cannot expect to map more than 800MB in low memory. */ - if (code_gen_buffer_size > 800u * 1024 * 1024) { - code_gen_buffer_size = 800u * 1024 * 1024; - } -# elif defined(__sparc__) - start = 0x40000000ul; -# elif defined(__s390x__) - start = 0x90000000ul; -# endif - - buf = mmap((void *)start, code_gen_buffer_size, - PROT_WRITE | PROT_READ | PROT_EXEC, flags, -1, 0); - return buf == MAP_FAILED ? NULL : buf; -} -#else -static inline void *alloc_code_gen_buffer(void) -{ - void *buf = g_malloc(code_gen_buffer_size); - - if (buf) { - map_exec(buf, code_gen_buffer_size); - } - return buf; -} -#endif /* USE_STATIC_CODE_GEN_BUFFER, USE_MMAP */ - -static inline void code_gen_alloc(size_t tb_size) -{ - code_gen_buffer_size = size_code_gen_buffer(tb_size); - code_gen_buffer = alloc_code_gen_buffer(); - if (code_gen_buffer == NULL) { - fprintf(stderr, "Could not allocate dynamic translator buffer\n"); - exit(1); - } - - qemu_madvise(code_gen_buffer, code_gen_buffer_size, QEMU_MADV_HUGEPAGE); - - /* Steal room for the prologue at the end of the buffer. This ensures - (via the MAX_CODE_GEN_BUFFER_SIZE limits above) that direct branches - from TB's to the prologue are going to be in range. It also means - that we don't need to mark (additional) portions of the data segment - as executable. */ - code_gen_prologue = code_gen_buffer + code_gen_buffer_size - 1024; - code_gen_buffer_size -= 1024; - - code_gen_buffer_max_size = code_gen_buffer_size - - (TCG_MAX_OP_SIZE * OPC_BUF_SIZE); - code_gen_max_blocks = code_gen_buffer_size / CODE_GEN_AVG_BLOCK_SIZE; - tbs = g_malloc(code_gen_max_blocks * sizeof(TranslationBlock)); -} - -/* Must be called before using the QEMU cpus. 'tb_size' is the size - (in bytes) allocated to the translation buffer. Zero means default - size. */ -void tcg_exec_init(unsigned long tb_size) -{ - cpu_gen_init(); - code_gen_alloc(tb_size); - code_gen_ptr = code_gen_buffer; - tcg_register_jit(code_gen_buffer, code_gen_buffer_size); - page_init(); -#if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE) - /* There's no guest base to take into account, so go ahead and - initialize the prologue now. */ - tcg_prologue_init(&tcg_ctx); -#endif -} - -bool tcg_enabled(void) -{ - return code_gen_buffer != NULL; -} - void cpu_exec_init_all(void) { #if !defined(CONFIG_USER_ONLY) @@ -733,789 +293,6 @@ void cpu_exec_init(CPUArchState *env) #endif } -/* Allocate a new translation block. Flush the translation buffer if - too many translation blocks or too much generated code. */ -static TranslationBlock *tb_alloc(target_ulong pc) -{ - TranslationBlock *tb; - - if (nb_tbs >= code_gen_max_blocks || - (code_gen_ptr - code_gen_buffer) >= code_gen_buffer_max_size) { - return NULL; - } - tb = &tbs[nb_tbs++]; - tb->pc = pc; - tb->cflags = 0; - return tb; -} - -void tb_free(TranslationBlock *tb) -{ - /* In practice this is mostly used for single use temporary TB - Ignore the hard cases and just back up if this TB happens to - be the last one generated. */ - if (nb_tbs > 0 && tb == &tbs[nb_tbs - 1]) { - code_gen_ptr = tb->tc_ptr; - nb_tbs--; - } -} - -static inline void invalidate_page_bitmap(PageDesc *p) -{ - if (p->code_bitmap) { - g_free(p->code_bitmap); - p->code_bitmap = NULL; - } - p->code_write_count = 0; -} - -/* Set to NULL all the 'first_tb' fields in all PageDescs. */ -static void page_flush_tb_1(int level, void **lp) -{ - int i; - - if (*lp == NULL) { - return; - } - if (level == 0) { - PageDesc *pd = *lp; - - for (i = 0; i < L2_SIZE; ++i) { - pd[i].first_tb = NULL; - invalidate_page_bitmap(pd + i); - } - } else { - void **pp = *lp; - - for (i = 0; i < L2_SIZE; ++i) { - page_flush_tb_1(level - 1, pp + i); - } - } -} - -static void page_flush_tb(void) -{ - int i; - - for (i = 0; i < V_L1_SIZE; i++) { - page_flush_tb_1(V_L1_SHIFT / L2_BITS - 1, l1_map + i); - } -} - -/* flush all the translation blocks */ -/* XXX: tb_flush is currently not thread safe */ -void tb_flush(CPUArchState *env1) -{ - CPUArchState *env; - -#if defined(DEBUG_FLUSH) - printf("qemu: flush code_size=%ld nb_tbs=%d avg_tb_size=%ld\n", - (unsigned long)(code_gen_ptr - code_gen_buffer), - nb_tbs, nb_tbs > 0 ? - ((unsigned long)(code_gen_ptr - code_gen_buffer)) / nb_tbs : 0); -#endif - if ((unsigned long)(code_gen_ptr - code_gen_buffer) - > code_gen_buffer_size) { - cpu_abort(env1, "Internal error: code buffer overflow\n"); - } - nb_tbs = 0; - - for (env = first_cpu; env != NULL; env = env->next_cpu) { - memset(env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof(void *)); - } - - memset(tb_phys_hash, 0, CODE_GEN_PHYS_HASH_SIZE * sizeof(void *)); - page_flush_tb(); - - code_gen_ptr = code_gen_buffer; - /* XXX: flush processor icache at this point if cache flush is - expensive */ - tb_flush_count++; -} - -#ifdef DEBUG_TB_CHECK - -static void tb_invalidate_check(target_ulong address) -{ - TranslationBlock *tb; - int i; - - address &= TARGET_PAGE_MASK; - for (i = 0; i < CODE_GEN_PHYS_HASH_SIZE; i++) { - for (tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) { - if (!(address + TARGET_PAGE_SIZE <= tb->pc || - address >= tb->pc + tb->size)) { - printf("ERROR invalidate: address=" TARGET_FMT_lx - " PC=%08lx size=%04x\n", - address, (long)tb->pc, tb->size); - } - } - } -} - -/* verify that all the pages have correct rights for code */ -static void tb_page_check(void) -{ - TranslationBlock *tb; - int i, flags1, flags2; - - for (i = 0; i < CODE_GEN_PHYS_HASH_SIZE; i++) { - for (tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) { - flags1 = page_get_flags(tb->pc); - flags2 = page_get_flags(tb->pc + tb->size - 1); - if ((flags1 & PAGE_WRITE) || (flags2 & PAGE_WRITE)) { - printf("ERROR page flags: PC=%08lx size=%04x f1=%x f2=%x\n", - (long)tb->pc, tb->size, flags1, flags2); - } - } - } -} - -#endif - - -/* invalidate one TB */ -static inline void tb_remove(TranslationBlock **ptb, TranslationBlock *tb, - int next_offset) -{ - TranslationBlock *tb1; - - for (;;) { - tb1 = *ptb; - if (tb1 == tb) { - *ptb = *(TranslationBlock **)((char *)tb1 + next_offset); - break; - } - ptb = (TranslationBlock **)((char *)tb1 + next_offset); - } -} - -static inline void tb_page_remove(TranslationBlock **ptb, TranslationBlock *tb) -{ - TranslationBlock *tb1; - unsigned int n1; - - for (;;) { - tb1 = *ptb; - n1 = (uintptr_t)tb1 & 3; - tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); - if (tb1 == tb) { - *ptb = tb1->page_next[n1]; - break; - } - ptb = &tb1->page_next[n1]; - } -} - -static inline void tb_jmp_remove(TranslationBlock *tb, int n) -{ - TranslationBlock *tb1, **ptb; - unsigned int n1; - - ptb = &tb->jmp_next[n]; - tb1 = *ptb; - if (tb1) { - /* find tb(n) in circular list */ - for (;;) { - tb1 = *ptb; - n1 = (uintptr_t)tb1 & 3; - tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); - if (n1 == n && tb1 == tb) { - break; - } - if (n1 == 2) { - ptb = &tb1->jmp_first; - } else { - ptb = &tb1->jmp_next[n1]; - } - } - /* now we can suppress tb(n) from the list */ - *ptb = tb->jmp_next[n]; - - tb->jmp_next[n] = NULL; - } -} - -/* reset the jump entry 'n' of a TB so that it is not chained to - another TB */ -static inline void tb_reset_jump(TranslationBlock *tb, int n) -{ - tb_set_jmp_target(tb, n, (uintptr_t)(tb->tc_ptr + tb->tb_next_offset[n])); -} - -void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr) -{ - CPUArchState *env; - PageDesc *p; - unsigned int h, n1; - tb_page_addr_t phys_pc; - TranslationBlock *tb1, *tb2; - - /* remove the TB from the hash list */ - phys_pc = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK); - h = tb_phys_hash_func(phys_pc); - tb_remove(&tb_phys_hash[h], tb, - offsetof(TranslationBlock, phys_hash_next)); - - /* remove the TB from the page list */ - if (tb->page_addr[0] != page_addr) { - p = page_find(tb->page_addr[0] >> TARGET_PAGE_BITS); - tb_page_remove(&p->first_tb, tb); - invalidate_page_bitmap(p); - } - if (tb->page_addr[1] != -1 && tb->page_addr[1] != page_addr) { - p = page_find(tb->page_addr[1] >> TARGET_PAGE_BITS); - tb_page_remove(&p->first_tb, tb); - invalidate_page_bitmap(p); - } - - tb_invalidated_flag = 1; - - /* remove the TB from the hash list */ - h = tb_jmp_cache_hash_func(tb->pc); - for (env = first_cpu; env != NULL; env = env->next_cpu) { - if (env->tb_jmp_cache[h] == tb) { - env->tb_jmp_cache[h] = NULL; - } - } - - /* suppress this TB from the two jump lists */ - tb_jmp_remove(tb, 0); - tb_jmp_remove(tb, 1); - - /* suppress any remaining jumps to this TB */ - tb1 = tb->jmp_first; - for (;;) { - n1 = (uintptr_t)tb1 & 3; - if (n1 == 2) { - break; - } - tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); - tb2 = tb1->jmp_next[n1]; - tb_reset_jump(tb1, n1); - tb1->jmp_next[n1] = NULL; - tb1 = tb2; - } - tb->jmp_first = (TranslationBlock *)((uintptr_t)tb | 2); /* fail safe */ - - tb_phys_invalidate_count++; -} - -static inline void set_bits(uint8_t *tab, int start, int len) -{ - int end, mask, end1; - - end = start + len; - tab += start >> 3; - mask = 0xff << (start & 7); - if ((start & ~7) == (end & ~7)) { - if (start < end) { - mask &= ~(0xff << (end & 7)); - *tab |= mask; - } - } else { - *tab++ |= mask; - start = (start + 8) & ~7; - end1 = end & ~7; - while (start < end1) { - *tab++ = 0xff; - start += 8; - } - if (start < end) { - mask = ~(0xff << (end & 7)); - *tab |= mask; - } - } -} - -static void build_page_bitmap(PageDesc *p) -{ - int n, tb_start, tb_end; - TranslationBlock *tb; - - p->code_bitmap = g_malloc0(TARGET_PAGE_SIZE / 8); - - tb = p->first_tb; - while (tb != NULL) { - n = (uintptr_t)tb & 3; - tb = (TranslationBlock *)((uintptr_t)tb & ~3); - /* NOTE: this is subtle as a TB may span two physical pages */ - if (n == 0) { - /* NOTE: tb_end may be after the end of the page, but - it is not a problem */ - tb_start = tb->pc & ~TARGET_PAGE_MASK; - tb_end = tb_start + tb->size; - if (tb_end > TARGET_PAGE_SIZE) { - tb_end = TARGET_PAGE_SIZE; - } - } else { - tb_start = 0; - tb_end = ((tb->pc + tb->size) & ~TARGET_PAGE_MASK); - } - set_bits(p->code_bitmap, tb_start, tb_end - tb_start); - tb = tb->page_next[n]; - } -} - -TranslationBlock *tb_gen_code(CPUArchState *env, - target_ulong pc, target_ulong cs_base, - int flags, int cflags) -{ - TranslationBlock *tb; - uint8_t *tc_ptr; - tb_page_addr_t phys_pc, phys_page2; - target_ulong virt_page2; - int code_gen_size; - - phys_pc = get_page_addr_code(env, pc); - tb = tb_alloc(pc); - if (!tb) { - /* flush must be done */ - tb_flush(env); - /* cannot fail at this point */ - tb = tb_alloc(pc); - /* Don't forget to invalidate previous TB info. */ - tb_invalidated_flag = 1; - } - tc_ptr = code_gen_ptr; - tb->tc_ptr = tc_ptr; - tb->cs_base = cs_base; - tb->flags = flags; - tb->cflags = cflags; - cpu_gen_code(env, tb, &code_gen_size); - code_gen_ptr = (void *)(((uintptr_t)code_gen_ptr + code_gen_size + - CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1)); - - /* check next page if needed */ - virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK; - phys_page2 = -1; - if ((pc & TARGET_PAGE_MASK) != virt_page2) { - phys_page2 = get_page_addr_code(env, virt_page2); - } - tb_link_page(tb, phys_pc, phys_page2); - return tb; -} - -/* - * Invalidate all TBs which intersect with the target physical address range - * [start;end[. NOTE: start and end may refer to *different* physical pages. - * 'is_cpu_write_access' should be true if called from a real cpu write - * access: the virtual CPU will exit the current TB if code is modified inside - * this TB. - */ -void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t end, - int is_cpu_write_access) -{ - while (start < end) { - tb_invalidate_phys_page_range(start, end, is_cpu_write_access); - start &= TARGET_PAGE_MASK; - start += TARGET_PAGE_SIZE; - } -} - -/* - * Invalidate all TBs which intersect with the target physical address range - * [start;end[. NOTE: start and end must refer to the *same* physical page. - * 'is_cpu_write_access' should be true if called from a real cpu write - * access: the virtual CPU will exit the current TB if code is modified inside - * this TB. - */ -void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end, - int is_cpu_write_access) -{ - TranslationBlock *tb, *tb_next, *saved_tb; - CPUArchState *env = cpu_single_env; - tb_page_addr_t tb_start, tb_end; - PageDesc *p; - int n; -#ifdef TARGET_HAS_PRECISE_SMC - int current_tb_not_found = is_cpu_write_access; - TranslationBlock *current_tb = NULL; - int current_tb_modified = 0; - target_ulong current_pc = 0; - target_ulong current_cs_base = 0; - int current_flags = 0; -#endif /* TARGET_HAS_PRECISE_SMC */ - - p = page_find(start >> TARGET_PAGE_BITS); - if (!p) { - return; - } - if (!p->code_bitmap && - ++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD && - is_cpu_write_access) { - /* build code bitmap */ - build_page_bitmap(p); - } - - /* we remove all the TBs in the range [start, end[ */ - /* XXX: see if in some cases it could be faster to invalidate all - the code */ - tb = p->first_tb; - while (tb != NULL) { - n = (uintptr_t)tb & 3; - tb = (TranslationBlock *)((uintptr_t)tb & ~3); - tb_next = tb->page_next[n]; - /* NOTE: this is subtle as a TB may span two physical pages */ - if (n == 0) { - /* NOTE: tb_end may be after the end of the page, but - it is not a problem */ - tb_start = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK); - tb_end = tb_start + tb->size; - } else { - tb_start = tb->page_addr[1]; - tb_end = tb_start + ((tb->pc + tb->size) & ~TARGET_PAGE_MASK); - } - if (!(tb_end <= start || tb_start >= end)) { -#ifdef TARGET_HAS_PRECISE_SMC - if (current_tb_not_found) { - current_tb_not_found = 0; - current_tb = NULL; - if (env->mem_io_pc) { - /* now we have a real cpu fault */ - current_tb = tb_find_pc(env->mem_io_pc); - } - } - if (current_tb == tb && - (current_tb->cflags & CF_COUNT_MASK) != 1) { - /* If we are modifying the current TB, we must stop - its execution. We could be more precise by checking - that the modification is after the current PC, but it - would require a specialized function to partially - restore the CPU state */ - - current_tb_modified = 1; - cpu_restore_state(current_tb, env, env->mem_io_pc); - cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base, - ¤t_flags); - } -#endif /* TARGET_HAS_PRECISE_SMC */ - /* we need to do that to handle the case where a signal - occurs while doing tb_phys_invalidate() */ - saved_tb = NULL; - if (env) { - saved_tb = env->current_tb; - env->current_tb = NULL; - } - tb_phys_invalidate(tb, -1); - if (env) { - env->current_tb = saved_tb; - if (env->interrupt_request && env->current_tb) { - cpu_interrupt(env, env->interrupt_request); - } - } - } - tb = tb_next; - } -#if !defined(CONFIG_USER_ONLY) - /* if no code remaining, no need to continue to use slow writes */ - if (!p->first_tb) { - invalidate_page_bitmap(p); - if (is_cpu_write_access) { - tlb_unprotect_code_phys(env, start, env->mem_io_vaddr); - } - } -#endif -#ifdef TARGET_HAS_PRECISE_SMC - if (current_tb_modified) { - /* we generate a block containing just the instruction - modifying the memory. It will ensure that it cannot modify - itself */ - env->current_tb = NULL; - tb_gen_code(env, current_pc, current_cs_base, current_flags, 1); - cpu_resume_from_signal(env, NULL); - } -#endif -} - -/* len must be <= 8 and start must be a multiple of len */ -static inline void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len) -{ - PageDesc *p; - int offset, b; - -#if 0 - if (1) { - qemu_log("modifying code at 0x%x size=%d EIP=%x PC=%08x\n", - cpu_single_env->mem_io_vaddr, len, - cpu_single_env->eip, - cpu_single_env->eip + - (intptr_t)cpu_single_env->segs[R_CS].base); - } -#endif - p = page_find(start >> TARGET_PAGE_BITS); - if (!p) { - return; - } - if (p->code_bitmap) { - offset = start & ~TARGET_PAGE_MASK; - b = p->code_bitmap[offset >> 3] >> (offset & 7); - if (b & ((1 << len) - 1)) { - goto do_invalidate; - } - } else { - do_invalidate: - tb_invalidate_phys_page_range(start, start + len, 1); - } -} - -#if !defined(CONFIG_SOFTMMU) -static void tb_invalidate_phys_page(tb_page_addr_t addr, - uintptr_t pc, void *puc) -{ - TranslationBlock *tb; - PageDesc *p; - int n; -#ifdef TARGET_HAS_PRECISE_SMC - TranslationBlock *current_tb = NULL; - CPUArchState *env = cpu_single_env; - int current_tb_modified = 0; - target_ulong current_pc = 0; - target_ulong current_cs_base = 0; - int current_flags = 0; -#endif - - addr &= TARGET_PAGE_MASK; - p = page_find(addr >> TARGET_PAGE_BITS); - if (!p) { - return; - } - tb = p->first_tb; -#ifdef TARGET_HAS_PRECISE_SMC - if (tb && pc != 0) { - current_tb = tb_find_pc(pc); - } -#endif - while (tb != NULL) { - n = (uintptr_t)tb & 3; - tb = (TranslationBlock *)((uintptr_t)tb & ~3); -#ifdef TARGET_HAS_PRECISE_SMC - if (current_tb == tb && - (current_tb->cflags & CF_COUNT_MASK) != 1) { - /* If we are modifying the current TB, we must stop - its execution. We could be more precise by checking - that the modification is after the current PC, but it - would require a specialized function to partially - restore the CPU state */ - - current_tb_modified = 1; - cpu_restore_state(current_tb, env, pc); - cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base, - ¤t_flags); - } -#endif /* TARGET_HAS_PRECISE_SMC */ - tb_phys_invalidate(tb, addr); - tb = tb->page_next[n]; - } - p->first_tb = NULL; -#ifdef TARGET_HAS_PRECISE_SMC - if (current_tb_modified) { - /* we generate a block containing just the instruction - modifying the memory. It will ensure that it cannot modify - itself */ - env->current_tb = NULL; - tb_gen_code(env, current_pc, current_cs_base, current_flags, 1); - cpu_resume_from_signal(env, puc); - } -#endif -} -#endif - -/* add the tb in the target page and protect it if necessary */ -static inline void tb_alloc_page(TranslationBlock *tb, - unsigned int n, tb_page_addr_t page_addr) -{ - PageDesc *p; -#ifndef CONFIG_USER_ONLY - bool page_already_protected; -#endif - - tb->page_addr[n] = page_addr; - p = page_find_alloc(page_addr >> TARGET_PAGE_BITS, 1); - tb->page_next[n] = p->first_tb; -#ifndef CONFIG_USER_ONLY - page_already_protected = p->first_tb != NULL; -#endif - p->first_tb = (TranslationBlock *)((uintptr_t)tb | n); - invalidate_page_bitmap(p); - -#if defined(TARGET_HAS_SMC) || 1 - -#if defined(CONFIG_USER_ONLY) - if (p->flags & PAGE_WRITE) { - target_ulong addr; - PageDesc *p2; - int prot; - - /* force the host page as non writable (writes will have a - page fault + mprotect overhead) */ - page_addr &= qemu_host_page_mask; - prot = 0; - for (addr = page_addr; addr < page_addr + qemu_host_page_size; - addr += TARGET_PAGE_SIZE) { - - p2 = page_find(addr >> TARGET_PAGE_BITS); - if (!p2) { - continue; - } - prot |= p2->flags; - p2->flags &= ~PAGE_WRITE; - } - mprotect(g2h(page_addr), qemu_host_page_size, - (prot & PAGE_BITS) & ~PAGE_WRITE); -#ifdef DEBUG_TB_INVALIDATE - printf("protecting code page: 0x" TARGET_FMT_lx "\n", - page_addr); -#endif - } -#else - /* if some code is already present, then the pages are already - protected. So we handle the case where only the first TB is - allocated in a physical page */ - if (!page_already_protected) { - tlb_protect_code(page_addr); - } -#endif - -#endif /* TARGET_HAS_SMC */ -} - -/* add a new TB and link it to the physical page tables. phys_page2 is - (-1) to indicate that only one page contains the TB. */ -static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc, - tb_page_addr_t phys_page2) -{ - unsigned int h; - TranslationBlock **ptb; - - /* Grab the mmap lock to stop another thread invalidating this TB - before we are done. */ - mmap_lock(); - /* add in the physical hash table */ - h = tb_phys_hash_func(phys_pc); - ptb = &tb_phys_hash[h]; - tb->phys_hash_next = *ptb; - *ptb = tb; - - /* add in the page list */ - tb_alloc_page(tb, 0, phys_pc & TARGET_PAGE_MASK); - if (phys_page2 != -1) { - tb_alloc_page(tb, 1, phys_page2); - } else { - tb->page_addr[1] = -1; - } - - tb->jmp_first = (TranslationBlock *)((uintptr_t)tb | 2); - tb->jmp_next[0] = NULL; - tb->jmp_next[1] = NULL; - - /* init original jump addresses */ - if (tb->tb_next_offset[0] != 0xffff) { - tb_reset_jump(tb, 0); - } - if (tb->tb_next_offset[1] != 0xffff) { - tb_reset_jump(tb, 1); - } - -#ifdef DEBUG_TB_CHECK - tb_page_check(); -#endif - mmap_unlock(); -} - -#if defined(CONFIG_QEMU_LDST_OPTIMIZATION) && defined(CONFIG_SOFTMMU) -/* check whether the given addr is in TCG generated code buffer or not */ -bool is_tcg_gen_code(uintptr_t tc_ptr) -{ - /* This can be called during code generation, code_gen_buffer_max_size - is used instead of code_gen_ptr for upper boundary checking */ - return (tc_ptr >= (uintptr_t)code_gen_buffer && - tc_ptr < (uintptr_t)(code_gen_buffer + code_gen_buffer_max_size)); -} -#endif - -/* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr < - tb[1].tc_ptr. Return NULL if not found */ -TranslationBlock *tb_find_pc(uintptr_t tc_ptr) -{ - int m_min, m_max, m; - uintptr_t v; - TranslationBlock *tb; - - if (nb_tbs <= 0) { - return NULL; - } - if (tc_ptr < (uintptr_t)code_gen_buffer || - tc_ptr >= (uintptr_t)code_gen_ptr) { - return NULL; - } - /* binary search (cf Knuth) */ - m_min = 0; - m_max = nb_tbs - 1; - while (m_min <= m_max) { - m = (m_min + m_max) >> 1; - tb = &tbs[m]; - v = (uintptr_t)tb->tc_ptr; - if (v == tc_ptr) { - return tb; - } else if (tc_ptr < v) { - m_max = m - 1; - } else { - m_min = m + 1; - } - } - return &tbs[m_max]; -} - -static void tb_reset_jump_recursive(TranslationBlock *tb); - -static inline void tb_reset_jump_recursive2(TranslationBlock *tb, int n) -{ - TranslationBlock *tb1, *tb_next, **ptb; - unsigned int n1; - - tb1 = tb->jmp_next[n]; - if (tb1 != NULL) { - /* find head of list */ - for (;;) { - n1 = (uintptr_t)tb1 & 3; - tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); - if (n1 == 2) { - break; - } - tb1 = tb1->jmp_next[n1]; - } - /* we are now sure now that tb jumps to tb1 */ - tb_next = tb1; - - /* remove tb from the jmp_first list */ - ptb = &tb_next->jmp_first; - for (;;) { - tb1 = *ptb; - n1 = (uintptr_t)tb1 & 3; - tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); - if (n1 == n && tb1 == tb) { - break; - } - ptb = &tb1->jmp_next[n1]; - } - *ptb = tb->jmp_next[n]; - tb->jmp_next[n] = NULL; - - /* suppress the jump to next tb in generated code */ - tb_reset_jump(tb, n); - - /* suppress jumps in the tb on which we could have jumped */ - tb_reset_jump_recursive(tb_next); - } -} - -static void tb_reset_jump_recursive(TranslationBlock *tb) -{ - tb_reset_jump_recursive2(tb, 0); - tb_reset_jump_recursive2(tb, 1); -} - #if defined(TARGET_HAS_ICE) #if defined(CONFIG_USER_ONLY) static void breakpoint_invalidate(CPUArchState *env, target_ulong pc) @@ -1523,22 +300,6 @@ static void breakpoint_invalidate(CPUArchState *env, target_ulong pc) tb_invalidate_phys_page_range(pc, pc + 1, 0); } #else -void tb_invalidate_phys_addr(hwaddr addr) -{ - ram_addr_t ram_addr; - MemoryRegionSection *section; - - section = phys_page_find(address_space_memory.dispatch, - addr >> TARGET_PAGE_BITS); - if (!(memory_region_is_ram(section->mr) - || (section->mr->rom_device && section->mr->readable))) { - return; - } - ram_addr = (memory_region_get_ram_addr(section->mr) & TARGET_PAGE_MASK) - + memory_region_section_addr(section, addr); - tb_invalidate_phys_page_range(ram_addr, ram_addr + 1, 0); -} - static void breakpoint_invalidate(CPUArchState *env, target_ulong pc) { tb_invalidate_phys_addr(cpu_get_phys_page_debug(env, pc) | @@ -1720,67 +481,6 @@ void cpu_single_step(CPUArchState *env, int enabled) #endif } -static void cpu_unlink_tb(CPUArchState *env) -{ - /* FIXME: TB unchaining isn't SMP safe. For now just ignore the - problem and hope the cpu will stop of its own accord. For userspace - emulation this often isn't actually as bad as it sounds. Often - signals are used primarily to interrupt blocking syscalls. */ - TranslationBlock *tb; - static spinlock_t interrupt_lock = SPIN_LOCK_UNLOCKED; - - spin_lock(&interrupt_lock); - tb = env->current_tb; - /* if the cpu is currently executing code, we must unlink it and - all the potentially executing TB */ - if (tb) { - env->current_tb = NULL; - tb_reset_jump_recursive(tb); - } - spin_unlock(&interrupt_lock); -} - -#ifndef CONFIG_USER_ONLY -/* mask must never be zero, except for A20 change call */ -static void tcg_handle_interrupt(CPUArchState *env, int mask) -{ - CPUState *cpu = ENV_GET_CPU(env); - int old_mask; - - old_mask = env->interrupt_request; - env->interrupt_request |= mask; - - /* - * If called from iothread context, wake the target cpu in - * case its halted. - */ - if (!qemu_cpu_is_self(cpu)) { - qemu_cpu_kick(cpu); - return; - } - - if (use_icount) { - env->icount_decr.u16.high = 0xffff; - if (!can_do_io(env) - && (mask & ~old_mask) != 0) { - cpu_abort(env, "Raised interrupt while not in I/O function"); - } - } else { - cpu_unlink_tb(env); - } -} - -CPUInterruptHandler cpu_interrupt_handler = tcg_handle_interrupt; - -#else /* CONFIG_USER_ONLY */ - -void cpu_interrupt(CPUArchState *env, int mask) -{ - env->interrupt_request |= mask; - cpu_unlink_tb(env); -} -#endif /* CONFIG_USER_ONLY */ - void cpu_reset_interrupt(CPUArchState *env, int mask) { env->interrupt_request &= ~mask; @@ -1859,21 +559,6 @@ CPUArchState *cpu_copy(CPUArchState *env) } #if !defined(CONFIG_USER_ONLY) -void tb_flush_jmp_cache(CPUArchState *env, target_ulong addr) -{ - unsigned int i; - - /* Discard jump cache entries for any tb which might potentially - overlap the flushed page. */ - i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE); - memset (&env->tb_jmp_cache[i], 0, - TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *)); - - i = tb_jmp_cache_hash_page(addr); - memset (&env->tb_jmp_cache[i], 0, - TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *)); -} - static void tlb_reset_dirty_range_all(ram_addr_t start, ram_addr_t end, uintptr_t length) { @@ -1963,272 +648,6 @@ hwaddr memory_region_section_get_iotlb(CPUArchState *env, return iotlb; } - -#else -/* - * Walks guest process memory "regions" one by one - * and calls callback function 'fn' for each region. - */ -struct walk_memory_regions_data { - walk_memory_regions_fn fn; - void *priv; - uintptr_t start; - int prot; -}; - -static int walk_memory_regions_end(struct walk_memory_regions_data *data, - abi_ulong end, int new_prot) -{ - if (data->start != -1ul) { - int rc = data->fn(data->priv, data->start, end, data->prot); - if (rc != 0) { - return rc; - } - } - - data->start = (new_prot ? end : -1ul); - data->prot = new_prot; - - return 0; -} - -static int walk_memory_regions_1(struct walk_memory_regions_data *data, - abi_ulong base, int level, void **lp) -{ - abi_ulong pa; - int i, rc; - - if (*lp == NULL) { - return walk_memory_regions_end(data, base, 0); - } - - if (level == 0) { - PageDesc *pd = *lp; - - for (i = 0; i < L2_SIZE; ++i) { - int prot = pd[i].flags; - - pa = base | (i << TARGET_PAGE_BITS); - if (prot != data->prot) { - rc = walk_memory_regions_end(data, pa, prot); - if (rc != 0) { - return rc; - } - } - } - } else { - void **pp = *lp; - - for (i = 0; i < L2_SIZE; ++i) { - pa = base | ((abi_ulong)i << - (TARGET_PAGE_BITS + L2_BITS * level)); - rc = walk_memory_regions_1(data, pa, level - 1, pp + i); - if (rc != 0) { - return rc; - } - } - } - - return 0; -} - -int walk_memory_regions(void *priv, walk_memory_regions_fn fn) -{ - struct walk_memory_regions_data data; - uintptr_t i; - - data.fn = fn; - data.priv = priv; - data.start = -1ul; - data.prot = 0; - - for (i = 0; i < V_L1_SIZE; i++) { - int rc = walk_memory_regions_1(&data, (abi_ulong)i << V_L1_SHIFT, - V_L1_SHIFT / L2_BITS - 1, l1_map + i); - - if (rc != 0) { - return rc; - } - } - - return walk_memory_regions_end(&data, 0, 0); -} - -static int dump_region(void *priv, abi_ulong start, - abi_ulong end, unsigned long prot) -{ - FILE *f = (FILE *)priv; - - (void) fprintf(f, TARGET_ABI_FMT_lx"-"TARGET_ABI_FMT_lx - " "TARGET_ABI_FMT_lx" %c%c%c\n", - start, end, end - start, - ((prot & PAGE_READ) ? 'r' : '-'), - ((prot & PAGE_WRITE) ? 'w' : '-'), - ((prot & PAGE_EXEC) ? 'x' : '-')); - - return 0; -} - -/* dump memory mappings */ -void page_dump(FILE *f) -{ - (void) fprintf(f, "%-8s %-8s %-8s %s\n", - "start", "end", "size", "prot"); - walk_memory_regions(f, dump_region); -} - -int page_get_flags(target_ulong address) -{ - PageDesc *p; - - p = page_find(address >> TARGET_PAGE_BITS); - if (!p) { - return 0; - } - return p->flags; -} - -/* Modify the flags of a page and invalidate the code if necessary. - The flag PAGE_WRITE_ORG is positioned automatically depending - on PAGE_WRITE. The mmap_lock should already be held. */ -void page_set_flags(target_ulong start, target_ulong end, int flags) -{ - target_ulong addr, len; - - /* This function should never be called with addresses outside the - guest address space. If this assert fires, it probably indicates - a missing call to h2g_valid. */ -#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS - assert(end < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS)); -#endif - assert(start < end); - - start = start & TARGET_PAGE_MASK; - end = TARGET_PAGE_ALIGN(end); - - if (flags & PAGE_WRITE) { - flags |= PAGE_WRITE_ORG; - } - - for (addr = start, len = end - start; - len != 0; - len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) { - PageDesc *p = page_find_alloc(addr >> TARGET_PAGE_BITS, 1); - - /* If the write protection bit is set, then we invalidate - the code inside. */ - if (!(p->flags & PAGE_WRITE) && - (flags & PAGE_WRITE) && - p->first_tb) { - tb_invalidate_phys_page(addr, 0, NULL); - } - p->flags = flags; - } -} - -int page_check_range(target_ulong start, target_ulong len, int flags) -{ - PageDesc *p; - target_ulong end; - target_ulong addr; - - /* This function should never be called with addresses outside the - guest address space. If this assert fires, it probably indicates - a missing call to h2g_valid. */ -#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS - assert(start < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS)); -#endif - - if (len == 0) { - return 0; - } - if (start + len - 1 < start) { - /* We've wrapped around. */ - return -1; - } - - /* must do before we loose bits in the next step */ - end = TARGET_PAGE_ALIGN(start + len); - start = start & TARGET_PAGE_MASK; - - for (addr = start, len = end - start; - len != 0; - len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) { - p = page_find(addr >> TARGET_PAGE_BITS); - if (!p) { - return -1; - } - if (!(p->flags & PAGE_VALID)) { - return -1; - } - - if ((flags & PAGE_READ) && !(p->flags & PAGE_READ)) { - return -1; - } - if (flags & PAGE_WRITE) { - if (!(p->flags & PAGE_WRITE_ORG)) { - return -1; - } - /* unprotect the page if it was put read-only because it - contains translated code */ - if (!(p->flags & PAGE_WRITE)) { - if (!page_unprotect(addr, 0, NULL)) { - return -1; - } - } - return 0; - } - } - return 0; -} - -/* called from signal handler: invalidate the code and unprotect the - page. Return TRUE if the fault was successfully handled. */ -int page_unprotect(target_ulong address, uintptr_t pc, void *puc) -{ - unsigned int prot; - PageDesc *p; - target_ulong host_start, host_end, addr; - - /* Technically this isn't safe inside a signal handler. However we - know this only ever happens in a synchronous SEGV handler, so in - practice it seems to be ok. */ - mmap_lock(); - - p = page_find(address >> TARGET_PAGE_BITS); - if (!p) { - mmap_unlock(); - return 0; - } - - /* if the page was really writable, then we change its - protection back to writable */ - if ((p->flags & PAGE_WRITE_ORG) && !(p->flags & PAGE_WRITE)) { - host_start = address & qemu_host_page_mask; - host_end = host_start + qemu_host_page_size; - - prot = 0; - for (addr = host_start ; addr < host_end ; addr += TARGET_PAGE_SIZE) { - p = page_find(addr >> TARGET_PAGE_BITS); - p->flags |= PAGE_WRITE; - prot |= p->flags; - - /* and since the content will be modified, we must invalidate - the corresponding translated code. */ - tb_invalidate_phys_page(addr, pc, puc); -#ifdef DEBUG_TB_CHECK - tb_invalidate_check(addr); -#endif - } - mprotect((void *)g2h(host_start), qemu_host_page_size, - prot & PAGE_BITS); - - mmap_unlock(); - return 1; - } - mmap_unlock(); - return 0; -} #endif /* defined(CONFIG_USER_ONLY) */ #if !defined(CONFIG_USER_ONLY) @@ -2987,19 +1406,6 @@ static const MemoryRegionOps notdirty_mem_ops = { .endianness = DEVICE_NATIVE_ENDIAN, }; -static void tb_check_watchpoint(CPUArchState *env) -{ - TranslationBlock *tb; - - tb = tb_find_pc(env->mem_io_pc); - if (!tb) { - cpu_abort(env, "check_watchpoint: could not find TB for pc=%p", - (void *)env->mem_io_pc); - } - cpu_restore_state(tb, env, env->mem_io_pc); - tb_phys_invalidate(tb, -1); -} - /* Generate a debug exception if a watchpoint has been hit. */ static void check_watchpoint(int offset, int len_mask, int flags) { @@ -4134,123 +2540,8 @@ int cpu_memory_rw_debug(CPUArchState *env, target_ulong addr, } #endif -/* in deterministic execution mode, instructions doing device I/Os - must be at the end of the TB */ -void cpu_io_recompile(CPUArchState *env, uintptr_t retaddr) -{ - TranslationBlock *tb; - uint32_t n, cflags; - target_ulong pc, cs_base; - uint64_t flags; - - tb = tb_find_pc(retaddr); - if (!tb) { - cpu_abort(env, "cpu_io_recompile: could not find TB for pc=%p", - (void *)retaddr); - } - n = env->icount_decr.u16.low + tb->icount; - cpu_restore_state(tb, env, retaddr); - /* Calculate how many instructions had been executed before the fault - occurred. */ - n = n - env->icount_decr.u16.low; - /* Generate a new TB ending on the I/O insn. */ - n++; - /* On MIPS and SH, delay slot instructions can only be restarted if - they were already the first instruction in the TB. If this is not - the first instruction in a TB then re-execute the preceding - branch. */ -#if defined(TARGET_MIPS) - if ((env->hflags & MIPS_HFLAG_BMASK) != 0 && n > 1) { - env->active_tc.PC -= 4; - env->icount_decr.u16.low++; - env->hflags &= ~MIPS_HFLAG_BMASK; - } -#elif defined(TARGET_SH4) - if ((env->flags & ((DELAY_SLOT | DELAY_SLOT_CONDITIONAL))) != 0 - && n > 1) { - env->pc -= 2; - env->icount_decr.u16.low++; - env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL); - } -#endif - /* This should never happen. */ - if (n > CF_COUNT_MASK) { - cpu_abort(env, "TB too big during recompile"); - } - - cflags = n | CF_LAST_IO; - pc = tb->pc; - cs_base = tb->cs_base; - flags = tb->flags; - tb_phys_invalidate(tb, -1); - /* FIXME: In theory this could raise an exception. In practice - we have already translated the block once so it's probably ok. */ - tb_gen_code(env, pc, cs_base, flags, cflags); - /* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not - the first in the TB) then we end up generating a whole new TB and - repeating the fault, which is horribly inefficient. - Better would be to execute just this insn uncached, or generate a - second new TB. */ - cpu_resume_from_signal(env, NULL); -} - #if !defined(CONFIG_USER_ONLY) -void dump_exec_info(FILE *f, fprintf_function cpu_fprintf) -{ - int i, target_code_size, max_target_code_size; - int direct_jmp_count, direct_jmp2_count, cross_page; - TranslationBlock *tb; - - target_code_size = 0; - max_target_code_size = 0; - cross_page = 0; - direct_jmp_count = 0; - direct_jmp2_count = 0; - for (i = 0; i < nb_tbs; i++) { - tb = &tbs[i]; - target_code_size += tb->size; - if (tb->size > max_target_code_size) { - max_target_code_size = tb->size; - } - if (tb->page_addr[1] != -1) { - cross_page++; - } - if (tb->tb_next_offset[0] != 0xffff) { - direct_jmp_count++; - if (tb->tb_next_offset[1] != 0xffff) { - direct_jmp2_count++; - } - } - } - /* XXX: avoid using doubles ? */ - cpu_fprintf(f, "Translation buffer state:\n"); - cpu_fprintf(f, "gen code size %td/%zd\n", - code_gen_ptr - code_gen_buffer, code_gen_buffer_max_size); - cpu_fprintf(f, "TB count %d/%d\n", - nb_tbs, code_gen_max_blocks); - cpu_fprintf(f, "TB avg target size %d max=%d bytes\n", - nb_tbs ? target_code_size / nb_tbs : 0, - max_target_code_size); - cpu_fprintf(f, "TB avg host size %td bytes (expansion ratio: %0.1f)\n", - nb_tbs ? (code_gen_ptr - code_gen_buffer) / nb_tbs : 0, - target_code_size ? (double) (code_gen_ptr - code_gen_buffer) - / target_code_size : 0); - cpu_fprintf(f, "cross page TB count %d (%d%%)\n", - cross_page, - nb_tbs ? (cross_page * 100) / nb_tbs : 0); - cpu_fprintf(f, "direct jump count %d (%d%%) (2 jumps=%d %d%%)\n", - direct_jmp_count, - nb_tbs ? (direct_jmp_count * 100) / nb_tbs : 0, - direct_jmp2_count, - nb_tbs ? (direct_jmp2_count * 100) / nb_tbs : 0); - cpu_fprintf(f, "\nStatistics:\n"); - cpu_fprintf(f, "TB flush count %d\n", tb_flush_count); - cpu_fprintf(f, "TB invalidate count %d\n", tb_phys_invalidate_count); - cpu_fprintf(f, "TLB flush count %d\n", tlb_flush_count); - tcg_dump_info(f, cpu_fprintf); -} - /* * A helper function for the _utterly broken_ virtio device model to find out if * it's running on a big endian machine. Don't do this at home kids! diff --git a/translate-all.c b/translate-all.c index f22e3eedd2..b958342a99 100644 --- a/translate-all.c +++ b/translate-all.c @@ -16,6 +16,12 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see . */ +#ifdef _WIN32 +#include +#else +#include +#include +#endif #include #include #include @@ -24,15 +30,119 @@ #include "config.h" +#include "qemu-common.h" #define NO_CPU_IO_DEFS #include "cpu.h" #include "disas.h" #include "tcg.h" #include "qemu-timer.h" +#include "memory.h" +#include "exec-memory.h" +#if defined(CONFIG_USER_ONLY) +#include "qemu.h" +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) +#include +#if __FreeBSD_version >= 700104 +#define HAVE_KINFO_GETVMMAP +#define sigqueue sigqueue_freebsd /* avoid redefinition */ +#include +#include +#include +#define _KERNEL +#include +#undef _KERNEL +#undef sigqueue +#include +#endif +#endif +#endif + +#include "cputlb.h" +#include "translate-all.h" + +//#define DEBUG_TB_INVALIDATE +//#define DEBUG_FLUSH +/* make various TB consistency checks */ +//#define DEBUG_TB_CHECK + +#if !defined(CONFIG_USER_ONLY) +/* TB consistency checks only implemented for usermode emulation. */ +#undef DEBUG_TB_CHECK +#endif + +#define SMC_BITMAP_USE_THRESHOLD 10 + +/* Code generation and translation blocks */ +static TranslationBlock *tbs; +static int code_gen_max_blocks; +TranslationBlock *tb_phys_hash[CODE_GEN_PHYS_HASH_SIZE]; +static int nb_tbs; +/* any access to the tbs or the page table must use this lock */ +spinlock_t tb_lock = SPIN_LOCK_UNLOCKED; + +uint8_t *code_gen_prologue; +static uint8_t *code_gen_buffer; +static size_t code_gen_buffer_size; +/* threshold to flush the translated code buffer */ +static size_t code_gen_buffer_max_size; +static uint8_t *code_gen_ptr; + +typedef struct PageDesc { + /* list of TBs intersecting this ram page */ + TranslationBlock *first_tb; + /* in order to optimize self modifying code, we count the number + of lookups we do to a given page to use a bitmap */ + unsigned int code_write_count; + uint8_t *code_bitmap; +#if defined(CONFIG_USER_ONLY) + unsigned long flags; +#endif +} PageDesc; + +/* In system mode we want L1_MAP to be based on ram offsets, + while in user mode we want it to be based on virtual addresses. */ +#if !defined(CONFIG_USER_ONLY) +#if HOST_LONG_BITS < TARGET_PHYS_ADDR_SPACE_BITS +# define L1_MAP_ADDR_SPACE_BITS HOST_LONG_BITS +#else +# define L1_MAP_ADDR_SPACE_BITS TARGET_PHYS_ADDR_SPACE_BITS +#endif +#else +# define L1_MAP_ADDR_SPACE_BITS TARGET_VIRT_ADDR_SPACE_BITS +#endif + +/* The bits remaining after N lower levels of page tables. */ +#define V_L1_BITS_REM \ + ((L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS) + +#if V_L1_BITS_REM < 4 +#define V_L1_BITS (V_L1_BITS_REM + L2_BITS) +#else +#define V_L1_BITS V_L1_BITS_REM +#endif + +#define V_L1_SIZE ((target_ulong)1 << V_L1_BITS) + +#define V_L1_SHIFT (L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS - V_L1_BITS) + +uintptr_t qemu_real_host_page_size; +uintptr_t qemu_host_page_size; +uintptr_t qemu_host_page_mask; + +/* This is a multi-level map on the virtual address space. + The bottom level has pointers to PageDesc. */ +static void *l1_map[V_L1_SIZE]; + +/* statistics */ +static int tb_flush_count; +static int tb_phys_invalidate_count; /* code generation context */ TCGContext tcg_ctx; +static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc, + tb_page_addr_t phys_page2); + void cpu_gen_init(void) { tcg_context_init(&tcg_ctx); @@ -155,3 +265,1612 @@ int cpu_restore_state(TranslationBlock *tb, #endif return 0; } + +#ifdef _WIN32 +static inline void map_exec(void *addr, long size) +{ + DWORD old_protect; + VirtualProtect(addr, size, + PAGE_EXECUTE_READWRITE, &old_protect); +} +#else +static inline void map_exec(void *addr, long size) +{ + unsigned long start, end, page_size; + + page_size = getpagesize(); + start = (unsigned long)addr; + start &= ~(page_size - 1); + + end = (unsigned long)addr + size; + end += page_size - 1; + end &= ~(page_size - 1); + + mprotect((void *)start, end - start, + PROT_READ | PROT_WRITE | PROT_EXEC); +} +#endif + +static void page_init(void) +{ + /* NOTE: we can always suppose that qemu_host_page_size >= + TARGET_PAGE_SIZE */ +#ifdef _WIN32 + { + SYSTEM_INFO system_info; + + GetSystemInfo(&system_info); + qemu_real_host_page_size = system_info.dwPageSize; + } +#else + qemu_real_host_page_size = getpagesize(); +#endif + if (qemu_host_page_size == 0) { + qemu_host_page_size = qemu_real_host_page_size; + } + if (qemu_host_page_size < TARGET_PAGE_SIZE) { + qemu_host_page_size = TARGET_PAGE_SIZE; + } + qemu_host_page_mask = ~(qemu_host_page_size - 1); + +#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY) + { +#ifdef HAVE_KINFO_GETVMMAP + struct kinfo_vmentry *freep; + int i, cnt; + + freep = kinfo_getvmmap(getpid(), &cnt); + if (freep) { + mmap_lock(); + for (i = 0; i < cnt; i++) { + unsigned long startaddr, endaddr; + + startaddr = freep[i].kve_start; + endaddr = freep[i].kve_end; + if (h2g_valid(startaddr)) { + startaddr = h2g(startaddr) & TARGET_PAGE_MASK; + + if (h2g_valid(endaddr)) { + endaddr = h2g(endaddr); + page_set_flags(startaddr, endaddr, PAGE_RESERVED); + } else { +#if TARGET_ABI_BITS <= L1_MAP_ADDR_SPACE_BITS + endaddr = ~0ul; + page_set_flags(startaddr, endaddr, PAGE_RESERVED); +#endif + } + } + } + free(freep); + mmap_unlock(); + } +#else + FILE *f; + + last_brk = (unsigned long)sbrk(0); + + f = fopen("/compat/linux/proc/self/maps", "r"); + if (f) { + mmap_lock(); + + do { + unsigned long startaddr, endaddr; + int n; + + n = fscanf(f, "%lx-%lx %*[^\n]\n", &startaddr, &endaddr); + + if (n == 2 && h2g_valid(startaddr)) { + startaddr = h2g(startaddr) & TARGET_PAGE_MASK; + + if (h2g_valid(endaddr)) { + endaddr = h2g(endaddr); + } else { + endaddr = ~0ul; + } + page_set_flags(startaddr, endaddr, PAGE_RESERVED); + } + } while (!feof(f)); + + fclose(f); + mmap_unlock(); + } +#endif + } +#endif +} + +static PageDesc *page_find_alloc(tb_page_addr_t index, int alloc) +{ + PageDesc *pd; + void **lp; + int i; + +#if defined(CONFIG_USER_ONLY) + /* We can't use g_malloc because it may recurse into a locked mutex. */ +# define ALLOC(P, SIZE) \ + do { \ + P = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, \ + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); \ + } while (0) +#else +# define ALLOC(P, SIZE) \ + do { P = g_malloc0(SIZE); } while (0) +#endif + + /* Level 1. Always allocated. */ + lp = l1_map + ((index >> V_L1_SHIFT) & (V_L1_SIZE - 1)); + + /* Level 2..N-1. */ + for (i = V_L1_SHIFT / L2_BITS - 1; i > 0; i--) { + void **p = *lp; + + if (p == NULL) { + if (!alloc) { + return NULL; + } + ALLOC(p, sizeof(void *) * L2_SIZE); + *lp = p; + } + + lp = p + ((index >> (i * L2_BITS)) & (L2_SIZE - 1)); + } + + pd = *lp; + if (pd == NULL) { + if (!alloc) { + return NULL; + } + ALLOC(pd, sizeof(PageDesc) * L2_SIZE); + *lp = pd; + } + +#undef ALLOC + + return pd + (index & (L2_SIZE - 1)); +} + +static inline PageDesc *page_find(tb_page_addr_t index) +{ + return page_find_alloc(index, 0); +} + +#if !defined(CONFIG_USER_ONLY) +#define mmap_lock() do { } while (0) +#define mmap_unlock() do { } while (0) +#endif + +#if defined(CONFIG_USER_ONLY) +/* Currently it is not recommended to allocate big chunks of data in + user mode. It will change when a dedicated libc will be used. */ +/* ??? 64-bit hosts ought to have no problem mmaping data outside the + region in which the guest needs to run. Revisit this. */ +#define USE_STATIC_CODE_GEN_BUFFER +#endif + +/* ??? Should configure for this, not list operating systems here. */ +#if (defined(__linux__) \ + || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \ + || defined(__DragonFly__) || defined(__OpenBSD__) \ + || defined(__NetBSD__)) +# define USE_MMAP +#endif + +/* Minimum size of the code gen buffer. This number is randomly chosen, + but not so small that we can't have a fair number of TB's live. */ +#define MIN_CODE_GEN_BUFFER_SIZE (1024u * 1024) + +/* Maximum size of the code gen buffer we'd like to use. Unless otherwise + indicated, this is constrained by the range of direct branches on the + host cpu, as used by the TCG implementation of goto_tb. */ +#if defined(__x86_64__) +# define MAX_CODE_GEN_BUFFER_SIZE (2ul * 1024 * 1024 * 1024) +#elif defined(__sparc__) +# define MAX_CODE_GEN_BUFFER_SIZE (2ul * 1024 * 1024 * 1024) +#elif defined(__arm__) +# define MAX_CODE_GEN_BUFFER_SIZE (16u * 1024 * 1024) +#elif defined(__s390x__) + /* We have a +- 4GB range on the branches; leave some slop. */ +# define MAX_CODE_GEN_BUFFER_SIZE (3ul * 1024 * 1024 * 1024) +#else +# define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1) +#endif + +#define DEFAULT_CODE_GEN_BUFFER_SIZE_1 (32u * 1024 * 1024) + +#define DEFAULT_CODE_GEN_BUFFER_SIZE \ + (DEFAULT_CODE_GEN_BUFFER_SIZE_1 < MAX_CODE_GEN_BUFFER_SIZE \ + ? DEFAULT_CODE_GEN_BUFFER_SIZE_1 : MAX_CODE_GEN_BUFFER_SIZE) + +static inline size_t size_code_gen_buffer(size_t tb_size) +{ + /* Size the buffer. */ + if (tb_size == 0) { +#ifdef USE_STATIC_CODE_GEN_BUFFER + tb_size = DEFAULT_CODE_GEN_BUFFER_SIZE; +#else + /* ??? Needs adjustments. */ + /* ??? If we relax the requirement that CONFIG_USER_ONLY use the + static buffer, we could size this on RESERVED_VA, on the text + segment size of the executable, or continue to use the default. */ + tb_size = (unsigned long)(ram_size / 4); +#endif + } + if (tb_size < MIN_CODE_GEN_BUFFER_SIZE) { + tb_size = MIN_CODE_GEN_BUFFER_SIZE; + } + if (tb_size > MAX_CODE_GEN_BUFFER_SIZE) { + tb_size = MAX_CODE_GEN_BUFFER_SIZE; + } + code_gen_buffer_size = tb_size; + return tb_size; +} + +#ifdef USE_STATIC_CODE_GEN_BUFFER +static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE] + __attribute__((aligned(CODE_GEN_ALIGN))); + +static inline void *alloc_code_gen_buffer(void) +{ + map_exec(static_code_gen_buffer, code_gen_buffer_size); + return static_code_gen_buffer; +} +#elif defined(USE_MMAP) +static inline void *alloc_code_gen_buffer(void) +{ + int flags = MAP_PRIVATE | MAP_ANONYMOUS; + uintptr_t start = 0; + void *buf; + + /* Constrain the position of the buffer based on the host cpu. + Note that these addresses are chosen in concert with the + addresses assigned in the relevant linker script file. */ +# if defined(__PIE__) || defined(__PIC__) + /* Don't bother setting a preferred location if we're building + a position-independent executable. We're more likely to get + an address near the main executable if we let the kernel + choose the address. */ +# elif defined(__x86_64__) && defined(MAP_32BIT) + /* Force the memory down into low memory with the executable. + Leave the choice of exact location with the kernel. */ + flags |= MAP_32BIT; + /* Cannot expect to map more than 800MB in low memory. */ + if (code_gen_buffer_size > 800u * 1024 * 1024) { + code_gen_buffer_size = 800u * 1024 * 1024; + } +# elif defined(__sparc__) + start = 0x40000000ul; +# elif defined(__s390x__) + start = 0x90000000ul; +# endif + + buf = mmap((void *)start, code_gen_buffer_size, + PROT_WRITE | PROT_READ | PROT_EXEC, flags, -1, 0); + return buf == MAP_FAILED ? NULL : buf; +} +#else +static inline void *alloc_code_gen_buffer(void) +{ + void *buf = g_malloc(code_gen_buffer_size); + + if (buf) { + map_exec(buf, code_gen_buffer_size); + } + return buf; +} +#endif /* USE_STATIC_CODE_GEN_BUFFER, USE_MMAP */ + +static inline void code_gen_alloc(size_t tb_size) +{ + code_gen_buffer_size = size_code_gen_buffer(tb_size); + code_gen_buffer = alloc_code_gen_buffer(); + if (code_gen_buffer == NULL) { + fprintf(stderr, "Could not allocate dynamic translator buffer\n"); + exit(1); + } + + qemu_madvise(code_gen_buffer, code_gen_buffer_size, QEMU_MADV_HUGEPAGE); + + /* Steal room for the prologue at the end of the buffer. This ensures + (via the MAX_CODE_GEN_BUFFER_SIZE limits above) that direct branches + from TB's to the prologue are going to be in range. It also means + that we don't need to mark (additional) portions of the data segment + as executable. */ + code_gen_prologue = code_gen_buffer + code_gen_buffer_size - 1024; + code_gen_buffer_size -= 1024; + + code_gen_buffer_max_size = code_gen_buffer_size - + (TCG_MAX_OP_SIZE * OPC_BUF_SIZE); + code_gen_max_blocks = code_gen_buffer_size / CODE_GEN_AVG_BLOCK_SIZE; + tbs = g_malloc(code_gen_max_blocks * sizeof(TranslationBlock)); +} + +/* Must be called before using the QEMU cpus. 'tb_size' is the size + (in bytes) allocated to the translation buffer. Zero means default + size. */ +void tcg_exec_init(unsigned long tb_size) +{ + cpu_gen_init(); + code_gen_alloc(tb_size); + code_gen_ptr = code_gen_buffer; + tcg_register_jit(code_gen_buffer, code_gen_buffer_size); + page_init(); +#if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE) + /* There's no guest base to take into account, so go ahead and + initialize the prologue now. */ + tcg_prologue_init(&tcg_ctx); +#endif +} + +bool tcg_enabled(void) +{ + return code_gen_buffer != NULL; +} + +/* Allocate a new translation block. Flush the translation buffer if + too many translation blocks or too much generated code. */ +static TranslationBlock *tb_alloc(target_ulong pc) +{ + TranslationBlock *tb; + + if (nb_tbs >= code_gen_max_blocks || + (code_gen_ptr - code_gen_buffer) >= code_gen_buffer_max_size) { + return NULL; + } + tb = &tbs[nb_tbs++]; + tb->pc = pc; + tb->cflags = 0; + return tb; +} + +void tb_free(TranslationBlock *tb) +{ + /* In practice this is mostly used for single use temporary TB + Ignore the hard cases and just back up if this TB happens to + be the last one generated. */ + if (nb_tbs > 0 && tb == &tbs[nb_tbs - 1]) { + code_gen_ptr = tb->tc_ptr; + nb_tbs--; + } +} + +static inline void invalidate_page_bitmap(PageDesc *p) +{ + if (p->code_bitmap) { + g_free(p->code_bitmap); + p->code_bitmap = NULL; + } + p->code_write_count = 0; +} + +/* Set to NULL all the 'first_tb' fields in all PageDescs. */ +static void page_flush_tb_1(int level, void **lp) +{ + int i; + + if (*lp == NULL) { + return; + } + if (level == 0) { + PageDesc *pd = *lp; + + for (i = 0; i < L2_SIZE; ++i) { + pd[i].first_tb = NULL; + invalidate_page_bitmap(pd + i); + } + } else { + void **pp = *lp; + + for (i = 0; i < L2_SIZE; ++i) { + page_flush_tb_1(level - 1, pp + i); + } + } +} + +static void page_flush_tb(void) +{ + int i; + + for (i = 0; i < V_L1_SIZE; i++) { + page_flush_tb_1(V_L1_SHIFT / L2_BITS - 1, l1_map + i); + } +} + +/* flush all the translation blocks */ +/* XXX: tb_flush is currently not thread safe */ +void tb_flush(CPUArchState *env1) +{ + CPUArchState *env; + +#if defined(DEBUG_FLUSH) + printf("qemu: flush code_size=%ld nb_tbs=%d avg_tb_size=%ld\n", + (unsigned long)(code_gen_ptr - code_gen_buffer), + nb_tbs, nb_tbs > 0 ? + ((unsigned long)(code_gen_ptr - code_gen_buffer)) / nb_tbs : 0); +#endif + if ((unsigned long)(code_gen_ptr - code_gen_buffer) + > code_gen_buffer_size) { + cpu_abort(env1, "Internal error: code buffer overflow\n"); + } + nb_tbs = 0; + + for (env = first_cpu; env != NULL; env = env->next_cpu) { + memset(env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof(void *)); + } + + memset(tb_phys_hash, 0, CODE_GEN_PHYS_HASH_SIZE * sizeof(void *)); + page_flush_tb(); + + code_gen_ptr = code_gen_buffer; + /* XXX: flush processor icache at this point if cache flush is + expensive */ + tb_flush_count++; +} + +#ifdef DEBUG_TB_CHECK + +static void tb_invalidate_check(target_ulong address) +{ + TranslationBlock *tb; + int i; + + address &= TARGET_PAGE_MASK; + for (i = 0; i < CODE_GEN_PHYS_HASH_SIZE; i++) { + for (tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) { + if (!(address + TARGET_PAGE_SIZE <= tb->pc || + address >= tb->pc + tb->size)) { + printf("ERROR invalidate: address=" TARGET_FMT_lx + " PC=%08lx size=%04x\n", + address, (long)tb->pc, tb->size); + } + } + } +} + +/* verify that all the pages have correct rights for code */ +static void tb_page_check(void) +{ + TranslationBlock *tb; + int i, flags1, flags2; + + for (i = 0; i < CODE_GEN_PHYS_HASH_SIZE; i++) { + for (tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) { + flags1 = page_get_flags(tb->pc); + flags2 = page_get_flags(tb->pc + tb->size - 1); + if ((flags1 & PAGE_WRITE) || (flags2 & PAGE_WRITE)) { + printf("ERROR page flags: PC=%08lx size=%04x f1=%x f2=%x\n", + (long)tb->pc, tb->size, flags1, flags2); + } + } + } +} + +#endif + +/* invalidate one TB */ +static inline void tb_remove(TranslationBlock **ptb, TranslationBlock *tb, + int next_offset) +{ + TranslationBlock *tb1; + + for (;;) { + tb1 = *ptb; + if (tb1 == tb) { + *ptb = *(TranslationBlock **)((char *)tb1 + next_offset); + break; + } + ptb = (TranslationBlock **)((char *)tb1 + next_offset); + } +} + +static inline void tb_page_remove(TranslationBlock **ptb, TranslationBlock *tb) +{ + TranslationBlock *tb1; + unsigned int n1; + + for (;;) { + tb1 = *ptb; + n1 = (uintptr_t)tb1 & 3; + tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); + if (tb1 == tb) { + *ptb = tb1->page_next[n1]; + break; + } + ptb = &tb1->page_next[n1]; + } +} + +static inline void tb_jmp_remove(TranslationBlock *tb, int n) +{ + TranslationBlock *tb1, **ptb; + unsigned int n1; + + ptb = &tb->jmp_next[n]; + tb1 = *ptb; + if (tb1) { + /* find tb(n) in circular list */ + for (;;) { + tb1 = *ptb; + n1 = (uintptr_t)tb1 & 3; + tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); + if (n1 == n && tb1 == tb) { + break; + } + if (n1 == 2) { + ptb = &tb1->jmp_first; + } else { + ptb = &tb1->jmp_next[n1]; + } + } + /* now we can suppress tb(n) from the list */ + *ptb = tb->jmp_next[n]; + + tb->jmp_next[n] = NULL; + } +} + +/* reset the jump entry 'n' of a TB so that it is not chained to + another TB */ +static inline void tb_reset_jump(TranslationBlock *tb, int n) +{ + tb_set_jmp_target(tb, n, (uintptr_t)(tb->tc_ptr + tb->tb_next_offset[n])); +} + +void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr) +{ + CPUArchState *env; + PageDesc *p; + unsigned int h, n1; + tb_page_addr_t phys_pc; + TranslationBlock *tb1, *tb2; + + /* remove the TB from the hash list */ + phys_pc = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK); + h = tb_phys_hash_func(phys_pc); + tb_remove(&tb_phys_hash[h], tb, + offsetof(TranslationBlock, phys_hash_next)); + + /* remove the TB from the page list */ + if (tb->page_addr[0] != page_addr) { + p = page_find(tb->page_addr[0] >> TARGET_PAGE_BITS); + tb_page_remove(&p->first_tb, tb); + invalidate_page_bitmap(p); + } + if (tb->page_addr[1] != -1 && tb->page_addr[1] != page_addr) { + p = page_find(tb->page_addr[1] >> TARGET_PAGE_BITS); + tb_page_remove(&p->first_tb, tb); + invalidate_page_bitmap(p); + } + + tb_invalidated_flag = 1; + + /* remove the TB from the hash list */ + h = tb_jmp_cache_hash_func(tb->pc); + for (env = first_cpu; env != NULL; env = env->next_cpu) { + if (env->tb_jmp_cache[h] == tb) { + env->tb_jmp_cache[h] = NULL; + } + } + + /* suppress this TB from the two jump lists */ + tb_jmp_remove(tb, 0); + tb_jmp_remove(tb, 1); + + /* suppress any remaining jumps to this TB */ + tb1 = tb->jmp_first; + for (;;) { + n1 = (uintptr_t)tb1 & 3; + if (n1 == 2) { + break; + } + tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); + tb2 = tb1->jmp_next[n1]; + tb_reset_jump(tb1, n1); + tb1->jmp_next[n1] = NULL; + tb1 = tb2; + } + tb->jmp_first = (TranslationBlock *)((uintptr_t)tb | 2); /* fail safe */ + + tb_phys_invalidate_count++; +} + +static inline void set_bits(uint8_t *tab, int start, int len) +{ + int end, mask, end1; + + end = start + len; + tab += start >> 3; + mask = 0xff << (start & 7); + if ((start & ~7) == (end & ~7)) { + if (start < end) { + mask &= ~(0xff << (end & 7)); + *tab |= mask; + } + } else { + *tab++ |= mask; + start = (start + 8) & ~7; + end1 = end & ~7; + while (start < end1) { + *tab++ = 0xff; + start += 8; + } + if (start < end) { + mask = ~(0xff << (end & 7)); + *tab |= mask; + } + } +} + +static void build_page_bitmap(PageDesc *p) +{ + int n, tb_start, tb_end; + TranslationBlock *tb; + + p->code_bitmap = g_malloc0(TARGET_PAGE_SIZE / 8); + + tb = p->first_tb; + while (tb != NULL) { + n = (uintptr_t)tb & 3; + tb = (TranslationBlock *)((uintptr_t)tb & ~3); + /* NOTE: this is subtle as a TB may span two physical pages */ + if (n == 0) { + /* NOTE: tb_end may be after the end of the page, but + it is not a problem */ + tb_start = tb->pc & ~TARGET_PAGE_MASK; + tb_end = tb_start + tb->size; + if (tb_end > TARGET_PAGE_SIZE) { + tb_end = TARGET_PAGE_SIZE; + } + } else { + tb_start = 0; + tb_end = ((tb->pc + tb->size) & ~TARGET_PAGE_MASK); + } + set_bits(p->code_bitmap, tb_start, tb_end - tb_start); + tb = tb->page_next[n]; + } +} + +TranslationBlock *tb_gen_code(CPUArchState *env, + target_ulong pc, target_ulong cs_base, + int flags, int cflags) +{ + TranslationBlock *tb; + uint8_t *tc_ptr; + tb_page_addr_t phys_pc, phys_page2; + target_ulong virt_page2; + int code_gen_size; + + phys_pc = get_page_addr_code(env, pc); + tb = tb_alloc(pc); + if (!tb) { + /* flush must be done */ + tb_flush(env); + /* cannot fail at this point */ + tb = tb_alloc(pc); + /* Don't forget to invalidate previous TB info. */ + tb_invalidated_flag = 1; + } + tc_ptr = code_gen_ptr; + tb->tc_ptr = tc_ptr; + tb->cs_base = cs_base; + tb->flags = flags; + tb->cflags = cflags; + cpu_gen_code(env, tb, &code_gen_size); + code_gen_ptr = (void *)(((uintptr_t)code_gen_ptr + code_gen_size + + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1)); + + /* check next page if needed */ + virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK; + phys_page2 = -1; + if ((pc & TARGET_PAGE_MASK) != virt_page2) { + phys_page2 = get_page_addr_code(env, virt_page2); + } + tb_link_page(tb, phys_pc, phys_page2); + return tb; +} + +/* + * Invalidate all TBs which intersect with the target physical address range + * [start;end[. NOTE: start and end may refer to *different* physical pages. + * 'is_cpu_write_access' should be true if called from a real cpu write + * access: the virtual CPU will exit the current TB if code is modified inside + * this TB. + */ +void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t end, + int is_cpu_write_access) +{ + while (start < end) { + tb_invalidate_phys_page_range(start, end, is_cpu_write_access); + start &= TARGET_PAGE_MASK; + start += TARGET_PAGE_SIZE; + } +} + +/* + * Invalidate all TBs which intersect with the target physical address range + * [start;end[. NOTE: start and end must refer to the *same* physical page. + * 'is_cpu_write_access' should be true if called from a real cpu write + * access: the virtual CPU will exit the current TB if code is modified inside + * this TB. + */ +void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end, + int is_cpu_write_access) +{ + TranslationBlock *tb, *tb_next, *saved_tb; + CPUArchState *env = cpu_single_env; + tb_page_addr_t tb_start, tb_end; + PageDesc *p; + int n; +#ifdef TARGET_HAS_PRECISE_SMC + int current_tb_not_found = is_cpu_write_access; + TranslationBlock *current_tb = NULL; + int current_tb_modified = 0; + target_ulong current_pc = 0; + target_ulong current_cs_base = 0; + int current_flags = 0; +#endif /* TARGET_HAS_PRECISE_SMC */ + + p = page_find(start >> TARGET_PAGE_BITS); + if (!p) { + return; + } + if (!p->code_bitmap && + ++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD && + is_cpu_write_access) { + /* build code bitmap */ + build_page_bitmap(p); + } + + /* we remove all the TBs in the range [start, end[ */ + /* XXX: see if in some cases it could be faster to invalidate all + the code */ + tb = p->first_tb; + while (tb != NULL) { + n = (uintptr_t)tb & 3; + tb = (TranslationBlock *)((uintptr_t)tb & ~3); + tb_next = tb->page_next[n]; + /* NOTE: this is subtle as a TB may span two physical pages */ + if (n == 0) { + /* NOTE: tb_end may be after the end of the page, but + it is not a problem */ + tb_start = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK); + tb_end = tb_start + tb->size; + } else { + tb_start = tb->page_addr[1]; + tb_end = tb_start + ((tb->pc + tb->size) & ~TARGET_PAGE_MASK); + } + if (!(tb_end <= start || tb_start >= end)) { +#ifdef TARGET_HAS_PRECISE_SMC + if (current_tb_not_found) { + current_tb_not_found = 0; + current_tb = NULL; + if (env->mem_io_pc) { + /* now we have a real cpu fault */ + current_tb = tb_find_pc(env->mem_io_pc); + } + } + if (current_tb == tb && + (current_tb->cflags & CF_COUNT_MASK) != 1) { + /* If we are modifying the current TB, we must stop + its execution. We could be more precise by checking + that the modification is after the current PC, but it + would require a specialized function to partially + restore the CPU state */ + + current_tb_modified = 1; + cpu_restore_state(current_tb, env, env->mem_io_pc); + cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base, + ¤t_flags); + } +#endif /* TARGET_HAS_PRECISE_SMC */ + /* we need to do that to handle the case where a signal + occurs while doing tb_phys_invalidate() */ + saved_tb = NULL; + if (env) { + saved_tb = env->current_tb; + env->current_tb = NULL; + } + tb_phys_invalidate(tb, -1); + if (env) { + env->current_tb = saved_tb; + if (env->interrupt_request && env->current_tb) { + cpu_interrupt(env, env->interrupt_request); + } + } + } + tb = tb_next; + } +#if !defined(CONFIG_USER_ONLY) + /* if no code remaining, no need to continue to use slow writes */ + if (!p->first_tb) { + invalidate_page_bitmap(p); + if (is_cpu_write_access) { + tlb_unprotect_code_phys(env, start, env->mem_io_vaddr); + } + } +#endif +#ifdef TARGET_HAS_PRECISE_SMC + if (current_tb_modified) { + /* we generate a block containing just the instruction + modifying the memory. It will ensure that it cannot modify + itself */ + env->current_tb = NULL; + tb_gen_code(env, current_pc, current_cs_base, current_flags, 1); + cpu_resume_from_signal(env, NULL); + } +#endif +} + +/* len must be <= 8 and start must be a multiple of len */ +void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len) +{ + PageDesc *p; + int offset, b; + +#if 0 + if (1) { + qemu_log("modifying code at 0x%x size=%d EIP=%x PC=%08x\n", + cpu_single_env->mem_io_vaddr, len, + cpu_single_env->eip, + cpu_single_env->eip + + (intptr_t)cpu_single_env->segs[R_CS].base); + } +#endif + p = page_find(start >> TARGET_PAGE_BITS); + if (!p) { + return; + } + if (p->code_bitmap) { + offset = start & ~TARGET_PAGE_MASK; + b = p->code_bitmap[offset >> 3] >> (offset & 7); + if (b & ((1 << len) - 1)) { + goto do_invalidate; + } + } else { + do_invalidate: + tb_invalidate_phys_page_range(start, start + len, 1); + } +} + +#if !defined(CONFIG_SOFTMMU) +static void tb_invalidate_phys_page(tb_page_addr_t addr, + uintptr_t pc, void *puc) +{ + TranslationBlock *tb; + PageDesc *p; + int n; +#ifdef TARGET_HAS_PRECISE_SMC + TranslationBlock *current_tb = NULL; + CPUArchState *env = cpu_single_env; + int current_tb_modified = 0; + target_ulong current_pc = 0; + target_ulong current_cs_base = 0; + int current_flags = 0; +#endif + + addr &= TARGET_PAGE_MASK; + p = page_find(addr >> TARGET_PAGE_BITS); + if (!p) { + return; + } + tb = p->first_tb; +#ifdef TARGET_HAS_PRECISE_SMC + if (tb && pc != 0) { + current_tb = tb_find_pc(pc); + } +#endif + while (tb != NULL) { + n = (uintptr_t)tb & 3; + tb = (TranslationBlock *)((uintptr_t)tb & ~3); +#ifdef TARGET_HAS_PRECISE_SMC + if (current_tb == tb && + (current_tb->cflags & CF_COUNT_MASK) != 1) { + /* If we are modifying the current TB, we must stop + its execution. We could be more precise by checking + that the modification is after the current PC, but it + would require a specialized function to partially + restore the CPU state */ + + current_tb_modified = 1; + cpu_restore_state(current_tb, env, pc); + cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base, + ¤t_flags); + } +#endif /* TARGET_HAS_PRECISE_SMC */ + tb_phys_invalidate(tb, addr); + tb = tb->page_next[n]; + } + p->first_tb = NULL; +#ifdef TARGET_HAS_PRECISE_SMC + if (current_tb_modified) { + /* we generate a block containing just the instruction + modifying the memory. It will ensure that it cannot modify + itself */ + env->current_tb = NULL; + tb_gen_code(env, current_pc, current_cs_base, current_flags, 1); + cpu_resume_from_signal(env, puc); + } +#endif +} +#endif + +/* add the tb in the target page and protect it if necessary */ +static inline void tb_alloc_page(TranslationBlock *tb, + unsigned int n, tb_page_addr_t page_addr) +{ + PageDesc *p; +#ifndef CONFIG_USER_ONLY + bool page_already_protected; +#endif + + tb->page_addr[n] = page_addr; + p = page_find_alloc(page_addr >> TARGET_PAGE_BITS, 1); + tb->page_next[n] = p->first_tb; +#ifndef CONFIG_USER_ONLY + page_already_protected = p->first_tb != NULL; +#endif + p->first_tb = (TranslationBlock *)((uintptr_t)tb | n); + invalidate_page_bitmap(p); + +#if defined(TARGET_HAS_SMC) || 1 + +#if defined(CONFIG_USER_ONLY) + if (p->flags & PAGE_WRITE) { + target_ulong addr; + PageDesc *p2; + int prot; + + /* force the host page as non writable (writes will have a + page fault + mprotect overhead) */ + page_addr &= qemu_host_page_mask; + prot = 0; + for (addr = page_addr; addr < page_addr + qemu_host_page_size; + addr += TARGET_PAGE_SIZE) { + + p2 = page_find(addr >> TARGET_PAGE_BITS); + if (!p2) { + continue; + } + prot |= p2->flags; + p2->flags &= ~PAGE_WRITE; + } + mprotect(g2h(page_addr), qemu_host_page_size, + (prot & PAGE_BITS) & ~PAGE_WRITE); +#ifdef DEBUG_TB_INVALIDATE + printf("protecting code page: 0x" TARGET_FMT_lx "\n", + page_addr); +#endif + } +#else + /* if some code is already present, then the pages are already + protected. So we handle the case where only the first TB is + allocated in a physical page */ + if (!page_already_protected) { + tlb_protect_code(page_addr); + } +#endif + +#endif /* TARGET_HAS_SMC */ +} + +/* add a new TB and link it to the physical page tables. phys_page2 is + (-1) to indicate that only one page contains the TB. */ +static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc, + tb_page_addr_t phys_page2) +{ + unsigned int h; + TranslationBlock **ptb; + + /* Grab the mmap lock to stop another thread invalidating this TB + before we are done. */ + mmap_lock(); + /* add in the physical hash table */ + h = tb_phys_hash_func(phys_pc); + ptb = &tb_phys_hash[h]; + tb->phys_hash_next = *ptb; + *ptb = tb; + + /* add in the page list */ + tb_alloc_page(tb, 0, phys_pc & TARGET_PAGE_MASK); + if (phys_page2 != -1) { + tb_alloc_page(tb, 1, phys_page2); + } else { + tb->page_addr[1] = -1; + } + + tb->jmp_first = (TranslationBlock *)((uintptr_t)tb | 2); + tb->jmp_next[0] = NULL; + tb->jmp_next[1] = NULL; + + /* init original jump addresses */ + if (tb->tb_next_offset[0] != 0xffff) { + tb_reset_jump(tb, 0); + } + if (tb->tb_next_offset[1] != 0xffff) { + tb_reset_jump(tb, 1); + } + +#ifdef DEBUG_TB_CHECK + tb_page_check(); +#endif + mmap_unlock(); +} + +#if defined(CONFIG_QEMU_LDST_OPTIMIZATION) && defined(CONFIG_SOFTMMU) +/* check whether the given addr is in TCG generated code buffer or not */ +bool is_tcg_gen_code(uintptr_t tc_ptr) +{ + /* This can be called during code generation, code_gen_buffer_max_size + is used instead of code_gen_ptr for upper boundary checking */ + return (tc_ptr >= (uintptr_t)code_gen_buffer && + tc_ptr < (uintptr_t)(code_gen_buffer + code_gen_buffer_max_size)); +} +#endif + +/* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr < + tb[1].tc_ptr. Return NULL if not found */ +TranslationBlock *tb_find_pc(uintptr_t tc_ptr) +{ + int m_min, m_max, m; + uintptr_t v; + TranslationBlock *tb; + + if (nb_tbs <= 0) { + return NULL; + } + if (tc_ptr < (uintptr_t)code_gen_buffer || + tc_ptr >= (uintptr_t)code_gen_ptr) { + return NULL; + } + /* binary search (cf Knuth) */ + m_min = 0; + m_max = nb_tbs - 1; + while (m_min <= m_max) { + m = (m_min + m_max) >> 1; + tb = &tbs[m]; + v = (uintptr_t)tb->tc_ptr; + if (v == tc_ptr) { + return tb; + } else if (tc_ptr < v) { + m_max = m - 1; + } else { + m_min = m + 1; + } + } + return &tbs[m_max]; +} + +static void tb_reset_jump_recursive(TranslationBlock *tb); + +static inline void tb_reset_jump_recursive2(TranslationBlock *tb, int n) +{ + TranslationBlock *tb1, *tb_next, **ptb; + unsigned int n1; + + tb1 = tb->jmp_next[n]; + if (tb1 != NULL) { + /* find head of list */ + for (;;) { + n1 = (uintptr_t)tb1 & 3; + tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); + if (n1 == 2) { + break; + } + tb1 = tb1->jmp_next[n1]; + } + /* we are now sure now that tb jumps to tb1 */ + tb_next = tb1; + + /* remove tb from the jmp_first list */ + ptb = &tb_next->jmp_first; + for (;;) { + tb1 = *ptb; + n1 = (uintptr_t)tb1 & 3; + tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); + if (n1 == n && tb1 == tb) { + break; + } + ptb = &tb1->jmp_next[n1]; + } + *ptb = tb->jmp_next[n]; + tb->jmp_next[n] = NULL; + + /* suppress the jump to next tb in generated code */ + tb_reset_jump(tb, n); + + /* suppress jumps in the tb on which we could have jumped */ + tb_reset_jump_recursive(tb_next); + } +} + +static void tb_reset_jump_recursive(TranslationBlock *tb) +{ + tb_reset_jump_recursive2(tb, 0); + tb_reset_jump_recursive2(tb, 1); +} + +#if defined(TARGET_HAS_ICE) && !defined(CONFIG_USER_ONLY) +void tb_invalidate_phys_addr(hwaddr addr) +{ + ram_addr_t ram_addr; + MemoryRegionSection *section; + + section = phys_page_find(address_space_memory.dispatch, + addr >> TARGET_PAGE_BITS); + if (!(memory_region_is_ram(section->mr) + || (section->mr->rom_device && section->mr->readable))) { + return; + } + ram_addr = (memory_region_get_ram_addr(section->mr) & TARGET_PAGE_MASK) + + memory_region_section_addr(section, addr); + tb_invalidate_phys_page_range(ram_addr, ram_addr + 1, 0); +} +#endif /* TARGET_HAS_ICE && !defined(CONFIG_USER_ONLY) */ + +void cpu_unlink_tb(CPUArchState *env) +{ + /* FIXME: TB unchaining isn't SMP safe. For now just ignore the + problem and hope the cpu will stop of its own accord. For userspace + emulation this often isn't actually as bad as it sounds. Often + signals are used primarily to interrupt blocking syscalls. */ + TranslationBlock *tb; + static spinlock_t interrupt_lock = SPIN_LOCK_UNLOCKED; + + spin_lock(&interrupt_lock); + tb = env->current_tb; + /* if the cpu is currently executing code, we must unlink it and + all the potentially executing TB */ + if (tb) { + env->current_tb = NULL; + tb_reset_jump_recursive(tb); + } + spin_unlock(&interrupt_lock); +} + +void tb_check_watchpoint(CPUArchState *env) +{ + TranslationBlock *tb; + + tb = tb_find_pc(env->mem_io_pc); + if (!tb) { + cpu_abort(env, "check_watchpoint: could not find TB for pc=%p", + (void *)env->mem_io_pc); + } + cpu_restore_state(tb, env, env->mem_io_pc); + tb_phys_invalidate(tb, -1); +} + +#ifndef CONFIG_USER_ONLY +/* mask must never be zero, except for A20 change call */ +static void tcg_handle_interrupt(CPUArchState *env, int mask) +{ + CPUState *cpu = ENV_GET_CPU(env); + int old_mask; + + old_mask = env->interrupt_request; + env->interrupt_request |= mask; + + /* + * If called from iothread context, wake the target cpu in + * case its halted. + */ + if (!qemu_cpu_is_self(cpu)) { + qemu_cpu_kick(cpu); + return; + } + + if (use_icount) { + env->icount_decr.u16.high = 0xffff; + if (!can_do_io(env) + && (mask & ~old_mask) != 0) { + cpu_abort(env, "Raised interrupt while not in I/O function"); + } + } else { + cpu_unlink_tb(env); + } +} + +CPUInterruptHandler cpu_interrupt_handler = tcg_handle_interrupt; + +/* in deterministic execution mode, instructions doing device I/Os + must be at the end of the TB */ +void cpu_io_recompile(CPUArchState *env, uintptr_t retaddr) +{ + TranslationBlock *tb; + uint32_t n, cflags; + target_ulong pc, cs_base; + uint64_t flags; + + tb = tb_find_pc(retaddr); + if (!tb) { + cpu_abort(env, "cpu_io_recompile: could not find TB for pc=%p", + (void *)retaddr); + } + n = env->icount_decr.u16.low + tb->icount; + cpu_restore_state(tb, env, retaddr); + /* Calculate how many instructions had been executed before the fault + occurred. */ + n = n - env->icount_decr.u16.low; + /* Generate a new TB ending on the I/O insn. */ + n++; + /* On MIPS and SH, delay slot instructions can only be restarted if + they were already the first instruction in the TB. If this is not + the first instruction in a TB then re-execute the preceding + branch. */ +#if defined(TARGET_MIPS) + if ((env->hflags & MIPS_HFLAG_BMASK) != 0 && n > 1) { + env->active_tc.PC -= 4; + env->icount_decr.u16.low++; + env->hflags &= ~MIPS_HFLAG_BMASK; + } +#elif defined(TARGET_SH4) + if ((env->flags & ((DELAY_SLOT | DELAY_SLOT_CONDITIONAL))) != 0 + && n > 1) { + env->pc -= 2; + env->icount_decr.u16.low++; + env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL); + } +#endif + /* This should never happen. */ + if (n > CF_COUNT_MASK) { + cpu_abort(env, "TB too big during recompile"); + } + + cflags = n | CF_LAST_IO; + pc = tb->pc; + cs_base = tb->cs_base; + flags = tb->flags; + tb_phys_invalidate(tb, -1); + /* FIXME: In theory this could raise an exception. In practice + we have already translated the block once so it's probably ok. */ + tb_gen_code(env, pc, cs_base, flags, cflags); + /* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not + the first in the TB) then we end up generating a whole new TB and + repeating the fault, which is horribly inefficient. + Better would be to execute just this insn uncached, or generate a + second new TB. */ + cpu_resume_from_signal(env, NULL); +} + +void tb_flush_jmp_cache(CPUArchState *env, target_ulong addr) +{ + unsigned int i; + + /* Discard jump cache entries for any tb which might potentially + overlap the flushed page. */ + i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE); + memset(&env->tb_jmp_cache[i], 0, + TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *)); + + i = tb_jmp_cache_hash_page(addr); + memset(&env->tb_jmp_cache[i], 0, + TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *)); +} + +void dump_exec_info(FILE *f, fprintf_function cpu_fprintf) +{ + int i, target_code_size, max_target_code_size; + int direct_jmp_count, direct_jmp2_count, cross_page; + TranslationBlock *tb; + + target_code_size = 0; + max_target_code_size = 0; + cross_page = 0; + direct_jmp_count = 0; + direct_jmp2_count = 0; + for (i = 0; i < nb_tbs; i++) { + tb = &tbs[i]; + target_code_size += tb->size; + if (tb->size > max_target_code_size) { + max_target_code_size = tb->size; + } + if (tb->page_addr[1] != -1) { + cross_page++; + } + if (tb->tb_next_offset[0] != 0xffff) { + direct_jmp_count++; + if (tb->tb_next_offset[1] != 0xffff) { + direct_jmp2_count++; + } + } + } + /* XXX: avoid using doubles ? */ + cpu_fprintf(f, "Translation buffer state:\n"); + cpu_fprintf(f, "gen code size %td/%zd\n", + code_gen_ptr - code_gen_buffer, code_gen_buffer_max_size); + cpu_fprintf(f, "TB count %d/%d\n", + nb_tbs, code_gen_max_blocks); + cpu_fprintf(f, "TB avg target size %d max=%d bytes\n", + nb_tbs ? target_code_size / nb_tbs : 0, + max_target_code_size); + cpu_fprintf(f, "TB avg host size %td bytes (expansion ratio: %0.1f)\n", + nb_tbs ? (code_gen_ptr - code_gen_buffer) / nb_tbs : 0, + target_code_size ? (double) (code_gen_ptr - code_gen_buffer) + / target_code_size : 0); + cpu_fprintf(f, "cross page TB count %d (%d%%)\n", + cross_page, + nb_tbs ? (cross_page * 100) / nb_tbs : 0); + cpu_fprintf(f, "direct jump count %d (%d%%) (2 jumps=%d %d%%)\n", + direct_jmp_count, + nb_tbs ? (direct_jmp_count * 100) / nb_tbs : 0, + direct_jmp2_count, + nb_tbs ? (direct_jmp2_count * 100) / nb_tbs : 0); + cpu_fprintf(f, "\nStatistics:\n"); + cpu_fprintf(f, "TB flush count %d\n", tb_flush_count); + cpu_fprintf(f, "TB invalidate count %d\n", tb_phys_invalidate_count); + cpu_fprintf(f, "TLB flush count %d\n", tlb_flush_count); + tcg_dump_info(f, cpu_fprintf); +} + +#else /* CONFIG_USER_ONLY */ + +void cpu_interrupt(CPUArchState *env, int mask) +{ + env->interrupt_request |= mask; + cpu_unlink_tb(env); +} + +/* + * Walks guest process memory "regions" one by one + * and calls callback function 'fn' for each region. + */ +struct walk_memory_regions_data { + walk_memory_regions_fn fn; + void *priv; + uintptr_t start; + int prot; +}; + +static int walk_memory_regions_end(struct walk_memory_regions_data *data, + abi_ulong end, int new_prot) +{ + if (data->start != -1ul) { + int rc = data->fn(data->priv, data->start, end, data->prot); + if (rc != 0) { + return rc; + } + } + + data->start = (new_prot ? end : -1ul); + data->prot = new_prot; + + return 0; +} + +static int walk_memory_regions_1(struct walk_memory_regions_data *data, + abi_ulong base, int level, void **lp) +{ + abi_ulong pa; + int i, rc; + + if (*lp == NULL) { + return walk_memory_regions_end(data, base, 0); + } + + if (level == 0) { + PageDesc *pd = *lp; + + for (i = 0; i < L2_SIZE; ++i) { + int prot = pd[i].flags; + + pa = base | (i << TARGET_PAGE_BITS); + if (prot != data->prot) { + rc = walk_memory_regions_end(data, pa, prot); + if (rc != 0) { + return rc; + } + } + } + } else { + void **pp = *lp; + + for (i = 0; i < L2_SIZE; ++i) { + pa = base | ((abi_ulong)i << + (TARGET_PAGE_BITS + L2_BITS * level)); + rc = walk_memory_regions_1(data, pa, level - 1, pp + i); + if (rc != 0) { + return rc; + } + } + } + + return 0; +} + +int walk_memory_regions(void *priv, walk_memory_regions_fn fn) +{ + struct walk_memory_regions_data data; + uintptr_t i; + + data.fn = fn; + data.priv = priv; + data.start = -1ul; + data.prot = 0; + + for (i = 0; i < V_L1_SIZE; i++) { + int rc = walk_memory_regions_1(&data, (abi_ulong)i << V_L1_SHIFT, + V_L1_SHIFT / L2_BITS - 1, l1_map + i); + + if (rc != 0) { + return rc; + } + } + + return walk_memory_regions_end(&data, 0, 0); +} + +static int dump_region(void *priv, abi_ulong start, + abi_ulong end, unsigned long prot) +{ + FILE *f = (FILE *)priv; + + (void) fprintf(f, TARGET_ABI_FMT_lx"-"TARGET_ABI_FMT_lx + " "TARGET_ABI_FMT_lx" %c%c%c\n", + start, end, end - start, + ((prot & PAGE_READ) ? 'r' : '-'), + ((prot & PAGE_WRITE) ? 'w' : '-'), + ((prot & PAGE_EXEC) ? 'x' : '-')); + + return 0; +} + +/* dump memory mappings */ +void page_dump(FILE *f) +{ + (void) fprintf(f, "%-8s %-8s %-8s %s\n", + "start", "end", "size", "prot"); + walk_memory_regions(f, dump_region); +} + +int page_get_flags(target_ulong address) +{ + PageDesc *p; + + p = page_find(address >> TARGET_PAGE_BITS); + if (!p) { + return 0; + } + return p->flags; +} + +/* Modify the flags of a page and invalidate the code if necessary. + The flag PAGE_WRITE_ORG is positioned automatically depending + on PAGE_WRITE. The mmap_lock should already be held. */ +void page_set_flags(target_ulong start, target_ulong end, int flags) +{ + target_ulong addr, len; + + /* This function should never be called with addresses outside the + guest address space. If this assert fires, it probably indicates + a missing call to h2g_valid. */ +#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS + assert(end < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS)); +#endif + assert(start < end); + + start = start & TARGET_PAGE_MASK; + end = TARGET_PAGE_ALIGN(end); + + if (flags & PAGE_WRITE) { + flags |= PAGE_WRITE_ORG; + } + + for (addr = start, len = end - start; + len != 0; + len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) { + PageDesc *p = page_find_alloc(addr >> TARGET_PAGE_BITS, 1); + + /* If the write protection bit is set, then we invalidate + the code inside. */ + if (!(p->flags & PAGE_WRITE) && + (flags & PAGE_WRITE) && + p->first_tb) { + tb_invalidate_phys_page(addr, 0, NULL); + } + p->flags = flags; + } +} + +int page_check_range(target_ulong start, target_ulong len, int flags) +{ + PageDesc *p; + target_ulong end; + target_ulong addr; + + /* This function should never be called with addresses outside the + guest address space. If this assert fires, it probably indicates + a missing call to h2g_valid. */ +#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS + assert(start < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS)); +#endif + + if (len == 0) { + return 0; + } + if (start + len - 1 < start) { + /* We've wrapped around. */ + return -1; + } + + /* must do before we loose bits in the next step */ + end = TARGET_PAGE_ALIGN(start + len); + start = start & TARGET_PAGE_MASK; + + for (addr = start, len = end - start; + len != 0; + len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) { + p = page_find(addr >> TARGET_PAGE_BITS); + if (!p) { + return -1; + } + if (!(p->flags & PAGE_VALID)) { + return -1; + } + + if ((flags & PAGE_READ) && !(p->flags & PAGE_READ)) { + return -1; + } + if (flags & PAGE_WRITE) { + if (!(p->flags & PAGE_WRITE_ORG)) { + return -1; + } + /* unprotect the page if it was put read-only because it + contains translated code */ + if (!(p->flags & PAGE_WRITE)) { + if (!page_unprotect(addr, 0, NULL)) { + return -1; + } + } + return 0; + } + } + return 0; +} + +/* called from signal handler: invalidate the code and unprotect the + page. Return TRUE if the fault was successfully handled. */ +int page_unprotect(target_ulong address, uintptr_t pc, void *puc) +{ + unsigned int prot; + PageDesc *p; + target_ulong host_start, host_end, addr; + + /* Technically this isn't safe inside a signal handler. However we + know this only ever happens in a synchronous SEGV handler, so in + practice it seems to be ok. */ + mmap_lock(); + + p = page_find(address >> TARGET_PAGE_BITS); + if (!p) { + mmap_unlock(); + return 0; + } + + /* if the page was really writable, then we change its + protection back to writable */ + if ((p->flags & PAGE_WRITE_ORG) && !(p->flags & PAGE_WRITE)) { + host_start = address & qemu_host_page_mask; + host_end = host_start + qemu_host_page_size; + + prot = 0; + for (addr = host_start ; addr < host_end ; addr += TARGET_PAGE_SIZE) { + p = page_find(addr >> TARGET_PAGE_BITS); + p->flags |= PAGE_WRITE; + prot |= p->flags; + + /* and since the content will be modified, we must invalidate + the corresponding translated code. */ + tb_invalidate_phys_page(addr, pc, puc); +#ifdef DEBUG_TB_CHECK + tb_invalidate_check(addr); +#endif + } + mprotect((void *)g2h(host_start), qemu_host_page_size, + prot & PAGE_BITS); + + mmap_unlock(); + return 1; + } + mmap_unlock(); + return 0; +} +#endif /* CONFIG_USER_ONLY */ diff --git a/translate-all.h b/translate-all.h new file mode 100644 index 0000000000..b181fb48ad --- /dev/null +++ b/translate-all.h @@ -0,0 +1,34 @@ +/* + * Translated block handling + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#ifndef TRANSLATE_ALL_H +#define TRANSLATE_ALL_H + +/* Size of the L2 (and L3, etc) page tables. */ +#define L2_BITS 10 +#define L2_SIZE (1 << L2_BITS) + +#define P_L2_LEVELS \ + (((TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS - 1) / L2_BITS) + 1) + +/* translate-all.c */ +void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len); +void cpu_unlink_tb(CPUArchState *env); +void tb_check_watchpoint(CPUArchState *env); + +#endif /* TRANSLATE_ALL_H */ From a8a826a3c3b8c8a1c4def0e9e22b46e78e6163a0 Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Tue, 4 Dec 2012 20:16:07 +0000 Subject: [PATCH 195/300] exec: refactor cpu_restore_state Refactor common code around calls to cpu_restore_state(). tb_find_pc() has now no external users, make it static. Signed-off-by: Blue Swirl --- exec-all.h | 6 ++---- hw/kvmvapic.c | 4 +--- target-alpha/helper.c | 14 +++----------- target-alpha/mem_helper.c | 8 ++++++-- target-arm/op_helper.c | 8 +------- target-cris/op_helper.c | 8 +------- target-i386/helper.c | 5 +---- target-i386/mem_helper.c | 8 +------- target-lm32/op_helper.c | 8 +------- target-m68k/op_helper.c | 8 +------- target-microblaze/op_helper.c | 8 +------- target-mips/op_helper.c | 8 +------- target-openrisc/mmu_helper.c | 10 +--------- target-ppc/mem_helper.c | 8 +------- target-s390x/mem_helper.c | 8 +------- target-sh4/op_helper.c | 23 ++++++----------------- target-sparc/cpu.h | 1 - target-sparc/helper.c | 12 ++++++------ target-sparc/ldst_helper.c | 24 ++++++------------------ target-unicore32/op_helper.c | 9 +-------- target-xtensa/op_helper.c | 14 ++------------ translate-all.c | 27 ++++++++++++++++++++------- user-exec.c | 8 +------- 23 files changed, 65 insertions(+), 172 deletions(-) diff --git a/exec-all.h b/exec-all.h index b18d4ca534..e9b07cd986 100644 --- a/exec-all.h +++ b/exec-all.h @@ -80,8 +80,8 @@ void restore_state_to_opc(CPUArchState *env, struct TranslationBlock *tb, void cpu_gen_init(void); int cpu_gen_code(CPUArchState *env, struct TranslationBlock *tb, int *gen_code_size_ptr); -int cpu_restore_state(struct TranslationBlock *tb, - CPUArchState *env, uintptr_t searched_pc); +bool cpu_restore_state(CPUArchState *env, uintptr_t searched_pc); + void QEMU_NORETURN cpu_resume_from_signal(CPUArchState *env1, void *puc); void QEMU_NORETURN cpu_io_recompile(CPUArchState *env, uintptr_t retaddr); TranslationBlock *tb_gen_code(CPUArchState *env, @@ -275,8 +275,6 @@ static inline void tb_add_jump(TranslationBlock *tb, int n, } } -TranslationBlock *tb_find_pc(uintptr_t pc_ptr); - #include "qemu-lock.h" extern spinlock_t tb_lock; diff --git a/hw/kvmvapic.c b/hw/kvmvapic.c index e04c4011d7..60c8fc46aa 100644 --- a/hw/kvmvapic.c +++ b/hw/kvmvapic.c @@ -387,7 +387,6 @@ static void patch_instruction(VAPICROMState *s, CPUX86State *env, target_ulong i VAPICHandlers *handlers; uint8_t opcode[2]; uint32_t imm32; - TranslationBlock *current_tb; target_ulong current_pc = 0; target_ulong current_cs_base = 0; int current_flags = 0; @@ -399,8 +398,7 @@ static void patch_instruction(VAPICROMState *s, CPUX86State *env, target_ulong i } if (!kvm_enabled()) { - current_tb = tb_find_pc(env->mem_io_pc); - cpu_restore_state(current_tb, env, env->mem_io_pc); + cpu_restore_state(env, env->mem_io_pc); cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base, ¤t_flags); } diff --git a/target-alpha/helper.c b/target-alpha/helper.c index d9d7f75b58..2430f70aca 100644 --- a/target-alpha/helper.c +++ b/target-alpha/helper.c @@ -494,16 +494,6 @@ void cpu_dump_state (CPUAlphaState *env, FILE *f, fprintf_function cpu_fprintf, cpu_fprintf(f, "\n"); } -void do_restore_state(CPUAlphaState *env, uintptr_t retaddr) -{ - if (retaddr) { - TranslationBlock *tb = tb_find_pc(retaddr); - if (tb) { - cpu_restore_state(tb, env, retaddr); - } - } -} - /* This should only be called from translate, via gen_excp. We expect that ENV->PC has already been updated. */ void QEMU_NORETURN helper_excp(CPUAlphaState *env, int excp, int error) @@ -519,7 +509,9 @@ void QEMU_NORETURN dynamic_excp(CPUAlphaState *env, uintptr_t retaddr, { env->exception_index = excp; env->error_code = error; - do_restore_state(env, retaddr); + if (retaddr) { + cpu_restore_state(env, retaddr); + } cpu_loop_exit(env); } diff --git a/target-alpha/mem_helper.c b/target-alpha/mem_helper.c index 617836cc6c..64b33f6518 100644 --- a/target-alpha/mem_helper.c +++ b/target-alpha/mem_helper.c @@ -94,7 +94,9 @@ static void do_unaligned_access(CPUAlphaState *env, target_ulong addr, uint64_t pc; uint32_t insn; - do_restore_state(env, retaddr); + if (retaddr) { + cpu_restore_state(env, retaddr); + } pc = env->pc; insn = cpu_ldl_code(env, pc); @@ -143,7 +145,9 @@ void tlb_fill(CPUAlphaState *env, target_ulong addr, int is_write, ret = cpu_alpha_handle_mmu_fault(env, addr, is_write, mmu_idx); if (unlikely(ret != 0)) { - do_restore_state(env, retaddr); + if (retaddr) { + cpu_restore_state(env, retaddr); + } /* Exception index and error code are already set */ cpu_loop_exit(env); } diff --git a/target-arm/op_helper.c b/target-arm/op_helper.c index 6e3ab90e3b..1fcc975945 100644 --- a/target-arm/op_helper.c +++ b/target-arm/op_helper.c @@ -74,19 +74,13 @@ uint32_t HELPER(neon_tbl)(CPUARMState *env, uint32_t ireg, uint32_t def, void tlb_fill(CPUARMState *env, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) { - TranslationBlock *tb; int ret; ret = cpu_arm_handle_mmu_fault(env, addr, is_write, mmu_idx); if (unlikely(ret)) { if (retaddr) { /* now we have a real cpu fault */ - tb = tb_find_pc(retaddr); - if (tb) { - /* the PC is inside the translated code. It means that we have - a virtual CPU fault */ - cpu_restore_state(tb, env, retaddr); - } + cpu_restore_state(env, retaddr); } raise_exception(env, env->exception_index); } diff --git a/target-cris/op_helper.c b/target-cris/op_helper.c index a7468d41c6..31db42494d 100644 --- a/target-cris/op_helper.c +++ b/target-cris/op_helper.c @@ -57,7 +57,6 @@ void tlb_fill(CPUCRISState *env, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) { - TranslationBlock *tb; int ret; D_LOG("%s pc=%x tpc=%x ra=%p\n", __func__, @@ -66,12 +65,7 @@ void tlb_fill(CPUCRISState *env, target_ulong addr, int is_write, int mmu_idx, if (unlikely(ret)) { if (retaddr) { /* now we have a real cpu fault */ - tb = tb_find_pc(retaddr); - if (tb) { - /* the PC is inside the translated code. It means that we have - a virtual CPU fault */ - cpu_restore_state(tb, env, retaddr); - + if (cpu_restore_state(env, retaddr)) { /* Evaluate flags after retranslation. */ helper_top_evaluate_flags(env); } diff --git a/target-i386/helper.c b/target-i386/helper.c index bf206cfa97..00341c5233 100644 --- a/target-i386/helper.c +++ b/target-i386/helper.c @@ -1196,15 +1196,12 @@ void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, int bank, void cpu_report_tpr_access(CPUX86State *env, TPRAccess access) { - TranslationBlock *tb; - if (kvm_enabled()) { env->tpr_access_type = access; cpu_interrupt(env, CPU_INTERRUPT_TPR); } else { - tb = tb_find_pc(env->mem_io_pc); - cpu_restore_state(tb, env, env->mem_io_pc); + cpu_restore_state(env, env->mem_io_pc); apic_handle_tpr_access_report(env->apic_state, env->eip, access); } diff --git a/target-i386/mem_helper.c b/target-i386/mem_helper.c index 7f99c7cfe3..d0be77b1ed 100644 --- a/target-i386/mem_helper.c +++ b/target-i386/mem_helper.c @@ -135,19 +135,13 @@ void helper_boundl(CPUX86State *env, target_ulong a0, int v) void tlb_fill(CPUX86State *env, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) { - TranslationBlock *tb; int ret; ret = cpu_x86_handle_mmu_fault(env, addr, is_write, mmu_idx); if (ret) { if (retaddr) { /* now we have a real cpu fault */ - tb = tb_find_pc(retaddr); - if (tb) { - /* the PC is inside the translated code. It means that we have - a virtual CPU fault */ - cpu_restore_state(tb, env, retaddr); - } + cpu_restore_state(env, retaddr); } raise_exception_err(env, env->exception_index, env->error_code); } diff --git a/target-lm32/op_helper.c b/target-lm32/op_helper.c index 7b91d8c31e..97b9625c1a 100644 --- a/target-lm32/op_helper.c +++ b/target-lm32/op_helper.c @@ -76,19 +76,13 @@ uint32_t helper_rcsr_jrx(CPULM32State *env) void tlb_fill(CPULM32State *env, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) { - TranslationBlock *tb; int ret; ret = cpu_lm32_handle_mmu_fault(env, addr, is_write, mmu_idx); if (unlikely(ret)) { if (retaddr) { /* now we have a real cpu fault */ - tb = tb_find_pc(retaddr); - if (tb) { - /* the PC is inside the translated code. It means that we have - a virtual CPU fault */ - cpu_restore_state(tb, env, retaddr); - } + cpu_restore_state(env, retaddr); } cpu_loop_exit(env); } diff --git a/target-m68k/op_helper.c b/target-m68k/op_helper.c index aa005048e1..b97ba5e28f 100644 --- a/target-m68k/op_helper.c +++ b/target-m68k/op_helper.c @@ -56,19 +56,13 @@ extern int semihosting_enabled; void tlb_fill(CPUM68KState *env, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) { - TranslationBlock *tb; int ret; ret = cpu_m68k_handle_mmu_fault(env, addr, is_write, mmu_idx); if (unlikely(ret)) { if (retaddr) { /* now we have a real cpu fault */ - tb = tb_find_pc(retaddr); - if (tb) { - /* the PC is inside the translated code. It means that we have - a virtual CPU fault */ - cpu_restore_state(tb, env, retaddr); - } + cpu_restore_state(env, retaddr); } cpu_loop_exit(env); } diff --git a/target-microblaze/op_helper.c b/target-microblaze/op_helper.c index 210296b30b..7593517094 100644 --- a/target-microblaze/op_helper.c +++ b/target-microblaze/op_helper.c @@ -44,19 +44,13 @@ void tlb_fill(CPUMBState *env, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) { - TranslationBlock *tb; int ret; ret = cpu_mb_handle_mmu_fault(env, addr, is_write, mmu_idx); if (unlikely(ret)) { if (retaddr) { /* now we have a real cpu fault */ - tb = tb_find_pc(retaddr); - if (tb) { - /* the PC is inside the translated code. It means that we have - a virtual CPU fault */ - cpu_restore_state(tb, env, retaddr); - } + cpu_restore_state(env, retaddr); } cpu_loop_exit(env); } diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c index f45d494b14..2972ae3f0a 100644 --- a/target-mips/op_helper.c +++ b/target-mips/op_helper.c @@ -38,7 +38,6 @@ static inline void QEMU_NORETURN do_raise_exception_err(CPUMIPSState *env, int error_code, uintptr_t pc) { - TranslationBlock *tb; #if 1 if (exception < 0x100) qemu_log("%s: %d %d\n", __func__, exception, error_code); @@ -48,12 +47,7 @@ static inline void QEMU_NORETURN do_raise_exception_err(CPUMIPSState *env, if (pc) { /* now we have a real cpu fault */ - tb = tb_find_pc(pc); - if (tb) { - /* the PC is inside the translated code. It means that we have - a virtual CPU fault */ - cpu_restore_state(tb, env, pc); - } + cpu_restore_state(env, pc); } cpu_loop_exit(env); diff --git a/target-openrisc/mmu_helper.c b/target-openrisc/mmu_helper.c index 59ed371ae0..d2edebcb49 100644 --- a/target-openrisc/mmu_helper.c +++ b/target-openrisc/mmu_helper.c @@ -39,8 +39,6 @@ void tlb_fill(CPUOpenRISCState *env, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) { - TranslationBlock *tb; - unsigned long pc; int ret; ret = cpu_openrisc_handle_mmu_fault(env, addr, is_write, mmu_idx); @@ -48,13 +46,7 @@ void tlb_fill(CPUOpenRISCState *env, target_ulong addr, int is_write, if (ret) { if (retaddr) { /* now we have a real cpu fault. */ - pc = (unsigned long)retaddr; - tb = tb_find_pc(pc); - if (tb) { - /* the PC is inside the translated code. It means that we - have a virtual CPU fault. */ - cpu_restore_state(tb, env, pc); - } + cpu_restore_state(env, retaddr); } /* Raise Exception. */ cpu_loop_exit(env); diff --git a/target-ppc/mem_helper.c b/target-ppc/mem_helper.c index 5b5f1bdd23..04c01445f9 100644 --- a/target-ppc/mem_helper.c +++ b/target-ppc/mem_helper.c @@ -275,19 +275,13 @@ STVE(stvewx, cpu_stl_data, bswap32, u32) void tlb_fill(CPUPPCState *env, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) { - TranslationBlock *tb; int ret; ret = cpu_ppc_handle_mmu_fault(env, addr, is_write, mmu_idx); if (unlikely(ret != 0)) { if (likely(retaddr)) { /* now we have a real cpu fault */ - tb = tb_find_pc(retaddr); - if (likely(tb)) { - /* the PC is inside the translated code. It means that we have - a virtual CPU fault */ - cpu_restore_state(tb, env, retaddr); - } + cpu_restore_state(env, retaddr); } helper_raise_exception_err(env, env->exception_index, env->error_code); } diff --git a/target-s390x/mem_helper.c b/target-s390x/mem_helper.c index 6ebc22dd11..91b25e309d 100644 --- a/target-s390x/mem_helper.c +++ b/target-s390x/mem_helper.c @@ -47,19 +47,13 @@ void tlb_fill(CPUS390XState *env, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) { - TranslationBlock *tb; int ret; ret = cpu_s390x_handle_mmu_fault(env, addr, is_write, mmu_idx); if (unlikely(ret != 0)) { if (likely(retaddr)) { /* now we have a real cpu fault */ - tb = tb_find_pc(retaddr); - if (likely(tb)) { - /* the PC is inside the translated code. It means that we have - a virtual CPU fault */ - cpu_restore_state(tb, env, retaddr); - } + cpu_restore_state(env, retaddr); } cpu_loop_exit(env); } diff --git a/target-sh4/op_helper.c b/target-sh4/op_helper.c index 60ec4cbc4d..e8e87f5152 100644 --- a/target-sh4/op_helper.c +++ b/target-sh4/op_helper.c @@ -21,21 +21,6 @@ #include "cpu.h" #include "helper.h" -static inline void cpu_restore_state_from_retaddr(CPUSH4State *env, - uintptr_t retaddr) -{ - TranslationBlock *tb; - - if (retaddr) { - tb = tb_find_pc(retaddr); - if (tb) { - /* the PC is inside the translated code. It means that we have - a virtual CPU fault */ - cpu_restore_state(tb, env, retaddr); - } - } -} - #ifndef CONFIG_USER_ONLY #include "softmmu_exec.h" @@ -61,7 +46,9 @@ void tlb_fill(CPUSH4State *env, target_ulong addr, int is_write, int mmu_idx, ret = cpu_sh4_handle_mmu_fault(env, addr, is_write, mmu_idx); if (ret) { /* now we have a real cpu fault */ - cpu_restore_state_from_retaddr(env, retaddr); + if (retaddr) { + cpu_restore_state(env, retaddr); + } cpu_loop_exit(env); } } @@ -82,7 +69,9 @@ static inline void QEMU_NORETURN raise_exception(CPUSH4State *env, int index, uintptr_t retaddr) { env->exception_index = index; - cpu_restore_state_from_retaddr(env, retaddr); + if (retaddr) { + cpu_restore_state(env, retaddr); + } cpu_loop_exit(env); } diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h index 375f20a71e..013ecbd063 100644 --- a/target-sparc/cpu.h +++ b/target-sparc/cpu.h @@ -710,7 +710,6 @@ uint64_t cpu_tick_get_count(CPUTimer *timer); void cpu_tick_set_limit(CPUTimer *timer, uint64_t limit); trap_state* cpu_tsptr(CPUSPARCState* env); #endif -void cpu_restore_state2(CPUSPARCState *env, uintptr_t retaddr); #define TB_FLAG_FPU_ENABLED (1 << 4) #define TB_FLAG_AM_ENABLED (1 << 5) diff --git a/target-sparc/helper.c b/target-sparc/helper.c index 556ac286eb..3c8e865eef 100644 --- a/target-sparc/helper.c +++ b/target-sparc/helper.c @@ -75,7 +75,7 @@ static target_ulong helper_udiv_common(CPUSPARCState *env, target_ulong a, x1 = (b & 0xffffffff); if (x1 == 0) { - cpu_restore_state2(env, GETPC()); + cpu_restore_state(env, GETPC()); helper_raise_exception(env, TT_DIV_ZERO); } @@ -114,7 +114,7 @@ static target_ulong helper_sdiv_common(CPUSPARCState *env, target_ulong a, x1 = (b & 0xffffffff); if (x1 == 0) { - cpu_restore_state2(env, GETPC()); + cpu_restore_state(env, GETPC()); helper_raise_exception(env, TT_DIV_ZERO); } @@ -147,7 +147,7 @@ int64_t helper_sdivx(CPUSPARCState *env, int64_t a, int64_t b) { if (b == 0) { /* Raise divide by zero trap. */ - cpu_restore_state2(env, GETPC()); + cpu_restore_state(env, GETPC()); helper_raise_exception(env, TT_DIV_ZERO); } else if (b == -1) { /* Avoid overflow trap with i386 divide insn. */ @@ -161,7 +161,7 @@ uint64_t helper_udivx(CPUSPARCState *env, uint64_t a, uint64_t b) { if (b == 0) { /* Raise divide by zero trap. */ - cpu_restore_state2(env, GETPC()); + cpu_restore_state(env, GETPC()); helper_raise_exception(env, TT_DIV_ZERO); } return a / b; @@ -193,7 +193,7 @@ target_ulong helper_taddcctv(CPUSPARCState *env, target_ulong src1, return dst; tag_overflow: - cpu_restore_state2(env, GETPC()); + cpu_restore_state(env, GETPC()); helper_raise_exception(env, TT_TOVF); } @@ -222,6 +222,6 @@ target_ulong helper_tsubcctv(CPUSPARCState *env, target_ulong src1, return dst; tag_overflow: - cpu_restore_state2(env, GETPC()); + cpu_restore_state(env, GETPC()); helper_raise_exception(env, TT_TOVF); } diff --git a/target-sparc/ldst_helper.c b/target-sparc/ldst_helper.c index f3e08fd6e6..8d815e5038 100644 --- a/target-sparc/ldst_helper.c +++ b/target-sparc/ldst_helper.c @@ -2393,22 +2393,6 @@ void cpu_unassigned_access(CPUSPARCState *env, hwaddr addr, #endif #endif -/* XXX: make it generic ? */ -void cpu_restore_state2(CPUSPARCState *env, uintptr_t retaddr) -{ - TranslationBlock *tb; - - if (retaddr) { - /* now we have a real cpu fault */ - tb = tb_find_pc(retaddr); - if (tb) { - /* the PC is inside the translated code. It means that we have - a virtual CPU fault */ - cpu_restore_state(tb, env, retaddr); - } - } -} - #if !defined(CONFIG_USER_ONLY) static void QEMU_NORETURN do_unaligned_access(CPUSPARCState *env, target_ulong addr, int is_write, @@ -2418,7 +2402,9 @@ static void QEMU_NORETURN do_unaligned_access(CPUSPARCState *env, printf("Unaligned access to 0x" TARGET_FMT_lx " from 0x" TARGET_FMT_lx "\n", addr, env->pc); #endif - cpu_restore_state2(env, retaddr); + if (retaddr) { + cpu_restore_state(env, retaddr); + } helper_raise_exception(env, TT_UNALIGNED); } @@ -2433,7 +2419,9 @@ void tlb_fill(CPUSPARCState *env, target_ulong addr, int is_write, int mmu_idx, ret = cpu_sparc_handle_mmu_fault(env, addr, is_write, mmu_idx); if (ret) { - cpu_restore_state2(env, retaddr); + if (retaddr) { + cpu_restore_state(env, retaddr); + } cpu_loop_exit(env); } } diff --git a/target-unicore32/op_helper.c b/target-unicore32/op_helper.c index f474d1b59b..b8172ba682 100644 --- a/target-unicore32/op_helper.c +++ b/target-unicore32/op_helper.c @@ -256,20 +256,13 @@ uint32_t HELPER(ror_cc)(CPUUniCore32State *env, uint32_t x, uint32_t i) void tlb_fill(CPUUniCore32State *env, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) { - TranslationBlock *tb; - unsigned long pc; int ret; ret = uc32_cpu_handle_mmu_fault(env, addr, is_write, mmu_idx); if (unlikely(ret)) { if (retaddr) { /* now we have a real cpu fault */ - pc = (unsigned long)retaddr; - tb = tb_find_pc(pc); - if (tb) {/* the PC is inside the translated code. - It means that we have a virtual CPU fault */ - cpu_restore_state(tb, env, pc); - } + cpu_restore_state(env, retaddr); } cpu_loop_exit(env); } diff --git a/target-xtensa/op_helper.c b/target-xtensa/op_helper.c index 0e0f21d1a2..84f0449f79 100644 --- a/target-xtensa/op_helper.c +++ b/target-xtensa/op_helper.c @@ -47,22 +47,12 @@ static void do_unaligned_access(CPUXtensaState *env, #define SHIFT 3 #include "softmmu_template.h" -static void do_restore_state(CPUXtensaState *env, uintptr_t pc) -{ - TranslationBlock *tb; - - tb = tb_find_pc(pc); - if (tb) { - cpu_restore_state(tb, env, pc); - } -} - static void do_unaligned_access(CPUXtensaState *env, target_ulong addr, int is_write, int is_user, uintptr_t retaddr) { if (xtensa_option_enabled(env->config, XTENSA_OPTION_UNALIGNED_EXCEPTION) && !xtensa_option_enabled(env->config, XTENSA_OPTION_HW_ALIGNMENT)) { - do_restore_state(env, retaddr); + cpu_restore_state(env, retaddr); HELPER(exception_cause_vaddr)(env, env->pc, LOAD_STORE_ALIGNMENT_CAUSE, addr); } @@ -86,7 +76,7 @@ void tlb_fill(CPUXtensaState *env, paddr & TARGET_PAGE_MASK, access, mmu_idx, page_size); } else { - do_restore_state(env, retaddr); + cpu_restore_state(env, retaddr); HELPER(exception_cause_vaddr)(env, env->pc, ret, vaddr); } } diff --git a/translate-all.c b/translate-all.c index b958342a99..164870a68c 100644 --- a/translate-all.c +++ b/translate-all.c @@ -142,6 +142,7 @@ TCGContext tcg_ctx; static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc, tb_page_addr_t phys_page2); +static TranslationBlock *tb_find_pc(uintptr_t tc_ptr); void cpu_gen_init(void) { @@ -211,8 +212,8 @@ int cpu_gen_code(CPUArchState *env, TranslationBlock *tb, int *gen_code_size_ptr /* The cpu state corresponding to 'searched_pc' is restored. */ -int cpu_restore_state(TranslationBlock *tb, - CPUArchState *env, uintptr_t searched_pc) +static int cpu_restore_state_from_tb(TranslationBlock *tb, CPUArchState *env, + uintptr_t searched_pc) { TCGContext *s = &tcg_ctx; int j; @@ -266,6 +267,18 @@ int cpu_restore_state(TranslationBlock *tb, return 0; } +bool cpu_restore_state(CPUArchState *env, uintptr_t retaddr) +{ + TranslationBlock *tb; + + tb = tb_find_pc(retaddr); + if (tb) { + cpu_restore_state_from_tb(tb, env, retaddr); + return true; + } + return false; +} + #ifdef _WIN32 static inline void map_exec(void *addr, long size) { @@ -1057,7 +1070,7 @@ void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end, restore the CPU state */ current_tb_modified = 1; - cpu_restore_state(current_tb, env, env->mem_io_pc); + cpu_restore_state_from_tb(current_tb, env, env->mem_io_pc); cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base, ¤t_flags); } @@ -1171,7 +1184,7 @@ static void tb_invalidate_phys_page(tb_page_addr_t addr, restore the CPU state */ current_tb_modified = 1; - cpu_restore_state(current_tb, env, pc); + cpu_restore_state_from_tb(current_tb, env, pc); cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base, ¤t_flags); } @@ -1308,7 +1321,7 @@ bool is_tcg_gen_code(uintptr_t tc_ptr) /* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr < tb[1].tc_ptr. Return NULL if not found */ -TranslationBlock *tb_find_pc(uintptr_t tc_ptr) +static TranslationBlock *tb_find_pc(uintptr_t tc_ptr) { int m_min, m_max, m; uintptr_t v; @@ -1435,7 +1448,7 @@ void tb_check_watchpoint(CPUArchState *env) cpu_abort(env, "check_watchpoint: could not find TB for pc=%p", (void *)env->mem_io_pc); } - cpu_restore_state(tb, env, env->mem_io_pc); + cpu_restore_state_from_tb(tb, env, env->mem_io_pc); tb_phys_invalidate(tb, -1); } @@ -1486,7 +1499,7 @@ void cpu_io_recompile(CPUArchState *env, uintptr_t retaddr) (void *)retaddr); } n = env->icount_decr.u16.low + tb->icount; - cpu_restore_state(tb, env, retaddr); + cpu_restore_state_from_tb(tb, env, retaddr); /* Calculate how many instructions had been executed before the fault occurred. */ n = n - env->icount_decr.u16.low; diff --git a/user-exec.c b/user-exec.c index ef9b1727b3..1185cb03c8 100644 --- a/user-exec.c +++ b/user-exec.c @@ -81,7 +81,6 @@ static inline int handle_cpu_signal(uintptr_t pc, unsigned long address, int is_write, sigset_t *old_set, void *puc) { - TranslationBlock *tb; int ret; #if defined(DEBUG_SIGNAL) @@ -104,12 +103,7 @@ static inline int handle_cpu_signal(uintptr_t pc, unsigned long address, return 1; /* the MMU fault was handled without causing real CPU fault */ } /* now we have a real cpu fault */ - tb = tb_find_pc(pc); - if (tb) { - /* the PC is inside the translated code. It means that we have - a virtual CPU fault */ - cpu_restore_state(tb, cpu_single_env, pc); - } + cpu_restore_state(cpu_single_env, pc); /* we restore the process signal mask as the sigreturn should do it (XXX: use sigsetjmp) */ From 315a1350c4a386065a73aad2ded1a11d77bf7771 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 12 Dec 2012 13:32:14 +0200 Subject: [PATCH 196/300] pci: move pci core code to hw/pci Move files and modify makefiles to pick them at the new location. Signed-off-by: Michael S. Tsirkin --- hw/Makefile.objs | 11 ++--------- hw/i386/Makefile.objs | 2 +- hw/pci/Makefile.objs | 7 +++++++ hw/{ => pci}/msi.c | 0 hw/{ => pci}/msi.h | 0 hw/{ => pci}/msix.c | 0 hw/{ => pci}/msix.h | 0 hw/{ => pci}/pci-hotplug.c | 0 hw/{ => pci}/pci-stub.c | 0 hw/{ => pci}/pci.c | 0 hw/{ => pci}/pci.h | 0 hw/{ => pci}/pci_bridge.c | 0 hw/{ => pci}/pci_bridge.h | 0 hw/{ => pci}/pci_host.c | 0 hw/{ => pci}/pci_host.h | 0 hw/{ => pci}/pci_ids.h | 0 hw/{ => pci}/pci_internals.h | 0 hw/{ => pci}/pci_regs.h | 0 hw/{ => pci}/pcie.c | 0 hw/{ => pci}/pcie.h | 0 hw/{ => pci}/pcie_aer.c | 0 hw/{ => pci}/pcie_aer.h | 0 hw/{ => pci}/pcie_host.c | 0 hw/{ => pci}/pcie_host.h | 0 hw/{ => pci}/pcie_port.c | 0 hw/{ => pci}/pcie_port.h | 0 hw/{ => pci}/pcie_regs.h | 0 hw/{ => pci}/shpc.c | 0 hw/{ => pci}/shpc.h | 0 hw/{ => pci}/slotid_cap.c | 0 hw/{ => pci}/slotid_cap.h | 0 hw/ppc/Makefile.objs | 2 +- 32 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 hw/pci/Makefile.objs rename hw/{ => pci}/msi.c (100%) rename hw/{ => pci}/msi.h (100%) rename hw/{ => pci}/msix.c (100%) rename hw/{ => pci}/msix.h (100%) rename hw/{ => pci}/pci-hotplug.c (100%) rename hw/{ => pci}/pci-stub.c (100%) rename hw/{ => pci}/pci.c (100%) rename hw/{ => pci}/pci.h (100%) rename hw/{ => pci}/pci_bridge.c (100%) rename hw/{ => pci}/pci_bridge.h (100%) rename hw/{ => pci}/pci_host.c (100%) rename hw/{ => pci}/pci_host.h (100%) rename hw/{ => pci}/pci_ids.h (100%) rename hw/{ => pci}/pci_internals.h (100%) rename hw/{ => pci}/pci_regs.h (100%) rename hw/{ => pci}/pcie.c (100%) rename hw/{ => pci}/pcie.h (100%) rename hw/{ => pci}/pcie_aer.c (100%) rename hw/{ => pci}/pcie_aer.h (100%) rename hw/{ => pci}/pcie_host.c (100%) rename hw/{ => pci}/pcie_host.h (100%) rename hw/{ => pci}/pcie_port.c (100%) rename hw/{ => pci}/pcie_port.h (100%) rename hw/{ => pci}/pcie_regs.h (100%) rename hw/{ => pci}/shpc.c (100%) rename hw/{ => pci}/shpc.h (100%) rename hw/{ => pci}/slotid_cap.c (100%) rename hw/{ => pci}/slotid_cap.h (100%) diff --git a/hw/Makefile.objs b/hw/Makefile.objs index d581d8d6d6..9d33b189e6 100644 --- a/hw/Makefile.objs +++ b/hw/Makefile.objs @@ -1,14 +1,10 @@ -common-obj-y = usb/ ide/ +common-obj-y = usb/ ide/ pci/ common-obj-y += loader.o common-obj-$(CONFIG_VIRTIO) += virtio-console.o common-obj-$(CONFIG_VIRTIO) += virtio-rng.o common-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o common-obj-y += fw_cfg.o -common-obj-$(CONFIG_PCI) += pci.o pci_bridge.o pci_bridge_dev.o -common-obj-$(CONFIG_PCI) += msix.o msi.o -common-obj-$(CONFIG_PCI) += shpc.o -common-obj-$(CONFIG_PCI) += slotid_cap.o -common-obj-$(CONFIG_PCI) += pci_host.o pcie_host.o +common-obj-$(CONFIG_PCI) += pci_bridge_dev.o common-obj-$(CONFIG_PCI) += ioh3420.o xio3130_upstream.o xio3130_downstream.o common-obj-$(CONFIG_PCI) += i82801b11.o common-obj-y += watchdog.o @@ -102,8 +98,6 @@ common-obj-$(CONFIG_XGMAC) += xgmac.o # PCI watchdog devices common-obj-$(CONFIG_PCI) += wdt_i6300esb.o -common-obj-$(CONFIG_PCI) += pcie.o pcie_aer.o pcie_port.o - # PCI network cards common-obj-$(CONFIG_NE2000_PCI) += ne2000.o common-obj-$(CONFIG_EEPRO100_PCI) += eepro100.o @@ -199,7 +193,6 @@ obj-$(CONFIG_VIRTIO) += virtio-serial-bus.o virtio-scsi.o obj-$(CONFIG_SOFTMMU) += vhost_net.o obj-$(CONFIG_VHOST_NET) += vhost.o obj-$(CONFIG_REALLY_VIRTFS) += 9pfs/ -obj-$(CONFIG_NO_PCI) += pci-stub.o obj-$(CONFIG_VGA) += vga.o obj-$(CONFIG_SOFTMMU) += device-hotplug.o obj-$(CONFIG_XEN) += xen_domainbuild.o xen_machine_pv.o diff --git a/hw/i386/Makefile.objs b/hw/i386/Makefile.objs index 0d3f6a8e84..257f3c1a91 100644 --- a/hw/i386/Makefile.objs +++ b/hw/i386/Makefile.objs @@ -2,7 +2,7 @@ obj-y += mc146818rtc.o pc.o obj-y += apic_common.o apic.o kvmvapic.o obj-y += sga.o ioapic_common.o ioapic.o piix_pci.o obj-y += vmport.o -obj-y += pci-hotplug.o smbios.o wdt_ib700.o +obj-y += pci/pci-hotplug.o smbios.o wdt_ib700.o obj-y += debugcon.o multiboot.o obj-y += pc_piix.o obj-y += pc_sysfw.o diff --git a/hw/pci/Makefile.objs b/hw/pci/Makefile.objs new file mode 100644 index 0000000000..aa7a0e84b5 --- /dev/null +++ b/hw/pci/Makefile.objs @@ -0,0 +1,7 @@ +common-obj-$(CONFIG_PCI) += pci.o pci_bridge.o +common-obj-$(CONFIG_PCI) += msix.o msi.o +common-obj-$(CONFIG_PCI) += shpc.o +common-obj-$(CONFIG_PCI) += slotid_cap.o +common-obj-$(CONFIG_PCI) += pci_host.o pcie_host.o +common-obj-$(CONFIG_PCI) += pcie.o pcie_aer.o pcie_port.o +common-obj-$(CONFIG_NO_PCI) += pci-stub.o diff --git a/hw/msi.c b/hw/pci/msi.c similarity index 100% rename from hw/msi.c rename to hw/pci/msi.c diff --git a/hw/msi.h b/hw/pci/msi.h similarity index 100% rename from hw/msi.h rename to hw/pci/msi.h diff --git a/hw/msix.c b/hw/pci/msix.c similarity index 100% rename from hw/msix.c rename to hw/pci/msix.c diff --git a/hw/msix.h b/hw/pci/msix.h similarity index 100% rename from hw/msix.h rename to hw/pci/msix.h diff --git a/hw/pci-hotplug.c b/hw/pci/pci-hotplug.c similarity index 100% rename from hw/pci-hotplug.c rename to hw/pci/pci-hotplug.c diff --git a/hw/pci-stub.c b/hw/pci/pci-stub.c similarity index 100% rename from hw/pci-stub.c rename to hw/pci/pci-stub.c diff --git a/hw/pci.c b/hw/pci/pci.c similarity index 100% rename from hw/pci.c rename to hw/pci/pci.c diff --git a/hw/pci.h b/hw/pci/pci.h similarity index 100% rename from hw/pci.h rename to hw/pci/pci.h diff --git a/hw/pci_bridge.c b/hw/pci/pci_bridge.c similarity index 100% rename from hw/pci_bridge.c rename to hw/pci/pci_bridge.c diff --git a/hw/pci_bridge.h b/hw/pci/pci_bridge.h similarity index 100% rename from hw/pci_bridge.h rename to hw/pci/pci_bridge.h diff --git a/hw/pci_host.c b/hw/pci/pci_host.c similarity index 100% rename from hw/pci_host.c rename to hw/pci/pci_host.c diff --git a/hw/pci_host.h b/hw/pci/pci_host.h similarity index 100% rename from hw/pci_host.h rename to hw/pci/pci_host.h diff --git a/hw/pci_ids.h b/hw/pci/pci_ids.h similarity index 100% rename from hw/pci_ids.h rename to hw/pci/pci_ids.h diff --git a/hw/pci_internals.h b/hw/pci/pci_internals.h similarity index 100% rename from hw/pci_internals.h rename to hw/pci/pci_internals.h diff --git a/hw/pci_regs.h b/hw/pci/pci_regs.h similarity index 100% rename from hw/pci_regs.h rename to hw/pci/pci_regs.h diff --git a/hw/pcie.c b/hw/pci/pcie.c similarity index 100% rename from hw/pcie.c rename to hw/pci/pcie.c diff --git a/hw/pcie.h b/hw/pci/pcie.h similarity index 100% rename from hw/pcie.h rename to hw/pci/pcie.h diff --git a/hw/pcie_aer.c b/hw/pci/pcie_aer.c similarity index 100% rename from hw/pcie_aer.c rename to hw/pci/pcie_aer.c diff --git a/hw/pcie_aer.h b/hw/pci/pcie_aer.h similarity index 100% rename from hw/pcie_aer.h rename to hw/pci/pcie_aer.h diff --git a/hw/pcie_host.c b/hw/pci/pcie_host.c similarity index 100% rename from hw/pcie_host.c rename to hw/pci/pcie_host.c diff --git a/hw/pcie_host.h b/hw/pci/pcie_host.h similarity index 100% rename from hw/pcie_host.h rename to hw/pci/pcie_host.h diff --git a/hw/pcie_port.c b/hw/pci/pcie_port.c similarity index 100% rename from hw/pcie_port.c rename to hw/pci/pcie_port.c diff --git a/hw/pcie_port.h b/hw/pci/pcie_port.h similarity index 100% rename from hw/pcie_port.h rename to hw/pci/pcie_port.h diff --git a/hw/pcie_regs.h b/hw/pci/pcie_regs.h similarity index 100% rename from hw/pcie_regs.h rename to hw/pci/pcie_regs.h diff --git a/hw/shpc.c b/hw/pci/shpc.c similarity index 100% rename from hw/shpc.c rename to hw/pci/shpc.c diff --git a/hw/shpc.h b/hw/pci/shpc.h similarity index 100% rename from hw/shpc.h rename to hw/pci/shpc.h diff --git a/hw/slotid_cap.c b/hw/pci/slotid_cap.c similarity index 100% rename from hw/slotid_cap.c rename to hw/pci/slotid_cap.c diff --git a/hw/slotid_cap.h b/hw/pci/slotid_cap.h similarity index 100% rename from hw/slotid_cap.h rename to hw/pci/slotid_cap.h diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs index 8fe21235f0..cb7cf8fba5 100644 --- a/hw/ppc/Makefile.objs +++ b/hw/ppc/Makefile.objs @@ -10,7 +10,7 @@ obj-y += ppc_newworld.o # IBM pSeries (sPAPR) 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_pci.o pci/pci-hotplug.o spapr_iommu.o obj-$(CONFIG_PSERIES) += spapr_events.o # PowerPC 4xx boards obj-y += ppc4xx_devs.o ppc4xx_pci.o ppc405_uc.o ppc405_boards.o From a2cb15b0ddfa05f81a42d7b65dd0c7c50e420c33 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 12 Dec 2012 14:24:50 +0200 Subject: [PATCH 197/300] pci: update all users to look in pci/ update all users so we can remove the makefile hack. Signed-off-by: Michael S. Tsirkin --- arch_init.c | 2 +- hw/ac97.c | 2 +- hw/acpi_ich9.c | 2 +- hw/acpi_piix4.c | 2 +- hw/alpha_sys.h | 4 ++-- hw/apb_pci.c | 8 ++++---- hw/apic.c | 2 +- hw/apm.c | 2 +- hw/bonito.c | 4 ++-- hw/cirrus_vga.c | 2 +- hw/dec_pci.c | 8 ++++---- hw/e1000.c | 2 +- hw/eepro100.c | 2 +- hw/es1370.c | 2 +- hw/esp-pci.c | 2 +- hw/grackle_pci.c | 4 ++-- hw/gt64xxx.c | 4 ++-- hw/hda-audio.c | 2 +- hw/i82378.c | 2 +- hw/i82801b11.c | 2 +- hw/ich9.h | 8 ++++---- hw/ide.h | 2 +- hw/ide/ahci.c | 4 ++-- hw/ide/cmd646.c | 2 +- hw/ide/core.c | 2 +- hw/ide/ich.c | 4 ++-- hw/ide/pci.c | 2 +- hw/ide/piix.c | 2 +- hw/ide/via.c | 2 +- hw/intel-hda.c | 4 ++-- hw/ioh3420.c | 6 +++--- hw/ioh3420.h | 2 +- hw/ivshmem.c | 4 ++-- hw/kvm/apic.c | 2 +- hw/kvm/pci-assign.c | 4 ++-- hw/lpc_ich9.c | 8 ++++---- hw/lsi53c895a.c | 2 +- hw/macio.c | 2 +- hw/megasas.c | 4 ++-- hw/mips_fulong2e.c | 2 +- hw/mips_malta.c | 2 +- hw/ne2000.c | 2 +- hw/openpic.c | 2 +- hw/pc.c | 4 ++-- hw/pc_piix.c | 4 ++-- hw/pci_bridge_dev.c | 12 ++++++------ hw/pcnet-pci.c | 2 +- hw/piix4.c | 2 +- hw/piix_pci.c | 4 ++-- hw/ppc/e500.c | 2 +- hw/ppc440_bamboo.c | 2 +- hw/ppc4xx.h | 2 +- hw/ppc4xx_pci.c | 4 ++-- hw/ppc_newworld.c | 2 +- hw/ppc_oldworld.c | 2 +- hw/ppc_prep.c | 4 ++-- hw/ppce500_pci.c | 4 ++-- hw/prep_pci.c | 4 ++-- hw/q35.h | 4 ++-- hw/qxl.h | 2 +- hw/r2d.c | 2 +- hw/realview.c | 2 +- hw/rtl8139.c | 2 +- hw/serial-pci.c | 2 +- hw/sga.c | 2 +- hw/sh_pci.c | 4 ++-- hw/smbus_ich9.c | 2 +- hw/spapr.c | 4 ++-- hw/spapr_pci.c | 10 +++++----- hw/spapr_pci.h | 4 ++-- hw/sun4u.c | 2 +- hw/unin_pci.c | 4 ++-- hw/usb/hcd-ehci-pci.c | 2 +- hw/usb/hcd-ohci.c | 2 +- hw/usb/hcd-uhci.c | 2 +- hw/usb/hcd-xhci.c | 6 +++--- hw/versatile_pci.c | 4 ++-- hw/versatilepb.c | 2 +- hw/vfio_pci.c | 6 +++--- hw/vga-pci.c | 2 +- hw/vga.c | 2 +- hw/virtio-balloon.h | 2 +- hw/virtio-net.h | 2 +- hw/virtio-pci.c | 6 +++--- hw/virtio-scsi.h | 2 +- hw/vmware_vga.c | 2 +- hw/vt82c686.c | 4 ++-- hw/wdt_i6300esb.c | 2 +- hw/xen-host-pci-device.h | 2 +- hw/xen_apic.c | 2 +- hw/xen_platform.c | 2 +- hw/xen_pt.c | 2 +- hw/xen_pt.h | 2 +- hw/xio3130_downstream.c | 6 +++--- hw/xio3130_downstream.h | 2 +- hw/xio3130_upstream.c | 6 +++--- hw/xio3130_upstream.h | 2 +- kvm-all.c | 2 +- kvm-stub.c | 2 +- monitor.c | 2 +- target-i386/kvm.c | 2 +- xen-all.c | 2 +- 102 files changed, 159 insertions(+), 159 deletions(-) diff --git a/arch_init.c b/arch_init.c index e6effe809a..e307b23310 100644 --- a/arch_init.c +++ b/arch_init.c @@ -36,7 +36,7 @@ #include "arch_init.h" #include "audio/audio.h" #include "hw/pc.h" -#include "hw/pci.h" +#include "hw/pci/pci.h" #include "hw/audiodev.h" #include "kvm.h" #include "migration.h" diff --git a/hw/ac97.c b/hw/ac97.c index ce6a1dc609..3e659b38df 100644 --- a/hw/ac97.c +++ b/hw/ac97.c @@ -20,7 +20,7 @@ #include "hw.h" #include "audiodev.h" #include "audio/audio.h" -#include "pci.h" +#include "pci/pci.h" #include "dma.h" enum { diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c index 85d441c33c..755fa050f7 100644 --- a/hw/acpi_ich9.c +++ b/hw/acpi_ich9.c @@ -25,7 +25,7 @@ */ #include "hw.h" #include "pc.h" -#include "pci.h" +#include "pci/pci.h" #include "qemu-timer.h" #include "sysemu.h" #include "acpi.h" diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index 0b5b0d3d3e..46f9843891 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -22,7 +22,7 @@ #include "pc.h" #include "apm.h" #include "pm_smbus.h" -#include "pci.h" +#include "pci/pci.h" #include "acpi.h" #include "sysemu.h" #include "range.h" diff --git a/hw/alpha_sys.h b/hw/alpha_sys.h index 7604d09c80..b1e52585b3 100644 --- a/hw/alpha_sys.h +++ b/hw/alpha_sys.h @@ -3,8 +3,8 @@ #ifndef HW_ALPHA_H #define HW_ALPHA_H 1 -#include "pci.h" -#include "pci_host.h" +#include "pci/pci.h" +#include "pci/pci_host.h" #include "ide.h" #include "net.h" #include "pc.h" diff --git a/hw/apb_pci.c b/hw/apb_pci.c index 054814fd4b..de594f8c0b 100644 --- a/hw/apb_pci.c +++ b/hw/apb_pci.c @@ -27,10 +27,10 @@ the secondary PCI bridge. */ #include "sysbus.h" -#include "pci.h" -#include "pci_host.h" -#include "pci_bridge.h" -#include "pci_internals.h" +#include "pci/pci.h" +#include "pci/pci_host.h" +#include "pci/pci_bridge.h" +#include "pci/pci_internals.h" #include "apb_pci.h" #include "sysemu.h" #include "exec-memory.h" diff --git a/hw/apic.c b/hw/apic.c index f73fc877aa..d66a476aac 100644 --- a/hw/apic.c +++ b/hw/apic.c @@ -20,7 +20,7 @@ #include "apic_internal.h" #include "apic.h" #include "ioapic.h" -#include "msi.h" +#include "pci/msi.h" #include "host-utils.h" #include "trace.h" #include "pc.h" diff --git a/hw/apm.c b/hw/apm.c index e988ad9939..2e1b1372d2 100644 --- a/hw/apm.c +++ b/hw/apm.c @@ -22,7 +22,7 @@ #include "apm.h" #include "hw.h" -#include "pci.h" +#include "pci/pci.h" //#define DEBUG diff --git a/hw/bonito.c b/hw/bonito.c index 0bf6d4aa5f..a1fc38c784 100644 --- a/hw/bonito.c +++ b/hw/bonito.c @@ -40,10 +40,10 @@ #include #include "hw.h" -#include "pci.h" +#include "pci/pci.h" #include "pc.h" #include "mips.h" -#include "pci_host.h" +#include "pci/pci_host.h" #include "sysemu.h" #include "exec-memory.h" diff --git a/hw/cirrus_vga.c b/hw/cirrus_vga.c index 40efa8a523..7d021f2e1d 100644 --- a/hw/cirrus_vga.c +++ b/hw/cirrus_vga.c @@ -27,7 +27,7 @@ * available at http://home.worldonline.dk/~finth/ */ #include "hw.h" -#include "pci.h" +#include "pci/pci.h" #include "console.h" #include "vga_int.h" #include "loader.h" diff --git a/hw/dec_pci.c b/hw/dec_pci.c index c30ade38bd..a6a7c846fd 100644 --- a/hw/dec_pci.c +++ b/hw/dec_pci.c @@ -25,10 +25,10 @@ #include "dec_pci.h" #include "sysbus.h" -#include "pci.h" -#include "pci_host.h" -#include "pci_bridge.h" -#include "pci_internals.h" +#include "pci/pci.h" +#include "pci/pci_host.h" +#include "pci/pci_bridge.h" +#include "pci/pci_internals.h" /* debug DEC */ //#define DEBUG_DEC diff --git a/hw/e1000.c b/hw/e1000.c index 5537ad2fc4..c89c8d22ab 100644 --- a/hw/e1000.c +++ b/hw/e1000.c @@ -26,7 +26,7 @@ #include "hw.h" -#include "pci.h" +#include "pci/pci.h" #include "net.h" #include "net/checksum.h" #include "loader.h" diff --git a/hw/eepro100.c b/hw/eepro100.c index a189474d31..992f03ace7 100644 --- a/hw/eepro100.c +++ b/hw/eepro100.c @@ -42,7 +42,7 @@ #include /* offsetof */ #include "hw.h" -#include "pci.h" +#include "pci/pci.h" #include "net.h" #include "eeprom93xx.h" #include "sysemu.h" diff --git a/hw/es1370.c b/hw/es1370.c index e0c9729dc9..65365788e1 100644 --- a/hw/es1370.c +++ b/hw/es1370.c @@ -29,7 +29,7 @@ #include "hw.h" #include "audiodev.h" #include "audio/audio.h" -#include "pci.h" +#include "pci/pci.h" #include "dma.h" /* Missing stuff: diff --git a/hw/esp-pci.c b/hw/esp-pci.c index d9a8e59c98..d433473d6a 100644 --- a/hw/esp-pci.c +++ b/hw/esp-pci.c @@ -23,7 +23,7 @@ * THE SOFTWARE. */ -#include "pci.h" +#include "pci/pci.h" #include "eeprom93xx.h" #include "esp.h" #include "trace.h" diff --git a/hw/grackle_pci.c b/hw/grackle_pci.c index 67da307284..948416632a 100644 --- a/hw/grackle_pci.c +++ b/hw/grackle_pci.c @@ -23,9 +23,9 @@ * THE SOFTWARE. */ -#include "pci_host.h" +#include "pci/pci_host.h" #include "ppc_mac.h" -#include "pci.h" +#include "pci/pci.h" /* debug Grackle */ //#define DEBUG_GRACKLE diff --git a/hw/gt64xxx.c b/hw/gt64xxx.c index 95d491d932..5aa49c6148 100644 --- a/hw/gt64xxx.c +++ b/hw/gt64xxx.c @@ -24,8 +24,8 @@ #include "hw.h" #include "mips.h" -#include "pci.h" -#include "pci_host.h" +#include "pci/pci.h" +#include "pci/pci_host.h" #include "pc.h" #include "exec-memory.h" diff --git a/hw/hda-audio.c b/hw/hda-audio.c index 36761dd2de..92a91b5ab1 100644 --- a/hw/hda-audio.c +++ b/hw/hda-audio.c @@ -18,7 +18,7 @@ */ #include "hw.h" -#include "pci.h" +#include "pci/pci.h" #include "intel-hda.h" #include "intel-hda-defs.h" #include "audio/audio.h" diff --git a/hw/i82378.c b/hw/i82378.c index 99f35d41ef..c6b0b5ec55 100644 --- a/hw/i82378.c +++ b/hw/i82378.c @@ -17,7 +17,7 @@ * License along with this library; if not, see . */ -#include "pci.h" +#include "pci/pci.h" #include "pc.h" #include "i8254.h" #include "pcspk.h" diff --git a/hw/i82801b11.c b/hw/i82801b11.c index 3d1f996b2f..3dc10000a4 100644 --- a/hw/i82801b11.c +++ b/hw/i82801b11.c @@ -41,7 +41,7 @@ * License along with this library; if not, see */ -#include "pci.h" +#include "pci/pci.h" #include "ich9.h" diff --git a/hw/ich9.h b/hw/ich9.h index 34e216f142..ddd12934d5 100644 --- a/hw/ich9.h +++ b/hw/ich9.h @@ -8,13 +8,13 @@ #include "pc.h" #include "apm.h" #include "ioapic.h" -#include "pci.h" -#include "pcie_host.h" -#include "pci_bridge.h" +#include "pci/pci.h" +#include "pci/pcie_host.h" +#include "pci/pci_bridge.h" #include "acpi.h" #include "acpi_ich9.h" #include "pam.h" -#include "pci_internals.h" +#include "pci/pci_internals.h" void ich9_lpc_set_irq(void *opaque, int irq_num, int level); int ich9_lpc_map_irq(PCIDevice *pci_dev, int intx); diff --git a/hw/ide.h b/hw/ide.h index add742c4a8..081c710d56 100644 --- a/hw/ide.h +++ b/hw/ide.h @@ -2,7 +2,7 @@ #define HW_IDE_H #include "isa.h" -#include "pci.h" +#include "pci/pci.h" #include "memory.h" #define MAX_IDE_DEVS 2 diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index 67562db041..2ea64bd316 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -22,9 +22,9 @@ */ #include -#include +#include #include -#include +#include #include #include "monitor.h" diff --git a/hw/ide/cmd646.c b/hw/ide/cmd646.c index 804db60ffe..88210eabc8 100644 --- a/hw/ide/cmd646.c +++ b/hw/ide/cmd646.c @@ -24,7 +24,7 @@ */ #include #include -#include +#include #include #include "block.h" #include "sysemu.h" diff --git a/hw/ide/core.c b/hw/ide/core.c index c4f93d0e47..adc4aa41b9 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -24,7 +24,7 @@ */ #include #include -#include +#include #include #include "qemu-error.h" #include "qemu-timer.h" diff --git a/hw/ide/ich.c b/hw/ide/ich.c index 272b7734b5..8e1a48e257 100644 --- a/hw/ide/ich.c +++ b/hw/ide/ich.c @@ -61,9 +61,9 @@ */ #include -#include +#include #include -#include +#include #include #include "block.h" #include "dma.h" diff --git a/hw/ide/pci.c b/hw/ide/pci.c index bcdd70e450..23a0e237fb 100644 --- a/hw/ide/pci.c +++ b/hw/ide/pci.c @@ -24,7 +24,7 @@ */ #include #include -#include +#include #include #include "block.h" #include "dma.h" diff --git a/hw/ide/piix.c b/hw/ide/piix.c index 9431badadf..5cf39cf8f0 100644 --- a/hw/ide/piix.c +++ b/hw/ide/piix.c @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include "blockdev.h" #include "sysemu.h" diff --git a/hw/ide/via.c b/hw/ide/via.c index efda1733d9..8b4a24e5c2 100644 --- a/hw/ide/via.c +++ b/hw/ide/via.c @@ -25,7 +25,7 @@ */ #include #include -#include +#include #include #include "block.h" #include "sysemu.h" diff --git a/hw/intel-hda.c b/hw/intel-hda.c index a68c3685e3..c21bf7204a 100644 --- a/hw/intel-hda.c +++ b/hw/intel-hda.c @@ -18,8 +18,8 @@ */ #include "hw.h" -#include "pci.h" -#include "msi.h" +#include "pci/pci.h" +#include "pci/msi.h" #include "qemu-timer.h" #include "audiodev.h" #include "intel-hda.h" diff --git a/hw/ioh3420.c b/hw/ioh3420.c index 4d314733b9..d706e195df 100644 --- a/hw/ioh3420.c +++ b/hw/ioh3420.c @@ -20,9 +20,9 @@ * with this program; if not, see . */ -#include "pci_ids.h" -#include "msi.h" -#include "pcie.h" +#include "pci/pci_ids.h" +#include "pci/msi.h" +#include "pci/pcie.h" #include "ioh3420.h" #define PCI_DEVICE_ID_IOH_EPORT 0x3420 /* D0:F0 express mode */ diff --git a/hw/ioh3420.h b/hw/ioh3420.h index 68c523ab46..046cf2c281 100644 --- a/hw/ioh3420.h +++ b/hw/ioh3420.h @@ -1,7 +1,7 @@ #ifndef QEMU_IOH3420_H #define QEMU_IOH3420_H -#include "pcie_port.h" +#include "pci/pcie_port.h" PCIESlot *ioh3420_init(PCIBus *bus, int devfn, bool multifunction, const char *bus_name, pci_map_irq_fn map_irq, diff --git a/hw/ivshmem.c b/hw/ivshmem.c index f6dbb212f2..cf64f32ac0 100644 --- a/hw/ivshmem.c +++ b/hw/ivshmem.c @@ -18,8 +18,8 @@ */ #include "hw.h" #include "pc.h" -#include "pci.h" -#include "msix.h" +#include "pci/pci.h" +#include "pci/msix.h" #include "kvm.h" #include "migration.h" #include "qerror.h" diff --git a/hw/kvm/apic.c b/hw/kvm/apic.c index 8b65d513db..beb418de8d 100644 --- a/hw/kvm/apic.c +++ b/hw/kvm/apic.c @@ -10,7 +10,7 @@ * See the COPYING file in the top-level directory. */ #include "hw/apic_internal.h" -#include "hw/msi.h" +#include "hw/pci/msi.h" #include "kvm.h" static inline void kvm_apic_set_reg(struct kvm_lapic_state *kapic, diff --git a/hw/kvm/pci-assign.c b/hw/kvm/pci-assign.c index e80dad009c..42291592e3 100644 --- a/hw/kvm/pci-assign.c +++ b/hw/kvm/pci-assign.c @@ -34,8 +34,8 @@ #include "monitor.h" #include "range.h" #include "sysemu.h" -#include "hw/pci.h" -#include "hw/msi.h" +#include "hw/pci/pci.h" +#include "hw/pci/msi.h" #include "kvm_i386.h" #define MSIX_PAGE_SIZE 0x1000 diff --git a/hw/lpc_ich9.c b/hw/lpc_ich9.c index 7a113633ed..811bf261c3 100644 --- a/hw/lpc_ich9.c +++ b/hw/lpc_ich9.c @@ -35,14 +35,14 @@ #include "pc.h" #include "apm.h" #include "ioapic.h" -#include "pci.h" -#include "pcie_host.h" -#include "pci_bridge.h" +#include "pci/pci.h" +#include "pci/pcie_host.h" +#include "pci/pci_bridge.h" #include "ich9.h" #include "acpi.h" #include "acpi_ich9.h" #include "pam.h" -#include "pci_internals.h" +#include "pci/pci_internals.h" #include "exec-memory.h" #include "sysemu.h" diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c index 04f2faef42..4aac9a0cff 100644 --- a/hw/lsi53c895a.c +++ b/hw/lsi53c895a.c @@ -13,7 +13,7 @@ #include #include "hw.h" -#include "pci.h" +#include "pci/pci.h" #include "scsi.h" #include "dma.h" diff --git a/hw/macio.c b/hw/macio.c index eb15b890b1..362afdc7ec 100644 --- a/hw/macio.c +++ b/hw/macio.c @@ -24,7 +24,7 @@ */ #include "hw.h" #include "ppc_mac.h" -#include "pci.h" +#include "pci/pci.h" #include "escc.h" typedef struct MacIOState diff --git a/hw/megasas.c b/hw/megasas.c index 61b6527928..f4fbe9790a 100644 --- a/hw/megasas.c +++ b/hw/megasas.c @@ -19,9 +19,9 @@ */ #include "hw.h" -#include "pci.h" +#include "pci/pci.h" #include "dma.h" -#include "msix.h" +#include "pci/msix.h" #include "iov.h" #include "scsi.h" #include "scsi-defs.h" diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c index 5fcf900e04..d5cf33b4b6 100644 --- a/hw/mips_fulong2e.c +++ b/hw/mips_fulong2e.c @@ -29,7 +29,7 @@ #include "flash.h" #include "mips.h" #include "mips_cpudevs.h" -#include "pci.h" +#include "pci/pci.h" #include "qemu-char.h" #include "sysemu.h" #include "audio/audio.h" diff --git a/hw/mips_malta.c b/hw/mips_malta.c index 4d2464a02c..571903dfc5 100644 --- a/hw/mips_malta.c +++ b/hw/mips_malta.c @@ -33,7 +33,7 @@ #include "flash.h" #include "mips.h" #include "mips_cpudevs.h" -#include "pci.h" +#include "pci/pci.h" #include "qemu-char.h" #include "sysemu.h" #include "arch_init.h" diff --git a/hw/ne2000.c b/hw/ne2000.c index d3dd9a6f26..fb78e5b252 100644 --- a/hw/ne2000.c +++ b/hw/ne2000.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "hw.h" -#include "pci.h" +#include "pci/pci.h" #include "net.h" #include "ne2000.h" #include "loader.h" diff --git a/hw/openpic.c b/hw/openpic.c index 8b3784a6bd..4791dc6eaf 100644 --- a/hw/openpic.c +++ b/hw/openpic.c @@ -35,7 +35,7 @@ */ #include "hw.h" #include "ppc_mac.h" -#include "pci.h" +#include "pci/pci.h" #include "openpic.h" //#define DEBUG_OPENPIC diff --git a/hw/pc.c b/hw/pc.c index b11e7c4adc..d1b102c879 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -27,7 +27,7 @@ #include "apic.h" #include "fdc.h" #include "ide.h" -#include "pci.h" +#include "pci/pci.h" #include "monitor.h" #include "fw_cfg.h" #include "hpet_emul.h" @@ -38,7 +38,7 @@ #include "mc146818rtc.h" #include "i8254.h" #include "pcspk.h" -#include "msi.h" +#include "pci/msi.h" #include "sysbus.h" #include "sysemu.h" #include "kvm.h" diff --git a/hw/pc_piix.c b/hw/pc_piix.c index 19e342aeb4..c2b4cb07e5 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -27,8 +27,8 @@ #include "hw.h" #include "pc.h" #include "apic.h" -#include "pci.h" -#include "pci_ids.h" +#include "pci/pci.h" +#include "pci/pci_ids.h" #include "usb.h" #include "net.h" #include "boards.h" diff --git a/hw/pci_bridge_dev.c b/hw/pci_bridge_dev.c index f7063961a0..5c9fc5036b 100644 --- a/hw/pci_bridge_dev.c +++ b/hw/pci_bridge_dev.c @@ -19,13 +19,13 @@ * with this program; if not, see . */ -#include "pci_bridge.h" -#include "pci_ids.h" -#include "msi.h" -#include "shpc.h" -#include "slotid_cap.h" +#include "pci/pci_bridge.h" +#include "pci/pci_ids.h" +#include "pci/msi.h" +#include "pci/shpc.h" +#include "pci/slotid_cap.h" #include "memory.h" -#include "pci_internals.h" +#include "pci/pci_internals.h" #define REDHAT_PCI_VENDOR_ID 0x1b36 #define PCI_BRIDGE_DEV_VENDOR_ID REDHAT_PCI_VENDOR_ID diff --git a/hw/pcnet-pci.c b/hw/pcnet-pci.c index 0bf438ffee..c1abbf8d0d 100644 --- a/hw/pcnet-pci.c +++ b/hw/pcnet-pci.c @@ -27,7 +27,7 @@ * AMD Publication# 19436 Rev:E Amendment/0 Issue Date: June 2000 */ -#include "pci.h" +#include "pci/pci.h" #include "net.h" #include "loader.h" #include "qemu-timer.h" diff --git a/hw/piix4.c b/hw/piix4.c index ce4eb0d1ae..799ed1729c 100644 --- a/hw/piix4.c +++ b/hw/piix4.c @@ -24,7 +24,7 @@ #include "hw.h" #include "pc.h" -#include "pci.h" +#include "pci/pci.h" #include "isa.h" #include "sysbus.h" diff --git a/hw/piix_pci.c b/hw/piix_pci.c index ba1b3de749..b5ea68bc61 100644 --- a/hw/piix_pci.c +++ b/hw/piix_pci.c @@ -24,8 +24,8 @@ #include "hw.h" #include "pc.h" -#include "pci.h" -#include "pci_host.h" +#include "pci/pci.h" +#include "pci/pci_host.h" #include "isa.h" #include "sysbus.h" #include "range.h" diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 6749ffffb3..f77c488af7 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -20,7 +20,7 @@ #include "net.h" #include "hw/hw.h" #include "hw/serial.h" -#include "hw/pci.h" +#include "hw/pci/pci.h" #include "hw/boards.h" #include "sysemu.h" #include "kvm.h" diff --git a/hw/ppc440_bamboo.c b/hw/ppc440_bamboo.c index cc85607cb7..0b39a81ec5 100644 --- a/hw/ppc440_bamboo.c +++ b/hw/ppc440_bamboo.c @@ -15,7 +15,7 @@ #include "qemu-common.h" #include "net.h" #include "hw.h" -#include "pci.h" +#include "pci/pci.h" #include "boards.h" #include "kvm.h" #include "kvm_ppc.h" diff --git a/hw/ppc4xx.h b/hw/ppc4xx.h index d795ced57e..2b96d47f36 100644 --- a/hw/ppc4xx.h +++ b/hw/ppc4xx.h @@ -25,7 +25,7 @@ #if !defined(PPC_4XX_H) #define PPC_4XX_H -#include "pci.h" +#include "pci/pci.h" /* PowerPC 4xx core initialization */ CPUPPCState *ppc4xx_init (const char *cpu_model, diff --git a/hw/ppc4xx_pci.c b/hw/ppc4xx_pci.c index d3ad6a0b79..3e8af11f08 100644 --- a/hw/ppc4xx_pci.c +++ b/hw/ppc4xx_pci.c @@ -22,8 +22,8 @@ #include "hw.h" #include "ppc.h" #include "ppc4xx.h" -#include "pci.h" -#include "pci_host.h" +#include "pci/pci.h" +#include "pci/pci_host.h" #include "exec-memory.h" #undef DEBUG diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c index 664747ead3..c1ff9d7c31 100644 --- a/hw/ppc_newworld.c +++ b/hw/ppc_newworld.c @@ -52,7 +52,7 @@ #include "adb.h" #include "mac_dbdma.h" #include "nvram.h" -#include "pci.h" +#include "pci/pci.h" #include "net.h" #include "sysemu.h" #include "boards.h" diff --git a/hw/ppc_oldworld.c b/hw/ppc_oldworld.c index e8138c091e..3bc29c619c 100644 --- a/hw/ppc_oldworld.c +++ b/hw/ppc_oldworld.c @@ -32,7 +32,7 @@ #include "sysemu.h" #include "net.h" #include "isa.h" -#include "pci.h" +#include "pci/pci.h" #include "boards.h" #include "fw_cfg.h" #include "escc.h" diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c index bf15730d8b..f6ffb593b7 100644 --- a/hw/ppc_prep.c +++ b/hw/ppc_prep.c @@ -29,8 +29,8 @@ #include "net.h" #include "sysemu.h" #include "isa.h" -#include "pci.h" -#include "pci_host.h" +#include "pci/pci.h" +#include "pci/pci_host.h" #include "ppc.h" #include "boards.h" #include "qemu-log.h" diff --git a/hw/ppce500_pci.c b/hw/ppce500_pci.c index 2ff7438d09..39022aada0 100644 --- a/hw/ppce500_pci.c +++ b/hw/ppce500_pci.c @@ -15,8 +15,8 @@ */ #include "hw.h" -#include "pci.h" -#include "pci_host.h" +#include "pci/pci.h" +#include "pci/pci_host.h" #include "bswap.h" #ifdef DEBUG_PCI diff --git a/hw/prep_pci.c b/hw/prep_pci.c index 0bc479cd1f..5f22de647a 100644 --- a/hw/prep_pci.c +++ b/hw/prep_pci.c @@ -23,8 +23,8 @@ */ #include "hw.h" -#include "pci.h" -#include "pci_host.h" +#include "pci/pci.h" +#include "pci/pci_host.h" #include "pc.h" #include "exec-memory.h" diff --git a/hw/q35.h b/hw/q35.h index e34f7c165f..2f951c8a94 100644 --- a/hw/q35.h +++ b/hw/q35.h @@ -29,8 +29,8 @@ #include "pc.h" #include "apm.h" #include "apic.h" -#include "pci.h" -#include "pcie_host.h" +#include "pci/pci.h" +#include "pci/pcie_host.h" #include "acpi.h" #include "acpi_ich9.h" #include "pam.h" diff --git a/hw/qxl.h b/hw/qxl.h index e583cfb750..41246c7554 100644 --- a/hw/qxl.h +++ b/hw/qxl.h @@ -2,7 +2,7 @@ #include "console.h" #include "hw.h" -#include "pci.h" +#include "pci/pci.h" #include "vga_int.h" #include "qemu-thread.h" diff --git a/hw/r2d.c b/hw/r2d.c index 66212e9cda..e18c23b28b 100644 --- a/hw/r2d.c +++ b/hw/r2d.c @@ -29,7 +29,7 @@ #include "devices.h" #include "sysemu.h" #include "boards.h" -#include "pci.h" +#include "pci/pci.h" #include "net.h" #include "sh7750_regs.h" #include "ide.h" diff --git a/hw/realview.c b/hw/realview.c index e789c159a9..149bb562af 100644 --- a/hw/realview.c +++ b/hw/realview.c @@ -11,7 +11,7 @@ #include "arm-misc.h" #include "primecell.h" #include "devices.h" -#include "pci.h" +#include "pci/pci.h" #include "net.h" #include "sysemu.h" #include "boards.h" diff --git a/hw/rtl8139.c b/hw/rtl8139.c index e3aa8bfb11..e294a2a5e3 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -52,7 +52,7 @@ #include #include "hw.h" -#include "pci.h" +#include "pci/pci.h" #include "dma.h" #include "qemu-timer.h" #include "net.h" diff --git a/hw/serial-pci.c b/hw/serial-pci.c index 95dc5c8d2f..6a2548a515 100644 --- a/hw/serial-pci.c +++ b/hw/serial-pci.c @@ -26,7 +26,7 @@ /* see docs/specs/pci-serial.txt */ #include "serial.h" -#include "pci.h" +#include "pci/pci.h" #define PCI_SERIAL_MAX_PORTS 4 diff --git a/hw/sga.c b/hw/sga.c index a666349f82..5d80efd0c2 100644 --- a/hw/sga.c +++ b/hw/sga.c @@ -24,7 +24,7 @@ * sgabios code originally available at code.google.com/p/sgabios * */ -#include "pci.h" +#include "pci/pci.h" #include "pc.h" #include "loader.h" #include "sysemu.h" diff --git a/hw/sh_pci.c b/hw/sh_pci.c index fdec71b9e8..9ea08c8f8e 100644 --- a/hw/sh_pci.c +++ b/hw/sh_pci.c @@ -23,8 +23,8 @@ */ #include "sysbus.h" #include "sh.h" -#include "pci.h" -#include "pci_host.h" +#include "pci/pci.h" +#include "pci/pci_host.h" #include "bswap.h" #include "exec-memory.h" diff --git a/hw/smbus_ich9.c b/hw/smbus_ich9.c index d202664a36..b7bddc80d3 100644 --- a/hw/smbus_ich9.c +++ b/hw/smbus_ich9.c @@ -27,7 +27,7 @@ #include "hw.h" #include "pc.h" #include "pm_smbus.h" -#include "pci.h" +#include "pci/pci.h" #include "sysemu.h" #include "i2c.h" #include "smbus.h" diff --git a/hw/spapr.c b/hw/spapr.c index ad3f0ea7fc..b0125a892c 100644 --- a/hw/spapr.c +++ b/hw/spapr.c @@ -41,11 +41,11 @@ #include "hw/spapr_vio.h" #include "hw/spapr_pci.h" #include "hw/xics.h" -#include "hw/msi.h" +#include "hw/pci/msi.h" #include "kvm.h" #include "kvm_ppc.h" -#include "pci.h" +#include "pci/pci.h" #include "exec-memory.h" #include "hw/usb.h" diff --git a/hw/spapr_pci.c b/hw/spapr_pci.c index 3c5b855bc0..2386164d5d 100644 --- a/hw/spapr_pci.c +++ b/hw/spapr_pci.c @@ -23,17 +23,17 @@ * THE SOFTWARE. */ #include "hw.h" -#include "pci.h" -#include "msi.h" -#include "msix.h" -#include "pci_host.h" +#include "pci/pci.h" +#include "pci/msi.h" +#include "pci/msix.h" +#include "pci/pci_host.h" #include "hw/spapr.h" #include "hw/spapr_pci.h" #include "exec-memory.h" #include #include "trace.h" -#include "hw/pci_internals.h" +#include "hw/pci/pci_internals.h" /* Copied from the kernel arch/powerpc/platforms/pseries/msi.c */ #define RTAS_QUERY_FN 0 diff --git a/hw/spapr_pci.h b/hw/spapr_pci.h index e307ac8035..7b26ba1561 100644 --- a/hw/spapr_pci.h +++ b/hw/spapr_pci.h @@ -23,8 +23,8 @@ #if !defined(__HW_SPAPR_PCI_H__) #define __HW_SPAPR_PCI_H__ -#include "hw/pci.h" -#include "hw/pci_host.h" +#include "hw/pci/pci.h" +#include "hw/pci/pci_host.h" #include "hw/xics.h" #define SPAPR_MSIX_MAX_DEVS 32 diff --git a/hw/sun4u.c b/hw/sun4u.c index b2b51e30c2..47bcf9382d 100644 --- a/hw/sun4u.c +++ b/hw/sun4u.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "hw.h" -#include "pci.h" +#include "pci/pci.h" #include "apb_pci.h" #include "pc.h" #include "serial.h" diff --git a/hw/unin_pci.c b/hw/unin_pci.c index 9981d949d2..46757924b6 100644 --- a/hw/unin_pci.c +++ b/hw/unin_pci.c @@ -23,8 +23,8 @@ */ #include "hw.h" #include "ppc_mac.h" -#include "pci.h" -#include "pci_host.h" +#include "pci/pci.h" +#include "pci/pci_host.h" /* debug UniNorth */ //#define DEBUG_UNIN diff --git a/hw/usb/hcd-ehci-pci.c b/hw/usb/hcd-ehci-pci.c index 41dbb539f2..8b043966f6 100644 --- a/hw/usb/hcd-ehci-pci.c +++ b/hw/usb/hcd-ehci-pci.c @@ -16,7 +16,7 @@ */ #include "hw/usb/hcd-ehci.h" -#include "hw/pci.h" +#include "hw/pci/pci.h" #include "range.h" typedef struct EHCIPCIState { diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c index e16a2ecab4..4faf8e1aed 100644 --- a/hw/usb/hcd-ohci.c +++ b/hw/usb/hcd-ohci.c @@ -29,7 +29,7 @@ #include "hw/hw.h" #include "qemu-timer.h" #include "hw/usb.h" -#include "hw/pci.h" +#include "hw/pci/pci.h" #include "hw/sysbus.h" #include "hw/qdev-dma.h" diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c index d053791de0..04c944613c 100644 --- a/hw/usb/hcd-uhci.c +++ b/hw/usb/hcd-uhci.c @@ -27,7 +27,7 @@ */ #include "hw/hw.h" #include "hw/usb.h" -#include "hw/pci.h" +#include "hw/pci/pci.h" #include "qemu-timer.h" #include "iov.h" #include "dma.h" diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index efb509e423..220c3b536a 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -21,9 +21,9 @@ #include "hw/hw.h" #include "qemu-timer.h" #include "hw/usb.h" -#include "hw/pci.h" -#include "hw/msi.h" -#include "hw/msix.h" +#include "hw/pci/pci.h" +#include "hw/pci/msi.h" +#include "hw/pci/msix.h" #include "trace.h" //#define DEBUG_XHCI diff --git a/hw/versatile_pci.c b/hw/versatile_pci.c index e0c3ee36a5..7a543b47d0 100644 --- a/hw/versatile_pci.c +++ b/hw/versatile_pci.c @@ -8,8 +8,8 @@ */ #include "sysbus.h" -#include "pci.h" -#include "pci_host.h" +#include "pci/pci.h" +#include "pci/pci_host.h" #include "exec-memory.h" typedef struct { diff --git a/hw/versatilepb.c b/hw/versatilepb.c index 25e652b1aa..41e39d8fb9 100644 --- a/hw/versatilepb.c +++ b/hw/versatilepb.c @@ -12,7 +12,7 @@ #include "devices.h" #include "net.h" #include "sysemu.h" -#include "pci.h" +#include "pci/pci.h" #include "i2c.h" #include "boards.h" #include "blockdev.h" diff --git a/hw/vfio_pci.c b/hw/vfio_pci.c index 7c27834e06..45d90ab490 100644 --- a/hw/vfio_pci.c +++ b/hw/vfio_pci.c @@ -31,9 +31,9 @@ #include "exec-memory.h" #include "kvm.h" #include "memory.h" -#include "msi.h" -#include "msix.h" -#include "pci.h" +#include "pci/msi.h" +#include "pci/msix.h" +#include "pci/pci.h" #include "qemu-common.h" #include "qemu-error.h" #include "qemu-queue.h" diff --git a/hw/vga-pci.c b/hw/vga-pci.c index 947e35c76f..0cb318eab6 100644 --- a/hw/vga-pci.c +++ b/hw/vga-pci.c @@ -25,7 +25,7 @@ */ #include "hw.h" #include "console.h" -#include "pci.h" +#include "pci/pci.h" #include "vga_int.h" #include "pixel_ops.h" #include "qemu-timer.h" diff --git a/hw/vga.c b/hw/vga.c index 2b0200a164..6d56f8a5d9 100644 --- a/hw/vga.c +++ b/hw/vga.c @@ -25,7 +25,7 @@ #include "vga.h" #include "console.h" #include "pc.h" -#include "pci.h" +#include "pci/pci.h" #include "vga_int.h" #include "pixel_ops.h" #include "qemu-timer.h" diff --git a/hw/virtio-balloon.h b/hw/virtio-balloon.h index 73300ddc86..b1828f4a48 100644 --- a/hw/virtio-balloon.h +++ b/hw/virtio-balloon.h @@ -16,7 +16,7 @@ #define _QEMU_VIRTIO_BALLOON_H #include "virtio.h" -#include "pci.h" +#include "pci/pci.h" /* from Linux's linux/virtio_balloon.h */ diff --git a/hw/virtio-net.h b/hw/virtio-net.h index 36aa463812..b13be7ccb5 100644 --- a/hw/virtio-net.h +++ b/hw/virtio-net.h @@ -16,7 +16,7 @@ #include "virtio.h" #include "net.h" -#include "pci.h" +#include "pci/pci.h" #define ETH_ALEN 6 diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index 71f4fb5dc6..e9b722dd96 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -22,10 +22,10 @@ #include "virtio-net.h" #include "virtio-serial.h" #include "virtio-scsi.h" -#include "pci.h" +#include "pci/pci.h" #include "qemu-error.h" -#include "msi.h" -#include "msix.h" +#include "pci/msi.h" +#include "pci/msix.h" #include "net.h" #include "loader.h" #include "kvm.h" diff --git a/hw/virtio-scsi.h b/hw/virtio-scsi.h index 91924f6dfc..7d7cba752d 100644 --- a/hw/virtio-scsi.h +++ b/hw/virtio-scsi.h @@ -16,7 +16,7 @@ #include "virtio.h" #include "net.h" -#include "pci.h" +#include "pci/pci.h" /* The ID for virtio_scsi */ #define VIRTIO_ID_SCSI 8 diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c index 834588daf6..333ec8cebe 100644 --- a/hw/vmware_vga.c +++ b/hw/vmware_vga.c @@ -24,7 +24,7 @@ #include "hw.h" #include "loader.h" #include "console.h" -#include "pci.h" +#include "pci/pci.h" #undef VERBOSE #define HW_RECT_ACCEL diff --git a/hw/vt82c686.c b/hw/vt82c686.c index 57d16c0134..f963912112 100644 --- a/hw/vt82c686.c +++ b/hw/vt82c686.c @@ -15,7 +15,7 @@ #include "vt82c686.h" #include "i2c.h" #include "smbus.h" -#include "pci.h" +#include "pci/pci.h" #include "isa.h" #include "sysbus.h" #include "mips.h" @@ -27,7 +27,7 @@ #include "exec-memory.h" typedef uint32_t pci_addr_t; -#include "pci_host.h" +#include "pci/pci_host.h" //#define DEBUG_VT82C686B #ifdef DEBUG_VT82C686B diff --git a/hw/wdt_i6300esb.c b/hw/wdt_i6300esb.c index da15c73918..181774220d 100644 --- a/hw/wdt_i6300esb.c +++ b/hw/wdt_i6300esb.c @@ -25,7 +25,7 @@ #include "qemu-timer.h" #include "watchdog.h" #include "hw.h" -#include "pci.h" +#include "pci/pci.h" /*#define I6300ESB_DEBUG 1*/ diff --git a/hw/xen-host-pci-device.h b/hw/xen-host-pci-device.h index 0079daca51..942b24dccc 100644 --- a/hw/xen-host-pci-device.h +++ b/hw/xen-host-pci-device.h @@ -1,7 +1,7 @@ #ifndef XEN_HOST_PCI_DEVICE_H #define XEN_HOST_PCI_DEVICE_H -#include "pci.h" +#include "pci/pci.h" enum { XEN_HOST_PCI_REGION_TYPE_IO = 1 << 1, diff --git a/hw/xen_apic.c b/hw/xen_apic.c index fc4536651a..a6632fe798 100644 --- a/hw/xen_apic.c +++ b/hw/xen_apic.c @@ -10,7 +10,7 @@ * later. See the COPYING file in the top-level directory. */ #include "hw/apic_internal.h" -#include "hw/msi.h" +#include "hw/pci/msi.h" #include "xen.h" static uint64_t xen_apic_mem_read(void *opaque, hwaddr addr, diff --git a/hw/xen_platform.c b/hw/xen_platform.c index a54e7a2cdb..10bb560073 100644 --- a/hw/xen_platform.c +++ b/hw/xen_platform.c @@ -27,7 +27,7 @@ #include "hw.h" #include "pc.h" -#include "pci.h" +#include "pci/pci.h" #include "irq.h" #include "xen_common.h" #include "net.h" diff --git a/hw/xen_pt.c b/hw/xen_pt.c index 7a3846e649..c782cdb283 100644 --- a/hw/xen_pt.c +++ b/hw/xen_pt.c @@ -54,7 +54,7 @@ #include -#include "pci.h" +#include "pci/pci.h" #include "xen.h" #include "xen_backend.h" #include "xen_pt.h" diff --git a/hw/xen_pt.h b/hw/xen_pt.h index f15e69a290..e3497302cf 100644 --- a/hw/xen_pt.h +++ b/hw/xen_pt.h @@ -3,7 +3,7 @@ #include "qemu-common.h" #include "xen_common.h" -#include "pci.h" +#include "pci/pci.h" #include "xen-host-pci-device.h" void xen_pt_log(const PCIDevice *d, const char *f, ...) GCC_FMT_ATTR(2, 3); diff --git a/hw/xio3130_downstream.c b/hw/xio3130_downstream.c index 0d8a5e7020..2dcd46bff1 100644 --- a/hw/xio3130_downstream.c +++ b/hw/xio3130_downstream.c @@ -19,9 +19,9 @@ * with this program; if not, see . */ -#include "pci_ids.h" -#include "msi.h" -#include "pcie.h" +#include "pci/pci_ids.h" +#include "pci/msi.h" +#include "pci/pcie.h" #include "xio3130_downstream.h" #define PCI_DEVICE_ID_TI_XIO3130D 0x8233 /* downstream port */ diff --git a/hw/xio3130_downstream.h b/hw/xio3130_downstream.h index 010487f2d9..559dff6565 100644 --- a/hw/xio3130_downstream.h +++ b/hw/xio3130_downstream.h @@ -1,7 +1,7 @@ #ifndef QEMU_XIO3130_DOWNSTREAM_H #define QEMU_XIO3130_DOWNSTREAM_H -#include "pcie_port.h" +#include "pci/pcie_port.h" PCIESlot *xio3130_downstream_init(PCIBus *bus, int devfn, bool multifunction, const char *bus_name, pci_map_irq_fn map_irq, diff --git a/hw/xio3130_upstream.c b/hw/xio3130_upstream.c index d46b86c74d..713caf2dda 100644 --- a/hw/xio3130_upstream.c +++ b/hw/xio3130_upstream.c @@ -19,9 +19,9 @@ * with this program; if not, see . */ -#include "pci_ids.h" -#include "msi.h" -#include "pcie.h" +#include "pci/pci_ids.h" +#include "pci/msi.h" +#include "pci/pcie.h" #include "xio3130_upstream.h" #define PCI_DEVICE_ID_TI_XIO3130U 0x8232 /* upstream port */ diff --git a/hw/xio3130_upstream.h b/hw/xio3130_upstream.h index e9969975ff..fa09656b35 100644 --- a/hw/xio3130_upstream.h +++ b/hw/xio3130_upstream.h @@ -1,7 +1,7 @@ #ifndef QEMU_XIO3130_UPSTREAM_H #define QEMU_XIO3130_UPSTREAM_H -#include "pcie_port.h" +#include "pci/pcie_port.h" PCIEPort *xio3130_upstream_init(PCIBus *bus, int devfn, bool multifunction, const char *bus_name, pci_map_irq_fn map_irq, diff --git a/kvm-all.c b/kvm-all.c index 8e9a8d8fd2..bfa09ad05b 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -26,7 +26,7 @@ #include "qemu-config.h" #include "sysemu.h" #include "hw/hw.h" -#include "hw/msi.h" +#include "hw/pci/msi.h" #include "gdbstub.h" #include "kvm.h" #include "bswap.h" diff --git a/kvm-stub.c b/kvm-stub.c index a3455e2203..d65fd04507 100644 --- a/kvm-stub.c +++ b/kvm-stub.c @@ -12,7 +12,7 @@ #include "qemu-common.h" #include "hw/hw.h" -#include "hw/msi.h" +#include "hw/pci/msi.h" #include "cpu.h" #include "gdbstub.h" #include "kvm.h" diff --git a/monitor.c b/monitor.c index c0e32d60c3..a92ab44384 100644 --- a/monitor.c +++ b/monitor.c @@ -27,7 +27,7 @@ #include "hw/usb.h" #include "hw/pcmcia.h" #include "hw/pc.h" -#include "hw/pci.h" +#include "hw/pci/pci.h" #include "hw/watchdog.h" #include "hw/loader.h" #include "gdbstub.h" diff --git a/target-i386/kvm.c b/target-i386/kvm.c index f669281e13..0901589a88 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -31,7 +31,7 @@ #include "hw/apic.h" #include "ioport.h" #include "hyperv.h" -#include "hw/pci.h" +#include "hw/pci/pci.h" //#define DEBUG_KVM diff --git a/xen-all.c b/xen-all.c index 046cc2ac37..e3a51ccc81 100644 --- a/xen-all.c +++ b/xen-all.c @@ -10,7 +10,7 @@ #include -#include "hw/pci.h" +#include "hw/pci/pci.h" #include "hw/pc.h" #include "hw/xen_common.h" #include "hw/xen_backend.h" From c759b24fae08c6c333df03e1db48e13b7f5eda30 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 12 Dec 2012 23:05:42 +0200 Subject: [PATCH 198/300] pci: fix path for local includes Include dependencies from pci core using the correct path. This is required now that it's in the separate directory. Need to check whether they can be minimized, for now, keep the code as is. Signed-off-by: Michael S. Tsirkin --- hw/pci/msi.c | 2 +- hw/pci/msi.h | 2 +- hw/pci/msix.c | 8 ++++---- hw/pci/msix.h | 2 +- hw/pci/pci-hotplug.c | 12 ++++++------ hw/pci/pci-stub.c | 2 +- hw/pci/pci.c | 14 +++++++------- hw/pci/pci.h | 10 +++++----- hw/pci/pci_bridge.c | 4 ++-- hw/pci/pci_bridge.h | 2 +- hw/pci/pci_host.c | 4 ++-- hw/pci/pci_host.h | 2 +- hw/pci/pcie.c | 12 ++++++------ hw/pci/pcie.h | 8 ++++---- hw/pci/pcie_aer.c | 12 ++++++------ hw/pci/pcie_aer.h | 2 +- hw/pci/pcie_host.c | 6 +++--- hw/pci/pcie_host.h | 2 +- hw/pci/pcie_port.c | 2 +- hw/pci/pcie_port.h | 4 ++-- hw/pci/shpc.c | 8 ++++---- hw/pci/slotid_cap.c | 4 ++-- 22 files changed, 62 insertions(+), 62 deletions(-) diff --git a/hw/pci/msi.c b/hw/pci/msi.c index 33037a80e9..680e4637d7 100644 --- a/hw/pci/msi.c +++ b/hw/pci/msi.c @@ -18,7 +18,7 @@ * with this program; if not, see . */ -#include "msi.h" +#include "hw/pci/msi.h" #include "range.h" /* Eventually those constants should go to Linux pci_regs.h */ diff --git a/hw/pci/msi.h b/hw/pci/msi.h index 150b09a19d..81a3848a31 100644 --- a/hw/pci/msi.h +++ b/hw/pci/msi.h @@ -22,7 +22,7 @@ #define QEMU_MSI_H #include "qemu-common.h" -#include "pci.h" +#include "hw/pci/pci.h" struct MSIMessage { uint64_t address; diff --git a/hw/pci/msix.c b/hw/pci/msix.c index 136ef09373..917327bfe6 100644 --- a/hw/pci/msix.c +++ b/hw/pci/msix.c @@ -14,10 +14,10 @@ * GNU GPL, version 2 or (at your option) any later version. */ -#include "hw.h" -#include "msi.h" -#include "msix.h" -#include "pci.h" +#include "hw/hw.h" +#include "hw/pci/msi.h" +#include "hw/pci/msix.h" +#include "hw/pci/pci.h" #include "range.h" #define MSIX_CAP_LENGTH 12 diff --git a/hw/pci/msix.h b/hw/pci/msix.h index 15211cb592..ff07ae2e8f 100644 --- a/hw/pci/msix.h +++ b/hw/pci/msix.h @@ -2,7 +2,7 @@ #define QEMU_MSIX_H #include "qemu-common.h" -#include "pci.h" +#include "hw/pci/pci.h" void msix_set_message(PCIDevice *dev, int vector, MSIMessage msg); int msix_init(PCIDevice *dev, unsigned short nentries, diff --git a/hw/pci/pci-hotplug.c b/hw/pci/pci-hotplug.c index 3bcfdcc1a6..4b4c931c74 100644 --- a/hw/pci/pci-hotplug.c +++ b/hw/pci/pci-hotplug.c @@ -22,14 +22,14 @@ * THE SOFTWARE. */ -#include "hw.h" -#include "boards.h" -#include "pci.h" +#include "hw/hw.h" +#include "hw/boards.h" +#include "hw/pci/pci.h" #include "net.h" -#include "pc.h" +#include "hw/pc.h" #include "monitor.h" -#include "scsi.h" -#include "virtio-blk.h" +#include "hw/scsi.h" +#include "hw/virtio-blk.h" #include "qemu-config.h" #include "blockdev.h" #include "error.h" diff --git a/hw/pci/pci-stub.c b/hw/pci/pci-stub.c index 134c4484b6..b5c43a935b 100644 --- a/hw/pci/pci-stub.c +++ b/hw/pci/pci-stub.c @@ -20,7 +20,7 @@ #include "sysemu.h" #include "monitor.h" -#include "pci.h" +#include "hw/pci/pci.h" #include "qmp-commands.h" PciInfoList *qmp_query_pci(Error **errp) diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 97a0cd77c1..c107fe2232 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -21,18 +21,18 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "hw.h" -#include "pci.h" -#include "pci_bridge.h" -#include "pci_internals.h" +#include "hw/hw.h" +#include "hw/pci/pci.h" +#include "hw/pci/pci_bridge.h" +#include "hw/pci/pci_internals.h" #include "monitor.h" #include "net.h" #include "sysemu.h" -#include "loader.h" +#include "hw/loader.h" #include "range.h" #include "qmp-commands.h" -#include "msi.h" -#include "msix.h" +#include "hw/pci/msi.h" +#include "hw/pci/msix.h" #include "exec-memory.h" //#define DEBUG_PCI diff --git a/hw/pci/pci.h b/hw/pci/pci.h index 4da0c2a4c9..41e5ddd1c4 100644 --- a/hw/pci/pci.h +++ b/hw/pci/pci.h @@ -3,14 +3,14 @@ #include "qemu-common.h" -#include "qdev.h" +#include "hw/qdev.h" #include "memory.h" #include "dma.h" /* PCI includes legacy ISA access. */ -#include "isa.h" +#include "hw/isa.h" -#include "pcie.h" +#include "hw/pci/pcie.h" /* PCI bus */ @@ -21,7 +21,7 @@ #define PCI_FUNC_MAX 8 /* Class, Vendor and Device IDs from Linux's pci_ids.h */ -#include "pci_ids.h" +#include "hw/pci/pci_ids.h" /* QEMU-specific Vendor and Device ID definitions */ @@ -100,7 +100,7 @@ typedef struct PCIIORegion { #define PCI_ROM_SLOT 6 #define PCI_NUM_REGIONS 7 -#include "pci_regs.h" +#include "hw/pci/pci_regs.h" /* PCI HEADER_TYPE */ #define PCI_HEADER_TYPE_MULTI_FUNCTION 0x80 diff --git a/hw/pci/pci_bridge.c b/hw/pci/pci_bridge.c index 4680501e4e..eb6b70bb64 100644 --- a/hw/pci/pci_bridge.c +++ b/hw/pci/pci_bridge.c @@ -29,8 +29,8 @@ * VA Linux Systems Japan K.K. */ -#include "pci_bridge.h" -#include "pci_internals.h" +#include "hw/pci/pci_bridge.h" +#include "hw/pci/pci_internals.h" #include "range.h" /* PCI bridge subsystem vendor ID helper functions */ diff --git a/hw/pci/pci_bridge.h b/hw/pci/pci_bridge.h index a00accc172..455cb6677a 100644 --- a/hw/pci/pci_bridge.h +++ b/hw/pci/pci_bridge.h @@ -26,7 +26,7 @@ #ifndef QEMU_PCI_BRIDGE_H #define QEMU_PCI_BRIDGE_H -#include "pci.h" +#include "hw/pci/pci.h" int pci_bridge_ssvid_init(PCIDevice *dev, uint8_t offset, uint16_t svid, uint16_t ssid); diff --git a/hw/pci/pci_host.c b/hw/pci/pci_host.c index 68e328cd23..daca1c1ea0 100644 --- a/hw/pci/pci_host.c +++ b/hw/pci/pci_host.c @@ -18,8 +18,8 @@ * with this program; if not, see . */ -#include "pci.h" -#include "pci_host.h" +#include "hw/pci/pci.h" +#include "hw/pci/pci_host.h" /* debug PCI */ //#define DEBUG_PCI diff --git a/hw/pci/pci_host.h b/hw/pci/pci_host.h index 4b9c300fcf..1845d4dfd5 100644 --- a/hw/pci/pci_host.h +++ b/hw/pci/pci_host.h @@ -28,7 +28,7 @@ #ifndef PCI_HOST_H #define PCI_HOST_H -#include "sysbus.h" +#include "hw/sysbus.h" #define TYPE_PCI_HOST_BRIDGE "pci-host-bridge" #define PCI_HOST_BRIDGE(obj) \ diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c index 7c92f193e7..b98adbf87a 100644 --- a/hw/pci/pcie.c +++ b/hw/pci/pcie.c @@ -19,12 +19,12 @@ */ #include "qemu-common.h" -#include "pci_bridge.h" -#include "pcie.h" -#include "msix.h" -#include "msi.h" -#include "pci_internals.h" -#include "pcie_regs.h" +#include "hw/pci/pci_bridge.h" +#include "hw/pci/pcie.h" +#include "hw/pci/msix.h" +#include "hw/pci/msi.h" +#include "hw/pci/pci_internals.h" +#include "hw/pci/pcie_regs.h" #include "range.h" //#define DEBUG_PCIE diff --git a/hw/pci/pcie.h b/hw/pci/pcie.h index 4889194ae6..31604e2742 100644 --- a/hw/pci/pcie.h +++ b/hw/pci/pcie.h @@ -21,10 +21,10 @@ #ifndef QEMU_PCIE_H #define QEMU_PCIE_H -#include "hw.h" -#include "pci_regs.h" -#include "pcie_regs.h" -#include "pcie_aer.h" +#include "hw/hw.h" +#include "hw/pci/pci_regs.h" +#include "hw/pci/pcie_regs.h" +#include "hw/pci/pcie_aer.h" typedef enum { /* for attention and power indicator */ diff --git a/hw/pci/pcie_aer.c b/hw/pci/pcie_aer.c index b04c164e22..3026b66916 100644 --- a/hw/pci/pcie_aer.c +++ b/hw/pci/pcie_aer.c @@ -21,12 +21,12 @@ #include "sysemu.h" #include "qemu-objects.h" #include "monitor.h" -#include "pci_bridge.h" -#include "pcie.h" -#include "msix.h" -#include "msi.h" -#include "pci_internals.h" -#include "pcie_regs.h" +#include "hw/pci/pci_bridge.h" +#include "hw/pci/pcie.h" +#include "hw/pci/msix.h" +#include "hw/pci/msi.h" +#include "hw/pci/pci_internals.h" +#include "hw/pci/pcie_regs.h" //#define DEBUG_PCIE #ifdef DEBUG_PCIE diff --git a/hw/pci/pcie_aer.h b/hw/pci/pcie_aer.h index 7539500cd8..bcac80a7b0 100644 --- a/hw/pci/pcie_aer.h +++ b/hw/pci/pcie_aer.h @@ -21,7 +21,7 @@ #ifndef QEMU_PCIE_AER_H #define QEMU_PCIE_AER_H -#include "hw.h" +#include "hw/hw.h" /* definitions which PCIExpressDevice uses */ diff --git a/hw/pci/pcie_host.c b/hw/pci/pcie_host.c index c257fb43ca..ab8d251de6 100644 --- a/hw/pci/pcie_host.c +++ b/hw/pci/pcie_host.c @@ -19,9 +19,9 @@ * with this program; if not, see . */ -#include "hw.h" -#include "pci.h" -#include "pcie_host.h" +#include "hw/hw.h" +#include "hw/pci/pci.h" +#include "hw/pci/pcie_host.h" #include "exec-memory.h" /* diff --git a/hw/pci/pcie_host.h b/hw/pci/pcie_host.h index 392193530d..150bef9736 100644 --- a/hw/pci/pcie_host.h +++ b/hw/pci/pcie_host.h @@ -21,7 +21,7 @@ #ifndef PCIE_HOST_H #define PCIE_HOST_H -#include "pci_host.h" +#include "hw/pci/pci_host.h" #include "memory.h" #define TYPE_PCIE_HOST_BRIDGE "pcie-host-bridge" diff --git a/hw/pci/pcie_port.c b/hw/pci/pcie_port.c index d6350e5e73..33a6b0a08a 100644 --- a/hw/pci/pcie_port.c +++ b/hw/pci/pcie_port.c @@ -18,7 +18,7 @@ * with this program; if not, see . */ -#include "pcie_port.h" +#include "hw/pci/pcie_port.h" void pcie_port_init_reg(PCIDevice *d) { diff --git a/hw/pci/pcie_port.h b/hw/pci/pcie_port.h index 3709583cc0..3259e6a9b9 100644 --- a/hw/pci/pcie_port.h +++ b/hw/pci/pcie_port.h @@ -21,8 +21,8 @@ #ifndef QEMU_PCIE_PORT_H #define QEMU_PCIE_PORT_H -#include "pci_bridge.h" -#include "pci_internals.h" +#include "hw/pci/pci_bridge.h" +#include "hw/pci/pci_internals.h" struct PCIEPort { PCIBridge br; diff --git a/hw/pci/shpc.c b/hw/pci/shpc.c index 4597bbde75..38693f759f 100644 --- a/hw/pci/shpc.c +++ b/hw/pci/shpc.c @@ -2,10 +2,10 @@ #include #include "range.h" #include "range.h" -#include "shpc.h" -#include "pci.h" -#include "pci_internals.h" -#include "msi.h" +#include "hw/pci/shpc.h" +#include "hw/pci/pci.h" +#include "hw/pci/pci_internals.h" +#include "hw/pci/msi.h" /* TODO: model power only and disabled slot states. */ /* TODO: handle SERR and wakeups */ diff --git a/hw/pci/slotid_cap.c b/hw/pci/slotid_cap.c index 01064521a9..99a30f429d 100644 --- a/hw/pci/slotid_cap.c +++ b/hw/pci/slotid_cap.c @@ -1,5 +1,5 @@ -#include "slotid_cap.h" -#include "pci.h" +#include "hw/pci/slotid_cap.h" +#include "hw/pci/pci.h" #define SLOTID_CAP_LENGTH 4 #define SLOTID_NSLOTS_SHIFT (ffs(PCI_SID_ESR_NSLOTS) - 1) From d9fb58054825ef141e6d03f455654b2e3e767bce Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 12 Dec 2012 14:39:01 +0200 Subject: [PATCH 199/300] Revert "pci: prepare makefiles for pci code reorganization" This reverts commit 475d67c3bcd6ba9fef917b6e59d96ae69eb1a9b4. Now that all users have been updated, we don't need the makefile hack or the softlink anymore. Signed-off-by: Michael S. Tsirkin --- Makefile | 1 - Makefile.target | 1 - Makefile.user | 1 - hw/pci/hw | 1 - 4 files changed, 4 deletions(-) delete mode 120000 hw/pci/hw diff --git a/Makefile b/Makefile index b9a81d18a2..9ecbcbb0a7 100644 --- a/Makefile +++ b/Makefile @@ -146,7 +146,6 @@ audio/audio.o audio/fmodaudio.o: QEMU_CFLAGS += $(FMOD_CFLAGS) QEMU_CFLAGS+=$(CURL_CFLAGS) QEMU_CFLAGS += -I$(SRC_PATH)/include -QEMU_CFLAGS+=-I$(SRC_PATH)/hw/pci -I$(SRC_PATH)/hw ui/cocoa.o: ui/cocoa.m diff --git a/Makefile.target b/Makefile.target index fe2cc0d8b0..927347bac2 100644 --- a/Makefile.target +++ b/Makefile.target @@ -12,7 +12,6 @@ endif QEMU_CFLAGS += -I.. -I$(SRC_PATH)/target-$(TARGET_BASE_ARCH) -DNEED_CPU_H QEMU_CFLAGS+=-I$(SRC_PATH)/include -QEMU_CFLAGS+=-I$(SRC_PATH)/hw/pci -I$(SRC_PATH)/hw ifdef CONFIG_USER_ONLY # user emulator name diff --git a/Makefile.user b/Makefile.user index 045ecd3bea..9302d33245 100644 --- a/Makefile.user +++ b/Makefile.user @@ -11,7 +11,6 @@ $(call set-vpath, $(SRC_PATH)) QEMU_CFLAGS+=-I.. QEMU_CFLAGS += -I$(SRC_PATH)/include QEMU_CFLAGS += -DCONFIG_USER_ONLY -QEMU_CFLAGS+=-I$(SRC_PATH)/hw/pci -I$(SRC_PATH)/hw include $(SRC_PATH)/Makefile.objs diff --git a/hw/pci/hw b/hw/pci/hw deleted file mode 120000 index 945c9b46d6..0000000000 --- a/hw/pci/hw +++ /dev/null @@ -1 +0,0 @@ -. \ No newline at end of file From 06aac7bd50cd934f416fe355633c045fee832905 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 12 Dec 2012 15:00:45 +0200 Subject: [PATCH 200/300] pci: rename pci_internals.h pci_bus.h There are lots of external users of pci_internals.h, apparently making it an internal interface only didn't work out. Let's stop pretending it's an internal header. Signed-off-by: Michael S. Tsirkin --- hw/apb_pci.c | 2 +- hw/dec_pci.c | 2 +- hw/ich9.h | 2 +- hw/lpc_ich9.c | 2 +- hw/pci/pci.c | 2 +- hw/pci/pci_bridge.c | 2 +- hw/pci/{pci_internals.h => pci_bus.h} | 0 hw/pci/pcie.c | 2 +- hw/pci/pcie_aer.c | 2 +- hw/pci/pcie_port.h | 2 +- hw/pci/shpc.c | 2 +- hw/pci_bridge_dev.c | 2 +- hw/spapr_pci.c | 2 +- 13 files changed, 12 insertions(+), 12 deletions(-) rename hw/pci/{pci_internals.h => pci_bus.h} (100%) diff --git a/hw/apb_pci.c b/hw/apb_pci.c index de594f8c0b..fb7a07de37 100644 --- a/hw/apb_pci.c +++ b/hw/apb_pci.c @@ -30,7 +30,7 @@ #include "pci/pci.h" #include "pci/pci_host.h" #include "pci/pci_bridge.h" -#include "pci/pci_internals.h" +#include "pci/pci_bus.h" #include "apb_pci.h" #include "sysemu.h" #include "exec-memory.h" diff --git a/hw/dec_pci.c b/hw/dec_pci.c index a6a7c846fd..ee3f4ca834 100644 --- a/hw/dec_pci.c +++ b/hw/dec_pci.c @@ -28,7 +28,7 @@ #include "pci/pci.h" #include "pci/pci_host.h" #include "pci/pci_bridge.h" -#include "pci/pci_internals.h" +#include "pci/pci_bus.h" /* debug DEC */ //#define DEBUG_DEC diff --git a/hw/ich9.h b/hw/ich9.h index ddd12934d5..5c73f94caf 100644 --- a/hw/ich9.h +++ b/hw/ich9.h @@ -14,7 +14,7 @@ #include "acpi.h" #include "acpi_ich9.h" #include "pam.h" -#include "pci/pci_internals.h" +#include "pci/pci_bus.h" void ich9_lpc_set_irq(void *opaque, int irq_num, int level); int ich9_lpc_map_irq(PCIDevice *pci_dev, int intx); diff --git a/hw/lpc_ich9.c b/hw/lpc_ich9.c index 811bf261c3..30505789f8 100644 --- a/hw/lpc_ich9.c +++ b/hw/lpc_ich9.c @@ -42,7 +42,7 @@ #include "acpi.h" #include "acpi_ich9.h" #include "pam.h" -#include "pci/pci_internals.h" +#include "pci/pci_bus.h" #include "exec-memory.h" #include "sysemu.h" diff --git a/hw/pci/pci.c b/hw/pci/pci.c index c107fe2232..2e455e22d2 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -24,7 +24,7 @@ #include "hw/hw.h" #include "hw/pci/pci.h" #include "hw/pci/pci_bridge.h" -#include "hw/pci/pci_internals.h" +#include "hw/pci/pci_bus.h" #include "monitor.h" #include "net.h" #include "sysemu.h" diff --git a/hw/pci/pci_bridge.c b/hw/pci/pci_bridge.c index eb6b70bb64..131091408d 100644 --- a/hw/pci/pci_bridge.c +++ b/hw/pci/pci_bridge.c @@ -30,7 +30,7 @@ */ #include "hw/pci/pci_bridge.h" -#include "hw/pci/pci_internals.h" +#include "hw/pci/pci_bus.h" #include "range.h" /* PCI bridge subsystem vendor ID helper functions */ diff --git a/hw/pci/pci_internals.h b/hw/pci/pci_bus.h similarity index 100% rename from hw/pci/pci_internals.h rename to hw/pci/pci_bus.h diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c index b98adbf87a..b60a6faaf3 100644 --- a/hw/pci/pcie.c +++ b/hw/pci/pcie.c @@ -23,7 +23,7 @@ #include "hw/pci/pcie.h" #include "hw/pci/msix.h" #include "hw/pci/msi.h" -#include "hw/pci/pci_internals.h" +#include "hw/pci/pci_bus.h" #include "hw/pci/pcie_regs.h" #include "range.h" diff --git a/hw/pci/pcie_aer.c b/hw/pci/pcie_aer.c index 3026b66916..8a2032ca49 100644 --- a/hw/pci/pcie_aer.c +++ b/hw/pci/pcie_aer.c @@ -25,7 +25,7 @@ #include "hw/pci/pcie.h" #include "hw/pci/msix.h" #include "hw/pci/msi.h" -#include "hw/pci/pci_internals.h" +#include "hw/pci/pci_bus.h" #include "hw/pci/pcie_regs.h" //#define DEBUG_PCIE diff --git a/hw/pci/pcie_port.h b/hw/pci/pcie_port.h index 3259e6a9b9..d89aa615c5 100644 --- a/hw/pci/pcie_port.h +++ b/hw/pci/pcie_port.h @@ -22,7 +22,7 @@ #define QEMU_PCIE_PORT_H #include "hw/pci/pci_bridge.h" -#include "hw/pci/pci_internals.h" +#include "hw/pci/pci_bus.h" struct PCIEPort { PCIBridge br; diff --git a/hw/pci/shpc.c b/hw/pci/shpc.c index 38693f759f..18b1512b43 100644 --- a/hw/pci/shpc.c +++ b/hw/pci/shpc.c @@ -4,7 +4,7 @@ #include "range.h" #include "hw/pci/shpc.h" #include "hw/pci/pci.h" -#include "hw/pci/pci_internals.h" +#include "hw/pci/pci_bus.h" #include "hw/pci/msi.h" /* TODO: model power only and disabled slot states. */ diff --git a/hw/pci_bridge_dev.c b/hw/pci_bridge_dev.c index 5c9fc5036b..dbb4b3b433 100644 --- a/hw/pci_bridge_dev.c +++ b/hw/pci_bridge_dev.c @@ -25,7 +25,7 @@ #include "pci/shpc.h" #include "pci/slotid_cap.h" #include "memory.h" -#include "pci/pci_internals.h" +#include "pci/pci_bus.h" #define REDHAT_PCI_VENDOR_ID 0x1b36 #define PCI_BRIDGE_DEV_VENDOR_ID REDHAT_PCI_VENDOR_ID diff --git a/hw/spapr_pci.c b/hw/spapr_pci.c index 2386164d5d..786f6f4222 100644 --- a/hw/spapr_pci.c +++ b/hw/spapr_pci.c @@ -33,7 +33,7 @@ #include #include "trace.h" -#include "hw/pci/pci_internals.h" +#include "hw/pci/pci_bus.h" /* Copied from the kernel arch/powerpc/platforms/pseries/msi.c */ #define RTAS_QUERY_FN 0 From 952deab6cff5d6d81ff7a63955e958894c07177c Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 12 Dec 2012 15:04:09 +0200 Subject: [PATCH 201/300] pci_bus: update comment Don't ask everyone to desist from including this header, simply recommend using accessors. Signed-off-by: Michael S. Tsirkin --- hw/pci/pci_bus.h | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/hw/pci/pci_bus.h b/hw/pci/pci_bus.h index 21d0ce6973..8217f61969 100644 --- a/hw/pci/pci_bus.h +++ b/hw/pci/pci_bus.h @@ -2,14 +2,10 @@ #define QEMU_PCI_INTERNALS_H /* - * This header files is private to pci.c and pci_bridge.c - * So following structures are opaque to others and shouldn't be - * accessed. + * PCI Bus and Bridge datastructures. * - * For pci-to-pci bridge needs to include this header file to embed - * PCIBridge in its structure or to get sizeof(PCIBridge), - * However, they shouldn't access those following members directly. - * Use accessor function in pci.h, pci_bridge.h + * Do not access the following members directly; + * use accessor functions in pci.h, pci_bridge.h */ #define TYPE_PCI_BUS "PCI" From 2059946358999da80be22494af2d5c3174142902 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 12 Dec 2012 23:11:16 +0200 Subject: [PATCH 202/300] pci_bus.h: tweak include guards Now that header has been renamed, tweak include guards to match. Signed-off-by: Michael S. Tsirkin --- hw/pci/pci_bus.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hw/pci/pci_bus.h b/hw/pci/pci_bus.h index 8217f61969..f905b9e11e 100644 --- a/hw/pci/pci_bus.h +++ b/hw/pci/pci_bus.h @@ -1,5 +1,5 @@ -#ifndef QEMU_PCI_INTERNALS_H -#define QEMU_PCI_INTERNALS_H +#ifndef QEMU_PCI_BUS_H +#define QEMU_PCI_BUS_H /* * PCI Bus and Bridge datastructures. @@ -71,4 +71,4 @@ struct PCIBridge { const char *bus_name; }; -#endif /* QEMU_PCI_INTERNALS_H */ +#endif /* QEMU_PCI_BUS_H */ From 1dd3a74d2ee2d873cde0b390b536e45420b3fe05 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Mon, 10 Dec 2012 13:00:45 +0200 Subject: [PATCH 203/300] kvm: do not flush after deleting gsi Deleting a GSI isn't necessary: it is enough to stop using it. Delay flush until an entry is used. Signed-off-by: Michael S. Tsirkin --- kvm-all.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/kvm-all.c b/kvm-all.c index bfa09ad05b..759ef17ab0 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -991,8 +991,6 @@ void kvm_irqchip_release_virq(KVMState *s, int virq) } } clear_gsi(s, virq); - - kvm_irqchip_commit_routes(s); } static unsigned int kvm_hash_msi(uint32_t data) From 2c1d4d15f09cf95b8f832624e7aac2916f9d1865 Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Mon, 17 Dec 2012 11:36:09 +0000 Subject: [PATCH 204/300] xen: implement support for secondary consoles in the console backend This patch corresponds to commit 840184a106bc24e745beda5c77e392f6cecd2bc9 from git://xenbits.xensource.com/qemu-xen-unstable.git. Signed-off-by: Stefano Stabellini --- hw/xen_console.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/hw/xen_console.c b/hw/xen_console.c index 9426d7374f..134988144b 100644 --- a/hw/xen_console.c +++ b/hw/xen_console.c @@ -184,7 +184,11 @@ static int con_init(struct XenDevice *xendev) /* setup */ dom = xs_get_domain_path(xenstore, con->xendev.dom); - snprintf(con->console, sizeof(con->console), "%s/console", dom); + if (!xendev->dev) { + snprintf(con->console, sizeof(con->console), "%s/console", dom); + } else { + snprintf(con->console, sizeof(con->console), "%s/device/console/%d", dom, xendev->dev); + } free(dom); type = xenstore_read_str(con->console, "type"); @@ -223,10 +227,16 @@ static int con_initialise(struct XenDevice *xendev) if (xenstore_read_int(con->console, "limit", &limit) == 0) con->buffer.max_capacity = limit; - con->sring = xc_map_foreign_range(xen_xc, con->xendev.dom, - XC_PAGE_SIZE, - PROT_READ|PROT_WRITE, - con->ring_ref); + if (!xendev->dev) { + con->sring = xc_map_foreign_range(xen_xc, con->xendev.dom, + XC_PAGE_SIZE, + PROT_READ|PROT_WRITE, + con->ring_ref); + } else { + con->sring = xc_gnttab_map_grant_ref(xendev->gnttabdev, con->xendev.dom, + con->ring_ref, + PROT_READ|PROT_WRITE); + } if (!con->sring) return -1; @@ -255,7 +265,11 @@ static void con_disconnect(struct XenDevice *xendev) xen_be_unbind_evtchn(&con->xendev); if (con->sring) { - munmap(con->sring, XC_PAGE_SIZE); + if (!xendev->gnttabdev) { + munmap(con->sring, XC_PAGE_SIZE); + } else { + xc_gnttab_munmap(xendev->gnttabdev, con->sring, 1); + } con->sring = NULL; } } @@ -273,7 +287,7 @@ static void con_event(struct XenDevice *xendev) struct XenDevOps xen_console_ops = { .size = sizeof(struct XenConsole), - .flags = DEVOPS_FLAG_IGNORE_STATE, + .flags = DEVOPS_FLAG_IGNORE_STATE|DEVOPS_FLAG_NEED_GNTDEV, .init = con_init, .initialise = con_initialise, .event = con_event, From 044b99c6555f562254ae70dc39f32190eecbc1f2 Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Mon, 17 Dec 2012 11:36:58 +0000 Subject: [PATCH 205/300] xen: fix trivial PCI passthrough MSI-X bug We are currently passing entry->data as address parameter. Pass entry->addr instead. Signed-off-by: Stefano Stabellini Tested-by: Sander Eikelenboom Xen-devel: http://marc.info/?l=xen-devel&m=135515462613715 --- hw/xen_pt_msi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/xen_pt_msi.c b/hw/xen_pt_msi.c index 680767229b..db757cd1f1 100644 --- a/hw/xen_pt_msi.c +++ b/hw/xen_pt_msi.c @@ -321,7 +321,7 @@ static int xen_pt_msix_update_one(XenPCIPassthroughState *s, int entry_nr) pirq = entry->pirq; - rc = msi_msix_setup(s, entry->data, entry->data, &pirq, true, entry_nr, + rc = msi_msix_setup(s, entry->addr, entry->data, &pirq, true, entry_nr, entry->pirq == XEN_PT_UNASSIGNED_PIRQ); if (rc) { return rc; From f1b8caf1d927f30f66054733a783651a24db4999 Mon Sep 17 00:00:00 2001 From: Sander Eikelenboom Date: Mon, 17 Dec 2012 11:37:43 +0000 Subject: [PATCH 206/300] Fix compile errors when enabling Xen debug logging. Signed-off-by: Sander Eikelenboom Acked-by: Stefano Stabellini --- hw/xen_pt.c | 5 +++-- xen-all.c | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/hw/xen_pt.c b/hw/xen_pt.c index 7a3846e649..7aae826d1f 100644 --- a/hw/xen_pt.c +++ b/hw/xen_pt.c @@ -671,7 +671,8 @@ static int xen_pt_initfn(PCIDevice *d) s->is_virtfn = s->real_device.is_virtfn; if (s->is_virtfn) { XEN_PT_LOG(d, "%04x:%02x:%02x.%d is a SR-IOV Virtual Function\n", - s->real_device.domain, bus, slot, func); + s->real_device.domain, s->real_device.bus, + s->real_device.dev, s->real_device.func); } /* Initialize virtualized PCI configuration (Extended 256 Bytes) */ @@ -752,7 +753,7 @@ out: memory_listener_register(&s->memory_listener, &address_space_memory); memory_listener_register(&s->io_listener, &address_space_io); XEN_PT_LOG(d, "Real physical device %02x:%02x.%d registered successfuly!\n", - bus, slot, func); + s->hostaddr.bus, s->hostaddr.slot, s->hostaddr.function); return 0; } diff --git a/xen-all.c b/xen-all.c index 046cc2ac37..d0142bdf60 100644 --- a/xen-all.c +++ b/xen-all.c @@ -292,7 +292,8 @@ static int xen_add_to_physmap(XenIOState *state, return -1; go_physmap: - DPRINTF("mapping vram to %llx - %llx\n", start_addr, start_addr + size); + DPRINTF("mapping vram to %"HWADDR_PRIx" - %"HWADDR_PRIx"\n", + start_addr, start_addr + size); pfn = phys_offset >> TARGET_PAGE_BITS; start_gpfn = start_addr >> TARGET_PAGE_BITS; @@ -365,8 +366,8 @@ static int xen_remove_from_physmap(XenIOState *state, phys_offset = physmap->phys_offset; size = physmap->size; - DPRINTF("unmapping vram to %llx - %llx, from %llx\n", - phys_offset, phys_offset + size, start_addr); + DPRINTF("unmapping vram to %"HWADDR_PRIx" - %"HWADDR_PRIx", from ", + "%"HWADDR_PRIx"\n", phys_offset, phys_offset + size, start_addr); size >>= TARGET_PAGE_BITS; start_addr >>= TARGET_PAGE_BITS; From a38648290ee277c7cb8a53eabdcdb08bb7a9f23f Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 17 Dec 2012 11:43:19 +0000 Subject: [PATCH 207/300] cpu_ioreq_pio, cpu_ioreq_move: introduce read_phys_req_item, write_phys_req_item Replace a lot of formulaic multiplications (containing casts, no less) with calls to a pair of functions. This encapsulates in a single place the operations which require care relating to integer overflow. Cc: Dongxiao Xu Signed-off-by: Ian Jackson Acked-by: Stefano Stabellini --- xen-all.c | 76 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/xen-all.c b/xen-all.c index d0142bdf60..ef430ca21e 100644 --- a/xen-all.c +++ b/xen-all.c @@ -683,11 +683,45 @@ static void do_outp(pio_addr_t addr, } } +/* + * Helper functions which read/write an object from/to physical guest + * memory, as part of the implementation of an ioreq. + * + * Equivalent to + * cpu_physical_memory_rw(addr + (req->df ? -1 : +1) * req->size * i, + * val, req->size, 0/1) + * except without the integer overflow problems. + */ +static void rw_phys_req_item(hwaddr addr, + ioreq_t *req, uint32_t i, void *val, int rw) +{ + /* Do everything unsigned so overflow just results in a truncated result + * and accesses to undesired parts of guest memory, which is up + * to the guest */ + hwaddr offset = (hwaddr)req->size * i; + if (req->df) { + addr -= offset; + } else { + addr += offset; + } + cpu_physical_memory_rw(addr, val, req->size, rw); +} + +static inline void read_phys_req_item(hwaddr addr, + ioreq_t *req, uint32_t i, void *val) +{ + rw_phys_req_item(addr, req, i, val, 0); +} +static inline void write_phys_req_item(hwaddr addr, + ioreq_t *req, uint32_t i, void *val) +{ + rw_phys_req_item(addr, req, i, val, 1); +} + + static void cpu_ioreq_pio(ioreq_t *req) { - int i, sign; - - sign = req->df ? -1 : 1; + int i; if (req->dir == IOREQ_READ) { if (!req->data_is_ptr) { @@ -697,9 +731,7 @@ static void cpu_ioreq_pio(ioreq_t *req) for (i = 0; i < req->count; i++) { tmp = do_inp(req->addr, req->size); - cpu_physical_memory_write( - req->data + (sign * i * (int64_t)req->size), - (uint8_t *) &tmp, req->size); + write_phys_req_item(req->data, req, i, &tmp); } } } else if (req->dir == IOREQ_WRITE) { @@ -709,9 +741,7 @@ static void cpu_ioreq_pio(ioreq_t *req) for (i = 0; i < req->count; i++) { uint32_t tmp = 0; - cpu_physical_memory_read( - req->data + (sign * i * (int64_t)req->size), - (uint8_t*) &tmp, req->size); + read_phys_req_item(req->data, req, i, &tmp); do_outp(req->addr, req->size, tmp); } } @@ -720,22 +750,16 @@ static void cpu_ioreq_pio(ioreq_t *req) static void cpu_ioreq_move(ioreq_t *req) { - int i, sign; - - sign = req->df ? -1 : 1; + int i; if (!req->data_is_ptr) { if (req->dir == IOREQ_READ) { for (i = 0; i < req->count; i++) { - cpu_physical_memory_read( - req->addr + (sign * i * (int64_t)req->size), - (uint8_t *) &req->data, req->size); + read_phys_req_item(req->addr, req, i, &req->data); } } else if (req->dir == IOREQ_WRITE) { for (i = 0; i < req->count; i++) { - cpu_physical_memory_write( - req->addr + (sign * i * (int64_t)req->size), - (uint8_t *) &req->data, req->size); + write_phys_req_item(req->addr, req, i, &req->data); } } } else { @@ -743,21 +767,13 @@ static void cpu_ioreq_move(ioreq_t *req) if (req->dir == IOREQ_READ) { for (i = 0; i < req->count; i++) { - cpu_physical_memory_read( - req->addr + (sign * i * (int64_t)req->size), - (uint8_t*) &tmp, req->size); - cpu_physical_memory_write( - req->data + (sign * i * (int64_t)req->size), - (uint8_t*) &tmp, req->size); + read_phys_req_item(req->addr, req, i, &tmp); + write_phys_req_item(req->data, req, i, &tmp); } } else if (req->dir == IOREQ_WRITE) { for (i = 0; i < req->count; i++) { - cpu_physical_memory_read( - req->data + (sign * i * (int64_t)req->size), - (uint8_t*) &tmp, req->size); - cpu_physical_memory_write( - req->addr + (sign * i * (int64_t)req->size), - (uint8_t*) &tmp, req->size); + read_phys_req_item(req->data, req, i, &tmp); + write_phys_req_item(req->addr, req, i, &tmp); } } } From 249e7e0fff080df0eff54730f3b6459d92d61e5a Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 17 Dec 2012 11:44:02 +0000 Subject: [PATCH 208/300] cpu_ioreq_pio, cpu_ioreq_move: i should be uint32_t rather than int The current code compare i (int) with req->count (uint32_t) in a for loop, risking an infinite loop if req->count is equal to UINT_MAX. Also i is only used in comparisons or multiplications with unsigned integers. Signed-off-by: Stefano Stabellini Cc: Dongxiao Xu Cc: Stefano Stabellini Signed-off-by: Ian Jackson --- xen-all.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xen-all.c b/xen-all.c index ef430ca21e..daf43b99d0 100644 --- a/xen-all.c +++ b/xen-all.c @@ -721,7 +721,7 @@ static inline void write_phys_req_item(hwaddr addr, static void cpu_ioreq_pio(ioreq_t *req) { - int i; + uint32_t i; if (req->dir == IOREQ_READ) { if (!req->data_is_ptr) { @@ -750,7 +750,7 @@ static void cpu_ioreq_pio(ioreq_t *req) static void cpu_ioreq_move(ioreq_t *req) { - int i; + uint32_t i; if (!req->data_is_ptr) { if (req->dir == IOREQ_READ) { From 2f464b5a32b414adb545acc6d94b5c35c7d258ba Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 10 Dec 2012 07:41:07 +0100 Subject: [PATCH 209/300] qxl: save qemu_create_displaysurface_from result Spotted by Coverity. https://bugzilla.redhat.com/show_bug.cgi?id=885644 Cc: qemu-stable@nongnu.org Reported-by: Markus Armbruster Signed-off-by: Gerd Hoffmann --- hw/qxl-render.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/hw/qxl-render.c b/hw/qxl-render.c index 98ecb21405..88e63f8085 100644 --- a/hw/qxl-render.c +++ b/hw/qxl-render.c @@ -113,11 +113,12 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl) qxl->guest_primary.bits_pp); if (qxl->guest_primary.qxl_stride > 0) { qemu_free_displaysurface(vga->ds); - qemu_create_displaysurface_from(qxl->guest_primary.surface.width, - qxl->guest_primary.surface.height, - qxl->guest_primary.bits_pp, - qxl->guest_primary.abs_stride, - qxl->guest_primary.data); + vga->ds->surface = qemu_create_displaysurface_from + (qxl->guest_primary.surface.width, + qxl->guest_primary.surface.height, + qxl->guest_primary.bits_pp, + qxl->guest_primary.abs_stride, + qxl->guest_primary.data); } else { qemu_resize_displaysurface(vga->ds, qxl->guest_primary.surface.width, From 938b8a36b65e44c44ca29245437f8d7ac0f826e8 Mon Sep 17 00:00:00 2001 From: Uri Lublin Date: Wed, 12 Dec 2012 18:30:47 +0200 Subject: [PATCH 210/300] qxl+vnc: register a vm state change handler for dummy spice_server When qxl + vnc are used, a dummy spice_server is initialized. The spice_server has to be told when the VM runstate changes, which is what this patch does. Without it, from qxl_send_events(), the following error message is shown: qxl_send_events: spice-server bug: guest stopped, ignoring Cc: qemu-stable@nongnu.org Signed-off-by: Uri Lublin Signed-off-by: Gerd Hoffmann --- ui/spice-core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/spice-core.c b/ui/spice-core.c index 261c6f2c11..59ce5f6370 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -732,6 +732,8 @@ int qemu_spice_add_interface(SpiceBaseInstance *sin) */ spice_server = spice_server_new(); spice_server_init(spice_server, &core_interface); + qemu_add_vm_change_state_handler(vm_change_state_handler, + &spice_server); } return spice_server_add_interface(spice_server, sin); From 07a54d704e62e2515db0b085d53d13a2f1b1b06a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 5 Dec 2012 16:15:32 +0100 Subject: [PATCH 211/300] spice-qemu-char: write to chardev whatever amount it can read The current code waits until the chardev can read MIN(len, VMC_MAX) But some chardev may never reach than amount, in fact some of them will only ever accept write of 1. Fix the min computation and remove the VMC_MAX constant. Signed-off-by: Gerd Hoffmann --- spice-qemu-char.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/spice-qemu-char.c b/spice-qemu-char.c index 09aa22d566..665efd30ee 100644 --- a/spice-qemu-char.c +++ b/spice-qemu-char.c @@ -14,8 +14,6 @@ } \ } while (0) -#define VMC_MAX_HOST_WRITE 2048 - typedef struct SpiceCharDriver { CharDriverState* chr; SpiceCharDeviceInstance sin; @@ -35,8 +33,8 @@ static int vmc_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len) uint8_t* p = (uint8_t*)buf; while (len > 0) { - last_out = MIN(len, VMC_MAX_HOST_WRITE); - if (qemu_chr_be_can_write(scd->chr) < last_out) { + last_out = MIN(len, qemu_chr_be_can_write(scd->chr)); + if (last_out <= 0) { break; } qemu_chr_be_write(scd->chr, p, last_out); From 71b423f4b970de2622803a67a2bf39b1d1f5a12c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 5 Dec 2012 16:15:33 +0100 Subject: [PATCH 212/300] spice-qemu-char: factor out CharDriverState creation Make the CharDriverState creation code reusable by spicevmc port. Signed-off-by: Gerd Hoffmann --- spice-qemu-char.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/spice-qemu-char.c b/spice-qemu-char.c index 665efd30ee..b86e83ab8c 100644 --- a/spice-qemu-char.c +++ b/spice-qemu-char.c @@ -186,13 +186,32 @@ static void print_allowed_subtypes(void) fprintf(stderr, "\n"); } -CharDriverState *qemu_chr_open_spice(QemuOpts *opts) +static CharDriverState *chr_open(QemuOpts *opts, const char *subtype) { CharDriverState *chr; SpiceCharDriver *s; - const char* name = qemu_opt_get(opts, "name"); uint32_t debug = qemu_opt_get_number(opts, "debug", 0); - const char** psubtype = spice_server_char_device_recognized_subtypes(); + + chr = g_malloc0(sizeof(CharDriverState)); + s = g_malloc0(sizeof(SpiceCharDriver)); + s->chr = chr; + s->debug = debug; + s->active = false; + s->sin.subtype = subtype; + chr->opaque = s; + chr->chr_write = spice_chr_write; + chr->chr_close = spice_chr_close; + chr->chr_guest_open = spice_chr_guest_open; + chr->chr_guest_close = spice_chr_guest_close; + + return chr; +} + +CharDriverState *qemu_chr_open_spice(QemuOpts *opts) +{ + CharDriverState *chr; + const char *name = qemu_opt_get(opts, "name"); + const char **psubtype = spice_server_char_device_recognized_subtypes(); const char *subtype = NULL; if (name == NULL) { @@ -212,17 +231,7 @@ CharDriverState *qemu_chr_open_spice(QemuOpts *opts) return NULL; } - chr = g_malloc0(sizeof(CharDriverState)); - s = g_malloc0(sizeof(SpiceCharDriver)); - s->chr = chr; - s->debug = debug; - s->active = false; - s->sin.subtype = subtype; - chr->opaque = s; - chr->chr_write = spice_chr_write; - chr->chr_close = spice_chr_close; - chr->chr_guest_open = spice_chr_guest_open; - chr->chr_guest_close = spice_chr_guest_close; + chr = chr_open(opts, subtype); #if SPICE_SERVER_VERSION < 0x000901 /* See comment in vmc_state() */ From 5a49d3e9a799b7e1bf87da7ae7f2a719e01da319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 5 Dec 2012 16:15:34 +0100 Subject: [PATCH 213/300] spice-qemu-char: add spiceport chardev Add a new spice chardev to allow arbitrary communication between the host and the Spice client via the spice server. Examples: This allows the Spice client to have a special port for the qemu monitor: ... -chardev spiceport,name=org.qemu.monitor,id=monitorport -mon chardev=monitorport v2: - remove support for chardev to chardev linking - conditionnaly compile with SPICE_SERVER_VERSION Signed-off-by: Gerd Hoffmann --- qemu-char.c | 3 +++ qemu-options.hx | 13 +++++++++++++ spice-qemu-char.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ trace-events | 1 + ui/qemu-spice.h | 3 +++ 5 files changed, 65 insertions(+) diff --git a/qemu-char.c b/qemu-char.c index 242b799909..9940701d6a 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -2762,6 +2762,9 @@ static const struct { #endif #ifdef CONFIG_SPICE { .name = "spicevmc", .open = qemu_chr_open_spice }, +#if SPICE_SERVER_VERSION >= 0x000c02 + { .name = "spiceport", .open = qemu_chr_open_spice_port }, +#endif #endif }; diff --git a/qemu-options.hx b/qemu-options.hx index 231cc4f55f..9df0cde64c 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -1749,6 +1749,7 @@ DEF("chardev", HAS_ARG, QEMU_OPTION_chardev, #endif #if defined(CONFIG_SPICE) "-chardev spicevmc,id=id,name=name[,debug=debug]\n" + "-chardev spiceport,id=id,name=name[,debug=debug]\n" #endif , QEMU_ARCH_ALL ) @@ -1776,6 +1777,7 @@ Backend is one of: @option{tty}, @option{parport}, @option{spicevmc}. +@option{spiceport}. The specific backend will determine the applicable options. All devices must have an id, which can be any string up to 127 characters long. @@ -1961,6 +1963,17 @@ required. Connect to a spice virtual machine channel, such as vdiport. +@item -chardev spiceport ,id=@var{id} ,debug=@var{debug}, name=@var{name} + +@option{spiceport} is only available when spice support is built in. + +@option{debug} debug level for spicevmc + +@option{name} name of spice port to connect to + +Connect to a spice port, allowing a Spice client to handle the traffic +identified by a name (preferably a fqdn). + @end table ETEXI diff --git a/spice-qemu-char.c b/spice-qemu-char.c index b86e83ab8c..4be75ba353 100644 --- a/spice-qemu-char.c +++ b/spice-qemu-char.c @@ -3,6 +3,7 @@ #include "ui/qemu-spice.h" #include #include +#include #include "osdep.h" @@ -67,6 +68,27 @@ static int vmc_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len) return bytes; } +#if SPICE_SERVER_VERSION >= 0x000c02 +static void vmc_event(SpiceCharDeviceInstance *sin, uint8_t event) +{ + SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin); + int chr_event; + + switch (event) { + case SPICE_PORT_EVENT_BREAK: + chr_event = CHR_EVENT_BREAK; + break; + default: + dprintf(scd, 2, "%s: unknown %d\n", __func__, event); + return; + } + + dprintf(scd, 2, "%s: %d\n", __func__, event); + trace_spice_vmc_event(chr_event); + qemu_chr_be_event(scd->chr, chr_event); +} +#endif + static void vmc_state(SpiceCharDeviceInstance *sin, int connected) { SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin); @@ -103,6 +125,9 @@ static SpiceCharDeviceInterface vmc_interface = { .state = vmc_state, .write = vmc_write, .read = vmc_read, +#if SPICE_SERVER_VERSION >= 0x000c02 + .event = vmc_event, +#endif }; @@ -242,3 +267,23 @@ CharDriverState *qemu_chr_open_spice(QemuOpts *opts) return chr; } + +#if SPICE_SERVER_VERSION >= 0x000c02 +CharDriverState *qemu_chr_open_spice_port(QemuOpts *opts) +{ + CharDriverState *chr; + SpiceCharDriver *s; + const char *name = qemu_opt_get(opts, "name"); + + if (name == NULL) { + fprintf(stderr, "spice-qemu-char: missing name parameter\n"); + return NULL; + } + + chr = chr_open(opts, "port"); + s = chr->opaque; + s->sin.portname = name; + + return chr; +} +#endif diff --git a/trace-events b/trace-events index 6cb450a993..bb7621eeb6 100644 --- a/trace-events +++ b/trace-events @@ -535,6 +535,7 @@ spice_vmc_write(ssize_t out, int len) "spice wrottn %zd of requested %d" spice_vmc_read(int bytes, int len) "spice read %d of requested %d" spice_vmc_register_interface(void *scd) "spice vmc registered interface %p" spice_vmc_unregister_interface(void *scd) "spice vmc unregistered interface %p" +spice_vmc_event(int event) "spice vmc event %d" # hw/lm32_pic.c lm32_pic_raise_irq(void) "Raise CPU interrupt" diff --git a/ui/qemu-spice.h b/ui/qemu-spice.h index 3299da87d6..5669767de0 100644 --- a/ui/qemu-spice.h +++ b/ui/qemu-spice.h @@ -46,6 +46,9 @@ void do_info_spice_print(Monitor *mon, const QObject *data); void do_info_spice(Monitor *mon, QObject **ret_data); CharDriverState *qemu_chr_open_spice(QemuOpts *opts); +#if SPICE_SERVER_VERSION >= 0x000c02 +CharDriverState *qemu_chr_open_spice_port(QemuOpts *opts); +#endif #else /* CONFIG_SPICE */ #include "monitor.h" From 7a5448ce6ef140a20b1a090d50aeb4248d0a9ffd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 5 Dec 2012 16:15:35 +0100 Subject: [PATCH 214/300] spice-qemu-char: keep a list of spice chardev Signed-off-by: Gerd Hoffmann --- spice-qemu-char.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spice-qemu-char.c b/spice-qemu-char.c index 4be75ba353..4eb85ae798 100644 --- a/spice-qemu-char.c +++ b/spice-qemu-char.c @@ -24,8 +24,12 @@ typedef struct SpiceCharDriver { uint8_t *datapos; ssize_t bufsize, datalen; uint32_t debug; + QLIST_ENTRY(SpiceCharDriver) next; } SpiceCharDriver; +static QLIST_HEAD(, SpiceCharDriver) spice_chars = + QLIST_HEAD_INITIALIZER(spice_chars); + static int vmc_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len) { SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin); @@ -179,6 +183,7 @@ static void spice_chr_close(struct CharDriverState *chr) printf("%s\n", __func__); vmc_unregister_interface(s); + QLIST_REMOVE(s, next); g_free(s); } @@ -229,6 +234,8 @@ static CharDriverState *chr_open(QemuOpts *opts, const char *subtype) chr->chr_guest_open = spice_chr_guest_open; chr->chr_guest_close = spice_chr_guest_close; + QLIST_INSERT_HEAD(&spice_chars, s, next); + return chr; } From afd0b4091fef7a1290cf76c6da8c9a24a3553d58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 5 Dec 2012 16:15:36 +0100 Subject: [PATCH 215/300] spice-qemu-char: register spicevmc ports during qemu_spice_init() Do the delayed registration of spicevmc ports after Spice server is initialized. Signed-off-by: Gerd Hoffmann --- spice-qemu-char.c | 12 ++++++++++++ ui/qemu-spice.h | 1 + ui/spice-core.c | 4 ++++ 3 files changed, 17 insertions(+) diff --git a/spice-qemu-char.c b/spice-qemu-char.c index 4eb85ae798..b2586c263d 100644 --- a/spice-qemu-char.c +++ b/spice-qemu-char.c @@ -293,4 +293,16 @@ CharDriverState *qemu_chr_open_spice_port(QemuOpts *opts) return chr; } + +void qemu_spice_register_ports(void) +{ + SpiceCharDriver *s; + + QLIST_FOREACH(s, &spice_chars, next) { + if (s->sin.portname == NULL) { + continue; + } + vmc_register_interface(s); + } +} #endif diff --git a/ui/qemu-spice.h b/ui/qemu-spice.h index 5669767de0..642f012690 100644 --- a/ui/qemu-spice.h +++ b/ui/qemu-spice.h @@ -48,6 +48,7 @@ void do_info_spice(Monitor *mon, QObject **ret_data); CharDriverState *qemu_chr_open_spice(QemuOpts *opts); #if SPICE_SERVER_VERSION >= 0x000c02 CharDriverState *qemu_chr_open_spice_port(QemuOpts *opts); +void qemu_spice_register_ports(void); #endif #else /* CONFIG_SPICE */ diff --git a/ui/spice-core.c b/ui/spice-core.c index 59ce5f6370..ac46deb2be 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -714,6 +714,10 @@ void qemu_spice_init(void) g_free(x509_key_file); g_free(x509_cert_file); g_free(x509_cacert_file); + +#if SPICE_SERVER_VERSION >= 0x000c02 + qemu_spice_register_ports(); +#endif } int qemu_spice_add_interface(SpiceBaseInstance *sin) From 700f6b6a921861a8946377a9531b6d1e8b09bb51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 5 Dec 2012 16:15:37 +0100 Subject: [PATCH 216/300] docs: add spice-port-fqdn.txt Start a simple org.qemu.* registry of well known name. Signed-off-by: Gerd Hoffmann --- docs/spice-port-fqdn.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 docs/spice-port-fqdn.txt diff --git a/docs/spice-port-fqdn.txt b/docs/spice-port-fqdn.txt new file mode 100644 index 0000000000..50778952e5 --- /dev/null +++ b/docs/spice-port-fqdn.txt @@ -0,0 +1,19 @@ +A Spice port channel is an arbitrary communication between the Spice +server host side and the client side. + +Thanks to the associated reverse fully qualified domain name (fqdn), +a Spice client can handle the various ports appropriately. + +The following fqdn names are reserved by the QEMU project: + +org.qemu.monitor.hmp.0 + QEMU human monitor + +org.qemu.monitor.qmp.0: + QEMU control monitor + +org.qemu.console.serial.0 + QEMU virtual serial port + +org.qemu.console.debug.0 + QEMU debug console From 5f0cef1aa92b98610a99125d1d1d80e9339ac7c5 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Thu, 27 Sep 2012 09:51:55 +0200 Subject: [PATCH 217/300] libcacard: simplify rules for recursive build Signed-off-by: Paolo Bonzini --- Makefile | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 9ecbcbb0a7..d06fbad6c9 100644 --- a/Makefile +++ b/Makefile @@ -169,19 +169,11 @@ libqemustub.a: $(stub-obj-y) # Support building shared library libcacard .PHONY: libcacard.la install-libcacard -ifeq ($(LIBTOOL),) -libcacard.la: - @echo "libtool is missing, please install and rerun configure"; exit 1 - -install-libcacard: - @echo "libtool is missing, please install and rerun configure"; exit 1 -else -libcacard.la: $(oslib-obj-y) qemu-timer-common.o $(addsuffix .lo, $(basename $(trace-obj-y))) +libcacard.la: $(oslib-obj-y) qemu-timer-common.o $(trace-obj-y) $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C libcacard V="$(V)" TARGET_DIR="$*/" libcacard.la,) install-libcacard: libcacard.la $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C libcacard V="$(V)" TARGET_DIR="$*/" install-libcacard,) -endif ###################################################################### From 4e28976e563ad54f6adc5ae00b1fb8224f1a82ca Mon Sep 17 00:00:00 2001 From: Amit Shah Date: Wed, 12 Dec 2012 18:26:09 +0530 Subject: [PATCH 218/300] virtio-serial-bus: send_control_msg() should not deal with cpkts Stuff the cpkt before calling send_control_msg(). This function should not be concerned about contents of the buffer it receives. A few code refactorings recently have made making this change easier than earlier. Coverity and clang have flagged this code several times in the past (cpkt->id not set before send_control_event() passed it on to send_control_msg()). This will finally eliminate the false-positive. CC: Markus Armbruster Reviewed-by: Markus Armbruster Signed-off-by: Amit Shah --- hw/virtio-serial-bus.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c index fc0166ca7f..3ea95b8b52 100644 --- a/hw/virtio-serial-bus.c +++ b/hw/virtio-serial-bus.c @@ -217,13 +217,12 @@ static void flush_queued_data(VirtIOSerialPort *port) do_flush_queued_data(port, port->ovq, &port->vser->vdev); } -static size_t send_control_msg(VirtIOSerialPort *port, void *buf, size_t len) +static size_t send_control_msg(VirtIOSerial *vser, void *buf, size_t len) { VirtQueueElement elem; VirtQueue *vq; - struct virtio_console_control *cpkt; - vq = port->vser->c_ivq; + vq = vser->c_ivq; if (!virtio_queue_ready(vq)) { return 0; } @@ -231,25 +230,24 @@ static size_t send_control_msg(VirtIOSerialPort *port, void *buf, size_t len) return 0; } - cpkt = (struct virtio_console_control *)buf; - stl_p(&cpkt->id, port->id); memcpy(elem.in_sg[0].iov_base, buf, len); virtqueue_push(vq, &elem, len); - virtio_notify(&port->vser->vdev, vq); + virtio_notify(&vser->vdev, vq); return len; } -static size_t send_control_event(VirtIOSerialPort *port, uint16_t event, - uint16_t value) +static size_t send_control_event(VirtIOSerial *vser, uint32_t port_id, + uint16_t event, uint16_t value) { struct virtio_console_control cpkt; + stl_p(&cpkt.id, port_id); stw_p(&cpkt.event, event); stw_p(&cpkt.value, value); - trace_virtio_serial_send_control_event(port->id, event, value); - return send_control_msg(port, &cpkt, sizeof(cpkt)); + trace_virtio_serial_send_control_event(port_id, event, value); + return send_control_msg(vser, &cpkt, sizeof(cpkt)); } /* Functions for use inside qemu to open and read from/write to ports */ @@ -261,7 +259,7 @@ int virtio_serial_open(VirtIOSerialPort *port) } /* Send port open notification to the guest */ port->host_connected = true; - send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN, 1); + send_control_event(port->vser, port->id, VIRTIO_CONSOLE_PORT_OPEN, 1); return 0; } @@ -276,7 +274,7 @@ int virtio_serial_close(VirtIOSerialPort *port) port->throttled = false; discard_vq_data(port->ovq, &port->vser->vdev); - send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN, 0); + send_control_event(port->vser, port->id, VIRTIO_CONSOLE_PORT_OPEN, 0); return 0; } @@ -365,7 +363,7 @@ static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len) * ports we have here. */ QTAILQ_FOREACH(port, &vser->ports, next) { - send_control_event(port, VIRTIO_CONSOLE_PORT_ADD, 1); + send_control_event(vser, port->id, VIRTIO_CONSOLE_PORT_ADD, 1); } return; } @@ -396,10 +394,11 @@ static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len) * up to hvc. */ if (vsc->is_console) { - send_control_event(port, VIRTIO_CONSOLE_CONSOLE_PORT, 1); + send_control_event(vser, port->id, VIRTIO_CONSOLE_CONSOLE_PORT, 1); } if (port->name) { + stl_p(&cpkt.id, port->id); stw_p(&cpkt.event, VIRTIO_CONSOLE_PORT_NAME); stw_p(&cpkt.value, 1); @@ -410,12 +409,12 @@ static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len) memcpy(buffer + sizeof(cpkt), port->name, strlen(port->name)); buffer[buffer_len - 1] = 0; - send_control_msg(port, buffer, buffer_len); + send_control_msg(vser, buffer, buffer_len); g_free(buffer); } if (port->host_connected) { - send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN, 1); + send_control_event(vser, port->id, VIRTIO_CONSOLE_PORT_OPEN, 1); } /* @@ -655,7 +654,7 @@ static void virtio_serial_post_load_timer_cb(void *opaque) * We have to let the guest know of the host connection * status change */ - send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN, + send_control_event(s, port->id, VIRTIO_CONSOLE_PORT_OPEN, port->host_connected); } } @@ -841,9 +840,7 @@ static void mark_port_added(VirtIOSerial *vser, uint32_t port_id) static void add_port(VirtIOSerial *vser, uint32_t port_id) { mark_port_added(vser, port_id); - - send_control_event(find_port_by_id(vser, port_id), - VIRTIO_CONSOLE_PORT_ADD, 1); + send_control_event(vser, port_id, VIRTIO_CONSOLE_PORT_ADD, 1); } static void remove_port(VirtIOSerial *vser, uint32_t port_id) @@ -858,7 +855,7 @@ static void remove_port(VirtIOSerial *vser, uint32_t port_id) /* Flush out any unconsumed buffers first */ discard_vq_data(port->ovq, &port->vser->vdev); - send_control_event(port, VIRTIO_CONSOLE_PORT_REMOVE, 1); + send_control_event(vser, port->id, VIRTIO_CONSOLE_PORT_REMOVE, 1); } static int virtser_port_qdev_init(DeviceState *qdev) From 91bdd1cf08f65b7a127c22d4d65ff9d16dcac870 Mon Sep 17 00:00:00 2001 From: Amit Shah Date: Tue, 18 Dec 2012 13:08:33 +0530 Subject: [PATCH 219/300] virtio-serial-bus: assert port is non-null in remove_port() remove_port() is called from qdev's unplug callback, and we're certain the port will be found in our list of ports. Adding an assert() documents this. This was flagged by Coverity, fix suggested by Markus. CC: Markus Armbruster Reviewed-by: Markus Armbruster Signed-off-by: Amit Shah --- hw/virtio-serial-bus.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c index 3ea95b8b52..ce4556fc48 100644 --- a/hw/virtio-serial-bus.c +++ b/hw/virtio-serial-bus.c @@ -852,6 +852,12 @@ static void remove_port(VirtIOSerial *vser, uint32_t port_id) vser->ports_map[i] &= ~(1U << (port_id % 32)); port = find_port_by_id(vser, port_id); + /* + * This function is only called from qdev's unplug callback; if we + * get a NULL port here, we're in trouble. + */ + assert(port); + /* Flush out any unconsumed buffers first */ discard_vq_data(port->ovq, &port->vser->vdev); From e103129b1b5746f8388b37d18317e61d6b139b69 Mon Sep 17 00:00:00 2001 From: Zhi Yong Wu Date: Fri, 7 Dec 2012 09:43:18 +0800 Subject: [PATCH 220/300] net, hub: fix the indent in the comments Remove some redundant blanks in the comments of net_hub_id_for_client(). Signed-off-by: Zhi Yong Wu Signed-off-by: Stefan Hajnoczi --- net/hub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/hub.c b/net/hub.c index be413012bb..3b2d1ffcd2 100644 --- a/net/hub.c +++ b/net/hub.c @@ -256,7 +256,7 @@ void net_hub_info(Monitor *mon) /** * Get the hub id that a client is connected to * - * @id Pointer for hub id output, may be NULL + * @id: Pointer for hub id output, may be NULL */ int net_hub_id_for_client(NetClientState *nc, int *id) { From d96fc51cc6defcd80bdf932823dadd88be532a0b Mon Sep 17 00:00:00 2001 From: Peter Crosthwaite Date: Tue, 4 Dec 2012 16:04:33 +1000 Subject: [PATCH 221/300] pflash_cfi01: qemu_log_mask "unimplemented" msg This printf is informing the user of unimplemented functionality. It should be re-directed to qemu_log(LOG_UNIMP, ...) accordingly. Signed-off-by: Peter Crosthwaite Reviewed-by: Peter Maydell Signed-off-by: Stefan Hajnoczi --- hw/pflash_cfi01.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hw/pflash_cfi01.c b/hw/pflash_cfi01.c index 7d040b508a..f9f8e5d03c 100644 --- a/hw/pflash_cfi01.c +++ b/hw/pflash_cfi01.c @@ -438,9 +438,9 @@ static void pflash_write(pflash_t *pfl, hwaddr offset, return; error_flash: - printf("%s: Unimplemented flash cmd sequence " - "(offset " TARGET_FMT_plx ", wcycle 0x%x cmd 0x%x value 0x%x)\n", - __func__, offset, pfl->wcycle, pfl->cmd, value); + qemu_log_mask(LOG_UNIMP, "%s: Unimplemented flash cmd sequence " + "(offset " TARGET_FMT_plx ", wcycle 0x%x cmd 0x%x value 0x%x)" + "\n", __func__, offset, pfl->wcycle, pfl->cmd, value); reset_flash: memory_region_rom_device_set_readable(&pfl->mem, true); From ec9ea4890cd06de1648cbbfb99fcb63e01f4000f Mon Sep 17 00:00:00 2001 From: Peter Crosthwaite Date: Tue, 4 Dec 2012 16:04:34 +1000 Subject: [PATCH 222/300] pflash_cfi0x: Send debug messages to stderr These debug info messages should go to stderr rather than stdout. Signed-off-by: Peter Crosthwaite Reviewed-by: Peter Maydell Signed-off-by: Stefan Hajnoczi --- hw/pflash_cfi01.c | 8 ++++---- hw/pflash_cfi02.c | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/hw/pflash_cfi01.c b/hw/pflash_cfi01.c index f9f8e5d03c..931264ff8c 100644 --- a/hw/pflash_cfi01.c +++ b/hw/pflash_cfi01.c @@ -46,15 +46,15 @@ #define PFLASH_BUG(fmt, ...) \ do { \ - printf("PFLASH: Possible BUG - " fmt, ## __VA_ARGS__); \ + fprintf(stderr, "PFLASH: Possible BUG - " fmt, ## __VA_ARGS__); \ exit(1); \ } while(0) /* #define PFLASH_DEBUG */ #ifdef PFLASH_DEBUG -#define DPRINTF(fmt, ...) \ -do { \ - printf("PFLASH: " fmt , ## __VA_ARGS__); \ +#define DPRINTF(fmt, ...) \ +do { \ + fprintf(stderr, "PFLASH: " fmt , ## __VA_ARGS__); \ } while (0) #else #define DPRINTF(fmt, ...) do { } while (0) diff --git a/hw/pflash_cfi02.c b/hw/pflash_cfi02.c index f918e36580..c60ae831b4 100644 --- a/hw/pflash_cfi02.c +++ b/hw/pflash_cfi02.c @@ -45,9 +45,9 @@ //#define PFLASH_DEBUG #ifdef PFLASH_DEBUG -#define DPRINTF(fmt, ...) \ -do { \ - printf("PFLASH: " fmt , ## __VA_ARGS__); \ +#define DPRINTF(fmt, ...) \ +do { \ + fprintf(stderr "PFLASH: " fmt , ## __VA_ARGS__); \ } while (0) #else #define DPRINTF(fmt, ...) do { } while (0) From 8f6038009662b481fbd1e43cd69af80aa10a8223 Mon Sep 17 00:00:00 2001 From: Peter Crosthwaite Date: Tue, 4 Dec 2012 16:04:35 +1000 Subject: [PATCH 223/300] zynq_slcr: Compile time warning fixes. Few warnings when compiled with debug printfs enabled. Fixed all. Signed-off-by: Peter Crosthwaite Reviewed-by: Peter Maydell Signed-off-by: Stefan Hajnoczi --- hw/zynq_slcr.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hw/zynq_slcr.c b/hw/zynq_slcr.c index dde4306195..f55ab8d8a9 100644 --- a/hw/zynq_slcr.c +++ b/hw/zynq_slcr.c @@ -334,7 +334,7 @@ static uint64_t zynq_slcr_read(void *opaque, hwaddr offset, { uint32_t ret = zynq_slcr_read_imp(opaque, offset); - DB_PRINT("addr: %08x data: %08x\n", offset, ret); + DB_PRINT("addr: %08x data: %08x\n", (unsigned)offset, (unsigned)ret); return ret; } @@ -343,7 +343,7 @@ static void zynq_slcr_write(void *opaque, hwaddr offset, { ZynqSLCRState *s = (ZynqSLCRState *)opaque; - DB_PRINT("offset: %08x data: %08x\n", offset, (unsigned)val); + DB_PRINT("offset: %08x data: %08x\n", (unsigned)offset, (unsigned)val); switch (offset) { case 0x00: /* SCL */ @@ -476,7 +476,8 @@ static void zynq_slcr_write(void *opaque, hwaddr offset, break; default: bad_reg: - DB_PRINT("Bad register write %x <= %08x\n", (int)offset, val); + DB_PRINT("Bad register write %x <= %08x\n", (int)offset, + (unsigned)val); } } else { DB_PRINT("SCLR registers are locked. Unlock them first\n"); From 8c815fb30ed1940c66389be728b29d5ebdf05c0e Mon Sep 17 00:00:00 2001 From: Peter Crosthwaite Date: Tue, 4 Dec 2012 16:04:36 +1000 Subject: [PATCH 224/300] arm_gic: Add cpu nr to Raised IRQ message Add the relevant CPU nr to this debug message to make IRQ debugging more informative. Signed-off-by: Peter Crosthwaite Reviewed-by: Peter Maydell Signed-off-by: Stefan Hajnoczi --- hw/arm_gic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/arm_gic.c b/hw/arm_gic.c index 8d769de4f5..b6062c4241 100644 --- a/hw/arm_gic.c +++ b/hw/arm_gic.c @@ -76,7 +76,7 @@ void gic_update(GICState *s) if (best_prio < s->priority_mask[cpu]) { s->current_pending[cpu] = best_irq; if (best_prio < s->running_priority[cpu]) { - DPRINTF("Raised pending IRQ %d\n", best_irq); + DPRINTF("Raised pending IRQ %d (cpu %d)\n", best_irq, cpu); level = 1; } } From 887eb29930a7b48e46d16916cb050d114016f143 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Thu, 6 Dec 2012 20:03:26 -0500 Subject: [PATCH 225/300] gitignore: Add virtfs-proxy-helper Signed-off-by: Cole Robinson Signed-off-by: Stefan Hajnoczi --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index bd6ba1c71e..3ce57ccd58 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ test-qmp-output-visitor test-string-input-visitor test-string-output-visitor test-visitor-serialization +fsdev/virtfs-proxy-helper fsdev/virtfs-proxy-helper.1 fsdev/virtfs-proxy-helper.pod .gdbinit From e12cdb1b4055530c61fe99683d256c42e9e62ac8 Mon Sep 17 00:00:00 2001 From: John Spencer Date: Mon, 10 Dec 2012 07:59:44 +0100 Subject: [PATCH 226/300] fix build error on ARM due to wrong glibc check the test for glibc < 2 "succeeds" wrongly for any non-glibc C library, and breaks the build on musl libc. we must first test if __GLIBC__ is defined at all, before using it unconditionally. Signed-off-by: John Spencer Reviewed-by: Stefan Weil Signed-off-by: Stefan Hajnoczi --- user-exec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user-exec.c b/user-exec.c index 1185cb03c8..5863b9f362 100644 --- a/user-exec.c +++ b/user-exec.c @@ -436,7 +436,7 @@ int cpu_signal_handler(int host_signum, void *pinfo, unsigned long pc; int is_write; -#if (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3)) +#if defined(__GLIBC__) && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3)) pc = uc->uc_mcontext.gregs[R15]; #else pc = uc->uc_mcontext.arm_pc; From c56dc774242f902e51e2343f4472e742ef2b7838 Mon Sep 17 00:00:00 2001 From: John Spencer Date: Mon, 10 Dec 2012 07:59:46 +0100 Subject: [PATCH 227/300] linux-user/syscall.c: remove wrong forward decl of setgroups() this declaration is wrong: the correct prototype on linux is: int setgroups(size_t size, const gid_t *list); since by default musl libc exposes this symbol in unistd.h additionally to grp.h, the wrong declaration causes a build error. the proper fix is to simply include the correct header. Signed-off-by: John Spencer Reviewed-by: Stefan Weil Signed-off-by: Stefan Hajnoczi --- linux-user/syscall.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 31d5276465..275260a6ff 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -584,7 +585,6 @@ extern int personality(int); extern int flock(int, int); extern int setfsuid(int); extern int setfsgid(int); -extern int setgroups(int, gid_t *); /* ARM EABI and MIPS expect 64bit types aligned even on pairs or registers */ #ifdef TARGET_ARM From 5a6c7644b215060a43d94709307d86bc50e1b4b9 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 13 Dec 2012 15:01:49 +0100 Subject: [PATCH 228/300] vmmouse_reset(): remove minimal code duplication Commit 069ab0eb added a vmmouse_disable() call to vmmouse_reset(). vmmouse_disable() resets the status already. Signed-off-by: Laszlo Ersek Signed-off-by: Stefan Hajnoczi --- hw/vmmouse.c | 1 - 1 file changed, 1 deletion(-) diff --git a/hw/vmmouse.c b/hw/vmmouse.c index 6338efa1c3..578122c9f5 100644 --- a/hw/vmmouse.c +++ b/hw/vmmouse.c @@ -252,7 +252,6 @@ static void vmmouse_reset(DeviceState *d) { VMMouseState *s = container_of(d, VMMouseState, dev.qdev); - s->status = 0xffff; s->queue_size = VMMOUSE_QUEUE_SIZE; vmmouse_disable(s); From 779ab5e3ddb9ad903f9a0ec21e148ed7bfd2d255 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Sun, 16 Dec 2012 11:29:45 +0100 Subject: [PATCH 229/300] configure: Earlier pkg-config probe Probe pkg-config before it is used for the first time (libseccomp check). Signed-off-by: Stefan Weil Signed-off-by: Stefan Hajnoczi --- configure | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/configure b/configure index ecdb33a58e..728caca0d0 100755 --- a/configure +++ b/configure @@ -1359,6 +1359,14 @@ esac fi +########################################## +# pkg-config probe + +if ! has "$pkg_config_exe"; then + echo "Error: pkg-config binary '$pkg_config_exe' not found" + exit 1 +fi + ########################################## # NPTL probe @@ -1589,14 +1597,6 @@ if test "$xen_pci_passthrough" != "no"; then fi fi -########################################## -# pkg-config probe - -if ! has "$pkg_config_exe"; then - echo "Error: pkg-config binary '$pkg_config_exe' not found" - exit 1 -fi - ########################################## # libtool probe From 7937e75b1aba66cf24c93e58c48cbb4d59d1c19c Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 24 Oct 2012 10:47:53 +0200 Subject: [PATCH 230/300] vscclient: use per-target variables Signed-off-by: Paolo Bonzini --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d06fbad6c9..7e381127e8 100644 --- a/Makefile +++ b/Makefile @@ -189,8 +189,9 @@ qemu-io$(EXESUF): qemu-io.o cmd.o $(tools-obj-y) $(block-obj-y) libqemustub.a qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o +vscclient$(EXESUF): LIBS += $(libcacard_libs) vscclient$(EXESUF): $(libcacard-y) $(oslib-obj-y) $(trace-obj-y) libcacard/vscclient.o libqemustub.a - $(call quiet-command,$(CC) $(LDFLAGS) -o $@ $^ $(libcacard_libs) $(LIBS)," LINK $@") + $(call LINK, $^) fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/virtio-9p-marshal.o oslib-posix.o $(trace-obj-y) fsdev/virtfs-proxy-helper$(EXESUF): LIBS += -lcap From 9d9199a003b7531257836d5abb0b30c250303885 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 17 Sep 2012 10:21:52 +0200 Subject: [PATCH 231/300] build: adjust setting of QEMU_INCLUDES Make it correct for nested directories, and move the static part from Makefile to configure. Signed-off-by: Paolo Bonzini --- Makefile | 2 -- configure | 3 +-- rules.mak | 3 +++ 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 7e381127e8..9ebd3cd24f 100644 --- a/Makefile +++ b/Makefile @@ -145,8 +145,6 @@ audio/audio.o audio/fmodaudio.o: QEMU_CFLAGS += $(FMOD_CFLAGS) QEMU_CFLAGS+=$(CURL_CFLAGS) -QEMU_CFLAGS += -I$(SRC_PATH)/include - ui/cocoa.o: ui/cocoa.m ui/sdl.o audio/sdlaudio.o ui/sdl_zoom.o hw/baum.o: QEMU_CFLAGS += $(SDL_CFLAGS) diff --git a/configure b/configure index ecdb33a58e..e9ad1b1bd8 100755 --- a/configure +++ b/configure @@ -278,7 +278,7 @@ QEMU_CFLAGS="-fno-strict-aliasing $QEMU_CFLAGS" QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS" QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS" QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS" -QEMU_INCLUDES="-I. -I\$(SRC_PATH) -I\$(SRC_PATH)/fpu" +QEMU_INCLUDES="-I. -I\$(SRC_PATH) -I\$(SRC_PATH)/include -I\$(SRC_PATH)/fpu" if test "$debug_info" = "yes"; then CFLAGS="-g $CFLAGS" LDFLAGS="-g $LDFLAGS" @@ -3343,7 +3343,6 @@ fi if test "$slirp" = "yes" ; then echo "CONFIG_SLIRP=y" >> $config_host_mak echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak - QEMU_INCLUDES="-I\$(SRC_PATH)/slirp $QEMU_INCLUDES" fi if test "$vde" = "yes" ; then echo "CONFIG_VDE=y" >> $config_host_mak diff --git a/rules.mak b/rules.mak index d0b04e44f5..77d23605bf 100644 --- a/rules.mak +++ b/rules.mak @@ -14,6 +14,9 @@ MAKEFLAGS += -rR # Flags for dependency generation QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d +# Same as -I$(SRC_PATH) -I., but for the nested source/object directories +QEMU_CFLAGS += -I$( Date: Mon, 17 Sep 2012 10:31:17 +0200 Subject: [PATCH 232/300] build: add $(TARGET_DIR) to "GEN config-target.h" lines Signed-off-by: Paolo Bonzini --- rules.mak | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules.mak b/rules.mak index 77d23605bf..8448b94cdf 100644 --- a/rules.mak +++ b/rules.mak @@ -71,7 +71,7 @@ TRACETOOL=$(PYTHON) $(SRC_PATH)/scripts/tracetool.py @test -f $@ || cp $< $@ %.h-timestamp: %.mak - $(call quiet-command, sh $(SRC_PATH)/scripts/create_config < $< > $@, " GEN $*.h") + $(call quiet-command, sh $(SRC_PATH)/scripts/create_config < $< > $@, " GEN $(TARGET_DIR)$*.h") @cmp $@ $*.h >/dev/null 2>&1 || cp $@ $*.h # will delete the target of a rule if commands exit with a nonzero exit status From 525877c9992a07d424be4cfdd4ba13a69141a513 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 17 Sep 2012 08:35:53 +0200 Subject: [PATCH 233/300] build: move rules from Makefile to */Makefile.objs Signed-off-by: Paolo Bonzini --- Makefile | 10 ---------- audio/Makefile.objs | 3 +++ block/Makefile.objs | 2 ++ hw/Makefile.objs | 2 ++ ui/Makefile.objs | 5 +++++ 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 9ebd3cd24f..58107180fb 100644 --- a/Makefile +++ b/Makefile @@ -141,16 +141,6 @@ ALL_SUBDIRS=$(TARGET_DIRS) $(patsubst %,pc-bios/%, $(ROMS)) recurse-all: $(SUBDIR_RULES) $(ROMSUBDIR_RULES) -audio/audio.o audio/fmodaudio.o: QEMU_CFLAGS += $(FMOD_CFLAGS) - -QEMU_CFLAGS+=$(CURL_CFLAGS) - -ui/cocoa.o: ui/cocoa.m - -ui/sdl.o audio/sdlaudio.o ui/sdl_zoom.o hw/baum.o: QEMU_CFLAGS += $(SDL_CFLAGS) - -ui/vnc.o: QEMU_CFLAGS += $(VNC_TLS_CFLAGS) - bt-host.o: QEMU_CFLAGS += $(BLUEZ_CFLAGS) version.o: $(SRC_PATH)/version.rc config-host.h diff --git a/audio/Makefile.objs b/audio/Makefile.objs index 0f2932d1b3..d71a877249 100644 --- a/audio/Makefile.objs +++ b/audio/Makefile.objs @@ -12,3 +12,6 @@ common-obj-$(CONFIG_WINWAVE) += winwaveaudio.o common-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o common-obj-$(CONFIG_AUDIO_WIN_INT) += audio_win_int.o common-obj-y += wavcapture.o + +$(obj)/audio.o $(obj)/fmodaudio.o: QEMU_CFLAGS += $(FMOD_CFLAGS) +$(obj)/sdlaudio.o: QEMU_CFLAGS += $(SDL_CFLAGS) diff --git a/block/Makefile.objs b/block/Makefile.objs index 7f015105b1..c067f38e1d 100644 --- a/block/Makefile.objs +++ b/block/Makefile.objs @@ -18,3 +18,5 @@ endif common-obj-y += stream.o common-obj-y += commit.o common-obj-y += mirror.o + +$(obj)/curl.o: QEMU_CFLAGS+=$(CURL_CFLAGS) diff --git a/hw/Makefile.objs b/hw/Makefile.objs index bcf278d4ec..2778035b1c 100644 --- a/hw/Makefile.objs +++ b/hw/Makefile.objs @@ -204,3 +204,5 @@ ifeq ($(CONFIG_PCI), y) obj-$(CONFIG_KVM) += ivshmem.o obj-$(CONFIG_LINUX) += vfio_pci.o endif + +$(obj)/baum.o: QEMU_CFLAGS += $(SDL_CFLAGS) diff --git a/ui/Makefile.objs b/ui/Makefile.objs index adc07be761..fd339d247b 100644 --- a/ui/Makefile.objs +++ b/ui/Makefile.objs @@ -12,3 +12,8 @@ common-obj-$(CONFIG_SDL) += sdl.o sdl_zoom.o x_keymap.o common-obj-$(CONFIG_COCOA) += cocoa.o common-obj-$(CONFIG_CURSES) += curses.o common-obj-$(CONFIG_VNC) += $(vnc-obj-y) + +$(obj)/sdl.o $(obj)/sdl_zoom.o: QEMU_CFLAGS += $(SDL_CFLAGS) +$(obj)/vnc.o: QEMU_CFLAGS += $(VNC_TLS_CFLAGS) + +$(obj)/cocoa.o: $(SRC_PATH)/$(obj)/cocoa.m From c1c9367216c97ca93de79e90822045a425d7e76d Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Fri, 14 Sep 2012 18:28:23 +0200 Subject: [PATCH 234/300] build: create ldscripts/ Signed-off-by: Paolo Bonzini --- configure | 2 +- alpha.ld => ldscripts/alpha.ld | 0 arm.ld => ldscripts/arm.ld | 0 hppa.ld => ldscripts/hppa.ld | 0 i386.ld => ldscripts/i386.ld | 0 ia64.ld => ldscripts/ia64.ld | 0 m68k.ld => ldscripts/m68k.ld | 0 mips.ld => ldscripts/mips.ld | 0 ppc.ld => ldscripts/ppc.ld | 0 ppc64.ld => ldscripts/ppc64.ld | 0 s390.ld => ldscripts/s390.ld | 0 sparc.ld => ldscripts/sparc.ld | 0 sparc64.ld => ldscripts/sparc64.ld | 0 x86_64.ld => ldscripts/x86_64.ld | 0 14 files changed, 1 insertion(+), 1 deletion(-) rename alpha.ld => ldscripts/alpha.ld (100%) rename arm.ld => ldscripts/arm.ld (100%) rename hppa.ld => ldscripts/hppa.ld (100%) rename i386.ld => ldscripts/i386.ld (100%) rename ia64.ld => ldscripts/ia64.ld (100%) rename m68k.ld => ldscripts/m68k.ld (100%) rename mips.ld => ldscripts/mips.ld (100%) rename ppc.ld => ldscripts/ppc.ld (100%) rename ppc64.ld => ldscripts/ppc64.ld (100%) rename s390.ld => ldscripts/s390.ld (100%) rename sparc.ld => ldscripts/sparc.ld (100%) rename sparc64.ld => ldscripts/sparc64.ld (100%) rename x86_64.ld => ldscripts/x86_64.ld (100%) diff --git a/configure b/configure index e9ad1b1bd8..d2ad1819d5 100755 --- a/configure +++ b/configure @@ -4158,7 +4158,7 @@ fi if test "$ARCH" = "tci"; then linker_script="" else - linker_script="-Wl,-T../config-host.ld -Wl,-T,\$(SRC_PATH)/\$(ARCH).ld" + linker_script="-Wl,-T../config-host.ld -Wl,-T,\$(SRC_PATH)/ldscripts/\$(ARCH).ld" fi if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then diff --git a/alpha.ld b/ldscripts/alpha.ld similarity index 100% rename from alpha.ld rename to ldscripts/alpha.ld diff --git a/arm.ld b/ldscripts/arm.ld similarity index 100% rename from arm.ld rename to ldscripts/arm.ld diff --git a/hppa.ld b/ldscripts/hppa.ld similarity index 100% rename from hppa.ld rename to ldscripts/hppa.ld diff --git a/i386.ld b/ldscripts/i386.ld similarity index 100% rename from i386.ld rename to ldscripts/i386.ld diff --git a/ia64.ld b/ldscripts/ia64.ld similarity index 100% rename from ia64.ld rename to ldscripts/ia64.ld diff --git a/m68k.ld b/ldscripts/m68k.ld similarity index 100% rename from m68k.ld rename to ldscripts/m68k.ld diff --git a/mips.ld b/ldscripts/mips.ld similarity index 100% rename from mips.ld rename to ldscripts/mips.ld diff --git a/ppc.ld b/ldscripts/ppc.ld similarity index 100% rename from ppc.ld rename to ldscripts/ppc.ld diff --git a/ppc64.ld b/ldscripts/ppc64.ld similarity index 100% rename from ppc64.ld rename to ldscripts/ppc64.ld diff --git a/s390.ld b/ldscripts/s390.ld similarity index 100% rename from s390.ld rename to ldscripts/s390.ld diff --git a/sparc.ld b/ldscripts/sparc.ld similarity index 100% rename from sparc.ld rename to ldscripts/sparc.ld diff --git a/sparc64.ld b/ldscripts/sparc64.ld similarity index 100% rename from sparc64.ld rename to ldscripts/sparc64.ld diff --git a/x86_64.ld b/ldscripts/x86_64.ld similarity index 100% rename from x86_64.ld rename to ldscripts/x86_64.ld From 76cad71136b7eb371cf2a2a4e1621cfe8d9c769a Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 24 Oct 2012 11:12:21 +0200 Subject: [PATCH 235/300] build: kill libdis, move disassemblers to disas/ Signed-off-by: Paolo Bonzini --- .gitignore | 1 + Makefile | 9 +++--- Makefile.dis | 20 ------------ Makefile.objs | 19 ++--------- Makefile.target | 5 +-- bsd-user/elfload.c | 2 +- configure | 45 ++++++++++---------------- cpu-exec.c | 2 +- disas.c | 4 +-- disas/Makefile.objs | 16 +++++++++ alpha-dis.c => disas/alpha.c | 2 +- arm-dis.c => disas/arm.c | 2 +- cris-dis.c => disas/cris.c | 2 +- hppa-dis.c => disas/hppa.c | 2 +- i386-dis.c => disas/i386.c | 2 +- ia64-dis.c => disas/ia64.c | 2 +- lm32-dis.c => disas/lm32.c | 2 +- m68k-dis.c => disas/m68k.c | 2 +- microblaze-dis.c => disas/microblaze.c | 2 +- mips-dis.c => disas/mips.c | 2 +- ppc-dis.c => disas/ppc.c | 2 +- s390-dis.c => disas/s390.c | 2 +- sh4-dis.c => disas/sh4.c | 2 +- sparc-dis.c => disas/sparc.c | 2 +- tci-dis.c => disas/tci.c | 2 +- hw/loader.c | 2 +- dis-asm.h => include/disas/bfd.h | 0 disas.h => include/disas/disas.h | 0 linux-user/elfload.c | 2 +- monitor.c | 2 +- qemu-log.h | 2 +- target-alpha/translate.c | 2 +- target-arm/translate.c | 2 +- target-cris/translate.c | 2 +- target-i386/translate.c | 2 +- target-lm32/translate.c | 2 +- target-m68k/translate.c | 2 +- target-microblaze/helper.c | 2 +- target-microblaze/translate.c | 2 +- target-mips/translate.c | 2 +- target-openrisc/translate.c | 2 +- target-ppc/translate.c | 2 +- target-ppc/translate_init.c | 2 +- target-s390x/translate.c | 2 +- target-sh4/translate.c | 2 +- target-sparc/translate.c | 2 +- target-unicore32/translate.c | 2 +- target-xtensa/translate.c | 2 +- translate-all.c | 2 +- user-exec.c | 2 +- vl.c | 2 +- 51 files changed, 86 insertions(+), 115 deletions(-) delete mode 100644 Makefile.dis create mode 100644 disas/Makefile.objs rename alpha-dis.c => disas/alpha.c (99%) rename arm-dis.c => disas/arm.c (99%) rename cris-dis.c => disas/cris.c (99%) rename hppa-dis.c => disas/hppa.c (99%) rename i386-dis.c => disas/i386.c (99%) rename ia64-dis.c => disas/ia64.c (99%) rename lm32-dis.c => disas/lm32.c (99%) rename m68k-dis.c => disas/m68k.c (99%) rename microblaze-dis.c => disas/microblaze.c (99%) rename mips-dis.c => disas/mips.c (99%) rename ppc-dis.c => disas/ppc.c (99%) rename s390-dis.c => disas/s390.c (99%) rename sh4-dis.c => disas/sh4.c (99%) rename sparc-dis.c => disas/sparc.c (99%) rename tci-dis.c => disas/tci.c (98%) rename dis-asm.h => include/disas/bfd.h (100%) rename disas.h => include/disas/disas.h (100%) diff --git a/.gitignore b/.gitignore index bd6ba1c71e..ca52f01ab2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ config-devices.* config-all-devices.* +config-all-disas.* config-host.* config-target.* trace.h diff --git a/Makefile b/Makefile index 58107180fb..da47cb8572 100644 --- a/Makefile +++ b/Makefile @@ -99,6 +99,7 @@ defconfig: rm -f config-all-devices.mak $(SUBDIR_DEVICES_MAK) -include config-all-devices.mak +-include config-all-disas.mak all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all @@ -129,9 +130,9 @@ $(SRC_PATH)/pixman/configure: $(SUBDIR_RULES): libqemustub.a -$(filter %-softmmu,$(SUBDIR_RULES)): $(universal-obj-y) $(trace-obj-y) $(common-obj-y) $(extra-obj-y) subdir-libdis +$(filter %-softmmu,$(SUBDIR_RULES)): $(universal-obj-y) $(trace-obj-y) $(common-obj-y) $(extra-obj-y) -$(filter %-user,$(SUBDIR_RULES)): $(universal-obj-y) $(trace-obj-y) subdir-libdis-user subdir-libuser +$(filter %-user,$(SUBDIR_RULES)): $(universal-obj-y) $(trace-obj-y) subdir-libuser ROMSUBDIR_RULES=$(patsubst %,romsubdir-%, $(ROMS)) romsubdir-%: @@ -223,7 +224,7 @@ $(qga-obj-y) qemu-ga.o: $(QGALIB_GEN) qemu-ga$(EXESUF): qemu-ga.o $(qga-obj-y) $(oslib-obj-y) $(trace-obj-y) $(qapi-obj-y) $(qobject-obj-y) $(version-obj-y) libqemustub.a -QEMULIBS=libuser libdis libdis-user +QEMULIBS=libuser clean: # avoid old build problems by removing potentially incorrect old files @@ -255,7 +256,7 @@ qemu-%.tar.bz2: distclean: clean rm -f config-host.mak config-host.h* config-host.ld $(DOCS) qemu-options.texi qemu-img-cmds.texi qemu-monitor.texi - rm -f config-all-devices.mak + rm -f config-all-devices.mak config-all-disas.mak rm -f roms/seabios/config.mak roms/vgabios/config.mak rm -f qemu-doc.info qemu-doc.aux qemu-doc.cp qemu-doc.cps qemu-doc.dvi rm -f qemu-doc.fn qemu-doc.fns qemu-doc.info qemu-doc.ky qemu-doc.kys diff --git a/Makefile.dis b/Makefile.dis deleted file mode 100644 index 2cfec6a358..0000000000 --- a/Makefile.dis +++ /dev/null @@ -1,20 +0,0 @@ -# Makefile for disassemblers. - -include ../config-host.mak -include config.mak -include $(SRC_PATH)/rules.mak - -.PHONY: all - -$(call set-vpath, $(SRC_PATH)) - -QEMU_CFLAGS+=-I.. - -include $(SRC_PATH)/Makefile.objs - -all: $(libdis-y) -# Dummy command so that make thinks it has done something - @true - -clean: - rm -f *.o *.d *.a *~ diff --git a/Makefile.objs b/Makefile.objs index 20fb2c54f0..3248eafe32 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -127,24 +127,10 @@ user-obj-y += $(trace-obj-y) user-obj-y += qom/ ###################################################################### -# libdis +# disassemblers # NOTE: the disassembler code is only needed for debugging -libdis-y = -libdis-$(CONFIG_ALPHA_DIS) += alpha-dis.o -libdis-$(CONFIG_ARM_DIS) += arm-dis.o -libdis-$(CONFIG_CRIS_DIS) += cris-dis.o -libdis-$(CONFIG_HPPA_DIS) += hppa-dis.o -libdis-$(CONFIG_I386_DIS) += i386-dis.o -libdis-$(CONFIG_IA64_DIS) += ia64-dis.o -libdis-$(CONFIG_M68K_DIS) += m68k-dis.o -libdis-$(CONFIG_MICROBLAZE_DIS) += microblaze-dis.o -libdis-$(CONFIG_MIPS_DIS) += mips-dis.o -libdis-$(CONFIG_PPC_DIS) += ppc-dis.o -libdis-$(CONFIG_S390_DIS) += s390-dis.o -libdis-$(CONFIG_SH4_DIS) += sh4-dis.o -libdis-$(CONFIG_SPARC_DIS) += sparc-dis.o -libdis-$(CONFIG_LM32_DIS) += lm32-dis.o +universal-obj-y += disas/ ###################################################################### # trace @@ -252,5 +238,6 @@ nested-vars += \ block-obj-y \ user-obj-y \ common-obj-y \ + universal-obj-y \ extra-obj-y dummy := $(call unnest-vars) diff --git a/Makefile.target b/Makefile.target index 927347bac2..f353651369 100644 --- a/Makefile.target +++ b/Makefile.target @@ -70,9 +70,8 @@ obj-y = exec.o translate-all.o cpu-exec.o obj-y += tcg/tcg.o tcg/optimize.o obj-$(CONFIG_TCG_INTERPRETER) += tci.o obj-y += fpu/softfloat.o -obj-y += disas.o -obj-$(CONFIG_TCI_DIS) += tci-dis.o obj-y += target-$(TARGET_BASE_ARCH)/ +obj-y += disas.o obj-$(CONFIG_GDBSTUB_XML) += gdbstub-xml.o tci-dis.o: QEMU_CFLAGS += -I$(SRC_PATH)/tcg -I$(SRC_PATH)/tcg/tci @@ -156,11 +155,9 @@ all-obj-y += $(addprefix ../, $(universal-obj-y)) ifdef CONFIG_SOFTMMU all-obj-y += $(addprefix ../, $(common-obj-y)) -all-obj-y += $(addprefix ../libdis/, $(libdis-y)) all-obj-y += $(addprefix ../, $(trace-obj-y)) else all-obj-y += $(addprefix ../libuser/, $(user-obj-y)) -all-obj-y += $(addprefix ../libdis-user/, $(libdis-y)) endif #CONFIG_LINUX_USER ifdef QEMU_PROGW diff --git a/bsd-user/elfload.c b/bsd-user/elfload.c index 55b213609e..a6cd3ab4f3 100644 --- a/bsd-user/elfload.c +++ b/bsd-user/elfload.c @@ -10,7 +10,7 @@ #include #include "qemu.h" -#include "disas.h" +#include "disas/disas.h" #ifdef _ARCH_PPC64 #undef ARCH_DLINFO diff --git a/configure b/configure index d2ad1819d5..f180e172a7 100755 --- a/configure +++ b/configure @@ -3697,11 +3697,6 @@ if test -f ${config_host_ld}~ ; then fi fi -for d in libdis libdis-user; do - symlink "$source_path/Makefile.dis" "$d/Makefile" - echo > $d/config.mak -done - # use included Linux headers if test "$linux" = "yes" ; then mkdir -p linux-headers @@ -4043,83 +4038,77 @@ if test "$linux" = "yes" ; then includes="-I\$(SRC_PATH)/linux-headers $includes" fi -if test "$target_user_only" = "yes" ; then - libdis_config_mak=libdis-user/config.mak -else - libdis_config_mak=libdis/config.mak -fi - for i in $ARCH $TARGET_BASE_ARCH ; do case "$i" in alpha) echo "CONFIG_ALPHA_DIS=y" >> $config_target_mak - echo "CONFIG_ALPHA_DIS=y" >> $libdis_config_mak + echo "CONFIG_ALPHA_DIS=y" >> config-all-disas.mak ;; arm) echo "CONFIG_ARM_DIS=y" >> $config_target_mak - echo "CONFIG_ARM_DIS=y" >> $libdis_config_mak + echo "CONFIG_ARM_DIS=y" >> config-all-disas.mak ;; cris) echo "CONFIG_CRIS_DIS=y" >> $config_target_mak - echo "CONFIG_CRIS_DIS=y" >> $libdis_config_mak + echo "CONFIG_CRIS_DIS=y" >> config-all-disas.mak ;; hppa) echo "CONFIG_HPPA_DIS=y" >> $config_target_mak - echo "CONFIG_HPPA_DIS=y" >> $libdis_config_mak + echo "CONFIG_HPPA_DIS=y" >> config-all-disas.mak ;; i386|x86_64) echo "CONFIG_I386_DIS=y" >> $config_target_mak - echo "CONFIG_I386_DIS=y" >> $libdis_config_mak + echo "CONFIG_I386_DIS=y" >> config-all-disas.mak ;; ia64*) echo "CONFIG_IA64_DIS=y" >> $config_target_mak - echo "CONFIG_IA64_DIS=y" >> $libdis_config_mak + echo "CONFIG_IA64_DIS=y" >> config-all-disas.mak ;; lm32) echo "CONFIG_LM32_DIS=y" >> $config_target_mak - echo "CONFIG_LM32_DIS=y" >> $libdis_config_mak + echo "CONFIG_LM32_DIS=y" >> config-all-disas.mak ;; m68k) echo "CONFIG_M68K_DIS=y" >> $config_target_mak - echo "CONFIG_M68K_DIS=y" >> $libdis_config_mak + echo "CONFIG_M68K_DIS=y" >> config-all-disas.mak ;; microblaze*) echo "CONFIG_MICROBLAZE_DIS=y" >> $config_target_mak - echo "CONFIG_MICROBLAZE_DIS=y" >> $libdis_config_mak + echo "CONFIG_MICROBLAZE_DIS=y" >> config-all-disas.mak ;; mips*) echo "CONFIG_MIPS_DIS=y" >> $config_target_mak - echo "CONFIG_MIPS_DIS=y" >> $libdis_config_mak + echo "CONFIG_MIPS_DIS=y" >> config-all-disas.mak ;; or32) echo "CONFIG_OPENRISC_DIS=y" >> $config_target_mak - echo "CONFIG_OPENRISC_DIS=y" >> $libdis_config_mak + echo "CONFIG_OPENRISC_DIS=y" >> config-all-disas.mak ;; ppc*) echo "CONFIG_PPC_DIS=y" >> $config_target_mak - echo "CONFIG_PPC_DIS=y" >> $libdis_config_mak + echo "CONFIG_PPC_DIS=y" >> config-all-disas.mak ;; s390*) echo "CONFIG_S390_DIS=y" >> $config_target_mak - echo "CONFIG_S390_DIS=y" >> $libdis_config_mak + echo "CONFIG_S390_DIS=y" >> config-all-disas.mak ;; sh4) echo "CONFIG_SH4_DIS=y" >> $config_target_mak - echo "CONFIG_SH4_DIS=y" >> $libdis_config_mak + echo "CONFIG_SH4_DIS=y" >> config-all-disas.mak ;; sparc*) echo "CONFIG_SPARC_DIS=y" >> $config_target_mak - echo "CONFIG_SPARC_DIS=y" >> $libdis_config_mak + echo "CONFIG_SPARC_DIS=y" >> config-all-disas.mak ;; xtensa*) echo "CONFIG_XTENSA_DIS=y" >> $config_target_mak - echo "CONFIG_XTENSA_DIS=y" >> $libdis_config_mak + echo "CONFIG_XTENSA_DIS=y" >> config-all-disas.mak ;; esac done if test "$tcg_interpreter" = "yes" ; then echo "CONFIG_TCI_DIS=y" >> $config_target_mak - echo "CONFIG_TCI_DIS=y" >> $libdis_config_mak + echo "CONFIG_TCI_DIS=y" >> config-all-disas.mak fi case "$ARCH" in diff --git a/cpu-exec.c b/cpu-exec.c index 904ee73c7b..b5a32b84e4 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -18,7 +18,7 @@ */ #include "config.h" #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg.h" #include "qemu-barrier.h" #include "qtest.h" diff --git a/disas.c b/disas.c index 6da1dd09f4..8157b96fc1 100644 --- a/disas.c +++ b/disas.c @@ -1,11 +1,11 @@ /* General "disassemble this chunk" code. Used for debugging. */ #include "config.h" -#include "dis-asm.h" +#include "disas/bfd.h" #include "elf.h" #include #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" typedef struct CPUDebug { struct disassemble_info info; diff --git a/disas/Makefile.objs b/disas/Makefile.objs new file mode 100644 index 0000000000..9134429845 --- /dev/null +++ b/disas/Makefile.objs @@ -0,0 +1,16 @@ +universal-obj-$(CONFIG_ALPHA_DIS) += alpha.o +universal-obj-$(CONFIG_ARM_DIS) += arm.o +universal-obj-$(CONFIG_CRIS_DIS) += cris.o +universal-obj-$(CONFIG_HPPA_DIS) += hppa.o +universal-obj-$(CONFIG_I386_DIS) += i386.o +universal-obj-$(CONFIG_IA64_DIS) += ia64.o +universal-obj-$(CONFIG_M68K_DIS) += m68k.o +universal-obj-$(CONFIG_MICROBLAZE_DIS) += microblaze.o +universal-obj-$(CONFIG_MIPS_DIS) += mips.o +universal-obj-$(CONFIG_PPC_DIS) += ppc.o +universal-obj-$(CONFIG_S390_DIS) += s390.o +universal-obj-$(CONFIG_SH4_DIS) += sh4.o +universal-obj-$(CONFIG_SPARC_DIS) += sparc.o +universal-obj-$(CONFIG_LM32_DIS) += lm32.o + +universal-obj-$(CONFIG_TCI_DIS) += tci.o diff --git a/alpha-dis.c b/disas/alpha.c similarity index 99% rename from alpha-dis.c rename to disas/alpha.c index ae331b35b8..a950b9cee0 100644 --- a/alpha-dis.c +++ b/disas/alpha.c @@ -20,7 +20,7 @@ along with this file; see the file COPYING. If not, see . */ #include -#include "dis-asm.h" +#include "disas/bfd.h" /* MAX is redefined below, so remove any previous definition. */ #undef MAX diff --git a/arm-dis.c b/disas/arm.c similarity index 99% rename from arm-dis.c rename to disas/arm.c index 6bc4d71698..4927d8ad7c 100644 --- a/arm-dis.c +++ b/disas/arm.c @@ -22,7 +22,7 @@ /* Start of qemu specific additions. Mostly this is stub definitions for things we don't care about. */ -#include "dis-asm.h" +#include "disas/bfd.h" #define ATTRIBUTE_UNUSED __attribute__((unused)) #define ISSPACE(x) ((x) == ' ' || (x) == '\t' || (x) == '\n') diff --git a/cris-dis.c b/disas/cris.c similarity index 99% rename from cris-dis.c rename to disas/cris.c index 1d174ba8cc..9dfb4e3885 100644 --- a/cris-dis.c +++ b/disas/cris.c @@ -19,7 +19,7 @@ along with this program; if not, see . */ #include "qemu-common.h" -#include "dis-asm.h" +#include "disas/bfd.h" //#include "sysdep.h" #include "target-cris/opcode-cris.h" //#include "libiberty.h" diff --git a/hppa-dis.c b/disas/hppa.c similarity index 99% rename from hppa-dis.c rename to disas/hppa.c index 420a7d22d0..c7c8be66a2 100644 --- a/hppa-dis.c +++ b/disas/hppa.c @@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, see . */ -#include "dis-asm.h" +#include "disas/bfd.h" /* HP PA-RISC SOM object file format: definitions internal to BFD. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, diff --git a/i386-dis.c b/disas/i386.c similarity index 99% rename from i386-dis.c rename to disas/i386.c index c4a81c99ad..3b006b13e0 100644 --- a/i386-dis.c +++ b/disas/i386.c @@ -32,7 +32,7 @@ the Intel manual for details. */ #include -#include "dis-asm.h" +#include "disas/bfd.h" /* include/opcode/i386.h r1.78 */ /* opcode/i386.h -- Intel 80386 opcode macros diff --git a/ia64-dis.c b/disas/ia64.c similarity index 99% rename from ia64-dis.c rename to disas/ia64.c index 2a103e6b5c..a8fe26c413 100644 --- a/ia64-dis.c +++ b/disas/ia64.c @@ -21,7 +21,7 @@ #include #include -#include "dis-asm.h" +#include "disas/bfd.h" /* ia64.h -- Header file for ia64 opcode table Copyright (C) 1998, 1999, 2000, 2002, 2005, 2006 diff --git a/lm32-dis.c b/disas/lm32.c similarity index 99% rename from lm32-dis.c rename to disas/lm32.c index 709ed3215c..a8eefe05b1 100644 --- a/lm32-dis.c +++ b/disas/lm32.c @@ -19,7 +19,7 @@ */ #include -#include "dis-asm.h" +#include "disas/bfd.h" typedef enum { LM32_OP_SRUI = 0, LM32_OP_NORI, LM32_OP_MULI, LM32_OP_SH, LM32_OP_LB, diff --git a/m68k-dis.c b/disas/m68k.c similarity index 99% rename from m68k-dis.c rename to disas/m68k.c index 2b155de51c..c950241f79 100644 --- a/m68k-dis.c +++ b/disas/m68k.c @@ -5,7 +5,7 @@ #include #include -#include "dis-asm.h" +#include "disas/bfd.h" /* **** floatformat.h from sourceware.org CVS 2005-08-14. */ /* IEEE floating point support declarations, for GDB, the GNU Debugger. diff --git a/microblaze-dis.c b/disas/microblaze.c similarity index 99% rename from microblaze-dis.c rename to disas/microblaze.c index 16c312f2f5..ec91af386d 100644 --- a/microblaze-dis.c +++ b/disas/microblaze.c @@ -582,7 +582,7 @@ char pvr_register_prefix[] = "rpvr"; #endif /* MICROBLAZE_OPC */ -#include "dis-asm.h" +#include "disas/bfd.h" #include #define get_field_rd(instr) get_field(instr, RD_MASK, RD_LOW) diff --git a/mips-dis.c b/disas/mips.c similarity index 99% rename from mips-dis.c rename to disas/mips.c index e3a6e0b49e..2106b574cb 100644 --- a/mips-dis.c +++ b/disas/mips.c @@ -19,7 +19,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see . */ -#include "dis-asm.h" +#include "disas/bfd.h" /* mips.h. Mips opcode list for GDB, the GNU debugger. Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 diff --git a/ppc-dis.c b/disas/ppc.c similarity index 99% rename from ppc-dis.c rename to disas/ppc.c index bc98cbe655..c149506fd8 100644 --- a/ppc-dis.c +++ b/disas/ppc.c @@ -18,7 +18,7 @@ the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this file; see the file COPYING. If not, see . */ -#include "dis-asm.h" +#include "disas/bfd.h" #define BFD_DEFAULT_TARGET_SIZE 64 /* ppc.h -- Header file for PowerPC opcode table diff --git a/s390-dis.c b/disas/s390.c similarity index 99% rename from s390-dis.c rename to disas/s390.c index 8abcdf0128..0859dfa19f 100644 --- a/s390-dis.c +++ b/disas/s390.c @@ -21,7 +21,7 @@ 02110-1301, USA. */ #include "qemu-common.h" -#include "dis-asm.h" +#include "disas/bfd.h" /* include/opcode/s390.h revision 1.9 */ /* s390.h -- Header file for S390 opcode table diff --git a/sh4-dis.c b/disas/sh4.c similarity index 99% rename from sh4-dis.c rename to disas/sh4.c index 673bc78380..f6cadd55c0 100644 --- a/sh4-dis.c +++ b/disas/sh4.c @@ -16,7 +16,7 @@ along with this program; if not, see . */ #include -#include "dis-asm.h" +#include "disas/bfd.h" #define DEFINE_TABLE diff --git a/sparc-dis.c b/disas/sparc.c similarity index 99% rename from sparc-dis.c rename to disas/sparc.c index 1d017faaa3..8eb22e6fc3 100644 --- a/sparc-dis.c +++ b/disas/sparc.c @@ -27,7 +27,7 @@ see . */ #include -#include "dis-asm.h" +#include "disas/bfd.h" /* The SPARC opcode table (and other related data) is defined in the opcodes library in sparc-opc.c. If you change anything here, make diff --git a/tci-dis.c b/disas/tci.c similarity index 98% rename from tci-dis.c rename to disas/tci.c index 10c411be8c..a606b63a2a 100644 --- a/tci-dis.c +++ b/disas/tci.c @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -#include "dis-asm.h" +#include "disas/bfd.h" #include "tcg/tcg.h" /* Disassemble TCI bytecode. */ diff --git a/hw/loader.c b/hw/loader.c index ba01ca6638..52f0940778 100644 --- a/hw/loader.c +++ b/hw/loader.c @@ -43,7 +43,7 @@ */ #include "hw.h" -#include "disas.h" +#include "disas/disas.h" #include "monitor.h" #include "sysemu.h" #include "uboot_image.h" diff --git a/dis-asm.h b/include/disas/bfd.h similarity index 100% rename from dis-asm.h rename to include/disas/bfd.h diff --git a/disas.h b/include/disas/disas.h similarity index 100% rename from disas.h rename to include/disas/disas.h diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 1d8bcb4e79..89db49ccaa 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -14,7 +14,7 @@ #include #include "qemu.h" -#include "disas.h" +#include "disas/disas.h" #ifdef _ARCH_PPC64 #undef ARCH_DLINFO diff --git a/monitor.c b/monitor.c index a92ab44384..bd63768c27 100644 --- a/monitor.c +++ b/monitor.c @@ -41,7 +41,7 @@ #include "console.h" #include "blockdev.h" #include "audio/audio.h" -#include "disas.h" +#include "disas/disas.h" #include "balloon.h" #include "qemu-timer.h" #include "migration.h" diff --git a/qemu-log.h b/qemu-log.h index 344eca3f1b..58f69cb494 100644 --- a/qemu-log.h +++ b/qemu-log.h @@ -3,7 +3,7 @@ #include #ifdef NEED_CPU_H -#include "disas.h" +#include "disas/disas.h" #endif /* Private global variables, don't use */ diff --git a/target-alpha/translate.c b/target-alpha/translate.c index 71fe1a1ab0..f57c8fd91f 100644 --- a/target-alpha/translate.c +++ b/target-alpha/translate.c @@ -18,7 +18,7 @@ */ #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "host-utils.h" #include "tcg-op.h" diff --git a/target-arm/translate.c b/target-arm/translate.c index 3cf3604517..10c548d5ba 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -25,7 +25,7 @@ #include #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg-op.h" #include "qemu-log.h" diff --git a/target-cris/translate.c b/target-cris/translate.c index 60bdc241ef..2a92727843 100644 --- a/target-cris/translate.c +++ b/target-cris/translate.c @@ -24,7 +24,7 @@ */ #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg-op.h" #include "helper.h" #include "mmu.h" diff --git a/target-i386/translate.c b/target-i386/translate.c index f394ea69a5..026201e98e 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -24,7 +24,7 @@ #include #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg-op.h" #include "helper.h" diff --git a/target-lm32/translate.c b/target-lm32/translate.c index e131ad1b5f..9683b9a4b5 100644 --- a/target-lm32/translate.c +++ b/target-lm32/translate.c @@ -18,7 +18,7 @@ */ #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "helper.h" #include "tcg-op.h" diff --git a/target-m68k/translate.c b/target-m68k/translate.c index 11defc6e04..d955c7a409 100644 --- a/target-m68k/translate.c +++ b/target-m68k/translate.c @@ -19,7 +19,7 @@ */ #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg-op.h" #include "qemu-log.h" diff --git a/target-microblaze/helper.c b/target-microblaze/helper.c index efaa123a14..530e0b5fb0 100644 --- a/target-microblaze/helper.c +++ b/target-microblaze/helper.c @@ -198,7 +198,7 @@ void do_interrupt(CPUMBState *env) t = (env->sregs[SR_MSR] & (MSR_VM | MSR_UM)) << 1; #if 0 -#include "disas.h" +#include "disas/disas.h" /* Useful instrumentation when debugging interrupt issues in either the models or in sw. */ diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c index 6ceff02a12..5946a5ba5c 100644 --- a/target-microblaze/translate.c +++ b/target-microblaze/translate.c @@ -19,7 +19,7 @@ */ #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg-op.h" #include "helper.h" #include "microblaze-decode.h" diff --git a/target-mips/translate.c b/target-mips/translate.c index 65e6725cc9..44e7617395 100644 --- a/target-mips/translate.c +++ b/target-mips/translate.c @@ -22,7 +22,7 @@ */ #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg-op.h" #include "helper.h" diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c index 9ac999a9c8..2cb9d69826 100644 --- a/target-openrisc/translate.c +++ b/target-openrisc/translate.c @@ -20,7 +20,7 @@ #include "cpu.h" #include "exec-all.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg-op.h" #include "qemu-common.h" #include "qemu-log.h" diff --git a/target-ppc/translate.c b/target-ppc/translate.c index 653c2fdb1f..8a53105f89 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c @@ -19,7 +19,7 @@ */ #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg-op.h" #include "host-utils.h" diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c index e63627cac1..984ca9fc63 100644 --- a/target-ppc/translate_init.c +++ b/target-ppc/translate_init.c @@ -23,7 +23,7 @@ * inside "#if defined(TODO) ... #endif" statements to make tests easier. */ -#include "dis-asm.h" +#include "disas/bfd.h" #include "gdbstub.h" #include #include "kvm_ppc.h" diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 787e3c6963..6e144a67a2 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -30,7 +30,7 @@ #endif #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg-op.h" #include "qemu-log.h" diff --git a/target-sh4/translate.c b/target-sh4/translate.c index 86493e1b03..41d53e5c51 100644 --- a/target-sh4/translate.c +++ b/target-sh4/translate.c @@ -21,7 +21,7 @@ //#define SH4_SINGLE_STEP #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg-op.h" #include "helper.h" diff --git a/target-sparc/translate.c b/target-sparc/translate.c index 5859f2e801..88802b8486 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -25,7 +25,7 @@ #include #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "helper.h" #include "tcg-op.h" diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c index 3951758fc8..8c49f4d701 100644 --- a/target-unicore32/translate.c +++ b/target-unicore32/translate.c @@ -15,7 +15,7 @@ #include #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg-op.h" #include "qemu-log.h" diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index 5d8762c0ca..4e81cbd9ec 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -32,7 +32,7 @@ #include "cpu.h" #include "exec-all.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg-op.h" #include "qemu-log.h" #include "sysemu.h" diff --git a/translate-all.c b/translate-all.c index 164870a68c..bbe06db6eb 100644 --- a/translate-all.c +++ b/translate-all.c @@ -33,7 +33,7 @@ #include "qemu-common.h" #define NO_CPU_IO_DEFS #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg.h" #include "qemu-timer.h" #include "memory.h" diff --git a/user-exec.c b/user-exec.c index 1185cb03c8..63fb05384f 100644 --- a/user-exec.c +++ b/user-exec.c @@ -18,7 +18,7 @@ */ #include "config.h" #include "cpu.h" -#include "disas.h" +#include "disas/disas.h" #include "tcg.h" #undef EAX diff --git a/vl.c b/vl.c index 3ebf01f8f1..571a49b931 100644 --- a/vl.c +++ b/vl.c @@ -154,7 +154,7 @@ int main(int argc, char **argv) #endif #include "qtest.h" -#include "disas.h" +#include "disas/disas.h" #include "qemu_socket.h" From 8e98e2e80b92e08e79e27a0c20a172906cfa12d2 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 24 Oct 2012 11:16:01 +0200 Subject: [PATCH 236/300] build: kill libuser Signed-off-by: Paolo Bonzini --- Makefile | 8 +++----- Makefile.objs | 3 ++- Makefile.target | 3 +-- Makefile.user | 24 ------------------------ configure | 3 --- 5 files changed, 6 insertions(+), 35 deletions(-) delete mode 100644 Makefile.user diff --git a/Makefile b/Makefile index da47cb8572..0c6ad1efe6 100644 --- a/Makefile +++ b/Makefile @@ -132,7 +132,7 @@ $(SUBDIR_RULES): libqemustub.a $(filter %-softmmu,$(SUBDIR_RULES)): $(universal-obj-y) $(trace-obj-y) $(common-obj-y) $(extra-obj-y) -$(filter %-user,$(SUBDIR_RULES)): $(universal-obj-y) $(trace-obj-y) subdir-libuser +$(filter %-user,$(SUBDIR_RULES)): $(universal-obj-y) $(trace-obj-y) $(user-obj-y) ROMSUBDIR_RULES=$(patsubst %,romsubdir-%, $(ROMS)) romsubdir-%: @@ -224,8 +224,6 @@ $(qga-obj-y) qemu-ga.o: $(QGALIB_GEN) qemu-ga$(EXESUF): qemu-ga.o $(qga-obj-y) $(oslib-obj-y) $(trace-obj-y) $(qapi-obj-y) $(qobject-obj-y) $(version-obj-y) libqemustub.a -QEMULIBS=libuser - clean: # avoid old build problems by removing potentially incorrect old files rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h @@ -242,7 +240,7 @@ clean: rm -rf qapi-generated rm -rf qga/qapi-generated $(MAKE) -C tests/tcg clean - for d in $(ALL_SUBDIRS) $(QEMULIBS) libcacard; do \ + for d in $(ALL_SUBDIRS) libcacard; do \ if test -d $$d; then $(MAKE) -C $$d $@ || exit 1; fi; \ rm -f $$d/qemu-options.def; \ done @@ -265,7 +263,7 @@ distclean: clean rm -f config.log rm -f linux-headers/asm rm -f qemu-tech.info qemu-tech.aux qemu-tech.cp qemu-tech.dvi qemu-tech.fn qemu-tech.info qemu-tech.ky qemu-tech.log qemu-tech.pdf qemu-tech.pg qemu-tech.toc qemu-tech.tp qemu-tech.vr - for d in $(TARGET_DIRS) $(QEMULIBS); do \ + for d in $(TARGET_DIRS); do \ rm -rf $$d || exit 1 ; \ done if test -f pixman/config.log; then make -C pixman distclean; fi diff --git a/Makefile.objs b/Makefile.objs index 3248eafe32..986f085c85 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -123,7 +123,6 @@ user-obj-y += tcg-runtime.o host-utils.o user-obj-y += cache-utils.o user-obj-y += module.o user-obj-y += qemu-user.o -user-obj-y += $(trace-obj-y) user-obj-y += qom/ ###################################################################### @@ -196,6 +195,8 @@ trace-obj-y += trace/control.o $(trace-obj-y): $(GENERATED_HEADERS) +universal-obj-y += $(trace-obj-y) + ###################################################################### # smartcard diff --git a/Makefile.target b/Makefile.target index f353651369..8bbad380c2 100644 --- a/Makefile.target +++ b/Makefile.target @@ -155,9 +155,8 @@ all-obj-y += $(addprefix ../, $(universal-obj-y)) ifdef CONFIG_SOFTMMU all-obj-y += $(addprefix ../, $(common-obj-y)) -all-obj-y += $(addprefix ../, $(trace-obj-y)) else -all-obj-y += $(addprefix ../libuser/, $(user-obj-y)) +all-obj-y += $(addprefix ../, $(user-obj-y)) endif #CONFIG_LINUX_USER ifdef QEMU_PROGW diff --git a/Makefile.user b/Makefile.user deleted file mode 100644 index 9302d33245..0000000000 --- a/Makefile.user +++ /dev/null @@ -1,24 +0,0 @@ -# Makefile for qemu target independent user files. - -include ../config-host.mak -include $(SRC_PATH)/rules.mak --include config.mak - -.PHONY: all - -$(call set-vpath, $(SRC_PATH)) - -QEMU_CFLAGS+=-I.. -QEMU_CFLAGS += -I$(SRC_PATH)/include -QEMU_CFLAGS += -DCONFIG_USER_ONLY - -include $(SRC_PATH)/Makefile.objs - -all: $(user-obj-y) -# Dummy command so that make thinks it has done something - @true - -clean: - for d in . trace; do \ - rm -f $$d/*.o $$d/*.d $$d/*.a $$d/*~; \ - done diff --git a/configure b/configure index f180e172a7..4d0e1163a2 100755 --- a/configure +++ b/configure @@ -4212,9 +4212,6 @@ for rom in seabios vgabios ; do echo "LD=$ld" >> $config_mak done -d=libuser -symlink "$source_path/Makefile.user" "$d/Makefile" - if test "$docs" = "yes" ; then mkdir -p QMP fi From 077805fa92b9089137c6b6b196d449ee05cc342f Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 25 Sep 2012 10:04:17 +0200 Subject: [PATCH 237/300] janitor: do not rely on indirect inclusions of or from qemu-char.h Various header files rely on qemu-char.h including qemu-config.h or main-loop.h, but they really do not need qemu-char.h at all (particularly interesting is the case of the block layer!). Clean this up, and also add missing inclusions of qemu-char.h itself. Signed-off-by: Paolo Bonzini --- arch_init.c | 1 + audio/alsaaudio.c | 1 + audio/ossaudio.c | 1 + block/blkdebug.c | 1 + block/iscsi.c | 1 + bt-host.c | 1 + bt-vhci.c | 1 + event_notifier-posix.c | 1 + exec.c | 1 + hw/arm_boot.c | 1 + hw/dma.c | 1 + hw/fw_cfg.c | 1 + hw/jazz_led.c | 1 + hw/mac_dbdma.c | 1 + hw/ppc/e500.c | 1 + hw/puv3.c | 2 ++ hw/qdev-monitor.c | 1 + hw/qdev-properties.c | 1 + hw/s390x/sclpconsole.c | 1 + hw/spapr.c | 1 + hw/tcx.c | 1 + hw/usb/dev-network.c | 1 + net.c | 1 + qemu-config.h | 1 + spice-qemu-char.c | 1 + target-i386/kvm.c | 1 + 26 files changed, 27 insertions(+) diff --git a/arch_init.c b/arch_init.c index 1645f3079a..ef866cdea4 100644 --- a/arch_init.c +++ b/arch_init.c @@ -46,6 +46,7 @@ #include "exec-memory.h" #include "hw/pcspk.h" #include "qemu/page_cache.h" +#include "qemu-config.h" #include "qmp-commands.h" #include "trace.h" diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c index cb45b49c2a..564d632d0c 100644 --- a/audio/alsaaudio.c +++ b/audio/alsaaudio.c @@ -23,6 +23,7 @@ */ #include #include "qemu-common.h" +#include "main-loop.h" #include "qemu-char.h" #include "audio.h" diff --git a/audio/ossaudio.c b/audio/ossaudio.c index df51b7cc58..45abe39a6d 100644 --- a/audio/ossaudio.c +++ b/audio/ossaudio.c @@ -31,6 +31,7 @@ #include #endif #include "qemu-common.h" +#include "main-loop.h" #include "host-utils.h" #include "qemu-char.h" #include "audio.h" diff --git a/block/blkdebug.c b/block/blkdebug.c index 294e983306..65556e73e5 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -23,6 +23,7 @@ */ #include "qemu-common.h" +#include "qemu-config.h" #include "block_int.h" #include "module.h" diff --git a/block/iscsi.c b/block/iscsi.c index c0b70b3d32..33b93d8000 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -27,6 +27,7 @@ #include #include #include "qemu-common.h" +#include "qemu-config.h" #include "qemu-error.h" #include "block_int.h" #include "trace.h" diff --git a/bt-host.c b/bt-host.c index 0d3ad28e8c..8b47370b26 100644 --- a/bt-host.c +++ b/bt-host.c @@ -21,6 +21,7 @@ #include "qemu-char.h" #include "net.h" #include "bt-host.h" +#include "main-loop.h" #ifndef _WIN32 # include diff --git a/bt-vhci.c b/bt-vhci.c index bbc1029854..878460aeb5 100644 --- a/bt-vhci.c +++ b/bt-vhci.c @@ -21,6 +21,7 @@ #include "qemu-char.h" #include "net.h" #include "hw/bt.h" +#include "main-loop.h" #define VHCI_DEV "/dev/vhci" #define VHCI_UDEV "/dev/hci_vhci" diff --git a/event_notifier-posix.c b/event_notifier-posix.c index 6f3239a3fc..f0bd839acd 100644 --- a/event_notifier-posix.c +++ b/event_notifier-posix.c @@ -13,6 +13,7 @@ #include "qemu-common.h" #include "event_notifier.h" #include "qemu-char.h" +#include "main-loop.h" #ifdef CONFIG_EVENTFD #include diff --git a/exec.c b/exec.c index 4c1246a9f9..986084146c 100644 --- a/exec.c +++ b/exec.c @@ -33,6 +33,7 @@ #include "kvm.h" #include "hw/xen.h" #include "qemu-timer.h" +#include "qemu-config.h" #include "memory.h" #include "dma.h" #include "exec-memory.h" diff --git a/hw/arm_boot.c b/hw/arm_boot.c index ec3b8d5d12..63ff559cf7 100644 --- a/hw/arm_boot.c +++ b/hw/arm_boot.c @@ -15,6 +15,7 @@ #include "loader.h" #include "elf.h" #include "device_tree.h" +#include "qemu-config.h" #define KERNEL_ARGS_ADDR 0x100 #define KERNEL_LOAD_ADDR 0x00010000 diff --git a/hw/dma.c b/hw/dma.c index c2d7b21562..364f54d2d7 100644 --- a/hw/dma.c +++ b/hw/dma.c @@ -23,6 +23,7 @@ */ #include "hw.h" #include "isa.h" +#include "main-loop.h" /* #define DEBUG_DMA */ diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c index 2b92cda98a..7b0e50f70d 100644 --- a/hw/fw_cfg.c +++ b/hw/fw_cfg.c @@ -27,6 +27,7 @@ #include "fw_cfg.h" #include "sysbus.h" #include "qemu-error.h" +#include "qemu-config.h" /* debug firmware config */ //#define DEBUG_FW_CFG diff --git a/hw/jazz_led.c b/hw/jazz_led.c index 640e75ef2f..09c77429e8 100644 --- a/hw/jazz_led.c +++ b/hw/jazz_led.c @@ -22,6 +22,7 @@ * THE SOFTWARE. */ +#include "qemu-common.h" #include "console.h" #include "pixel_ops.h" #include "trace.h" diff --git a/hw/mac_dbdma.c b/hw/mac_dbdma.c index e551156af9..41eee50a35 100644 --- a/hw/mac_dbdma.c +++ b/hw/mac_dbdma.c @@ -39,6 +39,7 @@ #include "hw.h" #include "isa.h" #include "mac_dbdma.h" +#include "main-loop.h" /* debug DBDMA */ //#define DEBUG_DBDMA diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 8fab508c07..2b1558b16e 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -19,6 +19,7 @@ #include "e500.h" #include "e500-ccsr.h" #include "net.h" +#include "qemu-config.h" #include "hw/hw.h" #include "hw/serial.h" #include "hw/pci/pci.h" diff --git a/hw/puv3.c b/hw/puv3.c index 3d7734936b..6f89c44e32 100644 --- a/hw/puv3.c +++ b/hw/puv3.c @@ -8,6 +8,8 @@ * published by the Free Software Foundation, or any later version. * See the COPYING file in the top-level directory. */ + +#include "qemu-common.h" #include "console.h" #include "elf.h" #include "exec-memory.h" diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c index a1b4d6ae5f..5aaf74b98a 100644 --- a/hw/qdev-monitor.c +++ b/hw/qdev-monitor.c @@ -21,6 +21,7 @@ #include "monitor.h" #include "qmp-commands.h" #include "arch_init.h" +#include "qemu-config.h" /* * Aliases were a bad idea from the start. Let's keep them diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c index 81d901c6c4..b9cd3c0077 100644 --- a/hw/qdev-properties.c +++ b/hw/qdev-properties.c @@ -5,6 +5,7 @@ #include "hw/block-common.h" #include "net/hub.h" #include "qapi/qapi-visit-core.h" +#include "qemu-char.h" void *qdev_get_prop_ptr(DeviceState *dev, Property *prop) { diff --git a/hw/s390x/sclpconsole.c b/hw/s390x/sclpconsole.c index fece878e88..9ad297c999 100644 --- a/hw/s390x/sclpconsole.c +++ b/hw/s390x/sclpconsole.c @@ -17,6 +17,7 @@ #include "sclp.h" #include "event-facility.h" +#include "qemu-char.h" typedef struct ASCIIConsoleData { EventBufferHeader ebh; diff --git a/hw/spapr.c b/hw/spapr.c index 9bd2fd5c8c..7306ab368a 100644 --- a/hw/spapr.c +++ b/hw/spapr.c @@ -49,6 +49,7 @@ #include "exec-memory.h" #include "hw/usb.h" +#include "qemu-config.h" #include diff --git a/hw/tcx.c b/hw/tcx.c index 7aee2a9bd3..a66fbeefdb 100644 --- a/hw/tcx.c +++ b/hw/tcx.c @@ -22,6 +22,7 @@ * THE SOFTWARE. */ +#include "qemu-common.h" #include "console.h" #include "pixel_ops.h" #include "sysbus.h" diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c index 30cb03373e..0552e6f438 100644 --- a/hw/usb/dev-network.c +++ b/hw/usb/dev-network.c @@ -28,6 +28,7 @@ #include "hw/usb/desc.h" #include "net.h" #include "qemu-queue.h" +#include "qemu-config.h" #include "sysemu.h" #include "iov.h" diff --git a/net.c b/net.c index e8ae13e283..4f3d642468 100644 --- a/net.c +++ b/net.c @@ -32,6 +32,7 @@ #include "monitor.h" #include "qemu-common.h" #include "qemu_socket.h" +#include "qemu-config.h" #include "qmp-commands.h" #include "hw/qdev.h" #include "iov.h" diff --git a/qemu-config.h b/qemu-config.h index 812c4c5b10..eb50eca838 100644 --- a/qemu-config.h +++ b/qemu-config.h @@ -4,6 +4,7 @@ #include #include "qemu-option.h" #include "error.h" +#include "qemu-option.h" extern QemuOptsList qemu_fsdev_opts; extern QemuOptsList qemu_virtfs_opts; diff --git a/spice-qemu-char.c b/spice-qemu-char.c index 09aa22d566..5f95c937f3 100644 --- a/spice-qemu-char.c +++ b/spice-qemu-char.c @@ -1,6 +1,7 @@ #include "config-host.h" #include "trace.h" #include "ui/qemu-spice.h" +#include "qemu-char.h" #include #include diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 0901589a88..824930c749 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -27,6 +27,7 @@ #include "cpu.h" #include "gdbstub.h" #include "host-utils.h" +#include "qemu-config.h" #include "hw/pc.h" #include "hw/apic.h" #include "ioport.h" From f8fe796407d8b340def61a6b57991e47aee3cfc4 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 24 Oct 2012 08:49:51 +0200 Subject: [PATCH 238/300] janitor: do not include qemu-char everywhere Touching char/char.h basically causes the whole of QEMU to be rebuilt. Avoid this, it is usually unnecessary. Signed-off-by: Paolo Bonzini --- audio/alsaaudio.c | 1 - audio/ossaudio.c | 1 - block/raw-posix.c | 1 - bt-host.c | 1 - bt-vhci.c | 1 - buffered_file.c | 1 - console.c | 1 + console.h | 1 - hmp.c | 1 + hw/9pfs/virtio-9p-coth.c | 1 - hw/ivshmem.c | 1 + hw/spapr_hcall.c | 2 -- hw/strongarm.c | 1 + hw/xen_disk.c | 1 - hw/xen_nic.c | 1 - hw/xilinx_axidma.c | 1 - hw/xilinx_axienet.c | 1 - hw/xtensa_lx60.c | 1 + iohandler.c | 1 - migration-exec.c | 1 - migration-fd.c | 1 - migration-tcp.c | 1 - migration-unix.c | 1 - monitor.h | 1 - net/slirp.c | 1 + net/socket.c | 1 - net/tap.c | 1 - net/vde.c | 1 - qmp.c | 1 + savevm.c | 1 - ui/qemu-spice.h | 1 - 31 files changed, 7 insertions(+), 25 deletions(-) diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c index 564d632d0c..cd553c2a7b 100644 --- a/audio/alsaaudio.c +++ b/audio/alsaaudio.c @@ -24,7 +24,6 @@ #include #include "qemu-common.h" #include "main-loop.h" -#include "qemu-char.h" #include "audio.h" #if QEMU_GNUC_PREREQ(4, 3) diff --git a/audio/ossaudio.c b/audio/ossaudio.c index 45abe39a6d..8249a00449 100644 --- a/audio/ossaudio.c +++ b/audio/ossaudio.c @@ -33,7 +33,6 @@ #include "qemu-common.h" #include "main-loop.h" #include "host-utils.h" -#include "qemu-char.h" #include "audio.h" #define AUDIO_CAP "oss" diff --git a/block/raw-posix.c b/block/raw-posix.c index abfedbea73..48eff2fd83 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -23,7 +23,6 @@ */ #include "qemu-common.h" #include "qemu-timer.h" -#include "qemu-char.h" #include "qemu-log.h" #include "block_int.h" #include "module.h" diff --git a/bt-host.c b/bt-host.c index 8b47370b26..311864517d 100644 --- a/bt-host.c +++ b/bt-host.c @@ -18,7 +18,6 @@ */ #include "qemu-common.h" -#include "qemu-char.h" #include "net.h" #include "bt-host.h" #include "main-loop.h" diff --git a/bt-vhci.c b/bt-vhci.c index 878460aeb5..6fecb66716 100644 --- a/bt-vhci.c +++ b/bt-vhci.c @@ -18,7 +18,6 @@ */ #include "qemu-common.h" -#include "qemu-char.h" #include "net.h" #include "hw/bt.h" #include "main-loop.h" diff --git a/buffered_file.c b/buffered_file.c index bd0f61d8c9..f13443ee91 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -16,7 +16,6 @@ #include "qemu-common.h" #include "hw/hw.h" #include "qemu-timer.h" -#include "qemu-char.h" #include "buffered_file.h" //#define DEBUG_BUFFERED_FILE diff --git a/console.c b/console.c index 048b48e721..9ac7b28742 100644 --- a/console.c +++ b/console.c @@ -25,6 +25,7 @@ #include "console.h" #include "qemu-timer.h" #include "qmp-commands.h" +#include "qemu-char.h" //#define DEBUG_CONSOLE #define DEFAULT_BACKSCROLL 512 diff --git a/console.h b/console.h index edb1950871..33354e437a 100644 --- a/console.h +++ b/console.h @@ -1,7 +1,6 @@ #ifndef CONSOLE_H #define CONSOLE_H -#include "qemu-char.h" #include "qemu-pixman.h" #include "qdict.h" #include "notify.h" diff --git a/hmp.c b/hmp.c index 180ba2bfd9..873962f710 100644 --- a/hmp.c +++ b/hmp.c @@ -15,6 +15,7 @@ #include "hmp.h" #include "net.h" +#include "qemu-char.h" #include "qemu-option.h" #include "qemu-timer.h" #include "qmp-commands.h" diff --git a/hw/9pfs/virtio-9p-coth.c b/hw/9pfs/virtio-9p-coth.c index 25556cc6a7..9368df7610 100644 --- a/hw/9pfs/virtio-9p-coth.c +++ b/hw/9pfs/virtio-9p-coth.c @@ -12,7 +12,6 @@ * */ -#include "qemu-char.h" #include "fsdev/qemu-fsdev.h" #include "qemu-thread.h" #include "qemu-coroutine.h" diff --git a/hw/ivshmem.c b/hw/ivshmem.c index cf64f32ac0..5c648d98d3 100644 --- a/hw/ivshmem.c +++ b/hw/ivshmem.c @@ -24,6 +24,7 @@ #include "migration.h" #include "qerror.h" #include "event_notifier.h" +#include "qemu-char.h" #include #include diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c index 63cadb8d92..1fac362329 100644 --- a/hw/spapr_hcall.c +++ b/hw/spapr_hcall.c @@ -1,8 +1,6 @@ #include "sysemu.h" #include "cpu.h" -#include "qemu-char.h" #include "sysemu.h" -#include "qemu-char.h" #include "helper_regs.h" #include "hw/spapr.h" diff --git a/hw/strongarm.c b/hw/strongarm.c index 43855151ce..44bec34e07 100644 --- a/hw/strongarm.c +++ b/hw/strongarm.c @@ -30,6 +30,7 @@ #include "strongarm.h" #include "qemu-error.h" #include "arm-misc.h" +#include "qemu-char.h" #include "sysemu.h" #include "ssi.h" diff --git a/hw/xen_disk.c b/hw/xen_disk.c index e6bb2f20b9..423b580cff 100644 --- a/hw/xen_disk.c +++ b/hw/xen_disk.c @@ -36,7 +36,6 @@ #include #include "hw.h" -#include "qemu-char.h" #include "xen_backend.h" #include "xen_blkif.h" #include "blockdev.h" diff --git a/hw/xen_nic.c b/hw/xen_nic.c index cf7d5591b3..dadacb1fb5 100644 --- a/hw/xen_nic.c +++ b/hw/xen_nic.c @@ -39,7 +39,6 @@ #include "net.h" #include "net/checksum.h" #include "net/util.h" -#include "qemu-char.h" #include "xen_backend.h" #include diff --git a/hw/xilinx_axidma.c b/hw/xilinx_axidma.c index 4575da1765..2fd6068428 100644 --- a/hw/xilinx_axidma.c +++ b/hw/xilinx_axidma.c @@ -23,7 +23,6 @@ */ #include "sysbus.h" -#include "qemu-char.h" #include "qemu-timer.h" #include "ptimer.h" #include "qemu-log.h" diff --git a/hw/xilinx_axienet.c b/hw/xilinx_axienet.c index f2e3bf1274..c859fde09e 100644 --- a/hw/xilinx_axienet.c +++ b/hw/xilinx_axienet.c @@ -23,7 +23,6 @@ */ #include "sysbus.h" -#include "qemu-char.h" #include "qemu-log.h" #include "net.h" #include "net/checksum.h" diff --git a/hw/xtensa_lx60.c b/hw/xtensa_lx60.c index 4c42edc4ea..bc10d3161f 100644 --- a/hw/xtensa_lx60.c +++ b/hw/xtensa_lx60.c @@ -36,6 +36,7 @@ #include "sysbus.h" #include "flash.h" #include "blockdev.h" +#include "qemu-char.h" #include "xtensa_bootparam.h" typedef struct LxBoardDesc { diff --git a/iohandler.c b/iohandler.c index 60460a6f88..258f42d8d2 100644 --- a/iohandler.c +++ b/iohandler.c @@ -24,7 +24,6 @@ #include "config-host.h" #include "qemu-common.h" -#include "qemu-char.h" #include "qemu-queue.h" #include "qemu-aio.h" #include "main-loop.h" diff --git a/migration-exec.c b/migration-exec.c index 2b6fcb4262..b4a3ca3921 100644 --- a/migration-exec.c +++ b/migration-exec.c @@ -18,7 +18,6 @@ #include "qemu-common.h" #include "qemu_socket.h" #include "migration.h" -#include "qemu-char.h" #include "buffered_file.h" #include "block.h" #include diff --git a/migration-fd.c b/migration-fd.c index 5fe28e09fd..6d42287913 100644 --- a/migration-fd.c +++ b/migration-fd.c @@ -17,7 +17,6 @@ #include "qemu_socket.h" #include "migration.h" #include "monitor.h" -#include "qemu-char.h" #include "buffered_file.h" #include "block.h" #include "qemu_socket.h" diff --git a/migration-tcp.c b/migration-tcp.c index 5e855fe72f..a9bb817d99 100644 --- a/migration-tcp.c +++ b/migration-tcp.c @@ -16,7 +16,6 @@ #include "qemu-common.h" #include "qemu_socket.h" #include "migration.h" -#include "qemu-char.h" #include "buffered_file.h" #include "block.h" diff --git a/migration-unix.c b/migration-unix.c index dba72b4a54..e58e8bc15b 100644 --- a/migration-unix.c +++ b/migration-unix.c @@ -16,7 +16,6 @@ #include "qemu-common.h" #include "qemu_socket.h" #include "migration.h" -#include "qemu-char.h" #include "buffered_file.h" #include "block.h" diff --git a/monitor.h b/monitor.h index b4ef9559dc..4595c217ed 100644 --- a/monitor.h +++ b/monitor.h @@ -2,7 +2,6 @@ #define MONITOR_H #include "qemu-common.h" -#include "qemu-char.h" #include "qerror.h" #include "qdict.h" #include "block.h" diff --git a/net/slirp.c b/net/slirp.c index afb52c3af1..f117412bad 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -35,6 +35,7 @@ #include "monitor.h" #include "qemu_socket.h" #include "slirp/libslirp.h" +#include "qemu-char.h" static int get_str_sep(char *buf, int buf_size, const char **pp, int sep) { diff --git a/net/socket.c b/net/socket.c index c01323d4b0..cf309cd5b9 100644 --- a/net/socket.c +++ b/net/socket.c @@ -26,7 +26,6 @@ #include "net.h" #include "clients.h" #include "monitor.h" -#include "qemu-char.h" #include "qemu-common.h" #include "qemu-error.h" #include "qemu-option.h" diff --git a/net/tap.c b/net/tap.c index 1abfd44bd9..5ff78934dc 100644 --- a/net/tap.c +++ b/net/tap.c @@ -37,7 +37,6 @@ #include "clients.h" #include "monitor.h" #include "sysemu.h" -#include "qemu-char.h" #include "qemu-common.h" #include "qemu-error.h" diff --git a/net/vde.c b/net/vde.c index 275bda92c3..cc5a07d65e 100644 --- a/net/vde.c +++ b/net/vde.c @@ -27,7 +27,6 @@ #include "net.h" #include "clients.h" -#include "qemu-char.h" #include "qemu-common.h" #include "qemu-option.h" diff --git a/qmp.c b/qmp.c index e3a7f0b217..e873f0a0dc 100644 --- a/qmp.c +++ b/qmp.c @@ -16,6 +16,7 @@ #include "qemu-common.h" #include "sysemu.h" #include "qmp-commands.h" +#include "qemu-char.h" #include "ui/qemu-spice.h" #include "ui/vnc.h" #include "kvm.h" diff --git a/savevm.c b/savevm.c index 5d04d59688..f5886ce772 100644 --- a/savevm.c +++ b/savevm.c @@ -76,7 +76,6 @@ #include "monitor.h" #include "sysemu.h" #include "qemu-timer.h" -#include "qemu-char.h" #include "audio/audio.h" #include "migration.h" #include "qemu_socket.h" diff --git a/ui/qemu-spice.h b/ui/qemu-spice.h index 3299da87d6..5857b8a92e 100644 --- a/ui/qemu-spice.h +++ b/ui/qemu-spice.h @@ -24,7 +24,6 @@ #include "qemu-option.h" #include "qemu-config.h" -#include "qemu-char.h" #include "monitor.h" extern int using_spice; From 090f7ac5ba433ef9de7004b8e8304d06bd9ffd7d Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 24 Oct 2012 09:36:16 +0200 Subject: [PATCH 239/300] net: move Bluetooth stuff out of net.h Signed-off-by: Paolo Bonzini --- bt-host.c | 1 - bt-host.h | 13 ++++++++++++- bt-vhci.c | 2 +- hw/bt-hci-csr.c | 2 +- hw/bt-hci.c | 2 +- hw/bt.c | 2 +- hw/usb/dev-bluetooth.c | 2 +- net.h | 14 -------------- 8 files changed, 17 insertions(+), 21 deletions(-) diff --git a/bt-host.c b/bt-host.c index 311864517d..65aaca337c 100644 --- a/bt-host.c +++ b/bt-host.c @@ -18,7 +18,6 @@ */ #include "qemu-common.h" -#include "net.h" #include "bt-host.h" #include "main-loop.h" diff --git a/bt-host.h b/bt-host.h index f1eff65f45..2bc6d53cca 100644 --- a/bt-host.h +++ b/bt-host.h @@ -1,9 +1,20 @@ #ifndef BT_HOST_H #define BT_HOST_H -struct HCIInfo; +/* BT HCI info */ + +struct HCIInfo { + int (*bdaddr_set)(struct HCIInfo *hci, const uint8_t *bd_addr); + void (*cmd_send)(struct HCIInfo *hci, const uint8_t *data, int len); + void (*sco_send)(struct HCIInfo *hci, const uint8_t *data, int len); + void (*acl_send)(struct HCIInfo *hci, const uint8_t *data, int len); + void *opaque; + void (*evt_recv)(void *opaque, const uint8_t *data, int len); + void (*acl_recv)(void *opaque, const uint8_t *data, int len); +}; /* bt-host.c */ struct HCIInfo *bt_host_hci(const char *id); +struct HCIInfo *qemu_next_hci(void); #endif diff --git a/bt-vhci.c b/bt-vhci.c index 6fecb66716..13c0e53729 100644 --- a/bt-vhci.c +++ b/bt-vhci.c @@ -18,7 +18,7 @@ */ #include "qemu-common.h" -#include "net.h" +#include "bt-host.h" #include "hw/bt.h" #include "main-loop.h" diff --git a/hw/bt-hci-csr.c b/hw/bt-hci-csr.c index 772b677ba1..0faabbb585 100644 --- a/hw/bt-hci-csr.c +++ b/hw/bt-hci-csr.c @@ -22,7 +22,7 @@ #include "qemu-char.h" #include "qemu-timer.h" #include "irq.h" -#include "net.h" +#include "bt-host.h" #include "bt.h" struct csrhci_s { diff --git a/hw/bt-hci.c b/hw/bt-hci.c index e54cfd7815..d2ad57faa9 100644 --- a/hw/bt-hci.c +++ b/hw/bt-hci.c @@ -21,7 +21,7 @@ #include "qemu-common.h" #include "qemu-timer.h" #include "usb.h" -#include "net.h" +#include "bt-host.h" #include "bt.h" struct bt_hci_s { diff --git a/hw/bt.c b/hw/bt.c index dc99fc28fa..3fea0983d4 100644 --- a/hw/bt.c +++ b/hw/bt.c @@ -18,7 +18,7 @@ */ #include "qemu-common.h" -#include "net.h" +#include "bt-host.h" #include "bt.h" /* Slave implementations can ignore this */ diff --git a/hw/usb/dev-bluetooth.c b/hw/usb/dev-bluetooth.c index 39984f53eb..4a37442288 100644 --- a/hw/usb/dev-bluetooth.c +++ b/hw/usb/dev-bluetooth.c @@ -21,7 +21,7 @@ #include "qemu-common.h" #include "hw/usb.h" #include "hw/usb/desc.h" -#include "net.h" +#include "bt-host.h" #include "hw/bt.h" struct USBBtState { diff --git a/net.h b/net.h index 04fda1d6c8..1d0816bc0a 100644 --- a/net.h +++ b/net.h @@ -133,20 +133,6 @@ extern int nb_nics; extern NICInfo nd_table[MAX_NICS]; extern int default_net; -/* BT HCI info */ - -struct HCIInfo { - int (*bdaddr_set)(struct HCIInfo *hci, const uint8_t *bd_addr); - void (*cmd_send)(struct HCIInfo *hci, const uint8_t *data, int len); - void (*sco_send)(struct HCIInfo *hci, const uint8_t *data, int len); - void (*acl_send)(struct HCIInfo *hci, const uint8_t *data, int len); - void *opaque; - void (*evt_recv)(void *opaque, const uint8_t *data, int len); - void (*acl_recv)(void *opaque, const uint8_t *data, int len); -}; - -struct HCIInfo *qemu_next_hci(void); - /* from net.c */ extern const char *legacy_tftp_prefix; extern const char *legacy_bootp_filename; From 7fa22f2bf7a06d5345283a00a7c6d86b8a345228 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 24 Oct 2012 09:36:33 +0200 Subject: [PATCH 240/300] net: do not include net.h everywhere Signed-off-by: Paolo Bonzini --- arch_init.c | 1 - hw/alpha_sys.h | 1 - hw/device-hotplug.c | 1 - hw/lm32_boards.c | 1 - hw/milkymist-hw.h | 1 + hw/milkymist.c | 1 - hw/s390-virtio-bus.c | 1 - hw/spapr_vscsi.c | 1 - hw/virtex_ml507.c | 1 - hw/virtio-net.h | 1 - hw/virtio-pci.c | 1 - hw/virtio-scsi.h | 1 - hw/xen_backend.h | 1 - hw/xen_platform.c | 1 - input.c | 1 - qemu-char.c | 1 - qemu-timer.c | 1 - 17 files changed, 1 insertion(+), 16 deletions(-) diff --git a/arch_init.c b/arch_init.c index ef866cdea4..e479a2566c 100644 --- a/arch_init.c +++ b/arch_init.c @@ -40,7 +40,6 @@ #include "hw/audiodev.h" #include "kvm.h" #include "migration.h" -#include "net.h" #include "gdbstub.h" #include "hw/smbios.h" #include "exec-memory.h" diff --git a/hw/alpha_sys.h b/hw/alpha_sys.h index b1e52585b3..348f55c27e 100644 --- a/hw/alpha_sys.h +++ b/hw/alpha_sys.h @@ -6,7 +6,6 @@ #include "pci/pci.h" #include "pci/pci_host.h" #include "ide.h" -#include "net.h" #include "pc.h" #include "irq.h" diff --git a/hw/device-hotplug.c b/hw/device-hotplug.c index 839b9ea1d4..336ffc2274 100644 --- a/hw/device-hotplug.c +++ b/hw/device-hotplug.c @@ -24,7 +24,6 @@ #include "hw.h" #include "boards.h" -#include "net.h" #include "blockdev.h" #include "qemu-config.h" #include "sysemu.h" diff --git a/hw/lm32_boards.c b/hw/lm32_boards.c index 772cb8b053..f59d3bfef8 100644 --- a/hw/lm32_boards.c +++ b/hw/lm32_boards.c @@ -19,7 +19,6 @@ #include "sysbus.h" #include "hw.h" -#include "net.h" #include "flash.h" #include "devices.h" #include "boards.h" diff --git a/hw/milkymist-hw.h b/hw/milkymist-hw.h index 96b2a7f863..0253b7ab26 100644 --- a/hw/milkymist-hw.h +++ b/hw/milkymist-hw.h @@ -3,6 +3,7 @@ #include "qdev.h" #include "qdev-addr.h" +#include "net.h" static inline DeviceState *milkymist_uart_create(hwaddr base, qemu_irq irq) diff --git a/hw/milkymist.c b/hw/milkymist.c index 4c8111a74d..c26ea4aed2 100644 --- a/hw/milkymist.c +++ b/hw/milkymist.c @@ -19,7 +19,6 @@ #include "sysbus.h" #include "hw.h" -#include "net.h" #include "flash.h" #include "sysemu.h" #include "devices.h" diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c index e0ac2d1ec2..169dd4683d 100644 --- a/hw/s390-virtio-bus.c +++ b/hw/s390-virtio-bus.c @@ -20,7 +20,6 @@ #include "hw.h" #include "block.h" #include "sysemu.h" -#include "net.h" #include "boards.h" #include "monitor.h" #include "loader.h" diff --git a/hw/spapr_vscsi.c b/hw/spapr_vscsi.c index e3d4b237f1..2d811320ca 100644 --- a/hw/spapr_vscsi.c +++ b/hw/spapr_vscsi.c @@ -34,7 +34,6 @@ #include "hw.h" #include "scsi.h" #include "scsi-defs.h" -#include "net.h" /* Remove that when we can */ #include "srp.h" #include "hw/qdev.h" #include "hw/spapr.h" diff --git a/hw/virtex_ml507.c b/hw/virtex_ml507.c index 6ab8fee0c1..1fdbc497cc 100644 --- a/hw/virtex_ml507.c +++ b/hw/virtex_ml507.c @@ -25,7 +25,6 @@ #include "sysbus.h" #include "hw.h" #include "serial.h" -#include "net.h" #include "flash.h" #include "sysemu.h" #include "devices.h" diff --git a/hw/virtio-net.h b/hw/virtio-net.h index b13be7ccb5..2566ea13ec 100644 --- a/hw/virtio-net.h +++ b/hw/virtio-net.h @@ -15,7 +15,6 @@ #define _QEMU_VIRTIO_NET_H #include "virtio.h" -#include "net.h" #include "pci/pci.h" #define ETH_ALEN 6 diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index d0d6a5e816..a2355dc867 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -26,7 +26,6 @@ #include "qemu-error.h" #include "pci/msi.h" #include "pci/msix.h" -#include "net.h" #include "loader.h" #include "kvm.h" #include "blockdev.h" diff --git a/hw/virtio-scsi.h b/hw/virtio-scsi.h index 7d7cba752d..8d9d15f093 100644 --- a/hw/virtio-scsi.h +++ b/hw/virtio-scsi.h @@ -15,7 +15,6 @@ #define _QEMU_VIRTIO_SCSI_H #include "virtio.h" -#include "net.h" #include "pci/pci.h" /* The ID for virtio_scsi */ diff --git a/hw/xen_backend.h b/hw/xen_backend.h index fea86dd78b..3305630903 100644 --- a/hw/xen_backend.h +++ b/hw/xen_backend.h @@ -4,7 +4,6 @@ #include "xen_common.h" #include "sysemu.h" #include "net.h" -#include "net/hub.h" /* ------------------------------------------------------------- */ diff --git a/hw/xen_platform.c b/hw/xen_platform.c index 10bb560073..023499eb55 100644 --- a/hw/xen_platform.c +++ b/hw/xen_platform.c @@ -30,7 +30,6 @@ #include "pci/pci.h" #include "irq.h" #include "xen_common.h" -#include "net.h" #include "xen_backend.h" #include "trace.h" #include "exec-memory.h" diff --git a/input.c b/input.c index 25d3973e21..123bb237d4 100644 --- a/input.c +++ b/input.c @@ -23,7 +23,6 @@ */ #include "sysemu.h" -#include "net.h" #include "monitor.h" #include "console.h" #include "error.h" diff --git a/qemu-char.c b/qemu-char.c index 242b799909..f066ad0654 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -22,7 +22,6 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "net.h" #include "monitor.h" #include "console.h" #include "sysemu.h" diff --git a/qemu-timer.c b/qemu-timer.c index 0d2bb94289..9b9585b259 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -23,7 +23,6 @@ */ #include "sysemu.h" -#include "net.h" #include "monitor.h" #include "console.h" From fd9400b302ef582c3ae8a8d5288338ea5f0f4c9a Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 24 Oct 2012 11:27:28 +0200 Subject: [PATCH 241/300] net: move net.c to net/ Signed-off-by: Paolo Bonzini --- Makefile.objs | 2 +- net/Makefile.objs | 2 +- net.c => net/net.c | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) rename net.c => net/net.c (99%) diff --git a/Makefile.objs b/Makefile.objs index 986f085c85..83092dc74b 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -66,7 +66,7 @@ endif # single QEMU executable should support all CPUs and machines. common-obj-y = $(block-obj-y) blockdev.o blockdev-nbd.o block/ -common-obj-y += net.o net/ +common-obj-y += net/ common-obj-y += qom/ common-obj-y += readline.o console.o cursor.o common-obj-y += qemu-pixman.o diff --git a/net/Makefile.objs b/net/Makefile.objs index cf04187717..a08cd14e2e 100644 --- a/net/Makefile.objs +++ b/net/Makefile.objs @@ -1,4 +1,4 @@ -common-obj-y = queue.o checksum.o util.o hub.o +common-obj-y = net.o queue.o checksum.o util.o hub.o common-obj-y += socket.o common-obj-y += dump.o common-obj-$(CONFIG_POSIX) += tap.o diff --git a/net.c b/net/net.c similarity index 99% rename from net.c rename to net/net.c index 4f3d642468..7b1600f17c 100644 --- a/net.c +++ b/net/net.c @@ -24,10 +24,10 @@ #include "config-host.h" #include "net.h" -#include "net/clients.h" -#include "net/hub.h" -#include "net/slirp.h" -#include "net/util.h" +#include "clients.h" +#include "hub.h" +#include "slirp.h" +#include "util.h" #include "monitor.h" #include "qemu-common.h" From 1422e32db51ff2b1194fb24a6201c4310be5667d Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 24 Oct 2012 08:43:34 +0200 Subject: [PATCH 242/300] net: reorganize headers Move public headers to include/net, and leave private headers in net/. Put the virtio headers in include/net/tap.h, removing the multiple copies that existed. Leave include/net/tap.h as the interface for NICs, and net/tap_int.h as the interface for OS-specific parts of the tap backend. Signed-off-by: Paolo Bonzini --- hmp.c | 2 +- hw/axis_dev88.c | 2 +- hw/cadence_gem.c | 2 +- hw/dp8393x.c | 2 +- hw/e1000.c | 2 +- hw/eepro100.c | 2 +- hw/etraxfs.h | 2 +- hw/etraxfs_eth.c | 2 +- hw/exynos4_boards.c | 2 +- hw/gumstix.c | 2 +- hw/highbank.c | 2 +- hw/integratorcp.c | 2 +- hw/kzm.c | 2 +- hw/lan9118.c | 2 +- hw/lance.c | 2 +- hw/mainstone.c | 2 +- hw/mcf5208.c | 2 +- hw/mcf_fec.c | 2 +- hw/milkymist-hw.h | 2 +- hw/milkymist-minimac2.c | 2 +- hw/mips_fulong2e.c | 2 +- hw/mips_jazz.c | 2 +- hw/mips_malta.c | 2 +- hw/mips_mipssim.c | 2 +- hw/mips_r4k.c | 2 +- hw/mipsnet.c | 2 +- hw/musicpal.c | 2 +- hw/ne2000-isa.c | 2 +- hw/ne2000.c | 2 +- hw/opencores_eth.c | 2 +- hw/openrisc_sim.c | 2 +- hw/pc.h | 2 +- hw/pc_piix.c | 2 +- hw/pci/pci-hotplug.c | 2 +- hw/pci/pci.c | 2 +- hw/pcnet-pci.c | 2 +- hw/pcnet.c | 2 +- hw/petalogix_ml605_mmu.c | 2 +- hw/petalogix_s3adsp1800_mmu.c | 2 +- hw/ppc/e500.c | 2 +- hw/ppc440_bamboo.c | 2 +- hw/ppc_newworld.c | 2 +- hw/ppc_oldworld.c | 2 +- hw/ppc_prep.c | 2 +- hw/qdev-properties.c | 2 +- hw/qdev.c | 2 +- hw/r2d.c | 2 +- hw/realview.c | 2 +- hw/rtl8139.c | 2 +- hw/s390-virtio.c | 2 +- hw/smc91c111.c | 2 +- hw/spapr.c | 2 +- hw/spapr_llan.c | 2 +- hw/stellaris.c | 2 +- hw/stellaris_enet.c | 2 +- hw/sun4m.c | 2 +- hw/sun4u.c | 2 +- hw/usb/dev-network.c | 2 +- hw/versatilepb.c | 2 +- hw/vexpress.c | 2 +- hw/vhost_net.c | 2 +- hw/vhost_net.h | 2 +- hw/virtio-net.c | 2 +- hw/virtio-net.h | 27 ------------- hw/virtio.h | 2 +- hw/xen_backend.h | 2 +- hw/xen_nic.c | 2 +- hw/xgmac.c | 2 +- hw/xilinx.h | 2 +- hw/xilinx_axienet.c | 2 +- hw/xilinx_ethlite.c | 2 +- hw/xilinx_zynq.c | 2 +- hw/xtensa_lx60.c | 2 +- {net => include/net}/checksum.h | 0 net.h => include/net/net.h | 3 ++ {net => include/net}/queue.h | 0 {net => include/net}/slirp.h | 0 include/net/tap.h | 67 +++++++++++++++++++++++++++++++++ monitor.c | 2 +- net/clients.h | 2 +- net/hub.c | 2 +- net/hub.h | 2 - net/net.c | 4 +- net/queue.c | 2 +- net/slirp.c | 2 +- net/socket.c | 2 +- net/tap-aix.c | 2 +- net/tap-bsd.c | 2 +- net/tap-haiku.c | 2 +- net/tap-linux.c | 3 +- net/tap-linux.h | 20 +--------- net/tap-solaris.c | 2 +- net/tap-win32.c | 4 +- net/tap.c | 6 +-- net/{tap.h => tap_int.h} | 18 ++------- net/util.c | 2 +- net/vde.c | 2 +- savevm.c | 2 +- vl.c | 2 +- 99 files changed, 170 insertions(+), 156 deletions(-) rename {net => include/net}/checksum.h (100%) rename net.h => include/net/net.h (98%) rename {net => include/net}/queue.h (100%) rename {net => include/net}/slirp.h (100%) create mode 100644 include/net/tap.h rename net/{tap.h => tap_int.h} (77%) diff --git a/hmp.c b/hmp.c index 873962f710..9b31e9f8a7 100644 --- a/hmp.c +++ b/hmp.c @@ -14,7 +14,7 @@ */ #include "hmp.h" -#include "net.h" +#include "net/net.h" #include "qemu-char.h" #include "qemu-option.h" #include "qemu-timer.h" diff --git a/hw/axis_dev88.c b/hw/axis_dev88.c index aa1ac9e479..50ddbc920d 100644 --- a/hw/axis_dev88.c +++ b/hw/axis_dev88.c @@ -23,7 +23,7 @@ */ #include "sysbus.h" -#include "net.h" +#include "net/net.h" #include "flash.h" #include "boards.h" #include "etraxfs.h" diff --git a/hw/cadence_gem.c b/hw/cadence_gem.c index 0c037a2993..40a239973c 100644 --- a/hw/cadence_gem.c +++ b/hw/cadence_gem.c @@ -25,7 +25,7 @@ #include /* For crc32 */ #include "sysbus.h" -#include "net.h" +#include "net/net.h" #include "net/checksum.h" #ifdef CADENCE_GEM_ERR_DEBUG diff --git a/hw/dp8393x.c b/hw/dp8393x.c index 3f6386eee8..d59b6118ad 100644 --- a/hw/dp8393x.c +++ b/hw/dp8393x.c @@ -19,7 +19,7 @@ #include "hw.h" #include "qemu-timer.h" -#include "net.h" +#include "net/net.h" #include "mips.h" //#define DEBUG_SONIC diff --git a/hw/e1000.c b/hw/e1000.c index c89c8d22ab..aeee3e61f4 100644 --- a/hw/e1000.c +++ b/hw/e1000.c @@ -27,7 +27,7 @@ #include "hw.h" #include "pci/pci.h" -#include "net.h" +#include "net/net.h" #include "net/checksum.h" #include "loader.h" #include "sysemu.h" diff --git a/hw/eepro100.c b/hw/eepro100.c index 992f03ace7..9e2be4ea0d 100644 --- a/hw/eepro100.c +++ b/hw/eepro100.c @@ -43,7 +43,7 @@ #include /* offsetof */ #include "hw.h" #include "pci/pci.h" -#include "net.h" +#include "net/net.h" #include "eeprom93xx.h" #include "sysemu.h" #include "dma.h" diff --git a/hw/etraxfs.h b/hw/etraxfs.h index 725bb9e142..bc60713633 100644 --- a/hw/etraxfs.h +++ b/hw/etraxfs.h @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -#include "net.h" +#include "net/net.h" #include "etraxfs_dma.h" qemu_irq *cris_pic_init_cpu(CPUCRISState *env); diff --git a/hw/etraxfs_eth.c b/hw/etraxfs_eth.c index 3d42426823..289a810edc 100644 --- a/hw/etraxfs_eth.c +++ b/hw/etraxfs_eth.c @@ -24,7 +24,7 @@ #include #include "sysbus.h" -#include "net.h" +#include "net/net.h" #include "etraxfs.h" #define D(x) diff --git a/hw/exynos4_boards.c b/hw/exynos4_boards.c index bc815bbae3..c375f16479 100644 --- a/hw/exynos4_boards.c +++ b/hw/exynos4_boards.c @@ -23,7 +23,7 @@ #include "sysemu.h" #include "sysbus.h" -#include "net.h" +#include "net/net.h" #include "arm-misc.h" #include "exec-memory.h" #include "exynos4210.h" diff --git a/hw/gumstix.c b/hw/gumstix.c index 4103a88b80..545b92fd95 100644 --- a/hw/gumstix.c +++ b/hw/gumstix.c @@ -36,7 +36,7 @@ #include "hw.h" #include "pxa.h" -#include "net.h" +#include "net/net.h" #include "flash.h" #include "devices.h" #include "boards.h" diff --git a/hw/highbank.c b/hw/highbank.c index 8e35127c8a..90f7cb5ef2 100644 --- a/hw/highbank.c +++ b/hw/highbank.c @@ -21,7 +21,7 @@ #include "arm-misc.h" #include "devices.h" #include "loader.h" -#include "net.h" +#include "net/net.h" #include "sysemu.h" #include "boards.h" #include "sysbus.h" diff --git a/hw/integratorcp.c b/hw/integratorcp.c index 77807c39e3..2b59fea9f1 100644 --- a/hw/integratorcp.c +++ b/hw/integratorcp.c @@ -11,7 +11,7 @@ #include "devices.h" #include "boards.h" #include "arm-misc.h" -#include "net.h" +#include "net/net.h" #include "exec-memory.h" #include "sysemu.h" diff --git a/hw/kzm.c b/hw/kzm.c index 687daf3b2c..a27ecbba84 100644 --- a/hw/kzm.c +++ b/hw/kzm.c @@ -18,7 +18,7 @@ #include "hw.h" #include "arm-misc.h" #include "devices.h" -#include "net.h" +#include "net/net.h" #include "sysemu.h" #include "boards.h" #include "serial.h" diff --git a/hw/lan9118.c b/hw/lan9118.c index f724e1c301..4c72d0d98e 100644 --- a/hw/lan9118.c +++ b/hw/lan9118.c @@ -11,7 +11,7 @@ */ #include "sysbus.h" -#include "net.h" +#include "net/net.h" #include "devices.h" #include "sysemu.h" #include "ptimer.h" diff --git a/hw/lance.c b/hw/lance.c index a3e6dd91d5..a384676158 100644 --- a/hw/lance.c +++ b/hw/lance.c @@ -36,7 +36,7 @@ */ #include "sysbus.h" -#include "net.h" +#include "net/net.h" #include "qemu-timer.h" #include "qemu_socket.h" #include "sun4m.h" diff --git a/hw/mainstone.c b/hw/mainstone.c index 5bbecb7304..58c8b0748e 100644 --- a/hw/mainstone.c +++ b/hw/mainstone.c @@ -14,7 +14,7 @@ #include "hw.h" #include "pxa.h" #include "arm-misc.h" -#include "net.h" +#include "net/net.h" #include "devices.h" #include "boards.h" #include "flash.h" diff --git a/hw/mcf5208.c b/hw/mcf5208.c index b1db54937e..6326624111 100644 --- a/hw/mcf5208.c +++ b/hw/mcf5208.c @@ -10,7 +10,7 @@ #include "qemu-timer.h" #include "ptimer.h" #include "sysemu.h" -#include "net.h" +#include "net/net.h" #include "boards.h" #include "loader.h" #include "elf.h" diff --git a/hw/mcf_fec.c b/hw/mcf_fec.c index 1ed193c5db..b5fb18f67f 100644 --- a/hw/mcf_fec.c +++ b/hw/mcf_fec.c @@ -6,7 +6,7 @@ * This code is licensed under the GPL */ #include "hw.h" -#include "net.h" +#include "net/net.h" #include "mcf.h" /* For crc32 */ #include diff --git a/hw/milkymist-hw.h b/hw/milkymist-hw.h index 0253b7ab26..812ddd2bd1 100644 --- a/hw/milkymist-hw.h +++ b/hw/milkymist-hw.h @@ -3,7 +3,7 @@ #include "qdev.h" #include "qdev-addr.h" -#include "net.h" +#include "net/net.h" static inline DeviceState *milkymist_uart_create(hwaddr base, qemu_irq irq) diff --git a/hw/milkymist-minimac2.c b/hw/milkymist-minimac2.c index b204e5f890..926f7f9a8b 100644 --- a/hw/milkymist-minimac2.c +++ b/hw/milkymist-minimac2.c @@ -25,7 +25,7 @@ #include "hw.h" #include "sysbus.h" #include "trace.h" -#include "net.h" +#include "net/net.h" #include "qemu-error.h" #include "qdev-addr.h" diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c index d5cf33b4b6..bab96b27c1 100644 --- a/hw/mips_fulong2e.c +++ b/hw/mips_fulong2e.c @@ -22,7 +22,7 @@ #include "pc.h" #include "serial.h" #include "fdc.h" -#include "net.h" +#include "net/net.h" #include "boards.h" #include "smbus.h" #include "block.h" diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c index ea1416ae2f..8e5e8ef1af 100644 --- a/hw/mips_jazz.c +++ b/hw/mips_jazz.c @@ -32,7 +32,7 @@ #include "sysemu.h" #include "arch_init.h" #include "boards.h" -#include "net.h" +#include "net/net.h" #include "esp.h" #include "mips-bios.h" #include "loader.h" diff --git a/hw/mips_malta.c b/hw/mips_malta.c index 571903dfc5..3f9f171385 100644 --- a/hw/mips_malta.c +++ b/hw/mips_malta.c @@ -26,7 +26,7 @@ #include "pc.h" #include "serial.h" #include "fdc.h" -#include "net.h" +#include "net/net.h" #include "boards.h" #include "smbus.h" #include "block.h" diff --git a/hw/mips_mipssim.c b/hw/mips_mipssim.c index 20b5f1a58c..78317426a7 100644 --- a/hw/mips_mipssim.c +++ b/hw/mips_mipssim.c @@ -29,7 +29,7 @@ #include "mips_cpudevs.h" #include "serial.h" #include "isa.h" -#include "net.h" +#include "net/net.h" #include "sysemu.h" #include "boards.h" #include "mips-bios.h" diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c index 325098a43a..ec99d7d6a6 100644 --- a/hw/mips_r4k.c +++ b/hw/mips_r4k.c @@ -13,7 +13,7 @@ #include "pc.h" #include "serial.h" #include "isa.h" -#include "net.h" +#include "net/net.h" #include "sysemu.h" #include "boards.h" #include "flash.h" diff --git a/hw/mipsnet.c b/hw/mipsnet.c index bece332c4e..bb752d3950 100644 --- a/hw/mipsnet.c +++ b/hw/mipsnet.c @@ -1,5 +1,5 @@ #include "hw.h" -#include "net.h" +#include "net/net.h" #include "trace.h" #include "sysbus.h" diff --git a/hw/musicpal.c b/hw/musicpal.c index e0c57c84eb..4e8399ab63 100644 --- a/hw/musicpal.c +++ b/hw/musicpal.c @@ -12,7 +12,7 @@ #include "sysbus.h" #include "arm-misc.h" #include "devices.h" -#include "net.h" +#include "net/net.h" #include "sysemu.h" #include "boards.h" #include "serial.h" diff --git a/hw/ne2000-isa.c b/hw/ne2000-isa.c index 69982a9abb..99477a412a 100644 --- a/hw/ne2000-isa.c +++ b/hw/ne2000-isa.c @@ -25,7 +25,7 @@ #include "pc.h" #include "isa.h" #include "qdev.h" -#include "net.h" +#include "net/net.h" #include "ne2000.h" #include "exec-memory.h" diff --git a/hw/ne2000.c b/hw/ne2000.c index fb78e5b252..2001264e14 100644 --- a/hw/ne2000.c +++ b/hw/ne2000.c @@ -23,7 +23,7 @@ */ #include "hw.h" #include "pci/pci.h" -#include "net.h" +#include "net/net.h" #include "ne2000.h" #include "loader.h" #include "sysemu.h" diff --git a/hw/opencores_eth.c b/hw/opencores_eth.c index b2780b9334..fd2f0f61c3 100644 --- a/hw/opencores_eth.c +++ b/hw/opencores_eth.c @@ -33,7 +33,7 @@ #include "hw.h" #include "sysbus.h" -#include "net.h" +#include "net/net.h" #include "sysemu.h" #include "trace.h" diff --git a/hw/openrisc_sim.c b/hw/openrisc_sim.c index 23c66df1fb..a879fb0dd0 100644 --- a/hw/openrisc_sim.c +++ b/hw/openrisc_sim.c @@ -22,7 +22,7 @@ #include "boards.h" #include "elf.h" #include "serial.h" -#include "net.h" +#include "net/net.h" #include "loader.h" #include "exec-memory.h" #include "sysemu.h" diff --git a/hw/pc.h b/hw/pc.h index 2237e86446..5e4d103813 100644 --- a/hw/pc.h +++ b/hw/pc.h @@ -6,7 +6,7 @@ #include "ioport.h" #include "isa.h" #include "fdc.h" -#include "net.h" +#include "net/net.h" #include "memory.h" #include "ioapic.h" diff --git a/hw/pc_piix.c b/hw/pc_piix.c index c2b4cb07e5..7268dcd944 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -30,7 +30,7 @@ #include "pci/pci.h" #include "pci/pci_ids.h" #include "usb.h" -#include "net.h" +#include "net/net.h" #include "boards.h" #include "ide.h" #include "kvm.h" diff --git a/hw/pci/pci-hotplug.c b/hw/pci/pci-hotplug.c index 4b4c931c74..b850400252 100644 --- a/hw/pci/pci-hotplug.c +++ b/hw/pci/pci-hotplug.c @@ -25,7 +25,7 @@ #include "hw/hw.h" #include "hw/boards.h" #include "hw/pci/pci.h" -#include "net.h" +#include "net/net.h" #include "hw/pc.h" #include "monitor.h" #include "hw/scsi.h" diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 2e455e22d2..105fe9560e 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -26,7 +26,7 @@ #include "hw/pci/pci_bridge.h" #include "hw/pci/pci_bus.h" #include "monitor.h" -#include "net.h" +#include "net/net.h" #include "sysemu.h" #include "hw/loader.h" #include "range.h" diff --git a/hw/pcnet-pci.c b/hw/pcnet-pci.c index c1abbf8d0d..c6768bcbdc 100644 --- a/hw/pcnet-pci.c +++ b/hw/pcnet-pci.c @@ -28,7 +28,7 @@ */ #include "pci/pci.h" -#include "net.h" +#include "net/net.h" #include "loader.h" #include "qemu-timer.h" #include "dma.h" diff --git a/hw/pcnet.c b/hw/pcnet.c index 54eecd01d3..5b03edecdd 100644 --- a/hw/pcnet.c +++ b/hw/pcnet.c @@ -36,7 +36,7 @@ */ #include "qdev.h" -#include "net.h" +#include "net/net.h" #include "qemu-timer.h" #include "qemu_socket.h" #include "sysemu.h" diff --git a/hw/petalogix_ml605_mmu.c b/hw/petalogix_ml605_mmu.c index 3589a4bc7f..df51a74450 100644 --- a/hw/petalogix_ml605_mmu.c +++ b/hw/petalogix_ml605_mmu.c @@ -27,7 +27,7 @@ #include "sysbus.h" #include "hw.h" -#include "net.h" +#include "net/net.h" #include "flash.h" #include "sysemu.h" #include "devices.h" diff --git a/hw/petalogix_s3adsp1800_mmu.c b/hw/petalogix_s3adsp1800_mmu.c index c5fd5e793a..37b0d5595a 100644 --- a/hw/petalogix_s3adsp1800_mmu.c +++ b/hw/petalogix_s3adsp1800_mmu.c @@ -25,7 +25,7 @@ #include "sysbus.h" #include "hw.h" -#include "net.h" +#include "net/net.h" #include "flash.h" #include "sysemu.h" #include "devices.h" diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 2b1558b16e..4690bd8b00 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -18,7 +18,7 @@ #include "qemu-common.h" #include "e500.h" #include "e500-ccsr.h" -#include "net.h" +#include "net/net.h" #include "qemu-config.h" #include "hw/hw.h" #include "hw/serial.h" diff --git a/hw/ppc440_bamboo.c b/hw/ppc440_bamboo.c index 0b39a81ec5..5193a0c4be 100644 --- a/hw/ppc440_bamboo.c +++ b/hw/ppc440_bamboo.c @@ -13,7 +13,7 @@ #include "config.h" #include "qemu-common.h" -#include "net.h" +#include "net/net.h" #include "hw.h" #include "pci/pci.h" #include "boards.h" diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c index 2bf3094e9f..657f405f1b 100644 --- a/hw/ppc_newworld.c +++ b/hw/ppc_newworld.c @@ -53,7 +53,7 @@ #include "mac_dbdma.h" #include "nvram.h" #include "pci/pci.h" -#include "net.h" +#include "net/net.h" #include "sysemu.h" #include "boards.h" #include "fw_cfg.h" diff --git a/hw/ppc_oldworld.c b/hw/ppc_oldworld.c index 3bc29c619c..a149306cc9 100644 --- a/hw/ppc_oldworld.c +++ b/hw/ppc_oldworld.c @@ -30,7 +30,7 @@ #include "mac_dbdma.h" #include "nvram.h" #include "sysemu.h" -#include "net.h" +#include "net/net.h" #include "isa.h" #include "pci/pci.h" #include "boards.h" diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c index f6ffb593b7..25cc0490f9 100644 --- a/hw/ppc_prep.c +++ b/hw/ppc_prep.c @@ -26,7 +26,7 @@ #include "pc.h" #include "serial.h" #include "fdc.h" -#include "net.h" +#include "net/net.h" #include "sysemu.h" #include "isa.h" #include "pci/pci.h" diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c index b9cd3c0077..7ab55efe43 100644 --- a/hw/qdev-properties.c +++ b/hw/qdev-properties.c @@ -1,4 +1,4 @@ -#include "net.h" +#include "net/net.h" #include "qdev.h" #include "qerror.h" #include "blockdev.h" diff --git a/hw/qdev.c b/hw/qdev.c index 599382cab2..6b91fb987b 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -25,7 +25,7 @@ inherit from a particular bus (e.g. PCI or I2C) rather than this API directly. */ -#include "net.h" +#include "net/net.h" #include "qdev.h" #include "sysemu.h" #include "error.h" diff --git a/hw/r2d.c b/hw/r2d.c index e18c23b28b..b1c278f73f 100644 --- a/hw/r2d.c +++ b/hw/r2d.c @@ -30,7 +30,7 @@ #include "sysemu.h" #include "boards.h" #include "pci/pci.h" -#include "net.h" +#include "net/net.h" #include "sh7750_regs.h" #include "ide.h" #include "loader.h" diff --git a/hw/realview.c b/hw/realview.c index 5fbdcbf2b0..17d1ba2266 100644 --- a/hw/realview.c +++ b/hw/realview.c @@ -12,7 +12,7 @@ #include "primecell.h" #include "devices.h" #include "pci/pci.h" -#include "net.h" +#include "net/net.h" #include "sysemu.h" #include "boards.h" #include "i2c.h" diff --git a/hw/rtl8139.c b/hw/rtl8139.c index e294a2a5e3..e024520b8b 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -55,7 +55,7 @@ #include "pci/pci.h" #include "dma.h" #include "qemu-timer.h" -#include "net.h" +#include "net/net.h" #include "loader.h" #include "sysemu.h" #include "iov.h" diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c index 7aca0c4aad..8c724b942c 100644 --- a/hw/s390-virtio.c +++ b/hw/s390-virtio.c @@ -21,7 +21,7 @@ #include "block.h" #include "blockdev.h" #include "sysemu.h" -#include "net.h" +#include "net/net.h" #include "boards.h" #include "monitor.h" #include "loader.h" diff --git a/hw/smc91c111.c b/hw/smc91c111.c index 4ceed01a1a..2161b4af7a 100644 --- a/hw/smc91c111.c +++ b/hw/smc91c111.c @@ -8,7 +8,7 @@ */ #include "sysbus.h" -#include "net.h" +#include "net/net.h" #include "devices.h" /* For crc32 */ #include diff --git a/hw/spapr.c b/hw/spapr.c index 7306ab368a..395c4ac69b 100644 --- a/hw/spapr.c +++ b/hw/spapr.c @@ -27,7 +27,7 @@ #include "sysemu.h" #include "hw.h" #include "elf.h" -#include "net.h" +#include "net/net.h" #include "blockdev.h" #include "cpus.h" #include "kvm.h" diff --git a/hw/spapr_llan.c b/hw/spapr_llan.c index 09ad69f6b5..8077eb94bc 100644 --- a/hw/spapr_llan.c +++ b/hw/spapr_llan.c @@ -25,7 +25,7 @@ * */ #include "hw.h" -#include "net.h" +#include "net/net.h" #include "hw/qdev.h" #include "hw/spapr.h" #include "hw/spapr_vio.h" diff --git a/hw/stellaris.c b/hw/stellaris.c index b038f10f3a..f3eb4bbc01 100644 --- a/hw/stellaris.c +++ b/hw/stellaris.c @@ -13,7 +13,7 @@ #include "devices.h" #include "qemu-timer.h" #include "i2c.h" -#include "net.h" +#include "net/net.h" #include "boards.h" #include "exec-memory.h" diff --git a/hw/stellaris_enet.c b/hw/stellaris_enet.c index a530b10598..d7e1e21ff9 100644 --- a/hw/stellaris_enet.c +++ b/hw/stellaris_enet.c @@ -7,7 +7,7 @@ * This code is licensed under the GPL. */ #include "sysbus.h" -#include "net.h" +#include "net/net.h" #include //#define DEBUG_STELLARIS_ENET 1 diff --git a/hw/sun4m.c b/hw/sun4m.c index 52cf82b681..9a784dfd04 100644 --- a/hw/sun4m.c +++ b/hw/sun4m.c @@ -28,7 +28,7 @@ #include "sparc32_dma.h" #include "fdc.h" #include "sysemu.h" -#include "net.h" +#include "net/net.h" #include "boards.h" #include "firmware_abi.h" #include "esp.h" diff --git a/hw/sun4u.c b/hw/sun4u.c index 47bcf9382d..d9e752fe83 100644 --- a/hw/sun4u.c +++ b/hw/sun4u.c @@ -28,7 +28,7 @@ #include "serial.h" #include "nvram.h" #include "fdc.h" -#include "net.h" +#include "net/net.h" #include "qemu-timer.h" #include "sysemu.h" #include "boards.h" diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c index 0552e6f438..bf289ff5a6 100644 --- a/hw/usb/dev-network.c +++ b/hw/usb/dev-network.c @@ -26,7 +26,7 @@ #include "qemu-common.h" #include "hw/usb.h" #include "hw/usb/desc.h" -#include "net.h" +#include "net/net.h" #include "qemu-queue.h" #include "qemu-config.h" #include "sysemu.h" diff --git a/hw/versatilepb.c b/hw/versatilepb.c index f5a742b37f..af398d9cca 100644 --- a/hw/versatilepb.c +++ b/hw/versatilepb.c @@ -10,7 +10,7 @@ #include "sysbus.h" #include "arm-misc.h" #include "devices.h" -#include "net.h" +#include "net/net.h" #include "sysemu.h" #include "pci/pci.h" #include "i2c.h" diff --git a/hw/vexpress.c b/hw/vexpress.c index e89694c86e..5c9c08b991 100644 --- a/hw/vexpress.c +++ b/hw/vexpress.c @@ -25,7 +25,7 @@ #include "arm-misc.h" #include "primecell.h" #include "devices.h" -#include "net.h" +#include "net/net.h" #include "sysemu.h" #include "boards.h" #include "exec-memory.h" diff --git a/hw/vhost_net.c b/hw/vhost_net.c index 8241601539..93ad89a11c 100644 --- a/hw/vhost_net.c +++ b/hw/vhost_net.c @@ -13,7 +13,7 @@ * GNU GPL, version 2 or (at your option) any later version. */ -#include "net.h" +#include "net/net.h" #include "net/tap.h" #include "virtio-net.h" diff --git a/hw/vhost_net.h b/hw/vhost_net.h index a9db23423c..012aba4148 100644 --- a/hw/vhost_net.h +++ b/hw/vhost_net.h @@ -1,7 +1,7 @@ #ifndef VHOST_NET_H #define VHOST_NET_H -#include "net.h" +#include "net/net.h" struct vhost_net; typedef struct vhost_net VHostNetState; diff --git a/hw/virtio-net.c b/hw/virtio-net.c index 108ce07cfc..dc7c6d6b56 100644 --- a/hw/virtio-net.c +++ b/hw/virtio-net.c @@ -13,7 +13,7 @@ #include "iov.h" #include "virtio.h" -#include "net.h" +#include "net/net.h" #include "net/checksum.h" #include "net/tap.h" #include "qemu-error.h" diff --git a/hw/virtio-net.h b/hw/virtio-net.h index 2566ea13ec..d46fb9840f 100644 --- a/hw/virtio-net.h +++ b/hw/virtio-net.h @@ -73,33 +73,6 @@ struct virtio_net_config uint16_t status; } QEMU_PACKED; -/* This is the first element of the scatter-gather list. If you don't - * specify GSO or CSUM features, you can simply ignore the header. */ -struct virtio_net_hdr -{ -#define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 // Use csum_start, csum_offset -#define VIRTIO_NET_HDR_F_DATA_VALID 2 // Csum is valid - uint8_t flags; -#define VIRTIO_NET_HDR_GSO_NONE 0 // Not a GSO frame -#define VIRTIO_NET_HDR_GSO_TCPV4 1 // GSO frame, IPv4 TCP (TSO) -#define VIRTIO_NET_HDR_GSO_UDP 3 // GSO frame, IPv4 UDP (UFO) -#define VIRTIO_NET_HDR_GSO_TCPV6 4 // GSO frame, IPv6 TCP -#define VIRTIO_NET_HDR_GSO_ECN 0x80 // TCP has ECN set - uint8_t gso_type; - uint16_t hdr_len; - uint16_t gso_size; - uint16_t csum_start; - uint16_t csum_offset; -}; - -/* This is the version of the header to use when the MRG_RXBUF - * feature has been negotiated. */ -struct virtio_net_hdr_mrg_rxbuf -{ - struct virtio_net_hdr hdr; - uint16_t num_buffers; /* Number of merged rx buffers */ -}; - /* * Control virtqueue data structures * diff --git a/hw/virtio.h b/hw/virtio.h index 7c17f7ba0b..cdcb490733 100644 --- a/hw/virtio.h +++ b/hw/virtio.h @@ -15,7 +15,7 @@ #define _QEMU_VIRTIO_H #include "hw.h" -#include "net.h" +#include "net/net.h" #include "qdev.h" #include "sysemu.h" #include "event_notifier.h" diff --git a/hw/xen_backend.h b/hw/xen_backend.h index 3305630903..92ab501d37 100644 --- a/hw/xen_backend.h +++ b/hw/xen_backend.h @@ -3,7 +3,7 @@ #include "xen_common.h" #include "sysemu.h" -#include "net.h" +#include "net/net.h" /* ------------------------------------------------------------- */ diff --git a/hw/xen_nic.c b/hw/xen_nic.c index dadacb1fb5..dc12110dba 100644 --- a/hw/xen_nic.c +++ b/hw/xen_nic.c @@ -36,7 +36,7 @@ #include #include "hw.h" -#include "net.h" +#include "net/net.h" #include "net/checksum.h" #include "net/util.h" #include "xen_backend.h" diff --git a/hw/xgmac.c b/hw/xgmac.c index ec50c745d0..d0d510ed6a 100644 --- a/hw/xgmac.c +++ b/hw/xgmac.c @@ -27,7 +27,7 @@ #include "sysbus.h" #include "qemu-char.h" #include "qemu-log.h" -#include "net.h" +#include "net/net.h" #include "net/checksum.h" #ifdef DEBUG_XGMAC diff --git a/hw/xilinx.h b/hw/xilinx.h index 9323fd07c6..735f8e257d 100644 --- a/hw/xilinx.h +++ b/hw/xilinx.h @@ -1,6 +1,6 @@ #include "stream.h" #include "qemu-common.h" -#include "net.h" +#include "net/net.h" static inline DeviceState * xilinx_intc_create(hwaddr base, qemu_irq irq, int kind_of_intr) diff --git a/hw/xilinx_axienet.c b/hw/xilinx_axienet.c index c859fde09e..35979e65c9 100644 --- a/hw/xilinx_axienet.c +++ b/hw/xilinx_axienet.c @@ -24,7 +24,7 @@ #include "sysbus.h" #include "qemu-log.h" -#include "net.h" +#include "net/net.h" #include "net/checksum.h" #include "stream.h" diff --git a/hw/xilinx_ethlite.c b/hw/xilinx_ethlite.c index 13bd45613d..4de4a53a0b 100644 --- a/hw/xilinx_ethlite.c +++ b/hw/xilinx_ethlite.c @@ -24,7 +24,7 @@ #include "sysbus.h" #include "hw.h" -#include "net.h" +#include "net/net.h" #define D(x) #define R_TX_BUF0 0 diff --git a/hw/xilinx_zynq.c b/hw/xilinx_zynq.c index 9ca22a4e7d..67adc52725 100644 --- a/hw/xilinx_zynq.c +++ b/hw/xilinx_zynq.c @@ -17,7 +17,7 @@ #include "sysbus.h" #include "arm-misc.h" -#include "net.h" +#include "net/net.h" #include "exec-memory.h" #include "sysemu.h" #include "boards.h" diff --git a/hw/xtensa_lx60.c b/hw/xtensa_lx60.c index bc10d3161f..0399de777e 100644 --- a/hw/xtensa_lx60.c +++ b/hw/xtensa_lx60.c @@ -32,7 +32,7 @@ #include "memory.h" #include "exec-memory.h" #include "serial.h" -#include "net.h" +#include "net/net.h" #include "sysbus.h" #include "flash.h" #include "blockdev.h" diff --git a/net/checksum.h b/include/net/checksum.h similarity index 100% rename from net/checksum.h rename to include/net/checksum.h diff --git a/net.h b/include/net/net.h similarity index 98% rename from net.h rename to include/net/net.h index 1d0816bc0a..9ff9305d7a 100644 --- a/net.h +++ b/include/net/net.h @@ -147,6 +147,9 @@ void net_host_device_remove(Monitor *mon, const QDict *qdict); void netdev_add(QemuOpts *opts, Error **errp); int qmp_netdev_add(Monitor *mon, const QDict *qdict, QObject **ret); +int net_hub_id_for_client(NetClientState *nc, int *id); +NetClientState *net_hub_port_find(int hub_id); + #define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup" #define DEFAULT_NETWORK_DOWN_SCRIPT "/etc/qemu-ifdown" #define DEFAULT_BRIDGE_HELPER CONFIG_QEMU_HELPERDIR "/qemu-bridge-helper" diff --git a/net/queue.h b/include/net/queue.h similarity index 100% rename from net/queue.h rename to include/net/queue.h diff --git a/net/slirp.h b/include/net/slirp.h similarity index 100% rename from net/slirp.h rename to include/net/slirp.h diff --git a/include/net/tap.h b/include/net/tap.h new file mode 100644 index 0000000000..bb7efb5439 --- /dev/null +++ b/include/net/tap.h @@ -0,0 +1,67 @@ +/* + * QEMU System Emulator + * + * Copyright (c) 2003-2008 Fabrice Bellard + * Copyright (c) 2009 Red Hat, Inc. + * + * 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. + */ + +#ifndef QEMU_NET_TAP_H +#define QEMU_NET_TAP_H + +#include "qemu-common.h" +#include "qapi-types.h" + +int tap_has_ufo(NetClientState *nc); +int tap_has_vnet_hdr(NetClientState *nc); +int tap_has_vnet_hdr_len(NetClientState *nc, int len); +void tap_using_vnet_hdr(NetClientState *nc, int using_vnet_hdr); +void tap_set_offload(NetClientState *nc, int csum, int tso4, int tso6, int ecn, int ufo); +void tap_set_vnet_hdr_len(NetClientState *nc, int len); + +int tap_get_fd(NetClientState *nc); + +struct vhost_net; +struct vhost_net *tap_get_vhost_net(NetClientState *nc); + +struct virtio_net_hdr +{ +#define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 // Use csum_start, csum_offset +#define VIRTIO_NET_HDR_F_DATA_VALID 2 // Csum is valid + uint8_t flags; +#define VIRTIO_NET_HDR_GSO_NONE 0 // Not a GSO frame +#define VIRTIO_NET_HDR_GSO_TCPV4 1 // GSO frame, IPv4 TCP (TSO) +#define VIRTIO_NET_HDR_GSO_UDP 3 // GSO frame, IPv4 UDP (UFO) +#define VIRTIO_NET_HDR_GSO_TCPV6 4 // GSO frame, IPv6 TCP +#define VIRTIO_NET_HDR_GSO_ECN 0x80 // TCP has ECN set + uint8_t gso_type; + uint16_t hdr_len; + uint16_t gso_size; + uint16_t csum_start; + uint16_t csum_offset; +}; + +struct virtio_net_hdr_mrg_rxbuf +{ + struct virtio_net_hdr hdr; + uint16_t num_buffers; /* Number of merged rx buffers */ +}; + +#endif /* QEMU_NET_TAP_H */ diff --git a/monitor.c b/monitor.c index bd63768c27..37b9d20299 100644 --- a/monitor.c +++ b/monitor.c @@ -31,7 +31,7 @@ #include "hw/watchdog.h" #include "hw/loader.h" #include "gdbstub.h" -#include "net.h" +#include "net/net.h" #include "net/slirp.h" #include "qemu-char.h" #include "ui/qemu-spice.h" diff --git a/net/clients.h b/net/clients.h index c58cc6087c..77932942bd 100644 --- a/net/clients.h +++ b/net/clients.h @@ -24,7 +24,7 @@ #ifndef QEMU_NET_CLIENTS_H #define QEMU_NET_CLIENTS_H -#include "net.h" +#include "net/net.h" #include "qapi-types.h" int net_init_dump(const NetClientOptions *opts, const char *name, diff --git a/net/hub.c b/net/hub.c index be413012bb..8508ecf380 100644 --- a/net/hub.c +++ b/net/hub.c @@ -13,7 +13,7 @@ */ #include "monitor.h" -#include "net.h" +#include "net/net.h" #include "clients.h" #include "hub.h" #include "iov.h" diff --git a/net/hub.h b/net/hub.h index 4cbfdb128b..583ada89d8 100644 --- a/net/hub.h +++ b/net/hub.h @@ -20,8 +20,6 @@ NetClientState *net_hub_add_port(int hub_id, const char *name); NetClientState *net_hub_find_client_by_name(int hub_id, const char *name); void net_hub_info(Monitor *mon); -int net_hub_id_for_client(NetClientState *nc, int *id); void net_hub_check_clients(void); -NetClientState *net_hub_port_find(int hub_id); #endif /* NET_HUB_H */ diff --git a/net/net.c b/net/net.c index 7b1600f17c..a4395be140 100644 --- a/net/net.c +++ b/net/net.c @@ -23,10 +23,10 @@ */ #include "config-host.h" -#include "net.h" +#include "net/net.h" #include "clients.h" #include "hub.h" -#include "slirp.h" +#include "net/slirp.h" #include "util.h" #include "monitor.h" diff --git a/net/queue.c b/net/queue.c index 254f28013a..542c549b1a 100644 --- a/net/queue.c +++ b/net/queue.c @@ -23,7 +23,7 @@ #include "net/queue.h" #include "qemu-queue.h" -#include "net.h" +#include "net/net.h" /* The delivery handler may only return zero if it will call * qemu_net_queue_flush() when it determines that it is once again able diff --git a/net/slirp.c b/net/slirp.c index f117412bad..5a11ac5859 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -29,7 +29,7 @@ #include #include #endif -#include "net.h" +#include "net/net.h" #include "clients.h" #include "hub.h" #include "monitor.h" diff --git a/net/socket.c b/net/socket.c index cf309cd5b9..8430f1a161 100644 --- a/net/socket.c +++ b/net/socket.c @@ -23,7 +23,7 @@ */ #include "config-host.h" -#include "net.h" +#include "net/net.h" #include "clients.h" #include "monitor.h" #include "qemu-common.h" diff --git a/net/tap-aix.c b/net/tap-aix.c index f27c17729e..aff6c527e9 100644 --- a/net/tap-aix.c +++ b/net/tap-aix.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -#include "net/tap.h" +#include "tap_int.h" #include int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required) diff --git a/net/tap-bsd.c b/net/tap-bsd.c index a3b717dd1c..a1c55ad3de 100644 --- a/net/tap-bsd.c +++ b/net/tap-bsd.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -#include "net/tap.h" +#include "tap_int.h" #include "qemu-common.h" #include "sysemu.h" #include "qemu-error.h" diff --git a/net/tap-haiku.c b/net/tap-haiku.c index 34739d1562..08cc034cee 100644 --- a/net/tap-haiku.c +++ b/net/tap-haiku.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -#include "net/tap.h" +#include "tap_int.h" #include int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required) diff --git a/net/tap-linux.c b/net/tap-linux.c index 3eaedc40ad..3de7b3b6ce 100644 --- a/net/tap-linux.c +++ b/net/tap-linux.c @@ -23,8 +23,9 @@ * THE SOFTWARE. */ +#include "tap_int.h" +#include "tap-linux.h" #include "net/tap.h" -#include "net/tap-linux.h" #include #include diff --git a/net/tap-linux.h b/net/tap-linux.h index 659e98122b..cb2a6d480a 100644 --- a/net/tap-linux.h +++ b/net/tap-linux.h @@ -13,8 +13,8 @@ * GNU General Public License for more details. */ -#ifndef QEMU_TAP_H -#define QEMU_TAP_H +#ifndef QEMU_TAP_LINUX_H +#define QEMU_TAP_LINUX_H #include #ifdef __linux__ @@ -44,20 +44,4 @@ #define TUN_F_TSO_ECN 0x08 /* I can handle TSO with ECN bits. */ #define TUN_F_UFO 0x10 /* I can handle UFO packets */ -struct virtio_net_hdr -{ - uint8_t flags; - uint8_t gso_type; - uint16_t hdr_len; - uint16_t gso_size; - uint16_t csum_start; - uint16_t csum_offset; -}; - -struct virtio_net_hdr_mrg_rxbuf -{ - struct virtio_net_hdr hdr; - uint16_t num_buffers; /* Number of merged rx buffers */ -}; - #endif /* QEMU_TAP_H */ diff --git a/net/tap-solaris.c b/net/tap-solaris.c index 5d6ac42f24..f228fffb6d 100644 --- a/net/tap-solaris.c +++ b/net/tap-solaris.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -#include "net/tap.h" +#include "tap_int.h" #include "sysemu.h" #include diff --git a/net/tap-win32.c b/net/tap-win32.c index f9bd74109c..e37d8ee458 100644 --- a/net/tap-win32.c +++ b/net/tap-win32.c @@ -26,11 +26,11 @@ * distribution); if not, see . */ -#include "tap.h" +#include "tap_int.h" #include "qemu-common.h" #include "clients.h" /* net_init_tap */ -#include "net.h" +#include "net/net.h" #include "sysemu.h" #include "qemu-error.h" #include diff --git a/net/tap.c b/net/tap.c index 5ff78934dc..f8cabc4f86 100644 --- a/net/tap.c +++ b/net/tap.c @@ -23,7 +23,7 @@ * THE SOFTWARE. */ -#include "tap.h" +#include "tap_int.h" #include "config-host.h" @@ -33,14 +33,14 @@ #include #include -#include "net.h" +#include "net/net.h" #include "clients.h" #include "monitor.h" #include "sysemu.h" #include "qemu-common.h" #include "qemu-error.h" -#include "net/tap-linux.h" +#include "net/tap.h" #include "hw/vhost_net.h" diff --git a/net/tap.h b/net/tap_int.h similarity index 77% rename from net/tap.h rename to net/tap_int.h index d44d83ae73..1dffe12a45 100644 --- a/net/tap.h +++ b/net/tap_int.h @@ -23,8 +23,8 @@ * THE SOFTWARE. */ -#ifndef QEMU_NET_TAP_H -#define QEMU_NET_TAP_H +#ifndef QEMU_TAP_H +#define QEMU_TAP_H #include "qemu-common.h" #include "qapi-types.h" @@ -36,13 +36,6 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen); -int tap_has_ufo(NetClientState *nc); -int tap_has_vnet_hdr(NetClientState *nc); -int tap_has_vnet_hdr_len(NetClientState *nc, int len); -void tap_using_vnet_hdr(NetClientState *nc, int using_vnet_hdr); -void tap_set_offload(NetClientState *nc, int csum, int tso4, int tso6, int ecn, int ufo); -void tap_set_vnet_hdr_len(NetClientState *nc, int len); - int tap_set_sndbuf(int fd, const NetdevTapOptions *tap); int tap_probe_vnet_hdr(int fd); int tap_probe_vnet_hdr_len(int fd, int len); @@ -50,9 +43,4 @@ int tap_probe_has_ufo(int fd); void tap_fd_set_offload(int fd, int csum, int tso4, int tso6, int ecn, int ufo); void tap_fd_set_vnet_hdr_len(int fd, int len); -int tap_get_fd(NetClientState *nc); - -struct vhost_net; -struct vhost_net *tap_get_vhost_net(NetClientState *nc); - -#endif /* QEMU_NET_TAP_H */ +#endif /* QEMU_TAP_H */ diff --git a/net/util.c b/net/util.c index 1e9afbc1ae..7e9507679d 100644 --- a/net/util.c +++ b/net/util.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -#include "net/util.h" +#include "util.h" #include #include diff --git a/net/vde.c b/net/vde.c index cc5a07d65e..52d4f19fba 100644 --- a/net/vde.c +++ b/net/vde.c @@ -25,7 +25,7 @@ #include -#include "net.h" +#include "net/net.h" #include "clients.h" #include "qemu-common.h" #include "qemu-option.h" diff --git a/savevm.c b/savevm.c index f5886ce772..ae8787868f 100644 --- a/savevm.c +++ b/savevm.c @@ -72,7 +72,7 @@ #include "qemu-common.h" #include "hw/hw.h" #include "hw/qdev.h" -#include "net.h" +#include "net/net.h" #include "monitor.h" #include "sysemu.h" #include "qemu-timer.h" diff --git a/vl.c b/vl.c index 571a49b931..a7eeafc26e 100644 --- a/vl.c +++ b/vl.c @@ -127,7 +127,7 @@ int main(int argc, char **argv) #include "hw/qdev.h" #include "hw/loader.h" #include "bt-host.h" -#include "net.h" +#include "net/net.h" #include "net/slirp.h" #include "monitor.h" #include "console.h" From 2870dc3456c9c02debb63b0a99b3dcbbf74a1048 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 24 Oct 2012 11:26:49 +0200 Subject: [PATCH 243/300] qemu-ga: move qemu-ga files to qga/ Signed-off-by: Paolo Bonzini --- Makefile | 9 +++++---- Makefile.objs | 2 +- qga/Makefile.objs | 2 +- qemu-ga.c => qga/main.c | 0 qapi-schema-guest.json => qga/qapi-schema.json | 0 5 files changed, 7 insertions(+), 6 deletions(-) rename qemu-ga.c => qga/main.c (100%) rename qapi-schema-guest.json => qga/qapi-schema.json (100%) diff --git a/Makefile b/Makefile index 0c6ad1efe6..a0321dd7f0 100644 --- a/Makefile +++ b/Makefile @@ -200,13 +200,13 @@ endif qapi-py = $(SRC_PATH)/scripts/qapi.py $(SRC_PATH)/scripts/ordereddict.py qga/qapi-generated/qga-qapi-types.c qga/qapi-generated/qga-qapi-types.h :\ -$(SRC_PATH)/qapi-schema-guest.json $(SRC_PATH)/scripts/qapi-types.py $(qapi-py) +$(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-types.py $(qapi-py) $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py $(gen-out-type) -o qga/qapi-generated -p "qga-" < $<, " GEN $@") qga/qapi-generated/qga-qapi-visit.c qga/qapi-generated/qga-qapi-visit.h :\ -$(SRC_PATH)/qapi-schema-guest.json $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py) +$(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py) $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py $(gen-out-type) -o qga/qapi-generated -p "qga-" < $<, " GEN $@") qga/qapi-generated/qga-qmp-commands.h qga/qapi-generated/qga-qmp-marshal.c :\ -$(SRC_PATH)/qapi-schema-guest.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py) +$(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py) $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py $(gen-out-type) -o qga/qapi-generated -p "qga-" < $<, " GEN $@") qapi-types.c qapi-types.h :\ @@ -222,7 +222,8 @@ $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py) QGALIB_GEN=$(addprefix qga/qapi-generated/, qga-qapi-types.h qga-qapi-visit.h qga-qmp-commands.h) $(qga-obj-y) qemu-ga.o: $(QGALIB_GEN) -qemu-ga$(EXESUF): qemu-ga.o $(qga-obj-y) $(oslib-obj-y) $(trace-obj-y) $(qapi-obj-y) $(qobject-obj-y) $(version-obj-y) libqemustub.a +qemu-ga$(EXESUF): $(qga-obj-y) $(oslib-obj-y) $(trace-obj-y) $(qapi-obj-y) $(qobject-obj-y) $(version-obj-y) libqemustub.a + $(call LINK, $^) clean: # avoid old build problems by removing potentially incorrect old files diff --git a/Makefile.objs b/Makefile.objs index 83092dc74b..fe78836fcb 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -222,7 +222,7 @@ universal-obj-y += $(qapi-obj-y) ###################################################################### # guest agent -qga-obj-y = qga/ qemu-ga.o module.o qemu-tool.o +qga-obj-y = qga/ module.o qemu-tool.o qga-obj-$(CONFIG_POSIX) += qemu-sockets.o qemu-option.o vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS) diff --git a/qga/Makefile.objs b/qga/Makefile.objs index cd3e13516c..b8d7cd0a43 100644 --- a/qga/Makefile.objs +++ b/qga/Makefile.objs @@ -1,4 +1,4 @@ -qga-obj-y = commands.o guest-agent-command-state.o +qga-obj-y = commands.o guest-agent-command-state.o main.o qga-obj-$(CONFIG_POSIX) += commands-posix.o channel-posix.o qga-obj-$(CONFIG_WIN32) += commands-win32.o channel-win32.o service-win32.o qga-obj-y += qapi-generated/qga-qapi-types.o qapi-generated/qga-qapi-visit.o diff --git a/qemu-ga.c b/qga/main.c similarity index 100% rename from qemu-ga.c rename to qga/main.c diff --git a/qapi-schema-guest.json b/qga/qapi-schema.json similarity index 100% rename from qapi-schema-guest.json rename to qga/qapi-schema.json From 28ecbaeecb139a214f019207402a35d7b58aec0f Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 28 Nov 2012 12:06:30 +0100 Subject: [PATCH 244/300] ui: move files to ui/ and include/ui/ Signed-off-by: Paolo Bonzini --- Makefile.objs | 4 +--- hmp.c | 2 +- hw/adb.c | 2 +- hw/ads7846.c | 2 +- hw/applesmc.c | 2 +- hw/blizzard.c | 4 ++-- hw/bt-hid.c | 2 +- hw/cirrus_vga.c | 2 +- hw/escc.c | 2 +- hw/exynos4210_fimd.c | 4 ++-- hw/framebuffer.c | 2 +- hw/g364fb.c | 4 ++-- hw/hid.c | 2 +- hw/hpet.c | 2 +- hw/jazz_led.c | 4 ++-- hw/kvm/pci-assign.c | 2 +- hw/lm832x.c | 2 +- hw/milkymist-softusb.c | 2 +- hw/milkymist-vgafb.c | 4 ++-- hw/msmouse.c | 6 +++--- hw/musicpal.c | 5 ++--- hw/nseries.c | 2 +- hw/omap_dss.c | 2 +- hw/omap_lcdc.c | 5 ++--- hw/omap_sx1.c | 2 +- hw/palm.c | 2 +- hw/pl110.c | 5 ++--- hw/ps2.c | 2 +- hw/puv3.c | 2 +- hw/pxa2xx_keypad.c | 2 +- hw/pxa2xx_lcd.c | 4 ++-- hw/qxl.h | 2 +- hw/sm501.c | 5 ++--- hw/spitz.c | 2 +- hw/ssd0303.c | 2 +- hw/ssd0323.c | 2 +- hw/stellaris_input.c | 2 +- hw/tc6393xb.c | 4 ++-- hw/tcx.c | 4 ++-- hw/tsc2005.c | 2 +- hw/tsc210x.c | 2 +- hw/twl92230.c | 2 +- hw/usb/dev-hid.c | 2 +- hw/usb/dev-storage.c | 2 +- hw/usb/dev-wacom.c | 2 +- hw/usb/host-stub.c | 2 +- hw/vga-isa-mm.c | 4 ++-- hw/vga-isa.c | 4 ++-- hw/vga-pci.c | 4 ++-- hw/vga.c | 4 ++-- hw/vmmouse.c | 2 +- hw/vmware_vga.c | 2 +- hw/xenfb.c | 2 +- hw/z2.c | 2 +- console.h => include/ui/console.h | 2 +- {hw => include/ui}/pixel_ops.h | 0 qemu-pixman.h => include/ui/qemu-pixman.h | 0 {ui => include/ui}/qemu-spice.h | 0 {ui => include/ui}/spice-display.h | 2 +- monitor.c | 2 +- qemu-char.c | 2 +- qemu-timer.c | 2 +- target-unicore32/helper.c | 2 +- ui/Makefile.objs | 2 +- ui/cocoa.m | 2 +- console.c => ui/console.c | 2 +- ui/curses.c | 2 +- cursor.c => ui/cursor.c | 2 +- cursor_hidden.xpm => ui/cursor_hidden.xpm | 0 cursor_left_ptr.xpm => ui/cursor_left_ptr.xpm | 0 input.c => ui/input.c | 2 +- qemu-pixman.c => ui/qemu-pixman.c | 2 +- qemu-x509.h => ui/qemu-x509.h | 0 ui/sdl.c | 2 +- ui/spice-core.c | 4 ++-- ui/spice-display.c | 6 +++--- ui/spice-input.c | 4 ++-- vgafont.h => ui/vgafont.h | 0 ui/vnc.h | 2 +- vl.c | 2 +- 80 files changed, 95 insertions(+), 101 deletions(-) rename console.h => include/ui/console.h (99%) rename {hw => include/ui}/pixel_ops.h (100%) rename qemu-pixman.h => include/ui/qemu-pixman.h (100%) rename {ui => include/ui}/qemu-spice.h (100%) rename {ui => include/ui}/spice-display.h (99%) rename console.c => ui/console.c (99%) rename cursor.c => ui/cursor.c (99%) rename cursor_hidden.xpm => ui/cursor_hidden.xpm (100%) rename cursor_left_ptr.xpm => ui/cursor_left_ptr.xpm (100%) rename input.c => ui/input.c (99%) rename qemu-pixman.c => ui/qemu-pixman.c (98%) rename qemu-x509.h => ui/qemu-x509.h (100%) rename vgafont.h => ui/vgafont.h (100%) diff --git a/Makefile.objs b/Makefile.objs index fe78836fcb..a637a4a8f0 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -68,8 +68,7 @@ endif common-obj-y = $(block-obj-y) blockdev.o blockdev-nbd.o block/ common-obj-y += net/ common-obj-y += qom/ -common-obj-y += readline.o console.o cursor.o -common-obj-y += qemu-pixman.o +common-obj-y += readline.o common-obj-y += $(oslib-obj-y) common-obj-$(CONFIG_WIN32) += os-win32.o common-obj-$(CONFIG_POSIX) += os-posix.o @@ -78,7 +77,6 @@ common-obj-$(CONFIG_LINUX) += fsdev/ extra-obj-$(CONFIG_LINUX) += fsdev/ common-obj-y += tcg-runtime.o host-utils.o main-loop.o -common-obj-y += input.o common-obj-y += buffered_file.o migration.o migration-tcp.o common-obj-y += qemu-char.o #aio.o common-obj-y += block-migration.o iohandler.o diff --git a/hmp.c b/hmp.c index 9b31e9f8a7..f235134bb6 100644 --- a/hmp.c +++ b/hmp.c @@ -21,7 +21,7 @@ #include "qmp-commands.h" #include "qemu_socket.h" #include "monitor.h" -#include "console.h" +#include "ui/console.h" static void hmp_handle_error(Monitor *mon, Error **errp) { diff --git a/hw/adb.c b/hw/adb.c index 3b547f0af7..cc8ad8e057 100644 --- a/hw/adb.c +++ b/hw/adb.c @@ -23,7 +23,7 @@ */ #include "hw.h" #include "adb.h" -#include "console.h" +#include "ui/console.h" /* debug ADB */ //#define DEBUG_ADB diff --git a/hw/ads7846.c b/hw/ads7846.c index 2ea9e55bb5..fa137e628e 100644 --- a/hw/ads7846.c +++ b/hw/ads7846.c @@ -11,7 +11,7 @@ */ #include "ssi.h" -#include "console.h" +#include "ui/console.h" typedef struct { SSISlave ssidev; diff --git a/hw/applesmc.c b/hw/applesmc.c index 8bedaad310..91e7cb3d5c 100644 --- a/hw/applesmc.c +++ b/hw/applesmc.c @@ -32,7 +32,7 @@ #include "hw.h" #include "isa.h" -#include "console.h" +#include "ui/console.h" #include "qemu-timer.h" /* #define DEBUG_SMC */ diff --git a/hw/blizzard.c b/hw/blizzard.c index 1b57eb5396..24bde32e5a 100644 --- a/hw/blizzard.c +++ b/hw/blizzard.c @@ -19,10 +19,10 @@ */ #include "qemu-common.h" -#include "console.h" +#include "ui/console.h" #include "devices.h" #include "vga_int.h" -#include "pixel_ops.h" +#include "ui/pixel_ops.h" typedef void (*blizzard_fn_t)(uint8_t *, const uint8_t *, unsigned int); diff --git a/hw/bt-hid.c b/hw/bt-hid.c index 8d7a3dae21..0ec0c013b0 100644 --- a/hw/bt-hid.c +++ b/hw/bt-hid.c @@ -20,7 +20,7 @@ #include "qemu-common.h" #include "qemu-timer.h" -#include "console.h" +#include "ui/console.h" #include "hid.h" #include "bt.h" diff --git a/hw/cirrus_vga.c b/hw/cirrus_vga.c index 7d021f2e1d..80510bc9af 100644 --- a/hw/cirrus_vga.c +++ b/hw/cirrus_vga.c @@ -28,7 +28,7 @@ */ #include "hw.h" #include "pci/pci.h" -#include "console.h" +#include "ui/console.h" #include "vga_int.h" #include "loader.h" diff --git a/hw/escc.c b/hw/escc.c index a356613b06..38e8164e44 100644 --- a/hw/escc.c +++ b/hw/escc.c @@ -26,7 +26,7 @@ #include "sysbus.h" #include "escc.h" #include "qemu-char.h" -#include "console.h" +#include "ui/console.h" #include "trace.h" /* diff --git a/hw/exynos4210_fimd.c b/hw/exynos4210_fimd.c index f2443ca4af..3ef0847271 100644 --- a/hw/exynos4210_fimd.c +++ b/hw/exynos4210_fimd.c @@ -25,8 +25,8 @@ #include "qemu-common.h" #include "cpu-all.h" #include "sysbus.h" -#include "console.h" -#include "pixel_ops.h" +#include "ui/console.h" +#include "ui/pixel_ops.h" #include "bswap.h" /* Debug messages configuration */ diff --git a/hw/framebuffer.c b/hw/framebuffer.c index fa0f7863c4..2a870961bc 100644 --- a/hw/framebuffer.c +++ b/hw/framebuffer.c @@ -18,7 +18,7 @@ */ #include "hw.h" -#include "console.h" +#include "ui/console.h" #include "framebuffer.h" /* Render an image from a shared memory framebuffer. */ diff --git a/hw/g364fb.c b/hw/g364fb.c index 8192baf1c8..b46a044607 100644 --- a/hw/g364fb.c +++ b/hw/g364fb.c @@ -18,8 +18,8 @@ */ #include "hw.h" -#include "console.h" -#include "pixel_ops.h" +#include "ui/console.h" +#include "ui/pixel_ops.h" #include "trace.h" #include "sysbus.h" diff --git a/hw/hid.c b/hw/hid.c index 03761ab8b8..7935998e83 100644 --- a/hw/hid.c +++ b/hw/hid.c @@ -23,7 +23,7 @@ * THE SOFTWARE. */ #include "hw.h" -#include "console.h" +#include "ui/console.h" #include "qemu-timer.h" #include "hid.h" diff --git a/hw/hpet.c b/hw/hpet.c index 50ac067ece..49e1b631b5 100644 --- a/hw/hpet.c +++ b/hw/hpet.c @@ -26,7 +26,7 @@ #include "hw.h" #include "pc.h" -#include "console.h" +#include "ui/console.h" #include "qemu-timer.h" #include "hpet_emul.h" #include "sysbus.h" diff --git a/hw/jazz_led.c b/hw/jazz_led.c index 09c77429e8..f4a040631e 100644 --- a/hw/jazz_led.c +++ b/hw/jazz_led.c @@ -23,8 +23,8 @@ */ #include "qemu-common.h" -#include "console.h" -#include "pixel_ops.h" +#include "ui/console.h" +#include "ui/pixel_ops.h" #include "trace.h" #include "sysbus.h" diff --git a/hw/kvm/pci-assign.c b/hw/kvm/pci-assign.c index 42291592e3..2629775589 100644 --- a/hw/kvm/pci-assign.c +++ b/hw/kvm/pci-assign.c @@ -29,7 +29,7 @@ #include "hw/hw.h" #include "hw/pc.h" #include "qemu-error.h" -#include "console.h" +#include "ui/console.h" #include "hw/loader.h" #include "monitor.h" #include "range.h" diff --git a/hw/lm832x.c b/hw/lm832x.c index 8e09f9bcc9..b14a089b32 100644 --- a/hw/lm832x.c +++ b/hw/lm832x.c @@ -21,7 +21,7 @@ #include "hw.h" #include "i2c.h" #include "qemu-timer.h" -#include "console.h" +#include "ui/console.h" typedef struct { I2CSlave i2c; diff --git a/hw/milkymist-softusb.c b/hw/milkymist-softusb.c index b162b88db7..0743668d18 100644 --- a/hw/milkymist-softusb.c +++ b/hw/milkymist-softusb.c @@ -24,7 +24,7 @@ #include "hw.h" #include "sysbus.h" #include "trace.h" -#include "console.h" +#include "ui/console.h" #include "hid.h" #include "qemu-error.h" diff --git a/hw/milkymist-vgafb.c b/hw/milkymist-vgafb.c index 833881cc6a..c3471315d3 100644 --- a/hw/milkymist-vgafb.c +++ b/hw/milkymist-vgafb.c @@ -25,9 +25,9 @@ #include "hw.h" #include "sysbus.h" #include "trace.h" -#include "console.h" +#include "ui/console.h" #include "framebuffer.h" -#include "pixel_ops.h" +#include "ui/pixel_ops.h" #include "qemu-error.h" #define BITS 8 diff --git a/hw/msmouse.c b/hw/msmouse.c index 9c492a4637..decb1a3b5d 100644 --- a/hw/msmouse.c +++ b/hw/msmouse.c @@ -22,9 +22,9 @@ * THE SOFTWARE. */ #include -#include "../qemu-common.h" -#include "../qemu-char.h" -#include "../console.h" +#include "qemu-common.h" +#include "qemu-char.h" +#include "ui/console.h" #include "msmouse.h" #define MSMOUSE_LO6(n) ((n) & 0x3f) diff --git a/hw/musicpal.c b/hw/musicpal.c index 4e8399ab63..d16cd141a2 100644 --- a/hw/musicpal.c +++ b/hw/musicpal.c @@ -20,10 +20,11 @@ #include "ptimer.h" #include "block.h" #include "flash.h" -#include "console.h" +#include "ui/console.h" #include "i2c.h" #include "blockdev.h" #include "exec-memory.h" +#include "ui/pixel_ops.h" #define MP_MISC_BASE 0x80002000 #define MP_MISC_SIZE 0x00001000 @@ -492,8 +493,6 @@ SET_LCD_PIXEL(8, uint8_t) SET_LCD_PIXEL(16, uint16_t) SET_LCD_PIXEL(32, uint32_t) -#include "pixel_ops.h" - static void lcd_refresh(void *opaque) { musicpal_lcd_state *s = opaque; diff --git a/hw/nseries.c b/hw/nseries.c index 2de8d21f08..dcd3dc97d0 100644 --- a/hw/nseries.c +++ b/hw/nseries.c @@ -23,7 +23,7 @@ #include "omap.h" #include "arm-misc.h" #include "irq.h" -#include "console.h" +#include "ui/console.h" #include "boards.h" #include "i2c.h" #include "devices.h" diff --git a/hw/omap_dss.c b/hw/omap_dss.c index 1e83726d3b..ae51bdfe41 100644 --- a/hw/omap_dss.c +++ b/hw/omap_dss.c @@ -18,7 +18,7 @@ * with this program; if not, see . */ #include "hw.h" -#include "console.h" +#include "ui/console.h" #include "omap.h" struct omap_dss_s { diff --git a/hw/omap_lcdc.c b/hw/omap_lcdc.c index d7ae3032be..936850a621 100644 --- a/hw/omap_lcdc.c +++ b/hw/omap_lcdc.c @@ -17,9 +17,10 @@ * with this program; if not, see . */ #include "hw.h" -#include "console.h" +#include "ui/console.h" #include "omap.h" #include "framebuffer.h" +#include "ui/pixel_ops.h" struct omap_lcd_panel_s { MemoryRegion *sysmem; @@ -66,8 +67,6 @@ static void omap_lcd_interrupts(struct omap_lcd_panel_s *s) qemu_irq_lower(s->irq); } -#include "pixel_ops.h" - #define draw_line_func drawfn #define DEPTH 8 diff --git a/hw/omap_sx1.c b/hw/omap_sx1.c index 21a5bbb006..918a6f6a04 100644 --- a/hw/omap_sx1.c +++ b/hw/omap_sx1.c @@ -26,7 +26,7 @@ * with this program; if not, see . */ #include "hw.h" -#include "console.h" +#include "ui/console.h" #include "omap.h" #include "boards.h" #include "arm-misc.h" diff --git a/hw/palm.c b/hw/palm.c index 6f6f414e6e..5aaeb07460 100644 --- a/hw/palm.c +++ b/hw/palm.c @@ -19,7 +19,7 @@ #include "hw.h" #include "audio/audio.h" #include "sysemu.h" -#include "console.h" +#include "ui/console.h" #include "omap.h" #include "boards.h" #include "arm-misc.h" diff --git a/hw/pl110.c b/hw/pl110.c index f869ba60d7..098e335aea 100644 --- a/hw/pl110.c +++ b/hw/pl110.c @@ -8,8 +8,9 @@ */ #include "sysbus.h" -#include "console.h" +#include "ui/console.h" #include "framebuffer.h" +#include "ui/pixel_ops.h" #define PL110_CR_EN 0x001 #define PL110_CR_BGR 0x100 @@ -109,8 +110,6 @@ static const unsigned char *idregs[] = { pl111_id }; -#include "pixel_ops.h" - #define BITS 8 #include "pl110_template.h" #define BITS 15 diff --git a/hw/ps2.c b/hw/ps2.c index f93cd24d94..ba80089aba 100644 --- a/hw/ps2.c +++ b/hw/ps2.c @@ -23,7 +23,7 @@ */ #include "hw.h" #include "ps2.h" -#include "console.h" +#include "ui/console.h" #include "sysemu.h" /* debug PC keyboard */ diff --git a/hw/puv3.c b/hw/puv3.c index 6f89c44e32..9f8e294ad5 100644 --- a/hw/puv3.c +++ b/hw/puv3.c @@ -10,7 +10,7 @@ */ #include "qemu-common.h" -#include "console.h" +#include "ui/console.h" #include "elf.h" #include "exec-memory.h" #include "sysbus.h" diff --git a/hw/pxa2xx_keypad.c b/hw/pxa2xx_keypad.c index 257984c427..4ff04ad63b 100644 --- a/hw/pxa2xx_keypad.c +++ b/hw/pxa2xx_keypad.c @@ -13,7 +13,7 @@ #include "hw.h" #include "pxa.h" -#include "console.h" +#include "ui/console.h" /* * Keypad diff --git a/hw/pxa2xx_lcd.c b/hw/pxa2xx_lcd.c index b53dfaf3cf..b5efd4d426 100644 --- a/hw/pxa2xx_lcd.c +++ b/hw/pxa2xx_lcd.c @@ -11,9 +11,9 @@ */ #include "hw.h" -#include "console.h" +#include "ui/console.h" #include "pxa.h" -#include "pixel_ops.h" +#include "ui/pixel_ops.h" /* FIXME: For graphic_rotate. Should probably be done in common code. */ #include "sysemu.h" #include "framebuffer.h" diff --git a/hw/qxl.h b/hw/qxl.h index 41246c7554..8433d1aeea 100644 --- a/hw/qxl.h +++ b/hw/qxl.h @@ -1,6 +1,6 @@ #include "qemu-common.h" -#include "console.h" +#include "ui/console.h" #include "hw.h" #include "pci/pci.h" #include "vga_int.h" diff --git a/hw/sm501.c b/hw/sm501.c index 50324cda53..714aca0492 100644 --- a/hw/sm501.c +++ b/hw/sm501.c @@ -25,11 +25,12 @@ #include #include "hw.h" #include "serial.h" -#include "console.h" +#include "ui/console.h" #include "devices.h" #include "sysbus.h" #include "qdev-addr.h" #include "range.h" +#include "ui/pixel_ops.h" /* * Status: 2010/05/07 @@ -1163,8 +1164,6 @@ static const MemoryRegionOps sm501_2d_engine_ops = { /* draw line functions for all console modes */ -#include "pixel_ops.h" - typedef void draw_line_func(uint8_t *d, const uint8_t *s, int width, const uint32_t *pal); diff --git a/hw/spitz.c b/hw/spitz.c index 12e2815221..d4575d20bf 100644 --- a/hw/spitz.c +++ b/hw/spitz.c @@ -21,7 +21,7 @@ #include "qemu-timer.h" #include "devices.h" #include "sharpsl.h" -#include "console.h" +#include "ui/console.h" #include "block.h" #include "audio/audio.h" #include "boards.h" diff --git a/hw/ssd0303.c b/hw/ssd0303.c index d7fd828c65..cbdf49af57 100644 --- a/hw/ssd0303.c +++ b/hw/ssd0303.c @@ -11,7 +11,7 @@ implement one. Most of the commends relating to brightness and geometry setup are ignored. */ #include "i2c.h" -#include "console.h" +#include "ui/console.h" //#define DEBUG_SSD0303 1 diff --git a/hw/ssd0323.c b/hw/ssd0323.c index 4098830c2b..fe6f801ae7 100644 --- a/hw/ssd0323.c +++ b/hw/ssd0323.c @@ -11,7 +11,7 @@ implement one. Most of the commends relating to brightness and geometry setup are ignored. */ #include "ssi.h" -#include "console.h" +#include "ui/console.h" //#define DEBUG_SSD0323 1 diff --git a/hw/stellaris_input.c b/hw/stellaris_input.c index 68c600c04c..7a95c3fc88 100644 --- a/hw/stellaris_input.c +++ b/hw/stellaris_input.c @@ -8,7 +8,7 @@ */ #include "hw.h" #include "devices.h" -#include "console.h" +#include "ui/console.h" typedef struct { qemu_irq irq; diff --git a/hw/tc6393xb.c b/hw/tc6393xb.c index f0320271d4..edf76817b5 100644 --- a/hw/tc6393xb.c +++ b/hw/tc6393xb.c @@ -13,8 +13,8 @@ #include "hw.h" #include "devices.h" #include "flash.h" -#include "console.h" -#include "pixel_ops.h" +#include "ui/console.h" +#include "ui/pixel_ops.h" #include "blockdev.h" #define IRQ_TC6393_NAND 0 diff --git a/hw/tcx.c b/hw/tcx.c index a66fbeefdb..185588b49c 100644 --- a/hw/tcx.c +++ b/hw/tcx.c @@ -23,8 +23,8 @@ */ #include "qemu-common.h" -#include "console.h" -#include "pixel_ops.h" +#include "ui/console.h" +#include "ui/pixel_ops.h" #include "sysbus.h" #include "qdev-addr.h" diff --git a/hw/tsc2005.c b/hw/tsc2005.c index 9a500ebb3d..e2326283c0 100644 --- a/hw/tsc2005.c +++ b/hw/tsc2005.c @@ -20,7 +20,7 @@ #include "hw.h" #include "qemu-timer.h" -#include "console.h" +#include "ui/console.h" #include "devices.h" #define TSC_CUT_RESOLUTION(value, p) ((value) >> (16 - (p ? 12 : 10))) diff --git a/hw/tsc210x.c b/hw/tsc210x.c index 3c448a6f0f..2b3535d4fc 100644 --- a/hw/tsc210x.c +++ b/hw/tsc210x.c @@ -22,7 +22,7 @@ #include "hw.h" #include "audio/audio.h" #include "qemu-timer.h" -#include "console.h" +#include "ui/console.h" #include "omap.h" /* For I2SCodec and uWireSlave */ #include "devices.h" diff --git a/hw/twl92230.c b/hw/twl92230.c index 0d70d8498d..ce699bdbdd 100644 --- a/hw/twl92230.c +++ b/hw/twl92230.c @@ -23,7 +23,7 @@ #include "qemu-timer.h" #include "i2c.h" #include "sysemu.h" -#include "console.h" +#include "ui/console.h" #define VERBOSE 1 diff --git a/hw/usb/dev-hid.c b/hw/usb/dev-hid.c index 87491284a8..6953f2e710 100644 --- a/hw/usb/dev-hid.c +++ b/hw/usb/dev-hid.c @@ -23,7 +23,7 @@ * THE SOFTWARE. */ #include "hw/hw.h" -#include "console.h" +#include "ui/console.h" #include "hw/usb.h" #include "hw/usb/desc.h" #include "qemu-timer.h" diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 50af97109b..de56fea610 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -13,7 +13,7 @@ #include "hw/usb.h" #include "hw/usb/desc.h" #include "hw/scsi.h" -#include "console.h" +#include "ui/console.h" #include "monitor.h" #include "sysemu.h" #include "blockdev.h" diff --git a/hw/usb/dev-wacom.c b/hw/usb/dev-wacom.c index f7342b08c3..9ab368a6c5 100644 --- a/hw/usb/dev-wacom.c +++ b/hw/usb/dev-wacom.c @@ -26,7 +26,7 @@ * THE SOFTWARE. */ #include "hw/hw.h" -#include "console.h" +#include "ui/console.h" #include "hw/usb.h" #include "hw/usb/desc.h" diff --git a/hw/usb/host-stub.c b/hw/usb/host-stub.c index b4e10c12ca..e8da3221f6 100644 --- a/hw/usb/host-stub.c +++ b/hw/usb/host-stub.c @@ -31,7 +31,7 @@ */ #include "qemu-common.h" -#include "console.h" +#include "ui/console.h" #include "hw/usb.h" #include "monitor.h" diff --git a/hw/vga-isa-mm.c b/hw/vga-isa-mm.c index 8ef4320d05..008703ff57 100644 --- a/hw/vga-isa-mm.c +++ b/hw/vga-isa-mm.c @@ -22,10 +22,10 @@ * THE SOFTWARE. */ #include "hw.h" -#include "console.h" +#include "ui/console.h" #include "pc.h" #include "vga_int.h" -#include "pixel_ops.h" +#include "ui/pixel_ops.h" #include "qemu-timer.h" #define VGA_RAM_SIZE (8192 * 1024) diff --git a/hw/vga-isa.c b/hw/vga-isa.c index 046602b3d2..d1d5b11828 100644 --- a/hw/vga-isa.c +++ b/hw/vga-isa.c @@ -24,10 +24,10 @@ * THE SOFTWARE. */ #include "hw.h" -#include "console.h" +#include "ui/console.h" #include "pc.h" #include "vga_int.h" -#include "pixel_ops.h" +#include "ui/pixel_ops.h" #include "qemu-timer.h" #include "loader.h" diff --git a/hw/vga-pci.c b/hw/vga-pci.c index 0cb318eab6..fe3a3d4899 100644 --- a/hw/vga-pci.c +++ b/hw/vga-pci.c @@ -24,10 +24,10 @@ * THE SOFTWARE. */ #include "hw.h" -#include "console.h" +#include "ui/console.h" #include "pci/pci.h" #include "vga_int.h" -#include "pixel_ops.h" +#include "ui/pixel_ops.h" #include "qemu-timer.h" #include "loader.h" diff --git a/hw/vga.c b/hw/vga.c index ab40d73100..4007116859 100644 --- a/hw/vga.c +++ b/hw/vga.c @@ -23,11 +23,11 @@ */ #include "hw.h" #include "vga.h" -#include "console.h" +#include "ui/console.h" #include "pc.h" #include "pci/pci.h" #include "vga_int.h" -#include "pixel_ops.h" +#include "ui/pixel_ops.h" #include "qemu-timer.h" #include "xen.h" #include "trace.h" diff --git a/hw/vmmouse.c b/hw/vmmouse.c index 6338efa1c3..d052f33f56 100644 --- a/hw/vmmouse.c +++ b/hw/vmmouse.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "hw.h" -#include "console.h" +#include "ui/console.h" #include "ps2.h" #include "pc.h" #include "qdev.h" diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c index 333ec8cebe..b0e772f863 100644 --- a/hw/vmware_vga.c +++ b/hw/vmware_vga.c @@ -23,7 +23,7 @@ */ #include "hw.h" #include "loader.h" -#include "console.h" +#include "ui/console.h" #include "pci/pci.h" #undef VERBOSE diff --git a/hw/xenfb.c b/hw/xenfb.c index 442a63a320..b1122bd933 100644 --- a/hw/xenfb.c +++ b/hw/xenfb.c @@ -36,7 +36,7 @@ #include #include "hw.h" -#include "console.h" +#include "ui/console.h" #include "qemu-char.h" #include "xen_backend.h" diff --git a/hw/z2.c b/hw/z2.c index f62b8067bf..d46186430f 100644 --- a/hw/z2.c +++ b/hw/z2.c @@ -21,7 +21,7 @@ #include "sysemu.h" #include "flash.h" #include "blockdev.h" -#include "console.h" +#include "ui/console.h" #include "audio/audio.h" #include "exec-memory.h" diff --git a/console.h b/include/ui/console.h similarity index 99% rename from console.h rename to include/ui/console.h index 33354e437a..777881d4a3 100644 --- a/console.h +++ b/include/ui/console.h @@ -1,7 +1,7 @@ #ifndef CONSOLE_H #define CONSOLE_H -#include "qemu-pixman.h" +#include "ui/qemu-pixman.h" #include "qdict.h" #include "notify.h" #include "monitor.h" diff --git a/hw/pixel_ops.h b/include/ui/pixel_ops.h similarity index 100% rename from hw/pixel_ops.h rename to include/ui/pixel_ops.h diff --git a/qemu-pixman.h b/include/ui/qemu-pixman.h similarity index 100% rename from qemu-pixman.h rename to include/ui/qemu-pixman.h diff --git a/ui/qemu-spice.h b/include/ui/qemu-spice.h similarity index 100% rename from ui/qemu-spice.h rename to include/ui/qemu-spice.h diff --git a/ui/spice-display.h b/include/ui/spice-display.h similarity index 99% rename from ui/spice-display.h rename to include/ui/spice-display.h index 38b6ea98b3..928e0a1bae 100644 --- a/ui/spice-display.h +++ b/include/ui/spice-display.h @@ -20,7 +20,7 @@ #include #include "qemu-thread.h" -#include "qemu-pixman.h" +#include "ui/qemu-pixman.h" #include "sysemu.h" #define NUM_MEMSLOTS 8 diff --git a/monitor.c b/monitor.c index 37b9d20299..6546f8c30b 100644 --- a/monitor.c +++ b/monitor.c @@ -38,7 +38,7 @@ #include "sysemu.h" #include "monitor.h" #include "readline.h" -#include "console.h" +#include "ui/console.h" #include "blockdev.h" #include "audio/audio.h" #include "disas/disas.h" diff --git a/qemu-char.c b/qemu-char.c index f066ad0654..bc53d09a9b 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" #include "monitor.h" -#include "console.h" +#include "ui/console.h" #include "sysemu.h" #include "qemu-timer.h" #include "qemu-char.h" diff --git a/qemu-timer.c b/qemu-timer.c index 9b9585b259..5a99403fda 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -24,7 +24,7 @@ #include "sysemu.h" #include "monitor.h" -#include "console.h" +#include "ui/console.h" #include "hw/hw.h" diff --git a/target-unicore32/helper.c b/target-unicore32/helper.c index a9e226bde4..4b6856137d 100644 --- a/target-unicore32/helper.c +++ b/target-unicore32/helper.c @@ -13,7 +13,7 @@ #include "gdbstub.h" #include "helper.h" #include "host-utils.h" -#include "console.h" +#include "ui/console.h" #undef DEBUG_UC32 diff --git a/ui/Makefile.objs b/ui/Makefile.objs index fd339d247b..dc8f0e46ad 100644 --- a/ui/Makefile.objs +++ b/ui/Makefile.objs @@ -6,7 +6,7 @@ vnc-obj-$(CONFIG_VNC_TLS) += vnc-tls.o vnc-auth-vencrypt.o vnc-obj-$(CONFIG_VNC_SASL) += vnc-auth-sasl.o vnc-obj-y += vnc-jobs.o -common-obj-y += keymaps.o +common-obj-y += keymaps.o console.o cursor.o input.o qemu-pixman.o common-obj-$(CONFIG_SPICE) += spice-core.o spice-input.o spice-display.o common-obj-$(CONFIG_SDL) += sdl.o sdl_zoom.o x_keymap.o common-obj-$(CONFIG_COCOA) += cocoa.o diff --git a/ui/cocoa.m b/ui/cocoa.m index 87d2e44c69..0afa6f86dd 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -26,7 +26,7 @@ #include #include "qemu-common.h" -#include "console.h" +#include "ui/console.h" #include "sysemu.h" #ifndef MAC_OS_X_VERSION_10_4 diff --git a/console.c b/ui/console.c similarity index 99% rename from console.c rename to ui/console.c index 9ac7b28742..60bfb72ac2 100644 --- a/console.c +++ b/ui/console.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "console.h" +#include "ui/console.h" #include "qemu-timer.h" #include "qmp-commands.h" #include "qemu-char.h" diff --git a/ui/curses.c b/ui/curses.c index 5dc0b2c95f..5d15e9e16e 100644 --- a/ui/curses.c +++ b/ui/curses.c @@ -29,7 +29,7 @@ #endif #include "qemu-common.h" -#include "console.h" +#include "ui/console.h" #include "sysemu.h" #define FONT_HEIGHT 16 diff --git a/cursor.c b/ui/cursor.c similarity index 99% rename from cursor.c rename to ui/cursor.c index 76e262caf7..2b8dd3fa50 100644 --- a/cursor.c +++ b/ui/cursor.c @@ -1,5 +1,5 @@ #include "qemu-common.h" -#include "console.h" +#include "ui/console.h" #include "cursor_hidden.xpm" #include "cursor_left_ptr.xpm" diff --git a/cursor_hidden.xpm b/ui/cursor_hidden.xpm similarity index 100% rename from cursor_hidden.xpm rename to ui/cursor_hidden.xpm diff --git a/cursor_left_ptr.xpm b/ui/cursor_left_ptr.xpm similarity index 100% rename from cursor_left_ptr.xpm rename to ui/cursor_left_ptr.xpm diff --git a/input.c b/ui/input.c similarity index 99% rename from input.c rename to ui/input.c index 123bb237d4..58d3b4709c 100644 --- a/input.c +++ b/ui/input.c @@ -24,7 +24,7 @@ #include "sysemu.h" #include "monitor.h" -#include "console.h" +#include "ui/console.h" #include "error.h" #include "qmp-commands.h" #include "qapi-types.h" diff --git a/qemu-pixman.c b/ui/qemu-pixman.c similarity index 98% rename from qemu-pixman.c rename to ui/qemu-pixman.c index e7263fb2bf..609335ab11 100644 --- a/qemu-pixman.c +++ b/ui/qemu-pixman.c @@ -3,7 +3,7 @@ * See the COPYING file in the top-level directory. */ -#include "qemu-pixman.h" +#include "ui/qemu-pixman.h" int qemu_pixman_get_type(int rshift, int gshift, int bshift) { diff --git a/qemu-x509.h b/ui/qemu-x509.h similarity index 100% rename from qemu-x509.h rename to ui/qemu-x509.h diff --git a/ui/sdl.c b/ui/sdl.c index 37f01b217d..bcbf89daeb 100644 --- a/ui/sdl.c +++ b/ui/sdl.c @@ -29,7 +29,7 @@ #include #include "qemu-common.h" -#include "console.h" +#include "ui/console.h" #include "sysemu.h" #include "x_keymap.h" #include "sdl_zoom.h" diff --git a/ui/spice-core.c b/ui/spice-core.c index 261c6f2c11..ec925ecbb0 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -22,7 +22,7 @@ #include "sysemu.h" #include "qemu-common.h" -#include "qemu-spice.h" +#include "ui/qemu-spice.h" #include "qemu-thread.h" #include "qemu-timer.h" #include "qemu-queue.h" @@ -37,7 +37,7 @@ #include "migration.h" #include "monitor.h" #include "hw/hw.h" -#include "spice-display.h" +#include "ui/spice-display.h" /* core bits */ diff --git a/ui/spice-display.c b/ui/spice-display.c index 6aff3368ca..681fe32fed 100644 --- a/ui/spice-display.c +++ b/ui/spice-display.c @@ -16,15 +16,15 @@ */ #include "qemu-common.h" -#include "qemu-spice.h" +#include "ui/qemu-spice.h" #include "qemu-timer.h" #include "qemu-queue.h" #include "monitor.h" -#include "console.h" +#include "ui/console.h" #include "sysemu.h" #include "trace.h" -#include "spice-display.h" +#include "ui/spice-display.h" static int debug = 0; diff --git a/ui/spice-input.c b/ui/spice-input.c index af4223d442..3beb8deadb 100644 --- a/ui/spice-input.c +++ b/ui/spice-input.c @@ -24,8 +24,8 @@ #include #include "qemu-common.h" -#include "qemu-spice.h" -#include "console.h" +#include "ui/qemu-spice.h" +#include "ui/console.h" /* keyboard bits */ diff --git a/vgafont.h b/ui/vgafont.h similarity index 100% rename from vgafont.h rename to ui/vgafont.h diff --git a/ui/vnc.h b/ui/vnc.h index 6141e88b4e..7ec183372a 100644 --- a/ui/vnc.h +++ b/ui/vnc.h @@ -30,7 +30,7 @@ #include "qemu-common.h" #include "qemu-queue.h" #include "qemu-thread.h" -#include "console.h" +#include "ui/console.h" #include "monitor.h" #include "audio/audio.h" #include "bitmap.h" diff --git a/vl.c b/vl.c index a7eeafc26e..6713220905 100644 --- a/vl.c +++ b/vl.c @@ -130,7 +130,7 @@ int main(int argc, char **argv) #include "net/net.h" #include "net/slirp.h" #include "monitor.h" -#include "console.h" +#include "ui/console.h" #include "sysemu.h" #include "gdbstub.h" #include "qemu-timer.h" From 79ee7df8853c5d7085d87036420b6b388dda2595 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Thu, 6 Dec 2012 11:22:34 +0100 Subject: [PATCH 245/300] qapi: move inclusions of qemu-common.h from headers to .c files Signed-off-by: Paolo Bonzini --- qapi/opts-visitor.c | 1 + qapi/qapi-types-core.h | 1 - qapi/qapi-visit-core.c | 1 + qemu-error.h | 2 ++ scripts/qapi-commands.py | 1 + scripts/qapi-visit.py | 1 + tests/test-qmp-commands.c | 1 + tests/test-qmp-input-strict.c | 1 + tests/test-qmp-input-visitor.c | 1 + tests/test-qmp-output-visitor.c | 1 + tests/test-string-input-visitor.c | 1 + tests/test-string-output-visitor.c | 1 + tests/test-visitor-serialization.c | 2 ++ 13 files changed, 14 insertions(+), 1 deletion(-) diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c index e048b6c863..e3fd25446d 100644 --- a/qapi/opts-visitor.c +++ b/qapi/opts-visitor.c @@ -10,6 +10,7 @@ * */ +#include "qemu-common.h" #include "opts-visitor.h" #include "qemu-queue.h" #include "qemu-option-internal.h" diff --git a/qapi/qapi-types-core.h b/qapi/qapi-types-core.h index f781fc3ab7..831df21ea7 100644 --- a/qapi/qapi-types-core.h +++ b/qapi/qapi-types-core.h @@ -14,7 +14,6 @@ #ifndef QAPI_TYPES_CORE_H #define QAPI_TYPES_CORE_H -#include "qemu-common.h" #include "error.h" #include "qerror.h" diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c index 7a82b63766..300293999d 100644 --- a/qapi/qapi-visit-core.c +++ b/qapi/qapi-visit-core.c @@ -11,6 +11,7 @@ * */ +#include "qemu-common.h" #include "qapi/qapi-visit-core.h" #include "qapi/qapi-visit-impl.h" diff --git a/qemu-error.h b/qemu-error.h index 93d74b4a30..c902cc10de 100644 --- a/qemu-error.h +++ b/qemu-error.h @@ -13,6 +13,8 @@ #ifndef QEMU_ERROR_H #define QEMU_ERROR_H +#include + typedef struct Location { /* all members are private to qemu-error.c */ enum { LOC_NONE, LOC_CMDLINE, LOC_FILE } kind; diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index 3c4678dbf1..2db0bf1e56 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -366,6 +366,7 @@ def gen_command_def_prologue(prefix="", proxy=False): * */ +#include "qemu-common.h" #include "qemu-objects.h" #include "qapi/qmp-core.h" #include "qapi/qapi-visit-core.h" diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py index a360de719f..f1aabb3813 100644 --- a/scripts/qapi-visit.py +++ b/scripts/qapi-visit.py @@ -298,6 +298,7 @@ fdef.write(mcgen(''' * */ +#include "qemu-common.h" #include "%(header)s" ''', header=basename(h_file))) diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c index dc3c507f2b..bf41034c62 100644 --- a/tests/test-qmp-commands.c +++ b/tests/test-qmp-commands.c @@ -1,4 +1,5 @@ #include +#include "qemu-common.h" #include "qemu-objects.h" #include "test-qmp-commands.h" #include "qapi/qmp-core.h" diff --git a/tests/test-qmp-input-strict.c b/tests/test-qmp-input-strict.c index f6df8cbe1e..86f24d821c 100644 --- a/tests/test-qmp-input-strict.c +++ b/tests/test-qmp-input-strict.c @@ -14,6 +14,7 @@ #include #include +#include "qemu-common.h" #include "qapi/qmp-input-visitor.h" #include "test-qapi-types.h" #include "test-qapi-visit.h" diff --git a/tests/test-qmp-input-visitor.c b/tests/test-qmp-input-visitor.c index 8f5a509582..6568c9907c 100644 --- a/tests/test-qmp-input-visitor.c +++ b/tests/test-qmp-input-visitor.c @@ -13,6 +13,7 @@ #include #include +#include "qemu-common.h" #include "qapi/qmp-input-visitor.h" #include "test-qapi-types.h" #include "test-qapi-visit.h" diff --git a/tests/test-qmp-output-visitor.c b/tests/test-qmp-output-visitor.c index 24a6359504..84b1f41894 100644 --- a/tests/test-qmp-output-visitor.c +++ b/tests/test-qmp-output-visitor.c @@ -12,6 +12,7 @@ #include +#include "qemu-common.h" #include "qapi/qmp-output-visitor.h" #include "test-qapi-types.h" #include "test-qapi-visit.h" diff --git a/tests/test-string-input-visitor.c b/tests/test-string-input-visitor.c index 5370e32041..36b3792980 100644 --- a/tests/test-string-input-visitor.c +++ b/tests/test-string-input-visitor.c @@ -13,6 +13,7 @@ #include #include +#include "qemu-common.h" #include "qapi/string-input-visitor.h" #include "test-qapi-types.h" #include "test-qapi-visit.h" diff --git a/tests/test-string-output-visitor.c b/tests/test-string-output-visitor.c index 608f14a5de..afb557a00f 100644 --- a/tests/test-string-output-visitor.c +++ b/tests/test-string-output-visitor.c @@ -12,6 +12,7 @@ #include +#include "qemu-common.h" #include "qapi/string-output-visitor.h" #include "test-qapi-types.h" #include "test-qapi-visit.h" diff --git a/tests/test-visitor-serialization.c b/tests/test-visitor-serialization.c index b8ad16fc9e..a251f878e1 100644 --- a/tests/test-visitor-serialization.c +++ b/tests/test-visitor-serialization.c @@ -14,6 +14,8 @@ #include #include #include + +#include "qemu-common.h" #include "test-qapi-types.h" #include "test-qapi-visit.h" #include "qemu-objects.h" From 4167c42c5eb79add9252547efe92df7e5c2d1abd Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Thu, 6 Dec 2012 11:51:59 +0100 Subject: [PATCH 246/300] qapi: remove qapi/qapi-types-core.h The file is only including error.h and qerror.h. Prefer explicit inclusion of whatever files are needed. Signed-off-by: Paolo Bonzini --- qapi/opts-visitor.c | 1 + qapi/qapi-dealloc-visitor.c | 1 + qapi/qapi-types-core.h | 20 -------------------- qapi/qapi-visit-core.c | 1 + qapi/qapi-visit-core.h | 2 +- qapi/qapi-visit-impl.h | 2 +- qemu-option-internal.h | 1 + qom/object.c | 1 + scripts/qapi-commands.py | 2 ++ target-i386/cpu.c | 1 + 10 files changed, 10 insertions(+), 22 deletions(-) delete mode 100644 qapi/qapi-types-core.h diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c index e3fd25446d..6ccb8a1c33 100644 --- a/qapi/opts-visitor.c +++ b/qapi/opts-visitor.c @@ -11,6 +11,7 @@ */ #include "qemu-common.h" +#include "qerror.h" #include "opts-visitor.h" #include "qemu-queue.h" #include "qemu-option-internal.h" diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c index 75214e7daa..7c44042619 100644 --- a/qapi/qapi-dealloc-visitor.c +++ b/qapi/qapi-dealloc-visitor.c @@ -15,6 +15,7 @@ #include "qemu-queue.h" #include "qemu-common.h" #include "qemu-objects.h" +#include "qapi-visit-impl.h" typedef struct StackEntry { diff --git a/qapi/qapi-types-core.h b/qapi/qapi-types-core.h deleted file mode 100644 index 831df21ea7..0000000000 --- a/qapi/qapi-types-core.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Core Definitions for QAPI-generated Types - * - * Copyright IBM, Corp. 2011 - * - * Authors: - * Anthony Liguori - * - * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. - * See the COPYING.LIB file in the top-level directory. - * - */ - -#ifndef QAPI_TYPES_CORE_H -#define QAPI_TYPES_CORE_H - -#include "error.h" -#include "qerror.h" - -#endif diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c index 300293999d..4649fb71b7 100644 --- a/qapi/qapi-visit-core.c +++ b/qapi/qapi-visit-core.c @@ -12,6 +12,7 @@ */ #include "qemu-common.h" +#include "qerror.h" #include "qapi/qapi-visit-core.h" #include "qapi/qapi-visit-impl.h" diff --git a/qapi/qapi-visit-core.h b/qapi/qapi-visit-core.h index 60acedac77..00ce678d0a 100644 --- a/qapi/qapi-visit-core.h +++ b/qapi/qapi-visit-core.h @@ -13,7 +13,7 @@ #ifndef QAPI_VISITOR_CORE_H #define QAPI_VISITOR_CORE_H -#include "qapi/qapi-types-core.h" +#include "error.h" #include typedef struct GenericList diff --git a/qapi/qapi-visit-impl.h b/qapi/qapi-visit-impl.h index 0f3a1898fe..efd4271d40 100644 --- a/qapi/qapi-visit-impl.h +++ b/qapi/qapi-visit-impl.h @@ -12,7 +12,7 @@ #ifndef QAPI_VISITOR_IMPL_H #define QAPI_VISITOR_IMPL_H -#include "qapi/qapi-types-core.h" +#include "error.h" #include "qapi/qapi-visit-core.h" void input_type_enum(Visitor *v, int *obj, const char *strings[], diff --git a/qemu-option-internal.h b/qemu-option-internal.h index 19fdc1ca85..77899b082d 100644 --- a/qemu-option-internal.h +++ b/qemu-option-internal.h @@ -27,6 +27,7 @@ #define QEMU_OPTIONS_INTERNAL_H #include "qemu-option.h" +#include "qemu-error.h" struct QemuOpt { const char *name; diff --git a/qom/object.c b/qom/object.c index 0739aa2943..8d3036dcf4 100644 --- a/qom/object.c +++ b/qom/object.c @@ -15,6 +15,7 @@ #include "qapi/qapi-visit-core.h" #include "qapi/string-input-visitor.h" #include "qapi/string-output-visitor.h" +#include "qerror.h" /* TODO: replace QObject with a simpler visitor to avoid a dependency * of the QOM core on QObject? */ diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index 2db0bf1e56..5d034c2c21 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -367,6 +367,8 @@ def gen_command_def_prologue(prefix="", proxy=False): */ #include "qemu-common.h" +#include "module.h" +#include "qerror.h" #include "qemu-objects.h" #include "qapi/qmp-core.h" #include "qapi/qapi-visit-core.h" diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 7be3ad82cb..e968006ed0 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -26,6 +26,7 @@ #include "qemu-option.h" #include "qemu-config.h" +#include "qerror.h" #include "qapi/qapi-visit-core.h" #include "arch_init.h" From 7edd63f1b179c18f0f1a4664ddbabe4fe5b2be2f Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Thu, 6 Dec 2012 11:28:04 +0100 Subject: [PATCH 247/300] qapi: make struct Visitor opaque Move its definition from qapi-visit-core.h to qapi-visit-impl.h. Signed-off-by: Paolo Bonzini --- qapi/qapi-visit-core.h | 40 ---------------------------------------- qapi/qapi-visit-impl.h | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/qapi/qapi-visit-core.h b/qapi/qapi-visit-core.h index 00ce678d0a..602debe753 100644 --- a/qapi/qapi-visit-core.h +++ b/qapi/qapi-visit-core.h @@ -24,46 +24,6 @@ typedef struct GenericList typedef struct Visitor Visitor; -struct Visitor -{ - /* Must be set */ - void (*start_struct)(Visitor *v, void **obj, const char *kind, - const char *name, size_t size, Error **errp); - void (*end_struct)(Visitor *v, Error **errp); - - void (*start_list)(Visitor *v, const char *name, Error **errp); - GenericList *(*next_list)(Visitor *v, GenericList **list, Error **errp); - void (*end_list)(Visitor *v, Error **errp); - - void (*type_enum)(Visitor *v, int *obj, const char *strings[], - const char *kind, const char *name, Error **errp); - - void (*type_int)(Visitor *v, int64_t *obj, const char *name, Error **errp); - void (*type_bool)(Visitor *v, bool *obj, const char *name, Error **errp); - void (*type_str)(Visitor *v, char **obj, const char *name, Error **errp); - void (*type_number)(Visitor *v, double *obj, const char *name, - Error **errp); - - /* May be NULL */ - void (*start_optional)(Visitor *v, bool *present, const char *name, - Error **errp); - void (*end_optional)(Visitor *v, Error **errp); - - void (*start_handle)(Visitor *v, void **obj, const char *kind, - const char *name, Error **errp); - void (*end_handle)(Visitor *v, Error **errp); - void (*type_uint8)(Visitor *v, uint8_t *obj, const char *name, Error **errp); - void (*type_uint16)(Visitor *v, uint16_t *obj, const char *name, Error **errp); - void (*type_uint32)(Visitor *v, uint32_t *obj, const char *name, Error **errp); - void (*type_uint64)(Visitor *v, uint64_t *obj, const char *name, Error **errp); - void (*type_int8)(Visitor *v, int8_t *obj, const char *name, Error **errp); - void (*type_int16)(Visitor *v, int16_t *obj, const char *name, Error **errp); - void (*type_int32)(Visitor *v, int32_t *obj, const char *name, Error **errp); - void (*type_int64)(Visitor *v, int64_t *obj, const char *name, Error **errp); - /* visit_type_size() falls back to (*type_uint64)() if type_size is unset */ - void (*type_size)(Visitor *v, uint64_t *obj, const char *name, Error **errp); -}; - void visit_start_handle(Visitor *v, void **obj, const char *kind, const char *name, Error **errp); void visit_end_handle(Visitor *v, Error **errp); diff --git a/qapi/qapi-visit-impl.h b/qapi/qapi-visit-impl.h index efd4271d40..9337d62e75 100644 --- a/qapi/qapi-visit-impl.h +++ b/qapi/qapi-visit-impl.h @@ -15,6 +15,46 @@ #include "error.h" #include "qapi/qapi-visit-core.h" +struct Visitor +{ + /* Must be set */ + void (*start_struct)(Visitor *v, void **obj, const char *kind, + const char *name, size_t size, Error **errp); + void (*end_struct)(Visitor *v, Error **errp); + + void (*start_list)(Visitor *v, const char *name, Error **errp); + GenericList *(*next_list)(Visitor *v, GenericList **list, Error **errp); + void (*end_list)(Visitor *v, Error **errp); + + void (*type_enum)(Visitor *v, int *obj, const char *strings[], + const char *kind, const char *name, Error **errp); + + void (*type_int)(Visitor *v, int64_t *obj, const char *name, Error **errp); + void (*type_bool)(Visitor *v, bool *obj, const char *name, Error **errp); + void (*type_str)(Visitor *v, char **obj, const char *name, Error **errp); + void (*type_number)(Visitor *v, double *obj, const char *name, + Error **errp); + + /* May be NULL */ + void (*start_optional)(Visitor *v, bool *present, const char *name, + Error **errp); + void (*end_optional)(Visitor *v, Error **errp); + + void (*start_handle)(Visitor *v, void **obj, const char *kind, + const char *name, Error **errp); + void (*end_handle)(Visitor *v, Error **errp); + void (*type_uint8)(Visitor *v, uint8_t *obj, const char *name, Error **errp); + void (*type_uint16)(Visitor *v, uint16_t *obj, const char *name, Error **errp); + void (*type_uint32)(Visitor *v, uint32_t *obj, const char *name, Error **errp); + void (*type_uint64)(Visitor *v, uint64_t *obj, const char *name, Error **errp); + void (*type_int8)(Visitor *v, int8_t *obj, const char *name, Error **errp); + void (*type_int16)(Visitor *v, int16_t *obj, const char *name, Error **errp); + void (*type_int32)(Visitor *v, int32_t *obj, const char *name, Error **errp); + void (*type_int64)(Visitor *v, int64_t *obj, const char *name, Error **errp); + /* visit_type_size() falls back to (*type_uint64)() if type_size is unset */ + void (*type_size)(Visitor *v, uint64_t *obj, const char *name, Error **errp); +}; + void input_type_enum(Visitor *v, int *obj, const char *strings[], const char *kind, const char *name, Error **errp); void output_type_enum(Visitor *v, int *obj, const char *strings[], From cb9c377f54a756b04ef92c1c2e0453613ee863cf Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Thu, 6 Dec 2012 12:15:58 +0100 Subject: [PATCH 248/300] janitor: add guards to headers Signed-off-by: Paolo Bonzini --- gen-icount.h | 5 +++++ host-utils.h | 4 ++++ hw/9pfs/virtio-9p-synth.h | 4 ++++ hw/audiodev.h | 5 +++++ hw/baum.h | 4 ++++ hw/bt.h | 5 +++++ hw/cris-boot.h | 4 ++++ hw/empty_slot.h | 5 +++++ hw/escc.h | 5 +++++ hw/etraxfs.h | 5 +++++ hw/etraxfs_dma.h | 5 +++++ hw/flash.h | 5 +++++ hw/lm32.h | 5 +++++ hw/mac_dbdma.h | 4 ++++ hw/msmouse.h | 5 +++++ hw/ne2000.h | 5 +++++ hw/pci/pci_ids.h | 4 ++++ hw/pcmcia.h | 5 +++++ hw/pcnet.h | 5 +++++ hw/ppc.h | 5 +++++ hw/qdev-addr.h | 5 +++++ hw/qxl.h | 5 +++++ hw/s390-virtio-bus.h | 4 ++++ hw/scsi-defs.h | 4 ++++ hw/serial.h | 4 ++++ hw/soc_dma.h | 6 ++++++ hw/usb/hcd-ehci.h | 4 ++++ hw/vga_int.h | 4 ++++ hw/xilinx.h | 6 ++++++ iov.h | 5 +++++ linux-user/cris/syscall.h | 5 +++++ linux-user/microblaze/syscall.h | 6 ++++++ linux-user/syscall_defs.h | 6 ++++++ slirp/bootp.h | 4 ++++ slirp/main.h | 4 ++++ slirp/tftp.h | 4 ++++ softmmu-semi.h | 4 ++++ target-cris/crisv32-decode.h | 4 ++++ tcg/arm/tcg-target.h | 3 +++ tcg/hppa/tcg-target.h | 3 +++ tcg/i386/tcg-target.h | 3 +++ tcg/ia64/tcg-target.h | 3 +++ tcg/mips/tcg-target.h | 3 +++ tcg/ppc/tcg-target.h | 3 +++ tcg/ppc64/tcg-target.h | 3 +++ tcg/s390/tcg-target.h | 3 +++ tcg/sparc/tcg-target.h | 3 +++ tests/tcg/cris/crisutils.h | 5 +++++ ui/curses_keys.h | 5 +++++ ui/d3des.h | 4 ++++ 50 files changed, 219 insertions(+) diff --git a/gen-icount.h b/gen-icount.h index 248cf5b16d..1541f0b1e4 100644 --- a/gen-icount.h +++ b/gen-icount.h @@ -1,3 +1,6 @@ +#ifndef GEN_ICOUNT_H +#define GEN_ICOUNT_H 1 + #include "qemu-timer.h" /* Helpers for instruction counting code generation. */ @@ -46,3 +49,5 @@ static inline void gen_io_end(void) tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUArchState, can_do_io)); tcg_temp_free_i32(tmp); } + +#endif diff --git a/host-utils.h b/host-utils.h index 821db93671..a5f8464fb2 100644 --- a/host-utils.h +++ b/host-utils.h @@ -22,6 +22,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifndef HOST_UTILS_H +#define HOST_UTILS_H 1 #include "compiler.h" /* QEMU_GNUC_PREREQ */ @@ -234,3 +236,5 @@ static inline int ctpop64(uint64_t val) return val; #endif } + +#endif diff --git a/hw/9pfs/virtio-9p-synth.h b/hw/9pfs/virtio-9p-synth.h index e03f434633..ab05a8e78c 100644 --- a/hw/9pfs/virtio-9p-synth.h +++ b/hw/9pfs/virtio-9p-synth.h @@ -10,6 +10,8 @@ * the COPYING file in the top-level directory. * */ +#ifndef HW_9PFS_VIRTIO9P_SYNTH_H +#define HW_9PFS_VIRTIO9P_SYNTH_H 1 #include #include @@ -48,3 +50,5 @@ extern int qemu_v9fs_synth_mkdir(V9fsSynthNode *parent, int mode, extern int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int mode, const char *name, v9fs_synth_read read, v9fs_synth_write write, void *arg); + +#endif diff --git a/hw/audiodev.h b/hw/audiodev.h index ed2790f5f6..428274f929 100644 --- a/hw/audiodev.h +++ b/hw/audiodev.h @@ -1,3 +1,6 @@ +#ifndef HW_AUDIODEV_H +#define HW_AUDIODEV_H 1 + /* es1370.c */ int es1370_init(PCIBus *bus); @@ -18,3 +21,5 @@ int cs4231a_init(ISABus *bus); /* intel-hda.c + hda-audio.c */ int intel_hda_and_codec_init(PCIBus *bus); + +#endif diff --git a/hw/baum.h b/hw/baum.h index 8af710fa21..763588422a 100644 --- a/hw/baum.h +++ b/hw/baum.h @@ -21,6 +21,10 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifndef HW_BAUM_H +#define HW_BAUM_H 1 /* char device */ CharDriverState *chr_baum_init(QemuOpts *opts); + +#endif diff --git a/hw/bt.h b/hw/bt.h index ebf6a370a1..830af94735 100644 --- a/hw/bt.h +++ b/hw/bt.h @@ -23,6 +23,9 @@ * along with this program; if not, see . */ +#ifndef HW_BT_H +#define HW_BT_H 1 + #include "hw/irq.h" /* BD Address */ @@ -2183,3 +2186,5 @@ enum bt_sdp_attribute_id { SDP_ATTR_NORMALLY_CONNECTABLE = 0x020d, SDP_ATTR_BOOT_DEVICE = 0x020e, }; + +#endif diff --git a/hw/cris-boot.h b/hw/cris-boot.h index 5b17d83cbb..c4d3fa6f6f 100644 --- a/hw/cris-boot.h +++ b/hw/cris-boot.h @@ -1,3 +1,5 @@ +#ifndef _CRIS_BOOT_H +#define HW_CRIS_BOOT_H 1 struct cris_load_info { @@ -9,3 +11,5 @@ struct cris_load_info }; void cris_load_image(CRISCPU *cpu, struct cris_load_info *li); + +#endif diff --git a/hw/empty_slot.h b/hw/empty_slot.h index 4e9e460485..6079602cdf 100644 --- a/hw/empty_slot.h +++ b/hw/empty_slot.h @@ -1,2 +1,7 @@ +#ifndef HW_EMPTY_SLOT_H +#define HW_EMPTY_SLOT_H 1 + /* empty_slot.c */ void empty_slot_init(hwaddr addr, uint64_t slot_size); + +#endif diff --git a/hw/escc.h b/hw/escc.h index def28947a0..bda3213317 100644 --- a/hw/escc.h +++ b/hw/escc.h @@ -1,3 +1,6 @@ +#ifndef HW_ESCC_H +#define HW_ESCC_H 1 + /* escc.c */ #define ESCC_SIZE 4 MemoryRegion *escc_init(hwaddr base, qemu_irq irqA, qemu_irq irqB, @@ -6,3 +9,5 @@ MemoryRegion *escc_init(hwaddr base, qemu_irq irqA, qemu_irq irqB, void slavio_serial_ms_kbd_init(hwaddr base, qemu_irq irq, int disabled, int clock, int it_shift); + +#endif diff --git a/hw/etraxfs.h b/hw/etraxfs.h index bc60713633..cc1d7a17a0 100644 --- a/hw/etraxfs.h +++ b/hw/etraxfs.h @@ -22,6 +22,9 @@ * THE SOFTWARE. */ +#ifndef HW_EXTRAXFS_H +#define HW_EXTRAXFS_H 1 + #include "net/net.h" #include "etraxfs_dma.h" @@ -44,3 +47,5 @@ etraxfs_eth_init(NICInfo *nd, hwaddr base, int phyaddr, sysbus_mmio_map(sysbus_from_qdev(dev), 0, base); return dev; } + +#endif diff --git a/hw/etraxfs_dma.h b/hw/etraxfs_dma.h index 3fef80fae1..38104a67b5 100644 --- a/hw/etraxfs_dma.h +++ b/hw/etraxfs_dma.h @@ -1,3 +1,6 @@ +#ifndef HW_ETRAXFS_DMA_H +#define HW_ETRAXFS_DMA_H 1 + struct dma_context_metadata { /* data descriptor md */ uint16_t metadata; @@ -27,3 +30,5 @@ void etraxfs_dmac_connect_client(void *opaque, int c, struct etraxfs_dma_client *cl); int etraxfs_dmac_input(struct etraxfs_dma_client *client, void *buf, int len, int eop); + +#endif diff --git a/hw/flash.h b/hw/flash.h index d790f3c92d..bda2158c13 100644 --- a/hw/flash.h +++ b/hw/flash.h @@ -1,3 +1,6 @@ +#ifndef HW_FLASH_H +#define HW_FLASH_H 1 + /* NOR flash devices */ #include "memory.h" @@ -57,3 +60,5 @@ typedef struct { uint8_t ecc_digest(ECCState *s, uint8_t sample); void ecc_reset(ECCState *s); extern VMStateDescription vmstate_ecc_state; + +#endif diff --git a/hw/lm32.h b/hw/lm32.h index 0a676329fd..4194c9a813 100644 --- a/hw/lm32.h +++ b/hw/lm32.h @@ -1,3 +1,6 @@ +#ifndef HW_LM32_H +#define HW_LM32_H 1 + #include "qemu-common.h" @@ -23,3 +26,5 @@ static inline DeviceState *lm32_juart_init(void) return dev; } + +#endif diff --git a/hw/mac_dbdma.h b/hw/mac_dbdma.h index bfdb0ddc68..e596837f46 100644 --- a/hw/mac_dbdma.h +++ b/hw/mac_dbdma.h @@ -19,6 +19,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifndef HW_MAC_DBDMA_H +#define HW_MAC_DBDMA_H 1 #include "memory.h" @@ -42,3 +44,5 @@ void DBDMA_register_channel(void *dbdma, int nchan, qemu_irq irq, DBDMA_rw rw, DBDMA_flush flush, void *opaque); void* DBDMA_init (MemoryRegion **dbdma_mem); + +#endif diff --git a/hw/msmouse.h b/hw/msmouse.h index 456cb21424..8cff3a71c3 100644 --- a/hw/msmouse.h +++ b/hw/msmouse.h @@ -1,2 +1,7 @@ +#ifndef HW_MSMOUSE_H +#define HW_MSMOUSE_H 1 + /* msmouse.c */ CharDriverState *qemu_chr_open_msmouse(QemuOpts *opts); + +#endif diff --git a/hw/ne2000.h b/hw/ne2000.h index 1e7ab073e3..b31ae030f9 100644 --- a/hw/ne2000.h +++ b/hw/ne2000.h @@ -1,3 +1,6 @@ +#ifndef HW_NE2000_H +#define HW_NE2000_H 1 + #define NE2000_PMEM_SIZE (32*1024) #define NE2000_PMEM_START (16*1024) #define NE2000_PMEM_END (NE2000_PMEM_SIZE+NE2000_PMEM_START) @@ -33,3 +36,5 @@ extern const VMStateDescription vmstate_ne2000; void ne2000_reset(NE2000State *s); int ne2000_can_receive(NetClientState *nc); ssize_t ne2000_receive(NetClientState *nc, const uint8_t *buf, size_t size_); + +#endif diff --git a/hw/pci/pci_ids.h b/hw/pci/pci_ids.h index 5df7245349..271d935bc7 100644 --- a/hw/pci/pci_ids.h +++ b/hw/pci/pci_ids.h @@ -7,6 +7,8 @@ * * QEMU-specific definitions belong in pci.h */ +#ifndef HW_PCI_IDS_H +#define HW_PCI_IDS_H 1 /* Device classes and subclasses */ @@ -145,3 +147,5 @@ #define PCI_VENDOR_ID_NEC 0x1033 #define PCI_DEVICE_ID_NEC_UPD720200 0x0194 + +#endif diff --git a/hw/pcmcia.h b/hw/pcmcia.h index 50648c973f..aac1d77cc7 100644 --- a/hw/pcmcia.h +++ b/hw/pcmcia.h @@ -1,3 +1,6 @@ +#ifndef HW_PCMCIA_H +#define HW_PCMCIA_H 1 + /* PCMCIA/Cardbus */ #include "qemu-common.h" @@ -49,3 +52,5 @@ struct PCMCIACardState { /* dscm1xxxx.c */ PCMCIACardState *dscm1xxxx_init(DriveInfo *bdrv); + +#endif diff --git a/hw/pcnet.h b/hw/pcnet.h index da8c3bde7b..96643117a0 100644 --- a/hw/pcnet.h +++ b/hw/pcnet.h @@ -1,3 +1,6 @@ +#ifndef HW_PCNET_H +#define HW_PCNET_H 1 + #define PCNET_IOPORT_SIZE 0x20 #define PCNET_PNPMMIO_SIZE 0x20 @@ -63,3 +66,5 @@ void pcnet_set_link_status(NetClientState *nc); void pcnet_common_cleanup(PCNetState *d); int pcnet_common_init(DeviceState *dev, PCNetState *s, NetClientInfo *info); extern const VMStateDescription vmstate_pcnet; + +#endif diff --git a/hw/ppc.h b/hw/ppc.h index 2f3ea277bc..17005c795a 100644 --- a/hw/ppc.h +++ b/hw/ppc.h @@ -1,3 +1,6 @@ +#ifndef HW_PPC_H +#define HW_PPC_H 1 + void ppc_set_irq (CPUPPCState *env, int n_IRQ, int level); /* PowerPC hardware exceptions management helpers */ @@ -90,3 +93,5 @@ enum { /* ppc_booke.c */ void ppc_booke_timers_init(CPUPPCState *env, uint32_t freq, uint32_t flags); + +#endif diff --git a/hw/qdev-addr.h b/hw/qdev-addr.h index ea5ecb4d78..79708e6751 100644 --- a/hw/qdev-addr.h +++ b/hw/qdev-addr.h @@ -1,5 +1,10 @@ +#ifndef HW_QDEV_ADDR_H +#define HW_QDEV_ADDR_H 1 + #define DEFINE_PROP_TADDR(_n, _s, _f, _d) \ DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_taddr, hwaddr) extern PropertyInfo qdev_prop_taddr; void qdev_prop_set_taddr(DeviceState *dev, const char *name, hwaddr value); + +#endif diff --git a/hw/qxl.h b/hw/qxl.h index 8433d1aeea..9130261524 100644 --- a/hw/qxl.h +++ b/hw/qxl.h @@ -1,3 +1,6 @@ +#ifndef HW_QXL_H +#define HW_QXL_H 1 + #include "qemu-common.h" #include "ui/console.h" @@ -158,3 +161,5 @@ void qxl_render_update(PCIQXLDevice *qxl); int qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext); void qxl_render_update_area_done(PCIQXLDevice *qxl, QXLCookie *cookie); void qxl_render_update_area_bh(void *opaque); + +#endif diff --git a/hw/s390-virtio-bus.h b/hw/s390-virtio-bus.h index a83afe785f..23fedd5be8 100644 --- a/hw/s390-virtio-bus.h +++ b/hw/s390-virtio-bus.h @@ -16,6 +16,8 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see . */ +#ifndef HW_S390_VIRTIO_BUS_H +#define HW_S390_VIRTIO_BUS_H 1 #include "virtio-blk.h" #include "virtio-net.h" @@ -100,3 +102,5 @@ VirtIOS390Device *s390_virtio_bus_find_mem(VirtIOS390Bus *bus, ram_addr_t mem); void s390_virtio_device_sync(VirtIOS390Device *dev); void s390_virtio_reset_idx(VirtIOS390Device *dev); + +#endif diff --git a/hw/scsi-defs.h b/hw/scsi-defs.h index d7a401912b..9ab045b613 100644 --- a/hw/scsi-defs.h +++ b/hw/scsi-defs.h @@ -19,6 +19,8 @@ * This header file contains public constants and structures used by * the scsi code for linux. */ +#ifndef HW_SCSI_DEFS_H +#define HW_SCSI_DEFS_H 1 /* * SCSI opcodes @@ -301,3 +303,5 @@ #define MMC_PROFILE_HDDVD_R_DL 0x0058 #define MMC_PROFILE_HDDVD_RW_DL 0x005A #define MMC_PROFILE_INVALID 0xFFFF + +#endif diff --git a/hw/serial.h b/hw/serial.h index ed1a5cd43e..2d7d614e09 100644 --- a/hw/serial.h +++ b/hw/serial.h @@ -22,6 +22,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifndef HW_SERIAL_H +#define HW_SERIAL_H 1 #include "hw.h" #include "sysemu.h" @@ -97,3 +99,5 @@ SerialState *serial_mm_init(MemoryRegion *address_space, /* serial-isa.c */ bool serial_isa_init(ISABus *bus, int index, CharDriverState *chr); + +#endif diff --git a/hw/soc_dma.h b/hw/soc_dma.h index 5948489eae..6ca4166184 100644 --- a/hw/soc_dma.h +++ b/hw/soc_dma.h @@ -18,6 +18,10 @@ * with this program; if not, see . */ +#ifndef HW_SOC_DMA_H +#define HW_SOC_DMA_H 1 + + #include "memory.h" #include "hw/irq.h" @@ -108,3 +112,5 @@ static inline void soc_dma_port_add_fifo_out(struct soc_dma_s *dma, { return soc_dma_port_add_fifo(dma, virt_base, fn, opaque, 1); } + +#endif diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h index 772870b727..837c63be85 100644 --- a/hw/usb/hcd-ehci.h +++ b/hw/usb/hcd-ehci.h @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ +#ifndef HW_USB_EHCI_H +#define HW_USB_EHCI_H 1 #include "hw/hw.h" #include "qemu-timer.h" @@ -318,3 +320,5 @@ struct EHCIState { extern const VMStateDescription vmstate_ehci; void usb_ehci_initfn(EHCIState *s, DeviceState *dev); + +#endif diff --git a/hw/vga_int.h b/hw/vga_int.h index bcb738d8c9..ad02404b3c 100644 --- a/hw/vga_int.h +++ b/hw/vga_int.h @@ -21,6 +21,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifndef HW_VGA_INT_H +#define HW_VGA_INT_H 1 #include #include "error.h" @@ -212,3 +214,5 @@ extern const uint8_t gr_mask[16]; #define VGABIOS_CIRRUS_FILENAME "vgabios-cirrus.bin" extern const MemoryRegionOps vga_mem_ops; + +#endif diff --git a/hw/xilinx.h b/hw/xilinx.h index 735f8e257d..a12eccbe3c 100644 --- a/hw/xilinx.h +++ b/hw/xilinx.h @@ -1,3 +1,7 @@ +#ifndef HW_XILINX_H +#define HW_XILINX_H 1 + + #include "stream.h" #include "qemu-common.h" #include "net/net.h" @@ -90,3 +94,5 @@ xilinx_axiethernetdma_init(DeviceState *dev, StreamSlave *peer, sysbus_connect_irq(sysbus_from_qdev(dev), 0, irq); sysbus_connect_irq(sysbus_from_qdev(dev), 1, irq2); } + +#endif diff --git a/iov.h b/iov.h index 34c8ec9faa..d06f8b9ce3 100644 --- a/iov.h +++ b/iov.h @@ -11,6 +11,9 @@ * the COPYING file in the top-level directory. */ +#ifndef IOV_H +#define IOV_H + #include "qemu-common.h" /** @@ -95,3 +98,5 @@ void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt, unsigned iov_copy(struct iovec *dst_iov, unsigned int dst_iov_cnt, const struct iovec *iov, unsigned int iov_cnt, size_t offset, size_t bytes); + +#endif diff --git a/linux-user/cris/syscall.h b/linux-user/cris/syscall.h index 24f92ba421..50e50b4f3f 100644 --- a/linux-user/cris/syscall.h +++ b/linux-user/cris/syscall.h @@ -1,3 +1,6 @@ +#ifndef CRIS_SYSCALL_H +#define CRIS_SYSCALL_H 1 + #define UNAME_MACHINE "cris" @@ -34,3 +37,5 @@ struct target_pt_regs { unsigned long exs; unsigned long eda; }; + +#endif diff --git a/linux-user/microblaze/syscall.h b/linux-user/microblaze/syscall.h index db1f98ae69..c3e5c55b3d 100644 --- a/linux-user/microblaze/syscall.h +++ b/linux-user/microblaze/syscall.h @@ -1,3 +1,7 @@ +#ifndef MICROBLAZE_SYSCALLS_H +#define MICROBLAZE_SYSCALLS_H 1 + + #define UNAME_MACHINE "microblaze" /* We use microblaze_reg_t to keep things similar to the kernel sources. */ @@ -43,3 +47,5 @@ struct target_pt_regs { microblaze_reg_t fsr; uint32_t kernel_mode; }; + +#endif diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index a98cbf7b80..d4589e7906 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -4,6 +4,10 @@ most of them stay the same, so we handle it by putting ifdefs if necessary */ +#ifndef SYSCALL_DEFS_H +#define SYSCALL_DEFS_H 1 + + #include "syscall_nr.h" #define SOCKOP_socket 1 @@ -2425,3 +2429,5 @@ struct target_ucred { uint32_t uid; uint32_t gid; }; + +#endif diff --git a/slirp/bootp.h b/slirp/bootp.h index 30c30ab863..ec3b68704c 100644 --- a/slirp/bootp.h +++ b/slirp/bootp.h @@ -1,4 +1,6 @@ /* bootp/dhcp defines */ +#ifndef SLIRP_BOOTP_H +#define SLIRP_BOOTP_H 1 #define BOOTP_SERVER 67 #define BOOTP_CLIENT 68 @@ -120,3 +122,5 @@ typedef struct { #define NB_BOOTP_CLIENTS 16 void bootp_input(struct mbuf *m); + +#endif diff --git a/slirp/main.h b/slirp/main.h index 1f3b84de92..66e4f9252f 100644 --- a/slirp/main.h +++ b/slirp/main.h @@ -4,6 +4,8 @@ * Please read the file COPYRIGHT for the * terms and conditions of the copyright. */ +#ifndef SLIRP_MAIN_H +#define SLIRP_MAIN_H 1 #ifdef HAVE_SYS_SELECT_H #include @@ -45,3 +47,5 @@ extern int tcp_keepintvl; int if_encap(Slirp *slirp, struct mbuf *ifm); ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int flags); + +#endif diff --git a/slirp/tftp.h b/slirp/tftp.h index 51704e4874..87adeb5333 100644 --- a/slirp/tftp.h +++ b/slirp/tftp.h @@ -1,4 +1,6 @@ /* tftp defines */ +#ifndef SLIRP_TFTP_H +#define SLIRP_TFTP_H 1 #define TFTP_SESSIONS_MAX 3 @@ -43,3 +45,5 @@ struct tftp_session { }; void tftp_input(struct mbuf *m); + +#endif diff --git a/softmmu-semi.h b/softmmu-semi.h index bcb979a5b0..93798b9614 100644 --- a/softmmu-semi.h +++ b/softmmu-semi.h @@ -6,6 +6,8 @@ * * This code is licensed under the GPL */ +#ifndef SOFTMMU_SEMI_H +#define SOFTMMU_SEMI_H 1 static inline uint32_t softmmu_tget32(CPUArchState *env, uint32_t addr) { @@ -71,3 +73,5 @@ static void softmmu_unlock_user(CPUArchState *env, void *p, target_ulong addr, free(p); } #define unlock_user(s, args, len) softmmu_unlock_user(env, s, args, len) + +#endif diff --git a/target-cris/crisv32-decode.h b/target-cris/crisv32-decode.h index ed141de0b7..cdba377817 100644 --- a/target-cris/crisv32-decode.h +++ b/target-cris/crisv32-decode.h @@ -17,6 +17,8 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see . */ +#ifndef CRISV32_DECODE_H +#define CRISV32_DECODE_H 1 /* Convenient binary macros. */ #define HEX__(n) 0x##n##LU @@ -126,3 +128,5 @@ #define DEC_FTAG_FIDX_D_M {B8(10101011), B8(11111111)} #define DEC_FTAG_FIDX_I_M {B8(11010011), B8(11111111)} + +#endif diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h index 98fa11b286..7083f3a700 100644 --- a/tcg/arm/tcg-target.h +++ b/tcg/arm/tcg-target.h @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifndef TCG_TARGET_ARM #define TCG_TARGET_ARM 1 #undef TCG_TARGET_WORDS_BIGENDIAN @@ -91,3 +92,5 @@ static inline void flush_icache_range(tcg_target_ulong start, __asm __volatile__ ("swi 0x9f0002" : : "r" (_beg), "r" (_end), "r" (_flg)); #endif } + +#endif diff --git a/tcg/hppa/tcg-target.h b/tcg/hppa/tcg-target.h index f43fb419ae..e2754fe970 100644 --- a/tcg/hppa/tcg-target.h +++ b/tcg/hppa/tcg-target.h @@ -22,6 +22,7 @@ * THE SOFTWARE. */ +#ifndef TCG_TARGET_HPPA #define TCG_TARGET_HPPA 1 #if TCG_TARGET_REG_BITS != 32 @@ -119,3 +120,5 @@ static inline void flush_icache_range(tcg_target_ulong start, start += 32; } } + +#endif diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h index dbc6756414..5352ac0254 100644 --- a/tcg/i386/tcg-target.h +++ b/tcg/i386/tcg-target.h @@ -21,6 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifndef TCG_TARGET_I386 #define TCG_TARGET_I386 1 //#define TCG_TARGET_WORDS_BIGENDIAN @@ -135,3 +136,5 @@ static inline void flush_icache_range(tcg_target_ulong start, tcg_target_ulong stop) { } + +#endif diff --git a/tcg/ia64/tcg-target.h b/tcg/ia64/tcg-target.h index 91fe7a3b06..7f3401ecdd 100644 --- a/tcg/ia64/tcg-target.h +++ b/tcg/ia64/tcg-target.h @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifndef TCG_TARGET_IA64 #define TCG_TARGET_IA64 1 /* We only map the first 64 registers */ @@ -158,3 +159,5 @@ static inline void flush_icache_range(tcg_target_ulong start, } asm volatile (";;sync.i;;srlz.i;;"); } + +#endif diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h index 65b5c59e89..78af664cca 100644 --- a/tcg/mips/tcg-target.h +++ b/tcg/mips/tcg-target.h @@ -23,6 +23,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifndef TCG_TARGET_MIPS #define TCG_TARGET_MIPS 1 #ifdef __MIPSEB__ @@ -127,3 +128,5 @@ static inline void flush_icache_range(tcg_target_ulong start, { cacheflush ((void *)start, stop-start, ICACHE); } + +#endif diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h index ad433ae5bb..ea26769581 100644 --- a/tcg/ppc/tcg-target.h +++ b/tcg/ppc/tcg-target.h @@ -21,6 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifndef TCG_TARGET_PPC #define TCG_TARGET_PPC 1 #define TCG_TARGET_WORDS_BIGENDIAN @@ -99,3 +100,5 @@ typedef enum { #define tcg_qemu_tb_exec(env, tb_ptr) \ ((long __attribute__ ((longcall)) \ (*)(void *, void *))code_gen_prologue)(env, tb_ptr) + +#endif diff --git a/tcg/ppc64/tcg-target.h b/tcg/ppc64/tcg-target.h index 97fc5c9885..9b8e9a07b8 100644 --- a/tcg/ppc64/tcg-target.h +++ b/tcg/ppc64/tcg-target.h @@ -21,6 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifndef TCG_TARGET_PPC64 #define TCG_TARGET_PPC64 1 #define TCG_TARGET_WORDS_BIGENDIAN @@ -109,3 +110,5 @@ typedef enum { #define TCG_AREG0 TCG_REG_R27 #define TCG_TARGET_EXTEND_ARGS 1 + +#endif diff --git a/tcg/s390/tcg-target.h b/tcg/s390/tcg-target.h index a0181aef74..c87b4138b5 100644 --- a/tcg/s390/tcg-target.h +++ b/tcg/s390/tcg-target.h @@ -21,6 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifndef TCG_TARGET_S390 #define TCG_TARGET_S390 1 #define TCG_TARGET_WORDS_BIGENDIAN @@ -103,3 +104,5 @@ static inline void flush_icache_range(tcg_target_ulong start, tcg_target_ulong stop) { } + +#endif diff --git a/tcg/sparc/tcg-target.h b/tcg/sparc/tcg-target.h index 0e7d398a41..256f973c6d 100644 --- a/tcg/sparc/tcg-target.h +++ b/tcg/sparc/tcg-target.h @@ -21,6 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifndef TCG_TARGET_SPARC #define TCG_TARGET_SPARC 1 #define TCG_TARGET_WORDS_BIGENDIAN @@ -138,3 +139,5 @@ static inline void flush_icache_range(tcg_target_ulong start, for (; p < stop; p += 8) __asm__ __volatile__("flush\t%0" : : "r" (p)); } + +#endif diff --git a/tests/tcg/cris/crisutils.h b/tests/tcg/cris/crisutils.h index 29b71cd7b9..3456b9d50d 100644 --- a/tests/tcg/cris/crisutils.h +++ b/tests/tcg/cris/crisutils.h @@ -1,3 +1,6 @@ +#ifndef CRISUTILS_H +#define CRISUTILS_H 1 + static char *tst_cc_loc = NULL; #define cris_tst_cc_init() \ @@ -69,3 +72,5 @@ static inline void cris_tst_cc(const int n, const int z, if (c) cris_tst_cc_c1(); else cris_tst_cc_c0(); asm volatile ("" : : "g" (_err)); } + +#endif diff --git a/ui/curses_keys.h b/ui/curses_keys.h index c0d5eb452f..18ce6dceee 100644 --- a/ui/curses_keys.h +++ b/ui/curses_keys.h @@ -22,6 +22,9 @@ * THE SOFTWARE. */ +#ifndef QEMU_CURSES_KEYS_H +#define QEMU_CURSES_KEYS_H 1 + #include #include "keymaps.h" @@ -507,3 +510,5 @@ static const name2keysym_t name2keysym[] = { { NULL, 0 }, }; + +#endif diff --git a/ui/d3des.h b/ui/d3des.h index 78d546f7d8..70cb6b57ea 100644 --- a/ui/d3des.h +++ b/ui/d3des.h @@ -9,6 +9,8 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ +#ifndef D3DES_H +#define D3DES_H 1 /* d3des.h - * @@ -49,3 +51,5 @@ void des(unsigned char *, unsigned char *); /* d3des.h V5.09 rwo 9208.04 15:06 Graven Imagery ********************************************************************/ + +#endif From 7b1b5d191385ca52e96caae2a05c64f3a63855d9 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 17 Dec 2012 18:19:43 +0100 Subject: [PATCH 249/300] qapi: move include files to include/qobject/ Signed-off-by: Paolo Bonzini --- backends/rng-egd.c | 2 +- backends/rng-random.c | 2 +- backends/rng.c | 2 +- balloon.c | 2 +- block.c | 2 +- block.h | 2 +- block/qcow2.c | 2 +- block/qed.c | 2 +- block_int.h | 2 +- blockdev-nbd.c | 2 +- blockdev.c | 4 ++-- blockdev.h | 2 +- blockjob.c | 2 +- dump-stub.c | 2 +- dump.c | 2 +- error.c | 8 ++++---- hmp.h | 2 +- hw/ivshmem.c | 2 +- hw/mc146818rtc.c | 2 +- hw/pci/pci-hotplug.c | 2 +- hw/pci/pcie_aer.c | 2 +- hw/qdev-addr.c | 2 +- hw/qdev-core.h | 2 +- hw/qdev-properties.c | 4 ++-- hw/qdev.c | 4 ++-- hw/vga_int.h | 2 +- hw/watchdog.c | 2 +- include/net/net.h | 2 +- include/net/slirp.h | 2 +- .../qapi/dealloc-visitor.h | 2 +- error.h => include/qapi/error.h | 0 {qapi => include/qapi}/opts-visitor.h | 2 +- {qapi => include/qapi}/qmp-input-visitor.h | 4 ++-- {qapi => include/qapi}/qmp-output-visitor.h | 4 ++-- qapi/qmp-core.h => include/qapi/qmp/dispatch.h | 6 +++--- json-lexer.h => include/qapi/qmp/json-lexer.h | 4 ++-- .../qapi/qmp/json-parser.h | 4 ++-- .../qapi/qmp/json-streamer.h | 4 ++-- qbool.h => include/qapi/qmp/qbool.h | 2 +- qdict.h => include/qapi/qmp/qdict.h | 4 ++-- qerror.h => include/qapi/qmp/qerror.h | 6 +++--- qfloat.h => include/qapi/qmp/qfloat.h | 2 +- qint.h => include/qapi/qmp/qint.h | 2 +- qjson.h => include/qapi/qmp/qjson.h | 4 ++-- qlist.h => include/qapi/qmp/qlist.h | 2 +- qobject.h => include/qapi/qmp/qobject.h | 0 qstring.h => include/qapi/qmp/qstring.h | 2 +- qemu-objects.h => include/qapi/qmp/types.h | 16 ++++++++-------- {qapi => include/qapi}/string-input-visitor.h | 2 +- {qapi => include/qapi}/string-output-visitor.h | 2 +- .../qapi/visitor-impl.h | 4 ++-- .../qapi/visitor.h | 2 +- include/qemu/rng.h | 2 +- include/ui/console.h | 4 ++-- json-lexer.c | 10 +++++----- json-parser.c | 18 +++++++++--------- json-streamer.c | 10 +++++----- migration.h | 4 ++-- monitor.c | 16 ++++++++-------- monitor.h | 4 ++-- net/net.c | 2 +- pixman | 2 +- qapi/opts-visitor.c | 6 +++--- qapi/qapi-dealloc-visitor.c | 6 +++--- qapi/qapi-visit-core.c | 6 +++--- qapi/qmp-dispatch.c | 10 +++++----- qapi/qmp-input-visitor.c | 8 ++++---- qapi/qmp-output-visitor.c | 8 ++++---- qapi/qmp-registry.c | 2 +- qapi/string-input-visitor.c | 6 +++--- qapi/string-output-visitor.c | 6 +++--- qbool.c | 4 ++-- qdict.c | 12 ++++++------ qemu-char.h | 4 ++-- qemu-config.c | 2 +- qemu-config.h | 2 +- qemu-img.c | 2 +- qemu-option.c | 6 +++--- qemu-option.h | 4 ++-- qemu_socket.h | 4 ++-- qerror.c | 4 ++-- qfloat.c | 4 ++-- qga/commands-posix.c | 2 +- qga/commands-win32.c | 2 +- qga/commands.c | 2 +- qga/guest-agent-core.h | 2 +- qga/main.c | 12 ++++++------ qint.c | 4 ++-- qjson.c | 18 +++++++++--------- qlist.c | 4 ++-- qom/object.c | 12 ++++++------ qom/qom-qobject.c | 2 +- qstring.c | 4 ++-- scripts/qapi-commands.py | 14 +++++++------- scripts/qapi-types.py | 2 +- scripts/qapi-visit.py | 2 +- stubs/arch-query-cpu-def.c | 2 +- target-i386/cpu-qom.h | 2 +- target-i386/cpu.c | 4 ++-- target-openrisc/cpu.h | 2 +- tests/check-qdict.c | 6 +++--- tests/check-qfloat.c | 2 +- tests/check-qint.c | 2 +- tests/check-qjson.c | 14 +++++++------- tests/check-qlist.c | 4 ++-- tests/check-qstring.c | 2 +- tests/test-qmp-commands.c | 4 ++-- tests/test-qmp-input-strict.c | 2 +- tests/test-qmp-input-visitor.c | 2 +- tests/test-qmp-output-visitor.c | 2 +- tests/test-string-input-visitor.c | 2 +- tests/test-string-output-visitor.c | 2 +- tests/test-visitor-serialization.c | 2 +- ui/input.c | 2 +- ui/spice-core.c | 8 ++++---- ui/vnc-enc-tight.c | 2 +- ui/vnc-palette.h | 2 +- ui/vnc.c | 2 +- vl.c | 2 +- 119 files changed, 242 insertions(+), 242 deletions(-) rename qapi/qapi-dealloc-visitor.h => include/qapi/dealloc-visitor.h (95%) rename error.h => include/qapi/error.h (100%) rename {qapi => include/qapi}/opts-visitor.h (96%) rename {qapi => include/qapi}/qmp-input-visitor.h (91%) rename {qapi => include/qapi}/qmp-output-visitor.h (91%) rename qapi/qmp-core.h => include/qapi/qmp/dispatch.h (93%) rename json-lexer.h => include/qapi/qmp/json-lexer.h (94%) rename json-parser.h => include/qapi/qmp/json-parser.h (90%) rename json-streamer.h => include/qapi/qmp/json-streamer.h (93%) rename qbool.h => include/qapi/qmp/qbool.h (94%) rename qdict.h => include/qapi/qmp/qdict.h (97%) rename qerror.h => include/qapi/qmp/qerror.h (99%) rename qfloat.h => include/qapi/qmp/qfloat.h (94%) rename qint.h => include/qapi/qmp/qint.h (94%) rename qjson.h => include/qapi/qmp/qjson.h (91%) rename qlist.h => include/qapi/qmp/qlist.h (98%) rename qobject.h => include/qapi/qmp/qobject.h (100%) rename qstring.h => include/qapi/qmp/qstring.h (96%) rename qemu-objects.h => include/qapi/qmp/types.h (60%) rename {qapi => include/qapi}/string-input-visitor.h (95%) rename {qapi => include/qapi}/string-output-visitor.h (95%) rename qapi/qapi-visit-impl.h => include/qapi/visitor-impl.h (98%) rename qapi/qapi-visit-core.h => include/qapi/visitor.h (99%) diff --git a/backends/rng-egd.c b/backends/rng-egd.c index ad8473777c..3a7d1ecbe0 100644 --- a/backends/rng-egd.c +++ b/backends/rng-egd.c @@ -12,7 +12,7 @@ #include "qemu/rng.h" #include "qemu-char.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" #include "hw/qdev.h" /* just for DEFINE_PROP_CHR */ #define TYPE_RNG_EGD "rng-egd" diff --git a/backends/rng-random.c b/backends/rng-random.c index 9c9923b2ac..c201953f29 100644 --- a/backends/rng-random.c +++ b/backends/rng-random.c @@ -12,7 +12,7 @@ #include "qemu/rng-random.h" #include "qemu/rng.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" #include "main-loop.h" struct RndRandom diff --git a/backends/rng.c b/backends/rng.c index 06f261180c..48a5840cd5 100644 --- a/backends/rng.c +++ b/backends/rng.c @@ -11,7 +11,7 @@ */ #include "qemu/rng.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" void rng_backend_request_entropy(RngBackend *s, size_t size, EntropyReceiveFunc *receive_entropy, diff --git a/balloon.c b/balloon.c index e02ab1c884..610fe6d626 100644 --- a/balloon.c +++ b/balloon.c @@ -30,7 +30,7 @@ #include "balloon.h" #include "trace.h" #include "qmp-commands.h" -#include "qjson.h" +#include "qapi/qmp/qjson.h" static QEMUBalloonEvent *balloon_event_fn; static QEMUBalloonStatus *balloon_stat_fn; diff --git a/block.c b/block.c index 0668c4be17..e962a5afe9 100644 --- a/block.c +++ b/block.c @@ -28,7 +28,7 @@ #include "block_int.h" #include "blockjob.h" #include "module.h" -#include "qjson.h" +#include "qapi/qmp/qjson.h" #include "sysemu.h" #include "notify.h" #include "qemu-coroutine.h" diff --git a/block.h b/block.h index 893448a5fc..0b22892d61 100644 --- a/block.h +++ b/block.h @@ -5,7 +5,7 @@ #include "qemu-common.h" #include "qemu-option.h" #include "qemu-coroutine.h" -#include "qobject.h" +#include "qapi/qmp/qobject.h" #include "qapi-types.h" /* block.c */ diff --git a/block/qcow2.c b/block/qcow2.c index 8520bda21a..217b4e422f 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -28,7 +28,7 @@ #include "aes.h" #include "block/qcow2.h" #include "qemu-error.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" #include "trace.h" /* diff --git a/block/qed.c b/block/qed.c index 0b5374a202..ca1fafb47e 100644 --- a/block/qed.c +++ b/block/qed.c @@ -15,7 +15,7 @@ #include "qemu-timer.h" #include "trace.h" #include "qed.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" #include "migration.h" static void qed_aio_cancel(BlockDriverAIOCB *blockacb) diff --git a/block_int.h b/block_int.h index bf3f79b3db..a748b6c571 100644 --- a/block_int.h +++ b/block_int.h @@ -30,7 +30,7 @@ #include "qemu-coroutine.h" #include "qemu-timer.h" #include "qapi-types.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" #include "monitor.h" #define BLOCK_FLAG_ENCRYPT 1 diff --git a/blockdev-nbd.c b/blockdev-nbd.c index 6b26bbf8c5..a194ecd392 100644 --- a/blockdev-nbd.c +++ b/blockdev-nbd.c @@ -12,7 +12,7 @@ #include "blockdev.h" #include "hw/block-common.h" #include "monitor.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" #include "sysemu.h" #include "qmp-commands.h" #include "trace.h" diff --git a/blockdev.c b/blockdev.c index 9a05e57009..c85c614577 100644 --- a/blockdev.c +++ b/blockdev.c @@ -11,10 +11,10 @@ #include "hw/block-common.h" #include "blockjob.h" #include "monitor.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" #include "qemu-option.h" #include "qemu-config.h" -#include "qemu-objects.h" +#include "qapi/qmp/types.h" #include "sysemu.h" #include "block_int.h" #include "qmp-commands.h" diff --git a/blockdev.h b/blockdev.h index d73d552a98..6e36d9f2c2 100644 --- a/blockdev.h +++ b/blockdev.h @@ -11,7 +11,7 @@ #define BLOCKDEV_H #include "block.h" -#include "error.h" +#include "qapi/error.h" #include "qemu-queue.h" void blockdev_mark_auto_del(BlockDriverState *bs); diff --git a/blockjob.c b/blockjob.c index cda12c6933..8c0a286a77 100644 --- a/blockjob.c +++ b/blockjob.c @@ -30,7 +30,7 @@ #include "block.h" #include "blockjob.h" #include "block_int.h" -#include "qjson.h" +#include "qapi/qmp/qjson.h" #include "qemu-coroutine.h" #include "qmp-commands.h" #include "qemu-timer.h" diff --git a/dump-stub.c b/dump-stub.c index 56d4564f0f..0842e6f916 100644 --- a/dump-stub.c +++ b/dump-stub.c @@ -13,7 +13,7 @@ #include "qemu-common.h" #include "dump.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" #include "qmp-commands.h" /* we need this function in hmp.c */ diff --git a/dump.c b/dump.c index 5640c2c2ff..7b45b53a8f 100644 --- a/dump.c +++ b/dump.c @@ -21,7 +21,7 @@ #include "dump.h" #include "sysemu.h" #include "memory_mapping.h" -#include "error.h" +#include "qapi/error.h" #include "qmp-commands.h" #include "gdbstub.h" diff --git a/error.c b/error.c index 128d88cd91..519f6b6ce0 100644 --- a/error.c +++ b/error.c @@ -11,11 +11,11 @@ */ #include "qemu-common.h" -#include "error.h" -#include "qjson.h" -#include "qdict.h" +#include "qapi/error.h" +#include "qapi/qmp/qjson.h" +#include "qapi/qmp/qdict.h" #include "qapi-types.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" struct Error { diff --git a/hmp.h b/hmp.h index 0ab03be982..21f3e05d09 100644 --- a/hmp.h +++ b/hmp.h @@ -16,7 +16,7 @@ #include "qemu-common.h" #include "qapi-types.h" -#include "qdict.h" +#include "qapi/qmp/qdict.h" void hmp_info_name(Monitor *mon); void hmp_info_version(Monitor *mon); diff --git a/hw/ivshmem.c b/hw/ivshmem.c index 5c648d98d3..d15760b314 100644 --- a/hw/ivshmem.c +++ b/hw/ivshmem.c @@ -22,7 +22,7 @@ #include "pci/msix.h" #include "kvm.h" #include "migration.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" #include "event_notifier.h" #include "qemu-char.h" diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c index c79fca7d68..2a1278f393 100644 --- a/hw/mc146818rtc.c +++ b/hw/mc146818rtc.c @@ -25,7 +25,7 @@ #include "qemu-timer.h" #include "sysemu.h" #include "mc146818rtc.h" -#include "qapi/qapi-visit-core.h" +#include "qapi/visitor.h" #ifdef TARGET_I386 #include "apic.h" diff --git a/hw/pci/pci-hotplug.c b/hw/pci/pci-hotplug.c index b850400252..5ba7558ecd 100644 --- a/hw/pci/pci-hotplug.c +++ b/hw/pci/pci-hotplug.c @@ -32,7 +32,7 @@ #include "hw/virtio-blk.h" #include "qemu-config.h" #include "blockdev.h" -#include "error.h" +#include "qapi/error.h" #if defined(TARGET_I386) static PCIDevice *qemu_pci_hot_add_nic(Monitor *mon, diff --git a/hw/pci/pcie_aer.c b/hw/pci/pcie_aer.c index 8a2032ca49..b6f4f8510f 100644 --- a/hw/pci/pcie_aer.c +++ b/hw/pci/pcie_aer.c @@ -19,7 +19,7 @@ */ #include "sysemu.h" -#include "qemu-objects.h" +#include "qapi/qmp/types.h" #include "monitor.h" #include "hw/pci/pci_bridge.h" #include "hw/pci/pcie.h" diff --git a/hw/qdev-addr.c b/hw/qdev-addr.c index ea32c31ab6..552ee21f82 100644 --- a/hw/qdev-addr.c +++ b/hw/qdev-addr.c @@ -1,7 +1,7 @@ #include "qdev.h" #include "qdev-addr.h" #include "hwaddr.h" -#include "qapi/qapi-visit-core.h" +#include "qapi/visitor.h" /* --- target physical address --- */ diff --git a/hw/qdev-core.h b/hw/qdev-core.h index d672ccafe6..506977c109 100644 --- a/hw/qdev-core.h +++ b/hw/qdev-core.h @@ -6,7 +6,7 @@ #include "qemu-types.h" #include "qemu/object.h" #include "hw/irq.h" -#include "error.h" +#include "qapi/error.h" enum DevState { DEV_STATE_CREATED = 1, diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c index 7ab55efe43..ba6c648fed 100644 --- a/hw/qdev-properties.c +++ b/hw/qdev-properties.c @@ -1,10 +1,10 @@ #include "net/net.h" #include "qdev.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" #include "blockdev.h" #include "hw/block-common.h" #include "net/hub.h" -#include "qapi/qapi-visit-core.h" +#include "qapi/visitor.h" #include "qemu-char.h" void *qdev_get_prop_ptr(DeviceState *dev, Property *prop) diff --git a/hw/qdev.c b/hw/qdev.c index 6b91fb987b..0a2a32d5d3 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -28,8 +28,8 @@ #include "net/net.h" #include "qdev.h" #include "sysemu.h" -#include "error.h" -#include "qapi/qapi-visit-core.h" +#include "qapi/error.h" +#include "qapi/visitor.h" int qdev_hotplug = 0; static bool qdev_hot_added = false; diff --git a/hw/vga_int.h b/hw/vga_int.h index ad02404b3c..5efaee81d9 100644 --- a/hw/vga_int.h +++ b/hw/vga_int.h @@ -25,7 +25,7 @@ #define HW_VGA_INT_H 1 #include -#include "error.h" +#include "qapi/error.h" #include "memory.h" #define ST01_V_RETRACE 0x08 diff --git a/hw/watchdog.c b/hw/watchdog.c index 5c82c17d09..f878bec860 100644 --- a/hw/watchdog.c +++ b/hw/watchdog.c @@ -23,7 +23,7 @@ #include "qemu-option.h" #include "qemu-config.h" #include "qemu-queue.h" -#include "qemu-objects.h" +#include "qapi/qmp/types.h" #include "monitor.h" #include "sysemu.h" #include "hw/watchdog.h" diff --git a/include/net/net.h b/include/net/net.h index 9ff9305d7a..26dd0cf29c 100644 --- a/include/net/net.h +++ b/include/net/net.h @@ -3,7 +3,7 @@ #include "qemu-queue.h" #include "qemu-common.h" -#include "qdict.h" +#include "qapi/qmp/qdict.h" #include "qemu-option.h" #include "net/queue.h" #include "vmstate.h" diff --git a/include/net/slirp.h b/include/net/slirp.h index 2ca09b65b7..ac9d44964f 100644 --- a/include/net/slirp.h +++ b/include/net/slirp.h @@ -25,7 +25,7 @@ #define QEMU_NET_SLIRP_H #include "qemu-common.h" -#include "qdict.h" +#include "qapi/qmp/qdict.h" #include "qemu-option.h" #include "qapi-types.h" diff --git a/qapi/qapi-dealloc-visitor.h b/include/qapi/dealloc-visitor.h similarity index 95% rename from qapi/qapi-dealloc-visitor.h rename to include/qapi/dealloc-visitor.h index 5842bc79bd..cf4c36d2d3 100644 --- a/qapi/qapi-dealloc-visitor.h +++ b/include/qapi/dealloc-visitor.h @@ -14,7 +14,7 @@ #ifndef QAPI_DEALLOC_VISITOR_H #define QAPI_DEALLOC_VISITOR_H -#include "qapi-visit-core.h" +#include "qapi/visitor.h" typedef struct QapiDeallocVisitor QapiDeallocVisitor; diff --git a/error.h b/include/qapi/error.h similarity index 100% rename from error.h rename to include/qapi/error.h diff --git a/qapi/opts-visitor.h b/include/qapi/opts-visitor.h similarity index 96% rename from qapi/opts-visitor.h rename to include/qapi/opts-visitor.h index ea1a395573..31fa4c5628 100644 --- a/qapi/opts-visitor.h +++ b/include/qapi/opts-visitor.h @@ -13,7 +13,7 @@ #ifndef OPTS_VISITOR_H #define OPTS_VISITOR_H -#include "qapi-visit-core.h" +#include "qapi/visitor.h" #include "qemu-option.h" typedef struct OptsVisitor OptsVisitor; diff --git a/qapi/qmp-input-visitor.h b/include/qapi/qmp-input-visitor.h similarity index 91% rename from qapi/qmp-input-visitor.h rename to include/qapi/qmp-input-visitor.h index e0a48a5f3b..3ed499cc42 100644 --- a/qapi/qmp-input-visitor.h +++ b/include/qapi/qmp-input-visitor.h @@ -14,8 +14,8 @@ #ifndef QMP_INPUT_VISITOR_H #define QMP_INPUT_VISITOR_H -#include "qapi-visit-core.h" -#include "qobject.h" +#include "qapi/visitor.h" +#include "qapi/qmp/qobject.h" typedef struct QmpInputVisitor QmpInputVisitor; diff --git a/qapi/qmp-output-visitor.h b/include/qapi/qmp-output-visitor.h similarity index 91% rename from qapi/qmp-output-visitor.h rename to include/qapi/qmp-output-visitor.h index 4a649c2504..22667706ab 100644 --- a/qapi/qmp-output-visitor.h +++ b/include/qapi/qmp-output-visitor.h @@ -14,8 +14,8 @@ #ifndef QMP_OUTPUT_VISITOR_H #define QMP_OUTPUT_VISITOR_H -#include "qapi-visit-core.h" -#include "qobject.h" +#include "qapi/visitor.h" +#include "qapi/qmp/qobject.h" typedef struct QmpOutputVisitor QmpOutputVisitor; diff --git a/qapi/qmp-core.h b/include/qapi/qmp/dispatch.h similarity index 93% rename from qapi/qmp-core.h rename to include/qapi/qmp/dispatch.h index 00446cff9b..1ce11f5df0 100644 --- a/qapi/qmp-core.h +++ b/include/qapi/qmp/dispatch.h @@ -14,9 +14,9 @@ #ifndef QMP_CORE_H #define QMP_CORE_H -#include "qobject.h" -#include "qdict.h" -#include "error.h" +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qdict.h" +#include "qapi/error.h" typedef void (QmpCommandFunc)(QDict *, QObject **, Error **); diff --git a/json-lexer.h b/include/qapi/qmp/json-lexer.h similarity index 94% rename from json-lexer.h rename to include/qapi/qmp/json-lexer.h index 10bc0a7798..cdff0460a8 100644 --- a/json-lexer.h +++ b/include/qapi/qmp/json-lexer.h @@ -14,8 +14,8 @@ #ifndef QEMU_JSON_LEXER_H #define QEMU_JSON_LEXER_H -#include "qstring.h" -#include "qlist.h" +#include "qapi/qmp/qstring.h" +#include "qapi/qmp/qlist.h" typedef enum json_token_type { JSON_OPERATOR = 100, diff --git a/json-parser.h b/include/qapi/qmp/json-parser.h similarity index 90% rename from json-parser.h rename to include/qapi/qmp/json-parser.h index 8f2b5ec4bc..44d88f3468 100644 --- a/json-parser.h +++ b/include/qapi/qmp/json-parser.h @@ -15,8 +15,8 @@ #define QEMU_JSON_PARSER_H #include "qemu-common.h" -#include "qlist.h" -#include "error.h" +#include "qapi/qmp/qlist.h" +#include "qapi/error.h" QObject *json_parser_parse(QList *tokens, va_list *ap); QObject *json_parser_parse_err(QList *tokens, va_list *ap, Error **errp); diff --git a/json-streamer.h b/include/qapi/qmp/json-streamer.h similarity index 93% rename from json-streamer.h rename to include/qapi/qmp/json-streamer.h index f09bc4daec..823f7d7fa4 100644 --- a/json-streamer.h +++ b/include/qapi/qmp/json-streamer.h @@ -14,8 +14,8 @@ #ifndef QEMU_JSON_STREAMER_H #define QEMU_JSON_STREAMER_H -#include "qlist.h" -#include "json-lexer.h" +#include "qapi/qmp/qlist.h" +#include "qapi/qmp/json-lexer.h" typedef struct JSONMessageParser { diff --git a/qbool.h b/include/qapi/qmp/qbool.h similarity index 94% rename from qbool.h rename to include/qapi/qmp/qbool.h index fe66fcd455..c4eaab9bb9 100644 --- a/qbool.h +++ b/include/qapi/qmp/qbool.h @@ -15,7 +15,7 @@ #define QBOOL_H #include -#include "qobject.h" +#include "qapi/qmp/qobject.h" typedef struct QBool { QObject_HEAD; diff --git a/qdict.h b/include/qapi/qmp/qdict.h similarity index 97% rename from qdict.h rename to include/qapi/qmp/qdict.h index 929d8d22f5..c815981d30 100644 --- a/qdict.h +++ b/include/qapi/qmp/qdict.h @@ -13,8 +13,8 @@ #ifndef QDICT_H #define QDICT_H -#include "qobject.h" -#include "qlist.h" +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qlist.h" #include "qemu-queue.h" #include diff --git a/qerror.h b/include/qapi/qmp/qerror.h similarity index 99% rename from qerror.h rename to include/qapi/qmp/qerror.h index 8db4309aef..d912297590 100644 --- a/qerror.h +++ b/include/qapi/qmp/qerror.h @@ -12,10 +12,10 @@ #ifndef QERROR_H #define QERROR_H -#include "qdict.h" -#include "qstring.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qstring.h" #include "qemu-error.h" -#include "error.h" +#include "qapi/error.h" #include "qapi-types.h" #include diff --git a/qfloat.h b/include/qapi/qmp/qfloat.h similarity index 94% rename from qfloat.h rename to include/qapi/qmp/qfloat.h index 9d6787659c..a8658443dc 100644 --- a/qfloat.h +++ b/include/qapi/qmp/qfloat.h @@ -15,7 +15,7 @@ #define QFLOAT_H #include -#include "qobject.h" +#include "qapi/qmp/qobject.h" typedef struct QFloat { QObject_HEAD; diff --git a/qint.h b/include/qapi/qmp/qint.h similarity index 94% rename from qint.h rename to include/qapi/qmp/qint.h index 6b1a15c088..48a41b0f2a 100644 --- a/qint.h +++ b/include/qapi/qmp/qint.h @@ -14,7 +14,7 @@ #define QINT_H #include -#include "qobject.h" +#include "qapi/qmp/qobject.h" typedef struct QInt { QObject_HEAD; diff --git a/qjson.h b/include/qapi/qmp/qjson.h similarity index 91% rename from qjson.h rename to include/qapi/qmp/qjson.h index 1190d8a86c..0473374bf2 100644 --- a/qjson.h +++ b/include/qapi/qmp/qjson.h @@ -16,8 +16,8 @@ #include #include "compiler.h" -#include "qobject.h" -#include "qstring.h" +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qstring.h" QObject *qobject_from_json(const char *string) GCC_FMT_ATTR(1, 0); QObject *qobject_from_jsonf(const char *string, ...) GCC_FMT_ATTR(1, 2); diff --git a/qlist.h b/include/qapi/qmp/qlist.h similarity index 98% rename from qlist.h rename to include/qapi/qmp/qlist.h index 74089471df..ffa0846d48 100644 --- a/qlist.h +++ b/include/qapi/qmp/qlist.h @@ -13,7 +13,7 @@ #ifndef QLIST_H #define QLIST_H -#include "qobject.h" +#include "qapi/qmp/qobject.h" #include "qemu-queue.h" #include "qemu-queue.h" diff --git a/qobject.h b/include/qapi/qmp/qobject.h similarity index 100% rename from qobject.h rename to include/qapi/qmp/qobject.h diff --git a/qstring.h b/include/qapi/qmp/qstring.h similarity index 96% rename from qstring.h rename to include/qapi/qmp/qstring.h index 84ccd96d61..0e690f4849 100644 --- a/qstring.h +++ b/include/qapi/qmp/qstring.h @@ -14,7 +14,7 @@ #define QSTRING_H #include -#include "qobject.h" +#include "qapi/qmp/qobject.h" typedef struct QString { QObject_HEAD; diff --git a/qemu-objects.h b/include/qapi/qmp/types.h similarity index 60% rename from qemu-objects.h rename to include/qapi/qmp/types.h index c53fbaa217..7782ec5a60 100644 --- a/qemu-objects.h +++ b/include/qapi/qmp/types.h @@ -13,13 +13,13 @@ #ifndef QEMU_OBJECTS_H #define QEMU_OBJECTS_H -#include "qobject.h" -#include "qint.h" -#include "qfloat.h" -#include "qbool.h" -#include "qstring.h" -#include "qdict.h" -#include "qlist.h" -#include "qjson.h" +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qfloat.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qstring.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qlist.h" +#include "qapi/qmp/qjson.h" #endif /* QEMU_OBJECTS_H */ diff --git a/qapi/string-input-visitor.h b/include/qapi/string-input-visitor.h similarity index 95% rename from qapi/string-input-visitor.h rename to include/qapi/string-input-visitor.h index d269d42cef..089243c09e 100644 --- a/qapi/string-input-visitor.h +++ b/include/qapi/string-input-visitor.h @@ -13,7 +13,7 @@ #ifndef STRING_INPUT_VISITOR_H #define STRING_INPUT_VISITOR_H -#include "qapi-visit-core.h" +#include "qapi/visitor.h" typedef struct StringInputVisitor StringInputVisitor; diff --git a/qapi/string-output-visitor.h b/include/qapi/string-output-visitor.h similarity index 95% rename from qapi/string-output-visitor.h rename to include/qapi/string-output-visitor.h index 8868454110..ec81e42b60 100644 --- a/qapi/string-output-visitor.h +++ b/include/qapi/string-output-visitor.h @@ -13,7 +13,7 @@ #ifndef STRING_OUTPUT_VISITOR_H #define STRING_OUTPUT_VISITOR_H -#include "qapi-visit-core.h" +#include "qapi/visitor.h" typedef struct StringOutputVisitor StringOutputVisitor; diff --git a/qapi/qapi-visit-impl.h b/include/qapi/visitor-impl.h similarity index 98% rename from qapi/qapi-visit-impl.h rename to include/qapi/visitor-impl.h index 9337d62e75..5159964863 100644 --- a/qapi/qapi-visit-impl.h +++ b/include/qapi/visitor-impl.h @@ -12,8 +12,8 @@ #ifndef QAPI_VISITOR_IMPL_H #define QAPI_VISITOR_IMPL_H -#include "error.h" -#include "qapi/qapi-visit-core.h" +#include "qapi/error.h" +#include "qapi/visitor.h" struct Visitor { diff --git a/qapi/qapi-visit-core.h b/include/qapi/visitor.h similarity index 99% rename from qapi/qapi-visit-core.h rename to include/qapi/visitor.h index 602debe753..1fef18c08f 100644 --- a/qapi/qapi-visit-core.h +++ b/include/qapi/visitor.h @@ -13,7 +13,7 @@ #ifndef QAPI_VISITOR_CORE_H #define QAPI_VISITOR_CORE_H -#include "error.h" +#include "qapi/error.h" #include typedef struct GenericList diff --git a/include/qemu/rng.h b/include/qemu/rng.h index d094bf8d4c..37912971e0 100644 --- a/include/qemu/rng.h +++ b/include/qemu/rng.h @@ -15,7 +15,7 @@ #include "qemu/object.h" #include "qemu-common.h" -#include "error.h" +#include "qapi/error.h" #define TYPE_RNG_BACKEND "rng-backend" #define RNG_BACKEND(obj) \ diff --git a/include/ui/console.h b/include/ui/console.h index 777881d4a3..eff5cc92d6 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -2,12 +2,12 @@ #define CONSOLE_H #include "ui/qemu-pixman.h" -#include "qdict.h" +#include "qapi/qmp/qdict.h" #include "notify.h" #include "monitor.h" #include "trace.h" #include "qapi-types.h" -#include "error.h" +#include "qapi/error.h" /* keyboard/mouse support */ diff --git a/json-lexer.c b/json-lexer.c index 3cd3285825..440df60392 100644 --- a/json-lexer.c +++ b/json-lexer.c @@ -11,12 +11,12 @@ * */ -#include "qstring.h" -#include "qlist.h" -#include "qdict.h" -#include "qint.h" +#include "qapi/qmp/qstring.h" +#include "qapi/qmp/qlist.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qint.h" #include "qemu-common.h" -#include "json-lexer.h" +#include "qapi/qmp/json-lexer.h" #define MAX_TOKEN_SIZE (64ULL << 20) diff --git a/json-parser.c b/json-parser.c index 457291b161..05279c11eb 100644 --- a/json-parser.c +++ b/json-parser.c @@ -14,15 +14,15 @@ #include #include "qemu-common.h" -#include "qstring.h" -#include "qint.h" -#include "qdict.h" -#include "qlist.h" -#include "qfloat.h" -#include "qbool.h" -#include "json-parser.h" -#include "json-lexer.h" -#include "qerror.h" +#include "qapi/qmp/qstring.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qlist.h" +#include "qapi/qmp/qfloat.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/json-parser.h" +#include "qapi/qmp/json-lexer.h" +#include "qapi/qmp/qerror.h" typedef struct JSONParserContext { diff --git a/json-streamer.c b/json-streamer.c index c255c7818f..1b2f9b1d10 100644 --- a/json-streamer.c +++ b/json-streamer.c @@ -11,12 +11,12 @@ * */ -#include "qlist.h" -#include "qint.h" -#include "qdict.h" +#include "qapi/qmp/qlist.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qdict.h" #include "qemu-common.h" -#include "json-lexer.h" -#include "json-streamer.h" +#include "qapi/qmp/json-lexer.h" +#include "qapi/qmp/json-streamer.h" #define MAX_TOKEN_SIZE (64ULL << 20) #define MAX_NESTING (1ULL << 10) diff --git a/migration.h b/migration.h index c3a23cc6c8..af444d444b 100644 --- a/migration.h +++ b/migration.h @@ -14,10 +14,10 @@ #ifndef QEMU_MIGRATION_H #define QEMU_MIGRATION_H -#include "qdict.h" +#include "qapi/qmp/qdict.h" #include "qemu-common.h" #include "notify.h" -#include "error.h" +#include "qapi/error.h" #include "vmstate.h" #include "qapi-types.h" diff --git a/monitor.c b/monitor.c index 6546f8c30b..7d5c8a622c 100644 --- a/monitor.c +++ b/monitor.c @@ -47,14 +47,14 @@ #include "migration.h" #include "kvm.h" #include "acl.h" -#include "qint.h" -#include "qfloat.h" -#include "qlist.h" -#include "qbool.h" -#include "qstring.h" -#include "qjson.h" -#include "json-streamer.h" -#include "json-parser.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qfloat.h" +#include "qapi/qmp/qlist.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qstring.h" +#include "qapi/qmp/qjson.h" +#include "qapi/qmp/json-streamer.h" +#include "qapi/qmp/json-parser.h" #include "osdep.h" #include "cpu.h" #include "trace.h" diff --git a/monitor.h b/monitor.h index 4595c217ed..7c29d9db34 100644 --- a/monitor.h +++ b/monitor.h @@ -2,8 +2,8 @@ #define MONITOR_H #include "qemu-common.h" -#include "qerror.h" -#include "qdict.h" +#include "qapi/qmp/qerror.h" +#include "qapi/qmp/qdict.h" #include "block.h" #include "readline.h" diff --git a/net/net.c b/net/net.c index a4395be140..ead7e96fe1 100644 --- a/net/net.c +++ b/net/net.c @@ -38,7 +38,7 @@ #include "iov.h" #include "qapi-visit.h" #include "qapi/opts-visitor.h" -#include "qapi/qapi-dealloc-visitor.h" +#include "qapi/dealloc-visitor.h" /* Net bridge is currently not supported for W32. */ #if !defined(_WIN32) diff --git a/pixman b/pixman index a5e5179b56..97336fad32 160000 --- a/pixman +++ b/pixman @@ -1 +1 @@ -Subproject commit a5e5179b5624c99c812e9bf6e7b907e355a811e8 +Subproject commit 97336fad32acf802003855cd8bd6477fa49a12e3 diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c index 6ccb8a1c33..f8149ce455 100644 --- a/qapi/opts-visitor.c +++ b/qapi/opts-visitor.c @@ -11,11 +11,11 @@ */ #include "qemu-common.h" -#include "qerror.h" -#include "opts-visitor.h" +#include "qapi/qmp/qerror.h" +#include "qapi/opts-visitor.h" #include "qemu-queue.h" #include "qemu-option-internal.h" -#include "qapi-visit-impl.h" +#include "qapi/visitor-impl.h" struct OptsVisitor diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c index 7c44042619..98f2a58efd 100644 --- a/qapi/qapi-dealloc-visitor.c +++ b/qapi/qapi-dealloc-visitor.c @@ -11,11 +11,11 @@ * */ -#include "qapi-dealloc-visitor.h" +#include "qapi/dealloc-visitor.h" #include "qemu-queue.h" #include "qemu-common.h" -#include "qemu-objects.h" -#include "qapi-visit-impl.h" +#include "qapi/qmp/types.h" +#include "qapi/visitor-impl.h" typedef struct StackEntry { diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c index 4649fb71b7..401ee6e597 100644 --- a/qapi/qapi-visit-core.c +++ b/qapi/qapi-visit-core.c @@ -12,9 +12,9 @@ */ #include "qemu-common.h" -#include "qerror.h" -#include "qapi/qapi-visit-core.h" -#include "qapi/qapi-visit-impl.h" +#include "qapi/qmp/qerror.h" +#include "qapi/visitor.h" +#include "qapi/visitor-impl.h" void visit_start_handle(Visitor *v, void **obj, const char *kind, const char *name, Error **errp) diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c index 4085994686..921de33bce 100644 --- a/qapi/qmp-dispatch.c +++ b/qapi/qmp-dispatch.c @@ -11,12 +11,12 @@ * */ -#include "qemu-objects.h" -#include "qapi/qmp-core.h" -#include "json-parser.h" +#include "qapi/qmp/types.h" +#include "qapi/qmp/dispatch.h" +#include "qapi/qmp/json-parser.h" #include "qapi-types.h" -#include "error.h" -#include "qerror.h" +#include "qapi/error.h" +#include "qapi/qmp/qerror.h" static QDict *qmp_dispatch_check_obj(const QObject *request, Error **errp) { diff --git a/qapi/qmp-input-visitor.c b/qapi/qmp-input-visitor.c index 107d8d361b..8087909036 100644 --- a/qapi/qmp-input-visitor.c +++ b/qapi/qmp-input-visitor.c @@ -11,12 +11,12 @@ * */ -#include "qmp-input-visitor.h" -#include "qapi/qapi-visit-impl.h" +#include "qapi/qmp-input-visitor.h" +#include "qapi/visitor-impl.h" #include "qemu-queue.h" #include "qemu-common.h" -#include "qemu-objects.h" -#include "qerror.h" +#include "qapi/qmp/types.h" +#include "qapi/qmp/qerror.h" #define QIV_STACK_SIZE 1024 diff --git a/qapi/qmp-output-visitor.c b/qapi/qmp-output-visitor.c index 2bce9d5db1..8015e3f88d 100644 --- a/qapi/qmp-output-visitor.c +++ b/qapi/qmp-output-visitor.c @@ -11,12 +11,12 @@ * */ -#include "qmp-output-visitor.h" -#include "qapi/qapi-visit-impl.h" +#include "qapi/qmp-output-visitor.h" +#include "qapi/visitor-impl.h" #include "qemu-queue.h" #include "qemu-common.h" -#include "qemu-objects.h" -#include "qerror.h" +#include "qapi/qmp/types.h" +#include "qapi/qmp/qerror.h" typedef struct QStackEntry { diff --git a/qapi/qmp-registry.c b/qapi/qmp-registry.c index c2c31b420d..70cdbca470 100644 --- a/qapi/qmp-registry.c +++ b/qapi/qmp-registry.c @@ -14,7 +14,7 @@ #include #include -#include "qapi/qmp-core.h" +#include "qapi/qmp/dispatch.h" static QTAILQ_HEAD(QmpCommandList, QmpCommand) qmp_commands = QTAILQ_HEAD_INITIALIZER(qmp_commands); diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c index 497eb9a60a..8f1bc41333 100644 --- a/qapi/string-input-visitor.c +++ b/qapi/string-input-visitor.c @@ -11,9 +11,9 @@ */ #include "qemu-common.h" -#include "string-input-visitor.h" -#include "qapi/qapi-visit-impl.h" -#include "qerror.h" +#include "qapi/string-input-visitor.h" +#include "qapi/visitor-impl.h" +#include "qapi/qmp/qerror.h" struct StringInputVisitor { diff --git a/qapi/string-output-visitor.c b/qapi/string-output-visitor.c index 34e525eadd..921653d425 100644 --- a/qapi/string-output-visitor.c +++ b/qapi/string-output-visitor.c @@ -11,9 +11,9 @@ */ #include "qemu-common.h" -#include "string-output-visitor.h" -#include "qapi/qapi-visit-impl.h" -#include "qerror.h" +#include "qapi/string-output-visitor.h" +#include "qapi/visitor-impl.h" +#include "qapi/qmp/qerror.h" struct StringOutputVisitor { diff --git a/qbool.c b/qbool.c index 590cd716ea..a3d2afa827 100644 --- a/qbool.c +++ b/qbool.c @@ -11,8 +11,8 @@ * */ -#include "qbool.h" -#include "qobject.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qobject.h" #include "qemu-common.h" static void qbool_destroy_obj(QObject *obj); diff --git a/qdict.c b/qdict.c index 4bf308b61c..fa7a62cff4 100644 --- a/qdict.c +++ b/qdict.c @@ -10,12 +10,12 @@ * See the COPYING.LIB file in the top-level directory. */ -#include "qint.h" -#include "qfloat.h" -#include "qdict.h" -#include "qbool.h" -#include "qstring.h" -#include "qobject.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qfloat.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qstring.h" +#include "qapi/qmp/qobject.h" #include "qemu-queue.h" #include "qemu-common.h" diff --git a/qemu-char.h b/qemu-char.h index a121e04cdc..3e230a1319 100644 --- a/qemu-char.h +++ b/qemu-char.h @@ -6,8 +6,8 @@ #include "qemu-option.h" #include "qemu-config.h" #include "qemu-aio.h" -#include "qobject.h" -#include "qstring.h" +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qstring.h" #include "main-loop.h" /* character device */ diff --git a/qemu-config.c b/qemu-config.c index b4ce0d8034..ceec6bd155 100644 --- a/qemu-config.c +++ b/qemu-config.c @@ -3,7 +3,7 @@ #include "qemu-option.h" #include "qemu-config.h" #include "hw/qdev.h" -#include "error.h" +#include "qapi/error.h" static QemuOptsList qemu_drive_opts = { .name = "drive", diff --git a/qemu-config.h b/qemu-config.h index eb50eca838..584491a29b 100644 --- a/qemu-config.h +++ b/qemu-config.h @@ -3,7 +3,7 @@ #include #include "qemu-option.h" -#include "error.h" +#include "qapi/error.h" #include "qemu-option.h" extern QemuOptsList qemu_fsdev_opts; diff --git a/qemu-img.c b/qemu-img.c index c989a52564..a13bc788cf 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -23,7 +23,7 @@ */ #include "qapi-visit.h" #include "qapi/qmp-output-visitor.h" -#include "qjson.h" +#include "qapi/qmp/qjson.h" #include "qemu-common.h" #include "qemu-option.h" #include "qemu-error.h" diff --git a/qemu-option.c b/qemu-option.c index 94557cfde7..ebd3537063 100644 --- a/qemu-option.c +++ b/qemu-option.c @@ -28,9 +28,9 @@ #include "qemu-common.h" #include "qemu-error.h" -#include "qemu-objects.h" -#include "error.h" -#include "qerror.h" +#include "qapi/qmp/types.h" +#include "qapi/error.h" +#include "qapi/qmp/qerror.h" #include "qemu-option-internal.h" /* diff --git a/qemu-option.h b/qemu-option.h index 002dd07ee5..ca0dc041dd 100644 --- a/qemu-option.h +++ b/qemu-option.h @@ -28,8 +28,8 @@ #include #include "qemu-queue.h" -#include "error.h" -#include "qdict.h" +#include "qapi/error.h" +#include "qapi/qmp/qdict.h" enum QEMUOptionParType { OPT_FLAG, diff --git a/qemu_socket.h b/qemu_socket.h index 02490ad06c..42899fe138 100644 --- a/qemu_socket.h +++ b/qemu_socket.h @@ -27,8 +27,8 @@ int inet_aton(const char *cp, struct in_addr *ia); #endif /* !_WIN32 */ #include "qemu-option.h" -#include "error.h" -#include "qerror.h" +#include "qapi/error.h" +#include "qapi/qmp/qerror.h" /* misc helpers */ int qemu_socket(int domain, int type, int protocol); diff --git a/qerror.c b/qerror.c index 08185047b4..8c78104277 100644 --- a/qerror.c +++ b/qerror.c @@ -11,8 +11,8 @@ */ #include "monitor.h" -#include "qjson.h" -#include "qerror.h" +#include "qapi/qmp/qjson.h" +#include "qapi/qmp/qerror.h" #include "qemu-common.h" static void qerror_destroy_obj(QObject *obj); diff --git a/qfloat.c b/qfloat.c index 98338f3b71..7de0992dba 100644 --- a/qfloat.c +++ b/qfloat.c @@ -11,8 +11,8 @@ * */ -#include "qfloat.h" -#include "qobject.h" +#include "qapi/qmp/qfloat.h" +#include "qapi/qmp/qobject.h" #include "qemu-common.h" static void qfloat_destroy_obj(QObject *obj); diff --git a/qga/commands-posix.c b/qga/commands-posix.c index 726930a909..cedf2ccf28 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -17,7 +17,7 @@ #include #include "qga/guest-agent-core.h" #include "qga-qmp-commands.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" #include "qemu-queue.h" #include "host-utils.h" diff --git a/qga/commands-win32.c b/qga/commands-win32.c index 5bd8fb27f2..7e8ecb3b40 100644 --- a/qga/commands-win32.c +++ b/qga/commands-win32.c @@ -16,7 +16,7 @@ #include #include "qga/guest-agent-core.h" #include "qga-qmp-commands.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" #ifndef SHTDN_REASON_FLAG_PLANNED #define SHTDN_REASON_FLAG_PLANNED 0x80000000 diff --git a/qga/commands.c b/qga/commands.c index 46b0b083bc..7ffb35e4af 100644 --- a/qga/commands.c +++ b/qga/commands.c @@ -13,7 +13,7 @@ #include #include "qga/guest-agent-core.h" #include "qga-qmp-commands.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" /* Note: in some situations, like with the fsfreeze, logging may be * temporarilly disabled. if it is necessary that a command be able diff --git a/qga/guest-agent-core.h b/qga/guest-agent-core.h index 49a7abee95..8934163375 100644 --- a/qga/guest-agent-core.h +++ b/qga/guest-agent-core.h @@ -10,7 +10,7 @@ * This work is licensed under the terms of the GNU GPL, version 2 or later. * See the COPYING file in the top-level directory. */ -#include "qapi/qmp-core.h" +#include "qapi/qmp/dispatch.h" #include "qemu-common.h" #define QGA_READ_COUNT_DEFAULT 4096 diff --git a/qga/main.c b/qga/main.c index 9b59a52461..ead58cc11f 100644 --- a/qga/main.c +++ b/qga/main.c @@ -20,15 +20,15 @@ #include #include #endif -#include "json-streamer.h" -#include "json-parser.h" -#include "qint.h" -#include "qjson.h" +#include "qapi/qmp/json-streamer.h" +#include "qapi/qmp/json-parser.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qjson.h" #include "qga/guest-agent-core.h" #include "module.h" #include "signal.h" -#include "qerror.h" -#include "qapi/qmp-core.h" +#include "qapi/qmp/qerror.h" +#include "qapi/qmp/dispatch.h" #include "qga/channel.h" #ifdef _WIN32 #include "qga/service-win32.h" diff --git a/qint.c b/qint.c index ee51804fbe..86b9b04f0b 100644 --- a/qint.c +++ b/qint.c @@ -10,8 +10,8 @@ * See the COPYING.LIB file in the top-level directory. */ -#include "qint.h" -#include "qobject.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qobject.h" #include "qemu-common.h" static void qint_destroy_obj(QObject *obj); diff --git a/qjson.c b/qjson.c index f9c8e77516..83a6b4f7c1 100644 --- a/qjson.c +++ b/qjson.c @@ -11,15 +11,15 @@ * */ -#include "json-lexer.h" -#include "json-parser.h" -#include "json-streamer.h" -#include "qjson.h" -#include "qint.h" -#include "qlist.h" -#include "qbool.h" -#include "qfloat.h" -#include "qdict.h" +#include "qapi/qmp/json-lexer.h" +#include "qapi/qmp/json-parser.h" +#include "qapi/qmp/json-streamer.h" +#include "qapi/qmp/qjson.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qlist.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qfloat.h" +#include "qapi/qmp/qdict.h" typedef struct JSONParsingState { diff --git a/qlist.c b/qlist.c index b48ec5b914..c5ac2115af 100644 --- a/qlist.c +++ b/qlist.c @@ -10,8 +10,8 @@ * See the COPYING.LIB file in the top-level directory. */ -#include "qlist.h" -#include "qobject.h" +#include "qapi/qmp/qlist.h" +#include "qapi/qmp/qobject.h" #include "qemu-queue.h" #include "qemu-common.h" diff --git a/qom/object.c b/qom/object.c index 8d3036dcf4..932f8b30de 100644 --- a/qom/object.c +++ b/qom/object.c @@ -12,18 +12,18 @@ #include "qemu/object.h" #include "qemu-common.h" -#include "qapi/qapi-visit-core.h" +#include "qapi/visitor.h" #include "qapi/string-input-visitor.h" #include "qapi/string-output-visitor.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" /* TODO: replace QObject with a simpler visitor to avoid a dependency * of the QOM core on QObject? */ #include "qemu/qom-qobject.h" -#include "qobject.h" -#include "qbool.h" -#include "qint.h" -#include "qstring.h" +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qstring.h" #define MAX_INTERFACES 32 diff --git a/qom/qom-qobject.c b/qom/qom-qobject.c index 0689914e15..f0fa652157 100644 --- a/qom/qom-qobject.c +++ b/qom/qom-qobject.c @@ -12,7 +12,7 @@ #include "qemu-common.h" #include "qemu/object.h" #include "qemu/qom-qobject.h" -#include "qapi/qapi-visit-core.h" +#include "qapi/visitor.h" #include "qapi/qmp-input-visitor.h" #include "qapi/qmp-output-visitor.h" diff --git a/qstring.c b/qstring.c index b7e12e4015..5f7376c336 100644 --- a/qstring.c +++ b/qstring.c @@ -10,8 +10,8 @@ * See the COPYING.LIB file in the top-level directory. */ -#include "qobject.h" -#include "qstring.h" +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qstring.h" #include "qemu-common.h" static void qstring_destroy_obj(QObject *obj); diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index 5d034c2c21..eccc28daee 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -342,8 +342,8 @@ def gen_command_decl_prologue(header, guard, prefix=""): #define %(guard)s #include "%(prefix)sqapi-types.h" -#include "qdict.h" -#include "error.h" +#include "qapi/qmp/qdict.h" +#include "qapi/error.h" ''', header=basename(header), guard=guardname(header), prefix=prefix) @@ -368,13 +368,13 @@ def gen_command_def_prologue(prefix="", proxy=False): #include "qemu-common.h" #include "module.h" -#include "qerror.h" -#include "qemu-objects.h" -#include "qapi/qmp-core.h" -#include "qapi/qapi-visit-core.h" +#include "qapi/qmp/qerror.h" +#include "qapi/qmp/types.h" +#include "qapi/qmp/dispatch.h" +#include "qapi/visitor.h" #include "qapi/qmp-output-visitor.h" #include "qapi/qmp-input-visitor.h" -#include "qapi/qapi-dealloc-visitor.h" +#include "qapi/dealloc-visitor.h" #include "%(prefix)sqapi-types.h" #include "%(prefix)sqapi-visit.h" diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py index 6bc2391874..9e19920970 100644 --- a/scripts/qapi-types.py +++ b/scripts/qapi-types.py @@ -248,7 +248,7 @@ fdef.write(mcgen(''' * */ -#include "qapi/qapi-dealloc-visitor.h" +#include "qapi/dealloc-visitor.h" #include "%(prefix)sqapi-types.h" #include "%(prefix)sqapi-visit.h" diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py index f1aabb3813..a276540a18 100644 --- a/scripts/qapi-visit.py +++ b/scripts/qapi-visit.py @@ -322,7 +322,7 @@ fdecl.write(mcgen(''' #ifndef %(guard)s #define %(guard)s -#include "qapi/qapi-visit-core.h" +#include "qapi/visitor.h" #include "%(prefix)sqapi-types.h" ''', prefix=prefix, guard=guardname(h_file))) diff --git a/stubs/arch-query-cpu-def.c b/stubs/arch-query-cpu-def.c index 47b524628d..6eca8527d2 100644 --- a/stubs/arch-query-cpu-def.c +++ b/stubs/arch-query-cpu-def.c @@ -1,6 +1,6 @@ #include "qemu-common.h" #include "arch_init.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp) { diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h index 5901140480..3a7bc6aef4 100644 --- a/target-i386/cpu-qom.h +++ b/target-i386/cpu-qom.h @@ -22,7 +22,7 @@ #include "qemu/cpu.h" #include "cpu.h" -#include "error.h" +#include "qapi/error.h" #ifdef TARGET_X86_64 #define TYPE_X86_CPU "x86_64-cpu" diff --git a/target-i386/cpu.c b/target-i386/cpu.c index e968006ed0..150c4dfb0c 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -26,9 +26,9 @@ #include "qemu-option.h" #include "qemu-config.h" -#include "qerror.h" +#include "qapi/qmp/qerror.h" -#include "qapi/qapi-visit-core.h" +#include "qapi/visitor.h" #include "arch_init.h" #include "hyperv.h" diff --git a/target-openrisc/cpu.h b/target-openrisc/cpu.h index ebb5ad3124..c7b1750153 100644 --- a/target-openrisc/cpu.h +++ b/target-openrisc/cpu.h @@ -33,7 +33,7 @@ struct OpenRISCCPU; #include "cpu-defs.h" #include "softfloat.h" #include "qemu/cpu.h" -#include "error.h" +#include "qapi/error.h" #define TYPE_OPENRISC_CPU "or32-cpu" diff --git a/tests/check-qdict.c b/tests/check-qdict.c index fc0d276538..dc5f05a85f 100644 --- a/tests/check-qdict.c +++ b/tests/check-qdict.c @@ -11,9 +11,9 @@ */ #include -#include "qint.h" -#include "qdict.h" -#include "qstring.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qstring.h" #include "qemu-common.h" /* diff --git a/tests/check-qfloat.c b/tests/check-qfloat.c index cdc66ea10b..6404ac8df6 100644 --- a/tests/check-qfloat.c +++ b/tests/check-qfloat.c @@ -12,7 +12,7 @@ */ #include -#include "qfloat.h" +#include "qapi/qmp/qfloat.h" #include "qemu-common.h" /* diff --git a/tests/check-qint.c b/tests/check-qint.c index 5a27119ae2..86868844ab 100644 --- a/tests/check-qint.c +++ b/tests/check-qint.c @@ -11,7 +11,7 @@ */ #include -#include "qint.h" +#include "qapi/qmp/qint.h" #include "qemu-common.h" /* diff --git a/tests/check-qjson.c b/tests/check-qjson.c index 3b896f5f9c..32ffb436df 100644 --- a/tests/check-qjson.c +++ b/tests/check-qjson.c @@ -10,13 +10,13 @@ */ #include -#include "qstring.h" -#include "qint.h" -#include "qdict.h" -#include "qlist.h" -#include "qfloat.h" -#include "qbool.h" -#include "qjson.h" +#include "qapi/qmp/qstring.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qlist.h" +#include "qapi/qmp/qfloat.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qjson.h" #include "qemu-common.h" diff --git a/tests/check-qlist.c b/tests/check-qlist.c index 501ba262da..b9c05d43fd 100644 --- a/tests/check-qlist.c +++ b/tests/check-qlist.c @@ -11,8 +11,8 @@ */ #include -#include "qint.h" -#include "qlist.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qlist.h" /* * Public Interface test-cases diff --git a/tests/check-qstring.c b/tests/check-qstring.c index addad6c673..95dc9e3e7b 100644 --- a/tests/check-qstring.c +++ b/tests/check-qstring.c @@ -11,7 +11,7 @@ */ #include -#include "qstring.h" +#include "qapi/qmp/qstring.h" #include "qemu-common.h" /* diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c index bf41034c62..61b533a071 100644 --- a/tests/test-qmp-commands.c +++ b/tests/test-qmp-commands.c @@ -1,8 +1,8 @@ #include #include "qemu-common.h" -#include "qemu-objects.h" +#include "qapi/qmp/types.h" #include "test-qmp-commands.h" -#include "qapi/qmp-core.h" +#include "qapi/qmp/dispatch.h" #include "module.h" #include "qapi/qmp-input-visitor.h" #include "tests/test-qapi-types.h" diff --git a/tests/test-qmp-input-strict.c b/tests/test-qmp-input-strict.c index 86f24d821c..6f68963a3d 100644 --- a/tests/test-qmp-input-strict.c +++ b/tests/test-qmp-input-strict.c @@ -18,7 +18,7 @@ #include "qapi/qmp-input-visitor.h" #include "test-qapi-types.h" #include "test-qapi-visit.h" -#include "qemu-objects.h" +#include "qapi/qmp/types.h" typedef struct TestInputVisitorData { QObject *obj; diff --git a/tests/test-qmp-input-visitor.c b/tests/test-qmp-input-visitor.c index 6568c9907c..955a4c0b0a 100644 --- a/tests/test-qmp-input-visitor.c +++ b/tests/test-qmp-input-visitor.c @@ -17,7 +17,7 @@ #include "qapi/qmp-input-visitor.h" #include "test-qapi-types.h" #include "test-qapi-visit.h" -#include "qemu-objects.h" +#include "qapi/qmp/types.h" typedef struct TestInputVisitorData { QObject *obj; diff --git a/tests/test-qmp-output-visitor.c b/tests/test-qmp-output-visitor.c index 84b1f41894..71367e6efa 100644 --- a/tests/test-qmp-output-visitor.c +++ b/tests/test-qmp-output-visitor.c @@ -16,7 +16,7 @@ #include "qapi/qmp-output-visitor.h" #include "test-qapi-types.h" #include "test-qapi-visit.h" -#include "qemu-objects.h" +#include "qapi/qmp/types.h" typedef struct TestOutputVisitorData { QmpOutputVisitor *qov; diff --git a/tests/test-string-input-visitor.c b/tests/test-string-input-visitor.c index 36b3792980..899feda579 100644 --- a/tests/test-string-input-visitor.c +++ b/tests/test-string-input-visitor.c @@ -17,7 +17,7 @@ #include "qapi/string-input-visitor.h" #include "test-qapi-types.h" #include "test-qapi-visit.h" -#include "qemu-objects.h" +#include "qapi/qmp/types.h" typedef struct TestInputVisitorData { StringInputVisitor *siv; diff --git a/tests/test-string-output-visitor.c b/tests/test-string-output-visitor.c index afb557a00f..79d815f888 100644 --- a/tests/test-string-output-visitor.c +++ b/tests/test-string-output-visitor.c @@ -16,7 +16,7 @@ #include "qapi/string-output-visitor.h" #include "test-qapi-types.h" #include "test-qapi-visit.h" -#include "qemu-objects.h" +#include "qapi/qmp/types.h" typedef struct TestOutputVisitorData { StringOutputVisitor *sov; diff --git a/tests/test-visitor-serialization.c b/tests/test-visitor-serialization.c index a251f878e1..3c6b8df607 100644 --- a/tests/test-visitor-serialization.c +++ b/tests/test-visitor-serialization.c @@ -18,7 +18,7 @@ #include "qemu-common.h" #include "test-qapi-types.h" #include "test-qapi-visit.h" -#include "qemu-objects.h" +#include "qapi/qmp/types.h" #include "qapi/qmp-input-visitor.h" #include "qapi/qmp-output-visitor.h" #include "qapi/string-input-visitor.h" diff --git a/ui/input.c b/ui/input.c index 58d3b4709c..65950af9af 100644 --- a/ui/input.c +++ b/ui/input.c @@ -25,7 +25,7 @@ #include "sysemu.h" #include "monitor.h" #include "ui/console.h" -#include "error.h" +#include "qapi/error.h" #include "qmp-commands.h" #include "qapi-types.h" diff --git a/ui/spice-core.c b/ui/spice-core.c index ec925ecbb0..0550805b38 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -29,10 +29,10 @@ #include "qemu-x509.h" #include "qemu_socket.h" #include "qmp-commands.h" -#include "qint.h" -#include "qbool.h" -#include "qstring.h" -#include "qjson.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qstring.h" +#include "qapi/qmp/qjson.h" #include "notify.h" #include "migration.h" #include "monitor.h" diff --git a/ui/vnc-enc-tight.c b/ui/vnc-enc-tight.c index 62d0fde77f..09199ef584 100644 --- a/ui/vnc-enc-tight.c +++ b/ui/vnc-enc-tight.c @@ -45,7 +45,7 @@ #endif #include "bswap.h" -#include "qint.h" +#include "qapi/qmp/qint.h" #include "vnc.h" #include "vnc-enc-tight.h" #include "vnc-palette.h" diff --git a/ui/vnc-palette.h b/ui/vnc-palette.h index b82dc5db91..bfc7fe642e 100644 --- a/ui/vnc-palette.h +++ b/ui/vnc-palette.h @@ -29,7 +29,7 @@ #ifndef VNC_PALETTE_H #define VNC_PALETTE_H -#include "qlist.h" +#include "qapi/qmp/qlist.h" #include "qemu-queue.h" #include #include diff --git a/ui/vnc.c b/ui/vnc.c index 04afcffc52..dad2ddee29 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -30,7 +30,7 @@ #include "qemu_socket.h" #include "qemu-timer.h" #include "acl.h" -#include "qemu-objects.h" +#include "qapi/qmp/types.h" #include "qmp-commands.h" #include "osdep.h" diff --git a/vl.c b/vl.c index 6713220905..975767a44b 100644 --- a/vl.c +++ b/vl.c @@ -143,7 +143,7 @@ int main(int argc, char **argv) #include "audio/audio.h" #include "migration.h" #include "kvm.h" -#include "qjson.h" +#include "qapi/qmp/qjson.h" #include "qemu-option.h" #include "qemu-config.h" #include "qemu-options.h" From 737e150e89c44c6b33691a627e24bac7fb58f349 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 17 Dec 2012 18:19:44 +0100 Subject: [PATCH 250/300] block: move include files to include/block/ Signed-off-by: Paolo Bonzini --- aes.c | 2 +- aio-posix.c | 2 +- aio-win32.c | 2 +- async.c | 2 +- block-migration.c | 2 +- block.c | 6 +++--- block/blkdebug.c | 2 +- block/blkverify.c | 2 +- block/bochs.c | 2 +- block/cloop.c | 2 +- block/commit.c | 4 ++-- block/cow.c | 2 +- block/curl.c | 2 +- block/dmg.c | 2 +- block/gluster.c | 2 +- block/iscsi.c | 2 +- block/linux-aio.c | 2 +- block/mirror.c | 4 ++-- block/nbd.c | 4 ++-- block/parallels.c | 2 +- block/qcow.c | 4 ++-- block/qcow2-cache.c | 2 +- block/qcow2-cluster.c | 2 +- block/qcow2-refcount.c | 2 +- block/qcow2-snapshot.c | 2 +- block/qcow2.c | 4 ++-- block/qcow2.h | 4 ++-- block/qed.h | 2 +- block/raw-posix.c | 4 ++-- block/raw-win32.c | 4 ++-- block/raw.c | 2 +- block/rbd.c | 2 +- block/sheepdog.c | 2 +- block/stream.c | 4 ++-- block/vdi.c | 2 +- block/vmdk.c | 2 +- block/vpc.c | 2 +- block/vvfat.c | 2 +- block/win32-aio.c | 4 ++-- blockdev-nbd.c | 2 +- blockdev.c | 4 ++-- blockdev.h | 2 +- blockjob.c | 8 ++++---- cmd.c | 2 +- coroutine-gthread.c | 2 +- coroutine-sigaltstack.c | 2 +- coroutine-ucontext.c | 2 +- coroutine-win32.c | 2 +- dma.h | 2 +- hw/9pfs/codir.c | 2 +- hw/9pfs/cofile.c | 2 +- hw/9pfs/cofs.c | 2 +- hw/9pfs/coxattr.c | 2 +- hw/9pfs/virtio-9p-coth.c | 2 +- hw/9pfs/virtio-9p-coth.h | 2 +- hw/9pfs/virtio-9p.h | 2 +- hw/hd-geometry.c | 2 +- hw/hw.h | 2 +- hw/ide/cmd646.c | 2 +- hw/ide/ich.c | 2 +- hw/ide/isa.c | 2 +- hw/ide/macio.c | 2 +- hw/ide/microdrive.c | 2 +- hw/ide/mmio.c | 2 +- hw/ide/pci.c | 2 +- hw/ide/via.c | 2 +- hw/mips_fulong2e.c | 2 +- hw/mips_malta.c | 2 +- hw/musicpal.c | 2 +- hw/pflash_cfi01.c | 2 +- hw/pflash_cfi02.c | 2 +- hw/ppc405_boards.c | 2 +- hw/s390-virtio-bus.c | 2 +- hw/s390-virtio.c | 2 +- hw/scsi.h | 2 +- hw/sd.c | 2 +- hw/spitz.c | 2 +- hw/tosa.c | 2 +- aes.h => include/block/aes.h | 0 qemu-aio.h => include/block/aio.h | 0 block.h => include/block/block.h | 4 ++-- block_int.h => include/block/block_int.h | 4 ++-- blockjob.h => include/block/blockjob.h | 2 +- qemu-coroutine.h => include/block/coroutine.h | 0 qemu-coroutine-int.h => include/block/coroutine_int.h | 2 +- nbd.h => include/block/nbd.h | 0 thread-pool.h => include/block/thread-pool.h | 4 ++-- iohandler.c | 2 +- main-loop.c | 2 +- main-loop.h | 2 +- migration-exec.c | 2 +- migration-fd.c | 2 +- migration-tcp.c | 2 +- migration-unix.c | 2 +- migration.c | 2 +- monitor.h | 2 +- nbd.c | 6 +++--- qemu-char.h | 2 +- qemu-coroutine-io.c | 2 +- qemu-coroutine-lock.c | 6 +++--- qemu-coroutine-sleep.c | 2 +- qemu-coroutine.c | 4 ++-- qemu-img.c | 2 +- qemu-io.c | 2 +- qemu-nbd.c | 4 ++-- tests/test-aio.c | 2 +- tests/test-coroutine.c | 2 +- tests/test-thread-pool.c | 6 +++--- thread-pool.c | 6 +++--- 109 files changed, 134 insertions(+), 134 deletions(-) rename aes.h => include/block/aes.h (100%) rename qemu-aio.h => include/block/aio.h (100%) rename block.h => include/block/block.h (99%) rename block_int.h => include/block/block_int.h (99%) rename blockjob.h => include/block/blockjob.h (99%) rename qemu-coroutine.h => include/block/coroutine.h (100%) rename qemu-coroutine-int.h => include/block/coroutine_int.h (98%) rename nbd.h => include/block/nbd.h (100%) rename thread-pool.h => include/block/thread-pool.h (93%) diff --git a/aes.c b/aes.c index eb37adbed8..1da7bff1c9 100644 --- a/aes.c +++ b/aes.c @@ -28,7 +28,7 @@ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "qemu-common.h" -#include "aes.h" +#include "block/aes.h" #ifndef NDEBUG #define NDEBUG diff --git a/aio-posix.c b/aio-posix.c index 05cc84e121..d1e1bc2c75 100644 --- a/aio-posix.c +++ b/aio-posix.c @@ -14,7 +14,7 @@ */ #include "qemu-common.h" -#include "block.h" +#include "block/block.h" #include "qemu-queue.h" #include "qemu_socket.h" diff --git a/aio-win32.c b/aio-win32.c index cec4646635..9a26f9c3d9 100644 --- a/aio-win32.c +++ b/aio-win32.c @@ -16,7 +16,7 @@ */ #include "qemu-common.h" -#include "block.h" +#include "block/block.h" #include "qemu-queue.h" #include "qemu_socket.h" diff --git a/async.c b/async.c index 41ae0c1195..6df4caf68a 100644 --- a/async.c +++ b/async.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" -#include "qemu-aio.h" +#include "block/aio.h" #include "main-loop.h" /***********************************************************/ diff --git a/block-migration.c b/block-migration.c index 71b9601e00..c15de9f750 100644 --- a/block-migration.c +++ b/block-migration.c @@ -14,7 +14,7 @@ */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "hw/hw.h" #include "qemu-queue.h" #include "qemu-timer.h" diff --git a/block.c b/block.c index e962a5afe9..5eab9e2519 100644 --- a/block.c +++ b/block.c @@ -25,13 +25,13 @@ #include "qemu-common.h" #include "trace.h" #include "monitor.h" -#include "block_int.h" -#include "blockjob.h" +#include "block/block_int.h" +#include "block/blockjob.h" #include "module.h" #include "qapi/qmp/qjson.h" #include "sysemu.h" #include "notify.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include "qmp-commands.h" #include "qemu-timer.h" diff --git a/block/blkdebug.c b/block/blkdebug.c index 65556e73e5..cd2866e7bd 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -24,7 +24,7 @@ #include "qemu-common.h" #include "qemu-config.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" typedef struct BDRVBlkdebugState { diff --git a/block/blkverify.c b/block/blkverify.c index 4beede77ab..cde5098e5a 100644 --- a/block/blkverify.c +++ b/block/blkverify.c @@ -9,7 +9,7 @@ #include #include "qemu_socket.h" /* for EINPROGRESS on Windows */ -#include "block_int.h" +#include "block/block_int.h" typedef struct { BlockDriverState *test_file; diff --git a/block/bochs.c b/block/bochs.c index ab7944dc43..2cc7524782 100644 --- a/block/bochs.c +++ b/block/bochs.c @@ -23,7 +23,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" /**************************************************************/ diff --git a/block/cloop.c b/block/cloop.c index 7570eb8e74..da29ff379c 100644 --- a/block/cloop.c +++ b/block/cloop.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" #include diff --git a/block/commit.c b/block/commit.c index e2bb1e241b..61ebdba54f 100644 --- a/block/commit.c +++ b/block/commit.c @@ -13,8 +13,8 @@ */ #include "trace.h" -#include "block_int.h" -#include "blockjob.h" +#include "block/block_int.h" +#include "block/blockjob.h" #include "qemu/ratelimit.h" enum { diff --git a/block/cow.c b/block/cow.c index a5a00eb9ca..1438ae1e3b 100644 --- a/block/cow.c +++ b/block/cow.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" /**************************************************************/ diff --git a/block/curl.c b/block/curl.c index 1179484de0..47df9524ea 100644 --- a/block/curl.c +++ b/block/curl.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include // #define DEBUG diff --git a/block/dmg.c b/block/dmg.c index 37902a4347..6ee505a9f5 100644 --- a/block/dmg.c +++ b/block/dmg.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "bswap.h" #include "module.h" #include diff --git a/block/gluster.c b/block/gluster.c index 1c90174b13..4cb4e60227 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -16,7 +16,7 @@ * GNU GPL, version 2 or (at your option) any later version. */ #include -#include "block_int.h" +#include "block/block_int.h" #include "qemu_socket.h" #include "uri.h" diff --git a/block/iscsi.c b/block/iscsi.c index 33b93d8000..77e619a1fd 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -29,7 +29,7 @@ #include "qemu-common.h" #include "qemu-config.h" #include "qemu-error.h" -#include "block_int.h" +#include "block/block_int.h" #include "trace.h" #include "hw/scsi-defs.h" diff --git a/block/linux-aio.c b/block/linux-aio.c index 91ef863241..28e5a04e12 100644 --- a/block/linux-aio.c +++ b/block/linux-aio.c @@ -8,7 +8,7 @@ * See the COPYING file in the top-level directory. */ #include "qemu-common.h" -#include "qemu-aio.h" +#include "block/aio.h" #include "qemu-queue.h" #include "block/raw-aio.h" #include "event_notifier.h" diff --git a/block/mirror.c b/block/mirror.c index b1f5d4fa22..8aeacbf12c 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -12,8 +12,8 @@ */ #include "trace.h" -#include "blockjob.h" -#include "block_int.h" +#include "block/blockjob.h" +#include "block/block_int.h" #include "qemu/ratelimit.h" enum { diff --git a/block/nbd.c b/block/nbd.c index e87c248175..38d6b90ab2 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -27,9 +27,9 @@ */ #include "qemu-common.h" -#include "nbd.h" +#include "block/nbd.h" #include "uri.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" #include "qemu_socket.h" diff --git a/block/parallels.c b/block/parallels.c index d30f0ecf77..ae88cd6359 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -24,7 +24,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" /**************************************************************/ diff --git a/block/qcow.c b/block/qcow.c index b239c82ae0..d13bd400f0 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -22,10 +22,10 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" #include -#include "aes.h" +#include "block/aes.h" #include "migration.h" /**************************************************************/ diff --git a/block/qcow2-cache.c b/block/qcow2-cache.c index 2d4322a8dd..2f3114ecc2 100644 --- a/block/qcow2-cache.c +++ b/block/qcow2-cache.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -#include "block_int.h" +#include "block/block_int.h" #include "qemu-common.h" #include "qcow2.h" #include "trace.h" diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index 468ef1be56..56fccf9487 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -25,7 +25,7 @@ #include #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "block/qcow2.h" #include "trace.h" diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c index 96224d1af2..6a95aa6c92 100644 --- a/block/qcow2-refcount.c +++ b/block/qcow2-refcount.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "block/qcow2.h" static int64_t alloc_clusters_noref(BlockDriverState *bs, int64_t size); diff --git a/block/qcow2-snapshot.c b/block/qcow2-snapshot.c index 4e7c93b8b3..eb8fcd5549 100644 --- a/block/qcow2-snapshot.c +++ b/block/qcow2-snapshot.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "block/qcow2.h" typedef struct QEMU_PACKED QCowSnapshotHeader { diff --git a/block/qcow2.c b/block/qcow2.c index 217b4e422f..205d910a52 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -22,10 +22,10 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" #include -#include "aes.h" +#include "block/aes.h" #include "block/qcow2.h" #include "qemu-error.h" #include "qapi/qmp/qerror.h" diff --git a/block/qcow2.h b/block/qcow2.h index a60fcb429a..718b52baca 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -25,8 +25,8 @@ #ifndef BLOCK_QCOW2_H #define BLOCK_QCOW2_H -#include "aes.h" -#include "qemu-coroutine.h" +#include "block/aes.h" +#include "block/coroutine.h" //#define DEBUG_ALLOC //#define DEBUG_ALLOC2 diff --git a/block/qed.h b/block/qed.h index a063bf70af..2b4ddedf31 100644 --- a/block/qed.h +++ b/block/qed.h @@ -15,7 +15,7 @@ #ifndef BLOCK_QED_H #define BLOCK_QED_H -#include "block_int.h" +#include "block/block_int.h" /* The layout of a QED file is as follows: * diff --git a/block/raw-posix.c b/block/raw-posix.c index 48eff2fd83..4e73885269 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -24,10 +24,10 @@ #include "qemu-common.h" #include "qemu-timer.h" #include "qemu-log.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" #include "trace.h" -#include "thread-pool.h" +#include "block/thread-pool.h" #include "iov.h" #include "raw-aio.h" diff --git a/block/raw-win32.c b/block/raw-win32.c index ce207a3109..9269fe84c0 100644 --- a/block/raw-win32.c +++ b/block/raw-win32.c @@ -23,11 +23,11 @@ */ #include "qemu-common.h" #include "qemu-timer.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" #include "raw-aio.h" #include "trace.h" -#include "thread-pool.h" +#include "block/thread-pool.h" #include "iov.h" #include #include diff --git a/block/raw.c b/block/raw.c index 253e949b8c..6aec93dadb 100644 --- a/block/raw.c +++ b/block/raw.c @@ -1,6 +1,6 @@ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" static int raw_open(BlockDriverState *bs, int flags) diff --git a/block/rbd.c b/block/rbd.c index 737bab16cc..8def2f174c 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -15,7 +15,7 @@ #include "qemu-common.h" #include "qemu-error.h" -#include "block_int.h" +#include "block/block_int.h" #include diff --git a/block/sheepdog.c b/block/sheepdog.c index a48f58cfe8..da70df2d00 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -15,7 +15,7 @@ #include "qemu-common.h" #include "qemu-error.h" #include "qemu_socket.h" -#include "block_int.h" +#include "block/block_int.h" #include "bitops.h" #define SD_PROTO_VER 0x01 diff --git a/block/stream.c b/block/stream.c index 0dcd286035..d6df06f35a 100644 --- a/block/stream.c +++ b/block/stream.c @@ -12,8 +12,8 @@ */ #include "trace.h" -#include "block_int.h" -#include "blockjob.h" +#include "block/block_int.h" +#include "block/blockjob.h" #include "qemu/ratelimit.h" enum { diff --git a/block/vdi.c b/block/vdi.c index c8330b7eae..dab9cac76e 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -50,7 +50,7 @@ */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" #include "migration.h" diff --git a/block/vmdk.c b/block/vmdk.c index 51398c0c08..68e50e1a3e 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -24,7 +24,7 @@ */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" #include "migration.h" #include diff --git a/block/vpc.c b/block/vpc.c index 566e9a3b37..aabd71201c 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -23,7 +23,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" #include "migration.h" #if defined(CONFIG_UUID) diff --git a/block/vvfat.c b/block/vvfat.c index 59d3c5b8ac..fbabafca76 100644 --- a/block/vvfat.c +++ b/block/vvfat.c @@ -25,7 +25,7 @@ #include #include #include "qemu-common.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" #include "migration.h" diff --git a/block/win32-aio.c b/block/win32-aio.c index 4704ee06c2..606e4d6925 100644 --- a/block/win32-aio.c +++ b/block/win32-aio.c @@ -23,10 +23,10 @@ */ #include "qemu-common.h" #include "qemu-timer.h" -#include "block_int.h" +#include "block/block_int.h" #include "module.h" #include "qemu-common.h" -#include "qemu-aio.h" +#include "block/aio.h" #include "raw-aio.h" #include "event_notifier.h" #include diff --git a/blockdev-nbd.c b/blockdev-nbd.c index a194ecd392..81aa1d34ef 100644 --- a/blockdev-nbd.c +++ b/blockdev-nbd.c @@ -16,7 +16,7 @@ #include "sysemu.h" #include "qmp-commands.h" #include "trace.h" -#include "nbd.h" +#include "block/nbd.h" #include "qemu_socket.h" static int server_fd = -1; diff --git a/blockdev.c b/blockdev.c index c85c614577..ff6b333f69 100644 --- a/blockdev.c +++ b/blockdev.c @@ -9,14 +9,14 @@ #include "blockdev.h" #include "hw/block-common.h" -#include "blockjob.h" +#include "block/blockjob.h" #include "monitor.h" #include "qapi/qmp/qerror.h" #include "qemu-option.h" #include "qemu-config.h" #include "qapi/qmp/types.h" #include "sysemu.h" -#include "block_int.h" +#include "block/block_int.h" #include "qmp-commands.h" #include "trace.h" #include "arch_init.h" diff --git a/blockdev.h b/blockdev.h index 6e36d9f2c2..4134864758 100644 --- a/blockdev.h +++ b/blockdev.h @@ -10,7 +10,7 @@ #ifndef BLOCKDEV_H #define BLOCKDEV_H -#include "block.h" +#include "block/block.h" #include "qapi/error.h" #include "qemu-queue.h" diff --git a/blockjob.c b/blockjob.c index 8c0a286a77..004480d714 100644 --- a/blockjob.c +++ b/blockjob.c @@ -27,11 +27,11 @@ #include "qemu-common.h" #include "trace.h" #include "monitor.h" -#include "block.h" -#include "blockjob.h" -#include "block_int.h" +#include "block/block.h" +#include "block/blockjob.h" +#include "block/block_int.h" #include "qapi/qmp/qjson.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include "qmp-commands.h" #include "qemu-timer.h" diff --git a/cmd.c b/cmd.c index f40f09bbb7..01a8c3a299 100644 --- a/cmd.c +++ b/cmd.c @@ -24,7 +24,7 @@ #include #include "cmd.h" -#include "qemu-aio.h" +#include "block/aio.h" #include "main-loop.h" #define _(x) x /* not gettext support yet */ diff --git a/coroutine-gthread.c b/coroutine-gthread.c index 30c24c94b8..d3e5b991f7 100644 --- a/coroutine-gthread.c +++ b/coroutine-gthread.c @@ -20,7 +20,7 @@ #include #include "qemu-common.h" -#include "qemu-coroutine-int.h" +#include "block/coroutine_int.h" typedef struct { Coroutine base; diff --git a/coroutine-sigaltstack.c b/coroutine-sigaltstack.c index 39dbaa5da1..e37ebac9c4 100644 --- a/coroutine-sigaltstack.c +++ b/coroutine-sigaltstack.c @@ -31,7 +31,7 @@ #include #include #include "qemu-common.h" -#include "qemu-coroutine-int.h" +#include "block/coroutine_int.h" enum { /* Maximum free pool size prevents holding too many freed coroutines */ diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c index 784081ab18..2ed703a3ed 100644 --- a/coroutine-ucontext.c +++ b/coroutine-ucontext.c @@ -28,7 +28,7 @@ #include #include #include "qemu-common.h" -#include "qemu-coroutine-int.h" +#include "block/coroutine_int.h" #ifdef CONFIG_VALGRIND_H #include diff --git a/coroutine-win32.c b/coroutine-win32.c index 4179609eec..edc1f72c18 100644 --- a/coroutine-win32.c +++ b/coroutine-win32.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" -#include "qemu-coroutine-int.h" +#include "block/coroutine_int.h" typedef struct { diff --git a/dma.h b/dma.h index eedf878383..40280365ce 100644 --- a/dma.h +++ b/dma.h @@ -13,7 +13,7 @@ #include #include "memory.h" #include "hw/hw.h" -#include "block.h" +#include "block/block.h" #include "kvm.h" typedef struct DMAContext DMAContext; diff --git a/hw/9pfs/codir.c b/hw/9pfs/codir.c index 3d188284ba..cd137330b9 100644 --- a/hw/9pfs/codir.c +++ b/hw/9pfs/codir.c @@ -14,7 +14,7 @@ #include "fsdev/qemu-fsdev.h" #include "qemu-thread.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include "virtio-9p-coth.h" int v9fs_co_readdir_r(V9fsPDU *pdu, V9fsFidState *fidp, struct dirent *dent, diff --git a/hw/9pfs/cofile.c b/hw/9pfs/cofile.c index 9345aaeb2e..6d6dac7abf 100644 --- a/hw/9pfs/cofile.c +++ b/hw/9pfs/cofile.c @@ -14,7 +14,7 @@ #include "fsdev/qemu-fsdev.h" #include "qemu-thread.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include "virtio-9p-coth.h" int v9fs_co_st_gen(V9fsPDU *pdu, V9fsPath *path, mode_t st_mode, diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c index 83f125bd47..4b9ba30157 100644 --- a/hw/9pfs/cofs.c +++ b/hw/9pfs/cofs.c @@ -14,7 +14,7 @@ #include "fsdev/qemu-fsdev.h" #include "qemu-thread.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include "virtio-9p-coth.h" int v9fs_co_readlink(V9fsPDU *pdu, V9fsPath *path, V9fsString *buf) diff --git a/hw/9pfs/coxattr.c b/hw/9pfs/coxattr.c index 8a48228702..08365a697e 100644 --- a/hw/9pfs/coxattr.c +++ b/hw/9pfs/coxattr.c @@ -14,7 +14,7 @@ #include "fsdev/qemu-fsdev.h" #include "qemu-thread.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include "virtio-9p-coth.h" int v9fs_co_llistxattr(V9fsPDU *pdu, V9fsPath *path, void *value, size_t size) diff --git a/hw/9pfs/virtio-9p-coth.c b/hw/9pfs/virtio-9p-coth.c index 9368df7610..958725e5cc 100644 --- a/hw/9pfs/virtio-9p-coth.c +++ b/hw/9pfs/virtio-9p-coth.c @@ -14,7 +14,7 @@ #include "fsdev/qemu-fsdev.h" #include "qemu-thread.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include "virtio-9p-coth.h" /* v9fs glib thread pool */ diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h index c31c96578b..8c48a16c10 100644 --- a/hw/9pfs/virtio-9p-coth.h +++ b/hw/9pfs/virtio-9p-coth.h @@ -16,7 +16,7 @@ #define _QEMU_VIRTIO_9P_COTH_H #include "qemu-thread.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include "virtio-9p.h" #include diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index 579794404b..2c0c3baad4 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -10,7 +10,7 @@ #include "fsdev/file-op-9p.h" #include "fsdev/virtio-9p-marshal.h" #include "qemu-thread.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" /* The feature bitmap for virtio 9P */ diff --git a/hw/hd-geometry.c b/hw/hd-geometry.c index 1cdb9fb753..c30514364f 100644 --- a/hw/hd-geometry.c +++ b/hw/hd-geometry.c @@ -30,7 +30,7 @@ * THE SOFTWARE. */ -#include "block.h" +#include "block/block.h" #include "hw/block-common.h" #include "trace.h" diff --git a/hw/hw.h b/hw/hw.h index f530f6f41a..003d974866 100644 --- a/hw/hw.h +++ b/hw/hw.h @@ -10,7 +10,7 @@ #include "ioport.h" #include "irq.h" -#include "qemu-aio.h" +#include "block/aio.h" #include "qemu-file.h" #include "vmstate.h" #include "qemu-log.h" diff --git a/hw/ide/cmd646.c b/hw/ide/cmd646.c index 88210eabc8..f6d15b9f2a 100644 --- a/hw/ide/cmd646.c +++ b/hw/ide/cmd646.c @@ -26,7 +26,7 @@ #include #include #include -#include "block.h" +#include "block/block.h" #include "sysemu.h" #include "dma.h" diff --git a/hw/ide/ich.c b/hw/ide/ich.c index 8e1a48e257..3457b98cc1 100644 --- a/hw/ide/ich.c +++ b/hw/ide/ich.c @@ -65,7 +65,7 @@ #include #include #include -#include "block.h" +#include "block/block.h" #include "dma.h" #include diff --git a/hw/ide/isa.c b/hw/ide/isa.c index 8ab2718eea..39df87c608 100644 --- a/hw/ide/isa.c +++ b/hw/ide/isa.c @@ -25,7 +25,7 @@ #include #include #include -#include "block.h" +#include "block/block.h" #include "dma.h" #include diff --git a/hw/ide/macio.c b/hw/ide/macio.c index d2edcc0850..87cbb0c31e 100644 --- a/hw/ide/macio.c +++ b/hw/ide/macio.c @@ -25,7 +25,7 @@ #include #include #include -#include "block.h" +#include "block/block.h" #include "dma.h" #include diff --git a/hw/ide/microdrive.c b/hw/ide/microdrive.c index 9eee5b50ba..6cce5230c5 100644 --- a/hw/ide/microdrive.c +++ b/hw/ide/microdrive.c @@ -25,7 +25,7 @@ #include #include #include -#include "block.h" +#include "block/block.h" #include "dma.h" #include diff --git a/hw/ide/mmio.c b/hw/ide/mmio.c index bcb26c8b64..40443513be 100644 --- a/hw/ide/mmio.c +++ b/hw/ide/mmio.c @@ -23,7 +23,7 @@ * THE SOFTWARE. */ #include -#include "block.h" +#include "block/block.h" #include "dma.h" #include diff --git a/hw/ide/pci.c b/hw/ide/pci.c index 23a0e237fb..8821d5cceb 100644 --- a/hw/ide/pci.c +++ b/hw/ide/pci.c @@ -26,7 +26,7 @@ #include #include #include -#include "block.h" +#include "block/block.h" #include "dma.h" #include diff --git a/hw/ide/via.c b/hw/ide/via.c index 8b4a24e5c2..880f61cc8e 100644 --- a/hw/ide/via.c +++ b/hw/ide/via.c @@ -27,7 +27,7 @@ #include #include #include -#include "block.h" +#include "block/block.h" #include "sysemu.h" #include "dma.h" diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c index bab96b27c1..b46f7fdcb1 100644 --- a/hw/mips_fulong2e.c +++ b/hw/mips_fulong2e.c @@ -25,7 +25,7 @@ #include "net/net.h" #include "boards.h" #include "smbus.h" -#include "block.h" +#include "block/block.h" #include "flash.h" #include "mips.h" #include "mips_cpudevs.h" diff --git a/hw/mips_malta.c b/hw/mips_malta.c index 3f9f171385..60f237987f 100644 --- a/hw/mips_malta.c +++ b/hw/mips_malta.c @@ -29,7 +29,7 @@ #include "net/net.h" #include "boards.h" #include "smbus.h" -#include "block.h" +#include "block/block.h" #include "flash.h" #include "mips.h" #include "mips_cpudevs.h" diff --git a/hw/musicpal.c b/hw/musicpal.c index d16cd141a2..d7672e92a5 100644 --- a/hw/musicpal.c +++ b/hw/musicpal.c @@ -18,7 +18,7 @@ #include "serial.h" #include "qemu-timer.h" #include "ptimer.h" -#include "block.h" +#include "block/block.h" #include "flash.h" #include "ui/console.h" #include "i2c.h" diff --git a/hw/pflash_cfi01.c b/hw/pflash_cfi01.c index 7d040b508a..a2f6360838 100644 --- a/hw/pflash_cfi01.c +++ b/hw/pflash_cfi01.c @@ -38,7 +38,7 @@ #include "hw.h" #include "flash.h" -#include "block.h" +#include "block/block.h" #include "qemu-timer.h" #include "exec-memory.h" #include "host-utils.h" diff --git a/hw/pflash_cfi02.c b/hw/pflash_cfi02.c index f918e36580..beab67fc87 100644 --- a/hw/pflash_cfi02.c +++ b/hw/pflash_cfi02.c @@ -38,7 +38,7 @@ #include "hw.h" #include "flash.h" #include "qemu-timer.h" -#include "block.h" +#include "block/block.h" #include "exec-memory.h" #include "host-utils.h" #include "sysbus.h" diff --git a/hw/ppc405_boards.c b/hw/ppc405_boards.c index 8dc693f050..b875e3b615 100644 --- a/hw/ppc405_boards.c +++ b/hw/ppc405_boards.c @@ -27,7 +27,7 @@ #include "nvram.h" #include "flash.h" #include "sysemu.h" -#include "block.h" +#include "block/block.h" #include "boards.h" #include "qemu-log.h" #include "loader.h" diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c index 169dd4683d..f7e1939288 100644 --- a/hw/s390-virtio-bus.c +++ b/hw/s390-virtio-bus.c @@ -18,7 +18,7 @@ */ #include "hw.h" -#include "block.h" +#include "block/block.h" #include "sysemu.h" #include "boards.h" #include "monitor.h" diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c index 8c724b942c..b732bccef8 100644 --- a/hw/s390-virtio.c +++ b/hw/s390-virtio.c @@ -18,7 +18,7 @@ */ #include "hw.h" -#include "block.h" +#include "block/block.h" #include "blockdev.h" #include "sysemu.h" #include "net/net.h" diff --git a/hw/scsi.h b/hw/scsi.h index b8f73577d3..24ed522722 100644 --- a/hw/scsi.h +++ b/hw/scsi.h @@ -2,7 +2,7 @@ #define QEMU_HW_SCSI_H #include "qdev.h" -#include "block.h" +#include "block/block.h" #include "hw/block-common.h" #include "sysemu.h" diff --git a/hw/sd.c b/hw/sd.c index 607edba9c8..2e54eea981 100644 --- a/hw/sd.c +++ b/hw/sd.c @@ -30,7 +30,7 @@ */ #include "hw.h" -#include "block.h" +#include "block/block.h" #include "sd.h" #include "bitmap.h" diff --git a/hw/spitz.c b/hw/spitz.c index d4575d20bf..1500161d44 100644 --- a/hw/spitz.c +++ b/hw/spitz.c @@ -22,7 +22,7 @@ #include "devices.h" #include "sharpsl.h" #include "ui/console.h" -#include "block.h" +#include "block/block.h" #include "audio/audio.h" #include "boards.h" #include "blockdev.h" diff --git a/hw/tosa.c b/hw/tosa.c index 512278c241..3991a909b5 100644 --- a/hw/tosa.c +++ b/hw/tosa.c @@ -17,7 +17,7 @@ #include "devices.h" #include "sharpsl.h" #include "pcmcia.h" -#include "block.h" +#include "block/block.h" #include "boards.h" #include "i2c.h" #include "ssi.h" diff --git a/aes.h b/include/block/aes.h similarity index 100% rename from aes.h rename to include/block/aes.h diff --git a/qemu-aio.h b/include/block/aio.h similarity index 100% rename from qemu-aio.h rename to include/block/aio.h diff --git a/block.h b/include/block/block.h similarity index 99% rename from block.h rename to include/block/block.h index 0b22892d61..d49ce4dbc5 100644 --- a/block.h +++ b/include/block/block.h @@ -1,10 +1,10 @@ #ifndef BLOCK_H #define BLOCK_H -#include "qemu-aio.h" +#include "block/aio.h" #include "qemu-common.h" #include "qemu-option.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include "qapi/qmp/qobject.h" #include "qapi-types.h" diff --git a/block_int.h b/include/block/block_int.h similarity index 99% rename from block_int.h rename to include/block/block_int.h index a748b6c571..d06de2637b 100644 --- a/block_int.h +++ b/include/block/block_int.h @@ -24,10 +24,10 @@ #ifndef BLOCK_INT_H #define BLOCK_INT_H -#include "block.h" +#include "block/block.h" #include "qemu-option.h" #include "qemu-queue.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include "qemu-timer.h" #include "qapi-types.h" #include "qapi/qmp/qerror.h" diff --git a/blockjob.h b/include/block/blockjob.h similarity index 99% rename from blockjob.h rename to include/block/blockjob.h index 3792b73e52..c290d07bba 100644 --- a/blockjob.h +++ b/include/block/blockjob.h @@ -25,7 +25,7 @@ #ifndef BLOCKJOB_H #define BLOCKJOB_H 1 -#include "block.h" +#include "block/block.h" /** * BlockJobType: diff --git a/qemu-coroutine.h b/include/block/coroutine.h similarity index 100% rename from qemu-coroutine.h rename to include/block/coroutine.h diff --git a/qemu-coroutine-int.h b/include/block/coroutine_int.h similarity index 98% rename from qemu-coroutine-int.h rename to include/block/coroutine_int.h index 0f1bd80a8d..282a3ceda6 100644 --- a/qemu-coroutine-int.h +++ b/include/block/coroutine_int.h @@ -26,7 +26,7 @@ #define QEMU_COROUTINE_INT_H #include "qemu-queue.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" typedef enum { COROUTINE_YIELD = 1, diff --git a/nbd.h b/include/block/nbd.h similarity index 100% rename from nbd.h rename to include/block/nbd.h diff --git a/thread-pool.h b/include/block/thread-pool.h similarity index 93% rename from thread-pool.h rename to include/block/thread-pool.h index 378a4ac9f9..a87b287081 100644 --- a/thread-pool.h +++ b/include/block/thread-pool.h @@ -21,8 +21,8 @@ #include "qemu-common.h" #include "qemu-queue.h" #include "qemu-thread.h" -#include "qemu-coroutine.h" -#include "block_int.h" +#include "block/coroutine.h" +#include "block/block_int.h" typedef int ThreadPoolFunc(void *opaque); diff --git a/iohandler.c b/iohandler.c index 258f42d8d2..cf8276dffc 100644 --- a/iohandler.c +++ b/iohandler.c @@ -25,7 +25,7 @@ #include "config-host.h" #include "qemu-common.h" #include "qemu-queue.h" -#include "qemu-aio.h" +#include "block/aio.h" #include "main-loop.h" #ifndef _WIN32 diff --git a/main-loop.c b/main-loop.c index 7dba6f6e35..f9006118ad 100644 --- a/main-loop.c +++ b/main-loop.c @@ -26,7 +26,7 @@ #include "qemu-timer.h" #include "slirp/slirp.h" #include "main-loop.h" -#include "qemu-aio.h" +#include "block/aio.h" #ifndef _WIN32 diff --git a/main-loop.h b/main-loop.h index 326c74269c..e8059c3d0a 100644 --- a/main-loop.h +++ b/main-loop.h @@ -25,7 +25,7 @@ #ifndef QEMU_MAIN_LOOP_H #define QEMU_MAIN_LOOP_H 1 -#include "qemu-aio.h" +#include "block/aio.h" #define SIG_IPI SIGUSR1 diff --git a/migration-exec.c b/migration-exec.c index b4a3ca3921..3e55b7792d 100644 --- a/migration-exec.c +++ b/migration-exec.c @@ -19,7 +19,7 @@ #include "qemu_socket.h" #include "migration.h" #include "buffered_file.h" -#include "block.h" +#include "block/block.h" #include #include diff --git a/migration-fd.c b/migration-fd.c index 6d42287913..e86228823f 100644 --- a/migration-fd.c +++ b/migration-fd.c @@ -18,7 +18,7 @@ #include "migration.h" #include "monitor.h" #include "buffered_file.h" -#include "block.h" +#include "block/block.h" #include "qemu_socket.h" //#define DEBUG_MIGRATION_FD diff --git a/migration-tcp.c b/migration-tcp.c index a9bb817d99..07f51f2aef 100644 --- a/migration-tcp.c +++ b/migration-tcp.c @@ -17,7 +17,7 @@ #include "qemu_socket.h" #include "migration.h" #include "buffered_file.h" -#include "block.h" +#include "block/block.h" //#define DEBUG_MIGRATION_TCP diff --git a/migration-unix.c b/migration-unix.c index e58e8bc15b..1b9c461083 100644 --- a/migration-unix.c +++ b/migration-unix.c @@ -17,7 +17,7 @@ #include "qemu_socket.h" #include "migration.h" #include "buffered_file.h" -#include "block.h" +#include "block/block.h" //#define DEBUG_MIGRATION_UNIX diff --git a/migration.c b/migration.c index 73ce170ddf..1fce152548 100644 --- a/migration.c +++ b/migration.c @@ -18,7 +18,7 @@ #include "monitor.h" #include "buffered_file.h" #include "sysemu.h" -#include "block.h" +#include "block/block.h" #include "qemu_socket.h" #include "block-migration.h" #include "qmp-commands.h" diff --git a/monitor.h b/monitor.h index 7c29d9db34..9e96e83f5f 100644 --- a/monitor.h +++ b/monitor.h @@ -4,7 +4,7 @@ #include "qemu-common.h" #include "qapi/qmp/qerror.h" #include "qapi/qmp/qdict.h" -#include "block.h" +#include "block/block.h" #include "readline.h" extern Monitor *cur_mon; diff --git a/nbd.c b/nbd.c index 01976e8e33..04ff0a1d44 100644 --- a/nbd.c +++ b/nbd.c @@ -16,10 +16,10 @@ * along with this program; if not, see . */ -#include "nbd.h" -#include "block.h" +#include "block/nbd.h" +#include "block/block.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include #include diff --git a/qemu-char.h b/qemu-char.h index 3e230a1319..5ff1b2ba91 100644 --- a/qemu-char.h +++ b/qemu-char.h @@ -5,7 +5,7 @@ #include "qemu-queue.h" #include "qemu-option.h" #include "qemu-config.h" -#include "qemu-aio.h" +#include "block/aio.h" #include "qapi/qmp/qobject.h" #include "qapi/qmp/qstring.h" #include "main-loop.h" diff --git a/qemu-coroutine-io.c b/qemu-coroutine-io.c index 5734965003..5fae9c7d47 100644 --- a/qemu-coroutine-io.c +++ b/qemu-coroutine-io.c @@ -24,7 +24,7 @@ */ #include "qemu-common.h" #include "qemu_socket.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include "iov.h" ssize_t coroutine_fn diff --git a/qemu-coroutine-lock.c b/qemu-coroutine-lock.c index 9dda3f86c9..c3939ac6ef 100644 --- a/qemu-coroutine-lock.c +++ b/qemu-coroutine-lock.c @@ -23,10 +23,10 @@ */ #include "qemu-common.h" -#include "qemu-coroutine.h" -#include "qemu-coroutine-int.h" +#include "block/coroutine.h" +#include "block/coroutine_int.h" #include "qemu-queue.h" -#include "qemu-aio.h" +#include "block/aio.h" #include "trace.h" static QTAILQ_HEAD(, Coroutine) unlock_bh_queue = diff --git a/qemu-coroutine-sleep.c b/qemu-coroutine-sleep.c index d7083ee41a..26e6dac2eb 100644 --- a/qemu-coroutine-sleep.c +++ b/qemu-coroutine-sleep.c @@ -11,7 +11,7 @@ * */ -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include "qemu-timer.h" typedef struct CoSleepCB { diff --git a/qemu-coroutine.c b/qemu-coroutine.c index 600be2643c..0f6e268574 100644 --- a/qemu-coroutine.c +++ b/qemu-coroutine.c @@ -14,8 +14,8 @@ #include "trace.h" #include "qemu-common.h" -#include "qemu-coroutine.h" -#include "qemu-coroutine-int.h" +#include "block/coroutine.h" +#include "block/coroutine_int.h" Coroutine *qemu_coroutine_create(CoroutineEntry *entry) { diff --git a/qemu-img.c b/qemu-img.c index a13bc788cf..2e5ca5c964 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -29,7 +29,7 @@ #include "qemu-error.h" #include "osdep.h" #include "sysemu.h" -#include "block_int.h" +#include "block/block_int.h" #include #include diff --git a/qemu-io.c b/qemu-io.c index 1637773302..e0e47423d7 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -16,7 +16,7 @@ #include "qemu-common.h" #include "main-loop.h" -#include "block_int.h" +#include "block/block_int.h" #include "cmd.h" #include "trace/control.h" diff --git a/qemu-nbd.c b/qemu-nbd.c index 80f08d8464..0a6091b6a8 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -17,8 +17,8 @@ */ #include "qemu-common.h" -#include "block.h" -#include "nbd.h" +#include "block/block.h" +#include "block/nbd.h" #include #include diff --git a/tests/test-aio.c b/tests/test-aio.c index a8a4f0c6a5..e4ebef76b9 100644 --- a/tests/test-aio.c +++ b/tests/test-aio.c @@ -11,7 +11,7 @@ */ #include -#include "qemu-aio.h" +#include "block/aio.h" AioContext *ctx; diff --git a/tests/test-coroutine.c b/tests/test-coroutine.c index e5d14eb696..4c6cc81fb9 100644 --- a/tests/test-coroutine.c +++ b/tests/test-coroutine.c @@ -12,7 +12,7 @@ */ #include -#include "qemu-coroutine.h" +#include "block/coroutine.h" /* * Check that qemu_in_coroutine() works diff --git a/tests/test-thread-pool.c b/tests/test-thread-pool.c index ea8e676b0c..9998e031f2 100644 --- a/tests/test-thread-pool.c +++ b/tests/test-thread-pool.c @@ -1,8 +1,8 @@ #include #include "qemu-common.h" -#include "qemu-aio.h" -#include "thread-pool.h" -#include "block.h" +#include "block/aio.h" +#include "block/thread-pool.h" +#include "block/block.h" static int active; diff --git a/thread-pool.c b/thread-pool.c index 204f70b7b5..4c73a7db97 100644 --- a/thread-pool.c +++ b/thread-pool.c @@ -18,11 +18,11 @@ #include "qemu-queue.h" #include "qemu-thread.h" #include "osdep.h" -#include "qemu-coroutine.h" +#include "block/coroutine.h" #include "trace.h" -#include "block_int.h" +#include "block/block_int.h" #include "event_notifier.h" -#include "thread-pool.h" +#include "block/thread-pool.h" static void do_spawn_thread(void); From 022c62cbbcf1ff40b23c92874f8670cddfec2414 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 17 Dec 2012 18:19:49 +0100 Subject: [PATCH 251/300] exec: move include files to include/exec/ Signed-off-by: Paolo Bonzini --- arch_init.c | 4 +- balloon.c | 2 +- bsd-user/qemu.h | 4 +- cpus.c | 2 +- cputlb.c | 18 +++--- dma.h | 2 +- dump.c | 6 +- exec.c | 8 +-- gdbstub.c | 2 +- hw/acpi_ich9.c | 2 +- hw/acpi_piix4.c | 4 +- hw/alpha_typhoon.c | 4 +- hw/an5206.c | 2 +- hw/apb_pci.c | 2 +- hw/apic_internal.h | 2 +- hw/apm.h | 2 +- hw/arm-misc.h | 2 +- hw/armv7m_nvic.c | 2 +- hw/axis_dev88.c | 2 +- hw/bonito.c | 2 +- hw/collie.c | 2 +- hw/dummy_m68k.c | 2 +- hw/etraxfs_dma.c | 2 +- hw/exynos4210.h | 2 +- hw/exynos4210_fimd.c | 2 +- hw/exynos4_boards.c | 2 +- hw/flash.h | 2 +- hw/framebuffer.h | 2 +- hw/gt64xxx.c | 2 +- hw/gumstix.c | 2 +- hw/highbank.c | 2 +- hw/hw.h | 4 +- hw/ide.h | 2 +- hw/ide/ahci.c | 2 +- hw/ide/internal.h | 2 +- hw/integratorcp.c | 2 +- hw/ioapic_internal.h | 2 +- hw/isa-bus.c | 2 +- hw/isa.h | 4 +- hw/isa_mmio.c | 2 +- hw/kzm.c | 2 +- hw/leon3.c | 2 +- hw/lm32_boards.c | 2 +- hw/loader.c | 4 +- hw/lpc_ich9.c | 2 +- hw/m48t59.c | 2 +- hw/mac_dbdma.h | 2 +- hw/mainstone.c | 2 +- hw/mcf5206.c | 2 +- hw/mcf5208.c | 2 +- hw/mcf_fec.c | 2 +- hw/mcf_intc.c | 2 +- hw/mcf_uart.c | 2 +- hw/milkymist.c | 2 +- hw/mips.h | 2 +- hw/mips_fulong2e.c | 2 +- hw/mips_jazz.c | 2 +- hw/mips_malta.c | 2 +- hw/mips_mipssim.c | 2 +- hw/mips_r4k.c | 2 +- hw/musicpal.c | 2 +- hw/ne2000-isa.c | 2 +- hw/nseries.c | 2 +- hw/omap.h | 2 +- hw/omap_gpmc.c | 4 +- hw/omap_sx1.c | 2 +- hw/omap_uart.c | 2 +- hw/onenand.c | 4 +- hw/openrisc_sim.c | 2 +- hw/palm.c | 2 +- hw/pam.h | 2 +- hw/pc.c | 4 +- hw/pc.h | 6 +- hw/pc_piix.c | 4 +- hw/pc_q35.c | 2 +- hw/pci/pci.c | 2 +- hw/pci/pci.h | 2 +- hw/pci/pcie_host.c | 2 +- hw/pci/pcie_host.h | 2 +- hw/pci/shpc.h | 2 +- hw/pci_bridge_dev.c | 2 +- hw/pcnet.h | 2 +- hw/petalogix_ml605_mmu.c | 2 +- hw/petalogix_s3adsp1800_mmu.c | 2 +- hw/pflash_cfi01.c | 2 +- hw/pflash_cfi02.c | 2 +- hw/ppc/e500.c | 2 +- hw/ppc405_boards.c | 2 +- hw/ppc405_uc.c | 2 +- hw/ppc440_bamboo.c | 2 +- hw/ppc4xx_devs.c | 2 +- hw/ppc4xx_pci.c | 2 +- hw/ppc_mac.h | 2 +- hw/ppc_newworld.c | 2 +- hw/ppc_oldworld.c | 2 +- hw/ppc_prep.c | 2 +- hw/ppce500_pci.c | 2 +- hw/prep_pci.c | 2 +- hw/puv3.c | 2 +- hw/pxa.h | 2 +- hw/qdev-addr.c | 2 +- hw/r2d.c | 2 +- hw/realview.c | 2 +- hw/s390-virtio.c | 2 +- hw/s390x/sclp.c | 2 +- hw/serial.c | 2 +- hw/serial.h | 2 +- hw/sh7750.c | 2 +- hw/sh_intc.h | 2 +- hw/sh_pci.c | 2 +- hw/sh_serial.c | 2 +- hw/sh_timer.c | 2 +- hw/shix.c | 2 +- hw/soc_dma.h | 2 +- hw/spapr.c | 2 +- hw/spapr_iommu.c | 2 +- hw/spapr_pci.c | 2 +- hw/spitz.c | 2 +- hw/stellaris.c | 2 +- hw/strongarm.h | 2 +- hw/sun4u.c | 2 +- hw/sysbus.c | 2 +- hw/sysbus.h | 2 +- hw/tosa.c | 2 +- hw/usb/libhw.c | 2 +- hw/versatile_pci.c | 2 +- hw/versatilepb.c | 2 +- hw/vexpress.c | 2 +- hw/vfio_pci.c | 4 +- hw/vga_int.h | 2 +- hw/vhost.c | 2 +- hw/vhost.h | 2 +- hw/virtex_ml507.c | 2 +- hw/virtio-balloon.c | 2 +- hw/vt82c686.c | 2 +- hw/xen_platform.c | 2 +- hw/xen_pt.c | 2 +- hw/xilinx_zynq.c | 2 +- hw/xtensa_lx60.c | 4 +- hw/xtensa_sim.c | 4 +- hw/z2.c | 2 +- .../exec/address-spaces.h | 2 +- cpu-all.h => include/exec/cpu-all.h | 4 +- cpu-common.h => include/exec/cpu-common.h | 4 +- cpu-defs.h => include/exec/cpu-defs.h | 2 +- cputlb.h => include/exec/cputlb.h | 0 def-helper.h => include/exec/def-helper.h | 0 exec-all.h => include/exec/exec-all.h | 12 ++-- gdbstub.h => include/exec/gdbstub.h | 0 gen-icount.h => include/exec/gen-icount.h | 0 hwaddr.h => include/exec/hwaddr.h | 0 ioport.h => include/exec/ioport.h | 2 +- iorange.h => include/exec/iorange.h | 0 .../exec/memory-internal.h | 0 memory.h => include/exec/memory.h | 8 +-- poison.h => include/exec/poison.h | 0 softmmu-semi.h => include/exec/softmmu-semi.h | 0 softmmu_defs.h => include/exec/softmmu_defs.h | 0 softmmu_exec.h => include/exec/softmmu_exec.h | 58 +++++++++---------- .../exec/softmmu_header.h | 0 .../exec/softmmu_template.h | 2 +- qemu-lock.h => include/exec/spinlock.h | 0 .../exec/user/abitypes.h | 0 thunk.h => include/exec/user/thunk.h | 0 ioport.c | 4 +- kvm-all.c | 6 +- kvm-stub.c | 2 +- linux-user/qemu.h | 6 +- memory.c | 8 +-- memory_mapping-stub.c | 2 +- memory_mapping.c | 2 +- monitor.c | 4 +- qtest.c | 4 +- savevm.c | 2 +- scripts/feature_to_c.sh | 2 +- target-alpha/cpu.h | 6 +- target-alpha/helper.h | 4 +- target-alpha/mem_helper.c | 10 ++-- target-alpha/translate.c | 2 +- target-arm/arm-semi.c | 4 +- target-arm/cpu.h | 6 +- target-arm/helper.c | 2 +- target-arm/helper.h | 4 +- target-arm/iwmmxt_helper.c | 2 +- target-arm/neon_helper.c | 2 +- target-arm/op_helper.c | 10 ++-- target-arm/translate.c | 2 +- target-cris/cpu.h | 6 +- target-cris/helper.h | 4 +- target-cris/op_helper.c | 10 ++-- target-cris/translate.c | 2 +- target-i386/arch_dump.c | 2 +- target-i386/arch_memory_mapping.c | 2 +- target-i386/cpu.h | 6 +- target-i386/fpu_helper.c | 2 +- target-i386/helper.h | 4 +- target-i386/ioport-user.c | 2 +- target-i386/kvm.c | 4 +- target-i386/mem_helper.c | 10 ++-- target-i386/misc_helper.c | 4 +- target-i386/seg_helper.c | 2 +- target-i386/svm_helper.c | 4 +- target-i386/translate.c | 2 +- target-lm32/cpu.h | 6 +- target-lm32/helper.h | 4 +- target-lm32/op_helper.c | 8 +-- target-lm32/translate.c | 2 +- target-m68k/cpu.h | 6 +- target-m68k/helper.c | 2 +- target-m68k/helpers.h | 4 +- target-m68k/m68k-semi.c | 4 +- target-m68k/op_helper.c | 10 ++-- target-m68k/translate.c | 2 +- target-microblaze/cpu.h | 6 +- target-microblaze/helper.h | 4 +- target-microblaze/op_helper.c | 10 ++-- target-microblaze/translate.c | 2 +- target-mips/cpu.h | 6 +- target-mips/helper.h | 4 +- target-mips/op_helper.c | 10 ++-- target-mips/translate.c | 2 +- target-openrisc/cpu.h | 6 +- target-openrisc/helper.h | 4 +- target-openrisc/interrupt.c | 2 +- target-openrisc/mmu.c | 2 +- target-openrisc/mmu_helper.c | 10 ++-- target-openrisc/translate.c | 4 +- target-ppc/cpu.h | 6 +- target-ppc/helper.h | 4 +- target-ppc/kvm_ppc.h | 2 +- target-ppc/mem_helper.c | 10 ++-- target-ppc/translate.c | 2 +- target-ppc/translate_init.c | 2 +- target-s390x/cpu.h | 6 +- target-s390x/fpu_helper.c | 2 +- target-s390x/helper.c | 2 +- target-s390x/helper.h | 4 +- target-s390x/mem_helper.c | 10 ++-- target-s390x/misc_helper.c | 4 +- target-s390x/translate.c | 2 +- target-sh4/cpu.h | 6 +- target-sh4/helper.h | 4 +- target-sh4/op_helper.c | 10 ++-- target-sh4/translate.c | 2 +- target-sparc/cpu.h | 6 +- target-sparc/helper.h | 4 +- target-sparc/ldst_helper.c | 10 ++-- target-sparc/mmu_helper.c | 2 +- target-sparc/translate.c | 2 +- target-unicore32/cpu.h | 6 +- target-unicore32/helper.c | 2 +- target-unicore32/helper.h | 4 +- target-unicore32/op_helper.c | 8 +-- target-unicore32/translate.c | 2 +- target-xtensa/core-dc232b.c | 4 +- target-xtensa/core-dc233c.c | 4 +- target-xtensa/core-fsf.c | 4 +- target-xtensa/cpu.h | 6 +- target-xtensa/helper.c | 4 +- target-xtensa/helper.h | 4 +- target-xtensa/op_helper.c | 8 +-- target-xtensa/translate.c | 4 +- tcg/arm/tcg-target.c | 2 +- tcg/hppa/tcg-target.c | 2 +- tcg/i386/tcg-target.c | 2 +- tcg/ia64/tcg-target.c | 2 +- tcg/mips/tcg-target.c | 2 +- tcg/ppc/tcg-target.c | 2 +- tcg/ppc64/tcg-target.c | 2 +- tcg/s390/tcg-target.c | 2 +- tcg/sparc/tcg-target.c | 2 +- tci.c | 2 +- thunk.c | 2 +- translate-all.c | 6 +- vl.c | 2 +- xen-all.c | 2 +- xen-stub.c | 2 +- 277 files changed, 456 insertions(+), 456 deletions(-) rename exec-memory.h => include/exec/address-spaces.h (97%) rename cpu-all.h => include/exec/cpu-all.h (99%) rename cpu-common.h => include/exec/cpu-common.h (98%) rename cpu-defs.h => include/exec/cpu-defs.h (99%) rename cputlb.h => include/exec/cputlb.h (100%) rename def-helper.h => include/exec/def-helper.h (100%) rename exec-all.h => include/exec/exec-all.h (98%) rename gdbstub.h => include/exec/gdbstub.h (100%) rename gen-icount.h => include/exec/gen-icount.h (100%) rename hwaddr.h => include/exec/hwaddr.h (100%) rename ioport.h => include/exec/ioport.h (99%) rename iorange.h => include/exec/iorange.h (100%) rename memory-internal.h => include/exec/memory-internal.h (100%) rename memory.h => include/exec/memory.h (99%) rename poison.h => include/exec/poison.h (100%) rename softmmu-semi.h => include/exec/softmmu-semi.h (100%) rename softmmu_defs.h => include/exec/softmmu_defs.h (100%) rename softmmu_exec.h => include/exec/softmmu_exec.h (72%) rename softmmu_header.h => include/exec/softmmu_header.h (100%) rename softmmu_template.h => include/exec/softmmu_template.h (99%) rename qemu-lock.h => include/exec/spinlock.h (100%) rename qemu-user-types.h => include/exec/user/abitypes.h (100%) rename thunk.h => include/exec/user/thunk.h (100%) diff --git a/arch_init.c b/arch_init.c index e479a2566c..e15cedad04 100644 --- a/arch_init.c +++ b/arch_init.c @@ -40,9 +40,9 @@ #include "hw/audiodev.h" #include "kvm.h" #include "migration.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "hw/smbios.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "hw/pcspk.h" #include "qemu/page_cache.h" #include "qemu-config.h" diff --git a/balloon.c b/balloon.c index 610fe6d626..c24458b5f9 100644 --- a/balloon.c +++ b/balloon.c @@ -25,7 +25,7 @@ */ #include "monitor.h" -#include "cpu-common.h" +#include "exec/cpu-common.h" #include "kvm.h" #include "balloon.h" #include "trace.h" diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h index d2688995bd..c64c3ccca3 100644 --- a/bsd-user/qemu.h +++ b/bsd-user/qemu.h @@ -11,7 +11,7 @@ #include #endif /* DEBUG_REMAP */ -#include "qemu-user-types.h" +#include "exec/user/abitypes.h" enum BSDType { target_freebsd, @@ -23,7 +23,7 @@ extern enum BSDType bsd_type; #include "syscall_defs.h" #include "syscall.h" #include "target_signal.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #if defined(CONFIG_USE_NPTL) #define THREAD __thread diff --git a/cpus.c b/cpus.c index d9c332fcb8..8926873ad1 100644 --- a/cpus.c +++ b/cpus.c @@ -27,7 +27,7 @@ #include "monitor.h" #include "sysemu.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "dma.h" #include "kvm.h" #include "qmp-commands.h" diff --git a/cputlb.c b/cputlb.c index d6d0372615..88239c494a 100644 --- a/cputlb.c +++ b/cputlb.c @@ -19,13 +19,13 @@ #include "config.h" #include "cpu.h" -#include "exec-all.h" -#include "memory.h" -#include "exec-memory.h" +#include "exec/exec-all.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" -#include "cputlb.h" +#include "exec/cputlb.h" -#include "memory-internal.h" +#include "exec/memory-internal.h" //#define DEBUG_TLB //#define DEBUG_TLB_CHECK @@ -347,15 +347,15 @@ tb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr) #define SOFTMMU_CODE_ACCESS #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #undef env diff --git a/dma.h b/dma.h index 40280365ce..fd68f74c5b 100644 --- a/dma.h +++ b/dma.h @@ -11,7 +11,7 @@ #define DMA_H #include -#include "memory.h" +#include "exec/memory.h" #include "hw/hw.h" #include "block/block.h" #include "kvm.h" diff --git a/dump.c b/dump.c index 7b45b53a8f..e70e0f3b21 100644 --- a/dump.c +++ b/dump.c @@ -14,8 +14,8 @@ #include "qemu-common.h" #include "elf.h" #include "cpu.h" -#include "cpu-all.h" -#include "hwaddr.h" +#include "exec/cpu-all.h" +#include "exec/hwaddr.h" #include "monitor.h" #include "kvm.h" #include "dump.h" @@ -23,7 +23,7 @@ #include "memory_mapping.h" #include "qapi/error.h" #include "qmp-commands.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" static uint16_t cpu_convert_to_target16(uint16_t val, int endian) { diff --git a/exec.c b/exec.c index 986084146c..17fc7cf854 100644 --- a/exec.c +++ b/exec.c @@ -34,9 +34,9 @@ #include "hw/xen.h" #include "qemu-timer.h" #include "qemu-config.h" -#include "memory.h" +#include "exec/memory.h" #include "dma.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #if defined(CONFIG_USER_ONLY) #include #else /* !CONFIG_USER_ONLY */ @@ -44,10 +44,10 @@ #include "trace.h" #endif -#include "cputlb.h" +#include "exec/cputlb.h" #include "translate-all.h" -#include "memory-internal.h" +#include "exec/memory-internal.h" //#define DEBUG_UNASSIGNED //#define DEBUG_SUBPAGE diff --git a/gdbstub.c b/gdbstub.c index d02ec75384..70ad79a748 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -32,7 +32,7 @@ #include "monitor.h" #include "qemu-char.h" #include "sysemu.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #endif #define MAX_PACKET_LENGTH 4096 diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c index 755fa050f7..92af3a554c 100644 --- a/hw/acpi_ich9.c +++ b/hw/acpi_ich9.c @@ -30,7 +30,7 @@ #include "sysemu.h" #include "acpi.h" #include "kvm.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "ich9.h" diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index 46f9843891..4f43f6e070 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -26,9 +26,9 @@ #include "acpi.h" #include "sysemu.h" #include "range.h" -#include "ioport.h" +#include "exec/ioport.h" #include "fw_cfg.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" //#define DEBUG diff --git a/hw/alpha_typhoon.c b/hw/alpha_typhoon.c index 9b16d96612..d61b2f483c 100644 --- a/hw/alpha_typhoon.c +++ b/hw/alpha_typhoon.c @@ -7,12 +7,12 @@ */ #include "cpu.h" -#include "exec-all.h" +#include "exec/exec-all.h" #include "hw.h" #include "devices.h" #include "sysemu.h" #include "alpha_sys.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define TYPE_TYPHOON_PCI_HOST_BRIDGE "typhoon-pcihost" diff --git a/hw/an5206.c b/hw/an5206.c index d887c0e7eb..dcfe34b3ae 100644 --- a/hw/an5206.c +++ b/hw/an5206.c @@ -11,7 +11,7 @@ #include "boards.h" #include "loader.h" #include "elf.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define KERNEL_LOAD_ADDR 0x10000 #define AN5206_MBAR_ADDR 0x10000000 diff --git a/hw/apb_pci.c b/hw/apb_pci.c index fb7a07de37..144a7cc8d3 100644 --- a/hw/apb_pci.c +++ b/hw/apb_pci.c @@ -33,7 +33,7 @@ #include "pci/pci_bus.h" #include "apb_pci.h" #include "sysemu.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" /* debug APB */ //#define DEBUG_APB diff --git a/hw/apic_internal.h b/hw/apic_internal.h index 79e2de2243..fea95654ca 100644 --- a/hw/apic_internal.h +++ b/hw/apic_internal.h @@ -20,7 +20,7 @@ #ifndef QEMU_APIC_INTERNAL_H #define QEMU_APIC_INTERNAL_H -#include "memory.h" +#include "exec/memory.h" #include "sysbus.h" #include "qemu-timer.h" diff --git a/hw/apm.h b/hw/apm.h index 5431b6d7c8..9abb47f99f 100644 --- a/hw/apm.h +++ b/hw/apm.h @@ -4,7 +4,7 @@ #include #include "qemu-common.h" #include "hw.h" -#include "memory.h" +#include "exec/memory.h" typedef void (*apm_ctrl_changed_t)(uint32_t val, void *arg); diff --git a/hw/arm-misc.h b/hw/arm-misc.h index d129678b26..cba7553039 100644 --- a/hw/arm-misc.h +++ b/hw/arm-misc.h @@ -11,7 +11,7 @@ #ifndef ARM_MISC_H #define ARM_MISC_H 1 -#include "memory.h" +#include "exec/memory.h" #include "hw/irq.h" /* The CPU is also modeled as an interrupt controller. */ diff --git a/hw/armv7m_nvic.c b/hw/armv7m_nvic.c index 4963678bf1..270c307717 100644 --- a/hw/armv7m_nvic.c +++ b/hw/armv7m_nvic.c @@ -13,7 +13,7 @@ #include "sysbus.h" #include "qemu-timer.h" #include "arm-misc.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "arm_gic_internal.h" typedef struct { diff --git a/hw/axis_dev88.c b/hw/axis_dev88.c index 50ddbc920d..e537aecc78 100644 --- a/hw/axis_dev88.c +++ b/hw/axis_dev88.c @@ -31,7 +31,7 @@ #include "elf.h" #include "cris-boot.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define D(x) #define DNAND(x) diff --git a/hw/bonito.c b/hw/bonito.c index a1fc38c784..78e264ccc0 100644 --- a/hw/bonito.c +++ b/hw/bonito.c @@ -45,7 +45,7 @@ #include "mips.h" #include "pci/pci_host.h" #include "sysemu.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" //#define DEBUG_BONITO diff --git a/hw/collie.c b/hw/collie.c index 695982a99f..faf5ac9ac7 100644 --- a/hw/collie.c +++ b/hw/collie.c @@ -16,7 +16,7 @@ #include "arm-misc.h" #include "flash.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" static struct arm_boot_info collie_binfo = { .loader_start = SA_SDCS0, diff --git a/hw/dummy_m68k.c b/hw/dummy_m68k.c index 20f790b1a6..7878cc3e15 100644 --- a/hw/dummy_m68k.c +++ b/hw/dummy_m68k.c @@ -10,7 +10,7 @@ #include "boards.h" #include "loader.h" #include "elf.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define KERNEL_LOAD_ADDR 0x10000 diff --git a/hw/etraxfs_dma.c b/hw/etraxfs_dma.c index 49221abc1a..089267fcc1 100644 --- a/hw/etraxfs_dma.c +++ b/hw/etraxfs_dma.c @@ -24,7 +24,7 @@ #include #include #include "hw.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "qemu-common.h" #include "sysemu.h" diff --git a/hw/exynos4210.h b/hw/exynos4210.h index 777f0f5b2f..bb9a1dddc8 100644 --- a/hw/exynos4210.h +++ b/hw/exynos4210.h @@ -27,7 +27,7 @@ #define EXYNOS4210_H_ #include "qemu-common.h" -#include "memory.h" +#include "exec/memory.h" #define EXYNOS4210_NCPUS 2 diff --git a/hw/exynos4210_fimd.c b/hw/exynos4210_fimd.c index 3ef0847271..cfca72ab67 100644 --- a/hw/exynos4210_fimd.c +++ b/hw/exynos4210_fimd.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" -#include "cpu-all.h" +#include "exec/cpu-all.h" #include "sysbus.h" #include "ui/console.h" #include "ui/pixel_ops.h" diff --git a/hw/exynos4_boards.c b/hw/exynos4_boards.c index c375f16479..5dd2961459 100644 --- a/hw/exynos4_boards.c +++ b/hw/exynos4_boards.c @@ -25,7 +25,7 @@ #include "sysbus.h" #include "net/net.h" #include "arm-misc.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "exynos4210.h" #include "boards.h" diff --git a/hw/flash.h b/hw/flash.h index bda2158c13..920d7596e3 100644 --- a/hw/flash.h +++ b/hw/flash.h @@ -3,7 +3,7 @@ /* NOR flash devices */ -#include "memory.h" +#include "exec/memory.h" typedef struct pflash_t pflash_t; diff --git a/hw/framebuffer.h b/hw/framebuffer.h index 46e375b5ec..11f53edec0 100644 --- a/hw/framebuffer.h +++ b/hw/framebuffer.h @@ -1,7 +1,7 @@ #ifndef QEMU_FRAMEBUFFER_H #define QEMU_FRAMEBUFFER_H -#include "memory.h" +#include "exec/memory.h" /* Framebuffer device helper routines. */ diff --git a/hw/gt64xxx.c b/hw/gt64xxx.c index 5aa49c6148..977a2c5e69 100644 --- a/hw/gt64xxx.c +++ b/hw/gt64xxx.c @@ -27,7 +27,7 @@ #include "pci/pci.h" #include "pci/pci_host.h" #include "pc.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" //#define DEBUG diff --git a/hw/gumstix.c b/hw/gumstix.c index 545b92fd95..4acb32c2a9 100644 --- a/hw/gumstix.c +++ b/hw/gumstix.c @@ -41,7 +41,7 @@ #include "devices.h" #include "boards.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" static const int sector_len = 128 * 1024; diff --git a/hw/highbank.c b/hw/highbank.c index 90f7cb5ef2..6f5f2a9d9d 100644 --- a/hw/highbank.c +++ b/hw/highbank.c @@ -26,7 +26,7 @@ #include "boards.h" #include "sysbus.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define SMP_BOOT_ADDR 0x100 #define SMP_BOOT_REG 0x40 diff --git a/hw/hw.h b/hw/hw.h index 003d974866..7368470bb1 100644 --- a/hw/hw.h +++ b/hw/hw.h @@ -5,10 +5,10 @@ #include "qemu-common.h" #if !defined(CONFIG_USER_ONLY) && !defined(NEED_CPU_H) -#include "cpu-common.h" +#include "exec/cpu-common.h" #endif -#include "ioport.h" +#include "exec/ioport.h" #include "irq.h" #include "block/aio.h" #include "qemu-file.h" diff --git a/hw/ide.h b/hw/ide.h index 081c710d56..7e23cda8e0 100644 --- a/hw/ide.h +++ b/hw/ide.h @@ -3,7 +3,7 @@ #include "isa.h" #include "pci/pci.h" -#include "memory.h" +#include "exec/memory.h" #define MAX_IDE_DEVS 2 diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index 2ea64bd316..f32a84761d 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -29,7 +29,7 @@ #include "monitor.h" #include "dma.h" -#include "cpu-common.h" +#include "exec/cpu-common.h" #include "internal.h" #include #include diff --git a/hw/ide/internal.h b/hw/ide/internal.h index bf7d313cf4..c5016f0cea 100644 --- a/hw/ide/internal.h +++ b/hw/ide/internal.h @@ -8,7 +8,7 @@ */ #include #include -#include "iorange.h" +#include "exec/iorange.h" #include "dma.h" #include "sysemu.h" #include "hw/block-common.h" diff --git a/hw/integratorcp.c b/hw/integratorcp.c index 2b59fea9f1..c995dc724f 100644 --- a/hw/integratorcp.c +++ b/hw/integratorcp.c @@ -12,7 +12,7 @@ #include "boards.h" #include "arm-misc.h" #include "net/net.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "sysemu.h" typedef struct { diff --git a/hw/ioapic_internal.h b/hw/ioapic_internal.h index e04c9f3c12..c8447d7f3b 100644 --- a/hw/ioapic_internal.h +++ b/hw/ioapic_internal.h @@ -23,7 +23,7 @@ #define QEMU_IOAPIC_INTERNAL_H #include "hw.h" -#include "memory.h" +#include "exec/memory.h" #include "sysbus.h" #define MAX_IOAPICS 1 diff --git a/hw/isa-bus.c b/hw/isa-bus.c index 144a88e272..8f40974166 100644 --- a/hw/isa-bus.c +++ b/hw/isa-bus.c @@ -21,7 +21,7 @@ #include "sysbus.h" #include "sysemu.h" #include "isa.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" static ISABus *isabus; hwaddr isa_mem_base = 0; diff --git a/hw/isa.h b/hw/isa.h index 9d719fa3c8..62e89d3bcd 100644 --- a/hw/isa.h +++ b/hw/isa.h @@ -3,8 +3,8 @@ /* ISA bus */ -#include "ioport.h" -#include "memory.h" +#include "exec/ioport.h" +#include "exec/memory.h" #include "qdev.h" #define ISA_NUM_IRQS 16 diff --git a/hw/isa_mmio.c b/hw/isa_mmio.c index 14053960cb..487cf6a8fb 100644 --- a/hw/isa_mmio.c +++ b/hw/isa_mmio.c @@ -24,7 +24,7 @@ #include "hw.h" #include "isa.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" static void isa_mmio_writeb (void *opaque, hwaddr addr, uint32_t val) diff --git a/hw/kzm.c b/hw/kzm.c index a27ecbba84..9f92d30928 100644 --- a/hw/kzm.c +++ b/hw/kzm.c @@ -14,7 +14,7 @@ */ #include "sysbus.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "hw.h" #include "arm-misc.h" #include "devices.h" diff --git a/hw/leon3.c b/hw/leon3.c index ef83dffd85..e8d54e5d06 100644 --- a/hw/leon3.c +++ b/hw/leon3.c @@ -30,7 +30,7 @@ #include "loader.h" #include "elf.h" #include "trace.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "grlib.h" diff --git a/hw/lm32_boards.c b/hw/lm32_boards.c index f59d3bfef8..81afdf675c 100644 --- a/hw/lm32_boards.c +++ b/hw/lm32_boards.c @@ -27,7 +27,7 @@ #include "elf.h" #include "lm32_hwsetup.h" #include "lm32.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" typedef struct { LM32CPU *cpu; diff --git a/hw/loader.c b/hw/loader.c index 52f0940778..03f0318d91 100644 --- a/hw/loader.c +++ b/hw/loader.c @@ -49,8 +49,8 @@ #include "uboot_image.h" #include "loader.h" #include "fw_cfg.h" -#include "memory.h" -#include "exec-memory.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" #include diff --git a/hw/lpc_ich9.c b/hw/lpc_ich9.c index 30505789f8..e225693721 100644 --- a/hw/lpc_ich9.c +++ b/hw/lpc_ich9.c @@ -43,7 +43,7 @@ #include "acpi_ich9.h" #include "pam.h" #include "pci/pci_bus.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "sysemu.h" static int ich9_lpc_sci_irq(ICH9LPCState *lpc); diff --git a/hw/m48t59.c b/hw/m48t59.c index 7da7e7c822..491d433ae7 100644 --- a/hw/m48t59.c +++ b/hw/m48t59.c @@ -27,7 +27,7 @@ #include "sysemu.h" #include "sysbus.h" #include "isa.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" //#define DEBUG_NVRAM diff --git a/hw/mac_dbdma.h b/hw/mac_dbdma.h index e596837f46..691263eede 100644 --- a/hw/mac_dbdma.h +++ b/hw/mac_dbdma.h @@ -22,7 +22,7 @@ #ifndef HW_MAC_DBDMA_H #define HW_MAC_DBDMA_H 1 -#include "memory.h" +#include "exec/memory.h" typedef struct DBDMA_io DBDMA_io; diff --git a/hw/mainstone.c b/hw/mainstone.c index 58c8b0748e..80d6a9d54d 100644 --- a/hw/mainstone.c +++ b/hw/mainstone.c @@ -20,7 +20,7 @@ #include "flash.h" #include "blockdev.h" #include "sysbus.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" /* Device addresses */ #define MST_FPGA_PHYS 0x08000000 diff --git a/hw/mcf5206.c b/hw/mcf5206.c index 510d77047e..5edc931abd 100644 --- a/hw/mcf5206.c +++ b/hw/mcf5206.c @@ -10,7 +10,7 @@ #include "qemu-timer.h" #include "ptimer.h" #include "sysemu.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" /* General purpose timer module. */ typedef struct { diff --git a/hw/mcf5208.c b/hw/mcf5208.c index 6326624111..997b34847c 100644 --- a/hw/mcf5208.c +++ b/hw/mcf5208.c @@ -14,7 +14,7 @@ #include "boards.h" #include "loader.h" #include "elf.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define SYS_FREQ 66000000 diff --git a/hw/mcf_fec.c b/hw/mcf_fec.c index b5fb18f67f..2423f64bf6 100644 --- a/hw/mcf_fec.c +++ b/hw/mcf_fec.c @@ -10,7 +10,7 @@ #include "mcf.h" /* For crc32 */ #include -#include "exec-memory.h" +#include "exec/address-spaces.h" //#define DEBUG_FEC 1 diff --git a/hw/mcf_intc.c b/hw/mcf_intc.c index 6ef6dac931..3bed3a2e4c 100644 --- a/hw/mcf_intc.c +++ b/hw/mcf_intc.c @@ -7,7 +7,7 @@ */ #include "hw.h" #include "mcf.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" typedef struct { MemoryRegion iomem; diff --git a/hw/mcf_uart.c b/hw/mcf_uart.c index d1655f8f2c..2eca2c6ae9 100644 --- a/hw/mcf_uart.c +++ b/hw/mcf_uart.c @@ -8,7 +8,7 @@ #include "hw.h" #include "mcf.h" #include "qemu-char.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" typedef struct { MemoryRegion iomem; diff --git a/hw/milkymist.c b/hw/milkymist.c index c26ea4aed2..588522260b 100644 --- a/hw/milkymist.c +++ b/hw/milkymist.c @@ -28,7 +28,7 @@ #include "blockdev.h" #include "milkymist-hw.h" #include "lm32.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define BIOS_FILENAME "mmone-bios.bin" #define BIOS_OFFSET 0x00860000 diff --git a/hw/mips.h b/hw/mips.h index f7e9b7e2c1..291e85f6b9 100644 --- a/hw/mips.h +++ b/hw/mips.h @@ -2,7 +2,7 @@ #define HW_MIPS_H /* Definitions for mips board emulation. */ -#include "memory.h" +#include "exec/memory.h" /* gt64xxx.c */ PCIBus *gt64120_register(qemu_irq *pic); diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c index b46f7fdcb1..34619b7e3e 100644 --- a/hw/mips_fulong2e.c +++ b/hw/mips_fulong2e.c @@ -42,7 +42,7 @@ #include "mc146818rtc.h" #include "i8254.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define DEBUG_FULONG2E_INIT diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c index 8e5e8ef1af..0befc99210 100644 --- a/hw/mips_jazz.c +++ b/hw/mips_jazz.c @@ -41,7 +41,7 @@ #include "pcspk.h" #include "blockdev.h" #include "sysbus.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" enum jazz_model_e { diff --git a/hw/mips_malta.c b/hw/mips_malta.c index 60f237987f..d65d1256fd 100644 --- a/hw/mips_malta.c +++ b/hw/mips_malta.c @@ -46,7 +46,7 @@ #include "mc146818rtc.h" #include "i8254.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "sysbus.h" /* SysBusDevice */ //#define DEBUG_BOARD_INIT diff --git a/hw/mips_mipssim.c b/hw/mips_mipssim.c index 78317426a7..ac7dfa9b74 100644 --- a/hw/mips_mipssim.c +++ b/hw/mips_mipssim.c @@ -36,7 +36,7 @@ #include "loader.h" #include "elf.h" #include "sysbus.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" static struct _loaderparams { int ram_size; diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c index ec99d7d6a6..05494b9b40 100644 --- a/hw/mips_r4k.c +++ b/hw/mips_r4k.c @@ -25,7 +25,7 @@ #include "mc146818rtc.h" #include "i8254.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define MAX_IDE_BUS 2 diff --git a/hw/musicpal.c b/hw/musicpal.c index d7672e92a5..436b3f7c37 100644 --- a/hw/musicpal.c +++ b/hw/musicpal.c @@ -23,7 +23,7 @@ #include "ui/console.h" #include "i2c.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "ui/pixel_ops.h" #define MP_MISC_BASE 0x80002000 diff --git a/hw/ne2000-isa.c b/hw/ne2000-isa.c index 99477a412a..c2c00c215f 100644 --- a/hw/ne2000-isa.c +++ b/hw/ne2000-isa.c @@ -27,7 +27,7 @@ #include "qdev.h" #include "net/net.h" #include "ne2000.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" typedef struct ISANE2000State { ISADevice dev; diff --git a/hw/nseries.c b/hw/nseries.c index dcd3dc97d0..83adb97211 100644 --- a/hw/nseries.c +++ b/hw/nseries.c @@ -33,7 +33,7 @@ #include "loader.h" #include "blockdev.h" #include "sysbus.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" /* Nokia N8x0 support */ struct n800_s { diff --git a/hw/omap.h b/hw/omap.h index 2b383ffc44..188cda8771 100644 --- a/hw/omap.h +++ b/hw/omap.h @@ -17,7 +17,7 @@ * with this program; if not, see . */ #ifndef hw_omap_h -#include "memory.h" +#include "exec/memory.h" # define hw_omap_h "omap.h" #include "hw/irq.h" diff --git a/hw/omap_gpmc.c b/hw/omap_gpmc.c index 1f7c5bc5f3..02ab0ab568 100644 --- a/hw/omap_gpmc.c +++ b/hw/omap_gpmc.c @@ -21,8 +21,8 @@ #include "hw.h" #include "flash.h" #include "omap.h" -#include "memory.h" -#include "exec-memory.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" /* General-Purpose Memory Controller */ struct omap_gpmc_s { diff --git a/hw/omap_sx1.c b/hw/omap_sx1.c index 918a6f6a04..ca6eb9ddeb 100644 --- a/hw/omap_sx1.c +++ b/hw/omap_sx1.c @@ -32,7 +32,7 @@ #include "arm-misc.h" #include "flash.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" /*****************************************************************************/ /* Siemens SX1 Cellphone V1 */ diff --git a/hw/omap_uart.c b/hw/omap_uart.c index 92f27021bb..159b2d1cdd 100644 --- a/hw/omap_uart.c +++ b/hw/omap_uart.c @@ -21,7 +21,7 @@ #include "hw.h" #include "omap.h" #include "serial.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" /* UARTs */ struct omap_uart_s { diff --git a/hw/onenand.c b/hw/onenand.c index 1803e4c264..7d255c563f 100644 --- a/hw/onenand.c +++ b/hw/onenand.c @@ -23,8 +23,8 @@ #include "flash.h" #include "irq.h" #include "blockdev.h" -#include "memory.h" -#include "exec-memory.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" #include "sysbus.h" #include "qemu-error.h" diff --git a/hw/openrisc_sim.c b/hw/openrisc_sim.c index a879fb0dd0..c12097e12b 100644 --- a/hw/openrisc_sim.c +++ b/hw/openrisc_sim.c @@ -24,7 +24,7 @@ #include "serial.h" #include "net/net.h" #include "loader.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "sysemu.h" #include "sysbus.h" #include "qtest.h" diff --git a/hw/palm.c b/hw/palm.c index 5aaeb07460..e091bbcfc1 100644 --- a/hw/palm.c +++ b/hw/palm.c @@ -25,7 +25,7 @@ #include "arm-misc.h" #include "devices.h" #include "loader.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" static uint32_t static_readb(void *opaque, hwaddr offset) { diff --git a/hw/pam.h b/hw/pam.h index 2d77ebe0d9..8e9e349b1d 100644 --- a/hw/pam.h +++ b/hw/pam.h @@ -51,7 +51,7 @@ */ #include "qemu-common.h" -#include "memory.h" +#include "exec/memory.h" #define SMRAM_C_BASE 0xa0000 #define SMRAM_C_END 0xc0000 diff --git a/hw/pc.c b/hw/pc.c index d1b102c879..2452fd4214 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -47,8 +47,8 @@ #include "blockdev.h" #include "hw/block-common.h" #include "ui/qemu-spice.h" -#include "memory.h" -#include "exec-memory.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" #include "arch_init.h" #include "bitmap.h" diff --git a/hw/pc.h b/hw/pc.h index 5e4d103813..a73e3e7b5b 100644 --- a/hw/pc.h +++ b/hw/pc.h @@ -2,12 +2,12 @@ #define HW_PC_H #include "qemu-common.h" -#include "memory.h" -#include "ioport.h" +#include "exec/memory.h" +#include "exec/ioport.h" #include "isa.h" #include "fdc.h" #include "net/net.h" -#include "memory.h" +#include "exec/memory.h" #include "ioapic.h" /* PC-style peripherals (also used by other machines). */ diff --git a/hw/pc_piix.c b/hw/pc_piix.c index 7268dcd944..0d011348f2 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -41,8 +41,8 @@ #include "blockdev.h" #include "smbus.h" #include "xen.h" -#include "memory.h" -#include "exec-memory.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" #include "cpu.h" #ifdef CONFIG_XEN # include diff --git a/hw/pc_q35.c b/hw/pc_q35.c index 3429a9ae8f..2580d5ff34 100644 --- a/hw/pc_q35.c +++ b/hw/pc_q35.c @@ -36,7 +36,7 @@ #include "kvm.h" #include "kvm/clock.h" #include "q35.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "ich9.h" #include "hw/ide/pci.h" #include "hw/ide/ahci.h" diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 105fe9560e..fa0f08eb0a 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -33,7 +33,7 @@ #include "qmp-commands.h" #include "hw/pci/msi.h" #include "hw/pci/msix.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" //#define DEBUG_PCI #ifdef DEBUG_PCI diff --git a/hw/pci/pci.h b/hw/pci/pci.h index 41e5ddd1c4..d6ef4f6574 100644 --- a/hw/pci/pci.h +++ b/hw/pci/pci.h @@ -4,7 +4,7 @@ #include "qemu-common.h" #include "hw/qdev.h" -#include "memory.h" +#include "exec/memory.h" #include "dma.h" /* PCI includes legacy ISA access. */ diff --git a/hw/pci/pcie_host.c b/hw/pci/pcie_host.c index ab8d251de6..b2d942bce1 100644 --- a/hw/pci/pcie_host.c +++ b/hw/pci/pcie_host.c @@ -22,7 +22,7 @@ #include "hw/hw.h" #include "hw/pci/pci.h" #include "hw/pci/pcie_host.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" /* * PCI express mmcfig address diff --git a/hw/pci/pcie_host.h b/hw/pci/pcie_host.h index 150bef9736..1228e36cb2 100644 --- a/hw/pci/pcie_host.h +++ b/hw/pci/pcie_host.h @@ -22,7 +22,7 @@ #define PCIE_HOST_H #include "hw/pci/pci_host.h" -#include "memory.h" +#include "exec/memory.h" #define TYPE_PCIE_HOST_BRIDGE "pcie-host-bridge" #define PCIE_HOST_BRIDGE(obj) \ diff --git a/hw/pci/shpc.h b/hw/pci/shpc.h index 130b71df30..6374e68bdb 100644 --- a/hw/pci/shpc.h +++ b/hw/pci/shpc.h @@ -2,7 +2,7 @@ #define SHPC_H #include "qemu-common.h" -#include "memory.h" +#include "exec/memory.h" #include "vmstate.h" struct SHPCDevice { diff --git a/hw/pci_bridge_dev.c b/hw/pci_bridge_dev.c index dbb4b3b433..7818dcc350 100644 --- a/hw/pci_bridge_dev.c +++ b/hw/pci_bridge_dev.c @@ -24,7 +24,7 @@ #include "pci/msi.h" #include "pci/shpc.h" #include "pci/slotid_cap.h" -#include "memory.h" +#include "exec/memory.h" #include "pci/pci_bus.h" #define REDHAT_PCI_VENDOR_ID 0x1b36 diff --git a/hw/pcnet.h b/hw/pcnet.h index 96643117a0..9dee6f3e2c 100644 --- a/hw/pcnet.h +++ b/hw/pcnet.h @@ -7,7 +7,7 @@ #define PCNET_LOOPTEST_CRC 1 #define PCNET_LOOPTEST_NOCRC 2 -#include "memory.h" +#include "exec/memory.h" /* BUS CONFIGURATION REGISTERS */ #define BCR_MSRDA 0 diff --git a/hw/petalogix_ml605_mmu.c b/hw/petalogix_ml605_mmu.c index df51a74450..4eab0f2d8b 100644 --- a/hw/petalogix_ml605_mmu.c +++ b/hw/petalogix_ml605_mmu.c @@ -35,7 +35,7 @@ #include "xilinx.h" #include "blockdev.h" #include "serial.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "ssi.h" #include "microblaze_boot.h" diff --git a/hw/petalogix_s3adsp1800_mmu.c b/hw/petalogix_s3adsp1800_mmu.c index 37b0d5595a..124a88eeda 100644 --- a/hw/petalogix_s3adsp1800_mmu.c +++ b/hw/petalogix_s3adsp1800_mmu.c @@ -32,7 +32,7 @@ #include "boards.h" #include "xilinx.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "microblaze_boot.h" #include "microblaze_pic_cpu.h" diff --git a/hw/pflash_cfi01.c b/hw/pflash_cfi01.c index a2f6360838..36af4647df 100644 --- a/hw/pflash_cfi01.c +++ b/hw/pflash_cfi01.c @@ -40,7 +40,7 @@ #include "flash.h" #include "block/block.h" #include "qemu-timer.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "host-utils.h" #include "sysbus.h" diff --git a/hw/pflash_cfi02.c b/hw/pflash_cfi02.c index beab67fc87..c689cc9f42 100644 --- a/hw/pflash_cfi02.c +++ b/hw/pflash_cfi02.c @@ -39,7 +39,7 @@ #include "flash.h" #include "qemu-timer.h" #include "block/block.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "host-utils.h" #include "sysbus.h" diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 4690bd8b00..798e67cedf 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -33,7 +33,7 @@ #include "hw/loader.h" #include "elf.h" #include "hw/sysbus.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "host-utils.h" #include "hw/ppce500_pci.h" diff --git a/hw/ppc405_boards.c b/hw/ppc405_boards.c index b875e3b615..5a0e0260e6 100644 --- a/hw/ppc405_boards.c +++ b/hw/ppc405_boards.c @@ -32,7 +32,7 @@ #include "qemu-log.h" #include "loader.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define BIOS_FILENAME "ppc405_rom.bin" #define BIOS_SIZE (2048 * 1024) diff --git a/hw/ppc405_uc.c b/hw/ppc405_uc.c index 0f458ef772..aabb2efb48 100644 --- a/hw/ppc405_uc.c +++ b/hw/ppc405_uc.c @@ -28,7 +28,7 @@ #include "qemu-timer.h" #include "sysemu.h" #include "qemu-log.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define DEBUG_OPBA #define DEBUG_SDRAM diff --git a/hw/ppc440_bamboo.c b/hw/ppc440_bamboo.c index 5193a0c4be..591d7b0088 100644 --- a/hw/ppc440_bamboo.c +++ b/hw/ppc440_bamboo.c @@ -22,7 +22,7 @@ #include "device_tree.h" #include "loader.h" #include "elf.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "serial.h" #include "ppc.h" #include "ppc405.h" diff --git a/hw/ppc4xx_devs.c b/hw/ppc4xx_devs.c index bac8d8769a..3b9dc06716 100644 --- a/hw/ppc4xx_devs.c +++ b/hw/ppc4xx_devs.c @@ -25,7 +25,7 @@ #include "ppc.h" #include "ppc4xx.h" #include "qemu-log.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" //#define DEBUG_MMIO //#define DEBUG_UNASSIGNED diff --git a/hw/ppc4xx_pci.c b/hw/ppc4xx_pci.c index 3e8af11f08..ba2d669b83 100644 --- a/hw/ppc4xx_pci.c +++ b/hw/ppc4xx_pci.c @@ -24,7 +24,7 @@ #include "ppc4xx.h" #include "pci/pci.h" #include "pci/pci_host.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #undef DEBUG #ifdef DEBUG diff --git a/hw/ppc_mac.h b/hw/ppc_mac.h index 524b2368a4..89c7d66386 100644 --- a/hw/ppc_mac.h +++ b/hw/ppc_mac.h @@ -25,7 +25,7 @@ #if !defined(__PPC_MAC_H__) #define __PPC_MAC_H__ -#include "memory.h" +#include "exec/memory.h" /* SMP is not enabled, for now */ #define MAX_CPUS 1 diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c index 657f405f1b..b2d02eaff2 100644 --- a/hw/ppc_newworld.c +++ b/hw/ppc_newworld.c @@ -66,7 +66,7 @@ #include "kvm_ppc.h" #include "hw/usb.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "sysbus.h" #define MAX_IDE_BUS 2 diff --git a/hw/ppc_oldworld.c b/hw/ppc_oldworld.c index a149306cc9..7a8a039d7e 100644 --- a/hw/ppc_oldworld.c +++ b/hw/ppc_oldworld.c @@ -42,7 +42,7 @@ #include "kvm.h" #include "kvm_ppc.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define MAX_IDE_BUS 2 #define CFG_ADDR 0xf0000510 diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c index 25cc0490f9..aa46cc6f55 100644 --- a/hw/ppc_prep.c +++ b/hw/ppc_prep.c @@ -39,7 +39,7 @@ #include "mc146818rtc.h" #include "blockdev.h" #include "arch_init.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" //#define HARD_DEBUG_PPC_IO //#define DEBUG_PPC_IO diff --git a/hw/ppce500_pci.c b/hw/ppce500_pci.c index 9bffbb9f87..feefc6596b 100644 --- a/hw/ppce500_pci.c +++ b/hw/ppce500_pci.c @@ -317,7 +317,7 @@ static const VMStateDescription vmstate_ppce500_pci = { } }; -#include "exec-memory.h" +#include "exec/address-spaces.h" static int e500_pcihost_bridge_initfn(PCIDevice *d) { diff --git a/hw/prep_pci.c b/hw/prep_pci.c index 5f22de647a..212a2ac4f1 100644 --- a/hw/prep_pci.c +++ b/hw/prep_pci.c @@ -26,7 +26,7 @@ #include "pci/pci.h" #include "pci/pci_host.h" #include "pc.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define TYPE_RAVEN_PCI_HOST_BRIDGE "raven-pcihost" diff --git a/hw/puv3.c b/hw/puv3.c index 9f8e294ad5..7814bc5051 100644 --- a/hw/puv3.c +++ b/hw/puv3.c @@ -12,7 +12,7 @@ #include "qemu-common.h" #include "ui/console.h" #include "elf.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "sysbus.h" #include "boards.h" #include "loader.h" diff --git a/hw/pxa.h b/hw/pxa.h index 49ac820ea2..c2577d1d94 100644 --- a/hw/pxa.h +++ b/hw/pxa.h @@ -9,7 +9,7 @@ #ifndef PXA_H # define PXA_H "pxa.h" -#include "memory.h" +#include "exec/memory.h" /* Interrupt numbers */ # define PXA2XX_PIC_SSP3 0 diff --git a/hw/qdev-addr.c b/hw/qdev-addr.c index 552ee21f82..3bfe101d79 100644 --- a/hw/qdev-addr.c +++ b/hw/qdev-addr.c @@ -1,6 +1,6 @@ #include "qdev.h" #include "qdev-addr.h" -#include "hwaddr.h" +#include "exec/hwaddr.h" #include "qapi/visitor.h" /* --- target physical address --- */ diff --git a/hw/r2d.c b/hw/r2d.c index b1c278f73f..d7a26bf398 100644 --- a/hw/r2d.c +++ b/hw/r2d.c @@ -37,7 +37,7 @@ #include "usb.h" #include "flash.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define FLASH_BASE 0x00000000 #define FLASH_SIZE 0x02000000 diff --git a/hw/realview.c b/hw/realview.c index 17d1ba2266..9c55bf29b7 100644 --- a/hw/realview.c +++ b/hw/realview.c @@ -17,7 +17,7 @@ #include "boards.h" #include "i2c.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define SMP_BOOT_ADDR 0xe0000000 #define SMP_BOOTREG_ADDR 0x10000030 diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c index b732bccef8..0a15625b73 100644 --- a/hw/s390-virtio.c +++ b/hw/s390-virtio.c @@ -29,7 +29,7 @@ #include "hw/virtio.h" #include "hw/sysbus.h" #include "kvm.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "hw/s390-virtio-bus.h" #include "hw/s390x/sclp.h" diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c index 5c274fa03d..bc9b0aeb00 100644 --- a/hw/s390x/sclp.c +++ b/hw/s390x/sclp.c @@ -14,7 +14,7 @@ #include "cpu.h" #include "kvm.h" -#include "memory.h" +#include "exec/memory.h" #include "sclp.h" diff --git a/hw/serial.c b/hw/serial.c index 07a2a11931..3968c4fc46 100644 --- a/hw/serial.c +++ b/hw/serial.c @@ -26,7 +26,7 @@ #include "serial.h" #include "qemu-char.h" #include "qemu-timer.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" //#define DEBUG_SERIAL diff --git a/hw/serial.h b/hw/serial.h index 2d7d614e09..5722f8a353 100644 --- a/hw/serial.h +++ b/hw/serial.h @@ -27,7 +27,7 @@ #include "hw.h" #include "sysemu.h" -#include "memory.h" +#include "exec/memory.h" #define UART_FIFO_LENGTH 16 /* 16550A Fifo Length */ diff --git a/hw/sh7750.c b/hw/sh7750.c index 8bcf0df96f..08945750c4 100644 --- a/hw/sh7750.c +++ b/hw/sh7750.c @@ -30,7 +30,7 @@ #include "sh7750_regnames.h" #include "sh_intc.h" #include "cpu.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define NB_DEVICES 4 diff --git a/hw/sh_intc.h b/hw/sh_intc.h index 80c9430577..6f11beeddd 100644 --- a/hw/sh_intc.h +++ b/hw/sh_intc.h @@ -3,7 +3,7 @@ #include "qemu-common.h" #include "irq.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" typedef unsigned char intc_enum; diff --git a/hw/sh_pci.c b/hw/sh_pci.c index 9ea08c8f8e..d5218420a3 100644 --- a/hw/sh_pci.c +++ b/hw/sh_pci.c @@ -26,7 +26,7 @@ #include "pci/pci.h" #include "pci/pci_host.h" #include "bswap.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" typedef struct SHPCIState { SysBusDevice busdev; diff --git a/hw/sh_serial.c b/hw/sh_serial.c index 9da5d08fee..63723496f1 100644 --- a/hw/sh_serial.c +++ b/hw/sh_serial.c @@ -27,7 +27,7 @@ #include "hw.h" #include "sh.h" #include "qemu-char.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" //#define DEBUG_SERIAL diff --git a/hw/sh_timer.c b/hw/sh_timer.c index c0365b1142..da6689f369 100644 --- a/hw/sh_timer.c +++ b/hw/sh_timer.c @@ -11,7 +11,7 @@ #include "hw.h" #include "sh.h" #include "qemu-timer.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "ptimer.h" //#define DEBUG_TIMER diff --git a/hw/shix.c b/hw/shix.c index b56dd54f75..821196e84c 100644 --- a/hw/shix.c +++ b/hw/shix.c @@ -32,7 +32,7 @@ #include "sysemu.h" #include "boards.h" #include "loader.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define BIOS_FILENAME "shix_bios.bin" #define BIOS_ADDRESS 0xA0000000 diff --git a/hw/soc_dma.h b/hw/soc_dma.h index 6ca4166184..7379731afd 100644 --- a/hw/soc_dma.h +++ b/hw/soc_dma.h @@ -22,7 +22,7 @@ #define HW_SOC_DMA_H 1 -#include "memory.h" +#include "exec/memory.h" #include "hw/irq.h" struct soc_dma_s; diff --git a/hw/spapr.c b/hw/spapr.c index 395c4ac69b..d1252fc68c 100644 --- a/hw/spapr.c +++ b/hw/spapr.c @@ -47,7 +47,7 @@ #include "kvm_ppc.h" #include "pci/pci.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "hw/usb.h" #include "qemu-config.h" diff --git a/hw/spapr_iommu.c b/hw/spapr_iommu.c index 3011b251d3..fb968b250b 100644 --- a/hw/spapr_iommu.c +++ b/hw/spapr_iommu.c @@ -21,7 +21,7 @@ #include "qdev.h" #include "kvm_ppc.h" #include "dma.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "hw/spapr.h" diff --git a/hw/spapr_pci.c b/hw/spapr_pci.c index 786f6f4222..27b3ad3d60 100644 --- a/hw/spapr_pci.c +++ b/hw/spapr_pci.c @@ -29,7 +29,7 @@ #include "pci/pci_host.h" #include "hw/spapr.h" #include "hw/spapr_pci.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include #include "trace.h" diff --git a/hw/spitz.c b/hw/spitz.c index 1500161d44..48668a0f10 100644 --- a/hw/spitz.c +++ b/hw/spitz.c @@ -27,7 +27,7 @@ #include "boards.h" #include "blockdev.h" #include "sysbus.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #undef REG_FMT #define REG_FMT "0x%02lx" diff --git a/hw/stellaris.c b/hw/stellaris.c index f3eb4bbc01..368f8a5e73 100644 --- a/hw/stellaris.c +++ b/hw/stellaris.c @@ -15,7 +15,7 @@ #include "i2c.h" #include "net/net.h" #include "boards.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define GPIO_A 0 #define GPIO_B 1 diff --git a/hw/strongarm.h b/hw/strongarm.h index d30dd6ac5e..2893f94445 100644 --- a/hw/strongarm.h +++ b/hw/strongarm.h @@ -1,7 +1,7 @@ #ifndef _STRONGARM_H #define _STRONGARM_H -#include "memory.h" +#include "exec/memory.h" #define SA_CS0 0x00000000 #define SA_CS1 0x08000000 diff --git a/hw/sun4u.c b/hw/sun4u.c index d9e752fe83..000f6118e1 100644 --- a/hw/sun4u.c +++ b/hw/sun4u.c @@ -39,7 +39,7 @@ #include "loader.h" #include "elf.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" //#define DEBUG_IRQ //#define DEBUG_EBUS diff --git a/hw/sysbus.c b/hw/sysbus.c index ef8ffb6603..7ab250463c 100644 --- a/hw/sysbus.c +++ b/hw/sysbus.c @@ -19,7 +19,7 @@ #include "sysbus.h" #include "monitor.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent); static char *sysbus_get_fw_dev_path(DeviceState *dev); diff --git a/hw/sysbus.h b/hw/sysbus.h index e58baaae36..669cf87ae9 100644 --- a/hw/sysbus.h +++ b/hw/sysbus.h @@ -4,7 +4,7 @@ /* Devices attached directly to the main system bus. */ #include "qdev.h" -#include "memory.h" +#include "exec/memory.h" #define QDEV_MAX_MMIO 32 #define QDEV_MAX_PIO 32 diff --git a/hw/tosa.c b/hw/tosa.c index 3991a909b5..6fdbec53ee 100644 --- a/hw/tosa.c +++ b/hw/tosa.c @@ -23,7 +23,7 @@ #include "ssi.h" #include "blockdev.h" #include "sysbus.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define TOSA_RAM 0x04000000 #define TOSA_ROM 0x00800000 diff --git a/hw/usb/libhw.c b/hw/usb/libhw.c index 24d3cad3a2..672d7a5598 100644 --- a/hw/usb/libhw.c +++ b/hw/usb/libhw.c @@ -20,7 +20,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "cpu-common.h" +#include "exec/cpu-common.h" #include "hw/usb.h" #include "dma.h" diff --git a/hw/versatile_pci.c b/hw/versatile_pci.c index 7a543b47d0..1f4d66934c 100644 --- a/hw/versatile_pci.c +++ b/hw/versatile_pci.c @@ -10,7 +10,7 @@ #include "sysbus.h" #include "pci/pci.h" #include "pci/pci_host.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" typedef struct { SysBusDevice busdev; diff --git a/hw/versatilepb.c b/hw/versatilepb.c index af398d9cca..bd9c01564a 100644 --- a/hw/versatilepb.c +++ b/hw/versatilepb.c @@ -16,7 +16,7 @@ #include "i2c.h" #include "boards.h" #include "blockdev.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "flash.h" #define VERSATILE_FLASH_ADDR 0x34000000 diff --git a/hw/vexpress.c b/hw/vexpress.c index 5c9c08b991..e7b9e93852 100644 --- a/hw/vexpress.c +++ b/hw/vexpress.c @@ -28,7 +28,7 @@ #include "net/net.h" #include "sysemu.h" #include "boards.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "blockdev.h" #include "flash.h" diff --git a/hw/vfio_pci.c b/hw/vfio_pci.c index 264e58a68b..096621cdbd 100644 --- a/hw/vfio_pci.c +++ b/hw/vfio_pci.c @@ -28,9 +28,9 @@ #include "config.h" #include "event_notifier.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "kvm.h" -#include "memory.h" +#include "exec/memory.h" #include "pci/msi.h" #include "pci/msix.h" #include "pci/pci.h" diff --git a/hw/vga_int.h b/hw/vga_int.h index 5efaee81d9..8d496ea9bf 100644 --- a/hw/vga_int.h +++ b/hw/vga_int.h @@ -26,7 +26,7 @@ #include #include "qapi/error.h" -#include "memory.h" +#include "exec/memory.h" #define ST01_V_RETRACE 0x08 #define ST01_DISP_ENABLE 0x01 diff --git a/hw/vhost.c b/hw/vhost.c index 16322a14f4..feaff64c15 100644 --- a/hw/vhost.c +++ b/hw/vhost.c @@ -18,7 +18,7 @@ #include "hw/hw.h" #include "range.h" #include -#include "exec-memory.h" +#include "exec/address-spaces.h" static void vhost_dev_sync_region(struct vhost_dev *dev, MemoryRegionSection *section, diff --git a/hw/vhost.h b/hw/vhost.h index 0c47229f91..6f6a906f4f 100644 --- a/hw/vhost.h +++ b/hw/vhost.h @@ -3,7 +3,7 @@ #include "hw/hw.h" #include "hw/virtio.h" -#include "memory.h" +#include "exec/memory.h" /* Generic structures common for any vhost based device. */ struct vhost_virtqueue { diff --git a/hw/virtex_ml507.c b/hw/virtex_ml507.c index 1fdbc497cc..0f27c2b414 100644 --- a/hw/virtex_ml507.c +++ b/hw/virtex_ml507.c @@ -33,7 +33,7 @@ #include "loader.h" #include "elf.h" #include "qemu-log.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "ppc.h" #include "ppc4xx.h" diff --git a/hw/virtio-balloon.c b/hw/virtio-balloon.c index dd1a6506cf..97d3a932d9 100644 --- a/hw/virtio-balloon.c +++ b/hw/virtio-balloon.c @@ -21,7 +21,7 @@ #include "balloon.h" #include "virtio-balloon.h" #include "kvm.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #if defined(__linux__) #include diff --git a/hw/vt82c686.c b/hw/vt82c686.c index f963912112..edceb5a01d 100644 --- a/hw/vt82c686.c +++ b/hw/vt82c686.c @@ -24,7 +24,7 @@ #include "pm_smbus.h" #include "sysemu.h" #include "qemu-timer.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" typedef uint32_t pci_addr_t; #include "pci/pci_host.h" diff --git a/hw/xen_platform.c b/hw/xen_platform.c index 023499eb55..e7611bb353 100644 --- a/hw/xen_platform.c +++ b/hw/xen_platform.c @@ -32,7 +32,7 @@ #include "xen_common.h" #include "xen_backend.h" #include "trace.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include diff --git a/hw/xen_pt.c b/hw/xen_pt.c index c782cdb283..5c50d562d9 100644 --- a/hw/xen_pt.c +++ b/hw/xen_pt.c @@ -59,7 +59,7 @@ #include "xen_backend.h" #include "xen_pt.h" #include "range.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #define XEN_PT_NR_IRQS (256) static uint8_t xen_pt_mapped_machine_irq[XEN_PT_NR_IRQS] = {0}; diff --git a/hw/xilinx_zynq.c b/hw/xilinx_zynq.c index 67adc52725..156648a5d1 100644 --- a/hw/xilinx_zynq.c +++ b/hw/xilinx_zynq.c @@ -18,7 +18,7 @@ #include "sysbus.h" #include "arm-misc.h" #include "net/net.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include "sysemu.h" #include "boards.h" #include "flash.h" diff --git a/hw/xtensa_lx60.c b/hw/xtensa_lx60.c index 0399de777e..c6c880eba5 100644 --- a/hw/xtensa_lx60.c +++ b/hw/xtensa_lx60.c @@ -29,8 +29,8 @@ #include "boards.h" #include "loader.h" #include "elf.h" -#include "memory.h" -#include "exec-memory.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" #include "serial.h" #include "net/net.h" #include "sysbus.h" diff --git a/hw/xtensa_sim.c b/hw/xtensa_sim.c index 0d633e4724..29b5f22a18 100644 --- a/hw/xtensa_sim.c +++ b/hw/xtensa_sim.c @@ -29,8 +29,8 @@ #include "boards.h" #include "loader.h" #include "elf.h" -#include "memory.h" -#include "exec-memory.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" static uint64_t translate_phys_addr(void *env, uint64_t addr) { diff --git a/hw/z2.c b/hw/z2.c index d46186430f..ec35f3e444 100644 --- a/hw/z2.c +++ b/hw/z2.c @@ -23,7 +23,7 @@ #include "blockdev.h" #include "ui/console.h" #include "audio/audio.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #ifdef DEBUG_Z2 #define DPRINTF(fmt, ...) \ diff --git a/exec-memory.h b/include/exec/address-spaces.h similarity index 97% rename from exec-memory.h rename to include/exec/address-spaces.h index ac1d07dfe4..3d12cddeec 100644 --- a/exec-memory.h +++ b/include/exec/address-spaces.h @@ -19,7 +19,7 @@ * you're one of them. */ -#include "memory.h" +#include "exec/memory.h" #ifndef CONFIG_USER_ONLY diff --git a/cpu-all.h b/include/exec/cpu-all.h similarity index 99% rename from cpu-all.h rename to include/exec/cpu-all.h index d6b2b19743..bec04e2008 100644 --- a/cpu-all.h +++ b/include/exec/cpu-all.h @@ -21,7 +21,7 @@ #include "qemu-common.h" #include "qemu-tls.h" -#include "cpu-common.h" +#include "exec/cpu-common.h" /* some important defines: * @@ -180,7 +180,7 @@ static inline void tswap64s(uint64_t *s) #if defined(CONFIG_USER_ONLY) #include -#include "qemu-user-types.h" +#include "exec/user/abitypes.h" /* On some host systems the guest address space is reserved on the host. * This allows the guest address space to be offset to a convenient location. diff --git a/cpu-common.h b/include/exec/cpu-common.h similarity index 98% rename from cpu-common.h rename to include/exec/cpu-common.h index d2fbafac9c..f83d6180f3 100644 --- a/cpu-common.h +++ b/include/exec/cpu-common.h @@ -3,10 +3,10 @@ /* CPU interfaces that are target independent. */ -#include "hwaddr.h" +#include "exec/hwaddr.h" #ifndef NEED_CPU_H -#include "poison.h" +#include "exec/poison.h" #endif #include "bswap.h" diff --git a/cpu-defs.h b/include/exec/cpu-defs.h similarity index 99% rename from cpu-defs.h rename to include/exec/cpu-defs.h index 3669241faf..8d2230e50e 100644 --- a/cpu-defs.h +++ b/include/exec/cpu-defs.h @@ -29,7 +29,7 @@ #include #include "osdep.h" #include "qemu-queue.h" -#include "hwaddr.h" +#include "exec/hwaddr.h" #ifndef TARGET_LONG_BITS #error TARGET_LONG_BITS must be defined before including this header diff --git a/cputlb.h b/include/exec/cputlb.h similarity index 100% rename from cputlb.h rename to include/exec/cputlb.h diff --git a/def-helper.h b/include/exec/def-helper.h similarity index 100% rename from def-helper.h rename to include/exec/def-helper.h diff --git a/exec-all.h b/include/exec/exec-all.h similarity index 98% rename from exec-all.h rename to include/exec/exec-all.h index e9b07cd986..2ae8aae3d6 100644 --- a/exec-all.h +++ b/include/exec/exec-all.h @@ -275,7 +275,7 @@ static inline void tb_add_jump(TranslationBlock *tb, int n, } } -#include "qemu-lock.h" +#include "exec/spinlock.h" extern spinlock_t tb_lock; @@ -353,22 +353,22 @@ void io_mem_write(struct MemoryRegion *mr, hwaddr addr, void tlb_fill(CPUArchState *env1, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr); -#include "softmmu_defs.h" +#include "exec/softmmu_defs.h" #define ACCESS_TYPE (NB_MMU_MODES + 1) #define MEMSUFFIX _code #define DATA_SIZE 1 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 2 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 4 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 8 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #undef ACCESS_TYPE #undef MEMSUFFIX diff --git a/gdbstub.h b/include/exec/gdbstub.h similarity index 100% rename from gdbstub.h rename to include/exec/gdbstub.h diff --git a/gen-icount.h b/include/exec/gen-icount.h similarity index 100% rename from gen-icount.h rename to include/exec/gen-icount.h diff --git a/hwaddr.h b/include/exec/hwaddr.h similarity index 100% rename from hwaddr.h rename to include/exec/hwaddr.h diff --git a/ioport.h b/include/exec/ioport.h similarity index 99% rename from ioport.h rename to include/exec/ioport.h index 23441cba08..fc28350a3c 100644 --- a/ioport.h +++ b/include/exec/ioport.h @@ -25,7 +25,7 @@ #define IOPORT_H #include "qemu-common.h" -#include "iorange.h" +#include "exec/iorange.h" typedef uint32_t pio_addr_t; #define FMT_pioaddr PRIx32 diff --git a/iorange.h b/include/exec/iorange.h similarity index 100% rename from iorange.h rename to include/exec/iorange.h diff --git a/memory-internal.h b/include/exec/memory-internal.h similarity index 100% rename from memory-internal.h rename to include/exec/memory-internal.h diff --git a/memory.h b/include/exec/memory.h similarity index 99% rename from memory.h rename to include/exec/memory.h index 9462bfd3ad..b0c474584f 100644 --- a/memory.h +++ b/include/exec/memory.h @@ -19,11 +19,11 @@ #include #include #include "qemu-common.h" -#include "cpu-common.h" -#include "hwaddr.h" +#include "exec/cpu-common.h" +#include "exec/hwaddr.h" #include "qemu-queue.h" -#include "iorange.h" -#include "ioport.h" +#include "exec/iorange.h" +#include "exec/ioport.h" #include "int128.h" typedef struct MemoryRegionOps MemoryRegionOps; diff --git a/poison.h b/include/exec/poison.h similarity index 100% rename from poison.h rename to include/exec/poison.h diff --git a/softmmu-semi.h b/include/exec/softmmu-semi.h similarity index 100% rename from softmmu-semi.h rename to include/exec/softmmu-semi.h diff --git a/softmmu_defs.h b/include/exec/softmmu_defs.h similarity index 100% rename from softmmu_defs.h rename to include/exec/softmmu_defs.h diff --git a/softmmu_exec.h b/include/exec/softmmu_exec.h similarity index 72% rename from softmmu_exec.h rename to include/exec/softmmu_exec.h index 8c73985599..3e4e886a30 100644 --- a/softmmu_exec.h +++ b/include/exec/softmmu_exec.h @@ -19,37 +19,37 @@ #define ldul_executive ldl_executive #define ldul_supervisor ldl_supervisor -#include "softmmu_defs.h" +#include "exec/softmmu_defs.h" #define ACCESS_TYPE 0 #define MEMSUFFIX MMU_MODE0_SUFFIX #define DATA_SIZE 1 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 2 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 4 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 8 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #undef ACCESS_TYPE #undef MEMSUFFIX #define ACCESS_TYPE 1 #define MEMSUFFIX MMU_MODE1_SUFFIX #define DATA_SIZE 1 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 2 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 4 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 8 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #undef ACCESS_TYPE #undef MEMSUFFIX @@ -58,16 +58,16 @@ #define ACCESS_TYPE 2 #define MEMSUFFIX MMU_MODE2_SUFFIX #define DATA_SIZE 1 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 2 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 4 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 8 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #undef ACCESS_TYPE #undef MEMSUFFIX #endif /* (NB_MMU_MODES >= 3) */ @@ -77,16 +77,16 @@ #define ACCESS_TYPE 3 #define MEMSUFFIX MMU_MODE3_SUFFIX #define DATA_SIZE 1 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 2 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 4 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 8 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #undef ACCESS_TYPE #undef MEMSUFFIX #endif /* (NB_MMU_MODES >= 4) */ @@ -96,16 +96,16 @@ #define ACCESS_TYPE 4 #define MEMSUFFIX MMU_MODE4_SUFFIX #define DATA_SIZE 1 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 2 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 4 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 8 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #undef ACCESS_TYPE #undef MEMSUFFIX #endif /* (NB_MMU_MODES >= 5) */ @@ -115,16 +115,16 @@ #define ACCESS_TYPE 5 #define MEMSUFFIX MMU_MODE5_SUFFIX #define DATA_SIZE 1 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 2 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 4 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 8 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #undef ACCESS_TYPE #undef MEMSUFFIX #endif /* (NB_MMU_MODES >= 6) */ @@ -137,16 +137,16 @@ #define ACCESS_TYPE (NB_MMU_MODES) #define MEMSUFFIX _data #define DATA_SIZE 1 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 2 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 4 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #define DATA_SIZE 8 -#include "softmmu_header.h" +#include "exec/softmmu_header.h" #undef ACCESS_TYPE #undef MEMSUFFIX diff --git a/softmmu_header.h b/include/exec/softmmu_header.h similarity index 100% rename from softmmu_header.h rename to include/exec/softmmu_header.h diff --git a/softmmu_template.h b/include/exec/softmmu_template.h similarity index 99% rename from softmmu_template.h rename to include/exec/softmmu_template.h index ce30d8bddc..15d4c519ee 100644 --- a/softmmu_template.h +++ b/include/exec/softmmu_template.h @@ -22,7 +22,7 @@ * License along with this library; if not, see . */ #include "qemu-timer.h" -#include "memory.h" +#include "exec/memory.h" #define DATA_SIZE (1 << SHIFT) diff --git a/qemu-lock.h b/include/exec/spinlock.h similarity index 100% rename from qemu-lock.h rename to include/exec/spinlock.h diff --git a/qemu-user-types.h b/include/exec/user/abitypes.h similarity index 100% rename from qemu-user-types.h rename to include/exec/user/abitypes.h diff --git a/thunk.h b/include/exec/user/thunk.h similarity index 100% rename from thunk.h rename to include/exec/user/thunk.h diff --git a/ioport.c b/ioport.c index 6e4ca0dd91..a0ac2a0a41 100644 --- a/ioport.c +++ b/ioport.c @@ -25,9 +25,9 @@ * splitted out ioport related stuffs from vl.c. */ -#include "ioport.h" +#include "exec/ioport.h" #include "trace.h" -#include "memory.h" +#include "exec/memory.h" /***********************************************************/ /* IO Port */ diff --git a/kvm-all.c b/kvm-all.c index 759ef17ab0..c2588594e1 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -27,11 +27,11 @@ #include "sysemu.h" #include "hw/hw.h" #include "hw/pci/msi.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "kvm.h" #include "bswap.h" -#include "memory.h" -#include "exec-memory.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" #include "event_notifier.h" /* This check must be after config-host.h is included */ diff --git a/kvm-stub.c b/kvm-stub.c index d65fd04507..8de8ebd3d2 100644 --- a/kvm-stub.c +++ b/kvm-stub.c @@ -14,7 +14,7 @@ #include "hw/hw.h" #include "hw/pci/msi.h" #include "cpu.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "kvm.h" KVMState *kvm_state; diff --git a/linux-user/qemu.h b/linux-user/qemu.h index ceddb3ce72..2af883bf74 100644 --- a/linux-user/qemu.h +++ b/linux-user/qemu.h @@ -11,13 +11,13 @@ #include #endif /* DEBUG_REMAP */ -#include "qemu-user-types.h" +#include "exec/user/abitypes.h" -#include "thunk.h" +#include "exec/user/thunk.h" #include "syscall_defs.h" #include "syscall.h" #include "target_signal.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "qemu-queue.h" #if defined(CONFIG_USE_NPTL) diff --git a/memory.c b/memory.c index 741985385c..d40193d474 100644 --- a/memory.c +++ b/memory.c @@ -13,14 +13,14 @@ * GNU GPL, version 2 or (at your option) any later version. */ -#include "memory.h" -#include "exec-memory.h" -#include "ioport.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" +#include "exec/ioport.h" #include "bitops.h" #include "kvm.h" #include -#include "memory-internal.h" +#include "exec/memory-internal.h" static unsigned memory_region_transaction_depth; static bool memory_region_update_pending; diff --git a/memory_mapping-stub.c b/memory_mapping-stub.c index 76be34d89f..5f5fb99c58 100644 --- a/memory_mapping-stub.c +++ b/memory_mapping-stub.c @@ -12,7 +12,7 @@ */ #include "cpu.h" -#include "cpu-all.h" +#include "exec/cpu-all.h" #include "memory_mapping.h" int qemu_get_guest_memory_mapping(MemoryMappingList *list) diff --git a/memory_mapping.c b/memory_mapping.c index a82e190cab..c829a9fa34 100644 --- a/memory_mapping.c +++ b/memory_mapping.c @@ -12,7 +12,7 @@ */ #include "cpu.h" -#include "cpu-all.h" +#include "exec/cpu-all.h" #include "memory_mapping.h" static void memory_mapping_list_add_mapping_sorted(MemoryMappingList *list, diff --git a/monitor.c b/monitor.c index 7d5c8a622c..a3e010968e 100644 --- a/monitor.c +++ b/monitor.c @@ -30,7 +30,7 @@ #include "hw/pci/pci.h" #include "hw/watchdog.h" #include "hw/loader.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "net/net.h" #include "net/slirp.h" #include "qemu-char.h" @@ -63,7 +63,7 @@ #include "trace/simple.h" #endif #include "ui/qemu-spice.h" -#include "memory.h" +#include "exec/memory.h" #include "qmp-commands.h" #include "hmp.h" #include "qemu-thread.h" diff --git a/qtest.c b/qtest.c index fbfab4e1a7..ebe3963167 100644 --- a/qtest.c +++ b/qtest.c @@ -14,8 +14,8 @@ #include "qtest.h" #include "hw/qdev.h" #include "qemu-char.h" -#include "ioport.h" -#include "memory.h" +#include "exec/ioport.h" +#include "exec/memory.h" #include "hw/irq.h" #include "sysemu.h" #include "cpus.h" diff --git a/savevm.c b/savevm.c index ae8787868f..cb33501ecc 100644 --- a/savevm.c +++ b/savevm.c @@ -82,7 +82,7 @@ #include "qemu-queue.h" #include "qemu-timer.h" #include "cpus.h" -#include "memory.h" +#include "exec/memory.h" #include "qmp-commands.h" #include "trace.h" #include "bitops.h" diff --git a/scripts/feature_to_c.sh b/scripts/feature_to_c.sh index b62da8a0bd..888548e58b 100644 --- a/scripts/feature_to_c.sh +++ b/scripts/feature_to_c.sh @@ -38,7 +38,7 @@ for input; do ${AWK:-awk} 'BEGIN { n = 0 printf "#include \"config.h\"\n" printf "#include \"qemu-common.h\"\n" - printf "#include \"gdbstub.h\"\n" + printf "#include \"exec/gdbstub.h\"\n" print "static const char '$arrayname'[] = {" for (i = 0; i < 255; i++) _ord_[sprintf("%c", i)] = i diff --git a/target-alpha/cpu.h b/target-alpha/cpu.h index 9939d61ca8..137703f6d7 100644 --- a/target-alpha/cpu.h +++ b/target-alpha/cpu.h @@ -27,7 +27,7 @@ #define CPUArchState struct CPUAlphaState -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #include "softfloat.h" @@ -295,7 +295,7 @@ struct CPUAlphaState { #define cpu_gen_code cpu_alpha_gen_code #define cpu_signal_handler cpu_alpha_signal_handler -#include "cpu-all.h" +#include "exec/cpu-all.h" #include "cpu-qom.h" enum { @@ -520,7 +520,7 @@ static inline bool cpu_has_work(CPUState *cpu) | CPU_INTERRUPT_MCHK); } -#include "exec-all.h" +#include "exec/exec-all.h" static inline void cpu_pc_from_tb(CPUAlphaState *env, TranslationBlock *tb) { diff --git a/target-alpha/helper.h b/target-alpha/helper.h index dd55f89aad..eac3041b87 100644 --- a/target-alpha/helper.h +++ b/target-alpha/helper.h @@ -1,4 +1,4 @@ -#include "def-helper.h" +#include "exec/def-helper.h" DEF_HELPER_3(excp, noreturn, env, int, int) DEF_HELPER_FLAGS_1(load_pcc, TCG_CALL_NO_RWG_SE, i64, env) @@ -119,4 +119,4 @@ DEF_HELPER_FLAGS_0(get_time, TCG_CALL_NO_RWG, i64) DEF_HELPER_FLAGS_2(set_alarm, TCG_CALL_NO_RWG, void, env, i64) #endif -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-alpha/mem_helper.c b/target-alpha/mem_helper.c index 64b33f6518..3d2cd61358 100644 --- a/target-alpha/mem_helper.c +++ b/target-alpha/mem_helper.c @@ -117,22 +117,22 @@ void cpu_unassigned_access(CPUAlphaState *env, hwaddr addr, dynamic_excp(env, 0, EXCP_MCHK, 0); } -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #define MMUSUFFIX _mmu #define ALIGNED_ONLY #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" /* try to fill the TLB and return an exception if error. If retaddr is NULL, it means that the function was called in C code (i.e. not diff --git a/target-alpha/translate.c b/target-alpha/translate.c index f57c8fd91f..2d0d891128 100644 --- a/target-alpha/translate.c +++ b/target-alpha/translate.c @@ -88,7 +88,7 @@ static TCGv cpu_usp; /* register names */ static char cpu_reg_names[10*4+21*5 + 10*5+21*6]; -#include "gen-icount.h" +#include "exec/gen-icount.h" static void alpha_translate_init(void) { diff --git a/target-arm/arm-semi.c b/target-arm/arm-semi.c index 7743d67010..847318d1f4 100644 --- a/target-arm/arm-semi.c +++ b/target-arm/arm-semi.c @@ -33,7 +33,7 @@ #define ARM_ANGEL_HEAP_SIZE (128 * 1024 * 1024) #else #include "qemu-common.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "hw/arm-misc.h" #endif @@ -113,7 +113,7 @@ static inline uint32_t set_swi_errno(CPUARMState *env, uint32_t code) return code; } -#include "softmmu-semi.h" +#include "exec/softmmu-semi.h" #endif static target_ulong arm_semi_syscall_len; diff --git a/target-arm/cpu.h b/target-arm/cpu.h index e4ff918fa4..7f87efa7d9 100644 --- a/target-arm/cpu.h +++ b/target-arm/cpu.h @@ -27,7 +27,7 @@ #include "config.h" #include "qemu-common.h" -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #include "softfloat.h" @@ -659,7 +659,7 @@ static inline void cpu_clone_regs(CPUARMState *env, target_ulong newsp) } #endif -#include "cpu-all.h" +#include "exec/cpu-all.h" /* Bit usage in the TB flags field: */ #define ARM_TBFLAG_THUMB_SHIFT 0 @@ -726,7 +726,7 @@ static inline bool cpu_has_work(CPUState *cpu) (CPU_INTERRUPT_FIQ | CPU_INTERRUPT_HARD | CPU_INTERRUPT_EXITTB); } -#include "exec-all.h" +#include "exec/exec-all.h" static inline void cpu_pc_from_tb(CPUARMState *env, TranslationBlock *tb) { diff --git a/target-arm/helper.c b/target-arm/helper.c index ab8b734933..1f7a3c04c3 100644 --- a/target-arm/helper.c +++ b/target-arm/helper.c @@ -1,5 +1,5 @@ #include "cpu.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "helper.h" #include "host-utils.h" #include "sysemu.h" diff --git a/target-arm/helper.h b/target-arm/helper.h index 3d23ceb257..8544f82a94 100644 --- a/target-arm/helper.h +++ b/target-arm/helper.h @@ -1,4 +1,4 @@ -#include "def-helper.h" +#include "exec/def-helper.h" DEF_HELPER_FLAGS_1(clz, TCG_CALL_NO_RWG_SE, i32, i32) DEF_HELPER_FLAGS_1(sxtb16, TCG_CALL_NO_RWG_SE, i32, i32) @@ -463,4 +463,4 @@ DEF_HELPER_3(neon_qzip8, void, env, i32, i32) DEF_HELPER_3(neon_qzip16, void, env, i32, i32) DEF_HELPER_3(neon_qzip32, void, env, i32, i32) -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-arm/iwmmxt_helper.c b/target-arm/iwmmxt_helper.c index 1dd8d1a3af..7953b53f7e 100644 --- a/target-arm/iwmmxt_helper.c +++ b/target-arm/iwmmxt_helper.c @@ -23,7 +23,7 @@ #include #include "cpu.h" -#include "exec-all.h" +#include "exec/exec-all.h" #include "helper.h" /* iwMMXt macros extracted from GNU gdb. */ diff --git a/target-arm/neon_helper.c b/target-arm/neon_helper.c index 89280b6eeb..b028cc2c93 100644 --- a/target-arm/neon_helper.c +++ b/target-arm/neon_helper.c @@ -10,7 +10,7 @@ #include #include "cpu.h" -#include "exec-all.h" +#include "exec/exec-all.h" #include "helper.h" #define SIGNBIT (uint32_t)0x80000000 diff --git a/target-arm/op_helper.c b/target-arm/op_helper.c index 1fcc975945..99610d7734 100644 --- a/target-arm/op_helper.c +++ b/target-arm/op_helper.c @@ -52,21 +52,21 @@ uint32_t HELPER(neon_tbl)(CPUARMState *env, uint32_t ireg, uint32_t def, #if !defined(CONFIG_USER_ONLY) -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #define MMUSUFFIX _mmu #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" /* try to fill the TLB and return an exception if error. If retaddr is NULL, it means that the function was called in C code (i.e. not diff --git a/target-arm/translate.c b/target-arm/translate.c index 10c548d5ba..988b5428d4 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -98,7 +98,7 @@ static TCGv_i32 cpu_exclusive_info; static TCGv cpu_F0s, cpu_F1s; static TCGv_i64 cpu_F0d, cpu_F1d; -#include "gen-icount.h" +#include "exec/gen-icount.h" static const char *regnames[] = { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", diff --git a/target-cris/cpu.h b/target-cris/cpu.h index 2c27506d0d..63e6234f11 100644 --- a/target-cris/cpu.h +++ b/target-cris/cpu.h @@ -27,7 +27,7 @@ #define CPUArchState struct CPUCRISState -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #define TARGET_HAS_ICE 1 @@ -270,7 +270,7 @@ static inline void cpu_set_tls(CPUCRISState *env, target_ulong newtls) #define SFR_RW_MM_TLB_LO env->pregs[PR_SRS]][5 #define SFR_RW_MM_TLB_HI env->pregs[PR_SRS]][6 -#include "cpu-all.h" +#include "exec/cpu-all.h" static inline void cpu_get_tb_cpu_state(CPUCRISState *env, target_ulong *pc, target_ulong *cs_base, int *flags) @@ -292,7 +292,7 @@ static inline bool cpu_has_work(CPUState *cpu) return env->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI); } -#include "exec-all.h" +#include "exec/exec-all.h" static inline void cpu_pc_from_tb(CPUCRISState *env, TranslationBlock *tb) { diff --git a/target-cris/helper.h b/target-cris/helper.h index fe12083a16..8e8365cf69 100644 --- a/target-cris/helper.h +++ b/target-cris/helper.h @@ -1,4 +1,4 @@ -#include "def-helper.h" +#include "exec/def-helper.h" DEF_HELPER_2(raise_exception, void, env, i32) DEF_HELPER_2(tlb_flush_pid, void, env, i32) @@ -26,4 +26,4 @@ DEF_HELPER_FLAGS_3(evaluate_flags_move_2, TCG_CALL_NO_SE, i32, env, i32, i32) DEF_HELPER_1(evaluate_flags, void, env) DEF_HELPER_1(top_evaluate_flags, void, env) -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-cris/op_helper.c b/target-cris/op_helper.c index 31db42494d..cd0e17e099 100644 --- a/target-cris/op_helper.c +++ b/target-cris/op_helper.c @@ -35,21 +35,21 @@ #endif #if !defined(CONFIG_USER_ONLY) -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #define MMUSUFFIX _mmu #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" /* Try to fill the TLB and return an exception if error. If retaddr is NULL, it means that the function was called in C code (i.e. not diff --git a/target-cris/translate.c b/target-cris/translate.c index 2a92727843..09e6011ea4 100644 --- a/target-cris/translate.c +++ b/target-cris/translate.c @@ -70,7 +70,7 @@ static TCGv env_btaken; static TCGv env_btarget; static TCGv env_pc; -#include "gen-icount.h" +#include "exec/gen-icount.h" /* This is the state at translation time. */ typedef struct DisasContext { diff --git a/target-i386/arch_dump.c b/target-i386/arch_dump.c index 4240278edd..50d866f4c6 100644 --- a/target-i386/arch_dump.c +++ b/target-i386/arch_dump.c @@ -12,7 +12,7 @@ */ #include "cpu.h" -#include "cpu-all.h" +#include "exec/cpu-all.h" #include "dump.h" #include "elf.h" diff --git a/target-i386/arch_memory_mapping.c b/target-i386/arch_memory_mapping.c index 41f9d1c3e3..6dfb0f3f56 100644 --- a/target-i386/arch_memory_mapping.c +++ b/target-i386/arch_memory_mapping.c @@ -12,7 +12,7 @@ */ #include "cpu.h" -#include "cpu-all.h" +#include "exec/cpu-all.h" #include "memory_mapping.h" /* PAE Paging or IA-32e Paging */ diff --git a/target-i386/cpu.h b/target-i386/cpu.h index 386c4f6d98..f3f50a0499 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -44,7 +44,7 @@ #define CPUArchState struct CPUX86State -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #include "softfloat.h" @@ -1117,7 +1117,7 @@ static inline void cpu_clone_regs(CPUX86State *env, target_ulong newsp) } #endif -#include "cpu-all.h" +#include "exec/cpu-all.h" #include "svm.h" #if !defined(CONFIG_USER_ONLY) @@ -1137,7 +1137,7 @@ static inline bool cpu_has_work(CPUState *cpu) CPU_INTERRUPT_MCE)); } -#include "exec-all.h" +#include "exec/exec-all.h" static inline void cpu_pc_from_tb(CPUX86State *env, TranslationBlock *tb) { diff --git a/target-i386/fpu_helper.c b/target-i386/fpu_helper.c index dfc34a6253..44f3d27944 100644 --- a/target-i386/fpu_helper.c +++ b/target-i386/fpu_helper.c @@ -22,7 +22,7 @@ #include "helper.h" #if !defined(CONFIG_USER_ONLY) -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #endif /* !defined(CONFIG_USER_ONLY) */ #define FPU_RC_MASK 0xc00 diff --git a/target-i386/helper.h b/target-i386/helper.h index 970fcd98ff..9ed720d0ed 100644 --- a/target-i386/helper.h +++ b/target-i386/helper.h @@ -1,4 +1,4 @@ -#include "def-helper.h" +#include "exec/def-helper.h" DEF_HELPER_FLAGS_2(cc_compute_all, TCG_CALL_NO_SE, i32, env, int) DEF_HELPER_FLAGS_2(cc_compute_c, TCG_CALL_NO_SE, i32, env, int) @@ -220,4 +220,4 @@ DEF_HELPER_3(rclq, tl, env, tl, tl) DEF_HELPER_3(rcrq, tl, env, tl, tl) #endif -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-i386/ioport-user.c b/target-i386/ioport-user.c index 03fac22d22..f7636e0a87 100644 --- a/target-i386/ioport-user.c +++ b/target-i386/ioport-user.c @@ -21,7 +21,7 @@ #include "qemu.h" #include "qemu-common.h" -#include "ioport.h" +#include "exec/ioport.h" void cpu_outb(pio_addr_t addr, uint8_t val) { diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 824930c749..f7c95d5424 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -25,12 +25,12 @@ #include "kvm.h" #include "kvm_i386.h" #include "cpu.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "host-utils.h" #include "qemu-config.h" #include "hw/pc.h" #include "hw/apic.h" -#include "ioport.h" +#include "exec/ioport.h" #include "hyperv.h" #include "hw/pci/pci.h" diff --git a/target-i386/mem_helper.c b/target-i386/mem_helper.c index d0be77b1ed..6cf9ba076e 100644 --- a/target-i386/mem_helper.c +++ b/target-i386/mem_helper.c @@ -21,7 +21,7 @@ #include "helper.h" #if !defined(CONFIG_USER_ONLY) -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #endif /* !defined(CONFIG_USER_ONLY) */ /* broken thread support */ @@ -114,16 +114,16 @@ void helper_boundl(CPUX86State *env, target_ulong a0, int v) #define MMUSUFFIX _mmu #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #endif diff --git a/target-i386/misc_helper.c b/target-i386/misc_helper.c index a02037963f..db3126b79b 100644 --- a/target-i386/misc_helper.c +++ b/target-i386/misc_helper.c @@ -18,11 +18,11 @@ */ #include "cpu.h" -#include "ioport.h" +#include "exec/ioport.h" #include "helper.h" #if !defined(CONFIG_USER_ONLY) -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #endif /* !defined(CONFIG_USER_ONLY) */ /* check if Port I/O is allowed in TSS */ diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c index ff9337441b..be795d71eb 100644 --- a/target-i386/seg_helper.c +++ b/target-i386/seg_helper.c @@ -25,7 +25,7 @@ //#define DEBUG_PCALL #if !defined(CONFIG_USER_ONLY) -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #endif /* !defined(CONFIG_USER_ONLY) */ #ifdef DEBUG_PCALL diff --git a/target-i386/svm_helper.c b/target-i386/svm_helper.c index a238d95a55..3f246e9073 100644 --- a/target-i386/svm_helper.c +++ b/target-i386/svm_helper.c @@ -18,11 +18,11 @@ */ #include "cpu.h" -#include "cpu-all.h" +#include "exec/cpu-all.h" #include "helper.h" #if !defined(CONFIG_USER_ONLY) -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #endif /* !defined(CONFIG_USER_ONLY) */ /* Secure Virtual Machine helpers */ diff --git a/target-i386/translate.c b/target-i386/translate.c index 026201e98e..32d21f52d0 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -65,7 +65,7 @@ static TCGv cpu_tmp5; static uint8_t gen_opc_cc_op[OPC_BUF_SIZE]; -#include "gen-icount.h" +#include "exec/gen-icount.h" #ifdef TARGET_X86_64 static int x86_64_hregs; diff --git a/target-lm32/cpu.h b/target-lm32/cpu.h index 7243b4f7c7..4e202db32c 100644 --- a/target-lm32/cpu.h +++ b/target-lm32/cpu.h @@ -26,7 +26,7 @@ #include "config.h" #include "qemu-common.h" -#include "cpu-defs.h" +#include "exec/cpu-defs.h" struct CPULM32State; typedef struct CPULM32State CPULM32State; @@ -238,7 +238,7 @@ static inline int cpu_interrupts_enabled(CPULM32State *env) return env->ie & IE_IE; } -#include "cpu-all.h" +#include "exec/cpu-all.h" static inline target_ulong cpu_get_pc(CPULM32State *env) { @@ -260,7 +260,7 @@ static inline bool cpu_has_work(CPUState *cpu) return env->interrupt_request & CPU_INTERRUPT_HARD; } -#include "exec-all.h" +#include "exec/exec-all.h" static inline void cpu_pc_from_tb(CPULM32State *env, TranslationBlock *tb) { diff --git a/target-lm32/helper.h b/target-lm32/helper.h index 07f5670172..3ea15a6e80 100644 --- a/target-lm32/helper.h +++ b/target-lm32/helper.h @@ -1,4 +1,4 @@ -#include "def-helper.h" +#include "exec/def-helper.h" DEF_HELPER_2(raise_exception, void, env, i32) DEF_HELPER_1(hlt, void, env) @@ -11,4 +11,4 @@ DEF_HELPER_1(rcsr_ip, i32, env) DEF_HELPER_1(rcsr_jtx, i32, env) DEF_HELPER_1(rcsr_jrx, i32, env) -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-lm32/op_helper.c b/target-lm32/op_helper.c index 97b9625c1a..27b3cef25c 100644 --- a/target-lm32/op_helper.c +++ b/target-lm32/op_helper.c @@ -9,13 +9,13 @@ #if !defined(CONFIG_USER_ONLY) #define MMUSUFFIX _mmu #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" void helper_raise_exception(CPULM32State *env, uint32_t index) { diff --git a/target-lm32/translate.c b/target-lm32/translate.c index 9683b9a4b5..6b87340174 100644 --- a/target-lm32/translate.c +++ b/target-lm32/translate.c @@ -53,7 +53,7 @@ static TCGv cpu_deba; static TCGv cpu_bp[4]; static TCGv cpu_wp[4]; -#include "gen-icount.h" +#include "exec/gen-icount.h" enum { OP_FMT_RI, diff --git a/target-m68k/cpu.h b/target-m68k/cpu.h index f4fcdeee7a..b37af1fffd 100644 --- a/target-m68k/cpu.h +++ b/target-m68k/cpu.h @@ -26,7 +26,7 @@ #include "config.h" #include "qemu-common.h" -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #include "softfloat.h" @@ -242,7 +242,7 @@ static inline void cpu_clone_regs(CPUM68KState *env, target_ulong newsp) } #endif -#include "cpu-all.h" +#include "exec/cpu-all.h" static inline void cpu_get_tb_cpu_state(CPUM68KState *env, target_ulong *pc, target_ulong *cs_base, int *flags) @@ -261,7 +261,7 @@ static inline bool cpu_has_work(CPUState *cpu) return env->interrupt_request & CPU_INTERRUPT_HARD; } -#include "exec-all.h" +#include "exec/exec-all.h" static inline void cpu_pc_from_tb(CPUM68KState *env, TranslationBlock *tb) { diff --git a/target-m68k/helper.c b/target-m68k/helper.c index a5d0100473..a9a277865f 100644 --- a/target-m68k/helper.c +++ b/target-m68k/helper.c @@ -19,7 +19,7 @@ */ #include "cpu.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "helpers.h" diff --git a/target-m68k/helpers.h b/target-m68k/helpers.h index 8112b44a58..2b024502ba 100644 --- a/target-m68k/helpers.h +++ b/target-m68k/helpers.h @@ -1,4 +1,4 @@ -#include "def-helper.h" +#include "exec/def-helper.h" DEF_HELPER_1(bitrev, i32, i32) DEF_HELPER_1(ff1, i32, i32) @@ -51,4 +51,4 @@ DEF_HELPER_3(set_mac_extu, void, env, i32, i32) DEF_HELPER_2(flush_flags, void, env, i32) DEF_HELPER_2(raise_exception, void, env, i32) -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-m68k/m68k-semi.c b/target-m68k/m68k-semi.c index 9f7a24cdb4..e6c7dd2f9b 100644 --- a/target-m68k/m68k-semi.c +++ b/target-m68k/m68k-semi.c @@ -33,8 +33,8 @@ #define SEMIHOSTING_HEAP_SIZE (128 * 1024 * 1024) #else #include "qemu-common.h" -#include "gdbstub.h" -#include "softmmu-semi.h" +#include "exec/gdbstub.h" +#include "exec/softmmu-semi.h" #endif #include "sysemu.h" diff --git a/target-m68k/op_helper.c b/target-m68k/op_helper.c index b97ba5e28f..16df24c0ca 100644 --- a/target-m68k/op_helper.c +++ b/target-m68k/op_helper.c @@ -34,21 +34,21 @@ void do_interrupt_m68k_hardirq(CPUM68KState *env) extern int semihosting_enabled; -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #define MMUSUFFIX _mmu #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" /* Try to fill the TLB and return an exception if error. If retaddr is NULL, it means that the function was called in C code (i.e. not diff --git a/target-m68k/translate.c b/target-m68k/translate.c index d955c7a409..1c9b5ec8d4 100644 --- a/target-m68k/translate.c +++ b/target-m68k/translate.c @@ -61,7 +61,7 @@ static TCGv NULL_QREG; /* Used to distinguish stores from bad addressing modes. */ static TCGv store_dummy; -#include "gen-icount.h" +#include "exec/gen-icount.h" void m68k_tcg_init(void) { diff --git a/target-microblaze/cpu.h b/target-microblaze/cpu.h index 585bbd6dbc..5358941ae4 100644 --- a/target-microblaze/cpu.h +++ b/target-microblaze/cpu.h @@ -26,7 +26,7 @@ #define CPUArchState struct CPUMBState -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #include "softfloat.h" struct CPUMBState; typedef struct CPUMBState CPUMBState; @@ -353,7 +353,7 @@ static inline int cpu_interrupts_enabled(CPUMBState *env) return env->sregs[SR_MSR] & MSR_IE; } -#include "cpu-all.h" +#include "exec/cpu-all.h" static inline target_ulong cpu_get_pc(CPUMBState *env) { @@ -381,7 +381,7 @@ static inline bool cpu_has_work(CPUState *cpu) return env->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI); } -#include "exec-all.h" +#include "exec/exec-all.h" static inline void cpu_pc_from_tb(CPUMBState *env, TranslationBlock *tb) { diff --git a/target-microblaze/helper.h b/target-microblaze/helper.h index a667122e91..4e51429498 100644 --- a/target-microblaze/helper.h +++ b/target-microblaze/helper.h @@ -1,4 +1,4 @@ -#include "def-helper.h" +#include "exec/def-helper.h" DEF_HELPER_2(raise_exception, void, env, i32) DEF_HELPER_1(debug, void, env) @@ -38,4 +38,4 @@ DEF_HELPER_2(stackprot, void, env, i32) DEF_HELPER_2(get, i32, i32, i32) DEF_HELPER_3(put, void, i32, i32, i32) -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-microblaze/op_helper.c b/target-microblaze/op_helper.c index 7593517094..343dcc15e7 100644 --- a/target-microblaze/op_helper.c +++ b/target-microblaze/op_helper.c @@ -26,17 +26,17 @@ #define D(x) #if !defined(CONFIG_USER_ONLY) -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #define MMUSUFFIX _mmu #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" /* Try to fill the TLB and return an exception if error. If retaddr is NULL, it means that the function was called in C code (i.e. not diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c index 5946a5ba5c..58ce71267d 100644 --- a/target-microblaze/translate.c +++ b/target-microblaze/translate.c @@ -50,7 +50,7 @@ static TCGv env_btaken; static TCGv env_btarget; static TCGv env_iflags; -#include "gen-icount.h" +#include "exec/gen-icount.h" /* This is the state at translation time. */ typedef struct DisasContext { diff --git a/target-mips/cpu.h b/target-mips/cpu.h index aebb2d5b79..183ba9fbd8 100644 --- a/target-mips/cpu.h +++ b/target-mips/cpu.h @@ -12,7 +12,7 @@ #include "config.h" #include "qemu-common.h" #include "mips-defs.h" -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #include "softfloat.h" struct CPUMIPSState; @@ -560,7 +560,7 @@ static inline int cpu_mips_hw_interrupts_pending(CPUMIPSState *env) return r; } -#include "cpu-all.h" +#include "exec/cpu-all.h" /* Memory access type : * may be needed for precise access rights control and precise exceptions. @@ -738,7 +738,7 @@ static inline bool cpu_has_work(CPUState *cpu) return has_work; } -#include "exec-all.h" +#include "exec/exec-all.h" static inline void cpu_pc_from_tb(CPUMIPSState *env, TranslationBlock *tb) { diff --git a/target-mips/helper.h b/target-mips/helper.h index acf9ebd759..9ea60ec1bb 100644 --- a/target-mips/helper.h +++ b/target-mips/helper.h @@ -1,4 +1,4 @@ -#include "def-helper.h" +#include "exec/def-helper.h" DEF_HELPER_3(raise_exception_err, noreturn, env, i32, int) DEF_HELPER_2(raise_exception, noreturn, env, i32) @@ -707,4 +707,4 @@ DEF_HELPER_FLAGS_2(rddsp, 0, tl, tl, env) -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c index 2972ae3f0a..157f59e6bf 100644 --- a/target-mips/op_helper.c +++ b/target-mips/op_helper.c @@ -23,7 +23,7 @@ #include "helper.h" #if !defined(CONFIG_USER_ONLY) -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #endif /* !defined(CONFIG_USER_ONLY) */ #ifndef CONFIG_USER_ONLY @@ -2116,16 +2116,16 @@ static void QEMU_NORETURN do_unaligned_access(CPUMIPSState *env, #define ALIGNED_ONLY #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" static void do_unaligned_access(CPUMIPSState *env, target_ulong addr, int is_write, int is_user, uintptr_t retaddr) diff --git a/target-mips/translate.c b/target-mips/translate.c index 44e7617395..e81ff38476 100644 --- a/target-mips/translate.c +++ b/target-mips/translate.c @@ -1017,7 +1017,7 @@ static TCGv_i64 fpu_f64[32]; static uint32_t gen_opc_hflags[OPC_BUF_SIZE]; static target_ulong gen_opc_btarget[OPC_BUF_SIZE]; -#include "gen-icount.h" +#include "exec/gen-icount.h" #define gen_helper_0e0i(name, arg) do { \ TCGv_i32 helper_tmp = tcg_const_i32(arg); \ diff --git a/target-openrisc/cpu.h b/target-openrisc/cpu.h index c7b1750153..8dc56c2873 100644 --- a/target-openrisc/cpu.h +++ b/target-openrisc/cpu.h @@ -30,7 +30,7 @@ struct OpenRISCCPU; #include "config.h" #include "qemu-common.h" -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #include "softfloat.h" #include "qemu/cpu.h" #include "qapi/error.h" @@ -398,7 +398,7 @@ static inline void cpu_clone_regs(CPUOpenRISCState *env, target_ulong newsp) } #endif -#include "cpu-all.h" +#include "exec/cpu-all.h" static inline void cpu_get_tb_cpu_state(CPUOpenRISCState *env, target_ulong *pc, @@ -427,7 +427,7 @@ static inline bool cpu_has_work(CPUState *cpu) CPU_INTERRUPT_TIMER); } -#include "exec-all.h" +#include "exec/exec-all.h" static inline target_ulong cpu_get_pc(CPUOpenRISCState *env) { diff --git a/target-openrisc/helper.h b/target-openrisc/helper.h index 404d46447f..2af97901ce 100644 --- a/target-openrisc/helper.h +++ b/target-openrisc/helper.h @@ -17,7 +17,7 @@ * License along with this library; if not, see . */ -#include "def-helper.h" +#include "exec/def-helper.h" /* exception */ DEF_HELPER_FLAGS_2(exception, 0, void, env, i32) @@ -67,4 +67,4 @@ DEF_HELPER_FLAGS_1(rfe, 0, void, env) DEF_HELPER_FLAGS_4(mtspr, 0, void, env, tl, tl, tl) DEF_HELPER_FLAGS_4(mfspr, 0, tl, env, tl, tl, tl) -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-openrisc/interrupt.c b/target-openrisc/interrupt.c index 642da7de49..226ce43513 100644 --- a/target-openrisc/interrupt.c +++ b/target-openrisc/interrupt.c @@ -19,7 +19,7 @@ #include "cpu.h" #include "qemu-common.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "host-utils.h" #ifndef CONFIG_USER_ONLY #include "hw/loader.h" diff --git a/target-openrisc/mmu.c b/target-openrisc/mmu.c index f2a6523cfb..4eee44434f 100644 --- a/target-openrisc/mmu.c +++ b/target-openrisc/mmu.c @@ -20,7 +20,7 @@ #include "cpu.h" #include "qemu-common.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "host-utils.h" #ifndef CONFIG_USER_ONLY #include "hw/loader.h" diff --git a/target-openrisc/mmu_helper.c b/target-openrisc/mmu_helper.c index d2edebcb49..e46b092984 100644 --- a/target-openrisc/mmu_helper.c +++ b/target-openrisc/mmu_helper.c @@ -21,20 +21,20 @@ #include "cpu.h" #ifndef CONFIG_USER_ONLY -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #define MMUSUFFIX _mmu #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" void tlb_fill(CPUOpenRISCState *env, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c index 2cb9d69826..5883347fa7 100644 --- a/target-openrisc/translate.c +++ b/target-openrisc/translate.c @@ -19,7 +19,7 @@ */ #include "cpu.h" -#include "exec-all.h" +#include "exec/exec-all.h" #include "disas/disas.h" #include "tcg-op.h" #include "qemu-common.h" @@ -61,7 +61,7 @@ static TCGv_i32 fpcsr; static TCGv machi, maclo; static TCGv fpmaddhi, fpmaddlo; static TCGv_i32 env_flags; -#include "gen-icount.h" +#include "exec/gen-icount.h" void openrisc_translate_init(void) { diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h index 742d4f8ae3..610bcd544b 100644 --- a/target-ppc/cpu.h +++ b/target-ppc/cpu.h @@ -73,7 +73,7 @@ #define CPUArchState struct CPUPPCState -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #include "softfloat.h" @@ -1251,7 +1251,7 @@ static inline void cpu_clone_regs(CPUPPCState *env, target_ulong newsp) } #endif -#include "cpu-all.h" +#include "exec/cpu-all.h" /*****************************************************************************/ /* CRF definitions */ @@ -2224,7 +2224,7 @@ static inline bool cpu_has_work(CPUState *cpu) return msr_ee && (env->interrupt_request & CPU_INTERRUPT_HARD); } -#include "exec-all.h" +#include "exec/exec-all.h" static inline void cpu_pc_from_tb(CPUPPCState *env, TranslationBlock *tb) { diff --git a/target-ppc/helper.h b/target-ppc/helper.h index e588370e29..d2e9a55f28 100644 --- a/target-ppc/helper.h +++ b/target-ppc/helper.h @@ -1,4 +1,4 @@ -#include "def-helper.h" +#include "exec/def-helper.h" DEF_HELPER_3(raise_exception_err, void, env, i32, i32) DEF_HELPER_2(raise_exception, void, env, i32) @@ -414,4 +414,4 @@ DEF_HELPER_3(store_601_batl, void, env, i32, tl) DEF_HELPER_3(store_601_batu, void, env, i32, tl) #endif -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-ppc/kvm_ppc.h b/target-ppc/kvm_ppc.h index baad6eb75b..83f98729a2 100644 --- a/target-ppc/kvm_ppc.h +++ b/target-ppc/kvm_ppc.h @@ -9,7 +9,7 @@ #ifndef __KVM_PPC_H__ #define __KVM_PPC_H__ -#include "memory.h" +#include "exec/memory.h" void kvmppc_init(void); diff --git a/target-ppc/mem_helper.c b/target-ppc/mem_helper.c index 04c01445f9..2d7a349c32 100644 --- a/target-ppc/mem_helper.c +++ b/target-ppc/mem_helper.c @@ -23,7 +23,7 @@ #include "helper_regs.h" #if !defined(CONFIG_USER_ONLY) -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #endif /* !defined(CONFIG_USER_ONLY) */ //#define DEBUG_OP @@ -257,16 +257,16 @@ STVE(stvewx, cpu_stl_data, bswap32, u32) #define MMUSUFFIX _mmu #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" /* try to fill the TLB and return an exception if error. If retaddr is NULL, it means that the function was called in C code (i.e. not diff --git a/target-ppc/translate.c b/target-ppc/translate.c index 8a53105f89..a74d76b5a6 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c @@ -71,7 +71,7 @@ static TCGv cpu_reserve; static TCGv cpu_fpscr; static TCGv_i32 cpu_access_type; -#include "gen-icount.h" +#include "exec/gen-icount.h" void ppc_translate_init(void) { diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c index 984ca9fc63..cca63abf5d 100644 --- a/target-ppc/translate_init.c +++ b/target-ppc/translate_init.c @@ -24,7 +24,7 @@ */ #include "disas/bfd.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include #include "kvm_ppc.h" #include "arch_init.h" diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h index 0f9a1f7340..acb8c73174 100644 --- a/target-s390x/cpu.h +++ b/target-s390x/cpu.h @@ -28,13 +28,13 @@ #define CPUArchState struct CPUS390XState -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #define TARGET_PAGE_BITS 12 #define TARGET_PHYS_ADDR_SPACE_BITS 64 #define TARGET_VIRT_ADDR_SPACE_BITS 64 -#include "cpu-all.h" +#include "exec/cpu-all.h" #include "softfloat.h" @@ -350,7 +350,7 @@ static inline void cpu_set_tls(CPUS390XState *env, target_ulong newtls) #define cpu_gen_code cpu_s390x_gen_code #define cpu_signal_handler cpu_s390x_signal_handler -#include "exec-all.h" +#include "exec/exec-all.h" #ifdef CONFIG_USER_ONLY diff --git a/target-s390x/fpu_helper.c b/target-s390x/fpu_helper.c index ee9420d446..173f820428 100644 --- a/target-s390x/fpu_helper.c +++ b/target-s390x/fpu_helper.c @@ -22,7 +22,7 @@ #include "helper.h" #if !defined(CONFIG_USER_ONLY) -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #endif /* #define DEBUG_HELPER */ diff --git a/target-s390x/helper.c b/target-s390x/helper.c index b7b812a7e6..6e9b209713 100644 --- a/target-s390x/helper.c +++ b/target-s390x/helper.c @@ -19,7 +19,7 @@ */ #include "cpu.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "qemu-timer.h" #ifndef CONFIG_USER_ONLY #include "sysemu.h" diff --git a/target-s390x/helper.h b/target-s390x/helper.h index ac44eabd53..c4926c52ad 100644 --- a/target-s390x/helper.h +++ b/target-s390x/helper.h @@ -1,4 +1,4 @@ -#include "def-helper.h" +#include "exec/def-helper.h" DEF_HELPER_2(exception, void, env, i32) DEF_HELPER_4(nc, i32, env, i32, i64, i64) @@ -149,4 +149,4 @@ DEF_HELPER_3(cksm, void, env, i32, i32) DEF_HELPER_FLAGS_5(calc_cc, TCG_CALL_NO_RWG_SE, i32, env, i32, i64, i64, i64) -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-s390x/mem_helper.c b/target-s390x/mem_helper.c index 91b25e309d..bed21e6e1c 100644 --- a/target-s390x/mem_helper.c +++ b/target-s390x/mem_helper.c @@ -24,21 +24,21 @@ /*****************************************************************************/ /* Softmmu support */ #if !defined(CONFIG_USER_ONLY) -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #define MMUSUFFIX _mmu #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" /* try to fill the TLB and return an exception if error. If retaddr is NULL, it means that the function was called in C code (i.e. not diff --git a/target-s390x/misc_helper.c b/target-s390x/misc_helper.c index 38d8f2a627..a3336e16b0 100644 --- a/target-s390x/misc_helper.c +++ b/target-s390x/misc_helper.c @@ -19,7 +19,7 @@ */ #include "cpu.h" -#include "memory.h" +#include "exec/memory.h" #include "host-utils.h" #include "helper.h" #include @@ -30,7 +30,7 @@ #endif #if !defined(CONFIG_USER_ONLY) -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #include "sysemu.h" #endif diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 6e144a67a2..28e61c54b8 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -37,7 +37,7 @@ /* global register indexes */ static TCGv_ptr cpu_env; -#include "gen-icount.h" +#include "exec/gen-icount.h" #include "helper.h" #define GEN_HELPER 1 #include "helper.h" diff --git a/target-sh4/cpu.h b/target-sh4/cpu.h index 9a0e72b1fb..7c50c798b8 100644 --- a/target-sh4/cpu.h +++ b/target-sh4/cpu.h @@ -39,7 +39,7 @@ #define CPUArchState struct CPUSH4State -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #include "softfloat.h" @@ -264,7 +264,7 @@ static inline void cpu_clone_regs(CPUSH4State *env, target_ulong newsp) } #endif -#include "cpu-all.h" +#include "exec/cpu-all.h" /* Memory access type */ enum { @@ -378,7 +378,7 @@ static inline bool cpu_has_work(CPUState *cpu) return env->interrupt_request & CPU_INTERRUPT_HARD; } -#include "exec-all.h" +#include "exec/exec-all.h" static inline void cpu_pc_from_tb(CPUSH4State *env, TranslationBlock *tb) { diff --git a/target-sh4/helper.h b/target-sh4/helper.h index 304b77ba3f..7162448497 100644 --- a/target-sh4/helper.h +++ b/target-sh4/helper.h @@ -1,4 +1,4 @@ -#include "def-helper.h" +#include "exec/def-helper.h" DEF_HELPER_1(ldtlb, void, env) DEF_HELPER_1(raise_illegal_instruction, noreturn, env) @@ -47,4 +47,4 @@ DEF_HELPER_2(ftrc_DT, i32, env, f64) DEF_HELPER_3(fipr, void, env, i32, i32) DEF_HELPER_2(ftrv, void, env, i32) -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-sh4/op_helper.c b/target-sh4/op_helper.c index e8e87f5152..09e3d23aff 100644 --- a/target-sh4/op_helper.c +++ b/target-sh4/op_helper.c @@ -22,21 +22,21 @@ #include "helper.h" #ifndef CONFIG_USER_ONLY -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #define MMUSUFFIX _mmu #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" void tlb_fill(CPUSH4State *env, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) diff --git a/target-sh4/translate.c b/target-sh4/translate.c index 41d53e5c51..260aaab559 100644 --- a/target-sh4/translate.c +++ b/target-sh4/translate.c @@ -69,7 +69,7 @@ static TCGv cpu_flags, cpu_delayed_pc; static uint32_t gen_opc_hflags[OPC_BUF_SIZE]; -#include "gen-icount.h" +#include "exec/gen-icount.h" static void sh4_translate_init(void) { diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h index 013ecbd063..0ed511a399 100644 --- a/target-sparc/cpu.h +++ b/target-sparc/cpu.h @@ -25,7 +25,7 @@ #define CPUArchState struct CPUSPARCState -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #include "softfloat.h" @@ -701,7 +701,7 @@ static inline void cpu_clone_regs(CPUSPARCState *env, target_ulong newsp) } #endif -#include "cpu-all.h" +#include "exec/cpu-all.h" #ifdef TARGET_SPARC64 /* sun4u.c */ @@ -767,7 +767,7 @@ static inline bool cpu_has_work(CPUState *cpu) cpu_interrupts_enabled(env1); } -#include "exec-all.h" +#include "exec/exec-all.h" static inline void cpu_pc_from_tb(CPUSPARCState *env, TranslationBlock *tb) { diff --git a/target-sparc/helper.h b/target-sparc/helper.h index 098c482216..cfcdab1ea4 100644 --- a/target-sparc/helper.h +++ b/target-sparc/helper.h @@ -1,4 +1,4 @@ -#include "def-helper.h" +#include "exec/def-helper.h" #ifndef TARGET_SPARC64 DEF_HELPER_1(rett, void, env) @@ -173,4 +173,4 @@ VIS_CMPHELPER(cmpne); DEF_HELPER_1(compute_psr, void, env); DEF_HELPER_1(compute_C_icc, i32, env); -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-sparc/ldst_helper.c b/target-sparc/ldst_helper.c index 8d815e5038..cf1bddf2db 100644 --- a/target-sparc/ldst_helper.c +++ b/target-sparc/ldst_helper.c @@ -68,21 +68,21 @@ static void QEMU_NORETURN do_unaligned_access(CPUSPARCState *env, target_ulong addr, int is_write, int is_user, uintptr_t retaddr); -#include "softmmu_exec.h" +#include "exec/softmmu_exec.h" #define MMUSUFFIX _mmu #define ALIGNED_ONLY #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #endif #if defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY) diff --git a/target-sparc/mmu_helper.c b/target-sparc/mmu_helper.c index 2c89b20b68..a9649ae064 100644 --- a/target-sparc/mmu_helper.c +++ b/target-sparc/mmu_helper.c @@ -19,7 +19,7 @@ #include "cpu.h" #include "trace.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" /* Sparc MMU emulation */ diff --git a/target-sparc/translate.c b/target-sparc/translate.c index 88802b8486..ca75e1aa48 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -64,7 +64,7 @@ static TCGv_i64 cpu_fpr[TARGET_DPREGS]; static target_ulong gen_opc_npc[OPC_BUF_SIZE]; static target_ulong gen_opc_jump_pc[2]; -#include "gen-icount.h" +#include "exec/gen-icount.h" typedef struct DisasContext { target_ulong pc; /* current Program Counter: integer or DYNAMIC_PC */ diff --git a/target-unicore32/cpu.h b/target-unicore32/cpu.h index 676c5d9d99..cd8f730756 100644 --- a/target-unicore32/cpu.h +++ b/target-unicore32/cpu.h @@ -23,7 +23,7 @@ #include "config.h" #include "qemu-common.h" -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #include "softfloat.h" #define NB_MMU_MODES 2 @@ -157,9 +157,9 @@ static inline void cpu_set_tls(CPUUniCore32State *env, target_ulong newtls) env->regs[16] = newtls; } -#include "cpu-all.h" +#include "exec/cpu-all.h" #include "cpu-qom.h" -#include "exec-all.h" +#include "exec/exec-all.h" static inline void cpu_pc_from_tb(CPUUniCore32State *env, TranslationBlock *tb) { diff --git a/target-unicore32/helper.c b/target-unicore32/helper.c index 4b6856137d..2adbd1675d 100644 --- a/target-unicore32/helper.c +++ b/target-unicore32/helper.c @@ -10,7 +10,7 @@ */ #include "cpu.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "helper.h" #include "host-utils.h" #include "ui/console.h" diff --git a/target-unicore32/helper.h b/target-unicore32/helper.h index a4b81494aa..e85ce6c201 100644 --- a/target-unicore32/helper.h +++ b/target-unicore32/helper.h @@ -6,7 +6,7 @@ * published by the Free Software Foundation, or (at your option) any * later version. See the COPYING file in the top-level directory. */ -#include "def-helper.h" +#include "exec/def-helper.h" #ifndef CONFIG_USER_ONLY DEF_HELPER_4(cp0_set, void, env, i32, i32, i32) @@ -65,4 +65,4 @@ DEF_HELPER_2(ucf64_si2df, f64, f32, env) DEF_HELPER_2(ucf64_sf2si, f32, f32, env) DEF_HELPER_2(ucf64_df2si, f32, f64, env) -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-unicore32/op_helper.c b/target-unicore32/op_helper.c index b8172ba682..6443ffec1c 100644 --- a/target-unicore32/op_helper.c +++ b/target-unicore32/op_helper.c @@ -242,16 +242,16 @@ uint32_t HELPER(ror_cc)(CPUUniCore32State *env, uint32_t x, uint32_t i) #define MMUSUFFIX _mmu #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" void tlb_fill(CPUUniCore32State *env, target_ulong addr, int is_write, int mmu_idx, uintptr_t retaddr) diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c index 8c49f4d701..218e95eaca 100644 --- a/target-unicore32/translate.c +++ b/target-unicore32/translate.c @@ -55,7 +55,7 @@ static TCGv_i32 cpu_R[32]; static TCGv cpu_F0s, cpu_F1s; static TCGv_i64 cpu_F0d, cpu_F1d; -#include "gen-icount.h" +#include "exec/gen-icount.h" static const char *regnames[] = { "r00", "r01", "r02", "r03", "r04", "r05", "r06", "r07", diff --git a/target-xtensa/core-dc232b.c b/target-xtensa/core-dc232b.c index 804fdef56a..d1a594cda2 100644 --- a/target-xtensa/core-dc232b.c +++ b/target-xtensa/core-dc232b.c @@ -26,8 +26,8 @@ */ #include "cpu.h" -#include "exec-all.h" -#include "gdbstub.h" +#include "exec/exec-all.h" +#include "exec/gdbstub.h" #include "host-utils.h" #include "core-dc232b/core-isa.h" diff --git a/target-xtensa/core-dc233c.c b/target-xtensa/core-dc233c.c index d643f41d37..ead6b3b128 100644 --- a/target-xtensa/core-dc233c.c +++ b/target-xtensa/core-dc233c.c @@ -26,8 +26,8 @@ */ #include "cpu.h" -#include "exec-all.h" -#include "gdbstub.h" +#include "exec/exec-all.h" +#include "exec/gdbstub.h" #include "qemu-common.h" #include "host-utils.h" diff --git a/target-xtensa/core-fsf.c b/target-xtensa/core-fsf.c index e36b0de9d5..a387aeeca5 100644 --- a/target-xtensa/core-fsf.c +++ b/target-xtensa/core-fsf.c @@ -26,8 +26,8 @@ */ #include "cpu.h" -#include "exec-all.h" -#include "gdbstub.h" +#include "exec/exec-all.h" +#include "exec/gdbstub.h" #include "host-utils.h" #include "core-fsf/core-isa.h" diff --git a/target-xtensa/cpu.h b/target-xtensa/cpu.h index 08fd5bc395..5acf78c692 100644 --- a/target-xtensa/cpu.h +++ b/target-xtensa/cpu.h @@ -35,7 +35,7 @@ #include "config.h" #include "qemu-common.h" -#include "cpu-defs.h" +#include "exec/cpu-defs.h" #include "fpu/softfloat.h" #define TARGET_HAS_ICE 1 @@ -512,8 +512,8 @@ static inline void cpu_get_tb_cpu_state(CPUXtensaState *env, target_ulong *pc, } } -#include "cpu-all.h" -#include "exec-all.h" +#include "exec/cpu-all.h" +#include "exec/exec-all.h" static inline int cpu_has_work(CPUState *cpu) { diff --git a/target-xtensa/helper.c b/target-xtensa/helper.c index bf05575eb5..3d7a399008 100644 --- a/target-xtensa/helper.c +++ b/target-xtensa/helper.c @@ -26,8 +26,8 @@ */ #include "cpu.h" -#include "exec-all.h" -#include "gdbstub.h" +#include "exec/exec-all.h" +#include "exec/gdbstub.h" #include "host-utils.h" #if !defined(CONFIG_USER_ONLY) #include "hw/loader.h" diff --git a/target-xtensa/helper.h b/target-xtensa/helper.h index 5b4cd2700f..38d7157f34 100644 --- a/target-xtensa/helper.h +++ b/target-xtensa/helper.h @@ -1,4 +1,4 @@ -#include "def-helper.h" +#include "exec/def-helper.h" DEF_HELPER_2(exception, noreturn, env, i32) DEF_HELPER_3(exception_cause, noreturn, env, i32, i32) @@ -58,4 +58,4 @@ DEF_HELPER_4(ult_s, void, env, i32, f32, f32) DEF_HELPER_4(ole_s, void, env, i32, f32, f32) DEF_HELPER_4(ule_s, void, env, i32, f32, f32) -#include "def-helper.h" +#include "exec/def-helper.h" diff --git a/target-xtensa/op_helper.c b/target-xtensa/op_helper.c index 84f0449f79..a93abcb1dd 100644 --- a/target-xtensa/op_helper.c +++ b/target-xtensa/op_helper.c @@ -36,16 +36,16 @@ static void do_unaligned_access(CPUXtensaState *env, #define MMUSUFFIX _mmu #define SHIFT 0 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 1 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 2 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" #define SHIFT 3 -#include "softmmu_template.h" +#include "exec/softmmu_template.h" static void do_unaligned_access(CPUXtensaState *env, target_ulong addr, int is_write, int is_user, uintptr_t retaddr) diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index 4e81cbd9ec..3c2d1853d6 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -31,7 +31,7 @@ #include #include "cpu.h" -#include "exec-all.h" +#include "exec/exec-all.h" #include "disas/disas.h" #include "tcg-op.h" #include "qemu-log.h" @@ -76,7 +76,7 @@ static TCGv_i32 cpu_FR[16]; static TCGv_i32 cpu_SR[256]; static TCGv_i32 cpu_UR[256]; -#include "gen-icount.h" +#include "exec/gen-icount.h" typedef struct XtensaReg { const char *name; diff --git a/tcg/arm/tcg-target.c b/tcg/arm/tcg-target.c index 47612fe260..c3ac85e054 100644 --- a/tcg/arm/tcg-target.c +++ b/tcg/arm/tcg-target.c @@ -992,7 +992,7 @@ static inline void tcg_out_goto_label(TCGContext *s, int cond, int label_index) #ifdef CONFIG_SOFTMMU -#include "../../softmmu_defs.h" +#include "exec/softmmu_defs.h" /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, int mmu_idx) */ diff --git a/tcg/hppa/tcg-target.c b/tcg/hppa/tcg-target.c index de500ae181..5b27cf6f12 100644 --- a/tcg/hppa/tcg-target.c +++ b/tcg/hppa/tcg-target.c @@ -906,7 +906,7 @@ static void tcg_out_movcond(TCGContext *s, int cond, TCGArg ret, } #if defined(CONFIG_SOFTMMU) -#include "../../softmmu_defs.h" +#include "exec/softmmu_defs.h" /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, int mmu_idx) */ diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c index 6f3ad3ceab..ae8274652a 100644 --- a/tcg/i386/tcg-target.c +++ b/tcg/i386/tcg-target.c @@ -982,7 +982,7 @@ static void tcg_out_jmp(TCGContext *s, tcg_target_long dest) #if defined(CONFIG_SOFTMMU) -#include "../../softmmu_defs.h" +#include "exec/softmmu_defs.h" /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, int mmu_idx) */ diff --git a/tcg/ia64/tcg-target.c b/tcg/ia64/tcg-target.c index 06570bea38..2373d9ef79 100644 --- a/tcg/ia64/tcg-target.c +++ b/tcg/ia64/tcg-target.c @@ -1491,7 +1491,7 @@ static inline void tcg_out_movcond(TCGContext *s, TCGCond cond, TCGArg ret, #if defined(CONFIG_SOFTMMU) -#include "../../softmmu_defs.h" +#include "exec/softmmu_defs.h" /* Load and compare a TLB entry, and return the result in (p6, p7). R2 is loaded with the address of the addend TLB entry. diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c index ae2b274d85..bd8c858989 100644 --- a/tcg/mips/tcg-target.c +++ b/tcg/mips/tcg-target.c @@ -920,7 +920,7 @@ static void tcg_out_setcond2(TCGContext *s, TCGCond cond, TCGReg ret, #if defined(CONFIG_SOFTMMU) -#include "../../softmmu_defs.h" +#include "exec/softmmu_defs.h" /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, int mmu_idx) */ diff --git a/tcg/ppc/tcg-target.c b/tcg/ppc/tcg-target.c index d72d396270..29ca934e66 100644 --- a/tcg/ppc/tcg-target.c +++ b/tcg/ppc/tcg-target.c @@ -549,7 +549,7 @@ static void add_qemu_ldst_label (TCGContext *s, label->label_ptr[0] = label_ptr; } -#include "../../softmmu_defs.h" +#include "exec/softmmu_defs.h" /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, int mmu_idx) */ diff --git a/tcg/ppc64/tcg-target.c b/tcg/ppc64/tcg-target.c index 5403fc1f91..833fe0c10b 100644 --- a/tcg/ppc64/tcg-target.c +++ b/tcg/ppc64/tcg-target.c @@ -546,7 +546,7 @@ static void tcg_out_ldsta (TCGContext *s, int ret, int addr, #if defined (CONFIG_SOFTMMU) -#include "../../softmmu_defs.h" +#include "exec/softmmu_defs.h" /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, int mmu_idx) */ diff --git a/tcg/s390/tcg-target.c b/tcg/s390/tcg-target.c index fd9286f52d..e12a15221a 100644 --- a/tcg/s390/tcg-target.c +++ b/tcg/s390/tcg-target.c @@ -299,7 +299,7 @@ static const uint8_t tcg_cond_to_ltr_cond[] = { #ifdef CONFIG_SOFTMMU -#include "../../softmmu_defs.h" +#include "exec/softmmu_defs.h" /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, int mmu_idx) */ diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c index f146647874..03db514a1d 100644 --- a/tcg/sparc/tcg-target.c +++ b/tcg/sparc/tcg-target.c @@ -831,7 +831,7 @@ static void tcg_target_qemu_prologue(TCGContext *s) #if defined(CONFIG_SOFTMMU) -#include "../../softmmu_defs.h" +#include "exec/softmmu_defs.h" /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, int mmu_idx) */ diff --git a/tci.c b/tci.c index 54cf1d9524..2b2c11f259 100644 --- a/tci.c +++ b/tci.c @@ -25,7 +25,7 @@ #endif #include "qemu-common.h" -#include "exec-all.h" /* MAX_OPC_PARAM_IARGS */ +#include "exec/exec-all.h" /* MAX_OPC_PARAM_IARGS */ #include "tcg-op.h" /* Marker for missing code. */ diff --git a/thunk.c b/thunk.c index 8ebbbb46b6..3cca047509 100644 --- a/thunk.c +++ b/thunk.c @@ -21,7 +21,7 @@ #include #include "qemu.h" -#include "thunk.h" +#include "exec/user/thunk.h" //#define DEBUG diff --git a/translate-all.c b/translate-all.c index bbe06db6eb..e0cdad38c7 100644 --- a/translate-all.c +++ b/translate-all.c @@ -36,8 +36,8 @@ #include "disas/disas.h" #include "tcg.h" #include "qemu-timer.h" -#include "memory.h" -#include "exec-memory.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" #if defined(CONFIG_USER_ONLY) #include "qemu.h" #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) @@ -57,7 +57,7 @@ #endif #endif -#include "cputlb.h" +#include "exec/cputlb.h" #include "translate-all.h" //#define DEBUG_TB_INVALIDATE diff --git a/vl.c b/vl.c index 975767a44b..015f0a4757 100644 --- a/vl.c +++ b/vl.c @@ -132,7 +132,7 @@ int main(int argc, char **argv) #include "monitor.h" #include "ui/console.h" #include "sysemu.h" -#include "gdbstub.h" +#include "exec/gdbstub.h" #include "qemu-timer.h" #include "qemu-char.h" #include "cache-utils.h" diff --git a/xen-all.c b/xen-all.c index e3a51ccc81..95d383f41f 100644 --- a/xen-all.c +++ b/xen-all.c @@ -19,7 +19,7 @@ #include "range.h" #include "xen-mapcache.h" #include "trace.h" -#include "exec-memory.h" +#include "exec/address-spaces.h" #include #include diff --git a/xen-stub.c b/xen-stub.c index 921439263a..1ee841137e 100644 --- a/xen-stub.c +++ b/xen-stub.c @@ -10,7 +10,7 @@ #include "qemu-common.h" #include "hw/xen.h" -#include "memory.h" +#include "exec/memory.h" #include "qmp-commands.h" void xenstore_store_pv_console_info(int i, CharDriverState *chr) From 83c9089e73b81c69dc1ecdf859fa84d2c500fb5f Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 17 Dec 2012 18:19:49 +0100 Subject: [PATCH 252/300] monitor: move include files to include/monitor/ Signed-off-by: Paolo Bonzini --- arch_init.c | 2 +- audio/audio.c | 2 +- audio/wavcapture.c | 2 +- balloon.c | 2 +- balloon.h | 2 +- block.c | 2 +- blockdev-nbd.c | 2 +- blockdev.c | 2 +- blockjob.c | 2 +- cpus.c | 2 +- disas.c | 2 +- dump.c | 2 +- gdbstub.c | 2 +- hmp.c | 2 +- hw/acpi.c | 2 +- hw/ccid-card-emulated.c | 2 +- hw/ccid-card-passthru.c | 2 +- hw/device-hotplug.c | 2 +- hw/i8259.c | 2 +- hw/ide/ahci.c | 2 +- hw/isa-bus.c | 2 +- hw/kvm/pci-assign.c | 2 +- hw/lm32_pic.c | 2 +- hw/loader.c | 2 +- hw/pc.c | 2 +- hw/pci/pci-hotplug.c | 2 +- hw/pci/pci-stub.c | 2 +- hw/pci/pci.c | 2 +- hw/pci/pcie_aer.c | 2 +- hw/qdev-monitor.c | 2 +- hw/qdev-monitor.h | 2 +- hw/qxl.c | 2 +- hw/s390-virtio-bus.c | 2 +- hw/s390-virtio.c | 2 +- hw/s390x/event-facility.c | 2 +- hw/slavio_intctl.c | 2 +- hw/spapr_vio.c | 2 +- hw/sun4c_intctl.c | 2 +- hw/sysbus.c | 2 +- hw/usb/bus.c | 2 +- hw/usb/dev-smartcard-reader.c | 2 +- hw/usb/dev-storage.c | 2 +- hw/usb/hcd-ehci.h | 2 +- hw/usb/host-bsd.c | 2 +- hw/usb/host-linux.c | 2 +- hw/usb/host-stub.c | 2 +- hw/usb/redirect.c | 2 +- hw/virtio-serial-bus.c | 2 +- hw/watchdog.c | 2 +- include/block/block_int.h | 2 +- monitor.h => include/monitor/monitor.h | 2 +- readline.h => include/monitor/readline.h | 0 include/ui/console.h | 2 +- include/ui/qemu-spice.h | 4 ++-- migration-fd.c | 2 +- migration.c | 2 +- monitor.c | 4 ++-- net/hub.c | 2 +- net/net.c | 2 +- net/slirp.c | 2 +- net/socket.c | 2 +- net/tap.c | 2 +- osdep.c | 2 +- qemu-char.c | 2 +- qemu-error.c | 2 +- qemu-sockets.c | 2 +- qemu-timer.c | 2 +- qemu-tool.c | 2 +- qemu-user.c | 2 +- qerror.c | 2 +- readline.c | 4 ++-- savevm.c | 2 +- slirp/misc.c | 4 ++-- stubs/fdset-add-fd.c | 2 +- stubs/fdset-find-fd.c | 2 +- stubs/fdset-get-fd.c | 2 +- stubs/fdset-remove-fd.c | 2 +- stubs/get-fd.c | 2 +- target-i386/helper.c | 2 +- ui/input.c | 2 +- ui/spice-core.c | 2 +- ui/spice-display.c | 2 +- ui/vnc.h | 2 +- vl.c | 2 +- 84 files changed, 87 insertions(+), 87 deletions(-) rename monitor.h => include/monitor/monitor.h (99%) rename readline.h => include/monitor/readline.h (100%) diff --git a/arch_init.c b/arch_init.c index e15cedad04..93d1e52f4a 100644 --- a/arch_init.c +++ b/arch_init.c @@ -29,7 +29,7 @@ #include #endif #include "config.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysemu.h" #include "bitops.h" #include "bitmap.h" diff --git a/audio/audio.c b/audio/audio.c index 1c7738930b..a0cc727020 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -23,7 +23,7 @@ */ #include "hw/hw.h" #include "audio.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "qemu-timer.h" #include "sysemu.h" diff --git a/audio/wavcapture.c b/audio/wavcapture.c index 4f785f5f49..9d94623225 100644 --- a/audio/wavcapture.c +++ b/audio/wavcapture.c @@ -1,5 +1,5 @@ #include "hw/hw.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "audio.h" typedef struct { diff --git a/balloon.c b/balloon.c index c24458b5f9..d1de4352b4 100644 --- a/balloon.c +++ b/balloon.c @@ -24,7 +24,7 @@ * THE SOFTWARE. */ -#include "monitor.h" +#include "monitor/monitor.h" #include "exec/cpu-common.h" #include "kvm.h" #include "balloon.h" diff --git a/balloon.h b/balloon.h index b803a00741..bd9d39505d 100644 --- a/balloon.h +++ b/balloon.h @@ -14,7 +14,7 @@ #ifndef _QEMU_BALLOON_H #define _QEMU_BALLOON_H -#include "monitor.h" +#include "monitor/monitor.h" #include "qapi-types.h" typedef void (QEMUBalloonEvent)(void *opaque, ram_addr_t target); diff --git a/block.c b/block.c index 5eab9e2519..0e7f18c6d3 100644 --- a/block.c +++ b/block.c @@ -24,7 +24,7 @@ #include "config-host.h" #include "qemu-common.h" #include "trace.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "block/block_int.h" #include "block/blockjob.h" #include "module.h" diff --git a/blockdev-nbd.c b/blockdev-nbd.c index 81aa1d34ef..596b47499d 100644 --- a/blockdev-nbd.c +++ b/blockdev-nbd.c @@ -11,7 +11,7 @@ #include "blockdev.h" #include "hw/block-common.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "qapi/qmp/qerror.h" #include "sysemu.h" #include "qmp-commands.h" diff --git a/blockdev.c b/blockdev.c index ff6b333f69..a2308fa718 100644 --- a/blockdev.c +++ b/blockdev.c @@ -10,7 +10,7 @@ #include "blockdev.h" #include "hw/block-common.h" #include "block/blockjob.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "qapi/qmp/qerror.h" #include "qemu-option.h" #include "qemu-config.h" diff --git a/blockjob.c b/blockjob.c index 004480d714..4bc60c7378 100644 --- a/blockjob.c +++ b/blockjob.c @@ -26,7 +26,7 @@ #include "config-host.h" #include "qemu-common.h" #include "trace.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "block/block.h" #include "block/blockjob.h" #include "block/block_int.h" diff --git a/cpus.c b/cpus.c index 8926873ad1..3a66401e0d 100644 --- a/cpus.c +++ b/cpus.c @@ -25,7 +25,7 @@ /* Needed early for CONFIG_BSD etc. */ #include "config-host.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysemu.h" #include "exec/gdbstub.h" #include "dma.h" diff --git a/disas.c b/disas.c index 8157b96fc1..a46faeed80 100644 --- a/disas.c +++ b/disas.c @@ -374,7 +374,7 @@ const char *lookup_symbol(target_ulong orig_addr) #if !defined(CONFIG_USER_ONLY) -#include "monitor.h" +#include "monitor/monitor.h" static int monitor_disas_is_physical; diff --git a/dump.c b/dump.c index e70e0f3b21..871ee1727a 100644 --- a/dump.c +++ b/dump.c @@ -16,7 +16,7 @@ #include "cpu.h" #include "exec/cpu-all.h" #include "exec/hwaddr.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "kvm.h" #include "dump.h" #include "sysemu.h" diff --git a/gdbstub.c b/gdbstub.c index 70ad79a748..9395c829a2 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -29,7 +29,7 @@ #include "qemu.h" #else -#include "monitor.h" +#include "monitor/monitor.h" #include "qemu-char.h" #include "sysemu.h" #include "exec/gdbstub.h" diff --git a/hmp.c b/hmp.c index f235134bb6..a76a8f06ea 100644 --- a/hmp.c +++ b/hmp.c @@ -20,7 +20,7 @@ #include "qemu-timer.h" #include "qmp-commands.h" #include "qemu_socket.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "ui/console.h" static void hmp_handle_error(Monitor *mon, Error **errp) diff --git a/hw/acpi.c b/hw/acpi.c index ae29a59077..fe9b76a9b0 100644 --- a/hw/acpi.c +++ b/hw/acpi.c @@ -22,7 +22,7 @@ #include "hw.h" #include "pc.h" #include "acpi.h" -#include "monitor.h" +#include "monitor/monitor.h" struct acpi_table_header { uint16_t _length; /* our length, not actual part of the hdr */ diff --git a/hw/ccid-card-emulated.c b/hw/ccid-card-emulated.c index f4a6da4283..845a764446 100644 --- a/hw/ccid-card-emulated.c +++ b/hw/ccid-card-emulated.c @@ -33,7 +33,7 @@ #include "qemu-thread.h" #include "qemu-char.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "hw/ccid.h" #define DPRINTF(card, lvl, fmt, ...) \ diff --git a/hw/ccid-card-passthru.c b/hw/ccid-card-passthru.c index bd6c77777d..f5b4794e90 100644 --- a/hw/ccid-card-passthru.c +++ b/hw/ccid-card-passthru.c @@ -10,7 +10,7 @@ #include "qemu-char.h" #include "qemu_socket.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "hw/ccid.h" #include "libcacard/vscard_common.h" diff --git a/hw/device-hotplug.c b/hw/device-hotplug.c index 336ffc2274..809a598e3a 100644 --- a/hw/device-hotplug.c +++ b/hw/device-hotplug.c @@ -27,7 +27,7 @@ #include "blockdev.h" #include "qemu-config.h" #include "sysemu.h" -#include "monitor.h" +#include "monitor/monitor.h" DriveInfo *add_init_drive(const char *optstr) { diff --git a/hw/i8259.c b/hw/i8259.c index af0ba4d7c6..5e935e7f99 100644 --- a/hw/i8259.c +++ b/hw/i8259.c @@ -24,7 +24,7 @@ #include "hw.h" #include "pc.h" #include "isa.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "qemu-timer.h" #include "i8259_internal.h" diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index f32a84761d..d38c6e4574 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -27,7 +27,7 @@ #include #include -#include "monitor.h" +#include "monitor/monitor.h" #include "dma.h" #include "exec/cpu-common.h" #include "internal.h" diff --git a/hw/isa-bus.c b/hw/isa-bus.c index 8f40974166..a2be67df56 100644 --- a/hw/isa-bus.c +++ b/hw/isa-bus.c @@ -17,7 +17,7 @@ * License along with this library; if not, see . */ #include "hw.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysbus.h" #include "sysemu.h" #include "isa.h" diff --git a/hw/kvm/pci-assign.c b/hw/kvm/pci-assign.c index 2629775589..ff0dc0dfd4 100644 --- a/hw/kvm/pci-assign.c +++ b/hw/kvm/pci-assign.c @@ -31,7 +31,7 @@ #include "qemu-error.h" #include "ui/console.h" #include "hw/loader.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "range.h" #include "sysemu.h" #include "hw/pci/pci.h" diff --git a/hw/lm32_pic.c b/hw/lm32_pic.c index 32f65db7f1..42d5602cf0 100644 --- a/hw/lm32_pic.c +++ b/hw/lm32_pic.c @@ -21,7 +21,7 @@ #include "hw.h" #include "pc.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysbus.h" #include "trace.h" #include "lm32_pic.h" diff --git a/hw/loader.c b/hw/loader.c index 03f0318d91..f5ef575b52 100644 --- a/hw/loader.c +++ b/hw/loader.c @@ -44,7 +44,7 @@ #include "hw.h" #include "disas/disas.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysemu.h" #include "uboot_image.h" #include "loader.h" diff --git a/hw/pc.c b/hw/pc.c index 2452fd4214..7aaff0f2fd 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -28,7 +28,7 @@ #include "fdc.h" #include "ide.h" #include "pci/pci.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "fw_cfg.h" #include "hpet_emul.h" #include "smbios.h" diff --git a/hw/pci/pci-hotplug.c b/hw/pci/pci-hotplug.c index 5ba7558ecd..e5e8a7ab58 100644 --- a/hw/pci/pci-hotplug.c +++ b/hw/pci/pci-hotplug.c @@ -27,7 +27,7 @@ #include "hw/pci/pci.h" #include "net/net.h" #include "hw/pc.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "hw/scsi.h" #include "hw/virtio-blk.h" #include "qemu-config.h" diff --git a/hw/pci/pci-stub.c b/hw/pci/pci-stub.c index b5c43a935b..5891dc959d 100644 --- a/hw/pci/pci-stub.c +++ b/hw/pci/pci-stub.c @@ -19,7 +19,7 @@ */ #include "sysemu.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "hw/pci/pci.h" #include "qmp-commands.h" diff --git a/hw/pci/pci.c b/hw/pci/pci.c index fa0f08eb0a..e062f66088 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -25,7 +25,7 @@ #include "hw/pci/pci.h" #include "hw/pci/pci_bridge.h" #include "hw/pci/pci_bus.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "net/net.h" #include "sysemu.h" #include "hw/loader.h" diff --git a/hw/pci/pcie_aer.c b/hw/pci/pcie_aer.c index b6f4f8510f..f7f3633f5b 100644 --- a/hw/pci/pcie_aer.c +++ b/hw/pci/pcie_aer.c @@ -20,7 +20,7 @@ #include "sysemu.h" #include "qapi/qmp/types.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "hw/pci/pci_bridge.h" #include "hw/pci/pcie.h" #include "hw/pci/msix.h" diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c index 5aaf74b98a..207282c4a4 100644 --- a/hw/qdev-monitor.c +++ b/hw/qdev-monitor.c @@ -18,7 +18,7 @@ */ #include "qdev.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "qmp-commands.h" #include "arch_init.h" #include "qemu-config.h" diff --git a/hw/qdev-monitor.h b/hw/qdev-monitor.h index 220ceba4c5..fae1b1ec84 100644 --- a/hw/qdev-monitor.h +++ b/hw/qdev-monitor.h @@ -2,7 +2,7 @@ #define QEMU_QDEV_MONITOR_H #include "qdev-core.h" -#include "monitor.h" +#include "monitor/monitor.h" /*** monitor commands ***/ diff --git a/hw/qxl.c b/hw/qxl.c index 96887c4aad..ad0214827e 100644 --- a/hw/qxl.c +++ b/hw/qxl.c @@ -23,7 +23,7 @@ #include "qemu-common.h" #include "qemu-timer.h" #include "qemu-queue.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysemu.h" #include "trace.h" diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c index f7e1939288..769015c136 100644 --- a/hw/s390-virtio-bus.c +++ b/hw/s390-virtio-bus.c @@ -21,7 +21,7 @@ #include "block/block.h" #include "sysemu.h" #include "boards.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "loader.h" #include "elf.h" #include "hw/virtio.h" diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c index 0a15625b73..7dfe87ade3 100644 --- a/hw/s390-virtio.c +++ b/hw/s390-virtio.c @@ -23,7 +23,7 @@ #include "sysemu.h" #include "net/net.h" #include "boards.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "loader.h" #include "elf.h" #include "hw/virtio.h" diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c index bc9cea9e1b..748118d0f0 100644 --- a/hw/s390x/event-facility.c +++ b/hw/s390x/event-facility.c @@ -15,7 +15,7 @@ * */ -#include "monitor.h" +#include "monitor/monitor.h" #include "sysemu.h" #include "sclp.h" diff --git a/hw/slavio_intctl.c b/hw/slavio_intctl.c index 6aafa8b233..a44ce95c1f 100644 --- a/hw/slavio_intctl.c +++ b/hw/slavio_intctl.c @@ -23,7 +23,7 @@ */ #include "sun4m.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysbus.h" #include "trace.h" diff --git a/hw/spapr_vio.c b/hw/spapr_vio.c index 1f19fedd0e..fdf8db9158 100644 --- a/hw/spapr_vio.c +++ b/hw/spapr_vio.c @@ -22,7 +22,7 @@ #include "hw.h" #include "sysemu.h" #include "boards.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "loader.h" #include "elf.h" #include "hw/sysbus.h" diff --git a/hw/sun4c_intctl.c b/hw/sun4c_intctl.c index 702e9f5444..b78d54f232 100644 --- a/hw/sun4c_intctl.c +++ b/hw/sun4c_intctl.c @@ -24,7 +24,7 @@ #include "hw.h" #include "sun4m.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysbus.h" //#define DEBUG_IRQ_COUNT diff --git a/hw/sysbus.c b/hw/sysbus.c index 7ab250463c..49a41775f8 100644 --- a/hw/sysbus.c +++ b/hw/sysbus.c @@ -18,7 +18,7 @@ */ #include "sysbus.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "exec/address-spaces.h" static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent); diff --git a/hw/usb/bus.c b/hw/usb/bus.c index 8264c240ee..74728c94e5 100644 --- a/hw/usb/bus.c +++ b/hw/usb/bus.c @@ -2,7 +2,7 @@ #include "hw/usb.h" #include "hw/qdev.h" #include "sysemu.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "trace.h" static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent); diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard-reader.c index de955b709f..3862c9b6c9 100644 --- a/hw/usb/dev-smartcard-reader.c +++ b/hw/usb/dev-smartcard-reader.c @@ -38,7 +38,7 @@ #include "qemu-error.h" #include "hw/usb.h" #include "hw/usb/desc.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "hw/ccid.h" diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index de56fea610..0d7597b4d1 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -14,7 +14,7 @@ #include "hw/usb/desc.h" #include "hw/scsi.h" #include "ui/console.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysemu.h" #include "blockdev.h" diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h index 837c63be85..740f7309fb 100644 --- a/hw/usb/hcd-ehci.h +++ b/hw/usb/hcd-ehci.h @@ -20,7 +20,7 @@ #include "hw/hw.h" #include "qemu-timer.h" #include "hw/usb.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "trace.h" #include "dma.h" #include "sysemu.h" diff --git a/hw/usb/host-bsd.c b/hw/usb/host-bsd.c index dae0009378..340c21aeb4 100644 --- a/hw/usb/host-bsd.c +++ b/hw/usb/host-bsd.c @@ -25,7 +25,7 @@ */ #include "qemu-common.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "hw/usb.h" /* usb.h declares these */ diff --git a/hw/usb/host-linux.c b/hw/usb/host-linux.c index bdafb6bc87..5a56e99891 100644 --- a/hw/usb/host-linux.c +++ b/hw/usb/host-linux.c @@ -32,7 +32,7 @@ #include "qemu-common.h" #include "qemu-timer.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysemu.h" #include "trace.h" diff --git a/hw/usb/host-stub.c b/hw/usb/host-stub.c index e8da3221f6..58423a0f5c 100644 --- a/hw/usb/host-stub.c +++ b/hw/usb/host-stub.c @@ -33,7 +33,7 @@ #include "qemu-common.h" #include "ui/console.h" #include "hw/usb.h" -#include "monitor.h" +#include "monitor/monitor.h" void usb_host_info(Monitor *mon) { diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c index 9e7f6453f7..3621076020 100644 --- a/hw/usb/redirect.c +++ b/hw/usb/redirect.c @@ -27,7 +27,7 @@ #include "qemu-common.h" #include "qemu-timer.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysemu.h" #include "iov.h" diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c index 155da58dcd..5559518a93 100644 --- a/hw/virtio-serial-bus.c +++ b/hw/virtio-serial-bus.c @@ -19,7 +19,7 @@ */ #include "iov.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "qemu-queue.h" #include "sysbus.h" #include "trace.h" diff --git a/hw/watchdog.c b/hw/watchdog.c index f878bec860..623b299f71 100644 --- a/hw/watchdog.c +++ b/hw/watchdog.c @@ -24,7 +24,7 @@ #include "qemu-config.h" #include "qemu-queue.h" #include "qapi/qmp/types.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysemu.h" #include "hw/watchdog.h" diff --git a/include/block/block_int.h b/include/block/block_int.h index d06de2637b..14c57afd54 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -31,7 +31,7 @@ #include "qemu-timer.h" #include "qapi-types.h" #include "qapi/qmp/qerror.h" -#include "monitor.h" +#include "monitor/monitor.h" #define BLOCK_FLAG_ENCRYPT 1 #define BLOCK_FLAG_COMPAT6 4 diff --git a/monitor.h b/include/monitor/monitor.h similarity index 99% rename from monitor.h rename to include/monitor/monitor.h index 9e96e83f5f..87fb49c092 100644 --- a/monitor.h +++ b/include/monitor/monitor.h @@ -5,7 +5,7 @@ #include "qapi/qmp/qerror.h" #include "qapi/qmp/qdict.h" #include "block/block.h" -#include "readline.h" +#include "monitor/readline.h" extern Monitor *cur_mon; extern Monitor *default_mon; diff --git a/readline.h b/include/monitor/readline.h similarity index 100% rename from readline.h rename to include/monitor/readline.h diff --git a/include/ui/console.h b/include/ui/console.h index eff5cc92d6..3db6635b0a 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -4,7 +4,7 @@ #include "ui/qemu-pixman.h" #include "qapi/qmp/qdict.h" #include "notify.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "trace.h" #include "qapi-types.h" #include "qapi/error.h" diff --git a/include/ui/qemu-spice.h b/include/ui/qemu-spice.h index 5857b8a92e..3e08be06bf 100644 --- a/include/ui/qemu-spice.h +++ b/include/ui/qemu-spice.h @@ -24,7 +24,7 @@ #include "qemu-option.h" #include "qemu-config.h" -#include "monitor.h" +#include "monitor/monitor.h" extern int using_spice; @@ -47,7 +47,7 @@ void do_info_spice(Monitor *mon, QObject **ret_data); CharDriverState *qemu_chr_open_spice(QemuOpts *opts); #else /* CONFIG_SPICE */ -#include "monitor.h" +#include "monitor/monitor.h" #define using_spice 0 static inline int qemu_spice_set_passwd(const char *passwd, diff --git a/migration-fd.c b/migration-fd.c index e86228823f..73a1dfcc93 100644 --- a/migration-fd.c +++ b/migration-fd.c @@ -16,7 +16,7 @@ #include "qemu-common.h" #include "qemu_socket.h" #include "migration.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "buffered_file.h" #include "block/block.h" #include "qemu_socket.h" diff --git a/migration.c b/migration.c index 1fce152548..27a272eace 100644 --- a/migration.c +++ b/migration.c @@ -15,7 +15,7 @@ #include "qemu-common.h" #include "migration.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "buffered_file.h" #include "sysemu.h" #include "block/block.h" diff --git a/monitor.c b/monitor.c index a3e010968e..94c6bb6672 100644 --- a/monitor.c +++ b/monitor.c @@ -36,8 +36,8 @@ #include "qemu-char.h" #include "ui/qemu-spice.h" #include "sysemu.h" -#include "monitor.h" -#include "readline.h" +#include "monitor/monitor.h" +#include "monitor/readline.h" #include "ui/console.h" #include "blockdev.h" #include "audio/audio.h" diff --git a/net/hub.c b/net/hub.c index 8508ecf380..81a73b54a7 100644 --- a/net/hub.c +++ b/net/hub.c @@ -12,7 +12,7 @@ * */ -#include "monitor.h" +#include "monitor/monitor.h" #include "net/net.h" #include "clients.h" #include "hub.h" diff --git a/net/net.c b/net/net.c index ead7e96fe1..e4d85a9cfa 100644 --- a/net/net.c +++ b/net/net.c @@ -29,7 +29,7 @@ #include "net/slirp.h" #include "util.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "qemu-common.h" #include "qemu_socket.h" #include "qemu-config.h" diff --git a/net/slirp.c b/net/slirp.c index 5a11ac5859..c37a5ef959 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -32,7 +32,7 @@ #include "net/net.h" #include "clients.h" #include "hub.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "qemu_socket.h" #include "slirp/libslirp.h" #include "qemu-char.h" diff --git a/net/socket.c b/net/socket.c index 8430f1a161..bc2b951832 100644 --- a/net/socket.c +++ b/net/socket.c @@ -25,7 +25,7 @@ #include "net/net.h" #include "clients.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "qemu-common.h" #include "qemu-error.h" #include "qemu-option.h" diff --git a/net/tap.c b/net/tap.c index f8cabc4f86..9a677e9864 100644 --- a/net/tap.c +++ b/net/tap.c @@ -35,7 +35,7 @@ #include "net/net.h" #include "clients.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysemu.h" #include "qemu-common.h" #include "qemu-error.h" diff --git a/osdep.c b/osdep.c index 3a63d26e75..807e90cf97 100644 --- a/osdep.c +++ b/osdep.c @@ -48,7 +48,7 @@ extern int madvise(caddr_t, size_t, int); #include "qemu-common.h" #include "trace.h" #include "qemu_socket.h" -#include "monitor.h" +#include "monitor/monitor.h" static bool fips_enabled = false; diff --git a/qemu-char.c b/qemu-char.c index bc53d09a9b..16021c5a43 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "ui/console.h" #include "sysemu.h" #include "qemu-timer.h" diff --git a/qemu-error.c b/qemu-error.c index 7cd5ffe1e9..08a36f480c 100644 --- a/qemu-error.c +++ b/qemu-error.c @@ -11,7 +11,7 @@ */ #include -#include "monitor.h" +#include "monitor/monitor.h" /* * Print to current monitor if we have one, else to stderr. diff --git a/qemu-sockets.c b/qemu-sockets.c index c52a40a411..cea0a4b8ac 100644 --- a/qemu-sockets.c +++ b/qemu-sockets.c @@ -22,7 +22,7 @@ #include #include -#include "monitor.h" +#include "monitor/monitor.h" #include "qemu_socket.h" #include "qemu-common.h" /* for qemu_isdigit */ #include "main-loop.h" diff --git a/qemu-timer.c b/qemu-timer.c index 5a99403fda..8e0dccc087 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -23,7 +23,7 @@ */ #include "sysemu.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "ui/console.h" #include "hw/hw.h" diff --git a/qemu-tool.c b/qemu-tool.c index b46631e422..40453fdd99 100644 --- a/qemu-tool.c +++ b/qemu-tool.c @@ -14,7 +14,7 @@ */ #include "qemu-common.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "qemu-timer.h" #include "qemu-log.h" #include "migration.h" diff --git a/qemu-user.c b/qemu-user.c index 08ccb0fe8e..f8b450c03d 100644 --- a/qemu-user.c +++ b/qemu-user.c @@ -19,7 +19,7 @@ */ #include "qemu-common.h" -#include "monitor.h" +#include "monitor/monitor.h" Monitor *cur_mon; diff --git a/qerror.c b/qerror.c index 8c78104277..3aee1cf6a6 100644 --- a/qerror.c +++ b/qerror.c @@ -10,7 +10,7 @@ * See the COPYING.LIB file in the top-level directory. */ -#include "monitor.h" +#include "monitor/monitor.h" #include "qapi/qmp/qjson.h" #include "qapi/qmp/qerror.h" #include "qemu-common.h" diff --git a/readline.c b/readline.c index 540cd8a025..5fc9643c2b 100644 --- a/readline.c +++ b/readline.c @@ -21,8 +21,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "readline.h" -#include "monitor.h" +#include "monitor/readline.h" +#include "monitor/monitor.h" #define IS_NORM 0 #define IS_ESC 1 diff --git a/savevm.c b/savevm.c index cb33501ecc..bf341bb25f 100644 --- a/savevm.c +++ b/savevm.c @@ -73,7 +73,7 @@ #include "hw/hw.h" #include "hw/qdev.h" #include "net/net.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "sysemu.h" #include "qemu-timer.h" #include "audio/audio.h" diff --git a/slirp/misc.c b/slirp/misc.c index 664532a663..d4df972d13 100644 --- a/slirp/misc.c +++ b/slirp/misc.c @@ -8,7 +8,7 @@ #include #include -#include "monitor.h" +#include "monitor/monitor.h" #ifdef DEBUG int slirp_debug = DBG_CALL|DBG_MISC|DBG_ERROR; @@ -242,7 +242,7 @@ strdup(str) } #endif -#include "monitor.h" +#include "monitor/monitor.h" void lprint(const char *format, ...) { diff --git a/stubs/fdset-add-fd.c b/stubs/fdset-add-fd.c index 09fe2a839a..ee1643708c 100644 --- a/stubs/fdset-add-fd.c +++ b/stubs/fdset-add-fd.c @@ -1,5 +1,5 @@ #include "qemu-common.h" -#include "monitor.h" +#include "monitor/monitor.h" int monitor_fdset_dup_fd_add(int64_t fdset_id, int dup_fd) { diff --git a/stubs/fdset-find-fd.c b/stubs/fdset-find-fd.c index f82baa066c..4f18344bad 100644 --- a/stubs/fdset-find-fd.c +++ b/stubs/fdset-find-fd.c @@ -1,5 +1,5 @@ #include "qemu-common.h" -#include "monitor.h" +#include "monitor/monitor.h" int monitor_fdset_dup_fd_find(int dup_fd) { diff --git a/stubs/fdset-get-fd.c b/stubs/fdset-get-fd.c index 4106cf90f0..7112c155e3 100644 --- a/stubs/fdset-get-fd.c +++ b/stubs/fdset-get-fd.c @@ -1,5 +1,5 @@ #include "qemu-common.h" -#include "monitor.h" +#include "monitor/monitor.h" int monitor_fdset_get_fd(int64_t fdset_id, int flags) { diff --git a/stubs/fdset-remove-fd.c b/stubs/fdset-remove-fd.c index 861b31247e..b3886d9f45 100644 --- a/stubs/fdset-remove-fd.c +++ b/stubs/fdset-remove-fd.c @@ -1,5 +1,5 @@ #include "qemu-common.h" -#include "monitor.h" +#include "monitor/monitor.h" int monitor_fdset_dup_fd_remove(int dupfd) { diff --git a/stubs/get-fd.c b/stubs/get-fd.c index 3561ab60e2..9f2c65cf0a 100644 --- a/stubs/get-fd.c +++ b/stubs/get-fd.c @@ -1,5 +1,5 @@ #include "qemu-common.h" -#include "monitor.h" +#include "monitor/monitor.h" int monitor_get_fd(Monitor *mon, const char *name, Error **errp) { diff --git a/target-i386/helper.c b/target-i386/helper.c index 00341c5233..bd47b8e58e 100644 --- a/target-i386/helper.c +++ b/target-i386/helper.c @@ -21,7 +21,7 @@ #include "kvm.h" #ifndef CONFIG_USER_ONLY #include "sysemu.h" -#include "monitor.h" +#include "monitor/monitor.h" #endif //#define DEBUG_MMU diff --git a/ui/input.c b/ui/input.c index 65950af9af..05f6c0c849 100644 --- a/ui/input.c +++ b/ui/input.c @@ -23,7 +23,7 @@ */ #include "sysemu.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "ui/console.h" #include "qapi/error.h" #include "qmp-commands.h" diff --git a/ui/spice-core.c b/ui/spice-core.c index 0550805b38..379677554e 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -35,7 +35,7 @@ #include "qapi/qmp/qjson.h" #include "notify.h" #include "migration.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "hw/hw.h" #include "ui/spice-display.h" diff --git a/ui/spice-display.c b/ui/spice-display.c index 681fe32fed..56ebf80805 100644 --- a/ui/spice-display.c +++ b/ui/spice-display.c @@ -19,7 +19,7 @@ #include "ui/qemu-spice.h" #include "qemu-timer.h" #include "qemu-queue.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "ui/console.h" #include "sysemu.h" #include "trace.h" diff --git a/ui/vnc.h b/ui/vnc.h index 7ec183372a..e5c043ff45 100644 --- a/ui/vnc.h +++ b/ui/vnc.h @@ -31,7 +31,7 @@ #include "qemu-queue.h" #include "qemu-thread.h" #include "ui/console.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "audio/audio.h" #include "bitmap.h" #include diff --git a/vl.c b/vl.c index 015f0a4757..9adaf28e64 100644 --- a/vl.c +++ b/vl.c @@ -129,7 +129,7 @@ int main(int argc, char **argv) #include "bt-host.h" #include "net/net.h" #include "net/slirp.h" -#include "monitor.h" +#include "monitor/monitor.h" #include "ui/console.h" #include "sysemu.h" #include "exec/gdbstub.h" From caf71f86a3de97394bcc5b06549012b7dc65fe60 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 17 Dec 2012 18:19:50 +0100 Subject: [PATCH 253/300] migration: move include files to include/migration/ Signed-off-by: Paolo Bonzini --- arch_init.c | 4 ++-- block-migration.c | 4 ++-- block/qcow.c | 2 +- block/qed.c | 2 +- block/vdi.c | 2 +- block/vmdk.c | 2 +- block/vpc.c | 2 +- block/vvfat.c | 2 +- buffered_file.h | 2 +- hw/9pfs/virtio-9p.c | 2 +- hw/hid.h | 2 +- hw/hw.h | 4 ++-- hw/ivshmem.c | 2 +- hw/pci/shpc.h | 2 +- hw/ptimer.h | 2 +- block-migration.h => include/migration/block.h | 0 migration.h => include/migration/migration.h | 2 +- include/{qemu => migration}/page_cache.h | 0 qemu-file.h => include/migration/qemu-file.h | 0 vmstate.h => include/migration/vmstate.h | 0 include/net/net.h | 2 +- migration-exec.c | 2 +- migration-fd.c | 2 +- migration-tcp.c | 2 +- migration-unix.c | 2 +- migration.c | 4 ++-- monitor.c | 2 +- page_cache.c | 2 +- qemu-tool.c | 2 +- savevm.c | 2 +- ui/spice-core.c | 2 +- vl.c | 4 ++-- 32 files changed, 33 insertions(+), 33 deletions(-) rename block-migration.h => include/migration/block.h (100%) rename migration.h => include/migration/migration.h (99%) rename include/{qemu => migration}/page_cache.h (100%) rename qemu-file.h => include/migration/qemu-file.h (100%) rename vmstate.h => include/migration/vmstate.h (100%) diff --git a/arch_init.c b/arch_init.c index 93d1e52f4a..f627253a20 100644 --- a/arch_init.c +++ b/arch_init.c @@ -39,12 +39,12 @@ #include "hw/pci/pci.h" #include "hw/audiodev.h" #include "kvm.h" -#include "migration.h" +#include "migration/migration.h" #include "exec/gdbstub.h" #include "hw/smbios.h" #include "exec/address-spaces.h" #include "hw/pcspk.h" -#include "qemu/page_cache.h" +#include "migration/page_cache.h" #include "qemu-config.h" #include "qmp-commands.h" #include "trace.h" diff --git a/block-migration.c b/block-migration.c index c15de9f750..2d2dcbda94 100644 --- a/block-migration.c +++ b/block-migration.c @@ -18,8 +18,8 @@ #include "hw/hw.h" #include "qemu-queue.h" #include "qemu-timer.h" -#include "block-migration.h" -#include "migration.h" +#include "migration/block.h" +#include "migration/migration.h" #include "blockdev.h" #include diff --git a/block/qcow.c b/block/qcow.c index d13bd400f0..f36671196e 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -26,7 +26,7 @@ #include "module.h" #include #include "block/aes.h" -#include "migration.h" +#include "migration/migration.h" /**************************************************************/ /* QEMU COW block driver with compression and encryption support */ diff --git a/block/qed.c b/block/qed.c index ca1fafb47e..10d0827482 100644 --- a/block/qed.c +++ b/block/qed.c @@ -16,7 +16,7 @@ #include "trace.h" #include "qed.h" #include "qapi/qmp/qerror.h" -#include "migration.h" +#include "migration/migration.h" static void qed_aio_cancel(BlockDriverAIOCB *blockacb) { diff --git a/block/vdi.c b/block/vdi.c index dab9cac76e..b1d199a2e5 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -52,7 +52,7 @@ #include "qemu-common.h" #include "block/block_int.h" #include "module.h" -#include "migration.h" +#include "migration/migration.h" #if defined(CONFIG_UUID) #include diff --git a/block/vmdk.c b/block/vmdk.c index 68e50e1a3e..77a1a67c61 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -26,7 +26,7 @@ #include "qemu-common.h" #include "block/block_int.h" #include "module.h" -#include "migration.h" +#include "migration/migration.h" #include #define VMDK3_MAGIC (('C' << 24) | ('O' << 16) | ('W' << 8) | 'D') diff --git a/block/vpc.c b/block/vpc.c index aabd71201c..47b5518aee 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -25,7 +25,7 @@ #include "qemu-common.h" #include "block/block_int.h" #include "module.h" -#include "migration.h" +#include "migration/migration.h" #if defined(CONFIG_UUID) #include #endif diff --git a/block/vvfat.c b/block/vvfat.c index fbabafca76..a63c3ea7cd 100644 --- a/block/vvfat.c +++ b/block/vvfat.c @@ -27,7 +27,7 @@ #include "qemu-common.h" #include "block/block_int.h" #include "module.h" -#include "migration.h" +#include "migration/migration.h" #ifndef S_IWGRP #define S_IWGRP 0 diff --git a/buffered_file.h b/buffered_file.h index ef010febfe..86a7075246 100644 --- a/buffered_file.h +++ b/buffered_file.h @@ -15,7 +15,7 @@ #define QEMU_BUFFERED_FILE_H #include "hw/hw.h" -#include "migration.h" +#include "migration/migration.h" QEMUFile *qemu_fopen_ops_buffered(MigrationState *migration_state); diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index 8b9cdc96ed..ede20ce80e 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -20,7 +20,7 @@ #include "virtio-9p-xattr.h" #include "virtio-9p-coth.h" #include "trace.h" -#include "migration.h" +#include "migration/migration.h" int open_fd_hw; int total_open_fd; diff --git a/hw/hid.h b/hw/hid.h index 5315cf7a31..100b121663 100644 --- a/hw/hid.h +++ b/hw/hid.h @@ -1,7 +1,7 @@ #ifndef QEMU_HID_H #define QEMU_HID_H -#include "vmstate.h" +#include "migration/vmstate.h" #define HID_MOUSE 1 #define HID_TABLET 2 diff --git a/hw/hw.h b/hw/hw.h index 7368470bb1..883ddb60f9 100644 --- a/hw/hw.h +++ b/hw/hw.h @@ -11,8 +11,8 @@ #include "exec/ioport.h" #include "irq.h" #include "block/aio.h" -#include "qemu-file.h" -#include "vmstate.h" +#include "migration/qemu-file.h" +#include "migration/vmstate.h" #include "qemu-log.h" #ifdef NEED_CPU_H diff --git a/hw/ivshmem.c b/hw/ivshmem.c index d15760b314..d5b91dd24e 100644 --- a/hw/ivshmem.c +++ b/hw/ivshmem.c @@ -21,7 +21,7 @@ #include "pci/pci.h" #include "pci/msix.h" #include "kvm.h" -#include "migration.h" +#include "migration/migration.h" #include "qapi/qmp/qerror.h" #include "event_notifier.h" #include "qemu-char.h" diff --git a/hw/pci/shpc.h b/hw/pci/shpc.h index 6374e68bdb..467911a558 100644 --- a/hw/pci/shpc.h +++ b/hw/pci/shpc.h @@ -3,7 +3,7 @@ #include "qemu-common.h" #include "exec/memory.h" -#include "vmstate.h" +#include "migration/vmstate.h" struct SHPCDevice { /* Capability offset in device's config space */ diff --git a/hw/ptimer.h b/hw/ptimer.h index 6638f61322..9d172f7764 100644 --- a/hw/ptimer.h +++ b/hw/ptimer.h @@ -10,7 +10,7 @@ #include "qemu-common.h" #include "qemu-timer.h" -#include "vmstate.h" +#include "migration/vmstate.h" /* ptimer.c */ typedef struct ptimer_state ptimer_state; diff --git a/block-migration.h b/include/migration/block.h similarity index 100% rename from block-migration.h rename to include/migration/block.h diff --git a/migration.h b/include/migration/migration.h similarity index 99% rename from migration.h rename to include/migration/migration.h index af444d444b..a95f761e4c 100644 --- a/migration.h +++ b/include/migration/migration.h @@ -18,7 +18,7 @@ #include "qemu-common.h" #include "notify.h" #include "qapi/error.h" -#include "vmstate.h" +#include "migration/vmstate.h" #include "qapi-types.h" struct MigrationParams { diff --git a/include/qemu/page_cache.h b/include/migration/page_cache.h similarity index 100% rename from include/qemu/page_cache.h rename to include/migration/page_cache.h diff --git a/qemu-file.h b/include/migration/qemu-file.h similarity index 100% rename from qemu-file.h rename to include/migration/qemu-file.h diff --git a/vmstate.h b/include/migration/vmstate.h similarity index 100% rename from vmstate.h rename to include/migration/vmstate.h diff --git a/include/net/net.h b/include/net/net.h index 26dd0cf29c..41d3729867 100644 --- a/include/net/net.h +++ b/include/net/net.h @@ -6,7 +6,7 @@ #include "qapi/qmp/qdict.h" #include "qemu-option.h" #include "net/queue.h" -#include "vmstate.h" +#include "migration/vmstate.h" #include "qapi-types.h" struct MACAddr { diff --git a/migration-exec.c b/migration-exec.c index 3e55b7792d..784486d2fc 100644 --- a/migration-exec.c +++ b/migration-exec.c @@ -17,7 +17,7 @@ #include "qemu-common.h" #include "qemu_socket.h" -#include "migration.h" +#include "migration/migration.h" #include "buffered_file.h" #include "block/block.h" #include diff --git a/migration-fd.c b/migration-fd.c index 73a1dfcc93..ab5abe2aa5 100644 --- a/migration-fd.c +++ b/migration-fd.c @@ -15,7 +15,7 @@ #include "qemu-common.h" #include "qemu_socket.h" -#include "migration.h" +#include "migration/migration.h" #include "monitor/monitor.h" #include "buffered_file.h" #include "block/block.h" diff --git a/migration-tcp.c b/migration-tcp.c index 07f51f2aef..a36e637ffd 100644 --- a/migration-tcp.c +++ b/migration-tcp.c @@ -15,7 +15,7 @@ #include "qemu-common.h" #include "qemu_socket.h" -#include "migration.h" +#include "migration/migration.h" #include "buffered_file.h" #include "block/block.h" diff --git a/migration-unix.c b/migration-unix.c index 1b9c461083..9debc952da 100644 --- a/migration-unix.c +++ b/migration-unix.c @@ -15,7 +15,7 @@ #include "qemu-common.h" #include "qemu_socket.h" -#include "migration.h" +#include "migration/migration.h" #include "buffered_file.h" #include "block/block.h" diff --git a/migration.c b/migration.c index 27a272eace..0456983bad 100644 --- a/migration.c +++ b/migration.c @@ -14,13 +14,13 @@ */ #include "qemu-common.h" -#include "migration.h" +#include "migration/migration.h" #include "monitor/monitor.h" #include "buffered_file.h" #include "sysemu.h" #include "block/block.h" #include "qemu_socket.h" -#include "block-migration.h" +#include "migration/block.h" #include "qmp-commands.h" //#define DEBUG_MIGRATION diff --git a/monitor.c b/monitor.c index 94c6bb6672..46fdc008f4 100644 --- a/monitor.c +++ b/monitor.c @@ -44,7 +44,7 @@ #include "disas/disas.h" #include "balloon.h" #include "qemu-timer.h" -#include "migration.h" +#include "migration/migration.h" #include "kvm.h" #include "acl.h" #include "qapi/qmp/qint.h" diff --git a/page_cache.c b/page_cache.c index 0294f7e9f6..ba5640bd73 100644 --- a/page_cache.c +++ b/page_cache.c @@ -24,7 +24,7 @@ #include #include "qemu-common.h" -#include "qemu/page_cache.h" +#include "migration/page_cache.h" #ifdef DEBUG_CACHE #define DPRINTF(fmt, ...) \ diff --git a/qemu-tool.c b/qemu-tool.c index 40453fdd99..d1f46222ee 100644 --- a/qemu-tool.c +++ b/qemu-tool.c @@ -17,7 +17,7 @@ #include "monitor/monitor.h" #include "qemu-timer.h" #include "qemu-log.h" -#include "migration.h" +#include "migration/migration.h" #include "main-loop.h" #include "sysemu.h" #include "qemu_socket.h" diff --git a/savevm.c b/savevm.c index bf341bb25f..a5205a09c3 100644 --- a/savevm.c +++ b/savevm.c @@ -77,7 +77,7 @@ #include "sysemu.h" #include "qemu-timer.h" #include "audio/audio.h" -#include "migration.h" +#include "migration/migration.h" #include "qemu_socket.h" #include "qemu-queue.h" #include "qemu-timer.h" diff --git a/ui/spice-core.c b/ui/spice-core.c index 379677554e..962475de6b 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -34,7 +34,7 @@ #include "qapi/qmp/qstring.h" #include "qapi/qmp/qjson.h" #include "notify.h" -#include "migration.h" +#include "migration/migration.h" #include "monitor/monitor.h" #include "hw/hw.h" #include "ui/spice-display.h" diff --git a/vl.c b/vl.c index 9adaf28e64..2debde0a4a 100644 --- a/vl.c +++ b/vl.c @@ -138,10 +138,10 @@ int main(int argc, char **argv) #include "cache-utils.h" #include "blockdev.h" #include "hw/block-common.h" -#include "block-migration.h" +#include "migration/block.h" #include "dma.h" #include "audio/audio.h" -#include "migration.h" +#include "migration/migration.h" #include "kvm.h" #include "qapi/qmp/qjson.h" #include "qemu-option.h" From 14cccb618508a0aa70eb9ccf366703a019a45ff0 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 17 Dec 2012 18:19:50 +0100 Subject: [PATCH 254/300] qom: move include files to include/qom/ Signed-off-by: Paolo Bonzini --- hw/qdev-core.h | 2 +- hw/stream.h | 2 +- include/qemu/rng-random.h | 2 +- include/qemu/rng.h | 2 +- include/{qemu => qom}/cpu.h | 2 +- include/{qemu => qom}/object.h | 0 include/{qemu => qom}/qom-qobject.h | 2 +- qmp.c | 2 +- qom/container.c | 2 +- qom/cpu.c | 2 +- qom/object.c | 4 ++-- qom/qom-qobject.c | 4 ++-- target-alpha/cpu-qom.h | 2 +- target-arm/cpu-qom.h | 2 +- target-cris/cpu-qom.h | 2 +- target-i386/cpu-qom.h | 2 +- target-lm32/cpu-qom.h | 2 +- target-m68k/cpu-qom.h | 2 +- target-microblaze/cpu-qom.h | 2 +- target-mips/cpu-qom.h | 2 +- target-openrisc/cpu.h | 2 +- target-ppc/cpu-qom.h | 2 +- target-s390x/cpu-qom.h | 2 +- target-sh4/cpu-qom.h | 2 +- target-sparc/cpu-qom.h | 2 +- target-unicore32/cpu-qom.h | 2 +- target-xtensa/cpu-qom.h | 2 +- 27 files changed, 28 insertions(+), 28 deletions(-) rename include/{qemu => qom}/cpu.h (99%) rename include/{qemu => qom}/object.h (100%) rename include/{qemu => qom}/qom-qobject.h (97%) diff --git a/hw/qdev-core.h b/hw/qdev-core.h index 506977c109..93a3a2a7bc 100644 --- a/hw/qdev-core.h +++ b/hw/qdev-core.h @@ -4,7 +4,7 @@ #include "qemu-queue.h" #include "qemu-option.h" #include "qemu-types.h" -#include "qemu/object.h" +#include "qom/object.h" #include "hw/irq.h" #include "qapi/error.h" diff --git a/hw/stream.h b/hw/stream.h index 21123a9089..f6137d6e25 100644 --- a/hw/stream.h +++ b/hw/stream.h @@ -2,7 +2,7 @@ #define STREAM_H 1 #include "qemu-common.h" -#include "qemu/object.h" +#include "qom/object.h" /* stream slave. Used until qdev provides a generic way. */ #define TYPE_STREAM_SLAVE "stream-slave" diff --git a/include/qemu/rng-random.h b/include/qemu/rng-random.h index 6249290cc4..4332772a24 100644 --- a/include/qemu/rng-random.h +++ b/include/qemu/rng-random.h @@ -12,7 +12,7 @@ #ifndef QEMU_RNG_RANDOM_H #define QEMU_RNG_RANDOM_H -#include "qemu/object.h" +#include "qom/object.h" #define TYPE_RNG_RANDOM "rng-random" #define RNG_RANDOM(obj) OBJECT_CHECK(RndRandom, (obj), TYPE_RNG_RANDOM) diff --git a/include/qemu/rng.h b/include/qemu/rng.h index 37912971e0..509abd023d 100644 --- a/include/qemu/rng.h +++ b/include/qemu/rng.h @@ -13,7 +13,7 @@ #ifndef QEMU_RNG_H #define QEMU_RNG_H -#include "qemu/object.h" +#include "qom/object.h" #include "qemu-common.h" #include "qapi/error.h" diff --git a/include/qemu/cpu.h b/include/qom/cpu.h similarity index 99% rename from include/qemu/cpu.h rename to include/qom/cpu.h index 61b76982f1..9682dd59ed 100644 --- a/include/qemu/cpu.h +++ b/include/qom/cpu.h @@ -20,7 +20,7 @@ #ifndef QEMU_CPU_H #define QEMU_CPU_H -#include "qemu/object.h" +#include "qom/object.h" #include "qemu-thread.h" /** diff --git a/include/qemu/object.h b/include/qom/object.h similarity index 100% rename from include/qemu/object.h rename to include/qom/object.h diff --git a/include/qemu/qom-qobject.h b/include/qom/qom-qobject.h similarity index 97% rename from include/qemu/qom-qobject.h rename to include/qom/qom-qobject.h index f9dff12f11..77cd717e3f 100644 --- a/include/qemu/qom-qobject.h +++ b/include/qom/qom-qobject.h @@ -13,7 +13,7 @@ #ifndef QEMU_QOM_QOBJECT_H #define QEMU_QOM_QOBJECT_H -#include "qemu/object.h" +#include "qom/object.h" /* * object_property_get_qobject: diff --git a/qmp.c b/qmp.c index e873f0a0dc..5b3a5d7d03 100644 --- a/qmp.c +++ b/qmp.c @@ -23,7 +23,7 @@ #include "arch_init.h" #include "hw/qdev.h" #include "blockdev.h" -#include "qemu/qom-qobject.h" +#include "qom/qom-qobject.h" NameInfo *qmp_query_name(Error **errp) { diff --git a/qom/container.c b/qom/container.c index 4ca8b5cba3..ceb0f0186d 100644 --- a/qom/container.c +++ b/qom/container.c @@ -10,7 +10,7 @@ * See the COPYING file in the top-level directory. */ -#include "qemu/object.h" +#include "qom/object.h" #include "module.h" #include diff --git a/qom/cpu.c b/qom/cpu.c index 5b360469c5..d4d436f80a 100644 --- a/qom/cpu.c +++ b/qom/cpu.c @@ -18,7 +18,7 @@ * */ -#include "qemu/cpu.h" +#include "qom/cpu.h" #include "qemu-common.h" void cpu_reset(CPUState *cpu) diff --git a/qom/object.c b/qom/object.c index 932f8b30de..351b88c817 100644 --- a/qom/object.c +++ b/qom/object.c @@ -10,7 +10,7 @@ * See the COPYING file in the top-level directory. */ -#include "qemu/object.h" +#include "qom/object.h" #include "qemu-common.h" #include "qapi/visitor.h" #include "qapi/string-input-visitor.h" @@ -19,7 +19,7 @@ /* TODO: replace QObject with a simpler visitor to avoid a dependency * of the QOM core on QObject? */ -#include "qemu/qom-qobject.h" +#include "qom/qom-qobject.h" #include "qapi/qmp/qobject.h" #include "qapi/qmp/qbool.h" #include "qapi/qmp/qint.h" diff --git a/qom/qom-qobject.c b/qom/qom-qobject.c index f0fa652157..6384b8e98c 100644 --- a/qom/qom-qobject.c +++ b/qom/qom-qobject.c @@ -10,8 +10,8 @@ */ #include "qemu-common.h" -#include "qemu/object.h" -#include "qemu/qom-qobject.h" +#include "qom/object.h" +#include "qom/qom-qobject.h" #include "qapi/visitor.h" #include "qapi/qmp-input-visitor.h" #include "qapi/qmp-output-visitor.h" diff --git a/target-alpha/cpu-qom.h b/target-alpha/cpu-qom.h index 6b4ca6d1d1..f2414f7e4f 100644 --- a/target-alpha/cpu-qom.h +++ b/target-alpha/cpu-qom.h @@ -20,7 +20,7 @@ #ifndef QEMU_ALPHA_CPU_QOM_H #define QEMU_ALPHA_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #include "cpu.h" #define TYPE_ALPHA_CPU "alpha-cpu" diff --git a/target-arm/cpu-qom.h b/target-arm/cpu-qom.h index beabf9a0a9..0f455c40ff 100644 --- a/target-arm/cpu-qom.h +++ b/target-arm/cpu-qom.h @@ -20,7 +20,7 @@ #ifndef QEMU_ARM_CPU_QOM_H #define QEMU_ARM_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #define TYPE_ARM_CPU "arm-cpu" diff --git a/target-cris/cpu-qom.h b/target-cris/cpu-qom.h index d0e5f04f78..41ab9b2fa5 100644 --- a/target-cris/cpu-qom.h +++ b/target-cris/cpu-qom.h @@ -20,7 +20,7 @@ #ifndef QEMU_CRIS_CPU_QOM_H #define QEMU_CRIS_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #define TYPE_CRIS_CPU "cris-cpu" diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h index 3a7bc6aef4..332916a185 100644 --- a/target-i386/cpu-qom.h +++ b/target-i386/cpu-qom.h @@ -20,7 +20,7 @@ #ifndef QEMU_I386_CPU_QOM_H #define QEMU_I386_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #include "cpu.h" #include "qapi/error.h" diff --git a/target-lm32/cpu-qom.h b/target-lm32/cpu-qom.h index 4ae2eddafb..400cdbd554 100644 --- a/target-lm32/cpu-qom.h +++ b/target-lm32/cpu-qom.h @@ -20,7 +20,7 @@ #ifndef QEMU_LM32_CPU_QOM_H #define QEMU_LM32_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #include "cpu.h" #define TYPE_LM32_CPU "lm32-cpu" diff --git a/target-m68k/cpu-qom.h b/target-m68k/cpu-qom.h index 805786b04d..170daa7c96 100644 --- a/target-m68k/cpu-qom.h +++ b/target-m68k/cpu-qom.h @@ -20,7 +20,7 @@ #ifndef QEMU_M68K_CPU_QOM_H #define QEMU_M68K_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #define TYPE_M68K_CPU "m68k-cpu" diff --git a/target-microblaze/cpu-qom.h b/target-microblaze/cpu-qom.h index 4b23303b6d..f75549dc22 100644 --- a/target-microblaze/cpu-qom.h +++ b/target-microblaze/cpu-qom.h @@ -20,7 +20,7 @@ #ifndef QEMU_MICROBLAZE_CPU_QOM_H #define QEMU_MICROBLAZE_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #define TYPE_MICROBLAZE_CPU "microblaze-cpu" diff --git a/target-mips/cpu-qom.h b/target-mips/cpu-qom.h index 6e2237123a..2a4b812402 100644 --- a/target-mips/cpu-qom.h +++ b/target-mips/cpu-qom.h @@ -20,7 +20,7 @@ #ifndef QEMU_MIPS_CPU_QOM_H #define QEMU_MIPS_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #ifdef TARGET_MIPS64 #define TYPE_MIPS_CPU "mips64-cpu" diff --git a/target-openrisc/cpu.h b/target-openrisc/cpu.h index 8dc56c2873..876b386a3c 100644 --- a/target-openrisc/cpu.h +++ b/target-openrisc/cpu.h @@ -32,7 +32,7 @@ struct OpenRISCCPU; #include "qemu-common.h" #include "exec/cpu-defs.h" #include "softfloat.h" -#include "qemu/cpu.h" +#include "qom/cpu.h" #include "qapi/error.h" #define TYPE_OPENRISC_CPU "or32-cpu" diff --git a/target-ppc/cpu-qom.h b/target-ppc/cpu-qom.h index fef6f95a04..fb6b5a4119 100644 --- a/target-ppc/cpu-qom.h +++ b/target-ppc/cpu-qom.h @@ -20,7 +20,7 @@ #ifndef QEMU_PPC_CPU_QOM_H #define QEMU_PPC_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #include "cpu.h" #ifdef TARGET_PPC64 diff --git a/target-s390x/cpu-qom.h b/target-s390x/cpu-qom.h index 6fa55a80a5..d54e4a2ee2 100644 --- a/target-s390x/cpu-qom.h +++ b/target-s390x/cpu-qom.h @@ -20,7 +20,7 @@ #ifndef QEMU_S390_CPU_QOM_H #define QEMU_S390_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #include "cpu.h" #define TYPE_S390_CPU "s390-cpu" diff --git a/target-sh4/cpu-qom.h b/target-sh4/cpu-qom.h index c41164aa22..09573c9c34 100644 --- a/target-sh4/cpu-qom.h +++ b/target-sh4/cpu-qom.h @@ -20,7 +20,7 @@ #ifndef QEMU_SUPERH_CPU_QOM_H #define QEMU_SUPERH_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #define TYPE_SUPERH_CPU "superh-cpu" diff --git a/target-sparc/cpu-qom.h b/target-sparc/cpu-qom.h index 3d3ac0fcef..2a738ae360 100644 --- a/target-sparc/cpu-qom.h +++ b/target-sparc/cpu-qom.h @@ -20,7 +20,7 @@ #ifndef QEMU_SPARC_CPU_QOM_H #define QEMU_SPARC_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #include "cpu.h" #ifdef TARGET_SPARC64 diff --git a/target-unicore32/cpu-qom.h b/target-unicore32/cpu-qom.h index 342d85e39b..fe40b2d6a8 100644 --- a/target-unicore32/cpu-qom.h +++ b/target-unicore32/cpu-qom.h @@ -11,7 +11,7 @@ #ifndef QEMU_UC32_CPU_QOM_H #define QEMU_UC32_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #include "cpu.h" #define TYPE_UNICORE32_CPU "unicore32-cpu" diff --git a/target-xtensa/cpu-qom.h b/target-xtensa/cpu-qom.h index 1fd2f274a1..e344a9aa79 100644 --- a/target-xtensa/cpu-qom.h +++ b/target-xtensa/cpu-qom.h @@ -29,7 +29,7 @@ #ifndef QEMU_XTENSA_CPU_QOM_H #define QEMU_XTENSA_CPU_QOM_H -#include "qemu/cpu.h" +#include "qom/cpu.h" #include "cpu.h" #define TYPE_XTENSA_CPU "xtensa-cpu" From 1de7afc984b49af164e2619e6850b9732b173b34 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 17 Dec 2012 18:20:00 +0100 Subject: [PATCH 255/300] misc: move include files to include/qemu/ Signed-off-by: Paolo Bonzini --- acl.c | 2 +- aio-posix.c | 4 ++-- aio-win32.c | 4 ++-- arch_init.c | 6 +++--- async.c | 2 +- audio/alsaaudio.c | 2 +- audio/audio.c | 2 +- audio/audio.h | 2 +- audio/noaudio.c | 2 +- audio/ossaudio.c | 4 ++-- audio/spiceaudio.c | 2 +- audio/wavaudio.c | 2 +- backends/rng-random.c | 2 +- bitmap.c | 4 ++-- bitops.c | 2 +- block-migration.c | 4 ++-- block.c | 6 +++--- block/blkdebug.c | 4 ++-- block/blkverify.c | 2 +- block/bochs.c | 2 +- block/cloop.c | 2 +- block/cow.c | 2 +- block/dmg.c | 4 ++-- block/gluster.c | 4 ++-- block/iscsi.c | 4 ++-- block/linux-aio.c | 4 ++-- block/nbd.c | 6 +++--- block/parallels.c | 2 +- block/qcow.c | 2 +- block/qcow2.c | 4 ++-- block/qed-table.c | 2 +- block/qed.c | 2 +- block/raw-posix.c | 8 ++++---- block/raw-win32.c | 6 +++--- block/raw.c | 2 +- block/rbd.c | 2 +- block/sheepdog.c | 6 +++--- block/vdi.c | 2 +- block/vmdk.c | 2 +- block/vpc.c | 2 +- block/vvfat.c | 2 +- block/win32-aio.c | 6 +++--- blockdev-nbd.c | 2 +- blockdev.c | 4 ++-- blockdev.h | 2 +- blockjob.c | 2 +- bsd-user/main.c | 4 ++-- bsd-user/qemu.h | 2 +- bt-host.c | 2 +- bt-vhci.c | 2 +- buffered_file.c | 2 +- cache-utils.c | 2 +- cmd.c | 2 +- compatfd.c | 2 +- cpu-exec.c | 2 +- cpus.c | 8 ++++---- cutils.c | 6 +++--- device_tree.c | 4 ++-- dma-helpers.c | 4 ++-- envlist.c | 4 ++-- event_notifier-posix.c | 4 ++-- event_notifier-win32.c | 4 ++-- exec.c | 6 +++--- fpu/softfloat.h | 2 +- fsdev/qemu-fsdev-dummy.c | 4 ++-- fsdev/qemu-fsdev.c | 6 +++--- fsdev/qemu-fsdev.h | 2 +- fsdev/virtfs-proxy-helper.c | 4 ++-- fsdev/virtio-9p-marshal.c | 4 ++-- gdbstub.c | 2 +- hmp.c | 6 +++--- host-utils.c | 2 +- hw/9pfs/codir.c | 2 +- hw/9pfs/cofile.c | 2 +- hw/9pfs/cofs.c | 2 +- hw/9pfs/coxattr.c | 2 +- hw/9pfs/virtio-9p-coth.c | 2 +- hw/9pfs/virtio-9p-coth.h | 2 +- hw/9pfs/virtio-9p-device.c | 2 +- hw/9pfs/virtio-9p-handle.c | 2 +- hw/9pfs/virtio-9p-local.c | 2 +- hw/9pfs/virtio-9p-posix-acl.c | 2 +- hw/9pfs/virtio-9p-xattr.h | 2 +- hw/9pfs/virtio-9p.c | 2 +- hw/9pfs/virtio-9p.h | 2 +- hw/acpi.h | 2 +- hw/acpi_ich9.c | 2 +- hw/acpi_piix4.c | 2 +- hw/adlib.c | 2 +- hw/alpha_pci.c | 2 +- hw/apic.c | 4 ++-- hw/apic_internal.h | 2 +- hw/applesmc.c | 2 +- hw/arm11mpcore.c | 2 +- hw/arm_boot.c | 2 +- hw/arm_mptimer.c | 2 +- hw/arm_sysctl.c | 2 +- hw/arm_timer.c | 2 +- hw/armv7m_nvic.c | 2 +- hw/baum.c | 2 +- hw/block-common.c | 2 +- hw/bt-hci-csr.c | 2 +- hw/bt-hci.c | 2 +- hw/bt-hid.c | 2 +- hw/bt-l2cap.c | 2 +- hw/cadence_ttc.c | 2 +- hw/cadence_uart.c | 2 +- hw/ccid-card-emulated.c | 2 +- hw/ccid-card-passthru.c | 2 +- hw/cs4231a.c | 2 +- hw/cuda.c | 2 +- hw/device-hotplug.c | 2 +- hw/dma.c | 2 +- hw/dp8393x.c | 2 +- hw/esp-pci.c | 2 +- hw/esp.c | 2 +- hw/etraxfs_ser.c | 2 +- hw/etraxfs_timer.c | 2 +- hw/exynos4210_fimd.c | 2 +- hw/exynos4210_i2c.c | 2 +- hw/exynos4210_mct.c | 2 +- hw/exynos4210_pwm.c | 2 +- hw/exynos4210_rtc.c | 4 ++-- hw/fdc.c | 6 +++--- hw/fw_cfg.c | 4 ++-- hw/grlib_gptimer.c | 2 +- hw/hid.c | 2 +- hw/hpet.c | 2 +- hw/hw.h | 2 +- hw/i8254.c | 2 +- hw/i8254_common.c | 2 +- hw/i8259.c | 2 +- hw/ich9.h | 2 +- hw/ide/core.c | 4 ++-- hw/ide/qdev.c | 2 +- hw/imx_avic.c | 2 +- hw/imx_timer.c | 2 +- hw/intel-hda.c | 2 +- hw/ivshmem.c | 2 +- hw/kvm/i8254.c | 2 +- hw/kvm/pci-assign.c | 4 ++-- hw/lance.c | 4 ++-- hw/leon3.c | 2 +- hw/lm32_sys.c | 6 +++--- hw/lm32_timer.c | 4 ++-- hw/lm32_uart.c | 2 +- hw/lm832x.c | 2 +- hw/lpc_ich9.c | 2 +- hw/m48t59.c | 2 +- hw/mac_dbdma.c | 2 +- hw/mc146818rtc.c | 2 +- hw/mcf5206.c | 2 +- hw/mcf5208.c | 2 +- hw/megasas.c | 2 +- hw/microblaze_boot.c | 4 ++-- hw/milkymist-ac97.c | 2 +- hw/milkymist-hpdmc.c | 2 +- hw/milkymist-memcard.c | 2 +- hw/milkymist-minimac2.c | 2 +- hw/milkymist-pfpu.c | 4 ++-- hw/milkymist-softusb.c | 2 +- hw/milkymist-sysctl.c | 4 ++-- hw/milkymist-tmu2.c | 2 +- hw/milkymist-uart.c | 2 +- hw/milkymist-vgafb.c | 2 +- hw/mips_fulong2e.c | 2 +- hw/mips_malta.c | 2 +- hw/mips_r4k.c | 2 +- hw/mips_timer.c | 2 +- hw/musicpal.c | 2 +- hw/nand.c | 2 +- hw/omap1.c | 2 +- hw/omap2.c | 2 +- hw/omap_dma.c | 2 +- hw/omap_gptimer.c | 2 +- hw/omap_synctimer.c | 2 +- hw/onenand.c | 2 +- hw/openrisc_timer.c | 2 +- hw/pc.c | 2 +- hw/pci/msi.c | 2 +- hw/pci/msix.c | 2 +- hw/pci/pci-hotplug.c | 2 +- hw/pci/pci.c | 2 +- hw/pci/pci_bridge.c | 2 +- hw/pci/pcie.c | 2 +- hw/pci/shpc.c | 4 ++-- hw/pcnet-pci.c | 2 +- hw/pcnet.c | 4 ++-- hw/pcspk.c | 2 +- hw/pflash_cfi01.c | 4 ++-- hw/pflash_cfi02.c | 4 ++-- hw/piix_pci.c | 2 +- hw/pl031.c | 2 +- hw/ppc.c | 4 ++-- hw/ppc/e500.c | 4 ++-- hw/ppc405_boards.c | 2 +- hw/ppc405_uc.c | 4 ++-- hw/ppc4xx_devs.c | 2 +- hw/ppc_booke.c | 4 ++-- hw/ppc_prep.c | 2 +- hw/ppce500_pci.c | 2 +- hw/ptimer.c | 4 ++-- hw/ptimer.h | 2 +- hw/pxa2xx_timer.c | 2 +- hw/q35.h | 2 +- hw/qdev-core.h | 6 +++--- hw/qdev-monitor.c | 2 +- hw/qxl-logger.c | 2 +- hw/qxl.c | 4 ++-- hw/qxl.h | 2 +- hw/rc4030.c | 2 +- hw/rtl8139.c | 4 ++-- hw/s390x/event-facility.h | 2 +- hw/s390x/sclpconsole.c | 2 +- hw/sb16.c | 4 ++-- hw/scsi-bus.c | 2 +- hw/scsi-disk.c | 2 +- hw/scsi-generic.c | 2 +- hw/sd.c | 2 +- hw/serial.c | 2 +- hw/sh_pci.c | 2 +- hw/sh_timer.c | 2 +- hw/slavio_timer.c | 2 +- hw/sm501.c | 2 +- hw/soc_dma.c | 2 +- hw/spapr.c | 2 +- hw/spitz.c | 2 +- hw/stellaris.c | 2 +- hw/strongarm.c | 2 +- hw/sun4m.c | 2 +- hw/sun4u.c | 2 +- hw/tsc2005.c | 2 +- hw/tsc210x.c | 2 +- hw/tusb6010.c | 2 +- hw/twl92230.c | 2 +- hw/usb.h | 2 +- hw/usb/combined-packet.c | 2 +- hw/usb/core.c | 2 +- hw/usb/dev-hid.c | 2 +- hw/usb/dev-network.c | 6 +++--- hw/usb/dev-serial.c | 2 +- hw/usb/dev-smartcard-reader.c | 2 +- hw/usb/dev-storage.c | 4 ++-- hw/usb/dev-uas.c | 4 ++-- hw/usb/hcd-ehci-pci.c | 2 +- hw/usb/hcd-ehci.h | 2 +- hw/usb/hcd-musb.c | 2 +- hw/usb/hcd-ohci.c | 2 +- hw/usb/hcd-uhci.c | 4 ++-- hw/usb/hcd-xhci.c | 2 +- hw/usb/host-linux.c | 2 +- hw/usb/redirect.c | 4 ++-- hw/vfio_pci.c | 8 ++++---- hw/vga-isa-mm.c | 2 +- hw/vga-isa.c | 2 +- hw/vga-pci.c | 2 +- hw/vga.c | 2 +- hw/vhost.c | 2 +- hw/vhost_net.c | 2 +- hw/virtex_ml507.c | 2 +- hw/virtio-balloon.c | 2 +- hw/virtio-blk.c | 2 +- hw/virtio-console.c | 2 +- hw/virtio-net.c | 6 +++--- hw/virtio-pci.c | 4 ++-- hw/virtio-rng.c | 2 +- hw/virtio-serial-bus.c | 4 ++-- hw/virtio.c | 4 ++-- hw/virtio.h | 2 +- hw/vt82c686.c | 2 +- hw/watchdog.c | 6 +++--- hw/watchdog.h | 2 +- hw/wdt_i6300esb.c | 2 +- hw/wdt_ib700.c | 2 +- hw/xen_backend.c | 2 +- hw/xen_common.h | 2 +- hw/xen_domainbuild.c | 4 ++-- hw/xen_pt.c | 2 +- hw/xen_pt_config_init.c | 2 +- hw/xgmac.c | 2 +- hw/xilinx_axidma.c | 4 ++-- hw/xilinx_axienet.c | 2 +- hw/xilinx_spi.c | 2 +- hw/xilinx_spips.c | 4 ++-- hw/xilinx_timer.c | 2 +- hw/xtensa_pic.c | 4 ++-- hw/zynq_slcr.c | 2 +- include/block/aio.h | 4 ++-- include/block/block.h | 2 +- include/block/block_int.h | 6 +++--- include/block/coroutine.h | 4 ++-- include/block/coroutine_int.h | 2 +- include/block/thread-pool.h | 4 ++-- include/exec/cpu-all.h | 2 +- include/exec/cpu-common.h | 4 ++-- include/exec/cpu-defs.h | 4 ++-- include/exec/exec-all.h | 2 +- include/exec/gen-icount.h | 2 +- include/exec/memory.h | 4 ++-- include/exec/softmmu_template.h | 2 +- include/migration/migration.h | 2 +- include/net/net.h | 4 ++-- include/net/slirp.h | 2 +- include/qapi/error.h | 2 +- include/qapi/opts-visitor.h | 2 +- include/qapi/qmp/qdict.h | 2 +- include/qapi/qmp/qerror.h | 2 +- include/qapi/qmp/qjson.h | 2 +- include/qapi/qmp/qlist.h | 4 ++-- acl.h => include/qemu/acl.h | 2 +- qemu-barrier.h => include/qemu/atomic.h | 2 +- bitmap.h => include/qemu/bitmap.h | 2 +- bitops.h => include/qemu/bitops.h | 0 bswap.h => include/qemu/bswap.h | 0 cache-utils.h => include/qemu/cache-utils.h | 0 compatfd.h => include/qemu/compatfd.h | 0 compiler.h => include/qemu/compiler.h | 0 qemu-config.h => include/qemu/config-file.h | 4 ++-- envlist.h => include/qemu/envlist.h | 0 qemu-error.h => include/qemu/error-report.h | 0 .../qemu/event_notifier.h | 0 host-utils.h => include/qemu/host-utils.h | 2 +- int128.h => include/qemu/int128.h | 0 iov.h => include/qemu/iov.h | 0 qemu-log.h => include/qemu/log.h | 0 main-loop.h => include/qemu/main-loop.h | 0 module.h => include/qemu/module.h | 0 notify.h => include/qemu/notify.h | 2 +- qemu-option.h => include/qemu/option.h | 2 +- .../qemu/option_int.h | 4 ++-- osdep.h => include/qemu/osdep.h | 0 qemu-queue.h => include/qemu/queue.h | 2 +- range.h => include/qemu/range.h | 0 qemu_socket.h => include/qemu/sockets.h | 2 +- .../qemu/thread-posix.h | 0 .../qemu/thread-win32.h | 0 qemu-thread.h => include/qemu/thread.h | 4 ++-- qemu-timer.h => include/qemu/timer.h | 4 ++-- qemu-tls.h => include/qemu/tls.h | 0 qemu-types.h => include/qemu/typedefs.h | 0 uri.h => include/qemu/uri.h | 0 qemu-xattr.h => include/qemu/xattr.h | 0 include/qom/cpu.h | 2 +- include/qom/object.h | 2 +- include/ui/console.h | 2 +- include/ui/qemu-spice.h | 4 ++-- include/ui/spice-display.h | 2 +- iohandler.c | 4 ++-- iov.c | 2 +- kvm-all.c | 10 +++++----- kvm.h | 2 +- libcacard/event.c | 2 +- libcacard/vreader.c | 2 +- libcacard/vscclient.c | 4 ++-- libfdt_env.h | 2 +- linux-user/main.c | 6 +++--- linux-user/qemu.h | 4 ++-- linux-user/syscall.c | 2 +- main-loop.c | 6 +++--- memory.c | 2 +- memory_mapping.h | 2 +- migration-exec.c | 2 +- migration-fd.c | 4 ++-- migration-tcp.c | 2 +- migration-unix.c | 2 +- migration.c | 2 +- module.c | 4 ++-- monitor.c | 8 ++++---- nbd.c | 4 ++-- net/dump.c | 6 +++--- net/hub.c | 2 +- net/net.c | 6 +++--- net/queue.c | 2 +- net/slirp.c | 2 +- net/socket.c | 8 ++++---- net/tap-bsd.c | 2 +- net/tap-linux.c | 2 +- net/tap-solaris.c | 2 +- net/tap-win32.c | 2 +- net/tap.c | 2 +- net/vde.c | 2 +- notify.c | 2 +- osdep.c | 2 +- oslib-posix.c | 2 +- oslib-win32.c | 4 ++-- qapi/opts-visitor.c | 4 ++-- qapi/qapi-dealloc-visitor.c | 2 +- qapi/qmp-input-visitor.c | 2 +- qapi/qmp-output-visitor.c | 2 +- qdict.c | 2 +- qemu-bridge-helper.c | 2 +- qemu-char.c | 4 ++-- qemu-char.h | 8 ++++---- qemu-common.h | 10 +++++----- qemu-config.c | 6 +++--- qemu-coroutine-io.c | 4 ++-- qemu-coroutine-lock.c | 2 +- qemu-coroutine-sleep.c | 2 +- qemu-img.c | 6 +++--- qemu-io.c | 2 +- qemu-log.c | 2 +- qemu-option.c | 4 ++-- qemu-progress.c | 2 +- qemu-seccomp.h | 2 +- qemu-sockets.c | 4 ++-- qemu-thread-posix.c | 2 +- qemu-thread-win32.c | 2 +- qemu-timer-common.c | 2 +- qemu-timer.c | 4 ++-- qemu-tool.c | 8 ++++---- qga/channel-posix.c | 4 ++-- qga/commands-posix.c | 4 ++-- qga/main.c | 2 +- qlist.c | 2 +- qom/container.c | 2 +- savevm.c | 10 +++++----- scripts/qapi-commands.py | 2 +- slirp/if.c | 2 +- slirp/ip_input.c | 2 +- slirp/sbuf.c | 2 +- slirp/slirp.c | 2 +- slirp/slirp.h | 4 ++-- spice-qemu-char.c | 2 +- stubs/fd-register.c | 2 +- stubs/set-fd-handler.c | 2 +- sysemu.h | 12 ++++++------ target-alpha/int_helper.c | 2 +- target-alpha/sys_helper.c | 2 +- target-alpha/translate.c | 2 +- target-arm/helper.c | 4 ++-- target-arm/translate.c | 2 +- target-cris/helper.c | 2 +- target-cris/op_helper.c | 2 +- target-i386/cpu.c | 4 ++-- target-i386/excp_helper.c | 2 +- target-i386/int_helper.c | 2 +- target-i386/kvm.c | 4 ++-- target-i386/seg_helper.c | 2 +- target-lm32/helper.c | 2 +- target-lm32/op_helper.c | 2 +- target-m68k/translate.c | 2 +- target-microblaze/helper.c | 2 +- target-microblaze/op_helper.c | 2 +- target-mips/op_helper.c | 2 +- target-openrisc/int_helper.c | 2 +- target-openrisc/interrupt.c | 2 +- target-openrisc/mmu.c | 2 +- target-openrisc/translate.c | 4 ++-- target-ppc/int_helper.c | 2 +- target-ppc/kvm.c | 2 +- target-ppc/kvm_ppc.c | 2 +- target-ppc/mem_helper.c | 2 +- target-ppc/translate.c | 2 +- target-s390x/cpu.c | 2 +- target-s390x/helper.c | 2 +- target-s390x/int_helper.c | 2 +- target-s390x/kvm.c | 2 +- target-s390x/misc_helper.c | 4 ++-- target-s390x/translate.c | 2 +- target-sparc/cpu.h | 2 +- target-sparc/helper.c | 2 +- target-sparc/machine.c | 2 +- target-unicore32/helper.c | 2 +- target-unicore32/translate.c | 2 +- target-xtensa/core-dc232b.c | 2 +- target-xtensa/core-dc233c.c | 2 +- target-xtensa/core-fsf.c | 2 +- target-xtensa/helper.c | 2 +- target-xtensa/op_helper.c | 2 +- target-xtensa/translate.c | 2 +- target-xtensa/xtensa-semi.c | 2 +- tcg/tcg.c | 6 +++--- tests/libqtest.c | 4 ++-- tests/tcg/test-i386-fprem.c | 4 ++-- tests/tcg/test-i386.c | 2 +- tests/test-iov.c | 4 ++-- tests/test-qmp-commands.c | 2 +- thread-pool.c | 8 ++++---- trace/simple.c | 2 +- translate-all.c | 2 +- ui/console.c | 2 +- ui/sdl_zoom.c | 2 +- ui/spice-core.c | 10 +++++----- ui/spice-display.c | 4 ++-- ui/vnc-auth-sasl.h | 2 +- ui/vnc-enc-tight.c | 2 +- ui/vnc-jobs.c | 2 +- ui/vnc-palette.h | 2 +- ui/vnc-tls.c | 2 +- ui/vnc-tls.h | 2 +- ui/vnc.c | 8 ++++---- ui/vnc.h | 6 +++--- uri.c | 2 +- vl.c | 18 +++++++++--------- xen-all.c | 2 +- xen-mapcache.c | 2 +- 496 files changed, 673 insertions(+), 673 deletions(-) rename acl.h => include/qemu/acl.h (98%) rename qemu-barrier.h => include/qemu/atomic.h (96%) rename bitmap.h => include/qemu/bitmap.h (99%) rename bitops.h => include/qemu/bitops.h (100%) rename bswap.h => include/qemu/bswap.h (100%) rename cache-utils.h => include/qemu/cache-utils.h (100%) rename compatfd.h => include/qemu/compatfd.h (100%) rename compiler.h => include/qemu/compiler.h (100%) rename qemu-config.h => include/qemu/config-file.h (94%) rename envlist.h => include/qemu/envlist.h (100%) rename qemu-error.h => include/qemu/error-report.h (100%) rename event_notifier.h => include/qemu/event_notifier.h (100%) rename host-utils.h => include/qemu/host-utils.h (99%) rename int128.h => include/qemu/int128.h (100%) rename iov.h => include/qemu/iov.h (100%) rename qemu-log.h => include/qemu/log.h (100%) rename main-loop.h => include/qemu/main-loop.h (100%) rename module.h => include/qemu/module.h (100%) rename notify.h => include/qemu/notify.h (97%) rename qemu-option.h => include/qemu/option.h (99%) rename qemu-option-internal.h => include/qemu/option_int.h (96%) rename osdep.h => include/qemu/osdep.h (100%) rename qemu-queue.h => include/qemu/queue.h (99%) rename range.h => include/qemu/range.h (100%) rename qemu_socket.h => include/qemu/sockets.h (99%) rename qemu-thread-posix.h => include/qemu/thread-posix.h (100%) rename qemu-thread-win32.h => include/qemu/thread-win32.h (100%) rename qemu-thread.h => include/qemu/thread.h (96%) rename qemu-timer.h => include/qemu/timer.h (99%) rename qemu-tls.h => include/qemu/tls.h (100%) rename qemu-types.h => include/qemu/typedefs.h (100%) rename uri.h => include/qemu/uri.h (100%) rename qemu-xattr.h => include/qemu/xattr.h (100%) diff --git a/acl.c b/acl.c index e840b9b633..81ac25599b 100644 --- a/acl.c +++ b/acl.c @@ -24,7 +24,7 @@ #include "qemu-common.h" -#include "acl.h" +#include "qemu/acl.h" #ifdef CONFIG_FNMATCH #include diff --git a/aio-posix.c b/aio-posix.c index d1e1bc2c75..88d09e1cfb 100644 --- a/aio-posix.c +++ b/aio-posix.c @@ -15,8 +15,8 @@ #include "qemu-common.h" #include "block/block.h" -#include "qemu-queue.h" -#include "qemu_socket.h" +#include "qemu/queue.h" +#include "qemu/sockets.h" struct AioHandler { diff --git a/aio-win32.c b/aio-win32.c index 9a26f9c3d9..f5ea027f8c 100644 --- a/aio-win32.c +++ b/aio-win32.c @@ -17,8 +17,8 @@ #include "qemu-common.h" #include "block/block.h" -#include "qemu-queue.h" -#include "qemu_socket.h" +#include "qemu/queue.h" +#include "qemu/sockets.h" struct AioHandler { EventNotifier *e; diff --git a/arch_init.c b/arch_init.c index f627253a20..9dacf5689b 100644 --- a/arch_init.c +++ b/arch_init.c @@ -31,8 +31,8 @@ #include "config.h" #include "monitor/monitor.h" #include "sysemu.h" -#include "bitops.h" -#include "bitmap.h" +#include "qemu/bitops.h" +#include "qemu/bitmap.h" #include "arch_init.h" #include "audio/audio.h" #include "hw/pc.h" @@ -45,7 +45,7 @@ #include "exec/address-spaces.h" #include "hw/pcspk.h" #include "migration/page_cache.h" -#include "qemu-config.h" +#include "qemu/config-file.h" #include "qmp-commands.h" #include "trace.h" diff --git a/async.c b/async.c index 6df4caf68a..72d268ae35 100644 --- a/async.c +++ b/async.c @@ -24,7 +24,7 @@ #include "qemu-common.h" #include "block/aio.h" -#include "main-loop.h" +#include "qemu/main-loop.h" /***********************************************************/ /* bottom halves (can be seen as timers which expire ASAP) */ diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c index cd553c2a7b..e4e5442631 100644 --- a/audio/alsaaudio.c +++ b/audio/alsaaudio.c @@ -23,7 +23,7 @@ */ #include #include "qemu-common.h" -#include "main-loop.h" +#include "qemu/main-loop.h" #include "audio.h" #if QEMU_GNUC_PREREQ(4, 3) diff --git a/audio/audio.c b/audio/audio.c index a0cc727020..eb2222c10f 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -24,7 +24,7 @@ #include "hw/hw.h" #include "audio.h" #include "monitor/monitor.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" #define AUDIO_CAP "audio" diff --git a/audio/audio.h b/audio/audio.h index a70fda97e3..e7ea39777e 100644 --- a/audio/audio.h +++ b/audio/audio.h @@ -25,7 +25,7 @@ #define QEMU_AUDIO_H #include "config-host.h" -#include "qemu-queue.h" +#include "qemu/queue.h" typedef void (*audio_callback_fn) (void *opaque, int avail); diff --git a/audio/noaudio.c b/audio/noaudio.c index 54958f8623..9f23aa2cb3 100644 --- a/audio/noaudio.c +++ b/audio/noaudio.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" #include "audio.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #define AUDIO_CAP "noaudio" #include "audio_int.h" diff --git a/audio/ossaudio.c b/audio/ossaudio.c index 8249a00449..00be9c91e3 100644 --- a/audio/ossaudio.c +++ b/audio/ossaudio.c @@ -31,8 +31,8 @@ #include #endif #include "qemu-common.h" -#include "main-loop.h" -#include "host-utils.h" +#include "qemu/main-loop.h" +#include "qemu/host-utils.h" #include "audio.h" #define AUDIO_CAP "oss" diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c index 6f15591a74..bc24557de4 100644 --- a/audio/spiceaudio.c +++ b/audio/spiceaudio.c @@ -18,7 +18,7 @@ */ #include "hw/hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ui/qemu-spice.h" #define AUDIO_CAP "spice" diff --git a/audio/wavaudio.c b/audio/wavaudio.c index a449b5127e..950fa8f19c 100644 --- a/audio/wavaudio.c +++ b/audio/wavaudio.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "hw/hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "audio.h" #define AUDIO_CAP "wav" diff --git a/backends/rng-random.c b/backends/rng-random.c index c201953f29..d479ce8c56 100644 --- a/backends/rng-random.c +++ b/backends/rng-random.c @@ -13,7 +13,7 @@ #include "qemu/rng-random.h" #include "qemu/rng.h" #include "qapi/qmp/qerror.h" -#include "main-loop.h" +#include "qemu/main-loop.h" struct RndRandom { diff --git a/bitmap.c b/bitmap.c index a62c8ba681..687841dcec 100644 --- a/bitmap.c +++ b/bitmap.c @@ -9,8 +9,8 @@ * Version 2. */ -#include "bitops.h" -#include "bitmap.h" +#include "qemu/bitops.h" +#include "qemu/bitmap.h" /* * bitmaps provide an array of bits, implemented using an an diff --git a/bitops.c b/bitops.c index d9de71f7e8..4c3a836a01 100644 --- a/bitops.c +++ b/bitops.c @@ -11,7 +11,7 @@ * 2 of the License, or (at your option) any later version. */ -#include "bitops.h" +#include "qemu/bitops.h" #define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) diff --git a/block-migration.c b/block-migration.c index 2d2dcbda94..4e865a6781 100644 --- a/block-migration.c +++ b/block-migration.c @@ -16,8 +16,8 @@ #include "qemu-common.h" #include "block/block_int.h" #include "hw/hw.h" -#include "qemu-queue.h" -#include "qemu-timer.h" +#include "qemu/queue.h" +#include "qemu/timer.h" #include "migration/block.h" #include "migration/migration.h" #include "blockdev.h" diff --git a/block.c b/block.c index 0e7f18c6d3..1af4b99ee8 100644 --- a/block.c +++ b/block.c @@ -27,13 +27,13 @@ #include "monitor/monitor.h" #include "block/block_int.h" #include "block/blockjob.h" -#include "module.h" +#include "qemu/module.h" #include "qapi/qmp/qjson.h" #include "sysemu.h" -#include "notify.h" +#include "qemu/notify.h" #include "block/coroutine.h" #include "qmp-commands.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #ifdef CONFIG_BSD #include diff --git a/block/blkdebug.c b/block/blkdebug.c index cd2866e7bd..6f7463772b 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -23,9 +23,9 @@ */ #include "qemu-common.h" -#include "qemu-config.h" +#include "qemu/config-file.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" typedef struct BDRVBlkdebugState { int state; diff --git a/block/blkverify.c b/block/blkverify.c index cde5098e5a..a7dd45909b 100644 --- a/block/blkverify.c +++ b/block/blkverify.c @@ -8,7 +8,7 @@ */ #include -#include "qemu_socket.h" /* for EINPROGRESS on Windows */ +#include "qemu/sockets.h" /* for EINPROGRESS on Windows */ #include "block/block_int.h" typedef struct { diff --git a/block/bochs.c b/block/bochs.c index 2cc7524782..1b1d9cdbe5 100644 --- a/block/bochs.c +++ b/block/bochs.c @@ -24,7 +24,7 @@ */ #include "qemu-common.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" /**************************************************************/ diff --git a/block/cloop.c b/block/cloop.c index da29ff379c..5a0d0d805f 100644 --- a/block/cloop.c +++ b/block/cloop.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" #include typedef struct BDRVCloopState { diff --git a/block/cow.c b/block/cow.c index 1438ae1e3b..a33ce950d4 100644 --- a/block/cow.c +++ b/block/cow.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" /**************************************************************/ /* COW block driver using file system holes */ diff --git a/block/dmg.c b/block/dmg.c index 6ee505a9f5..ac397dc8f7 100644 --- a/block/dmg.c +++ b/block/dmg.c @@ -23,8 +23,8 @@ */ #include "qemu-common.h" #include "block/block_int.h" -#include "bswap.h" -#include "module.h" +#include "qemu/bswap.h" +#include "qemu/module.h" #include typedef struct BDRVDMGState { diff --git a/block/gluster.c b/block/gluster.c index 4cb4e60227..0f2c32a3fa 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -17,8 +17,8 @@ */ #include #include "block/block_int.h" -#include "qemu_socket.h" -#include "uri.h" +#include "qemu/sockets.h" +#include "qemu/uri.h" typedef struct GlusterAIOCB { BlockDriverAIOCB common; diff --git a/block/iscsi.c b/block/iscsi.c index 77e619a1fd..041ee07de3 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -27,8 +27,8 @@ #include #include #include "qemu-common.h" -#include "qemu-config.h" -#include "qemu-error.h" +#include "qemu/config-file.h" +#include "qemu/error-report.h" #include "block/block_int.h" #include "trace.h" #include "hw/scsi-defs.h" diff --git a/block/linux-aio.c b/block/linux-aio.c index 28e5a04e12..ee0f8d10c9 100644 --- a/block/linux-aio.c +++ b/block/linux-aio.c @@ -9,9 +9,9 @@ */ #include "qemu-common.h" #include "block/aio.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include "block/raw-aio.h" -#include "event_notifier.h" +#include "qemu/event_notifier.h" #include diff --git a/block/nbd.c b/block/nbd.c index 38d6b90ab2..a5812948d2 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -28,10 +28,10 @@ #include "qemu-common.h" #include "block/nbd.h" -#include "uri.h" +#include "qemu/uri.h" #include "block/block_int.h" -#include "module.h" -#include "qemu_socket.h" +#include "qemu/module.h" +#include "qemu/sockets.h" #include #include diff --git a/block/parallels.c b/block/parallels.c index ae88cd6359..377375046f 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -25,7 +25,7 @@ */ #include "qemu-common.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" /**************************************************************/ diff --git a/block/qcow.c b/block/qcow.c index f36671196e..4276610afd 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" #include #include "block/aes.h" #include "migration/migration.h" diff --git a/block/qcow2.c b/block/qcow2.c index 205d910a52..d603f98a9c 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -23,11 +23,11 @@ */ #include "qemu-common.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" #include #include "block/aes.h" #include "block/qcow2.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "qapi/qmp/qerror.h" #include "trace.h" diff --git a/block/qed-table.c b/block/qed-table.c index de845ec3d0..76d2dcccf8 100644 --- a/block/qed-table.c +++ b/block/qed-table.c @@ -13,7 +13,7 @@ */ #include "trace.h" -#include "qemu_socket.h" /* for EINPROGRESS on Windows */ +#include "qemu/sockets.h" /* for EINPROGRESS on Windows */ #include "qed.h" typedef struct { diff --git a/block/qed.c b/block/qed.c index 10d0827482..cf85d8f2b4 100644 --- a/block/qed.c +++ b/block/qed.c @@ -12,7 +12,7 @@ * */ -#include "qemu-timer.h" +#include "qemu/timer.h" #include "trace.h" #include "qed.h" #include "qapi/qmp/qerror.h" diff --git a/block/raw-posix.c b/block/raw-posix.c index 4e73885269..91159c7887 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -22,13 +22,13 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "qemu-timer.h" -#include "qemu-log.h" +#include "qemu/timer.h" +#include "qemu/log.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" #include "trace.h" #include "block/thread-pool.h" -#include "iov.h" +#include "qemu/iov.h" #include "raw-aio.h" #if defined(__APPLE__) && (__MACH__) diff --git a/block/raw-win32.c b/block/raw-win32.c index 9269fe84c0..f58334be08 100644 --- a/block/raw-win32.c +++ b/block/raw-win32.c @@ -22,13 +22,13 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" #include "raw-aio.h" #include "trace.h" #include "block/thread-pool.h" -#include "iov.h" +#include "qemu/iov.h" #include #include diff --git a/block/raw.c b/block/raw.c index 6aec93dadb..75812db3c2 100644 --- a/block/raw.c +++ b/block/raw.c @@ -1,7 +1,7 @@ #include "qemu-common.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" static int raw_open(BlockDriverState *bs, int flags) { diff --git a/block/rbd.c b/block/rbd.c index 8def2f174c..8cd10a7b59 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -14,7 +14,7 @@ #include #include "qemu-common.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "block/block_int.h" #include diff --git a/block/sheepdog.c b/block/sheepdog.c index da70df2d00..13dc023fdb 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -13,10 +13,10 @@ */ #include "qemu-common.h" -#include "qemu-error.h" -#include "qemu_socket.h" +#include "qemu/error-report.h" +#include "qemu/sockets.h" #include "block/block_int.h" -#include "bitops.h" +#include "qemu/bitops.h" #define SD_PROTO_VER 0x01 diff --git a/block/vdi.c b/block/vdi.c index b1d199a2e5..7b6231941b 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -51,7 +51,7 @@ #include "qemu-common.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" #include "migration/migration.h" #if defined(CONFIG_UUID) diff --git a/block/vmdk.c b/block/vmdk.c index 77a1a67c61..19298c2a3e 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -25,7 +25,7 @@ #include "qemu-common.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" #include "migration/migration.h" #include diff --git a/block/vpc.c b/block/vpc.c index 47b5518aee..7948609e50 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -24,7 +24,7 @@ */ #include "qemu-common.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" #include "migration/migration.h" #if defined(CONFIG_UUID) #include diff --git a/block/vvfat.c b/block/vvfat.c index a63c3ea7cd..83706ce556 100644 --- a/block/vvfat.c +++ b/block/vvfat.c @@ -26,7 +26,7 @@ #include #include "qemu-common.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" #include "migration/migration.h" #ifndef S_IWGRP diff --git a/block/win32-aio.c b/block/win32-aio.c index 606e4d6925..46a5db78cc 100644 --- a/block/win32-aio.c +++ b/block/win32-aio.c @@ -22,13 +22,13 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "block/block_int.h" -#include "module.h" +#include "qemu/module.h" #include "qemu-common.h" #include "block/aio.h" #include "raw-aio.h" -#include "event_notifier.h" +#include "qemu/event_notifier.h" #include #include diff --git a/blockdev-nbd.c b/blockdev-nbd.c index 596b47499d..95b621699a 100644 --- a/blockdev-nbd.c +++ b/blockdev-nbd.c @@ -17,7 +17,7 @@ #include "qmp-commands.h" #include "trace.h" #include "block/nbd.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" static int server_fd = -1; diff --git a/blockdev.c b/blockdev.c index a2308fa718..3ebff44310 100644 --- a/blockdev.c +++ b/blockdev.c @@ -12,8 +12,8 @@ #include "block/blockjob.h" #include "monitor/monitor.h" #include "qapi/qmp/qerror.h" -#include "qemu-option.h" -#include "qemu-config.h" +#include "qemu/option.h" +#include "qemu/config-file.h" #include "qapi/qmp/types.h" #include "sysemu.h" #include "block/block_int.h" diff --git a/blockdev.h b/blockdev.h index 4134864758..1fe533299e 100644 --- a/blockdev.h +++ b/blockdev.h @@ -12,7 +12,7 @@ #include "block/block.h" #include "qapi/error.h" -#include "qemu-queue.h" +#include "qemu/queue.h" void blockdev_mark_auto_del(BlockDriverState *bs); void blockdev_auto_del(BlockDriverState *bs); diff --git a/blockjob.c b/blockjob.c index 4bc60c7378..ca80df1d0e 100644 --- a/blockjob.c +++ b/blockjob.c @@ -33,7 +33,7 @@ #include "qapi/qmp/qjson.h" #include "block/coroutine.h" #include "qmp-commands.h" -#include "qemu-timer.h" +#include "qemu/timer.h" void *block_job_create(const BlockJobType *job_type, BlockDriverState *bs, int64_t speed, BlockDriverCompletionFunc *cb, diff --git a/bsd-user/main.c b/bsd-user/main.c index 095ae8eaaa..1dc033046b 100644 --- a/bsd-user/main.c +++ b/bsd-user/main.c @@ -31,8 +31,8 @@ /* For tb_lock */ #include "cpu.h" #include "tcg.h" -#include "qemu-timer.h" -#include "envlist.h" +#include "qemu/timer.h" +#include "qemu/envlist.h" #define DEBUG_LOGFILE "/tmp/qemu.log" diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h index c64c3ccca3..a826086dab 100644 --- a/bsd-user/qemu.h +++ b/bsd-user/qemu.h @@ -146,7 +146,7 @@ int get_osversion(void); void fork_start(void); void fork_end(int child); -#include "qemu-log.h" +#include "qemu/log.h" /* strace.c */ void diff --git a/bt-host.c b/bt-host.c index 65aaca337c..4f5f9f93c5 100644 --- a/bt-host.c +++ b/bt-host.c @@ -19,7 +19,7 @@ #include "qemu-common.h" #include "bt-host.h" -#include "main-loop.h" +#include "qemu/main-loop.h" #ifndef _WIN32 # include diff --git a/bt-vhci.c b/bt-vhci.c index 13c0e53729..f5d856a809 100644 --- a/bt-vhci.c +++ b/bt-vhci.c @@ -20,7 +20,7 @@ #include "qemu-common.h" #include "bt-host.h" #include "hw/bt.h" -#include "main-loop.h" +#include "qemu/main-loop.h" #define VHCI_DEV "/dev/vhci" #define VHCI_UDEV "/dev/hci_vhci" diff --git a/buffered_file.c b/buffered_file.c index f13443ee91..27627a1b71 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -15,7 +15,7 @@ #include "qemu-common.h" #include "hw/hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "buffered_file.h" //#define DEBUG_BUFFERED_FILE diff --git a/cache-utils.c b/cache-utils.c index 2db5af2db1..b94013a8cb 100644 --- a/cache-utils.c +++ b/cache-utils.c @@ -1,4 +1,4 @@ -#include "cache-utils.h" +#include "qemu/cache-utils.h" #if defined(_ARCH_PPC) struct qemu_cache_conf qemu_cache_conf = { diff --git a/cmd.c b/cmd.c index 01a8c3a299..10a8688b2d 100644 --- a/cmd.c +++ b/cmd.c @@ -25,7 +25,7 @@ #include "cmd.h" #include "block/aio.h" -#include "main-loop.h" +#include "qemu/main-loop.h" #define _(x) x /* not gettext support yet */ diff --git a/compatfd.c b/compatfd.c index 42f81cafe4..9cf3f2834d 100644 --- a/compatfd.c +++ b/compatfd.c @@ -14,7 +14,7 @@ */ #include "qemu-common.h" -#include "compatfd.h" +#include "qemu/compatfd.h" #include #include diff --git a/cpu-exec.c b/cpu-exec.c index b5a32b84e4..54e62ed551 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -20,7 +20,7 @@ #include "cpu.h" #include "disas/disas.h" #include "tcg.h" -#include "qemu-barrier.h" +#include "qemu/atomic.h" #include "qtest.h" int tb_invalidated_flag; diff --git a/cpus.c b/cpus.c index 3a66401e0d..036418d62c 100644 --- a/cpus.c +++ b/cpus.c @@ -32,14 +32,14 @@ #include "kvm.h" #include "qmp-commands.h" -#include "qemu-thread.h" +#include "qemu/thread.h" #include "cpus.h" #include "qtest.h" -#include "main-loop.h" -#include "bitmap.h" +#include "qemu/main-loop.h" +#include "qemu/bitmap.h" #ifndef _WIN32 -#include "compatfd.h" +#include "qemu/compatfd.h" #endif #ifdef CONFIG_LINUX diff --git a/cutils.c b/cutils.c index 4f0692f78e..d06590b330 100644 --- a/cutils.c +++ b/cutils.c @@ -22,11 +22,11 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include -#include "qemu_socket.h" -#include "iov.h" +#include "qemu/sockets.h" +#include "qemu/iov.h" void strpadcpy(char *buf, int buf_size, const char *str, char pad) { diff --git a/device_tree.c b/device_tree.c index a9236133c7..c3e1ba4904 100644 --- a/device_tree.c +++ b/device_tree.c @@ -22,8 +22,8 @@ #include "qemu-common.h" #include "device_tree.h" #include "hw/loader.h" -#include "qemu-option.h" -#include "qemu-config.h" +#include "qemu/option.h" +#include "qemu/config-file.h" #include diff --git a/dma-helpers.c b/dma-helpers.c index 4f5fb649e7..e6a6dd82fd 100644 --- a/dma-helpers.c +++ b/dma-helpers.c @@ -9,8 +9,8 @@ #include "dma.h" #include "trace.h" -#include "range.h" -#include "qemu-thread.h" +#include "qemu/range.h" +#include "qemu/thread.h" /* #define DEBUG_IOMMU */ diff --git a/envlist.c b/envlist.c index f2303cdd79..ff99fc44e9 100644 --- a/envlist.c +++ b/envlist.c @@ -4,8 +4,8 @@ #include #include -#include "qemu-queue.h" -#include "envlist.h" +#include "qemu/queue.h" +#include "qemu/envlist.h" struct envlist_entry { const char *ev_var; /* actual env value */ diff --git a/event_notifier-posix.c b/event_notifier-posix.c index f0bd839acd..a53b95688d 100644 --- a/event_notifier-posix.c +++ b/event_notifier-posix.c @@ -11,9 +11,9 @@ */ #include "qemu-common.h" -#include "event_notifier.h" +#include "qemu/event_notifier.h" #include "qemu-char.h" -#include "main-loop.h" +#include "qemu/main-loop.h" #ifdef CONFIG_EVENTFD #include diff --git a/event_notifier-win32.c b/event_notifier-win32.c index 4ed21c2a7c..6dbb530cfa 100644 --- a/event_notifier-win32.c +++ b/event_notifier-win32.c @@ -11,8 +11,8 @@ */ #include "qemu-common.h" -#include "event_notifier.h" -#include "main-loop.h" +#include "qemu/event_notifier.h" +#include "qemu/main-loop.h" int event_notifier_init(EventNotifier *e, int active) { diff --git a/exec.c b/exec.c index 17fc7cf854..917bec0ecd 100644 --- a/exec.c +++ b/exec.c @@ -29,11 +29,11 @@ #include "tcg.h" #include "hw/hw.h" #include "hw/qdev.h" -#include "osdep.h" +#include "qemu/osdep.h" #include "kvm.h" #include "hw/xen.h" -#include "qemu-timer.h" -#include "qemu-config.h" +#include "qemu/timer.h" +#include "qemu/config-file.h" #include "exec/memory.h" #include "dma.h" #include "exec/address-spaces.h" diff --git a/fpu/softfloat.h b/fpu/softfloat.h index d8999b311a..0946f0739d 100644 --- a/fpu/softfloat.h +++ b/fpu/softfloat.h @@ -44,7 +44,7 @@ these four paragraphs for those parts of this code that are retained. #include #include "config-host.h" -#include "osdep.h" +#include "qemu/osdep.h" /*---------------------------------------------------------------------------- | Each of the following `typedef's defines the most convenient type that holds diff --git a/fsdev/qemu-fsdev-dummy.c b/fsdev/qemu-fsdev-dummy.c index 300f2758be..4bcf38fe4b 100644 --- a/fsdev/qemu-fsdev-dummy.c +++ b/fsdev/qemu-fsdev-dummy.c @@ -13,8 +13,8 @@ #include #include #include "qemu-fsdev.h" -#include "qemu-config.h" -#include "module.h" +#include "qemu/config-file.h" +#include "qemu/module.h" int qemu_fsdev_add(QemuOpts *opts) { diff --git a/fsdev/qemu-fsdev.c b/fsdev/qemu-fsdev.c index e20202a4bf..4cc04d4fde 100644 --- a/fsdev/qemu-fsdev.c +++ b/fsdev/qemu-fsdev.c @@ -13,10 +13,10 @@ #include #include #include "qemu-fsdev.h" -#include "qemu-queue.h" -#include "osdep.h" +#include "qemu/queue.h" +#include "qemu/osdep.h" #include "qemu-common.h" -#include "qemu-config.h" +#include "qemu/config-file.h" static QTAILQ_HEAD(FsDriverEntry_head, FsDriverListEntry) fsdriver_entries = QTAILQ_HEAD_INITIALIZER(fsdriver_entries); diff --git a/fsdev/qemu-fsdev.h b/fsdev/qemu-fsdev.h index 1af1f545d8..9fa45bf510 100644 --- a/fsdev/qemu-fsdev.h +++ b/fsdev/qemu-fsdev.h @@ -12,7 +12,7 @@ */ #ifndef QEMU_FSDEV_H #define QEMU_FSDEV_H -#include "qemu-option.h" +#include "qemu/option.h" #include "file-op-9p.h" diff --git a/fsdev/virtfs-proxy-helper.c b/fsdev/virtfs-proxy-helper.c index df2a9392b1..6b9afd32d5 100644 --- a/fsdev/virtfs-proxy-helper.c +++ b/fsdev/virtfs-proxy-helper.c @@ -21,8 +21,8 @@ #include #endif #include "qemu-common.h" -#include "qemu_socket.h" -#include "qemu-xattr.h" +#include "qemu/sockets.h" +#include "qemu/xattr.h" #include "virtio-9p-marshal.h" #include "hw/9pfs/virtio-9p-proxy.h" #include "fsdev/virtio-9p-marshal.h" diff --git a/fsdev/virtio-9p-marshal.c b/fsdev/virtio-9p-marshal.c index bf980bfa38..20f308b760 100644 --- a/fsdev/virtio-9p-marshal.c +++ b/fsdev/virtio-9p-marshal.c @@ -22,9 +22,9 @@ #include #include -#include "compiler.h" +#include "qemu/compiler.h" #include "virtio-9p-marshal.h" -#include "bswap.h" +#include "qemu/bswap.h" void v9fs_string_free(V9fsString *str) { diff --git a/gdbstub.c b/gdbstub.c index 9395c829a2..4b178a608f 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -38,7 +38,7 @@ #define MAX_PACKET_LENGTH 4096 #include "cpu.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "kvm.h" #ifndef TARGET_CPU_MEMORY_RW_DEBUG diff --git a/hmp.c b/hmp.c index a76a8f06ea..3d056b0e38 100644 --- a/hmp.c +++ b/hmp.c @@ -16,10 +16,10 @@ #include "hmp.h" #include "net/net.h" #include "qemu-char.h" -#include "qemu-option.h" -#include "qemu-timer.h" +#include "qemu/option.h" +#include "qemu/timer.h" #include "qmp-commands.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "monitor/monitor.h" #include "ui/console.h" diff --git a/host-utils.c b/host-utils.c index dc9612387b..5e3915abba 100644 --- a/host-utils.c +++ b/host-utils.c @@ -25,7 +25,7 @@ #include #include -#include "host-utils.h" +#include "qemu/host-utils.h" //#define DEBUG_MULDIV diff --git a/hw/9pfs/codir.c b/hw/9pfs/codir.c index cd137330b9..65ad3298be 100644 --- a/hw/9pfs/codir.c +++ b/hw/9pfs/codir.c @@ -13,7 +13,7 @@ */ #include "fsdev/qemu-fsdev.h" -#include "qemu-thread.h" +#include "qemu/thread.h" #include "block/coroutine.h" #include "virtio-9p-coth.h" diff --git a/hw/9pfs/cofile.c b/hw/9pfs/cofile.c index 6d6dac7abf..2efebf3571 100644 --- a/hw/9pfs/cofile.c +++ b/hw/9pfs/cofile.c @@ -13,7 +13,7 @@ */ #include "fsdev/qemu-fsdev.h" -#include "qemu-thread.h" +#include "qemu/thread.h" #include "block/coroutine.h" #include "virtio-9p-coth.h" diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c index 4b9ba30157..3891050748 100644 --- a/hw/9pfs/cofs.c +++ b/hw/9pfs/cofs.c @@ -13,7 +13,7 @@ */ #include "fsdev/qemu-fsdev.h" -#include "qemu-thread.h" +#include "qemu/thread.h" #include "block/coroutine.h" #include "virtio-9p-coth.h" diff --git a/hw/9pfs/coxattr.c b/hw/9pfs/coxattr.c index 08365a697e..18ee08df0f 100644 --- a/hw/9pfs/coxattr.c +++ b/hw/9pfs/coxattr.c @@ -13,7 +13,7 @@ */ #include "fsdev/qemu-fsdev.h" -#include "qemu-thread.h" +#include "qemu/thread.h" #include "block/coroutine.h" #include "virtio-9p-coth.h" diff --git a/hw/9pfs/virtio-9p-coth.c b/hw/9pfs/virtio-9p-coth.c index 958725e5cc..ae6cde8005 100644 --- a/hw/9pfs/virtio-9p-coth.c +++ b/hw/9pfs/virtio-9p-coth.c @@ -13,7 +13,7 @@ */ #include "fsdev/qemu-fsdev.h" -#include "qemu-thread.h" +#include "qemu/thread.h" #include "block/coroutine.h" #include "virtio-9p-coth.h" diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h index 8c48a16c10..86d5ed4169 100644 --- a/hw/9pfs/virtio-9p-coth.h +++ b/hw/9pfs/virtio-9p-coth.h @@ -15,7 +15,7 @@ #ifndef _QEMU_VIRTIO_9P_COTH_H #define _QEMU_VIRTIO_9P_COTH_H -#include "qemu-thread.h" +#include "qemu/thread.h" #include "block/coroutine.h" #include "virtio-9p.h" #include diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index b8220abae7..6761bce9dc 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -13,7 +13,7 @@ #include "hw/virtio.h" #include "hw/pc.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "hw/virtio-pci.h" #include "virtio-9p.h" #include "fsdev/qemu-fsdev.h" diff --git a/hw/9pfs/virtio-9p-handle.c b/hw/9pfs/virtio-9p-handle.c index f96d17a974..e30fdb6730 100644 --- a/hw/9pfs/virtio-9p-handle.c +++ b/hw/9pfs/virtio-9p-handle.c @@ -19,7 +19,7 @@ #include #include #include -#include "qemu-xattr.h" +#include "qemu/xattr.h" #include #include #ifdef CONFIG_LINUX_MAGIC_H diff --git a/hw/9pfs/virtio-9p-local.c b/hw/9pfs/virtio-9p-local.c index 33a41d2e18..113602144c 100644 --- a/hw/9pfs/virtio-9p-local.c +++ b/hw/9pfs/virtio-9p-local.c @@ -19,7 +19,7 @@ #include #include #include -#include "qemu-xattr.h" +#include "qemu/xattr.h" #include #include #ifdef CONFIG_LINUX_MAGIC_H diff --git a/hw/9pfs/virtio-9p-posix-acl.c b/hw/9pfs/virtio-9p-posix-acl.c index c064017b1f..08bb0e8bca 100644 --- a/hw/9pfs/virtio-9p-posix-acl.c +++ b/hw/9pfs/virtio-9p-posix-acl.c @@ -12,7 +12,7 @@ */ #include -#include "qemu-xattr.h" +#include "qemu/xattr.h" #include "hw/virtio.h" #include "virtio-9p.h" #include "fsdev/file-op-9p.h" diff --git a/hw/9pfs/virtio-9p-xattr.h b/hw/9pfs/virtio-9p-xattr.h index 9437280c99..41cc6cbc7b 100644 --- a/hw/9pfs/virtio-9p-xattr.h +++ b/hw/9pfs/virtio-9p-xattr.h @@ -13,7 +13,7 @@ #ifndef _QEMU_VIRTIO_9P_XATTR_H #define _QEMU_VIRTIO_9P_XATTR_H -#include "qemu-xattr.h" +#include "qemu/xattr.h" typedef struct xattr_operations { diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index ede20ce80e..0aaf0d2de0 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -13,7 +13,7 @@ #include "hw/virtio.h" #include "hw/pc.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "hw/virtio-pci.h" #include "virtio-9p.h" #include "fsdev/qemu-fsdev.h" diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index 2c0c3baad4..406fe522db 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -9,7 +9,7 @@ #include "hw/virtio.h" #include "fsdev/file-op-9p.h" #include "fsdev/virtio-9p-marshal.h" -#include "qemu-thread.h" +#include "qemu/thread.h" #include "block/coroutine.h" diff --git a/hw/acpi.h b/hw/acpi.h index afda153d09..c3628d070d 100644 --- a/hw/acpi.h +++ b/hw/acpi.h @@ -127,7 +127,7 @@ void acpi_pm_tmr_init(ACPIREGS *ar, acpi_update_sci_fn update_sci, MemoryRegion *parent); void acpi_pm_tmr_reset(ACPIREGS *ar); -#include "qemu-timer.h" +#include "qemu/timer.h" static inline int64_t acpi_pm_tmr_get_clock(void) { return muldiv64(qemu_get_clock_ns(vm_clock), PM_TIMER_FREQUENCY, diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c index 92af3a554c..8d1a689a36 100644 --- a/hw/acpi_ich9.c +++ b/hw/acpi_ich9.c @@ -26,7 +26,7 @@ #include "hw.h" #include "pc.h" #include "pci/pci.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" #include "acpi.h" #include "kvm.h" diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index 4f43f6e070..ebd015dc02 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -25,7 +25,7 @@ #include "pci/pci.h" #include "acpi.h" #include "sysemu.h" -#include "range.h" +#include "qemu/range.h" #include "exec/ioport.h" #include "fw_cfg.h" #include "exec/address-spaces.h" diff --git a/hw/adlib.c b/hw/adlib.c index d39cd97384..07c69fc967 100644 --- a/hw/adlib.c +++ b/hw/adlib.c @@ -32,7 +32,7 @@ #define ADLIB_KILL_TIMERS 1 #ifdef DEBUG -#include "qemu-timer.h" +#include "qemu/timer.h" #endif #define dolog(...) AUD_log ("adlib", __VA_ARGS__) diff --git a/hw/alpha_pci.c b/hw/alpha_pci.c index 7e7b1d27d2..78d93e55ec 100644 --- a/hw/alpha_pci.c +++ b/hw/alpha_pci.c @@ -8,7 +8,7 @@ #include "config.h" #include "alpha_sys.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "sysemu.h" diff --git a/hw/apic.c b/hw/apic.c index d66a476aac..81b82f694c 100644 --- a/hw/apic.c +++ b/hw/apic.c @@ -16,12 +16,12 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see */ -#include "qemu-thread.h" +#include "qemu/thread.h" #include "apic_internal.h" #include "apic.h" #include "ioapic.h" #include "pci/msi.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "trace.h" #include "pc.h" #include "apic-msidef.h" diff --git a/hw/apic_internal.h b/hw/apic_internal.h index fea95654ca..dcbbfd41cb 100644 --- a/hw/apic_internal.h +++ b/hw/apic_internal.h @@ -22,7 +22,7 @@ #include "exec/memory.h" #include "sysbus.h" -#include "qemu-timer.h" +#include "qemu/timer.h" /* APIC Local Vector Table */ #define APIC_LVT_TIMER 0 diff --git a/hw/applesmc.c b/hw/applesmc.c index 91e7cb3d5c..c564b60c0a 100644 --- a/hw/applesmc.c +++ b/hw/applesmc.c @@ -33,7 +33,7 @@ #include "hw.h" #include "isa.h" #include "ui/console.h" -#include "qemu-timer.h" +#include "qemu/timer.h" /* #define DEBUG_SMC */ diff --git a/hw/arm11mpcore.c b/hw/arm11mpcore.c index 640ed20a61..093331124a 100644 --- a/hw/arm11mpcore.c +++ b/hw/arm11mpcore.c @@ -8,7 +8,7 @@ */ #include "sysbus.h" -#include "qemu-timer.h" +#include "qemu/timer.h" /* MPCore private memory region. */ diff --git a/hw/arm_boot.c b/hw/arm_boot.c index 63ff559cf7..bb9889fbef 100644 --- a/hw/arm_boot.c +++ b/hw/arm_boot.c @@ -15,7 +15,7 @@ #include "loader.h" #include "elf.h" #include "device_tree.h" -#include "qemu-config.h" +#include "qemu/config-file.h" #define KERNEL_ARGS_ADDR 0x100 #define KERNEL_LOAD_ADDR 0x00010000 diff --git a/hw/arm_mptimer.c b/hw/arm_mptimer.c index 6790832236..1febaeb7b1 100644 --- a/hw/arm_mptimer.c +++ b/hw/arm_mptimer.c @@ -20,7 +20,7 @@ */ #include "sysbus.h" -#include "qemu-timer.h" +#include "qemu/timer.h" /* This device implements the per-cpu private timer and watchdog block * which is used in both the ARM11MPCore and Cortex-A9MP. diff --git a/hw/arm_sysctl.c b/hw/arm_sysctl.c index 58eb98216d..0884f6275c 100644 --- a/hw/arm_sysctl.c +++ b/hw/arm_sysctl.c @@ -8,7 +8,7 @@ */ #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysbus.h" #include "primecell.h" #include "sysemu.h" diff --git a/hw/arm_timer.c b/hw/arm_timer.c index af339d3d19..37e28e993c 100644 --- a/hw/arm_timer.c +++ b/hw/arm_timer.c @@ -8,7 +8,7 @@ */ #include "sysbus.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "qemu-common.h" #include "qdev.h" #include "ptimer.h" diff --git a/hw/armv7m_nvic.c b/hw/armv7m_nvic.c index 270c307717..0907e42c0c 100644 --- a/hw/armv7m_nvic.c +++ b/hw/armv7m_nvic.c @@ -11,7 +11,7 @@ */ #include "sysbus.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "arm-misc.h" #include "exec/address-spaces.h" #include "arm_gic_internal.h" diff --git a/hw/baum.c b/hw/baum.c index 3e94f84e51..97d13ea344 100644 --- a/hw/baum.c +++ b/hw/baum.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" #include "qemu-char.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "usb.h" #include "baum.h" #include diff --git a/hw/block-common.c b/hw/block-common.c index f0196d78dc..c24208e560 100644 --- a/hw/block-common.c +++ b/hw/block-common.c @@ -9,7 +9,7 @@ #include "blockdev.h" #include "hw/block-common.h" -#include "qemu-error.h" +#include "qemu/error-report.h" void blkconf_serial(BlockConf *conf, char **serial) { diff --git a/hw/bt-hci-csr.c b/hw/bt-hci-csr.c index 0faabbb585..e1dcb6d099 100644 --- a/hw/bt-hci-csr.c +++ b/hw/bt-hci-csr.c @@ -20,7 +20,7 @@ #include "qemu-common.h" #include "qemu-char.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "irq.h" #include "bt-host.h" #include "bt.h" diff --git a/hw/bt-hci.c b/hw/bt-hci.c index d2ad57faa9..da096d8c37 100644 --- a/hw/bt-hci.c +++ b/hw/bt-hci.c @@ -19,7 +19,7 @@ */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "usb.h" #include "bt-host.h" #include "bt.h" diff --git a/hw/bt-hid.c b/hw/bt-hid.c index 0ec0c013b0..cfa7c145b8 100644 --- a/hw/bt-hid.c +++ b/hw/bt-hid.c @@ -19,7 +19,7 @@ */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ui/console.h" #include "hid.h" #include "bt.h" diff --git a/hw/bt-l2cap.c b/hw/bt-l2cap.c index cb43ee7733..ba061c0da3 100644 --- a/hw/bt-l2cap.c +++ b/hw/bt-l2cap.c @@ -18,7 +18,7 @@ */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "bt.h" #define L2CAP_CID_MAX 0x100 /* Between 0x40 and 0x10000 */ diff --git a/hw/cadence_ttc.c b/hw/cadence_ttc.c index ec78a52180..9e1cb1f152 100644 --- a/hw/cadence_ttc.c +++ b/hw/cadence_ttc.c @@ -17,7 +17,7 @@ */ #include "sysbus.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #ifdef CADENCE_TTC_ERR_DEBUG #define DB_PRINT(...) do { \ diff --git a/hw/cadence_uart.c b/hw/cadence_uart.c index 686e6172d0..f34acc8c46 100644 --- a/hw/cadence_uart.c +++ b/hw/cadence_uart.c @@ -18,7 +18,7 @@ #include "sysbus.h" #include "qemu-char.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #ifdef CADENCE_UART_ERR_DEBUG #define DB_PRINT(...) do { \ diff --git a/hw/ccid-card-emulated.c b/hw/ccid-card-emulated.c index 845a764446..e508380482 100644 --- a/hw/ccid-card-emulated.c +++ b/hw/ccid-card-emulated.c @@ -31,7 +31,7 @@ #include #include -#include "qemu-thread.h" +#include "qemu/thread.h" #include "qemu-char.h" #include "monitor/monitor.h" #include "hw/ccid.h" diff --git a/hw/ccid-card-passthru.c b/hw/ccid-card-passthru.c index f5b4794e90..48e4228b9d 100644 --- a/hw/ccid-card-passthru.c +++ b/hw/ccid-card-passthru.c @@ -9,7 +9,7 @@ */ #include "qemu-char.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "monitor/monitor.h" #include "hw/ccid.h" #include "libcacard/vscard_common.h" diff --git a/hw/cs4231a.c b/hw/cs4231a.c index 0257fd8d2a..9d528c43b0 100644 --- a/hw/cs4231a.c +++ b/hw/cs4231a.c @@ -26,7 +26,7 @@ #include "audio/audio.h" #include "isa.h" #include "qdev.h" -#include "qemu-timer.h" +#include "qemu/timer.h" /* Missing features: diff --git a/hw/cuda.c b/hw/cuda.c index f1f408b839..cf83956e1a 100644 --- a/hw/cuda.c +++ b/hw/cuda.c @@ -25,7 +25,7 @@ #include "hw.h" #include "ppc_mac.h" #include "adb.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" /* XXX: implement all timer modes */ diff --git a/hw/device-hotplug.c b/hw/device-hotplug.c index 809a598e3a..34543786e5 100644 --- a/hw/device-hotplug.c +++ b/hw/device-hotplug.c @@ -25,7 +25,7 @@ #include "hw.h" #include "boards.h" #include "blockdev.h" -#include "qemu-config.h" +#include "qemu/config-file.h" #include "sysemu.h" #include "monitor/monitor.h" diff --git a/hw/dma.c b/hw/dma.c index 364f54d2d7..0634baa552 100644 --- a/hw/dma.c +++ b/hw/dma.c @@ -23,7 +23,7 @@ */ #include "hw.h" #include "isa.h" -#include "main-loop.h" +#include "qemu/main-loop.h" /* #define DEBUG_DMA */ diff --git a/hw/dp8393x.c b/hw/dp8393x.c index d59b6118ad..b5014501df 100644 --- a/hw/dp8393x.c +++ b/hw/dp8393x.c @@ -18,7 +18,7 @@ */ #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "net/net.h" #include "mips.h" diff --git a/hw/esp-pci.c b/hw/esp-pci.c index d433473d6a..c949e6e0d9 100644 --- a/hw/esp-pci.c +++ b/hw/esp-pci.c @@ -27,7 +27,7 @@ #include "eeprom93xx.h" #include "esp.h" #include "trace.h" -#include "qemu-log.h" +#include "qemu/log.h" #define TYPE_AM53C974_DEVICE "am53c974" diff --git a/hw/esp.c b/hw/esp.c index 6d01624a49..0e4e430880 100644 --- a/hw/esp.c +++ b/hw/esp.c @@ -26,7 +26,7 @@ #include "sysbus.h" #include "esp.h" #include "trace.h" -#include "qemu-log.h" +#include "qemu/log.h" /* * On Sparc32, this is the ESP (NCR53C90) part of chip STP2000 (Master I/O), diff --git a/hw/etraxfs_ser.c b/hw/etraxfs_ser.c index ee0d72bf87..59cb7d2172 100644 --- a/hw/etraxfs_ser.c +++ b/hw/etraxfs_ser.c @@ -24,7 +24,7 @@ #include "sysbus.h" #include "qemu-char.h" -#include "qemu-log.h" +#include "qemu/log.h" #define D(x) diff --git a/hw/etraxfs_timer.c b/hw/etraxfs_timer.c index f5601dc7a5..cc8b327715 100644 --- a/hw/etraxfs_timer.c +++ b/hw/etraxfs_timer.c @@ -23,7 +23,7 @@ */ #include "sysbus.h" #include "sysemu.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ptimer.h" #define D(x) diff --git a/hw/exynos4210_fimd.c b/hw/exynos4210_fimd.c index cfca72ab67..5c29b5d01d 100644 --- a/hw/exynos4210_fimd.c +++ b/hw/exynos4210_fimd.c @@ -27,7 +27,7 @@ #include "sysbus.h" #include "ui/console.h" #include "ui/pixel_ops.h" -#include "bswap.h" +#include "qemu/bswap.h" /* Debug messages configuration */ #define EXYNOS4210_FIMD_DEBUG 0 diff --git a/hw/exynos4210_i2c.c b/hw/exynos4210_i2c.c index 1e11d9b48c..cefd736092 100644 --- a/hw/exynos4210_i2c.c +++ b/hw/exynos4210_i2c.c @@ -20,7 +20,7 @@ * */ -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysbus.h" #include "i2c.h" diff --git a/hw/exynos4210_mct.c b/hw/exynos4210_mct.c index 37dbda92df..41cd142227 100644 --- a/hw/exynos4210_mct.c +++ b/hw/exynos4210_mct.c @@ -53,7 +53,7 @@ */ #include "sysbus.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "qemu-common.h" #include "ptimer.h" diff --git a/hw/exynos4210_pwm.c b/hw/exynos4210_pwm.c index 5e2872f8f7..3a3eb8c27a 100644 --- a/hw/exynos4210_pwm.c +++ b/hw/exynos4210_pwm.c @@ -21,7 +21,7 @@ */ #include "sysbus.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "qemu-common.h" #include "ptimer.h" diff --git a/hw/exynos4210_rtc.c b/hw/exynos4210_rtc.c index c4fbd49461..6ebc9b1790 100644 --- a/hw/exynos4210_rtc.c +++ b/hw/exynos4210_rtc.c @@ -26,12 +26,12 @@ */ #include "sysbus.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "qemu-common.h" #include "ptimer.h" #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" #include "exynos4210.h" diff --git a/hw/fdc.c b/hw/fdc.c index 29b5449ff8..b67d3a574b 100644 --- a/hw/fdc.c +++ b/hw/fdc.c @@ -29,14 +29,14 @@ #include "hw.h" #include "fdc.h" -#include "qemu-error.h" -#include "qemu-timer.h" +#include "qemu/error-report.h" +#include "qemu/timer.h" #include "isa.h" #include "sysbus.h" #include "qdev-addr.h" #include "blockdev.h" #include "sysemu.h" -#include "qemu-log.h" +#include "qemu/log.h" /********************************************************/ /* debug Floppy devices */ diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c index 7b0e50f70d..2a00163a04 100644 --- a/hw/fw_cfg.c +++ b/hw/fw_cfg.c @@ -26,8 +26,8 @@ #include "isa.h" #include "fw_cfg.h" #include "sysbus.h" -#include "qemu-error.h" -#include "qemu-config.h" +#include "qemu/error-report.h" +#include "qemu/config-file.h" /* debug firmware config */ //#define DEBUG_FW_CFG diff --git a/hw/grlib_gptimer.c b/hw/grlib_gptimer.c index 2fdccfba06..252ba893e3 100644 --- a/hw/grlib_gptimer.c +++ b/hw/grlib_gptimer.c @@ -23,7 +23,7 @@ */ #include "sysbus.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ptimer.h" #include "trace.h" diff --git a/hw/hid.c b/hw/hid.c index 7935998e83..0fee3b6ddd 100644 --- a/hw/hid.c +++ b/hw/hid.c @@ -24,7 +24,7 @@ */ #include "hw.h" #include "ui/console.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "hid.h" #define HID_USAGE_ERROR_ROLLOVER 0x01 diff --git a/hw/hpet.c b/hw/hpet.c index 49e1b631b5..78c0662dfc 100644 --- a/hw/hpet.c +++ b/hw/hpet.c @@ -27,7 +27,7 @@ #include "hw.h" #include "pc.h" #include "ui/console.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "hpet_emul.h" #include "sysbus.h" #include "mc146818rtc.h" diff --git a/hw/hw.h b/hw/hw.h index 883ddb60f9..dfced97bbc 100644 --- a/hw/hw.h +++ b/hw/hw.h @@ -13,7 +13,7 @@ #include "block/aio.h" #include "migration/qemu-file.h" #include "migration/vmstate.h" -#include "qemu-log.h" +#include "qemu/log.h" #ifdef NEED_CPU_H #if TARGET_LONG_BITS == 64 diff --git a/hw/i8254.c b/hw/i8254.c index bea5f92fd2..7c2aa6238d 100644 --- a/hw/i8254.c +++ b/hw/i8254.c @@ -24,7 +24,7 @@ #include "hw.h" #include "pc.h" #include "isa.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "i8254.h" #include "i8254_internal.h" diff --git a/hw/i8254_common.c b/hw/i8254_common.c index a03d7cd458..08ab8d14bd 100644 --- a/hw/i8254_common.c +++ b/hw/i8254_common.c @@ -25,7 +25,7 @@ #include "hw.h" #include "pc.h" #include "isa.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "i8254.h" #include "i8254_internal.h" diff --git a/hw/i8259.c b/hw/i8259.c index 5e935e7f99..8fc6339250 100644 --- a/hw/i8259.c +++ b/hw/i8259.c @@ -25,7 +25,7 @@ #include "pc.h" #include "isa.h" #include "monitor/monitor.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "i8259_internal.h" /* debug PIC */ diff --git a/hw/ich9.h b/hw/ich9.h index 5c73f94caf..b8d8e6d3df 100644 --- a/hw/ich9.h +++ b/hw/ich9.h @@ -2,7 +2,7 @@ #define HW_ICH9_H #include "hw.h" -#include "range.h" +#include "qemu/range.h" #include "isa.h" #include "sysbus.h" #include "pc.h" diff --git a/hw/ide/core.c b/hw/ide/core.c index 0e5bc7fe3b..bf65cb407e 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -26,8 +26,8 @@ #include #include #include -#include "qemu-error.h" -#include "qemu-timer.h" +#include "qemu/error-report.h" +#include "qemu/timer.h" #include "sysemu.h" #include "dma.h" #include "hw/block-common.h" diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c index f2e4ea4207..c85e1ac018 100644 --- a/hw/ide/qdev.c +++ b/hw/ide/qdev.c @@ -18,7 +18,7 @@ */ #include #include "dma.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include #include "blockdev.h" #include "hw/block-common.h" diff --git a/hw/imx_avic.c b/hw/imx_avic.c index 810979366d..f1f066cf9c 100644 --- a/hw/imx_avic.c +++ b/hw/imx_avic.c @@ -16,7 +16,7 @@ #include "hw.h" #include "sysbus.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #define DEBUG_INT 1 #undef DEBUG_INT /* comment out for debugging */ diff --git a/hw/imx_timer.c b/hw/imx_timer.c index 33f33fb41e..e924c747c5 100644 --- a/hw/imx_timer.c +++ b/hw/imx_timer.c @@ -12,7 +12,7 @@ */ #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ptimer.h" #include "sysbus.h" #include "imx.h" diff --git a/hw/intel-hda.c b/hw/intel-hda.c index c21bf7204a..7ef3a15e08 100644 --- a/hw/intel-hda.c +++ b/hw/intel-hda.c @@ -20,7 +20,7 @@ #include "hw.h" #include "pci/pci.h" #include "pci/msi.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "audiodev.h" #include "intel-hda.h" #include "intel-hda-defs.h" diff --git a/hw/ivshmem.c b/hw/ivshmem.c index d5b91dd24e..af34f3b582 100644 --- a/hw/ivshmem.c +++ b/hw/ivshmem.c @@ -23,7 +23,7 @@ #include "kvm.h" #include "migration/migration.h" #include "qapi/qmp/qerror.h" -#include "event_notifier.h" +#include "qemu/event_notifier.h" #include "qemu-char.h" #include diff --git a/hw/kvm/i8254.c b/hw/kvm/i8254.c index 53d13e3123..8ee1c352cf 100644 --- a/hw/kvm/i8254.c +++ b/hw/kvm/i8254.c @@ -22,7 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" #include "hw/i8254.h" #include "hw/i8254_internal.h" diff --git a/hw/kvm/pci-assign.c b/hw/kvm/pci-assign.c index ff0dc0dfd4..2f06c27e83 100644 --- a/hw/kvm/pci-assign.c +++ b/hw/kvm/pci-assign.c @@ -28,11 +28,11 @@ #include #include "hw/hw.h" #include "hw/pc.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "ui/console.h" #include "hw/loader.h" #include "monitor/monitor.h" -#include "range.h" +#include "qemu/range.h" #include "sysemu.h" #include "hw/pci/pci.h" #include "hw/pci/msi.h" diff --git a/hw/lance.c b/hw/lance.c index a384676158..b7265c0fed 100644 --- a/hw/lance.c +++ b/hw/lance.c @@ -37,8 +37,8 @@ #include "sysbus.h" #include "net/net.h" -#include "qemu-timer.h" -#include "qemu_socket.h" +#include "qemu/timer.h" +#include "qemu/sockets.h" #include "sun4m.h" #include "pcnet.h" #include "trace.h" diff --git a/hw/leon3.c b/hw/leon3.c index e8d54e5d06..776ab97a78 100644 --- a/hw/leon3.c +++ b/hw/leon3.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ptimer.h" #include "qemu-char.h" #include "sysemu.h" diff --git a/hw/lm32_sys.c b/hw/lm32_sys.c index a7887d14f6..b3350890cb 100644 --- a/hw/lm32_sys.c +++ b/hw/lm32_sys.c @@ -31,10 +31,10 @@ #include "hw.h" #include "sysbus.h" #include "trace.h" -#include "qemu-log.h" -#include "qemu-error.h" +#include "qemu/log.h" +#include "qemu/error-report.h" #include "sysemu.h" -#include "qemu-log.h" +#include "qemu/log.h" enum { R_CTRL = 0, diff --git a/hw/lm32_timer.c b/hw/lm32_timer.c index a8be9cc168..bd4c346386 100644 --- a/hw/lm32_timer.c +++ b/hw/lm32_timer.c @@ -24,9 +24,9 @@ #include "hw.h" #include "sysbus.h" #include "trace.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ptimer.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #define DEFAULT_FREQUENCY (50*1000000) diff --git a/hw/lm32_uart.c b/hw/lm32_uart.c index adb9287568..bf2f507523 100644 --- a/hw/lm32_uart.c +++ b/hw/lm32_uart.c @@ -26,7 +26,7 @@ #include "sysbus.h" #include "trace.h" #include "qemu-char.h" -#include "qemu-error.h" +#include "qemu/error-report.h" enum { R_RXTX = 0, diff --git a/hw/lm832x.c b/hw/lm832x.c index b14a089b32..3649e3d249 100644 --- a/hw/lm832x.c +++ b/hw/lm832x.c @@ -20,7 +20,7 @@ #include "hw.h" #include "i2c.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ui/console.h" typedef struct { diff --git a/hw/lpc_ich9.c b/hw/lpc_ich9.c index e225693721..76217a74fc 100644 --- a/hw/lpc_ich9.c +++ b/hw/lpc_ich9.c @@ -29,7 +29,7 @@ */ #include "qemu-common.h" #include "hw.h" -#include "range.h" +#include "qemu/range.h" #include "isa.h" #include "sysbus.h" #include "pc.h" diff --git a/hw/m48t59.c b/hw/m48t59.c index 491d433ae7..301b10ce79 100644 --- a/hw/m48t59.c +++ b/hw/m48t59.c @@ -23,7 +23,7 @@ */ #include "hw.h" #include "nvram.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" #include "sysbus.h" #include "isa.h" diff --git a/hw/mac_dbdma.c b/hw/mac_dbdma.c index 41eee50a35..b894ab21aa 100644 --- a/hw/mac_dbdma.c +++ b/hw/mac_dbdma.c @@ -39,7 +39,7 @@ #include "hw.h" #include "isa.h" #include "mac_dbdma.h" -#include "main-loop.h" +#include "qemu/main-loop.h" /* debug DBDMA */ //#define DEBUG_DBDMA diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c index 2a1278f393..fba75029df 100644 --- a/hw/mc146818rtc.c +++ b/hw/mc146818rtc.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" #include "mc146818rtc.h" #include "qapi/visitor.h" diff --git a/hw/mcf5206.c b/hw/mcf5206.c index 5edc931abd..fbc806ac18 100644 --- a/hw/mcf5206.c +++ b/hw/mcf5206.c @@ -7,7 +7,7 @@ */ #include "hw.h" #include "mcf.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ptimer.h" #include "sysemu.h" #include "exec/address-spaces.h" diff --git a/hw/mcf5208.c b/hw/mcf5208.c index 997b34847c..fea8a69262 100644 --- a/hw/mcf5208.c +++ b/hw/mcf5208.c @@ -7,7 +7,7 @@ */ #include "hw.h" #include "mcf.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ptimer.h" #include "sysemu.h" #include "net/net.h" diff --git a/hw/megasas.c b/hw/megasas.c index f4fbe9790a..e80c0d1c25 100644 --- a/hw/megasas.c +++ b/hw/megasas.c @@ -22,7 +22,7 @@ #include "pci/pci.h" #include "dma.h" #include "pci/msix.h" -#include "iov.h" +#include "qemu/iov.h" #include "scsi.h" #include "scsi-defs.h" #include "trace.h" diff --git a/hw/microblaze_boot.c b/hw/microblaze_boot.c index 02c349c189..76d33021c0 100644 --- a/hw/microblaze_boot.c +++ b/hw/microblaze_boot.c @@ -24,8 +24,8 @@ * THE SOFTWARE. */ -#include "qemu-option.h" -#include "qemu-config.h" +#include "qemu/option.h" +#include "qemu/config-file.h" #include "qemu-common.h" #include "device_tree.h" #include "loader.h" diff --git a/hw/milkymist-ac97.c b/hw/milkymist-ac97.c index d87656c9ac..f46af1c509 100644 --- a/hw/milkymist-ac97.c +++ b/hw/milkymist-ac97.c @@ -25,7 +25,7 @@ #include "sysbus.h" #include "trace.h" #include "audio/audio.h" -#include "qemu-error.h" +#include "qemu/error-report.h" enum { R_AC97_CTRL = 0, diff --git a/hw/milkymist-hpdmc.c b/hw/milkymist-hpdmc.c index 5d120a497f..fd54d3129a 100644 --- a/hw/milkymist-hpdmc.c +++ b/hw/milkymist-hpdmc.c @@ -24,7 +24,7 @@ #include "hw.h" #include "sysbus.h" #include "trace.h" -#include "qemu-error.h" +#include "qemu/error-report.h" enum { R_SYSTEM = 0, diff --git a/hw/milkymist-memcard.c b/hw/milkymist-memcard.c index ca5df56290..5dc30ace60 100644 --- a/hw/milkymist-memcard.c +++ b/hw/milkymist-memcard.c @@ -25,7 +25,7 @@ #include "sysbus.h" #include "sysemu.h" #include "trace.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "blockdev.h" #include "sd.h" diff --git a/hw/milkymist-minimac2.c b/hw/milkymist-minimac2.c index 926f7f9a8b..4e92ac3dcb 100644 --- a/hw/milkymist-minimac2.c +++ b/hw/milkymist-minimac2.c @@ -26,7 +26,7 @@ #include "sysbus.h" #include "trace.h" #include "net/net.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "qdev-addr.h" #include diff --git a/hw/milkymist-pfpu.c b/hw/milkymist-pfpu.c index 450bab921f..0521829202 100644 --- a/hw/milkymist-pfpu.c +++ b/hw/milkymist-pfpu.c @@ -25,8 +25,8 @@ #include "hw.h" #include "sysbus.h" #include "trace.h" -#include "qemu-log.h" -#include "qemu-error.h" +#include "qemu/log.h" +#include "qemu/error-report.h" #include /* #define TRACE_EXEC */ diff --git a/hw/milkymist-softusb.c b/hw/milkymist-softusb.c index 0743668d18..b7beb4bedb 100644 --- a/hw/milkymist-softusb.c +++ b/hw/milkymist-softusb.c @@ -26,7 +26,7 @@ #include "trace.h" #include "ui/console.h" #include "hid.h" -#include "qemu-error.h" +#include "qemu/error-report.h" enum { R_CTRL = 0, diff --git a/hw/milkymist-sysctl.c b/hw/milkymist-sysctl.c index f951ef9ca8..519462afcc 100644 --- a/hw/milkymist-sysctl.c +++ b/hw/milkymist-sysctl.c @@ -25,9 +25,9 @@ #include "sysbus.h" #include "sysemu.h" #include "trace.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ptimer.h" -#include "qemu-error.h" +#include "qemu/error-report.h" enum { CTRL_ENABLE = (1<<0), diff --git a/hw/milkymist-tmu2.c b/hw/milkymist-tmu2.c index 3f9a684eda..a11772aebe 100644 --- a/hw/milkymist-tmu2.c +++ b/hw/milkymist-tmu2.c @@ -27,7 +27,7 @@ #include "hw.h" #include "sysbus.h" #include "trace.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include #include diff --git a/hw/milkymist-uart.c b/hw/milkymist-uart.c index aefa8c7f1c..ef5518e5c2 100644 --- a/hw/milkymist-uart.c +++ b/hw/milkymist-uart.c @@ -25,7 +25,7 @@ #include "sysbus.h" #include "trace.h" #include "qemu-char.h" -#include "qemu-error.h" +#include "qemu/error-report.h" enum { R_RXTX = 0, diff --git a/hw/milkymist-vgafb.c b/hw/milkymist-vgafb.c index c3471315d3..561285154f 100644 --- a/hw/milkymist-vgafb.c +++ b/hw/milkymist-vgafb.c @@ -28,7 +28,7 @@ #include "ui/console.h" #include "framebuffer.h" #include "ui/pixel_ops.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #define BITS 8 #include "milkymist-vgafb_template.h" diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c index 34619b7e3e..60dd8c69bb 100644 --- a/hw/mips_fulong2e.c +++ b/hw/mips_fulong2e.c @@ -33,7 +33,7 @@ #include "qemu-char.h" #include "sysemu.h" #include "audio/audio.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "loader.h" #include "mips-bios.h" #include "ide.h" diff --git a/hw/mips_malta.c b/hw/mips_malta.c index d65d1256fd..04c7a2612c 100644 --- a/hw/mips_malta.c +++ b/hw/mips_malta.c @@ -38,7 +38,7 @@ #include "sysemu.h" #include "arch_init.h" #include "boards.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "mips-bios.h" #include "ide.h" #include "loader.h" diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c index 05494b9b40..511e1e41c0 100644 --- a/hw/mips_r4k.c +++ b/hw/mips_r4k.c @@ -17,7 +17,7 @@ #include "sysemu.h" #include "boards.h" #include "flash.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "mips-bios.h" #include "ide.h" #include "loader.h" diff --git a/hw/mips_timer.c b/hw/mips_timer.c index 7aa9004a0e..83c400c158 100644 --- a/hw/mips_timer.c +++ b/hw/mips_timer.c @@ -22,7 +22,7 @@ #include "hw.h" #include "mips_cpudevs.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #define TIMER_FREQ 100 * 1000 * 1000 diff --git a/hw/musicpal.c b/hw/musicpal.c index 436b3f7c37..5a7bf8bee1 100644 --- a/hw/musicpal.c +++ b/hw/musicpal.c @@ -16,7 +16,7 @@ #include "sysemu.h" #include "boards.h" #include "serial.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ptimer.h" #include "block/block.h" #include "flash.h" diff --git a/hw/nand.c b/hw/nand.c index 01f3adaee1..a73205d866 100644 --- a/hw/nand.c +++ b/hw/nand.c @@ -22,7 +22,7 @@ # include "flash.h" # include "blockdev.h" # include "sysbus.h" -#include "qemu-error.h" +#include "qemu/error-report.h" # define NAND_CMD_READ0 0x00 # define NAND_CMD_READ1 0x01 diff --git a/hw/omap1.c b/hw/omap1.c index 4d5815eb08..50c4570f31 100644 --- a/hw/omap1.c +++ b/hw/omap1.c @@ -22,7 +22,7 @@ #include "sysemu.h" #include "soc_dma.h" #include "blockdev.h" -#include "range.h" +#include "qemu/range.h" #include "sysbus.h" /* Should signal the TCMI/GPMC */ diff --git a/hw/omap2.c b/hw/omap2.c index 96aba71052..7ccee69661 100644 --- a/hw/omap2.c +++ b/hw/omap2.c @@ -23,7 +23,7 @@ #include "arm-misc.h" #include "omap.h" #include "sysemu.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "qemu-char.h" #include "flash.h" #include "soc_dma.h" diff --git a/hw/omap_dma.c b/hw/omap_dma.c index e619c7b7de..aec5874311 100644 --- a/hw/omap_dma.c +++ b/hw/omap_dma.c @@ -18,7 +18,7 @@ * with this program; if not, see . */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "omap.h" #include "irq.h" #include "soc_dma.h" diff --git a/hw/omap_gptimer.c b/hw/omap_gptimer.c index e39da74067..a5db710dcb 100644 --- a/hw/omap_gptimer.c +++ b/hw/omap_gptimer.c @@ -18,7 +18,7 @@ * with this program; if not, see . */ #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "omap.h" /* GP timers */ diff --git a/hw/omap_synctimer.c b/hw/omap_synctimer.c index 7031a88531..945711eff5 100644 --- a/hw/omap_synctimer.c +++ b/hw/omap_synctimer.c @@ -18,7 +18,7 @@ * with this program; if not, see . */ #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "omap.h" struct omap_synctimer_s { MemoryRegion iomem; diff --git a/hw/onenand.c b/hw/onenand.c index 7d255c563f..2e26e3a05d 100644 --- a/hw/onenand.c +++ b/hw/onenand.c @@ -26,7 +26,7 @@ #include "exec/memory.h" #include "exec/address-spaces.h" #include "sysbus.h" -#include "qemu-error.h" +#include "qemu/error-report.h" /* 11 for 2kB-page OneNAND ("2nd generation") and 10 for 1kB-page chips */ #define PAGE_SHIFT 11 diff --git a/hw/openrisc_timer.c b/hw/openrisc_timer.c index 7916e61d24..d965be77de 100644 --- a/hw/openrisc_timer.c +++ b/hw/openrisc_timer.c @@ -20,7 +20,7 @@ #include "cpu.h" #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #define TIMER_FREQ (20 * 1000 * 1000) /* 20MHz */ diff --git a/hw/pc.c b/hw/pc.c index 7aaff0f2fd..0a92ea6bed 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -50,7 +50,7 @@ #include "exec/memory.h" #include "exec/address-spaces.h" #include "arch_init.h" -#include "bitmap.h" +#include "qemu/bitmap.h" /* debug PC/ISA interrupts */ //#define DEBUG_IRQ diff --git a/hw/pci/msi.c b/hw/pci/msi.c index 680e4637d7..2a04d18884 100644 --- a/hw/pci/msi.c +++ b/hw/pci/msi.c @@ -19,7 +19,7 @@ */ #include "hw/pci/msi.h" -#include "range.h" +#include "qemu/range.h" /* Eventually those constants should go to Linux pci_regs.h */ #define PCI_MSI_PENDING_32 0x10 diff --git a/hw/pci/msix.c b/hw/pci/msix.c index a6a401e286..073e22c315 100644 --- a/hw/pci/msix.c +++ b/hw/pci/msix.c @@ -18,7 +18,7 @@ #include "hw/pci/msi.h" #include "hw/pci/msix.h" #include "hw/pci/pci.h" -#include "range.h" +#include "qemu/range.h" #define MSIX_CAP_LENGTH 12 diff --git a/hw/pci/pci-hotplug.c b/hw/pci/pci-hotplug.c index e5e8a7ab58..2bc02e344f 100644 --- a/hw/pci/pci-hotplug.c +++ b/hw/pci/pci-hotplug.c @@ -30,7 +30,7 @@ #include "monitor/monitor.h" #include "hw/scsi.h" #include "hw/virtio-blk.h" -#include "qemu-config.h" +#include "qemu/config-file.h" #include "blockdev.h" #include "qapi/error.h" diff --git a/hw/pci/pci.c b/hw/pci/pci.c index e062f66088..c9ed95be89 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -29,7 +29,7 @@ #include "net/net.h" #include "sysemu.h" #include "hw/loader.h" -#include "range.h" +#include "qemu/range.h" #include "qmp-commands.h" #include "hw/pci/msi.h" #include "hw/pci/msix.h" diff --git a/hw/pci/pci_bridge.c b/hw/pci/pci_bridge.c index 131091408d..995842a72d 100644 --- a/hw/pci/pci_bridge.c +++ b/hw/pci/pci_bridge.c @@ -31,7 +31,7 @@ #include "hw/pci/pci_bridge.h" #include "hw/pci/pci_bus.h" -#include "range.h" +#include "qemu/range.h" /* PCI bridge subsystem vendor ID helper functions */ #define PCI_SSVID_SIZEOF 8 diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c index b60a6faaf3..6c916d15ec 100644 --- a/hw/pci/pcie.c +++ b/hw/pci/pcie.c @@ -25,7 +25,7 @@ #include "hw/pci/msi.h" #include "hw/pci/pci_bus.h" #include "hw/pci/pcie_regs.h" -#include "range.h" +#include "qemu/range.h" //#define DEBUG_PCIE #ifdef DEBUG_PCIE diff --git a/hw/pci/shpc.c b/hw/pci/shpc.c index 18b1512b43..f07266da66 100644 --- a/hw/pci/shpc.c +++ b/hw/pci/shpc.c @@ -1,7 +1,7 @@ #include #include -#include "range.h" -#include "range.h" +#include "qemu/range.h" +#include "qemu/range.h" #include "hw/pci/shpc.h" #include "hw/pci/pci.h" #include "hw/pci/pci_bus.h" diff --git a/hw/pcnet-pci.c b/hw/pcnet-pci.c index c6768bcbdc..5e8eed3af8 100644 --- a/hw/pcnet-pci.c +++ b/hw/pcnet-pci.c @@ -30,7 +30,7 @@ #include "pci/pci.h" #include "net/net.h" #include "loader.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "dma.h" #include "pcnet.h" diff --git a/hw/pcnet.c b/hw/pcnet.c index 5b03edecdd..87736542e4 100644 --- a/hw/pcnet.c +++ b/hw/pcnet.c @@ -37,8 +37,8 @@ #include "qdev.h" #include "net/net.h" -#include "qemu-timer.h" -#include "qemu_socket.h" +#include "qemu/timer.h" +#include "qemu/sockets.h" #include "sysemu.h" #include "pcnet.h" diff --git a/hw/pcspk.c b/hw/pcspk.c index ad6491b0f4..6d55ebe82f 100644 --- a/hw/pcspk.c +++ b/hw/pcspk.c @@ -26,7 +26,7 @@ #include "pc.h" #include "isa.h" #include "audio/audio.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "i8254.h" #include "pcspk.h" diff --git a/hw/pflash_cfi01.c b/hw/pflash_cfi01.c index 36af4647df..59982dcd6f 100644 --- a/hw/pflash_cfi01.c +++ b/hw/pflash_cfi01.c @@ -39,9 +39,9 @@ #include "hw.h" #include "flash.h" #include "block/block.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "exec/address-spaces.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "sysbus.h" #define PFLASH_BUG(fmt, ...) \ diff --git a/hw/pflash_cfi02.c b/hw/pflash_cfi02.c index c689cc9f42..6924f064c2 100644 --- a/hw/pflash_cfi02.c +++ b/hw/pflash_cfi02.c @@ -37,10 +37,10 @@ #include "hw.h" #include "flash.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "block/block.h" #include "exec/address-spaces.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "sysbus.h" //#define PFLASH_DEBUG diff --git a/hw/piix_pci.c b/hw/piix_pci.c index b5ea68bc61..3d79c73fda 100644 --- a/hw/piix_pci.c +++ b/hw/piix_pci.c @@ -28,7 +28,7 @@ #include "pci/pci_host.h" #include "isa.h" #include "sysbus.h" -#include "range.h" +#include "qemu/range.h" #include "xen.h" #include "pam.h" diff --git a/hw/pl031.c b/hw/pl031.c index 8bf0183289..834a20c917 100644 --- a/hw/pl031.c +++ b/hw/pl031.c @@ -12,7 +12,7 @@ */ #include "sysbus.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" //#define DEBUG_PL031 diff --git a/hw/ppc.c b/hw/ppc.c index 11fd199eaa..f066367609 100644 --- a/hw/ppc.c +++ b/hw/ppc.c @@ -23,10 +23,10 @@ */ #include "hw.h" #include "ppc.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" #include "nvram.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "loader.h" #include "kvm.h" #include "kvm_ppc.h" diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 798e67cedf..3593f7c0e2 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -19,7 +19,7 @@ #include "e500.h" #include "e500-ccsr.h" #include "net/net.h" -#include "qemu-config.h" +#include "qemu/config-file.h" #include "hw/hw.h" #include "hw/serial.h" #include "hw/pci/pci.h" @@ -34,7 +34,7 @@ #include "elf.h" #include "hw/sysbus.h" #include "exec/address-spaces.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "hw/ppce500_pci.h" #define BINARY_DEVICE_TREE_FILE "mpc8544ds.dtb" diff --git a/hw/ppc405_boards.c b/hw/ppc405_boards.c index 5a0e0260e6..31bcc4bb95 100644 --- a/hw/ppc405_boards.c +++ b/hw/ppc405_boards.c @@ -29,7 +29,7 @@ #include "sysemu.h" #include "block/block.h" #include "boards.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "loader.h" #include "blockdev.h" #include "exec/address-spaces.h" diff --git a/hw/ppc405_uc.c b/hw/ppc405_uc.c index aabb2efb48..b1ed8837d6 100644 --- a/hw/ppc405_uc.c +++ b/hw/ppc405_uc.c @@ -25,9 +25,9 @@ #include "ppc.h" #include "ppc405.h" #include "serial.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "exec/address-spaces.h" #define DEBUG_OPBA diff --git a/hw/ppc4xx_devs.c b/hw/ppc4xx_devs.c index 3b9dc06716..d1fb1576b0 100644 --- a/hw/ppc4xx_devs.c +++ b/hw/ppc4xx_devs.c @@ -24,7 +24,7 @@ #include "hw.h" #include "ppc.h" #include "ppc4xx.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "exec/address-spaces.h" //#define DEBUG_MMIO diff --git a/hw/ppc_booke.c b/hw/ppc_booke.c index d51e7fad67..a7182be0d3 100644 --- a/hw/ppc_booke.c +++ b/hw/ppc_booke.c @@ -23,10 +23,10 @@ */ #include "hw.h" #include "ppc.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" #include "nvram.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "loader.h" diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c index aa46cc6f55..072535294e 100644 --- a/hw/ppc_prep.c +++ b/hw/ppc_prep.c @@ -33,7 +33,7 @@ #include "pci/pci_host.h" #include "ppc.h" #include "boards.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "ide.h" #include "loader.h" #include "mc146818rtc.h" diff --git a/hw/ppce500_pci.c b/hw/ppce500_pci.c index feefc6596b..1e1ade3d2e 100644 --- a/hw/ppce500_pci.c +++ b/hw/ppce500_pci.c @@ -18,7 +18,7 @@ #include "hw/ppc/e500-ccsr.h" #include "pci/pci.h" #include "pci/pci_host.h" -#include "bswap.h" +#include "qemu/bswap.h" #include "ppce500_pci.h" #ifdef DEBUG_PCI diff --git a/hw/ptimer.c b/hw/ptimer.c index bc0b3f802f..24af6a2afe 100644 --- a/hw/ptimer.c +++ b/hw/ptimer.c @@ -6,9 +6,9 @@ * This code is licensed under the GNU LGPL. */ #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ptimer.h" -#include "host-utils.h" +#include "qemu/host-utils.h" struct ptimer_state { diff --git a/hw/ptimer.h b/hw/ptimer.h index 9d172f7764..28fcaf17f8 100644 --- a/hw/ptimer.h +++ b/hw/ptimer.h @@ -9,7 +9,7 @@ #define PTIMER_H #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "migration/vmstate.h" /* ptimer.c */ diff --git a/hw/pxa2xx_timer.c b/hw/pxa2xx_timer.c index 8242d26c37..1481c6d3e1 100644 --- a/hw/pxa2xx_timer.c +++ b/hw/pxa2xx_timer.c @@ -8,7 +8,7 @@ */ #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" #include "pxa.h" #include "sysbus.h" diff --git a/hw/q35.h b/hw/q35.h index 2f951c8a94..246c12cb04 100644 --- a/hw/q35.h +++ b/hw/q35.h @@ -23,7 +23,7 @@ #define HW_Q35_H #include "hw.h" -#include "range.h" +#include "qemu/range.h" #include "isa.h" #include "sysbus.h" #include "pc.h" diff --git a/hw/qdev-core.h b/hw/qdev-core.h index 93a3a2a7bc..fdf14ec4a6 100644 --- a/hw/qdev-core.h +++ b/hw/qdev-core.h @@ -1,9 +1,9 @@ #ifndef QDEV_CORE_H #define QDEV_CORE_H -#include "qemu-queue.h" -#include "qemu-option.h" -#include "qemu-types.h" +#include "qemu/queue.h" +#include "qemu/option.h" +#include "qemu/typedefs.h" #include "qom/object.h" #include "hw/irq.h" #include "qapi/error.h" diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c index 207282c4a4..1c6712e6de 100644 --- a/hw/qdev-monitor.c +++ b/hw/qdev-monitor.c @@ -21,7 +21,7 @@ #include "monitor/monitor.h" #include "qmp-commands.h" #include "arch_init.h" -#include "qemu-config.h" +#include "qemu/config-file.h" /* * Aliases were a bad idea from the start. Let's keep them diff --git a/hw/qxl-logger.c b/hw/qxl-logger.c index fe2878c836..3cd85d9b97 100644 --- a/hw/qxl-logger.c +++ b/hw/qxl-logger.c @@ -19,7 +19,7 @@ * along with this program; if not, see . */ -#include "qemu-timer.h" +#include "qemu/timer.h" #include "qxl.h" static const char *qxl_type[] = { diff --git a/hw/qxl.c b/hw/qxl.c index ad0214827e..b88a39cc93 100644 --- a/hw/qxl.c +++ b/hw/qxl.c @@ -21,8 +21,8 @@ #include #include "qemu-common.h" -#include "qemu-timer.h" -#include "qemu-queue.h" +#include "qemu/timer.h" +#include "qemu/queue.h" #include "monitor/monitor.h" #include "sysemu.h" #include "trace.h" diff --git a/hw/qxl.h b/hw/qxl.h index 9130261524..f867a1d0ac 100644 --- a/hw/qxl.h +++ b/hw/qxl.h @@ -7,7 +7,7 @@ #include "hw.h" #include "pci/pci.h" #include "vga_int.h" -#include "qemu-thread.h" +#include "qemu/thread.h" #include "ui/qemu-spice.h" #include "ui/spice-display.h" diff --git a/hw/rc4030.c b/hw/rc4030.c index e0024c87e8..a0358a319c 100644 --- a/hw/rc4030.c +++ b/hw/rc4030.c @@ -24,7 +24,7 @@ #include "hw.h" #include "mips.h" -#include "qemu-timer.h" +#include "qemu/timer.h" /********************************************************/ /* debug rc4030 */ diff --git a/hw/rtl8139.c b/hw/rtl8139.c index e024520b8b..19c31a02c6 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -54,11 +54,11 @@ #include "hw.h" #include "pci/pci.h" #include "dma.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "net/net.h" #include "loader.h" #include "sysemu.h" -#include "iov.h" +#include "qemu/iov.h" /* debug RTL8139 card */ //#define DEBUG_RTL8139 1 diff --git a/hw/s390x/event-facility.h b/hw/s390x/event-facility.h index 30af0a76a7..791ab2a6de 100644 --- a/hw/s390x/event-facility.h +++ b/hw/s390x/event-facility.h @@ -16,7 +16,7 @@ #define HW_S390_SCLP_EVENT_FACILITY_H #include -#include "qemu-thread.h" +#include "qemu/thread.h" /* SCLP event types */ #define SCLP_EVENT_ASCII_CONSOLE_DATA 0x1a diff --git a/hw/s390x/sclpconsole.c b/hw/s390x/sclpconsole.c index 9ad297c999..ca78d6796a 100644 --- a/hw/s390x/sclpconsole.c +++ b/hw/s390x/sclpconsole.c @@ -13,7 +13,7 @@ */ #include -#include "qemu-thread.h" +#include "qemu/thread.h" #include "sclp.h" #include "event-facility.h" diff --git a/hw/sb16.c b/hw/sb16.c index 523ab0d5fd..bb460ccb60 100644 --- a/hw/sb16.c +++ b/hw/sb16.c @@ -26,8 +26,8 @@ #include "audio/audio.h" #include "isa.h" #include "qdev.h" -#include "qemu-timer.h" -#include "host-utils.h" +#include "qemu/timer.h" +#include "qemu/host-utils.h" #define dolog(...) AUD_log ("sb16", __VA_ARGS__) diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c index dfb2631210..5dc9f512b5 100644 --- a/hw/scsi-bus.c +++ b/hw/scsi-bus.c @@ -1,5 +1,5 @@ #include "hw.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "scsi.h" #include "scsi-defs.h" #include "qdev.h" diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index 49b5686a92..c65da4a9c9 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -29,7 +29,7 @@ do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0) #endif #include "qemu-common.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "scsi.h" #include "scsi-defs.h" #include "sysemu.h" diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c index d9045341ba..faeb61ee2c 100644 --- a/hw/scsi-generic.c +++ b/hw/scsi-generic.c @@ -12,7 +12,7 @@ */ #include "qemu-common.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "scsi.h" #include "blockdev.h" diff --git a/hw/sd.c b/hw/sd.c index 2e54eea981..428bd78e32 100644 --- a/hw/sd.c +++ b/hw/sd.c @@ -32,7 +32,7 @@ #include "hw.h" #include "block/block.h" #include "sd.h" -#include "bitmap.h" +#include "qemu/bitmap.h" //#define DEBUG_SD 1 diff --git a/hw/serial.c b/hw/serial.c index 3968c4fc46..2cbb5447a7 100644 --- a/hw/serial.c +++ b/hw/serial.c @@ -25,7 +25,7 @@ #include "serial.h" #include "qemu-char.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "exec/address-spaces.h" //#define DEBUG_SERIAL diff --git a/hw/sh_pci.c b/hw/sh_pci.c index d5218420a3..018b1c198b 100644 --- a/hw/sh_pci.c +++ b/hw/sh_pci.c @@ -25,7 +25,7 @@ #include "sh.h" #include "pci/pci.h" #include "pci/pci_host.h" -#include "bswap.h" +#include "qemu/bswap.h" #include "exec/address-spaces.h" typedef struct SHPCIState { diff --git a/hw/sh_timer.c b/hw/sh_timer.c index da6689f369..64ea23fce6 100644 --- a/hw/sh_timer.c +++ b/hw/sh_timer.c @@ -10,7 +10,7 @@ #include "hw.h" #include "sh.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "exec/address-spaces.h" #include "ptimer.h" diff --git a/hw/slavio_timer.c b/hw/slavio_timer.c index c07ceb1de0..584629f1a5 100644 --- a/hw/slavio_timer.c +++ b/hw/slavio_timer.c @@ -23,7 +23,7 @@ */ #include "sun4m.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ptimer.h" #include "sysbus.h" #include "trace.h" diff --git a/hw/sm501.c b/hw/sm501.c index 714aca0492..dd186aa7f2 100644 --- a/hw/sm501.c +++ b/hw/sm501.c @@ -29,7 +29,7 @@ #include "devices.h" #include "sysbus.h" #include "qdev-addr.h" -#include "range.h" +#include "qemu/range.h" #include "ui/pixel_ops.h" /* diff --git a/hw/soc_dma.c b/hw/soc_dma.c index 50d5f84b4e..64e8ee1d13 100644 --- a/hw/soc_dma.c +++ b/hw/soc_dma.c @@ -18,7 +18,7 @@ * with this program; if not, see . */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "soc_dma.h" static void transfer_mem2mem(struct soc_dma_ch_s *ch) diff --git a/hw/spapr.c b/hw/spapr.c index d1252fc68c..1abfde2a05 100644 --- a/hw/spapr.c +++ b/hw/spapr.c @@ -49,7 +49,7 @@ #include "exec/address-spaces.h" #include "hw/usb.h" -#include "qemu-config.h" +#include "qemu/config-file.h" #include diff --git a/hw/spitz.c b/hw/spitz.c index 48668a0f10..1259e32974 100644 --- a/hw/spitz.c +++ b/hw/spitz.c @@ -18,7 +18,7 @@ #include "i2c.h" #include "ssi.h" #include "flash.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "devices.h" #include "sharpsl.h" #include "ui/console.h" diff --git a/hw/stellaris.c b/hw/stellaris.c index 368f8a5e73..26da3c7f60 100644 --- a/hw/stellaris.c +++ b/hw/stellaris.c @@ -11,7 +11,7 @@ #include "ssi.h" #include "arm-misc.h" #include "devices.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "i2c.h" #include "net/net.h" #include "boards.h" diff --git a/hw/strongarm.c b/hw/strongarm.c index 44bec34e07..f776fee3bc 100644 --- a/hw/strongarm.c +++ b/hw/strongarm.c @@ -28,7 +28,7 @@ */ #include "sysbus.h" #include "strongarm.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "arm-misc.h" #include "qemu-char.h" #include "sysemu.h" diff --git a/hw/sun4m.c b/hw/sun4m.c index 9a784dfd04..4245854949 100644 --- a/hw/sun4m.c +++ b/hw/sun4m.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "sysbus.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sun4m.h" #include "nvram.h" #include "sparc32_dma.h" diff --git a/hw/sun4u.c b/hw/sun4u.c index 000f6118e1..8bca4fdff9 100644 --- a/hw/sun4u.c +++ b/hw/sun4u.c @@ -29,7 +29,7 @@ #include "nvram.h" #include "fdc.h" #include "net/net.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" #include "boards.h" #include "firmware_abi.h" diff --git a/hw/tsc2005.c b/hw/tsc2005.c index e2326283c0..740ff86aa8 100644 --- a/hw/tsc2005.c +++ b/hw/tsc2005.c @@ -19,7 +19,7 @@ */ #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ui/console.h" #include "devices.h" diff --git a/hw/tsc210x.c b/hw/tsc210x.c index 2b3535d4fc..2076c355d2 100644 --- a/hw/tsc210x.c +++ b/hw/tsc210x.c @@ -21,7 +21,7 @@ #include "hw.h" #include "audio/audio.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ui/console.h" #include "omap.h" /* For I2SCodec and uWireSlave */ #include "devices.h" diff --git a/hw/tusb6010.c b/hw/tusb6010.c index 325200bd34..990d50619d 100644 --- a/hw/tusb6010.c +++ b/hw/tusb6010.c @@ -19,7 +19,7 @@ * with this program; if not, see . */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "usb.h" #include "omap.h" #include "irq.h" diff --git a/hw/twl92230.c b/hw/twl92230.c index ce699bdbdd..3210b9ef4e 100644 --- a/hw/twl92230.c +++ b/hw/twl92230.c @@ -20,7 +20,7 @@ */ #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "i2c.h" #include "sysemu.h" #include "ui/console.h" diff --git a/hw/usb.h b/hw/usb.h index efae65dcad..81e265c4fd 100644 --- a/hw/usb.h +++ b/hw/usb.h @@ -26,7 +26,7 @@ */ #include "qdev.h" -#include "qemu-queue.h" +#include "qemu/queue.h" /* Constants related to the USB / PCI interaction */ #define USB_SBRN 0x60 /* Serial Bus Release Number Register */ diff --git a/hw/usb/combined-packet.c b/hw/usb/combined-packet.c index 4a0c299457..13f6602ad2 100644 --- a/hw/usb/combined-packet.c +++ b/hw/usb/combined-packet.c @@ -21,7 +21,7 @@ */ #include "qemu-common.h" #include "hw/usb.h" -#include "iov.h" +#include "qemu/iov.h" #include "trace.h" static void usb_combined_packet_add(USBCombinedPacket *combined, USBPacket *p) diff --git a/hw/usb/core.c b/hw/usb/core.c index 8e360d3ec0..e315fc1021 100644 --- a/hw/usb/core.c +++ b/hw/usb/core.c @@ -25,7 +25,7 @@ */ #include "qemu-common.h" #include "hw/usb.h" -#include "iov.h" +#include "qemu/iov.h" #include "trace.h" void usb_attach(USBPort *port) diff --git a/hw/usb/dev-hid.c b/hw/usb/dev-hid.c index 6953f2e710..ce38fef9f6 100644 --- a/hw/usb/dev-hid.c +++ b/hw/usb/dev-hid.c @@ -26,7 +26,7 @@ #include "ui/console.h" #include "hw/usb.h" #include "hw/usb/desc.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "hw/hid.h" /* HID interface requests */ diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c index bf289ff5a6..e8ada9f02c 100644 --- a/hw/usb/dev-network.c +++ b/hw/usb/dev-network.c @@ -27,10 +27,10 @@ #include "hw/usb.h" #include "hw/usb/desc.h" #include "net/net.h" -#include "qemu-queue.h" -#include "qemu-config.h" +#include "qemu/queue.h" +#include "qemu/config-file.h" #include "sysemu.h" -#include "iov.h" +#include "qemu/iov.h" /*#define TRAFFIC_DEBUG*/ /* Thanks to NetChip Technologies for donating this product ID. diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c index 99b19df1d1..2ff4fe247a 100644 --- a/hw/usb/dev-serial.c +++ b/hw/usb/dev-serial.c @@ -9,7 +9,7 @@ */ #include "qemu-common.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "hw/usb.h" #include "hw/usb/desc.h" #include "qemu-char.h" diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard-reader.c index 3862c9b6c9..f26bb341f7 100644 --- a/hw/usb/dev-smartcard-reader.c +++ b/hw/usb/dev-smartcard-reader.c @@ -35,7 +35,7 @@ */ #include "qemu-common.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "hw/usb.h" #include "hw/usb/desc.h" #include "monitor/monitor.h" diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 0d7597b4d1..6d27bac94f 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -8,8 +8,8 @@ */ #include "qemu-common.h" -#include "qemu-option.h" -#include "qemu-config.h" +#include "qemu/option.h" +#include "qemu/config-file.h" #include "hw/usb.h" #include "hw/usb/desc.h" #include "hw/scsi.h" diff --git a/hw/usb/dev-uas.c b/hw/usb/dev-uas.c index a21b2ba627..9a0088928f 100644 --- a/hw/usb/dev-uas.c +++ b/hw/usb/dev-uas.c @@ -10,8 +10,8 @@ */ #include "qemu-common.h" -#include "qemu-option.h" -#include "qemu-config.h" +#include "qemu/option.h" +#include "qemu/config-file.h" #include "trace.h" #include "hw/usb.h" diff --git a/hw/usb/hcd-ehci-pci.c b/hw/usb/hcd-ehci-pci.c index 8b043966f6..ee77d41db5 100644 --- a/hw/usb/hcd-ehci-pci.c +++ b/hw/usb/hcd-ehci-pci.c @@ -17,7 +17,7 @@ #include "hw/usb/hcd-ehci.h" #include "hw/pci/pci.h" -#include "range.h" +#include "qemu/range.h" typedef struct EHCIPCIState { PCIDevice pcidev; diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h index 740f7309fb..5bc80031bf 100644 --- a/hw/usb/hcd-ehci.h +++ b/hw/usb/hcd-ehci.h @@ -18,7 +18,7 @@ #define HW_USB_EHCI_H 1 #include "hw/hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "hw/usb.h" #include "monitor/monitor.h" #include "trace.h" diff --git a/hw/usb/hcd-musb.c b/hw/usb/hcd-musb.c index c707f7a2bb..64e9e834bf 100644 --- a/hw/usb/hcd-musb.c +++ b/hw/usb/hcd-musb.c @@ -21,7 +21,7 @@ * Only host-mode and non-DMA accesses are currently supported. */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "hw/usb.h" #include "hw/irq.h" #include "hw/hw.h" diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c index 4faf8e1aed..052c4a3037 100644 --- a/hw/usb/hcd-ohci.c +++ b/hw/usb/hcd-ohci.c @@ -27,7 +27,7 @@ */ #include "hw/hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "hw/usb.h" #include "hw/pci/pci.h" #include "hw/sysbus.h" diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c index 04c944613c..c9b8a31465 100644 --- a/hw/usb/hcd-uhci.c +++ b/hw/usb/hcd-uhci.c @@ -28,8 +28,8 @@ #include "hw/hw.h" #include "hw/usb.h" #include "hw/pci/pci.h" -#include "qemu-timer.h" -#include "iov.h" +#include "qemu/timer.h" +#include "qemu/iov.h" #include "dma.h" #include "trace.h" diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index 220c3b536a..e2de71ef1a 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -19,7 +19,7 @@ * License along with this library; if not, see . */ #include "hw/hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "hw/usb.h" #include "hw/pci/pci.h" #include "hw/pci/msi.h" diff --git a/hw/usb/host-linux.c b/hw/usb/host-linux.c index 5a56e99891..9a8c26ceaf 100644 --- a/hw/usb/host-linux.c +++ b/hw/usb/host-linux.c @@ -31,7 +31,7 @@ */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "monitor/monitor.h" #include "sysemu.h" #include "trace.h" diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c index 3621076020..31e5f27595 100644 --- a/hw/usb/redirect.c +++ b/hw/usb/redirect.c @@ -26,10 +26,10 @@ */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "monitor/monitor.h" #include "sysemu.h" -#include "iov.h" +#include "qemu/iov.h" #include #include diff --git a/hw/vfio_pci.c b/hw/vfio_pci.c index 096621cdbd..9f204bc113 100644 --- a/hw/vfio_pci.c +++ b/hw/vfio_pci.c @@ -27,7 +27,7 @@ #include #include "config.h" -#include "event_notifier.h" +#include "qemu/event_notifier.h" #include "exec/address-spaces.h" #include "kvm.h" #include "exec/memory.h" @@ -35,9 +35,9 @@ #include "pci/msix.h" #include "pci/pci.h" #include "qemu-common.h" -#include "qemu-error.h" -#include "qemu-queue.h" -#include "range.h" +#include "qemu/error-report.h" +#include "qemu/queue.h" +#include "qemu/range.h" /* #define DEBUG_VFIO */ #ifdef DEBUG_VFIO diff --git a/hw/vga-isa-mm.c b/hw/vga-isa-mm.c index 008703ff57..311c966f77 100644 --- a/hw/vga-isa-mm.c +++ b/hw/vga-isa-mm.c @@ -26,7 +26,7 @@ #include "pc.h" #include "vga_int.h" #include "ui/pixel_ops.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #define VGA_RAM_SIZE (8192 * 1024) diff --git a/hw/vga-isa.c b/hw/vga-isa.c index d1d5b11828..cbe7b05a7e 100644 --- a/hw/vga-isa.c +++ b/hw/vga-isa.c @@ -28,7 +28,7 @@ #include "pc.h" #include "vga_int.h" #include "ui/pixel_ops.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "loader.h" typedef struct ISAVGAState { diff --git a/hw/vga-pci.c b/hw/vga-pci.c index fe3a3d4899..87c7c0648d 100644 --- a/hw/vga-pci.c +++ b/hw/vga-pci.c @@ -28,7 +28,7 @@ #include "pci/pci.h" #include "vga_int.h" #include "ui/pixel_ops.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "loader.h" #define PCI_VGA_IOPORT_OFFSET 0x400 diff --git a/hw/vga.c b/hw/vga.c index 4007116859..e2ba7f208c 100644 --- a/hw/vga.c +++ b/hw/vga.c @@ -28,7 +28,7 @@ #include "pci/pci.h" #include "vga_int.h" #include "ui/pixel_ops.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "xen.h" #include "trace.h" diff --git a/hw/vhost.c b/hw/vhost.c index feaff64c15..4e1cb47418 100644 --- a/hw/vhost.c +++ b/hw/vhost.c @@ -16,7 +16,7 @@ #include #include "vhost.h" #include "hw/hw.h" -#include "range.h" +#include "qemu/range.h" #include #include "exec/address-spaces.h" diff --git a/hw/vhost_net.c b/hw/vhost_net.c index 93ad89a11c..ae2785d83f 100644 --- a/hw/vhost_net.c +++ b/hw/vhost_net.c @@ -18,7 +18,7 @@ #include "virtio-net.h" #include "vhost_net.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "config.h" diff --git a/hw/virtex_ml507.c b/hw/virtex_ml507.c index 0f27c2b414..5134e2f477 100644 --- a/hw/virtex_ml507.c +++ b/hw/virtex_ml507.c @@ -32,7 +32,7 @@ #include "device_tree.h" #include "loader.h" #include "elf.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "exec/address-spaces.h" #include "ppc.h" diff --git a/hw/virtio-balloon.c b/hw/virtio-balloon.c index 97d3a932d9..2eb709b422 100644 --- a/hw/virtio-balloon.c +++ b/hw/virtio-balloon.c @@ -13,7 +13,7 @@ * */ -#include "iov.h" +#include "qemu/iov.h" #include "qemu-common.h" #include "virtio.h" #include "pc.h" diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index e25cc96477..208caa2642 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -12,7 +12,7 @@ */ #include "qemu-common.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "trace.h" #include "hw/block-common.h" #include "blockdev.h" diff --git a/hw/virtio-console.c b/hw/virtio-console.c index cffee3d470..df0951e973 100644 --- a/hw/virtio-console.c +++ b/hw/virtio-console.c @@ -11,7 +11,7 @@ */ #include "qemu-char.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "trace.h" #include "virtio-serial.h" diff --git a/hw/virtio-net.c b/hw/virtio-net.c index dc7c6d6b56..5d03b31c1b 100644 --- a/hw/virtio-net.c +++ b/hw/virtio-net.c @@ -11,13 +11,13 @@ * */ -#include "iov.h" +#include "qemu/iov.h" #include "virtio.h" #include "net/net.h" #include "net/checksum.h" #include "net/tap.h" -#include "qemu-error.h" -#include "qemu-timer.h" +#include "qemu/error-report.h" +#include "qemu/timer.h" #include "virtio-net.h" #include "vhost_net.h" diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index a2355dc867..f58917f75f 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -23,14 +23,14 @@ #include "virtio-serial.h" #include "virtio-scsi.h" #include "pci/pci.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "pci/msi.h" #include "pci/msix.h" #include "loader.h" #include "kvm.h" #include "blockdev.h" #include "virtio-pci.h" -#include "range.h" +#include "qemu/range.h" /* from Linux's linux/virtio_pci.h */ diff --git a/hw/virtio-rng.c b/hw/virtio-rng.c index a73ef8e334..e063127df6 100644 --- a/hw/virtio-rng.c +++ b/hw/virtio-rng.c @@ -9,7 +9,7 @@ * top-level directory. */ -#include "iov.h" +#include "qemu/iov.h" #include "qdev.h" #include "virtio.h" #include "virtio-rng.h" diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c index 5559518a93..fc5cb32277 100644 --- a/hw/virtio-serial-bus.c +++ b/hw/virtio-serial-bus.c @@ -18,9 +18,9 @@ * GNU GPL, version 2 or (at your option) any later version. */ -#include "iov.h" +#include "qemu/iov.h" #include "monitor/monitor.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include "sysbus.h" #include "trace.h" #include "virtio-serial.h" diff --git a/hw/virtio.c b/hw/virtio.c index f40a8c5571..0455a9e8f3 100644 --- a/hw/virtio.c +++ b/hw/virtio.c @@ -14,9 +14,9 @@ #include #include "trace.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "virtio.h" -#include "qemu-barrier.h" +#include "qemu/atomic.h" /* The alignment to use between consumer and producer parts of vring. * x86 pagesize again. */ diff --git a/hw/virtio.h b/hw/virtio.h index cdcb490733..511a16992e 100644 --- a/hw/virtio.h +++ b/hw/virtio.h @@ -18,7 +18,7 @@ #include "net/net.h" #include "qdev.h" #include "sysemu.h" -#include "event_notifier.h" +#include "qemu/event_notifier.h" #ifdef CONFIG_LINUX #include "9p.h" #endif diff --git a/hw/vt82c686.c b/hw/vt82c686.c index edceb5a01d..a18aaed217 100644 --- a/hw/vt82c686.c +++ b/hw/vt82c686.c @@ -23,7 +23,7 @@ #include "acpi.h" #include "pm_smbus.h" #include "sysemu.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "exec/address-spaces.h" typedef uint32_t pci_addr_t; diff --git a/hw/watchdog.c b/hw/watchdog.c index 623b299f71..5b04215374 100644 --- a/hw/watchdog.c +++ b/hw/watchdog.c @@ -20,9 +20,9 @@ */ #include "qemu-common.h" -#include "qemu-option.h" -#include "qemu-config.h" -#include "qemu-queue.h" +#include "qemu/option.h" +#include "qemu/config-file.h" +#include "qemu/queue.h" #include "qapi/qmp/types.h" #include "monitor/monitor.h" #include "sysemu.h" diff --git a/hw/watchdog.h b/hw/watchdog.h index c12a29311a..3e9a970686 100644 --- a/hw/watchdog.h +++ b/hw/watchdog.h @@ -22,7 +22,7 @@ #ifndef QEMU_WATCHDOG_H #define QEMU_WATCHDOG_H -#include "qemu-queue.h" +#include "qemu/queue.h" struct WatchdogTimerModel { QLIST_ENTRY(WatchdogTimerModel) entry; diff --git a/hw/wdt_i6300esb.c b/hw/wdt_i6300esb.c index 181774220d..54f0665135 100644 --- a/hw/wdt_i6300esb.c +++ b/hw/wdt_i6300esb.c @@ -22,7 +22,7 @@ #include #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "watchdog.h" #include "hw.h" #include "pci/pci.h" diff --git a/hw/wdt_ib700.c b/hw/wdt_ib700.c index 7f6c21d809..4475f7b862 100644 --- a/hw/wdt_ib700.c +++ b/hw/wdt_ib700.c @@ -20,7 +20,7 @@ */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "watchdog.h" #include "hw.h" #include "isa.h" diff --git a/hw/xen_backend.c b/hw/xen_backend.c index f83a1e1d09..270584fc10 100644 --- a/hw/xen_backend.c +++ b/hw/xen_backend.c @@ -36,7 +36,7 @@ #include "hw.h" #include "qemu-char.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "xen_backend.h" #include diff --git a/hw/xen_common.h b/hw/xen_common.h index 727757afb4..95bc9a7825 100644 --- a/hw/xen_common.h +++ b/hw/xen_common.h @@ -16,7 +16,7 @@ #include "hw.h" #include "xen.h" -#include "qemu-queue.h" +#include "qemu/queue.h" /* * We don't support Xen prior to 3.3.0. diff --git a/hw/xen_domainbuild.c b/hw/xen_domainbuild.c index db1497469a..a4272f0680 100644 --- a/hw/xen_domainbuild.c +++ b/hw/xen_domainbuild.c @@ -1,8 +1,8 @@ #include #include "xen_backend.h" #include "xen_domainbuild.h" -#include "qemu-timer.h" -#include "qemu-log.h" +#include "qemu/timer.h" +#include "qemu/log.h" #include diff --git a/hw/xen_pt.c b/hw/xen_pt.c index 5c50d562d9..9ebd028f2e 100644 --- a/hw/xen_pt.c +++ b/hw/xen_pt.c @@ -58,7 +58,7 @@ #include "xen.h" #include "xen_backend.h" #include "xen_pt.h" -#include "range.h" +#include "qemu/range.h" #include "exec/address-spaces.h" #define XEN_PT_NR_IRQS (256) diff --git a/hw/xen_pt_config_init.c b/hw/xen_pt_config_init.c index 0a5f82cb80..54a179af90 100644 --- a/hw/xen_pt_config_init.c +++ b/hw/xen_pt_config_init.c @@ -12,7 +12,7 @@ * This file implements direct PCI assignment to a HVM guest */ -#include "qemu-timer.h" +#include "qemu/timer.h" #include "xen_backend.h" #include "xen_pt.h" diff --git a/hw/xgmac.c b/hw/xgmac.c index d0d510ed6a..acc3d37648 100644 --- a/hw/xgmac.c +++ b/hw/xgmac.c @@ -26,7 +26,7 @@ #include "sysbus.h" #include "qemu-char.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "net/net.h" #include "net/checksum.h" diff --git a/hw/xilinx_axidma.c b/hw/xilinx_axidma.c index 2fd6068428..ce02764b3f 100644 --- a/hw/xilinx_axidma.c +++ b/hw/xilinx_axidma.c @@ -23,9 +23,9 @@ */ #include "sysbus.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "ptimer.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "qdev-addr.h" #include "stream.h" diff --git a/hw/xilinx_axienet.c b/hw/xilinx_axienet.c index 35979e65c9..09e49b0aee 100644 --- a/hw/xilinx_axienet.c +++ b/hw/xilinx_axienet.c @@ -23,7 +23,7 @@ */ #include "sysbus.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "net/net.h" #include "net/checksum.h" diff --git a/hw/xilinx_spi.c b/hw/xilinx_spi.c index 039027442c..4eed1828e3 100644 --- a/hw/xilinx_spi.c +++ b/hw/xilinx_spi.c @@ -26,7 +26,7 @@ #include "sysbus.h" #include "sysemu.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "fifo.h" #include "ssi.h" diff --git a/hw/xilinx_spips.c b/hw/xilinx_spips.c index ee7656d7d8..ebe375e56f 100644 --- a/hw/xilinx_spips.c +++ b/hw/xilinx_spips.c @@ -25,10 +25,10 @@ #include "sysbus.h" #include "sysemu.h" #include "ptimer.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "fifo.h" #include "ssi.h" -#include "bitops.h" +#include "qemu/bitops.h" #ifdef XILINX_SPIPS_ERR_DEBUG #define DB_PRINT(...) do { \ diff --git a/hw/xilinx_timer.c b/hw/xilinx_timer.c index 2b01dc2869..69294bb83c 100644 --- a/hw/xilinx_timer.c +++ b/hw/xilinx_timer.c @@ -24,7 +24,7 @@ #include "sysbus.h" #include "ptimer.h" -#include "qemu-log.h" +#include "qemu/log.h" #define D(x) diff --git a/hw/xtensa_pic.c b/hw/xtensa_pic.c index 1ec70cd969..97d36be272 100644 --- a/hw/xtensa_pic.c +++ b/hw/xtensa_pic.c @@ -26,8 +26,8 @@ */ #include "hw.h" -#include "qemu-log.h" -#include "qemu-timer.h" +#include "qemu/log.h" +#include "qemu/timer.h" void xtensa_advance_ccount(CPUXtensaState *env, uint32_t d) { diff --git a/hw/zynq_slcr.c b/hw/zynq_slcr.c index dde4306195..c7ce51f4a6 100644 --- a/hw/zynq_slcr.c +++ b/hw/zynq_slcr.c @@ -15,7 +15,7 @@ */ #include "hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysbus.h" #include "sysemu.h" diff --git a/include/block/aio.h b/include/block/aio.h index 31884a8f16..0933f05878 100644 --- a/include/block/aio.h +++ b/include/block/aio.h @@ -15,8 +15,8 @@ #define QEMU_AIO_H #include "qemu-common.h" -#include "qemu-queue.h" -#include "event_notifier.h" +#include "qemu/queue.h" +#include "qemu/event_notifier.h" typedef struct BlockDriverAIOCB BlockDriverAIOCB; typedef void BlockDriverCompletionFunc(void *opaque, int ret); diff --git a/include/block/block.h b/include/block/block.h index d49ce4dbc5..b81d200b03 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -3,7 +3,7 @@ #include "block/aio.h" #include "qemu-common.h" -#include "qemu-option.h" +#include "qemu/option.h" #include "block/coroutine.h" #include "qapi/qmp/qobject.h" #include "qapi-types.h" diff --git a/include/block/block_int.h b/include/block/block_int.h index 14c57afd54..f83ffb8a08 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -25,10 +25,10 @@ #define BLOCK_INT_H #include "block/block.h" -#include "qemu-option.h" -#include "qemu-queue.h" +#include "qemu/option.h" +#include "qemu/queue.h" #include "block/coroutine.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "qapi-types.h" #include "qapi/qmp/qerror.h" #include "monitor/monitor.h" diff --git a/include/block/coroutine.h b/include/block/coroutine.h index 34c15d4116..c31fae3f3c 100644 --- a/include/block/coroutine.h +++ b/include/block/coroutine.h @@ -16,8 +16,8 @@ #define QEMU_COROUTINE_H #include -#include "qemu-queue.h" -#include "qemu-timer.h" +#include "qemu/queue.h" +#include "qemu/timer.h" /** * Coroutines are a mechanism for stack switching and can be used for diff --git a/include/block/coroutine_int.h b/include/block/coroutine_int.h index 282a3ceda6..17eb71e723 100644 --- a/include/block/coroutine_int.h +++ b/include/block/coroutine_int.h @@ -25,7 +25,7 @@ #ifndef QEMU_COROUTINE_INT_H #define QEMU_COROUTINE_INT_H -#include "qemu-queue.h" +#include "qemu/queue.h" #include "block/coroutine.h" typedef enum { diff --git a/include/block/thread-pool.h b/include/block/thread-pool.h index a87b287081..200703e35f 100644 --- a/include/block/thread-pool.h +++ b/include/block/thread-pool.h @@ -19,8 +19,8 @@ #define QEMU_THREAD_POOL_H 1 #include "qemu-common.h" -#include "qemu-queue.h" -#include "qemu-thread.h" +#include "qemu/queue.h" +#include "qemu/thread.h" #include "block/coroutine.h" #include "block/block_int.h" diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h index bec04e2008..c12e35f54d 100644 --- a/include/exec/cpu-all.h +++ b/include/exec/cpu-all.h @@ -20,7 +20,7 @@ #define CPU_ALL_H #include "qemu-common.h" -#include "qemu-tls.h" +#include "qemu/tls.h" #include "exec/cpu-common.h" /* some important defines: diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h index f83d6180f3..4d4f8d4e98 100644 --- a/include/exec/cpu-common.h +++ b/include/exec/cpu-common.h @@ -9,8 +9,8 @@ #include "exec/poison.h" #endif -#include "bswap.h" -#include "qemu-queue.h" +#include "qemu/bswap.h" +#include "qemu/queue.h" #if !defined(CONFIG_USER_ONLY) diff --git a/include/exec/cpu-defs.h b/include/exec/cpu-defs.h index 8d2230e50e..aea0ece051 100644 --- a/include/exec/cpu-defs.h +++ b/include/exec/cpu-defs.h @@ -27,8 +27,8 @@ #include #include #include -#include "osdep.h" -#include "qemu-queue.h" +#include "qemu/osdep.h" +#include "qemu/queue.h" #include "exec/hwaddr.h" #ifndef TARGET_LONG_BITS diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h index 2ae8aae3d6..46dca74fda 100644 --- a/include/exec/exec-all.h +++ b/include/exec/exec-all.h @@ -70,7 +70,7 @@ typedef struct TranslationBlock TranslationBlock; #define OPPARAM_BUF_SIZE (OPC_BUF_SIZE * MAX_OPC_PARAM) -#include "qemu-log.h" +#include "qemu/log.h" void gen_intermediate_code(CPUArchState *env, struct TranslationBlock *tb); void gen_intermediate_code_pc(CPUArchState *env, struct TranslationBlock *tb); diff --git a/include/exec/gen-icount.h b/include/exec/gen-icount.h index 1541f0b1e4..8043b3ba26 100644 --- a/include/exec/gen-icount.h +++ b/include/exec/gen-icount.h @@ -1,7 +1,7 @@ #ifndef GEN_ICOUNT_H #define GEN_ICOUNT_H 1 -#include "qemu-timer.h" +#include "qemu/timer.h" /* Helpers for instruction counting code generation. */ diff --git a/include/exec/memory.h b/include/exec/memory.h index b0c474584f..aada969628 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -21,10 +21,10 @@ #include "qemu-common.h" #include "exec/cpu-common.h" #include "exec/hwaddr.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include "exec/iorange.h" #include "exec/ioport.h" -#include "int128.h" +#include "qemu/int128.h" typedef struct MemoryRegionOps MemoryRegionOps; typedef struct MemoryRegion MemoryRegion; diff --git a/include/exec/softmmu_template.h b/include/exec/softmmu_template.h index 15d4c519ee..b219191abd 100644 --- a/include/exec/softmmu_template.h +++ b/include/exec/softmmu_template.h @@ -21,7 +21,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see . */ -#include "qemu-timer.h" +#include "qemu/timer.h" #include "exec/memory.h" #define DATA_SIZE (1 << SHIFT) diff --git a/include/migration/migration.h b/include/migration/migration.h index a95f761e4c..8b7af61e7e 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -16,7 +16,7 @@ #include "qapi/qmp/qdict.h" #include "qemu-common.h" -#include "notify.h" +#include "qemu/notify.h" #include "qapi/error.h" #include "migration/vmstate.h" #include "qapi-types.h" diff --git a/include/net/net.h b/include/net/net.h index 41d3729867..de42dd76da 100644 --- a/include/net/net.h +++ b/include/net/net.h @@ -1,10 +1,10 @@ #ifndef QEMU_NET_H #define QEMU_NET_H -#include "qemu-queue.h" +#include "qemu/queue.h" #include "qemu-common.h" #include "qapi/qmp/qdict.h" -#include "qemu-option.h" +#include "qemu/option.h" #include "net/queue.h" #include "migration/vmstate.h" #include "qapi-types.h" diff --git a/include/net/slirp.h b/include/net/slirp.h index ac9d44964f..54b655c272 100644 --- a/include/net/slirp.h +++ b/include/net/slirp.h @@ -26,7 +26,7 @@ #include "qemu-common.h" #include "qapi/qmp/qdict.h" -#include "qemu-option.h" +#include "qemu/option.h" #include "qapi-types.h" #ifdef CONFIG_SLIRP diff --git a/include/qapi/error.h b/include/qapi/error.h index 4d52e7369e..5cd2f0c302 100644 --- a/include/qapi/error.h +++ b/include/qapi/error.h @@ -12,7 +12,7 @@ #ifndef ERROR_H #define ERROR_H -#include "compiler.h" +#include "qemu/compiler.h" #include "qapi-types.h" #include diff --git a/include/qapi/opts-visitor.h b/include/qapi/opts-visitor.h index 31fa4c5628..5939eeebc7 100644 --- a/include/qapi/opts-visitor.h +++ b/include/qapi/opts-visitor.h @@ -14,7 +14,7 @@ #define OPTS_VISITOR_H #include "qapi/visitor.h" -#include "qemu-option.h" +#include "qemu/option.h" typedef struct OptsVisitor OptsVisitor; diff --git a/include/qapi/qmp/qdict.h b/include/qapi/qmp/qdict.h index c815981d30..6d9a4be3a5 100644 --- a/include/qapi/qmp/qdict.h +++ b/include/qapi/qmp/qdict.h @@ -15,7 +15,7 @@ #include "qapi/qmp/qobject.h" #include "qapi/qmp/qlist.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include #define QDICT_BUCKET_MAX 512 diff --git a/include/qapi/qmp/qerror.h b/include/qapi/qmp/qerror.h index d912297590..6c0a18dfc4 100644 --- a/include/qapi/qmp/qerror.h +++ b/include/qapi/qmp/qerror.h @@ -14,7 +14,7 @@ #include "qapi/qmp/qdict.h" #include "qapi/qmp/qstring.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "qapi/error.h" #include "qapi-types.h" #include diff --git a/include/qapi/qmp/qjson.h b/include/qapi/qmp/qjson.h index 0473374bf2..73351ed6d6 100644 --- a/include/qapi/qmp/qjson.h +++ b/include/qapi/qmp/qjson.h @@ -15,7 +15,7 @@ #define QJSON_H #include -#include "compiler.h" +#include "qemu/compiler.h" #include "qapi/qmp/qobject.h" #include "qapi/qmp/qstring.h" diff --git a/include/qapi/qmp/qlist.h b/include/qapi/qmp/qlist.h index ffa0846d48..382f04c3c4 100644 --- a/include/qapi/qmp/qlist.h +++ b/include/qapi/qmp/qlist.h @@ -14,8 +14,8 @@ #define QLIST_H #include "qapi/qmp/qobject.h" -#include "qemu-queue.h" -#include "qemu-queue.h" +#include "qemu/queue.h" +#include "qemu/queue.h" typedef struct QListEntry { QObject *value; diff --git a/acl.h b/include/qemu/acl.h similarity index 98% rename from acl.h rename to include/qemu/acl.h index 0ef780401f..116487e282 100644 --- a/acl.h +++ b/include/qemu/acl.h @@ -25,7 +25,7 @@ #ifndef __QEMU_ACL_H__ #define __QEMU_ACL_H__ -#include "qemu-queue.h" +#include "qemu/queue.h" typedef struct qemu_acl_entry qemu_acl_entry; typedef struct qemu_acl qemu_acl; diff --git a/qemu-barrier.h b/include/qemu/atomic.h similarity index 96% rename from qemu-barrier.h rename to include/qemu/atomic.h index faa83d265e..96a194bbee 100644 --- a/qemu-barrier.h +++ b/include/qemu/atomic.h @@ -6,7 +6,7 @@ #if defined(__i386__) -#include "compiler.h" /* QEMU_GNUC_PREREQ */ +#include "qemu/compiler.h" /* QEMU_GNUC_PREREQ */ /* * Because of the strongly ordered x86 storage model, wmb() and rmb() are nops diff --git a/bitmap.h b/include/qemu/bitmap.h similarity index 99% rename from bitmap.h rename to include/qemu/bitmap.h index 08755eba11..308bbb71e9 100644 --- a/bitmap.h +++ b/include/qemu/bitmap.h @@ -13,7 +13,7 @@ #define BITMAP_H #include "qemu-common.h" -#include "bitops.h" +#include "qemu/bitops.h" /* * The available bitmap operations and their rough meaning in the diff --git a/bitops.h b/include/qemu/bitops.h similarity index 100% rename from bitops.h rename to include/qemu/bitops.h diff --git a/bswap.h b/include/qemu/bswap.h similarity index 100% rename from bswap.h rename to include/qemu/bswap.h diff --git a/cache-utils.h b/include/qemu/cache-utils.h similarity index 100% rename from cache-utils.h rename to include/qemu/cache-utils.h diff --git a/compatfd.h b/include/qemu/compatfd.h similarity index 100% rename from compatfd.h rename to include/qemu/compatfd.h diff --git a/compiler.h b/include/qemu/compiler.h similarity index 100% rename from compiler.h rename to include/qemu/compiler.h diff --git a/qemu-config.h b/include/qemu/config-file.h similarity index 94% rename from qemu-config.h rename to include/qemu/config-file.h index 584491a29b..486c77cad4 100644 --- a/qemu-config.h +++ b/include/qemu/config-file.h @@ -2,9 +2,9 @@ #define QEMU_CONFIG_H #include -#include "qemu-option.h" +#include "qemu/option.h" #include "qapi/error.h" -#include "qemu-option.h" +#include "qemu/option.h" extern QemuOptsList qemu_fsdev_opts; extern QemuOptsList qemu_virtfs_opts; diff --git a/envlist.h b/include/qemu/envlist.h similarity index 100% rename from envlist.h rename to include/qemu/envlist.h diff --git a/qemu-error.h b/include/qemu/error-report.h similarity index 100% rename from qemu-error.h rename to include/qemu/error-report.h diff --git a/event_notifier.h b/include/qemu/event_notifier.h similarity index 100% rename from event_notifier.h rename to include/qemu/event_notifier.h diff --git a/host-utils.h b/include/qemu/host-utils.h similarity index 99% rename from host-utils.h rename to include/qemu/host-utils.h index a5f8464fb2..81c9a754ae 100644 --- a/host-utils.h +++ b/include/qemu/host-utils.h @@ -25,7 +25,7 @@ #ifndef HOST_UTILS_H #define HOST_UTILS_H 1 -#include "compiler.h" /* QEMU_GNUC_PREREQ */ +#include "qemu/compiler.h" /* QEMU_GNUC_PREREQ */ #if defined(__x86_64__) #define __HAVE_FAST_MULU64__ diff --git a/int128.h b/include/qemu/int128.h similarity index 100% rename from int128.h rename to include/qemu/int128.h diff --git a/iov.h b/include/qemu/iov.h similarity index 100% rename from iov.h rename to include/qemu/iov.h diff --git a/qemu-log.h b/include/qemu/log.h similarity index 100% rename from qemu-log.h rename to include/qemu/log.h diff --git a/main-loop.h b/include/qemu/main-loop.h similarity index 100% rename from main-loop.h rename to include/qemu/main-loop.h diff --git a/module.h b/include/qemu/module.h similarity index 100% rename from module.h rename to include/qemu/module.h diff --git a/notify.h b/include/qemu/notify.h similarity index 97% rename from notify.h rename to include/qemu/notify.h index 03cf26c0b6..4e2e7f0ec4 100644 --- a/notify.h +++ b/include/qemu/notify.h @@ -14,7 +14,7 @@ #ifndef QEMU_NOTIFY_H #define QEMU_NOTIFY_H -#include "qemu-queue.h" +#include "qemu/queue.h" typedef struct Notifier Notifier; diff --git a/qemu-option.h b/include/qemu/option.h similarity index 99% rename from qemu-option.h rename to include/qemu/option.h index ca0dc041dd..ba197cddcf 100644 --- a/qemu-option.h +++ b/include/qemu/option.h @@ -27,7 +27,7 @@ #define QEMU_OPTIONS_H #include -#include "qemu-queue.h" +#include "qemu/queue.h" #include "qapi/error.h" #include "qapi/qmp/qdict.h" diff --git a/qemu-option-internal.h b/include/qemu/option_int.h similarity index 96% rename from qemu-option-internal.h rename to include/qemu/option_int.h index 77899b082d..8212fa4a48 100644 --- a/qemu-option-internal.h +++ b/include/qemu/option_int.h @@ -26,8 +26,8 @@ #ifndef QEMU_OPTIONS_INTERNAL_H #define QEMU_OPTIONS_INTERNAL_H -#include "qemu-option.h" -#include "qemu-error.h" +#include "qemu/option.h" +#include "qemu/error-report.h" struct QemuOpt { const char *name; diff --git a/osdep.h b/include/qemu/osdep.h similarity index 100% rename from osdep.h rename to include/qemu/osdep.h diff --git a/qemu-queue.h b/include/qemu/queue.h similarity index 99% rename from qemu-queue.h rename to include/qemu/queue.h index 9288cd8e82..d433b9017c 100644 --- a/qemu-queue.h +++ b/include/qemu/queue.h @@ -78,7 +78,7 @@ * For details on the use of these macros, see the queue(3) manual page. */ -#include "qemu-barrier.h" /* for smp_wmb() */ +#include "qemu/atomic.h" /* for smp_wmb() */ /* * List definitions. diff --git a/range.h b/include/qemu/range.h similarity index 100% rename from range.h rename to include/qemu/range.h diff --git a/qemu_socket.h b/include/qemu/sockets.h similarity index 99% rename from qemu_socket.h rename to include/qemu/sockets.h index 42899fe138..803ae1798c 100644 --- a/qemu_socket.h +++ b/include/qemu/sockets.h @@ -26,7 +26,7 @@ int inet_aton(const char *cp, struct in_addr *ia); #endif /* !_WIN32 */ -#include "qemu-option.h" +#include "qemu/option.h" #include "qapi/error.h" #include "qapi/qmp/qerror.h" diff --git a/qemu-thread-posix.h b/include/qemu/thread-posix.h similarity index 100% rename from qemu-thread-posix.h rename to include/qemu/thread-posix.h diff --git a/qemu-thread-win32.h b/include/qemu/thread-win32.h similarity index 100% rename from qemu-thread-win32.h rename to include/qemu/thread-win32.h diff --git a/qemu-thread.h b/include/qemu/thread.h similarity index 96% rename from qemu-thread.h rename to include/qemu/thread.h index 3ee2f6b1f9..c02404b9fb 100644 --- a/qemu-thread.h +++ b/include/qemu/thread.h @@ -10,9 +10,9 @@ typedef struct QemuSemaphore QemuSemaphore; typedef struct QemuThread QemuThread; #ifdef _WIN32 -#include "qemu-thread-win32.h" +#include "qemu/thread-win32.h" #else -#include "qemu-thread-posix.h" +#include "qemu/thread-posix.h" #endif #define QEMU_THREAD_JOINABLE 0 diff --git a/qemu-timer.h b/include/qemu/timer.h similarity index 99% rename from qemu-timer.h rename to include/qemu/timer.h index da7e97cd5a..1766b2d6c7 100644 --- a/qemu-timer.h +++ b/include/qemu/timer.h @@ -2,8 +2,8 @@ #define QEMU_TIMER_H #include "qemu-common.h" -#include "main-loop.h" -#include "notify.h" +#include "qemu/main-loop.h" +#include "qemu/notify.h" #ifdef __FreeBSD__ #include diff --git a/qemu-tls.h b/include/qemu/tls.h similarity index 100% rename from qemu-tls.h rename to include/qemu/tls.h diff --git a/qemu-types.h b/include/qemu/typedefs.h similarity index 100% rename from qemu-types.h rename to include/qemu/typedefs.h diff --git a/uri.h b/include/qemu/uri.h similarity index 100% rename from uri.h rename to include/qemu/uri.h diff --git a/qemu-xattr.h b/include/qemu/xattr.h similarity index 100% rename from qemu-xattr.h rename to include/qemu/xattr.h diff --git a/include/qom/cpu.h b/include/qom/cpu.h index 9682dd59ed..9e9d044bdf 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -21,7 +21,7 @@ #define QEMU_CPU_H #include "qom/object.h" -#include "qemu-thread.h" +#include "qemu/thread.h" /** * SECTION:cpu diff --git a/include/qom/object.h b/include/qom/object.h index ed1f47f050..abe9691cb7 100644 --- a/include/qom/object.h +++ b/include/qom/object.h @@ -17,7 +17,7 @@ #include #include #include -#include "qemu-queue.h" +#include "qemu/queue.h" struct Visitor; struct Error; diff --git a/include/ui/console.h b/include/ui/console.h index 3db6635b0a..fc23baa06b 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -3,7 +3,7 @@ #include "ui/qemu-pixman.h" #include "qapi/qmp/qdict.h" -#include "notify.h" +#include "qemu/notify.h" #include "monitor/monitor.h" #include "trace.h" #include "qapi-types.h" diff --git a/include/ui/qemu-spice.h b/include/ui/qemu-spice.h index 3e08be06bf..73422adeee 100644 --- a/include/ui/qemu-spice.h +++ b/include/ui/qemu-spice.h @@ -22,8 +22,8 @@ #include -#include "qemu-option.h" -#include "qemu-config.h" +#include "qemu/option.h" +#include "qemu/config-file.h" #include "monitor/monitor.h" extern int using_spice; diff --git a/include/ui/spice-display.h b/include/ui/spice-display.h index 928e0a1bae..a0d1a50487 100644 --- a/include/ui/spice-display.h +++ b/include/ui/spice-display.h @@ -19,7 +19,7 @@ #include #include -#include "qemu-thread.h" +#include "qemu/thread.h" #include "ui/qemu-pixman.h" #include "sysemu.h" diff --git a/iohandler.c b/iohandler.c index cf8276dffc..2523adc11d 100644 --- a/iohandler.c +++ b/iohandler.c @@ -24,9 +24,9 @@ #include "config-host.h" #include "qemu-common.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include "block/aio.h" -#include "main-loop.h" +#include "qemu/main-loop.h" #ifndef _WIN32 #include diff --git a/iov.c b/iov.c index a81eedcedb..419e419969 100644 --- a/iov.c +++ b/iov.c @@ -16,7 +16,7 @@ * GNU GPL, version 2 or (at your option) any later version. */ -#include "iov.h" +#include "qemu/iov.h" #ifdef _WIN32 # include diff --git a/kvm-all.c b/kvm-all.c index c2588594e1..41ea3aa6ee 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -21,18 +21,18 @@ #include #include "qemu-common.h" -#include "qemu-barrier.h" -#include "qemu-option.h" -#include "qemu-config.h" +#include "qemu/atomic.h" +#include "qemu/option.h" +#include "qemu/config-file.h" #include "sysemu.h" #include "hw/hw.h" #include "hw/pci/msi.h" #include "exec/gdbstub.h" #include "kvm.h" -#include "bswap.h" +#include "qemu/bswap.h" #include "exec/memory.h" #include "exec/address-spaces.h" -#include "event_notifier.h" +#include "qemu/event_notifier.h" /* This check must be after config-host.h is included */ #ifdef CONFIG_EVENTFD diff --git a/kvm.h b/kvm.h index 72d866a966..131d2bdc15 100644 --- a/kvm.h +++ b/kvm.h @@ -16,7 +16,7 @@ #include #include "config-host.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #ifdef CONFIG_KVM #include diff --git a/libcacard/event.c b/libcacard/event.c index 61923761c9..2d7500fac0 100644 --- a/libcacard/event.c +++ b/libcacard/event.c @@ -6,7 +6,7 @@ */ #include "qemu-common.h" -#include "qemu-thread.h" +#include "qemu/thread.h" #include "vcard.h" #include "vreader.h" diff --git a/libcacard/vreader.c b/libcacard/vreader.c index 96d2407e78..313349b656 100644 --- a/libcacard/vreader.c +++ b/libcacard/vreader.c @@ -6,7 +6,7 @@ */ #include "qemu-common.h" -#include "qemu-thread.h" +#include "qemu/thread.h" #include "vcard.h" #include "vcard_emul.h" diff --git a/libcacard/vscclient.c b/libcacard/vscclient.c index b64c93dd69..2fce52bed5 100644 --- a/libcacard/vscclient.c +++ b/libcacard/vscclient.c @@ -13,8 +13,8 @@ #include #include "qemu-common.h" -#include "qemu-thread.h" -#include "qemu_socket.h" +#include "qemu/thread.h" +#include "qemu/sockets.h" #include "vscard_common.h" diff --git a/libfdt_env.h b/libfdt_env.h index 90d7f3b162..7938d73fae 100644 --- a/libfdt_env.h +++ b/libfdt_env.h @@ -19,7 +19,7 @@ #ifndef _LIBFDT_ENV_H #define _LIBFDT_ENV_H -#include "bswap.h" +#include "qemu/bswap.h" #ifdef HOST_WORDS_BIGENDIAN #define fdt32_to_cpu(x) (x) diff --git a/linux-user/main.c b/linux-user/main.c index 25e35cd3dc..f6c4c8d7a3 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -28,11 +28,11 @@ #include "qemu.h" #include "qemu-common.h" -#include "cache-utils.h" +#include "qemu/cache-utils.h" #include "cpu.h" #include "tcg.h" -#include "qemu-timer.h" -#include "envlist.h" +#include "qemu/timer.h" +#include "qemu/envlist.h" #include "elf.h" #define DEBUG_LOGFILE "/tmp/qemu.log" diff --git a/linux-user/qemu.h b/linux-user/qemu.h index 2af883bf74..8a3538c631 100644 --- a/linux-user/qemu.h +++ b/linux-user/qemu.h @@ -18,7 +18,7 @@ #include "syscall.h" #include "target_signal.h" #include "exec/gdbstub.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #if defined(CONFIG_USE_NPTL) #define THREAD __thread @@ -217,7 +217,7 @@ unsigned long init_guest_space(unsigned long host_start, unsigned long guest_start, bool fixed); -#include "qemu-log.h" +#include "qemu/log.h" /* syscall.c */ int host_to_target_waitstatus(int status); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 31d5276465..7c304e92de 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -72,7 +72,7 @@ int __clone2(int (*fn)(void *), void *child_stack_base, #include #endif #ifdef CONFIG_ATTR -#include "qemu-xattr.h" +#include "qemu/xattr.h" #endif #define termios host_termios diff --git a/main-loop.c b/main-loop.c index f9006118ad..54f38ae1ae 100644 --- a/main-loop.c +++ b/main-loop.c @@ -23,14 +23,14 @@ */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "slirp/slirp.h" -#include "main-loop.h" +#include "qemu/main-loop.h" #include "block/aio.h" #ifndef _WIN32 -#include "compatfd.h" +#include "qemu/compatfd.h" /* If we have signalfd, we mask out the signals we want to handle and then * use signalfd to listen for them. We rely on whatever the current signal diff --git a/memory.c b/memory.c index d40193d474..d44200335b 100644 --- a/memory.c +++ b/memory.c @@ -16,7 +16,7 @@ #include "exec/memory.h" #include "exec/address-spaces.h" #include "exec/ioport.h" -#include "bitops.h" +#include "qemu/bitops.h" #include "kvm.h" #include diff --git a/memory_mapping.h b/memory_mapping.h index d5ba46c7e7..1256125963 100644 --- a/memory_mapping.h +++ b/memory_mapping.h @@ -14,7 +14,7 @@ #ifndef MEMORY_MAPPING_H #define MEMORY_MAPPING_H -#include "qemu-queue.h" +#include "qemu/queue.h" /* The physical and virtual address in the memory mapping are contiguous. */ typedef struct MemoryMapping { diff --git a/migration-exec.c b/migration-exec.c index 784486d2fc..68f36f41f1 100644 --- a/migration-exec.c +++ b/migration-exec.c @@ -16,7 +16,7 @@ */ #include "qemu-common.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "migration/migration.h" #include "buffered_file.h" #include "block/block.h" diff --git a/migration-fd.c b/migration-fd.c index ab5abe2aa5..ea121bc0d6 100644 --- a/migration-fd.c +++ b/migration-fd.c @@ -14,12 +14,12 @@ */ #include "qemu-common.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "migration/migration.h" #include "monitor/monitor.h" #include "buffered_file.h" #include "block/block.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" //#define DEBUG_MIGRATION_FD diff --git a/migration-tcp.c b/migration-tcp.c index a36e637ffd..3c4c315052 100644 --- a/migration-tcp.c +++ b/migration-tcp.c @@ -14,7 +14,7 @@ */ #include "qemu-common.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "migration/migration.h" #include "buffered_file.h" #include "block/block.h" diff --git a/migration-unix.c b/migration-unix.c index 9debc952da..d5f986853f 100644 --- a/migration-unix.c +++ b/migration-unix.c @@ -14,7 +14,7 @@ */ #include "qemu-common.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "migration/migration.h" #include "buffered_file.h" #include "block/block.h" diff --git a/migration.c b/migration.c index 0456983bad..8c5c5670d8 100644 --- a/migration.c +++ b/migration.c @@ -19,7 +19,7 @@ #include "buffered_file.h" #include "sysemu.h" #include "block/block.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "migration/block.h" #include "qmp-commands.h" diff --git a/module.c b/module.c index c3a6da7a86..7acc33d076 100644 --- a/module.c +++ b/module.c @@ -14,8 +14,8 @@ */ #include "qemu-common.h" -#include "qemu-queue.h" -#include "module.h" +#include "qemu/queue.h" +#include "qemu/module.h" typedef struct ModuleEntry { diff --git a/monitor.c b/monitor.c index 46fdc008f4..878b2317af 100644 --- a/monitor.c +++ b/monitor.c @@ -43,10 +43,10 @@ #include "audio/audio.h" #include "disas/disas.h" #include "balloon.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "migration/migration.h" #include "kvm.h" -#include "acl.h" +#include "qemu/acl.h" #include "qapi/qmp/qint.h" #include "qapi/qmp/qfloat.h" #include "qapi/qmp/qlist.h" @@ -55,7 +55,7 @@ #include "qapi/qmp/qjson.h" #include "qapi/qmp/json-streamer.h" #include "qapi/qmp/json-parser.h" -#include "osdep.h" +#include "qemu/osdep.h" #include "cpu.h" #include "trace.h" #include "trace/control.h" @@ -66,7 +66,7 @@ #include "exec/memory.h" #include "qmp-commands.h" #include "hmp.h" -#include "qemu-thread.h" +#include "qemu/thread.h" /* for pic/irq_info */ #if defined(TARGET_SPARC) diff --git a/nbd.c b/nbd.c index 04ff0a1d44..0698a023ad 100644 --- a/nbd.c +++ b/nbd.c @@ -36,8 +36,8 @@ #include #endif -#include "qemu_socket.h" -#include "qemu-queue.h" +#include "qemu/sockets.h" +#include "qemu/queue.h" //#define DEBUG_NBD diff --git a/net/dump.c b/net/dump.c index e0a5d74644..4119721720 100644 --- a/net/dump.c +++ b/net/dump.c @@ -24,9 +24,9 @@ #include "clients.h" #include "qemu-common.h" -#include "qemu-error.h" -#include "qemu-log.h" -#include "qemu-timer.h" +#include "qemu/error-report.h" +#include "qemu/log.h" +#include "qemu/timer.h" #include "hub.h" typedef struct DumpState { diff --git a/net/hub.c b/net/hub.c index 81a73b54a7..5adfce444b 100644 --- a/net/hub.c +++ b/net/hub.c @@ -16,7 +16,7 @@ #include "net/net.h" #include "clients.h" #include "hub.h" -#include "iov.h" +#include "qemu/iov.h" /* * A hub broadcasts incoming packets to all its ports except the source port. diff --git a/net/net.c b/net/net.c index e4d85a9cfa..dbf3e1b003 100644 --- a/net/net.c +++ b/net/net.c @@ -31,11 +31,11 @@ #include "monitor/monitor.h" #include "qemu-common.h" -#include "qemu_socket.h" -#include "qemu-config.h" +#include "qemu/sockets.h" +#include "qemu/config-file.h" #include "qmp-commands.h" #include "hw/qdev.h" -#include "iov.h" +#include "qemu/iov.h" #include "qapi-visit.h" #include "qapi/opts-visitor.h" #include "qapi/dealloc-visitor.h" diff --git a/net/queue.c b/net/queue.c index 542c549b1a..6eaf5b63c0 100644 --- a/net/queue.c +++ b/net/queue.c @@ -22,7 +22,7 @@ */ #include "net/queue.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include "net/net.h" /* The delivery handler may only return zero if it will call diff --git a/net/slirp.c b/net/slirp.c index c37a5ef959..87bdc9d031 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -33,7 +33,7 @@ #include "clients.h" #include "hub.h" #include "monitor/monitor.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "slirp/libslirp.h" #include "qemu-char.h" diff --git a/net/socket.c b/net/socket.c index bc2b951832..396dc8c0b1 100644 --- a/net/socket.c +++ b/net/socket.c @@ -27,10 +27,10 @@ #include "clients.h" #include "monitor/monitor.h" #include "qemu-common.h" -#include "qemu-error.h" -#include "qemu-option.h" -#include "qemu_socket.h" -#include "iov.h" +#include "qemu/error-report.h" +#include "qemu/option.h" +#include "qemu/sockets.h" +#include "qemu/iov.h" typedef struct NetSocketState { NetClientState nc; diff --git a/net/tap-bsd.c b/net/tap-bsd.c index a1c55ad3de..b48182f678 100644 --- a/net/tap-bsd.c +++ b/net/tap-bsd.c @@ -25,7 +25,7 @@ #include "tap_int.h" #include "qemu-common.h" #include "sysemu.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #ifdef __NetBSD__ #include diff --git a/net/tap-linux.c b/net/tap-linux.c index 3de7b3b6ce..dd4b915243 100644 --- a/net/tap-linux.c +++ b/net/tap-linux.c @@ -32,7 +32,7 @@ #include "sysemu.h" #include "qemu-common.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #define PATH_NET_TUN "/dev/net/tun" diff --git a/net/tap-solaris.c b/net/tap-solaris.c index f228fffb6d..3d5fee5542 100644 --- a/net/tap-solaris.c +++ b/net/tap-solaris.c @@ -38,7 +38,7 @@ #include #include #include -#include "qemu-error.h" +#include "qemu/error-report.h" ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen) { diff --git a/net/tap-win32.c b/net/tap-win32.c index e37d8ee458..1ddd6fa6e6 100644 --- a/net/tap-win32.c +++ b/net/tap-win32.c @@ -32,7 +32,7 @@ #include "clients.h" /* net_init_tap */ #include "net/net.h" #include "sysemu.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include #include #include diff --git a/net/tap.c b/net/tap.c index 9a677e9864..d34ff13398 100644 --- a/net/tap.c +++ b/net/tap.c @@ -38,7 +38,7 @@ #include "monitor/monitor.h" #include "sysemu.h" #include "qemu-common.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "net/tap.h" diff --git a/net/vde.c b/net/vde.c index 52d4f19fba..754a141543 100644 --- a/net/vde.c +++ b/net/vde.c @@ -28,7 +28,7 @@ #include "net/net.h" #include "clients.h" #include "qemu-common.h" -#include "qemu-option.h" +#include "qemu/option.h" typedef struct VDEState { NetClientState nc; diff --git a/notify.c b/notify.c index 12282a6745..7b7692acb2 100644 --- a/notify.c +++ b/notify.c @@ -14,7 +14,7 @@ */ #include "qemu-common.h" -#include "notify.h" +#include "qemu/notify.h" void notifier_list_init(NotifierList *list) { diff --git a/osdep.c b/osdep.c index 807e90cf97..5b51a0322e 100644 --- a/osdep.c +++ b/osdep.c @@ -47,7 +47,7 @@ extern int madvise(caddr_t, size_t, int); #include "qemu-common.h" #include "trace.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "monitor/monitor.h" static bool fips_enabled = false; diff --git a/oslib-posix.c b/oslib-posix.c index 9db9c3d8af..a737d6e0e3 100644 --- a/oslib-posix.c +++ b/oslib-posix.c @@ -51,7 +51,7 @@ extern int daemon(int, int); #include "config-host.h" #include "sysemu.h" #include "trace.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #if defined(CONFIG_VALGRIND) static int running_on_valgrind = -1; diff --git a/oslib-win32.c b/oslib-win32.c index 51b33e8b20..7f0dd07e5f 100644 --- a/oslib-win32.c +++ b/oslib-win32.c @@ -28,9 +28,9 @@ #include #include "config-host.h" #include "sysemu.h" -#include "main-loop.h" +#include "qemu/main-loop.h" #include "trace.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" void *qemu_oom_check(void *ptr) { diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c index f8149ce455..174bd8bdb0 100644 --- a/qapi/opts-visitor.c +++ b/qapi/opts-visitor.c @@ -13,8 +13,8 @@ #include "qemu-common.h" #include "qapi/qmp/qerror.h" #include "qapi/opts-visitor.h" -#include "qemu-queue.h" -#include "qemu-option-internal.h" +#include "qemu/queue.h" +#include "qemu/option_int.h" #include "qapi/visitor-impl.h" diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c index 98f2a58efd..1334de33cc 100644 --- a/qapi/qapi-dealloc-visitor.c +++ b/qapi/qapi-dealloc-visitor.c @@ -12,7 +12,7 @@ */ #include "qapi/dealloc-visitor.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include "qemu-common.h" #include "qapi/qmp/types.h" #include "qapi/visitor-impl.h" diff --git a/qapi/qmp-input-visitor.c b/qapi/qmp-input-visitor.c index 8087909036..67fb127050 100644 --- a/qapi/qmp-input-visitor.c +++ b/qapi/qmp-input-visitor.c @@ -13,7 +13,7 @@ #include "qapi/qmp-input-visitor.h" #include "qapi/visitor-impl.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include "qemu-common.h" #include "qapi/qmp/types.h" #include "qapi/qmp/qerror.h" diff --git a/qapi/qmp-output-visitor.c b/qapi/qmp-output-visitor.c index 8015e3f88d..74a5684ed3 100644 --- a/qapi/qmp-output-visitor.c +++ b/qapi/qmp-output-visitor.c @@ -13,7 +13,7 @@ #include "qapi/qmp-output-visitor.h" #include "qapi/visitor-impl.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include "qemu-common.h" #include "qapi/qmp/types.h" #include "qapi/qmp/qerror.h" diff --git a/qdict.c b/qdict.c index fa7a62cff4..7543ccc10f 100644 --- a/qdict.c +++ b/qdict.c @@ -16,7 +16,7 @@ #include "qapi/qmp/qbool.h" #include "qapi/qmp/qstring.h" #include "qapi/qmp/qobject.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include "qemu-common.h" static void qdict_destroy_obj(QObject *obj); diff --git a/qemu-bridge-helper.c b/qemu-bridge-helper.c index 652eec99fd..287bfd5e38 100644 --- a/qemu-bridge-helper.c +++ b/qemu-bridge-helper.c @@ -39,7 +39,7 @@ #include #endif -#include "qemu-queue.h" +#include "qemu/queue.h" #include "net/tap-linux.h" diff --git a/qemu-char.c b/qemu-char.c index 16021c5a43..5a8d8f75a4 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -25,7 +25,7 @@ #include "monitor/monitor.h" #include "ui/console.h" #include "sysemu.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "qemu-char.h" #include "hw/usb.h" #include "hw/baum.h" @@ -94,7 +94,7 @@ #endif #endif -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "ui/qemu-spice.h" #define READ_BUF_LEN 4096 diff --git a/qemu-char.h b/qemu-char.h index 5ff1b2ba91..baa5d035fd 100644 --- a/qemu-char.h +++ b/qemu-char.h @@ -2,13 +2,13 @@ #define QEMU_CHAR_H #include "qemu-common.h" -#include "qemu-queue.h" -#include "qemu-option.h" -#include "qemu-config.h" +#include "qemu/queue.h" +#include "qemu/option.h" +#include "qemu/config-file.h" #include "block/aio.h" #include "qapi/qmp/qobject.h" #include "qapi/qmp/qstring.h" -#include "main-loop.h" +#include "qemu/main-loop.h" /* character device */ diff --git a/qemu-common.h b/qemu-common.h index e67478607b..40cd198fc1 100644 --- a/qemu-common.h +++ b/qemu-common.h @@ -12,9 +12,9 @@ #ifndef QEMU_COMMON_H #define QEMU_COMMON_H -#include "compiler.h" +#include "qemu/compiler.h" #include "config-host.h" -#include "qemu-types.h" +#include "qemu/typedefs.h" #if defined(__arm__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__) || defined(__ia64__) #define WORDS_ALIGNED @@ -122,8 +122,8 @@ extern int use_icount; /* FIXME: Remove NEED_CPU_H. */ #ifndef NEED_CPU_H -#include "osdep.h" -#include "bswap.h" +#include "qemu/osdep.h" +#include "qemu/bswap.h" #else @@ -408,7 +408,7 @@ static inline bool is_power_of_2(uint64_t value) /* round down to the nearest power of 2*/ int64_t pow2floor(int64_t value); -#include "module.h" +#include "qemu/module.h" /* * Implementation of ULEB128 (http://en.wikipedia.org/wiki/LEB128) diff --git a/qemu-config.c b/qemu-config.c index ceec6bd155..2188c3e5ec 100644 --- a/qemu-config.c +++ b/qemu-config.c @@ -1,7 +1,7 @@ #include "qemu-common.h" -#include "qemu-error.h" -#include "qemu-option.h" -#include "qemu-config.h" +#include "qemu/error-report.h" +#include "qemu/option.h" +#include "qemu/config-file.h" #include "hw/qdev.h" #include "qapi/error.h" diff --git a/qemu-coroutine-io.c b/qemu-coroutine-io.c index 5fae9c7d47..e8ad1a4011 100644 --- a/qemu-coroutine-io.c +++ b/qemu-coroutine-io.c @@ -23,9 +23,9 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "block/coroutine.h" -#include "iov.h" +#include "qemu/iov.h" ssize_t coroutine_fn qemu_co_sendv_recvv(int sockfd, struct iovec *iov, unsigned iov_cnt, diff --git a/qemu-coroutine-lock.c b/qemu-coroutine-lock.c index c3939ac6ef..97ef01c796 100644 --- a/qemu-coroutine-lock.c +++ b/qemu-coroutine-lock.c @@ -25,7 +25,7 @@ #include "qemu-common.h" #include "block/coroutine.h" #include "block/coroutine_int.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include "block/aio.h" #include "trace.h" diff --git a/qemu-coroutine-sleep.c b/qemu-coroutine-sleep.c index 26e6dac2eb..169ce5ccc9 100644 --- a/qemu-coroutine-sleep.c +++ b/qemu-coroutine-sleep.c @@ -12,7 +12,7 @@ */ #include "block/coroutine.h" -#include "qemu-timer.h" +#include "qemu/timer.h" typedef struct CoSleepCB { QEMUTimer *ts; diff --git a/qemu-img.c b/qemu-img.c index 2e5ca5c964..4c8e2f3849 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -25,9 +25,9 @@ #include "qapi/qmp-output-visitor.h" #include "qapi/qmp/qjson.h" #include "qemu-common.h" -#include "qemu-option.h" -#include "qemu-error.h" -#include "osdep.h" +#include "qemu/option.h" +#include "qemu/error-report.h" +#include "qemu/osdep.h" #include "sysemu.h" #include "block/block_int.h" #include diff --git a/qemu-io.c b/qemu-io.c index e0e47423d7..61880932b3 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -15,7 +15,7 @@ #include #include "qemu-common.h" -#include "main-loop.h" +#include "qemu/main-loop.h" #include "block/block_int.h" #include "cmd.h" #include "trace/control.h" diff --git a/qemu-log.c b/qemu-log.c index a4c3d1f2e3..b655b305ea 100644 --- a/qemu-log.c +++ b/qemu-log.c @@ -18,7 +18,7 @@ */ #include "qemu-common.h" -#include "qemu-log.h" +#include "qemu/log.h" #ifdef WIN32 static const char *logfilename = "qemu.log"; diff --git a/qemu-option.c b/qemu-option.c index ebd3537063..f532b765a0 100644 --- a/qemu-option.c +++ b/qemu-option.c @@ -27,11 +27,11 @@ #include #include "qemu-common.h" -#include "qemu-error.h" +#include "qemu/error-report.h" #include "qapi/qmp/types.h" #include "qapi/error.h" #include "qapi/qmp/qerror.h" -#include "qemu-option-internal.h" +#include "qemu/option_int.h" /* * Extracts the name of an option from the parameter string (p points at the diff --git a/qemu-progress.c b/qemu-progress.c index 5f1b8dfb97..08d67949a1 100644 --- a/qemu-progress.c +++ b/qemu-progress.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" -#include "osdep.h" +#include "qemu/osdep.h" #include "sysemu.h" #include diff --git a/qemu-seccomp.h b/qemu-seccomp.h index b2fc3f8c3c..1189fa241d 100644 --- a/qemu-seccomp.h +++ b/qemu-seccomp.h @@ -16,7 +16,7 @@ #define QEMU_SECCOMP_H #include -#include "osdep.h" +#include "qemu/osdep.h" int seccomp_start(void); #endif diff --git a/qemu-sockets.c b/qemu-sockets.c index cea0a4b8ac..3537bf3d45 100644 --- a/qemu-sockets.c +++ b/qemu-sockets.c @@ -23,9 +23,9 @@ #include #include "monitor/monitor.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "qemu-common.h" /* for qemu_isdigit */ -#include "main-loop.h" +#include "qemu/main-loop.h" #ifndef AI_ADDRCONFIG # define AI_ADDRCONFIG 0 diff --git a/qemu-thread-posix.c b/qemu-thread-posix.c index 4ef9c7b3f8..7be292ed68 100644 --- a/qemu-thread-posix.c +++ b/qemu-thread-posix.c @@ -20,7 +20,7 @@ #include #include #include -#include "qemu-thread.h" +#include "qemu/thread.h" static void error_exit(int err, const char *msg) { diff --git a/qemu-thread-win32.c b/qemu-thread-win32.c index 4b3db60f5c..8037b39045 100644 --- a/qemu-thread-win32.c +++ b/qemu-thread-win32.c @@ -11,7 +11,7 @@ * */ #include "qemu-common.h" -#include "qemu-thread.h" +#include "qemu/thread.h" #include #include #include diff --git a/qemu-timer-common.c b/qemu-timer-common.c index 755e300bc9..16f5e758b2 100644 --- a/qemu-timer-common.c +++ b/qemu-timer-common.c @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "qemu-timer.h" +#include "qemu/timer.h" /***********************************************************/ /* real time host monotonic timer */ diff --git a/qemu-timer.c b/qemu-timer.c index 8e0dccc087..80b3f2eb31 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -28,7 +28,7 @@ #include "hw/hw.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #ifdef CONFIG_POSIX #include #endif @@ -477,7 +477,7 @@ static void host_alarm_handler(int host_signum) #if defined(__linux__) -#include "compatfd.h" +#include "qemu/compatfd.h" static int dynticks_start_timer(struct qemu_alarm_timer *t) { diff --git a/qemu-tool.c b/qemu-tool.c index d1f46222ee..8ac45ff39b 100644 --- a/qemu-tool.c +++ b/qemu-tool.c @@ -15,12 +15,12 @@ #include "qemu-common.h" #include "monitor/monitor.h" -#include "qemu-timer.h" -#include "qemu-log.h" +#include "qemu/timer.h" +#include "qemu/log.h" #include "migration/migration.h" -#include "main-loop.h" +#include "qemu/main-loop.h" #include "sysemu.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "slirp/libslirp.h" #include diff --git a/qga/channel-posix.c b/qga/channel-posix.c index 769a559456..d4fd628907 100644 --- a/qga/channel-posix.c +++ b/qga/channel-posix.c @@ -4,8 +4,8 @@ #include #include #include -#include "osdep.h" -#include "qemu_socket.h" +#include "qemu/osdep.h" +#include "qemu/sockets.h" #include "qga/channel.h" #ifdef CONFIG_SOLARIS diff --git a/qga/commands-posix.c b/qga/commands-posix.c index cedf2ccf28..a657201e7a 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -18,8 +18,8 @@ #include "qga/guest-agent-core.h" #include "qga-qmp-commands.h" #include "qapi/qmp/qerror.h" -#include "qemu-queue.h" -#include "host-utils.h" +#include "qemu/queue.h" +#include "qemu/host-utils.h" #ifndef CONFIG_HAS_ENVIRON #ifdef __APPLE__ diff --git a/qga/main.c b/qga/main.c index ead58cc11f..ba5fa1c778 100644 --- a/qga/main.c +++ b/qga/main.c @@ -25,7 +25,7 @@ #include "qapi/qmp/qint.h" #include "qapi/qmp/qjson.h" #include "qga/guest-agent-core.h" -#include "module.h" +#include "qemu/module.h" #include "signal.h" #include "qapi/qmp/qerror.h" #include "qapi/qmp/dispatch.h" diff --git a/qlist.c b/qlist.c index c5ac2115af..1ced0de58e 100644 --- a/qlist.c +++ b/qlist.c @@ -12,7 +12,7 @@ #include "qapi/qmp/qlist.h" #include "qapi/qmp/qobject.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include "qemu-common.h" static void qlist_destroy_obj(QObject *obj); diff --git a/qom/container.c b/qom/container.c index ceb0f0186d..5270a5ee9c 100644 --- a/qom/container.c +++ b/qom/container.c @@ -11,7 +11,7 @@ */ #include "qom/object.h" -#include "module.h" +#include "qemu/module.h" #include static TypeInfo container_info = { diff --git a/savevm.c b/savevm.c index a5205a09c3..ea01e9baf6 100644 --- a/savevm.c +++ b/savevm.c @@ -75,17 +75,17 @@ #include "net/net.h" #include "monitor/monitor.h" #include "sysemu.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "audio/audio.h" #include "migration/migration.h" -#include "qemu_socket.h" -#include "qemu-queue.h" -#include "qemu-timer.h" +#include "qemu/sockets.h" +#include "qemu/queue.h" +#include "qemu/timer.h" #include "cpus.h" #include "exec/memory.h" #include "qmp-commands.h" #include "trace.h" -#include "bitops.h" +#include "qemu/bitops.h" #define SELF_ANNOUNCE_ROUNDS 5 diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index eccc28daee..e06332bd55 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -367,7 +367,7 @@ def gen_command_def_prologue(prefix="", proxy=False): */ #include "qemu-common.h" -#include "module.h" +#include "qemu/module.h" #include "qapi/qmp/qerror.h" #include "qapi/qmp/types.h" #include "qapi/qmp/dispatch.h" diff --git a/slirp/if.c b/slirp/if.c index 533295dd07..dcd5fafe5d 100644 --- a/slirp/if.c +++ b/slirp/if.c @@ -6,7 +6,7 @@ */ #include -#include "qemu-timer.h" +#include "qemu/timer.h" static void ifs_insque(struct mbuf *ifm, struct mbuf *ifmhead) diff --git a/slirp/ip_input.c b/slirp/ip_input.c index 6f4cff8fdd..880bdfd3cc 100644 --- a/slirp/ip_input.c +++ b/slirp/ip_input.c @@ -39,7 +39,7 @@ */ #include -#include +#include #include "ip_icmp.h" static struct ip *ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp); diff --git a/slirp/sbuf.c b/slirp/sbuf.c index 637f8fea3d..08ec2b4f44 100644 --- a/slirp/sbuf.c +++ b/slirp/sbuf.c @@ -6,7 +6,7 @@ */ #include -#include +#include static void sbappendsb(struct sbuf *sb, struct mbuf *m); diff --git a/slirp/slirp.c b/slirp/slirp.c index 3395d509a2..4b51a67e7d 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "qemu-char.h" #include "slirp.h" #include "hw/hw.h" diff --git a/slirp/slirp.h b/slirp/slirp.h index 0107b07e66..dfc3e3a2b8 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -133,8 +133,8 @@ void free(void *ptr); #include "debug.h" -#include "qemu-queue.h" -#include "qemu_socket.h" +#include "qemu/queue.h" +#include "qemu/sockets.h" #include "libslirp.h" #include "ip.h" diff --git a/spice-qemu-char.c b/spice-qemu-char.c index 5f95c937f3..41b1657ccd 100644 --- a/spice-qemu-char.c +++ b/spice-qemu-char.c @@ -5,7 +5,7 @@ #include #include -#include "osdep.h" +#include "qemu/osdep.h" #define dprintf(_scd, _level, _fmt, ...) \ do { \ diff --git a/stubs/fd-register.c b/stubs/fd-register.c index 813b6dd7c0..d0c34fd2a3 100644 --- a/stubs/fd-register.c +++ b/stubs/fd-register.c @@ -1,5 +1,5 @@ #include "qemu-common.h" -#include "main-loop.h" +#include "qemu/main-loop.h" void qemu_fd_register(int fd) { diff --git a/stubs/set-fd-handler.c b/stubs/set-fd-handler.c index 4807b5dc22..fc874d33fe 100644 --- a/stubs/set-fd-handler.c +++ b/stubs/set-fd-handler.c @@ -1,5 +1,5 @@ #include "qemu-common.h" -#include "main-loop.h" +#include "qemu/main-loop.h" int qemu_set_fd_handler2(int fd, IOCanReadHandler *fd_read_poll, diff --git a/sysemu.h b/sysemu.h index 1b6add2dc3..8eaa4707a0 100644 --- a/sysemu.h +++ b/sysemu.h @@ -2,13 +2,13 @@ #define SYSEMU_H /* Misc. things related to the system emulator. */ -#include "qemu-types.h" -#include "qemu-option.h" -#include "qemu-queue.h" -#include "qemu-timer.h" +#include "qemu/typedefs.h" +#include "qemu/option.h" +#include "qemu/queue.h" +#include "qemu/timer.h" #include "qapi-types.h" -#include "notify.h" -#include "main-loop.h" +#include "qemu/notify.h" +#include "qemu/main-loop.h" /* vl.c */ diff --git a/target-alpha/int_helper.c b/target-alpha/int_helper.c index 1d832f0b57..c9b42b6ed4 100644 --- a/target-alpha/int_helper.c +++ b/target-alpha/int_helper.c @@ -19,7 +19,7 @@ #include "cpu.h" #include "helper.h" -#include "host-utils.h" +#include "qemu/host-utils.h" uint64_t helper_umulh(uint64_t op1, uint64_t op2) diff --git a/target-alpha/sys_helper.c b/target-alpha/sys_helper.c index 40ca49c883..2bc2b02815 100644 --- a/target-alpha/sys_helper.c +++ b/target-alpha/sys_helper.c @@ -20,7 +20,7 @@ #include "cpu.h" #include "helper.h" #include "sysemu.h" -#include "qemu-timer.h" +#include "qemu/timer.h" uint64_t helper_load_pcc(CPUAlphaState *env) diff --git a/target-alpha/translate.c b/target-alpha/translate.c index 2d0d891128..c94126737f 100644 --- a/target-alpha/translate.c +++ b/target-alpha/translate.c @@ -19,7 +19,7 @@ #include "cpu.h" #include "disas/disas.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "tcg-op.h" #include "helper.h" diff --git a/target-arm/helper.c b/target-arm/helper.c index 1f7a3c04c3..eef2acd18a 100644 --- a/target-arm/helper.c +++ b/target-arm/helper.c @@ -1,9 +1,9 @@ #include "cpu.h" #include "exec/gdbstub.h" #include "helper.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "sysemu.h" -#include "bitops.h" +#include "qemu/bitops.h" #ifndef CONFIG_USER_ONLY static inline int get_phys_addr(CPUARMState *env, uint32_t address, diff --git a/target-arm/translate.c b/target-arm/translate.c index 988b5428d4..724e00f7cf 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -27,7 +27,7 @@ #include "cpu.h" #include "disas/disas.h" #include "tcg-op.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "helper.h" #define GEN_HELPER 1 diff --git a/target-cris/helper.c b/target-cris/helper.c index 324fe052f5..8407a6d880 100644 --- a/target-cris/helper.c +++ b/target-cris/helper.c @@ -20,7 +20,7 @@ #include "cpu.h" #include "mmu.h" -#include "host-utils.h" +#include "qemu/host-utils.h" //#define CRIS_HELPER_DEBUG diff --git a/target-cris/op_helper.c b/target-cris/op_helper.c index cd0e17e099..79bff38663 100644 --- a/target-cris/op_helper.c +++ b/target-cris/op_helper.c @@ -21,7 +21,7 @@ #include "cpu.h" #include "mmu.h" #include "helper.h" -#include "host-utils.h" +#include "qemu/host-utils.h" //#define CRIS_OP_HELPER_DEBUG diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 150c4dfb0c..8abc5561e9 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -24,8 +24,8 @@ #include "cpu.h" #include "kvm.h" -#include "qemu-option.h" -#include "qemu-config.h" +#include "qemu/option.h" +#include "qemu/config-file.h" #include "qapi/qmp/qerror.h" #include "qapi/visitor.h" diff --git a/target-i386/excp_helper.c b/target-i386/excp_helper.c index aaa5ca2090..64c8346d3b 100644 --- a/target-i386/excp_helper.c +++ b/target-i386/excp_helper.c @@ -18,7 +18,7 @@ */ #include "cpu.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "sysemu.h" #include "helper.h" diff --git a/target-i386/int_helper.c b/target-i386/int_helper.c index f39747e806..84b812dcca 100644 --- a/target-i386/int_helper.c +++ b/target-i386/int_helper.c @@ -18,7 +18,7 @@ */ #include "cpu.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "helper.h" //#define DEBUG_MULDIV diff --git a/target-i386/kvm.c b/target-i386/kvm.c index f7c95d5424..340ed3f33e 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -26,8 +26,8 @@ #include "kvm_i386.h" #include "cpu.h" #include "exec/gdbstub.h" -#include "host-utils.h" -#include "qemu-config.h" +#include "qemu/host-utils.h" +#include "qemu/config-file.h" #include "hw/pc.h" #include "hw/apic.h" #include "exec/ioport.h" diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c index be795d71eb..c2a99ee9bc 100644 --- a/target-i386/seg_helper.c +++ b/target-i386/seg_helper.c @@ -19,7 +19,7 @@ */ #include "cpu.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "helper.h" //#define DEBUG_PCALL diff --git a/target-lm32/helper.c b/target-lm32/helper.c index 0ed7cfda18..d76ea3fe09 100644 --- a/target-lm32/helper.c +++ b/target-lm32/helper.c @@ -18,7 +18,7 @@ */ #include "cpu.h" -#include "host-utils.h" +#include "qemu/host-utils.h" int cpu_lm32_handle_mmu_fault(CPULM32State *env, target_ulong address, int rw, int mmu_idx) diff --git a/target-lm32/op_helper.c b/target-lm32/op_helper.c index 27b3cef25c..53410b176e 100644 --- a/target-lm32/op_helper.c +++ b/target-lm32/op_helper.c @@ -1,7 +1,7 @@ #include #include "cpu.h" #include "helper.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "hw/lm32_pic.h" #include "hw/lm32_juart.h" diff --git a/target-m68k/translate.c b/target-m68k/translate.c index 1c9b5ec8d4..e763195f86 100644 --- a/target-m68k/translate.c +++ b/target-m68k/translate.c @@ -21,7 +21,7 @@ #include "cpu.h" #include "disas/disas.h" #include "tcg-op.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "helpers.h" #define GEN_HELPER 1 diff --git a/target-microblaze/helper.c b/target-microblaze/helper.c index 530e0b5fb0..97aedc52bb 100644 --- a/target-microblaze/helper.c +++ b/target-microblaze/helper.c @@ -19,7 +19,7 @@ */ #include "cpu.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #define D(x) #define DMMU(x) diff --git a/target-microblaze/op_helper.c b/target-microblaze/op_helper.c index 343dcc15e7..1c62f3c68f 100644 --- a/target-microblaze/op_helper.c +++ b/target-microblaze/op_helper.c @@ -21,7 +21,7 @@ #include #include "cpu.h" #include "helper.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #define D(x) diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c index 157f59e6bf..e85edce6fa 100644 --- a/target-mips/op_helper.c +++ b/target-mips/op_helper.c @@ -18,7 +18,7 @@ */ #include #include "cpu.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "helper.h" diff --git a/target-openrisc/int_helper.c b/target-openrisc/int_helper.c index 2fdfd27712..20f9837e6a 100644 --- a/target-openrisc/int_helper.c +++ b/target-openrisc/int_helper.c @@ -21,7 +21,7 @@ #include "cpu.h" #include "helper.h" #include "exception.h" -#include "host-utils.h" +#include "qemu/host-utils.h" target_ulong HELPER(ff1)(target_ulong x) { diff --git a/target-openrisc/interrupt.c b/target-openrisc/interrupt.c index 226ce43513..7f2c025da2 100644 --- a/target-openrisc/interrupt.c +++ b/target-openrisc/interrupt.c @@ -20,7 +20,7 @@ #include "cpu.h" #include "qemu-common.h" #include "exec/gdbstub.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #ifndef CONFIG_USER_ONLY #include "hw/loader.h" #endif diff --git a/target-openrisc/mmu.c b/target-openrisc/mmu.c index 4eee44434f..836465259a 100644 --- a/target-openrisc/mmu.c +++ b/target-openrisc/mmu.c @@ -21,7 +21,7 @@ #include "cpu.h" #include "qemu-common.h" #include "exec/gdbstub.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #ifndef CONFIG_USER_ONLY #include "hw/loader.h" #endif diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c index 5883347fa7..1e1b30cdcb 100644 --- a/target-openrisc/translate.c +++ b/target-openrisc/translate.c @@ -23,9 +23,9 @@ #include "disas/disas.h" #include "tcg-op.h" #include "qemu-common.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "config.h" -#include "bitops.h" +#include "qemu/bitops.h" #include "helper.h" #define GEN_HELPER 1 diff --git a/target-ppc/int_helper.c b/target-ppc/int_helper.c index f39b4f682a..783079d995 100644 --- a/target-ppc/int_helper.c +++ b/target-ppc/int_helper.c @@ -17,7 +17,7 @@ * License along with this library; if not, see . */ #include "cpu.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "helper.h" #include "helper_regs.h" diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c index 3f5df5772f..2546c577f6 100644 --- a/target-ppc/kvm.c +++ b/target-ppc/kvm.c @@ -23,7 +23,7 @@ #include #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" #include "kvm.h" #include "kvm_ppc.h" diff --git a/target-ppc/kvm_ppc.c b/target-ppc/kvm_ppc.c index a2e49cd423..2de59fd43b 100644 --- a/target-ppc/kvm_ppc.c +++ b/target-ppc/kvm_ppc.c @@ -12,7 +12,7 @@ */ #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "kvm_ppc.h" #include "device_tree.h" diff --git a/target-ppc/mem_helper.c b/target-ppc/mem_helper.c index 2d7a349c32..902b1cd823 100644 --- a/target-ppc/mem_helper.c +++ b/target-ppc/mem_helper.c @@ -17,7 +17,7 @@ * License along with this library; if not, see . */ #include "cpu.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "helper.h" #include "helper_regs.h" diff --git a/target-ppc/translate.c b/target-ppc/translate.c index a74d76b5a6..798b7acfc9 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c @@ -21,7 +21,7 @@ #include "cpu.h" #include "disas/disas.h" #include "tcg-op.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "helper.h" #define GEN_HELPER 1 diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c index 619b202b92..249f063d94 100644 --- a/target-s390x/cpu.c +++ b/target-s390x/cpu.c @@ -22,7 +22,7 @@ #include "cpu.h" #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" /* CPUClass::reset() */ diff --git a/target-s390x/helper.c b/target-s390x/helper.c index 6e9b209713..8e135457a3 100644 --- a/target-s390x/helper.c +++ b/target-s390x/helper.c @@ -20,7 +20,7 @@ #include "cpu.h" #include "exec/gdbstub.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #ifndef CONFIG_USER_ONLY #include "sysemu.h" #endif diff --git a/target-s390x/int_helper.c b/target-s390x/int_helper.c index f202a7e1da..b683709860 100644 --- a/target-s390x/int_helper.c +++ b/target-s390x/int_helper.c @@ -19,7 +19,7 @@ */ #include "cpu.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "helper.h" /* #define DEBUG_HELPER */ diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index 94de764264..dc70699919 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -25,7 +25,7 @@ #include #include "qemu-common.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "sysemu.h" #include "kvm.h" #include "cpu.h" diff --git a/target-s390x/misc_helper.c b/target-s390x/misc_helper.c index a3336e16b0..2e73d30756 100644 --- a/target-s390x/misc_helper.c +++ b/target-s390x/misc_helper.c @@ -20,11 +20,11 @@ #include "cpu.h" #include "exec/memory.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "helper.h" #include #include "kvm.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #ifdef CONFIG_KVM #include #endif diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 28e61c54b8..9e34741311 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -32,7 +32,7 @@ #include "cpu.h" #include "disas/disas.h" #include "tcg-op.h" -#include "qemu-log.h" +#include "qemu/log.h" /* global register indexes */ static TCGv_ptr cpu_env; diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h index 0ed511a399..04b6659909 100644 --- a/target-sparc/cpu.h +++ b/target-sparc/cpu.h @@ -3,7 +3,7 @@ #include "config.h" #include "qemu-common.h" -#include "bswap.h" +#include "qemu/bswap.h" #if !defined(TARGET_SPARC64) #define TARGET_LONG_BITS 32 diff --git a/target-sparc/helper.c b/target-sparc/helper.c index 3c8e865eef..e0d78f3852 100644 --- a/target-sparc/helper.c +++ b/target-sparc/helper.c @@ -18,7 +18,7 @@ */ #include "cpu.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "helper.h" #include "sysemu.h" diff --git a/target-sparc/machine.c b/target-sparc/machine.c index eb4d87f158..a353dabdd9 100644 --- a/target-sparc/machine.c +++ b/target-sparc/machine.c @@ -1,6 +1,6 @@ #include "hw/hw.h" #include "hw/boards.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "cpu.h" diff --git a/target-unicore32/helper.c b/target-unicore32/helper.c index 2adbd1675d..ff4f628404 100644 --- a/target-unicore32/helper.c +++ b/target-unicore32/helper.c @@ -12,7 +12,7 @@ #include "cpu.h" #include "exec/gdbstub.h" #include "helper.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "ui/console.h" #undef DEBUG_UC32 diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c index 218e95eaca..f4498bcb14 100644 --- a/target-unicore32/translate.c +++ b/target-unicore32/translate.c @@ -17,7 +17,7 @@ #include "cpu.h" #include "disas/disas.h" #include "tcg-op.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "helper.h" #define GEN_HELPER 1 diff --git a/target-xtensa/core-dc232b.c b/target-xtensa/core-dc232b.c index d1a594cda2..0bfcf2414c 100644 --- a/target-xtensa/core-dc232b.c +++ b/target-xtensa/core-dc232b.c @@ -28,7 +28,7 @@ #include "cpu.h" #include "exec/exec-all.h" #include "exec/gdbstub.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "core-dc232b/core-isa.h" #include "overlay_tool.h" diff --git a/target-xtensa/core-dc233c.c b/target-xtensa/core-dc233c.c index ead6b3b128..11acbf3580 100644 --- a/target-xtensa/core-dc233c.c +++ b/target-xtensa/core-dc233c.c @@ -29,7 +29,7 @@ #include "exec/exec-all.h" #include "exec/gdbstub.h" #include "qemu-common.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "core-dc233c/core-isa.h" #include "overlay_tool.h" diff --git a/target-xtensa/core-fsf.c b/target-xtensa/core-fsf.c index a387aeeca5..d4660edde9 100644 --- a/target-xtensa/core-fsf.c +++ b/target-xtensa/core-fsf.c @@ -28,7 +28,7 @@ #include "cpu.h" #include "exec/exec-all.h" #include "exec/gdbstub.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #include "core-fsf/core-isa.h" #include "overlay_tool.h" diff --git a/target-xtensa/helper.c b/target-xtensa/helper.c index 3d7a399008..94c03a1d3c 100644 --- a/target-xtensa/helper.c +++ b/target-xtensa/helper.c @@ -28,7 +28,7 @@ #include "cpu.h" #include "exec/exec-all.h" #include "exec/gdbstub.h" -#include "host-utils.h" +#include "qemu/host-utils.h" #if !defined(CONFIG_USER_ONLY) #include "hw/loader.h" #endif diff --git a/target-xtensa/op_helper.c b/target-xtensa/op_helper.c index a93abcb1dd..3813a72626 100644 --- a/target-xtensa/op_helper.c +++ b/target-xtensa/op_helper.c @@ -27,7 +27,7 @@ #include "cpu.h" #include "helper.h" -#include "host-utils.h" +#include "qemu/host-utils.h" static void do_unaligned_access(CPUXtensaState *env, target_ulong addr, int is_write, int is_user, uintptr_t retaddr); diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index 3c2d1853d6..f61a497d21 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -34,7 +34,7 @@ #include "exec/exec-all.h" #include "disas/disas.h" #include "tcg-op.h" -#include "qemu-log.h" +#include "qemu/log.h" #include "sysemu.h" #include "helper.h" diff --git a/target-xtensa/xtensa-semi.c b/target-xtensa/xtensa-semi.c index 851ff546f0..5fe0361c02 100644 --- a/target-xtensa/xtensa-semi.c +++ b/target-xtensa/xtensa-semi.c @@ -31,7 +31,7 @@ #include #include "cpu.h" #include "helper.h" -#include "qemu-log.h" +#include "qemu/log.h" enum { TARGET_SYS_exit = 1, diff --git a/tcg/tcg.c b/tcg/tcg.c index cb193f2683..ede51a3960 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -37,9 +37,9 @@ #endif #include "qemu-common.h" -#include "cache-utils.h" -#include "host-utils.h" -#include "qemu-timer.h" +#include "qemu/cache-utils.h" +#include "qemu/host-utils.h" +#include "qemu/timer.h" /* Note: the long term plan is to reduce the dependancies on the QEMU CPU definitions. Currently they are used for qemu_ld/st diff --git a/tests/libqtest.c b/tests/libqtest.c index 71b84c12dd..913fa0535c 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -26,8 +26,8 @@ #include #include -#include "compiler.h" -#include "osdep.h" +#include "qemu/compiler.h" +#include "qemu/osdep.h" #define MAX_IRQ 256 diff --git a/tests/tcg/test-i386-fprem.c b/tests/tcg/test-i386-fprem.c index 8c7a4d1ff4..e91fb1ae93 100644 --- a/tests/tcg/test-i386-fprem.c +++ b/tests/tcg/test-i386-fprem.c @@ -22,8 +22,8 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ -#include "compiler.h" -#include "osdep.h" +#include "qemu/compiler.h" +#include "qemu/osdep.h" #include #include diff --git a/tests/tcg/test-i386.c b/tests/tcg/test-i386.c index 40392ac51d..6dc730d882 100644 --- a/tests/tcg/test-i386.c +++ b/tests/tcg/test-i386.c @@ -17,7 +17,7 @@ * along with this program; if not, see . */ #define _GNU_SOURCE -#include "compiler.h" +#include "qemu/compiler.h" #include #include #include diff --git a/tests/test-iov.c b/tests/test-iov.c index cbe7a8955c..a480bc8725 100644 --- a/tests/test-iov.c +++ b/tests/test-iov.c @@ -1,7 +1,7 @@ #include #include "qemu-common.h" -#include "iov.h" -#include "qemu_socket.h" +#include "qemu/iov.h" +#include "qemu/sockets.h" /* create a randomly-sized iovec with random vectors */ static void iov_random(struct iovec **iovp, unsigned *iov_cntp) diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c index 61b533a071..5a3e82a854 100644 --- a/tests/test-qmp-commands.c +++ b/tests/test-qmp-commands.c @@ -3,7 +3,7 @@ #include "qapi/qmp/types.h" #include "test-qmp-commands.h" #include "qapi/qmp/dispatch.h" -#include "module.h" +#include "qemu/module.h" #include "qapi/qmp-input-visitor.h" #include "tests/test-qapi-types.h" #include "tests/test-qapi-visit.h" diff --git a/thread-pool.c b/thread-pool.c index 4c73a7db97..e3ca64d790 100644 --- a/thread-pool.c +++ b/thread-pool.c @@ -15,13 +15,13 @@ * GNU GPL, version 2 or (at your option) any later version. */ #include "qemu-common.h" -#include "qemu-queue.h" -#include "qemu-thread.h" -#include "osdep.h" +#include "qemu/queue.h" +#include "qemu/thread.h" +#include "qemu/osdep.h" #include "block/coroutine.h" #include "trace.h" #include "block/block_int.h" -#include "event_notifier.h" +#include "qemu/event_notifier.h" #include "block/thread-pool.h" static void do_spawn_thread(void); diff --git a/trace/simple.c b/trace/simple.c index d83681b227..ce17d64bd7 100644 --- a/trace/simple.c +++ b/trace/simple.c @@ -16,7 +16,7 @@ #include #include #endif -#include "qemu-timer.h" +#include "qemu/timer.h" #include "trace.h" #include "trace/control.h" diff --git a/translate-all.c b/translate-all.c index e0cdad38c7..b621748ec0 100644 --- a/translate-all.c +++ b/translate-all.c @@ -35,7 +35,7 @@ #include "cpu.h" #include "disas/disas.h" #include "tcg.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "exec/memory.h" #include "exec/address-spaces.h" #if defined(CONFIG_USER_ONLY) diff --git a/ui/console.c b/ui/console.c index 60bfb72ac2..a4bff8ce8a 100644 --- a/ui/console.c +++ b/ui/console.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" #include "ui/console.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "qmp-commands.h" #include "qemu-char.h" diff --git a/ui/sdl_zoom.c b/ui/sdl_zoom.c index a986c7c14c..122027cb36 100644 --- a/ui/sdl_zoom.c +++ b/ui/sdl_zoom.c @@ -12,7 +12,7 @@ */ #include "sdl_zoom.h" -#include "osdep.h" +#include "qemu/osdep.h" #include #include diff --git a/ui/spice-core.c b/ui/spice-core.c index 962475de6b..8727bf49ca 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -23,17 +23,17 @@ #include "qemu-common.h" #include "ui/qemu-spice.h" -#include "qemu-thread.h" -#include "qemu-timer.h" -#include "qemu-queue.h" +#include "qemu/thread.h" +#include "qemu/timer.h" +#include "qemu/queue.h" #include "qemu-x509.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "qmp-commands.h" #include "qapi/qmp/qint.h" #include "qapi/qmp/qbool.h" #include "qapi/qmp/qstring.h" #include "qapi/qmp/qjson.h" -#include "notify.h" +#include "qemu/notify.h" #include "migration/migration.h" #include "monitor/monitor.h" #include "hw/hw.h" diff --git a/ui/spice-display.c b/ui/spice-display.c index 56ebf80805..a19b3d95fb 100644 --- a/ui/spice-display.c +++ b/ui/spice-display.c @@ -17,8 +17,8 @@ #include "qemu-common.h" #include "ui/qemu-spice.h" -#include "qemu-timer.h" -#include "qemu-queue.h" +#include "qemu/timer.h" +#include "qemu/queue.h" #include "monitor/monitor.h" #include "ui/console.h" #include "sysemu.h" diff --git a/ui/vnc-auth-sasl.h b/ui/vnc-auth-sasl.h index ee243a9d64..8091d689cb 100644 --- a/ui/vnc-auth-sasl.h +++ b/ui/vnc-auth-sasl.h @@ -32,7 +32,7 @@ typedef struct VncStateSASL VncStateSASL; typedef struct VncDisplaySASL VncDisplaySASL; -#include "acl.h" +#include "qemu/acl.h" struct VncStateSASL { sasl_conn_t *conn; diff --git a/ui/vnc-enc-tight.c b/ui/vnc-enc-tight.c index 09199ef584..4ddea7d4f5 100644 --- a/ui/vnc-enc-tight.c +++ b/ui/vnc-enc-tight.c @@ -44,7 +44,7 @@ #include #endif -#include "bswap.h" +#include "qemu/bswap.h" #include "qapi/qmp/qint.h" #include "vnc.h" #include "vnc-enc-tight.h" diff --git a/ui/vnc-jobs.c b/ui/vnc-jobs.c index 57c091683b..0bfc0c5485 100644 --- a/ui/vnc-jobs.c +++ b/ui/vnc-jobs.c @@ -28,7 +28,7 @@ #include "vnc.h" #include "vnc-jobs.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" /* * Locking: diff --git a/ui/vnc-palette.h b/ui/vnc-palette.h index bfc7fe642e..d02f0236c1 100644 --- a/ui/vnc-palette.h +++ b/ui/vnc-palette.h @@ -30,7 +30,7 @@ #define VNC_PALETTE_H #include "qapi/qmp/qlist.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include #include diff --git a/ui/vnc-tls.c b/ui/vnc-tls.c index a7f7d07ac8..56292636d7 100644 --- a/ui/vnc-tls.c +++ b/ui/vnc-tls.c @@ -26,7 +26,7 @@ #include "qemu-x509.h" #include "vnc.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #if defined(_VNC_DEBUG) && _VNC_DEBUG >= 2 /* Very verbose, so only enabled for _VNC_DEBUG >= 2 */ diff --git a/ui/vnc-tls.h b/ui/vnc-tls.h index 2b93633896..36a2227fec 100644 --- a/ui/vnc-tls.h +++ b/ui/vnc-tls.h @@ -31,7 +31,7 @@ #include #include -#include "acl.h" +#include "qemu/acl.h" enum { VNC_WIREMODE_CLEAR, diff --git a/ui/vnc.c b/ui/vnc.c index dad2ddee29..d9e5315e79 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -27,12 +27,12 @@ #include "vnc.h" #include "vnc-jobs.h" #include "sysemu.h" -#include "qemu_socket.h" -#include "qemu-timer.h" -#include "acl.h" +#include "qemu/sockets.h" +#include "qemu/timer.h" +#include "qemu/acl.h" #include "qapi/qmp/types.h" #include "qmp-commands.h" -#include "osdep.h" +#include "qemu/osdep.h" #define VNC_REFRESH_INTERVAL_BASE 30 #define VNC_REFRESH_INTERVAL_INC 50 diff --git a/ui/vnc.h b/ui/vnc.h index e5c043ff45..8b40f09117 100644 --- a/ui/vnc.h +++ b/ui/vnc.h @@ -28,12 +28,12 @@ #define __QEMU_VNC_H #include "qemu-common.h" -#include "qemu-queue.h" -#include "qemu-thread.h" +#include "qemu/queue.h" +#include "qemu/thread.h" #include "ui/console.h" #include "monitor/monitor.h" #include "audio/audio.h" -#include "bitmap.h" +#include "qemu/bitmap.h" #include #include diff --git a/uri.c b/uri.c index 138547b821..4238729b83 100644 --- a/uri.c +++ b/uri.c @@ -55,7 +55,7 @@ #include #include -#include "uri.h" +#include "qemu/uri.h" static void uri_clean(URI *uri); diff --git a/vl.c b/vl.c index 2debde0a4a..9b80e7abc4 100644 --- a/vl.c +++ b/vl.c @@ -28,7 +28,7 @@ #include #include #include -#include "bitmap.h" +#include "qemu/bitmap.h" /* Needed early for CONFIG_BSD etc. */ #include "config-host.h" @@ -133,9 +133,9 @@ int main(int argc, char **argv) #include "ui/console.h" #include "sysemu.h" #include "exec/gdbstub.h" -#include "qemu-timer.h" +#include "qemu/timer.h" #include "qemu-char.h" -#include "cache-utils.h" +#include "qemu/cache-utils.h" #include "blockdev.h" #include "hw/block-common.h" #include "migration/block.h" @@ -144,11 +144,11 @@ int main(int argc, char **argv) #include "migration/migration.h" #include "kvm.h" #include "qapi/qmp/qjson.h" -#include "qemu-option.h" -#include "qemu-config.h" +#include "qemu/option.h" +#include "qemu/config-file.h" #include "qemu-options.h" #include "qmp-commands.h" -#include "main-loop.h" +#include "qemu/main-loop.h" #ifdef CONFIG_VIRTFS #include "fsdev/qemu-fsdev.h" #endif @@ -156,16 +156,16 @@ int main(int argc, char **argv) #include "disas/disas.h" -#include "qemu_socket.h" +#include "qemu/sockets.h" #include "slirp/libslirp.h" #include "trace.h" #include "trace/control.h" -#include "qemu-queue.h" +#include "qemu/queue.h" #include "cpus.h" #include "arch_init.h" -#include "osdep.h" +#include "qemu/osdep.h" #include "ui/qemu-spice.h" #include "qapi/string-input-visitor.h" diff --git a/xen-all.c b/xen-all.c index 95d383f41f..6965626db8 100644 --- a/xen-all.c +++ b/xen-all.c @@ -16,7 +16,7 @@ #include "hw/xen_backend.h" #include "qmp-commands.h" -#include "range.h" +#include "qemu/range.h" #include "xen-mapcache.h" #include "trace.h" #include "exec/address-spaces.h" diff --git a/xen-mapcache.c b/xen-mapcache.c index 31c06dc950..8f4648cc32 100644 --- a/xen-mapcache.c +++ b/xen-mapcache.c @@ -14,7 +14,7 @@ #include "hw/xen_backend.h" #include "blockdev.h" -#include "bitmap.h" +#include "qemu/bitmap.h" #include #include From 9c17d615a66ebd655871bf891ec0fe901ad8b332 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 17 Dec 2012 18:20:04 +0100 Subject: [PATCH 256/300] softmmu: move include files to include/sysemu/ Signed-off-by: Paolo Bonzini --- arch_init.c | 6 +++--- audio/audio.c | 2 +- audio/winwaveaudio.c | 2 +- balloon.c | 4 ++-- block-migration.c | 2 +- block.c | 2 +- block/vdi.c | 2 +- blockdev-nbd.c | 4 ++-- blockdev.c | 6 +++--- cpu-exec.c | 2 +- cpus.c | 10 +++++----- device_tree.c | 2 +- dma-helpers.c | 2 +- dump-stub.c | 2 +- dump.c | 8 ++++---- exec.c | 6 +++--- gdbstub.c | 4 ++-- hw/ac97.c | 2 +- hw/acpi.c | 2 +- hw/acpi_ich9.c | 4 ++-- hw/acpi_piix4.c | 2 +- hw/alpha_dp264.c | 2 +- hw/alpha_pci.c | 2 +- hw/alpha_typhoon.c | 2 +- hw/apb_pci.c | 2 +- hw/apic_common.c | 2 +- hw/arm_boot.c | 4 ++-- hw/arm_sysctl.c | 2 +- hw/axis_dev88.c | 2 +- hw/block-common.c | 2 +- hw/boards.h | 2 +- hw/bonito.c | 2 +- hw/cbus.c | 2 +- hw/collie.c | 2 +- hw/cuda.c | 2 +- hw/device-hotplug.c | 4 ++-- hw/e1000.c | 4 ++-- hw/eepro100.c | 4 ++-- hw/es1370.c | 2 +- hw/etraxfs_dma.c | 2 +- hw/etraxfs_timer.c | 2 +- hw/exynos4210.c | 2 +- hw/exynos4210_rtc.c | 2 +- hw/exynos4210_uart.c | 2 +- hw/exynos4_boards.c | 2 +- hw/fdc.c | 4 ++-- hw/fw_cfg.c | 2 +- hw/gumstix.c | 2 +- hw/highbank.c | 4 ++-- hw/ide/ahci.c | 2 +- hw/ide/cmd646.c | 4 ++-- hw/ide/core.c | 6 +++--- hw/ide/ich.c | 2 +- hw/ide/internal.h | 4 ++-- hw/ide/isa.c | 2 +- hw/ide/macio.c | 2 +- hw/ide/microdrive.c | 2 +- hw/ide/mmio.c | 2 +- hw/ide/pci.c | 2 +- hw/ide/piix.c | 6 +++--- hw/ide/qdev.c | 6 +++--- hw/ide/via.c | 4 ++-- hw/imx_ccm.c | 2 +- hw/imx_serial.c | 2 +- hw/integratorcp.c | 2 +- hw/intel-hda.c | 2 +- hw/isa-bus.c | 2 +- hw/ivshmem.c | 2 +- hw/kvm/apic.c | 2 +- hw/kvm/clock.c | 4 ++-- hw/kvm/i8254.c | 4 ++-- hw/kvm/i8259.c | 2 +- hw/kvm/ioapic.c | 2 +- hw/kvm/pci-assign.c | 2 +- hw/kvmvapic.c | 6 +++--- hw/kzm.c | 2 +- hw/lan9118.c | 2 +- hw/leon3.c | 2 +- hw/lm32_boards.c | 2 +- hw/lm32_sys.c | 2 +- hw/loader.c | 2 +- hw/lpc_ich9.c | 2 +- hw/lsi53c895a.c | 2 +- hw/m25p80.c | 2 +- hw/m48t59.c | 2 +- hw/mac_nvram.c | 2 +- hw/mainstone.c | 2 +- hw/mc146818rtc.c | 2 +- hw/mcf5206.c | 2 +- hw/mcf5208.c | 2 +- hw/megasas.c | 2 +- hw/microblaze_boot.c | 2 +- hw/milkymist-memcard.c | 4 ++-- hw/milkymist-sysctl.c | 2 +- hw/milkymist.c | 4 ++-- hw/mips_fulong2e.c | 4 ++-- hw/mips_jazz.c | 6 +++--- hw/mips_malta.c | 6 +++--- hw/mips_mipssim.c | 2 +- hw/mips_r4k.c | 4 ++-- hw/mpc8544_guts.c | 2 +- hw/multiboot.c | 2 +- hw/musicpal.c | 4 ++-- hw/nand.c | 2 +- hw/ne2000.c | 2 +- hw/nseries.c | 4 ++-- hw/omap1.c | 4 ++-- hw/omap2.c | 4 ++-- hw/omap_sx1.c | 2 +- hw/onenand.c | 2 +- hw/opencores_eth.c | 2 +- hw/openrisc_sim.c | 4 ++-- hw/palm.c | 2 +- hw/pam.c | 2 +- hw/parallel.c | 2 +- hw/pc.c | 8 ++++---- hw/pc_piix.c | 8 ++++---- hw/pc_q35.c | 4 ++-- hw/pc_sysfw.c | 6 +++--- hw/pci/pci-hotplug.c | 2 +- hw/pci/pci-stub.c | 2 +- hw/pci/pci.c | 2 +- hw/pci/pci.h | 2 +- hw/pci/pcie_aer.c | 2 +- hw/pckbd.c | 2 +- hw/pcnet-pci.c | 2 +- hw/pcnet.c | 2 +- hw/petalogix_ml605_mmu.c | 4 ++-- hw/petalogix_s3adsp1800_mmu.c | 4 ++-- hw/pl031.c | 2 +- hw/pl181.c | 2 +- hw/ppc.c | 4 ++-- hw/ppc/e500.c | 6 +++--- hw/ppc/e500plat.c | 4 ++-- hw/ppc/mpc8544ds.c | 2 +- hw/ppc405_boards.c | 4 ++-- hw/ppc405_uc.c | 2 +- hw/ppc440_bamboo.c | 6 +++--- hw/ppc_booke.c | 2 +- hw/ppc_newworld.c | 6 +++--- hw/ppc_oldworld.c | 6 +++--- hw/ppc_prep.c | 6 +++--- hw/ppce500_spin.c | 4 ++-- hw/ps2.c | 2 +- hw/pxa2xx.c | 4 ++-- hw/pxa2xx_lcd.c | 2 +- hw/pxa2xx_timer.c | 2 +- hw/qdev-monitor.c | 2 +- hw/qdev-properties.c | 2 +- hw/qdev.c | 2 +- hw/qxl.c | 2 +- hw/r2d.c | 4 ++-- hw/realview.c | 4 ++-- hw/rtl8139.c | 4 ++-- hw/s390-virtio-bus.c | 4 ++-- hw/s390-virtio.c | 6 +++--- hw/s390x/event-facility.c | 2 +- hw/s390x/sclp.c | 2 +- hw/s390x/sclpquiesce.c | 2 +- hw/scsi-bus.c | 4 ++-- hw/scsi-disk.c | 6 +++--- hw/scsi-generic.c | 2 +- hw/scsi.h | 2 +- hw/serial.h | 2 +- hw/sga.c | 2 +- hw/sh7750.c | 2 +- hw/shix.c | 2 +- hw/slavio_misc.c | 2 +- hw/smbios.c | 2 +- hw/smbus_ich9.c | 2 +- hw/spapr.c | 10 +++++----- hw/spapr.h | 2 +- hw/spapr_events.c | 4 ++-- hw/spapr_hcall.c | 4 ++-- hw/spapr_iommu.c | 4 ++-- hw/spapr_nvram.c | 2 +- hw/spapr_rtas.c | 4 ++-- hw/spapr_vio.c | 6 +++--- hw/spapr_vio.h | 2 +- hw/spitz.c | 4 ++-- hw/ssi-sd.c | 2 +- hw/strongarm.c | 2 +- hw/sun4m.c | 4 ++-- hw/sun4u.c | 4 ++-- hw/tc6393xb.c | 2 +- hw/tosa.c | 2 +- hw/twl92230.c | 2 +- hw/usb/bus.c | 2 +- hw/usb/dev-network.c | 2 +- hw/usb/dev-storage.c | 4 ++-- hw/usb/hcd-ehci.h | 4 ++-- hw/usb/hcd-uhci.c | 2 +- hw/usb/host-linux.c | 2 +- hw/usb/libhw.c | 2 +- hw/usb/redirect.c | 2 +- hw/versatilepb.c | 4 ++-- hw/vexpress.c | 4 ++-- hw/vfio_pci.c | 2 +- hw/virtex_ml507.c | 6 +++--- hw/virtio-balloon.c | 4 ++-- hw/virtio-blk.c | 2 +- hw/virtio-pci.c | 4 ++-- hw/virtio.h | 2 +- hw/vmport.c | 2 +- hw/vt82c686.c | 2 +- hw/watchdog.c | 2 +- hw/xen_backend.h | 2 +- hw/xen_devconfig.c | 2 +- hw/xen_disk.c | 2 +- hw/xen_machine_pv.c | 2 +- hw/xilinx_spi.c | 2 +- hw/xilinx_spips.c | 2 +- hw/xilinx_zynq.c | 4 ++-- hw/xtensa_lx60.c | 4 ++-- hw/xtensa_sim.c | 2 +- hw/z2.c | 4 ++-- hw/zynq_slcr.c | 2 +- arch_init.h => include/sysemu/arch_init.h | 0 balloon.h => include/sysemu/balloon.h | 0 blockdev.h => include/sysemu/blockdev.h | 0 cpus.h => include/sysemu/cpus.h | 0 device_tree.h => include/sysemu/device_tree.h | 0 dma.h => include/sysemu/dma.h | 2 +- dump.h => include/sysemu/dump.h | 0 kvm.h => include/sysemu/kvm.h | 0 .../sysemu/memory_mapping.h | 0 qemu-os-posix.h => include/sysemu/os-posix.h | 0 qemu-os-win32.h => include/sysemu/os-win32.h | 0 qtest.h => include/sysemu/qtest.h | 0 qemu-seccomp.h => include/sysemu/seccomp.h | 0 sysemu.h => include/sysemu/sysemu.h | 0 xen-mapcache.h => include/sysemu/xen-mapcache.h | 0 include/ui/spice-display.h | 2 +- kvm-all.c | 4 ++-- kvm-stub.c | 2 +- memory.c | 2 +- memory_mapping-stub.c | 2 +- memory_mapping.c | 2 +- migration.c | 2 +- monitor.c | 8 ++++---- net/tap-bsd.c | 2 +- net/tap-linux.c | 2 +- net/tap-solaris.c | 2 +- net/tap-win32.c | 2 +- net/tap.c | 2 +- os-posix.c | 2 +- os-win32.c | 2 +- oslib-posix.c | 2 +- oslib-win32.c | 2 +- qemu-char.c | 2 +- qemu-common.h | 4 ++-- qemu-img.c | 2 +- qemu-progress.c | 2 +- qemu-seccomp.c | 2 +- qemu-timer.c | 2 +- qemu-tool.c | 2 +- qmp.c | 8 ++++---- qtest.c | 6 +++--- savevm.c | 4 ++-- stubs/arch-query-cpu-def.c | 2 +- target-alpha/sys_helper.c | 2 +- target-arm/cpu.c | 2 +- target-arm/helper.c | 2 +- target-i386/arch_dump.c | 2 +- target-i386/arch_memory_mapping.c | 2 +- target-i386/cpu.c | 6 +++--- target-i386/excp_helper.c | 2 +- target-i386/helper.c | 4 ++-- target-i386/kvm.c | 4 ++-- target-i386/kvm_i386.h | 2 +- target-i386/machine.c | 2 +- target-m68k/m68k-semi.c | 2 +- target-ppc/helper.c | 4 ++-- target-ppc/kvm.c | 8 ++++---- target-ppc/kvm_ppc.c | 2 +- target-ppc/machine.c | 2 +- target-ppc/mmu_helper.c | 2 +- target-ppc/translate_init.c | 4 ++-- target-s390x/helper.c | 2 +- target-s390x/interrupt.c | 2 +- target-s390x/kvm.c | 6 +++--- target-s390x/misc_helper.c | 4 ++-- target-sparc/helper.c | 2 +- target-sparc/int32_helper.c | 2 +- target-xtensa/translate.c | 2 +- ui/cocoa.m | 2 +- ui/curses.c | 2 +- ui/input.c | 2 +- ui/keymaps.c | 2 +- ui/sdl.c | 2 +- ui/spice-core.c | 2 +- ui/spice-display.c | 2 +- ui/vnc.c | 2 +- vl.c | 16 ++++++++-------- xen-all.c | 2 +- xen-mapcache.c | 4 ++-- 296 files changed, 421 insertions(+), 421 deletions(-) rename arch_init.h => include/sysemu/arch_init.h (100%) rename balloon.h => include/sysemu/balloon.h (100%) rename blockdev.h => include/sysemu/blockdev.h (100%) rename cpus.h => include/sysemu/cpus.h (100%) rename device_tree.h => include/sysemu/device_tree.h (100%) rename dma.h => include/sysemu/dma.h (99%) rename dump.h => include/sysemu/dump.h (100%) rename kvm.h => include/sysemu/kvm.h (100%) rename memory_mapping.h => include/sysemu/memory_mapping.h (100%) rename qemu-os-posix.h => include/sysemu/os-posix.h (100%) rename qemu-os-win32.h => include/sysemu/os-win32.h (100%) rename qtest.h => include/sysemu/qtest.h (100%) rename qemu-seccomp.h => include/sysemu/seccomp.h (100%) rename sysemu.h => include/sysemu/sysemu.h (100%) rename xen-mapcache.h => include/sysemu/xen-mapcache.h (100%) diff --git a/arch_init.c b/arch_init.c index 9dacf5689b..a8b65416da 100644 --- a/arch_init.c +++ b/arch_init.c @@ -30,15 +30,15 @@ #endif #include "config.h" #include "monitor/monitor.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/bitops.h" #include "qemu/bitmap.h" -#include "arch_init.h" +#include "sysemu/arch_init.h" #include "audio/audio.h" #include "hw/pc.h" #include "hw/pci/pci.h" #include "hw/audiodev.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "migration/migration.h" #include "exec/gdbstub.h" #include "hw/smbios.h" diff --git a/audio/audio.c b/audio/audio.c index eb2222c10f..1510b598a6 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -25,7 +25,7 @@ #include "audio.h" #include "monitor/monitor.h" #include "qemu/timer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #define AUDIO_CAP "audio" #include "audio_int.h" diff --git a/audio/winwaveaudio.c b/audio/winwaveaudio.c index 72babbf184..8dbd145ca1 100644 --- a/audio/winwaveaudio.c +++ b/audio/winwaveaudio.c @@ -1,7 +1,7 @@ /* public domain */ #include "qemu-common.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "audio.h" #define AUDIO_CAP "winwave" diff --git a/balloon.c b/balloon.c index d1de4352b4..e321f2c688 100644 --- a/balloon.c +++ b/balloon.c @@ -26,8 +26,8 @@ #include "monitor/monitor.h" #include "exec/cpu-common.h" -#include "kvm.h" -#include "balloon.h" +#include "sysemu/kvm.h" +#include "sysemu/balloon.h" #include "trace.h" #include "qmp-commands.h" #include "qapi/qmp/qjson.h" diff --git a/block-migration.c b/block-migration.c index 4e865a6781..ca4ba3fffb 100644 --- a/block-migration.c +++ b/block-migration.c @@ -20,7 +20,7 @@ #include "qemu/timer.h" #include "migration/block.h" #include "migration/migration.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include #define BLOCK_SIZE (BDRV_SECTORS_PER_DIRTY_CHUNK << BDRV_SECTOR_BITS) diff --git a/block.c b/block.c index 1af4b99ee8..4e28c55bc7 100644 --- a/block.c +++ b/block.c @@ -29,7 +29,7 @@ #include "block/blockjob.h" #include "qemu/module.h" #include "qapi/qmp/qjson.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/notify.h" #include "block/coroutine.h" #include "qmp-commands.h" diff --git a/block/vdi.c b/block/vdi.c index 7b6231941b..021abaa227 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -58,7 +58,7 @@ #include #else /* TODO: move uuid emulation to some central place in QEMU. */ -#include "sysemu.h" /* UUID_FMT */ +#include "sysemu/sysemu.h" /* UUID_FMT */ typedef unsigned char uuid_t[16]; #endif diff --git a/blockdev-nbd.c b/blockdev-nbd.c index 95b621699a..dc4e9a2462 100644 --- a/blockdev-nbd.c +++ b/blockdev-nbd.c @@ -9,11 +9,11 @@ * later. See the COPYING file in the top-level directory. */ -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "hw/block-common.h" #include "monitor/monitor.h" #include "qapi/qmp/qerror.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qmp-commands.h" #include "trace.h" #include "block/nbd.h" diff --git a/blockdev.c b/blockdev.c index 3ebff44310..d724e2dc5b 100644 --- a/blockdev.c +++ b/blockdev.c @@ -7,7 +7,7 @@ * later. See the COPYING file in the top-level directory. */ -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "hw/block-common.h" #include "block/blockjob.h" #include "monitor/monitor.h" @@ -15,11 +15,11 @@ #include "qemu/option.h" #include "qemu/config-file.h" #include "qapi/qmp/types.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "block/block_int.h" #include "qmp-commands.h" #include "trace.h" -#include "arch_init.h" +#include "sysemu/arch_init.h" static QTAILQ_HEAD(drivelist, DriveInfo) drives = QTAILQ_HEAD_INITIALIZER(drives); diff --git a/cpu-exec.c b/cpu-exec.c index 54e62ed551..19ebb4a924 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -21,7 +21,7 @@ #include "disas/disas.h" #include "tcg.h" #include "qemu/atomic.h" -#include "qtest.h" +#include "sysemu/qtest.h" int tb_invalidated_flag; diff --git a/cpus.c b/cpus.c index 036418d62c..4a7782a541 100644 --- a/cpus.c +++ b/cpus.c @@ -26,15 +26,15 @@ #include "config-host.h" #include "monitor/monitor.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "exec/gdbstub.h" -#include "dma.h" -#include "kvm.h" +#include "sysemu/dma.h" +#include "sysemu/kvm.h" #include "qmp-commands.h" #include "qemu/thread.h" -#include "cpus.h" -#include "qtest.h" +#include "sysemu/cpus.h" +#include "sysemu/qtest.h" #include "qemu/main-loop.h" #include "qemu/bitmap.h" diff --git a/device_tree.c b/device_tree.c index c3e1ba4904..56af24b397 100644 --- a/device_tree.c +++ b/device_tree.c @@ -20,7 +20,7 @@ #include "config.h" #include "qemu-common.h" -#include "device_tree.h" +#include "sysemu/device_tree.h" #include "hw/loader.h" #include "qemu/option.h" #include "qemu/config-file.h" diff --git a/dma-helpers.c b/dma-helpers.c index e6a6dd82fd..272632f367 100644 --- a/dma-helpers.c +++ b/dma-helpers.c @@ -7,7 +7,7 @@ * (GNU GPL), version 2 or later. */ -#include "dma.h" +#include "sysemu/dma.h" #include "trace.h" #include "qemu/range.h" #include "qemu/thread.h" diff --git a/dump-stub.c b/dump-stub.c index 0842e6f916..a9d0b3c67b 100644 --- a/dump-stub.c +++ b/dump-stub.c @@ -12,7 +12,7 @@ */ #include "qemu-common.h" -#include "dump.h" +#include "sysemu/dump.h" #include "qapi/qmp/qerror.h" #include "qmp-commands.h" diff --git a/dump.c b/dump.c index 871ee1727a..a26b1a5e1a 100644 --- a/dump.c +++ b/dump.c @@ -17,10 +17,10 @@ #include "exec/cpu-all.h" #include "exec/hwaddr.h" #include "monitor/monitor.h" -#include "kvm.h" -#include "dump.h" -#include "sysemu.h" -#include "memory_mapping.h" +#include "sysemu/kvm.h" +#include "sysemu/dump.h" +#include "sysemu/sysemu.h" +#include "sysemu/memory_mapping.h" #include "qapi/error.h" #include "qmp-commands.h" #include "exec/gdbstub.h" diff --git a/exec.c b/exec.c index 917bec0ecd..28abd7e710 100644 --- a/exec.c +++ b/exec.c @@ -30,17 +30,17 @@ #include "hw/hw.h" #include "hw/qdev.h" #include "qemu/osdep.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "hw/xen.h" #include "qemu/timer.h" #include "qemu/config-file.h" #include "exec/memory.h" -#include "dma.h" +#include "sysemu/dma.h" #include "exec/address-spaces.h" #if defined(CONFIG_USER_ONLY) #include #else /* !CONFIG_USER_ONLY */ -#include "xen-mapcache.h" +#include "sysemu/xen-mapcache.h" #include "trace.h" #endif diff --git a/gdbstub.c b/gdbstub.c index 4b178a608f..2fca1a7ebf 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -31,7 +31,7 @@ #else #include "monitor/monitor.h" #include "qemu-char.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "exec/gdbstub.h" #endif @@ -39,7 +39,7 @@ #include "cpu.h" #include "qemu/sockets.h" -#include "kvm.h" +#include "sysemu/kvm.h" #ifndef TARGET_CPU_MEMORY_RW_DEBUG static inline int target_memory_rw_debug(CPUArchState *env, target_ulong addr, diff --git a/hw/ac97.c b/hw/ac97.c index 3e659b38df..5cd19c1d02 100644 --- a/hw/ac97.c +++ b/hw/ac97.c @@ -21,7 +21,7 @@ #include "audiodev.h" #include "audio/audio.h" #include "pci/pci.h" -#include "dma.h" +#include "sysemu/dma.h" enum { AC97_Reset = 0x00, diff --git a/hw/acpi.c b/hw/acpi.c index fe9b76a9b0..97617c4ef5 100644 --- a/hw/acpi.c +++ b/hw/acpi.c @@ -18,7 +18,7 @@ * Contributions after 2012-01-13 are licensed under the terms of the * GNU GPL, version 2 or (at your option) any later version. */ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "hw.h" #include "pc.h" #include "acpi.h" diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c index 8d1a689a36..37a50e6d7b 100644 --- a/hw/acpi_ich9.c +++ b/hw/acpi_ich9.c @@ -27,9 +27,9 @@ #include "pc.h" #include "pci/pci.h" #include "qemu/timer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "acpi.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "exec/address-spaces.h" #include "ich9.h" diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index ebd015dc02..f53b969aa6 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -24,7 +24,7 @@ #include "pm_smbus.h" #include "pci/pci.h" #include "acpi.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/range.h" #include "exec/ioport.h" #include "fw_cfg.h" diff --git a/hw/alpha_dp264.c b/hw/alpha_dp264.c index 76d8ae8a84..e7e52c1f1c 100644 --- a/hw/alpha_dp264.c +++ b/hw/alpha_dp264.c @@ -11,7 +11,7 @@ #include "loader.h" #include "boards.h" #include "alpha_sys.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "mc146818rtc.h" #include "ide.h" #include "i8254.h" diff --git a/hw/alpha_pci.c b/hw/alpha_pci.c index 78d93e55ec..7327d488fd 100644 --- a/hw/alpha_pci.c +++ b/hw/alpha_pci.c @@ -9,7 +9,7 @@ #include "config.h" #include "alpha_sys.h" #include "qemu/log.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" /* PCI IO reads/writes, to byte-word addressable memory. */ diff --git a/hw/alpha_typhoon.c b/hw/alpha_typhoon.c index d61b2f483c..9f233d99f5 100644 --- a/hw/alpha_typhoon.c +++ b/hw/alpha_typhoon.c @@ -10,7 +10,7 @@ #include "exec/exec-all.h" #include "hw.h" #include "devices.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "alpha_sys.h" #include "exec/address-spaces.h" diff --git a/hw/apb_pci.c b/hw/apb_pci.c index 144a7cc8d3..c22e2b0fc3 100644 --- a/hw/apb_pci.c +++ b/hw/apb_pci.c @@ -32,7 +32,7 @@ #include "pci/pci_bridge.h" #include "pci/pci_bus.h" #include "apb_pci.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "exec/address-spaces.h" /* debug APB */ diff --git a/hw/apic_common.c b/hw/apic_common.c index 5f542764eb..0658be93c1 100644 --- a/hw/apic_common.c +++ b/hw/apic_common.c @@ -20,7 +20,7 @@ #include "apic.h" #include "apic_internal.h" #include "trace.h" -#include "kvm.h" +#include "sysemu/kvm.h" static int apic_irq_delivered; bool apic_report_tpr_access; diff --git a/hw/arm_boot.c b/hw/arm_boot.c index bb9889fbef..115f583876 100644 --- a/hw/arm_boot.c +++ b/hw/arm_boot.c @@ -10,11 +10,11 @@ #include "config.h" #include "hw.h" #include "arm-misc.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "loader.h" #include "elf.h" -#include "device_tree.h" +#include "sysemu/device_tree.h" #include "qemu/config-file.h" #define KERNEL_ARGS_ADDR 0x100 diff --git a/hw/arm_sysctl.c b/hw/arm_sysctl.c index 0884f6275c..b733617aa0 100644 --- a/hw/arm_sysctl.c +++ b/hw/arm_sysctl.c @@ -11,7 +11,7 @@ #include "qemu/timer.h" #include "sysbus.h" #include "primecell.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #define LOCK_VALUE 0xa05f diff --git a/hw/axis_dev88.c b/hw/axis_dev88.c index e537aecc78..2ca606b835 100644 --- a/hw/axis_dev88.c +++ b/hw/axis_dev88.c @@ -30,7 +30,7 @@ #include "loader.h" #include "elf.h" #include "cris-boot.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" #define D(x) diff --git a/hw/block-common.c b/hw/block-common.c index c24208e560..0f1b64ec95 100644 --- a/hw/block-common.c +++ b/hw/block-common.c @@ -7,7 +7,7 @@ * later. See the COPYING file in the top-level directory. */ -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "hw/block-common.h" #include "qemu/error-report.h" diff --git a/hw/boards.h b/hw/boards.h index c66fa16a9d..4540e952f7 100644 --- a/hw/boards.h +++ b/hw/boards.h @@ -3,7 +3,7 @@ #ifndef HW_BOARDS_H #define HW_BOARDS_H -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "qdev.h" typedef struct QEMUMachineInitArgs { diff --git a/hw/bonito.c b/hw/bonito.c index 78e264ccc0..0498c9be79 100644 --- a/hw/bonito.c +++ b/hw/bonito.c @@ -44,7 +44,7 @@ #include "pc.h" #include "mips.h" #include "pci/pci_host.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "exec/address-spaces.h" //#define DEBUG_BONITO diff --git a/hw/cbus.c b/hw/cbus.c index 7216899a09..6fd3905448 100644 --- a/hw/cbus.c +++ b/hw/cbus.c @@ -23,7 +23,7 @@ #include "qemu-common.h" #include "irq.h" #include "devices.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" //#define DEBUG diff --git a/hw/collie.c b/hw/collie.c index faf5ac9ac7..804d61a421 100644 --- a/hw/collie.c +++ b/hw/collie.c @@ -15,7 +15,7 @@ #include "strongarm.h" #include "arm-misc.h" #include "flash.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" static struct arm_boot_info collie_binfo = { diff --git a/hw/cuda.c b/hw/cuda.c index cf83956e1a..d59e0aeaa9 100644 --- a/hw/cuda.c +++ b/hw/cuda.c @@ -26,7 +26,7 @@ #include "ppc_mac.h" #include "adb.h" #include "qemu/timer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" /* XXX: implement all timer modes */ diff --git a/hw/device-hotplug.c b/hw/device-hotplug.c index 34543786e5..88da145a89 100644 --- a/hw/device-hotplug.c +++ b/hw/device-hotplug.c @@ -24,9 +24,9 @@ #include "hw.h" #include "boards.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "qemu/config-file.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "monitor/monitor.h" DriveInfo *add_init_drive(const char *optstr) diff --git a/hw/e1000.c b/hw/e1000.c index aeee3e61f4..92fb00a89f 100644 --- a/hw/e1000.c +++ b/hw/e1000.c @@ -30,8 +30,8 @@ #include "net/net.h" #include "net/checksum.h" #include "loader.h" -#include "sysemu.h" -#include "dma.h" +#include "sysemu/sysemu.h" +#include "sysemu/dma.h" #include "e1000_hw.h" diff --git a/hw/eepro100.c b/hw/eepro100.c index 9e2be4ea0d..6bbefb505f 100644 --- a/hw/eepro100.c +++ b/hw/eepro100.c @@ -45,8 +45,8 @@ #include "pci/pci.h" #include "net/net.h" #include "eeprom93xx.h" -#include "sysemu.h" -#include "dma.h" +#include "sysemu/sysemu.h" +#include "sysemu/dma.h" /* QEMU sends frames smaller than 60 bytes to ethernet nics. * Such frames are rejected by real nics and their emulations. diff --git a/hw/es1370.c b/hw/es1370.c index 65365788e1..59c3f2329e 100644 --- a/hw/es1370.c +++ b/hw/es1370.c @@ -30,7 +30,7 @@ #include "audiodev.h" #include "audio/audio.h" #include "pci/pci.h" -#include "dma.h" +#include "sysemu/dma.h" /* Missing stuff: SCTRL_P[12](END|ST)INC diff --git a/hw/etraxfs_dma.c b/hw/etraxfs_dma.c index 089267fcc1..d41500316f 100644 --- a/hw/etraxfs_dma.c +++ b/hw/etraxfs_dma.c @@ -26,7 +26,7 @@ #include "hw.h" #include "exec/address-spaces.h" #include "qemu-common.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "etraxfs_dma.h" diff --git a/hw/etraxfs_timer.c b/hw/etraxfs_timer.c index cc8b327715..e9273cd95d 100644 --- a/hw/etraxfs_timer.c +++ b/hw/etraxfs_timer.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "sysbus.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/timer.h" #include "ptimer.h" diff --git a/hw/exynos4210.c b/hw/exynos4210.c index 22148cd946..a7b84d61a0 100644 --- a/hw/exynos4210.c +++ b/hw/exynos4210.c @@ -22,7 +22,7 @@ */ #include "boards.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "sysbus.h" #include "arm-misc.h" #include "loader.h" diff --git a/hw/exynos4210_rtc.c b/hw/exynos4210_rtc.c index 6ebc9b1790..5694a6207b 100644 --- a/hw/exynos4210_rtc.c +++ b/hw/exynos4210_rtc.c @@ -32,7 +32,7 @@ #include "hw.h" #include "qemu/timer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "exynos4210.h" diff --git a/hw/exynos4210_uart.c b/hw/exynos4210_uart.c index 20dcd9fb57..8950891a00 100644 --- a/hw/exynos4210_uart.c +++ b/hw/exynos4210_uart.c @@ -20,7 +20,7 @@ */ #include "sysbus.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu-char.h" #include "exynos4210.h" diff --git a/hw/exynos4_boards.c b/hw/exynos4_boards.c index 5dd2961459..b26796847b 100644 --- a/hw/exynos4_boards.c +++ b/hw/exynos4_boards.c @@ -21,7 +21,7 @@ * */ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "sysbus.h" #include "net/net.h" #include "arm-misc.h" diff --git a/hw/fdc.c b/hw/fdc.c index b67d3a574b..ddc0cc3819 100644 --- a/hw/fdc.c +++ b/hw/fdc.c @@ -34,8 +34,8 @@ #include "isa.h" #include "sysbus.h" #include "qdev-addr.h" -#include "blockdev.h" -#include "sysemu.h" +#include "sysemu/blockdev.h" +#include "sysemu/sysemu.h" #include "qemu/log.h" /********************************************************/ diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c index 2a00163a04..26f7125fe2 100644 --- a/hw/fw_cfg.c +++ b/hw/fw_cfg.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "hw.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "isa.h" #include "fw_cfg.h" #include "sysbus.h" diff --git a/hw/gumstix.c b/hw/gumstix.c index 4acb32c2a9..6fb068386c 100644 --- a/hw/gumstix.c +++ b/hw/gumstix.c @@ -40,7 +40,7 @@ #include "flash.h" #include "devices.h" #include "boards.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" static const int sector_len = 128 * 1024; diff --git a/hw/highbank.c b/hw/highbank.c index 6f5f2a9d9d..6005622f3a 100644 --- a/hw/highbank.c +++ b/hw/highbank.c @@ -22,10 +22,10 @@ #include "devices.h" #include "loader.h" #include "net/net.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "sysbus.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" #define SMP_BOOT_ADDR 0x100 diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index d38c6e4574..d0724499c7 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -28,7 +28,7 @@ #include #include "monitor/monitor.h" -#include "dma.h" +#include "sysemu/dma.h" #include "exec/cpu-common.h" #include "internal.h" #include diff --git a/hw/ide/cmd646.c b/hw/ide/cmd646.c index f6d15b9f2a..ee855b670f 100644 --- a/hw/ide/cmd646.c +++ b/hw/ide/cmd646.c @@ -27,8 +27,8 @@ #include #include #include "block/block.h" -#include "sysemu.h" -#include "dma.h" +#include "sysemu/sysemu.h" +#include "sysemu/dma.h" #include diff --git a/hw/ide/core.c b/hw/ide/core.c index bf65cb407e..6f1938a0a8 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -28,10 +28,10 @@ #include #include "qemu/error-report.h" #include "qemu/timer.h" -#include "sysemu.h" -#include "dma.h" +#include "sysemu/sysemu.h" +#include "sysemu/dma.h" #include "hw/block-common.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include diff --git a/hw/ide/ich.c b/hw/ide/ich.c index 3457b98cc1..de39b3067a 100644 --- a/hw/ide/ich.c +++ b/hw/ide/ich.c @@ -66,7 +66,7 @@ #include #include #include "block/block.h" -#include "dma.h" +#include "sysemu/dma.h" #include #include diff --git a/hw/ide/internal.h b/hw/ide/internal.h index c5016f0cea..d80360e85b 100644 --- a/hw/ide/internal.h +++ b/hw/ide/internal.h @@ -9,8 +9,8 @@ #include #include #include "exec/iorange.h" -#include "dma.h" -#include "sysemu.h" +#include "sysemu/dma.h" +#include "sysemu/sysemu.h" #include "hw/block-common.h" #include "hw/scsi-defs.h" diff --git a/hw/ide/isa.c b/hw/ide/isa.c index 39df87c608..aa0e7fa22d 100644 --- a/hw/ide/isa.c +++ b/hw/ide/isa.c @@ -26,7 +26,7 @@ #include #include #include "block/block.h" -#include "dma.h" +#include "sysemu/dma.h" #include diff --git a/hw/ide/macio.c b/hw/ide/macio.c index 87cbb0c31e..d8f9b4bce1 100644 --- a/hw/ide/macio.c +++ b/hw/ide/macio.c @@ -26,7 +26,7 @@ #include #include #include "block/block.h" -#include "dma.h" +#include "sysemu/dma.h" #include diff --git a/hw/ide/microdrive.c b/hw/ide/microdrive.c index 6cce5230c5..642774ef98 100644 --- a/hw/ide/microdrive.c +++ b/hw/ide/microdrive.c @@ -26,7 +26,7 @@ #include #include #include "block/block.h" -#include "dma.h" +#include "sysemu/dma.h" #include diff --git a/hw/ide/mmio.c b/hw/ide/mmio.c index 40443513be..eb59976eda 100644 --- a/hw/ide/mmio.c +++ b/hw/ide/mmio.c @@ -24,7 +24,7 @@ */ #include #include "block/block.h" -#include "dma.h" +#include "sysemu/dma.h" #include diff --git a/hw/ide/pci.c b/hw/ide/pci.c index 8821d5cceb..e6226e3197 100644 --- a/hw/ide/pci.c +++ b/hw/ide/pci.c @@ -27,7 +27,7 @@ #include #include #include "block/block.h" -#include "dma.h" +#include "sysemu/dma.h" #include diff --git a/hw/ide/piix.c b/hw/ide/piix.c index 5cf39cf8f0..df95aec195 100644 --- a/hw/ide/piix.c +++ b/hw/ide/piix.c @@ -27,9 +27,9 @@ #include #include #include -#include "blockdev.h" -#include "sysemu.h" -#include "dma.h" +#include "sysemu/blockdev.h" +#include "sysemu/sysemu.h" +#include "sysemu/dma.h" #include diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c index c85e1ac018..d2fe77398f 100644 --- a/hw/ide/qdev.c +++ b/hw/ide/qdev.c @@ -17,12 +17,12 @@ * License along with this library; if not, see . */ #include -#include "dma.h" +#include "sysemu/dma.h" #include "qemu/error-report.h" #include -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "hw/block-common.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" /* --------------------------------- */ diff --git a/hw/ide/via.c b/hw/ide/via.c index 880f61cc8e..14acb3ac04 100644 --- a/hw/ide/via.c +++ b/hw/ide/via.c @@ -28,8 +28,8 @@ #include #include #include "block/block.h" -#include "sysemu.h" -#include "dma.h" +#include "sysemu/sysemu.h" +#include "sysemu/dma.h" #include diff --git a/hw/imx_ccm.c b/hw/imx_ccm.c index f2e623cd29..46962e4df9 100644 --- a/hw/imx_ccm.c +++ b/hw/imx_ccm.c @@ -12,7 +12,7 @@ #include "hw.h" #include "sysbus.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "imx.h" #define CKIH_FREQ 26000000 /* 26MHz crystal input */ diff --git a/hw/imx_serial.c b/hw/imx_serial.c index dcd125fd25..e56e3ea726 100644 --- a/hw/imx_serial.c +++ b/hw/imx_serial.c @@ -19,7 +19,7 @@ #include "hw.h" #include "sysbus.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu-char.h" #include "imx.h" diff --git a/hw/integratorcp.c b/hw/integratorcp.c index c995dc724f..47fc9cb944 100644 --- a/hw/integratorcp.c +++ b/hw/integratorcp.c @@ -13,7 +13,7 @@ #include "arm-misc.h" #include "net/net.h" #include "exec/address-spaces.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" typedef struct { SysBusDevice busdev; diff --git a/hw/intel-hda.c b/hw/intel-hda.c index 7ef3a15e08..98ff93679d 100644 --- a/hw/intel-hda.c +++ b/hw/intel-hda.c @@ -24,7 +24,7 @@ #include "audiodev.h" #include "intel-hda.h" #include "intel-hda-defs.h" -#include "dma.h" +#include "sysemu/dma.h" /* --------------------------------------------------------------------- */ /* hda bus */ diff --git a/hw/isa-bus.c b/hw/isa-bus.c index a2be67df56..86b0bbd3d1 100644 --- a/hw/isa-bus.c +++ b/hw/isa-bus.c @@ -19,7 +19,7 @@ #include "hw.h" #include "monitor/monitor.h" #include "sysbus.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "isa.h" #include "exec/address-spaces.h" diff --git a/hw/ivshmem.c b/hw/ivshmem.c index af34f3b582..567c9a76a7 100644 --- a/hw/ivshmem.c +++ b/hw/ivshmem.c @@ -20,7 +20,7 @@ #include "pc.h" #include "pci/pci.h" #include "pci/msix.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "migration/migration.h" #include "qapi/qmp/qerror.h" #include "qemu/event_notifier.h" diff --git a/hw/kvm/apic.c b/hw/kvm/apic.c index beb418de8d..dad2f21c18 100644 --- a/hw/kvm/apic.c +++ b/hw/kvm/apic.c @@ -11,7 +11,7 @@ */ #include "hw/apic_internal.h" #include "hw/pci/msi.h" -#include "kvm.h" +#include "sysemu/kvm.h" static inline void kvm_apic_set_reg(struct kvm_lapic_state *kapic, int reg_id, uint32_t val) diff --git a/hw/kvm/clock.c b/hw/kvm/clock.c index 824b978397..6fcca95ada 100644 --- a/hw/kvm/clock.c +++ b/hw/kvm/clock.c @@ -14,8 +14,8 @@ */ #include "qemu-common.h" -#include "sysemu.h" -#include "kvm.h" +#include "sysemu/sysemu.h" +#include "sysemu/kvm.h" #include "hw/sysbus.h" #include "hw/kvm/clock.h" diff --git a/hw/kvm/i8254.c b/hw/kvm/i8254.c index 8ee1c352cf..57faf64ab2 100644 --- a/hw/kvm/i8254.c +++ b/hw/kvm/i8254.c @@ -23,10 +23,10 @@ * THE SOFTWARE. */ #include "qemu/timer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "hw/i8254.h" #include "hw/i8254_internal.h" -#include "kvm.h" +#include "sysemu/kvm.h" #define KVM_PIT_REINJECT_BIT 0 diff --git a/hw/kvm/i8259.c b/hw/kvm/i8259.c index 1e24cd4f36..70e1d185de 100644 --- a/hw/kvm/i8259.c +++ b/hw/kvm/i8259.c @@ -11,7 +11,7 @@ */ #include "hw/i8259_internal.h" #include "hw/apic_internal.h" -#include "kvm.h" +#include "sysemu/kvm.h" static void kvm_pic_get(PICCommonState *s) { diff --git a/hw/kvm/ioapic.c b/hw/kvm/ioapic.c index f95c157591..30db6230b4 100644 --- a/hw/kvm/ioapic.c +++ b/hw/kvm/ioapic.c @@ -13,7 +13,7 @@ #include "hw/pc.h" #include "hw/ioapic_internal.h" #include "hw/apic_internal.h" -#include "kvm.h" +#include "sysemu/kvm.h" /* PC Utility function */ void kvm_pc_setup_irq_routing(bool pci_enabled) diff --git a/hw/kvm/pci-assign.c b/hw/kvm/pci-assign.c index 2f06c27e83..410b6c6eeb 100644 --- a/hw/kvm/pci-assign.c +++ b/hw/kvm/pci-assign.c @@ -33,7 +33,7 @@ #include "hw/loader.h" #include "monitor/monitor.h" #include "qemu/range.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "hw/pci/pci.h" #include "hw/pci/msi.h" #include "kvm_i386.h" diff --git a/hw/kvmvapic.c b/hw/kvmvapic.c index 60c8fc46aa..81f4bcfdf6 100644 --- a/hw/kvmvapic.c +++ b/hw/kvmvapic.c @@ -8,9 +8,9 @@ * (at your option) any later version. See the COPYING file in the * top-level directory. */ -#include "sysemu.h" -#include "cpus.h" -#include "kvm.h" +#include "sysemu/sysemu.h" +#include "sysemu/cpus.h" +#include "sysemu/kvm.h" #include "apic_internal.h" #define APIC_DEFAULT_ADDRESS 0xfee00000 diff --git a/hw/kzm.c b/hw/kzm.c index 9f92d30928..fd00af921e 100644 --- a/hw/kzm.c +++ b/hw/kzm.c @@ -19,7 +19,7 @@ #include "arm-misc.h" #include "devices.h" #include "net/net.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "serial.h" #include "imx.h" diff --git a/hw/lan9118.c b/hw/lan9118.c index 4c72d0d98e..5adf91199b 100644 --- a/hw/lan9118.c +++ b/hw/lan9118.c @@ -13,7 +13,7 @@ #include "sysbus.h" #include "net/net.h" #include "devices.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "ptimer.h" /* For crc32 */ #include diff --git a/hw/leon3.c b/hw/leon3.c index 776ab97a78..d1d4541867 100644 --- a/hw/leon3.c +++ b/hw/leon3.c @@ -25,7 +25,7 @@ #include "qemu/timer.h" #include "ptimer.h" #include "qemu-char.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "loader.h" #include "elf.h" diff --git a/hw/lm32_boards.c b/hw/lm32_boards.c index 81afdf675c..42e8b6b52a 100644 --- a/hw/lm32_boards.c +++ b/hw/lm32_boards.c @@ -23,7 +23,7 @@ #include "devices.h" #include "boards.h" #include "loader.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "elf.h" #include "lm32_hwsetup.h" #include "lm32.h" diff --git a/hw/lm32_sys.c b/hw/lm32_sys.c index b3350890cb..e3a9db9748 100644 --- a/hw/lm32_sys.c +++ b/hw/lm32_sys.c @@ -33,7 +33,7 @@ #include "trace.h" #include "qemu/log.h" #include "qemu/error-report.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/log.h" enum { diff --git a/hw/loader.c b/hw/loader.c index f5ef575b52..3f59fcd14a 100644 --- a/hw/loader.c +++ b/hw/loader.c @@ -45,7 +45,7 @@ #include "hw.h" #include "disas/disas.h" #include "monitor/monitor.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "uboot_image.h" #include "loader.h" #include "fw_cfg.h" diff --git a/hw/lpc_ich9.c b/hw/lpc_ich9.c index 76217a74fc..a068715c04 100644 --- a/hw/lpc_ich9.c +++ b/hw/lpc_ich9.c @@ -44,7 +44,7 @@ #include "pam.h" #include "pci/pci_bus.h" #include "exec/address-spaces.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" static int ich9_lpc_sci_irq(ICH9LPCState *lpc); diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c index 4aac9a0cff..0aafb00b58 100644 --- a/hw/lsi53c895a.c +++ b/hw/lsi53c895a.c @@ -15,7 +15,7 @@ #include "hw.h" #include "pci/pci.h" #include "scsi.h" -#include "dma.h" +#include "sysemu/dma.h" //#define DEBUG_LSI //#define DEBUG_LSI_REG diff --git a/hw/m25p80.c b/hw/m25p80.c index 3895e73957..d39265632b 100644 --- a/hw/m25p80.c +++ b/hw/m25p80.c @@ -22,7 +22,7 @@ */ #include "hw.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "ssi.h" #include "devices.h" diff --git a/hw/m48t59.c b/hw/m48t59.c index 301b10ce79..393c5c049a 100644 --- a/hw/m48t59.c +++ b/hw/m48t59.c @@ -24,7 +24,7 @@ #include "hw.h" #include "nvram.h" #include "qemu/timer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "sysbus.h" #include "isa.h" #include "exec/address-spaces.h" diff --git a/hw/mac_nvram.c b/hw/mac_nvram.c index a0d14dd3c5..71093c2b10 100644 --- a/hw/mac_nvram.c +++ b/hw/mac_nvram.c @@ -24,7 +24,7 @@ */ #include "hw.h" #include "firmware_abi.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "ppc_mac.h" /* debug NVR */ diff --git a/hw/mainstone.c b/hw/mainstone.c index 80d6a9d54d..a5ddbeff9d 100644 --- a/hw/mainstone.c +++ b/hw/mainstone.c @@ -18,7 +18,7 @@ #include "devices.h" #include "boards.h" #include "flash.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "sysbus.h" #include "exec/address-spaces.h" diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c index fba75029df..2ddd7de09e 100644 --- a/hw/mc146818rtc.c +++ b/hw/mc146818rtc.c @@ -23,7 +23,7 @@ */ #include "hw.h" #include "qemu/timer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "mc146818rtc.h" #include "qapi/visitor.h" diff --git a/hw/mcf5206.c b/hw/mcf5206.c index fbc806ac18..fe7a48864f 100644 --- a/hw/mcf5206.c +++ b/hw/mcf5206.c @@ -9,7 +9,7 @@ #include "mcf.h" #include "qemu/timer.h" #include "ptimer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "exec/address-spaces.h" /* General purpose timer module. */ diff --git a/hw/mcf5208.c b/hw/mcf5208.c index fea8a69262..c1816cc9d1 100644 --- a/hw/mcf5208.c +++ b/hw/mcf5208.c @@ -9,7 +9,7 @@ #include "mcf.h" #include "qemu/timer.h" #include "ptimer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "net/net.h" #include "boards.h" #include "loader.h" diff --git a/hw/megasas.c b/hw/megasas.c index e80c0d1c25..eb191f5e12 100644 --- a/hw/megasas.c +++ b/hw/megasas.c @@ -20,7 +20,7 @@ #include "hw.h" #include "pci/pci.h" -#include "dma.h" +#include "sysemu/dma.h" #include "pci/msix.h" #include "qemu/iov.h" #include "scsi.h" diff --git a/hw/microblaze_boot.c b/hw/microblaze_boot.c index 76d33021c0..3ec5c0f7dd 100644 --- a/hw/microblaze_boot.c +++ b/hw/microblaze_boot.c @@ -27,7 +27,7 @@ #include "qemu/option.h" #include "qemu/config-file.h" #include "qemu-common.h" -#include "device_tree.h" +#include "sysemu/device_tree.h" #include "loader.h" #include "elf.h" diff --git a/hw/milkymist-memcard.c b/hw/milkymist-memcard.c index 5dc30ace60..f80befc53a 100644 --- a/hw/milkymist-memcard.c +++ b/hw/milkymist-memcard.c @@ -23,10 +23,10 @@ #include "hw.h" #include "sysbus.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "trace.h" #include "qemu/error-report.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "sd.h" enum { diff --git a/hw/milkymist-sysctl.c b/hw/milkymist-sysctl.c index 519462afcc..796e795f04 100644 --- a/hw/milkymist-sysctl.c +++ b/hw/milkymist-sysctl.c @@ -23,7 +23,7 @@ #include "hw.h" #include "sysbus.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "trace.h" #include "qemu/timer.h" #include "ptimer.h" diff --git a/hw/milkymist.c b/hw/milkymist.c index 588522260b..0c23b672f3 100644 --- a/hw/milkymist.c +++ b/hw/milkymist.c @@ -20,12 +20,12 @@ #include "sysbus.h" #include "hw.h" #include "flash.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "devices.h" #include "boards.h" #include "loader.h" #include "elf.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "milkymist-hw.h" #include "lm32.h" #include "exec/address-spaces.h" diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c index 60dd8c69bb..e7eeda319e 100644 --- a/hw/mips_fulong2e.c +++ b/hw/mips_fulong2e.c @@ -31,7 +31,7 @@ #include "mips_cpudevs.h" #include "pci/pci.h" #include "qemu-char.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "audio/audio.h" #include "qemu/log.h" #include "loader.h" @@ -41,7 +41,7 @@ #include "vt82c686.h" #include "mc146818rtc.h" #include "i8254.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" #define DEBUG_FULONG2E_INIT diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c index 0befc99210..63df2a734b 100644 --- a/hw/mips_jazz.c +++ b/hw/mips_jazz.c @@ -29,8 +29,8 @@ #include "serial.h" #include "isa.h" #include "fdc.h" -#include "sysemu.h" -#include "arch_init.h" +#include "sysemu/sysemu.h" +#include "sysemu/arch_init.h" #include "boards.h" #include "net/net.h" #include "esp.h" @@ -39,7 +39,7 @@ #include "mc146818rtc.h" #include "i8254.h" #include "pcspk.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "sysbus.h" #include "exec/address-spaces.h" diff --git a/hw/mips_malta.c b/hw/mips_malta.c index 04c7a2612c..bd31ced29d 100644 --- a/hw/mips_malta.c +++ b/hw/mips_malta.c @@ -35,8 +35,8 @@ #include "mips_cpudevs.h" #include "pci/pci.h" #include "qemu-char.h" -#include "sysemu.h" -#include "arch_init.h" +#include "sysemu/sysemu.h" +#include "sysemu/arch_init.h" #include "boards.h" #include "qemu/log.h" #include "mips-bios.h" @@ -45,7 +45,7 @@ #include "elf.h" #include "mc146818rtc.h" #include "i8254.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" #include "sysbus.h" /* SysBusDevice */ diff --git a/hw/mips_mipssim.c b/hw/mips_mipssim.c index ac7dfa9b74..67066c0ca1 100644 --- a/hw/mips_mipssim.c +++ b/hw/mips_mipssim.c @@ -30,7 +30,7 @@ #include "serial.h" #include "isa.h" #include "net/net.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "mips-bios.h" #include "loader.h" diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c index 511e1e41c0..59c43e591c 100644 --- a/hw/mips_r4k.c +++ b/hw/mips_r4k.c @@ -14,7 +14,7 @@ #include "serial.h" #include "isa.h" #include "net/net.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "flash.h" #include "qemu/log.h" @@ -24,7 +24,7 @@ #include "elf.h" #include "mc146818rtc.h" #include "i8254.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" #define MAX_IDE_BUS 2 diff --git a/hw/mpc8544_guts.c b/hw/mpc8544_guts.c index 873cb8cbfc..84522e9722 100644 --- a/hw/mpc8544_guts.c +++ b/hw/mpc8544_guts.c @@ -18,7 +18,7 @@ */ #include "hw.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "sysbus.h" #define MPC8544_GUTS_MMIO_SIZE 0x1000 diff --git a/hw/multiboot.c b/hw/multiboot.c index 09ec5b2539..c4ec2e34a7 100644 --- a/hw/multiboot.c +++ b/hw/multiboot.c @@ -27,7 +27,7 @@ #include "multiboot.h" #include "loader.h" #include "elf.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" /* Show multiboot debug output */ //#define DEBUG_MULTIBOOT diff --git a/hw/musicpal.c b/hw/musicpal.c index 5a7bf8bee1..77a585eee6 100644 --- a/hw/musicpal.c +++ b/hw/musicpal.c @@ -13,7 +13,7 @@ #include "arm-misc.h" #include "devices.h" #include "net/net.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "serial.h" #include "qemu/timer.h" @@ -22,7 +22,7 @@ #include "flash.h" #include "ui/console.h" #include "i2c.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" #include "ui/pixel_ops.h" diff --git a/hw/nand.c b/hw/nand.c index a73205d866..16950c5ec4 100644 --- a/hw/nand.c +++ b/hw/nand.c @@ -20,7 +20,7 @@ # include "hw.h" # include "flash.h" -# include "blockdev.h" +# include "sysemu/blockdev.h" # include "sysbus.h" #include "qemu/error-report.h" diff --git a/hw/ne2000.c b/hw/ne2000.c index 2001264e14..00efa74a0f 100644 --- a/hw/ne2000.c +++ b/hw/ne2000.c @@ -26,7 +26,7 @@ #include "net/net.h" #include "ne2000.h" #include "loader.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" /* debug NE2000 card */ //#define DEBUG_NE2000 diff --git a/hw/nseries.c b/hw/nseries.c index 83adb97211..d96b750ccd 100644 --- a/hw/nseries.c +++ b/hw/nseries.c @@ -19,7 +19,7 @@ */ #include "qemu-common.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "omap.h" #include "arm-misc.h" #include "irq.h" @@ -31,7 +31,7 @@ #include "hw.h" #include "bt.h" #include "loader.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "sysbus.h" #include "exec/address-spaces.h" diff --git a/hw/omap1.c b/hw/omap1.c index 50c4570f31..8536e96687 100644 --- a/hw/omap1.c +++ b/hw/omap1.c @@ -19,9 +19,9 @@ #include "hw.h" #include "arm-misc.h" #include "omap.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "soc_dma.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "qemu/range.h" #include "sysbus.h" diff --git a/hw/omap2.c b/hw/omap2.c index 7ccee69661..dc6867c962 100644 --- a/hw/omap2.c +++ b/hw/omap2.c @@ -18,11 +18,11 @@ * with this program; if not, see . */ -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "hw.h" #include "arm-misc.h" #include "omap.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/timer.h" #include "qemu-char.h" #include "flash.h" diff --git a/hw/omap_sx1.c b/hw/omap_sx1.c index ca6eb9ddeb..0f03121505 100644 --- a/hw/omap_sx1.c +++ b/hw/omap_sx1.c @@ -31,7 +31,7 @@ #include "boards.h" #include "arm-misc.h" #include "flash.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" /*****************************************************************************/ diff --git a/hw/onenand.c b/hw/onenand.c index 2e26e3a05d..26bf991d6d 100644 --- a/hw/onenand.c +++ b/hw/onenand.c @@ -22,7 +22,7 @@ #include "hw.h" #include "flash.h" #include "irq.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/memory.h" #include "exec/address-spaces.h" #include "sysbus.h" diff --git a/hw/opencores_eth.c b/hw/opencores_eth.c index fd2f0f61c3..a0dfdce1f9 100644 --- a/hw/opencores_eth.c +++ b/hw/opencores_eth.c @@ -34,7 +34,7 @@ #include "hw.h" #include "sysbus.h" #include "net/net.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "trace.h" /* RECSMALL is not used because it breaks tap networking in linux: diff --git a/hw/openrisc_sim.c b/hw/openrisc_sim.c index c12097e12b..d2b2379ae2 100644 --- a/hw/openrisc_sim.c +++ b/hw/openrisc_sim.c @@ -25,9 +25,9 @@ #include "net/net.h" #include "loader.h" #include "exec/address-spaces.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "sysbus.h" -#include "qtest.h" +#include "sysemu/qtest.h" #define KERNEL_LOAD_ADDR 0x100 diff --git a/hw/palm.c b/hw/palm.c index e091bbcfc1..5219e37394 100644 --- a/hw/palm.c +++ b/hw/palm.c @@ -18,7 +18,7 @@ */ #include "hw.h" #include "audio/audio.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "ui/console.h" #include "omap.h" #include "boards.h" diff --git a/hw/pam.c b/hw/pam.c index a95e2cfb07..1d72e88e62 100644 --- a/hw/pam.c +++ b/hw/pam.c @@ -26,7 +26,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "pam.h" void smram_update(MemoryRegion *smram_region, uint8_t smram, diff --git a/hw/parallel.c b/hw/parallel.c index c4705bc89d..56b3760e8c 100644 --- a/hw/parallel.c +++ b/hw/parallel.c @@ -26,7 +26,7 @@ #include "qemu-char.h" #include "isa.h" #include "pc.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" //#define DEBUG_PARALLEL diff --git a/hw/pc.c b/hw/pc.c index 0a92ea6bed..71902e210b 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -40,16 +40,16 @@ #include "pcspk.h" #include "pci/msi.h" #include "sysbus.h" -#include "sysemu.h" -#include "kvm.h" +#include "sysemu/sysemu.h" +#include "sysemu/kvm.h" #include "kvm_i386.h" #include "xen.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "hw/block-common.h" #include "ui/qemu-spice.h" #include "exec/memory.h" #include "exec/address-spaces.h" -#include "arch_init.h" +#include "sysemu/arch_init.h" #include "qemu/bitmap.h" /* debug PC/ISA interrupts */ diff --git a/hw/pc_piix.c b/hw/pc_piix.c index 0d011348f2..99747a774c 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -33,12 +33,12 @@ #include "net/net.h" #include "boards.h" #include "ide.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "kvm/clock.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "sysbus.h" -#include "arch_init.h" -#include "blockdev.h" +#include "sysemu/arch_init.h" +#include "sysemu/blockdev.h" #include "smbus.h" #include "xen.h" #include "exec/memory.h" diff --git a/hw/pc_q35.c b/hw/pc_q35.c index 2580d5ff34..c7262d6315 100644 --- a/hw/pc_q35.c +++ b/hw/pc_q35.c @@ -28,12 +28,12 @@ * THE SOFTWARE. */ #include "hw.h" -#include "arch_init.h" +#include "sysemu/arch_init.h" #include "smbus.h" #include "boards.h" #include "mc146818rtc.h" #include "xen.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "kvm/clock.h" #include "q35.h" #include "exec/address-spaces.h" diff --git a/hw/pc_sysfw.c b/hw/pc_sysfw.c index d7ea3a5595..87e1fa961b 100644 --- a/hw/pc_sysfw.c +++ b/hw/pc_sysfw.c @@ -23,15 +23,15 @@ * THE SOFTWARE. */ -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "sysbus.h" #include "hw.h" #include "pc.h" #include "hw/boards.h" #include "loader.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "flash.h" -#include "kvm.h" +#include "sysemu/kvm.h" #define BIOS_FILENAME "bios.bin" diff --git a/hw/pci/pci-hotplug.c b/hw/pci/pci-hotplug.c index 2bc02e344f..f38df30540 100644 --- a/hw/pci/pci-hotplug.c +++ b/hw/pci/pci-hotplug.c @@ -31,7 +31,7 @@ #include "hw/scsi.h" #include "hw/virtio-blk.h" #include "qemu/config-file.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "qapi/error.h" #if defined(TARGET_I386) diff --git a/hw/pci/pci-stub.c b/hw/pci/pci-stub.c index 5891dc959d..1dda89b593 100644 --- a/hw/pci/pci-stub.c +++ b/hw/pci/pci-stub.c @@ -18,7 +18,7 @@ * with this program; if not, see . */ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "monitor/monitor.h" #include "hw/pci/pci.h" #include "qmp-commands.h" diff --git a/hw/pci/pci.c b/hw/pci/pci.c index c9ed95be89..94840c4af7 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -27,7 +27,7 @@ #include "hw/pci/pci_bus.h" #include "monitor/monitor.h" #include "net/net.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "hw/loader.h" #include "qemu/range.h" #include "qmp-commands.h" diff --git a/hw/pci/pci.h b/hw/pci/pci.h index d6ef4f6574..3152050856 100644 --- a/hw/pci/pci.h +++ b/hw/pci/pci.h @@ -5,7 +5,7 @@ #include "hw/qdev.h" #include "exec/memory.h" -#include "dma.h" +#include "sysemu/dma.h" /* PCI includes legacy ISA access. */ #include "hw/isa.h" diff --git a/hw/pci/pcie_aer.c b/hw/pci/pcie_aer.c index f7f3633f5b..1ce72ce944 100644 --- a/hw/pci/pcie_aer.c +++ b/hw/pci/pcie_aer.c @@ -18,7 +18,7 @@ * with this program; if not, see . */ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qapi/qmp/types.h" #include "monitor/monitor.h" #include "hw/pci/pci_bridge.h" diff --git a/hw/pckbd.c b/hw/pckbd.c index 5bb3e0abf3..6db7bbcc06 100644 --- a/hw/pckbd.c +++ b/hw/pckbd.c @@ -25,7 +25,7 @@ #include "isa.h" #include "pc.h" #include "ps2.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" /* debug PC keyboard */ //#define DEBUG_KBD diff --git a/hw/pcnet-pci.c b/hw/pcnet-pci.c index 5e8eed3af8..40a0e6eda4 100644 --- a/hw/pcnet-pci.c +++ b/hw/pcnet-pci.c @@ -31,7 +31,7 @@ #include "net/net.h" #include "loader.h" #include "qemu/timer.h" -#include "dma.h" +#include "sysemu/dma.h" #include "pcnet.h" diff --git a/hw/pcnet.c b/hw/pcnet.c index 87736542e4..30f100007a 100644 --- a/hw/pcnet.c +++ b/hw/pcnet.c @@ -39,7 +39,7 @@ #include "net/net.h" #include "qemu/timer.h" #include "qemu/sockets.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "pcnet.h" diff --git a/hw/petalogix_ml605_mmu.c b/hw/petalogix_ml605_mmu.c index 4eab0f2d8b..1cfdb2f302 100644 --- a/hw/petalogix_ml605_mmu.c +++ b/hw/petalogix_ml605_mmu.c @@ -29,11 +29,11 @@ #include "hw.h" #include "net/net.h" #include "flash.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "devices.h" #include "boards.h" #include "xilinx.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "serial.h" #include "exec/address-spaces.h" #include "ssi.h" diff --git a/hw/petalogix_s3adsp1800_mmu.c b/hw/petalogix_s3adsp1800_mmu.c index 124a88eeda..27ecfe7752 100644 --- a/hw/petalogix_s3adsp1800_mmu.c +++ b/hw/petalogix_s3adsp1800_mmu.c @@ -27,11 +27,11 @@ #include "hw.h" #include "net/net.h" #include "flash.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "devices.h" #include "boards.h" #include "xilinx.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" #include "microblaze_boot.h" diff --git a/hw/pl031.c b/hw/pl031.c index 834a20c917..3a23ecde48 100644 --- a/hw/pl031.c +++ b/hw/pl031.c @@ -13,7 +13,7 @@ #include "sysbus.h" #include "qemu/timer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" //#define DEBUG_PL031 diff --git a/hw/pl181.c b/hw/pl181.c index 8a2895ce1b..cbddb741ce 100644 --- a/hw/pl181.c +++ b/hw/pl181.c @@ -7,7 +7,7 @@ * This code is licensed under the GPL. */ -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "sysbus.h" #include "sd.h" diff --git a/hw/ppc.c b/hw/ppc.c index f066367609..1559982625 100644 --- a/hw/ppc.c +++ b/hw/ppc.c @@ -24,11 +24,11 @@ #include "hw.h" #include "ppc.h" #include "qemu/timer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "nvram.h" #include "qemu/log.h" #include "loader.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "kvm_ppc.h" //#define PPC_DEBUG_IRQ diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 3593f7c0e2..aa54fd84d7 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -24,10 +24,10 @@ #include "hw/serial.h" #include "hw/pci/pci.h" #include "hw/boards.h" -#include "sysemu.h" -#include "kvm.h" +#include "sysemu/sysemu.h" +#include "sysemu/kvm.h" #include "kvm_ppc.h" -#include "device_tree.h" +#include "sysemu/device_tree.h" #include "hw/openpic.h" #include "hw/ppc.h" #include "hw/loader.h" diff --git a/hw/ppc/e500plat.c b/hw/ppc/e500plat.c index 2992bd9794..4deb02ac38 100644 --- a/hw/ppc/e500plat.c +++ b/hw/ppc/e500plat.c @@ -13,8 +13,8 @@ #include "qemu-common.h" #include "e500.h" #include "../boards.h" -#include "device_tree.h" -#include "hw/pci.h" +#include "sysemu/device_tree.h" +#include "hw/pci/pci.h" static void e500plat_fixup_devtree(PPCE500Params *params, void *fdt) { diff --git a/hw/ppc/mpc8544ds.c b/hw/ppc/mpc8544ds.c index 7e1761d20c..f9ae20f5a3 100644 --- a/hw/ppc/mpc8544ds.c +++ b/hw/ppc/mpc8544ds.c @@ -13,7 +13,7 @@ #include "qemu-common.h" #include "e500.h" #include "../boards.h" -#include "device_tree.h" +#include "sysemu/device_tree.h" static void mpc8544ds_fixup_devtree(PPCE500Params *params, void *fdt) { diff --git a/hw/ppc405_boards.c b/hw/ppc405_boards.c index 31bcc4bb95..8f7f0d07d1 100644 --- a/hw/ppc405_boards.c +++ b/hw/ppc405_boards.c @@ -26,12 +26,12 @@ #include "ppc405.h" #include "nvram.h" #include "flash.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "block/block.h" #include "boards.h" #include "qemu/log.h" #include "loader.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" #define BIOS_FILENAME "ppc405_rom.bin" diff --git a/hw/ppc405_uc.c b/hw/ppc405_uc.c index b1ed8837d6..7e56ecb4af 100644 --- a/hw/ppc405_uc.c +++ b/hw/ppc405_uc.c @@ -26,7 +26,7 @@ #include "ppc405.h" #include "serial.h" #include "qemu/timer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/log.h" #include "exec/address-spaces.h" diff --git a/hw/ppc440_bamboo.c b/hw/ppc440_bamboo.c index 591d7b0088..4f1b734c22 100644 --- a/hw/ppc440_bamboo.c +++ b/hw/ppc440_bamboo.c @@ -17,16 +17,16 @@ #include "hw.h" #include "pci/pci.h" #include "boards.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "kvm_ppc.h" -#include "device_tree.h" +#include "sysemu/device_tree.h" #include "loader.h" #include "elf.h" #include "exec/address-spaces.h" #include "serial.h" #include "ppc.h" #include "ppc405.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "sysbus.h" #define BINARY_DEVICE_TREE_FILE "bamboo.dtb" diff --git a/hw/ppc_booke.c b/hw/ppc_booke.c index a7182be0d3..5c89fc313d 100644 --- a/hw/ppc_booke.c +++ b/hw/ppc_booke.c @@ -24,7 +24,7 @@ #include "hw.h" #include "ppc.h" #include "qemu/timer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "nvram.h" #include "qemu/log.h" #include "loader.h" diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c index b2d02eaff2..fabcc08b40 100644 --- a/hw/ppc_newworld.c +++ b/hw/ppc_newworld.c @@ -54,7 +54,7 @@ #include "nvram.h" #include "pci/pci.h" #include "net/net.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "fw_cfg.h" #include "escc.h" @@ -62,10 +62,10 @@ #include "ide.h" #include "loader.h" #include "elf.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "kvm_ppc.h" #include "hw/usb.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" #include "sysbus.h" diff --git a/hw/ppc_oldworld.c b/hw/ppc_oldworld.c index 7a8a039d7e..fff5129ca9 100644 --- a/hw/ppc_oldworld.c +++ b/hw/ppc_oldworld.c @@ -29,7 +29,7 @@ #include "adb.h" #include "mac_dbdma.h" #include "nvram.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "net/net.h" #include "isa.h" #include "pci/pci.h" @@ -39,9 +39,9 @@ #include "ide.h" #include "loader.h" #include "elf.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "kvm_ppc.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" #define MAX_IDE_BUS 2 diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c index 072535294e..9c78c863e8 100644 --- a/hw/ppc_prep.c +++ b/hw/ppc_prep.c @@ -27,7 +27,7 @@ #include "serial.h" #include "fdc.h" #include "net/net.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "isa.h" #include "pci/pci.h" #include "pci/pci_host.h" @@ -37,8 +37,8 @@ #include "ide.h" #include "loader.h" #include "mc146818rtc.h" -#include "blockdev.h" -#include "arch_init.h" +#include "sysemu/blockdev.h" +#include "sysemu/arch_init.h" #include "exec/address-spaces.h" //#define HARD_DEBUG_PPC_IO diff --git a/hw/ppce500_spin.c b/hw/ppce500_spin.c index c1a155bd31..177aa2d122 100644 --- a/hw/ppce500_spin.c +++ b/hw/ppce500_spin.c @@ -28,9 +28,9 @@ */ #include "hw.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "sysbus.h" -#include "kvm.h" +#include "sysemu/kvm.h" #define MAX_CPUS 32 diff --git a/hw/ps2.c b/hw/ps2.c index ba80089aba..15cfd5bb76 100644 --- a/hw/ps2.c +++ b/hw/ps2.c @@ -24,7 +24,7 @@ #include "hw.h" #include "ps2.h" #include "ui/console.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" /* debug PC keyboard */ //#define DEBUG_KBD diff --git a/hw/pxa2xx.c b/hw/pxa2xx.c index e616979207..936e9f87cd 100644 --- a/hw/pxa2xx.c +++ b/hw/pxa2xx.c @@ -9,12 +9,12 @@ #include "sysbus.h" #include "pxa.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "serial.h" #include "i2c.h" #include "ssi.h" #include "qemu-char.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" static struct { hwaddr io_base; diff --git a/hw/pxa2xx_lcd.c b/hw/pxa2xx_lcd.c index b5efd4d426..512a27e702 100644 --- a/hw/pxa2xx_lcd.c +++ b/hw/pxa2xx_lcd.c @@ -15,7 +15,7 @@ #include "pxa.h" #include "ui/pixel_ops.h" /* FIXME: For graphic_rotate. Should probably be done in common code. */ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "framebuffer.h" struct DMAChannel { diff --git a/hw/pxa2xx_timer.c b/hw/pxa2xx_timer.c index 1481c6d3e1..e4ffb15bb2 100644 --- a/hw/pxa2xx_timer.c +++ b/hw/pxa2xx_timer.c @@ -9,7 +9,7 @@ #include "hw.h" #include "qemu/timer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "pxa.h" #include "sysbus.h" diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c index 1c6712e6de..b73986759b 100644 --- a/hw/qdev-monitor.c +++ b/hw/qdev-monitor.c @@ -20,7 +20,7 @@ #include "qdev.h" #include "monitor/monitor.h" #include "qmp-commands.h" -#include "arch_init.h" +#include "sysemu/arch_init.h" #include "qemu/config-file.h" /* diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c index ba6c648fed..1cb97ea594 100644 --- a/hw/qdev-properties.c +++ b/hw/qdev-properties.c @@ -1,7 +1,7 @@ #include "net/net.h" #include "qdev.h" #include "qapi/qmp/qerror.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "hw/block-common.h" #include "net/hub.h" #include "qapi/visitor.h" diff --git a/hw/qdev.c b/hw/qdev.c index 0a2a32d5d3..c4a9857a05 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -27,7 +27,7 @@ #include "net/net.h" #include "qdev.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qapi/error.h" #include "qapi/visitor.h" diff --git a/hw/qxl.c b/hw/qxl.c index b88a39cc93..d08b9bd3c1 100644 --- a/hw/qxl.c +++ b/hw/qxl.c @@ -24,7 +24,7 @@ #include "qemu/timer.h" #include "qemu/queue.h" #include "monitor/monitor.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "trace.h" #include "qxl.h" diff --git a/hw/r2d.c b/hw/r2d.c index d7a26bf398..7cf1893d19 100644 --- a/hw/r2d.c +++ b/hw/r2d.c @@ -27,7 +27,7 @@ #include "hw.h" #include "sh.h" #include "devices.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "pci/pci.h" #include "net/net.h" @@ -36,7 +36,7 @@ #include "loader.h" #include "usb.h" #include "flash.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" #define FLASH_BASE 0x00000000 diff --git a/hw/realview.c b/hw/realview.c index 9c55bf29b7..872b3b468a 100644 --- a/hw/realview.c +++ b/hw/realview.c @@ -13,10 +13,10 @@ #include "devices.h" #include "pci/pci.h" #include "net/net.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "i2c.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" #define SMP_BOOT_ADDR 0xe0000000 diff --git a/hw/rtl8139.c b/hw/rtl8139.c index 19c31a02c6..c59ec6b6df 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -53,11 +53,11 @@ #include "hw.h" #include "pci/pci.h" -#include "dma.h" +#include "sysemu/dma.h" #include "qemu/timer.h" #include "net/net.h" #include "loader.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/iov.h" /* debug RTL8139 card */ diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c index 769015c136..963b4f0dc2 100644 --- a/hw/s390-virtio-bus.c +++ b/hw/s390-virtio-bus.c @@ -19,7 +19,7 @@ #include "hw.h" #include "block/block.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "monitor/monitor.h" #include "loader.h" @@ -29,7 +29,7 @@ #include "hw/virtio-serial.h" #include "hw/virtio-net.h" #include "hw/sysbus.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "hw/s390-virtio-bus.h" diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c index 7dfe87ade3..20827761d0 100644 --- a/hw/s390-virtio.c +++ b/hw/s390-virtio.c @@ -19,8 +19,8 @@ #include "hw.h" #include "block/block.h" -#include "blockdev.h" -#include "sysemu.h" +#include "sysemu/blockdev.h" +#include "sysemu/sysemu.h" #include "net/net.h" #include "boards.h" #include "monitor/monitor.h" @@ -28,7 +28,7 @@ #include "elf.h" #include "hw/virtio.h" #include "hw/sysbus.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "exec/address-spaces.h" #include "hw/s390-virtio-bus.h" diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c index 748118d0f0..89b1b66bd2 100644 --- a/hw/s390x/event-facility.c +++ b/hw/s390x/event-facility.c @@ -16,7 +16,7 @@ */ #include "monitor/monitor.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "sclp.h" #include "event-facility.h" diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c index bc9b0aeb00..7ad791d5e3 100644 --- a/hw/s390x/sclp.c +++ b/hw/s390x/sclp.c @@ -13,7 +13,7 @@ */ #include "cpu.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "exec/memory.h" #include "sclp.h" diff --git a/hw/s390x/sclpquiesce.c b/hw/s390x/sclpquiesce.c index 9a773b87ff..6e6f5624df 100644 --- a/hw/s390x/sclpquiesce.c +++ b/hw/s390x/sclpquiesce.c @@ -12,7 +12,7 @@ * */ #include -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "sclp.h" #include "event-facility.h" diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c index 5dc9f512b5..970c1fc01b 100644 --- a/hw/scsi-bus.c +++ b/hw/scsi-bus.c @@ -3,9 +3,9 @@ #include "scsi.h" #include "scsi-defs.h" #include "qdev.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "trace.h" -#include "dma.h" +#include "sysemu/dma.h" static char *scsibus_get_dev_path(DeviceState *dev); static char *scsibus_get_fw_dev_path(DeviceState *dev); diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index c65da4a9c9..a69735b0a6 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -32,10 +32,10 @@ do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0) #include "qemu/error-report.h" #include "scsi.h" #include "scsi-defs.h" -#include "sysemu.h" -#include "blockdev.h" +#include "sysemu/sysemu.h" +#include "sysemu/blockdev.h" #include "hw/block-common.h" -#include "dma.h" +#include "sysemu/dma.h" #ifdef __linux #include diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c index faeb61ee2c..4c702be19f 100644 --- a/hw/scsi-generic.c +++ b/hw/scsi-generic.c @@ -14,7 +14,7 @@ #include "qemu-common.h" #include "qemu/error-report.h" #include "scsi.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #ifdef __linux__ diff --git a/hw/scsi.h b/hw/scsi.h index 24ed522722..a5b5b2ec0d 100644 --- a/hw/scsi.h +++ b/hw/scsi.h @@ -4,7 +4,7 @@ #include "qdev.h" #include "block/block.h" #include "hw/block-common.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #define MAX_SCSI_DEVS 255 diff --git a/hw/serial.h b/hw/serial.h index 5722f8a353..98ee4241be 100644 --- a/hw/serial.h +++ b/hw/serial.h @@ -26,7 +26,7 @@ #define HW_SERIAL_H 1 #include "hw.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "exec/memory.h" #define UART_FIFO_LENGTH 16 /* 16550A Fifo Length */ diff --git a/hw/sga.c b/hw/sga.c index 5d80efd0c2..d5c91ed98e 100644 --- a/hw/sga.c +++ b/hw/sga.c @@ -27,7 +27,7 @@ #include "pci/pci.h" #include "pc.h" #include "loader.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #define SGABIOS_FILENAME "sgabios.bin" diff --git a/hw/sh7750.c b/hw/sh7750.c index 08945750c4..666f8655ed 100644 --- a/hw/sh7750.c +++ b/hw/sh7750.c @@ -25,7 +25,7 @@ #include #include "hw.h" #include "sh.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "sh7750_regs.h" #include "sh7750_regnames.h" #include "sh_intc.h" diff --git a/hw/shix.c b/hw/shix.c index 821196e84c..86d703ad70 100644 --- a/hw/shix.c +++ b/hw/shix.c @@ -29,7 +29,7 @@ */ #include "hw.h" #include "sh.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "loader.h" #include "exec/address-spaces.h" diff --git a/hw/slavio_misc.c b/hw/slavio_misc.c index 682fb457f5..704f2b173b 100644 --- a/hw/slavio_misc.c +++ b/hw/slavio_misc.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "sysbus.h" #include "trace.h" diff --git a/hw/smbios.c b/hw/smbios.c index c57237d279..a7b8bfc383 100644 --- a/hw/smbios.c +++ b/hw/smbios.c @@ -13,7 +13,7 @@ * GNU GPL, version 2 or (at your option) any later version. */ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "smbios.h" #include "loader.h" diff --git a/hw/smbus_ich9.c b/hw/smbus_ich9.c index b7bddc80d3..16db3a743c 100644 --- a/hw/smbus_ich9.c +++ b/hw/smbus_ich9.c @@ -28,7 +28,7 @@ #include "pc.h" #include "pm_smbus.h" #include "pci/pci.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "i2c.h" #include "smbus.h" diff --git a/hw/spapr.c b/hw/spapr.c index 1abfde2a05..fdd1eb6925 100644 --- a/hw/spapr.c +++ b/hw/spapr.c @@ -24,13 +24,13 @@ * THE SOFTWARE. * */ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "hw.h" #include "elf.h" #include "net/net.h" -#include "blockdev.h" -#include "cpus.h" -#include "kvm.h" +#include "sysemu/blockdev.h" +#include "sysemu/cpus.h" +#include "sysemu/kvm.h" #include "kvm_ppc.h" #include "hw/boards.h" @@ -43,7 +43,7 @@ #include "hw/xics.h" #include "hw/pci/msi.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "kvm_ppc.h" #include "pci/pci.h" diff --git a/hw/spapr.h b/hw/spapr.h index 600722f132..3a1f69f2a9 100644 --- a/hw/spapr.h +++ b/hw/spapr.h @@ -1,7 +1,7 @@ #if !defined(__HW_SPAPR_H__) #define __HW_SPAPR_H__ -#include "dma.h" +#include "sysemu/dma.h" #include "hw/xics.h" struct VIOsPAPRBus; diff --git a/hw/spapr_events.c b/hw/spapr_events.c index 18ccd4a9e0..7956601466 100644 --- a/hw/spapr_events.c +++ b/hw/spapr_events.c @@ -25,10 +25,10 @@ * */ #include "cpu.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu-char.h" #include "hw/qdev.h" -#include "device_tree.h" +#include "sysemu/device_tree.h" #include "hw/spapr.h" #include "hw/spapr_vio.h" diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c index 1fac362329..afb12973f2 100644 --- a/hw/spapr_hcall.c +++ b/hw/spapr_hcall.c @@ -1,6 +1,6 @@ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "cpu.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "helper_regs.h" #include "hw/spapr.h" diff --git a/hw/spapr_iommu.c b/hw/spapr_iommu.c index fb968b250b..d8a098cb1b 100644 --- a/hw/spapr_iommu.c +++ b/hw/spapr_iommu.c @@ -17,10 +17,10 @@ * License along with this library; if not, see . */ #include "hw.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "qdev.h" #include "kvm_ppc.h" -#include "dma.h" +#include "sysemu/dma.h" #include "exec/address-spaces.h" #include "hw/spapr.h" diff --git a/hw/spapr_nvram.c b/hw/spapr_nvram.c index 512bb8d5d1..f20f6b4fdd 100644 --- a/hw/spapr_nvram.c +++ b/hw/spapr_nvram.c @@ -24,7 +24,7 @@ #include #include -#include "device_tree.h" +#include "sysemu/device_tree.h" #include "hw/sysbus.h" #include "hw/spapr.h" #include "hw/spapr_vio.h" diff --git a/hw/spapr_rtas.c b/hw/spapr_rtas.c index e618c2db53..d29736285c 100644 --- a/hw/spapr_rtas.c +++ b/hw/spapr_rtas.c @@ -25,10 +25,10 @@ * */ #include "cpu.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu-char.h" #include "hw/qdev.h" -#include "device_tree.h" +#include "sysemu/device_tree.h" #include "hw/spapr.h" #include "hw/spapr_vio.h" diff --git a/hw/spapr_vio.c b/hw/spapr_vio.c index fdf8db9158..a58621d17e 100644 --- a/hw/spapr_vio.c +++ b/hw/spapr_vio.c @@ -20,14 +20,14 @@ */ #include "hw.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "monitor/monitor.h" #include "loader.h" #include "elf.h" #include "hw/sysbus.h" -#include "kvm.h" -#include "device_tree.h" +#include "sysemu/kvm.h" +#include "sysemu/device_tree.h" #include "kvm_ppc.h" #include "hw/spapr.h" diff --git a/hw/spapr_vio.h b/hw/spapr_vio.h index cc85d26101..f98ec0a2e5 100644 --- a/hw/spapr_vio.h +++ b/hw/spapr_vio.h @@ -21,7 +21,7 @@ * License along with this library; if not, see . */ -#include "dma.h" +#include "sysemu/dma.h" #define TYPE_VIO_SPAPR_DEVICE "vio-spapr-device" #define VIO_SPAPR_DEVICE(obj) \ diff --git a/hw/spitz.c b/hw/spitz.c index 1259e32974..8e1be7fb21 100644 --- a/hw/spitz.c +++ b/hw/spitz.c @@ -13,7 +13,7 @@ #include "hw.h" #include "pxa.h" #include "arm-misc.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "pcmcia.h" #include "i2c.h" #include "ssi.h" @@ -25,7 +25,7 @@ #include "block/block.h" #include "audio/audio.h" #include "boards.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "sysbus.h" #include "exec/address-spaces.h" diff --git a/hw/ssi-sd.c b/hw/ssi-sd.c index c5505ee24f..d61c3328d9 100644 --- a/hw/ssi-sd.c +++ b/hw/ssi-sd.c @@ -10,7 +10,7 @@ * GNU GPL, version 2 or (at your option) any later version. */ -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "ssi.h" #include "sd.h" diff --git a/hw/strongarm.c b/hw/strongarm.c index f776fee3bc..5d5f454b1d 100644 --- a/hw/strongarm.c +++ b/hw/strongarm.c @@ -31,7 +31,7 @@ #include "qemu/error-report.h" #include "arm-misc.h" #include "qemu-char.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "ssi.h" //#define DEBUG diff --git a/hw/sun4m.c b/hw/sun4m.c index 4245854949..0d84b373b1 100644 --- a/hw/sun4m.c +++ b/hw/sun4m.c @@ -27,7 +27,7 @@ #include "nvram.h" #include "sparc32_dma.h" #include "fdc.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "net/net.h" #include "boards.h" #include "firmware_abi.h" @@ -40,7 +40,7 @@ #include "qdev-addr.h" #include "loader.h" #include "elf.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "trace.h" /* diff --git a/hw/sun4u.c b/hw/sun4u.c index 8bca4fdff9..cbfd217587 100644 --- a/hw/sun4u.c +++ b/hw/sun4u.c @@ -30,7 +30,7 @@ #include "fdc.h" #include "net/net.h" #include "qemu/timer.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "firmware_abi.h" #include "fw_cfg.h" @@ -38,7 +38,7 @@ #include "ide.h" #include "loader.h" #include "elf.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" //#define DEBUG_IRQ diff --git a/hw/tc6393xb.c b/hw/tc6393xb.c index edf76817b5..e815f83198 100644 --- a/hw/tc6393xb.c +++ b/hw/tc6393xb.c @@ -15,7 +15,7 @@ #include "flash.h" #include "ui/console.h" #include "ui/pixel_ops.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #define IRQ_TC6393_NAND 0 #define IRQ_TC6393_MMC 1 diff --git a/hw/tosa.c b/hw/tosa.c index 6fdbec53ee..6ee4693840 100644 --- a/hw/tosa.c +++ b/hw/tosa.c @@ -21,7 +21,7 @@ #include "boards.h" #include "i2c.h" #include "ssi.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "sysbus.h" #include "exec/address-spaces.h" diff --git a/hw/twl92230.c b/hw/twl92230.c index 3210b9ef4e..c71e4a2af0 100644 --- a/hw/twl92230.c +++ b/hw/twl92230.c @@ -22,7 +22,7 @@ #include "hw.h" #include "qemu/timer.h" #include "i2c.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "ui/console.h" #define VERBOSE 1 diff --git a/hw/usb/bus.c b/hw/usb/bus.c index 74728c94e5..10260a13ac 100644 --- a/hw/usb/bus.c +++ b/hw/usb/bus.c @@ -1,7 +1,7 @@ #include "hw/hw.h" #include "hw/usb.h" #include "hw/qdev.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "monitor/monitor.h" #include "trace.h" diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c index e8ada9f02c..1c54863452 100644 --- a/hw/usb/dev-network.c +++ b/hw/usb/dev-network.c @@ -29,7 +29,7 @@ #include "net/net.h" #include "qemu/queue.h" #include "qemu/config-file.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/iov.h" /*#define TRAFFIC_DEBUG*/ diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 6d27bac94f..5025597673 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -15,8 +15,8 @@ #include "hw/scsi.h" #include "ui/console.h" #include "monitor/monitor.h" -#include "sysemu.h" -#include "blockdev.h" +#include "sysemu/sysemu.h" +#include "sysemu/blockdev.h" //#define DEBUG_MSD diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h index 5bc80031bf..e35144d386 100644 --- a/hw/usb/hcd-ehci.h +++ b/hw/usb/hcd-ehci.h @@ -22,8 +22,8 @@ #include "hw/usb.h" #include "monitor/monitor.h" #include "trace.h" -#include "dma.h" -#include "sysemu.h" +#include "sysemu/dma.h" +#include "sysemu/sysemu.h" #ifndef EHCI_DEBUG #define EHCI_DEBUG 0 diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c index c9b8a31465..2af754b5cf 100644 --- a/hw/usb/hcd-uhci.c +++ b/hw/usb/hcd-uhci.c @@ -30,7 +30,7 @@ #include "hw/pci/pci.h" #include "qemu/timer.h" #include "qemu/iov.h" -#include "dma.h" +#include "sysemu/dma.h" #include "trace.h" //#define DEBUG diff --git a/hw/usb/host-linux.c b/hw/usb/host-linux.c index 9a8c26ceaf..669fbd245c 100644 --- a/hw/usb/host-linux.c +++ b/hw/usb/host-linux.c @@ -33,7 +33,7 @@ #include "qemu-common.h" #include "qemu/timer.h" #include "monitor/monitor.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "trace.h" #include diff --git a/hw/usb/libhw.c b/hw/usb/libhw.c index 672d7a5598..75f022f4ec 100644 --- a/hw/usb/libhw.c +++ b/hw/usb/libhw.c @@ -22,7 +22,7 @@ #include "qemu-common.h" #include "exec/cpu-common.h" #include "hw/usb.h" -#include "dma.h" +#include "sysemu/dma.h" int usb_packet_map(USBPacket *p, QEMUSGList *sgl) { diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c index 31e5f27595..b65e8682b6 100644 --- a/hw/usb/redirect.c +++ b/hw/usb/redirect.c @@ -28,7 +28,7 @@ #include "qemu-common.h" #include "qemu/timer.h" #include "monitor/monitor.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/iov.h" #include diff --git a/hw/versatilepb.c b/hw/versatilepb.c index bd9c01564a..5e89e747a2 100644 --- a/hw/versatilepb.c +++ b/hw/versatilepb.c @@ -11,11 +11,11 @@ #include "arm-misc.h" #include "devices.h" #include "net/net.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "pci/pci.h" #include "i2c.h" #include "boards.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "exec/address-spaces.h" #include "flash.h" diff --git a/hw/vexpress.c b/hw/vexpress.c index e7b9e93852..93c3176667 100644 --- a/hw/vexpress.c +++ b/hw/vexpress.c @@ -26,10 +26,10 @@ #include "primecell.h" #include "devices.h" #include "net/net.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "exec/address-spaces.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "flash.h" #define VEXPRESS_BOARD_ID 0x8e0 diff --git a/hw/vfio_pci.c b/hw/vfio_pci.c index 9f204bc113..41fb7ad1de 100644 --- a/hw/vfio_pci.c +++ b/hw/vfio_pci.c @@ -29,7 +29,7 @@ #include "config.h" #include "qemu/event_notifier.h" #include "exec/address-spaces.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "exec/memory.h" #include "pci/msi.h" #include "pci/msix.h" diff --git a/hw/virtex_ml507.c b/hw/virtex_ml507.c index 5134e2f477..5238c7cbd6 100644 --- a/hw/virtex_ml507.c +++ b/hw/virtex_ml507.c @@ -26,10 +26,10 @@ #include "hw.h" #include "serial.h" #include "flash.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "devices.h" #include "boards.h" -#include "device_tree.h" +#include "sysemu/device_tree.h" #include "loader.h" #include "elf.h" #include "qemu/log.h" @@ -39,7 +39,7 @@ #include "ppc4xx.h" #include "ppc405.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "xilinx.h" #define EPAPR_MAGIC (0x45504150) diff --git a/hw/virtio-balloon.c b/hw/virtio-balloon.c index 2eb709b422..3040bc63ab 100644 --- a/hw/virtio-balloon.c +++ b/hw/virtio-balloon.c @@ -18,9 +18,9 @@ #include "virtio.h" #include "pc.h" #include "cpu.h" -#include "balloon.h" +#include "sysemu/balloon.h" #include "virtio-balloon.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "exec/address-spaces.h" #if defined(__linux__) diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index 208caa2642..90cfa246db 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -15,7 +15,7 @@ #include "qemu/error-report.h" #include "trace.h" #include "hw/block-common.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "virtio-blk.h" #include "scsi-defs.h" #ifdef __linux__ diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index f58917f75f..d2d2454493 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -27,8 +27,8 @@ #include "pci/msi.h" #include "pci/msix.h" #include "loader.h" -#include "kvm.h" -#include "blockdev.h" +#include "sysemu/kvm.h" +#include "sysemu/blockdev.h" #include "virtio-pci.h" #include "qemu/range.h" diff --git a/hw/virtio.h b/hw/virtio.h index 511a16992e..541600484e 100644 --- a/hw/virtio.h +++ b/hw/virtio.h @@ -17,7 +17,7 @@ #include "hw.h" #include "net/net.h" #include "qdev.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/event_notifier.h" #ifdef CONFIG_LINUX #include "9p.h" diff --git a/hw/vmport.c b/hw/vmport.c index 3ab3a1405c..7d425237ac 100644 --- a/hw/vmport.c +++ b/hw/vmport.c @@ -24,7 +24,7 @@ #include "hw.h" #include "isa.h" #include "pc.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "qdev.h" //#define VMPORT_DEBUG diff --git a/hw/vt82c686.c b/hw/vt82c686.c index a18aaed217..d3469d49f1 100644 --- a/hw/vt82c686.c +++ b/hw/vt82c686.c @@ -22,7 +22,7 @@ #include "apm.h" #include "acpi.h" #include "pm_smbus.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/timer.h" #include "exec/address-spaces.h" diff --git a/hw/watchdog.c b/hw/watchdog.c index 5b04215374..072d256882 100644 --- a/hw/watchdog.c +++ b/hw/watchdog.c @@ -25,7 +25,7 @@ #include "qemu/queue.h" #include "qapi/qmp/types.h" #include "monitor/monitor.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "hw/watchdog.h" /* Possible values for action parameter. */ diff --git a/hw/xen_backend.h b/hw/xen_backend.h index 92ab501d37..f37afb1f05 100644 --- a/hw/xen_backend.h +++ b/hw/xen_backend.h @@ -2,7 +2,7 @@ #define QEMU_HW_XEN_BACKEND_H 1 #include "xen_common.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "net/net.h" /* ------------------------------------------------------------- */ diff --git a/hw/xen_devconfig.c b/hw/xen_devconfig.c index d83e8d0f64..e2ba741d54 100644 --- a/hw/xen_devconfig.c +++ b/hw/xen_devconfig.c @@ -1,5 +1,5 @@ #include "xen_backend.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" /* ------------------------------------------------------------- */ diff --git a/hw/xen_disk.c b/hw/xen_disk.c index 423b580cff..a6a64a2455 100644 --- a/hw/xen_disk.c +++ b/hw/xen_disk.c @@ -38,7 +38,7 @@ #include "hw.h" #include "xen_backend.h" #include "xen_blkif.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" /* ------------------------------------------------------------- */ diff --git a/hw/xen_machine_pv.c b/hw/xen_machine_pv.c index 426470351e..9feecd5a27 100644 --- a/hw/xen_machine_pv.c +++ b/hw/xen_machine_pv.c @@ -27,7 +27,7 @@ #include "boards.h" #include "xen_backend.h" #include "xen_domainbuild.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" static void xen_init_pv(QEMUMachineInitArgs *args) { diff --git a/hw/xilinx_spi.c b/hw/xilinx_spi.c index 4eed1828e3..77f9178008 100644 --- a/hw/xilinx_spi.c +++ b/hw/xilinx_spi.c @@ -25,7 +25,7 @@ */ #include "sysbus.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/log.h" #include "fifo.h" diff --git a/hw/xilinx_spips.c b/hw/xilinx_spips.c index ebe375e56f..42e019dc05 100644 --- a/hw/xilinx_spips.c +++ b/hw/xilinx_spips.c @@ -23,7 +23,7 @@ */ #include "sysbus.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "ptimer.h" #include "qemu/log.h" #include "fifo.h" diff --git a/hw/xilinx_zynq.c b/hw/xilinx_zynq.c index 156648a5d1..da0a7d0aa1 100644 --- a/hw/xilinx_zynq.c +++ b/hw/xilinx_zynq.c @@ -19,10 +19,10 @@ #include "arm-misc.h" #include "net/net.h" #include "exec/address-spaces.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "flash.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "loader.h" #include "ssi.h" diff --git a/hw/xtensa_lx60.c b/hw/xtensa_lx60.c index c6c880eba5..9c7bb75f81 100644 --- a/hw/xtensa_lx60.c +++ b/hw/xtensa_lx60.c @@ -25,7 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "loader.h" #include "elf.h" @@ -35,7 +35,7 @@ #include "net/net.h" #include "sysbus.h" #include "flash.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "qemu-char.h" #include "xtensa_bootparam.h" diff --git a/hw/xtensa_sim.c b/hw/xtensa_sim.c index 29b5f22a18..14fe85b2fc 100644 --- a/hw/xtensa_sim.c +++ b/hw/xtensa_sim.c @@ -25,7 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "boards.h" #include "loader.h" #include "elf.h" diff --git a/hw/z2.c b/hw/z2.c index ec35f3e444..09b03687d1 100644 --- a/hw/z2.c +++ b/hw/z2.c @@ -18,9 +18,9 @@ #include "i2c.h" #include "ssi.h" #include "boards.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "flash.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "ui/console.h" #include "audio/audio.h" #include "exec/address-spaces.h" diff --git a/hw/zynq_slcr.c b/hw/zynq_slcr.c index c7ce51f4a6..97ec578262 100644 --- a/hw/zynq_slcr.c +++ b/hw/zynq_slcr.c @@ -17,7 +17,7 @@ #include "hw.h" #include "qemu/timer.h" #include "sysbus.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #ifdef ZYNQ_ARM_SLCR_ERR_DEBUG #define DB_PRINT(...) do { \ diff --git a/arch_init.h b/include/sysemu/arch_init.h similarity index 100% rename from arch_init.h rename to include/sysemu/arch_init.h diff --git a/balloon.h b/include/sysemu/balloon.h similarity index 100% rename from balloon.h rename to include/sysemu/balloon.h diff --git a/blockdev.h b/include/sysemu/blockdev.h similarity index 100% rename from blockdev.h rename to include/sysemu/blockdev.h diff --git a/cpus.h b/include/sysemu/cpus.h similarity index 100% rename from cpus.h rename to include/sysemu/cpus.h diff --git a/device_tree.h b/include/sysemu/device_tree.h similarity index 100% rename from device_tree.h rename to include/sysemu/device_tree.h diff --git a/dma.h b/include/sysemu/dma.h similarity index 99% rename from dma.h rename to include/sysemu/dma.h index fd68f74c5b..a52c93a553 100644 --- a/dma.h +++ b/include/sysemu/dma.h @@ -14,7 +14,7 @@ #include "exec/memory.h" #include "hw/hw.h" #include "block/block.h" -#include "kvm.h" +#include "sysemu/kvm.h" typedef struct DMAContext DMAContext; typedef struct ScatterGatherEntry ScatterGatherEntry; diff --git a/dump.h b/include/sysemu/dump.h similarity index 100% rename from dump.h rename to include/sysemu/dump.h diff --git a/kvm.h b/include/sysemu/kvm.h similarity index 100% rename from kvm.h rename to include/sysemu/kvm.h diff --git a/memory_mapping.h b/include/sysemu/memory_mapping.h similarity index 100% rename from memory_mapping.h rename to include/sysemu/memory_mapping.h diff --git a/qemu-os-posix.h b/include/sysemu/os-posix.h similarity index 100% rename from qemu-os-posix.h rename to include/sysemu/os-posix.h diff --git a/qemu-os-win32.h b/include/sysemu/os-win32.h similarity index 100% rename from qemu-os-win32.h rename to include/sysemu/os-win32.h diff --git a/qtest.h b/include/sysemu/qtest.h similarity index 100% rename from qtest.h rename to include/sysemu/qtest.h diff --git a/qemu-seccomp.h b/include/sysemu/seccomp.h similarity index 100% rename from qemu-seccomp.h rename to include/sysemu/seccomp.h diff --git a/sysemu.h b/include/sysemu/sysemu.h similarity index 100% rename from sysemu.h rename to include/sysemu/sysemu.h diff --git a/xen-mapcache.h b/include/sysemu/xen-mapcache.h similarity index 100% rename from xen-mapcache.h rename to include/sysemu/xen-mapcache.h diff --git a/include/ui/spice-display.h b/include/ui/spice-display.h index a0d1a50487..8b192e9613 100644 --- a/include/ui/spice-display.h +++ b/include/ui/spice-display.h @@ -21,7 +21,7 @@ #include "qemu/thread.h" #include "ui/qemu-pixman.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #define NUM_MEMSLOTS 8 #define MEMSLOT_GENERATION_BITS 8 diff --git a/kvm-all.c b/kvm-all.c index 41ea3aa6ee..5aa65c4c15 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -24,11 +24,11 @@ #include "qemu/atomic.h" #include "qemu/option.h" #include "qemu/config-file.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "hw/hw.h" #include "hw/pci/msi.h" #include "exec/gdbstub.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "qemu/bswap.h" #include "exec/memory.h" #include "exec/address-spaces.h" diff --git a/kvm-stub.c b/kvm-stub.c index 8de8ebd3d2..5b971521cd 100644 --- a/kvm-stub.c +++ b/kvm-stub.c @@ -15,7 +15,7 @@ #include "hw/pci/msi.h" #include "cpu.h" #include "exec/gdbstub.h" -#include "kvm.h" +#include "sysemu/kvm.h" KVMState *kvm_state; bool kvm_kernel_irqchip; diff --git a/memory.c b/memory.c index d44200335b..35e6122dd7 100644 --- a/memory.c +++ b/memory.c @@ -17,7 +17,7 @@ #include "exec/address-spaces.h" #include "exec/ioport.h" #include "qemu/bitops.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include #include "exec/memory-internal.h" diff --git a/memory_mapping-stub.c b/memory_mapping-stub.c index 5f5fb99c58..24d5d67371 100644 --- a/memory_mapping-stub.c +++ b/memory_mapping-stub.c @@ -13,7 +13,7 @@ #include "cpu.h" #include "exec/cpu-all.h" -#include "memory_mapping.h" +#include "sysemu/memory_mapping.h" int qemu_get_guest_memory_mapping(MemoryMappingList *list) { diff --git a/memory_mapping.c b/memory_mapping.c index c829a9fa34..530f1d6793 100644 --- a/memory_mapping.c +++ b/memory_mapping.c @@ -13,7 +13,7 @@ #include "cpu.h" #include "exec/cpu-all.h" -#include "memory_mapping.h" +#include "sysemu/memory_mapping.h" static void memory_mapping_list_add_mapping_sorted(MemoryMappingList *list, MemoryMapping *mapping) diff --git a/migration.c b/migration.c index 8c5c5670d8..810f25e7eb 100644 --- a/migration.c +++ b/migration.c @@ -17,7 +17,7 @@ #include "migration/migration.h" #include "monitor/monitor.h" #include "buffered_file.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "block/block.h" #include "qemu/sockets.h" #include "migration/block.h" diff --git a/monitor.c b/monitor.c index 878b2317af..200bef452f 100644 --- a/monitor.c +++ b/monitor.c @@ -35,17 +35,17 @@ #include "net/slirp.h" #include "qemu-char.h" #include "ui/qemu-spice.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "monitor/monitor.h" #include "monitor/readline.h" #include "ui/console.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "audio/audio.h" #include "disas/disas.h" -#include "balloon.h" +#include "sysemu/balloon.h" #include "qemu/timer.h" #include "migration/migration.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "qemu/acl.h" #include "qapi/qmp/qint.h" #include "qapi/qmp/qfloat.h" diff --git a/net/tap-bsd.c b/net/tap-bsd.c index b48182f678..01c705b4c0 100644 --- a/net/tap-bsd.c +++ b/net/tap-bsd.c @@ -24,7 +24,7 @@ #include "tap_int.h" #include "qemu-common.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/error-report.h" #ifdef __NetBSD__ diff --git a/net/tap-linux.c b/net/tap-linux.c index dd4b915243..059f5f34ab 100644 --- a/net/tap-linux.c +++ b/net/tap-linux.c @@ -30,7 +30,7 @@ #include #include -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu-common.h" #include "qemu/error-report.h" diff --git a/net/tap-solaris.c b/net/tap-solaris.c index 3d5fee5542..486a7ea838 100644 --- a/net/tap-solaris.c +++ b/net/tap-solaris.c @@ -23,7 +23,7 @@ */ #include "tap_int.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include #include diff --git a/net/tap-win32.c b/net/tap-win32.c index 1ddd6fa6e6..0c63cbd203 100644 --- a/net/tap-win32.c +++ b/net/tap-win32.c @@ -31,7 +31,7 @@ #include "qemu-common.h" #include "clients.h" /* net_init_tap */ #include "net/net.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/error-report.h" #include #include diff --git a/net/tap.c b/net/tap.c index d34ff13398..eb40c42d7d 100644 --- a/net/tap.c +++ b/net/tap.c @@ -36,7 +36,7 @@ #include "net/net.h" #include "clients.h" #include "monitor/monitor.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu-common.h" #include "qemu/error-report.h" diff --git a/os-posix.c b/os-posix.c index 488e48005f..5c64518902 100644 --- a/os-posix.c +++ b/os-posix.c @@ -36,7 +36,7 @@ /* Needed early for CONFIG_BSD etc. */ #include "config-host.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "net/slirp.h" #include "qemu-options.h" diff --git a/os-win32.c b/os-win32.c index 13892ba320..9673a81c7d 100644 --- a/os-win32.c +++ b/os-win32.c @@ -30,7 +30,7 @@ #include #include #include "config-host.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu-options.h" /***********************************************************/ diff --git a/oslib-posix.c b/oslib-posix.c index a737d6e0e3..4f5ec6788b 100644 --- a/oslib-posix.c +++ b/oslib-posix.c @@ -49,7 +49,7 @@ extern int daemon(int, int); #endif #include "config-host.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "trace.h" #include "qemu/sockets.h" diff --git a/oslib-win32.c b/oslib-win32.c index 7f0dd07e5f..e7e283e875 100644 --- a/oslib-win32.c +++ b/oslib-win32.c @@ -27,7 +27,7 @@ */ #include #include "config-host.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/main-loop.h" #include "trace.h" #include "qemu/sockets.h" diff --git a/qemu-char.c b/qemu-char.c index 5a8d8f75a4..0cbe85318e 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -24,7 +24,7 @@ #include "qemu-common.h" #include "monitor/monitor.h" #include "ui/console.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/timer.h" #include "qemu-char.h" #include "hw/usb.h" diff --git a/qemu-common.h b/qemu-common.h index 40cd198fc1..6871cab371 100644 --- a/qemu-common.h +++ b/qemu-common.h @@ -43,11 +43,11 @@ #include #ifdef _WIN32 -#include "qemu-os-win32.h" +#include "sysemu/os-win32.h" #endif #ifdef CONFIG_POSIX -#include "qemu-os-posix.h" +#include "sysemu/os-posix.h" #endif #ifndef O_LARGEFILE diff --git a/qemu-img.c b/qemu-img.c index 4c8e2f3849..69cc02871b 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -28,7 +28,7 @@ #include "qemu/option.h" #include "qemu/error-report.h" #include "qemu/osdep.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "block/block_int.h" #include #include diff --git a/qemu-progress.c b/qemu-progress.c index 08d67949a1..9a3f96cd47 100644 --- a/qemu-progress.c +++ b/qemu-progress.c @@ -24,7 +24,7 @@ #include "qemu-common.h" #include "qemu/osdep.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include struct progress_state { diff --git a/qemu-seccomp.c b/qemu-seccomp.c index 2a71d6fee9..031da1dfee 100644 --- a/qemu-seccomp.c +++ b/qemu-seccomp.c @@ -14,7 +14,7 @@ */ #include #include -#include "qemu-seccomp.h" +#include "sysemu/seccomp.h" struct QemuSeccompSyscall { int32_t num; diff --git a/qemu-timer.c b/qemu-timer.c index 80b3f2eb31..8fb5c75df7 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "monitor/monitor.h" #include "ui/console.h" diff --git a/qemu-tool.c b/qemu-tool.c index 8ac45ff39b..1a474c45bc 100644 --- a/qemu-tool.c +++ b/qemu-tool.c @@ -19,7 +19,7 @@ #include "qemu/log.h" #include "migration/migration.h" #include "qemu/main-loop.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/sockets.h" #include "slirp/libslirp.h" diff --git a/qmp.c b/qmp.c index 5b3a5d7d03..be63fe1029 100644 --- a/qmp.c +++ b/qmp.c @@ -14,15 +14,15 @@ */ #include "qemu-common.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qmp-commands.h" #include "qemu-char.h" #include "ui/qemu-spice.h" #include "ui/vnc.h" -#include "kvm.h" -#include "arch_init.h" +#include "sysemu/kvm.h" +#include "sysemu/arch_init.h" #include "hw/qdev.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "qom/qom-qobject.h" NameInfo *qmp_query_name(Error **errp) diff --git a/qtest.c b/qtest.c index ebe3963167..468c921310 100644 --- a/qtest.c +++ b/qtest.c @@ -11,14 +11,14 @@ * */ -#include "qtest.h" +#include "sysemu/qtest.h" #include "hw/qdev.h" #include "qemu-char.h" #include "exec/ioport.h" #include "exec/memory.h" #include "hw/irq.h" -#include "sysemu.h" -#include "cpus.h" +#include "sysemu/sysemu.h" +#include "sysemu/cpus.h" #define MAX_IRQ 256 diff --git a/savevm.c b/savevm.c index ea01e9baf6..b2a844f2b1 100644 --- a/savevm.c +++ b/savevm.c @@ -74,14 +74,14 @@ #include "hw/qdev.h" #include "net/net.h" #include "monitor/monitor.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/timer.h" #include "audio/audio.h" #include "migration/migration.h" #include "qemu/sockets.h" #include "qemu/queue.h" #include "qemu/timer.h" -#include "cpus.h" +#include "sysemu/cpus.h" #include "exec/memory.h" #include "qmp-commands.h" #include "trace.h" diff --git a/stubs/arch-query-cpu-def.c b/stubs/arch-query-cpu-def.c index 6eca8527d2..fa6789598a 100644 --- a/stubs/arch-query-cpu-def.c +++ b/stubs/arch-query-cpu-def.c @@ -1,5 +1,5 @@ #include "qemu-common.h" -#include "arch_init.h" +#include "sysemu/arch_init.h" #include "qapi/qmp/qerror.h" CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp) diff --git a/target-alpha/sys_helper.c b/target-alpha/sys_helper.c index 2bc2b02815..434a63a97d 100644 --- a/target-alpha/sys_helper.c +++ b/target-alpha/sys_helper.c @@ -19,7 +19,7 @@ #include "cpu.h" #include "helper.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/timer.h" diff --git a/target-arm/cpu.c b/target-arm/cpu.c index b00f5fa547..17875ed0f0 100644 --- a/target-arm/cpu.c +++ b/target-arm/cpu.c @@ -23,7 +23,7 @@ #if !defined(CONFIG_USER_ONLY) #include "hw/loader.h" #endif -#include "sysemu.h" +#include "sysemu/sysemu.h" static void cp_reg_reset(gpointer key, gpointer value, gpointer opaque) { diff --git a/target-arm/helper.c b/target-arm/helper.c index eef2acd18a..e343fac853 100644 --- a/target-arm/helper.c +++ b/target-arm/helper.c @@ -2,7 +2,7 @@ #include "exec/gdbstub.h" #include "helper.h" #include "qemu/host-utils.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/bitops.h" #ifndef CONFIG_USER_ONLY diff --git a/target-i386/arch_dump.c b/target-i386/arch_dump.c index 50d866f4c6..8209ce9ee2 100644 --- a/target-i386/arch_dump.c +++ b/target-i386/arch_dump.c @@ -13,7 +13,7 @@ #include "cpu.h" #include "exec/cpu-all.h" -#include "dump.h" +#include "sysemu/dump.h" #include "elf.h" #ifdef TARGET_X86_64 diff --git a/target-i386/arch_memory_mapping.c b/target-i386/arch_memory_mapping.c index 6dfb0f3f56..c6c7874474 100644 --- a/target-i386/arch_memory_mapping.c +++ b/target-i386/arch_memory_mapping.c @@ -13,7 +13,7 @@ #include "cpu.h" #include "exec/cpu-all.h" -#include "memory_mapping.h" +#include "sysemu/memory_mapping.h" /* PAE Paging or IA-32e Paging */ static void walk_pte(MemoryMappingList *list, hwaddr pte_start_addr, diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 8abc5561e9..1837f5af04 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -22,14 +22,14 @@ #include #include "cpu.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "qemu/option.h" #include "qemu/config-file.h" #include "qapi/qmp/qerror.h" #include "qapi/visitor.h" -#include "arch_init.h" +#include "sysemu/arch_init.h" #include "hyperv.h" @@ -38,7 +38,7 @@ #include #endif -#include "sysemu.h" +#include "sysemu/sysemu.h" #ifndef CONFIG_USER_ONLY #include "hw/xen.h" #include "hw/sysbus.h" diff --git a/target-i386/excp_helper.c b/target-i386/excp_helper.c index 64c8346d3b..179ea82f0f 100644 --- a/target-i386/excp_helper.c +++ b/target-i386/excp_helper.c @@ -19,7 +19,7 @@ #include "cpu.h" #include "qemu/log.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "helper.h" #if 0 diff --git a/target-i386/helper.c b/target-i386/helper.c index bd47b8e58e..dca1360962 100644 --- a/target-i386/helper.c +++ b/target-i386/helper.c @@ -18,9 +18,9 @@ */ #include "cpu.h" -#include "kvm.h" +#include "sysemu/kvm.h" #ifndef CONFIG_USER_ONLY -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "monitor/monitor.h" #endif diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 340ed3f33e..f63b1fbfda 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -21,8 +21,8 @@ #include #include "qemu-common.h" -#include "sysemu.h" -#include "kvm.h" +#include "sysemu/sysemu.h" +#include "sysemu/kvm.h" #include "kvm_i386.h" #include "cpu.h" #include "exec/gdbstub.h" diff --git a/target-i386/kvm_i386.h b/target-i386/kvm_i386.h index f6ab82f93c..4392ab4359 100644 --- a/target-i386/kvm_i386.h +++ b/target-i386/kvm_i386.h @@ -11,7 +11,7 @@ #ifndef QEMU_KVM_I386_H #define QEMU_KVM_I386_H -#include "kvm.h" +#include "sysemu/kvm.h" bool kvm_allows_irq0_override(void); diff --git a/target-i386/machine.c b/target-i386/machine.c index 477150887b..8c1fed1005 100644 --- a/target-i386/machine.c +++ b/target-i386/machine.c @@ -4,7 +4,7 @@ #include "hw/isa.h" #include "cpu.h" -#include "kvm.h" +#include "sysemu/kvm.h" static const VMStateDescription vmstate_segment = { .name = "segment", diff --git a/target-m68k/m68k-semi.c b/target-m68k/m68k-semi.c index e6c7dd2f9b..239fadbad5 100644 --- a/target-m68k/m68k-semi.c +++ b/target-m68k/m68k-semi.c @@ -36,7 +36,7 @@ #include "exec/gdbstub.h" #include "exec/softmmu-semi.h" #endif -#include "sysemu.h" +#include "sysemu/sysemu.h" #define HOSTED_EXIT 0 #define HOSTED_INIT_SIM 1 diff --git a/target-ppc/helper.c b/target-ppc/helper.c index 48b19a7e1d..103855afe0 100644 --- a/target-ppc/helper.c +++ b/target-ppc/helper.c @@ -19,9 +19,9 @@ #include "cpu.h" #include "helper_regs.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "kvm_ppc.h" -#include "cpus.h" +#include "sysemu/cpus.h" PowerPCCPU *cpu_ppc_init(const char *cpu_model) { diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c index 2546c577f6..88650d4ae4 100644 --- a/target-ppc/kvm.c +++ b/target-ppc/kvm.c @@ -24,12 +24,12 @@ #include "qemu-common.h" #include "qemu/timer.h" -#include "sysemu.h" -#include "kvm.h" +#include "sysemu/sysemu.h" +#include "sysemu/kvm.h" #include "kvm_ppc.h" #include "cpu.h" -#include "cpus.h" -#include "device_tree.h" +#include "sysemu/cpus.h" +#include "sysemu/device_tree.h" #include "hw/sysbus.h" #include "hw/spapr.h" diff --git a/target-ppc/kvm_ppc.c b/target-ppc/kvm_ppc.c index 2de59fd43b..1b192a8038 100644 --- a/target-ppc/kvm_ppc.c +++ b/target-ppc/kvm_ppc.c @@ -14,7 +14,7 @@ #include "qemu-common.h" #include "qemu/timer.h" #include "kvm_ppc.h" -#include "device_tree.h" +#include "sysemu/device_tree.h" #define PROC_DEVTREE_PATH "/proc/device-tree" diff --git a/target-ppc/machine.c b/target-ppc/machine.c index 5e7bc00e26..e014c0c1af 100644 --- a/target-ppc/machine.c +++ b/target-ppc/machine.c @@ -1,6 +1,6 @@ #include "hw/hw.h" #include "hw/boards.h" -#include "kvm.h" +#include "sysemu/kvm.h" void cpu_save(QEMUFile *f, void *opaque) { diff --git a/target-ppc/mmu_helper.c b/target-ppc/mmu_helper.c index 318ce92adb..0aee7a9063 100644 --- a/target-ppc/mmu_helper.c +++ b/target-ppc/mmu_helper.c @@ -18,7 +18,7 @@ */ #include "cpu.h" #include "helper.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "kvm_ppc.h" //#define DEBUG_MMU diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c index cca63abf5d..42ed748b59 100644 --- a/target-ppc/translate_init.c +++ b/target-ppc/translate_init.c @@ -25,9 +25,9 @@ #include "disas/bfd.h" #include "exec/gdbstub.h" -#include +#include #include "kvm_ppc.h" -#include "arch_init.h" +#include "sysemu/arch_init.h" //#define PPC_DUMP_CPU //#define PPC_DEBUG_SPR diff --git a/target-s390x/helper.c b/target-s390x/helper.c index 8e135457a3..42e06eb85e 100644 --- a/target-s390x/helper.c +++ b/target-s390x/helper.c @@ -22,7 +22,7 @@ #include "exec/gdbstub.h" #include "qemu/timer.h" #ifndef CONFIG_USER_ONLY -#include "sysemu.h" +#include "sysemu/sysemu.h" #endif //#define DEBUG_S390 diff --git a/target-s390x/interrupt.c b/target-s390x/interrupt.c index c1b034f775..6c0024b426 100644 --- a/target-s390x/interrupt.c +++ b/target-s390x/interrupt.c @@ -8,7 +8,7 @@ */ #include "cpu.h" -#include "kvm.h" +#include "sysemu/kvm.h" #if !defined(CONFIG_USER_ONLY) /* service interrupts are floating therefore we must not pass an cpustate */ diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index dc70699919..762231d845 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -26,10 +26,10 @@ #include "qemu-common.h" #include "qemu/timer.h" -#include "sysemu.h" -#include "kvm.h" +#include "sysemu/sysemu.h" +#include "sysemu/kvm.h" #include "cpu.h" -#include "device_tree.h" +#include "sysemu/device_tree.h" /* #define DEBUG_KVM */ diff --git a/target-s390x/misc_helper.c b/target-s390x/misc_helper.c index 2e73d30756..e521ed55cc 100644 --- a/target-s390x/misc_helper.c +++ b/target-s390x/misc_helper.c @@ -23,7 +23,7 @@ #include "qemu/host-utils.h" #include "helper.h" #include -#include "kvm.h" +#include "sysemu/kvm.h" #include "qemu/timer.h" #ifdef CONFIG_KVM #include @@ -31,7 +31,7 @@ #if !defined(CONFIG_USER_ONLY) #include "exec/softmmu_exec.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #endif /* #define DEBUG_HELPER */ diff --git a/target-sparc/helper.c b/target-sparc/helper.c index e0d78f3852..91ecfc7aa8 100644 --- a/target-sparc/helper.c +++ b/target-sparc/helper.c @@ -20,7 +20,7 @@ #include "cpu.h" #include "qemu/host-utils.h" #include "helper.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" void helper_raise_exception(CPUSPARCState *env, int tt) { diff --git a/target-sparc/int32_helper.c b/target-sparc/int32_helper.c index 507c355cac..c35f522e0f 100644 --- a/target-sparc/int32_helper.c +++ b/target-sparc/int32_helper.c @@ -19,7 +19,7 @@ #include "cpu.h" #include "trace.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #define DEBUG_PCALL diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index f61a497d21..0a037291ef 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -35,7 +35,7 @@ #include "disas/disas.h" #include "tcg-op.h" #include "qemu/log.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "helper.h" #define GEN_HELPER 1 diff --git a/ui/cocoa.m b/ui/cocoa.m index 0afa6f86dd..3bf1c6e890 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -27,7 +27,7 @@ #include "qemu-common.h" #include "ui/console.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #ifndef MAC_OS_X_VERSION_10_4 #define MAC_OS_X_VERSION_10_4 1040 diff --git a/ui/curses.c b/ui/curses.c index 5d15e9e16e..d78e378440 100644 --- a/ui/curses.c +++ b/ui/curses.c @@ -30,7 +30,7 @@ #include "qemu-common.h" #include "ui/console.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #define FONT_HEIGHT 16 #define FONT_WIDTH 8 diff --git a/ui/input.c b/ui/input.c index 05f6c0c849..259fd1808d 100644 --- a/ui/input.c +++ b/ui/input.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "monitor/monitor.h" #include "ui/console.h" #include "qapi/error.h" diff --git a/ui/keymaps.c b/ui/keymaps.c index f55a2aa464..9625d82fa1 100644 --- a/ui/keymaps.c +++ b/ui/keymaps.c @@ -23,7 +23,7 @@ */ #include "keymaps.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" static int get_keysym(const name2keysym_t *table, const char *name) diff --git a/ui/sdl.c b/ui/sdl.c index bcbf89daeb..1657848e9f 100644 --- a/ui/sdl.c +++ b/ui/sdl.c @@ -30,7 +30,7 @@ #include "qemu-common.h" #include "ui/console.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "x_keymap.h" #include "sdl_zoom.h" diff --git a/ui/spice-core.c b/ui/spice-core.c index 8727bf49ca..5fe3e0e4cf 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -19,7 +19,7 @@ #include #include -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu-common.h" #include "ui/qemu-spice.h" diff --git a/ui/spice-display.c b/ui/spice-display.c index a19b3d95fb..dc7e58d0ed 100644 --- a/ui/spice-display.c +++ b/ui/spice-display.c @@ -21,7 +21,7 @@ #include "qemu/queue.h" #include "monitor/monitor.h" #include "ui/console.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "trace.h" #include "ui/spice-display.h" diff --git a/ui/vnc.c b/ui/vnc.c index d9e5315e79..8912b78945 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -26,7 +26,7 @@ #include "vnc.h" #include "vnc-jobs.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "qemu/sockets.h" #include "qemu/timer.h" #include "qemu/acl.h" diff --git a/vl.c b/vl.c index 9b80e7abc4..75a30a1720 100644 --- a/vl.c +++ b/vl.c @@ -65,7 +65,7 @@ #endif #ifdef CONFIG_SECCOMP -#include "qemu-seccomp.h" +#include "sysemu/seccomp.h" #endif #ifdef __sun__ @@ -131,18 +131,18 @@ int main(int argc, char **argv) #include "net/slirp.h" #include "monitor/monitor.h" #include "ui/console.h" -#include "sysemu.h" +#include "sysemu/sysemu.h" #include "exec/gdbstub.h" #include "qemu/timer.h" #include "qemu-char.h" #include "qemu/cache-utils.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "hw/block-common.h" #include "migration/block.h" -#include "dma.h" +#include "sysemu/dma.h" #include "audio/audio.h" #include "migration/migration.h" -#include "kvm.h" +#include "sysemu/kvm.h" #include "qapi/qmp/qjson.h" #include "qemu/option.h" #include "qemu/config-file.h" @@ -152,7 +152,7 @@ int main(int argc, char **argv) #ifdef CONFIG_VIRTFS #include "fsdev/qemu-fsdev.h" #endif -#include "qtest.h" +#include "sysemu/qtest.h" #include "disas/disas.h" @@ -163,8 +163,8 @@ int main(int argc, char **argv) #include "trace.h" #include "trace/control.h" #include "qemu/queue.h" -#include "cpus.h" -#include "arch_init.h" +#include "sysemu/cpus.h" +#include "sysemu/arch_init.h" #include "qemu/osdep.h" #include "ui/qemu-spice.h" diff --git a/xen-all.c b/xen-all.c index 6965626db8..b659321184 100644 --- a/xen-all.c +++ b/xen-all.c @@ -17,7 +17,7 @@ #include "qmp-commands.h" #include "qemu/range.h" -#include "xen-mapcache.h" +#include "sysemu/xen-mapcache.h" #include "trace.h" #include "exec/address-spaces.h" diff --git a/xen-mapcache.c b/xen-mapcache.c index 8f4648cc32..dc6d1fadb7 100644 --- a/xen-mapcache.c +++ b/xen-mapcache.c @@ -13,13 +13,13 @@ #include #include "hw/xen_backend.h" -#include "blockdev.h" +#include "sysemu/blockdev.h" #include "qemu/bitmap.h" #include #include -#include "xen-mapcache.h" +#include "sysemu/xen-mapcache.h" #include "trace.h" From 927d4878b0ff319ed87fed9363f314613b0a5ed9 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 17 Dec 2012 18:20:05 +0100 Subject: [PATCH 257/300] softmmu: move remaining include files to include/ subdirectories Signed-off-by: Paolo Bonzini --- backends/rng-egd.c | 2 +- bt-host.c | 2 +- bt-vhci.c | 2 +- event_notifier-posix.c | 2 +- gdbstub.c | 2 +- hmp.c | 2 +- hw/baum.c | 2 +- hw/bt-hci-csr.c | 4 ++-- hw/bt-hci.c | 2 +- hw/bt.c | 2 +- hw/cadence_uart.c | 2 +- hw/ccid-card-emulated.c | 2 +- hw/ccid-card-passthru.c | 2 +- hw/debugcon.c | 2 +- hw/escc.c | 2 +- hw/etraxfs_ser.c | 2 +- hw/exynos4210_uart.c | 2 +- hw/grlib_apbuart.c | 2 +- hw/imx_serial.c | 2 +- hw/ivshmem.c | 2 +- hw/leon3.c | 2 +- hw/lm32_juart.c | 2 +- hw/lm32_uart.c | 2 +- hw/mcf_uart.c | 2 +- hw/milkymist-uart.c | 2 +- hw/mips_fulong2e.c | 2 +- hw/mips_malta.c | 2 +- hw/msmouse.c | 2 +- hw/omap2.c | 2 +- hw/omap_uart.c | 2 +- hw/parallel.c | 2 +- hw/pl011.c | 2 +- hw/pxa2xx.c | 2 +- hw/qdev-properties.c | 2 +- hw/s390x/sclpconsole.c | 2 +- hw/serial.c | 2 +- hw/sh_serial.c | 2 +- hw/spapr_events.c | 2 +- hw/spapr_rtas.c | 2 +- hw/spapr_vty.c | 2 +- hw/strongarm.c | 2 +- hw/usb/dev-bluetooth.c | 2 +- hw/usb/dev-serial.c | 2 +- hw/virtio-console.c | 2 +- hw/xen_backend.c | 2 +- hw/xen_console.c | 2 +- hw/xenfb.c | 2 +- hw/xgmac.c | 2 +- hw/xilinx_uartlite.c | 2 +- hw/xtensa_lx60.c | 2 +- bt-host.h => include/bt/bt.h | 0 qemu-char.h => include/char/char.h | 0 monitor.c | 2 +- net/slirp.c | 2 +- qemu-char.c | 2 +- qmp.c | 2 +- qtest.c | 2 +- slirp/slirp.c | 2 +- spice-qemu-char.c | 2 +- ui/console.c | 2 +- vl.c | 4 ++-- 61 files changed, 61 insertions(+), 61 deletions(-) rename bt-host.h => include/bt/bt.h (100%) rename qemu-char.h => include/char/char.h (100%) diff --git a/backends/rng-egd.c b/backends/rng-egd.c index 3a7d1ecbe0..fd41b53188 100644 --- a/backends/rng-egd.c +++ b/backends/rng-egd.c @@ -11,7 +11,7 @@ */ #include "qemu/rng.h" -#include "qemu-char.h" +#include "char/char.h" #include "qapi/qmp/qerror.h" #include "hw/qdev.h" /* just for DEFINE_PROP_CHR */ diff --git a/bt-host.c b/bt-host.c index 4f5f9f93c5..2092754530 100644 --- a/bt-host.c +++ b/bt-host.c @@ -18,7 +18,7 @@ */ #include "qemu-common.h" -#include "bt-host.h" +#include "bt/bt.h" #include "qemu/main-loop.h" #ifndef _WIN32 diff --git a/bt-vhci.c b/bt-vhci.c index f5d856a809..a6a7ab0329 100644 --- a/bt-vhci.c +++ b/bt-vhci.c @@ -18,7 +18,7 @@ */ #include "qemu-common.h" -#include "bt-host.h" +#include "bt/bt.h" #include "hw/bt.h" #include "qemu/main-loop.h" diff --git a/event_notifier-posix.c b/event_notifier-posix.c index a53b95688d..713d7560d0 100644 --- a/event_notifier-posix.c +++ b/event_notifier-posix.c @@ -12,7 +12,7 @@ #include "qemu-common.h" #include "qemu/event_notifier.h" -#include "qemu-char.h" +#include "char/char.h" #include "qemu/main-loop.h" #ifdef CONFIG_EVENTFD diff --git a/gdbstub.c b/gdbstub.c index 2fca1a7ebf..a8dd437ec0 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -30,7 +30,7 @@ #include "qemu.h" #else #include "monitor/monitor.h" -#include "qemu-char.h" +#include "char/char.h" #include "sysemu/sysemu.h" #include "exec/gdbstub.h" #endif diff --git a/hmp.c b/hmp.c index 3d056b0e38..9e9e62450e 100644 --- a/hmp.c +++ b/hmp.c @@ -15,7 +15,7 @@ #include "hmp.h" #include "net/net.h" -#include "qemu-char.h" +#include "char/char.h" #include "qemu/option.h" #include "qemu/timer.h" #include "qmp-commands.h" diff --git a/hw/baum.c b/hw/baum.c index 97d13ea344..09dcb9cc74 100644 --- a/hw/baum.c +++ b/hw/baum.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#include "qemu-char.h" +#include "char/char.h" #include "qemu/timer.h" #include "usb.h" #include "baum.h" diff --git a/hw/bt-hci-csr.c b/hw/bt-hci-csr.c index e1dcb6d099..2070bb940c 100644 --- a/hw/bt-hci-csr.c +++ b/hw/bt-hci-csr.c @@ -19,10 +19,10 @@ */ #include "qemu-common.h" -#include "qemu-char.h" +#include "char/char.h" #include "qemu/timer.h" #include "irq.h" -#include "bt-host.h" +#include "bt/bt.h" #include "bt.h" struct csrhci_s { diff --git a/hw/bt-hci.c b/hw/bt-hci.c index da096d8c37..69d2c73862 100644 --- a/hw/bt-hci.c +++ b/hw/bt-hci.c @@ -21,7 +21,7 @@ #include "qemu-common.h" #include "qemu/timer.h" #include "usb.h" -#include "bt-host.h" +#include "bt/bt.h" #include "bt.h" struct bt_hci_s { diff --git a/hw/bt.c b/hw/bt.c index 3fea0983d4..4f2372d794 100644 --- a/hw/bt.c +++ b/hw/bt.c @@ -18,7 +18,7 @@ */ #include "qemu-common.h" -#include "bt-host.h" +#include "bt/bt.h" #include "bt.h" /* Slave implementations can ignore this */ diff --git a/hw/cadence_uart.c b/hw/cadence_uart.c index f34acc8c46..7dd2fe54ed 100644 --- a/hw/cadence_uart.c +++ b/hw/cadence_uart.c @@ -17,7 +17,7 @@ */ #include "sysbus.h" -#include "qemu-char.h" +#include "char/char.h" #include "qemu/timer.h" #ifdef CADENCE_UART_ERR_DEBUG diff --git a/hw/ccid-card-emulated.c b/hw/ccid-card-emulated.c index e508380482..6fd44695ae 100644 --- a/hw/ccid-card-emulated.c +++ b/hw/ccid-card-emulated.c @@ -32,7 +32,7 @@ #include #include "qemu/thread.h" -#include "qemu-char.h" +#include "char/char.h" #include "monitor/monitor.h" #include "hw/ccid.h" diff --git a/hw/ccid-card-passthru.c b/hw/ccid-card-passthru.c index 48e4228b9d..4be05471a9 100644 --- a/hw/ccid-card-passthru.c +++ b/hw/ccid-card-passthru.c @@ -8,7 +8,7 @@ * See the COPYING file in the top-level directory. */ -#include "qemu-char.h" +#include "char/char.h" #include "qemu/sockets.h" #include "monitor/monitor.h" #include "hw/ccid.h" diff --git a/hw/debugcon.c b/hw/debugcon.c index 14ab326be3..14f83f1962 100644 --- a/hw/debugcon.c +++ b/hw/debugcon.c @@ -25,7 +25,7 @@ */ #include "hw.h" -#include "qemu-char.h" +#include "char/char.h" #include "isa.h" #include "pc.h" diff --git a/hw/escc.c b/hw/escc.c index 38e8164e44..f09904aae4 100644 --- a/hw/escc.c +++ b/hw/escc.c @@ -25,7 +25,7 @@ #include "hw.h" #include "sysbus.h" #include "escc.h" -#include "qemu-char.h" +#include "char/char.h" #include "ui/console.h" #include "trace.h" diff --git a/hw/etraxfs_ser.c b/hw/etraxfs_ser.c index 59cb7d2172..7bde8004d0 100644 --- a/hw/etraxfs_ser.c +++ b/hw/etraxfs_ser.c @@ -23,7 +23,7 @@ */ #include "sysbus.h" -#include "qemu-char.h" +#include "char/char.h" #include "qemu/log.h" #define D(x) diff --git a/hw/exynos4210_uart.c b/hw/exynos4210_uart.c index 8950891a00..4f23079095 100644 --- a/hw/exynos4210_uart.c +++ b/hw/exynos4210_uart.c @@ -21,7 +21,7 @@ #include "sysbus.h" #include "sysemu/sysemu.h" -#include "qemu-char.h" +#include "char/char.h" #include "exynos4210.h" diff --git a/hw/grlib_apbuart.c b/hw/grlib_apbuart.c index 0865764deb..88c46780d1 100644 --- a/hw/grlib_apbuart.c +++ b/hw/grlib_apbuart.c @@ -23,7 +23,7 @@ */ #include "sysbus.h" -#include "qemu-char.h" +#include "char/char.h" #include "trace.h" diff --git a/hw/imx_serial.c b/hw/imx_serial.c index e56e3ea726..124dbb2860 100644 --- a/hw/imx_serial.c +++ b/hw/imx_serial.c @@ -20,7 +20,7 @@ #include "hw.h" #include "sysbus.h" #include "sysemu/sysemu.h" -#include "qemu-char.h" +#include "char/char.h" #include "imx.h" //#define DEBUG_SERIAL 1 diff --git a/hw/ivshmem.c b/hw/ivshmem.c index 567c9a76a7..fcf5d05bae 100644 --- a/hw/ivshmem.c +++ b/hw/ivshmem.c @@ -24,7 +24,7 @@ #include "migration/migration.h" #include "qapi/qmp/qerror.h" #include "qemu/event_notifier.h" -#include "qemu-char.h" +#include "char/char.h" #include #include diff --git a/hw/leon3.c b/hw/leon3.c index d1d4541867..79b3a41def 100644 --- a/hw/leon3.c +++ b/hw/leon3.c @@ -24,7 +24,7 @@ #include "hw.h" #include "qemu/timer.h" #include "ptimer.h" -#include "qemu-char.h" +#include "char/char.h" #include "sysemu/sysemu.h" #include "boards.h" #include "loader.h" diff --git a/hw/lm32_juart.c b/hw/lm32_juart.c index f07ed3977f..7c2d202d6a 100644 --- a/hw/lm32_juart.c +++ b/hw/lm32_juart.c @@ -20,7 +20,7 @@ #include "hw.h" #include "sysbus.h" #include "trace.h" -#include "qemu-char.h" +#include "char/char.h" #include "lm32_juart.h" diff --git a/hw/lm32_uart.c b/hw/lm32_uart.c index bf2f507523..89605b8e77 100644 --- a/hw/lm32_uart.c +++ b/hw/lm32_uart.c @@ -25,7 +25,7 @@ #include "hw.h" #include "sysbus.h" #include "trace.h" -#include "qemu-char.h" +#include "char/char.h" #include "qemu/error-report.h" enum { diff --git a/hw/mcf_uart.c b/hw/mcf_uart.c index 2eca2c6ae9..c44344317a 100644 --- a/hw/mcf_uart.c +++ b/hw/mcf_uart.c @@ -7,7 +7,7 @@ */ #include "hw.h" #include "mcf.h" -#include "qemu-char.h" +#include "char/char.h" #include "exec/address-spaces.h" typedef struct { diff --git a/hw/milkymist-uart.c b/hw/milkymist-uart.c index ef5518e5c2..19e9dbdc75 100644 --- a/hw/milkymist-uart.c +++ b/hw/milkymist-uart.c @@ -24,7 +24,7 @@ #include "hw.h" #include "sysbus.h" #include "trace.h" -#include "qemu-char.h" +#include "char/char.h" #include "qemu/error-report.h" enum { diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c index e7eeda319e..4d8ee8c09c 100644 --- a/hw/mips_fulong2e.c +++ b/hw/mips_fulong2e.c @@ -30,7 +30,7 @@ #include "mips.h" #include "mips_cpudevs.h" #include "pci/pci.h" -#include "qemu-char.h" +#include "char/char.h" #include "sysemu/sysemu.h" #include "audio/audio.h" #include "qemu/log.h" diff --git a/hw/mips_malta.c b/hw/mips_malta.c index bd31ced29d..635143d20c 100644 --- a/hw/mips_malta.c +++ b/hw/mips_malta.c @@ -34,7 +34,7 @@ #include "mips.h" #include "mips_cpudevs.h" #include "pci/pci.h" -#include "qemu-char.h" +#include "char/char.h" #include "sysemu/sysemu.h" #include "sysemu/arch_init.h" #include "boards.h" diff --git a/hw/msmouse.c b/hw/msmouse.c index decb1a3b5d..ef47aed4e9 100644 --- a/hw/msmouse.c +++ b/hw/msmouse.c @@ -23,7 +23,7 @@ */ #include #include "qemu-common.h" -#include "qemu-char.h" +#include "char/char.h" #include "ui/console.h" #include "msmouse.h" diff --git a/hw/omap2.c b/hw/omap2.c index dc6867c962..c8358500bc 100644 --- a/hw/omap2.c +++ b/hw/omap2.c @@ -24,7 +24,7 @@ #include "omap.h" #include "sysemu/sysemu.h" #include "qemu/timer.h" -#include "qemu-char.h" +#include "char/char.h" #include "flash.h" #include "soc_dma.h" #include "sysbus.h" diff --git a/hw/omap_uart.c b/hw/omap_uart.c index 159b2d1cdd..0ebfbf8cae 100644 --- a/hw/omap_uart.c +++ b/hw/omap_uart.c @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License along * with this program; if not, see . */ -#include "qemu-char.h" +#include "char/char.h" #include "hw.h" #include "omap.h" #include "serial.h" diff --git a/hw/parallel.c b/hw/parallel.c index 56b3760e8c..64a46c6055 100644 --- a/hw/parallel.c +++ b/hw/parallel.c @@ -23,7 +23,7 @@ * THE SOFTWARE. */ #include "hw.h" -#include "qemu-char.h" +#include "char/char.h" #include "isa.h" #include "pc.h" #include "sysemu/sysemu.h" diff --git a/hw/pl011.c b/hw/pl011.c index 1f7ce2f94c..35835f36c0 100644 --- a/hw/pl011.c +++ b/hw/pl011.c @@ -8,7 +8,7 @@ */ #include "sysbus.h" -#include "qemu-char.h" +#include "char/char.h" typedef struct { SysBusDevice busdev; diff --git a/hw/pxa2xx.c b/hw/pxa2xx.c index 936e9f87cd..3c51bc82aa 100644 --- a/hw/pxa2xx.c +++ b/hw/pxa2xx.c @@ -13,7 +13,7 @@ #include "serial.h" #include "i2c.h" #include "ssi.h" -#include "qemu-char.h" +#include "char/char.h" #include "sysemu/blockdev.h" static struct { diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c index 1cb97ea594..04d605dd37 100644 --- a/hw/qdev-properties.c +++ b/hw/qdev-properties.c @@ -5,7 +5,7 @@ #include "hw/block-common.h" #include "net/hub.h" #include "qapi/visitor.h" -#include "qemu-char.h" +#include "char/char.h" void *qdev_get_prop_ptr(DeviceState *dev, Property *prop) { diff --git a/hw/s390x/sclpconsole.c b/hw/s390x/sclpconsole.c index ca78d6796a..aa70e16665 100644 --- a/hw/s390x/sclpconsole.c +++ b/hw/s390x/sclpconsole.c @@ -17,7 +17,7 @@ #include "sclp.h" #include "event-facility.h" -#include "qemu-char.h" +#include "char/char.h" typedef struct ASCIIConsoleData { EventBufferHeader ebh; diff --git a/hw/serial.c b/hw/serial.c index 2cbb5447a7..a5b2a0c609 100644 --- a/hw/serial.c +++ b/hw/serial.c @@ -24,7 +24,7 @@ */ #include "serial.h" -#include "qemu-char.h" +#include "char/char.h" #include "qemu/timer.h" #include "exec/address-spaces.h" diff --git a/hw/sh_serial.c b/hw/sh_serial.c index 63723496f1..21c5b1362d 100644 --- a/hw/sh_serial.c +++ b/hw/sh_serial.c @@ -26,7 +26,7 @@ */ #include "hw.h" #include "sh.h" -#include "qemu-char.h" +#include "char/char.h" #include "exec/address-spaces.h" //#define DEBUG_SERIAL diff --git a/hw/spapr_events.c b/hw/spapr_events.c index 7956601466..ce78f0922e 100644 --- a/hw/spapr_events.c +++ b/hw/spapr_events.c @@ -26,7 +26,7 @@ */ #include "cpu.h" #include "sysemu/sysemu.h" -#include "qemu-char.h" +#include "char/char.h" #include "hw/qdev.h" #include "sysemu/device_tree.h" diff --git a/hw/spapr_rtas.c b/hw/spapr_rtas.c index d29736285c..81eecd0940 100644 --- a/hw/spapr_rtas.c +++ b/hw/spapr_rtas.c @@ -26,7 +26,7 @@ */ #include "cpu.h" #include "sysemu/sysemu.h" -#include "qemu-char.h" +#include "char/char.h" #include "hw/qdev.h" #include "sysemu/device_tree.h" diff --git a/hw/spapr_vty.c b/hw/spapr_vty.c index 14f862fba1..ec81a7e6e8 100644 --- a/hw/spapr_vty.c +++ b/hw/spapr_vty.c @@ -1,5 +1,5 @@ #include "qdev.h" -#include "qemu-char.h" +#include "char/char.h" #include "hw/spapr.h" #include "hw/spapr_vio.h" diff --git a/hw/strongarm.c b/hw/strongarm.c index 5d5f454b1d..804c1a37a6 100644 --- a/hw/strongarm.c +++ b/hw/strongarm.c @@ -30,7 +30,7 @@ #include "strongarm.h" #include "qemu/error-report.h" #include "arm-misc.h" -#include "qemu-char.h" +#include "char/char.h" #include "sysemu/sysemu.h" #include "ssi.h" diff --git a/hw/usb/dev-bluetooth.c b/hw/usb/dev-bluetooth.c index 4a37442288..a0d7a88d91 100644 --- a/hw/usb/dev-bluetooth.c +++ b/hw/usb/dev-bluetooth.c @@ -21,7 +21,7 @@ #include "qemu-common.h" #include "hw/usb.h" #include "hw/usb/desc.h" -#include "bt-host.h" +#include "bt/bt.h" #include "hw/bt.h" struct USBBtState { diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c index 2ff4fe247a..20cf5337b7 100644 --- a/hw/usb/dev-serial.c +++ b/hw/usb/dev-serial.c @@ -12,7 +12,7 @@ #include "qemu/error-report.h" #include "hw/usb.h" #include "hw/usb/desc.h" -#include "qemu-char.h" +#include "char/char.h" //#define DEBUG_Serial diff --git a/hw/virtio-console.c b/hw/virtio-console.c index df0951e973..002b028b99 100644 --- a/hw/virtio-console.c +++ b/hw/virtio-console.c @@ -10,7 +10,7 @@ * the COPYING file in the top-level directory. */ -#include "qemu-char.h" +#include "char/char.h" #include "qemu/error-report.h" #include "trace.h" #include "virtio-serial.h" diff --git a/hw/xen_backend.c b/hw/xen_backend.c index 270584fc10..3fa30098ca 100644 --- a/hw/xen_backend.c +++ b/hw/xen_backend.c @@ -35,7 +35,7 @@ #include #include "hw.h" -#include "qemu-char.h" +#include "char/char.h" #include "qemu/log.h" #include "xen_backend.h" diff --git a/hw/xen_console.c b/hw/xen_console.c index 9426d7374f..ac36ceb47c 100644 --- a/hw/xen_console.c +++ b/hw/xen_console.c @@ -30,7 +30,7 @@ #include #include "hw.h" -#include "qemu-char.h" +#include "char/char.h" #include "xen_backend.h" #include diff --git a/hw/xenfb.c b/hw/xenfb.c index b1122bd933..903efd3073 100644 --- a/hw/xenfb.c +++ b/hw/xenfb.c @@ -37,7 +37,7 @@ #include "hw.h" #include "ui/console.h" -#include "qemu-char.h" +#include "char/char.h" #include "xen_backend.h" #include diff --git a/hw/xgmac.c b/hw/xgmac.c index acc3d37648..9639b6141b 100644 --- a/hw/xgmac.c +++ b/hw/xgmac.c @@ -25,7 +25,7 @@ */ #include "sysbus.h" -#include "qemu-char.h" +#include "char/char.h" #include "qemu/log.h" #include "net/net.h" #include "net/checksum.h" diff --git a/hw/xilinx_uartlite.c b/hw/xilinx_uartlite.c index 02c5850331..abd256ae00 100644 --- a/hw/xilinx_uartlite.c +++ b/hw/xilinx_uartlite.c @@ -23,7 +23,7 @@ */ #include "sysbus.h" -#include "qemu-char.h" +#include "char/char.h" #define DUART(x) diff --git a/hw/xtensa_lx60.c b/hw/xtensa_lx60.c index 9c7bb75f81..0b9a52851a 100644 --- a/hw/xtensa_lx60.c +++ b/hw/xtensa_lx60.c @@ -36,7 +36,7 @@ #include "sysbus.h" #include "flash.h" #include "sysemu/blockdev.h" -#include "qemu-char.h" +#include "char/char.h" #include "xtensa_bootparam.h" typedef struct LxBoardDesc { diff --git a/bt-host.h b/include/bt/bt.h similarity index 100% rename from bt-host.h rename to include/bt/bt.h diff --git a/qemu-char.h b/include/char/char.h similarity index 100% rename from qemu-char.h rename to include/char/char.h diff --git a/monitor.c b/monitor.c index 200bef452f..9cf419bb1d 100644 --- a/monitor.c +++ b/monitor.c @@ -33,7 +33,7 @@ #include "exec/gdbstub.h" #include "net/net.h" #include "net/slirp.h" -#include "qemu-char.h" +#include "char/char.h" #include "ui/qemu-spice.h" #include "sysemu/sysemu.h" #include "monitor/monitor.h" diff --git a/net/slirp.c b/net/slirp.c index 87bdc9d031..c14259f004 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -35,7 +35,7 @@ #include "monitor/monitor.h" #include "qemu/sockets.h" #include "slirp/libslirp.h" -#include "qemu-char.h" +#include "char/char.h" static int get_str_sep(char *buf, int buf_size, const char **pp, int sep) { diff --git a/qemu-char.c b/qemu-char.c index 0cbe85318e..e39e6f168c 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -26,7 +26,7 @@ #include "ui/console.h" #include "sysemu/sysemu.h" #include "qemu/timer.h" -#include "qemu-char.h" +#include "char/char.h" #include "hw/usb.h" #include "hw/baum.h" #include "hw/msmouse.h" diff --git a/qmp.c b/qmp.c index be63fe1029..55b056b558 100644 --- a/qmp.c +++ b/qmp.c @@ -16,7 +16,7 @@ #include "qemu-common.h" #include "sysemu/sysemu.h" #include "qmp-commands.h" -#include "qemu-char.h" +#include "char/char.h" #include "ui/qemu-spice.h" #include "ui/vnc.h" #include "sysemu/kvm.h" diff --git a/qtest.c b/qtest.c index 468c921310..c9b58ceb8b 100644 --- a/qtest.c +++ b/qtest.c @@ -13,7 +13,7 @@ #include "sysemu/qtest.h" #include "hw/qdev.h" -#include "qemu-char.h" +#include "char/char.h" #include "exec/ioport.h" #include "exec/memory.h" #include "hw/irq.h" diff --git a/slirp/slirp.c b/slirp/slirp.c index 4b51a67e7d..e93b578832 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -23,7 +23,7 @@ */ #include "qemu-common.h" #include "qemu/timer.h" -#include "qemu-char.h" +#include "char/char.h" #include "slirp.h" #include "hw/hw.h" diff --git a/spice-qemu-char.c b/spice-qemu-char.c index 41b1657ccd..4b03143f68 100644 --- a/spice-qemu-char.c +++ b/spice-qemu-char.c @@ -1,7 +1,7 @@ #include "config-host.h" #include "trace.h" #include "ui/qemu-spice.h" -#include "qemu-char.h" +#include "char/char.h" #include #include diff --git a/ui/console.c b/ui/console.c index a4bff8ce8a..d880ebff07 100644 --- a/ui/console.c +++ b/ui/console.c @@ -25,7 +25,7 @@ #include "ui/console.h" #include "qemu/timer.h" #include "qmp-commands.h" -#include "qemu-char.h" +#include "char/char.h" //#define DEBUG_CONSOLE #define DEFAULT_BACKSCROLL 512 diff --git a/vl.c b/vl.c index 75a30a1720..e6a8d89acc 100644 --- a/vl.c +++ b/vl.c @@ -126,7 +126,7 @@ int main(int argc, char **argv) #include "hw/xen.h" #include "hw/qdev.h" #include "hw/loader.h" -#include "bt-host.h" +#include "bt/bt.h" #include "net/net.h" #include "net/slirp.h" #include "monitor/monitor.h" @@ -134,7 +134,7 @@ int main(int argc, char **argv) #include "sysemu/sysemu.h" #include "exec/gdbstub.h" #include "qemu/timer.h" -#include "qemu-char.h" +#include "char/char.h" #include "qemu/cache-utils.h" #include "sysemu/blockdev.h" #include "hw/block-common.h" From 6b4c305cbd549e9d12a6b0192fdb8d6519a9664c Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 24 Oct 2012 13:12:00 +0200 Subject: [PATCH 258/300] fpu: move public header file to include/fpu Signed-off-by: Paolo Bonzini --- configure | 2 +- fpu/softfloat.c | 2 +- {fpu => include/fpu}/softfloat.h | 0 include/qemu/bswap.h | 2 +- linux-user/arm/nwfpe/double_cpdo.c | 2 +- linux-user/arm/nwfpe/extended_cpdo.c | 2 +- linux-user/arm/nwfpe/fpa11.h | 2 +- linux-user/arm/nwfpe/fpa11_cpdt.c | 2 +- linux-user/arm/nwfpe/fpa11_cprt.c | 2 +- linux-user/arm/nwfpe/fpopcode.c | 2 +- linux-user/arm/nwfpe/single_cpdo.c | 2 +- target-alpha/cpu.h | 2 +- target-alpha/fpu_helper.c | 2 +- target-alpha/helper.c | 2 +- target-alpha/translate.c | 2 +- target-arm/cpu.h | 2 +- target-i386/cpu.h | 2 +- target-m68k/cpu.h | 2 +- target-microblaze/cpu.h | 2 +- target-mips/cpu.h | 2 +- target-openrisc/cpu.h | 2 +- target-ppc/cpu.h | 2 +- target-s390x/cpu.h | 2 +- target-sh4/cpu.h | 4 +--- target-sparc/cpu.h | 2 +- target-unicore32/cpu.h | 2 +- 26 files changed, 25 insertions(+), 27 deletions(-) rename {fpu => include/fpu}/softfloat.h (100%) diff --git a/configure b/configure index 4d0e1163a2..c989fece9a 100755 --- a/configure +++ b/configure @@ -278,7 +278,7 @@ QEMU_CFLAGS="-fno-strict-aliasing $QEMU_CFLAGS" QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS" QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS" QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS" -QEMU_INCLUDES="-I. -I\$(SRC_PATH) -I\$(SRC_PATH)/include -I\$(SRC_PATH)/fpu" +QEMU_INCLUDES="-I. -I\$(SRC_PATH) -I\$(SRC_PATH)/include" if test "$debug_info" = "yes"; then CFLAGS="-g $CFLAGS" LDFLAGS="-g $LDFLAGS" diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 841314686b..0cfa6b4831 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -40,7 +40,7 @@ these four paragraphs for those parts of this code that are retained. */ #include "config.h" -#include "softfloat.h" +#include "fpu/softfloat.h" /*---------------------------------------------------------------------------- | Primitive arithmetic functions, including multi-word arithmetic, and diff --git a/fpu/softfloat.h b/include/fpu/softfloat.h similarity index 100% rename from fpu/softfloat.h rename to include/fpu/softfloat.h diff --git a/include/qemu/bswap.h b/include/qemu/bswap.h index cc7f84d30f..2006fcd621 100644 --- a/include/qemu/bswap.h +++ b/include/qemu/bswap.h @@ -4,7 +4,7 @@ #include "config-host.h" #include -#include "softfloat.h" +#include "fpu/softfloat.h" #ifdef CONFIG_MACHINE_BSWAP_H #include diff --git a/linux-user/arm/nwfpe/double_cpdo.c b/linux-user/arm/nwfpe/double_cpdo.c index 8e9b28fa68..41c28f3096 100644 --- a/linux-user/arm/nwfpe/double_cpdo.c +++ b/linux-user/arm/nwfpe/double_cpdo.c @@ -19,7 +19,7 @@ */ #include "fpa11.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #include "fpopcode.h" float64 float64_exp(float64 Fm); diff --git a/linux-user/arm/nwfpe/extended_cpdo.c b/linux-user/arm/nwfpe/extended_cpdo.c index 880ce030a5..48eca3b4a6 100644 --- a/linux-user/arm/nwfpe/extended_cpdo.c +++ b/linux-user/arm/nwfpe/extended_cpdo.c @@ -19,7 +19,7 @@ */ #include "fpa11.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #include "fpopcode.h" floatx80 floatx80_exp(floatx80 Fm); diff --git a/linux-user/arm/nwfpe/fpa11.h b/linux-user/arm/nwfpe/fpa11.h index 002b3cbb82..bb9ac6554e 100644 --- a/linux-user/arm/nwfpe/fpa11.h +++ b/linux-user/arm/nwfpe/fpa11.h @@ -43,7 +43,7 @@ extern CPUARMState *user_registers; /* includes */ #include "fpsr.h" /* FP control and status register definitions */ -#include "softfloat.h" +#include "fpu/softfloat.h" #define typeNone 0x00 #define typeSingle 0x01 diff --git a/linux-user/arm/nwfpe/fpa11_cpdt.c b/linux-user/arm/nwfpe/fpa11_cpdt.c index 3e7a938253..007a3d6505 100644 --- a/linux-user/arm/nwfpe/fpa11_cpdt.c +++ b/linux-user/arm/nwfpe/fpa11_cpdt.c @@ -20,7 +20,7 @@ */ #include "fpa11.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #include "fpopcode.h" //#include "fpmodule.h" //#include "fpmodule.inl" diff --git a/linux-user/arm/nwfpe/fpa11_cprt.c b/linux-user/arm/nwfpe/fpa11_cprt.c index 801189798b..7be93fa54f 100644 --- a/linux-user/arm/nwfpe/fpa11_cprt.c +++ b/linux-user/arm/nwfpe/fpa11_cprt.c @@ -20,7 +20,7 @@ */ #include "fpa11.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #include "fpopcode.h" #include "fpa11.inl" //#include "fpmodule.h" diff --git a/linux-user/arm/nwfpe/fpopcode.c b/linux-user/arm/nwfpe/fpopcode.c index 82ac92f0ce..0dc5c9cd5d 100644 --- a/linux-user/arm/nwfpe/fpopcode.c +++ b/linux-user/arm/nwfpe/fpopcode.c @@ -19,7 +19,7 @@ */ #include "fpa11.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #include "fpopcode.h" #include "fpsr.h" //#include "fpmodule.h" diff --git a/linux-user/arm/nwfpe/single_cpdo.c b/linux-user/arm/nwfpe/single_cpdo.c index 26168e2201..2bfb359eb6 100644 --- a/linux-user/arm/nwfpe/single_cpdo.c +++ b/linux-user/arm/nwfpe/single_cpdo.c @@ -19,7 +19,7 @@ */ #include "fpa11.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #include "fpopcode.h" float32 float32_exp(float32 Fm); diff --git a/target-alpha/cpu.h b/target-alpha/cpu.h index 137703f6d7..b75c856f97 100644 --- a/target-alpha/cpu.h +++ b/target-alpha/cpu.h @@ -29,7 +29,7 @@ #include "exec/cpu-defs.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #define TARGET_HAS_ICE 1 diff --git a/target-alpha/fpu_helper.c b/target-alpha/fpu_helper.c index fe988ec459..fad3575549 100644 --- a/target-alpha/fpu_helper.c +++ b/target-alpha/fpu_helper.c @@ -19,7 +19,7 @@ #include "cpu.h" #include "helper.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #define FP_STATUS (env->fp_status) diff --git a/target-alpha/helper.c b/target-alpha/helper.c index 2430f70aca..22c9c6ec8c 100644 --- a/target-alpha/helper.c +++ b/target-alpha/helper.c @@ -22,7 +22,7 @@ #include #include "cpu.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #include "helper.h" uint64_t cpu_alpha_load_fpcr (CPUAlphaState *env) diff --git a/target-alpha/translate.c b/target-alpha/translate.c index c94126737f..3afc3c63f9 100644 --- a/target-alpha/translate.c +++ b/target-alpha/translate.c @@ -611,7 +611,7 @@ static void gen_qual_roundmode(DisasContext *ctx, int fn11) } #if defined(CONFIG_SOFTFLOAT_INLINE) - /* ??? The "softfloat.h" interface is to call set_float_rounding_mode. + /* ??? The "fpu/softfloat.h" interface is to call set_float_rounding_mode. With CONFIG_SOFTFLOAT that expands to an out-of-line call that just sets the one field. */ tcg_gen_st8_i32(tmp, cpu_env, diff --git a/target-arm/cpu.h b/target-arm/cpu.h index 7f87efa7d9..ffddfcbc0d 100644 --- a/target-arm/cpu.h +++ b/target-arm/cpu.h @@ -29,7 +29,7 @@ #include "qemu-common.h" #include "exec/cpu-defs.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #define TARGET_HAS_ICE 1 diff --git a/target-i386/cpu.h b/target-i386/cpu.h index f3f50a0499..0709780356 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -46,7 +46,7 @@ #include "exec/cpu-defs.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #define R_EAX 0 #define R_ECX 1 diff --git a/target-m68k/cpu.h b/target-m68k/cpu.h index b37af1fffd..adaf56c471 100644 --- a/target-m68k/cpu.h +++ b/target-m68k/cpu.h @@ -28,7 +28,7 @@ #include "qemu-common.h" #include "exec/cpu-defs.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #define MAX_QREGS 32 diff --git a/target-microblaze/cpu.h b/target-microblaze/cpu.h index 5358941ae4..4de22266ef 100644 --- a/target-microblaze/cpu.h +++ b/target-microblaze/cpu.h @@ -27,7 +27,7 @@ #define CPUArchState struct CPUMBState #include "exec/cpu-defs.h" -#include "softfloat.h" +#include "fpu/softfloat.h" struct CPUMBState; typedef struct CPUMBState CPUMBState; #if !defined(CONFIG_USER_ONLY) diff --git a/target-mips/cpu.h b/target-mips/cpu.h index 183ba9fbd8..31602ac8ed 100644 --- a/target-mips/cpu.h +++ b/target-mips/cpu.h @@ -13,7 +13,7 @@ #include "qemu-common.h" #include "mips-defs.h" #include "exec/cpu-defs.h" -#include "softfloat.h" +#include "fpu/softfloat.h" struct CPUMIPSState; diff --git a/target-openrisc/cpu.h b/target-openrisc/cpu.h index 876b386a3c..3beab45c3c 100644 --- a/target-openrisc/cpu.h +++ b/target-openrisc/cpu.h @@ -31,7 +31,7 @@ struct OpenRISCCPU; #include "config.h" #include "qemu-common.h" #include "exec/cpu-defs.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #include "qom/cpu.h" #include "qapi/error.h" diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h index 610bcd544b..e88ebe00d4 100644 --- a/target-ppc/cpu.h +++ b/target-ppc/cpu.h @@ -75,7 +75,7 @@ #include "exec/cpu-defs.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #define TARGET_HAS_ICE 1 diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h index acb8c73174..dda0b9af66 100644 --- a/target-s390x/cpu.h +++ b/target-s390x/cpu.h @@ -36,7 +36,7 @@ #include "exec/cpu-all.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #define NB_MMU_MODES 3 diff --git a/target-sh4/cpu.h b/target-sh4/cpu.h index 7c50c798b8..34e9b0acf7 100644 --- a/target-sh4/cpu.h +++ b/target-sh4/cpu.h @@ -41,7 +41,7 @@ #include "exec/cpu-defs.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #define TARGET_PAGE_BITS 12 /* 4k XXXXX */ @@ -230,8 +230,6 @@ static inline void cpu_set_tls(CPUSH4State *env, target_ulong newtls) void cpu_load_tlb(CPUSH4State * env); -#include "softfloat.h" - static inline CPUSH4State *cpu_init(const char *cpu_model) { SuperHCPU *cpu = cpu_sh4_init(cpu_model); diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h index 04b6659909..7389b03514 100644 --- a/target-sparc/cpu.h +++ b/target-sparc/cpu.h @@ -27,7 +27,7 @@ #include "exec/cpu-defs.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #define TARGET_HAS_ICE 1 diff --git a/target-unicore32/cpu.h b/target-unicore32/cpu.h index cd8f730756..509ce7c69d 100644 --- a/target-unicore32/cpu.h +++ b/target-unicore32/cpu.h @@ -24,7 +24,7 @@ #include "config.h" #include "qemu-common.h" #include "exec/cpu-defs.h" -#include "softfloat.h" +#include "fpu/softfloat.h" #define NB_MMU_MODES 2 From 42dc882ff850cde22ae7d501d1dd452837fc4103 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Fri, 14 Sep 2012 18:19:15 +0200 Subject: [PATCH 259/300] hw: move executable format header files to hw/ Or delete a.out.h which is unused. Signed-off-by: Paolo Bonzini --- a.out.h | 430 ------------------------------ uboot_image.h => hw/uboot_image.h | 0 2 files changed, 430 deletions(-) delete mode 100644 a.out.h rename uboot_image.h => hw/uboot_image.h (100%) diff --git a/a.out.h b/a.out.h deleted file mode 100644 index 33ca7f77ea..0000000000 --- a/a.out.h +++ /dev/null @@ -1,430 +0,0 @@ -/* a.out.h - - Copyright 1997, 1998, 1999, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _A_OUT_H_ -#define _A_OUT_H_ - -#ifdef __cplusplus -extern "C" { -#endif -#define COFF_IMAGE_WITH_PE -#define COFF_LONG_SECTION_NAMES - -/*** coff information for Intel 386/486. */ - - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - short f_magic; /* magic number */ - short f_nscns; /* number of sections */ - host_ulong f_timdat; /* time & date stamp */ - host_ulong f_symptr; /* file pointer to symtab */ - host_ulong f_nsyms; /* number of symtab entries */ - short f_opthdr; /* sizeof(optional hdr) */ - short f_flags; /* flags */ -}; - -/* Bits for f_flags: - * F_RELFLG relocation info stripped from file - * F_EXEC file is executable (no unresolved external references) - * F_LNNO line numbers stripped from file - * F_LSYMS local symbols stripped from file - * F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax) - */ - -#define F_RELFLG (0x0001) -#define F_EXEC (0x0002) -#define F_LNNO (0x0004) -#define F_LSYMS (0x0008) - - - -#define I386MAGIC 0x14c -#define I386PTXMAGIC 0x154 -#define I386AIXMAGIC 0x175 - -/* This is Lynx's all-platform magic number for executables. */ - -#define LYNXCOFFMAGIC 0415 - -#define I386BADMAG(x) (((x).f_magic != I386MAGIC) \ - && (x).f_magic != I386AIXMAGIC \ - && (x).f_magic != I386PTXMAGIC \ - && (x).f_magic != LYNXCOFFMAGIC) - -#define FILHDR struct external_filehdr -#define FILHSZ 20 - - -/********************** AOUT "OPTIONAL HEADER"= - **********************/ - - -typedef struct -{ - unsigned short magic; /* type of file */ - unsigned short vstamp; /* version stamp */ - host_ulong tsize; /* text size in bytes, padded to FW bdry*/ - host_ulong dsize; /* initialized data " " */ - host_ulong bsize; /* uninitialized data " " */ - host_ulong entry; /* entry pt. */ - host_ulong text_start; /* base of text used for this file */ - host_ulong data_start; /* base of data used for this file= - */ -} -AOUTHDR; - -#define AOUTSZ 28 -#define AOUTHDRSZ 28 - -#define OMAGIC 0404 /* object files, eg as output */ -#define ZMAGIC 0413 /* demand load format, eg normal ld output */ -#define STMAGIC 0401 /* target shlib */ -#define SHMAGIC 0443 /* host shlib */ - - -/* define some NT default values */ -/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ -#define NT_SECTION_ALIGNMENT 0x1000 -#define NT_FILE_ALIGNMENT 0x200 -#define NT_DEF_RESERVE 0x100000 -#define NT_DEF_COMMIT 0x1000 - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - host_ulong s_paddr; /* physical address, offset - of last addr in scn */ - host_ulong s_vaddr; /* virtual address */ - host_ulong s_size; /* section size */ - host_ulong s_scnptr; /* file ptr to raw data for section */ - host_ulong s_relptr; /* file ptr to relocation */ - host_ulong s_lnnoptr; /* file ptr to line numbers */ - unsigned short s_nreloc; /* number of relocation entries */ - unsigned short s_nlnno; /* number of line number entries*/ - host_ulong s_flags; /* flags */ -}; - -#define SCNHDR struct external_scnhdr -#define SCNHSZ 40 - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _COMMENT ".comment" -#define _LIB ".lib" - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - host_ulong l_symndx; /* function name symbol index, iff l_lnno 0 */ - host_ulong l_paddr; /* (physical) address of line number */ - } l_addr; - unsigned short l_lnno; /* line number */ -}; - -#define LINENO struct external_lineno -#define LINESZ 6 - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct QEMU_PACKED external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - host_ulong e_zeroes; - host_ulong e_offset; - } e; - } e; - host_ulong e_value; - unsigned short e_scnum; - unsigned short e_type; - char e_sclass[1]; - char e_numaux[1]; -}; - -#define N_BTMASK (0xf) -#define N_TMASK (0x30) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - -union external_auxent { - struct { - host_ulong x_tagndx; /* str, un, or enum tag indx */ - union { - struct { - unsigned short x_lnno; /* declaration line number */ - unsigned short x_size; /* str/union/array size */ - } x_lnsz; - host_ulong x_fsize; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - host_ulong x_lnnoptr;/* ptr to fcn line # */ - host_ulong x_endndx; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - unsigned short x_tvndx; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - host_ulong x_zeroes; - host_ulong x_offset; - } x_n; - } x_file; - - struct { - host_ulong x_scnlen; /* section length */ - unsigned short x_nreloc; /* # relocation entries */ - unsigned short x_nlinno; /* # line numbers */ - host_ulong x_checksum; /* section COMDAT checksum */ - unsigned short x_associated;/* COMDAT associated section index */ - char x_comdat[1]; /* COMDAT selection number */ - } x_scn; - - struct { - host_ulong x_tvfill; /* tv fill value */ - unsigned short x_tvlen; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 - -#define _ETEXT "etext" - -/********************** RELOCATION DIRECTIVES **********************/ - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_type[2]; -}; - -#define RELOC struct external_reloc -#define RELSZ 10 - -/* end of coff/i386.h */ - -/* PE COFF header information */ - -#ifndef _PE_H -#define _PE_H - -/* NT specific file attributes */ -#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 -#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 -#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 -#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 -#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 -#define IMAGE_FILE_32BIT_MACHINE 0x0100 -#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 -#define IMAGE_FILE_SYSTEM 0x1000 -#define IMAGE_FILE_DLL 0x2000 -#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 - -/* additional flags to be set for section headers to allow the NT loader to - read and write to the section data (to replace the addresses of data in - dlls for one thing); also to execute the section in .text's case= - */ -#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 -#define IMAGE_SCN_MEM_EXECUTE 0x20000000 -#define IMAGE_SCN_MEM_READ 0x40000000 -#define IMAGE_SCN_MEM_WRITE 0x80000000 - -/* - * Section characteristics added for ppc-nt - */ - -#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 /* Reserved. */ - -#define IMAGE_SCN_CNT_CODE 0x00000020 /* Section contains code. */ -#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 /* Section contains initialized data. */ -#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 /* Section contains uninitialized data. */ - -#define IMAGE_SCN_LNK_OTHER 0x00000100 /* Reserved. */ -#define IMAGE_SCN_LNK_INFO 0x00000200 /* Section contains comments or some other type of information. */ -#define IMAGE_SCN_LNK_REMOVE 0x00000800 /* Section contents will not become part of image. */ -#define IMAGE_SCN_LNK_COMDAT 0x00001000 /* Section contents comdat. */ - -#define IMAGE_SCN_MEM_FARDATA 0x00008000 - -#define IMAGE_SCN_MEM_PURGEABLE 0x00020000 -#define IMAGE_SCN_MEM_16BIT 0x00020000 -#define IMAGE_SCN_MEM_LOCKED 0x00040000 -#define IMAGE_SCN_MEM_PRELOAD 0x00080000 - -#define IMAGE_SCN_ALIGN_1BYTES 0x00100000 -#define IMAGE_SCN_ALIGN_2BYTES 0x00200000 -#define IMAGE_SCN_ALIGN_4BYTES 0x00300000 -#define IMAGE_SCN_ALIGN_8BYTES 0x00400000 -#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 /* Default alignment if no others are specified. */ -#define IMAGE_SCN_ALIGN_32BYTES 0x00600000 -#define IMAGE_SCN_ALIGN_64BYTES 0x00700000 - - -#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 /* Section contains extended relocations. */ -#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 /* Section is not cachable. */ -#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 /* Section is not pageable. */ -#define IMAGE_SCN_MEM_SHARED 0x10000000 /* Section is shareable. */ - -/* COMDAT selection codes. */ - -#define IMAGE_COMDAT_SELECT_NODUPLICATES (1) /* Warn if duplicates. */ -#define IMAGE_COMDAT_SELECT_ANY (2) /* No warning. */ -#define IMAGE_COMDAT_SELECT_SAME_SIZE (3) /* Warn if different size. */ -#define IMAGE_COMDAT_SELECT_EXACT_MATCH (4) /* Warn if different. */ -#define IMAGE_COMDAT_SELECT_ASSOCIATIVE (5) /* Base on other section. */ - -/* Magic values that are true for all dos/nt implementations */ -#define DOSMAGIC 0x5a4d -#define NT_SIGNATURE 0x00004550 - -/* NT allows long filenames, we want to accommodate this. This may break - some of the bfd functions */ -#undef FILNMLEN -#define FILNMLEN 18 /* # characters in a file name */ - - -#ifdef COFF_IMAGE_WITH_PE -/* The filehdr is only weired in images */ - -#undef FILHDR -struct external_PE_filehdr -{ - /* DOS header fields */ - unsigned short e_magic; /* Magic number, 0x5a4d */ - unsigned short e_cblp; /* Bytes on last page of file, 0x90 */ - unsigned short e_cp; /* Pages in file, 0x3 */ - unsigned short e_crlc; /* Relocations, 0x0 */ - unsigned short e_cparhdr; /* Size of header in paragraphs, 0x4 */ - unsigned short e_minalloc; /* Minimum extra paragraphs needed, 0x0 */ - unsigned short e_maxalloc; /* Maximum extra paragraphs needed, 0xFFFF */ - unsigned short e_ss; /* Initial (relative) SS value, 0x0 */ - unsigned short e_sp; /* Initial SP value, 0xb8 */ - unsigned short e_csum; /* Checksum, 0x0 */ - unsigned short e_ip; /* Initial IP value, 0x0 */ - unsigned short e_cs; /* Initial (relative) CS value, 0x0 */ - unsigned short e_lfarlc; /* File address of relocation table, 0x40 */ - unsigned short e_ovno; /* Overlay number, 0x0 */ - char e_res[4][2]; /* Reserved words, all 0x0 */ - unsigned short e_oemid; /* OEM identifier (for e_oeminfo), 0x0 */ - unsigned short e_oeminfo; /* OEM information; e_oemid specific, 0x0 */ - char e_res2[10][2]; /* Reserved words, all 0x0 */ - host_ulong e_lfanew; /* File address of new exe header, 0x80 */ - char dos_message[16][4]; /* other stuff, always follow DOS header */ - unsigned int nt_signature; /* required NT signature, 0x4550 */ - - /* From standard header */ - - unsigned short f_magic; /* magic number */ - unsigned short f_nscns; /* number of sections */ - host_ulong f_timdat; /* time & date stamp */ - host_ulong f_symptr; /* file pointer to symtab */ - host_ulong f_nsyms; /* number of symtab entries */ - unsigned short f_opthdr; /* sizeof(optional hdr) */ - unsigned short f_flags; /* flags */ -}; - - -#define FILHDR struct external_PE_filehdr -#undef FILHSZ -#define FILHSZ 152 - -#endif - -typedef struct -{ - unsigned short magic; /* type of file */ - unsigned short vstamp; /* version stamp */ - host_ulong tsize; /* text size in bytes, padded to FW bdry*/ - host_ulong dsize; /* initialized data " " */ - host_ulong bsize; /* uninitialized data " " */ - host_ulong entry; /* entry pt. */ - host_ulong text_start; /* base of text used for this file */ - host_ulong data_start; /* base of all data used for this file */ - - /* NT extra fields; see internal.h for descriptions */ - host_ulong ImageBase; - host_ulong SectionAlignment; - host_ulong FileAlignment; - unsigned short MajorOperatingSystemVersion; - unsigned short MinorOperatingSystemVersion; - unsigned short MajorImageVersion; - unsigned short MinorImageVersion; - unsigned short MajorSubsystemVersion; - unsigned short MinorSubsystemVersion; - char Reserved1[4]; - host_ulong SizeOfImage; - host_ulong SizeOfHeaders; - host_ulong CheckSum; - unsigned short Subsystem; - unsigned short DllCharacteristics; - host_ulong SizeOfStackReserve; - host_ulong SizeOfStackCommit; - host_ulong SizeOfHeapReserve; - host_ulong SizeOfHeapCommit; - host_ulong LoaderFlags; - host_ulong NumberOfRvaAndSizes; - /* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; */ - char DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars */ - -} PEAOUTHDR; - - -#undef AOUTSZ -#define AOUTSZ (AOUTHDRSZ + 196) - -#undef E_FILNMLEN -#define E_FILNMLEN 18 /* # characters in a file name */ -#endif - -/* end of coff/pe.h */ - -#define DT_NON (0) /* no derived type */ -#define DT_PTR (1) /* pointer */ -#define DT_FCN (2) /* function */ -#define DT_ARY (3) /* array */ - -#define ISPTR(x) (((x) & N_TMASK) == (DT_PTR << N_BTSHFT)) -#define ISFCN(x) (((x) & N_TMASK) == (DT_FCN << N_BTSHFT)) -#define ISARY(x) (((x) & N_TMASK) == (DT_ARY << N_BTSHFT)) - -#ifdef __cplusplus -} -#endif - -#endif /* _A_OUT_H_ */ diff --git a/uboot_image.h b/hw/uboot_image.h similarity index 100% rename from uboot_image.h rename to hw/uboot_image.h From ec5e016c9a68588bd01be387416923c7dcafb951 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 24 Oct 2012 13:09:17 +0200 Subject: [PATCH 260/300] janitor: move remaining public headers to include/ Headers in the root directory are now used only from within that directory. Signed-off-by: Paolo Bonzini --- config.h => include/config.h | 0 elf.h => include/elf.h | 0 libfdt_env.h => include/libfdt_env.h | 0 qemu-common.h => include/qemu-common.h | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename config.h => include/config.h (100%) rename elf.h => include/elf.h (100%) rename libfdt_env.h => include/libfdt_env.h (100%) rename qemu-common.h => include/qemu-common.h (100%) diff --git a/config.h b/include/config.h similarity index 100% rename from config.h rename to include/config.h diff --git a/elf.h b/include/elf.h similarity index 100% rename from elf.h rename to include/elf.h diff --git a/libfdt_env.h b/include/libfdt_env.h similarity index 100% rename from libfdt_env.h rename to include/libfdt_env.h diff --git a/qemu-common.h b/include/qemu-common.h similarity index 100% rename from qemu-common.h rename to include/qemu-common.h From 244eaa7514a944b36273eb8428f32da8e9124fcf Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 12 Dec 2012 12:54:43 +0100 Subject: [PATCH 261/300] migration: fix migration_bitmap leak Cc: qemu-stable@nongnu.org Signed-off-by: Paolo Bonzini Signed-off-by: Juan Quintela --- arch_init.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/arch_init.c b/arch_init.c index a8b65416da..e01f0e5ea1 100644 --- a/arch_init.c +++ b/arch_init.c @@ -535,9 +535,13 @@ static void sort_ram_list(void) static void migration_end(void) { - memory_global_dirty_log_stop(); + if (migration_bitmap) { + memory_global_dirty_log_stop(); + g_free(migration_bitmap); + migration_bitmap = NULL; + } - if (migrate_use_xbzrle()) { + if (XBZRLE.cache) { cache_fini(XBZRLE.cache); g_free(XBZRLE.cache); g_free(XBZRLE.encoded_buf); @@ -689,13 +693,10 @@ static int ram_save_complete(QEMUFile *f, void *opaque) } bytes_transferred += bytes_sent; } - memory_global_dirty_log_stop(); + migration_end(); qemu_put_be64(f, RAM_SAVE_FLAG_EOS); - g_free(migration_bitmap); - migration_bitmap = NULL; - return 0; } From bde54c08b4854aceee3dee25121a2b835cb81166 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 20 Nov 2012 12:48:19 +0100 Subject: [PATCH 262/300] buffered_file: do not send more than s->bytes_xfer bytes per tick Sending more was possible if the buffer was large. Cc: qemu-stable@nongnu.org Signed-off-by: Paolo Bonzini Signed-off-by: Juan Quintela --- buffered_file.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buffered_file.c b/buffered_file.c index 27627a1b71..1de47e04a8 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -65,9 +65,9 @@ static ssize_t buffered_flush(QEMUFileBuffered *s) DPRINTF("flushing %zu byte(s) of data\n", s->buffer_size); while (s->bytes_xfer < s->xfer_limit && offset < s->buffer_size) { - + size_t to_send = MIN(s->buffer_size - offset, s->xfer_limit - s->bytes_xfer); ret = migrate_fd_put_buffer(s->migration_state, s->buffer + offset, - s->buffer_size - offset); + to_send); if (ret == -EAGAIN) { DPRINTF("backend not ready, freezing\n"); ret = 0; From 24ea1e4b4b79cef2bac6f8e0f0a212f42ef420a9 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Sat, 10 Nov 2012 18:58:40 +0100 Subject: [PATCH 263/300] migration: remove double call to migrate_fd_close The call in buffered_close is enough, because buffered_close is called already by migrate_fd_cleanup. Signed-off-by: Paolo Bonzini Signed-off-by: Juan Quintela --- migration.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migration.c b/migration.c index 810f25e7eb..e560930977 100644 --- a/migration.c +++ b/migration.c @@ -272,7 +272,7 @@ static int migrate_fd_cleanup(MigrationState *s) s->file = NULL; } - migrate_fd_close(s); + assert(s->fd == -1); return ret; } From 557ec5a001740d234e2b9604f0697a0d52ae90ca Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 3 Oct 2012 14:07:31 +0200 Subject: [PATCH 264/300] migration: include qemu-file.h They don't use/know anything about buffered-file. Signed-off-by: Juan Quintela --- migration-exec.c | 2 +- migration-fd.c | 2 +- migration-tcp.c | 2 +- migration-unix.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/migration-exec.c b/migration-exec.c index 68f36f41f1..b7b760b1d4 100644 --- a/migration-exec.c +++ b/migration-exec.c @@ -18,7 +18,7 @@ #include "qemu-common.h" #include "qemu/sockets.h" #include "migration/migration.h" -#include "buffered_file.h" +#include "migration/qemu-file.h" #include "block/block.h" #include #include diff --git a/migration-fd.c b/migration-fd.c index ea121bc0d6..c45c42e9d3 100644 --- a/migration-fd.c +++ b/migration-fd.c @@ -17,7 +17,7 @@ #include "qemu/sockets.h" #include "migration/migration.h" #include "monitor/monitor.h" -#include "buffered_file.h" +#include "migration/qemu-file.h" #include "block/block.h" #include "qemu/sockets.h" diff --git a/migration-tcp.c b/migration-tcp.c index 3c4c315052..1fca42843e 100644 --- a/migration-tcp.c +++ b/migration-tcp.c @@ -16,7 +16,7 @@ #include "qemu-common.h" #include "qemu/sockets.h" #include "migration/migration.h" -#include "buffered_file.h" +#include "migration/qemu-file.h" #include "block/block.h" //#define DEBUG_MIGRATION_TCP diff --git a/migration-unix.c b/migration-unix.c index d5f986853f..f2f368c528 100644 --- a/migration-unix.c +++ b/migration-unix.c @@ -16,7 +16,7 @@ #include "qemu-common.h" #include "qemu/sockets.h" #include "migration/migration.h" -#include "buffered_file.h" +#include "migration/qemu-file.h" #include "block/block.h" //#define DEBUG_MIGRATION_UNIX From 803ef03257a9ee375f08ca7a89e009ea12bc17a4 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 3 Oct 2012 14:08:05 +0200 Subject: [PATCH 265/300] migration-fd: remove duplicate include Signed-off-by: Juan Quintela --- migration-fd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/migration-fd.c b/migration-fd.c index c45c42e9d3..5086a9038a 100644 --- a/migration-fd.c +++ b/migration-fd.c @@ -19,7 +19,6 @@ #include "monitor/monitor.h" #include "migration/qemu-file.h" #include "block/block.h" -#include "qemu/sockets.h" //#define DEBUG_MIGRATION_FD From 0d6d3c87a232cc27641dde3491d75c8021745d02 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 14 Nov 2012 15:45:02 +0100 Subject: [PATCH 266/300] exec: change ramlist from MRU order to a 1-item cache Most of the time, only 2 items will be active (from/to for a string operation, or code/data). But TCG guests likely won't have gigabytes of memory, so this actually goes down to 1 item. Signed-off-by: Paolo Bonzini Signed-off-by: Juan Quintela --- arch_init.c | 1 + exec.c | 49 ++++++++++++++++++++++++------------------ include/exec/cpu-all.h | 1 + 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/arch_init.c b/arch_init.c index e01f0e5ea1..6695ccfdc5 100644 --- a/arch_init.c +++ b/arch_init.c @@ -48,6 +48,7 @@ #include "qemu/config-file.h" #include "qmp-commands.h" #include "trace.h" +#include "exec/cpu-all.h" #ifdef DEBUG_ARCH_INIT #define DPRINTF(fmt, ...) \ diff --git a/exec.c b/exec.c index 28abd7e710..78bae1c7ac 100644 --- a/exec.c +++ b/exec.c @@ -43,6 +43,7 @@ #include "sysemu/xen-mapcache.h" #include "trace.h" #endif +#include "exec/cpu-all.h" #include "exec/cputlb.h" #include "translate-all.h" @@ -1043,6 +1044,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, new_block->length = size; QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next); + ram_list.mru_block = NULL; ram_list.phys_dirty = g_realloc(ram_list.phys_dirty, last_ram_offset() >> TARGET_PAGE_BITS); @@ -1071,6 +1073,7 @@ void qemu_ram_free_from_ptr(ram_addr_t addr) QLIST_FOREACH(block, &ram_list.blocks, next) { if (addr == block->offset) { QLIST_REMOVE(block, next); + ram_list.mru_block = NULL; g_free(block); return; } @@ -1084,6 +1087,7 @@ void qemu_ram_free(ram_addr_t addr) QLIST_FOREACH(block, &ram_list.blocks, next) { if (addr == block->offset) { QLIST_REMOVE(block, next); + ram_list.mru_block = NULL; if (block->flags & RAM_PREALLOC_MASK) { ; } else if (mem_path) { @@ -1189,37 +1193,40 @@ void *qemu_get_ram_ptr(ram_addr_t addr) { RAMBlock *block; + block = ram_list.mru_block; + if (block && addr - block->offset < block->length) { + goto found; + } QLIST_FOREACH(block, &ram_list.blocks, next) { if (addr - block->offset < block->length) { - /* Move this entry to to start of the list. */ - if (block != QLIST_FIRST(&ram_list.blocks)) { - QLIST_REMOVE(block, next); - QLIST_INSERT_HEAD(&ram_list.blocks, block, next); - } - if (xen_enabled()) { - /* We need to check if the requested address is in the RAM - * because we don't want to map the entire memory in QEMU. - * In that case just map until the end of the page. - */ - if (block->offset == 0) { - return xen_map_cache(addr, 0, 0); - } else if (block->host == NULL) { - block->host = - xen_map_cache(block->offset, block->length, 1); - } - } - return block->host + (addr - block->offset); + goto found; } } fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr); abort(); - return NULL; +found: + ram_list.mru_block = block; + if (xen_enabled()) { + /* We need to check if the requested address is in the RAM + * because we don't want to map the entire memory in QEMU. + * In that case just map until the end of the page. + */ + if (block->offset == 0) { + return xen_map_cache(addr, 0, 0); + } else if (block->host == NULL) { + block->host = + xen_map_cache(block->offset, block->length, 1); + } + } + return block->host + (addr - block->offset); } -/* Return a host pointer to ram allocated with qemu_ram_alloc. - * Same as qemu_get_ram_ptr but avoid reordering ramblocks. +/* Return a host pointer to ram allocated with qemu_ram_alloc. Same as + * qemu_get_ram_ptr but do not touch ram_list.mru_block. + * + * ??? Is this still necessary? */ static void *qemu_safe_ram_ptr(ram_addr_t addr) { diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h index c12e35f54d..9fe6fc0751 100644 --- a/include/exec/cpu-all.h +++ b/include/exec/cpu-all.h @@ -495,6 +495,7 @@ typedef struct RAMBlock { typedef struct RAMList { uint8_t *phys_dirty; + RAMBlock *mru_block; QLIST_HEAD(, RAMBlock) blocks; } RAMList; extern RAMList ram_list; From a3161038a1fd17a638a0c606f71e1f799f65f41b Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 14 Nov 2012 15:54:48 +0100 Subject: [PATCH 267/300] exec: change RAM list to a TAILQ Signed-off-by: Paolo Bonzini Signed-off-by: Juan Quintela --- arch_init.c | 24 ++++++++++++------------ dump.c | 8 ++++---- exec.c | 34 +++++++++++++++++----------------- include/exec/cpu-all.h | 4 ++-- memory_mapping.c | 4 ++-- target-i386/arch_dump.c | 2 +- 6 files changed, 38 insertions(+), 38 deletions(-) diff --git a/arch_init.c b/arch_init.c index 6695ccfdc5..67b14d24c1 100644 --- a/arch_init.c +++ b/arch_init.c @@ -382,7 +382,7 @@ static void migration_bitmap_sync(void) trace_migration_bitmap_sync_start(); memory_global_sync_dirty_bitmap(get_system_memory()); - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { for (addr = 0; addr < block->length; addr += TARGET_PAGE_SIZE) { if (memory_region_get_dirty(block->mr, addr, TARGET_PAGE_SIZE, DIRTY_MEMORY_MIGRATION)) { @@ -424,7 +424,7 @@ static int ram_save_block(QEMUFile *f, bool last_stage) ram_addr_t current_addr; if (!block) - block = QLIST_FIRST(&ram_list.blocks); + block = QTAILQ_FIRST(&ram_list.blocks); do { mr = block->mr; @@ -465,9 +465,9 @@ static int ram_save_block(QEMUFile *f, bool last_stage) offset += TARGET_PAGE_SIZE; if (offset >= block->length) { offset = 0; - block = QLIST_NEXT(block, next); + block = QTAILQ_NEXT(block, next); if (!block) - block = QLIST_FIRST(&ram_list.blocks); + block = QTAILQ_FIRST(&ram_list.blocks); } } while (block != last_block || offset != last_offset); @@ -499,7 +499,7 @@ uint64_t ram_bytes_total(void) RAMBlock *block; uint64_t total = 0; - QLIST_FOREACH(block, &ram_list.blocks, next) + QTAILQ_FOREACH(block, &ram_list.blocks, next) total += block->length; return total; @@ -518,18 +518,18 @@ static void sort_ram_list(void) RAMBlock *block, *nblock, **blocks; int n; n = 0; - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { ++n; } blocks = g_malloc(n * sizeof *blocks); n = 0; - QLIST_FOREACH_SAFE(block, &ram_list.blocks, next, nblock) { + QTAILQ_FOREACH_SAFE(block, &ram_list.blocks, next, nblock) { blocks[n++] = block; - QLIST_REMOVE(block, next); + QTAILQ_REMOVE(&ram_list.blocks, block, next); } qsort(blocks, n, sizeof *blocks, block_compar); while (--n >= 0) { - QLIST_INSERT_HEAD(&ram_list.blocks, blocks[n], next); + QTAILQ_INSERT_HEAD(&ram_list.blocks, blocks[n], next); } g_free(blocks); } @@ -597,7 +597,7 @@ static int ram_save_setup(QEMUFile *f, void *opaque) qemu_put_be64(f, ram_bytes_total() | RAM_SAVE_FLAG_MEM_SIZE); - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { qemu_put_byte(f, strlen(block->idstr)); qemu_put_buffer(f, (uint8_t *)block->idstr, strlen(block->idstr)); qemu_put_be64(f, block->length); @@ -763,7 +763,7 @@ static inline void *host_from_stream_offset(QEMUFile *f, qemu_get_buffer(f, (uint8_t *)id, len); id[len] = 0; - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (!strncmp(id, block->idstr, sizeof(id))) return memory_region_get_ram_ptr(block->mr) + offset; } @@ -807,7 +807,7 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id) id[len] = 0; length = qemu_get_be64(f); - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (!strncmp(id, block->idstr, sizeof(id))) { if (block->length != length) { ret = -EINVAL; diff --git a/dump.c b/dump.c index a26b1a5e1a..4ed1fa8622 100644 --- a/dump.c +++ b/dump.c @@ -427,7 +427,7 @@ static hwaddr get_offset(hwaddr phys_addr, } } - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (s->has_filter) { if (block->offset >= s->begin + s->length || block->offset + block->length <= s->begin) { @@ -594,7 +594,7 @@ static int dump_completed(DumpState *s) static int get_next_block(DumpState *s, RAMBlock *block) { while (1) { - block = QLIST_NEXT(block, next); + block = QTAILQ_NEXT(block, next); if (!block) { /* no more block */ return 1; @@ -670,11 +670,11 @@ static ram_addr_t get_start_block(DumpState *s) RAMBlock *block; if (!s->has_filter) { - s->block = QLIST_FIRST(&ram_list.blocks); + s->block = QTAILQ_FIRST(&ram_list.blocks); return 0; } - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (block->offset >= s->begin + s->length || block->offset + block->length <= s->begin) { /* This block is out of the range */ diff --git a/exec.c b/exec.c index 78bae1c7ac..584279a2e3 100644 --- a/exec.c +++ b/exec.c @@ -57,7 +57,7 @@ int phys_ram_fd; static int in_migration; -RAMList ram_list = { .blocks = QLIST_HEAD_INITIALIZER(ram_list.blocks) }; +RAMList ram_list = { .blocks = QTAILQ_HEAD_INITIALIZER(ram_list.blocks) }; static MemoryRegion *system_memory; static MemoryRegion *system_io; @@ -902,15 +902,15 @@ static ram_addr_t find_ram_offset(ram_addr_t size) RAMBlock *block, *next_block; ram_addr_t offset = RAM_ADDR_MAX, mingap = RAM_ADDR_MAX; - if (QLIST_EMPTY(&ram_list.blocks)) + if (QTAILQ_EMPTY(&ram_list.blocks)) return 0; - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { ram_addr_t end, next = RAM_ADDR_MAX; end = block->offset + block->length; - QLIST_FOREACH(next_block, &ram_list.blocks, next) { + QTAILQ_FOREACH(next_block, &ram_list.blocks, next) { if (next_block->offset >= end) { next = MIN(next, next_block->offset); } @@ -935,7 +935,7 @@ ram_addr_t last_ram_offset(void) RAMBlock *block; ram_addr_t last = 0; - QLIST_FOREACH(block, &ram_list.blocks, next) + QTAILQ_FOREACH(block, &ram_list.blocks, next) last = MAX(last, block->offset + block->length); return last; @@ -964,7 +964,7 @@ void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev) RAMBlock *new_block, *block; new_block = NULL; - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (block->offset == addr) { new_block = block; break; @@ -982,7 +982,7 @@ void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev) } pstrcat(new_block->idstr, sizeof(new_block->idstr), name); - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (block != new_block && !strcmp(block->idstr, new_block->idstr)) { fprintf(stderr, "RAMBlock \"%s\" already registered, abort!\n", new_block->idstr); @@ -1043,7 +1043,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, } new_block->length = size; - QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next); + QTAILQ_INSERT_HEAD(&ram_list.blocks, new_block, next); ram_list.mru_block = NULL; ram_list.phys_dirty = g_realloc(ram_list.phys_dirty, @@ -1070,9 +1070,9 @@ void qemu_ram_free_from_ptr(ram_addr_t addr) { RAMBlock *block; - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (addr == block->offset) { - QLIST_REMOVE(block, next); + QTAILQ_REMOVE(&ram_list.blocks, block, next); ram_list.mru_block = NULL; g_free(block); return; @@ -1084,9 +1084,9 @@ void qemu_ram_free(ram_addr_t addr) { RAMBlock *block; - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (addr == block->offset) { - QLIST_REMOVE(block, next); + QTAILQ_REMOVE(&ram_list.blocks, block, next); ram_list.mru_block = NULL; if (block->flags & RAM_PREALLOC_MASK) { ; @@ -1127,7 +1127,7 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t length) int flags; void *area, *vaddr; - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { offset = addr - block->offset; if (offset < block->length) { vaddr = block->host + offset; @@ -1197,7 +1197,7 @@ void *qemu_get_ram_ptr(ram_addr_t addr) if (block && addr - block->offset < block->length) { goto found; } - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (addr - block->offset < block->length) { goto found; } @@ -1232,7 +1232,7 @@ static void *qemu_safe_ram_ptr(ram_addr_t addr) { RAMBlock *block; - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (addr - block->offset < block->length) { if (xen_enabled()) { /* We need to check if the requested address is in the RAM @@ -1268,7 +1268,7 @@ static void *qemu_ram_ptr_length(ram_addr_t addr, ram_addr_t *size) } else { RAMBlock *block; - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (addr - block->offset < block->length) { if (addr - block->offset + *size > block->length) *size = block->length - addr + block->offset; @@ -1296,7 +1296,7 @@ int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr) return 0; } - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { /* This case append when the block is not mapped. */ if (block->host == NULL) { continue; diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h index 9fe6fc0751..612e95005b 100644 --- a/include/exec/cpu-all.h +++ b/include/exec/cpu-all.h @@ -487,7 +487,7 @@ typedef struct RAMBlock { ram_addr_t length; uint32_t flags; char idstr[256]; - QLIST_ENTRY(RAMBlock) next; + QTAILQ_ENTRY(RAMBlock) next; #if defined(__linux__) && !defined(TARGET_S390X) int fd; #endif @@ -496,7 +496,7 @@ typedef struct RAMBlock { typedef struct RAMList { uint8_t *phys_dirty; RAMBlock *mru_block; - QLIST_HEAD(, RAMBlock) blocks; + QTAILQ_HEAD(, RAMBlock) blocks; } RAMList; extern RAMList ram_list; diff --git a/memory_mapping.c b/memory_mapping.c index 530f1d6793..ff45b3a239 100644 --- a/memory_mapping.c +++ b/memory_mapping.c @@ -200,7 +200,7 @@ int qemu_get_guest_memory_mapping(MemoryMappingList *list) * If the guest doesn't use paging, the virtual address is equal to physical * address. */ - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { offset = block->offset; length = block->length; create_new_memory_mapping(list, offset, offset, length); @@ -213,7 +213,7 @@ void qemu_get_guest_simple_memory_mapping(MemoryMappingList *list) { RAMBlock *block; - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { create_new_memory_mapping(list, block->offset, 0, block->length); } } diff --git a/target-i386/arch_dump.c b/target-i386/arch_dump.c index 8209ce9ee2..2cd2f7f09e 100644 --- a/target-i386/arch_dump.c +++ b/target-i386/arch_dump.c @@ -403,7 +403,7 @@ int cpu_get_dump_info(ArchDumpInfo *info) } else { info->d_class = ELFCLASS32; - QLIST_FOREACH(block, &ram_list.blocks, next) { + QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (block->offset + block->length > UINT_MAX) { /* The memory size is greater than 4G */ info->d_class = ELFCLASS64; From abb26d63e7e4492d306c13b7e0e799d4c11a067c Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 14 Nov 2012 16:00:51 +0100 Subject: [PATCH 268/300] exec: sort the memory from biggest to smallest Signed-off-by: Paolo Bonzini Signed-off-by: Juan Quintela --- arch_init.c | 30 ------------------------------ exec.c | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/arch_init.c b/arch_init.c index 67b14d24c1..5c8df3af41 100644 --- a/arch_init.c +++ b/arch_init.c @@ -505,35 +505,6 @@ uint64_t ram_bytes_total(void) return total; } -static int block_compar(const void *a, const void *b) -{ - RAMBlock * const *ablock = a; - RAMBlock * const *bblock = b; - - return strcmp((*ablock)->idstr, (*bblock)->idstr); -} - -static void sort_ram_list(void) -{ - RAMBlock *block, *nblock, **blocks; - int n; - n = 0; - QTAILQ_FOREACH(block, &ram_list.blocks, next) { - ++n; - } - blocks = g_malloc(n * sizeof *blocks); - n = 0; - QTAILQ_FOREACH_SAFE(block, &ram_list.blocks, next, nblock) { - blocks[n++] = block; - QTAILQ_REMOVE(&ram_list.blocks, block, next); - } - qsort(blocks, n, sizeof *blocks, block_compar); - while (--n >= 0) { - QTAILQ_INSERT_HEAD(&ram_list.blocks, blocks[n], next); - } - g_free(blocks); -} - static void migration_end(void) { if (migration_bitmap) { @@ -562,7 +533,6 @@ static void reset_ram_globals(void) { last_block = NULL; last_offset = 0; - sort_ram_list(); } #define MAX_WAIT 50 /* ms, half buffered_file limit */ diff --git a/exec.c b/exec.c index 584279a2e3..1ee4fa649d 100644 --- a/exec.c +++ b/exec.c @@ -1007,7 +1007,7 @@ static int memory_try_enable_merging(void *addr, size_t len) ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, MemoryRegion *mr) { - RAMBlock *new_block; + RAMBlock *block, *new_block; size = TARGET_PAGE_ALIGN(size); new_block = g_malloc0(sizeof(*new_block)); @@ -1043,7 +1043,17 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, } new_block->length = size; - QTAILQ_INSERT_HEAD(&ram_list.blocks, new_block, next); + /* Keep the list sorted from biggest to smallest block. */ + QTAILQ_FOREACH(block, &ram_list.blocks, next) { + if (block->length < new_block->length) { + break; + } + } + if (block) { + QTAILQ_INSERT_BEFORE(block, new_block, next); + } else { + QTAILQ_INSERT_TAIL(&ram_list.blocks, new_block, next); + } ram_list.mru_block = NULL; ram_list.phys_dirty = g_realloc(ram_list.phys_dirty, From f798b07f517143df3a1e38bccc3f72ade2f080dc Mon Sep 17 00:00:00 2001 From: Umesh Deshpande Date: Thu, 18 Aug 2011 11:41:17 -0700 Subject: [PATCH 269/300] add a version number to ram_list This will be used to detect if last_block might have become invalid across different calls to ram_save_live. Signed-off-by: Paolo Bonzini Signed-off-by: Umesh Deshpande Signed-off-by: Juan Quintela Reviewed-by: Orit Wasserman --- arch_init.c | 7 ++++++- exec.c | 4 ++++ include/exec/cpu-all.h | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/arch_init.c b/arch_init.c index 5c8df3af41..1f737dc1eb 100644 --- a/arch_init.c +++ b/arch_init.c @@ -336,6 +336,7 @@ static RAMBlock *last_block; static ram_addr_t last_offset; static unsigned long *migration_bitmap; static uint64_t migration_dirty_pages; +static uint32_t last_version; static inline bool migration_bitmap_test_and_reset_dirty(MemoryRegion *mr, ram_addr_t offset) @@ -406,7 +407,6 @@ static void migration_bitmap_sync(void) } } - /* * ram_save_block: Writes a page of memory to the stream f * @@ -533,6 +533,7 @@ static void reset_ram_globals(void) { last_block = NULL; last_offset = 0; + last_version = ram_list.version; } #define MAX_WAIT 50 /* ms, half buffered_file limit */ @@ -587,6 +588,10 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) uint64_t expected_downtime; MigrationState *s = migrate_get_current(); + if (ram_list.version != last_version) { + reset_ram_globals(); + } + bytes_transferred_last = bytes_transferred; bwidth = qemu_get_clock_ns(rt_clock); diff --git a/exec.c b/exec.c index 1ee4fa649d..8478bef548 100644 --- a/exec.c +++ b/exec.c @@ -1056,6 +1056,8 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, } ram_list.mru_block = NULL; + ram_list.version++; + ram_list.phys_dirty = g_realloc(ram_list.phys_dirty, last_ram_offset() >> TARGET_PAGE_BITS); memset(ram_list.phys_dirty + (new_block->offset >> TARGET_PAGE_BITS), @@ -1084,6 +1086,7 @@ void qemu_ram_free_from_ptr(ram_addr_t addr) if (addr == block->offset) { QTAILQ_REMOVE(&ram_list.blocks, block, next); ram_list.mru_block = NULL; + ram_list.version++; g_free(block); return; } @@ -1098,6 +1101,7 @@ void qemu_ram_free(ram_addr_t addr) if (addr == block->offset) { QTAILQ_REMOVE(&ram_list.blocks, block, next); ram_list.mru_block = NULL; + ram_list.version++; if (block->flags & RAM_PREALLOC_MASK) { ; } else if (mem_path) { diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h index 612e95005b..f052b38974 100644 --- a/include/exec/cpu-all.h +++ b/include/exec/cpu-all.h @@ -497,6 +497,7 @@ typedef struct RAMList { uint8_t *phys_dirty; RAMBlock *mru_block; QTAILQ_HEAD(, RAMBlock) blocks; + uint32_t version; } RAMList; extern RAMList ram_list; From b2a8658ef5dc57ea9e7a45091724a719dd4bdcd3 Mon Sep 17 00:00:00 2001 From: Umesh Deshpande Date: Wed, 17 Aug 2011 00:01:33 -0700 Subject: [PATCH 270/300] protect the ramlist with a separate mutex Add the new mutex that protects shared state between ram_save_live and the iothread. If the iothread mutex has to be taken together with the ramlist mutex, the iothread shall always be _outside_. Signed-off-by: Paolo Bonzini Signed-off-by: Umesh Deshpande Signed-off-by: Juan Quintela Reviewed-by: Orit Wasserman --- arch_init.c | 9 ++++++++- exec.c | 29 +++++++++++++++++++++++++++-- include/exec/cpu-all.h | 9 +++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/arch_init.c b/arch_init.c index 1f737dc1eb..fad1c4099a 100644 --- a/arch_init.c +++ b/arch_init.c @@ -528,7 +528,6 @@ static void ram_migration_cancel(void *opaque) migration_end(); } - static void reset_ram_globals(void) { last_block = NULL; @@ -547,6 +546,7 @@ static int ram_save_setup(QEMUFile *f, void *opaque) bitmap_set(migration_bitmap, 0, ram_pages); migration_dirty_pages = ram_pages; + qemu_mutex_lock_ramlist(); bytes_transferred = 0; reset_ram_globals(); @@ -574,6 +574,7 @@ static int ram_save_setup(QEMUFile *f, void *opaque) qemu_put_be64(f, block->length); } + qemu_mutex_unlock_ramlist(); qemu_put_be64(f, RAM_SAVE_FLAG_EOS); return 0; @@ -588,6 +589,8 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) uint64_t expected_downtime; MigrationState *s = migrate_get_current(); + qemu_mutex_lock_ramlist(); + if (ram_list.version != last_version) { reset_ram_globals(); } @@ -636,6 +639,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) bwidth = 0.000001; } + qemu_mutex_unlock_ramlist(); qemu_put_be64(f, RAM_SAVE_FLAG_EOS); expected_downtime = ram_save_remaining() * TARGET_PAGE_SIZE / bwidth; @@ -656,6 +660,8 @@ static int ram_save_complete(QEMUFile *f, void *opaque) { migration_bitmap_sync(); + qemu_mutex_lock_ramlist(); + /* try transferring iterative blocks of memory */ /* flush all remaining blocks regardless of rate limiting */ @@ -671,6 +677,7 @@ static int ram_save_complete(QEMUFile *f, void *opaque) } migration_end(); + qemu_mutex_unlock_ramlist(); qemu_put_be64(f, RAM_SAVE_FLAG_EOS); return 0; diff --git a/exec.c b/exec.c index 8478bef548..a6923addd4 100644 --- a/exec.c +++ b/exec.c @@ -213,6 +213,7 @@ bool memory_region_is_unassigned(MemoryRegion *mr) void cpu_exec_init_all(void) { #if !defined(CONFIG_USER_ONLY) + qemu_mutex_init(&ram_list.mutex); memory_map_init(); io_mem_init(); #endif @@ -801,6 +802,16 @@ void qemu_flush_coalesced_mmio_buffer(void) kvm_flush_coalesced_mmio_buffer(); } +void qemu_mutex_lock_ramlist(void) +{ + qemu_mutex_lock(&ram_list.mutex); +} + +void qemu_mutex_unlock_ramlist(void) +{ + qemu_mutex_unlock(&ram_list.mutex); +} + #if defined(__linux__) && !defined(TARGET_S390X) #include @@ -982,6 +993,8 @@ void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev) } pstrcat(new_block->idstr, sizeof(new_block->idstr), name); + /* This assumes the iothread lock is taken here too. */ + qemu_mutex_lock_ramlist(); QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (block != new_block && !strcmp(block->idstr, new_block->idstr)) { fprintf(stderr, "RAMBlock \"%s\" already registered, abort!\n", @@ -989,6 +1002,7 @@ void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev) abort(); } } + qemu_mutex_unlock_ramlist(); } static int memory_try_enable_merging(void *addr, size_t len) @@ -1012,6 +1026,8 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, size = TARGET_PAGE_ALIGN(size); new_block = g_malloc0(sizeof(*new_block)); + /* This assumes the iothread lock is taken here too. */ + qemu_mutex_lock_ramlist(); new_block->mr = mr; new_block->offset = find_ram_offset(size); if (host) { @@ -1057,6 +1073,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, ram_list.mru_block = NULL; ram_list.version++; + qemu_mutex_unlock_ramlist(); ram_list.phys_dirty = g_realloc(ram_list.phys_dirty, last_ram_offset() >> TARGET_PAGE_BITS); @@ -1082,21 +1099,26 @@ void qemu_ram_free_from_ptr(ram_addr_t addr) { RAMBlock *block; + /* This assumes the iothread lock is taken here too. */ + qemu_mutex_lock_ramlist(); QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (addr == block->offset) { QTAILQ_REMOVE(&ram_list.blocks, block, next); ram_list.mru_block = NULL; ram_list.version++; g_free(block); - return; + break; } } + qemu_mutex_unlock_ramlist(); } void qemu_ram_free(ram_addr_t addr) { RAMBlock *block; + /* This assumes the iothread lock is taken here too. */ + qemu_mutex_lock_ramlist(); QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (addr == block->offset) { QTAILQ_REMOVE(&ram_list.blocks, block, next); @@ -1127,9 +1149,10 @@ void qemu_ram_free(ram_addr_t addr) #endif } g_free(block); - return; + break; } } + qemu_mutex_unlock_ramlist(); } @@ -1207,6 +1230,7 @@ void *qemu_get_ram_ptr(ram_addr_t addr) { RAMBlock *block; + /* The list is protected by the iothread lock here. */ block = ram_list.mru_block; if (block && addr - block->offset < block->length) { goto found; @@ -1246,6 +1270,7 @@ static void *qemu_safe_ram_ptr(ram_addr_t addr) { RAMBlock *block; + /* The list is protected by the iothread lock here. */ QTAILQ_FOREACH(block, &ram_list.blocks, next) { if (addr - block->offset < block->length) { if (xen_enabled()) { diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h index f052b38974..439e88deb4 100644 --- a/include/exec/cpu-all.h +++ b/include/exec/cpu-all.h @@ -22,6 +22,7 @@ #include "qemu-common.h" #include "qemu/tls.h" #include "exec/cpu-common.h" +#include "qemu/thread.h" /* some important defines: * @@ -487,6 +488,9 @@ typedef struct RAMBlock { ram_addr_t length; uint32_t flags; char idstr[256]; + /* Reads can take either the iothread or the ramlist lock. + * Writes must take both locks. + */ QTAILQ_ENTRY(RAMBlock) next; #if defined(__linux__) && !defined(TARGET_S390X) int fd; @@ -494,8 +498,11 @@ typedef struct RAMBlock { } RAMBlock; typedef struct RAMList { + QemuMutex mutex; + /* Protected by the iothread lock. */ uint8_t *phys_dirty; RAMBlock *mru_block; + /* Protected by the ramlist lock. */ QTAILQ_HEAD(, RAMBlock) blocks; uint32_t version; } RAMList; @@ -516,6 +523,8 @@ extern int mem_prealloc; void dump_exec_info(FILE *f, fprintf_function cpu_fprintf); ram_addr_t last_ram_offset(void); +void qemu_mutex_lock_ramlist(void); +void qemu_mutex_unlock_ramlist(void); #endif /* !CONFIG_USER_ONLY */ int cpu_memory_rw_debug(CPUArchState *env, target_ulong addr, From c09f4cb2b3243085a86aee3c7ed4f31c77e4db87 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Mon, 23 Jul 2012 01:56:50 +0200 Subject: [PATCH 271/300] buffered_file: Move from using a timer to use a thread We still protect everything except the wait with the iothread lock. But we moved from a timer to a thread. Steps one by one. We also need to detect when we have finished with a variable "complete". Signed-off-by: Juan Quintela --- buffered_file.c | 58 ++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/buffered_file.c b/buffered_file.c index 1de47e04a8..70590997d5 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -17,6 +17,7 @@ #include "hw/hw.h" #include "qemu/timer.h" #include "buffered_file.h" +#include "qemu/thread.h" //#define DEBUG_BUFFERED_FILE @@ -30,7 +31,8 @@ typedef struct QEMUFileBuffered uint8_t *buffer; size_t buffer_size; size_t buffer_capacity; - QEMUTimer *timer; + QemuThread thread; + bool complete; } QEMUFileBuffered; #ifdef DEBUG_BUFFERED_FILE @@ -159,11 +161,8 @@ static int buffered_close(void *opaque) if (ret >= 0) { ret = ret2; } - qemu_del_timer(s->timer); - qemu_free_timer(s->timer); - g_free(s->buffer); - g_free(s); - + ret = migrate_fd_close(s->migration_state); + s->complete = true; return ret; } @@ -221,23 +220,38 @@ static int64_t buffered_get_rate_limit(void *opaque) return s->xfer_limit; } -static void buffered_rate_tick(void *opaque) +/* 10ms xfer_limit is the limit that we should write each 10ms */ +#define BUFFER_DELAY 100 + +static void *buffered_file_thread(void *opaque) { QEMUFileBuffered *s = opaque; + int64_t expire_time = qemu_get_clock_ms(rt_clock) + BUFFER_DELAY; - if (qemu_file_get_error(s->file)) { - buffered_close(s); - return; + while (true) { + int64_t current_time = qemu_get_clock_ms(rt_clock); + + if (s->complete) { + break; + } + if (s->freeze_output) { + continue; + } + if (current_time >= expire_time) { + s->bytes_xfer = 0; + expire_time = current_time + BUFFER_DELAY; + } + if (s->bytes_xfer >= s->xfer_limit) { + /* usleep expects microseconds */ + g_usleep((expire_time - current_time)*1000); + } + qemu_mutex_lock_iothread(); + buffered_put_buffer(s, NULL, 0, 0); + qemu_mutex_unlock_iothread(); } - - qemu_mod_timer(s->timer, qemu_get_clock_ms(rt_clock) + 100); - - if (s->freeze_output) - return; - - s->bytes_xfer = 0; - - buffered_put_buffer(s, NULL, 0, 0); + g_free(s->buffer); + g_free(s); + return NULL; } static const QEMUFileOps buffered_file_ops = { @@ -257,12 +271,12 @@ QEMUFile *qemu_fopen_ops_buffered(MigrationState *migration_state) s->migration_state = migration_state; s->xfer_limit = migration_state->bandwidth_limit / 10; + s->complete = false; s->file = qemu_fopen_ops(s, &buffered_file_ops); - s->timer = qemu_new_timer_ms(rt_clock, buffered_rate_tick, s); - - qemu_mod_timer(s->timer, qemu_get_clock_ms(rt_clock) + 100); + qemu_thread_create(&s->thread, buffered_file_thread, s, + QEMU_THREAD_DETACHED); return s->file; } From edfa1af52f4c69264c5a0c38da10eb372077fba3 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Mon, 23 Jul 2012 02:13:23 +0200 Subject: [PATCH 272/300] migration: make qemu_fopen_ops_buffered() return void We want the file assignment to happen before the thread is created to avoid locking, so we just do it before creating the thread. Signed-off-by: Juan Quintela Reviewed-by: Orit Wasserman --- buffered_file.c | 13 ++++++------- buffered_file.h | 2 +- include/migration/migration.h | 1 + migration.c | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/buffered_file.c b/buffered_file.c index 70590997d5..d61892b9e8 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -32,7 +32,6 @@ typedef struct QEMUFileBuffered size_t buffer_size; size_t buffer_capacity; QemuThread thread; - bool complete; } QEMUFileBuffered; #ifdef DEBUG_BUFFERED_FILE @@ -162,7 +161,7 @@ static int buffered_close(void *opaque) ret = ret2; } ret = migrate_fd_close(s->migration_state); - s->complete = true; + s->migration_state->complete = true; return ret; } @@ -231,7 +230,7 @@ static void *buffered_file_thread(void *opaque) while (true) { int64_t current_time = qemu_get_clock_ms(rt_clock); - if (s->complete) { + if (s->migration_state->complete) { break; } if (s->freeze_output) { @@ -263,7 +262,7 @@ static const QEMUFileOps buffered_file_ops = { .set_rate_limit = buffered_set_rate_limit, }; -QEMUFile *qemu_fopen_ops_buffered(MigrationState *migration_state) +void qemu_fopen_ops_buffered(MigrationState *migration_state) { QEMUFileBuffered *s; @@ -271,12 +270,12 @@ QEMUFile *qemu_fopen_ops_buffered(MigrationState *migration_state) s->migration_state = migration_state; s->xfer_limit = migration_state->bandwidth_limit / 10; - s->complete = false; + s->migration_state->complete = false; s->file = qemu_fopen_ops(s, &buffered_file_ops); + migration_state->file = s->file; + qemu_thread_create(&s->thread, buffered_file_thread, s, QEMU_THREAD_DETACHED); - - return s->file; } diff --git a/buffered_file.h b/buffered_file.h index 86a7075246..d278f3d951 100644 --- a/buffered_file.h +++ b/buffered_file.h @@ -17,6 +17,6 @@ #include "hw/hw.h" #include "migration/migration.h" -QEMUFile *qemu_fopen_ops_buffered(MigrationState *migration_state); +void qemu_fopen_ops_buffered(MigrationState *migration_state); #endif diff --git a/include/migration/migration.h b/include/migration/migration.h index 8b7af61e7e..fa1fb8f4cd 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -45,6 +45,7 @@ struct MigrationState int64_t dirty_pages_rate; bool enabled_capabilities[MIGRATION_CAPABILITY_MAX]; int64_t xbzrle_cache_size; + bool complete; }; void process_incoming_migration(QEMUFile *f); diff --git a/migration.c b/migration.c index e560930977..5450c3b3e7 100644 --- a/migration.c +++ b/migration.c @@ -448,7 +448,7 @@ void migrate_fd_connect(MigrationState *s) int ret; s->state = MIG_STATE_ACTIVE; - s->file = qemu_fopen_ops_buffered(s); + qemu_fopen_ops_buffered(s); DPRINTF("beginning savevm\n"); ret = qemu_savevm_state_begin(s->file, &s->params); From 766bd1769e70835e0cc25f3f057f101619494b59 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Mon, 23 Jul 2012 05:45:29 +0200 Subject: [PATCH 273/300] migration: move migration thread init code to migrate_fd_put_ready This way everything related with migration is run on the migration thread and no locking is needed. Signed-off-by: Juan Quintela --- include/migration/migration.h | 1 + migration.c | 29 +++++++++++++++++------------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/include/migration/migration.h b/include/migration/migration.h index fa1fb8f4cd..0ce3720112 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -46,6 +46,7 @@ struct MigrationState bool enabled_capabilities[MIGRATION_CAPABILITY_MAX]; int64_t xbzrle_cache_size; bool complete; + bool first_time; }; void process_incoming_migration(QEMUFile *f); diff --git a/migration.c b/migration.c index 5450c3b3e7..249eea389d 100644 --- a/migration.c +++ b/migration.c @@ -21,6 +21,7 @@ #include "block/block.h" #include "qemu/sockets.h" #include "migration/block.h" +#include "qemu/thread.h" #include "qmp-commands.h" //#define DEBUG_MIGRATION @@ -339,6 +340,16 @@ void migrate_fd_put_ready(MigrationState *s) DPRINTF("put_ready returning because of non-active state\n"); return; } + if (s->first_time) { + s->first_time = false; + DPRINTF("beginning savevm\n"); + ret = qemu_savevm_state_begin(s->file, &s->params); + if (ret < 0) { + DPRINTF("failed, %d\n", ret); + migrate_fd_error(s); + return; + } + } DPRINTF("iterate\n"); ret = qemu_savevm_state_iterate(s->file); @@ -351,7 +362,11 @@ void migrate_fd_put_ready(MigrationState *s) DPRINTF("done iterating\n"); start_time = qemu_get_clock_ms(rt_clock); qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); - vm_stop_force_state(RUN_STATE_FINISH_MIGRATE); + if (old_vm_running) { + vm_stop(RUN_STATE_FINISH_MIGRATE); + } else { + vm_stop_force_state(RUN_STATE_FINISH_MIGRATE); + } if (qemu_savevm_state_complete(s->file) < 0) { migrate_fd_error(s); @@ -445,19 +460,9 @@ bool migration_has_failed(MigrationState *s) void migrate_fd_connect(MigrationState *s) { - int ret; - s->state = MIG_STATE_ACTIVE; + s->first_time = true; qemu_fopen_ops_buffered(s); - - DPRINTF("beginning savevm\n"); - ret = qemu_savevm_state_begin(s->file, &s->params); - if (ret < 0) { - DPRINTF("failed, %d\n", ret); - migrate_fd_error(s); - return; - } - migrate_fd_put_ready(s); } static MigrationState *migrate_init(const MigrationParams *params) From dd217b8732b93d97c22fa70dc15a72d92a2b2380 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Mon, 23 Jul 2012 06:15:02 +0200 Subject: [PATCH 274/300] migration: make writes blocking Move all the writes to the migration_thread, and make writings blocking. Notice that are still using the iothread for everything that we do. Signed-off-by: Juan Quintela --- include/migration/qemu-file.h | 5 ----- migration-exec.c | 1 - migration-fd.c | 1 - migration-tcp.c | 1 + migration-unix.c | 1 + migration.c | 17 ----------------- savevm.c | 5 ----- 7 files changed, 2 insertions(+), 29 deletions(-) diff --git a/include/migration/qemu-file.h b/include/migration/qemu-file.h index d64bdbb19b..68deefbcfb 100644 --- a/include/migration/qemu-file.h +++ b/include/migration/qemu-file.h @@ -113,11 +113,6 @@ int64_t qemu_file_set_rate_limit(QEMUFile *f, int64_t new_rate); int64_t qemu_file_get_rate_limit(QEMUFile *f); int qemu_file_get_error(QEMUFile *f); -/* Try to send any outstanding data. This function is useful when output is - * halted due to rate limiting or EAGAIN errors occur as it can be used to - * resume output. */ -int qemu_file_put_notify(QEMUFile *f); - static inline void qemu_put_be64s(QEMUFile *f, const uint64_t *pv) { qemu_put_be64(f, *pv); diff --git a/migration-exec.c b/migration-exec.c index b7b760b1d4..a051a6e668 100644 --- a/migration-exec.c +++ b/migration-exec.c @@ -69,7 +69,6 @@ void exec_start_outgoing_migration(MigrationState *s, const char *command, Error s->fd = fileno(f); assert(s->fd != -1); - socket_set_nonblock(s->fd); s->opaque = qemu_popen(f, "w"); diff --git a/migration-fd.c b/migration-fd.c index 5086a9038a..a99e0e3971 100644 --- a/migration-fd.c +++ b/migration-fd.c @@ -75,7 +75,6 @@ void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error ** return; } - fcntl(s->fd, F_SETFL, O_NONBLOCK); s->get_error = fd_errno; s->write = fd_write; s->close = fd_close; diff --git a/migration-tcp.c b/migration-tcp.c index 1fca42843e..e78a296137 100644 --- a/migration-tcp.c +++ b/migration-tcp.c @@ -60,6 +60,7 @@ static void tcp_wait_for_connect(int fd, void *opaque) } else { DPRINTF("migrate connect success\n"); s->fd = fd; + socket_set_block(s->fd); migrate_fd_connect(s); } } diff --git a/migration-unix.c b/migration-unix.c index f2f368c528..218835a7a4 100644 --- a/migration-unix.c +++ b/migration-unix.c @@ -60,6 +60,7 @@ static void unix_wait_for_connect(int fd, void *opaque) } else { DPRINTF("migrate connect success\n"); s->fd = fd; + socket_set_block(s->fd); migrate_fd_connect(s); } } diff --git a/migration.c b/migration.c index 249eea389d..207c754e52 100644 --- a/migration.c +++ b/migration.c @@ -297,18 +297,6 @@ static void migrate_fd_completed(MigrationState *s) notifier_list_notify(&migration_state_notifiers, s); } -static void migrate_fd_put_notify(void *opaque) -{ - MigrationState *s = opaque; - int ret; - - qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL); - ret = qemu_file_put_notify(s->file); - if (ret) { - migrate_fd_error(s); - } -} - ssize_t migrate_fd_put_buffer(MigrationState *s, const void *data, size_t size) { @@ -325,10 +313,6 @@ ssize_t migrate_fd_put_buffer(MigrationState *s, const void *data, if (ret == -1) ret = -(s->get_error(s)); - if (ret == -EAGAIN) { - qemu_set_fd_handler2(s->fd, NULL, NULL, migrate_fd_put_notify, s); - } - return ret; } @@ -425,7 +409,6 @@ int migrate_fd_close(MigrationState *s) { int rc = 0; if (s->fd != -1) { - qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL); rc = s->close(s); s->fd = -1; } diff --git a/savevm.c b/savevm.c index b2a844f2b1..c93d0b4fde 100644 --- a/savevm.c +++ b/savevm.c @@ -555,11 +555,6 @@ int qemu_fclose(QEMUFile *f) return ret; } -int qemu_file_put_notify(QEMUFile *f) -{ - return f->ops->put_buffer(f->opaque, NULL, 0, 0); -} - void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size) { int l; From 188a428559f0cd0bde884d28b42e449abd744c2f Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Mon, 23 Jul 2012 06:24:03 +0200 Subject: [PATCH 275/300] migration: remove unfreeze logic Now that we have a thread, and blocking writes, we don't need it. Signed-off-by: Juan Quintela Reviewed-by: Paolo Bonzini --- buffered_file.c | 24 +----------------------- include/migration/migration.h | 1 - migration.c | 23 ----------------------- 3 files changed, 1 insertion(+), 47 deletions(-) diff --git a/buffered_file.c b/buffered_file.c index d61892b9e8..14e3a6fb73 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -25,7 +25,6 @@ typedef struct QEMUFileBuffered { MigrationState *migration_state; QEMUFile *file; - int freeze_output; size_t bytes_xfer; size_t xfer_limit; uint8_t *buffer; @@ -69,13 +68,6 @@ static ssize_t buffered_flush(QEMUFileBuffered *s) size_t to_send = MIN(s->buffer_size - offset, s->xfer_limit - s->bytes_xfer); ret = migrate_fd_put_buffer(s->migration_state, s->buffer + offset, to_send); - if (ret == -EAGAIN) { - DPRINTF("backend not ready, freezing\n"); - ret = 0; - s->freeze_output = 1; - break; - } - if (ret <= 0) { DPRINTF("error flushing data, %zd\n", ret); break; @@ -109,9 +101,6 @@ static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, in return error; } - DPRINTF("unfreezing output\n"); - s->freeze_output = 0; - if (size > 0) { DPRINTF("buffering %d bytes\n", size - offset); buffered_append(s, buf, size); @@ -125,7 +114,7 @@ static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, in if (pos == 0 && size == 0) { DPRINTF("file is ready\n"); - if (!s->freeze_output && s->bytes_xfer < s->xfer_limit) { + if (s->bytes_xfer < s->xfer_limit) { DPRINTF("notifying client\n"); migrate_fd_put_ready(s->migration_state); } @@ -148,12 +137,6 @@ static int buffered_close(void *opaque) if (ret < 0) { break; } - if (s->freeze_output) { - ret = migrate_fd_wait_for_unfreeze(s->migration_state); - if (ret < 0) { - break; - } - } } ret2 = migrate_fd_close(s->migration_state); @@ -187,8 +170,6 @@ static int buffered_rate_limit(void *opaque) if (ret) { return ret; } - if (s->freeze_output) - return 1; if (s->bytes_xfer > s->xfer_limit) return 1; @@ -233,9 +214,6 @@ static void *buffered_file_thread(void *opaque) if (s->migration_state->complete) { break; } - if (s->freeze_output) { - continue; - } if (current_time >= expire_time) { s->bytes_xfer = 0; expire_time = current_time + BUFFER_DELAY; diff --git a/include/migration/migration.h b/include/migration/migration.h index 0ce3720112..92190f2afd 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -82,7 +82,6 @@ void migrate_fd_connect(MigrationState *s); ssize_t migrate_fd_put_buffer(MigrationState *s, const void *data, size_t size); void migrate_fd_put_ready(MigrationState *s); -int migrate_fd_wait_for_unfreeze(MigrationState *s); int migrate_fd_close(MigrationState *s); void add_migration_state_change_notifier(Notifier *notify); diff --git a/migration.c b/migration.c index 207c754e52..032c9c254f 100644 --- a/migration.c +++ b/migration.c @@ -382,29 +382,6 @@ static void migrate_fd_cancel(MigrationState *s) migrate_fd_cleanup(s); } -int migrate_fd_wait_for_unfreeze(MigrationState *s) -{ - int ret; - - DPRINTF("wait for unfreeze\n"); - if (s->state != MIG_STATE_ACTIVE) - return -EINVAL; - - do { - fd_set wfds; - - FD_ZERO(&wfds); - FD_SET(s->fd, &wfds); - - ret = select(s->fd + 1, NULL, &wfds, NULL, NULL); - } while (ret == -1 && (s->get_error(s)) == EINTR); - - if (ret == -1) { - return -s->get_error(s); - } - return 0; -} - int migrate_fd_close(MigrationState *s) { int rc = 0; From e76274824defce54a124e5104be3880044c698e1 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Mon, 23 Jul 2012 06:31:30 +0200 Subject: [PATCH 276/300] migration: just lock migrate_fd_put_ready Signed-off-by: Juan Quintela --- buffered_file.c | 2 -- migration.c | 5 +++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/buffered_file.c b/buffered_file.c index 14e3a6fb73..7743fbdbca 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -222,9 +222,7 @@ static void *buffered_file_thread(void *opaque) /* usleep expects microseconds */ g_usleep((expire_time - current_time)*1000); } - qemu_mutex_lock_iothread(); buffered_put_buffer(s, NULL, 0, 0); - qemu_mutex_unlock_iothread(); } g_free(s->buffer); g_free(s); diff --git a/migration.c b/migration.c index 032c9c254f..11123bcea0 100644 --- a/migration.c +++ b/migration.c @@ -320,8 +320,10 @@ void migrate_fd_put_ready(MigrationState *s) { int ret; + qemu_mutex_lock_iothread(); if (s->state != MIG_STATE_ACTIVE) { DPRINTF("put_ready returning because of non-active state\n"); + qemu_mutex_unlock_iothread(); return; } if (s->first_time) { @@ -331,6 +333,7 @@ void migrate_fd_put_ready(MigrationState *s) if (ret < 0) { DPRINTF("failed, %d\n", ret); migrate_fd_error(s); + qemu_mutex_unlock_iothread(); return; } } @@ -366,6 +369,8 @@ void migrate_fd_put_ready(MigrationState *s) } } } + qemu_mutex_unlock_iothread(); + } static void migrate_fd_cancel(MigrationState *s) From 78d1d231f889f7eae3835ddaec4373011792e46f Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Tue, 24 Jul 2012 13:22:18 +0200 Subject: [PATCH 277/300] buffered_file: Unfold the trick to restart generating migration data This was needed before due to the way that the callbacks worked. Signed-off-by: Juan Quintela Reviewed-by: Paolo Bonzini --- buffered_file.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/buffered_file.c b/buffered_file.c index 7743fbdbca..d61d805de7 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -112,14 +112,6 @@ static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, in return error; } - if (pos == 0 && size == 0) { - DPRINTF("file is ready\n"); - if (s->bytes_xfer < s->xfer_limit) { - DPRINTF("notifying client\n"); - migrate_fd_put_ready(s->migration_state); - } - } - return size; } @@ -222,8 +214,17 @@ static void *buffered_file_thread(void *opaque) /* usleep expects microseconds */ g_usleep((expire_time - current_time)*1000); } - buffered_put_buffer(s, NULL, 0, 0); + if (buffered_flush(s) < 0) { + break; + } + + DPRINTF("file is ready\n"); + if (s->bytes_xfer < s->xfer_limit) { + DPRINTF("notifying client\n"); + migrate_fd_put_ready(s->migration_state); + } } + g_free(s->buffer); g_free(s); return NULL; From c518dd841deb85b3ccf77ff93e1142b27b06af32 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Tue, 24 Jul 2012 14:00:13 +0200 Subject: [PATCH 278/300] buffered_file: don't flush on put buffer We call buffered_put_buffer with iothread held, and buffered_flush() does synchronous writes. We only want to do the synchronous writes outside. Signed-off-by: Juan Quintela Reviewed-by: Paolo Bonzini --- buffered_file.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/buffered_file.c b/buffered_file.c index d61d805de7..1d7fa2443d 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -106,12 +106,6 @@ static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, in buffered_append(s, buf, size); } - error = buffered_flush(s); - if (error < 0) { - DPRINTF("buffered flush error. bailing: %s\n", strerror(-error)); - return error; - } - return size; } From f50b4986b261fc10065289d2a03deba24d824988 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Tue, 24 Jul 2012 14:24:08 +0200 Subject: [PATCH 279/300] buffered_file: unfold buffered_append in buffered_put_buffer It was the only user, and now buffered_put_buffer just do the append Signed-off-by: Juan Quintela Reviewed-by: Paolo Bonzini --- buffered_file.c | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/buffered_file.c b/buffered_file.c index 1d7fa2443d..be9424b543 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -41,22 +41,6 @@ typedef struct QEMUFileBuffered do { } while (0) #endif -static void buffered_append(QEMUFileBuffered *s, - const uint8_t *buf, size_t size) -{ - if (size > (s->buffer_capacity - s->buffer_size)) { - DPRINTF("increasing buffer capacity from %zu by %zu\n", - s->buffer_capacity, size + 1024); - - s->buffer_capacity += size + 1024; - - s->buffer = g_realloc(s->buffer, s->buffer_capacity); - } - - memcpy(s->buffer + s->buffer_size, buf, size); - s->buffer_size += size; -} - static ssize_t buffered_flush(QEMUFileBuffered *s) { size_t offset = 0; @@ -101,11 +85,22 @@ static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, in return error; } - if (size > 0) { - DPRINTF("buffering %d bytes\n", size - offset); - buffered_append(s, buf, size); + if (size <= 0) { + return size; } + if (size > (s->buffer_capacity - s->buffer_size)) { + DPRINTF("increasing buffer capacity from %zu by %zu\n", + s->buffer_capacity, size + 1024); + + s->buffer_capacity += size + 1024; + + s->buffer = g_realloc(s->buffer, s->buffer_capacity); + } + + memcpy(s->buffer + s->buffer_size, buf, size); + s->buffer_size += size; + return size; } From e4ed1541ac9413eac494a03532e34beaf8a7d1c5 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Fri, 21 Sep 2012 11:18:18 +0200 Subject: [PATCH 280/300] savevm: New save live migration method: pending Code just now does (simplified for clarity) if (qemu_savevm_state_iterate(s->file) == 1) { vm_stop_force_state(RUN_STATE_FINISH_MIGRATE); qemu_savevm_state_complete(s->file); } Problem here is that qemu_savevm_state_iterate() returns 1 when it knows that remaining memory to sent takes less than max downtime. But this means that we could end spending 2x max_downtime, one downtime in qemu_savevm_iterate, and the other in qemu_savevm_state_complete. Changed code to: pending_size = qemu_savevm_state_pending(s->file, max_size); DPRINTF("pending size %lu max %lu\n", pending_size, max_size); if (pending_size >= max_size) { ret = qemu_savevm_state_iterate(s->file); } else { vm_stop_force_state(RUN_STATE_FINISH_MIGRATE); qemu_savevm_state_complete(s->file); } So what we do is: at current network speed, we calculate the maximum number of bytes we can sent: max_size. Then we ask every save_live section how much they have pending. If they are less than max_size, we move to complete phase, otherwise we do an iterate one. This makes things much simpler, because now individual sections don't have to caluclate the bandwidth (it was implossible to do right from there). Signed-off-by: Juan Quintela Reviewed-by: Paolo Bonzini --- arch_init.c | 48 +++++++++++++--------------------- block-migration.c | 49 +++++++---------------------------- buffered_file.c | 25 +++++++++++++----- include/migration/migration.h | 2 +- include/migration/vmstate.h | 1 + include/sysemu/sysemu.h | 1 + migration.c | 22 +++++++++++----- savevm.c | 19 ++++++++++++++ 8 files changed, 83 insertions(+), 84 deletions(-) diff --git a/arch_init.c b/arch_init.c index fad1c4099a..af1ae9f72a 100644 --- a/arch_init.c +++ b/arch_init.c @@ -582,12 +582,9 @@ static int ram_save_setup(QEMUFile *f, void *opaque) static int ram_save_iterate(QEMUFile *f, void *opaque) { - uint64_t bytes_transferred_last; - double bwidth = 0; int ret; int i; - uint64_t expected_downtime; - MigrationState *s = migrate_get_current(); + int64_t t0; qemu_mutex_lock_ramlist(); @@ -595,9 +592,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) reset_ram_globals(); } - bytes_transferred_last = bytes_transferred; - bwidth = qemu_get_clock_ns(rt_clock); - + t0 = qemu_get_clock_ns(rt_clock); i = 0; while ((ret = qemu_file_rate_limit(f)) == 0) { int bytes_sent; @@ -615,7 +610,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) iterations */ if ((i & 63) == 0) { - uint64_t t1 = (qemu_get_clock_ns(rt_clock) - bwidth) / 1000000; + uint64_t t1 = (qemu_get_clock_ns(rt_clock) - t0) / 1000000; if (t1 > MAX_WAIT) { DPRINTF("big wait: %" PRIu64 " milliseconds, %d iterations\n", t1, i); @@ -629,31 +624,10 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) return ret; } - bwidth = qemu_get_clock_ns(rt_clock) - bwidth; - bwidth = (bytes_transferred - bytes_transferred_last) / bwidth; - - /* if we haven't transferred anything this round, force - * expected_downtime to a very high value, but without - * crashing */ - if (bwidth == 0) { - bwidth = 0.000001; - } - qemu_mutex_unlock_ramlist(); qemu_put_be64(f, RAM_SAVE_FLAG_EOS); - expected_downtime = ram_save_remaining() * TARGET_PAGE_SIZE / bwidth; - DPRINTF("ram_save_live: expected(%" PRIu64 ") <= max(" PRIu64 ")?\n", - expected_downtime, migrate_max_downtime()); - - if (expected_downtime <= migrate_max_downtime()) { - migration_bitmap_sync(); - expected_downtime = ram_save_remaining() * TARGET_PAGE_SIZE / bwidth; - s->expected_downtime = expected_downtime / 1000000; /* ns -> ms */ - - return expected_downtime <= migrate_max_downtime(); - } - return 0; + return i; } static int ram_save_complete(QEMUFile *f, void *opaque) @@ -683,6 +657,19 @@ static int ram_save_complete(QEMUFile *f, void *opaque) return 0; } +static uint64_t ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size) +{ + uint64_t remaining_size; + + remaining_size = ram_save_remaining() * TARGET_PAGE_SIZE; + + if (remaining_size < max_size) { + migration_bitmap_sync(); + remaining_size = ram_save_remaining() * TARGET_PAGE_SIZE; + } + return remaining_size; +} + static int load_xbzrle(QEMUFile *f, ram_addr_t addr, void *host) { int ret, rc = 0; @@ -869,6 +856,7 @@ SaveVMHandlers savevm_ram_handlers = { .save_live_setup = ram_save_setup, .save_live_iterate = ram_save_iterate, .save_live_complete = ram_save_complete, + .save_live_pending = ram_save_pending, .load_state = ram_load, .cancel = ram_migration_cancel, }; diff --git a/block-migration.c b/block-migration.c index ca4ba3fffb..6acf3e1682 100644 --- a/block-migration.c +++ b/block-migration.c @@ -77,9 +77,7 @@ typedef struct BlkMigState { int64_t total_sector_sum; int prev_progress; int bulk_completed; - long double total_time; long double prev_time_offset; - int reads; } BlkMigState; static BlkMigState block_mig_state; @@ -132,12 +130,6 @@ uint64_t blk_mig_bytes_total(void) return sum << BDRV_SECTOR_BITS; } -static inline long double compute_read_bwidth(void) -{ - assert(block_mig_state.total_time != 0); - return (block_mig_state.reads / block_mig_state.total_time) * BLOCK_SIZE; -} - static int bmds_aio_inflight(BlkMigDevState *bmds, int64_t sector) { int64_t chunk = sector / (int64_t)BDRV_SECTORS_PER_DIRTY_CHUNK; @@ -191,8 +183,6 @@ static void blk_mig_read_cb(void *opaque, int ret) blk->ret = ret; - block_mig_state.reads++; - block_mig_state.total_time += (curr_time - block_mig_state.prev_time_offset); block_mig_state.prev_time_offset = curr_time; QSIMPLEQ_INSERT_TAIL(&block_mig_state.blk_list, blk, entry); @@ -310,8 +300,6 @@ static void init_blk_migration(QEMUFile *f) block_mig_state.total_sector_sum = 0; block_mig_state.prev_progress = -1; block_mig_state.bulk_completed = 0; - block_mig_state.total_time = 0; - block_mig_state.reads = 0; bdrv_iterate(init_blk_migration_it, NULL); } @@ -493,32 +481,6 @@ static int64_t get_remaining_dirty(void) return dirty * BLOCK_SIZE; } -static int is_stage2_completed(void) -{ - int64_t remaining_dirty; - long double bwidth; - - if (block_mig_state.bulk_completed == 1) { - - remaining_dirty = get_remaining_dirty(); - if (remaining_dirty == 0) { - return 1; - } - - bwidth = compute_read_bwidth(); - - if ((remaining_dirty / bwidth) <= - migrate_max_downtime()) { - /* finish stage2 because we think that we can finish remaining work - below max_downtime */ - - return 1; - } - } - - return 0; -} - static void blk_mig_cleanup(void) { BlkMigDevState *bmds; @@ -619,7 +581,7 @@ static int block_save_iterate(QEMUFile *f, void *opaque) qemu_put_be64(f, BLK_MIG_FLAG_EOS); - return is_stage2_completed(); + return 0; } static int block_save_complete(QEMUFile *f, void *opaque) @@ -659,6 +621,14 @@ static int block_save_complete(QEMUFile *f, void *opaque) return 0; } +static uint64_t block_save_pending(QEMUFile *f, void *opaque, uint64_t max_size) +{ + + DPRINTF("Enter save live pending %ld\n", get_remaining_dirty()); + + return get_remaining_dirty(); +} + static int block_load(QEMUFile *f, void *opaque, int version_id) { static int banner_printed; @@ -755,6 +725,7 @@ SaveVMHandlers savevm_block_handlers = { .save_live_setup = block_save_setup, .save_live_iterate = block_save_iterate, .save_live_complete = block_save_complete, + .save_live_pending = block_save_pending, .load_state = block_load, .cancel = block_migration_cancel, .is_active = block_is_active, diff --git a/buffered_file.c b/buffered_file.c index be9424b543..fdf7efa964 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -181,13 +181,15 @@ static int64_t buffered_get_rate_limit(void *opaque) return s->xfer_limit; } -/* 10ms xfer_limit is the limit that we should write each 10ms */ +/* 100ms xfer_limit is the limit that we should write each 100ms */ #define BUFFER_DELAY 100 static void *buffered_file_thread(void *opaque) { QEMUFileBuffered *s = opaque; - int64_t expire_time = qemu_get_clock_ms(rt_clock) + BUFFER_DELAY; + int64_t initial_time = qemu_get_clock_ms(rt_clock); + int64_t max_size = 0; + bool last_round = false; while (true) { int64_t current_time = qemu_get_clock_ms(rt_clock); @@ -195,13 +197,22 @@ static void *buffered_file_thread(void *opaque) if (s->migration_state->complete) { break; } - if (current_time >= expire_time) { + if (current_time >= initial_time + BUFFER_DELAY) { + uint64_t transferred_bytes = s->bytes_xfer; + uint64_t time_spent = current_time - initial_time; + double bandwidth = transferred_bytes / time_spent; + max_size = bandwidth * migrate_max_downtime() / 1000000; + + DPRINTF("transferred %" PRIu64 " time_spent %" PRIu64 + " bandwidth %g max_size %" PRId64 "\n", + transferred_bytes, time_spent, bandwidth, max_size); + s->bytes_xfer = 0; - expire_time = current_time + BUFFER_DELAY; + initial_time = current_time; } - if (s->bytes_xfer >= s->xfer_limit) { + if (!last_round && (s->bytes_xfer >= s->xfer_limit)) { /* usleep expects microseconds */ - g_usleep((expire_time - current_time)*1000); + g_usleep((initial_time + BUFFER_DELAY - current_time)*1000); } if (buffered_flush(s) < 0) { break; @@ -210,7 +221,7 @@ static void *buffered_file_thread(void *opaque) DPRINTF("file is ready\n"); if (s->bytes_xfer < s->xfer_limit) { DPRINTF("notifying client\n"); - migrate_fd_put_ready(s->migration_state); + last_round = migrate_fd_put_ready(s->migration_state, max_size); } } diff --git a/include/migration/migration.h b/include/migration/migration.h index 92190f2afd..9571ec532c 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -81,7 +81,7 @@ void migrate_fd_connect(MigrationState *s); ssize_t migrate_fd_put_buffer(MigrationState *s, const void *data, size_t size); -void migrate_fd_put_ready(MigrationState *s); +bool migrate_fd_put_ready(MigrationState *s, uint64_t max_size); int migrate_fd_close(MigrationState *s); void add_migration_state_change_notifier(Notifier *notify); diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index 623af0a29a..f27276c2d8 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -35,6 +35,7 @@ typedef struct SaveVMHandlers { int (*save_live_setup)(QEMUFile *f, void *opaque); int (*save_live_iterate)(QEMUFile *f, void *opaque); int (*save_live_complete)(QEMUFile *f, void *opaque); + uint64_t (*save_live_pending)(QEMUFile *f, void *opaque, uint64_t max_size); void (*cancel)(void *opaque); LoadStateHandler *load_state; bool (*is_active)(void *opaque); diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index 8eaa4707a0..28a783e2be 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -78,6 +78,7 @@ int qemu_savevm_state_begin(QEMUFile *f, int qemu_savevm_state_iterate(QEMUFile *f); int qemu_savevm_state_complete(QEMUFile *f); void qemu_savevm_state_cancel(QEMUFile *f); +uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size); int qemu_loadvm_state(QEMUFile *f); /* SLIRP */ diff --git a/migration.c b/migration.c index 11123bcea0..b6374ae072 100644 --- a/migration.c +++ b/migration.c @@ -316,15 +316,17 @@ ssize_t migrate_fd_put_buffer(MigrationState *s, const void *data, return ret; } -void migrate_fd_put_ready(MigrationState *s) +bool migrate_fd_put_ready(MigrationState *s, uint64_t max_size) { int ret; + uint64_t pending_size; + bool last_round = false; qemu_mutex_lock_iothread(); if (s->state != MIG_STATE_ACTIVE) { DPRINTF("put_ready returning because of non-active state\n"); qemu_mutex_unlock_iothread(); - return; + return false; } if (s->first_time) { s->first_time = false; @@ -334,15 +336,19 @@ void migrate_fd_put_ready(MigrationState *s) DPRINTF("failed, %d\n", ret); migrate_fd_error(s); qemu_mutex_unlock_iothread(); - return; + return false; } } DPRINTF("iterate\n"); - ret = qemu_savevm_state_iterate(s->file); - if (ret < 0) { - migrate_fd_error(s); - } else if (ret == 1) { + pending_size = qemu_savevm_state_pending(s->file, max_size); + DPRINTF("pending size %lu max %lu\n", pending_size, max_size); + if (pending_size >= max_size) { + ret = qemu_savevm_state_iterate(s->file); + if (ret < 0) { + migrate_fd_error(s); + } + } else { int old_vm_running = runstate_is_running(); int64_t start_time, end_time; @@ -368,9 +374,11 @@ void migrate_fd_put_ready(MigrationState *s) vm_start(); } } + last_round = true; } qemu_mutex_unlock_iothread(); + return last_round; } static void migrate_fd_cancel(MigrationState *s) diff --git a/savevm.c b/savevm.c index c93d0b4fde..bcdb92ee81 100644 --- a/savevm.c +++ b/savevm.c @@ -1753,6 +1753,25 @@ int qemu_savevm_state_complete(QEMUFile *f) return qemu_file_get_error(f); } +uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size) +{ + SaveStateEntry *se; + uint64_t ret = 0; + + QTAILQ_FOREACH(se, &savevm_handlers, entry) { + if (!se->ops || !se->ops->save_live_pending) { + continue; + } + if (se->ops && se->ops->is_active) { + if (!se->ops->is_active(se->opaque)) { + continue; + } + } + ret += se->ops->save_live_pending(f, se->opaque, max_size); + } + return ret; +} + void qemu_savevm_state_cancel(QEMUFile *f) { SaveStateEntry *se; From 0d82d0e8b98cf0ea03a45f8542d835ebd3a84cd3 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 3 Oct 2012 14:18:33 +0200 Subject: [PATCH 281/300] migration: move buffered_file.c code into migration.c This only moves the code (also from buffered_file.h to migration.h). Fix whitespace until checkpatch is happy. Signed-off-by: Juan Quintela --- Makefile.objs | 3 +- buffered_file.c | 258 ---------------------------------- buffered_file.h | 22 --- include/migration/migration.h | 1 + migration.c | 233 +++++++++++++++++++++++++++++- 5 files changed, 235 insertions(+), 282 deletions(-) delete mode 100644 buffered_file.c delete mode 100644 buffered_file.h diff --git a/Makefile.objs b/Makefile.objs index a637a4a8f0..4ef0a718d2 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -77,7 +77,8 @@ common-obj-$(CONFIG_LINUX) += fsdev/ extra-obj-$(CONFIG_LINUX) += fsdev/ common-obj-y += tcg-runtime.o host-utils.o main-loop.o -common-obj-y += buffered_file.o migration.o migration-tcp.o +common-obj-y += migration.o migration-tcp.o +common-obj-y += migration.o migration-tcp.o common-obj-y += qemu-char.o #aio.o common-obj-y += block-migration.o iohandler.o common-obj-y += bitmap.o bitops.o diff --git a/buffered_file.c b/buffered_file.c deleted file mode 100644 index fdf7efa964..0000000000 --- a/buffered_file.c +++ /dev/null @@ -1,258 +0,0 @@ -/* - * QEMU buffered QEMUFile - * - * Copyright IBM, Corp. 2008 - * - * Authors: - * Anthony Liguori - * - * This work is licensed under the terms of the GNU GPL, version 2. See - * the COPYING file in the top-level directory. - * - * Contributions after 2012-01-13 are licensed under the terms of the - * GNU GPL, version 2 or (at your option) any later version. - */ - -#include "qemu-common.h" -#include "hw/hw.h" -#include "qemu/timer.h" -#include "buffered_file.h" -#include "qemu/thread.h" - -//#define DEBUG_BUFFERED_FILE - -typedef struct QEMUFileBuffered -{ - MigrationState *migration_state; - QEMUFile *file; - size_t bytes_xfer; - size_t xfer_limit; - uint8_t *buffer; - size_t buffer_size; - size_t buffer_capacity; - QemuThread thread; -} QEMUFileBuffered; - -#ifdef DEBUG_BUFFERED_FILE -#define DPRINTF(fmt, ...) \ - do { printf("buffered-file: " fmt, ## __VA_ARGS__); } while (0) -#else -#define DPRINTF(fmt, ...) \ - do { } while (0) -#endif - -static ssize_t buffered_flush(QEMUFileBuffered *s) -{ - size_t offset = 0; - ssize_t ret = 0; - - DPRINTF("flushing %zu byte(s) of data\n", s->buffer_size); - - while (s->bytes_xfer < s->xfer_limit && offset < s->buffer_size) { - size_t to_send = MIN(s->buffer_size - offset, s->xfer_limit - s->bytes_xfer); - ret = migrate_fd_put_buffer(s->migration_state, s->buffer + offset, - to_send); - if (ret <= 0) { - DPRINTF("error flushing data, %zd\n", ret); - break; - } else { - DPRINTF("flushed %zd byte(s)\n", ret); - offset += ret; - s->bytes_xfer += ret; - } - } - - DPRINTF("flushed %zu of %zu byte(s)\n", offset, s->buffer_size); - memmove(s->buffer, s->buffer + offset, s->buffer_size - offset); - s->buffer_size -= offset; - - if (ret < 0) { - return ret; - } - return offset; -} - -static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size) -{ - QEMUFileBuffered *s = opaque; - ssize_t error; - - DPRINTF("putting %d bytes at %" PRId64 "\n", size, pos); - - error = qemu_file_get_error(s->file); - if (error) { - DPRINTF("flush when error, bailing: %s\n", strerror(-error)); - return error; - } - - if (size <= 0) { - return size; - } - - if (size > (s->buffer_capacity - s->buffer_size)) { - DPRINTF("increasing buffer capacity from %zu by %zu\n", - s->buffer_capacity, size + 1024); - - s->buffer_capacity += size + 1024; - - s->buffer = g_realloc(s->buffer, s->buffer_capacity); - } - - memcpy(s->buffer + s->buffer_size, buf, size); - s->buffer_size += size; - - return size; -} - -static int buffered_close(void *opaque) -{ - QEMUFileBuffered *s = opaque; - ssize_t ret = 0; - int ret2; - - DPRINTF("closing\n"); - - s->xfer_limit = INT_MAX; - while (!qemu_file_get_error(s->file) && s->buffer_size) { - ret = buffered_flush(s); - if (ret < 0) { - break; - } - } - - ret2 = migrate_fd_close(s->migration_state); - if (ret >= 0) { - ret = ret2; - } - ret = migrate_fd_close(s->migration_state); - s->migration_state->complete = true; - return ret; -} - -/* - * The meaning of the return values is: - * 0: We can continue sending - * 1: Time to stop - * negative: There has been an error - */ -static int buffered_get_fd(void *opaque) -{ - QEMUFileBuffered *s = opaque; - - return qemu_get_fd(s->file); -} - -static int buffered_rate_limit(void *opaque) -{ - QEMUFileBuffered *s = opaque; - int ret; - - ret = qemu_file_get_error(s->file); - if (ret) { - return ret; - } - - if (s->bytes_xfer > s->xfer_limit) - return 1; - - return 0; -} - -static int64_t buffered_set_rate_limit(void *opaque, int64_t new_rate) -{ - QEMUFileBuffered *s = opaque; - if (qemu_file_get_error(s->file)) { - goto out; - } - if (new_rate > SIZE_MAX) { - new_rate = SIZE_MAX; - } - - s->xfer_limit = new_rate / 10; - -out: - return s->xfer_limit; -} - -static int64_t buffered_get_rate_limit(void *opaque) -{ - QEMUFileBuffered *s = opaque; - - return s->xfer_limit; -} - -/* 100ms xfer_limit is the limit that we should write each 100ms */ -#define BUFFER_DELAY 100 - -static void *buffered_file_thread(void *opaque) -{ - QEMUFileBuffered *s = opaque; - int64_t initial_time = qemu_get_clock_ms(rt_clock); - int64_t max_size = 0; - bool last_round = false; - - while (true) { - int64_t current_time = qemu_get_clock_ms(rt_clock); - - if (s->migration_state->complete) { - break; - } - if (current_time >= initial_time + BUFFER_DELAY) { - uint64_t transferred_bytes = s->bytes_xfer; - uint64_t time_spent = current_time - initial_time; - double bandwidth = transferred_bytes / time_spent; - max_size = bandwidth * migrate_max_downtime() / 1000000; - - DPRINTF("transferred %" PRIu64 " time_spent %" PRIu64 - " bandwidth %g max_size %" PRId64 "\n", - transferred_bytes, time_spent, bandwidth, max_size); - - s->bytes_xfer = 0; - initial_time = current_time; - } - if (!last_round && (s->bytes_xfer >= s->xfer_limit)) { - /* usleep expects microseconds */ - g_usleep((initial_time + BUFFER_DELAY - current_time)*1000); - } - if (buffered_flush(s) < 0) { - break; - } - - DPRINTF("file is ready\n"); - if (s->bytes_xfer < s->xfer_limit) { - DPRINTF("notifying client\n"); - last_round = migrate_fd_put_ready(s->migration_state, max_size); - } - } - - g_free(s->buffer); - g_free(s); - return NULL; -} - -static const QEMUFileOps buffered_file_ops = { - .get_fd = buffered_get_fd, - .put_buffer = buffered_put_buffer, - .close = buffered_close, - .rate_limit = buffered_rate_limit, - .get_rate_limit = buffered_get_rate_limit, - .set_rate_limit = buffered_set_rate_limit, -}; - -void qemu_fopen_ops_buffered(MigrationState *migration_state) -{ - QEMUFileBuffered *s; - - s = g_malloc0(sizeof(*s)); - - s->migration_state = migration_state; - s->xfer_limit = migration_state->bandwidth_limit / 10; - s->migration_state->complete = false; - - s->file = qemu_fopen_ops(s, &buffered_file_ops); - - migration_state->file = s->file; - - qemu_thread_create(&s->thread, buffered_file_thread, s, - QEMU_THREAD_DETACHED); -} diff --git a/buffered_file.h b/buffered_file.h deleted file mode 100644 index d278f3d951..0000000000 --- a/buffered_file.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * QEMU buffered QEMUFile - * - * Copyright IBM, Corp. 2008 - * - * Authors: - * Anthony Liguori - * - * This work is licensed under the terms of the GNU GPL, version 2. See - * the COPYING file in the top-level directory. - * - */ - -#ifndef QEMU_BUFFERED_FILE_H -#define QEMU_BUFFERED_FILE_H - -#include "hw/hw.h" -#include "migration/migration.h" - -void qemu_fopen_ops_buffered(MigrationState *migration_state); - -#endif diff --git a/include/migration/migration.h b/include/migration/migration.h index 9571ec532c..af7de038a9 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -129,4 +129,5 @@ int64_t migrate_xbzrle_cache_size(void); int64_t xbzrle_cache_resize(int64_t new_size); +void qemu_fopen_ops_buffered(MigrationState *migration_state); #endif diff --git a/migration.c b/migration.c index b6374ae072..2937c87f9a 100644 --- a/migration.c +++ b/migration.c @@ -16,7 +16,7 @@ #include "qemu-common.h" #include "migration/migration.h" #include "monitor/monitor.h" -#include "buffered_file.h" +#include "migration/qemu-file.h" #include "sysemu/sysemu.h" #include "block/block.h" #include "qemu/sockets.h" @@ -587,3 +587,234 @@ int64_t migrate_xbzrle_cache_size(void) return s->xbzrle_cache_size; } + +/* migration thread support */ + +typedef struct QEMUFileBuffered { + MigrationState *migration_state; + QEMUFile *file; + size_t bytes_xfer; + size_t xfer_limit; + uint8_t *buffer; + size_t buffer_size; + size_t buffer_capacity; + QemuThread thread; +} QEMUFileBuffered; + +static ssize_t buffered_flush(QEMUFileBuffered *s) +{ + size_t offset = 0; + ssize_t ret = 0; + + DPRINTF("flushing %zu byte(s) of data\n", s->buffer_size); + + while (s->bytes_xfer < s->xfer_limit && offset < s->buffer_size) { + size_t to_send = MIN(s->buffer_size - offset, s->xfer_limit - s->bytes_xfer); + ret = migrate_fd_put_buffer(s->migration_state, s->buffer + offset, + to_send); + if (ret <= 0) { + DPRINTF("error flushing data, %zd\n", ret); + break; + } else { + DPRINTF("flushed %zd byte(s)\n", ret); + offset += ret; + s->bytes_xfer += ret; + } + } + + DPRINTF("flushed %zu of %zu byte(s)\n", offset, s->buffer_size); + memmove(s->buffer, s->buffer + offset, s->buffer_size - offset); + s->buffer_size -= offset; + + if (ret < 0) { + return ret; + } + return offset; +} + +static int buffered_put_buffer(void *opaque, const uint8_t *buf, + int64_t pos, int size) +{ + QEMUFileBuffered *s = opaque; + ssize_t error; + + DPRINTF("putting %d bytes at %" PRId64 "\n", size, pos); + + error = qemu_file_get_error(s->file); + if (error) { + DPRINTF("flush when error, bailing: %s\n", strerror(-error)); + return error; + } + + if (size <= 0) { + return size; + } + + if (size > (s->buffer_capacity - s->buffer_size)) { + DPRINTF("increasing buffer capacity from %zu by %zu\n", + s->buffer_capacity, size + 1024); + + s->buffer_capacity += size + 1024; + + s->buffer = g_realloc(s->buffer, s->buffer_capacity); + } + + memcpy(s->buffer + s->buffer_size, buf, size); + s->buffer_size += size; + + return size; +} + +static int buffered_close(void *opaque) +{ + QEMUFileBuffered *s = opaque; + ssize_t ret = 0; + int ret2; + + DPRINTF("closing\n"); + + s->xfer_limit = INT_MAX; + while (!qemu_file_get_error(s->file) && s->buffer_size) { + ret = buffered_flush(s); + if (ret < 0) { + break; + } + } + + ret2 = migrate_fd_close(s->migration_state); + if (ret >= 0) { + ret = ret2; + } + ret = migrate_fd_close(s->migration_state); + s->migration_state->complete = true; + return ret; +} + +static int buffered_get_fd(void *opaque) +{ + QEMUFileBuffered *s = opaque; + + return qemu_get_fd(s->file); +} + +/* + * The meaning of the return values is: + * 0: We can continue sending + * 1: Time to stop + * negative: There has been an error + */ +static int buffered_rate_limit(void *opaque) +{ + QEMUFileBuffered *s = opaque; + int ret; + + ret = qemu_file_get_error(s->file); + if (ret) { + return ret; + } + + if (s->bytes_xfer > s->xfer_limit) { + return 1; + } + + return 0; +} + +static int64_t buffered_set_rate_limit(void *opaque, int64_t new_rate) +{ + QEMUFileBuffered *s = opaque; + if (qemu_file_get_error(s->file)) { + goto out; + } + if (new_rate > SIZE_MAX) { + new_rate = SIZE_MAX; + } + + s->xfer_limit = new_rate / 10; + +out: + return s->xfer_limit; +} + +static int64_t buffered_get_rate_limit(void *opaque) +{ + QEMUFileBuffered *s = opaque; + + return s->xfer_limit; +} + +/* 100ms xfer_limit is the limit that we should write each 100ms */ +#define BUFFER_DELAY 100 + +static void *buffered_file_thread(void *opaque) +{ + QEMUFileBuffered *s = opaque; + int64_t initial_time = qemu_get_clock_ms(rt_clock); + int64_t max_size = 0; + bool last_round = false; + + while (true) { + int64_t current_time = qemu_get_clock_ms(rt_clock); + + if (s->migration_state->complete) { + break; + } + if (current_time >= initial_time + BUFFER_DELAY) { + uint64_t transferred_bytes = s->bytes_xfer; + uint64_t time_spent = current_time - initial_time; + double bandwidth = transferred_bytes / time_spent; + max_size = bandwidth * migrate_max_downtime() / 1000000; + + DPRINTF("transferred %" PRIu64 " time_spent %" PRIu64 + " bandwidth %g max_size %" PRId64 "\n", + transferred_bytes, time_spent, bandwidth, max_size); + + s->bytes_xfer = 0; + initial_time = current_time; + } + if (!last_round && (s->bytes_xfer >= s->xfer_limit)) { + /* usleep expects microseconds */ + g_usleep((initial_time + BUFFER_DELAY - current_time)*1000); + } + if (buffered_flush(s) < 0) { + break; + } + + DPRINTF("file is ready\n"); + if (s->bytes_xfer < s->xfer_limit) { + DPRINTF("notifying client\n"); + last_round = migrate_fd_put_ready(s->migration_state, max_size); + } + } + + g_free(s->buffer); + g_free(s); + return NULL; +} + +static const QEMUFileOps buffered_file_ops = { + .get_fd = buffered_get_fd, + .put_buffer = buffered_put_buffer, + .close = buffered_close, + .rate_limit = buffered_rate_limit, + .get_rate_limit = buffered_get_rate_limit, + .set_rate_limit = buffered_set_rate_limit, +}; + +void qemu_fopen_ops_buffered(MigrationState *migration_state) +{ + QEMUFileBuffered *s; + + s = g_malloc0(sizeof(*s)); + + s->migration_state = migration_state; + s->xfer_limit = migration_state->bandwidth_limit / 10; + s->migration_state->complete = false; + + s->file = qemu_fopen_ops(s, &buffered_file_ops); + + migration_state->file = s->file; + + qemu_thread_create(&s->thread, buffered_file_thread, s, + QEMU_THREAD_DETACHED); +} From 5b4e1eb769eee892b44d3f6b2369b05196442f59 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 19 Dec 2012 10:40:48 +0100 Subject: [PATCH 282/300] migration: add XFER_LIMIT_RATIO The "magic" divisions by 10 are there because of the value of BUFFER_DELAY. Introduce a constant to explain them better. Signed-off-by: Paolo Bonzini Signed-off-by: Juan Quintela --- migration.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/migration.c b/migration.c index 2937c87f9a..15f22eac40 100644 --- a/migration.c +++ b/migration.c @@ -44,6 +44,11 @@ enum { #define MAX_THROTTLE (32 << 20) /* Migration speed throttling */ +/* Amount of time to allocate to each "chunk" of bandwidth-throttled + * data. */ +#define BUFFER_DELAY 100 +#define XFER_LIMIT_RATIO (1000 / BUFFER_DELAY) + /* Migration XBZRLE default cache size */ #define DEFAULT_MIGRATE_CACHE_SIZE (64 * 1024 * 1024) @@ -743,9 +748,6 @@ static int64_t buffered_get_rate_limit(void *opaque) return s->xfer_limit; } -/* 100ms xfer_limit is the limit that we should write each 100ms */ -#define BUFFER_DELAY 100 - static void *buffered_file_thread(void *opaque) { QEMUFileBuffered *s = opaque; @@ -808,7 +810,7 @@ void qemu_fopen_ops_buffered(MigrationState *migration_state) s = g_malloc0(sizeof(*s)); s->migration_state = migration_state; - s->xfer_limit = migration_state->bandwidth_limit / 10; + s->xfer_limit = s->migration_state->bandwidth_limit / XFER_LIMIT_RATIO; s->migration_state->complete = false; s->file = qemu_fopen_ops(s, &buffered_file_ops); From 0e288fa369c02df1731dc59ffbf158f5e5f2d80f Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 3 Oct 2012 17:23:59 +0200 Subject: [PATCH 283/300] migration: move migration_fd_put_ready() Put it near its use and un-export it. Signed-off-by: Juan Quintela --- include/migration/migration.h | 1 - migration.c | 130 +++++++++++++++++----------------- 2 files changed, 65 insertions(+), 66 deletions(-) diff --git a/include/migration/migration.h b/include/migration/migration.h index af7de038a9..2998dcc3b8 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -81,7 +81,6 @@ void migrate_fd_connect(MigrationState *s); ssize_t migrate_fd_put_buffer(MigrationState *s, const void *data, size_t size); -bool migrate_fd_put_ready(MigrationState *s, uint64_t max_size); int migrate_fd_close(MigrationState *s); void add_migration_state_change_notifier(Notifier *notify); diff --git a/migration.c b/migration.c index 15f22eac40..a38720112c 100644 --- a/migration.c +++ b/migration.c @@ -321,71 +321,6 @@ ssize_t migrate_fd_put_buffer(MigrationState *s, const void *data, return ret; } -bool migrate_fd_put_ready(MigrationState *s, uint64_t max_size) -{ - int ret; - uint64_t pending_size; - bool last_round = false; - - qemu_mutex_lock_iothread(); - if (s->state != MIG_STATE_ACTIVE) { - DPRINTF("put_ready returning because of non-active state\n"); - qemu_mutex_unlock_iothread(); - return false; - } - if (s->first_time) { - s->first_time = false; - DPRINTF("beginning savevm\n"); - ret = qemu_savevm_state_begin(s->file, &s->params); - if (ret < 0) { - DPRINTF("failed, %d\n", ret); - migrate_fd_error(s); - qemu_mutex_unlock_iothread(); - return false; - } - } - - DPRINTF("iterate\n"); - pending_size = qemu_savevm_state_pending(s->file, max_size); - DPRINTF("pending size %lu max %lu\n", pending_size, max_size); - if (pending_size >= max_size) { - ret = qemu_savevm_state_iterate(s->file); - if (ret < 0) { - migrate_fd_error(s); - } - } else { - int old_vm_running = runstate_is_running(); - int64_t start_time, end_time; - - DPRINTF("done iterating\n"); - start_time = qemu_get_clock_ms(rt_clock); - qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); - if (old_vm_running) { - vm_stop(RUN_STATE_FINISH_MIGRATE); - } else { - vm_stop_force_state(RUN_STATE_FINISH_MIGRATE); - } - - if (qemu_savevm_state_complete(s->file) < 0) { - migrate_fd_error(s); - } else { - migrate_fd_completed(s); - } - end_time = qemu_get_clock_ms(rt_clock); - s->total_time = end_time - s->total_time; - s->downtime = end_time - start_time; - if (s->state != MIG_STATE_COMPLETED) { - if (old_vm_running) { - vm_start(); - } - } - last_round = true; - } - qemu_mutex_unlock_iothread(); - - return last_round; -} - static void migrate_fd_cancel(MigrationState *s) { if (s->state != MIG_STATE_ACTIVE) @@ -748,6 +683,71 @@ static int64_t buffered_get_rate_limit(void *opaque) return s->xfer_limit; } +static bool migrate_fd_put_ready(MigrationState *s, uint64_t max_size) +{ + int ret; + uint64_t pending_size; + bool last_round = false; + + qemu_mutex_lock_iothread(); + if (s->state != MIG_STATE_ACTIVE) { + DPRINTF("put_ready returning because of non-active state\n"); + qemu_mutex_unlock_iothread(); + return false; + } + if (s->first_time) { + s->first_time = false; + DPRINTF("beginning savevm\n"); + ret = qemu_savevm_state_begin(s->file, &s->params); + if (ret < 0) { + DPRINTF("failed, %d\n", ret); + migrate_fd_error(s); + qemu_mutex_unlock_iothread(); + return false; + } + } + + DPRINTF("iterate\n"); + pending_size = qemu_savevm_state_pending(s->file, max_size); + DPRINTF("pending size %lu max %lu\n", pending_size, max_size); + if (pending_size >= max_size) { + ret = qemu_savevm_state_iterate(s->file); + if (ret < 0) { + migrate_fd_error(s); + } + } else { + int old_vm_running = runstate_is_running(); + int64_t start_time, end_time; + + DPRINTF("done iterating\n"); + start_time = qemu_get_clock_ms(rt_clock); + qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); + if (old_vm_running) { + vm_stop(RUN_STATE_FINISH_MIGRATE); + } else { + vm_stop_force_state(RUN_STATE_FINISH_MIGRATE); + } + + if (qemu_savevm_state_complete(s->file) < 0) { + migrate_fd_error(s); + } else { + migrate_fd_completed(s); + } + end_time = qemu_get_clock_ms(rt_clock); + s->total_time = end_time - s->total_time; + s->downtime = end_time - start_time; + if (s->state != MIG_STATE_COMPLETED) { + if (old_vm_running) { + vm_start(); + } + } + last_round = true; + } + qemu_mutex_unlock_iothread(); + + return last_round; +} + static void *buffered_file_thread(void *opaque) { QEMUFileBuffered *s = opaque; From 2e450865338738300e529457879d81332939f064 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 3 Oct 2012 18:23:03 +0200 Subject: [PATCH 284/300] migration: Inline qemu_fopen_ops_buffered into migrate_fd_connect Signed-off-by: Juan Quintela --- include/migration/migration.h | 2 -- migration.c | 11 +++-------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/include/migration/migration.h b/include/migration/migration.h index 2998dcc3b8..0c9bf8b482 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -127,6 +127,4 @@ int migrate_use_xbzrle(void); int64_t migrate_xbzrle_cache_size(void); int64_t xbzrle_cache_resize(int64_t new_size); - -void qemu_fopen_ops_buffered(MigrationState *migration_state); #endif diff --git a/migration.c b/migration.c index a38720112c..4a9f0b5041 100644 --- a/migration.c +++ b/migration.c @@ -371,13 +371,6 @@ bool migration_has_failed(MigrationState *s) s->state == MIG_STATE_ERROR); } -void migrate_fd_connect(MigrationState *s) -{ - s->state = MIG_STATE_ACTIVE; - s->first_time = true; - qemu_fopen_ops_buffered(s); -} - static MigrationState *migrate_init(const MigrationParams *params) { MigrationState *s = migrate_get_current(); @@ -803,10 +796,12 @@ static const QEMUFileOps buffered_file_ops = { .set_rate_limit = buffered_set_rate_limit, }; -void qemu_fopen_ops_buffered(MigrationState *migration_state) +void migrate_fd_connect(MigrationState *migration_state) { QEMUFileBuffered *s; + migration_state->state = MIG_STATE_ACTIVE; + migration_state->first_time = true; s = g_malloc0(sizeof(*s)); s->migration_state = migration_state; From 0d3b26f5488e04c01667dd12c9bd7eed54dda258 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 3 Oct 2012 20:04:41 +0200 Subject: [PATCH 285/300] migration: move migration notifier At this point, it is waranteed that state is ACTIVE. Old position didn't assured hat. Signed-off-by: Juan Quintela --- migration.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/migration.c b/migration.c index 4a9f0b5041..596aca7276 100644 --- a/migration.c +++ b/migration.c @@ -455,8 +455,6 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk, error_propagate(errp, local_err); return; } - - notifier_list_notify(&migration_state_notifiers, s); } void qmp_migrate_cancel(Error **errp) @@ -814,4 +812,5 @@ void migrate_fd_connect(MigrationState *migration_state) qemu_thread_create(&s->thread, buffered_file_thread, s, QEMU_THREAD_DETACHED); + notifier_list_notify(&migration_state_notifiers, s); } From b23a9a5cad356cdc8e25d4be72e53096a27ea722 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 17 Oct 2012 20:08:04 +0200 Subject: [PATCH 286/300] ram: rename last_block to last_seen_block Signed-off-by: Juan Quintela --- arch_init.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/arch_init.c b/arch_init.c index af1ae9f72a..4351d304a8 100644 --- a/arch_init.c +++ b/arch_init.c @@ -332,7 +332,10 @@ static int save_xbzrle_page(QEMUFile *f, uint8_t *current_data, return bytes_sent; } -static RAMBlock *last_block; + +/* This is the last block that we have visited serching for dirty pages + */ +static RAMBlock *last_seen_block; static ram_addr_t last_offset; static unsigned long *migration_bitmap; static uint64_t migration_dirty_pages; @@ -417,7 +420,7 @@ static void migration_bitmap_sync(void) static int ram_save_block(QEMUFile *f, bool last_stage) { - RAMBlock *block = last_block; + RAMBlock *block = last_seen_block; ram_addr_t offset = last_offset; int bytes_sent = -1; MemoryRegion *mr; @@ -430,7 +433,8 @@ static int ram_save_block(QEMUFile *f, bool last_stage) mr = block->mr; if (migration_bitmap_test_and_reset_dirty(mr, offset)) { uint8_t *p; - int cont = (block == last_block) ? RAM_SAVE_FLAG_CONTINUE : 0; + int cont = (block == last_seen_block) ? + RAM_SAVE_FLAG_CONTINUE : 0; p = memory_region_get_ram_ptr(mr) + offset; @@ -469,9 +473,9 @@ static int ram_save_block(QEMUFile *f, bool last_stage) if (!block) block = QTAILQ_FIRST(&ram_list.blocks); } - } while (block != last_block || offset != last_offset); + } while (block != last_seen_block || offset != last_offset); - last_block = block; + last_seen_block = block; last_offset = offset; return bytes_sent; @@ -530,7 +534,7 @@ static void ram_migration_cancel(void *opaque) static void reset_ram_globals(void) { - last_block = NULL; + last_seen_block = NULL; last_offset = 0; last_version = ram_list.version; } From 5f718a15d0db3775bbcf2755a35dd6b019bcff8b Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 17 Oct 2012 20:10:55 +0200 Subject: [PATCH 287/300] ram: Add last_sent_block This is the last block from where we have sent data. Signed-off-by: Orit Wasserman Signed-off-by: Juan Quintela --- arch_init.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/arch_init.c b/arch_init.c index 4351d304a8..caac526f2f 100644 --- a/arch_init.c +++ b/arch_init.c @@ -336,6 +336,8 @@ static int save_xbzrle_page(QEMUFile *f, uint8_t *current_data, /* This is the last block that we have visited serching for dirty pages */ static RAMBlock *last_seen_block; +/* This is the last block from where we have sent data */ +static RAMBlock *last_sent_block; static ram_addr_t last_offset; static unsigned long *migration_bitmap; static uint64_t migration_dirty_pages; @@ -433,7 +435,7 @@ static int ram_save_block(QEMUFile *f, bool last_stage) mr = block->mr; if (migration_bitmap_test_and_reset_dirty(mr, offset)) { uint8_t *p; - int cont = (block == last_seen_block) ? + int cont = (block == last_sent_block) ? RAM_SAVE_FLAG_CONTINUE : 0; p = memory_region_get_ram_ptr(mr) + offset; @@ -462,6 +464,7 @@ static int ram_save_block(QEMUFile *f, bool last_stage) /* if page is unmodified, continue to the next */ if (bytes_sent != 0) { + last_sent_block = block; break; } } @@ -535,6 +538,7 @@ static void ram_migration_cancel(void *opaque) static void reset_ram_globals(void) { last_seen_block = NULL; + last_sent_block = NULL; last_offset = 0; last_version = ram_list.version; } From 6c279db8ee99e64e498447c67c16e987150be96b Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 17 Oct 2012 20:24:28 +0200 Subject: [PATCH 288/300] memory: introduce memory_region_test_and_clear_dirty This function avoids having to do two calls, one to test the dirty bit, and other to reset it. Signed-off-by: Juan Quintela --- include/exec/memory.h | 16 ++++++++++++++++ memory.c | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/exec/memory.h b/include/exec/memory.h index aada969628..2322732dce 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -453,6 +453,22 @@ bool memory_region_get_dirty(MemoryRegion *mr, hwaddr addr, void memory_region_set_dirty(MemoryRegion *mr, hwaddr addr, hwaddr size); +/** + * memory_region_test_and_clear_dirty: Check whether a range of bytes is dirty + * for a specified client. It clears them. + * + * Checks whether a range of bytes has been written to since the last + * call to memory_region_reset_dirty() with the same @client. Dirty logging + * must be enabled. + * + * @mr: the memory region being queried. + * @addr: the address (relative to the start of the region) being queried. + * @size: the size of the range being queried. + * @client: the user of the logging information; %DIRTY_MEMORY_MIGRATION or + * %DIRTY_MEMORY_VGA. + */ +bool memory_region_test_and_clear_dirty(MemoryRegion *mr, hwaddr addr, + hwaddr size, unsigned client); /** * memory_region_sync_dirty_bitmap: Synchronize a region's dirty bitmap with * any external TLBs (e.g. kvm) diff --git a/memory.c b/memory.c index 35e6122dd7..410c5f80b4 100644 --- a/memory.c +++ b/memory.c @@ -1081,6 +1081,22 @@ void memory_region_set_dirty(MemoryRegion *mr, hwaddr addr, return cpu_physical_memory_set_dirty_range(mr->ram_addr + addr, size, -1); } +bool memory_region_test_and_clear_dirty(MemoryRegion *mr, hwaddr addr, + hwaddr size, unsigned client) +{ + bool ret; + assert(mr->terminates); + ret = cpu_physical_memory_get_dirty(mr->ram_addr + addr, size, + 1 << client); + if (ret) { + cpu_physical_memory_reset_dirty(mr->ram_addr + addr, + mr->ram_addr + addr + size, + 1 << client); + } + return ret; +} + + void memory_region_sync_dirty_bitmap(MemoryRegion *mr) { AddressSpace *as; From ece7931817e03a4d946c15716fab5e4f781663c9 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 17 Oct 2012 20:27:15 +0200 Subject: [PATCH 289/300] ram: Use memory_region_test_and_clear_dirty This avoids having to do two walks over the dirty bitmap, once reading the dirty bits, and anthoer cleaning them. Signed-off-by: Juan Quintela --- arch_init.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/arch_init.c b/arch_init.c index caac526f2f..9f32ee0124 100644 --- a/arch_init.c +++ b/arch_init.c @@ -390,13 +390,12 @@ static void migration_bitmap_sync(void) QTAILQ_FOREACH(block, &ram_list.blocks, next) { for (addr = 0; addr < block->length; addr += TARGET_PAGE_SIZE) { - if (memory_region_get_dirty(block->mr, addr, TARGET_PAGE_SIZE, - DIRTY_MEMORY_MIGRATION)) { + if (memory_region_test_and_clear_dirty(block->mr, + addr, TARGET_PAGE_SIZE, + DIRTY_MEMORY_MIGRATION)) { migration_bitmap_set_dirty(block->mr, addr); } } - memory_region_reset_dirty(block->mr, 0, block->length, - DIRTY_MEMORY_MIGRATION); } trace_migration_bitmap_sync_end(migration_dirty_pages - num_dirty_pages_init); From 4c8ae0f60e63478aea0a1741cca95474b68fb949 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Thu, 18 Oct 2012 00:00:59 +0200 Subject: [PATCH 290/300] ram: optimize migration bitmap walking Instead of testing each page individually, we search what is the next dirty page with a bitmap operation. We have to reorganize the code to move from a "for" loop, to a while(dirty) loop. Signed-off-by: Juan Quintela --- arch_init.c | 45 ++++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/arch_init.c b/arch_init.c index 9f32ee0124..74dc9c8c51 100644 --- a/arch_init.c +++ b/arch_init.c @@ -343,18 +343,21 @@ static unsigned long *migration_bitmap; static uint64_t migration_dirty_pages; static uint32_t last_version; -static inline bool migration_bitmap_test_and_reset_dirty(MemoryRegion *mr, - ram_addr_t offset) +static inline +ram_addr_t migration_bitmap_find_and_reset_dirty(MemoryRegion *mr, + ram_addr_t start) { - bool ret; - int nr = (mr->ram_addr + offset) >> TARGET_PAGE_BITS; + unsigned long base = mr->ram_addr >> TARGET_PAGE_BITS; + unsigned long nr = base + (start >> TARGET_PAGE_BITS); + unsigned long size = base + (int128_get64(mr->size) >> TARGET_PAGE_BITS); - ret = test_and_clear_bit(nr, migration_bitmap); + unsigned long next = find_next_bit(migration_bitmap, size, nr); - if (ret) { + if (next < size) { + clear_bit(next, migration_bitmap); migration_dirty_pages--; } - return ret; + return (next - base) << TARGET_PAGE_BITS; } static inline bool migration_bitmap_set_dirty(MemoryRegion *mr, @@ -423,6 +426,7 @@ static int ram_save_block(QEMUFile *f, bool last_stage) { RAMBlock *block = last_seen_block; ram_addr_t offset = last_offset; + bool complete_round = false; int bytes_sent = -1; MemoryRegion *mr; ram_addr_t current_addr; @@ -430,9 +434,21 @@ static int ram_save_block(QEMUFile *f, bool last_stage) if (!block) block = QTAILQ_FIRST(&ram_list.blocks); - do { + while (true) { mr = block->mr; - if (migration_bitmap_test_and_reset_dirty(mr, offset)) { + offset = migration_bitmap_find_and_reset_dirty(mr, offset); + if (complete_round && block == last_seen_block && + offset >= last_offset) { + break; + } + if (offset >= block->length) { + offset = 0; + block = QTAILQ_NEXT(block, next); + if (!block) { + block = QTAILQ_FIRST(&ram_list.blocks); + complete_round = true; + } + } else { uint8_t *p; int cont = (block == last_sent_block) ? RAM_SAVE_FLAG_CONTINUE : 0; @@ -467,16 +483,7 @@ static int ram_save_block(QEMUFile *f, bool last_stage) break; } } - - offset += TARGET_PAGE_SIZE; - if (offset >= block->length) { - offset = 0; - block = QTAILQ_NEXT(block, next); - if (!block) - block = QTAILQ_FIRST(&ram_list.blocks); - } - } while (block != last_seen_block || offset != last_offset); - + } last_seen_block = block; last_offset = offset; From 3f7d7b098194ec893efa037491f6231687ff043a Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Thu, 18 Oct 2012 13:56:35 +0200 Subject: [PATCH 291/300] ram: account the amount of transferred ram better Signed-off-by: Juan Quintela --- arch_init.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/arch_init.c b/arch_init.c index 74dc9c8c51..4015bfd8c5 100644 --- a/arch_init.c +++ b/arch_init.c @@ -265,16 +265,21 @@ uint64_t xbzrle_mig_pages_overflow(void) return acct_info.xbzrle_overflows; } -static void save_block_hdr(QEMUFile *f, RAMBlock *block, ram_addr_t offset, - int cont, int flag) +static size_t save_block_hdr(QEMUFile *f, RAMBlock *block, ram_addr_t offset, + int cont, int flag) { - qemu_put_be64(f, offset | cont | flag); - if (!cont) { - qemu_put_byte(f, strlen(block->idstr)); - qemu_put_buffer(f, (uint8_t *)block->idstr, - strlen(block->idstr)); - } + size_t size; + qemu_put_be64(f, offset | cont | flag); + size = 8; + + if (!cont) { + qemu_put_byte(f, strlen(block->idstr)); + qemu_put_buffer(f, (uint8_t *)block->idstr, + strlen(block->idstr)); + size += 1 + strlen(block->idstr); + } + return size; } #define ENCODING_FLAG_XBZRLE 0x1 @@ -321,11 +326,11 @@ static int save_xbzrle_page(QEMUFile *f, uint8_t *current_data, } /* Send XBZRLE based compressed page */ - save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_XBZRLE); + bytes_sent = save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_XBZRLE); qemu_put_byte(f, ENCODING_FLAG_XBZRLE); qemu_put_be16(f, encoded_len); qemu_put_buffer(f, XBZRLE.encoded_buf, encoded_len); - bytes_sent = encoded_len + 1 + 2; + bytes_sent += encoded_len + 1 + 2; acct_info.xbzrle_pages++; acct_info.xbzrle_bytes += bytes_sent; @@ -457,9 +462,10 @@ static int ram_save_block(QEMUFile *f, bool last_stage) if (is_dup_page(p)) { acct_info.dup_pages++; - save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_COMPRESS); + bytes_sent = save_block_hdr(f, block, offset, cont, + RAM_SAVE_FLAG_COMPRESS); qemu_put_byte(f, *p); - bytes_sent = 1; + bytes_sent += 1; } else if (migrate_use_xbzrle()) { current_addr = block->offset + offset; bytes_sent = save_xbzrle_page(f, p, current_addr, block, @@ -471,9 +477,9 @@ static int ram_save_block(QEMUFile *f, bool last_stage) /* either we didn't send yet (we may have had XBZRLE overflow) */ if (bytes_sent == -1) { - save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_PAGE); + bytes_sent = save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_PAGE); qemu_put_buffer(f, p, TARGET_PAGE_SIZE); - bytes_sent = TARGET_PAGE_SIZE; + bytes_sent += TARGET_PAGE_SIZE; acct_info.norm_pages++; } From b823ceaadfaad65f3a034ada394b33ca1bf1a914 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Mon, 10 Dec 2012 13:27:50 +0100 Subject: [PATCH 292/300] ram: refactor ram_save_block() return value It could only return 0 if we only found dirty xbzrle pages that hadn't changed (i.e. they were written with the same content). We don't care about that case, it is the same than nothing dirty. So now the return of the function is how much have it written, nothing else. Adjust callers. And we also made ram_save_iterate() return the number of transferred bytes, not the number of transferred pages. Signed-off-by: Juan Quintela --- arch_init.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/arch_init.c b/arch_init.c index 4015bfd8c5..86f85443d7 100644 --- a/arch_init.c +++ b/arch_init.c @@ -422,9 +422,8 @@ static void migration_bitmap_sync(void) /* * ram_save_block: Writes a page of memory to the stream f * - * Returns: 0: if the page hasn't changed - * -1: if there are no more dirty pages - * n: the amount of bytes written in other case + * Returns: The number of bytes written. + * 0 means no dirty pages */ static int ram_save_block(QEMUFile *f, bool last_stage) @@ -432,7 +431,7 @@ static int ram_save_block(QEMUFile *f, bool last_stage) RAMBlock *block = last_seen_block; ram_addr_t offset = last_offset; bool complete_round = false; - int bytes_sent = -1; + int bytes_sent = 0; MemoryRegion *mr; ram_addr_t current_addr; @@ -460,6 +459,8 @@ static int ram_save_block(QEMUFile *f, bool last_stage) p = memory_region_get_ram_ptr(mr) + offset; + /* In doubt sent page as normal */ + bytes_sent = -1; if (is_dup_page(p)) { acct_info.dup_pages++; bytes_sent = save_block_hdr(f, block, offset, cont, @@ -475,7 +476,7 @@ static int ram_save_block(QEMUFile *f, bool last_stage) } } - /* either we didn't send yet (we may have had XBZRLE overflow) */ + /* XBZRLE overflow or normal page */ if (bytes_sent == -1) { bytes_sent = save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_PAGE); qemu_put_buffer(f, p, TARGET_PAGE_SIZE); @@ -484,7 +485,7 @@ static int ram_save_block(QEMUFile *f, bool last_stage) } /* if page is unmodified, continue to the next */ - if (bytes_sent != 0) { + if (bytes_sent > 0) { last_sent_block = block; break; } @@ -605,6 +606,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) int ret; int i; int64_t t0; + int total_sent = 0; qemu_mutex_lock_ramlist(); @@ -619,10 +621,10 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) bytes_sent = ram_save_block(f, false); /* no more blocks to sent */ - if (bytes_sent < 0) { + if (bytes_sent == 0) { break; } - bytes_transferred += bytes_sent; + total_sent += bytes_sent; acct_info.iterations++; /* we want to check in the 1st loop, just in case it was the 1st time and we had to sync the dirty bitmap. @@ -641,13 +643,16 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) } if (ret < 0) { + bytes_transferred += total_sent; return ret; } qemu_mutex_unlock_ramlist(); qemu_put_be64(f, RAM_SAVE_FLAG_EOS); + total_sent += 8; + bytes_transferred += total_sent; - return i; + return total_sent; } static int ram_save_complete(QEMUFile *f, void *opaque) @@ -664,7 +669,7 @@ static int ram_save_complete(QEMUFile *f, void *opaque) bytes_sent = ram_save_block(f, true); /* no more blocks to sent */ - if (bytes_sent < 0) { + if (bytes_sent == 0) { break; } bytes_transferred += bytes_sent; From e659586e63793a8a61efc4a658e2908ac8a2e935 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Thu, 8 Nov 2012 00:42:50 +0100 Subject: [PATCH 293/300] migration: fix qemu_get_fd for BufferedFile Not really used, but nice to have it correct. :) Signed-off-by: Paolo Bonzini Signed-off-by: Juan Quintela --- migration.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migration.c b/migration.c index 596aca7276..3fcc1c8616 100644 --- a/migration.c +++ b/migration.c @@ -625,7 +625,7 @@ static int buffered_get_fd(void *opaque) { QEMUFileBuffered *s = opaque; - return qemu_get_fd(s->file); + return s->migration_state->fd; } /* From 9848a40427cd76628d04d918fa4751c542527915 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 19 Dec 2012 09:55:50 +0100 Subject: [PATCH 294/300] migration: merge QEMUFileBuffered into MigrationState Avoid splitting the state of outgoing migration, more or less arbitrarily, between two data structures. QEMUFileBuffered anyway is used only during migration. Signed-off-by: Paolo Bonzini Signed-off-by: Juan Quintela --- include/migration/migration.h | 8 +++++ migration.c | 61 ++++++++++++++--------------------- 2 files changed, 32 insertions(+), 37 deletions(-) diff --git a/include/migration/migration.h b/include/migration/migration.h index 0c9bf8b482..2d5b630cce 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -16,6 +16,7 @@ #include "qapi/qmp/qdict.h" #include "qemu-common.h" +#include "qemu/thread.h" #include "qemu/notify.h" #include "qapi/error.h" #include "migration/vmstate.h" @@ -31,6 +32,13 @@ typedef struct MigrationState MigrationState; struct MigrationState { int64_t bandwidth_limit; + size_t bytes_xfer; + size_t xfer_limit; + uint8_t *buffer; + size_t buffer_size; + size_t buffer_capacity; + QemuThread thread; + QEMUFile *file; int fd; int state; diff --git a/migration.c b/migration.c index 3fcc1c8616..c69e864fcd 100644 --- a/migration.c +++ b/migration.c @@ -521,18 +521,8 @@ int64_t migrate_xbzrle_cache_size(void) /* migration thread support */ -typedef struct QEMUFileBuffered { - MigrationState *migration_state; - QEMUFile *file; - size_t bytes_xfer; - size_t xfer_limit; - uint8_t *buffer; - size_t buffer_size; - size_t buffer_capacity; - QemuThread thread; -} QEMUFileBuffered; -static ssize_t buffered_flush(QEMUFileBuffered *s) +static ssize_t buffered_flush(MigrationState *s) { size_t offset = 0; ssize_t ret = 0; @@ -541,8 +531,7 @@ static ssize_t buffered_flush(QEMUFileBuffered *s) while (s->bytes_xfer < s->xfer_limit && offset < s->buffer_size) { size_t to_send = MIN(s->buffer_size - offset, s->xfer_limit - s->bytes_xfer); - ret = migrate_fd_put_buffer(s->migration_state, s->buffer + offset, - to_send); + ret = migrate_fd_put_buffer(s, s->buffer + offset, to_send); if (ret <= 0) { DPRINTF("error flushing data, %zd\n", ret); break; @@ -566,7 +555,7 @@ static ssize_t buffered_flush(QEMUFileBuffered *s) static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size) { - QEMUFileBuffered *s = opaque; + MigrationState *s = opaque; ssize_t error; DPRINTF("putting %d bytes at %" PRId64 "\n", size, pos); @@ -598,7 +587,7 @@ static int buffered_put_buffer(void *opaque, const uint8_t *buf, static int buffered_close(void *opaque) { - QEMUFileBuffered *s = opaque; + MigrationState *s = opaque; ssize_t ret = 0; int ret2; @@ -612,20 +601,20 @@ static int buffered_close(void *opaque) } } - ret2 = migrate_fd_close(s->migration_state); + ret2 = migrate_fd_close(s); if (ret >= 0) { ret = ret2; } - ret = migrate_fd_close(s->migration_state); - s->migration_state->complete = true; + ret = migrate_fd_close(s); + s->complete = true; return ret; } static int buffered_get_fd(void *opaque) { - QEMUFileBuffered *s = opaque; + MigrationState *s = opaque; - return s->migration_state->fd; + return s->fd; } /* @@ -636,7 +625,7 @@ static int buffered_get_fd(void *opaque) */ static int buffered_rate_limit(void *opaque) { - QEMUFileBuffered *s = opaque; + MigrationState *s = opaque; int ret; ret = qemu_file_get_error(s->file); @@ -653,7 +642,7 @@ static int buffered_rate_limit(void *opaque) static int64_t buffered_set_rate_limit(void *opaque, int64_t new_rate) { - QEMUFileBuffered *s = opaque; + MigrationState *s = opaque; if (qemu_file_get_error(s->file)) { goto out; } @@ -669,7 +658,7 @@ out: static int64_t buffered_get_rate_limit(void *opaque) { - QEMUFileBuffered *s = opaque; + MigrationState *s = opaque; return s->xfer_limit; } @@ -741,7 +730,7 @@ static bool migrate_fd_put_ready(MigrationState *s, uint64_t max_size) static void *buffered_file_thread(void *opaque) { - QEMUFileBuffered *s = opaque; + MigrationState *s = opaque; int64_t initial_time = qemu_get_clock_ms(rt_clock); int64_t max_size = 0; bool last_round = false; @@ -749,7 +738,7 @@ static void *buffered_file_thread(void *opaque) while (true) { int64_t current_time = qemu_get_clock_ms(rt_clock); - if (s->migration_state->complete) { + if (s->complete) { break; } if (current_time >= initial_time + BUFFER_DELAY) { @@ -776,12 +765,11 @@ static void *buffered_file_thread(void *opaque) DPRINTF("file is ready\n"); if (s->bytes_xfer < s->xfer_limit) { DPRINTF("notifying client\n"); - last_round = migrate_fd_put_ready(s->migration_state, max_size); + last_round = migrate_fd_put_ready(s, max_size); } } g_free(s->buffer); - g_free(s); return NULL; } @@ -794,22 +782,21 @@ static const QEMUFileOps buffered_file_ops = { .set_rate_limit = buffered_set_rate_limit, }; -void migrate_fd_connect(MigrationState *migration_state) +void migrate_fd_connect(MigrationState *s) { - QEMUFileBuffered *s; + s->state = MIG_STATE_ACTIVE; + s->bytes_xfer = 0; + s->buffer = NULL; + s->buffer_size = 0; + s->buffer_capacity = 0; - migration_state->state = MIG_STATE_ACTIVE; - migration_state->first_time = true; - s = g_malloc0(sizeof(*s)); + s->first_time = true; - s->migration_state = migration_state; - s->xfer_limit = s->migration_state->bandwidth_limit / XFER_LIMIT_RATIO; - s->migration_state->complete = false; + s->xfer_limit = s->bandwidth_limit / XFER_LIMIT_RATIO; + s->complete = false; s->file = qemu_fopen_ops(s, &buffered_file_ops); - migration_state->file = s->file; - qemu_thread_create(&s->thread, buffered_file_thread, s, QEMU_THREAD_DETACHED); notifier_list_notify(&migration_state_notifiers, s); From ca273d58d8a77d5cc9d42440bcdf9d7cad2054bc Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Thu, 20 Dec 2012 12:29:19 +0100 Subject: [PATCH 295/300] build: fix includes for VNC vnc-tls.h is included by vnc.h, and it includes gnutls/gnutls.h. Hence, GnuTLS header files are needed by all files that include vnc.h, most notably qmp.c. Move these flags to QEMU_CFLAGS for simplicity. Reported-by: Peter Maydell Signed-off-by: Paolo Bonzini Signed-off-by: Blue Swirl --- Makefile.target | 5 ----- configure | 7 +++---- ui/Makefile.objs | 1 - 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/Makefile.target b/Makefile.target index 8bbad380c2..be8b8b86a5 100644 --- a/Makefile.target +++ b/Makefile.target @@ -120,11 +120,6 @@ obj-$(CONFIG_NO_GET_MEMORY_MAPPING) += memory_mapping-stub.o obj-$(CONFIG_NO_CORE_DUMP) += dump-stub.o LIBS+=-lz -QEMU_CFLAGS += $(VNC_TLS_CFLAGS) -QEMU_CFLAGS += $(VNC_SASL_CFLAGS) -QEMU_CFLAGS += $(VNC_JPEG_CFLAGS) -QEMU_CFLAGS += $(VNC_PNG_CFLAGS) - # xen support obj-$(CONFIG_XEN) += xen-all.o xen-mapcache.o obj-$(CONFIG_NO_XEN) += xen-stub.o diff --git a/configure b/configure index b101d5c1b7..14f05c7b90 100755 --- a/configure +++ b/configure @@ -1712,6 +1712,7 @@ EOF if compile_prog "$vnc_tls_cflags" "$vnc_tls_libs" ; then vnc_tls=yes libs_softmmu="$vnc_tls_libs $libs_softmmu" + QEMU_CFLAGS="$QEMU_CFLAGS $vnc_tls_cflags" else if test "$vnc_tls" = "yes" ; then feature_not_found "vnc-tls" @@ -1734,6 +1735,7 @@ EOF if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then vnc_sasl=yes libs_softmmu="$vnc_sasl_libs $libs_softmmu" + QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags" else if test "$vnc_sasl" = "yes" ; then feature_not_found "vnc-sasl" @@ -1755,6 +1757,7 @@ EOF if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then vnc_jpeg=yes libs_softmmu="$vnc_jpeg_libs $libs_softmmu" + QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags" else if test "$vnc_jpeg" = "yes" ; then feature_not_found "vnc-jpeg" @@ -3377,19 +3380,15 @@ if test "$vnc" = "yes" ; then fi if test "$vnc_tls" = "yes" ; then echo "CONFIG_VNC_TLS=y" >> $config_host_mak - echo "VNC_TLS_CFLAGS=$vnc_tls_cflags" >> $config_host_mak fi if test "$vnc_sasl" = "yes" ; then echo "CONFIG_VNC_SASL=y" >> $config_host_mak - echo "VNC_SASL_CFLAGS=$vnc_sasl_cflags" >> $config_host_mak fi if test "$vnc_jpeg" = "yes" ; then echo "CONFIG_VNC_JPEG=y" >> $config_host_mak - echo "VNC_JPEG_CFLAGS=$vnc_jpeg_cflags" >> $config_host_mak fi if test "$vnc_png" = "yes" ; then echo "CONFIG_VNC_PNG=y" >> $config_host_mak - echo "VNC_PNG_CFLAGS=$vnc_png_cflags" >> $config_host_mak fi if test "$fnmatch" = "yes" ; then echo "CONFIG_FNMATCH=y" >> $config_host_mak diff --git a/ui/Makefile.objs b/ui/Makefile.objs index dc8f0e46ad..6768bb7f7e 100644 --- a/ui/Makefile.objs +++ b/ui/Makefile.objs @@ -14,6 +14,5 @@ common-obj-$(CONFIG_CURSES) += curses.o common-obj-$(CONFIG_VNC) += $(vnc-obj-y) $(obj)/sdl.o $(obj)/sdl_zoom.o: QEMU_CFLAGS += $(SDL_CFLAGS) -$(obj)/vnc.o: QEMU_CFLAGS += $(VNC_TLS_CFLAGS) $(obj)/cocoa.o: $(SRC_PATH)/$(obj)/cocoa.m From 4ad549e89e55fb48eb6feb783ee4a9ede1dea52e Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Thu, 20 Dec 2012 12:29:20 +0100 Subject: [PATCH 296/300] xen: add missing include MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit xen-all needs to access CharDeviceState's filename field, so it needs to include char/char.h. Signed-off-by: Paolo Bonzini Tested-by: Andreas Färber Signed-off-by: Blue Swirl --- xen-all.c | 1 + 1 file changed, 1 insertion(+) diff --git a/xen-all.c b/xen-all.c index 50edaecbf1..19bcfd1510 100644 --- a/xen-all.c +++ b/xen-all.c @@ -16,6 +16,7 @@ #include "hw/xen_backend.h" #include "qmp-commands.h" +#include "char/char.h" #include "qemu/range.h" #include "sysemu/xen-mapcache.h" #include "trace.h" From b2136140f68ce05122f611eb9cde4f0365ab6a00 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Thu, 20 Dec 2012 23:09:53 +0100 Subject: [PATCH 297/300] net: Add missing include statement (fix compiler warnings for MinGW) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These and some more compiler warnings were caused by a recent commit: net/tap-win32.c:724: warning: no previous prototype for ‘tap_has_ufo’ net/tap-win32.c:729: warning: no previous prototype for ‘tap_has_vnet_hdr’ ... Signed-off-by: Stefan Weil Signed-off-by: Blue Swirl --- net/tap-win32.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/tap-win32.c b/net/tap-win32.c index 0c63cbd203..265369c3c5 100644 --- a/net/tap-win32.c +++ b/net/tap-win32.c @@ -31,6 +31,7 @@ #include "qemu-common.h" #include "clients.h" /* net_init_tap */ #include "net/net.h" +#include "net/tap.h" /* tap_has_ufo, ... */ #include "sysemu/sysemu.h" #include "qemu/error-report.h" #include From 0c884d1659f02b4a0c704c2344f42e3fabb1f193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=B3=E9=9F=8B=E4=BB=BB=20=28Wei-Ren=20Chen=29?= Date: Thu, 20 Dec 2012 09:39:16 +0800 Subject: [PATCH 298/300] translate-all.c: Use tb1->phys_hash_next directly in tb_remove When tb_remove was first commited at fd6ce8f6, there were three different calls pass different names to offsetof. In current codebase, the other two calls are replaced with tb_page_remove. There is no need to have a general tb_remove. Omit passing the third parameter and using tb1->phys_hash_next directly. Signed-off-by: Chen Wei-Ren Signed-off-by: Blue Swirl --- translate-all.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/translate-all.c b/translate-all.c index b621748ec0..d367fc4d11 100644 --- a/translate-all.c +++ b/translate-all.c @@ -759,19 +759,17 @@ static void tb_page_check(void) #endif -/* invalidate one TB */ -static inline void tb_remove(TranslationBlock **ptb, TranslationBlock *tb, - int next_offset) +static inline void tb_hash_remove(TranslationBlock **ptb, TranslationBlock *tb) { TranslationBlock *tb1; for (;;) { tb1 = *ptb; if (tb1 == tb) { - *ptb = *(TranslationBlock **)((char *)tb1 + next_offset); + *ptb = tb1->phys_hash_next; break; } - ptb = (TranslationBlock **)((char *)tb1 + next_offset); + ptb = &tb1->phys_hash_next; } } @@ -828,6 +826,7 @@ static inline void tb_reset_jump(TranslationBlock *tb, int n) tb_set_jmp_target(tb, n, (uintptr_t)(tb->tc_ptr + tb->tb_next_offset[n])); } +/* invalidate one TB */ void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr) { CPUArchState *env; @@ -839,8 +838,7 @@ void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr) /* remove the TB from the hash list */ phys_pc = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK); h = tb_phys_hash_func(phys_pc); - tb_remove(&tb_phys_hash[h], tb, - offsetof(TranslationBlock, phys_hash_next)); + tb_hash_remove(&tb_phys_hash[h], tb); /* remove the TB from the page list */ if (tb->page_addr[0] != page_addr) { From 3f124b687462ce3140d963a024705a89cdc8cee8 Mon Sep 17 00:00:00 2001 From: Liming Wang Date: Fri, 21 Dec 2012 16:56:58 +0800 Subject: [PATCH 299/300] net: add missing include file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To fix building error: CC net/vde.o net/vde.c: In function ‘vde_cleanup’: net/vde.c:65:5: error: implicit declaration of function ‘qemu_set_fd_handler’ [-Werror=implicit-function-declaration] net/vde.c:65:5: error: nested extern declaration of ‘qemu_set_fd_handler’ [-Werror=nested-externs] cc1: all warnings being treated as errors Signed-off-by: Liming Wang Signed-off-by: Blue Swirl --- net/vde.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/vde.c b/net/vde.c index 754a141543..4dea32d07a 100644 --- a/net/vde.c +++ b/net/vde.c @@ -29,6 +29,7 @@ #include "clients.h" #include "qemu-common.h" #include "qemu/option.h" +#include "qemu/main-loop.h" typedef struct VDEState { NetClientState nc; From 36f25d2537c40c6c47f4abee5d31a24863d1adf7 Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Thu, 20 Dec 2012 00:04:09 +0400 Subject: [PATCH 300/300] target-xtensa: fix search_pc for the last TB opcode Zero out tcg_ctx.gen_opc_instr_start for instructions representing the last guest opcode in the TB. Cc: qemu-stable@nongnu.org Signed-off-by: Max Filippov Signed-off-by: Blue Swirl --- target-xtensa/translate.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index 0a037291ef..7029ac4814 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -3005,7 +3005,11 @@ static void gen_intermediate_code_internal( gen_icount_end(tb, insn_count); *tcg_ctx.gen_opc_ptr = INDEX_op_end; - if (!search_pc) { + if (search_pc) { + j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf; + memset(tcg_ctx.gen_opc_instr_start + lj + 1, 0, + (j - lj) * sizeof(tcg_ctx.gen_opc_instr_start[0])); + } else { tb->size = dc.pc - pc_start; tb->icount = insn_count; }