All of lore.kernel.org
 help / color / mirror / Atom feed
From: Xin Li <xin3.li@intel.com>
To: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-edac@vger.kernel.org, linux-hyperv@vger.kernel.org,
	kvm@vger.kernel.org, xen-devel@lists.xenproject.org
Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de,
	dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com,
	luto@kernel.org, pbonzini@redhat.com, seanjc@google.com,
	peterz@infradead.org, jgross@suse.com, ravi.v.shankar@intel.com,
	mhiramat@kernel.org, andrew.cooper3@citrix.com,
	jiangshanlai@gmail.com, nik.borisov@suse.com,
	shan.kang@intel.com
Subject: [PATCH v13 01/35] x86/cpufeatures,opcode,msr: Add the WRMSRNS instruction support
Date: Tue,  5 Dec 2023 02:49:50 -0800	[thread overview]
Message-ID: <20231205105030.8698-2-xin3.li@intel.com> (raw)
In-Reply-To: <20231205105030.8698-1-xin3.li@intel.com>

WRMSRNS is an instruction that behaves exactly like WRMSR, with
the only difference being that it is not a serializing instruction
by default. Under certain conditions, WRMSRNS may replace WRMSR to
improve performance.

Add its CPU feature bit, opcode to the x86 opcode map, and an
always inline API __wrmsrns() to embed WRMSRNS into the code.

Tested-by: Shan Kang <shan.kang@intel.com>
Signed-off-by: Xin Li <xin3.li@intel.com>
---

Changes since v12:
* Merge the 3 WRMSRNS patches into one (Borislav Petkov).
* s/cpu/CPU/g (Borislav Petkov).
* Shorten the WRMSRNS description (Borislav Petkov).
---
 arch/x86/include/asm/cpufeatures.h       |  1 +
 arch/x86/include/asm/msr.h               | 18 ++++++++++++++++++
 arch/x86/lib/x86-opcode-map.txt          |  2 +-
 tools/arch/x86/include/asm/cpufeatures.h |  1 +
 tools/arch/x86/lib/x86-opcode-map.txt    |  2 +-
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h
index 149cc5d5c2ae..a903fc130e49 100644
--- a/arch/x86/include/asm/cpufeatures.h
+++ b/arch/x86/include/asm/cpufeatures.h
@@ -325,6 +325,7 @@
 #define X86_FEATURE_FSRS		(12*32+11) /* "" Fast short REP STOSB */
 #define X86_FEATURE_FSRC		(12*32+12) /* "" Fast short REP {CMPSB,SCASB} */
 #define X86_FEATURE_LKGS		(12*32+18) /* "" Load "kernel" (userspace) GS */
+#define X86_FEATURE_WRMSRNS		(12*32+19) /* "" Non-serializing WRMSR */
 #define X86_FEATURE_AMX_FP16		(12*32+21) /* "" AMX fp16 Support */
 #define X86_FEATURE_AVX_IFMA            (12*32+23) /* "" Support for VPMADD52[H,L]UQ */
 #define X86_FEATURE_LAM			(12*32+26) /* Linear Address Masking */
diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h
index 65ec1965cd28..c284ff9ebe67 100644
--- a/arch/x86/include/asm/msr.h
+++ b/arch/x86/include/asm/msr.h
@@ -97,6 +97,19 @@ static __always_inline void __wrmsr(unsigned int msr, u32 low, u32 high)
 		     : : "c" (msr), "a"(low), "d" (high) : "memory");
 }
 
+/*
+ * WRMSRNS behaves exactly like WRMSR with the only difference being
+ * that it is not a serializing instruction by default.
+ */
+static __always_inline void __wrmsrns(u32 msr, u32 low, u32 high)
+{
+	/* Instruction opcode for WRMSRNS; supported in binutils >= 2.40. */
+	asm volatile("1: .byte 0x0f,0x01,0xc6\n"
+		     "2:\n"
+		     _ASM_EXTABLE_TYPE(1b, 2b, EX_TYPE_WRMSR)
+		     : : "c" (msr), "a"(low), "d" (high));
+}
+
 #define native_rdmsr(msr, val1, val2)			\
 do {							\
 	u64 __val = __rdmsr((msr));			\
@@ -297,6 +310,11 @@ do {							\
 
 #endif	/* !CONFIG_PARAVIRT_XXL */
 
+static __always_inline void wrmsrns(u32 msr, u64 val)
+{
+	__wrmsrns(msr, val, val >> 32);
+}
+
 /*
  * 64-bit version of wrmsr_safe():
  */
diff --git a/arch/x86/lib/x86-opcode-map.txt b/arch/x86/lib/x86-opcode-map.txt
index 5168ee0360b2..1efe1d9bf5ce 100644
--- a/arch/x86/lib/x86-opcode-map.txt
+++ b/arch/x86/lib/x86-opcode-map.txt
@@ -1051,7 +1051,7 @@ GrpTable: Grp6
 EndTable
 
 GrpTable: Grp7
-0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) | PCONFIG (101),(11B) | ENCLV (000),(11B)
+0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) | PCONFIG (101),(11B) | ENCLV (000),(11B) | WRMSRNS (110),(11B)
 1: SIDT Ms | MONITOR (000),(11B) | MWAIT (001),(11B) | CLAC (010),(11B) | STAC (011),(11B) | ENCLS (111),(11B)
 2: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B) | VMFUNC (100),(11B) | XEND (101)(11B) | XTEST (110)(11B) | ENCLU (111),(11B)
 3: LIDT Ms
diff --git a/tools/arch/x86/include/asm/cpufeatures.h b/tools/arch/x86/include/asm/cpufeatures.h
index 4af140cf5719..26a73ae18a86 100644
--- a/tools/arch/x86/include/asm/cpufeatures.h
+++ b/tools/arch/x86/include/asm/cpufeatures.h
@@ -322,6 +322,7 @@
 #define X86_FEATURE_FSRS		(12*32+11) /* "" Fast short REP STOSB */
 #define X86_FEATURE_FSRC		(12*32+12) /* "" Fast short REP {CMPSB,SCASB} */
 #define X86_FEATURE_LKGS		(12*32+18) /* "" Load "kernel" (userspace) GS */
+#define X86_FEATURE_WRMSRNS		(12*32+19) /* "" Non-serializing WRMSR */
 #define X86_FEATURE_AMX_FP16		(12*32+21) /* "" AMX fp16 Support */
 #define X86_FEATURE_AVX_IFMA            (12*32+23) /* "" Support for VPMADD52[H,L]UQ */
 #define X86_FEATURE_LAM			(12*32+26) /* Linear Address Masking */
diff --git a/tools/arch/x86/lib/x86-opcode-map.txt b/tools/arch/x86/lib/x86-opcode-map.txt
index 5168ee0360b2..1efe1d9bf5ce 100644
--- a/tools/arch/x86/lib/x86-opcode-map.txt
+++ b/tools/arch/x86/lib/x86-opcode-map.txt
@@ -1051,7 +1051,7 @@ GrpTable: Grp6
 EndTable
 
 GrpTable: Grp7
-0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) | PCONFIG (101),(11B) | ENCLV (000),(11B)
+0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) | PCONFIG (101),(11B) | ENCLV (000),(11B) | WRMSRNS (110),(11B)
 1: SIDT Ms | MONITOR (000),(11B) | MWAIT (001),(11B) | CLAC (010),(11B) | STAC (011),(11B) | ENCLS (111),(11B)
 2: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B) | VMFUNC (100),(11B) | XEND (101)(11B) | XTEST (110)(11B) | ENCLU (111),(11B)
 3: LIDT Ms
-- 
2.43.0


  reply	other threads:[~2023-12-05 11:21 UTC|newest]

Thread overview: 150+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-05 10:49 [PATCH v13 00/35] x86: enable FRED for x86-64 Xin Li
2023-12-05 10:49 ` Xin Li [this message]
2023-12-11  5:14   ` [PATCH v13 01/35] x86/cpufeatures,opcode,msr: Add the WRMSRNS instruction support Masami Hiramatsu
2024-01-02 15:34   ` Borislav Petkov
2024-01-02 22:06     ` Li, Xin3
2024-01-03 11:10       ` Borislav Petkov
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Xin Li
2023-12-05 10:49 ` [PATCH v13 02/35] x86/entry: Remove idtentry_sysvec from entry_{32,64}.S Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Xin Li
2023-12-05 10:49 ` [PATCH v13 03/35] x86/trapnr: Add event type macros to <asm/trapnr.h> Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Xin Li
2023-12-05 10:49 ` [PATCH v13 04/35] Documentation/x86/64: Add a documentation for FRED Xin Li
2024-01-25 18:21   ` [tip: x86/fred] Documentation/x86/64: Add " tip-bot2 for Xin Li
2023-12-05 10:49 ` [PATCH v13 05/35] x86/fred: Add Kconfig option for FRED (CONFIG_X86_FRED) Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:49 ` [PATCH v13 06/35] x86/cpufeatures: Add the CPU feature bit for FRED Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:49 ` [PATCH v13 07/35] x86/fred: Disable FRED support if CONFIG_X86_FRED is disabled Xin Li
2024-01-22 13:08   ` Borislav Petkov
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:49 ` [PATCH v13 08/35] x86/fred: Disable FRED by default in its early stage Xin Li
2024-01-22 13:19   ` Borislav Petkov
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31  7:21   ` [tip: x86/fred] x86/fred: Add a fred= cmdline param tip-bot2 for Xin Li
2023-12-05 10:49 ` [PATCH v13 09/35] x86/opcode: Add ERET[US] instructions to the x86 opcode map Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:49 ` [PATCH v13 10/35] x86/objtool: Teach objtool about ERET[US] Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 11/35] x86/cpu: Add X86_CR4_FRED macro Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 12/35] x86/cpu: Add MSR numbers for FRED configuration Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 13/35] x86/ptrace: Cleanup the definition of the pt_regs structure Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31  7:21   ` tip-bot2 for Xin Li
2024-01-31 21:14   ` tip-bot2 for Xin Li
2024-02-03 23:52     ` H. Peter Anvin
2024-02-06 19:04       ` Xin Li
2024-02-06 20:45         ` H. Peter Anvin
2024-02-06 21:10           ` H.J. Lu
2023-12-05 10:50 ` [PATCH v13 14/35] x86/ptrace: Add FRED additional information to " Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31  7:21   ` tip-bot2 for Xin Li
2024-01-31 21:14   ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 15/35] x86/fred: Add a new header file for FRED definitions Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 16/35] x86/fred: Reserve space for the FRED stack frame Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 17/35] x86/fred: Update MSR_IA32_FRED_RSP0 during task switch Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 18/35] x86/fred: Disallow the swapgs instruction when FRED is enabled Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 19/35] x86/fred: No ESPFIX needed " Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 20/35] x86/fred: Allow single-step trap and NMI when starting a new task Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 21/35] x86/fred: Make exc_page_fault() work for FRED Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 22/35] x86/idtentry: Incorporate definitions/declarations of the FRED entries Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31  7:21   ` tip-bot2 for Xin Li
2024-01-31 21:14   ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 23/35] x86/fred: Add a debug fault entry stub for FRED Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 24/35] x86/fred: Add a NMI " Xin Li
2023-12-15  1:51   ` H. Peter Anvin
2023-12-15 18:37     ` Li, Xin3
2023-12-16  6:31       ` [PATCH v13A " Xin Li
2024-01-25 18:21         ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21         ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14         ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 25/35] x86/fred: Add a machine check " Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31  7:21   ` tip-bot2 for Xin Li
2024-01-31 21:14   ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 26/35] x86/fred: FRED entry/exit and dispatch code Xin Li
2023-12-05 12:25   ` Andrew Cooper
2023-12-05 19:03     ` Li, Xin3
2023-12-06  7:45     ` Li, Xin3
2023-12-06 14:11       ` Andrew Cooper
2023-12-06 19:19         ` Li, Xin3
2023-12-06 19:26           ` H. Peter Anvin
2023-12-06 19:58           ` Brian Gerst
2023-12-07  9:43           ` Li, Xin3
2023-12-09 21:42             ` [PATCH v13A " Xin Li
2024-01-25 18:21               ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-26 10:00                 ` Borislav Petkov
2024-01-26 10:05               ` [PATCH v13A 26/35] " Borislav Petkov
2024-01-31  7:21               ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14               ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 27/35] x86/traps: Add sysvec_install() to install a system interrupt handler Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31  7:21   ` tip-bot2 for Xin Li
2024-01-31 21:14   ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 28/35] x86/fred: Let ret_from_fork_asm() jmp to asm_fred_exit_user when FRED is enabled Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 29/35] x86/fred: Fixup fault on ERETU by jumping to fred_entrypoint_user Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31  7:21   ` tip-bot2 for Xin Li
2024-01-31 21:14   ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 30/35] x86/entry/calling: Allow PUSH_AND_CLEAR_REGS being used beyond actual entry code Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Peter Zijlstra (Intel)
2024-01-31  7:21   ` tip-bot2 for Peter Zijlstra (Intel)
2024-01-31 21:14   ` tip-bot2 for Peter Zijlstra (Intel)
2023-12-05 10:50 ` [PATCH v13 31/35] x86/entry: Add fred_entry_from_kvm() for VMX to handle IRQ/NMI Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31  7:21   ` tip-bot2 for Xin Li
2024-01-31 21:14   ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 32/35] KVM: VMX: Call fred_entry_from_kvm() for IRQ/NMI handling Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31  7:21   ` tip-bot2 for Xin Li
2024-01-31 21:14   ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 33/35] x86/syscall: Split IDT syscall setup code into idt_syscall_init() Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31  7:21   ` tip-bot2 for Xin Li
2024-01-31 21:14   ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 34/35] x86/fred: Add FRED initialization functions Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 35/35] x86/fred: Invoke FRED initialization code to enable FRED Xin Li
2024-01-25 18:21   ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31  7:21   ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14   ` tip-bot2 for H. Peter Anvin (Intel)

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=20231205105030.8698-2-xin3.li@intel.com \
    --to=xin3.li@intel.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=jgross@suse.com \
    --cc=jiangshanlai@gmail.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-edac@vger.kernel.org \
    --cc=linux-hyperv@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=mingo@redhat.com \
    --cc=nik.borisov@suse.com \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=ravi.v.shankar@intel.com \
    --cc=seanjc@google.com \
    --cc=shan.kang@intel.com \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    --cc=xen-devel@lists.xenproject.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.