Message ID | 20240207182023.36316-10-deller@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | target/hppa: Enhancements and fixes | expand |
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~
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();