From: Chris Wright <chrisw@sous-sol.org>
To: linux-kernel@vger.kernel.org
Cc: virtualization@lists.osdl.org, xen-devel@lists.xensource.com,
Ian Pratt <ian.pratt@xensource.com>,
Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
Subject: [RFC PATCH 18/35] Support gdt/idt/ldt handling on Xen.
Date: Tue, 09 May 2006 00:00:18 -0700 [thread overview]
Message-ID: <20060509085155.177937000@sous-sol.org> (raw)
In-Reply-To: 20060509084945.373541000@sous-sol.org
[-- Attachment #1: i386-desc --]
[-- Type: text/plain, Size: 8200 bytes --]
Move the macros which handle gdt/idt/ldt's into a subarch include
file and add implementations for running on Xen.
Signed-off-by: Ian Pratt <ian.pratt@xensource.com>
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
---
include/asm-i386/desc.h | 65 ++--------------------------
include/asm-i386/mach-default/mach_desc.h | 67 +++++++++++++++++++++++++++++
include/asm-i386/mach-xen/mach_desc.h | 69 ++++++++++++++++++++++++++++++
3 files changed, 141 insertions(+), 60 deletions(-)
--- linus-2.6.orig/include/asm-i386/desc.h
+++ linus-2.6/include/asm-i386/desc.h
@@ -33,18 +33,7 @@ static inline struct desc_struct *get_cp
return (struct desc_struct *)per_cpu(cpu_gdt_descr, cpu).address;
}
-#define load_TR_desc() __asm__ __volatile__("ltr %w0"::"q" (GDT_ENTRY_TSS*8))
-#define load_LDT_desc() __asm__ __volatile__("lldt %w0"::"q" (GDT_ENTRY_LDT*8))
-
-#define load_gdt(dtr) __asm__ __volatile("lgdt %0"::"m" (*dtr))
-#define load_idt(dtr) __asm__ __volatile("lidt %0"::"m" (*dtr))
-#define load_tr(tr) __asm__ __volatile("ltr %0"::"mr" (tr))
-#define load_ldt(ldt) __asm__ __volatile("lldt %0"::"mr" (ldt))
-
-#define store_gdt(dtr) __asm__ ("sgdt %0":"=m" (*dtr))
-#define store_idt(dtr) __asm__ ("sidt %0":"=m" (*dtr))
-#define store_tr(tr) __asm__ ("str %0":"=mr" (tr))
-#define store_ldt(ldt) __asm__ ("sldt %0":"=mr" (ldt))
+#include <mach_desc.h>
/*
* This is the ldt that every process will get unless we need
@@ -53,30 +42,6 @@ static inline struct desc_struct *get_cp
extern struct desc_struct default_ldt[];
extern void set_intr_gate(unsigned int irq, void * addr);
-#define _set_tssldt_desc(n,addr,limit,type) \
-__asm__ __volatile__ ("movw %w3,0(%2)\n\t" \
- "movw %w1,2(%2)\n\t" \
- "rorl $16,%1\n\t" \
- "movb %b1,4(%2)\n\t" \
- "movb %4,5(%2)\n\t" \
- "movb $0,6(%2)\n\t" \
- "movb %h1,7(%2)\n\t" \
- "rorl $16,%1" \
- : "=m"(*(n)) : "q" (addr), "r"(n), "ir"(limit), "i"(type))
-
-static inline void __set_tss_desc(unsigned int cpu, unsigned int entry, void *addr)
-{
- _set_tssldt_desc(&get_cpu_gdt_table(cpu)[entry], (int)addr,
- offsetof(struct tss_struct, __cacheline_filler) - 1, 0x89);
-}
-
-#define set_tss_desc(cpu,addr) __set_tss_desc(cpu, GDT_ENTRY_TSS, addr)
-
-static inline void set_ldt_desc(unsigned int cpu, void *addr, unsigned int size)
-{
- _set_tssldt_desc(&get_cpu_gdt_table(cpu)[GDT_ENTRY_LDT], (int)addr, ((size << 3)-1), 0x82);
-}
-
#define LDT_entry_a(info) \
((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff))
@@ -102,30 +67,11 @@ static inline void set_ldt_desc(unsigned
(info)->seg_not_present == 1 && \
(info)->useable == 0 )
-static inline void write_ldt_entry(void *ldt, int entry, __u32 entry_a, __u32 entry_b)
-{
- __u32 *lp = (__u32 *)((char *)ldt + entry*8);
- *lp = entry_a;
- *(lp+1) = entry_b;
-}
-
-#if TLS_SIZE != 24
-# error update this code.
-#endif
-
-static inline void load_TLS(struct thread_struct *t, unsigned int cpu)
-{
-#define C(i) get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]
- C(0); C(1); C(2);
-#undef C
-}
-
static inline void clear_LDT(void)
{
int cpu = get_cpu();
- set_ldt_desc(cpu, &default_ldt[0], 5);
- load_LDT_desc();
+ __set_ldt(cpu, DEFAULT_LDT, DEFAULT_LDT_SIZE);
put_cpu();
}
@@ -138,12 +84,11 @@ static inline void load_LDT_nolock(mm_co
int count = pc->size;
if (likely(!count)) {
- segments = &default_ldt[0];
- count = 5;
+ segments = DEFAULT_LDT;
+ count = DEFAULT_LDT_SIZE;
}
- set_ldt_desc(cpu, segments, count);
- load_LDT_desc();
+ __set_ldt(cpu, segments, count);
}
static inline void load_LDT(mm_context_t *pc)
--- /dev/null
+++ linus-2.6/include/asm-i386/mach-default/mach_desc.h
@@ -0,0 +1,67 @@
+#ifndef __ASM_MACH_DESC_H
+#define __ASM_MACH_DESC_H
+
+#define load_TR_desc() __asm__ __volatile__("ltr %w0"::"q" (GDT_ENTRY_TSS*8))
+#define load_LDT_desc() __asm__ __volatile__("lldt %w0"::"q" (GDT_ENTRY_LDT*8))
+
+#define load_gdt(dtr) __asm__ __volatile("lgdt %0"::"m" (*dtr))
+#define load_idt(dtr) __asm__ __volatile("lidt %0"::"m" (*dtr))
+#define load_tr(tr) __asm__ __volatile("ltr %0"::"mr" (tr))
+#define load_ldt(ldt) __asm__ __volatile("lldt %0"::"mr" (ldt))
+
+#define store_gdt(dtr) __asm__ ("sgdt %0":"=m" (*dtr))
+#define store_idt(dtr) __asm__ ("sidt %0":"=m" (*dtr))
+#define store_tr(tr) __asm__ ("str %0":"=mr" (tr))
+#define store_ldt(ldt) __asm__ ("sldt %0":"=mr" (ldt))
+
+#define _set_tssldt_desc(n,addr,limit,type) \
+__asm__ __volatile__ ("movw %w3,0(%2)\n\t" \
+ "movw %w1,2(%2)\n\t" \
+ "rorl $16,%1\n\t" \
+ "movb %b1,4(%2)\n\t" \
+ "movb %4,5(%2)\n\t" \
+ "movb $0,6(%2)\n\t" \
+ "movb %h1,7(%2)\n\t" \
+ "rorl $16,%1" \
+ : "=m"(*(n)) : "q" (addr), "r"(n), "ir"(limit), "i"(type))
+
+static inline void __set_tss_desc(unsigned int cpu, unsigned int entry, void *addr)
+{
+ _set_tssldt_desc(&get_cpu_gdt_table(cpu)[entry], (int)addr,
+ offsetof(struct tss_struct, __cacheline_filler) - 1, 0x89);
+}
+
+#define set_tss_desc(cpu,addr) __set_tss_desc(cpu, GDT_ENTRY_TSS, addr)
+
+static inline void set_ldt_desc(unsigned int cpu, void *addr, unsigned int size)
+{
+ _set_tssldt_desc(&get_cpu_gdt_table(cpu)[GDT_ENTRY_LDT], (int)addr, ((size << 3)-1), 0x82);
+}
+
+#define DEFAULT_LDT &default_ldt[0]
+#define DEFAULT_LDT_SIZE 5
+static inline void __set_ldt(unsigned int cpu, void *addr, unsigned int size)
+{
+ set_ldt_desc(cpu, addr, size);
+ load_LDT_desc();
+}
+
+static inline void write_ldt_entry(void *ldt, int entry, __u32 entry_a, __u32 entry_b)
+{
+ __u32 *lp = (__u32 *)((char *)ldt + entry*8);
+ *lp = entry_a;
+ *(lp+1) = entry_b;
+}
+
+#if TLS_SIZE != 24
+# error update this code.
+#endif
+
+static inline void load_TLS(struct thread_struct *t, unsigned int cpu)
+{
+#define C(i) get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]
+ C(0); C(1); C(2);
+#undef C
+}
+
+#endif /* __ASM_MACH_DESC_H */
--- /dev/null
+++ linus-2.6/include/asm-i386/mach-xen/mach_desc.h
@@ -0,0 +1,69 @@
+#ifndef __ASM_MACH_DESC_H
+#define __ASM_MACH_DESC_H
+
+extern struct trap_info xen_trap_table[];
+
+#define load_TR_desc()
+
+#define load_gdt(dtr) do { \
+ struct Xgt_desc_struct *gdt_descr = (dtr); \
+ unsigned long frames[16]; \
+ unsigned long va; \
+ int f; \
+ \
+ for (va = gdt_descr->address, f = 0; \
+ va < gdt_descr->address + gdt_descr->size; \
+ va += PAGE_SIZE, f++) { \
+ frames[f] = virt_to_mfn(va); \
+ make_lowmem_page_readonly( \
+ (void *)va, XENFEAT_writable_descriptor_tables); \
+ } \
+ if (HYPERVISOR_set_gdt(frames, gdt_descr->size / 8)) \
+ BUG(); \
+} while (0)
+
+#define load_idt(dtr) HYPERVISOR_set_trap_table(xen_trap_table)
+#define load_tr(tr) __asm__ __volatile("ltr %0"::"mr" (tr))
+#define load_ldt(ldt) __asm__ __volatile("lldt %0"::"mr" (ldt))
+
+#define store_gdt(dtr) __asm__ ("sgdt %0":"=m" (*dtr))
+#define store_idt(dtr) __asm__ ("sidt %0":"=m" (*dtr))
+#define store_tr(tr) __asm__ ("str %0":"=mr" (tr))
+#define store_ldt(ldt) __asm__ ("sldt %0":"=mr" (ldt))
+
+#define set_tss_desc(cpu,addr)
+
+static inline void set_ldt_desc(unsigned int cpu, void *addr, unsigned int size)
+{
+}
+
+#define DEFAULT_LDT NULL
+#define DEFAULT_LDT_SIZE 0
+static inline void __set_ldt(unsigned int cpu, void *addr, unsigned int size)
+{
+ struct mmuext_op op;
+ op.cmd = MMUEXT_SET_LDT;
+ op.arg1.linear_addr = (unsigned long)addr;
+ op.arg2.nr_ents = size;
+ BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
+}
+
+#define write_ldt_entry(ldt, entry, entry_a, entry_b) do { \
+ __u32 *lp = (__u32 *)((char *)ldt + entry * 8); \
+ maddr_t mach_lp = arbitrary_virt_to_machine(lp); \
+ HYPERVISOR_update_descriptor( \
+ mach_lp, (u64)entry_a | ((u64)entry_b<<32)); \
+} while (0)
+
+#if TLS_SIZE != 24
+# error update this code.
+#endif
+
+static inline void load_TLS(struct thread_struct *t, unsigned int cpu)
+{
+#define C(i) HYPERVISOR_update_descriptor(virt_to_machine(&get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN + i]), *(u64 *)&t->tls_array[i])
+ C(0); C(1); C(2);
+#undef C
+}
+
+#endif /* __ASM_MACH_DESC_H */
--
next prev parent reply other threads:[~2006-05-09 8:54 UTC|newest]
Thread overview: 184+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-05-09 8:49 [RFC PATCH 00/35] Xen i386 paravirtualization support Chris Wright
2006-05-09 7:00 ` [RFC PATCH 01/35] Add XEN config options and disable unsupported config options Chris Wright
2006-05-09 10:05 ` Adrian Bunk
2006-05-09 11:06 ` Ed Tomlinson
2006-05-09 12:45 ` Christian Limpach
2006-05-09 23:23 ` Chris Wright
2006-05-09 14:47 ` Daniel Walker
2006-05-09 15:16 ` Christian Limpach
2006-05-09 16:00 ` Daniel Walker
2006-05-09 23:25 ` Chris Wright
2006-05-09 16:42 ` Andi Kleen
2006-05-10 15:36 ` [Xen-devel] " Alan Cox
2006-05-10 15:48 ` Christian Limpach
2006-05-09 7:00 ` [RFC PATCH 02/35] Makefile support to build Xen subarch Chris Wright
2006-05-09 7:00 ` [RFC PATCH 03/35] Add Xen interface header files Chris Wright
2006-05-09 14:49 ` Martin J. Bligh
2006-05-09 17:54 ` Christian Limpach
2006-05-09 15:15 ` Christoph Hellwig
2006-05-09 19:35 ` Hollis Blanchard
2006-05-09 19:48 ` [Xen-devel] " Anthony Liguori
2006-05-09 22:34 ` Christoph Hellwig
2006-05-09 22:36 ` Ingo Oeser
2006-05-09 16:06 ` Daniel Walker
2006-05-09 16:18 ` Christian Limpach
2006-05-09 16:29 ` Daniel Walker
2006-05-09 7:00 ` [RFC PATCH 04/35] Hypervisor " Chris Wright
2006-05-09 22:43 ` Ingo Oeser
2006-05-09 23:01 ` Chris Wright
2006-05-09 7:00 ` [RFC PATCH 05/35] Add sync bitops Chris Wright
2006-05-09 22:56 ` Christoph Lameter
2006-05-09 23:04 ` Andi Kleen
2006-05-09 23:07 ` Chris Wright
2006-05-09 7:00 ` [RFC PATCH 06/35] Add vmlinuz build target Chris Wright
2006-05-09 7:00 ` [RFC PATCH 07/35] Make LOAD_OFFSET defined by subarch Chris Wright
2006-05-10 23:28 ` Zachary Amsden
2006-05-11 7:47 ` [Xen-devel] " Gerd Hoffmann
2006-05-11 8:51 ` Chris Wright
2006-05-11 9:06 ` Gerd Hoffmann
2006-05-11 16:43 ` Christian Limpach
2006-05-12 6:47 ` [Xen-devel] " Jan Beulich
2006-05-12 8:38 ` Christian Limpach
2006-05-09 7:00 ` [RFC PATCH 08/35] Add Xen-specific memory management definitions Chris Wright
2006-05-09 14:49 ` Martin J. Bligh
2006-05-09 17:44 ` Christian Limpach
2006-05-15 6:44 ` Pete Zaitcev
2006-05-15 7:04 ` Keir Fraser
2006-05-15 8:19 ` Christian Limpach
2006-05-17 16:06 ` Pete Zaitcev
2006-05-18 7:42 ` Chris Wright
2006-05-09 7:00 ` [RFC PATCH 09/35] Change __FIXADDR_TOP to leave room for the hypervisor Chris Wright
2006-05-09 7:00 ` [RFC PATCH 10/35] Add a new head.S start-of-day file for booting on Xen Chris Wright
2006-05-09 7:00 ` [RFC PATCH 11/35] Add support for Xen to entry.S Chris Wright
2006-05-09 16:51 ` Andi Kleen
2006-05-09 7:00 ` [RFC PATCH 12/35] Add start-of-day setup hooks to subarch Chris Wright
2006-05-09 7:00 ` [RFC PATCH 13/35] Support loading an initrd when running on Xen Chris Wright
2006-05-09 7:00 ` [RFC PATCH 14/35] Subarch support for CPUID instruction Chris Wright
2006-05-09 7:00 ` [RFC PATCH 15/35] subarch support for controlling interrupt delivery Chris Wright
2006-05-09 14:49 ` Martin J. Bligh
2006-05-09 14:55 ` Nick Piggin
2006-05-09 15:51 ` Christian Limpach
2006-05-09 16:02 ` Martin J. Bligh
2006-05-09 16:07 ` Andi Kleen
2006-05-09 16:29 ` Christian Limpach
2006-05-09 16:31 ` Andi Kleen
2006-05-09 20:42 ` Christian Limpach
2006-05-09 21:56 ` Andi Kleen
2006-05-10 10:35 ` Christian Limpach
2006-05-10 10:54 ` Andi Kleen
2006-05-09 21:56 ` Chris Wright
2006-05-09 7:00 ` [RFC PATCH 16/35] subarch support for interrupt and exception gates Chris Wright
2006-05-09 11:09 ` Andi Kleen
2006-05-09 12:55 ` Christian Limpach
2006-05-13 12:27 ` Andrew Morton
2006-05-15 18:30 ` Chris Wright
2006-05-09 7:00 ` [RFC PATCH 17/35] Segment register changes for Xen Chris Wright
2006-05-09 7:16 ` Pavel Machek
2006-05-10 20:09 ` Andi Kleen
2006-05-10 20:30 ` Pavel Machek
2006-05-11 10:34 ` Avi Kivity
2006-05-11 10:41 ` Andi Kleen
2006-05-12 0:28 ` [Xen-devel] " Rusty Russell
2006-05-09 16:44 ` Andi Kleen
2006-05-18 20:20 ` Zachary Amsden
2006-05-18 20:41 ` Keir Fraser
2006-05-18 21:26 ` Chris Wright
2006-05-09 7:00 ` Chris Wright [this message]
2006-05-09 7:21 ` [RFC PATCH 18/35] Support gdt/idt/ldt handling on Xen Pavel Machek
2006-05-10 20:23 ` Andi Kleen
2006-05-09 14:49 ` Martin J. Bligh
2006-05-09 18:14 ` Christian Limpach
2006-05-09 18:21 ` Martin Bligh
2006-05-09 7:00 ` [RFC PATCH 19/35] subarch support for control register accesses Chris Wright
2006-05-09 7:00 ` [RFC PATCH 20/35] subarch stack pointer update Chris Wright
2006-05-09 7:00 ` [RFC PATCH 21/35] subarch TLB support Chris Wright
2006-05-09 7:00 ` [RFC PATCH 22/35] subarch suport for idle loop (NO_IDLE_HZ for Xen) Chris Wright
2006-05-09 13:21 ` Andi Kleen
2006-05-09 15:13 ` Christian Limpach
2006-05-09 7:00 ` [RFC PATCH 23/35] Increase x86 interrupt vector range Chris Wright
2006-05-09 7:00 ` [RFC PATCH 24/35] Add support for Xen event channels Chris Wright
2006-05-12 21:41 ` Pavel Machek
2006-05-13 12:27 ` Andrew Morton
2006-05-13 13:02 ` Keir Fraser
2006-05-09 7:00 ` [RFC PATCH 25/35] Add Xen time abstractions Chris Wright
2006-05-09 16:23 ` Daniel Walker
2006-05-09 16:38 ` Christian Limpach
2006-05-09 19:27 ` Adrian Bunk
2006-05-09 21:50 ` Andi Kleen
2006-05-09 23:03 ` Ingo Oeser
2006-05-09 23:09 ` Andi Kleen
2006-05-09 23:13 ` Chris Wright
2006-05-12 21:44 ` Pavel Machek
2006-05-09 7:00 ` [RFC PATCH 26/35] Add Xen subarch reboot support Chris Wright
2006-05-09 17:02 ` Andi Kleen
2006-05-12 21:46 ` Pavel Machek
2006-05-12 21:57 ` Chris Wright
2006-05-09 7:00 ` [RFC PATCH 27/35] Add nosegneg capability to the vsyscall page notes Chris Wright
2006-05-09 7:00 ` [RFC PATCH 28/35] add support for Xen feature queries Chris Wright
2006-05-12 21:56 ` Pavel Machek
2006-05-09 7:00 ` [RFC PATCH 29/35] Add the Xen virtual console driver Chris Wright
2006-05-09 13:26 ` Andi Kleen
2006-05-09 15:03 ` Christian Limpach
2006-05-13 12:27 ` Andrew Morton
2006-05-13 12:51 ` Nick Piggin
2006-05-13 14:29 ` Andrew Morton
2006-05-13 14:43 ` Nick Piggin
2006-05-09 7:00 ` [RFC PATCH 30/35] Add apply_to_page_range() function Chris Wright
2006-05-09 7:00 ` [RFC PATCH 31/35] Add Xen grant table support Chris Wright
2006-05-09 7:00 ` [RFC PATCH 32/35] Add Xen driver utility functions Chris Wright
2006-05-09 19:48 ` Greg KH
2006-05-09 21:50 ` Andi Kleen
2006-05-09 7:00 ` [RFC PATCH 33/35] Add the Xenbus sysfs and virtual device hotplug driver Chris Wright
2006-05-09 16:06 ` Alexey Dobriyan
2006-05-09 16:28 ` Andi Kleen
2006-05-09 19:40 ` Greg KH
2006-05-09 21:53 ` Chris Wright
2006-05-09 22:01 ` Greg KH
2006-05-09 22:50 ` Chris Wright
2006-05-09 23:43 ` Anthony Liguori
2006-05-09 19:49 ` Greg KH
2006-05-09 19:58 ` Chris Wright
2006-05-13 12:28 ` Andrew Morton
2006-05-09 7:00 ` [RFC PATCH 34/35] Add the Xen virtual network device driver Chris Wright
2006-05-09 11:55 ` [Xen-devel] " Herbert Xu
2006-05-09 12:43 ` Christian Limpach
2006-05-09 13:01 ` Herbert Xu
2006-05-09 13:14 ` Andi Kleen
2006-05-09 13:16 ` Christian Limpach
2006-05-09 13:26 ` Herbert Xu
2006-05-09 14:00 ` Christian Limpach
2006-05-09 14:30 ` David Boutcher
2006-05-09 23:35 ` Chris Wright
2006-05-09 11:58 ` Christoph Hellwig
2006-05-09 23:37 ` Chris Wright
2006-05-09 18:56 ` Stephen Hemminger
2006-05-09 23:39 ` Chris Wright
2006-05-09 20:25 ` Stephen Hemminger
2006-05-09 20:26 ` Keir Fraser
2006-05-09 20:39 ` Stephen Hemminger
2006-05-09 20:46 ` Roland Dreier
2006-05-10 18:28 ` Andi Kleen
2006-05-11 0:33 ` Herbert Xu
2006-05-11 7:49 ` Keir Fraser
2006-05-11 8:04 ` Herbert Xu
2006-05-11 9:47 ` Andi Kleen
2006-05-11 16:18 ` Stephen Hemminger
2006-05-11 16:48 ` Rick Jones
2006-05-11 16:55 ` Stephen Hemminger
2006-05-11 17:30 ` Andi Kleen
2006-05-09 20:32 ` Chris Wright
2006-05-09 22:41 ` [Xen-devel] " Herbert Xu
2006-05-09 23:51 ` Chris Wright
2006-05-10 6:36 ` Keir Fraser
2006-05-09 7:00 ` [RFC PATCH 35/35] Add Xen virtual block " Chris Wright
2006-05-09 12:01 ` Christoph Hellwig
2006-05-09 14:49 ` [RFC PATCH 00/35] Xen i386 paravirtualization support Martin J. Bligh
2006-05-09 15:07 ` Christoph Hellwig
2006-05-09 15:12 ` Martin J. Bligh
2006-05-09 15:20 ` Andi Kleen
2006-05-09 15:22 ` Christoph Hellwig
2006-05-09 15:45 ` Pekka Enberg
2006-05-14 1:35 ` Andrew Morton
2006-05-15 21:01 ` Chris Wright
-- strict thread matches above, loose matches on Subject: below --
2006-03-22 6:30 Chris Wright
2006-03-22 6:30 ` [RFC PATCH 18/35] Support gdt/idt/ldt handling on Xen Chris Wright
2006-03-22 14:30 ` Andi Kleen
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=20060509085155.177937000@sous-sol.org \
--to=chrisw@sous-sol.org \
--cc=Christian.Limpach@cl.cam.ac.uk \
--cc=ian.pratt@xensource.com \
--cc=linux-kernel@vger.kernel.org \
--cc=virtualization@lists.osdl.org \
--cc=xen-devel@lists.xensource.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).