diff mbox series

[3/4] linux-user/sparc: Handle "ta 5"

Message ID 20230201004609.3005029-4-iii@linux.ibm.com
State New
Headers show
Series Fix deadlock when dying because of a signal | expand

Commit Message

Ilya Leoshkevich Feb. 1, 2023, 12:46 a.m. UTC
GCC lowers __builtin_trap() to "ta 5", which in turn generates trap
0x105. Follow what kernel's bad_trap() is doing there.

Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
---
 linux-user/sparc/cpu_loop.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Richard Henderson Feb. 1, 2023, 7:49 p.m. UTC | #1
On 1/31/23 14:46, Ilya Leoshkevich wrote:
> GCC lowers __builtin_trap() to "ta 5", which in turn generates trap
> 0x105. Follow what kernel's bad_trap() is doing there.
> 
> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
> ---
>   linux-user/sparc/cpu_loop.c | 3 +++
>   1 file changed, 3 insertions(+)
> 
> diff --git a/linux-user/sparc/cpu_loop.c b/linux-user/sparc/cpu_loop.c
> index 434c90a55f8..fa36d452a51 100644
> --- a/linux-user/sparc/cpu_loop.c
> +++ b/linux-user/sparc/cpu_loop.c
> @@ -225,6 +225,9 @@ void cpu_loop (CPUSPARCState *env)
>               restore_window(env);
>               break;
>   #ifndef TARGET_ABI32
> +        case 0x105:
> +            force_sig_fault(TARGET_SIGILL, ILL_ILLTRP, env->pc);
> +            break;
>           case 0x16e:
>               flush_windows(env);
>               sparc64_get_context(env);

Quite a lot of ttable{32,64}.S is missing here.  We should certainly make use of TT_TRAP, 
instead of hard-coding 0x100 vs 0x80.


r~
diff mbox series

Patch

diff --git a/linux-user/sparc/cpu_loop.c b/linux-user/sparc/cpu_loop.c
index 434c90a55f8..fa36d452a51 100644
--- a/linux-user/sparc/cpu_loop.c
+++ b/linux-user/sparc/cpu_loop.c
@@ -225,6 +225,9 @@  void cpu_loop (CPUSPARCState *env)
             restore_window(env);
             break;
 #ifndef TARGET_ABI32
+        case 0x105:
+            force_sig_fault(TARGET_SIGILL, ILL_ILLTRP, env->pc);
+            break;
         case 0x16e:
             flush_windows(env);
             sparc64_get_context(env);