All of lore.kernel.org
 help / color / mirror / Atom feed
From: Houcheng Lin <houcheng@gmail.com>
To: pbonzini@redhat.com, qemu-devel@nongnu.org, famz@redhat.com,
	alex.bennee@linaro.org, linhaocheng@itri.org.tw,
	peter.maydell@linaro.org, kvm@vger.kernel.org
Cc: Houcheng Lin <houcheng@gmail.com>
Subject: [RFC PATCH v3] os-android: Add support to android platform
Date: Thu, 24 Sep 2015 21:21:17 +0800	[thread overview]
Message-ID: <1443100877-8938-1-git-send-email-houcheng@gmail.com> (raw)

Hi,

The v3 patch fix ident error and add error checking on
ptsname_r() function. This patch is based on version:
007e620a7576e4ce2ea6955541e87d8ae8ed32ae.

-----------------------------------------------------------------------

Building QEMU on android reqiures android NDK r10 cross-compilation
toolchain with following changes:

    - install qemu dependent libraries
    - upgrade bionic libc
    - add mssing includes, scsi/sg.h, in toolchain
    - make a symbolic link x86_64-linux-android-pkg-config that links
      to host's pkg-config.

Then, configure and build static linked qemu by commands:
  $ export SYSROOT="/opt/android-toolchain64/sysroot"
  $ PKG_CONFIG_LIBDIR=/opt/android-toolchain64/sysroot/usr/lib/pkgconfig \
    ./configure \
    --cross-prefix=x86_64-linux-android- --enable-kvm \
    --enable-trace-backend=nop --disable-fdt --target-list=x86_64-softmmu \
    --disable-spice --disable-vhost-net --disable-libiscsi \
    --audio-drv-list="" --disable-gtk --disable-gnutls \
    --disable-libnfs --disable-glusterfs --disable-libssh2 \
    --disable-seccomp --disable-usb-redir --disable-libusb \
    --disable-guest-agent --static
  $ make -j4

For dynamic build, you can skip the "static" option during configure, copy
dependent so files into android and add "." into LD_LIBRARY_PATH.

How to prepare your cross-compilation toolcahin
-----------------------------------------------

1. Download NDK r10, install toolchain from NDK and build the following libraries and install in your toolchain sysroot:
        libiconv-1.14
        gettext-0.19
        libffi-3.0.12
        glib-2.34.3
        libpng-1.2.52
        pixman-0.30

2. Download AOSP and apply this patch I made to support posix lockf()
    https://android-review.googlesource.com/#/c/172150/

3. Build bionic C and update your toolchain's libc.a and libc.so.

4. Copy kernel header file, scsi/sg.h into toolchain's sysroot/usr/includes/scsi/

5. Update these header files in your toolchain to prevent compilation warning,
   includes:
        unistd.h for lockf() and related define
        sys/uio.h for pread() and pwrite()
        signal.h for sigtimedwait()

Signed-off-by: Houcheng Lin <houcheng@gmail.com>
---
 configure                   | 18 ++++++++++++++++--
 default-configs/pci.mak     |  2 +-
 hw/i386/kvm/pci-assign.c    |  1 -
 include/qemu/osdep.h        |  7 +++++++
 include/sysemu/os-android.h | 12 ++++++++++++
 kvm-all.c                   |  4 ++++
 tests/Makefile              |  2 ++
 util/oslib-posix.c          | 12 ++++++++++++
 util/qemu-openpty.c         | 20 +++++++++++++++-----
 9 files changed, 69 insertions(+), 9 deletions(-)
 create mode 100644 include/sysemu/os-android.h

diff --git a/configure b/configure
index d7c24cd..12e3402 100755
--- a/configure
+++ b/configure
@@ -567,7 +567,6 @@ fi
 
 # host *BSD for user mode
 HOST_VARIANT_DIR=""
-
 case $targetos in
 CYGWIN*)
   mingw32="yes"
@@ -693,9 +692,20 @@ Haiku)
   vhost_net="yes"
   vhost_scsi="yes"
   QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers $QEMU_INCLUDES"
+  case $cross_prefix in
+    *android*)
+      android="yes"
+    ;;
+    *)
+    ;;
+  esac
 ;;
 esac
 
+if [ "$android" = "yes" ] ; then
+  LIBS="-lglib-2.0 -lgthread-2.0 -lz -lpixman-1 -lintl -liconv -lc $LIBS"
+  libs_qga="-lglib-2.0 -lgthread-2.0 -lz -lpixman-1 -lintl -liconv -lc"
+fi
 if [ "$bsd" = "yes" ] ; then
   if [ "$darwin" != "yes" ] ; then
     bsd_user="yes"
@@ -3791,7 +3801,7 @@ elif compile_prog "" "$pthread_lib -lrt" ; then
 fi
 
 if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \
-        "$aix" != "yes" -a "$haiku" != "yes" ; then
+        "$aix" != "yes" -a "$haiku" != "yes" -a "$android" != "yes" ; then
     libs_softmmu="-lutil $libs_softmmu"
 fi
 
@@ -4737,6 +4747,10 @@ if test "$linux" = "yes" ; then
   echo "CONFIG_LINUX=y" >> $config_host_mak
 fi
 
+if test "$android" = "yes" ; then
+  echo "CONFIG_ANDROID=y" >> $config_host_mak
+fi
+
 if test "$darwin" = "yes" ; then
   echo "CONFIG_DARWIN=y" >> $config_host_mak
 fi
diff --git a/default-configs/pci.mak b/default-configs/pci.mak
index 7e10903..e76dd41 100644
--- a/default-configs/pci.mak
+++ b/default-configs/pci.mak
@@ -35,5 +35,5 @@ CONFIG_SDHCI=y
 CONFIG_EDU=y
 CONFIG_VGA=y
 CONFIG_VGA_PCI=y
-CONFIG_IVSHMEM=$(CONFIG_KVM)
+CONFIG_IVSHMEM=$(call land,$(call lnot,$(CONFIG_ANDROID)),$(CONFIG_KVM))
 CONFIG_ROCKER=y
diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
index b1beaa6..44beee3 100644
--- a/hw/i386/kvm/pci-assign.c
+++ b/hw/i386/kvm/pci-assign.c
@@ -22,7 +22,6 @@
  */
 #include <stdio.h>
 #include <unistd.h>
-#include <sys/io.h>
 #include <sys/mman.h>
 #include <sys/types.h>
 #include <sys/stat.h>
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
index ab3c876..f5be51c 100644
--- a/include/qemu/osdep.h
+++ b/include/qemu/osdep.h
@@ -59,6 +59,10 @@
 #define WEXITSTATUS(x) (x)
 #endif
 
+#ifdef CONFIG_ANDROID
+#include "sysemu/os-android.h"
+#endif
+
 #ifdef _WIN32
 #include "sysemu/os-win32.h"
 #endif
@@ -284,4 +288,7 @@ void os_mem_prealloc(int fd, char *area, size_t sz);
 
 int qemu_read_password(char *buf, int buf_size);
 
+int qemu_getdtablesize(void);
+
+
 #endif
diff --git a/include/sysemu/os-android.h b/include/sysemu/os-android.h
new file mode 100644
index 0000000..4877403
--- /dev/null
+++ b/include/sysemu/os-android.h
@@ -0,0 +1,12 @@
+#ifndef QEMU_OS_ANDROID_H
+#define QEMU_OS_ANDROID_H
+
+/*
+ * For include the basename prototyping in android.
+ */
+#include <libgen.h>
+
+#define getdtablesize qemu_getdtablesize
+#define IOV_MAX       1024
+
+#endif
diff --git a/kvm-all.c b/kvm-all.c
index c6f5128..f7bb9c7 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -45,7 +45,11 @@
 #endif
 
 /* KVM uses PAGE_SIZE in its definition of COALESCED_MMIO_MAX */
+#ifdef PAGE_SIZE
+QEMU_BUILD_BUG_ON(PAGE_SIZE != TARGET_PAGE_SIZE);
+#else
 #define PAGE_SIZE TARGET_PAGE_SIZE
+#endif
 
 //#define DEBUG_KVM
 
diff --git a/tests/Makefile b/tests/Makefile
index 34c6136..99faf1f 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -418,8 +418,10 @@ tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o libqemuutil.a libqemustub.
 tests/test-write-threshold$(EXESUF): tests/test-write-threshold.o $(block-obj-y) libqemuutil.a libqemustub.a
 
 ifeq ($(CONFIG_POSIX),y)
+ifneq ($(CONFIG_ANDROID),y)
 LIBS += -lutil
 endif
+endif
 
 # QTest rules
 
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
index 3ae4987..80d92bc 100644
--- a/util/oslib-posix.c
+++ b/util/oslib-posix.c
@@ -62,6 +62,8 @@ extern int daemon(int, int);
 #include <libgen.h>
 #include <setjmp.h>
 #include <sys/signal.h>
+#include <sys/time.h>
+#include <sys/resource.h>
 
 #ifdef CONFIG_LINUX
 #include <sys/syscall.h>
@@ -482,3 +484,13 @@ int qemu_read_password(char *buf, int buf_size)
     printf("\n");
     return ret;
 }
+
+int qemu_getdtablesize(void)
+{
+    struct rlimit r;
+
+    if (getrlimit(RLIMIT_NOFILE, &r) < 0) {
+        return sysconf(_SC_OPEN_MAX);
+    }
+    return r.rlim_cur;
+}
diff --git a/util/qemu-openpty.c b/util/qemu-openpty.c
index 4c53211..afc0a88 100644
--- a/util/qemu-openpty.c
+++ b/util/qemu-openpty.c
@@ -51,11 +51,16 @@
 # include <termios.h>
 #endif
 
-#ifdef __sun__
+#if defined(__sun__) || defined(CONFIG_ANDROID)
+
 /* Once Solaris has openpty(), this is going to be removed. */
 static int openpty(int *amaster, int *aslave, char *name,
                    struct termios *termp, struct winsize *winp)
 {
+#if defined(CONFIG_ANDROID)
+        char pty_buf[PATH_MAX];
+        #define ptsname(fd) pty_buf
+#endif
         const char *slave;
         int mfd = -1, sfd = -1;
 
@@ -67,17 +72,21 @@ static int openpty(int *amaster, int *aslave, char *name,
 
         if (grantpt(mfd) == -1 || unlockpt(mfd) == -1)
                 goto err;
-
+#if defined(CONFIG_ANDROID)
+        if (ptsname_r(mfd, pty_buf, PATH_MAX) < 0)
+                goto err;
+#endif
         if ((slave = ptsname(mfd)) == NULL)
                 goto err;
 
         if ((sfd = open(slave, O_RDONLY | O_NOCTTY)) == -1)
                 goto err;
 
+#ifndef CONFIG_ANDROID
         if (ioctl(sfd, I_PUSH, "ptem") == -1 ||
             (termp != NULL && tcgetattr(sfd, termp) < 0))
                 goto err;
-
+#endif
         if (amaster)
                 *amaster = mfd;
         if (aslave)
@@ -93,7 +102,8 @@ err:
         close(mfd);
         return -1;
 }
-
+#endif
+#ifdef __sun__
 static void cfmakeraw (struct termios *termios_p)
 {
         termios_p->c_iflag &=
@@ -112,7 +122,7 @@ int qemu_openpty_raw(int *aslave, char *pty_name)
 {
     int amaster;
     struct termios tty;
-#if defined(__OpenBSD__) || defined(__DragonFly__)
+#if defined(__OpenBSD__) || defined(__DragonFly__) || defined(CONFIG_ANDROID)
     char pty_buf[PATH_MAX];
 #define q_ptsname(x) pty_buf
 #else
-- 
1.9.1


WARNING: multiple messages have this Message-ID (diff)
From: Houcheng Lin <houcheng@gmail.com>
To: pbonzini@redhat.com, qemu-devel@nongnu.org, famz@redhat.com,
	alex.bennee@linaro.org, linhaocheng@itri.org.tw,
	peter.maydell@linaro.org, kvm@vger.kernel.org
Cc: Houcheng Lin <houcheng@gmail.com>
Subject: [Qemu-devel] [RFC PATCH v3] os-android: Add support to android platform
Date: Thu, 24 Sep 2015 21:21:17 +0800	[thread overview]
Message-ID: <1443100877-8938-1-git-send-email-houcheng@gmail.com> (raw)

Hi,

The v3 patch fix ident error and add error checking on
ptsname_r() function. This patch is based on version:
007e620a7576e4ce2ea6955541e87d8ae8ed32ae.

-----------------------------------------------------------------------

Building QEMU on android reqiures android NDK r10 cross-compilation
toolchain with following changes:

    - install qemu dependent libraries
    - upgrade bionic libc
    - add mssing includes, scsi/sg.h, in toolchain
    - make a symbolic link x86_64-linux-android-pkg-config that links
      to host's pkg-config.

Then, configure and build static linked qemu by commands:
  $ export SYSROOT="/opt/android-toolchain64/sysroot"
  $ PKG_CONFIG_LIBDIR=/opt/android-toolchain64/sysroot/usr/lib/pkgconfig \
    ./configure \
    --cross-prefix=x86_64-linux-android- --enable-kvm \
    --enable-trace-backend=nop --disable-fdt --target-list=x86_64-softmmu \
    --disable-spice --disable-vhost-net --disable-libiscsi \
    --audio-drv-list="" --disable-gtk --disable-gnutls \
    --disable-libnfs --disable-glusterfs --disable-libssh2 \
    --disable-seccomp --disable-usb-redir --disable-libusb \
    --disable-guest-agent --static
  $ make -j4

For dynamic build, you can skip the "static" option during configure, copy
dependent so files into android and add "." into LD_LIBRARY_PATH.

How to prepare your cross-compilation toolcahin
-----------------------------------------------

1. Download NDK r10, install toolchain from NDK and build the following libraries and install in your toolchain sysroot:
        libiconv-1.14
        gettext-0.19
        libffi-3.0.12
        glib-2.34.3
        libpng-1.2.52
        pixman-0.30

2. Download AOSP and apply this patch I made to support posix lockf()
    https://android-review.googlesource.com/#/c/172150/

3. Build bionic C and update your toolchain's libc.a and libc.so.

4. Copy kernel header file, scsi/sg.h into toolchain's sysroot/usr/includes/scsi/

5. Update these header files in your toolchain to prevent compilation warning,
   includes:
        unistd.h for lockf() and related define
        sys/uio.h for pread() and pwrite()
        signal.h for sigtimedwait()

Signed-off-by: Houcheng Lin <houcheng@gmail.com>
---
 configure                   | 18 ++++++++++++++++--
 default-configs/pci.mak     |  2 +-
 hw/i386/kvm/pci-assign.c    |  1 -
 include/qemu/osdep.h        |  7 +++++++
 include/sysemu/os-android.h | 12 ++++++++++++
 kvm-all.c                   |  4 ++++
 tests/Makefile              |  2 ++
 util/oslib-posix.c          | 12 ++++++++++++
 util/qemu-openpty.c         | 20 +++++++++++++++-----
 9 files changed, 69 insertions(+), 9 deletions(-)
 create mode 100644 include/sysemu/os-android.h

diff --git a/configure b/configure
index d7c24cd..12e3402 100755
--- a/configure
+++ b/configure
@@ -567,7 +567,6 @@ fi
 
 # host *BSD for user mode
 HOST_VARIANT_DIR=""
-
 case $targetos in
 CYGWIN*)
   mingw32="yes"
@@ -693,9 +692,20 @@ Haiku)
   vhost_net="yes"
   vhost_scsi="yes"
   QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers $QEMU_INCLUDES"
+  case $cross_prefix in
+    *android*)
+      android="yes"
+    ;;
+    *)
+    ;;
+  esac
 ;;
 esac
 
+if [ "$android" = "yes" ] ; then
+  LIBS="-lglib-2.0 -lgthread-2.0 -lz -lpixman-1 -lintl -liconv -lc $LIBS"
+  libs_qga="-lglib-2.0 -lgthread-2.0 -lz -lpixman-1 -lintl -liconv -lc"
+fi
 if [ "$bsd" = "yes" ] ; then
   if [ "$darwin" != "yes" ] ; then
     bsd_user="yes"
@@ -3791,7 +3801,7 @@ elif compile_prog "" "$pthread_lib -lrt" ; then
 fi
 
 if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \
-        "$aix" != "yes" -a "$haiku" != "yes" ; then
+        "$aix" != "yes" -a "$haiku" != "yes" -a "$android" != "yes" ; then
     libs_softmmu="-lutil $libs_softmmu"
 fi
 
@@ -4737,6 +4747,10 @@ if test "$linux" = "yes" ; then
   echo "CONFIG_LINUX=y" >> $config_host_mak
 fi
 
+if test "$android" = "yes" ; then
+  echo "CONFIG_ANDROID=y" >> $config_host_mak
+fi
+
 if test "$darwin" = "yes" ; then
   echo "CONFIG_DARWIN=y" >> $config_host_mak
 fi
diff --git a/default-configs/pci.mak b/default-configs/pci.mak
index 7e10903..e76dd41 100644
--- a/default-configs/pci.mak
+++ b/default-configs/pci.mak
@@ -35,5 +35,5 @@ CONFIG_SDHCI=y
 CONFIG_EDU=y
 CONFIG_VGA=y
 CONFIG_VGA_PCI=y
-CONFIG_IVSHMEM=$(CONFIG_KVM)
+CONFIG_IVSHMEM=$(call land,$(call lnot,$(CONFIG_ANDROID)),$(CONFIG_KVM))
 CONFIG_ROCKER=y
diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
index b1beaa6..44beee3 100644
--- a/hw/i386/kvm/pci-assign.c
+++ b/hw/i386/kvm/pci-assign.c
@@ -22,7 +22,6 @@
  */
 #include <stdio.h>
 #include <unistd.h>
-#include <sys/io.h>
 #include <sys/mman.h>
 #include <sys/types.h>
 #include <sys/stat.h>
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
index ab3c876..f5be51c 100644
--- a/include/qemu/osdep.h
+++ b/include/qemu/osdep.h
@@ -59,6 +59,10 @@
 #define WEXITSTATUS(x) (x)
 #endif
 
+#ifdef CONFIG_ANDROID
+#include "sysemu/os-android.h"
+#endif
+
 #ifdef _WIN32
 #include "sysemu/os-win32.h"
 #endif
@@ -284,4 +288,7 @@ void os_mem_prealloc(int fd, char *area, size_t sz);
 
 int qemu_read_password(char *buf, int buf_size);
 
+int qemu_getdtablesize(void);
+
+
 #endif
diff --git a/include/sysemu/os-android.h b/include/sysemu/os-android.h
new file mode 100644
index 0000000..4877403
--- /dev/null
+++ b/include/sysemu/os-android.h
@@ -0,0 +1,12 @@
+#ifndef QEMU_OS_ANDROID_H
+#define QEMU_OS_ANDROID_H
+
+/*
+ * For include the basename prototyping in android.
+ */
+#include <libgen.h>
+
+#define getdtablesize qemu_getdtablesize
+#define IOV_MAX       1024
+
+#endif
diff --git a/kvm-all.c b/kvm-all.c
index c6f5128..f7bb9c7 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -45,7 +45,11 @@
 #endif
 
 /* KVM uses PAGE_SIZE in its definition of COALESCED_MMIO_MAX */
+#ifdef PAGE_SIZE
+QEMU_BUILD_BUG_ON(PAGE_SIZE != TARGET_PAGE_SIZE);
+#else
 #define PAGE_SIZE TARGET_PAGE_SIZE
+#endif
 
 //#define DEBUG_KVM
 
diff --git a/tests/Makefile b/tests/Makefile
index 34c6136..99faf1f 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -418,8 +418,10 @@ tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o libqemuutil.a libqemustub.
 tests/test-write-threshold$(EXESUF): tests/test-write-threshold.o $(block-obj-y) libqemuutil.a libqemustub.a
 
 ifeq ($(CONFIG_POSIX),y)
+ifneq ($(CONFIG_ANDROID),y)
 LIBS += -lutil
 endif
+endif
 
 # QTest rules
 
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
index 3ae4987..80d92bc 100644
--- a/util/oslib-posix.c
+++ b/util/oslib-posix.c
@@ -62,6 +62,8 @@ extern int daemon(int, int);
 #include <libgen.h>
 #include <setjmp.h>
 #include <sys/signal.h>
+#include <sys/time.h>
+#include <sys/resource.h>
 
 #ifdef CONFIG_LINUX
 #include <sys/syscall.h>
@@ -482,3 +484,13 @@ int qemu_read_password(char *buf, int buf_size)
     printf("\n");
     return ret;
 }
+
+int qemu_getdtablesize(void)
+{
+    struct rlimit r;
+
+    if (getrlimit(RLIMIT_NOFILE, &r) < 0) {
+        return sysconf(_SC_OPEN_MAX);
+    }
+    return r.rlim_cur;
+}
diff --git a/util/qemu-openpty.c b/util/qemu-openpty.c
index 4c53211..afc0a88 100644
--- a/util/qemu-openpty.c
+++ b/util/qemu-openpty.c
@@ -51,11 +51,16 @@
 # include <termios.h>
 #endif
 
-#ifdef __sun__
+#if defined(__sun__) || defined(CONFIG_ANDROID)
+
 /* Once Solaris has openpty(), this is going to be removed. */
 static int openpty(int *amaster, int *aslave, char *name,
                    struct termios *termp, struct winsize *winp)
 {
+#if defined(CONFIG_ANDROID)
+        char pty_buf[PATH_MAX];
+        #define ptsname(fd) pty_buf
+#endif
         const char *slave;
         int mfd = -1, sfd = -1;
 
@@ -67,17 +72,21 @@ static int openpty(int *amaster, int *aslave, char *name,
 
         if (grantpt(mfd) == -1 || unlockpt(mfd) == -1)
                 goto err;
-
+#if defined(CONFIG_ANDROID)
+        if (ptsname_r(mfd, pty_buf, PATH_MAX) < 0)
+                goto err;
+#endif
         if ((slave = ptsname(mfd)) == NULL)
                 goto err;
 
         if ((sfd = open(slave, O_RDONLY | O_NOCTTY)) == -1)
                 goto err;
 
+#ifndef CONFIG_ANDROID
         if (ioctl(sfd, I_PUSH, "ptem") == -1 ||
             (termp != NULL && tcgetattr(sfd, termp) < 0))
                 goto err;
-
+#endif
         if (amaster)
                 *amaster = mfd;
         if (aslave)
@@ -93,7 +102,8 @@ err:
         close(mfd);
         return -1;
 }
-
+#endif
+#ifdef __sun__
 static void cfmakeraw (struct termios *termios_p)
 {
         termios_p->c_iflag &=
@@ -112,7 +122,7 @@ int qemu_openpty_raw(int *aslave, char *pty_name)
 {
     int amaster;
     struct termios tty;
-#if defined(__OpenBSD__) || defined(__DragonFly__)
+#if defined(__OpenBSD__) || defined(__DragonFly__) || defined(CONFIG_ANDROID)
     char pty_buf[PATH_MAX];
 #define q_ptsname(x) pty_buf
 #else
-- 
1.9.1

             reply	other threads:[~2015-09-24 13:21 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-24 13:21 Houcheng Lin [this message]
2015-09-24 13:21 ` [Qemu-devel] [RFC PATCH v3] os-android: Add support to android platform Houcheng Lin
2015-09-28 11:40 ` Paolo Bonzini
2015-09-28 11:40   ` [Qemu-devel] " Paolo Bonzini
2015-10-03  4:11   ` Houcheng Lin
2015-10-03  4:11     ` [Qemu-devel] " Houcheng Lin

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=1443100877-8938-1-git-send-email-houcheng@gmail.com \
    --to=houcheng@gmail.com \
    --cc=alex.bennee@linaro.org \
    --cc=famz@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linhaocheng@itri.org.tw \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --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 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.