All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Vivier <laurent@vivier.eu>
To: qemu-devel@nongnu.org
Cc: Richard Henderson <richard.henderson@linaro.org>,
	Laurent Vivier <laurent@vivier.eu>
Subject: [PULL 09/59] linux-user: Use target_restore_altstack in all sigreturn
Date: Mon, 17 May 2021 20:13:34 +0200	[thread overview]
Message-ID: <20210517181424.8093-10-laurent@vivier.eu> (raw)
In-Reply-To: <20210517181424.8093-1-laurent@vivier.eu>

From: Richard Henderson <richard.henderson@linaro.org>

Note that target_restore_altstack uses the host memory
pointer that we have already verified, so TARGET_EFAULT
is not a possible return value.

Note that using -EFAULT was a bug.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20210426025334.1168495-3-richard.henderson@linaro.org>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
 linux-user/aarch64/signal.c    | 6 +-----
 linux-user/alpha/signal.c      | 6 +-----
 linux-user/arm/signal.c        | 9 ++-------
 linux-user/hexagon/signal.c    | 6 +-----
 linux-user/hppa/signal.c       | 8 +-------
 linux-user/i386/signal.c       | 5 +----
 linux-user/m68k/signal.c       | 5 +----
 linux-user/microblaze/signal.c | 6 +-----
 linux-user/mips/signal.c       | 6 +-----
 linux-user/nios2/signal.c      | 8 +-------
 linux-user/openrisc/signal.c   | 5 +----
 linux-user/ppc/signal.c        | 4 +---
 linux-user/riscv/signal.c      | 6 +-----
 linux-user/s390x/signal.c      | 6 ++----
 linux-user/sh4/signal.c        | 7 +------
 linux-user/xtensa/signal.c     | 6 +-----
 16 files changed, 18 insertions(+), 81 deletions(-)

diff --git a/linux-user/aarch64/signal.c b/linux-user/aarch64/signal.c
index b591790c22ed..2a1b7dbcdc2b 100644
--- a/linux-user/aarch64/signal.c
+++ b/linux-user/aarch64/signal.c
@@ -561,11 +561,7 @@ long do_rt_sigreturn(CPUARMState *env)
         goto badframe;
     }
 
-    if (do_sigaltstack(frame_addr +
-            offsetof(struct target_rt_sigframe, uc.tuc_stack),
-            0, get_sp_from_cpustate(env)) == -EFAULT) {
-        goto badframe;
-    }
+    target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
 
     unlock_user_struct(frame, frame_addr, 0);
     return -TARGET_QEMU_ESIGRETURN;
diff --git a/linux-user/alpha/signal.c b/linux-user/alpha/signal.c
index c5c27ce08419..0af022711815 100644
--- a/linux-user/alpha/signal.c
+++ b/linux-user/alpha/signal.c
@@ -257,11 +257,7 @@ long do_rt_sigreturn(CPUAlphaState *env)
     set_sigmask(&set);
 
     restore_sigcontext(env, &frame->uc.tuc_mcontext);
-    if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe,
-                                             uc.tuc_stack),
-                       0, env->ir[IR_SP]) == -EFAULT) {
-        goto badframe;
-    }
+    target_restore_altstack(&frame->uc.tuc_stack, env->ir[IR_SP]);
 
     unlock_user_struct(frame, frame_addr, 0);
     return -TARGET_QEMU_ESIGRETURN;
diff --git a/linux-user/arm/signal.c b/linux-user/arm/signal.c
index f21d1535e4d9..b7a772302f45 100644
--- a/linux-user/arm/signal.c
+++ b/linux-user/arm/signal.c
@@ -685,11 +685,7 @@ static int do_sigframe_return_v2(CPUARMState *env,
         }
     }
 
-    if (do_sigaltstack(context_addr
-                       + offsetof(struct target_ucontext_v2, tuc_stack),
-                       0, get_sp_from_cpustate(env)) == -EFAULT) {
-        return 1;
-    }
+    target_restore_altstack(&uc->tuc_stack, get_sp_from_cpustate(env));
 
 #if 0
     /* Send SIGTRAP if we're single-stepping */
@@ -773,8 +769,7 @@ static long do_rt_sigreturn_v1(CPUARMState *env)
         goto badframe;
     }
 
-    if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe_v1, uc.tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
-        goto badframe;
+    target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
 
 #if 0
     /* Send SIGTRAP if we're single-stepping */
diff --git a/linux-user/hexagon/signal.c b/linux-user/hexagon/signal.c
index fde8dc93b7a6..3854eb4709be 100644
--- a/linux-user/hexagon/signal.c
+++ b/linux-user/hexagon/signal.c
@@ -260,11 +260,7 @@ long do_rt_sigreturn(CPUHexagonState *env)
     }
 
     restore_ucontext(env, &frame->uc);
-
-    if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe,
-            uc.uc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT) {
-        goto badframe;
-    }
+    target_restore_altstack(&frame->uc.uc_stack, get_sp_from_cpustate(env));
 
     unlock_user_struct(frame, frame_addr, 0);
     return -TARGET_QEMU_ESIGRETURN;
diff --git a/linux-user/hppa/signal.c b/linux-user/hppa/signal.c
index d1a58feeb36f..578874cf27e6 100644
--- a/linux-user/hppa/signal.c
+++ b/linux-user/hppa/signal.c
@@ -187,13 +187,7 @@ long do_rt_sigreturn(CPUArchState *env)
     set_sigmask(&set);
 
     restore_sigcontext(env, &frame->uc.tuc_mcontext);
-    unlock_user_struct(frame, frame_addr, 0);
-
-    if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe,
-                                             uc.tuc_stack),
-                       0, env->gr[30]) == -EFAULT) {
-        goto badframe;
-    }
+    target_restore_altstack(&frame->uc.tuc_stack, env->gr[30]);
 
     unlock_user_struct(frame, frame_addr, 0);
     return -TARGET_QEMU_ESIGRETURN;
diff --git a/linux-user/i386/signal.c b/linux-user/i386/signal.c
index 9320e1d47267..3a0a1546a63e 100644
--- a/linux-user/i386/signal.c
+++ b/linux-user/i386/signal.c
@@ -581,10 +581,7 @@ long do_rt_sigreturn(CPUX86State *env)
         goto badframe;
     }
 
-    if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe, uc.tuc_stack), 0,
-                       get_sp_from_cpustate(env)) == -EFAULT) {
-        goto badframe;
-    }
+    target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
 
     unlock_user_struct(frame, frame_addr, 0);
     return -TARGET_QEMU_ESIGRETURN;
diff --git a/linux-user/m68k/signal.c b/linux-user/m68k/signal.c
index 49ff87c77bce..004b59fb6118 100644
--- a/linux-user/m68k/signal.c
+++ b/linux-user/m68k/signal.c
@@ -400,10 +400,7 @@ long do_rt_sigreturn(CPUM68KState *env)
     if (target_rt_restore_ucontext(env, &frame->uc))
         goto badframe;
 
-    if (do_sigaltstack(frame_addr +
-                       offsetof(struct target_rt_sigframe, uc.tuc_stack),
-                       0, get_sp_from_cpustate(env)) == -EFAULT)
-        goto badframe;
+    target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
 
     unlock_user_struct(frame, frame_addr, 0);
     return -TARGET_QEMU_ESIGRETURN;
diff --git a/linux-user/microblaze/signal.c b/linux-user/microblaze/signal.c
index cf0707b5564b..f59a1faf47bb 100644
--- a/linux-user/microblaze/signal.c
+++ b/linux-user/microblaze/signal.c
@@ -209,11 +209,7 @@ long do_rt_sigreturn(CPUMBState *env)
 
     restore_sigcontext(&frame->uc.tuc_mcontext, env);
 
-    if (do_sigaltstack(frame_addr +
-                       offsetof(struct target_rt_sigframe, uc.tuc_stack),
-                       0, get_sp_from_cpustate(env)) == -EFAULT) {
-        goto badframe;
-    }
+    target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
 
     unlock_user_struct(frame, frame_addr, 0);
     return -TARGET_QEMU_ESIGRETURN;
diff --git a/linux-user/mips/signal.c b/linux-user/mips/signal.c
index 455a8a229a83..456fa64f41cd 100644
--- a/linux-user/mips/signal.c
+++ b/linux-user/mips/signal.c
@@ -368,11 +368,7 @@ long do_rt_sigreturn(CPUMIPSState *env)
     set_sigmask(&blocked);
 
     restore_sigcontext(env, &frame->rs_uc.tuc_mcontext);
-
-    if (do_sigaltstack(frame_addr +
-                       offsetof(struct target_rt_sigframe, rs_uc.tuc_stack),
-                       0, get_sp_from_cpustate(env)) == -EFAULT)
-        goto badframe;
+    target_restore_altstack(&frame->rs_uc.tuc_stack, get_sp_from_cpustate(env));
 
     env->active_tc.PC = env->CP0_EPC;
     mips_set_hflags_isa_mode_from_pc(env);
diff --git a/linux-user/nios2/signal.c b/linux-user/nios2/signal.c
index 7d535065ed98..751ea88811f8 100644
--- a/linux-user/nios2/signal.c
+++ b/linux-user/nios2/signal.c
@@ -82,9 +82,7 @@ static int rt_restore_ucontext(CPUNios2State *env, struct target_ucontext *uc,
                                int *pr2)
 {
     int temp;
-    abi_ulong off, frame_addr = env->regs[R_SP];
     unsigned long *gregs = uc->tuc_mcontext.gregs;
-    int err;
 
     /* Always make any pending restarted system calls return -EINTR */
     /* current->restart_block.fn = do_no_restart_syscall; */
@@ -130,11 +128,7 @@ static int rt_restore_ucontext(CPUNios2State *env, struct target_ucontext *uc,
     __get_user(env->regs[R_RA], &gregs[23]);
     __get_user(env->regs[R_SP], &gregs[28]);
 
-    off = offsetof(struct target_rt_sigframe, uc.tuc_stack);
-    err = do_sigaltstack(frame_addr + off, 0, get_sp_from_cpustate(env));
-    if (err == -EFAULT) {
-        return 1;
-    }
+    target_restore_altstack(&uc->tuc_stack, get_sp_from_cpustate(env));
 
     *pr2 = env->regs[2];
     return 0;
diff --git a/linux-user/openrisc/signal.c b/linux-user/openrisc/signal.c
index 232ad82b98be..86f94d7f766d 100644
--- a/linux-user/openrisc/signal.c
+++ b/linux-user/openrisc/signal.c
@@ -158,10 +158,7 @@ long do_rt_sigreturn(CPUOpenRISCState *env)
     set_sigmask(&set);
 
     restore_sigcontext(env, &frame->uc.tuc_mcontext);
-    if (do_sigaltstack(frame_addr + offsetof(target_rt_sigframe, uc.tuc_stack),
-                       0, frame_addr) == -EFAULT) {
-        goto badframe;
-    }
+    target_restore_altstack(&frame->uc.tuc_stack, frame_addr);
 
     unlock_user_struct(frame, frame_addr, 0);
     return cpu_get_gpr(env, 11);
diff --git a/linux-user/ppc/signal.c b/linux-user/ppc/signal.c
index bad38f8ed9b1..b44d5ce73c31 100644
--- a/linux-user/ppc/signal.c
+++ b/linux-user/ppc/signal.c
@@ -655,9 +655,7 @@ long do_rt_sigreturn(CPUPPCState *env)
     if (do_setcontext(&rt_sf->uc, env, 1))
         goto sigsegv;
 
-    do_sigaltstack(rt_sf_addr
-                   + offsetof(struct target_rt_sigframe, uc.tuc_stack),
-                   0, env->gpr[1]);
+    target_restore_altstack(&rt_sf->uc.tuc_stack, env->gpr[1]);
 
     unlock_user_struct(rt_sf, rt_sf_addr, 1);
     return -TARGET_QEMU_ESIGRETURN;
diff --git a/linux-user/riscv/signal.c b/linux-user/riscv/signal.c
index 67a95dbc7b91..81d1129da3d2 100644
--- a/linux-user/riscv/signal.c
+++ b/linux-user/riscv/signal.c
@@ -192,11 +192,7 @@ long do_rt_sigreturn(CPURISCVState *env)
     }
 
     restore_ucontext(env, &frame->uc);
-
-    if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe,
-            uc.uc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT) {
-        goto badframe;
-    }
+    target_restore_altstack(&frame->uc.uc_stack, get_sp_from_cpustate(env));
 
     unlock_user_struct(frame, frame_addr, 0);
     return -TARGET_QEMU_ESIGRETURN;
diff --git a/linux-user/s390x/signal.c b/linux-user/s390x/signal.c
index 7107c5fb5335..73806f547270 100644
--- a/linux-user/s390x/signal.c
+++ b/linux-user/s390x/signal.c
@@ -307,10 +307,8 @@ long do_rt_sigreturn(CPUS390XState *env)
         goto badframe;
     }
 
-    if (do_sigaltstack(frame_addr + offsetof(rt_sigframe, uc.tuc_stack), 0,
-                       get_sp_from_cpustate(env)) == -EFAULT) {
-        goto badframe;
-    }
+    target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
+
     unlock_user_struct(frame, frame_addr, 0);
     return -TARGET_QEMU_ESIGRETURN;
 
diff --git a/linux-user/sh4/signal.c b/linux-user/sh4/signal.c
index 29c1ee30e6d6..684f18da5862 100644
--- a/linux-user/sh4/signal.c
+++ b/linux-user/sh4/signal.c
@@ -323,12 +323,7 @@ long do_rt_sigreturn(CPUSH4State *regs)
     set_sigmask(&blocked);
 
     restore_sigcontext(regs, &frame->uc.tuc_mcontext);
-
-    if (do_sigaltstack(frame_addr +
-                       offsetof(struct target_rt_sigframe, uc.tuc_stack),
-                       0, get_sp_from_cpustate(regs)) == -EFAULT) {
-        goto badframe;
-    }
+    target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(regs));
 
     unlock_user_struct(frame, frame_addr, 0);
     return -TARGET_QEMU_ESIGRETURN;
diff --git a/linux-user/xtensa/signal.c b/linux-user/xtensa/signal.c
index 590f0313ffe9..22ec6cdeb98e 100644
--- a/linux-user/xtensa/signal.c
+++ b/linux-user/xtensa/signal.c
@@ -253,12 +253,8 @@ long do_rt_sigreturn(CPUXtensaState *env)
     set_sigmask(&set);
 
     restore_sigcontext(env, frame);
+    target_restore_altstack(&frame->uc.tuc_stack, get_sp_from_cpustate(env));
 
-    if (do_sigaltstack(frame_addr +
-                       offsetof(struct target_rt_sigframe, uc.tuc_stack),
-                       0, get_sp_from_cpustate(env)) == -TARGET_EFAULT) {
-        goto badframe;
-    }
     unlock_user_struct(frame, frame_addr, 0);
     return -TARGET_QEMU_ESIGRETURN;
 
-- 
2.31.1



  parent reply	other threads:[~2021-05-17 18:31 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-17 18:13 [PULL 00/59] Linux user for 6.1 patches Laurent Vivier
2021-05-17 18:13 ` [PULL 01/59] linux-user: Remove dead code Laurent Vivier
2021-05-17 18:13 ` [PULL 02/59] linux-user: strace now handles unshare syscall args correctly Laurent Vivier
2021-05-17 18:13 ` [PULL 03/59] linux-user/arm: Split out emulate_arm_fpa11 Laurent Vivier
2021-05-17 18:13 ` [PULL 04/59] linux-user/arm: Do not emulate fpa11 in thumb mode Laurent Vivier
2021-05-17 18:13 ` [PULL 05/59] linux-user/arm: Do not fill in si_code for fpa11 exceptions Laurent Vivier
2021-05-17 18:13 ` [PULL 06/59] linux-user/arm: Simplify accumulating and raising " Laurent Vivier
2021-05-17 18:13 ` [PULL 07/59] linux-user: Add strace support for printing arguments of llseek Laurent Vivier
2021-05-17 18:13 ` [PULL 08/59] linux-user: Split out target_restore_altstack Laurent Vivier
2021-05-17 18:13 ` Laurent Vivier [this message]
2021-05-17 18:13 ` [PULL 10/59] linux-user: Pass CPUArchState to do_sigaltstack Laurent Vivier
2021-05-17 18:13 ` [PULL 11/59] linux-user: Pass CPUArchState to target_restore_altstack Laurent Vivier
2021-05-17 18:13 ` [PULL 12/59] linux-user/sparc: Include TARGET_STACK_BIAS in get_sp_from_cpustate Laurent Vivier
2021-05-17 18:13 ` [PULL 13/59] linux-user/sparc: Clean up init_thread Laurent Vivier
2021-05-17 18:13 ` [PULL 14/59] linux-user/sparc: Merge sparc64 target_syscall.h Laurent Vivier
2021-05-17 18:13 ` [PULL 15/59] linux-user/sparc: Merge sparc64 target_elf.h Laurent Vivier
2021-05-17 18:13 ` [PULL 16/59] linux-user/sparc: Merge sparc64 target_structs.h Laurent Vivier
2021-05-17 18:13 ` [PULL 17/59] linux-user/sparc: Merge sparc64 termbits.h Laurent Vivier
2021-05-17 18:13 ` [PULL 18/59] linux-user/sparc: Merge sparc64/ into sparc/ Laurent Vivier
2021-05-17 18:13 ` [PULL 19/59] linux-user/sparc: Remove target_sigcontext as unused Laurent Vivier
2021-05-17 18:13 ` [PULL 20/59] linux-user/sparc: Remove target_rt_signal_frame " Laurent Vivier
2021-05-17 18:13 ` [PULL 21/59] linux-user/sparc: Fix the stackframe structure Laurent Vivier
2021-05-17 18:13 ` [PULL 22/59] linux-user/sparc: Use target_pt_regs Laurent Vivier
2021-05-17 18:13 ` [PULL 23/59] linux-user/sparc: Split out save_reg_win Laurent Vivier
2021-05-17 18:13 ` [PULL 24/59] linux-user/sparc: Clean up get_sigframe Laurent Vivier
2021-05-17 18:13 ` [PULL 25/59] linux-user/sparc: Save and restore fpu in signal frame Laurent Vivier
2021-05-17 18:13 ` [PULL 26/59] linux-user/sparc: Add rwin_save to " Laurent Vivier
2021-05-17 18:13 ` [PULL 27/59] linux-user/sparc: Clean up setup_frame Laurent Vivier
2021-05-17 18:13 ` [PULL 28/59] linux-user/sparc: Minor corrections to do_sigreturn Laurent Vivier
2021-05-17 18:13 ` [PULL 29/59] linux-user/sparc: Add 64-bit support to fpu save/restore Laurent Vivier
2021-05-17 18:13 ` [PULL 30/59] linux-user/sparc: Implement sparc32 rt signals Laurent Vivier
2021-05-17 18:13 ` [PULL 31/59] linux-user/sparc: Implement sparc64 " Laurent Vivier
2021-05-17 18:13 ` [PULL 32/59] tests/tcg/sparc64: Re-enable linux-test Laurent Vivier
2021-05-17 18:13 ` [PULL 33/59] linux-user/s390x: Fix sigframe types Laurent Vivier
2021-05-17 18:13 ` [PULL 34/59] linux-user/s390x: Use uint16_t for signal retcode Laurent Vivier
2021-05-17 18:14 ` [PULL 35/59] linux-user/s390x: Remove PSW_ADDR_AMODE Laurent Vivier
2021-05-17 18:14 ` [PULL 36/59] linux-user/s390x: Remove restore_sigregs return value Laurent Vivier
2021-05-17 18:14 ` [PULL 37/59] linux-user/s390x: Fix trace in restore_regs Laurent Vivier
2021-05-17 18:14 ` [PULL 38/59] linux-user/s390x: Fix sigcontext sregs value Laurent Vivier
2021-05-17 18:14 ` [PULL 39/59] linux-user/s390x: Use tswap_sigset in setup_rt_frame Laurent Vivier
2021-05-17 18:14 ` [PULL 40/59] linux-user/s390x: Tidy save_sigregs Laurent Vivier
2021-05-17 18:14 ` [PULL 41/59] linux-user/s390x: Clean up single-use gotos in signal.c Laurent Vivier
2021-05-17 18:14 ` [PULL 42/59] linux-user/s390x: Set psw.mask properly for the signal handler Laurent Vivier
2021-05-17 18:14 ` [PULL 43/59] linux-user/s390x: Add stub sigframe argument for last_break Laurent Vivier
2021-05-17 18:14 ` [PULL 44/59] linux-user/s390x: Fix frame_addr corruption in setup_frame Laurent Vivier
2021-05-17 18:14 ` [PULL 45/59] linux-user/s390x: Add build asserts for sigset sizes Laurent Vivier
2021-05-17 18:14 ` [PULL 46/59] linux-user/s390x: Clean up signal.c Laurent Vivier
2021-05-17 18:14 ` [PULL 47/59] linux-user/s390x: Handle vector regs in signal stack Laurent Vivier
2021-05-17 18:14 ` [PULL 48/59] linux-user: Add copy_file_range to strace.list Laurent Vivier
2021-05-17 18:14 ` [PULL 49/59] linux-user: Fix erroneous conversion in copy_file_range Laurent Vivier
2021-05-17 18:14 ` [PULL 50/59] linux-user: use GDateTime for formatting timestamp for core file Laurent Vivier
2021-05-17 18:14 ` [PULL 51/59] linux-user/alpha: Fix rt sigframe return Laurent Vivier
2021-05-17 18:14 ` [PULL 52/59] linux-user/alpha: Rename the sigaction restorer field Laurent Vivier
2021-05-17 18:14 ` [PULL 53/59] linux-user: Pass ka_restorer to do_sigaction Laurent Vivier
2021-05-17 18:14 ` [PULL 54/59] linux-user: Honor TARGET_ARCH_HAS_SA_RESTORER in do_syscall Laurent Vivier
2021-05-17 18:14 ` [PULL 55/59] linux-user/alpha: Define TARGET_ARCH_HAS_KA_RESTORER Laurent Vivier
2021-05-17 18:14 ` [PULL 56/59] linux-user/alpha: Share code for TARGET_NR_sigaction Laurent Vivier
2021-05-17 18:14 ` [PULL 57/59] linux-user: Tidy TARGET_NR_rt_sigaction Laurent Vivier
2021-05-17 18:14 ` [PULL 58/59] linux-user/elfload: fix filling psinfo->pr_psargs Laurent Vivier
2021-05-17 18:14 ` [PULL 59/59] linux-user/elfload: add s390x core dumping support Laurent Vivier
2021-05-17 19:15 ` [PULL 00/59] Linux user for 6.1 patches no-reply
2021-05-18  5:13   ` Laurent Vivier
2021-05-18  5:30 Laurent Vivier
2021-05-18  5:30 ` [PULL 09/59] linux-user: Use target_restore_altstack in all sigreturn Laurent Vivier

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=20210517181424.8093-10-laurent@vivier.eu \
    --to=laurent@vivier.eu \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.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.