All of lore.kernel.org
 help / color / mirror / Atom feed
From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>
Subject: [PATCH v7 45/64] target/nios2: Introduce dest_gpr
Date: Thu, 21 Apr 2022 08:17:16 -0700	[thread overview]
Message-ID: <20220421151735.31996-46-richard.henderson@linaro.org> (raw)
In-Reply-To: <20220421151735.31996-1-richard.henderson@linaro.org>

Constrain all references to cpu_R[] to load_gpr and dest_gpr.
This will be required for supporting shadow register sets.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 target/nios2/translate.c | 144 +++++++++++++--------------------------
 1 file changed, 49 insertions(+), 95 deletions(-)

diff --git a/target/nios2/translate.c b/target/nios2/translate.c
index 74672101ca..98efb4e10a 100644
--- a/target/nios2/translate.c
+++ b/target/nios2/translate.c
@@ -122,6 +122,7 @@ typedef struct DisasContext {
     DisasContextBase  base;
     target_ulong      pc;
     int               mem_idx;
+    TCGv              sink;
     const ControlRegState *cr_state;
 } DisasContext;
 
@@ -154,6 +155,18 @@ static TCGv load_gpr(DisasContext *dc, unsigned reg)
     return cpu_R[reg];
 }
 
+static TCGv dest_gpr(DisasContext *dc, unsigned reg)
+{
+    assert(reg < NUM_GP_REGS);
+    if (unlikely(reg == R_ZERO)) {
+        if (dc->sink == NULL) {
+            dc->sink = tcg_temp_new();
+        }
+        return dc->sink;
+    }
+    return cpu_R[reg];
+}
+
 static void t_gen_helper_raise_exception(DisasContext *dc,
                                          uint32_t index)
 {
@@ -212,7 +225,7 @@ static void jmpi(DisasContext *dc, uint32_t code, uint32_t flags)
 
 static void call(DisasContext *dc, uint32_t code, uint32_t flags)
 {
-    tcg_gen_movi_tl(cpu_R[R_RA], dc->base.pc_next);
+    tcg_gen_movi_tl(dest_gpr(dc, R_RA), dc->base.pc_next);
     jmpi(dc, code, flags);
 }
 
@@ -225,27 +238,10 @@ static void gen_ldx(DisasContext *dc, uint32_t code, uint32_t flags)
     I_TYPE(instr, code);
 
     TCGv addr = tcg_temp_new();
-    TCGv data;
-
-    /*
-     * WARNING: Loads into R_ZERO are ignored, but we must generate the
-     *          memory access itself to emulate the CPU precisely. Load
-     *          from a protected page to R_ZERO will cause SIGSEGV on
-     *          the Nios2 CPU.
-     */
-    if (likely(instr.b != R_ZERO)) {
-        data = cpu_R[instr.b];
-    } else {
-        data = tcg_temp_new();
-    }
+    TCGv data = dest_gpr(dc, instr.b);
 
     tcg_gen_addi_tl(addr, load_gpr(dc, instr.a), instr.imm16.s);
     tcg_gen_qemu_ld_tl(data, addr, dc->mem_idx, flags);
-
-    if (unlikely(instr.b == R_ZERO)) {
-        tcg_temp_free(data);
-    }
-
     tcg_temp_free(addr);
 }
 
@@ -275,7 +271,7 @@ static void gen_bxx(DisasContext *dc, uint32_t code, uint32_t flags)
     I_TYPE(instr, code);
 
     TCGLabel *l1 = gen_new_label();
-    tcg_gen_brcond_tl(flags, cpu_R[instr.a], cpu_R[instr.b], l1);
+    tcg_gen_brcond_tl(flags, load_gpr(dc, instr.a), load_gpr(dc, instr.b), l1);
     gen_goto_tb(dc, 0, dc->base.pc_next);
     gen_set_label(l1);
     gen_goto_tb(dc, 1, dc->base.pc_next + (instr.imm16.s & -4));
@@ -287,11 +283,8 @@ static void do_i_cmpxx(DisasContext *dc, uint32_t insn, TCGCond cond,
                        target_ulong (*imm)(const InstrIType *))
 {
     I_TYPE(instr, insn);
-
-    if (likely(instr.b != R_ZERO)) {
-        tcg_gen_setcondi_tl(cond, cpu_R[instr.b],
-                            load_gpr(dc, instr.a), imm(&instr));
-    }
+    tcg_gen_setcondi_tl(cond, dest_gpr(dc, instr.b),
+                        load_gpr(dc, instr.a), imm(&instr));
 }
 
 #define gen_i_cmpxx(fname, imm)                                             \
@@ -319,9 +312,9 @@ static void do_i_math_logic(DisasContext *dc, uint32_t insn,
 
     if (instr.a == R_ZERO) {
         /* This catches the canonical expansions of movi and movhi. */
-        tcg_gen_movi_tl(cpu_R[instr.b], x_op_0_eq_x ? val : 0);
+        tcg_gen_movi_tl(dest_gpr(dc, instr.b), x_op_0_eq_x ? val : 0);
     } else {
-        fn(cpu_R[instr.b], cpu_R[instr.a], val);
+        fn(dest_gpr(dc, instr.b), load_gpr(dc, instr.a), val);
     }
 }
 
@@ -429,7 +422,7 @@ static void eret(DisasContext *dc, uint32_t code, uint32_t flags)
 #else
     TCGv tmp = tcg_temp_new();
     tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPUNios2State, ctrl[CR_ESTATUS]));
-    gen_helper_eret(cpu_env, tmp, cpu_R[R_EA]);
+    gen_helper_eret(cpu_env, tmp, load_gpr(dc, R_EA));
     tcg_temp_free(tmp);
 
     dc->base.is_jmp = DISAS_NORETURN;
@@ -439,8 +432,7 @@ static void eret(DisasContext *dc, uint32_t code, uint32_t flags)
 /* PC <- ra */
 static void ret(DisasContext *dc, uint32_t code, uint32_t flags)
 {
-    tcg_gen_mov_tl(cpu_pc, cpu_R[R_RA]);
-
+    tcg_gen_mov_tl(cpu_pc, load_gpr(dc, R_RA));
     dc->base.is_jmp = DISAS_JUMP;
 }
 
@@ -459,7 +451,7 @@ static void bret(DisasContext *dc, uint32_t code, uint32_t flags)
 #else
     TCGv tmp = tcg_temp_new();
     tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPUNios2State, ctrl[CR_BSTATUS]));
-    gen_helper_eret(cpu_env, tmp, cpu_R[R_BA]);
+    gen_helper_eret(cpu_env, tmp, load_gpr(dc, R_BA));
     tcg_temp_free(tmp);
 
     dc->base.is_jmp = DISAS_NORETURN;
@@ -472,7 +464,6 @@ static void jmp(DisasContext *dc, uint32_t code, uint32_t flags)
     R_TYPE(instr, code);
 
     tcg_gen_mov_tl(cpu_pc, load_gpr(dc, instr.a));
-
     dc->base.is_jmp = DISAS_JUMP;
 }
 
@@ -481,9 +472,7 @@ static void nextpc(DisasContext *dc, uint32_t code, uint32_t flags)
 {
     R_TYPE(instr, code);
 
-    if (likely(instr.c != R_ZERO)) {
-        tcg_gen_movi_tl(cpu_R[instr.c], dc->base.pc_next);
-    }
+    tcg_gen_movi_tl(dest_gpr(dc, instr.c), dc->base.pc_next);
 }
 
 /*
@@ -495,7 +484,7 @@ static void callr(DisasContext *dc, uint32_t code, uint32_t flags)
     R_TYPE(instr, code);
 
     tcg_gen_mov_tl(cpu_pc, load_gpr(dc, instr.a));
-    tcg_gen_movi_tl(cpu_R[R_RA], dc->base.pc_next);
+    tcg_gen_movi_tl(dest_gpr(dc, R_RA), dc->base.pc_next);
 
     dc->base.is_jmp = DISAS_JUMP;
 }
@@ -511,15 +500,11 @@ static void rdctl(DisasContext *dc, uint32_t code, uint32_t flags)
     g_assert_not_reached();
 #else
     R_TYPE(instr, code);
-    TCGv t1, t2;
-
-    if (unlikely(instr.c == R_ZERO)) {
-        return;
-    }
+    TCGv t1, t2, dest = dest_gpr(dc, instr.c);
 
     /* Reserved registers read as zero. */
     if (nios2_cr_reserved(&dc->cr_state[instr.imm5])) {
-        tcg_gen_movi_tl(cpu_R[instr.c], 0);
+        tcg_gen_movi_tl(dest, 0);
         return;
     }
 
@@ -537,12 +522,12 @@ static void rdctl(DisasContext *dc, uint32_t code, uint32_t flags)
         t2 = tcg_temp_new();
         tcg_gen_ld_tl(t1, cpu_env, offsetof(CPUNios2State, ctrl[CR_IPENDING]));
         tcg_gen_ld_tl(t2, cpu_env, offsetof(CPUNios2State, ctrl[CR_IENABLE]));
-        tcg_gen_and_tl(cpu_R[instr.c], t1, t2);
+        tcg_gen_and_tl(dest, t1, t2);
         tcg_temp_free(t1);
         tcg_temp_free(t2);
         break;
     default:
-        tcg_gen_ld_tl(cpu_R[instr.c], cpu_env,
+        tcg_gen_ld_tl(dest, cpu_env,
                       offsetof(CPUNios2State, ctrl[instr.imm5]));
         break;
     }
@@ -618,10 +603,8 @@ static void wrctl(DisasContext *dc, uint32_t code, uint32_t flags)
 static void gen_cmpxx(DisasContext *dc, uint32_t code, uint32_t flags)
 {
     R_TYPE(instr, code);
-    if (likely(instr.c != R_ZERO)) {
-        tcg_gen_setcond_tl(flags, cpu_R[instr.c], cpu_R[instr.a],
-                           cpu_R[instr.b]);
-    }
+    tcg_gen_setcond_tl(flags, dest_gpr(dc, instr.c),
+                       load_gpr(dc, instr.a), load_gpr(dc, instr.b));
 }
 
 /* Math/logic instructions */
@@ -629,20 +612,14 @@ static void do_ri_math_logic(DisasContext *dc, uint32_t insn,
                              void (*fn)(TCGv, TCGv, int32_t))
 {
     R_TYPE(instr, insn);
-
-    if (likely(instr.c != R_ZERO)) {
-        fn(cpu_R[instr.c], load_gpr(dc, instr.a), instr.imm5);
-    }
+    fn(dest_gpr(dc, instr.c), load_gpr(dc, instr.a), instr.imm5);
 }
 
 static void do_rr_math_logic(DisasContext *dc, uint32_t insn,
                              void (*fn)(TCGv, TCGv, TCGv))
 {
     R_TYPE(instr, insn);
-
-    if (likely(instr.c != R_ZERO)) {
-        fn(cpu_R[instr.c], load_gpr(dc, instr.a), load_gpr(dc, instr.b));
-    }
+    fn(dest_gpr(dc, instr.c), load_gpr(dc, instr.a), load_gpr(dc, instr.b));
 }
 
 #define gen_ri_math_logic(fname, insn)                                      \
@@ -671,13 +648,11 @@ static void do_rr_mul_high(DisasContext *dc, uint32_t insn,
                            void (*fn)(TCGv, TCGv, TCGv, TCGv))
 {
     R_TYPE(instr, insn);
+    TCGv discard = tcg_temp_new();
 
-    if (likely(instr.c != R_ZERO)) {
-        TCGv discard = tcg_temp_new();
-        fn(discard, cpu_R[instr.c], load_gpr(dc, instr.a),
-           load_gpr(dc, instr.b));
-        tcg_temp_free(discard);
-    }
+    fn(discard, dest_gpr(dc, instr.c),
+       load_gpr(dc, instr.a), load_gpr(dc, instr.b));
+    tcg_temp_free(discard);
 }
 
 #define gen_rr_mul_high(fname, insn)                                        \
@@ -692,14 +667,11 @@ static void do_rr_shift(DisasContext *dc, uint32_t insn,
                         void (*fn)(TCGv, TCGv, TCGv))
 {
     R_TYPE(instr, insn);
+    TCGv sh = tcg_temp_new();
 
-    if (likely(instr.c != R_ZERO)) {
-        TCGv sh = tcg_temp_new();
-
-        tcg_gen_andi_tl(sh, load_gpr(dc, instr.b), 31);
-        fn(cpu_R[instr.c], load_gpr(dc, instr.a), sh);
-        tcg_temp_free(sh);
-    }
+    tcg_gen_andi_tl(sh, load_gpr(dc, instr.b), 31);
+    fn(dest_gpr(dc, instr.c), load_gpr(dc, instr.a), sh);
+    tcg_temp_free(sh);
 }
 
 #define gen_rr_shift(fname, insn)                                           \
@@ -715,39 +687,15 @@ gen_rr_shift(ror, rotr)
 static void divs(DisasContext *dc, uint32_t code, uint32_t flags)
 {
     R_TYPE(instr, (code));
-    TCGv dest;
-
-    if (instr.c == R_ZERO) {
-        dest = tcg_temp_new();
-    } else {
-        dest = cpu_R[instr.c];
-    }
-
-    gen_helper_divs(dest, cpu_env,
+    gen_helper_divs(dest_gpr(dc, instr.c), cpu_env,
                     load_gpr(dc, instr.a), load_gpr(dc, instr.b));
-
-    if (instr.c == R_ZERO) {
-        tcg_temp_free(dest);
-    }
 }
 
 static void divu(DisasContext *dc, uint32_t code, uint32_t flags)
 {
     R_TYPE(instr, (code));
-    TCGv dest;
-
-    if (instr.c == R_ZERO) {
-        dest = tcg_temp_new();
-    } else {
-        dest = cpu_R[instr.c];
-    }
-
-    gen_helper_divu(dest, cpu_env,
+    gen_helper_divu(dest_gpr(dc, instr.c), cpu_env,
                     load_gpr(dc, instr.a), load_gpr(dc, instr.b));
-
-    if (instr.c == R_ZERO) {
-        tcg_temp_free(dest);
-    }
 }
 
 static void trap(DisasContext *dc, uint32_t code, uint32_t flags)
@@ -937,8 +885,14 @@ static void nios2_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
         return;
     }
 
+    dc->sink = NULL;
+
     instr = &i_type_instructions[op];
     instr->handler(dc, code, instr->flags);
+
+    if (dc->sink) {
+        tcg_temp_free(dc->sink);
+    }
 }
 
 static void nios2_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
-- 
2.34.1



  parent reply	other threads:[~2022-04-21 16:18 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-21 15:16 [PATCH v7 00/64] nios2 fixes, cleanups, shadow reg sets Richard Henderson
2022-04-21 15:16 ` [PATCH v7 01/64] linux-user/nios2: Hoist pc advance to the top of EXCP_TRAP Richard Henderson
2022-04-21 15:16 ` [PATCH v7 02/64] linux-user/nios2: Fix clone child return Richard Henderson
2022-04-21 15:16 ` [PATCH v7 03/64] linux-user/nios2: Drop syscall 0 "workaround" Richard Henderson
2022-04-21 15:16 ` [PATCH v7 04/64] linux-user/nios2: Adjust error return Richard Henderson
2022-04-21 15:16 ` [PATCH v7 05/64] linux-user/nios2: Handle special qemu syscall return values Richard Henderson
2022-04-21 15:16 ` [PATCH v7 06/64] linux-user/nios2: Remove do_sigreturn Richard Henderson
2022-04-21 15:16 ` [PATCH v7 07/64] linux-user/nios2: Use QEMU_ESIGRETURN from do_rt_sigreturn Richard Henderson
2022-04-21 15:16 ` [PATCH v7 08/64] tests/tcg/nios2: Re-enable linux-user tests Richard Henderson
2022-04-21 15:16 ` [PATCH v7 09/64] target/nios2: Remove user-only nios2_cpu_do_interrupt Richard Henderson
2022-04-22 12:51   ` Peter Maydell
2022-04-21 15:16 ` [PATCH v7 10/64] target/nios2: Remove nios2_cpu_record_sigsegv Richard Henderson
2022-04-22 12:53   ` Peter Maydell
2022-04-21 15:16 ` [PATCH v7 11/64] target/nios2: Build helper.c for system only Richard Henderson
2022-04-22 12:54   ` Peter Maydell
2022-04-21 15:16 ` [PATCH v7 12/64] linux-user/nios2: Use force_sig_fault for EXCP_DEBUG Richard Henderson
2022-04-22 12:54   ` Peter Maydell
2022-04-21 15:16 ` [PATCH v7 13/64] target/nios2: Check supervisor on eret Richard Henderson
2022-04-21 15:16 ` [PATCH v7 14/64] target/nios2: Stop generating code if gen_check_supervisor fails Richard Henderson
2022-04-21 15:16 ` [PATCH v7 15/64] target/nios2: Add NUM_GP_REGS and NUM_CP_REGS Richard Henderson
2022-04-21 15:16 ` [PATCH v7 16/64] target/nios2: Split PC out of env->regs[] Richard Henderson
2022-04-21 15:16 ` [PATCH v7 17/64] target/nios2: Split out helper for eret instruction Richard Henderson
2022-04-21 15:16 ` [PATCH v7 18/64] target/nios2: Fix BRET instruction Richard Henderson
2022-04-21 15:16 ` [PATCH v7 19/64] target/nios2: Do not create TCGv for control registers Richard Henderson
2022-04-21 15:16 ` [PATCH v7 20/64] linux-user/nios2: Only initialize SP and PC in target_cpu_copy_regs Richard Henderson
2022-04-21 15:16 ` [PATCH v7 21/64] target/nios2: Remove cpu_interrupts_enabled Richard Henderson
2022-04-21 15:16 ` [PATCH v7 22/64] target/nios2: Split control registers away from general registers Richard Henderson
2022-04-21 15:16 ` [PATCH v7 23/64] target/nios2: Clean up nios2_cpu_dump_state Richard Henderson
2022-04-21 15:16 ` [PATCH v7 24/64] target/nios2: Use hw/registerfields.h for CR_STATUS fields Richard Henderson
2022-04-21 15:16 ` [PATCH v7 25/64] target/nios2: Use hw/registerfields.h for CR_EXCEPTION fields Richard Henderson
2022-04-21 15:16 ` [PATCH v7 26/64] target/nios2: Use hw/registerfields.h for CR_TLBADDR fields Richard Henderson
2022-04-21 15:16 ` [PATCH v7 27/64] target/nios2: Use hw/registerfields.h for CR_TLBACC fields Richard Henderson
2022-04-21 15:16 ` [PATCH v7 28/64] target/nios2: Rename CR_TLBMISC_WR to CR_TLBMISC_WE Richard Henderson
2022-04-21 15:17 ` [PATCH v7 29/64] target/nios2: Use hw/registerfields.h for CR_TLBMISC fields Richard Henderson
2022-04-21 15:17 ` [PATCH v7 30/64] target/nios2: Move R_FOO and CR_BAR into enumerations Richard Henderson
2022-04-21 15:17 ` [PATCH v7 31/64] target/nios2: Create EXCP_SEMIHOST for semi-hosting Richard Henderson
2022-04-21 15:17 ` [PATCH v7 32/64] target/nios2: Clean up nios2_cpu_do_interrupt Richard Henderson
2022-04-21 15:17 ` [PATCH v7 33/64] target/nios2: Hoist CPU_LOG_INT logging Richard Henderson
2022-04-21 15:17 ` [PATCH v7 34/64] target/nios2: Handle EXCP_UNALIGN and EXCP_UALIGND Richard Henderson
2022-04-22 12:56   ` Peter Maydell
2022-04-21 15:17 ` [PATCH v7 35/64] target/nios2: Cleanup set of CR_EXCEPTION for do_interrupt Richard Henderson
2022-04-21 15:17 ` [PATCH v7 36/64] target/nios2: Clean up handling of tlbmisc in do_exception Richard Henderson
2022-04-21 15:17 ` [PATCH v7 37/64] target/nios2: Prevent writes to read-only or reserved control fields Richard Henderson
2022-04-22 12:56   ` Peter Maydell
2022-04-21 15:17 ` [PATCH v7 38/64] target/nios2: Implement cpuid Richard Henderson
2022-04-21 15:17 ` [PATCH v7 39/64] target/nios2: Implement CR_STATUS.RSIE Richard Henderson
2022-04-21 15:17 ` [PATCH v7 40/64] target/nios2: Remove CPU_INTERRUPT_NMI Richard Henderson
2022-04-21 15:17 ` [PATCH v7 41/64] target/nios2: Support division error exception Richard Henderson
2022-04-21 15:17 ` [PATCH v7 42/64] target/nios2: Use tcg_constant_tl Richard Henderson
2022-04-21 15:17 ` [PATCH v7 43/64] target/nios2: Split out named structs for [IRJ]_TYPE Richard Henderson
2022-04-22 12:57   ` Peter Maydell
2022-04-21 15:17 ` [PATCH v7 44/64] target/nios2: Split out helpers for gen_* translate macros Richard Henderson
2022-04-22 13:16   ` Peter Maydell
2022-04-21 15:17 ` Richard Henderson [this message]
2022-04-21 15:17 ` [PATCH v7 46/64] target/nios2: Drop CR_STATUS_EH from tb->flags Richard Henderson
2022-04-21 15:17 ` [PATCH v7 47/64] target/nios2: Enable unaligned traps for system mode Richard Henderson
2022-04-21 15:17 ` [PATCH v7 48/64] target/nios2: Create gen_jumpr Richard Henderson
2022-04-21 15:17 ` [PATCH v7 49/64] target/nios2: Hoist set of is_jmp into gen_goto_tb Richard Henderson
2022-04-21 15:17 ` [PATCH v7 50/64] target/nios2: Use gen_goto_tb for DISAS_TOO_MANY Richard Henderson
2022-04-21 15:17 ` [PATCH v7 51/64] target/nios2: Use tcg_gen_lookup_and_goto_ptr Richard Henderson
2022-04-21 15:17 ` [PATCH v7 52/64] target/nios2: Implement Misaligned destination exception Richard Henderson
2022-04-21 15:17 ` [PATCH v7 53/64] target/nios2: Introduce shadow register sets Richard Henderson
2022-04-22 13:21   ` Peter Maydell
2022-04-21 15:17 ` [PATCH v7 54/64] target/nios2: Implement rdprs, wrprs Richard Henderson
2022-04-21 15:17 ` [PATCH v7 55/64] target/nios2: Update helper_eret for shadow registers Richard Henderson
2022-04-21 15:17 ` [PATCH v7 56/64] target/nios2: Implement EIC interrupt processing Richard Henderson
2022-04-22 13:24   ` Peter Maydell
2022-04-21 15:17 ` [PATCH v7 57/64] target/nios2: Advance pc when raising exceptions Richard Henderson
2022-04-22 13:00   ` Peter Maydell
2022-04-21 15:17 ` [PATCH v7 58/64] linux-user/nios2: Handle various SIGILL exceptions Richard Henderson
2022-04-21 15:17 ` [PATCH v7 59/64] hw/intc: Vectored Interrupt Controller (VIC) Richard Henderson
2022-04-21 15:17 ` [PATCH v7 60/64] hw/nios2: Introduce Nios2MachineState Richard Henderson
2022-04-21 15:17 ` [PATCH v7 61/64] hw/nios2: Move memory regions into Nios2Machine Richard Henderson
2022-04-21 15:17 ` [PATCH v7 62/64] hw/nios2: Machine with a Vectored Interrupt Controller Richard Henderson
2022-04-21 15:17 ` [PATCH v7 63/64] tests/tcg/nios2: Add semihosting multiarch tests Richard Henderson
2022-04-22 13:26   ` Peter Maydell
2022-04-21 15:17 ` [PATCH v7 64/64] tests/tcg/nios2: Add test-shadow-1 Richard Henderson
2022-04-22 13:26   ` Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220421151735.31996-46-richard.henderson@linaro.org \
    --to=richard.henderson@linaro.org \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.