[PATCH 09/13] target/hppa: Allow read-access to PSW with rsm 0, reg instruction

deller@kernel.org posted 13 patches 9 months, 3 weeks ago
Maintainers: Richard Henderson <richard.henderson@linaro.org>, Helge Deller <deller@gmx.de>
There is a newer version of this series
[PATCH 09/13] target/hppa: Allow read-access to PSW with rsm 0, reg instruction
Posted by deller@kernel.org 9 months, 3 weeks ago
From: Helge Deller <deller@gmx.de>

HP-UX 11 and HP ODE tools use the "rsm 0,%reg" instruction in not priviledged
code paths to get the current PSW flags. The constant 0 means that no bits of
the PSW shall be reset, so this is effectively a read-only access to the PSW.
Allow this read-only access even for not privileged code.

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

diff --git a/target/hppa/translate.c b/target/hppa/translate.c
index 10fdc0813d..7e58775bbf 100644
--- a/target/hppa/translate.c
+++ b/target/hppa/translate.c
@@ -2156,10 +2156,16 @@ static bool trans_ldsid(DisasContext *ctx, arg_ldsid *a)
 
 static bool trans_rsm(DisasContext *ctx, arg_rsm *a)
 {
+#ifdef CONFIG_USER_ONLY
     CHECK_MOST_PRIVILEGED(EXCP_PRIV_OPR);
-#ifndef CONFIG_USER_ONLY
+#else
     TCGv_i64 tmp;
 
+    /* HP-UX 11i and HP ODE use rsm for read-access to PSW */
+    if (a->i) {
+        CHECK_MOST_PRIVILEGED(EXCP_PRIV_OPR);
+    }
+
     nullify_over(ctx);
 
     tmp = tcg_temp_new_i64();
-- 
2.43.0
Re: [PATCH 09/13] target/hppa: Allow read-access to PSW with rsm 0,reg instruction
Posted by Richard Henderson 9 months, 3 weeks ago
On 2/7/24 08:20, deller@kernel.org wrote:
> From: Helge Deller <deller@gmx.de>
> 
> HP-UX 11 and HP ODE tools use the "rsm 0,%reg" instruction in not priviledged
> code paths to get the current PSW flags. The constant 0 means that no bits of
> the PSW shall be reset, so this is effectively a read-only access to the PSW.
> Allow this read-only access even for not privileged code.
> 
> Signed-off-by: Helge Deller <deller@gmx.de>
> ---
>   target/hppa/translate.c | 8 +++++++-
>   1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/target/hppa/translate.c b/target/hppa/translate.c
> index 10fdc0813d..7e58775bbf 100644
> --- a/target/hppa/translate.c
> +++ b/target/hppa/translate.c
> @@ -2156,10 +2156,16 @@ static bool trans_ldsid(DisasContext *ctx, arg_ldsid *a)
>   
>   static bool trans_rsm(DisasContext *ctx, arg_rsm *a)
>   {
> +#ifdef CONFIG_USER_ONLY
>       CHECK_MOST_PRIVILEGED(EXCP_PRIV_OPR);
> -#ifndef CONFIG_USER_ONLY
> +#else
>       TCGv_i64 tmp;
>   
> +    /* HP-UX 11i and HP ODE use rsm for read-access to PSW */
> +    if (a->i) {
> +        CHECK_MOST_PRIVILEGED(EXCP_PRIV_OPR);
> +    }
> +
>       nullify_over(ctx);

Wow, that is not documented in the manual.  I wonder what this user-land software uses 
this for?  There aren't many bits in there that are relevant to user-land.

I suppose PSW_W is readable from there, but that can be inferred from SAR...

Acked-by: Richard Henderson <richard.henderson@linaro.org>


r~