Skip to content

Commit 59afd43

Browse files
committed
target/xtensa: work around missing SR definitions
Xtensa configuration overlays for recent releases may have special registers for which [rwx]sr opcodes are defined, but they are not listed as SR in xtensa_sysreg_name and associated functions. As a result generic translate_[rwx]sr* functions generate access to uninitialized cpu_SR causing segfault at runtime. Don't try to access cpu_SR for such registers, ignore writes and return 0 for reads. Cc: [email protected] Signed-off-by: Max Filippov <[email protected]>
1 parent 648db19 commit 59afd43

File tree

1 file changed

+34
-14
lines changed

1 file changed

+34
-14
lines changed

target/xtensa/translate.c

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2191,7 +2191,11 @@ static void translate_rsil(DisasContext *dc, const OpcodeArg arg[],
21912191
static void translate_rsr(DisasContext *dc, const OpcodeArg arg[],
21922192
const uint32_t par[])
21932193
{
2194-
tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
2194+
if (sr_name[par[0]]) {
2195+
tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
2196+
} else {
2197+
tcg_gen_movi_i32(arg[0].out, 0);
2198+
}
21952199
}
21962200

21972201
static void translate_rsr_ccount(DisasContext *dc, const OpcodeArg arg[],
@@ -2563,13 +2567,17 @@ static void translate_wrmsk_expstate(DisasContext *dc, const OpcodeArg arg[],
25632567
static void translate_wsr(DisasContext *dc, const OpcodeArg arg[],
25642568
const uint32_t par[])
25652569
{
2566-
tcg_gen_mov_i32(cpu_SR[par[0]], arg[0].in);
2570+
if (sr_name[par[0]]) {
2571+
tcg_gen_mov_i32(cpu_SR[par[0]], arg[0].in);
2572+
}
25672573
}
25682574

25692575
static void translate_wsr_mask(DisasContext *dc, const OpcodeArg arg[],
25702576
const uint32_t par[])
25712577
{
2572-
tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in, par[2]);
2578+
if (sr_name[par[0]]) {
2579+
tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in, par[2]);
2580+
}
25732581
}
25742582

25752583
static void translate_wsr_acchi(DisasContext *dc, const OpcodeArg arg[],
@@ -2775,23 +2783,31 @@ static void translate_xor(DisasContext *dc, const OpcodeArg arg[],
27752783
static void translate_xsr(DisasContext *dc, const OpcodeArg arg[],
27762784
const uint32_t par[])
27772785
{
2778-
TCGv_i32 tmp = tcg_temp_new_i32();
2786+
if (sr_name[par[0]]) {
2787+
TCGv_i32 tmp = tcg_temp_new_i32();
27792788

2780-
tcg_gen_mov_i32(tmp, arg[0].in);
2781-
tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
2782-
tcg_gen_mov_i32(cpu_SR[par[0]], tmp);
2783-
tcg_temp_free(tmp);
2789+
tcg_gen_mov_i32(tmp, arg[0].in);
2790+
tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
2791+
tcg_gen_mov_i32(cpu_SR[par[0]], tmp);
2792+
tcg_temp_free(tmp);
2793+
} else {
2794+
tcg_gen_movi_i32(arg[0].out, 0);
2795+
}
27842796
}
27852797

27862798
static void translate_xsr_mask(DisasContext *dc, const OpcodeArg arg[],
27872799
const uint32_t par[])
27882800
{
2789-
TCGv_i32 tmp = tcg_temp_new_i32();
2801+
if (sr_name[par[0]]) {
2802+
TCGv_i32 tmp = tcg_temp_new_i32();
27902803

2791-
tcg_gen_mov_i32(tmp, arg[0].in);
2792-
tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
2793-
tcg_gen_andi_i32(cpu_SR[par[0]], tmp, par[2]);
2794-
tcg_temp_free(tmp);
2804+
tcg_gen_mov_i32(tmp, arg[0].in);
2805+
tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
2806+
tcg_gen_andi_i32(cpu_SR[par[0]], tmp, par[2]);
2807+
tcg_temp_free(tmp);
2808+
} else {
2809+
tcg_gen_movi_i32(arg[0].out, 0);
2810+
}
27952811
}
27962812

27972813
static void translate_xsr_ccount(DisasContext *dc, const OpcodeArg arg[],
@@ -2819,7 +2835,11 @@ static void translate_xsr_ccount(DisasContext *dc, const OpcodeArg arg[],
28192835
{ \
28202836
TCGv_i32 tmp = tcg_temp_new_i32(); \
28212837
\
2822-
tcg_gen_mov_i32(tmp, cpu_SR[par[0]]); \
2838+
if (sr_name[par[0]]) { \
2839+
tcg_gen_mov_i32(tmp, cpu_SR[par[0]]); \
2840+
} else { \
2841+
tcg_gen_movi_i32(tmp, 0); \
2842+
} \
28232843
translate_wsr_##name(dc, arg, par); \
28242844
tcg_gen_mov_i32(arg[0].out, tmp); \
28252845
tcg_temp_free(tmp); \

0 commit comments

Comments
 (0)