From c27e27528f9811f47a36c83189dab558f6c54248 Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Sat, 22 Aug 2009 11:46:10 +0000 Subject: [PATCH 1/7] Sparc32/64: fix jmpl followed by branch Fix a case where 'jmpl' instruction followed by a branch instruction was handled incorrectly. Signed-off-by: Blue Swirl --- target-sparc/translate.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/target-sparc/translate.c b/target-sparc/translate.c index 9bbfd3cd23..61578ecc3c 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -1134,6 +1134,7 @@ static void do_branch(DisasContext *dc, int32_t offset, uint32_t insn, int cc, } else { dc->pc = dc->npc; dc->npc = target; + tcg_gen_mov_tl(cpu_pc, cpu_npc); } } else { flush_cond(dc, r_cond); @@ -1174,6 +1175,7 @@ static void do_fbranch(DisasContext *dc, int32_t offset, uint32_t insn, int cc, } else { dc->pc = dc->npc; dc->npc = target; + tcg_gen_mov_tl(cpu_pc, cpu_npc); } } else { flush_cond(dc, r_cond); From 4c6aa085a8371a24603a919fe4264fd92dbccf02 Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Sat, 22 Aug 2009 11:54:03 +0000 Subject: [PATCH 2/7] sparc32 remove an unnecessary cpu irq set Signed-off-by: Artyom Tarasenko Signed-off-by: Blue Swirl --- cpu-exec.c | 3 --- target-sparc/cpu.h | 65 +++++++++++++++++++++------------------------- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/cpu-exec.c b/cpu-exec.c index 1718dc4ebf..2b74aeecf7 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -485,9 +485,6 @@ int cpu_exec(CPUState *env1) env->exception_index = env->interrupt_index; do_interrupt(env); env->interrupt_index = 0; -#if !defined(CONFIG_USER_ONLY) - cpu_check_irqs(env); -#endif next_tb = 0; } } else if (interrupt_request & CPU_INTERRUPT_TIMER) { diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h index 2428bb2927..6654eca491 100644 --- a/target-sparc/cpu.h +++ b/target-sparc/cpu.h @@ -439,6 +439,22 @@ int cpu_sparc_exec(CPUSPARCState *s); #endif #ifndef NO_CPU_IO_DEFS + +static inline int cpu_cwp_inc(CPUSPARCState *env1, int cwp) +{ + if (unlikely(cwp >= env1->nwindows)) + cwp -= env1->nwindows; + return cwp; +} + +static inline int cpu_cwp_dec(CPUSPARCState *env1, int cwp) +{ + if (unlikely(cwp < 0)) + cwp += env1->nwindows; + return cwp; +} +#endif + static inline void memcpy32(target_ulong *dst, const target_ulong *src) { dst[0] = src[0]; @@ -463,43 +479,25 @@ static inline void cpu_set_cwp(CPUSPARCState *env1, int new_cwp) env1->regwptr = env1->regbase + (new_cwp * 16); } -static inline int cpu_cwp_inc(CPUSPARCState *env1, int cwp) -{ - if (unlikely(cwp >= env1->nwindows)) - cwp -= env1->nwindows; - return cwp; -} +/* sun4m.c, sun4u.c */ +void cpu_check_irqs(CPUSPARCState *env); -static inline int cpu_cwp_dec(CPUSPARCState *env1, int cwp) +static inline void PUT_PSR(CPUSPARCState *env1, target_ulong val) { - if (unlikely(cwp < 0)) - cwp += env1->nwindows; - return cwp; -} + env1->psr = val & PSR_ICC; + env1->psref = (val & PSR_EF)? 1 : 0; + env1->psrpil = (val & PSR_PIL) >> 8; +#if ((!defined (TARGET_SPARC64)) && !defined(CONFIG_USER_ONLY)) + cpu_check_irqs(env1); #endif - + env1->psrs = (val & PSR_S)? 1 : 0; + env1->psrps = (val & PSR_PS)? 1 : 0; #if !defined (TARGET_SPARC64) -#define PUT_PSR(env, val) do { int _tmp = val; \ - env->psr = _tmp & PSR_ICC; \ - env->psref = (_tmp & PSR_EF)? 1 : 0; \ - env->psrpil = (_tmp & PSR_PIL) >> 8; \ - env->psrs = (_tmp & PSR_S)? 1 : 0; \ - env->psrps = (_tmp & PSR_PS)? 1 : 0; \ - env->psret = (_tmp & PSR_ET)? 1 : 0; \ - cpu_set_cwp(env, _tmp & PSR_CWP); \ - CC_OP = CC_OP_FLAGS; \ - } while (0) -#else -#define PUT_PSR(env, val) do { int _tmp = val; \ - env->psr = _tmp & PSR_ICC; \ - env->psref = (_tmp & PSR_EF)? 1 : 0; \ - env->psrpil = (_tmp & PSR_PIL) >> 8; \ - env->psrs = (_tmp & PSR_S)? 1 : 0; \ - env->psrps = (_tmp & PSR_PS)? 1 : 0; \ - cpu_set_cwp(env, _tmp & PSR_CWP); \ - CC_OP = CC_OP_FLAGS; \ - } while (0) + env1->psret = (val & PSR_ET)? 1 : 0; #endif + cpu_set_cwp(env1, val & PSR_CWP); + env1->cc_op = CC_OP_FLAGS; +} #ifdef TARGET_SPARC64 #define GET_CCR(env) (((env->xcc >> 20) << 4) | ((env->psr & PSR_ICC) >> 20)) @@ -585,9 +583,6 @@ static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) #include "cpu-all.h" #include "exec-all.h" -/* sum4m.c, sun4u.c */ -void cpu_check_irqs(CPUSPARCState *env); - #ifdef TARGET_SPARC64 /* sun4u.c */ void cpu_tick_set_count(void *opaque, uint64_t count); From 5e1e0a3bb9ae875f32c1f605e50c4766b93e6032 Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Sat, 22 Aug 2009 13:54:31 +0000 Subject: [PATCH 3/7] ESP: Implement select without ATN, fix comments Signed-off-by: Blue Swirl --- hw/esp.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/hw/esp.c b/hw/esp.c index 146a73a0e1..6412744896 100644 --- a/hw/esp.c +++ b/hw/esp.c @@ -116,6 +116,7 @@ struct ESPState { #define CMD_ICCS 0x11 #define CMD_MSGACC 0x12 #define CMD_SATN 0x1a +#define CMD_SEL 0x41 #define CMD_SELATN 0x42 #define CMD_SELATNS 0x43 #define CMD_ENSEL 0x44 @@ -533,12 +534,16 @@ static void esp_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) case CMD_SATN: DPRINTF("Set ATN (%2.2x)\n", val); break; + case CMD_SEL: + DPRINTF("Select without ATN (%2.2x)\n", val); + handle_satn(s); + break; case CMD_SELATN: - DPRINTF("Set ATN (%2.2x)\n", val); + DPRINTF("Select with ATN (%2.2x)\n", val); handle_satn(s); break; case CMD_SELATNS: - DPRINTF("Set ATN & stop (%2.2x)\n", val); + DPRINTF("Select with ATN & stop (%2.2x)\n", val); handle_satn_stop(s); break; case CMD_ENSEL: From 0fd0eb2161b5559b41e419734f1141258289ef73 Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Sat, 22 Aug 2009 13:55:05 +0000 Subject: [PATCH 4/7] ESP: implement Transfer Pad Signed-off-by: Blue Swirl --- hw/esp.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hw/esp.c b/hw/esp.c index 6412744896..53310224ff 100644 --- a/hw/esp.c +++ b/hw/esp.c @@ -115,6 +115,7 @@ struct ESPState { #define CMD_TI 0x10 #define CMD_ICCS 0x11 #define CMD_MSGACC 0x12 +#define CMD_PAD 0x18 #define CMD_SATN 0x1a #define CMD_SEL 0x41 #define CMD_SELATN 0x42 @@ -531,6 +532,12 @@ static void esp_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) s->rregs[ESP_RINTR] = INTR_DC; s->rregs[ESP_RSEQ] = 0; break; + case CMD_PAD: + DPRINTF("Transfer padding (%2.2x)\n", val); + s->rregs[ESP_RSTAT] = STAT_TC; + s->rregs[ESP_RINTR] = INTR_FC; + s->rregs[ESP_RSEQ] = 0; + break; case CMD_SATN: DPRINTF("Set ATN (%2.2x)\n", val); break; From 9c9c310a5494848a11802dd6bd34ecf35046d771 Mon Sep 17 00:00:00 2001 From: Igor Kovalenko Date: Sun, 19 Jul 2009 23:46:09 +0400 Subject: [PATCH 5/7] def-helper.h allow helpers returning pointers This change allows to define helpers returning pointers. This looks like a typo in original commit. Signed-off-by: igor.v.kovalenko@gmail.com Signed-off-by: Blue Swirl --- def-helper.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/def-helper.h b/def-helper.h index d57ea4d5a7..8a88c5ba75 100644 --- a/def-helper.h +++ b/def-helper.h @@ -60,13 +60,13 @@ #define dh_retvar_decl0_void void #define dh_retvar_decl0_i32 TCGv_i32 retval #define dh_retvar_decl0_i64 TCGv_i64 retval -#define dh_retvar_decl0_ptr TCGv_iptr retval +#define dh_retvar_decl0_ptr TCGv_ptr retval #define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t)) #define dh_retvar_decl_void #define dh_retvar_decl_i32 TCGv_i32 retval, #define dh_retvar_decl_i64 TCGv_i64 retval, -#define dh_retvar_decl_ptr TCGv_iptr retval, +#define dh_retvar_decl_ptr TCGv_ptr retval, #define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t)) #define dh_retvar_void TCG_CALL_DUMMY_ARG From 7432ff5d6b70b58d6d3d9417cf87d2fe9ba2ce6c Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Sun, 23 Aug 2009 06:12:54 +0000 Subject: [PATCH 6/7] Rearrange to suppress gcc 3.3.5 warning about unused variable Signed-off-by: Blue Swirl --- hw/pci-hotplug.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c index 4da916cca1..1f92e09f87 100644 --- a/hw/pci-hotplug.c +++ b/hw/pci-hotplug.c @@ -125,9 +125,8 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, monitor_printf(mon, "Parameter addr not supported\n"); return NULL; } - } else if (type == IF_VIRTIO) { - monitor_printf(mon, "virtio requires a backing file/device.\n"); - return NULL; + } else { + dinfo = NULL; } switch (type) { @@ -135,6 +134,10 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, dev = pci_create("lsi53c895a", devaddr); break; case IF_VIRTIO: + if (!dinfo) { + monitor_printf(mon, "virtio requires a backing file/device.\n"); + return NULL; + } dev = pci_create("virtio-blk-pci", devaddr); qdev_prop_set_drive(&dev->qdev, "drive", dinfo); break; From d453c2c32ed2bf6cfccb6c2463416c4a613eb708 Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Sun, 23 Aug 2009 12:23:30 +0000 Subject: [PATCH 7/7] Sparc32: fix monitor commands 'info pic' and 'info irq' Signed-off-by: Blue Swirl --- hw/slavio_intctl.c | 14 ++++++++++---- hw/sun4m.c | 15 +++++++-------- hw/sun4m.h | 4 ++-- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/hw/slavio_intctl.c b/hw/slavio_intctl.c index dbea1f93a0..c9bad26073 100644 --- a/hw/slavio_intctl.c +++ b/hw/slavio_intctl.c @@ -220,11 +220,14 @@ static CPUWriteMemoryFunc *slavio_intctlm_mem_write[3] = { slavio_intctlm_mem_writel, }; -void slavio_pic_info(Monitor *mon, void *opaque) +void slavio_pic_info(Monitor *mon, DeviceState *dev) { - SLAVIO_INTCTLState *s = opaque; + SysBusDevice *sd; + SLAVIO_INTCTLState *s; int i; + sd = sysbus_from_qdev(dev); + s = FROM_SYSBUS(SLAVIO_INTCTLState, sd); for (i = 0; i < MAX_CPUS; i++) { monitor_printf(mon, "per-cpu %d: pending 0x%08x\n", i, s->slaves[i].intreg_pending); @@ -233,15 +236,18 @@ void slavio_pic_info(Monitor *mon, void *opaque) s->intregm_pending, s->intregm_disabled); } -void slavio_irq_info(Monitor *mon, void *opaque) +void slavio_irq_info(Monitor *mon, DeviceState *dev) { #ifndef DEBUG_IRQ_COUNT monitor_printf(mon, "irq statistic code not compiled.\n"); #else - SLAVIO_INTCTLState *s = opaque; + SysBusDevice *sd; + SLAVIO_INTCTLState *s; int i; int64_t count; + sd = sysbus_from_qdev(dev); + s = FROM_SYSBUS(SLAVIO_INTCTLState, sd); monitor_printf(mon, "IRQ statistics:\n"); for (i = 0; i < 32; i++) { count = s->irq_count[i]; diff --git a/hw/sun4m.c b/hw/sun4m.c index ddc295a9a8..88a0b2511d 100644 --- a/hw/sun4m.c +++ b/hw/sun4m.c @@ -209,7 +209,7 @@ static void nvram_init(m48t59_t *nvram, uint8_t *macaddr, const char *cmdline, m48t59_write(nvram, i, image[i]); } -static void *slavio_intctl; +static DeviceState *slavio_intctl; void pic_info(Monitor *mon) { @@ -748,7 +748,6 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, unsigned long kernel_size; BlockDriverState *fd[MAX_FD]; void *fw_cfg; - DeviceState *dev; DriveInfo *dinfo; /* init CPUs */ @@ -768,16 +767,16 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, prom_init(hwdef->slavio_base, bios_name); - dev = slavio_intctl_init(hwdef->intctl_base, - hwdef->intctl_base + 0x10000ULL, - cpu_irqs, - 7); + slavio_intctl = slavio_intctl_init(hwdef->intctl_base, + hwdef->intctl_base + 0x10000ULL, + cpu_irqs, + 7); for (i = 0; i < 32; i++) { - slavio_irq[i] = qdev_get_gpio_in(dev, i); + slavio_irq[i] = qdev_get_gpio_in(slavio_intctl, i); } for (i = 0; i < MAX_CPUS; i++) { - slavio_cpu_irq[i] = qdev_get_gpio_in(dev, 32 + i); + slavio_cpu_irq[i] = qdev_get_gpio_in(slavio_intctl, 32 + i); } if (hwdef->idreg_base) { diff --git a/hw/sun4m.h b/hw/sun4m.h index 9f540920ac..ce97ee5a79 100644 --- a/hw/sun4m.h +++ b/hw/sun4m.h @@ -23,8 +23,8 @@ static inline void sparc_iommu_memory_write(void *opaque, } /* slavio_intctl.c */ -void slavio_pic_info(Monitor *mon, void *opaque); -void slavio_irq_info(Monitor *mon, void *opaque); +void slavio_pic_info(Monitor *mon, DeviceState *dev); +void slavio_irq_info(Monitor *mon, DeviceState *dev); /* sun4c_intctl.c */ void sun4c_pic_info(Monitor *mon, void *opaque);