[PATCH v2] hvf: arm: sign extend when SSE=1

Joelle van Dyne posted 1 patch 1 month ago
target/arm/hvf/hvf.c | 4 ++++
1 file changed, 4 insertions(+)
[PATCH v2] hvf: arm: sign extend when SSE=1
Posted by Joelle van Dyne 1 month ago
According to the ARM manual, when SSE=1 the data item must be sign
extended.

Signed-off-by: Joelle van Dyne <j@getutm.app>
---
 target/arm/hvf/hvf.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 0afd96018e..43cf250eef 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1971,6 +1971,7 @@ int hvf_vcpu_exec(CPUState *cpu)
         bool isv = syndrome & ARM_EL_ISV;
         bool iswrite = (syndrome >> 6) & 1;
         bool s1ptw = (syndrome >> 7) & 1;
+        bool sse = (syndrome >> 21) & 1;
         uint32_t sas = (syndrome >> 22) & 3;
         uint32_t len = 1 << sas;
         uint32_t srt = (syndrome >> 16) & 0x1f;
@@ -1998,6 +1999,9 @@ int hvf_vcpu_exec(CPUState *cpu)
             address_space_read(&address_space_memory,
                                hvf_exit->exception.physical_address,
                                MEMTXATTRS_UNSPECIFIED, &val, len);
+            if (sse && len != sizeof(uint64_t)) {
+                val = sextract64(val, 0, len * 8);
+            }
             hvf_set_reg(cpu, srt, val);
         }
 
-- 
2.41.0
Re: [PATCH v2] hvf: arm: sign extend when SSE=1
Posted by Peter Maydell 1 month ago
On Mon, 24 Feb 2025 at 18:41, Joelle van Dyne <j@getutm.app> wrote:
>
> According to the ARM manual, when SSE=1 the data item must be sign
> extended.
>
> Signed-off-by: Joelle van Dyne <j@getutm.app>
> ---
>  target/arm/hvf/hvf.c | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
> index 0afd96018e..43cf250eef 100644
> --- a/target/arm/hvf/hvf.c
> +++ b/target/arm/hvf/hvf.c
> @@ -1971,6 +1971,7 @@ int hvf_vcpu_exec(CPUState *cpu)
>          bool isv = syndrome & ARM_EL_ISV;
>          bool iswrite = (syndrome >> 6) & 1;
>          bool s1ptw = (syndrome >> 7) & 1;
> +        bool sse = (syndrome >> 21) & 1;
>          uint32_t sas = (syndrome >> 22) & 3;
>          uint32_t len = 1 << sas;
>          uint32_t srt = (syndrome >> 16) & 0x1f;
> @@ -1998,6 +1999,9 @@ int hvf_vcpu_exec(CPUState *cpu)
>              address_space_read(&address_space_memory,
>                                 hvf_exit->exception.physical_address,
>                                 MEMTXATTRS_UNSPECIFIED, &val, len);
> +            if (sse && len != sizeof(uint64_t)) {
> +                val = sextract64(val, 0, len * 8);
> +            }

sse is only set for byte, halfword or word loads, so if it
is set then len won't be 8. Plus sextract64(val, 0, 64)
is valid (returning the input value). So we don't need to
check len here.

>              hvf_set_reg(cpu, srt, val);
>          }

I've applied this to target-arm.next, with the
check on "len" removed from the if() condition.

thanks
-- PMM