From: "Philippe Mathieu-Daudé" <philmd@oss.qualcomm.com>
To: qemu-devel@nongnu.org
Cc: qemu-s390x@nongnu.org, "Peter Maydell" <peter.maydell@linaro.org>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Xiaoyao Li" <xiaoyao.li@intel.com>,
"Chao Liu" <chao.liu.zevorn@gmail.com>,
"Zhao Liu" <zhao1.liu@intel.com>,
"Daniel Henrique Barboza" <daniel.barboza@oss.qualcomm.com>,
qemu-ppc@nongnu.org,
"Richard Henderson" <richard.henderson@linaro.org>
Subject: [PATCH 31/33] cpu: Introduce cpu_single_stepping() helper
Date: Wed, 1 Jul 2026 00:00:58 +0200 [thread overview]
Message-ID: <20260630220100.1289-32-philmd@oss.qualcomm.com> (raw)
In-Reply-To: <20260630220100.1289-1-philmd@oss.qualcomm.com>
Access CPUState::@singlestep_enabled field with a helper.
Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
include/hw/core/cpu.h | 11 +++++++++++
accel/kvm/kvm-all.c | 2 +-
accel/tcg/cpu-exec-common.c | 2 +-
accel/tcg/cpu-exec.c | 8 ++++----
linux-user/riscv/cpu_loop.c | 2 +-
linux-user/s390x/cpu_loop.c | 2 +-
system/cpus.c | 2 +-
target/arm/hvf/hvf.c | 8 ++++----
target/arm/kvm.c | 2 +-
target/i386/kvm/kvm.c | 2 +-
target/i386/whpx/whpx-all.c | 6 +++---
target/loongarch/kvm/kvm.c | 2 +-
target/microblaze/translate.c | 2 +-
target/ppc/kvm.c | 2 +-
target/s390x/kvm/kvm.c | 2 +-
15 files changed, 33 insertions(+), 22 deletions(-)
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index bea8e509a19..37ac218bda3 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -1138,6 +1138,17 @@ void qemu_init_vcpu(CPUState *cpu);
*/
void cpu_single_step(CPUState *cpu, int enabled);
+/**
+ * cpu_single_stepping:
+ * @cpu: The vCPU to check
+ *
+ * Returns whether the vCPU has single-stepping enabled.
+ */
+static inline bool cpu_single_stepping(const CPUState *cpu)
+{
+ return cpu->singlestep_enabled;
+}
+
int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, BreakpointFlags flags,
CPUBreakpoint **breakpoint);
int cpu_breakpoint_remove(CPUState *cpu, vaddr pc, BreakpointFlags flags);
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index e8ed85f9a3d..c436b1f3751 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -3817,7 +3817,7 @@ int kvm_update_guest_debug(CPUState *cpu, unsigned long reinject_trap)
data.dbg.control = reinject_trap;
- if (cpu->singlestep_enabled) {
+ if (cpu_single_stepping(cpu)) {
data.dbg.control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP;
if (cpu->singlestep_enabled & SSTEP_NOIRQ) {
diff --git a/accel/tcg/cpu-exec-common.c b/accel/tcg/cpu-exec-common.c
index e48ea31373f..44e84344f3b 100644
--- a/accel/tcg/cpu-exec-common.c
+++ b/accel/tcg/cpu-exec-common.c
@@ -47,7 +47,7 @@ uint32_t curr_cflags(CPUState *cpu)
* For singlestep and -d nochain, suppress goto_tb so that
* we can log -d cpu,exec after every TB.
*/
- if (unlikely(cpu->singlestep_enabled)) {
+ if (unlikely(cpu_single_stepping(cpu))) {
cflags |= CF_NO_GOTO_TB | CF_NO_GOTO_PTR | CF_SINGLE_STEP | 1;
} else if (qatomic_read(&one_insn_per_tb)) {
cflags |= CF_NO_GOTO_TB | 1;
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
index d7f91dce9db..0386ac49551 100644
--- a/accel/tcg/cpu-exec.c
+++ b/accel/tcg/cpu-exec.c
@@ -308,7 +308,7 @@ static bool check_for_breakpoints_slow(CPUState *cpu, vaddr pc,
* so that one could (gdb) singlestep into the guest kernel's
* architectural breakpoint handler.
*/
- if (cpu->singlestep_enabled) {
+ if (cpu_single_stepping(cpu)) {
return false;
}
@@ -485,7 +485,7 @@ cpu_tb_exec(CPUState *cpu, TranslationBlock *itb, int *tb_exit)
* raise a debug exception. Single-step with another exception
* is handled in cpu_handle_exception.
*/
- if (unlikely(cpu->singlestep_enabled) && cpu->exception_index == -1) {
+ if (unlikely(cpu_single_stepping(cpu)) && cpu->exception_index == -1) {
cpu->exception_index = EXCP_DEBUG;
cpu_loop_exit(cpu);
}
@@ -732,7 +732,7 @@ static inline bool cpu_handle_exception(CPUState *cpu, int *ret)
bql_unlock();
cpu->exception_index = -1;
- if (unlikely(cpu->singlestep_enabled)) {
+ if (unlikely(cpu_single_stepping(cpu))) {
/*
* After processing the exception, ensure an EXCP_DEBUG is
* raised when single-stepping so that GDB doesn't miss the
@@ -849,7 +849,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
* raised when single-stepping so that GDB doesn't miss the
* next instruction.
*/
- if (unlikely(cpu->singlestep_enabled)) {
+ if (unlikely(cpu_single_stepping(cpu))) {
cpu->exception_index = EXCP_DEBUG;
bql_unlock();
return true;
diff --git a/linux-user/riscv/cpu_loop.c b/linux-user/riscv/cpu_loop.c
index eecc8d15178..6f27a06da49 100644
--- a/linux-user/riscv/cpu_loop.c
+++ b/linux-user/riscv/cpu_loop.c
@@ -68,7 +68,7 @@ void cpu_loop(CPURISCVState *env)
} else if (ret != -QEMU_ESIGRETURN && ret != -QEMU_ESETPC) {
env->gpr[xA0] = ret;
}
- if (cs->singlestep_enabled) {
+ if (cpu_single_stepping(cs)) {
goto gdbstep;
}
break;
diff --git a/linux-user/s390x/cpu_loop.c b/linux-user/s390x/cpu_loop.c
index 67d2a803fbc..25f19f725e7 100644
--- a/linux-user/s390x/cpu_loop.c
+++ b/linux-user/s390x/cpu_loop.c
@@ -87,7 +87,7 @@ void cpu_loop(CPUS390XState *env)
env->regs[2] = ret;
}
- if (unlikely(cs->singlestep_enabled)) {
+ if (unlikely(cpu_single_stepping(cs))) {
/*
* cpu_tb_exec() did not raise EXCP_DEBUG, because it has seen
* that EXCP_SVC was already pending.
diff --git a/system/cpus.c b/system/cpus.c
index 49f6daec3cd..2270e58d9cf 100644
--- a/system/cpus.c
+++ b/system/cpus.c
@@ -343,7 +343,7 @@ bool cpu_can_run(CPUState *cpu)
void cpu_handle_guest_debug(CPUState *cpu)
{
if (replay_running_debug()) {
- if (!cpu->singlestep_enabled) {
+ if (!cpu_single_stepping(cpu)) {
/*
* Report about the breakpoint and
* make a single step to skip it
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 530af305efd..e7550cb3b58 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -2340,7 +2340,7 @@ static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
case EC_SOFTWARESTEP: {
ret = EXCP_DEBUG;
- if (!cpu->singlestep_enabled) {
+ if (!cpu_single_stepping(cpu)) {
error_report("EC_SOFTWARESTEP but single-stepping not enabled");
}
break;
@@ -2549,7 +2549,7 @@ static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
assert_hvf_ok(r);
/* Handle single-stepping over instructions which trigger a VM exit */
- if (cpu->singlestep_enabled) {
+ if (cpu_single_stepping(cpu)) {
ret = EXCP_DEBUG;
}
}
@@ -2868,7 +2868,7 @@ void hvf_arch_update_guest_debug(CPUState *cpu)
CPUARMState *env = &arm_cpu->env;
/* Check whether guest debugging is enabled */
- cpu->accel->guest_debug_enabled = cpu->singlestep_enabled ||
+ cpu->accel->guest_debug_enabled = cpu_single_stepping(cpu) ||
hvf_sw_breakpoints_active(cpu) ||
hvf_arm_hw_debug_active(cpu);
@@ -2882,7 +2882,7 @@ void hvf_arch_update_guest_debug(CPUState *cpu)
cpu_synchronize_state(cpu);
/* Enable/disable single-stepping */
- if (cpu->singlestep_enabled) {
+ if (cpu_single_stepping(cpu)) {
env->cp15.mdscr_el1 =
deposit64(env->cp15.mdscr_el1, MDSCR_EL1_SS_SHIFT, 1, 1);
pstate_write(env, pstate_read(env) | PSTATE_SS);
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index 01f42f42538..d40a6a98591 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -1492,7 +1492,7 @@ static bool kvm_arm_handle_debug(ARMCPU *cpu,
switch (hsr_ec) {
case EC_SOFTWARESTEP:
- if (cs->singlestep_enabled) {
+ if (cpu_single_stepping(cs)) {
return true;
} else {
/*
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 372781ae715..aef981f023f 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -6251,7 +6251,7 @@ static int kvm_handle_debug(X86CPU *cpu,
if (arch_info->exception == EXCP01_DB) {
if (arch_info->dr6 & DR6_BS) {
- if (cs->singlestep_enabled) {
+ if (cpu_single_stepping(cs)) {
ret = EXCP_DEBUG;
}
} else {
diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c
index 95705522e04..c87bd1d714d 100644
--- a/target/i386/whpx/whpx-all.c
+++ b/target/i386/whpx/whpx-all.c
@@ -2271,7 +2271,7 @@ int whpx_vcpu_run(CPUState *cpu)
}
}
- if (exclusive_step_mode != WHPX_STEP_NONE || cpu->singlestep_enabled) {
+ if (exclusive_step_mode != WHPX_STEP_NONE || cpu_single_stepping(cpu)) {
whpx_vcpu_configure_single_stepping(cpu, true, NULL);
}
@@ -2288,7 +2288,7 @@ int whpx_vcpu_run(CPUState *cpu)
break;
}
- if (exclusive_step_mode != WHPX_STEP_NONE || cpu->singlestep_enabled) {
+ if (exclusive_step_mode != WHPX_STEP_NONE || cpu_single_stepping(cpu)) {
whpx_vcpu_configure_single_stepping(cpu,
false,
&vcpu->exit_ctx.VpContext.Rflags);
@@ -2653,7 +2653,7 @@ int whpx_vcpu_run(CPUState *cpu)
cpu->exception_index = EXCP_DEBUG;
} else if ((vcpu->exit_ctx.VpException.ExceptionType ==
WHvX64ExceptionTypeDebugTrapOrFault) &&
- !cpu->singlestep_enabled) {
+ !cpu_single_stepping(cpu)) {
/*
* Just finished stepping over a breakpoint, but the
* gdb does not expect us to do single-stepping.
diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
index beda6965f8c..48cdb78a4ca 100644
--- a/target/loongarch/kvm/kvm.c
+++ b/target/loongarch/kvm/kvm.c
@@ -1440,7 +1440,7 @@ static bool kvm_loongarch_handle_debug(CPUState *cs, struct kvm_run *run)
CPULoongArchState *env = &cpu->env;
kvm_cpu_synchronize_state(cs);
- if (cs->singlestep_enabled) {
+ if (cpu_single_stepping(cs)) {
return true;
}
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
index a93f14d6e09..8b219afb5dd 100644
--- a/target/microblaze/translate.c
+++ b/target/microblaze/translate.c
@@ -1772,7 +1772,7 @@ static void mb_tr_tb_stop(DisasContextBase *dcb, CPUState *cs)
}
/* Finish DISAS_EXIT_* */
- if (unlikely(cs->singlestep_enabled)) {
+ if (unlikely(cpu_single_stepping(cs))) {
gen_raise_exception(dc, EXCP_DEBUG);
} else {
tcg_gen_exit_tb(NULL, 0);
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 85b15602396..b0c446eea7f 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -1617,7 +1617,7 @@ static int kvm_handle_debug(PowerPCCPU *cpu, struct kvm_run *run)
CPUPPCState *env = &cpu->env;
struct kvm_debug_exit_arch *arch_info = &run->debug.arch;
- if (cs->singlestep_enabled) {
+ if (cpu_single_stepping(cs)) {
return kvm_handle_singlestep();
}
diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
index bb329883c97..70f450c71ab 100644
--- a/target/s390x/kvm/kvm.c
+++ b/target/s390x/kvm/kvm.c
@@ -1875,7 +1875,7 @@ static int kvm_arch_handle_debug_exit(S390CPU *cpu)
}
break;
case KVM_SINGLESTEP:
- if (cs->singlestep_enabled) {
+ if (cpu_single_stepping(cs)) {
ret = EXCP_DEBUG;
}
break;
--
2.53.0
next prev parent reply other threads:[~2026-06-30 22:08 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-30 22:00 [PATCH 00/33] accel: Unassorted cleanups around debugging Philippe Mathieu-Daudé
2026-06-30 22:00 ` [PATCH 01/33] cpu: Constify CPUState::cc (cached CPUClass pointer) Philippe Mathieu-Daudé
2026-07-02 13:16 ` Daniel Henrique Barboza
2026-07-02 16:08 ` Richard Henderson
2026-07-03 0:41 ` Chao Liu
2026-06-30 22:00 ` [PATCH 02/33] target/i386: Remove duplicate tlb_flush() call in cpu_post_load() Philippe Mathieu-Daudé
2026-07-02 16:27 ` Richard Henderson
2026-07-03 0:42 ` Chao Liu
2026-06-30 22:00 ` [PATCH 03/33] accel/tcg: Restrict tlb_protect/unprotect_code() to TCG Philippe Mathieu-Daudé
2026-07-02 13:17 ` Daniel Henrique Barboza
2026-07-02 16:29 ` Richard Henderson
2026-07-03 3:13 ` Chao Liu
2026-06-30 22:00 ` [PATCH 04/33] accel/hvf: Remove left-over comment Philippe Mathieu-Daudé
2026-07-02 13:36 ` Daniel Henrique Barboza
2026-07-02 16:29 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 05/33] accel/mshv: Replace @dirty field by generic CPUState::vcpu_dirty field Philippe Mathieu-Daudé
2026-07-02 13:00 ` Philippe Mathieu-Daudé
2026-07-02 13:41 ` Magnus Kulke
2026-07-02 16:56 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 06/33] gdbstub: Add trace event for STEP packet handler Philippe Mathieu-Daudé
2026-07-02 13:18 ` Daniel Henrique Barboza
2026-07-02 13:25 ` Alex Bennée
2026-06-30 22:00 ` [PATCH 07/33] gdbstub: Only return E22 when reverse GDB is not supported Philippe Mathieu-Daudé
2026-07-02 13:18 ` Daniel Henrique Barboza
2026-07-02 13:26 ` Alex Bennée
2026-06-30 22:00 ` [PATCH 08/33] accel/kvm: Always define AccelOpsClass::supports_guest_debug Philippe Mathieu-Daudé
2026-07-02 13:19 ` Daniel Henrique Barboza
2026-07-02 17:16 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 09/33] accel/kvm: Simplify kvm_init() w.r.t. TARGET_KVM_HAVE_GUEST_DEBUG Philippe Mathieu-Daudé
2026-07-02 17:18 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 10/33] accel: Change gdbstub_supported_sstep_flags() -> get_gdbstub_config() Philippe Mathieu-Daudé
2026-07-02 13:50 ` Alex Bennée
2026-07-02 13:58 ` Philippe Mathieu-Daudé
2026-06-30 22:00 ` [PATCH 11/33] gdbstub: Store @can_reverse in GDBState Philippe Mathieu-Daudé
2026-07-02 13:20 ` Daniel Henrique Barboza
2026-06-30 22:00 ` [PATCH 12/33] gdbstub: Make default replay_mode value explicit in stubs Philippe Mathieu-Daudé
2026-07-02 17:21 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 13/33] accel: Have get_gdbstub_config() return @can_reverse value Philippe Mathieu-Daudé
2026-06-30 22:00 ` [PATCH 14/33] accel: Move supports_guest_debug() declaration to AccelClass Philippe Mathieu-Daudé
2026-07-02 17:29 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 15/33] accel/kvm: Hold have_guest_supported in KVMState Philippe Mathieu-Daudé
2026-07-02 13:22 ` Daniel Henrique Barboza
2026-07-02 17:37 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 16/33] accel/kvm: Hold gdbstub_sstep_flags " Philippe Mathieu-Daudé
2026-07-02 13:22 ` Daniel Henrique Barboza
2026-07-02 17:42 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 17/33] cpu: Move BREAKPOINT definitions to 'exec/breakpoint.h' Philippe Mathieu-Daudé
2026-07-02 13:24 ` Daniel Henrique Barboza
2026-07-02 17:43 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 18/33] cpu: Define BreakpointFlags type Philippe Mathieu-Daudé
2026-07-02 13:26 ` Daniel Henrique Barboza
2026-07-02 13:57 ` Philippe Mathieu-Daudé
2026-07-02 17:44 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 19/33] accel: Remove unnecessary 'inline' qualifier in remove_all_breakpoints Philippe Mathieu-Daudé
2026-07-02 13:27 ` Daniel Henrique Barboza
2026-07-02 17:45 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 20/33] gdbstub/user: Directly call gdb_breakpoint_remove_all() in user mode Philippe Mathieu-Daudé
2026-07-02 13:27 ` Daniel Henrique Barboza
2026-07-02 17:46 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 21/33] gdbstub: Reduce @type variable scope Philippe Mathieu-Daudé
2026-07-02 13:27 ` Daniel Henrique Barboza
2026-07-02 17:47 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 22/33] gdbstub: Introduce GdbBreakpointType enumerator Philippe Mathieu-Daudé
2026-07-02 13:29 ` Daniel Henrique Barboza
2026-07-02 13:53 ` Philippe Mathieu-Daudé
2026-07-02 17:50 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 23/33] accel: Use GdbBreakpointType enum Philippe Mathieu-Daudé
2026-07-02 13:31 ` Daniel Henrique Barboza
2026-07-02 17:52 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 24/33] target/arm: Inline check_watchpoints() in arm_debug_check_watchpoint() Philippe Mathieu-Daudé
2026-07-02 17:53 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 25/33] target/arm: Factor arm_check_watchpoint_hit() out Philippe Mathieu-Daudé
2026-07-02 18:02 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 26/33] target/xtensa: Move watchpoints handling to check_hw_watchpoints() Philippe Mathieu-Daudé
2026-07-02 18:06 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 27/33] target/ppc: Ensure TCG is used in ppc_update_daw() Philippe Mathieu-Daudé
2026-07-02 13:34 ` Daniel Henrique Barboza
2026-06-30 22:00 ` [PATCH 28/33] accel/tcg: Improve docstrings around TCGCPUOps::*watchpoint* handlers Philippe Mathieu-Daudé
2026-07-02 13:34 ` Daniel Henrique Barboza
2026-07-02 18:04 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 29/33] cpu: Move CPUWatchpoint definition to 'exec/watchpoint.h' Philippe Mathieu-Daudé
2026-07-02 18:06 ` Richard Henderson
2026-06-30 22:00 ` [PATCH 30/33] cpu: Better name cpu_single_step() trace event Philippe Mathieu-Daudé
2026-07-02 13:35 ` Daniel Henrique Barboza
2026-06-30 22:00 ` Philippe Mathieu-Daudé [this message]
2026-07-02 18:11 ` [PATCH 31/33] cpu: Introduce cpu_single_stepping() helper Richard Henderson
2026-06-30 22:00 ` [PATCH 32/33] cpu: Rename CPUState @singlestep_enabled -> @singlestep_flags Philippe Mathieu-Daudé
2026-07-02 18:11 ` Richard Henderson
2026-07-03 1:27 ` Xiaoyao Li
2026-07-03 1:50 ` Philippe Mathieu-Daudé
2026-06-30 22:01 ` [PATCH 33/33] cpu: Only check SSTEP_ENABLE flag in cpu_single_stepping() Philippe Mathieu-Daudé
2026-07-02 13:36 ` Daniel Henrique Barboza
2026-07-02 18:11 ` Richard Henderson
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=20260630220100.1289-32-philmd@oss.qualcomm.com \
--to=philmd@oss.qualcomm.com \
--cc=alex.bennee@linaro.org \
--cc=chao.liu.zevorn@gmail.com \
--cc=daniel.barboza@oss.qualcomm.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=xiaoyao.li@intel.com \
--cc=zhao1.liu@intel.com \
/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.