mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
target/sparc: Loosen decode of STBAR for v8
Solaris 8 appears to have a bug whereby it executes v9 MEMBAR
instructions when booting a freshly installed image. According
to the SPARC v8 architecture manual, whilst bits 13 and bits 12-0
of the "Read State Register Instructions" are notionally zero,
they are marked as unused (i.e. ignored).
Fixes: af25071c1d ("target/sparc: Move RDASR, STBAR, MEMBAR to decodetree")
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/3097
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
This commit is contained in:
@@ -88,7 +88,7 @@ CALL 01 i:s30
|
||||
|
||||
{
|
||||
[
|
||||
STBAR 10 00000 101000 01111 0 0000000000000
|
||||
STBAR_v9 10 00000 101000 01111 0 0000000000000
|
||||
MEMBAR 10 00000 101000 01111 1 000000 cmask:3 mmask:4
|
||||
|
||||
RDCCR 10 rd:5 101000 00010 0 0000000000000
|
||||
@@ -107,6 +107,17 @@ CALL 01 i:s30
|
||||
RDSTICK_CMPR 10 rd:5 101000 11001 0 0000000000000
|
||||
RDSTRAND_STATUS 10 rd:5 101000 11010 0 0000000000000
|
||||
]
|
||||
|
||||
# The v8 manual, section B.30 STBAR instruction, says
|
||||
# bits [12:0] are ignored, but bit 13 must be 0.
|
||||
# However, section B.28 Read State Register Instruction has a
|
||||
# comment that RDASR with rs1 = 15, rd = 0 is STBAR. Here,
|
||||
# bit 13 is also ignored and rd != 0 is merely reserved.
|
||||
#
|
||||
# Solaris 8 executes v9 MEMBAR instruction 0x8143e008 during boot.
|
||||
# This confirms that bit 13 is ignored, as 0x8143c000 is STBAR.
|
||||
STBAR_v8 10 ----- 101000 01111 - -------------
|
||||
|
||||
# Before v8, all rs1 accepted; otherwise rs1==0.
|
||||
RDY 10 rd:5 101000 rs1:5 0 0000000000000
|
||||
}
|
||||
|
||||
@@ -2823,12 +2823,15 @@ static bool trans_Tcc_i_v9(DisasContext *dc, arg_Tcc_i_v9 *a)
|
||||
return do_tcc(dc, a->cond, a->cc, a->rs1, true, a->i);
|
||||
}
|
||||
|
||||
static bool trans_STBAR(DisasContext *dc, arg_STBAR *a)
|
||||
static bool do_stbar(DisasContext *dc)
|
||||
{
|
||||
tcg_gen_mb(TCG_MO_ST_ST | TCG_BAR_SC);
|
||||
return advance_pc(dc);
|
||||
}
|
||||
|
||||
TRANS(STBAR_v8, 32, do_stbar)
|
||||
TRANS(STBAR_v9, 64, do_stbar)
|
||||
|
||||
static bool trans_MEMBAR(DisasContext *dc, arg_MEMBAR *a)
|
||||
{
|
||||
if (avail_32(dc)) {
|
||||
|
||||
Reference in New Issue
Block a user