qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-devel@nongnu.org
Cc: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>,
	Laurent Vivier <laurent@vivier.eu>
Subject: [Qemu-devel] [PATCH risu 8/9] Move recv_and_compare_register_info() and report_match_status() to reginfo.c
Date: Fri, 24 Feb 2017 17:35:27 +0000	[thread overview]
Message-ID: <1487957728-8354-9-git-send-email-peter.maydell@linaro.org> (raw)
In-Reply-To: <1487957728-8354-1-git-send-email-peter.maydell@linaro.org>

Move recv_and_compare_register_info() and report_match_status() to
reginfo.c -- they are essentially the same for all targets so
can be common code. The shared variables they use come with them.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 reginfo.c      | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 risu.h         |   4 +-
 risu_aarch64.c | 108 -----------------------------------------------------
 risu_arm.c     | 116 ---------------------------------------------------------
 risu_m68k.c    |  94 ----------------------------------------------
 risu_ppc64le.c |  94 ----------------------------------------------
 6 files changed, 110 insertions(+), 414 deletions(-)

diff --git a/reginfo.c b/reginfo.c
index d62a2ed..96c6342 100644
--- a/reginfo.c
+++ b/reginfo.c
@@ -10,9 +10,17 @@
  *****************************************************************************/
 
 #include <stdio.h>
+#include <string.h>
 
 #include "risu.h"
 
+struct reginfo master_ri, apprentice_ri;
+
+uint8_t apprentice_memblock[MEMBLOCKLEN];
+
+static int mem_used = 0;
+static int packet_mismatch = 0;
+
 int send_register_info(int sock, void *uc)
 {
     struct reginfo ri;
@@ -41,3 +49,103 @@ int send_register_info(int sock, void *uc)
     }
     return 0;
 }
+
+/* Read register info from the socket and compare it with that from the
+ * ucontext. Return 0 for match, 1 for end-of-test, 2 for mismatch.
+ * NB: called from a signal handler.
+ *
+ * We don't have any kind of identifying info in the incoming data
+ * that says whether it is register or memory data, so if the two
+ * sides get out of sync then we will fail obscurely.
+ */
+int recv_and_compare_register_info(int sock, void *uc)
+{
+    int resp = 0, op;
+
+    reginfo_init(&master_ri, uc);
+    op = get_risuop(&master_ri);
+
+    switch (op) {
+    case OP_COMPARE:
+    case OP_TESTEND:
+    default:
+        /* Do a simple register compare on (a) explicit request
+         * (b) end of test (c) a non-risuop UNDEF
+         */
+        if (recv_data_pkt(sock, &apprentice_ri, sizeof(apprentice_ri))) {
+            packet_mismatch = 1;
+            resp = 2;
+
+        } else if (!reginfo_is_eq(&master_ri, &apprentice_ri)) {
+            /* register mismatch */
+            resp = 2;
+
+        } else if (op == OP_TESTEND) {
+            resp = 1;
+        }
+        send_response_byte(sock, resp);
+        break;
+      case OP_SETMEMBLOCK:
+          memblock = (void *)(uintptr_t)get_reginfo_paramreg(&master_ri);
+          break;
+      case OP_GETMEMBLOCK:
+          set_ucontext_paramreg(uc, get_reginfo_paramreg(&master_ri) +
+                                (uintptr_t)memblock);
+          break;
+      case OP_COMPAREMEM:
+         mem_used = 1;
+         if (recv_data_pkt(sock, apprentice_memblock, MEMBLOCKLEN)) {
+             packet_mismatch = 1;
+             resp = 2;
+         } else if (memcmp(memblock, apprentice_memblock, MEMBLOCKLEN) != 0) {
+             /* memory mismatch */
+             resp = 2;
+         }
+         send_response_byte(sock, resp);
+         break;
+   }
+
+    return resp;
+}
+
+/* Print a useful report on the status of the last comparison
+ * done in recv_and_compare_register_info(). This is called on
+ * exit, so need not restrict itself to signal-safe functions.
+ * Should return 0 if it was a good match (ie end of test)
+ * and 1 for a mismatch.
+ */
+int report_match_status(void)
+{
+   int resp = 0;
+   fprintf(stderr, "match status...\n");
+   if (packet_mismatch) {
+       fprintf(stderr, "packet mismatch (probably disagreement "
+               "about UNDEF on load/store)\n");
+       /* We don't have valid reginfo from the apprentice side
+        * so stop now rather than printing anything about it.
+        */
+       fprintf(stderr, "master reginfo:\n");
+       reginfo_dump(&master_ri, stderr);
+       return 1;
+   }
+   if (!reginfo_is_eq(&master_ri, &apprentice_ri)) {
+       fprintf(stderr, "mismatch on regs!\n");
+       resp = 1;
+   }
+   if (mem_used && memcmp(memblock, &apprentice_memblock, MEMBLOCKLEN) != 0) {
+       fprintf(stderr, "mismatch on memory!\n");
+       resp = 1;
+   }
+   if (!resp) {
+       fprintf(stderr, "match!\n");
+       return 0;
+   }
+
+   fprintf(stderr, "master reginfo:\n");
+   reginfo_dump(&master_ri, stderr);
+   fprintf(stderr, "apprentice reginfo:\n");
+   reginfo_dump(&apprentice_ri, stderr);
+
+   reginfo_dump_mismatch(&master_ri, &apprentice_ri, stderr);
+   return resp;
+}
diff --git a/risu.h b/risu.h
index 0f00b5f..90e4f23 100644
--- a/risu.h
+++ b/risu.h
@@ -57,8 +57,6 @@ struct reginfo;
  */
 int send_register_info(int sock, void *uc);
 
-/* Interface provided by CPU-specific code: */
-
 /* Read register info from the socket and compare it with that from the
  * ucontext. Return 0 for match, 1 for end-of-test, 2 for mismatch.
  * NB: called from a signal handler.
@@ -73,6 +71,8 @@ int recv_and_compare_register_info(int sock, void *uc);
  */
 int report_match_status(void);
 
+/* Interface provided by CPU-specific code: */
+
 /* Move the PC past this faulting insn by adjusting ucontext
  */
 void advance_pc(void *uc);
diff --git a/risu_aarch64.c b/risu_aarch64.c
index 7363eb1..cdd23d8 100644
--- a/risu_aarch64.c
+++ b/risu_aarch64.c
@@ -17,13 +17,6 @@
 #include "risu.h"
 #include "risu_reginfo_aarch64.h"
 
-struct reginfo master_ri, apprentice_ri;
-
-uint8_t apprentice_memblock[MEMBLOCKLEN];
-
-static int mem_used = 0;
-static int packet_mismatch = 0;
-
 void advance_pc(void *vuc)
 {
     ucontext_t *uc = vuc;
@@ -52,104 +45,3 @@ int get_risuop(struct reginfo *ri)
     uint32_t risukey = 0x00005af0;
     return (key != risukey) ? -1 : op;
 }
-
-/* Read register info from the socket and compare it with that from the
- * ucontext. Return 0 for match, 1 for end-of-test, 2 for mismatch.
- * NB: called from a signal handler.
- *
- * We don't have any kind of identifying info in the incoming data
- * that says whether it is register or memory data, so if the two
- * sides get out of sync then we will fail obscurely.
- */
-int recv_and_compare_register_info(int sock, void *uc)
-{
-    int resp = 0, op;
-
-    reginfo_init(&master_ri, uc);
-    op = get_risuop(&master_ri);
-
-    switch (op) {
-    case OP_COMPARE:
-    case OP_TESTEND:
-    default:
-        /* Do a simple register compare on (a) explicit request
-         * (b) end of test (c) a non-risuop UNDEF
-         */
-        if (recv_data_pkt(sock, &apprentice_ri, sizeof(apprentice_ri))) {
-            packet_mismatch = 1;
-            resp = 2;
-
-        } else if (!reginfo_is_eq(&master_ri, &apprentice_ri)) {
-            /* register mismatch */
-            resp = 2;
-
-        } else if (op == OP_TESTEND) {
-            resp = 1;
-        }
-        send_response_byte(sock, resp);
-        break;
-      case OP_SETMEMBLOCK:
-          memblock = (void *)get_reginfo_paramreg(&master_ri);
-          break;
-      case OP_GETMEMBLOCK:
-          set_ucontext_paramreg(uc, get_reginfo_paramreg(&master_ri) +
-                                (uintptr_t)memblock);
-          break;
-      case OP_COMPAREMEM:
-         mem_used = 1;
-         if (recv_data_pkt(sock, apprentice_memblock, MEMBLOCKLEN)) {
-             packet_mismatch = 1;
-             resp = 2;
-         } else if (memcmp(memblock, apprentice_memblock, MEMBLOCKLEN) != 0) {
-             /* memory mismatch */
-             resp = 2;
-         }
-         send_response_byte(sock, resp);
-         break;
-   }
-
-    return resp;
-}
-
-/* Print a useful report on the status of the last comparison
- * done in recv_and_compare_register_info(). This is called on
- * exit, so need not restrict itself to signal-safe functions.
- * Should return 0 if it was a good match (ie end of test)
- * and 1 for a mismatch.
- */
-int report_match_status(void)
-{
-   int resp = 0;
-   fprintf(stderr, "match status...\n");
-   if (packet_mismatch) {
-       fprintf(stderr, "packet mismatch (probably disagreement "
-               "about UNDEF on load/store)\n");
-       /* We don't have valid reginfo from the apprentice side
-        * so stop now rather than printing anything about it.
-        */
-       fprintf(stderr, "master reginfo:\n");
-       reginfo_dump(&master_ri, stderr);
-       return 1;
-   }
-   if (memcmp(&master_ri, &apprentice_ri, sizeof(master_ri)) != 0)
-   {
-       fprintf(stderr, "mismatch on regs!\n");
-       resp = 1;
-   }
-   if (mem_used && memcmp(memblock, &apprentice_memblock, MEMBLOCKLEN) != 0) {
-       fprintf(stderr, "mismatch on memory!\n");
-       resp = 1;
-   }
-   if (!resp) {
-       fprintf(stderr, "match!\n");
-       return 0;
-   }
-
-   fprintf(stderr, "master reginfo:\n");
-   reginfo_dump(&master_ri, stderr);
-   fprintf(stderr, "apprentice reginfo:\n");
-   reginfo_dump(&apprentice_ri, stderr);
-
-   reginfo_dump_mismatch(&master_ri, &apprentice_ri, stderr);
-   return resp;
-}
diff --git a/risu_arm.c b/risu_arm.c
index 878b2ee..f570828 100644
--- a/risu_arm.c
+++ b/risu_arm.c
@@ -16,12 +16,6 @@
 #include "risu.h"
 #include "risu_reginfo_arm.h"
 
-struct reginfo master_ri, apprentice_ri;
-uint8_t apprentice_memblock[MEMBLOCKLEN];
-
-static int mem_used = 0;
-static int packet_mismatch = 0;
-
 int insnsize(ucontext_t *uc)
 {
    /* Return instruction size in bytes of the
@@ -76,113 +70,3 @@ int get_risuop(struct reginfo *ri)
    uint32_t risukey = (isz == 2) ? 0xdee0 : 0xe7fe5af0;
    return (key != risukey) ? -1 : op;
 }
-
-/* Read register info from the socket and compare it with that from the
- * ucontext. Return 0 for match, 1 for end-of-test, 2 for mismatch.
- * NB: called from a signal handler.
- *
- * We don't have any kind of identifying info in the incoming data
- * that says whether it's register or memory data, so if the two
- * sides get out of sync then we will fail obscurely.
- */
-int recv_and_compare_register_info(int sock, void *uc)
-{
-   int resp = 0, op;
-
-   reginfo_init(&master_ri, uc);
-   op = get_risuop(&master_ri);
-
-   switch (op)
-   {
-      case OP_COMPARE:
-      case OP_TESTEND:
-      default:
-         /* Do a simple register compare on (a) explicit request
-          * (b) end of test (c) a non-risuop UNDEF
-          */
-         if (recv_data_pkt(sock, &apprentice_ri, sizeof(apprentice_ri)))
-         {
-            packet_mismatch = 1;
-            resp = 2;
-         }
-         else if (memcmp(&master_ri, &apprentice_ri, sizeof(master_ri)) != 0)
-         {
-            /* register mismatch */
-            resp = 2;
-         }
-         else if (op == OP_TESTEND)
-         {
-            resp = 1;
-         }
-         send_response_byte(sock, resp);
-         break;
-      case OP_SETMEMBLOCK:
-         memblock = (void *)(uintptr_t)get_reginfo_paramreg(&master_ri);
-         break;
-      case OP_GETMEMBLOCK:
-         set_ucontext_paramreg(uc, get_reginfo_paramreg(&master_ri) +
-                               (uintptr_t)memblock);
-         break;
-      case OP_COMPAREMEM:
-         mem_used = 1;
-         if (recv_data_pkt(sock, apprentice_memblock, MEMBLOCKLEN))
-         {
-            packet_mismatch = 1;
-            resp = 2;
-         }
-         else if (memcmp(memblock, apprentice_memblock, MEMBLOCKLEN) != 0)
-         {
-            /* memory mismatch */
-            resp = 2;
-         }
-         send_response_byte(sock, resp);
-         break;
-   }
-   return resp;
-}
-
-/* Print a useful report on the status of the last comparison
- * done in recv_and_compare_register_info(). This is called on
- * exit, so need not restrict itself to signal-safe functions.
- * Should return 0 if it was a good match (ie end of test)
- * and 1 for a mismatch.
- */
-int report_match_status(void)
-{
-   int resp = 0;
-   fprintf(stderr, "match status...\n");
-   if (packet_mismatch)
-   {
-      fprintf(stderr, "packet mismatch (probably disagreement "
-              "about UNDEF on load/store)\n");
-      /* We don't have valid reginfo from the apprentice side
-       * so stop now rather than printing anything about it.
-       */
-      fprintf(stderr, "master reginfo:\n");
-      reginfo_dump(&master_ri, stderr);
-      return 1;
-   }
-   if (!reginfo_is_eq(&master_ri, &apprentice_ri))
-   {
-      fprintf(stderr, "mismatch on regs!\n");
-      resp = 1;
-   }
-   if (mem_used && memcmp(memblock, &apprentice_memblock, MEMBLOCKLEN) != 0)
-   {
-      fprintf(stderr, "mismatch on memory!\n");
-      resp = 1;
-   }
-   if (!resp)
-   {
-      fprintf(stderr, "match!\n");
-      return 0;
-   }
-
-   fprintf(stderr, "master reginfo:\n");
-   reginfo_dump(&master_ri, stderr);
-   fprintf(stderr, "apprentice reginfo:\n");
-   reginfo_dump(&apprentice_ri, stderr);
-
-   reginfo_dump_mismatch(&master_ri, &apprentice_ri, stderr);
-   return resp;
-}
diff --git a/risu_m68k.c b/risu_m68k.c
index c0e29ff..851487b 100644
--- a/risu_m68k.c
+++ b/risu_m68k.c
@@ -13,12 +13,6 @@
 #include "risu.h"
 #include "risu_reginfo_m68k.h"
 
-struct reginfo master_ri, apprentice_ri;
-static int mem_used = 0;
-static int packet_mismatch = 0;
-
-uint8_t apprentice_memblock[MEMBLOCKLEN];
-
 void advance_pc(void *vuc)
 {
     ucontext_t *uc = (ucontext_t*)vuc;
@@ -44,91 +38,3 @@ int get_risuop(struct reginfo *ri)
     uint32_t risukey = 0x4afc7000;
     return (key != risukey) ? -1 : op;
 }
-
-/* Read register info from the socket and compare it with that from the
- * ucontext. Return 0 for match, 1 for end-of-test, 2 for mismatch.
- * NB: called from a signal handler.
- */
-int recv_and_compare_register_info(int sock, void *uc)
-{
-    int resp = 0;
-    int op;
-
-    reginfo_init(&master_ri, uc);
-    op = get_risuop(&master_ri);
-
-    switch (op) {
-    case OP_COMPARE:
-    case OP_TESTEND:
-    default:
-        if (recv_data_pkt(sock, &apprentice_ri, sizeof(apprentice_ri))) {
-            packet_mismatch = 1;
-            resp = 2;
-        } else if (!reginfo_is_eq(&master_ri, &apprentice_ri)) {
-            resp = 2;
-        }
-        else if (op == OP_TESTEND) {
-            resp = 1;
-        }
-        send_response_byte(sock, resp);
-        break;
-    case OP_SETMEMBLOCK:
-        memblock = (void *)(uintptr_t)get_reginfo_paramreg(&master_ri);
-        break;
-    case OP_GETMEMBLOCK:
-        set_ucontext_paramreg(uc, get_reginfo_paramreg(&master_ri) +
-                              (uintptr_t)memblock);
-        break;
-    case OP_COMPAREMEM:
-        mem_used = 1;
-        if (recv_data_pkt(sock, apprentice_memblock, MEMBLOCKLEN)) {
-            packet_mismatch = 1;
-            resp = 2;
-        } else if (memcmp(memblock, apprentice_memblock, MEMBLOCKLEN) != 0) {
-            resp = 2;
-        }
-        send_response_byte(sock, resp);
-        break;
-    }
-    return resp;
-}
-
-/* Print a useful report on the status of the last comparison
- * done in recv_and_compare_register_info(). This is called on
- * exit, so need not restrict itself to signal-safe functions.
- * Should return 0 if it was a good match (ie end of test)
- * and 1 for a mismatch.
- */
-int report_match_status(void)
-{
-    int resp = 0;
-    fprintf(stderr, "match status...\n");
-
-    if (packet_mismatch) {
-        fprintf(stderr, "packet mismatch (probably disagreement "
-                "about UNDEF on load/store)\n");
-        fprintf(stderr, "master reginfo:\n");
-        reginfo_dump(&master_ri, stderr);
-    }
-    if (!reginfo_is_eq(&master_ri, &apprentice_ri)) {
-        fprintf(stderr, "mismatch on regs!\n");
-        resp = 1;
-    }
-    if (mem_used && memcmp(memblock, &apprentice_memblock, MEMBLOCKLEN) != 0) {
-        fprintf(stderr, "mismatch on memory!\n");
-        resp = 1;
-    }
-    if (!resp) {
-        fprintf(stderr, "match!\n");
-        return 0;
-    }
-
-    fprintf(stderr, "master reginfo:\n");
-    reginfo_dump(&master_ri, stderr);
-
-    fprintf(stderr, "apprentice reginfo:\n");
-    reginfo_dump(&apprentice_ri, stderr);
-
-    reginfo_dump_mismatch(&master_ri, &apprentice_ri, stderr);
-    return resp;
-}
diff --git a/risu_ppc64le.c b/risu_ppc64le.c
index 928f36f..c15d78e 100644
--- a/risu_ppc64le.c
+++ b/risu_ppc64le.c
@@ -18,12 +18,6 @@
 #include "risu.h"
 #include "risu_reginfo_ppc64le.h"
 
-struct reginfo master_ri, apprentice_ri;
-static int mem_used = 0;
-static int packet_mismatch = 0;
-
-uint8_t apprentice_memblock[MEMBLOCKLEN];
-
 void advance_pc(void *vuc)
 {
     ucontext_t *uc = (ucontext_t*)vuc;
@@ -49,91 +43,3 @@ int get_risuop(struct reginfo *ri)
     uint32_t risukey = 0x00005af0;
     return (key != risukey) ? -1 : op;
 }
-
-/* Read register info from the socket and compare it with that from the
- * ucontext. Return 0 for match, 1 for end-of-test, 2 for mismatch.
- * NB: called from a signal handler.
- */
-int recv_and_compare_register_info(int sock, void *uc)
-{
-    int resp = 0;
-    int op;
-
-    reginfo_init(&master_ri, uc);
-    op = get_risuop(&master_ri);
-
-    switch (op) {
-    case OP_COMPARE:
-    case OP_TESTEND:
-    default:
-        if (recv_data_pkt(sock, &apprentice_ri, sizeof(apprentice_ri))) {
-            packet_mismatch = 1;
-            resp = 2;
-        } else if (!reginfo_is_eq(&master_ri, &apprentice_ri)) {
-            resp = 2;
-        }
-        else if (op == OP_TESTEND) {
-            resp = 1;
-        }
-        send_response_byte(sock, resp);
-        break;
-    case OP_SETMEMBLOCK:
-        memblock = (void*)get_reginfo_paramreg(&master_ri);
-        break;
-    case OP_GETMEMBLOCK:
-        set_ucontext_paramreg(uc, get_reginfo_paramreg(&master_ri) +
-                              (uintptr_t)memblock);
-        break;
-    case OP_COMPAREMEM:
-        mem_used = 1;
-        if (recv_data_pkt(sock, apprentice_memblock, MEMBLOCKLEN)) {
-            packet_mismatch = 1;
-            resp = 2;
-        } else if (memcmp(memblock, apprentice_memblock, MEMBLOCKLEN) != 0) {
-            resp = 2;
-        }
-        send_response_byte(sock, resp);
-        break;
-    }
-    return resp;
-}
-
-/* Print a useful report on the status of the last comparison
- * done in recv_and_compare_register_info(). This is called on
- * exit, so need not restrict itself to signal-safe functions.
- * Should return 0 if it was a good match (ie end of test)
- * and 1 for a mismatch.
- */
-int report_match_status(void)
-{
-    int resp = 0;
-    fprintf(stderr, "match status...\n");
-
-    if (packet_mismatch) {
-        fprintf(stderr, "packet mismatch (probably disagreement "
-                "about UNDEF on load/store)\n");
-        fprintf(stderr, "master reginfo:\n");
-        reginfo_dump(&master_ri, stderr);
-    }
-    if (!reginfo_is_eq(&master_ri, &apprentice_ri)) {
-        fprintf(stderr, "mismatch on regs!\n");
-        resp = 1;
-    }
-    if (mem_used && memcmp(memblock, &apprentice_memblock, MEMBLOCKLEN) != 0) {
-        fprintf(stderr, "mismatch on memory!\n");
-        resp = 1;
-    }
-    if (!resp) {
-        fprintf(stderr, "match!\n");
-        return 0;
-    }
-
-    fprintf(stderr, "master reginfo:\n");
-    reginfo_dump(&master_ri, stderr);
-
-    fprintf(stderr, "apprentice reginfo:\n");
-    reginfo_dump(&apprentice_ri, stderr);
-
-    reginfo_dump_mismatch(&master_ri, &apprentice_ri, stderr);
-    return resp;
-}
-- 
2.7.4

  parent reply	other threads:[~2017-02-24 17:35 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-24 17:35 [Qemu-devel] [PATCH risu 0/9] risu: refactor and reduce CPU-specific code Peter Maydell
2017-02-24 17:35 ` [Qemu-devel] [PATCH risu 1/9] Drop the weird modification of a ucontext in the ppc reginfo_is_eq() Peter Maydell
2017-02-24 17:35 ` [Qemu-devel] [PATCH risu 2/9] Abstract out getting and setting parameter register Peter Maydell
2017-02-24 17:35 ` [Qemu-devel] [PATCH risu 3/9] Make get_risuop() a formal part of the CPU interface Peter Maydell
2017-02-24 17:35 ` [Qemu-devel] [PATCH risu 4/9] ppc64le, m68k: Make reginfo_dump() API match arm, aarch64 Peter Maydell
2017-02-24 17:35 ` [Qemu-devel] [PATCH risu 5/9] m68k: Drop unused ucontext_t* argument to reginfo_is_eq() Peter Maydell
2017-02-24 17:35 ` [Qemu-devel] [PATCH risu 6/9] Make reginfo_{init, is_eq, dump, dump_mismatch} official per-CPU API Peter Maydell
2017-02-24 17:35 ` [Qemu-devel] [PATCH risu 7/9] Move send_register_info() to reginfo.c Peter Maydell
2017-02-24 17:35 ` Peter Maydell [this message]
2017-02-24 17:35 ` [Qemu-devel] [PATCH risu 9/9] Tidy up #include lines Peter Maydell
2017-02-24 18:15 ` [Qemu-devel] [PATCH risu 0/9] risu: refactor and reduce CPU-specific code Laurent Vivier
2017-02-24 18:17   ` Peter Maydell
2017-02-28 17:47   ` Peter Maydell

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=1487957728-8354-9-git-send-email-peter.maydell@linaro.org \
    --to=peter.maydell@linaro.org \
    --cc=laurent@vivier.eu \
    --cc=nikunj@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.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 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).