Skip to content

Commit

Permalink
armv8-r/gicv3: disable 64bits access gic 64bits registers
Browse files Browse the repository at this point in the history
When neon is enabled, compiler may optimize 64bits access to vstr, that
will cause data aborts.
Split 64bits access to double 32bits access for GIC_IROUTER/GICR_TYPER,
just like linux.

Signed-off-by: Jinliang Li <lijinliang1@lixiang.com>
Signed-off-by: chao an <anchao@lixiang.com>
  • Loading branch information
jinliangli authored and anchao committed Oct 12, 2024
1 parent 056aa3c commit 961f740
Showing 1 changed file with 14 additions and 2 deletions.
16 changes: 14 additions & 2 deletions arch/arm/src/armv8-r/arm_gicv3.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,13 @@ static inline void arm_gic_write_irouter(uint64_t val, unsigned int intid)
{
unsigned long addr = IROUTER(GET_DIST_BASE(intid), intid);

putreg64(val, addr);
/* Use two putreg32 instead of one putreg64, because when the neon option
* is enabled, the compiler may optimize putreg64 to the neon vstr
* instruction, which will cause a data abort.
*/

putreg32((uint32_t)val, addr);
putreg32((uint32_t)(val >> 32) , addr + 4);
}

void arm_gic_irq_set_priority(unsigned int intid, unsigned int prio,
Expand Down Expand Up @@ -773,7 +779,13 @@ static int gic_validate_redist_version(void)
return -ENODEV;
}

typer = getreg64(redist_base + GICR_TYPER);
/* In AArch32, use 32bits accesses GICR_TYPER, in case that nuttx
* run as vm, and hypervisor doesn't emulation strd.
* Just like linux and zephyr.
*/

typer = getreg32(redist_base + GICR_TYPER);
typer |= (uint64_t)getreg32(redist_base + GICR_TYPER + 4) << 32;
has_vlpis &= !!(typer & GICR_TYPER_VLPIS);
has_direct_lpi &= !!(typer & GICR_TYPER_DIRECTLPIS);
ppi_nr = MIN(GICR_TYPER_NR_PPIS(typer), ppi_nr);
Expand Down

0 comments on commit 961f740

Please sign in to comment.