[prev in list] [next in list] [prev in thread] [next in thread]
List: qemu-devel
Subject: Re: [PATCH 3/3] target/hppa: fix building gva for wide mode
From: Helge Deller <deller () gmx ! de>
Date: 2024-03-24 16:28:14
Message-ID: 1f7a34a6-9038-4419-abfe-d7f9addc5bcf () gmx ! de
[Download RAW message or body]
On 3/24/24 09:09, Sven Schnelle wrote:
> 64 Bit hppa no longer has a fixed 32/32 bit split between space and
> offset. Instead it uses 42 bits for the offset. The lower 10 bits of
> the space are always zero, leaving 22 bits actually used. Simply or
> the values together to build the gva.
>
> Signed-off-by: Sven Schnelle <svens@stackframe.org>
Reviewed-by: Helge Deller <deller@gmx.de>
Tested-by: Helge Deller <deller@gmx.de>
Helge
> ---
> target/hppa/mem_helper.c | 13 +++++++------
> 1 file changed, 7 insertions(+), 6 deletions(-)
>
> diff --git a/target/hppa/mem_helper.c b/target/hppa/mem_helper.c
> index 84785b5a5c..6f895fced7 100644
> --- a/target/hppa/mem_helper.c
> +++ b/target/hppa/mem_helper.c
> @@ -523,13 +523,16 @@ void HELPER(itlbp_pa11)(CPUHPPAState *env, target_ulong addr, target_ulong reg)
> }
>
> static void itlbt_pa20(CPUHPPAState *env, target_ulong r1,
> - target_ulong r2, vaddr va_b)
> + target_ulong r2, uint64_t spc, uint64_t off)
> {
> HPPATLBEntry *ent;
> - vaddr va_e;
> + vaddr va_b, va_e;
> uint64_t va_size;
> int mask_shift;
>
> + va_b = off & gva_offset_mask(env->psw);
> + va_b |= spc << 32;
> +
> mask_shift = 2 * (r1 & 0xf);
> va_size = (uint64_t)TARGET_PAGE_SIZE << mask_shift;
> va_b &= -va_size;
> @@ -569,14 +572,12 @@ static void itlbt_pa20(CPUHPPAState *env, target_ulong r1,
>
> void HELPER(idtlbt_pa20)(CPUHPPAState *env, target_ulong r1, target_ulong r2)
> {
> - vaddr va_b = deposit64(env->cr[CR_IOR], 32, 32, env->cr[CR_ISR]);
> - itlbt_pa20(env, r1, r2, va_b);
> + itlbt_pa20(env, r1, r2, env->cr[CR_ISR], env->cr[CR_IOR]);
> }
>
> void HELPER(iitlbt_pa20)(CPUHPPAState *env, target_ulong r1, target_ulong r2)
> {
> - vaddr va_b = deposit64(env->cr[CR_IIAOQ], 32, 32, env->cr[CR_IIASQ]);
> - itlbt_pa20(env, r1, r2, va_b);
> + itlbt_pa20(env, r1, r2, env->cr[CR_IIASQ], env->cr[CR_IIAOQ]);
> }
>
> /* Purge (Insn/Data) TLB. */
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic