kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH] os-android: Add support to android platform, built by ndk-r10
@ 2015-09-15  2:11 Houcheng Lin
  2015-09-15  9:41 ` Paolo Bonzini
  2015-09-15 10:19 ` Fam Zheng
  0 siblings, 2 replies; 11+ messages in thread
From: Houcheng Lin @ 2015-09-15  2:11 UTC (permalink / raw)
  To: linhaocheng, houcheng, peter.maydell, kvm, pbonzini

From: Houcheng <linhaocheng@itri.org.tw>

This patch is to build qemu in android ndk tool-chain, and has been tested in both
x86_64 and x86 android platform with hardware virtualization enabled. This patch is
composed of three part:

    - configure scripts for android
    - OS dependent code for android
    - kernel headers for android

The configure scripts add cross-compile options for android, define compile flags and link flags
and call android specific pkg-config. A pseudo pkg-config script is added to report correct
compile flags for android system.

The OS dependent code for android that implement functions missing in bionic C, including:
    - getdtablesize(): call getrlimit() instead.
    - sigtimewait(): call __rt_sigtimewait() instead.
    - a_ptsname(): call pstname_r() instead.
    - lockf(): not see this feature in android, directly return -1.
    - shm_open(): not see this feature in android, directly return -1.

The kernel headers for android include two kernel header missing in android: scsi/sg.h and
sys/io.h.

How to build android version
----------------------------
1. download the ndk toolchain r10, 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. configure the qemu and build:

    % export SYSROOT="/opt/android-toolchain64/sysroot"
    % CFLAGS=" --sysroot=$SYSROOT -I$SYSROOT/usr/include -I$SYSROOT/usr/include/pixman-1/" \
        ./configure --prefix="${SYSROOT}/usr"  \
        --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
    % make -j4

    Or, configure qemu to static link version:

    % export SYSROOT="/opt/android-toolchain64/sysroot"
    % CFLAGS=" --sysroot=$SYSROOT -I$SYSROOT/usr/include -I$SYSROOT/usr/include/pixman-1/" \
        ./configure --prefix="${SYSROOT}/usr"  \
        --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 --static
    % make -j4

Signed-off-by: Houcheng <linhaocheng@itri.org.tw>
---
 configure                   |   30 ++++-
 include/android/scsi/sg.h   |  307 +++++++++++++++++++++++++++++++++++++++++++
 include/qemu/osdep.h        |    4 +
 include/sysemu/os-android.h |   35 +++++
 kvm-all.c                   |    3 +
 scripts/android-pkg-config  |   28 ++++
 tests/Makefile              |    2 +
 util/osdep.c                |   53 ++++++++
 util/qemu-openpty.c         |   10 +-
 9 files changed, 467 insertions(+), 5 deletions(-)
 create mode 100644 include/android/scsi/sg.h
 create mode 100644 include/android/sys/io.h
 create mode 100644 include/sysemu/os-android.h
 create mode 100755 scripts/android-pkg-config

diff --git a/configure b/configure
index 5c06663..3ff6ffa 100755
--- a/configure
+++ b/configure
@@ -566,7 +566,6 @@ fi
 
 # host *BSD for user mode
 HOST_VARIANT_DIR=""
-
 case $targetos in
 CYGWIN*)
   mingw32="yes"
@@ -692,9 +691,23 @@ 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"
+      guest_agent="no"
+      QEMU_INCLUDES="-I\$(SRC_PATH)/include/android $QEMU_INCLUDES"
+    ;;
+    *)
+    ;;
+  esac
 ;;
 esac
 
+if [ "$android" = "yes" ] ; then
+  QEMU_CFLAGS="-DANDROID $QEMU_CFLAGS"
+  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"
@@ -1736,7 +1749,14 @@ fi
 # pkg-config probe
 
 if ! has "$pkg_config_exe"; then
-  error_exit "pkg-config binary '$pkg_config_exe' not found"
+  case $cross_prefix in
+    *android*)
+	pkg_config_exe=scripts/android-pkg-config
+	;;
+    *)
+	error_exit "pkg-config binary '$pkg_config_exe' not found"
+	;;
+  esac
 fi
 
 ##########################################
@@ -3764,7 +3784,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
 
@@ -4709,6 +4729,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/include/android/scsi/sg.h b/include/android/scsi/sg.h
new file mode 100644
index 0000000..b7178cb
--- /dev/null
+++ b/include/android/scsi/sg.h
@@ -0,0 +1,307 @@
+#ifndef _SCSI_GENERIC_H
+#define _SCSI_GENERIC_H
+
+/*
+   History:
+    Started: Aug 9 by Lawrence Foard (entropy@world.std.com), to allow user
+     process control of SCSI devices.
+    Development Sponsored by Killy Corp. NY NY
+Original driver (sg.h):
+*       Copyright (C) 1992 Lawrence Foard
+Version 2 and 3 extensions to driver:
+*       Copyright (C) 1998 - 2006 Douglas Gilbert
+
+    Version: 3.5.34 (20060920)
+    This version is for 2.6 series kernels.
+
+    For a full changelog see http://www.torque.net/sg
+
+Map of SG verions to the Linux kernels in which they appear:
+       ----------        ----------------------------------
+       original          all kernels < 2.2.6
+       2.1.40            2.2.20
+       3.0.x             optional version 3 sg driver for 2.2 series
+       3.1.17++          2.4.0++
+       3.5.30++          2.6.0++
+
+Major new features in SG 3.x driver (cf SG 2.x drivers)
+  - SG_IO ioctl() combines function if write() and read()
+  - new interface (sg_io_hdr_t) but still supports old interface
+  - scatter/gather in user space, direct IO, and mmap supported
+
+ The normal action of this driver is to use the adapter (HBA) driver to DMA
+ data into kernel buffers and then use the CPU to copy the data into the
+ user space (vice versa for writes). That is called "indirect" IO due to
+ the double handling of data. There are two methods offered to remove the
+ redundant copy: 1) direct IO and 2) using the mmap() system call to map
+ the reserve buffer (this driver has one reserve buffer per fd) into the
+ user space. Both have their advantages.
+ In terms of absolute speed mmap() is faster. If speed is not a concern,
+ indirect IO should be fine. Read the documentation for more information.
+
+ ** N.B. To use direct IO 'echo 1 > /proc/scsi/sg/allow_dio' or
+         'echo 1 > /sys/module/sg/parameters/allow_dio' is needed.
+         That attribute is 0 by default. **
+
+ Historical note: this SCSI pass-through driver has been known as "sg" for
+ a decade. In broader kernel discussions "sg" is used to refer to scatter
+ gather techniques. The context should clarify which "sg" is referred to.
+
+ Documentation
+ =============
+ A web site for the SG device driver can be found at:
+  http://www.torque.net/sg  [alternatively check the MAINTAINERS file]
+ The documentation for the sg version 3 driver can be found at:
+  http://www.torque.net/sg/p/sg_v3_ho.html
+ This is a rendering from DocBook source [change the extension to "sgml"
+ or "xml"]. There are renderings in "ps", "pdf", "rtf" and "txt" (soon).
+ The SG_IO ioctl is now found in other parts kernel (e.g. the block layer).
+ For more information see http://www.torque.net/sg/sg_io.html
+
+ The older, version 2 documents discuss the original sg interface in detail:
+  http://www.torque.net/sg/p/scsi-generic.txt
+  http://www.torque.net/sg/p/scsi-generic_long.txt
+ Also available: <kernel_source>/Documentation/scsi/scsi-generic.txt
+
+ Utility and test programs are available at the sg web site. They are
+ packaged as sg3_utils (for the lk 2.4 and 2.6 series) and sg_utils
+ (for the lk 2.2 series).
+*/
+
+#ifdef __KERNEL__
+extern int sg_big_buff; /* for sysctl */
+#endif
+
+/* New interface introduced in the 3.x SG drivers follows */
+
+typedef struct sg_iovec /* same structure as used by readv() Linux system */
+{                       /* call. It defines one scatter-gather element. */
+    void __user *iov_base;      /* Starting address  */
+    size_t iov_len;             /* Length in bytes  */
+} sg_iovec_t;
+
+
+typedef struct sg_io_hdr {
+    int interface_id;           /* [i] 'S' for SCSI generic (required) */
+    int dxfer_direction;        /* [i] data transfer direction  */
+    unsigned char cmd_len;      /* [i] SCSI command length ( <= 16 bytes) */
+    unsigned char mx_sb_len;    /* [i] max length to write to sbp */
+    unsigned short iovec_count; /* [i] 0 implies no scatter gather */
+    unsigned int dxfer_len;     /* [i] byte count of data transfer */
+    void __user *dxferp;  /* [i], [*io] points to data transfer memory
+                or scatter gather list */
+    unsigned char __user *cmdp; /* [i], [*i] points to command to perform */
+    void __user *sbp;   /* [i], [*o] points to sense_buffer memory */
+    unsigned int timeout;       /* [i] MAX_UINT->no timeout (unit: millisec) */
+    unsigned int flags;         /* [i] 0 -> default, see SG_FLAG... */
+    int pack_id;                /* [i->o] unused internally (normally) */
+    void __user *usr_ptr;       /* [i->o] unused internally */
+    unsigned char status;       /* [o] scsi status */
+    unsigned char masked_status;/* [o] shifted, masked scsi status */
+    unsigned char msg_status;   /* [o] messaging level data (optional) */
+    unsigned char sb_len_wr;    /* [o] byte count actually written to sbp */
+    unsigned short host_status; /* [o] errors from host adapter */
+    unsigned short driver_status;/* [o] errors from software driver */
+    int resid;                  /* [o] dxfer_len - actual_transferred */
+    unsigned int duration;      /* [o] time taken by cmd (unit: millisec) */
+    unsigned int info;          /* [o] auxiliary information */
+} sg_io_hdr_t;  /* 64 bytes long (on i386) */
+
+#define SG_INTERFACE_ID_ORIG 'S'
+
+/* Use negative values to flag difference from original sg_header structure */
+#define SG_DXFER_NONE (-1)      /* e.g. a SCSI Test Unit Ready command */
+#define SG_DXFER_TO_DEV (-2)    /* e.g. a SCSI WRITE command */
+#define SG_DXFER_FROM_DEV (-3)  /* e.g. a SCSI READ command */
+#define SG_DXFER_TO_FROM_DEV (-4) /* treated like SG_DXFER_FROM_DEV with the
+           additional property than during indirect
+           IO the user buffer is copied into the
+           kernel buffers before the transfer */
+#define SG_DXFER_UNKNOWN (-5)   /* Unknown data direction */
+
+/* following flag values can be "or"-ed together */
+#define SG_FLAG_DIRECT_IO 1     /* default is indirect IO */
+#define SG_FLAG_UNUSED_LUN_INHIBIT 2   /* default is overwrite lun in SCSI */
+        /* command block (when <= SCSI_2) */
+#define SG_FLAG_MMAP_IO 4       /* request memory mapped IO */
+#define SG_FLAG_NO_DXFER 0x10000 /* no transfer of kernel buffers to/from */
+        /* user space (debug indirect IO) */
+
+/* following 'info' values are "or"-ed together */
+#define SG_INFO_OK_MASK 0x1
+#define SG_INFO_OK 0x0          /* no sense, host nor driver "noise" */
+#define SG_INFO_CHECK 0x1       /* something abnormal happened */
+
+#define SG_INFO_DIRECT_IO_MASK 0x6
+#define SG_INFO_INDIRECT_IO 0x0 /* data xfer via kernel buffers (or no xfer) */
+#define SG_INFO_DIRECT_IO 0x2   /* direct IO requested and performed */
+#define SG_INFO_MIXED_IO 0x4    /* part direct, part indirect IO */
+
+
+typedef struct sg_scsi_id { /* used by SG_GET_SCSI_ID ioctl() */
+    int host_no;        /* as in "scsi<n>" where 'n' is one of 0, 1, 2 etc */
+    int channel;
+    int scsi_id;        /* scsi id of target device */
+    int lun;
+    int scsi_type;      /* TYPE_... defined in scsi/scsi.h */
+    short h_cmd_per_lun;/* host (adapter) maximum commands per lun */
+    short d_queue_depth;/* device (or adapter) maximum queue length */
+    int unused[2];      /* probably find a good use, set 0 for now */
+} sg_scsi_id_t; /* 32 bytes long on i386 */
+
+typedef struct sg_req_info { /* used by SG_GET_REQUEST_TABLE ioctl() */
+    char req_state;     /* 0 -> not used, 1 -> written, 2 -> ready to read */
+    char orphan;        /* 0 -> normal request, 1 -> from interruped SG_IO */
+    char sg_io_owned;   /* 0 -> complete with read(), 1 -> owned by SG_IO */
+    char problem;       /* 0 -> no problem detected, 1 -> error to report */
+    int pack_id;        /* pack_id associated with request */
+    void __user *usr_ptr;     /* user provided pointer (in new interface) */
+    unsigned int duration; /* millisecs elapsed since written (req_state==1)
+            or request duration (req_state==2) */
+    int unused;
+} sg_req_info_t; /* 20 bytes long on i386 */
+
+
+/* IOCTLs: Those ioctls that are relevant to the SG 3.x drivers follow.
+ [Those that only apply to the SG 2.x drivers are at the end of the file.]
+ (_GET_s yield result via 'int *' 3rd argument unless otherwise indicated) */
+
+#define SG_EMULATED_HOST 0x2203 /* true for emulated host adapter (ATAPI) */
+
+/* Used to configure SCSI command transformation layer for ATAPI devices */
+/* Only supported by the ide-scsi driver */
+#define SG_SET_TRANSFORM 0x2204 /* N.B. 3rd arg is not pointer but value: */
+          /* 3rd arg = 0 to disable transform, 1 to enable it */
+#define SG_GET_TRANSFORM 0x2205
+
+#define SG_SET_RESERVED_SIZE 0x2275  /* request a new reserved buffer size */
+#define SG_GET_RESERVED_SIZE 0x2272  /* actual size of reserved buffer */
+
+/* The following ioctl has a 'sg_scsi_id_t *' object as its 3rd argument. */
+#define SG_GET_SCSI_ID 0x2276   /* Yields fd's bus, chan, dev, lun + type */
+/* SCSI id information can also be obtained from SCSI_IOCTL_GET_IDLUN */
+
+/* Override host setting and always DMA using low memory ( <16MB on i386) */
+#define SG_SET_FORCE_LOW_DMA 0x2279  /* 0-> use adapter setting, 1-> force */
+#define SG_GET_LOW_DMA 0x227a   /* 0-> use all ram for dma; 1-> low dma ram */
+
+/* When SG_SET_FORCE_PACK_ID set to 1, pack_id is input to read() which
+   tries to fetch a packet with a matching pack_id, waits, or returns EAGAIN.
+   If pack_id is -1 then read oldest waiting. When ...FORCE_PACK_ID set to 0
+   then pack_id ignored by read() and oldest readable fetched. */
+#define SG_SET_FORCE_PACK_ID 0x227b
+#define SG_GET_PACK_ID 0x227c /* Yields oldest readable pack_id (or -1) */
+
+#define SG_GET_NUM_WAITING 0x227d /* Number of commands awaiting read() */
+
+/* Yields max scatter gather tablesize allowed by current host adapter */
+#define SG_GET_SG_TABLESIZE 0x227F  /* 0 implies can't do scatter gather */
+
+#define SG_GET_VERSION_NUM 0x2282 /* Example: version 2.1.34 yields 20134 */
+
+/* Returns -EBUSY if occupied. 3rd argument pointer to int (see next) */
+#define SG_SCSI_RESET 0x2284
+/* Associated values that can be given to SG_SCSI_RESET follow */
+#define   SG_SCSI_RESET_NOTHING 0
+#define   SG_SCSI_RESET_DEVICE  1
+#define   SG_SCSI_RESET_BUS 2
+#define   SG_SCSI_RESET_HOST  3
+#define   SG_SCSI_RESET_TARGET  4
+
+/* synchronous SCSI command ioctl, (only in version 3 interface) */
+#define SG_IO 0x2285   /* similar effect as write() followed by read() */
+
+#define SG_GET_REQUEST_TABLE 0x2286   /* yields table of active requests */
+
+/* How to treat EINTR during SG_IO ioctl(), only in SG 3.x series */
+#define SG_SET_KEEP_ORPHAN 0x2287 /* 1 -> hold for read(), 0 -> drop (def) */
+#define SG_GET_KEEP_ORPHAN 0x2288
+
+/* yields scsi midlevel's access_count for this SCSI device */
+#define SG_GET_ACCESS_COUNT 0x2289
+
+
+#define SG_SCATTER_SZ (8 * 4096)
+/* Largest size (in bytes) a single scatter-gather list element can have.
+   The value used by the driver is 'max(SG_SCATTER_SZ, PAGE_SIZE)'.
+   This value should be a power of 2 (and may be rounded up internally).
+   If scatter-gather is not supported by adapter then this value is the
+   largest data block that can be read/written by a single scsi command. */
+
+#define SG_DEFAULT_RETRIES 0
+
+/* Defaults, commented if they differ from original sg driver */
+#define SG_DEF_FORCE_LOW_DMA 0  /* was 1 -> memory below 16MB on i386 */
+#define SG_DEF_FORCE_PACK_ID 0
+#define SG_DEF_KEEP_ORPHAN 0
+#define SG_DEF_RESERVED_SIZE SG_SCATTER_SZ /* load time option */
+
+/* maximum outstanding requests, write() yields EDOM if exceeded */
+#define SG_MAX_QUEUE 16
+
+#define SG_BIG_BUFF SG_DEF_RESERVED_SIZE    /* for backward compatibility */
+
+/* Alternate style type names, "..._t" variants preferred */
+typedef struct sg_io_hdr Sg_io_hdr;
+typedef struct sg_io_vec Sg_io_vec;
+typedef struct sg_scsi_id Sg_scsi_id;
+typedef struct sg_req_info Sg_req_info;
+
+
+/* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
+/*   The older SG interface based on the 'sg_header' structure follows.   */
+/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
+
+#define SG_MAX_SENSE 16   /* this only applies to the sg_header interface */
+
+struct sg_header {
+    int pack_len;    /* [o] reply_len (ie useless), ignored as input */
+    int reply_len;   /* [i] max length of expected reply (inc. sg_header) */
+    int pack_id;     /* [io] id number of packet (use ints >= 0) */
+    int result;      /* [o] 0==ok, else (+ve) Unix errno (best ignored) */
+    unsigned int twelve_byte:1;
+  /* [i] Force 12 byte command length for group 6 & 7 commands  */
+    unsigned int target_status:5;   /* [o] scsi status from target */
+    unsigned int host_status:8;     /* [o] host status (see "DID" codes) */
+    unsigned int driver_status:8;   /* [o] driver status+suggestion */
+    unsigned int other_flags:10;    /* unused */
+    unsigned char sense_buffer[SG_MAX_SENSE]; /* [o] Output in 3 cases:
+     when target_status is CHECK_CONDITION or
+     when target_status is COMMAND_TERMINATED or
+     when (driver_status & DRIVER_SENSE) is true. */
+};      /* This structure is 36 bytes long on i386 */
+
+
+/* IOCTLs: The following are not required (or ignored) when the sg_io_hdr_t
+     interface is used. They are kept for backward compatibility with
+     the original and version 2 drivers. */
+
+#define SG_SET_TIMEOUT 0x2201  /* unit: jiffies (10ms on i386) */
+#define SG_GET_TIMEOUT 0x2202  /* yield timeout as _return_ value */
+
+/* Get/set command queuing state per fd (default is SG_DEF_COMMAND_Q.
+   Each time a sg_io_hdr_t object is seen on this file descriptor, this
+   command queuing flag is set on (overriding the previous setting). */
+#define SG_GET_COMMAND_Q 0x2270   /* Yields 0 (queuing off) or 1 (on) */
+#define SG_SET_COMMAND_Q 0x2271   /* Change queuing state with 0 or 1 */
+
+/* Turn on/off error sense trace (1 and 0 respectively, default is off).
+   Try using: "# cat /proc/scsi/sg/debug" instead in the v3 driver */
+#define SG_SET_DEBUG 0x227e    /* 0 -> turn off debug */
+
+#define SG_NEXT_CMD_LEN 0x2283  /* override SCSI command length with given
+       number on the next write() on this file descriptor */
+
+
+/* Defaults, commented if they differ from original sg driver */
+#ifdef __KERNEL__
+#define SG_DEFAULT_TIMEOUT_USER (60*USER_HZ) /* HZ == 'jiffies in 1 second' */
+#else
+#define SG_DEFAULT_TIMEOUT  (60*HZ)      /* HZ == 'jiffies in 1 second' */
+#endif
+
+#define SG_DEF_COMMAND_Q 0     /* command queuing is always on when
+          the new interface is used */
+#define SG_DEF_UNDERRUN_FLAG 0
+
+#endif
diff --git a/include/android/sys/io.h b/include/android/sys/io.h
new file mode 100644
index 0000000..e69de29
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
index ab3c876..1ba22be 100644
--- a/include/qemu/osdep.h
+++ b/include/qemu/osdep.h
@@ -59,6 +59,10 @@
 #define WEXITSTATUS(x) (x)
 #endif
 
+#ifdef ANDROID
+ #include "sysemu/os-android.h"
+#endif
+
 #ifdef _WIN32
 #include "sysemu/os-win32.h"
 #endif
diff --git a/include/sysemu/os-android.h b/include/sysemu/os-android.h
new file mode 100644
index 0000000..7f73777
--- /dev/null
+++ b/include/sysemu/os-android.h
@@ -0,0 +1,35 @@
+#ifndef QEMU_OS_ANDROID_H
+#define QEMU_OS_ANDROID_H
+
+#include <sys/statvfs.h>
+
+/*
+ * For include the basename prototyping in android.
+ */
+#include <libgen.h>
+
+extern int __rt_sigtimedwait(const sigset_t *uthese, siginfo_t *uinfo, \
+                             const struct timespec *uts, size_t sigsetsize);
+
+int getdtablesize(void);
+int lockf(int fd, int cmd, off_t len);
+int sigtimedwait(const sigset_t *set, siginfo_t *info, \
+                 const struct timespec *ts);
+int shm_open(const char *name, int oflag, mode_t mode);
+char *a_ptsname(int fd);
+
+#define F_TLOCK         0
+#define IOV_MAX         256
+#define __SID           ('S' << 8)
+
+#define I_NREAD     (__SID | 1) /* Counts the number of data bytes in the data
+                                   block in the first message.  */
+#define I_PUSH      (__SID | 2) /* Push STREAMS module onto top of the current
+                                   STREAM, just below the STREAM head.  */
+#define I_POP       (__SID | 3) /* Remove STREAMS module from just below the
+                                   STREAM head.  */
+#define I_LOOK      (__SID | 4) /* Retrieve the name of the module just below
+                                   the STREAM head and place it in a character
+                                   string.  */
+
+#endif
diff --git a/kvm-all.c b/kvm-all.c
index c6f5128..3e0d726 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -45,6 +45,9 @@
 #endif
 
 /* KVM uses PAGE_SIZE in its definition of COALESCED_MMIO_MAX */
+#ifdef ANDROID
+#undef PAGE_SIZE
+#endif
 #define PAGE_SIZE TARGET_PAGE_SIZE
 
 //#define DEBUG_KVM
diff --git a/scripts/android-pkg-config b/scripts/android-pkg-config
new file mode 100755
index 0000000..52a0aa8
--- /dev/null
+++ b/scripts/android-pkg-config
@@ -0,0 +1,28 @@
+#!/bin/bash
+echo $@ >> check.log
+for arg in $@; do
+    case $arg in
+        --cflags)
+           cflags=yes
+           ;;
+        --libs)
+           libs=yes
+           ;;
+        *)
+           pkg_name=$arg
+           ;;
+    esac
+done
+
+
+case $pkg_name in
+    gthread-2.0)
+        if test "$libs" = "yes" ; then
+           echo ""
+        fi
+        if test "$cflags" = "yes" ; then
+          echo -I$SYSROOT/usr/include/glib-2.0 -I$SYSROOT/usr/lib/glib-2.0/include/
+          echo -I$SYSROOT/usr/include/glib-2.0 -I$SYSROOT/usr/lib/glib-2.0/include/ >> check.log
+        fi
+        ;;
+esac
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/osdep.c b/util/osdep.c
index 0092bb6..6f572fd 100644
--- a/util/osdep.c
+++ b/util/osdep.c
@@ -428,3 +428,56 @@ writev(int fd, const struct iovec *iov, int iov_cnt)
     return readv_writev(fd, iov, iov_cnt, true);
 }
 #endif
+
+#ifdef ANDROID
+
+#include <sys/resource.h>
+#include <sys/sysconf.h>
+
+int shm_open(const char *name, int oflag, mode_t mode)
+{
+    return -1;
+}
+
+/*
+ * Fixed returned value in android.
+ */
+
+int getdtablesize(void)
+{
+    struct rlimit r;
+
+    if (getrlimit(RLIMIT_NOFILE, &r) < 0) {
+        return sysconf(_SC_OPEN_MAX);
+    }
+    return r.rlim_cur;
+}
+
+/*
+ * Call bionic C version.
+ */
+int sigtimedwait(const sigset_t *set, siginfo_t *info, \
+                 const struct timespec *ts)
+{
+    return __rt_sigtimedwait(set, info, ts, _NSIG/8);
+}
+
+int lockf(int fd, int cmd, off_t len)
+{
+    return -1;
+}
+
+/*
+ * Prevent wanring of android gcc, but may still concurrency access.
+ */
+char *a_ptsname(int fd)
+{
+    static char namebuf[PATH_MAX];
+    int ret;
+    ret = ptsname_r(fd, namebuf, sizeof(namebuf));
+    if (ret == 0) {
+        return namebuf;
+    }
+    return NULL;
+}
+#endif
diff --git a/util/qemu-openpty.c b/util/qemu-openpty.c
index 4c53211..75a1e99 100644
--- a/util/qemu-openpty.c
+++ b/util/qemu-openpty.c
@@ -51,7 +51,12 @@
 # include <termios.h>
 #endif
 
-#ifdef __sun__
+#if defined(__sun__) || defined(ANDROID)
+
+#ifdef ANDROID
+#define ptsname(a) a_ptsname(a)
+#endif
+
 /* 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)
@@ -93,7 +98,8 @@ err:
         close(mfd);
         return -1;
 }
-
+#endif
+#ifdef __sun__
 static void cfmakeraw (struct termios *termios_p)
 {
         termios_p->c_iflag &=
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC PATCH] os-android: Add support to android platform, built by ndk-r10
@ 2015-09-15  5:11 Houcheng Lin
  0 siblings, 0 replies; 11+ messages in thread
From: Houcheng Lin @ 2015-09-15  5:11 UTC (permalink / raw)
  To: linhaocheng, houcheng, peter.maydell, kvm, pbonzini, qemu-devel

From: Houcheng <linhaocheng@itri.org.tw>

This patch is to build qemu in android ndk tool-chain, and has been tested in both
x86_64 and x86 android platform with hardware virtualization enabled. This patch is
composed of three part:

    - configure scripts for android
    - OS dependent code for android
    - kernel headers for android

The configure scripts add cross-compile options for android, define compile flags and link flags
and call android specific pkg-config. A pseudo pkg-config script is added to report correct
compile flags for android system.

The OS dependent code for android that implement functions missing in bionic C, including:
    - getdtablesize(): call getrlimit() instead.
    - sigtimewait(): call __rt_sigtimewait() instead.
    - a_ptsname(): call pstname_r() instead.
    - lockf(): not see this feature in android, directly return -1.
    - shm_open(): not see this feature in android, directly return -1.

The kernel headers for android include two kernel header missing in android: scsi/sg.h and
sys/io.h.

How to build android version
----------------------------
1. download the ndk toolchain r10, 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. configure the qemu and build:

    % export SYSROOT="/opt/android-toolchain64/sysroot"
    % CFLAGS=" --sysroot=$SYSROOT -I$SYSROOT/usr/include -I$SYSROOT/usr/include/pixman-1/" \
        ./configure --prefix="${SYSROOT}/usr"  \
        --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
    % make -j4

    Or, configure qemu to static link version:

    % export SYSROOT="/opt/android-toolchain64/sysroot"
    % CFLAGS=" --sysroot=$SYSROOT -I$SYSROOT/usr/include -I$SYSROOT/usr/include/pixman-1/" \
        ./configure --prefix="${SYSROOT}/usr"  \
        --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 --static
    % make -j4

Signed-off-by: Houcheng <linhaocheng@itri.org.tw>
---
 configure                   |   30 ++++-
 include/android/scsi/sg.h   |  307 +++++++++++++++++++++++++++++++++++++++++++
 include/qemu/osdep.h        |    4 +
 include/sysemu/os-android.h |   35 +++++
 kvm-all.c                   |    3 +
 scripts/android-pkg-config  |   28 ++++
 tests/Makefile              |    2 +
 util/osdep.c                |   53 ++++++++
 util/qemu-openpty.c         |   10 +-
 9 files changed, 467 insertions(+), 5 deletions(-)
 create mode 100644 include/android/scsi/sg.h
 create mode 100644 include/android/sys/io.h
 create mode 100644 include/sysemu/os-android.h
 create mode 100755 scripts/android-pkg-config

diff --git a/configure b/configure
index 5c06663..3ff6ffa 100755
--- a/configure
+++ b/configure
@@ -566,7 +566,6 @@ fi
 
 # host *BSD for user mode
 HOST_VARIANT_DIR=""
-
 case $targetos in
 CYGWIN*)
   mingw32="yes"
@@ -692,9 +691,23 @@ 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"
+      guest_agent="no"
+      QEMU_INCLUDES="-I\$(SRC_PATH)/include/android $QEMU_INCLUDES"
+    ;;
+    *)
+    ;;
+  esac
 ;;
 esac
 
+if [ "$android" = "yes" ] ; then
+  QEMU_CFLAGS="-DANDROID $QEMU_CFLAGS"
+  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"
@@ -1736,7 +1749,14 @@ fi
 # pkg-config probe
 
 if ! has "$pkg_config_exe"; then
-  error_exit "pkg-config binary '$pkg_config_exe' not found"
+  case $cross_prefix in
+    *android*)
+	pkg_config_exe=scripts/android-pkg-config
+	;;
+    *)
+	error_exit "pkg-config binary '$pkg_config_exe' not found"
+	;;
+  esac
 fi
 
 ##########################################
@@ -3764,7 +3784,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
 
@@ -4709,6 +4729,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/include/android/scsi/sg.h b/include/android/scsi/sg.h
new file mode 100644
index 0000000..b7178cb
--- /dev/null
+++ b/include/android/scsi/sg.h
@@ -0,0 +1,307 @@
+#ifndef _SCSI_GENERIC_H
+#define _SCSI_GENERIC_H
+
+/*
+   History:
+    Started: Aug 9 by Lawrence Foard (entropy@world.std.com), to allow user
+     process control of SCSI devices.
+    Development Sponsored by Killy Corp. NY NY
+Original driver (sg.h):
+*       Copyright (C) 1992 Lawrence Foard
+Version 2 and 3 extensions to driver:
+*       Copyright (C) 1998 - 2006 Douglas Gilbert
+
+    Version: 3.5.34 (20060920)
+    This version is for 2.6 series kernels.
+
+    For a full changelog see http://www.torque.net/sg
+
+Map of SG verions to the Linux kernels in which they appear:
+       ----------        ----------------------------------
+       original          all kernels < 2.2.6
+       2.1.40            2.2.20
+       3.0.x             optional version 3 sg driver for 2.2 series
+       3.1.17++          2.4.0++
+       3.5.30++          2.6.0++
+
+Major new features in SG 3.x driver (cf SG 2.x drivers)
+  - SG_IO ioctl() combines function if write() and read()
+  - new interface (sg_io_hdr_t) but still supports old interface
+  - scatter/gather in user space, direct IO, and mmap supported
+
+ The normal action of this driver is to use the adapter (HBA) driver to DMA
+ data into kernel buffers and then use the CPU to copy the data into the
+ user space (vice versa for writes). That is called "indirect" IO due to
+ the double handling of data. There are two methods offered to remove the
+ redundant copy: 1) direct IO and 2) using the mmap() system call to map
+ the reserve buffer (this driver has one reserve buffer per fd) into the
+ user space. Both have their advantages.
+ In terms of absolute speed mmap() is faster. If speed is not a concern,
+ indirect IO should be fine. Read the documentation for more information.
+
+ ** N.B. To use direct IO 'echo 1 > /proc/scsi/sg/allow_dio' or
+         'echo 1 > /sys/module/sg/parameters/allow_dio' is needed.
+         That attribute is 0 by default. **
+
+ Historical note: this SCSI pass-through driver has been known as "sg" for
+ a decade. In broader kernel discussions "sg" is used to refer to scatter
+ gather techniques. The context should clarify which "sg" is referred to.
+
+ Documentation
+ =============
+ A web site for the SG device driver can be found at:
+  http://www.torque.net/sg  [alternatively check the MAINTAINERS file]
+ The documentation for the sg version 3 driver can be found at:
+  http://www.torque.net/sg/p/sg_v3_ho.html
+ This is a rendering from DocBook source [change the extension to "sgml"
+ or "xml"]. There are renderings in "ps", "pdf", "rtf" and "txt" (soon).
+ The SG_IO ioctl is now found in other parts kernel (e.g. the block layer).
+ For more information see http://www.torque.net/sg/sg_io.html
+
+ The older, version 2 documents discuss the original sg interface in detail:
+  http://www.torque.net/sg/p/scsi-generic.txt
+  http://www.torque.net/sg/p/scsi-generic_long.txt
+ Also available: <kernel_source>/Documentation/scsi/scsi-generic.txt
+
+ Utility and test programs are available at the sg web site. They are
+ packaged as sg3_utils (for the lk 2.4 and 2.6 series) and sg_utils
+ (for the lk 2.2 series).
+*/
+
+#ifdef __KERNEL__
+extern int sg_big_buff; /* for sysctl */
+#endif
+
+/* New interface introduced in the 3.x SG drivers follows */
+
+typedef struct sg_iovec /* same structure as used by readv() Linux system */
+{                       /* call. It defines one scatter-gather element. */
+    void __user *iov_base;      /* Starting address  */
+    size_t iov_len;             /* Length in bytes  */
+} sg_iovec_t;
+
+
+typedef struct sg_io_hdr {
+    int interface_id;           /* [i] 'S' for SCSI generic (required) */
+    int dxfer_direction;        /* [i] data transfer direction  */
+    unsigned char cmd_len;      /* [i] SCSI command length ( <= 16 bytes) */
+    unsigned char mx_sb_len;    /* [i] max length to write to sbp */
+    unsigned short iovec_count; /* [i] 0 implies no scatter gather */
+    unsigned int dxfer_len;     /* [i] byte count of data transfer */
+    void __user *dxferp;  /* [i], [*io] points to data transfer memory
+                or scatter gather list */
+    unsigned char __user *cmdp; /* [i], [*i] points to command to perform */
+    void __user *sbp;   /* [i], [*o] points to sense_buffer memory */
+    unsigned int timeout;       /* [i] MAX_UINT->no timeout (unit: millisec) */
+    unsigned int flags;         /* [i] 0 -> default, see SG_FLAG... */
+    int pack_id;                /* [i->o] unused internally (normally) */
+    void __user *usr_ptr;       /* [i->o] unused internally */
+    unsigned char status;       /* [o] scsi status */
+    unsigned char masked_status;/* [o] shifted, masked scsi status */
+    unsigned char msg_status;   /* [o] messaging level data (optional) */
+    unsigned char sb_len_wr;    /* [o] byte count actually written to sbp */
+    unsigned short host_status; /* [o] errors from host adapter */
+    unsigned short driver_status;/* [o] errors from software driver */
+    int resid;                  /* [o] dxfer_len - actual_transferred */
+    unsigned int duration;      /* [o] time taken by cmd (unit: millisec) */
+    unsigned int info;          /* [o] auxiliary information */
+} sg_io_hdr_t;  /* 64 bytes long (on i386) */
+
+#define SG_INTERFACE_ID_ORIG 'S'
+
+/* Use negative values to flag difference from original sg_header structure */
+#define SG_DXFER_NONE (-1)      /* e.g. a SCSI Test Unit Ready command */
+#define SG_DXFER_TO_DEV (-2)    /* e.g. a SCSI WRITE command */
+#define SG_DXFER_FROM_DEV (-3)  /* e.g. a SCSI READ command */
+#define SG_DXFER_TO_FROM_DEV (-4) /* treated like SG_DXFER_FROM_DEV with the
+           additional property than during indirect
+           IO the user buffer is copied into the
+           kernel buffers before the transfer */
+#define SG_DXFER_UNKNOWN (-5)   /* Unknown data direction */
+
+/* following flag values can be "or"-ed together */
+#define SG_FLAG_DIRECT_IO 1     /* default is indirect IO */
+#define SG_FLAG_UNUSED_LUN_INHIBIT 2   /* default is overwrite lun in SCSI */
+        /* command block (when <= SCSI_2) */
+#define SG_FLAG_MMAP_IO 4       /* request memory mapped IO */
+#define SG_FLAG_NO_DXFER 0x10000 /* no transfer of kernel buffers to/from */
+        /* user space (debug indirect IO) */
+
+/* following 'info' values are "or"-ed together */
+#define SG_INFO_OK_MASK 0x1
+#define SG_INFO_OK 0x0          /* no sense, host nor driver "noise" */
+#define SG_INFO_CHECK 0x1       /* something abnormal happened */
+
+#define SG_INFO_DIRECT_IO_MASK 0x6
+#define SG_INFO_INDIRECT_IO 0x0 /* data xfer via kernel buffers (or no xfer) */
+#define SG_INFO_DIRECT_IO 0x2   /* direct IO requested and performed */
+#define SG_INFO_MIXED_IO 0x4    /* part direct, part indirect IO */
+
+
+typedef struct sg_scsi_id { /* used by SG_GET_SCSI_ID ioctl() */
+    int host_no;        /* as in "scsi<n>" where 'n' is one of 0, 1, 2 etc */
+    int channel;
+    int scsi_id;        /* scsi id of target device */
+    int lun;
+    int scsi_type;      /* TYPE_... defined in scsi/scsi.h */
+    short h_cmd_per_lun;/* host (adapter) maximum commands per lun */
+    short d_queue_depth;/* device (or adapter) maximum queue length */
+    int unused[2];      /* probably find a good use, set 0 for now */
+} sg_scsi_id_t; /* 32 bytes long on i386 */
+
+typedef struct sg_req_info { /* used by SG_GET_REQUEST_TABLE ioctl() */
+    char req_state;     /* 0 -> not used, 1 -> written, 2 -> ready to read */
+    char orphan;        /* 0 -> normal request, 1 -> from interruped SG_IO */
+    char sg_io_owned;   /* 0 -> complete with read(), 1 -> owned by SG_IO */
+    char problem;       /* 0 -> no problem detected, 1 -> error to report */
+    int pack_id;        /* pack_id associated with request */
+    void __user *usr_ptr;     /* user provided pointer (in new interface) */
+    unsigned int duration; /* millisecs elapsed since written (req_state==1)
+            or request duration (req_state==2) */
+    int unused;
+} sg_req_info_t; /* 20 bytes long on i386 */
+
+
+/* IOCTLs: Those ioctls that are relevant to the SG 3.x drivers follow.
+ [Those that only apply to the SG 2.x drivers are at the end of the file.]
+ (_GET_s yield result via 'int *' 3rd argument unless otherwise indicated) */
+
+#define SG_EMULATED_HOST 0x2203 /* true for emulated host adapter (ATAPI) */
+
+/* Used to configure SCSI command transformation layer for ATAPI devices */
+/* Only supported by the ide-scsi driver */
+#define SG_SET_TRANSFORM 0x2204 /* N.B. 3rd arg is not pointer but value: */
+          /* 3rd arg = 0 to disable transform, 1 to enable it */
+#define SG_GET_TRANSFORM 0x2205
+
+#define SG_SET_RESERVED_SIZE 0x2275  /* request a new reserved buffer size */
+#define SG_GET_RESERVED_SIZE 0x2272  /* actual size of reserved buffer */
+
+/* The following ioctl has a 'sg_scsi_id_t *' object as its 3rd argument. */
+#define SG_GET_SCSI_ID 0x2276   /* Yields fd's bus, chan, dev, lun + type */
+/* SCSI id information can also be obtained from SCSI_IOCTL_GET_IDLUN */
+
+/* Override host setting and always DMA using low memory ( <16MB on i386) */
+#define SG_SET_FORCE_LOW_DMA 0x2279  /* 0-> use adapter setting, 1-> force */
+#define SG_GET_LOW_DMA 0x227a   /* 0-> use all ram for dma; 1-> low dma ram */
+
+/* When SG_SET_FORCE_PACK_ID set to 1, pack_id is input to read() which
+   tries to fetch a packet with a matching pack_id, waits, or returns EAGAIN.
+   If pack_id is -1 then read oldest waiting. When ...FORCE_PACK_ID set to 0
+   then pack_id ignored by read() and oldest readable fetched. */
+#define SG_SET_FORCE_PACK_ID 0x227b
+#define SG_GET_PACK_ID 0x227c /* Yields oldest readable pack_id (or -1) */
+
+#define SG_GET_NUM_WAITING 0x227d /* Number of commands awaiting read() */
+
+/* Yields max scatter gather tablesize allowed by current host adapter */
+#define SG_GET_SG_TABLESIZE 0x227F  /* 0 implies can't do scatter gather */
+
+#define SG_GET_VERSION_NUM 0x2282 /* Example: version 2.1.34 yields 20134 */
+
+/* Returns -EBUSY if occupied. 3rd argument pointer to int (see next) */
+#define SG_SCSI_RESET 0x2284
+/* Associated values that can be given to SG_SCSI_RESET follow */
+#define   SG_SCSI_RESET_NOTHING 0
+#define   SG_SCSI_RESET_DEVICE  1
+#define   SG_SCSI_RESET_BUS 2
+#define   SG_SCSI_RESET_HOST  3
+#define   SG_SCSI_RESET_TARGET  4
+
+/* synchronous SCSI command ioctl, (only in version 3 interface) */
+#define SG_IO 0x2285   /* similar effect as write() followed by read() */
+
+#define SG_GET_REQUEST_TABLE 0x2286   /* yields table of active requests */
+
+/* How to treat EINTR during SG_IO ioctl(), only in SG 3.x series */
+#define SG_SET_KEEP_ORPHAN 0x2287 /* 1 -> hold for read(), 0 -> drop (def) */
+#define SG_GET_KEEP_ORPHAN 0x2288
+
+/* yields scsi midlevel's access_count for this SCSI device */
+#define SG_GET_ACCESS_COUNT 0x2289
+
+
+#define SG_SCATTER_SZ (8 * 4096)
+/* Largest size (in bytes) a single scatter-gather list element can have.
+   The value used by the driver is 'max(SG_SCATTER_SZ, PAGE_SIZE)'.
+   This value should be a power of 2 (and may be rounded up internally).
+   If scatter-gather is not supported by adapter then this value is the
+   largest data block that can be read/written by a single scsi command. */
+
+#define SG_DEFAULT_RETRIES 0
+
+/* Defaults, commented if they differ from original sg driver */
+#define SG_DEF_FORCE_LOW_DMA 0  /* was 1 -> memory below 16MB on i386 */
+#define SG_DEF_FORCE_PACK_ID 0
+#define SG_DEF_KEEP_ORPHAN 0
+#define SG_DEF_RESERVED_SIZE SG_SCATTER_SZ /* load time option */
+
+/* maximum outstanding requests, write() yields EDOM if exceeded */
+#define SG_MAX_QUEUE 16
+
+#define SG_BIG_BUFF SG_DEF_RESERVED_SIZE    /* for backward compatibility */
+
+/* Alternate style type names, "..._t" variants preferred */
+typedef struct sg_io_hdr Sg_io_hdr;
+typedef struct sg_io_vec Sg_io_vec;
+typedef struct sg_scsi_id Sg_scsi_id;
+typedef struct sg_req_info Sg_req_info;
+
+
+/* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
+/*   The older SG interface based on the 'sg_header' structure follows.   */
+/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
+
+#define SG_MAX_SENSE 16   /* this only applies to the sg_header interface */
+
+struct sg_header {
+    int pack_len;    /* [o] reply_len (ie useless), ignored as input */
+    int reply_len;   /* [i] max length of expected reply (inc. sg_header) */
+    int pack_id;     /* [io] id number of packet (use ints >= 0) */
+    int result;      /* [o] 0==ok, else (+ve) Unix errno (best ignored) */
+    unsigned int twelve_byte:1;
+  /* [i] Force 12 byte command length for group 6 & 7 commands  */
+    unsigned int target_status:5;   /* [o] scsi status from target */
+    unsigned int host_status:8;     /* [o] host status (see "DID" codes) */
+    unsigned int driver_status:8;   /* [o] driver status+suggestion */
+    unsigned int other_flags:10;    /* unused */
+    unsigned char sense_buffer[SG_MAX_SENSE]; /* [o] Output in 3 cases:
+     when target_status is CHECK_CONDITION or
+     when target_status is COMMAND_TERMINATED or
+     when (driver_status & DRIVER_SENSE) is true. */
+};      /* This structure is 36 bytes long on i386 */
+
+
+/* IOCTLs: The following are not required (or ignored) when the sg_io_hdr_t
+     interface is used. They are kept for backward compatibility with
+     the original and version 2 drivers. */
+
+#define SG_SET_TIMEOUT 0x2201  /* unit: jiffies (10ms on i386) */
+#define SG_GET_TIMEOUT 0x2202  /* yield timeout as _return_ value */
+
+/* Get/set command queuing state per fd (default is SG_DEF_COMMAND_Q.
+   Each time a sg_io_hdr_t object is seen on this file descriptor, this
+   command queuing flag is set on (overriding the previous setting). */
+#define SG_GET_COMMAND_Q 0x2270   /* Yields 0 (queuing off) or 1 (on) */
+#define SG_SET_COMMAND_Q 0x2271   /* Change queuing state with 0 or 1 */
+
+/* Turn on/off error sense trace (1 and 0 respectively, default is off).
+   Try using: "# cat /proc/scsi/sg/debug" instead in the v3 driver */
+#define SG_SET_DEBUG 0x227e    /* 0 -> turn off debug */
+
+#define SG_NEXT_CMD_LEN 0x2283  /* override SCSI command length with given
+       number on the next write() on this file descriptor */
+
+
+/* Defaults, commented if they differ from original sg driver */
+#ifdef __KERNEL__
+#define SG_DEFAULT_TIMEOUT_USER (60*USER_HZ) /* HZ == 'jiffies in 1 second' */
+#else
+#define SG_DEFAULT_TIMEOUT  (60*HZ)      /* HZ == 'jiffies in 1 second' */
+#endif
+
+#define SG_DEF_COMMAND_Q 0     /* command queuing is always on when
+          the new interface is used */
+#define SG_DEF_UNDERRUN_FLAG 0
+
+#endif
diff --git a/include/android/sys/io.h b/include/android/sys/io.h
new file mode 100644
index 0000000..e69de29
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
index ab3c876..1ba22be 100644
--- a/include/qemu/osdep.h
+++ b/include/qemu/osdep.h
@@ -59,6 +59,10 @@
 #define WEXITSTATUS(x) (x)
 #endif
 
+#ifdef ANDROID
+ #include "sysemu/os-android.h"
+#endif
+
 #ifdef _WIN32
 #include "sysemu/os-win32.h"
 #endif
diff --git a/include/sysemu/os-android.h b/include/sysemu/os-android.h
new file mode 100644
index 0000000..7f73777
--- /dev/null
+++ b/include/sysemu/os-android.h
@@ -0,0 +1,35 @@
+#ifndef QEMU_OS_ANDROID_H
+#define QEMU_OS_ANDROID_H
+
+#include <sys/statvfs.h>
+
+/*
+ * For include the basename prototyping in android.
+ */
+#include <libgen.h>
+
+extern int __rt_sigtimedwait(const sigset_t *uthese, siginfo_t *uinfo, \
+                             const struct timespec *uts, size_t sigsetsize);
+
+int getdtablesize(void);
+int lockf(int fd, int cmd, off_t len);
+int sigtimedwait(const sigset_t *set, siginfo_t *info, \
+                 const struct timespec *ts);
+int shm_open(const char *name, int oflag, mode_t mode);
+char *a_ptsname(int fd);
+
+#define F_TLOCK         0
+#define IOV_MAX         256
+#define __SID           ('S' << 8)
+
+#define I_NREAD     (__SID | 1) /* Counts the number of data bytes in the data
+                                   block in the first message.  */
+#define I_PUSH      (__SID | 2) /* Push STREAMS module onto top of the current
+                                   STREAM, just below the STREAM head.  */
+#define I_POP       (__SID | 3) /* Remove STREAMS module from just below the
+                                   STREAM head.  */
+#define I_LOOK      (__SID | 4) /* Retrieve the name of the module just below
+                                   the STREAM head and place it in a character
+                                   string.  */
+
+#endif
diff --git a/kvm-all.c b/kvm-all.c
index c6f5128..3e0d726 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -45,6 +45,9 @@
 #endif
 
 /* KVM uses PAGE_SIZE in its definition of COALESCED_MMIO_MAX */
+#ifdef ANDROID
+#undef PAGE_SIZE
+#endif
 #define PAGE_SIZE TARGET_PAGE_SIZE
 
 //#define DEBUG_KVM
diff --git a/scripts/android-pkg-config b/scripts/android-pkg-config
new file mode 100755
index 0000000..52a0aa8
--- /dev/null
+++ b/scripts/android-pkg-config
@@ -0,0 +1,28 @@
+#!/bin/bash
+echo $@ >> check.log
+for arg in $@; do
+    case $arg in
+        --cflags)
+           cflags=yes
+           ;;
+        --libs)
+           libs=yes
+           ;;
+        *)
+           pkg_name=$arg
+           ;;
+    esac
+done
+
+
+case $pkg_name in
+    gthread-2.0)
+        if test "$libs" = "yes" ; then
+           echo ""
+        fi
+        if test "$cflags" = "yes" ; then
+          echo -I$SYSROOT/usr/include/glib-2.0 -I$SYSROOT/usr/lib/glib-2.0/include/
+          echo -I$SYSROOT/usr/include/glib-2.0 -I$SYSROOT/usr/lib/glib-2.0/include/ >> check.log
+        fi
+        ;;
+esac
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/osdep.c b/util/osdep.c
index 0092bb6..6f572fd 100644
--- a/util/osdep.c
+++ b/util/osdep.c
@@ -428,3 +428,56 @@ writev(int fd, const struct iovec *iov, int iov_cnt)
     return readv_writev(fd, iov, iov_cnt, true);
 }
 #endif
+
+#ifdef ANDROID
+
+#include <sys/resource.h>
+#include <sys/sysconf.h>
+
+int shm_open(const char *name, int oflag, mode_t mode)
+{
+    return -1;
+}
+
+/*
+ * Fixed returned value in android.
+ */
+
+int getdtablesize(void)
+{
+    struct rlimit r;
+
+    if (getrlimit(RLIMIT_NOFILE, &r) < 0) {
+        return sysconf(_SC_OPEN_MAX);
+    }
+    return r.rlim_cur;
+}
+
+/*
+ * Call bionic C version.
+ */
+int sigtimedwait(const sigset_t *set, siginfo_t *info, \
+                 const struct timespec *ts)
+{
+    return __rt_sigtimedwait(set, info, ts, _NSIG/8);
+}
+
+int lockf(int fd, int cmd, off_t len)
+{
+    return -1;
+}
+
+/*
+ * Prevent wanring of android gcc, but may still concurrency access.
+ */
+char *a_ptsname(int fd)
+{
+    static char namebuf[PATH_MAX];
+    int ret;
+    ret = ptsname_r(fd, namebuf, sizeof(namebuf));
+    if (ret == 0) {
+        return namebuf;
+    }
+    return NULL;
+}
+#endif
diff --git a/util/qemu-openpty.c b/util/qemu-openpty.c
index 4c53211..75a1e99 100644
--- a/util/qemu-openpty.c
+++ b/util/qemu-openpty.c
@@ -51,7 +51,12 @@
 # include <termios.h>
 #endif
 
-#ifdef __sun__
+#if defined(__sun__) || defined(ANDROID)
+
+#ifdef ANDROID
+#define ptsname(a) a_ptsname(a)
+#endif
+
 /* 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)
@@ -93,7 +98,8 @@ err:
         close(mfd);
         return -1;
 }
-
+#endif
+#ifdef __sun__
 static void cfmakeraw (struct termios *termios_p)
 {
         termios_p->c_iflag &=
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [RFC PATCH] os-android: Add support to android platform, built by ndk-r10
  2015-09-15  2:11 [RFC PATCH] os-android: Add support to android platform, built by ndk-r10 Houcheng Lin
@ 2015-09-15  9:41 ` Paolo Bonzini
  2015-09-15 17:26   ` Houcheng Lin
  2015-09-15 17:34   ` Houcheng Lin
  2015-09-15 10:19 ` Fam Zheng
  1 sibling, 2 replies; 11+ messages in thread
From: Paolo Bonzini @ 2015-09-15  9:41 UTC (permalink / raw)
  To: Houcheng Lin, linhaocheng, peter.maydell, kvm



On 15/09/2015 04:11, Houcheng Lin wrote:
> The OS dependent code for android that implement functions missing in bionic C, including:
>     - getdtablesize(): call getrlimit() instead.

This is okay and can be done unconditionally (introduce a new
qemu_getdtablesize function that is defined in util/oslib-posix.c).

>     - a_ptsname(): call pstname_r() instead.

This is not necessary, see below.

>     - sigtimewait(): call __rt_sigtimewait() instead.
>     - lockf(): not see this feature in android, directly return -1.
>     - shm_open(): not see this feature in android, directly return -1.

This is not okay.  Please fix your libc instead.

> The kernel headers for android include two kernel header missing in android: scsi/sg.h and
> sys/io.h.

For sys/io.h, we can just remove the inclusion.  It is not necessary.

scsi/sg.h should be exported by the Linux kernel, so that we can use
scripts/update-linux-headers.sh to copy it from QEMU.  I've sent a Linux
kernel patch and CCed you.

More comments follow:

> diff --git a/configure b/configure
> index 5c06663..3ff6ffa 100755
> --- a/configure
> +++ b/configure
> @@ -566,7 +566,6 @@ fi
>  
>  # host *BSD for user mode
>  HOST_VARIANT_DIR=""
> -
>  case $targetos in
>  CYGWIN*)
>    mingw32="yes"
> @@ -692,9 +691,23 @@ 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"
> +      guest_agent="no"

You should instead disable the guest agent on your configure command line.

> +      QEMU_INCLUDES="-I\$(SRC_PATH)/include/android $QEMU_INCLUDES"
> +    ;;
> +    *)
> +    ;;
> +  esac
>  ;;
>  esac
>  
> +if [ "$android" = "yes" ] ; then
> +  QEMU_CFLAGS="-DANDROID $QEMU_CFLAGS"

If you have CONFIG_ANDROID, you do not need -DANDROID.

> +  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"

This should not be necessary, QEMU uses pkg-config.

> +fi
>  if [ "$bsd" = "yes" ] ; then
>    if [ "$darwin" != "yes" ] ; then
>      bsd_user="yes"
> @@ -1736,7 +1749,14 @@ fi
>  # pkg-config probe
>  
>  if ! has "$pkg_config_exe"; then
> -  error_exit "pkg-config binary '$pkg_config_exe' not found"
> +  case $cross_prefix in
> +    *android*)
> +	pkg_config_exe=scripts/android-pkg-config

Neither should this.  Your cross-compilation environment is not
correctly set up if you do not have a pkg-config executable.  If you
want to use a wrapper, you can specify it with the PKG_CONFIG
environment variable.  But it need not be maintained in the QEMU
repository, because QEMU assumes a complete cross-compilation environment.

> +	;;
> +    *)
> +	error_exit "pkg-config binary '$pkg_config_exe' not found"
> +	;;
> +  esac
>  fi
>  
>  ##########################################
> @@ -3764,7 +3784,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
>  
> @@ -4709,6 +4729,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/include/qemu/osdep.h b/include/qemu/osdep.h
> index ab3c876..1ba22be 100644
> --- a/include/qemu/osdep.h
> +++ b/include/qemu/osdep.h
> @@ -59,6 +59,10 @@
>  #define WEXITSTATUS(x) (x)
>  #endif
>  
> +#ifdef ANDROID
> + #include "sysemu/os-android.h"
> +#endif
> +
>  #ifdef _WIN32
>  #include "sysemu/os-win32.h"
>  #endif
> diff --git a/include/sysemu/os-android.h b/include/sysemu/os-android.h
> new file mode 100644
> index 0000000..7f73777
> --- /dev/null
> +++ b/include/sysemu/os-android.h
> @@ -0,0 +1,35 @@
> +#ifndef QEMU_OS_ANDROID_H
> +#define QEMU_OS_ANDROID_H
> +
> +#include <sys/statvfs.h>
> +
> +/*
> + * For include the basename prototyping in android.
> + */
> +#include <libgen.h>

These two includes can be added to sysemu/os-posix.h.

> +extern int __rt_sigtimedwait(const sigset_t *uthese, siginfo_t *uinfo, \
> +                             const struct timespec *uts, size_t sigsetsize);
> +
> +int getdtablesize(void);
> +int lockf(int fd, int cmd, off_t len);
> +int sigtimedwait(const sigset_t *set, siginfo_t *info, \
> +                 const struct timespec *ts);
> +int shm_open(const char *name, int oflag, mode_t mode);
> +char *a_ptsname(int fd);
> +
> +#define F_TLOCK         0
> +#define IOV_MAX         256

libc should really be fixed for all of these (except getdtablesize and
a_ptsname).  The way you're working around it is introducing subtle
bugs, for example the pidfile is _not_ locked.

> +#define __SID           ('S' << 8)
> +
> +#define I_NREAD     (__SID | 1) /* Counts the number of data bytes in the data
> +                                   block in the first message.  */
> +#define I_PUSH      (__SID | 2) /* Push STREAMS module onto top of the current
> +                                   STREAM, just below the STREAM head.  */
> +#define I_POP       (__SID | 3) /* Remove STREAMS module from just below the
> +                                   STREAM head.  */
> +#define I_LOOK      (__SID | 4) /* Retrieve the name of the module just below
> +                                   the STREAM head and place it in a character
> +                                   string.  */

These are not necessary.

> +#endif
> diff --git a/kvm-all.c b/kvm-all.c
> index c6f5128..3e0d726 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -45,6 +45,9 @@
>  #endif
>  
>  /* KVM uses PAGE_SIZE in its definition of COALESCED_MMIO_MAX */
> +#ifdef ANDROID
> +#undef PAGE_SIZE
> +#endif

What is the definition of PAGE_SIZE on Android?  Can we do

#ifdef PAGE_SIZE
QEMU_BUILD_BUG_ON(PAGE_SIZE != TARGET_PAGE_SIZE);
#else
#define PAGE_SIZE TARGET_PAGE_SIZE
#endif

?

>  #define PAGE_SIZE TARGET_PAGE_SIZE
>  
>  //#define DEBUG_KVM
> diff --git a/scripts/android-pkg-config b/scripts/android-pkg-config
> new file mode 100755
> index 0000000..52a0aa8
> --- /dev/null
> +++ b/scripts/android-pkg-config

See above, this should not be part of QEMU.  The reason is that QEMU
developers do not test Android builds, and the script would rot.
Instead, you should document how to prepare a complete environment to
cross-compile QEMU for Android.

> 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

This is okay.

>  
>  # QTest rules
>  
> diff --git a/util/osdep.c b/util/osdep.c
> index 0092bb6..6f572fd 100644
> --- a/util/osdep.c
> +++ b/util/osdep.c
> +/*
> + * Prevent wanring of android gcc, but may still concurrency access.
> + */
> +char *a_ptsname(int fd)
> +{
> +    static char namebuf[PATH_MAX];
> +    int ret;
> +    ret = ptsname_r(fd, namebuf, sizeof(namebuf));
> +    if (ret == 0) {
> +        return namebuf;
> +    }
> +    return NULL;
> +}
> +#endif
> diff --git a/util/qemu-openpty.c b/util/qemu-openpty.c
> index 4c53211..75a1e99 100644
> --- a/util/qemu-openpty.c
> +++ b/util/qemu-openpty.c
> @@ -51,7 +51,12 @@
>  # include <termios.h>
>  #endif
>  
> -#ifdef __sun__
> +#if defined(__sun__) || defined(ANDROID)
> +
> +#ifdef ANDROID
> +#define ptsname(a) a_ptsname(a)
> +#endif
> +

The ioctl(sfd, I_PUSH, "ptem") is not needed on Android.

In addition, you can add a

        if (name)
                strcpy(name, slave);

and inside qemu_openpty_row add Android to the "#if defined(__OpenBSD__)
|| defined(__DragonFly__)" case.  This avoids the need to introduce
a_openpty.

The biggest problem is the workarounds you have added for pkg-config.
Everything else is easy to fix.  I look forward to reviewing the next
version!

Paolo

>  /* 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)
> @@ -93,7 +98,8 @@ err:
>          close(mfd);
>          return -1;
>  }
> -
> +#endif
> +#ifdef __sun__
>  static void cfmakeraw (struct termios *termios_p)
>  {
>          termios_p->c_iflag &=
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [RFC PATCH] os-android: Add support to android platform, built by ndk-r10
  2015-09-15  2:11 [RFC PATCH] os-android: Add support to android platform, built by ndk-r10 Houcheng Lin
  2015-09-15  9:41 ` Paolo Bonzini
@ 2015-09-15 10:19 ` Fam Zheng
  1 sibling, 0 replies; 11+ messages in thread
From: Fam Zheng @ 2015-09-15 10:19 UTC (permalink / raw)
  To: Houcheng Lin; +Cc: linhaocheng, peter.maydell, kvm, pbonzini

On Tue, 09/15 10:11, Houcheng Lin wrote:
> From: Houcheng <linhaocheng@itri.org.tw>

Thanks for sending patches!  Please include qemu-devel@nongnu.org list for QEMU
changes.

Fam

> 
> This patch is to build qemu in android ndk tool-chain, and has been tested in both
> x86_64 and x86 android platform with hardware virtualization enabled. This patch is
> composed of three part:
> 
>     - configure scripts for android
>     - OS dependent code for android
>     - kernel headers for android
> 
> The configure scripts add cross-compile options for android, define compile flags and link flags
> and call android specific pkg-config. A pseudo pkg-config script is added to report correct
> compile flags for android system.
> 
> The OS dependent code for android that implement functions missing in bionic C, including:
>     - getdtablesize(): call getrlimit() instead.
>     - sigtimewait(): call __rt_sigtimewait() instead.
>     - a_ptsname(): call pstname_r() instead.
>     - lockf(): not see this feature in android, directly return -1.
>     - shm_open(): not see this feature in android, directly return -1.
> 
> The kernel headers for android include two kernel header missing in android: scsi/sg.h and
> sys/io.h.
> 
> How to build android version
> ----------------------------
> 1. download the ndk toolchain r10, 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. configure the qemu and build:
> 
>     % export SYSROOT="/opt/android-toolchain64/sysroot"
>     % CFLAGS=" --sysroot=$SYSROOT -I$SYSROOT/usr/include -I$SYSROOT/usr/include/pixman-1/" \
>         ./configure --prefix="${SYSROOT}/usr"  \
>         --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
>     % make -j4
> 
>     Or, configure qemu to static link version:
> 
>     % export SYSROOT="/opt/android-toolchain64/sysroot"
>     % CFLAGS=" --sysroot=$SYSROOT -I$SYSROOT/usr/include -I$SYSROOT/usr/include/pixman-1/" \
>         ./configure --prefix="${SYSROOT}/usr"  \
>         --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 --static
>     % make -j4
> 
> Signed-off-by: Houcheng <linhaocheng@itri.org.tw>
> ---
>  configure                   |   30 ++++-
>  include/android/scsi/sg.h   |  307 +++++++++++++++++++++++++++++++++++++++++++
>  include/qemu/osdep.h        |    4 +
>  include/sysemu/os-android.h |   35 +++++
>  kvm-all.c                   |    3 +
>  scripts/android-pkg-config  |   28 ++++
>  tests/Makefile              |    2 +
>  util/osdep.c                |   53 ++++++++
>  util/qemu-openpty.c         |   10 +-
>  9 files changed, 467 insertions(+), 5 deletions(-)
>  create mode 100644 include/android/scsi/sg.h
>  create mode 100644 include/android/sys/io.h
>  create mode 100644 include/sysemu/os-android.h
>  create mode 100755 scripts/android-pkg-config
> 
> diff --git a/configure b/configure
> index 5c06663..3ff6ffa 100755
> --- a/configure
> +++ b/configure
> @@ -566,7 +566,6 @@ fi
>  
>  # host *BSD for user mode
>  HOST_VARIANT_DIR=""
> -
>  case $targetos in
>  CYGWIN*)
>    mingw32="yes"
> @@ -692,9 +691,23 @@ 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"
> +      guest_agent="no"
> +      QEMU_INCLUDES="-I\$(SRC_PATH)/include/android $QEMU_INCLUDES"
> +    ;;
> +    *)
> +    ;;
> +  esac
>  ;;
>  esac
>  
> +if [ "$android" = "yes" ] ; then
> +  QEMU_CFLAGS="-DANDROID $QEMU_CFLAGS"
> +  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"
> @@ -1736,7 +1749,14 @@ fi
>  # pkg-config probe
>  
>  if ! has "$pkg_config_exe"; then
> -  error_exit "pkg-config binary '$pkg_config_exe' not found"
> +  case $cross_prefix in
> +    *android*)
> +	pkg_config_exe=scripts/android-pkg-config
> +	;;
> +    *)
> +	error_exit "pkg-config binary '$pkg_config_exe' not found"
> +	;;
> +  esac
>  fi
>  
>  ##########################################
> @@ -3764,7 +3784,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
>  
> @@ -4709,6 +4729,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/include/android/scsi/sg.h b/include/android/scsi/sg.h
> new file mode 100644
> index 0000000..b7178cb
> --- /dev/null
> +++ b/include/android/scsi/sg.h
> @@ -0,0 +1,307 @@
> +#ifndef _SCSI_GENERIC_H
> +#define _SCSI_GENERIC_H
> +
> +/*
> +   History:
> +    Started: Aug 9 by Lawrence Foard (entropy@world.std.com), to allow user
> +     process control of SCSI devices.
> +    Development Sponsored by Killy Corp. NY NY
> +Original driver (sg.h):
> +*       Copyright (C) 1992 Lawrence Foard
> +Version 2 and 3 extensions to driver:
> +*       Copyright (C) 1998 - 2006 Douglas Gilbert
> +
> +    Version: 3.5.34 (20060920)
> +    This version is for 2.6 series kernels.
> +
> +    For a full changelog see http://www.torque.net/sg
> +
> +Map of SG verions to the Linux kernels in which they appear:
> +       ----------        ----------------------------------
> +       original          all kernels < 2.2.6
> +       2.1.40            2.2.20
> +       3.0.x             optional version 3 sg driver for 2.2 series
> +       3.1.17++          2.4.0++
> +       3.5.30++          2.6.0++
> +
> +Major new features in SG 3.x driver (cf SG 2.x drivers)
> +  - SG_IO ioctl() combines function if write() and read()
> +  - new interface (sg_io_hdr_t) but still supports old interface
> +  - scatter/gather in user space, direct IO, and mmap supported
> +
> + The normal action of this driver is to use the adapter (HBA) driver to DMA
> + data into kernel buffers and then use the CPU to copy the data into the
> + user space (vice versa for writes). That is called "indirect" IO due to
> + the double handling of data. There are two methods offered to remove the
> + redundant copy: 1) direct IO and 2) using the mmap() system call to map
> + the reserve buffer (this driver has one reserve buffer per fd) into the
> + user space. Both have their advantages.
> + In terms of absolute speed mmap() is faster. If speed is not a concern,
> + indirect IO should be fine. Read the documentation for more information.
> +
> + ** N.B. To use direct IO 'echo 1 > /proc/scsi/sg/allow_dio' or
> +         'echo 1 > /sys/module/sg/parameters/allow_dio' is needed.
> +         That attribute is 0 by default. **
> +
> + Historical note: this SCSI pass-through driver has been known as "sg" for
> + a decade. In broader kernel discussions "sg" is used to refer to scatter
> + gather techniques. The context should clarify which "sg" is referred to.
> +
> + Documentation
> + =============
> + A web site for the SG device driver can be found at:
> +  http://www.torque.net/sg  [alternatively check the MAINTAINERS file]
> + The documentation for the sg version 3 driver can be found at:
> +  http://www.torque.net/sg/p/sg_v3_ho.html
> + This is a rendering from DocBook source [change the extension to "sgml"
> + or "xml"]. There are renderings in "ps", "pdf", "rtf" and "txt" (soon).
> + The SG_IO ioctl is now found in other parts kernel (e.g. the block layer).
> + For more information see http://www.torque.net/sg/sg_io.html
> +
> + The older, version 2 documents discuss the original sg interface in detail:
> +  http://www.torque.net/sg/p/scsi-generic.txt
> +  http://www.torque.net/sg/p/scsi-generic_long.txt
> + Also available: <kernel_source>/Documentation/scsi/scsi-generic.txt
> +
> + Utility and test programs are available at the sg web site. They are
> + packaged as sg3_utils (for the lk 2.4 and 2.6 series) and sg_utils
> + (for the lk 2.2 series).
> +*/
> +
> +#ifdef __KERNEL__
> +extern int sg_big_buff; /* for sysctl */
> +#endif
> +
> +/* New interface introduced in the 3.x SG drivers follows */
> +
> +typedef struct sg_iovec /* same structure as used by readv() Linux system */
> +{                       /* call. It defines one scatter-gather element. */
> +    void __user *iov_base;      /* Starting address  */
> +    size_t iov_len;             /* Length in bytes  */
> +} sg_iovec_t;
> +
> +
> +typedef struct sg_io_hdr {
> +    int interface_id;           /* [i] 'S' for SCSI generic (required) */
> +    int dxfer_direction;        /* [i] data transfer direction  */
> +    unsigned char cmd_len;      /* [i] SCSI command length ( <= 16 bytes) */
> +    unsigned char mx_sb_len;    /* [i] max length to write to sbp */
> +    unsigned short iovec_count; /* [i] 0 implies no scatter gather */
> +    unsigned int dxfer_len;     /* [i] byte count of data transfer */
> +    void __user *dxferp;  /* [i], [*io] points to data transfer memory
> +                or scatter gather list */
> +    unsigned char __user *cmdp; /* [i], [*i] points to command to perform */
> +    void __user *sbp;   /* [i], [*o] points to sense_buffer memory */
> +    unsigned int timeout;       /* [i] MAX_UINT->no timeout (unit: millisec) */
> +    unsigned int flags;         /* [i] 0 -> default, see SG_FLAG... */
> +    int pack_id;                /* [i->o] unused internally (normally) */
> +    void __user *usr_ptr;       /* [i->o] unused internally */
> +    unsigned char status;       /* [o] scsi status */
> +    unsigned char masked_status;/* [o] shifted, masked scsi status */
> +    unsigned char msg_status;   /* [o] messaging level data (optional) */
> +    unsigned char sb_len_wr;    /* [o] byte count actually written to sbp */
> +    unsigned short host_status; /* [o] errors from host adapter */
> +    unsigned short driver_status;/* [o] errors from software driver */
> +    int resid;                  /* [o] dxfer_len - actual_transferred */
> +    unsigned int duration;      /* [o] time taken by cmd (unit: millisec) */
> +    unsigned int info;          /* [o] auxiliary information */
> +} sg_io_hdr_t;  /* 64 bytes long (on i386) */
> +
> +#define SG_INTERFACE_ID_ORIG 'S'
> +
> +/* Use negative values to flag difference from original sg_header structure */
> +#define SG_DXFER_NONE (-1)      /* e.g. a SCSI Test Unit Ready command */
> +#define SG_DXFER_TO_DEV (-2)    /* e.g. a SCSI WRITE command */
> +#define SG_DXFER_FROM_DEV (-3)  /* e.g. a SCSI READ command */
> +#define SG_DXFER_TO_FROM_DEV (-4) /* treated like SG_DXFER_FROM_DEV with the
> +           additional property than during indirect
> +           IO the user buffer is copied into the
> +           kernel buffers before the transfer */
> +#define SG_DXFER_UNKNOWN (-5)   /* Unknown data direction */
> +
> +/* following flag values can be "or"-ed together */
> +#define SG_FLAG_DIRECT_IO 1     /* default is indirect IO */
> +#define SG_FLAG_UNUSED_LUN_INHIBIT 2   /* default is overwrite lun in SCSI */
> +        /* command block (when <= SCSI_2) */
> +#define SG_FLAG_MMAP_IO 4       /* request memory mapped IO */
> +#define SG_FLAG_NO_DXFER 0x10000 /* no transfer of kernel buffers to/from */
> +        /* user space (debug indirect IO) */
> +
> +/* following 'info' values are "or"-ed together */
> +#define SG_INFO_OK_MASK 0x1
> +#define SG_INFO_OK 0x0          /* no sense, host nor driver "noise" */
> +#define SG_INFO_CHECK 0x1       /* something abnormal happened */
> +
> +#define SG_INFO_DIRECT_IO_MASK 0x6
> +#define SG_INFO_INDIRECT_IO 0x0 /* data xfer via kernel buffers (or no xfer) */
> +#define SG_INFO_DIRECT_IO 0x2   /* direct IO requested and performed */
> +#define SG_INFO_MIXED_IO 0x4    /* part direct, part indirect IO */
> +
> +
> +typedef struct sg_scsi_id { /* used by SG_GET_SCSI_ID ioctl() */
> +    int host_no;        /* as in "scsi<n>" where 'n' is one of 0, 1, 2 etc */
> +    int channel;
> +    int scsi_id;        /* scsi id of target device */
> +    int lun;
> +    int scsi_type;      /* TYPE_... defined in scsi/scsi.h */
> +    short h_cmd_per_lun;/* host (adapter) maximum commands per lun */
> +    short d_queue_depth;/* device (or adapter) maximum queue length */
> +    int unused[2];      /* probably find a good use, set 0 for now */
> +} sg_scsi_id_t; /* 32 bytes long on i386 */
> +
> +typedef struct sg_req_info { /* used by SG_GET_REQUEST_TABLE ioctl() */
> +    char req_state;     /* 0 -> not used, 1 -> written, 2 -> ready to read */
> +    char orphan;        /* 0 -> normal request, 1 -> from interruped SG_IO */
> +    char sg_io_owned;   /* 0 -> complete with read(), 1 -> owned by SG_IO */
> +    char problem;       /* 0 -> no problem detected, 1 -> error to report */
> +    int pack_id;        /* pack_id associated with request */
> +    void __user *usr_ptr;     /* user provided pointer (in new interface) */
> +    unsigned int duration; /* millisecs elapsed since written (req_state==1)
> +            or request duration (req_state==2) */
> +    int unused;
> +} sg_req_info_t; /* 20 bytes long on i386 */
> +
> +
> +/* IOCTLs: Those ioctls that are relevant to the SG 3.x drivers follow.
> + [Those that only apply to the SG 2.x drivers are at the end of the file.]
> + (_GET_s yield result via 'int *' 3rd argument unless otherwise indicated) */
> +
> +#define SG_EMULATED_HOST 0x2203 /* true for emulated host adapter (ATAPI) */
> +
> +/* Used to configure SCSI command transformation layer for ATAPI devices */
> +/* Only supported by the ide-scsi driver */
> +#define SG_SET_TRANSFORM 0x2204 /* N.B. 3rd arg is not pointer but value: */
> +          /* 3rd arg = 0 to disable transform, 1 to enable it */
> +#define SG_GET_TRANSFORM 0x2205
> +
> +#define SG_SET_RESERVED_SIZE 0x2275  /* request a new reserved buffer size */
> +#define SG_GET_RESERVED_SIZE 0x2272  /* actual size of reserved buffer */
> +
> +/* The following ioctl has a 'sg_scsi_id_t *' object as its 3rd argument. */
> +#define SG_GET_SCSI_ID 0x2276   /* Yields fd's bus, chan, dev, lun + type */
> +/* SCSI id information can also be obtained from SCSI_IOCTL_GET_IDLUN */
> +
> +/* Override host setting and always DMA using low memory ( <16MB on i386) */
> +#define SG_SET_FORCE_LOW_DMA 0x2279  /* 0-> use adapter setting, 1-> force */
> +#define SG_GET_LOW_DMA 0x227a   /* 0-> use all ram for dma; 1-> low dma ram */
> +
> +/* When SG_SET_FORCE_PACK_ID set to 1, pack_id is input to read() which
> +   tries to fetch a packet with a matching pack_id, waits, or returns EAGAIN.
> +   If pack_id is -1 then read oldest waiting. When ...FORCE_PACK_ID set to 0
> +   then pack_id ignored by read() and oldest readable fetched. */
> +#define SG_SET_FORCE_PACK_ID 0x227b
> +#define SG_GET_PACK_ID 0x227c /* Yields oldest readable pack_id (or -1) */
> +
> +#define SG_GET_NUM_WAITING 0x227d /* Number of commands awaiting read() */
> +
> +/* Yields max scatter gather tablesize allowed by current host adapter */
> +#define SG_GET_SG_TABLESIZE 0x227F  /* 0 implies can't do scatter gather */
> +
> +#define SG_GET_VERSION_NUM 0x2282 /* Example: version 2.1.34 yields 20134 */
> +
> +/* Returns -EBUSY if occupied. 3rd argument pointer to int (see next) */
> +#define SG_SCSI_RESET 0x2284
> +/* Associated values that can be given to SG_SCSI_RESET follow */
> +#define   SG_SCSI_RESET_NOTHING 0
> +#define   SG_SCSI_RESET_DEVICE  1
> +#define   SG_SCSI_RESET_BUS 2
> +#define   SG_SCSI_RESET_HOST  3
> +#define   SG_SCSI_RESET_TARGET  4
> +
> +/* synchronous SCSI command ioctl, (only in version 3 interface) */
> +#define SG_IO 0x2285   /* similar effect as write() followed by read() */
> +
> +#define SG_GET_REQUEST_TABLE 0x2286   /* yields table of active requests */
> +
> +/* How to treat EINTR during SG_IO ioctl(), only in SG 3.x series */
> +#define SG_SET_KEEP_ORPHAN 0x2287 /* 1 -> hold for read(), 0 -> drop (def) */
> +#define SG_GET_KEEP_ORPHAN 0x2288
> +
> +/* yields scsi midlevel's access_count for this SCSI device */
> +#define SG_GET_ACCESS_COUNT 0x2289
> +
> +
> +#define SG_SCATTER_SZ (8 * 4096)
> +/* Largest size (in bytes) a single scatter-gather list element can have.
> +   The value used by the driver is 'max(SG_SCATTER_SZ, PAGE_SIZE)'.
> +   This value should be a power of 2 (and may be rounded up internally).
> +   If scatter-gather is not supported by adapter then this value is the
> +   largest data block that can be read/written by a single scsi command. */
> +
> +#define SG_DEFAULT_RETRIES 0
> +
> +/* Defaults, commented if they differ from original sg driver */
> +#define SG_DEF_FORCE_LOW_DMA 0  /* was 1 -> memory below 16MB on i386 */
> +#define SG_DEF_FORCE_PACK_ID 0
> +#define SG_DEF_KEEP_ORPHAN 0
> +#define SG_DEF_RESERVED_SIZE SG_SCATTER_SZ /* load time option */
> +
> +/* maximum outstanding requests, write() yields EDOM if exceeded */
> +#define SG_MAX_QUEUE 16
> +
> +#define SG_BIG_BUFF SG_DEF_RESERVED_SIZE    /* for backward compatibility */
> +
> +/* Alternate style type names, "..._t" variants preferred */
> +typedef struct sg_io_hdr Sg_io_hdr;
> +typedef struct sg_io_vec Sg_io_vec;
> +typedef struct sg_scsi_id Sg_scsi_id;
> +typedef struct sg_req_info Sg_req_info;
> +
> +
> +/* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
> +/*   The older SG interface based on the 'sg_header' structure follows.   */
> +/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
> +
> +#define SG_MAX_SENSE 16   /* this only applies to the sg_header interface */
> +
> +struct sg_header {
> +    int pack_len;    /* [o] reply_len (ie useless), ignored as input */
> +    int reply_len;   /* [i] max length of expected reply (inc. sg_header) */
> +    int pack_id;     /* [io] id number of packet (use ints >= 0) */
> +    int result;      /* [o] 0==ok, else (+ve) Unix errno (best ignored) */
> +    unsigned int twelve_byte:1;
> +  /* [i] Force 12 byte command length for group 6 & 7 commands  */
> +    unsigned int target_status:5;   /* [o] scsi status from target */
> +    unsigned int host_status:8;     /* [o] host status (see "DID" codes) */
> +    unsigned int driver_status:8;   /* [o] driver status+suggestion */
> +    unsigned int other_flags:10;    /* unused */
> +    unsigned char sense_buffer[SG_MAX_SENSE]; /* [o] Output in 3 cases:
> +     when target_status is CHECK_CONDITION or
> +     when target_status is COMMAND_TERMINATED or
> +     when (driver_status & DRIVER_SENSE) is true. */
> +};      /* This structure is 36 bytes long on i386 */
> +
> +
> +/* IOCTLs: The following are not required (or ignored) when the sg_io_hdr_t
> +     interface is used. They are kept for backward compatibility with
> +     the original and version 2 drivers. */
> +
> +#define SG_SET_TIMEOUT 0x2201  /* unit: jiffies (10ms on i386) */
> +#define SG_GET_TIMEOUT 0x2202  /* yield timeout as _return_ value */
> +
> +/* Get/set command queuing state per fd (default is SG_DEF_COMMAND_Q.
> +   Each time a sg_io_hdr_t object is seen on this file descriptor, this
> +   command queuing flag is set on (overriding the previous setting). */
> +#define SG_GET_COMMAND_Q 0x2270   /* Yields 0 (queuing off) or 1 (on) */
> +#define SG_SET_COMMAND_Q 0x2271   /* Change queuing state with 0 or 1 */
> +
> +/* Turn on/off error sense trace (1 and 0 respectively, default is off).
> +   Try using: "# cat /proc/scsi/sg/debug" instead in the v3 driver */
> +#define SG_SET_DEBUG 0x227e    /* 0 -> turn off debug */
> +
> +#define SG_NEXT_CMD_LEN 0x2283  /* override SCSI command length with given
> +       number on the next write() on this file descriptor */
> +
> +
> +/* Defaults, commented if they differ from original sg driver */
> +#ifdef __KERNEL__
> +#define SG_DEFAULT_TIMEOUT_USER (60*USER_HZ) /* HZ == 'jiffies in 1 second' */
> +#else
> +#define SG_DEFAULT_TIMEOUT  (60*HZ)      /* HZ == 'jiffies in 1 second' */
> +#endif
> +
> +#define SG_DEF_COMMAND_Q 0     /* command queuing is always on when
> +          the new interface is used */
> +#define SG_DEF_UNDERRUN_FLAG 0
> +
> +#endif
> diff --git a/include/android/sys/io.h b/include/android/sys/io.h
> new file mode 100644
> index 0000000..e69de29
> diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
> index ab3c876..1ba22be 100644
> --- a/include/qemu/osdep.h
> +++ b/include/qemu/osdep.h
> @@ -59,6 +59,10 @@
>  #define WEXITSTATUS(x) (x)
>  #endif
>  
> +#ifdef ANDROID
> + #include "sysemu/os-android.h"
> +#endif
> +
>  #ifdef _WIN32
>  #include "sysemu/os-win32.h"
>  #endif
> diff --git a/include/sysemu/os-android.h b/include/sysemu/os-android.h
> new file mode 100644
> index 0000000..7f73777
> --- /dev/null
> +++ b/include/sysemu/os-android.h
> @@ -0,0 +1,35 @@
> +#ifndef QEMU_OS_ANDROID_H
> +#define QEMU_OS_ANDROID_H
> +
> +#include <sys/statvfs.h>
> +
> +/*
> + * For include the basename prototyping in android.
> + */
> +#include <libgen.h>
> +
> +extern int __rt_sigtimedwait(const sigset_t *uthese, siginfo_t *uinfo, \
> +                             const struct timespec *uts, size_t sigsetsize);
> +
> +int getdtablesize(void);
> +int lockf(int fd, int cmd, off_t len);
> +int sigtimedwait(const sigset_t *set, siginfo_t *info, \
> +                 const struct timespec *ts);
> +int shm_open(const char *name, int oflag, mode_t mode);
> +char *a_ptsname(int fd);
> +
> +#define F_TLOCK         0
> +#define IOV_MAX         256
> +#define __SID           ('S' << 8)
> +
> +#define I_NREAD     (__SID | 1) /* Counts the number of data bytes in the data
> +                                   block in the first message.  */
> +#define I_PUSH      (__SID | 2) /* Push STREAMS module onto top of the current
> +                                   STREAM, just below the STREAM head.  */
> +#define I_POP       (__SID | 3) /* Remove STREAMS module from just below the
> +                                   STREAM head.  */
> +#define I_LOOK      (__SID | 4) /* Retrieve the name of the module just below
> +                                   the STREAM head and place it in a character
> +                                   string.  */
> +
> +#endif
> diff --git a/kvm-all.c b/kvm-all.c
> index c6f5128..3e0d726 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -45,6 +45,9 @@
>  #endif
>  
>  /* KVM uses PAGE_SIZE in its definition of COALESCED_MMIO_MAX */
> +#ifdef ANDROID
> +#undef PAGE_SIZE
> +#endif
>  #define PAGE_SIZE TARGET_PAGE_SIZE
>  
>  //#define DEBUG_KVM
> diff --git a/scripts/android-pkg-config b/scripts/android-pkg-config
> new file mode 100755
> index 0000000..52a0aa8
> --- /dev/null
> +++ b/scripts/android-pkg-config
> @@ -0,0 +1,28 @@
> +#!/bin/bash
> +echo $@ >> check.log
> +for arg in $@; do
> +    case $arg in
> +        --cflags)
> +           cflags=yes
> +           ;;
> +        --libs)
> +           libs=yes
> +           ;;
> +        *)
> +           pkg_name=$arg
> +           ;;
> +    esac
> +done
> +
> +
> +case $pkg_name in
> +    gthread-2.0)
> +        if test "$libs" = "yes" ; then
> +           echo ""
> +        fi
> +        if test "$cflags" = "yes" ; then
> +          echo -I$SYSROOT/usr/include/glib-2.0 -I$SYSROOT/usr/lib/glib-2.0/include/
> +          echo -I$SYSROOT/usr/include/glib-2.0 -I$SYSROOT/usr/lib/glib-2.0/include/ >> check.log
> +        fi
> +        ;;
> +esac
> 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/osdep.c b/util/osdep.c
> index 0092bb6..6f572fd 100644
> --- a/util/osdep.c
> +++ b/util/osdep.c
> @@ -428,3 +428,56 @@ writev(int fd, const struct iovec *iov, int iov_cnt)
>      return readv_writev(fd, iov, iov_cnt, true);
>  }
>  #endif
> +
> +#ifdef ANDROID
> +
> +#include <sys/resource.h>
> +#include <sys/sysconf.h>
> +
> +int shm_open(const char *name, int oflag, mode_t mode)
> +{
> +    return -1;
> +}
> +
> +/*
> + * Fixed returned value in android.
> + */
> +
> +int getdtablesize(void)
> +{
> +    struct rlimit r;
> +
> +    if (getrlimit(RLIMIT_NOFILE, &r) < 0) {
> +        return sysconf(_SC_OPEN_MAX);
> +    }
> +    return r.rlim_cur;
> +}
> +
> +/*
> + * Call bionic C version.
> + */
> +int sigtimedwait(const sigset_t *set, siginfo_t *info, \
> +                 const struct timespec *ts)
> +{
> +    return __rt_sigtimedwait(set, info, ts, _NSIG/8);
> +}
> +
> +int lockf(int fd, int cmd, off_t len)
> +{
> +    return -1;
> +}
> +
> +/*
> + * Prevent wanring of android gcc, but may still concurrency access.
> + */
> +char *a_ptsname(int fd)
> +{
> +    static char namebuf[PATH_MAX];
> +    int ret;
> +    ret = ptsname_r(fd, namebuf, sizeof(namebuf));
> +    if (ret == 0) {
> +        return namebuf;
> +    }
> +    return NULL;
> +}
> +#endif
> diff --git a/util/qemu-openpty.c b/util/qemu-openpty.c
> index 4c53211..75a1e99 100644
> --- a/util/qemu-openpty.c
> +++ b/util/qemu-openpty.c
> @@ -51,7 +51,12 @@
>  # include <termios.h>
>  #endif
>  
> -#ifdef __sun__
> +#if defined(__sun__) || defined(ANDROID)
> +
> +#ifdef ANDROID
> +#define ptsname(a) a_ptsname(a)
> +#endif
> +
>  /* 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)
> @@ -93,7 +98,8 @@ err:
>          close(mfd);
>          return -1;
>  }
> -
> +#endif
> +#ifdef __sun__
>  static void cfmakeraw (struct termios *termios_p)
>  {
>          termios_p->c_iflag &=
> -- 
> 1.7.9.5
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [RFC PATCH] os-android: Add support to android platform, built by ndk-r10
  2015-09-15  9:41 ` Paolo Bonzini
@ 2015-09-15 17:26   ` Houcheng Lin
  2015-09-15 17:34   ` Houcheng Lin
  1 sibling, 0 replies; 11+ messages in thread
From: Houcheng Lin @ 2015-09-15 17:26 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: linhaocheng, Peter Maydell, kvm

Hi Paolo,

Thanks for your review and suggestions. I'll fix this patch accordingly.
Please also see my replies below.

best regards,
Houcheng Lin

2015-09-15 17:41 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>
> This is okay and can be done unconditionally (introduce a new
> qemu_getdtablesize function that is defined in util/oslib-posix.c).

Will fix it.
>
>
>>     - sigtimewait(): call __rt_sigtimewait() instead.
>>     - lockf(): not see this feature in android, directly return -1.
>>     - shm_open(): not see this feature in android, directly return -1.
>
> This is not okay.  Please fix your libc instead.

I'll modify the bionic C library to support these functions and feedback
to google's AOSP project. But the android kernel does not support shmem,
so I will prevent compile the ivshmem.c when in android config. The config
for ivshmem in pci.mak will be:

CONFIG_IVSHMEM=$(call land, $(call lnot,$(CONFIG_ANDROID)),$(CONFIG_KVM))

> For sys/io.h, we can just remove the inclusion.  It is not necessary.
>
> scsi/sg.h should be exported by the Linux kernel, so that we can use
> scripts/update-linux-headers.sh to copy it from QEMU.  I've sent a Linux
> kernel patch and CCed you.

It's better to put headers on kernel user headers. Thanks.

>
> You should instead disable the guest agent on your configure command line.
>

Okay.

>
> If you have CONFIG_ANDROID, you do not need -DANDROID.
>

Okay.

>> +  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"
>
> This should not be necessary, QEMU uses pkg-config.
>
>> +fi
>>  if [ "$bsd" = "yes" ] ; then
>>    if [ "$darwin" != "yes" ] ; then
>>      bsd_user="yes"
>> @@ -1736,7 +1749,14 @@ fi
>>  # pkg-config probe
>>
>>  if ! has "$pkg_config_exe"; then
>> -  error_exit "pkg-config binary '$pkg_config_exe' not found"
>> +  case $cross_prefix in
>> +    *android*)
>> +     pkg_config_exe=scripts/android-pkg-config
>
> Neither should this.  Your cross-compilation environment is not
> correctly set up if you do not have a pkg-config executable.  If you
> want to use a wrapper, you can specify it with the PKG_CONFIG
> environment variable.  But it need not be maintained in the QEMU
> repository, because QEMU assumes a complete cross-compilation environment.

I'll use wrapper in next release and specify with environment variable.
Later, I may generate pkg-config data file while building library and install
it into cross-compilation environment.

>
>> +     ;;
>> +    *)
>> +     error_exit "pkg-config binary '$pkg_config_exe' not found"
>> +     ;;
>> +  esac
>>  fi
>>
>>  ##########################################
>> @@ -3764,7 +3784,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
>>
>> @@ -4709,6 +4729,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/include/qemu/osdep.h b/include/qemu/osdep.h
>> index ab3c876..1ba22be 100644
>> --- a/include/qemu/osdep.h
>> +++ b/include/qemu/osdep.h
>> @@ -59,6 +59,10 @@
>>  #define WEXITSTATUS(x) (x)
>>  #endif
>>
>> +#ifdef ANDROID
>> + #include "sysemu/os-android.h"
>> +#endif
>> +
>>  #ifdef _WIN32
>>  #include "sysemu/os-win32.h"
>>  #endif
>> diff --git a/include/sysemu/os-android.h b/include/sysemu/os-android.h
>> new file mode 100644
>> index 0000000..7f73777
>> --- /dev/null
>> +++ b/include/sysemu/os-android.h
>> @@ -0,0 +1,35 @@
>> +#ifndef QEMU_OS_ANDROID_H
>> +#define QEMU_OS_ANDROID_H
>> +
>> +#include <sys/statvfs.h>
>> +
>> +/*
>> + * For include the basename prototyping in android.
>> + */
>> +#include <libgen.h>
>
> These two includes can be added to sysemu/os-posix.h.
>
>> +extern int __rt_sigtimedwait(const sigset_t *uthese, siginfo_t *uinfo, \
>> +                             const struct timespec *uts, size_t sigsetsize);
>> +
>> +int getdtablesize(void);
>> +int lockf(int fd, int cmd, off_t len);
>> +int sigtimedwait(const sigset_t *set, siginfo_t *info, \
>> +                 const struct timespec *ts);
>> +int shm_open(const char *name, int oflag, mode_t mode);
>> +char *a_ptsname(int fd);
>> +
>> +#define F_TLOCK         0
>> +#define IOV_MAX         256
>
> libc should really be fixed for all of these (except getdtablesize and
> a_ptsname).  The way you're working around it is introducing subtle
> bugs, for example the pidfile is _not_ locked.

Okay, I will fix it.

>> +#define I_LOOK      (__SID | 4) /* Retrieve the name of the module just below
>> +                                   the STREAM head and place it in a character
>> +                                   string.  */
>
> These are not necessary.

Okay.

>> +#ifdef ANDROID
>> +#undef PAGE_SIZE
>> +#endif
>
> What is the definition of PAGE_SIZE on Android?  Can we do
>
> #ifdef PAGE_SIZE
> QEMU_BUILD_BUG_ON(PAGE_SIZE != TARGET_PAGE_SIZE);
> #else
> #define PAGE_SIZE TARGET_PAGE_SIZE
> #endif
>
> ?

Yes, we can use this approach. In android, PAGE_SIZE is defined
to 4096 and this code can detect definition mismatch.

> See above, this should not be part of QEMU.  The reason is that QEMU
> developers do not test Android builds, and the script would rot.
> Instead, you should document how to prepare a complete environment to
> cross-compile QEMU for Android.

I'll write a document to describe steps to build QEMU for Android.
But some library need minor modification to build for Android.
Maybe I shall also put my modified library onto github.

>
> The ioctl(sfd, I_PUSH, "ptem") is not needed on Android.
>
> In addition, you can add a
>
>         if (name)
>                 strcpy(name, slave);
>
> and inside qemu_openpty_row add Android to the "#if defined(__OpenBSD__)
> || defined(__DragonFly__)" case.  This avoids the need to introduce
> a_openpty.

Okay, I'll use the strcpy approach to avoid a_openpty.

>
> The biggest problem is the workarounds you have added for pkg-config.
> Everything else is easy to fix.  I look forward to reviewing the next
> version!

Thanks for your comments and I'll do the next version.

>
> Paolo
>

--
Best regards,
Houcheng Lin

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [RFC PATCH] os-android: Add support to android platform, built by ndk-r10
  2015-09-15  9:41 ` Paolo Bonzini
  2015-09-15 17:26   ` Houcheng Lin
@ 2015-09-15 17:34   ` Houcheng Lin
  2015-09-16  8:09     ` Paolo Bonzini
  1 sibling, 1 reply; 11+ messages in thread
From: Houcheng Lin @ 2015-09-15 17:34 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel, famz; +Cc: linhaocheng, Peter Maydell, kvm

Hi Paolo,

(Please ignore the previous mail that did not include "qemu-devel")

Thanks for your review and suggestions. I'll fix this patch
accordingly and please see my replies below.

best regards,
Houcheng Lin

2015-09-15 17:41 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:

> This is okay and can be done unconditionally (introduce a new
> qemu_getdtablesize function that is defined in util/oslib-posix.c).

Will fix it.
>
>
>>     - sigtimewait(): call __rt_sigtimewait() instead.
>>     - lockf(): not see this feature in android, directly return -1.
>>     - shm_open(): not see this feature in android, directly return -1.
>
> This is not okay.  Please fix your libc instead.

I'll modify the bionic C library to support these functions and feedback
to google's AOSP project. But the android kernel does not support shmem,
so I will prevent compile the ivshmem.c when in android config. The config
for ivshmem in pci.mak will be:

CONFIG_IVSHMEM=$(call land, $(call lnot,$(CONFIG_ANDROID)),$(CONFIG_KVM))

> For sys/io.h, we can just remove the inclusion.  It is not necessary.
>
> scsi/sg.h should be exported by the Linux kernel, so that we can use
> scripts/update-linux-headers.sh to copy it from QEMU.  I've sent a Linux
> kernel patch and CCed you.

It's better to put headers on kernel user headers. Thanks.

>
> You should instead disable the guest agent on your configure command line.
>

Okay.

>
> If you have CONFIG_ANDROID, you do not need -DANDROID.
>

Okay.

>> +  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"
>
> This should not be necessary, QEMU uses pkg-config.
>
>> +fi
>>  if [ "$bsd" = "yes" ] ; then
>>    if [ "$darwin" != "yes" ] ; then
>>      bsd_user="yes"
>> @@ -1736,7 +1749,14 @@ fi
>>  # pkg-config probe
>>
>>  if ! has "$pkg_config_exe"; then
>> -  error_exit "pkg-config binary '$pkg_config_exe' not found"
>> +  case $cross_prefix in
>> +    *android*)
>> +     pkg_config_exe=scripts/android-pkg-config
>
> Neither should this.  Your cross-compilation environment is not
> correctly set up if you do not have a pkg-config executable.  If you
> want to use a wrapper, you can specify it with the PKG_CONFIG
> environment variable.  But it need not be maintained in the QEMU
> repository, because QEMU assumes a complete cross-compilation environment.

I'll use wrapper in next release and specify with environment variable.
Later, I may generate pkg-config data file while building library and install
it into cross-compilation environment.

>
>> +     ;;
>> +    *)
>> +     error_exit "pkg-config binary '$pkg_config_exe' not found"
>> +     ;;
>> +  esac
>>  fi
>>
>>  ##########################################
>> @@ -3764,7 +3784,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
>>
>> @@ -4709,6 +4729,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/include/qemu/osdep.h b/include/qemu/osdep.h
>> index ab3c876..1ba22be 100644
>> --- a/include/qemu/osdep.h
>> +++ b/include/qemu/osdep.h
>> @@ -59,6 +59,10 @@
>>  #define WEXITSTATUS(x) (x)
>>  #endif
>>
>> +#ifdef ANDROID
>> + #include "sysemu/os-android.h"
>> +#endif
>> +
>>  #ifdef _WIN32
>>  #include "sysemu/os-win32.h"
>>  #endif
>> diff --git a/include/sysemu/os-android.h b/include/sysemu/os-android.h
>> new file mode 100644
>> index 0000000..7f73777
>> --- /dev/null
>> +++ b/include/sysemu/os-android.h
>> @@ -0,0 +1,35 @@
>> +#ifndef QEMU_OS_ANDROID_H
>> +#define QEMU_OS_ANDROID_H
>> +
>> +#include <sys/statvfs.h>
>> +
>> +/*
>> + * For include the basename prototyping in android.
>> + */
>> +#include <libgen.h>
>
> These two includes can be added to sysemu/os-posix.h.
>
>> +extern int __rt_sigtimedwait(const sigset_t *uthese, siginfo_t *uinfo, \
>> +                             const struct timespec *uts, size_t sigsetsize);
>> +
>> +int getdtablesize(void);
>> +int lockf(int fd, int cmd, off_t len);
>> +int sigtimedwait(const sigset_t *set, siginfo_t *info, \
>> +                 const struct timespec *ts);
>> +int shm_open(const char *name, int oflag, mode_t mode);
>> +char *a_ptsname(int fd);
>> +
>> +#define F_TLOCK         0
>> +#define IOV_MAX         256
>
> libc should really be fixed for all of these (except getdtablesize and
> a_ptsname).  The way you're working around it is introducing subtle
> bugs, for example the pidfile is _not_ locked.

Okay, I will fix it.

>> +#define I_LOOK      (__SID | 4) /* Retrieve the name of the module just below
>> +                                   the STREAM head and place it in a character
>> +                                   string.  */
>
> These are not necessary.

Okay.

>> +#ifdef ANDROID
>> +#undef PAGE_SIZE
>> +#endif
>
> What is the definition of PAGE_SIZE on Android?  Can we do
>
> #ifdef PAGE_SIZE
> QEMU_BUILD_BUG_ON(PAGE_SIZE != TARGET_PAGE_SIZE);
> #else
> #define PAGE_SIZE TARGET_PAGE_SIZE
> #endif
>
> ?

Yes, we can use this approach. In android, PAGE_SIZE is defined
to 4096 and this code can detect definition mismatch.

> See above, this should not be part of QEMU.  The reason is that QEMU
> developers do not test Android builds, and the script would rot.
> Instead, you should document how to prepare a complete environment to
> cross-compile QEMU for Android.

I'll write a document to describe steps to build QEMU for Android.
But some library need minor modification to build for Android.
Maybe I shall also put my modified library onto github.

>
> The ioctl(sfd, I_PUSH, "ptem") is not needed on Android.
>
> In addition, you can add a
>
>         if (name)
>                 strcpy(name, slave);
>
> and inside qemu_openpty_row add Android to the "#if defined(__OpenBSD__)
> || defined(__DragonFly__)" case.  This avoids the need to introduce
> a_openpty.

Okay, I'll use the strcpy approach to avoid a_openpty.

>
> The biggest problem is the workarounds you have added for pkg-config.
> Everything else is easy to fix.  I look forward to reviewing the next
> version!

Many thanks for your comments and I'll do the next version.

>
> Paolo
>


--
Best regards,
Houcheng Lin

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [RFC PATCH] os-android: Add support to android platform, built by ndk-r10
  2015-09-15 17:34   ` Houcheng Lin
@ 2015-09-16  8:09     ` Paolo Bonzini
  2015-09-16  9:28       ` Houcheng Lin
  0 siblings, 1 reply; 11+ messages in thread
From: Paolo Bonzini @ 2015-09-16  8:09 UTC (permalink / raw)
  To: Houcheng Lin, qemu-devel, famz; +Cc: linhaocheng, Peter Maydell, kvm



On 15/09/2015 19:34, Houcheng Lin wrote:
> Hi Paolo,
> 
> (Please ignore the previous mail that did not include "qemu-devel")
> 
> Thanks for your review and suggestions. I'll fix this patch
> accordingly and please see my replies below.
> 
> best regards,
> Houcheng Lin
> 
> 2015-09-15 17:41 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
> 
>> This is okay and can be done unconditionally (introduce a new
>> qemu_getdtablesize function that is defined in util/oslib-posix.c).
> 
> Will fix it.
>>
>>
>>>     - sigtimewait(): call __rt_sigtimewait() instead.
>>>     - lockf(): not see this feature in android, directly return -1.
>>>     - shm_open(): not see this feature in android, directly return -1.
>>
>> This is not okay.  Please fix your libc instead.
> 
> I'll modify the bionic C library to support these functions and feedback
> to google's AOSP project. But the android kernel does not support shmem,

It doesn't support tmpfs?  /dev/shm is just a tmpfs.

Paolo

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [RFC PATCH] os-android: Add support to android platform, built by ndk-r10
  2015-09-16  8:09     ` Paolo Bonzini
@ 2015-09-16  9:28       ` Houcheng Lin
  2015-09-16  9:38         ` Paolo Bonzini
  0 siblings, 1 reply; 11+ messages in thread
From: Houcheng Lin @ 2015-09-16  9:28 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel, Fam Zheng, linhaocheng, Peter Maydell, kvm

2015-09-16 16:09 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>
>
>>
>> I'll modify the bionic C library to support these functions and feedback
>> to google's AOSP project. But the android kernel does not support shmem,
>
> It doesn't support tmpfs?  /dev/shm is just a tmpfs.
>
> Paolo

Oh, you are right. The android have shmget, shmat, shmdt functions in
their libc. The POSIX shm_open can built on top of these. I'll fix my
libc to support posix share memory functions.

-- 
Best regards,
Houcheng Lin

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [RFC PATCH] os-android: Add support to android platform, built by ndk-r10
  2015-09-16  9:28       ` Houcheng Lin
@ 2015-09-16  9:38         ` Paolo Bonzini
  2015-09-16  9:54           ` Houcheng Lin
  0 siblings, 1 reply; 11+ messages in thread
From: Paolo Bonzini @ 2015-09-16  9:38 UTC (permalink / raw)
  To: Houcheng Lin; +Cc: qemu-devel, Fam Zheng, linhaocheng, Peter Maydell, kvm



On 16/09/2015 11:28, Houcheng Lin wrote:
> 2015-09-16 16:09 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>>
>>
>>>
>>> I'll modify the bionic C library to support these functions and feedback
>>> to google's AOSP project. But the android kernel does not support shmem,
>>
>> It doesn't support tmpfs?  /dev/shm is just a tmpfs.
>>
>> Paolo
> 
> Oh, you are right. The android have shmget, shmat, shmdt functions in
> their libc. The POSIX shm_open can built on top of these. I'll fix my
> libc to support posix share memory functions.

Actually it's even simpler.  shm_open is basically just

	char *s;
	int fd;

	asprintf(&s, "/dev/shm/%s", name);
	fd = open(s, name | O_CLOEXEC, mode);
	free(s);
	return fd;

plus some error checking.  Do Android systems have /dev/shm?

Paolo

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [RFC PATCH] os-android: Add support to android platform, built by ndk-r10
  2015-09-16  9:38         ` Paolo Bonzini
@ 2015-09-16  9:54           ` Houcheng Lin
  2015-09-16 10:28             ` Paolo Bonzini
  0 siblings, 1 reply; 11+ messages in thread
From: Houcheng Lin @ 2015-09-16  9:54 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel, Fam Zheng, linhaocheng, Peter Maydell, kvm

2015-09-16 17:38 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>
> Actually it's even simpler.  shm_open is basically just
>
>         char *s;
>         int fd;
>
>         asprintf(&s, "/dev/shm/%s", name);
>         fd = open(s, name | O_CLOEXEC, mode);
>         free(s);
>         return fd;
>
> plus some error checking.  Do Android systems have /dev/shm?
>
> Paolo

It's simple, thanks.
The android have no /dev/shm. Though we can mknod it but need root prividlege to
do it.


-- 
Best regards,
Houcheng Lin

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [RFC PATCH] os-android: Add support to android platform, built by ndk-r10
  2015-09-16  9:54           ` Houcheng Lin
@ 2015-09-16 10:28             ` Paolo Bonzini
  0 siblings, 0 replies; 11+ messages in thread
From: Paolo Bonzini @ 2015-09-16 10:28 UTC (permalink / raw)
  To: Houcheng Lin; +Cc: qemu-devel, Fam Zheng, linhaocheng, Peter Maydell, kvm



On 16/09/2015 11:54, Houcheng Lin wrote:
> 2015-09-16 17:38 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>>
>> Actually it's even simpler.  shm_open is basically just
>>
>>         char *s;
>>         int fd;
>>
>>         asprintf(&s, "/dev/shm/%s", name);
>>         fd = open(s, name | O_CLOEXEC, mode);
>>         free(s);
>>         return fd;
>>
>> plus some error checking.  Do Android systems have /dev/shm?
>>
>> Paolo
> 
> It's simple, thanks.
> The android have no /dev/shm. Though we can mknod it but need root prividlege to
> do it.

Oh well.  Then I think it's okay to disable ivshmem on Android.

Paolo

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2015-09-16 10:29 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-15  2:11 [RFC PATCH] os-android: Add support to android platform, built by ndk-r10 Houcheng Lin
2015-09-15  9:41 ` Paolo Bonzini
2015-09-15 17:26   ` Houcheng Lin
2015-09-15 17:34   ` Houcheng Lin
2015-09-16  8:09     ` Paolo Bonzini
2015-09-16  9:28       ` Houcheng Lin
2015-09-16  9:38         ` Paolo Bonzini
2015-09-16  9:54           ` Houcheng Lin
2015-09-16 10:28             ` Paolo Bonzini
2015-09-15 10:19 ` Fam Zheng
  -- strict thread matches above, loose matches on Subject: below --
2015-09-15  5:11 Houcheng Lin

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).