Re: [PATCH 01/11] target/hexagon: align exceptions for user/sysemu

Brian Cain <[email protected]>
Newsgroups org.nongnu.qemu-devel
Message-ID <[email protected]>
On 8/21/2026 11:37 AM, Pierrick Bouvier wrote:
> On 8/20/2026 12:02 PM, Brian Cain wrote:
>> On 8/20/2026 1:40 PM, Pierrick Bouvier wrote:
>>> On 8/18/2026 6:31 PM, Brian Cain wrote:
>>>> System mode reports an exception as cs->exception_index = HEX_EVENT_*
>>>> plus
>>>> env->cause_code = HEX_CAUSE_*, but translated code in user mode put
>>>> the cause
>>>> code straight into exception_index, so cpu_loop() was decoding both
>>>> forms.
>>>> gen_exception_decode_fail() and the misaligned-PC check used the raw
>>>> form
>>>> unconditionally, so in system mode the cause code was misread as an
>>>> event
>>>> number.
>>>>
>>>> Use the {event, cause} everywhere and drop the duplicated cases
>>>> from cpu_loop(), which fixes HEX_CAUSE_PRIV_USER_NO_SINSN and
>>>> HEX_CAUSE_PRIV_USER_NO_GINSN.  The misaligned PC is no longer zeroed
>>>> on its way out either, so it reaches the signal frame as si_addr instead
>>>> of whatever r31 held.
>>>>
>>>> Signed-off-by: Brian Cain <[email protected]>
>>>> ---
>>>>    target/hexagon/translate.h    |  2 +-
>>>>    linux-user/hexagon/cpu_loop.c | 30 +++++++++++-------------------
>>>>    target/hexagon/cpu.c          |  3 ++-
>>>>    target/hexagon/translate.c    | 27 +++++++++------------------
>>>>    4 files changed, 23 insertions(+), 39 deletions(-)
>>>>
>>>> diff --git a/target/hexagon/translate.h b/target/hexagon/translate.h
>>>> index 3c5773e2c73..00de2b0d2ec 100644
>>>> --- a/target/hexagon/translate.h
>>>> +++ b/target/hexagon/translate.h
>>>> @@ -330,7 +330,7 @@ extern TCGv_i32 hex_t_sreg[NUM_SREGS];
>>>>    #endif
>>>>      -void hex_gen_exception_end_tb(DisasContext *ctx, int excp);
>>>> +void hex_gen_exception_end_tb(DisasContext *ctx, int cause);
>>>>      void process_store(DisasContext *ctx, int slot_num);
>>>>    diff --git a/linux-user/hexagon/cpu_loop.c b/linux-user/hexagon/
>>>> cpu_loop.c
>>>> index d7f73439dbc..e4ef97a1184 100644
>>>> --- a/linux-user/hexagon/cpu_loop.c
>>>> +++ b/linux-user/hexagon/cpu_loop.c
>>>> @@ -66,21 +66,22 @@ void cpu_loop(CPUHexagonState *env)
>>>>                case HEX_CAUSE_FETCH_NO_UPAGE:
>>>>                case HEX_CAUSE_PRIV_NO_UREAD:
>>>>                case HEX_CAUSE_PRIV_NO_UWRITE:
>>>> -            force_sig_fault(TARGET_SIGSEGV, TARGET_SEGV_MAPERR,
>>>> -                    env->gpr[HEX_REG_PC]);
>>>> -
>>>> -            break;
>>>> +                force_sig_fault(TARGET_SIGSEGV, TARGET_SEGV_MAPERR,
>>>> +                                env->gpr[HEX_REG_PC]);
>>>> +                break;
>>>>                case HEX_CAUSE_PRIV_USER_NO_GINSN:
>>>>                case HEX_CAUSE_PRIV_USER_NO_SINSN:
>>>>                case HEX_CAUSE_INVALID_PACKET:
>>>> -            force_sig_fault(TARGET_SIGILL, TARGET_ILL_ILLOPC,
>>>> -                    env->gpr[HEX_REG_PC]);
>>>> -            break;
>>>> +            case HEX_CAUSE_REG_WRITE_CONFLICT:
>>>> +                force_sig_fault(TARGET_SIGILL, TARGET_ILL_ILLOPC,
>>>> +                                env->gpr[HEX_REG_PC]);
>>>> +                break;
>>>>                case HEX_CAUSE_MISALIGNED_LOAD:
>>>>                case HEX_CAUSE_MISALIGNED_STORE:
>>>> -            force_sig_fault(TARGET_SIGBUS, TARGET_BUS_ADRALN,
>>>> -                    env->gpr[HEX_REG_PC]);
>>>> -            break;
>>>> +            case HEX_CAUSE_PC_NOT_ALIGNED:
>>>> +                force_sig_fault(TARGET_SIGBUS, TARGET_BUS_ADRALN,
>>>> +                                env->gpr[HEX_REG_PC]);
>>>> +                break;
>>>>                default:
>>>>                    EXCP_DUMP(env, "\nqemu: unhandled CPU precise
>>>> exception "
>>>>                        "cause code 0x%x - aborting\n",
>>>> @@ -88,15 +89,6 @@ void cpu_loop(CPUHexagonState *env)
>>>>                    exit(EXIT_FAILURE);
>>>>                }
>>>>                break;
>>>> -        case HEX_CAUSE_PC_NOT_ALIGNED:
>>>> -            force_sig_fault(TARGET_SIGBUS, TARGET_BUS_ADRALN,
>>>> -                            env->gpr[HEX_REG_R31]);
>>>> -            break;
>>>> -        case HEX_CAUSE_INVALID_PACKET:
>>>> -        case HEX_CAUSE_REG_WRITE_CONFLICT:
>>>> -            force_sig_fault(TARGET_SIGILL, TARGET_ILL_ILLOPC,
>>>> -                            env->gpr[HEX_REG_PC]);
>>>> -            break;
>>>>            case EXCP_ATOMIC:
>>>>                cpu_exec_step_atomic(cs);
>>>>                break;
>>>> diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c
>>>> index 7067e5b70f7..0bbefc2fb87 100644
>>>> --- a/target/hexagon/cpu.c
>>>> +++ b/target/hexagon/cpu.c
>>>> @@ -323,7 +323,8 @@ static TCGTBCPUState
>>>> hexagon_get_tb_cpu_state(CPUState *cs)
>>>>            hex_flags = FIELD_DP32(hex_flags, TB_FLAGS, IS_TIGHT_LOOP, 1);
>>>>        }
>>>>        if (pc & PCALIGN_MASK) {
>>>> -        hexagon_raise_exception_err(env, HEX_CAUSE_PC_NOT_ALIGNED, 0);
>>>> +        env->cause_code = HEX_CAUSE_PC_NOT_ALIGNED;
>>>> +        hexagon_raise_exception_err(env, HEX_EVENT_PRECISE, pc);
>>>>        }
>>>>      #ifndef CONFIG_USER_ONLY
>>>> diff --git a/target/hexagon/translate.c b/target/hexagon/translate.c
>>>> index 06a8159d283..5cfa60ca302 100644
>>>> --- a/target/hexagon/translate.c
>>>> +++ b/target/hexagon/translate.c
>>>> @@ -73,8 +73,8 @@ TCGv hex_vstore_pending[VSTORES_MAX];
>>>>    #ifndef CONFIG_USER_ONLY
>>>>    TCGv_i32 hex_greg[NUM_GREGS];
>>>>    TCGv_i32 hex_t_sreg[NUM_SREGS];
>>>> -TCGv_i32 hex_cause_code;
>>>>    #endif
>>>> +static TCGv_i32 hex_cause_code;
>>>>
>>> Shouldn't this be part of CPUState?
>>> What if multiple cpus trigger an exception at the same time?
>> The cause_code is part of CPUState.  This TCGv is a reference to that
>> state member for use with translation. We take advantage of the single-
>> threaded nature of translation with all of these file-global TCGv values.
>>
> Thinking twice about it, please note that this is true only for
> qemu-user (when tb_gen_code runs with mmap_lock), or qemu-system without
> MTTCG, which is what we have at the moment.


I had intended to claim that it was the case that translation was 
single-threaded even in MTTCG.  But I see now that I was mistaken about 
that.

I arrived at this belief somewhat backwards, I guess - the file-scope 
TCGv's used by other architectures who do support MTTCG already, and our 
results using file-scope TCGv's on qemu-system-hexagon with MTTCG in a 
downstream fork.

But after digging a bit I think it's still safe/appropriate to have 
file-scope TCGv's concurrently accessed by multiple translation 
threads.  Because they are merely a reference to the state data and not 
the data itself.  The state data is modified by the TCG instructions 
generated by translation.  The TCGv - the reference itself - is probably 
immutable, meaning it couldn't be made to refer to anything else.  Or 
certainly shouldn't.


> However, using qemu-system with MTTCG, translation can happen
> concurrently, and those variables should be part of DisasContext instead.
>
> Regards,
> Pierrick
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.