diff mbox series

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

Message ID 20250224184123.50780-1-j@getutm.app (mailing list archive)
State New, archived
Headers show
Series [v2] hvf: arm: sign extend when SSE=1 | expand

Commit Message

Joelle van Dyne Feb. 24, 2025, 6:41 p.m. UTC
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(+)

Comments

Peter Maydell Feb. 25, 2025, 1:34 p.m. UTC | #1
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
diff mbox series

Patch

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);
         }