On Thu, 1 Oct 2026 at 11:52, Aastha Rawat
<[email protected]> wrote:
>
> - Move common MMIO emulation code from HVF and WHPX backend to
> arm_emulate_mmio() in helper.c.
> - Update HVF and WHPX to use the new helper and shared types.
>
> Signed-off-by: Aastha Rawat <[email protected]>
> ---
> +/*
> + * Emulate a data abort syndrome for MMIO/guest memory access
> + */
> +int arm_emulate_mmio(CPUState *cpu, EsrEl2 syndrome, uint64_t gpa,
> + const struct arm_emul_ops *ops)
Please don't put more stuff into helper.c. It is big enough
as it is.
> diff --git a/target/arm/helper.h b/target/arm/helper.h
> index b1c26c180ea..503404112d4 100644
> --- a/target/arm/helper.h
> +++ b/target/arm/helper.h
> @@ -3,8 +3,24 @@
> #ifndef HELPER__H
> #define HELPER__H
>
> +#include <stdint.h>
> +#include <stdbool.h>
osdep.h includes stdint and stdbool for you, you don't need
to include them manually anywhere.
> #include "exec/helper-proto-common.h"
> #include "exec/helper-gen-common.h"
> +#include "target/arm/syndrome.h"
> +
> +/*
> + * Callback ops for per-register access during MMIO emulation.
> + * Each hypervisor backend provides its own implementation to avoid
> + * syncing the full CPU state for a single-register MMIO access.
> + */
> +struct arm_emul_ops {
> + uint64_t (*get_reg)(CPUState *cpu, int reg);
> + void (*set_reg)(CPUState *cpu, int reg, uint64_t val);
> +};
> +
> +int arm_emulate_mmio(CPUState *cpu, EsrEl2 syndrome, uint64_t gpa,
> + const struct arm_emul_ops *ops);
helper.h is structly for the autogenerated prototypes for TCG
helper functions (hence its name). Put your prototype somewhere else.
> diff --git a/target/arm/syndrome.h b/target/arm/syndrome.h
> index 2a6fa903f27..8b4cc7f7b21 100644
> --- a/target/arm/syndrome.h
> +++ b/target/arm/syndrome.h
> @@ -106,6 +106,53 @@ typedef enum {
> GCS_IT_GCSPOPX = 9,
> } GCSInstructionType;
>
> +typedef union {
> + uint64_t raw;
> + struct {
> + uint32_t iss:25;
> + uint32_t il:1;
> + uint32_t ec:6;
> + uint32_t iss2:5;
> + uint32_t _rsvd:27;
> + } QEMU_PACKED;
> +} EsrEl2;
Do not use bitfields. They are not portable (notably, they have
endianness issues). syndrome. already sets up FIELD() definitions
that you can use with FIELD_EX32 to extract subfields of the syndrome.
> +typedef enum {
> + data_abort_lower = 36,
> + data_abort = 37,
> +} ExceptionClass;
Don't define new versions of what we already have either.
These are EC_DATAABORT and EC_DATAABORT_SAME_EL.
> +
> +#define ARM_EL_EC_LENGTH 6
> +#define ARM_EL_EC_SHIFT 26
> +#define ARM_EL_IL_SHIFT 25
> +#define ARM_EL_ISV_SHIFT 24
> +#define ARM_EL_IL (1 << ARM_EL_IL_SHIFT)
> +#define ARM_EL_ISV (1 << ARM_EL_ISV_SHIFT)
This also is reimplementing what the header already gives you.
-- PMM