All of lore.kernel.org
 help / color / mirror / Atom feed
From: c.dall@virtualopensystems.com (Christoffer Dall)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 05/15] ARM: Expose PMNC bitfields for KVM use
Date: Sat, 15 Sep 2012 11:35:02 -0400	[thread overview]
Message-ID: <20120915153502.21241.13218.stgit@ubuntu> (raw)
In-Reply-To: <20120915153359.21241.86002.stgit@ubuntu>

From: Rusty Russell <rusty.russell@linaro.org>

We want some of these for use in KVM, so pull them out of
arch/arm/kernel/perf_event_v7.c into their own asm/perf_bits.h.

Signed-off-by: Rusty Russell <rusty.russell@linaro.org>
Signed-off-by: Christoffer Dall <c.dall@virtualopensystems.com>
---
 arch/arm/include/asm/perf_bits.h |   56 ++++++++++++++++++++++++++++++++++++++
 arch/arm/kernel/perf_event_v7.c  |   51 +----------------------------------
 2 files changed, 57 insertions(+), 50 deletions(-)
 create mode 100644 arch/arm/include/asm/perf_bits.h

diff --git a/arch/arm/include/asm/perf_bits.h b/arch/arm/include/asm/perf_bits.h
new file mode 100644
index 0000000..eeb266a
--- /dev/null
+++ b/arch/arm/include/asm/perf_bits.h
@@ -0,0 +1,56 @@
+#ifndef __ARM_PERF_BITS_H__
+#define __ARM_PERF_BITS_H__
+
+/*
+ * ARMv7 low level PMNC access
+ */
+
+/*
+ * Per-CPU PMNC: config reg
+ */
+#define ARMV7_PMNC_E		(1 << 0) /* Enable all counters */
+#define ARMV7_PMNC_P		(1 << 1) /* Reset all counters */
+#define ARMV7_PMNC_C		(1 << 2) /* Cycle counter reset */
+#define ARMV7_PMNC_D		(1 << 3) /* CCNT counts every 64th cpu cycle */
+#define ARMV7_PMNC_X		(1 << 4) /* Export to ETM */
+#define ARMV7_PMNC_DP		(1 << 5) /* Disable CCNT if non-invasive debug*/
+#define	ARMV7_PMNC_N_SHIFT	11	 /* Number of counters supported */
+#define	ARMV7_PMNC_N_MASK	0x1f
+#define	ARMV7_PMNC_MASK		0x3f	 /* Mask for writable bits */
+
+/*
+ * FLAG: counters overflow flag status reg
+ */
+#define	ARMV7_FLAG_MASK		0xffffffff	/* Mask for writable bits */
+#define	ARMV7_OVERFLOWED_MASK	ARMV7_FLAG_MASK
+
+/*
+ * PMXEVTYPER: Event selection reg
+ */
+#define	ARMV7_EVTYPE_MASK	0xc00000ff	/* Mask for writable bits */
+#define	ARMV7_EVTYPE_EVENT	0xff		/* Mask for EVENT bits */
+
+/*
+ * Event filters for PMUv2
+ */
+#define	ARMV7_EXCLUDE_PL1	(1 << 31)
+#define	ARMV7_EXCLUDE_USER	(1 << 30)
+#define	ARMV7_INCLUDE_HYP	(1 << 27)
+
+#ifndef __ASSEMBLY__
+static inline u32 armv7_pmnc_read(void)
+{
+	u32 val;
+	asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r"(val));
+	return val;
+}
+
+static inline void armv7_pmnc_write(u32 val)
+{
+	val &= ARMV7_PMNC_MASK;
+	isb();
+	asm volatile("mcr p15, 0, %0, c9, c12, 0" : : "r"(val));
+}
+#endif
+
+#endif /* __ARM_PERF_BITS_H__ */
diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c
index f04070b..09851b3 100644
--- a/arch/arm/kernel/perf_event_v7.c
+++ b/arch/arm/kernel/perf_event_v7.c
@@ -17,6 +17,7 @@
  */
 
 #ifdef CONFIG_CPU_V7
+#include <asm/perf_bits.h>
 
 static struct arm_pmu armv7pmu;
 
@@ -744,61 +745,11 @@ static const unsigned armv7_a7_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
 #define	ARMV7_COUNTER_MASK	(ARMV7_MAX_COUNTERS - 1)
 
 /*
- * ARMv7 low level PMNC access
- */
-
-/*
  * Perf Event to low level counters mapping
  */
 #define	ARMV7_IDX_TO_COUNTER(x)	\
 	(((x) - ARMV7_IDX_COUNTER0) & ARMV7_COUNTER_MASK)
 
-/*
- * Per-CPU PMNC: config reg
- */
-#define ARMV7_PMNC_E		(1 << 0) /* Enable all counters */
-#define ARMV7_PMNC_P		(1 << 1) /* Reset all counters */
-#define ARMV7_PMNC_C		(1 << 2) /* Cycle counter reset */
-#define ARMV7_PMNC_D		(1 << 3) /* CCNT counts every 64th cpu cycle */
-#define ARMV7_PMNC_X		(1 << 4) /* Export to ETM */
-#define ARMV7_PMNC_DP		(1 << 5) /* Disable CCNT if non-invasive debug*/
-#define	ARMV7_PMNC_N_SHIFT	11	 /* Number of counters supported */
-#define	ARMV7_PMNC_N_MASK	0x1f
-#define	ARMV7_PMNC_MASK		0x3f	 /* Mask for writable bits */
-
-/*
- * FLAG: counters overflow flag status reg
- */
-#define	ARMV7_FLAG_MASK		0xffffffff	/* Mask for writable bits */
-#define	ARMV7_OVERFLOWED_MASK	ARMV7_FLAG_MASK
-
-/*
- * PMXEVTYPER: Event selection reg
- */
-#define	ARMV7_EVTYPE_MASK	0xc00000ff	/* Mask for writable bits */
-#define	ARMV7_EVTYPE_EVENT	0xff		/* Mask for EVENT bits */
-
-/*
- * Event filters for PMUv2
- */
-#define	ARMV7_EXCLUDE_PL1	(1 << 31)
-#define	ARMV7_EXCLUDE_USER	(1 << 30)
-#define	ARMV7_INCLUDE_HYP	(1 << 27)
-
-static inline u32 armv7_pmnc_read(void)
-{
-	u32 val;
-	asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r"(val));
-	return val;
-}
-
-static inline void armv7_pmnc_write(u32 val)
-{
-	val &= ARMV7_PMNC_MASK;
-	isb();
-	asm volatile("mcr p15, 0, %0, c9, c12, 0" : : "r"(val));
-}
-
 static inline int armv7_pmnc_has_overflowed(u32 pmnc)
 {
 	return pmnc & ARMV7_OVERFLOWED_MASK;

WARNING: multiple messages have this Message-ID (diff)
From: Christoffer Dall <c.dall@virtualopensystems.com>
To: kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	kvmarm@lists.cs.columbia.edu
Subject: [PATCH 05/15] ARM: Expose PMNC bitfields for KVM use
Date: Sat, 15 Sep 2012 11:35:02 -0400	[thread overview]
Message-ID: <20120915153502.21241.13218.stgit@ubuntu> (raw)
In-Reply-To: <20120915153359.21241.86002.stgit@ubuntu>

From: Rusty Russell <rusty.russell@linaro.org>

We want some of these for use in KVM, so pull them out of
arch/arm/kernel/perf_event_v7.c into their own asm/perf_bits.h.

Signed-off-by: Rusty Russell <rusty.russell@linaro.org>
Signed-off-by: Christoffer Dall <c.dall@virtualopensystems.com>
---
 arch/arm/include/asm/perf_bits.h |   56 ++++++++++++++++++++++++++++++++++++++
 arch/arm/kernel/perf_event_v7.c  |   51 +----------------------------------
 2 files changed, 57 insertions(+), 50 deletions(-)
 create mode 100644 arch/arm/include/asm/perf_bits.h

diff --git a/arch/arm/include/asm/perf_bits.h b/arch/arm/include/asm/perf_bits.h
new file mode 100644
index 0000000..eeb266a
--- /dev/null
+++ b/arch/arm/include/asm/perf_bits.h
@@ -0,0 +1,56 @@
+#ifndef __ARM_PERF_BITS_H__
+#define __ARM_PERF_BITS_H__
+
+/*
+ * ARMv7 low level PMNC access
+ */
+
+/*
+ * Per-CPU PMNC: config reg
+ */
+#define ARMV7_PMNC_E		(1 << 0) /* Enable all counters */
+#define ARMV7_PMNC_P		(1 << 1) /* Reset all counters */
+#define ARMV7_PMNC_C		(1 << 2) /* Cycle counter reset */
+#define ARMV7_PMNC_D		(1 << 3) /* CCNT counts every 64th cpu cycle */
+#define ARMV7_PMNC_X		(1 << 4) /* Export to ETM */
+#define ARMV7_PMNC_DP		(1 << 5) /* Disable CCNT if non-invasive debug*/
+#define	ARMV7_PMNC_N_SHIFT	11	 /* Number of counters supported */
+#define	ARMV7_PMNC_N_MASK	0x1f
+#define	ARMV7_PMNC_MASK		0x3f	 /* Mask for writable bits */
+
+/*
+ * FLAG: counters overflow flag status reg
+ */
+#define	ARMV7_FLAG_MASK		0xffffffff	/* Mask for writable bits */
+#define	ARMV7_OVERFLOWED_MASK	ARMV7_FLAG_MASK
+
+/*
+ * PMXEVTYPER: Event selection reg
+ */
+#define	ARMV7_EVTYPE_MASK	0xc00000ff	/* Mask for writable bits */
+#define	ARMV7_EVTYPE_EVENT	0xff		/* Mask for EVENT bits */
+
+/*
+ * Event filters for PMUv2
+ */
+#define	ARMV7_EXCLUDE_PL1	(1 << 31)
+#define	ARMV7_EXCLUDE_USER	(1 << 30)
+#define	ARMV7_INCLUDE_HYP	(1 << 27)
+
+#ifndef __ASSEMBLY__
+static inline u32 armv7_pmnc_read(void)
+{
+	u32 val;
+	asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r"(val));
+	return val;
+}
+
+static inline void armv7_pmnc_write(u32 val)
+{
+	val &= ARMV7_PMNC_MASK;
+	isb();
+	asm volatile("mcr p15, 0, %0, c9, c12, 0" : : "r"(val));
+}
+#endif
+
+#endif /* __ARM_PERF_BITS_H__ */
diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c
index f04070b..09851b3 100644
--- a/arch/arm/kernel/perf_event_v7.c
+++ b/arch/arm/kernel/perf_event_v7.c
@@ -17,6 +17,7 @@
  */
 
 #ifdef CONFIG_CPU_V7
+#include <asm/perf_bits.h>
 
 static struct arm_pmu armv7pmu;
 
@@ -744,61 +745,11 @@ static const unsigned armv7_a7_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
 #define	ARMV7_COUNTER_MASK	(ARMV7_MAX_COUNTERS - 1)
 
 /*
- * ARMv7 low level PMNC access
- */
-
-/*
  * Perf Event to low level counters mapping
  */
 #define	ARMV7_IDX_TO_COUNTER(x)	\
 	(((x) - ARMV7_IDX_COUNTER0) & ARMV7_COUNTER_MASK)
 
-/*
- * Per-CPU PMNC: config reg
- */
-#define ARMV7_PMNC_E		(1 << 0) /* Enable all counters */
-#define ARMV7_PMNC_P		(1 << 1) /* Reset all counters */
-#define ARMV7_PMNC_C		(1 << 2) /* Cycle counter reset */
-#define ARMV7_PMNC_D		(1 << 3) /* CCNT counts every 64th cpu cycle */
-#define ARMV7_PMNC_X		(1 << 4) /* Export to ETM */
-#define ARMV7_PMNC_DP		(1 << 5) /* Disable CCNT if non-invasive debug*/
-#define	ARMV7_PMNC_N_SHIFT	11	 /* Number of counters supported */
-#define	ARMV7_PMNC_N_MASK	0x1f
-#define	ARMV7_PMNC_MASK		0x3f	 /* Mask for writable bits */
-
-/*
- * FLAG: counters overflow flag status reg
- */
-#define	ARMV7_FLAG_MASK		0xffffffff	/* Mask for writable bits */
-#define	ARMV7_OVERFLOWED_MASK	ARMV7_FLAG_MASK
-
-/*
- * PMXEVTYPER: Event selection reg
- */
-#define	ARMV7_EVTYPE_MASK	0xc00000ff	/* Mask for writable bits */
-#define	ARMV7_EVTYPE_EVENT	0xff		/* Mask for EVENT bits */
-
-/*
- * Event filters for PMUv2
- */
-#define	ARMV7_EXCLUDE_PL1	(1 << 31)
-#define	ARMV7_EXCLUDE_USER	(1 << 30)
-#define	ARMV7_INCLUDE_HYP	(1 << 27)
-
-static inline u32 armv7_pmnc_read(void)
-{
-	u32 val;
-	asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r"(val));
-	return val;
-}
-
-static inline void armv7_pmnc_write(u32 val)
-{
-	val &= ARMV7_PMNC_MASK;
-	isb();
-	asm volatile("mcr p15, 0, %0, c9, c12, 0" : : "r"(val));
-}
-
 static inline int armv7_pmnc_has_overflowed(u32 pmnc)
 {
 	return pmnc & ARMV7_OVERFLOWED_MASK;


  parent reply	other threads:[~2012-09-15 15:35 UTC|newest]

Thread overview: 164+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-15 15:34 [PATCH 00/15] KVM/ARM Implementation Christoffer Dall
2012-09-15 15:34 ` Christoffer Dall
2012-09-15 15:34 ` [PATCH 01/15] ARM: add mem_type prot_pte accessor Christoffer Dall
2012-09-15 15:34   ` Christoffer Dall
2012-09-18 12:23   ` Will Deacon
2012-09-18 12:23     ` Will Deacon
2012-09-18 19:18     ` Christoffer Dall
2012-09-18 19:18       ` Christoffer Dall
2012-09-18 21:04   ` Russell King - ARM Linux
2012-09-18 21:04     ` Russell King - ARM Linux
2012-09-18 21:53     ` Christoffer Dall
2012-09-18 21:53       ` Christoffer Dall
2012-09-20 10:01       ` Marc Zyngier
2012-09-20 10:01         ` Marc Zyngier
2012-09-20 13:21         ` Christoffer Dall
2012-09-20 13:21           ` Christoffer Dall
2012-09-15 15:34 ` [PATCH 02/15] ARM: Add page table and page defines needed by KVM Christoffer Dall
2012-09-15 15:34   ` Christoffer Dall
2012-09-18 12:47   ` Will Deacon
2012-09-18 12:47     ` Will Deacon
2012-09-18 14:06     ` Catalin Marinas
2012-09-18 14:06       ` Catalin Marinas
2012-09-18 15:05       ` Christoffer Dall
2012-09-18 15:05         ` Christoffer Dall
2012-09-18 15:07         ` Catalin Marinas
2012-09-18 15:07           ` Catalin Marinas
2012-09-18 15:10           ` Christoffer Dall
2012-09-18 15:10             ` Christoffer Dall
2012-09-18 22:01     ` Christoffer Dall
2012-09-18 22:01       ` Christoffer Dall
2012-09-19  9:21       ` Will Deacon
2012-09-19  9:21         ` Will Deacon
2012-09-20  0:10         ` Christoffer Dall
2012-09-20  0:10           ` Christoffer Dall
2012-09-15 15:34 ` [PATCH 03/15] ARM: Section based HYP idmap Christoffer Dall
2012-09-15 15:34   ` Christoffer Dall
2012-09-18 13:00   ` Will Deacon
2012-09-18 13:00     ` Will Deacon
2012-10-01  2:19     ` Christoffer Dall
2012-10-01  2:19       ` Christoffer Dall
2012-09-15 15:34 ` [PATCH 04/15] ARM: idmap: only initialize HYP idmap when HYP mode is available Christoffer Dall
2012-09-15 15:34   ` Christoffer Dall
2012-09-18 13:03   ` Will Deacon
2012-09-18 13:03     ` Will Deacon
2012-09-20  0:11     ` Christoffer Dall
2012-09-20  0:11       ` Christoffer Dall
2012-09-15 15:35 ` Christoffer Dall [this message]
2012-09-15 15:35   ` [PATCH 05/15] ARM: Expose PMNC bitfields for KVM use Christoffer Dall
2012-09-18 13:08   ` Will Deacon
2012-09-18 13:08     ` Will Deacon
2012-09-18 22:13     ` Christoffer Dall
2012-09-18 22:13       ` Christoffer Dall
2012-09-19  4:09     ` [kvmarm] " Rusty Russell
2012-09-19  4:09       ` Rusty Russell
2012-09-19  9:30       ` Will Deacon
2012-09-19  9:30         ` Will Deacon
2012-09-15 15:35 ` [PATCH 06/15] KVM: ARM: Initial skeleton to compile KVM support Christoffer Dall
2012-09-15 15:35   ` Christoffer Dall
2012-09-25 15:20   ` Will Deacon
2012-09-25 15:20     ` Will Deacon
2012-09-26  1:43     ` Christoffer Dall
2012-09-26  1:43       ` Christoffer Dall
2012-09-27 14:13       ` Will Deacon
2012-09-27 14:13         ` Will Deacon
2012-09-27 14:39         ` Marc Zyngier
2012-09-27 14:39           ` Marc Zyngier
2012-09-27 14:45         ` [kvmarm] " Peter Maydell
2012-09-27 14:45           ` Peter Maydell
2012-09-27 15:20           ` Will Deacon
2012-09-27 15:20             ` Will Deacon
2012-09-30 19:21         ` Christoffer Dall
2012-09-30 19:21           ` Christoffer Dall
2012-10-01 13:03           ` [kvmarm] " Marc Zyngier
2012-10-01 13:03             ` Marc Zyngier
2012-10-04 13:02           ` Min-gyu Kim
2012-10-04 13:02             ` Min-gyu Kim
2012-10-04 13:35             ` Christoffer Dall
2012-10-04 13:35               ` Christoffer Dall
2012-10-05  6:28             ` Rusty Russell
2012-10-05  6:28               ` Rusty Russell
2012-10-04 13:44     ` [kvmarm] " Avi Kivity
2012-10-04 13:44       ` Avi Kivity
2012-09-15 15:35 ` [PATCH 07/15] KVM: ARM: Hypervisor inititalization Christoffer Dall
2012-09-15 15:35   ` Christoffer Dall
2012-09-15 15:35 ` [PATCH 08/15] KVM: ARM: Memory virtualization setup Christoffer Dall
2012-09-15 15:35   ` Christoffer Dall
2012-09-15 15:35 ` [PATCH 09/15] KVM: ARM: Inject IRQs and FIQs from userspace Christoffer Dall
2012-09-15 15:35   ` Christoffer Dall
2012-09-25 15:55   ` Will Deacon
2012-09-25 15:55     ` Will Deacon
2012-09-29 15:50     ` Christoffer Dall
2012-09-29 15:50       ` Christoffer Dall
2012-09-30 12:48       ` Will Deacon
2012-09-30 12:48         ` Will Deacon
2012-09-30 14:34         ` Christoffer Dall
2012-09-30 14:34           ` Christoffer Dall
2012-09-15 15:35 ` [PATCH 10/15] KVM: ARM: World-switch implementation Christoffer Dall
2012-09-15 15:35   ` Christoffer Dall
2012-09-25 17:00   ` Will Deacon
2012-09-25 17:00     ` Will Deacon
2012-09-25 17:15     ` [kvmarm] " Peter Maydell
2012-09-25 17:15       ` Peter Maydell
2012-09-25 17:42       ` Marc Zyngier
2012-09-25 17:42         ` Marc Zyngier
2012-09-30  0:33         ` Christoffer Dall
2012-09-30  0:33           ` Christoffer Dall
2012-09-30  9:48           ` Peter Maydell
2012-09-30  9:48             ` Peter Maydell
2012-09-30 14:31             ` Christoffer Dall
2012-09-30 14:31               ` Christoffer Dall
2012-09-30 17:47     ` Christoffer Dall
2012-09-30 17:47       ` Christoffer Dall
2012-09-15 15:35 ` [PATCH 11/15] KVM: ARM: Emulation framework and CP15 emulation Christoffer Dall
2012-09-15 15:35   ` Christoffer Dall
2012-09-15 15:35 ` [PATCH 12/15] KVM: ARM: User space API for getting/setting co-proc registers Christoffer Dall
2012-09-15 15:35   ` Christoffer Dall
2012-09-15 15:35 ` [PATCH 13/15] KVM: ARM: Handle guest faults in KVM Christoffer Dall
2012-09-15 15:35   ` Christoffer Dall
2012-09-25 11:11   ` Min-gyu Kim
2012-09-25 11:11     ` Min-gyu Kim
2012-09-25 12:38     ` Christoffer Dall
2012-09-25 12:38       ` Christoffer Dall
2012-09-27  3:11       ` Min-gyu Kim
2012-09-27  3:11         ` Min-gyu Kim
2012-09-27  5:35         ` Christoffer Dall
2012-09-27  5:35           ` Christoffer Dall
2012-09-27 15:26         ` [kvmarm] " Marc Zyngier
2012-09-27 15:26           ` Marc Zyngier
2012-09-27 12:39       ` Catalin Marinas
2012-09-27 12:39         ` Catalin Marinas
2012-09-27 17:15         ` Christoffer Dall
2012-09-27 17:15           ` Christoffer Dall
2012-09-27 17:21           ` Catalin Marinas
2012-09-27 17:21             ` Catalin Marinas
2012-09-15 15:35 ` [PATCH 14/15] KVM: ARM: Handle I/O aborts Christoffer Dall
2012-09-15 15:35   ` Christoffer Dall
2012-09-27 15:11   ` Will Deacon
2012-09-27 15:11     ` Will Deacon
2012-09-30 21:49     ` Christoffer Dall
2012-09-30 21:49       ` Christoffer Dall
2012-10-01 12:53       ` Dave Martin
2012-10-01 12:53         ` Dave Martin
2012-10-01 15:12         ` Jon Medhurst (Tixy)
2012-10-01 15:12           ` Jon Medhurst (Tixy)
2012-10-01 16:07           ` Dave Martin
2012-10-01 16:07             ` Dave Martin
2012-10-05  9:00         ` Russell King - ARM Linux
2012-10-05  9:00           ` Russell King - ARM Linux
2012-10-08 10:04           ` Dave Martin
2012-10-08 10:04             ` Dave Martin
2012-10-08 21:52             ` Christoffer Dall
2012-10-08 21:52               ` Christoffer Dall
2012-09-15 15:36 ` [PATCH 15/15] KVM: ARM: Guest wait-for-interrupts (WFI) support Christoffer Dall
2012-09-15 15:36   ` Christoffer Dall
2012-09-25 17:04   ` Will Deacon
2012-09-25 17:04     ` Will Deacon
2012-09-29 23:00     ` Christoffer Dall
2012-09-29 23:00       ` Christoffer Dall
2012-09-18 12:21 ` [PATCH 00/15] KVM/ARM Implementation Will Deacon
2012-09-18 12:21   ` Will Deacon
2012-09-18 12:32   ` Christoffer Dall
2012-09-18 12:32     ` Christoffer Dall
2012-09-19 12:44 ` Avi Kivity
2012-09-19 12:44   ` Avi Kivity

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=20120915153502.21241.13218.stgit@ubuntu \
    --to=c.dall@virtualopensystems.com \
    --cc=linux-arm-kernel@lists.infradead.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.