Requesting feedback on the implementation of 128-bit registers.
Note that there ought to be no functional change with all of this,
because 128-bit sysregs are not hereing enabled. Despite all of the
different FEAT_* names, it's all indivisible from FEAT_D128.
I've used Int128 throughout, which seems sensible at first glance,
but *really* complicates the definition of the registers within
ARMCPU, especially when the low part is aliased with AArch32.
The only saving grace is that there are so few 128-bit registers.
Gettng there isn't trivial either. I wasn't happy with the idea
of replicating the orig_{read,write,access} set of hooks used by
VHE, so I've rewritten that to perform the VHE redirection at
translation time, much like how we do for NV2.
In the process of rewriting VHE, re-organize registration to
simplify memory management and reduce the number of arguments
to the inner helper functions.
At one point in development, I did not have CP_REG_AA64_128BIT_MASK,
which was going to require cpreg_to_kvm_id to also take a
ARMCPRegInfo pointer. There aren't a whole lot of calls to that
helper, but the one in hvf required reorganization to handle.
With CP_REG_AA64_128BIT_MASK, that reorganization is not required,
but I still think it's a good cleanup so I have kept it.
Alternate implementation strategies:
(1) Disconnect the 64-bit halves of the sysregs.
Cons:
- The 128-bit-ness isn't screamingly obvious.
Pros:
- Avoid having to rearrange the ARMCPU layout, and simpler
integration with AArch32.
- Avoid Int128 most places, since we wind up doing quite a
lot of packing and unpacking the structure.
- Because Int128 *isn't* a structure for most 64-bit builds,
we can accidentally assign a 64-bit local to a 128-bit field.
- Possibly easier migration changes; I havn't thought about
that too much.
(2) Avoid adding read128fn, raw_*128fn, and most write128fn, at
least for now, because no defined sysregs need such handling.
E.g. the 128-bit write of TTBR0_EL1 could call the existing
writefn for the low half and directly store the high half.
We do still need write128fn for the TLBIP set of insns, not
yet implemented here, but even that could avoid Int128 by
having 2 64-bit arguments.
Thoughts?
r~
Richard Henderson (61):
target/arm: Introduce KVMID_AA64_SYS_REG64
target/arm: Move compare_u64 to helper.c
target/arm/hvf: Split out sysreg.c.inc
target/arm/hvf: Reorder DEF_SYSREG arguments
target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID
target/arm/hvf: Remove hvf_sreg_match.key
target/arm/hvf: Replace hvf_sreg_match with hvf_sreg_list
target/arm/hvf: Sort the cpreg_indexes array
target/arm/hvf: Use raw_read, raw_write to access
target/arm: Use raw_write in cp_reg_reset
target/arm: Rename all ARMCPRegInfo from opaque to ri
target/arm: Drop define_one_arm_cp_reg_with_opaque
target/arm: Restrict the scope of CPREG_FIELD32, CPREG_FIELD64
target/arm: Replace cpreg_field_is_64bit with cpreg_field_type
target/arm: Add CP_REG_AA32_64BIT_{SHIFT,MASK}
target/arm: Rename CP_REG_AA32_NS_{SHIFT,MASK}
target/arm: Convert init_cpreg_list to g_hash_table_foreach
target/arm: Remove cp argument to ENCODE_AA64_CP_REG
target/arm: Reorder ENCODE_AA64_CP_REG arguments
target/arm: Split out add_cpreg_to_hashtable_aa{32,64}
target/arm: Improve asserts in define_one_arm_cp_reg
target/arm: Move cp processing to define_one_arm_cp_reg
target/arm: Move cpreg elimination to define_one_arm_cp_reg
target/arm: Add key parameter to add_cpreg_to_hashtable
target/arm: Split out alloc_cpreg
target/arm: Hoist the allocation of ARMCPRegInfo
target/arm: Remove name argument to alloc_cpreg
target/arm: Move alias setting for wildcards
target/arm: Move writeback of CP_ANY fields
target/arm: Move endianness fixup for 32-bit registers
target/arm: Rename TBFLAG_A64_NV2_MEM_E20 with *_E2H
target/arm: Split out redirect_cpreg
target/arm: Redirect VHE FOO_EL1 -> FOO_EL2 during translation
target/arm: Redirect VHE FOO_EL12 to FOO_EL1 during translation
target/arm: Rename some cpreg to their aarch64 names
target/arm: Remove define_arm_vh_e2h_redirects_aliases
target/arm: Implement isar tests for FEAT_SYSREG128, FEAT_SYSINSTR128
target/arm: Define CP_REG_SIZE_U128
target/arm: Update ARMCPRegInfo for 128-bit sysregs
target/arm: Assert ARM_CP_128BIT only with ARM_CP_STATE_AA64
target/arm: Split add_cpreg_to_hashtable_aa64
target/arm: Add raw_read128, raw_write128
target/arm: Add read_raw_cp_reg128, write_raw_cp_reg128
target/arm: Put 128-bit sysregs into a separate list
target/arm/kvm: Assert no 128-bit sysregs in kvm_arm_init_cpreg_list
target/arm/hvf: Assert no 128-bit sysregs in hvf_arch_init_vcpu
migration: Add vmstate_info_int128
target/arm: Migrate cpreg128 registers
target/arm: Add syn_aa64_sysreg128trap
target/arm: Introduce helper_{get,set}_cp_reg128
target/arm: Implement MRRS, MSRR, SYSP
include/qemu/compiler: Introduce HOST_ENDIAN_FIELDS
include/hw/core/cpu: Use HOST_ENDIAN_FIELDS in IcountDecr
include/qemu/host-utils: Use HOST_ENDIAN_FIELDS in muldiv64_rounding
target/arm: Use HOST_ENDIAN_FIELDS in CPUARMState
target/arm: Consolidate definitions of PAR
target/arm: Extend PAR_EL1 to 128-bit
target/arm: Consolidate definitions of TTBR[01]
target/arm: Split out flush_if_asid_change
target/arm: Use flush_if_asid_change in vmsa_ttbr_write
target/arm: Extend TTBR system registers to 128-bit
include/hw/core/cpu.h | 8 +-
include/migration/vmstate.h | 1 +
include/qemu/compiler.h | 11 +
include/qemu/host-utils.h | 6 +-
target/arm/cpregs.h | 134 +--
target/arm/cpu-features.h | 10 +
target/arm/cpu.h | 95 +-
target/arm/internals.h | 4 +
target/arm/kvm-consts.h | 16 +-
target/arm/syndrome.h | 10 +
target/arm/tcg/helper.h | 2 +
target/arm/tcg/translate.h | 2 +
hw/intc/arm_gicv3_cpuif.c | 10 +-
migration/vmstate-types.c | 30 +
target/arm/cpu.c | 10 +-
target/arm/gdbstub.c | 14 +-
target/arm/helper.c | 1536 +++++++++++++++++++-------------
target/arm/hvf/hvf.c | 243 ++---
target/arm/kvm.c | 13 +-
target/arm/machine.c | 50 ++
target/arm/ptw.c | 14 +-
target/arm/tcg/cpregs-at.c | 4 +-
target/arm/tcg/hflags.c | 8 +-
target/arm/tcg/op_helper.c | 28 +
target/arm/tcg/translate-a64.c | 207 ++++-
target/arm/hvf/sysreg.c.inc | 146 +++
target/arm/tcg/a64.decode | 12 +-
27 files changed, 1595 insertions(+), 1029 deletions(-)
create mode 100644 target/arm/hvf/sysreg.c.inc
--
2.43.0