qemu-e2k/hw/misc
Hugo Landau 5c1d3a2b6e Fix ast2500 protection register emulation
Some register blocks of the ast2500 are protected by protection key
registers which require the right magic value to be written to those
registers to allow those registers to be mutated.

Register manuals indicate that writing the correct magic value to these
registers should cause subsequent reads from those values to return 1,
and writing any other value should cause subsequent reads to return 0.

Previously, qemu implemented these registers incorrectly: the registers
were handled as simple memory, meaning that writing some value x to a
protection key register would result in subsequent reads from that
register returning the same value x. The protection was implemented by
ensuring that the current value of that register equaled the magic
value.

This modifies qemu to have the correct behaviour: attempts to write to a
ast2500 protection register results in a transition to 1 or 0 depending
on whether the written value is the correct magic. The protection logic
is updated to ensure that the value of the register is nonzero.

This bug caused deadlocks with u-boot HEAD: when u-boot is done with a
protectable register block, it attempts to lock it by writing the
bitwise inverse of the correct magic value, and then spinning forever
until the register reads as zero. Since qemu implemented writes to these
registers as ordinary memory writes, writing the inverse of the magic
value resulted in subsequent reads returning that value, leading to
u-boot spinning forever.

Signed-off-by: Hugo Landau <hlandau@devever.net>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Acked-by: Andrew Jeffery <andrew@aj.id.au>
Message-id: 20180220132627.4163-1-hlandau@devever.net
[PMM: fixed incorrect code indentation]
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2018-02-22 15:12:51 +00:00
..
macio cuda: convert to trace-events 2018-02-16 12:14:26 +11:00
a9scu.c
applesmc.c
arm11scu.c
arm_integrator_debug.c
arm_l2x0.c
arm_sysctl.c
aspeed_scu.c Fix ast2500 protection register emulation 2018-02-22 15:12:51 +00:00
aspeed_sdmc.c Fix ast2500 protection register emulation 2018-02-22 15:12:51 +00:00
auxbus.c
bcm2835_mbox.c
bcm2835_property.c
bcm2835_rng.c
cbus.c
debugexit.c
eccmemctl.c
edu.c
exynos4210_clk.c
exynos4210_pmu.c
exynos4210_rng.c Include qapi/error.h exactly where needed 2018-02-09 13:50:17 +01:00
hyperv_testdev.c
imx2_wdt.c i.MX: Add code to emulate i.MX2 watchdog IP block 2018-02-09 10:40:29 +00:00
imx6_ccm.c
imx6_src.c
imx7_ccm.c i.MX: Add code to emulate i.MX7 CCM, PMU and ANALOG IP blocks 2018-02-09 10:40:29 +00:00
imx7_gpr.c i.MX: Add implementation of i.MX7 GPR IP block 2018-02-09 10:40:30 +00:00
imx7_snvs.c i.MX: Add code to emulate i.MX7 SNVS IP-block 2018-02-09 10:40:30 +00:00
imx25_ccm.c
imx31_ccm.c
imx_ccm.c
ivshmem.c ivshmem: Disable irqfd on device reset 2018-02-07 14:09:24 +01:00
Makefile.objs misc: introduce new mos6522 VIA device and enable it for ppc builds 2018-02-11 10:18:52 +11:00
max111x.c
milkymist-hpdmc.c
milkymist-pfpu.c
mips_cmgcr.c Include qapi/error.h exactly where needed 2018-02-09 13:50:17 +01:00
mips_cpc.c
mips_itu.c
mmio_interface.c
mos6522.c misc: introduce new mos6522 VIA device and enable it for ppc builds 2018-02-11 10:18:52 +11:00
mps2-scc.c Include qapi/error.h exactly where needed 2018-02-09 13:50:17 +01:00
msf2-sysreg.c
mst_fpga.c
omap_clk.c
omap_gpmc.c
omap_l4.c
omap_sdrc.c
omap_tap.c
pc-testdev.c
pci-testdev.c
puv3_pm.c
pvpanic.c
sga.c
slavio_misc.c
stm32f2xx_syscfg.c
tmp105.c
tmp105.h
tmp421.c
trace-events misc: introduce new mos6522 VIA device and enable it for ppc builds 2018-02-11 10:18:52 +11:00
unimp.c
vmcoreinfo.c
zynq_slcr.c
zynq-xadc.c