diff mbox series

[10/13] target/hppa: Check privilege only when PSW.P is set

Message ID 20240207182023.36316-11-deller@kernel.org (mailing list archive)
State New, archived
Headers show
Series target/hppa: Enhancements and fixes | expand

Commit Message

Helge Deller Feb. 7, 2024, 6:20 p.m. UTC
From: Helge Deller <deller@gmx.de>

CHECK_MOST_PRIVILEGED() should check the privilege level only when the PSW.P
bit is set.

Signed-off-by: Helge Deller <deller@gmx.de>
---
 target/hppa/translate.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Richard Henderson Feb. 8, 2024, 9:14 p.m. UTC | #1
On 2/7/24 08:20, deller@kernel.org wrote:
> From: Helge Deller <deller@gmx.de>
> 
> CHECK_MOST_PRIVILEGED() should check the privilege level only when the PSW.P
> bit is set.
> 
> Signed-off-by: Helge Deller <deller@gmx.de>
> ---
>   target/hppa/translate.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/target/hppa/translate.c b/target/hppa/translate.c
> index 7e58775bbf..21c2734a1f 100644
> --- a/target/hppa/translate.c
> +++ b/target/hppa/translate.c
> @@ -604,7 +604,7 @@ static bool gen_illegal(DisasContext *ctx)
>   #else
>   #define CHECK_MOST_PRIVILEGED(EXCP) \
>       do {                                     \
> -        if (ctx->privilege != 0) {           \
> +        if (ctx->privilege != 0 && (ctx->tb_flags & PSW_P)) { \
>               return gen_excp_iir(ctx, EXCP);  \
>           }                                    \
>       } while (0)

PSW_P is documented as applying only to protection identifiers.
I do not believe this to be correct at all.


r~
diff mbox series

Patch

diff --git a/target/hppa/translate.c b/target/hppa/translate.c
index 7e58775bbf..21c2734a1f 100644
--- a/target/hppa/translate.c
+++ b/target/hppa/translate.c
@@ -604,7 +604,7 @@  static bool gen_illegal(DisasContext *ctx)
 #else
 #define CHECK_MOST_PRIVILEGED(EXCP) \
     do {                                     \
-        if (ctx->privilege != 0) {           \
+        if (ctx->privilege != 0 && (ctx->tb_flags & PSW_P)) { \
             return gen_excp_iir(ctx, EXCP);  \
         }                                    \
     } while (0)