[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 41/46] target/ppc: Clean up _spr_register et al
From: |
David Gibson |
Subject: |
[PULL 41/46] target/ppc: Clean up _spr_register et al |
Date: |
Tue, 4 May 2021 15:53:07 +1000 |
From: Richard Henderson <richard.henderson@linaro.org>
Introduce 3 helper macros to elide arguments that we cannot supply.
This reduces the repetition required to get the job done.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20210501022923.1179736-2-richard.henderson@linaro.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
target/ppc/translate_init.c.inc | 158 +++++++++++++++-----------------
1 file changed, 76 insertions(+), 82 deletions(-)
diff --git a/target/ppc/translate_init.c.inc b/target/ppc/translate_init.c.inc
index f92656b2f2..5cee94f16d 100644
--- a/target/ppc/translate_init.c.inc
+++ b/target/ppc/translate_init.c.inc
@@ -720,103 +720,97 @@ static inline void vscr_init(CPUPPCState *env, uint32_t
val)
helper_mtvscr(env, val);
}
-#ifdef CONFIG_USER_ONLY
-#define spr_register_kvm(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, one_reg_id, initial_value)
\
- _spr_register(env, num, name, uea_read, uea_write, initial_value)
-#define spr_register_kvm_hv(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, hea_read, hea_write,
\
- one_reg_id, initial_value)
\
- _spr_register(env, num, name, uea_read, uea_write, initial_value)
-#else
-#if !defined(CONFIG_KVM)
-#define spr_register_kvm(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, one_reg_id, initial_value)
\
- _spr_register(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, oea_read, oea_write, initial_value)
-#define spr_register_kvm_hv(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, hea_read, hea_write,
\
- one_reg_id, initial_value)
\
- _spr_register(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, hea_read, hea_write, initial_value)
+/**
+ * _spr_register
+ *
+ * Register an SPR with all the callbacks required for tcg,
+ * and the ID number for KVM.
+ *
+ * The reason for the conditional compilation is that the tcg functions
+ * may be compiled out, and the system kvm header may not be available
+ * for supplying the ID numbers. This is ugly, but the best we can do.
+ */
+
+#ifdef CONFIG_TCG
+# define USR_ARG(X) X,
+# ifdef CONFIG_USER_ONLY
+# define SYS_ARG(X)
+# else
+# define SYS_ARG(X) X,
+# endif
#else
-#define spr_register_kvm(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, one_reg_id, initial_value)
\
- _spr_register(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, oea_read, oea_write,
\
- one_reg_id, initial_value)
-#define spr_register_kvm_hv(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, hea_read, hea_write,
\
- one_reg_id, initial_value)
\
- _spr_register(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, hea_read, hea_write,
\
- one_reg_id, initial_value)
+# define USR_ARG(X)
+# define SYS_ARG(X)
#endif
+#ifdef CONFIG_KVM
+# define KVM_ARG(X) X,
+#else
+# define KVM_ARG(X)
#endif
-#define spr_register(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, initial_value)
\
- spr_register_kvm(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, 0, initial_value)
-
-#define spr_register_hv(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, hea_read, hea_write,
\
- initial_value)
\
- spr_register_kvm_hv(env, num, name, uea_read, uea_write,
\
- oea_read, oea_write, hea_read, hea_write,
\
- 0, initial_value)
-
-static inline void _spr_register(CPUPPCState *env, int num,
- const char *name,
- void (*uea_read)(DisasContext *ctx,
- int gprn, int sprn),
- void (*uea_write)(DisasContext *ctx,
- int sprn, int gprn),
-#if !defined(CONFIG_USER_ONLY)
+typedef void spr_callback(DisasContext *, int, int);
- void (*oea_read)(DisasContext *ctx,
- int gprn, int sprn),
- void (*oea_write)(DisasContext *ctx,
- int sprn, int gprn),
- void (*hea_read)(DisasContext *opaque,
- int gprn, int sprn),
- void (*hea_write)(DisasContext *opaque,
- int sprn, int gprn),
-#endif
-#if defined(CONFIG_KVM)
- uint64_t one_reg_id,
-#endif
- target_ulong initial_value)
+static void _spr_register(CPUPPCState *env, int num, const char *name,
+ USR_ARG(spr_callback *uea_read)
+ USR_ARG(spr_callback *uea_write)
+ SYS_ARG(spr_callback *oea_read)
+ SYS_ARG(spr_callback *oea_write)
+ SYS_ARG(spr_callback *hea_read)
+ SYS_ARG(spr_callback *hea_write)
+ KVM_ARG(uint64_t one_reg_id)
+ target_ulong initial_value)
{
- ppc_spr_t *spr;
+ ppc_spr_t *spr = &env->spr_cb[num];
+
+ /* No SPR should be registered twice. */
+ assert(spr->name == NULL);
+ assert(name != NULL);
- spr = &env->spr_cb[num];
- if (spr->name != NULL || env->spr[num] != 0x00000000 ||
-#if !defined(CONFIG_USER_ONLY)
- spr->oea_read != NULL || spr->oea_write != NULL ||
-#endif
- spr->uea_read != NULL || spr->uea_write != NULL) {
- printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);
- exit(1);
- }
-#if defined(PPC_DEBUG_SPR)
- printf("*** register spr %d (%03x) %s val " TARGET_FMT_lx "\n", num, num,
- name, initial_value);
-#endif
spr->name = name;
+ spr->default_value = initial_value;
+ env->spr[num] = initial_value;
+
+#ifdef CONFIG_TCG
spr->uea_read = uea_read;
spr->uea_write = uea_write;
-#if !defined(CONFIG_USER_ONLY)
+# ifndef CONFIG_USER_ONLY
spr->oea_read = oea_read;
spr->oea_write = oea_write;
spr->hea_read = hea_read;
spr->hea_write = hea_write;
+# endif
#endif
-#if defined(CONFIG_KVM)
- spr->one_reg_id = one_reg_id,
-#endif
- env->spr[num] = spr->default_value = initial_value;
-}
+#ifdef CONFIG_KVM
+ spr->one_reg_id = one_reg_id;
+#endif
+}
+
+/* spr_register_kvm_hv passes all required arguments. */
+#define spr_register_kvm_hv(env, num, name, uea_read, uea_write, \
+ oea_read, oea_write, hea_read, hea_write, \
+ one_reg_id, initial_value) \
+ _spr_register(env, num, name, \
+ USR_ARG(uea_read) USR_ARG(uea_write) \
+ SYS_ARG(oea_read) SYS_ARG(oea_write) \
+ SYS_ARG(hea_read) SYS_ARG(hea_write) \
+ KVM_ARG(one_reg_id) initial_value)
+
+/* spr_register_kvm duplicates the oea callbacks to the hea callbacks. */
+#define spr_register_kvm(env, num, name, uea_read, uea_write, \
+ oea_read, oea_write, one_reg_id, ival) \
+ spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read, \
+ oea_write, oea_read, oea_write, one_reg_id, ival)
+
+/* spr_register_hv and spr_register are similar, except there is no kvm id. */
+#define spr_register_hv(env, num, name, uea_read, uea_write, \
+ oea_read, oea_write, hea_read, hea_write, ival) \
+ spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read, \
+ oea_write, hea_read, hea_write, 0, ival)
+
+#define spr_register(env, num, name, uea_read, uea_write, \
+ oea_read, oea_write, ival) \
+ spr_register_kvm(env, num, name, uea_read, uea_write, \
+ oea_read, oea_write, 0, ival)
/* Generic PowerPC SPRs */
static void gen_spr_generic(CPUPPCState *env)
--
2.31.1
- [PULL 30/46] docs/system: ppc: Add documentation for ppce500 machine, (continued)
- [PULL 30/46] docs/system: ppc: Add documentation for ppce500 machine, David Gibson, 2021/05/04
- [PULL 29/46] roms/u-boot: Bump ppce500 u-boot to v2021.04 to fix broken pci support, David Gibson, 2021/05/04
- [PULL 32/46] target/ppc: POWER10 supports scv, David Gibson, 2021/05/04
- [PULL 35/46] spapr.h: increase FDT_MAX_SIZE, David Gibson, 2021/05/04
- [PULL 36/46] spapr_drc.c: handle hotunplug errors in drc_unisolate_logical(), David Gibson, 2021/05/04
- [PULL 39/46] target/ppc: rework AIL logic in interrupt delivery, David Gibson, 2021/05/04
- [PULL 38/46] target/ppc: move opcode table logic to translate.c, David Gibson, 2021/05/04
- [PULL 37/46] target/ppc: code motion from translate_init.c.inc to gdbstub.c, David Gibson, 2021/05/04
- [PULL 40/46] target/ppc: Add POWER10 exception model, David Gibson, 2021/05/04
- [PULL 44/46] hw/intc/spapr_xive: Use device_cold_reset() instead of device_legacy_reset(), David Gibson, 2021/05/04
- [PULL 41/46] target/ppc: Clean up _spr_register et al,
David Gibson <=
- [PULL 42/46] target/ppc: Reduce the size of ppc_spr_t, David Gibson, 2021/05/04
- [PULL 43/46] target/ppc: removed VSCR from SPR registration, David Gibson, 2021/05/04
- [PULL 45/46] hw/ppc/spapr_vio: Reset TCE table object with device_cold_reset(), David Gibson, 2021/05/04
- [PULL 46/46] hw/ppc/pnv_psi: Use device_cold_reset() instead of device_legacy_reset(), David Gibson, 2021/05/04
- Re: [PULL 00/46] ppc-for-6.1 queue 20210504, Peter Maydell, 2021/05/06