From: Leon Alrae <leon.alrae@imgtec.com>
To: Yongbok Kim <yongbok.kim@imgtec.com>, qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, crosthwaitepeter@gmail.com,
james.hogan@imgtec.com, aurelien@aurel32.net,
pbonzini@redhat.com
Subject: Re: [Qemu-devel] [PATCH for-2.5 v2 3/4] mips: add Global Interrupt Controller
Date: Thu, 29 Oct 2015 16:10:11 +0000 [thread overview]
Message-ID: <563244E3.20802@imgtec.com> (raw)
In-Reply-To: <1445965957-37888-4-git-send-email-yongbok.kim@imgtec.com>
On 27/10/15 17:12, Yongbok Kim wrote:
> +static uint64_t gic_read(void *opaque, hwaddr addr, unsigned size)
> +{
> + MIPSGICState *gic = (MIPSGICState *) opaque;
> + uint32_t vp_index = gic_get_current_vp(gic);
> + uint64_t ret = 0;
> + int i, base, irq_src;
> + uint32_t other_index;
> +
> + switch (addr) {
> + case GIC_SH_CONFIG_OFS:
> + ret = gic->sh_config;
> + break;
> + case GIC_SH_COUNTERLO_OFS:
> + ret = gic_get_sh_count(gic);
> + break;
> + case GIC_SH_COUNTERHI_OFS:
> + ret = 0;
> + break;
> + case GIC_SH_PEND_31_0_OFS ... GIC_SH_PEND_255_224_OFS:
> + base = (addr - GIC_SH_PEND_31_0_OFS) * 8;
> + for (i = 0; i < size * 8; i++) {
> + ret |= (gic->irq_state[base + i].pending & 1) << i;
The "pending" field is bool and "i" can be up to 63, which means this
may try to do the left-shifting above the width.
> + }
> + break;
> + case GIC_SH_MASK_31_0_OFS ... GIC_SH_MASK_255_224_OFS:
> + base = (addr - GIC_SH_MASK_31_0_OFS) * 8;
> + for (i = 0; i < size * 8; i++) {
> + ret |= (gic->irq_state[base + i].enabled & 1) << i;
same
> + }
> + break;
> + case GIC_SH_MAP0_PIN_OFS ... GIC_SH_MAP255_PIN_OFS:
> + irq_src = (addr - GIC_SH_MAP0_PIN_OFS) / 4;
> + ret = gic->irq_state[irq_src].map_pin;
> + break;
> + case GIC_SH_MAP0_VP31_0_OFS ... GIC_SH_MAP255_VP63_32_OFS:
> + irq_src = (addr - GIC_SH_MAP0_VP31_0_OFS) / 32;
> + if ((gic->irq_state[irq_src].map_vp) >= 0) {
> + ret = 1 << (gic->irq_state[irq_src].map_vp);
> + } else {
> + ret = 0;
> + }
> + break;
> + /* VP-Local Register */
> + case GIC_VPLOCAL_BASE_ADDR ... (GIC_VPLOCAL_BASE_ADDR + GIC_VL_BRK_GROUP):
> + ret = gic_read_vp(gic, vp_index, addr - GIC_VPLOCAL_BASE_ADDR, size);
> + break;
> + /* VP-Other Register */
> + case GIC_VPOTHER_BASE_ADDR ... (GIC_VPOTHER_BASE_ADDR + GIC_VL_BRK_GROUP):
> + other_index = gic->vps[vp_index].other_addr;
> + ret = gic_read_vp(gic, other_index, addr - GIC_VPOTHER_BASE_ADDR,
> + size);
> + break;
> + /* User-Mode Visible section */
> + case GIC_USERMODE_BASE_ADDR + GIC_USER_MODE_COUNTERLO:
> + ret = gic_get_sh_count(gic);
> + break;
> + default:
> + qemu_log_mask(LOG_UNIMP, "Read %d bytes at GIC offset 0x%" PRIx64 "\n",
> + size, addr);
> + break;
> + }
> + return ret;
> +}
> +
> +/* GIC Write VP Local/Other Registers */
> +static void gic_write_vp(MIPSGICState *gic, uint32_t vp_index, hwaddr addr,
> + uint64_t data, unsigned size)
> +{
> + switch (addr) {
> + case GIC_VP_CTL_OFS:
> + gic->vps[vp_index].ctl &= ~GIC_VP_CTL_EIC_MODE_MSK;
> + gic->vps[vp_index].ctl |= data & GIC_VP_CTL_EIC_MODE_MSK;
> + break;
> + case GIC_VP_RMASK_OFS:
> + gic->vps[vp_index].mask &= ~(data & GIC_VP_SET_RESET_MSK) &
> + GIC_VP_SET_RESET_MSK;
> + break;
> + case GIC_VP_SMASK_OFS:
> + gic->vps[vp_index].mask |= (data & GIC_VP_SET_RESET_MSK);
> + break;
> + case GIC_VP_COMPARE_MAP_OFS:
> + gic->vps[vp_index].compare_map = data & GIC_MAP_TO_PIN_REG_MSK;
> + break;
> + case GIC_VP_OTHER_ADDR_OFS:
> + if (data < gic->num_vps) {
> + gic->vps[vp_index].other_addr = data;
> + }
> + break;
> + case GIC_VP_COMPARE_LO_OFS:
> + gic_store_vp_compare(gic, vp_index, data);
> + break;
> + default:
> + qemu_log_mask(LOG_UNIMP, "Write %d bytes at GIC offset LOCAL/OTHER "
> + "0x%" PRIx64" 0x%08lx\n", size, addr, data);
The "%lx" format for data needs to be corrected as this generates
warnings on my mingw32 (I noticed the same in gcr):
hw/intc/mips_gic.c:333:23: warning: format ‘%lx’ expects argument of
type ‘long unsigned int’, but argument 5 has type ‘uint64_t’ [-Wformat]
> + break;
> + }
> +}
> +
> +static void gic_reset(void *opaque)
> +{
> + int i;
> + MIPSGICState *gic = (MIPSGICState *) opaque;
> + int numintrs = (gic->num_irq / 8) - 1;
> +
> + numintrs = (numintrs < 0) ? 0 : numintrs;
If I understand correctly numintrs < 0 indicates that the "num-irq"
property has been set to an incorrect value. I believe this should do
the same thing as when it exceeds the max value, i.e. die early and loudly.
Thanks,
Leon
next prev parent reply other threads:[~2015-10-29 16:10 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-27 17:12 [Qemu-devel] [PATCH for-2.5 v2 0/4] mips: add Global Interrupt Controller Yongbok Kim
2015-10-27 17:12 ` [Qemu-devel] [PATCH for-2.5 v2 1/4] target-mips: add CMGCRBase register Yongbok Kim
2015-10-30 0:02 ` James Hogan
2015-10-27 17:12 ` [Qemu-devel] [PATCH for-2.5 v2 2/4] mips: add Global Config Register block (part) Yongbok Kim
2015-10-30 0:36 ` James Hogan
2015-10-30 11:40 ` James Hogan
2015-10-30 12:06 ` Peter Maydell
2016-03-15 10:17 ` Leon Alrae
2015-10-27 17:12 ` [Qemu-devel] [PATCH for-2.5 v2 3/4] mips: add Global Interrupt Controller Yongbok Kim
2015-10-29 16:10 ` Leon Alrae [this message]
2015-10-30 16:43 ` James Hogan
2015-10-27 17:12 ` [Qemu-devel] [PATCH for-2.5 v2 4/4] mips: add gic support to malta Yongbok Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=563244E3.20802@imgtec.com \
--to=leon.alrae@imgtec.com \
--cc=aurelien@aurel32.net \
--cc=crosthwaitepeter@gmail.com \
--cc=james.hogan@imgtec.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=yongbok.kim@imgtec.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.