Re: [RFC PATCH v7 09/18] target/arm/cpu_idregs: generate tables for Arm64 ID registers and fields

Khushit Shah <[email protected]>
Newsgroups org.nongnu.qemu-arm,dev.linux.lists.kvmarm,org.nongnu.qemu-devel
Message-ID <[email protected]>

> On 26 Jul 2026, at 8:59 PM, Eric Auger <[email protected]> wrote:
> 
> !-------------------------------------------------------------------|
>  CAUTION: External Email
> 
> |-------------------------------------------------------------------!
> 
> From: Shaju Abraham <[email protected]>
> 
> Include cpu-idregs.h.inc multiple times with different definitions for the
> X-macros. This will generate tables for all Arm64 ID registers and their
> fields. Additionally, initialize the tables with all architecturally defined
> values. These tables will be consumed by the property layer in future
> patches.
> 
> Co-authored-by: Khushit Shah <[email protected]>
Signed-off-by: Khushit Shah <[email protected]>
> Signed-off-by: Shaju Abraham <[email protected]>
> Signed-off-by: Eric Auger <[email protected]>
> 
> ---
> 
> v5 -> v6
> - restored support of enum values
> ---
> target/arm/cpu-idregs.c | 96 +++++++++++++++++++++++++++++++++++++++++
> target/arm/meson.build  |  1 +
> 2 files changed, 97 insertions(+)
> create mode 100644 target/arm/cpu-idregs.c
> 
> diff --git a/target/arm/cpu-idregs.c b/target/arm/cpu-idregs.c
> new file mode 100644
> index 0000000000..c41d0ab0c4
> --- /dev/null
> +++ b/target/arm/cpu-idregs.c
> @@ -0,0 +1,96 @@
> +/*
> + *   ARM ID register field table.
> + *
> + *   Builds the per-id-register field descriptor arrays and the global
> + *   arm_idregs[] table.
> + *
> + *  SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +#include "qemu/osdep.h"
> +#include "qemu/error-report.h"
> +#include "qapi/error.h"
> +#include "cpu.h"
> +#include "cpu-idregs.h"
> +
> +/*
> + * Generate an array of architecturely defined values for each field
> + * associated with enum values
> + */
> +
> +#define IDREG_START(reg)
> +#define IDREG_END(reg)
> +#define IDREG_FIELD(reg, field, shift, length)
> +#define IDREG_FIELD_START(reg, field, shift, length) \
> +    static const ArmIdRegArchVal reg##_##field##_arch_vals[] = {
> +#define IDREG_FIELD_ARCH_VAL(v) { (v), "" },
> +#define IDREG_FIELD_END(reg, field) \
> +    };
> +
> +#include "cpu-idregs.h.inc"
> +
> +#undef IDREG_START
> +#undef IDREG_END
> +#undef IDREG_FIELD
> +#undef IDREG_FIELD_START
> +#undef IDREG_FIELD_END
> +#undef IDREG_FIELD_ARCH_VAL
> +
> +/* generate an array of per-register ArmIdRegField[] descriptors */
> +
> +#define IDREG_START(reg) \
> +    static ARM64SysRegField reg##_fields[] = {
> +
> +#define IDREG_END(reg) \
> +    };
> +
> +#define IDREG_FIELD_START(reg, field, _shift, _length)  \
> +    {                                                                 \
> +        .name = #field, \
> +        .index = reg##_IDX, \
> +        .shift = (_shift),                                            \
> +        .length = (_length),                                          \
> +        .arch_vals = (ArmIdRegArchVal *)reg##_##field##_arch_vals,    \
> +        .arch_vals_count = ARRAY_SIZE(reg##_##field##_arch_vals),     \
> +    },
> +
> +#define IDREG_FIELD(reg, field, _shift, _length) \
> +    { \
> +        .name = #field, \
> +        .index = reg##_IDX, \
> +        .shift = (_shift), \
> +        .length = (_length), \
> +    },
> +
> +#define IDREG_FIELD_ARCH_VAL(v)
> +
> +#define IDREG_FIELD_END(reg, field)
> +
> +#include "cpu-idregs.h.inc"
> +
> +#undef IDREG_START
> +#undef IDREG_END
> +#undef IDREG_FIELD
> +#undef IDREG_FIELD_START
> +#undef IDREG_FIELD_END
> +#undef IDREG_FIELD_ARCH_VAL
> +
> +/* generate an array of top level ID registers */
> +
> +#define IDREG_END(reg)
> +#define IDREG_FIELD(reg, field, shift, length)
> +#define IDREG_FIELD_START(reg, field, shift, length)
> +#define IDREG_FIELD_ARCH_VAL(v)
> +#define IDREG_FIELD_END(reg, field)
> +
> +#define IDREG_START(reg) \
> +    [reg##_IDX] = { \
> +        .name = #reg, \
> +        .index = reg##_IDX, \
> +        .fields = reg##_fields, \
> +        .fields_count = ARRAY_SIZE(reg##_fields), \
> +    },
> +
> +ARM64SysReg arm64_id_regs[NUM_ID_IDX] = {
> +#include "cpu-idregs.h.inc"
> +};
> +
> diff --git a/target/arm/meson.build b/target/arm/meson.build
> index 4412fde065..ed8535192c 100644
> --- a/target/arm/meson.build
> +++ b/target/arm/meson.build
> @@ -30,6 +30,7 @@ arm_common_user_system_ss.add(when: 'TARGET_AARCH64', if_true: files(
> 
> arm_common_system_ss.add(files(
>   'arm-qmp-cmds.c',
> +  'cpu-idregs.c',
> ))
> arm_system_ss.add(when: 'CONFIG_KVM', if_true: files('hyp_gdbstub.c', 'kvm.c'))
> arm_system_ss.add(when: 'CONFIG_HVF', if_true: files('hyp_gdbstub.c'))
> -- 
> 2.53.0
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.