This is patch to build qemu for android platfrom. The building uses NDK r10 cross-compilation toolchain with following changes: - install qemu dependent libraries - upgrade bionic libc - add mssing includes, scsi/sg.h, in toolchain - make a symbolic link x86_64-linux-android-pkg-config that links to host's pkg-config. Then, configure and build static linked qemu by commands: $ export SYSROOT="/opt/android-toolchain64/sysroot" $ PKG_CONFIG_LIBDIR=/opt/android-toolchain64/sysroot/usr/lib/pkgconfig \ ./configure \ --cross-prefix=x86_64-linux-android- --enable-kvm \ --enable-trace-backend=nop --disable-fdt --target-list=x86_64-softmmu \ --disable-spice --disable-vhost-net --disable-libiscsi \ --audio-drv-list="" --disable-gtk --disable-gnutls \ --disable-libnfs --disable-glusterfs --disable-libssh2 \ --disable-seccomp --disable-usb-redir --disable-libusb \ --disable-guest-agent --static $ make -j4 For dynamic build, you can skip the "static" option during configure, copy dependent so files into android and add "." into LD_LIBRARY_PATH. How to prepare your cross-compilation toolcahin ----------------------------------------------- 1. Download NDK r10, install toolchain from NDK and build the following libraries and install in your toolchain sysroot: libiconv-1.14 gettext-0.19 libffi-3.0.12 glib-2.34.3 libpng-1.2.52 pixman-0.30 2. Download AOSP and apply this patch I made to support posix lockf() https://android-review.googlesource.com/#/c/172150/ 3. Build bionic C and update your toolchain's libc.a and libc.so. 4. Copy kernel header file, scsi/sg.h into toolchain's sysroot/usr/includes/scsi/ 5. Update these header files in your toolchain to prevent compilation warning, includes: unistd.h for lockf() and related define sys/uio.h for pread() and pwrite() signal.h for sigtimedwait() Signed-off-by: Houcheng Lin <houcheng@xxxxxxxxx> --- configure | 18 ++++++++++++++++-- default-configs/pci.mak | 2 +- hw/i386/kvm/pci-assign.c | 1 - include/qemu/osdep.h | 7 +++++++ include/sysemu/os-android.h | 12 ++++++++++++ kvm-all.c | 4 ++++ tests/Makefile | 2 ++ util/oslib-posix.c | 12 ++++++++++++ util/qemu-openpty.c | 19 ++++++++++++++----- 9 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 include/sysemu/os-android.h diff --git a/configure b/configure index d7c24cd..12e3402 100755 --- a/configure +++ b/configure @@ -567,7 +567,6 @@ fi # host *BSD for user mode HOST_VARIANT_DIR="" - case $targetos in CYGWIN*) mingw32="yes" @@ -693,9 +692,20 @@ Haiku) vhost_net="yes" vhost_scsi="yes" QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers $QEMU_INCLUDES" + case $cross_prefix in + *android*) + android="yes" + ;; + *) + ;; + esac ;; esac +if [ "$android" = "yes" ] ; then + LIBS="-lglib-2.0 -lgthread-2.0 -lz -lpixman-1 -lintl -liconv -lc $LIBS" + libs_qga="-lglib-2.0 -lgthread-2.0 -lz -lpixman-1 -lintl -liconv -lc" +fi if [ "$bsd" = "yes" ] ; then if [ "$darwin" != "yes" ] ; then bsd_user="yes" @@ -3791,7 +3801,7 @@ elif compile_prog "" "$pthread_lib -lrt" ; then fi if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \ - "$aix" != "yes" -a "$haiku" != "yes" ; then + "$aix" != "yes" -a "$haiku" != "yes" -a "$android" != "yes" ; then libs_softmmu="-lutil $libs_softmmu" fi @@ -4737,6 +4747,10 @@ if test "$linux" = "yes" ; then echo "CONFIG_LINUX=y" >> $config_host_mak fi +if test "$android" = "yes" ; then + echo "CONFIG_ANDROID=y" >> $config_host_mak +fi + if test "$darwin" = "yes" ; then echo "CONFIG_DARWIN=y" >> $config_host_mak fi diff --git a/default-configs/pci.mak b/default-configs/pci.mak index 7e10903..e76dd41 100644 --- a/default-configs/pci.mak +++ b/default-configs/pci.mak @@ -35,5 +35,5 @@ CONFIG_SDHCI=y CONFIG_EDU=y CONFIG_VGA=y CONFIG_VGA_PCI=y -CONFIG_IVSHMEM=$(CONFIG_KVM) +CONFIG_IVSHMEM=$(call land,$(call lnot,$(CONFIG_ANDROID)),$(CONFIG_KVM)) CONFIG_ROCKER=y diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c index b1beaa6..44beee3 100644 --- a/hw/i386/kvm/pci-assign.c +++ b/hw/i386/kvm/pci-assign.c @@ -22,7 +22,6 @@ */ #include <stdio.h> #include <unistd.h> -#include <sys/io.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h index ab3c876..f5be51c 100644 --- a/include/qemu/osdep.h +++ b/include/qemu/osdep.h @@ -59,6 +59,10 @@ #define WEXITSTATUS(x) (x) #endif +#ifdef CONFIG_ANDROID +#include "sysemu/os-android.h" +#endif + #ifdef _WIN32 #include "sysemu/os-win32.h" #endif @@ -284,4 +288,7 @@ void os_mem_prealloc(int fd, char *area, size_t sz); int qemu_read_password(char *buf, int buf_size); +int qemu_getdtablesize(void); + + #endif diff --git a/include/sysemu/os-android.h b/include/sysemu/os-android.h new file mode 100644 index 0000000..4877403 --- /dev/null +++ b/include/sysemu/os-android.h @@ -0,0 +1,12 @@ +#ifndef QEMU_OS_ANDROID_H +#define QEMU_OS_ANDROID_H + +/* + * For include the basename prototyping in android. + */ +#include <libgen.h> + +#define getdtablesize qemu_getdtablesize +#define IOV_MAX 1024 + +#endif diff --git a/kvm-all.c b/kvm-all.c index c6f5128..f7bb9c7 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -45,7 +45,11 @@ #endif /* KVM uses PAGE_SIZE in its definition of COALESCED_MMIO_MAX */ +#ifdef PAGE_SIZE +QEMU_BUILD_BUG_ON(PAGE_SIZE != TARGET_PAGE_SIZE); +#else #define PAGE_SIZE TARGET_PAGE_SIZE +#endif //#define DEBUG_KVM diff --git a/tests/Makefile b/tests/Makefile index 34c6136..99faf1f 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -418,8 +418,10 @@ tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o libqemuutil.a libqemustub. tests/test-write-threshold$(EXESUF): tests/test-write-threshold.o $(block-obj-y) libqemuutil.a libqemustub.a ifeq ($(CONFIG_POSIX),y) +ifneq ($(CONFIG_ANDROID),y) LIBS += -lutil endif +endif # QTest rules diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 3ae4987..80d92bc 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -62,6 +62,8 @@ extern int daemon(int, int); #include <libgen.h> #include <setjmp.h> #include <sys/signal.h> +#include <sys/time.h> +#include <sys/resource.h> #ifdef CONFIG_LINUX #include <sys/syscall.h> @@ -482,3 +484,13 @@ int qemu_read_password(char *buf, int buf_size) printf("\n"); return ret; } + +int qemu_getdtablesize(void) +{ + struct rlimit r; + + if (getrlimit(RLIMIT_NOFILE, &r) < 0) { + return sysconf(_SC_OPEN_MAX); + } + return r.rlim_cur; +} diff --git a/util/qemu-openpty.c b/util/qemu-openpty.c index 4c53211..6ef9604 100644 --- a/util/qemu-openpty.c +++ b/util/qemu-openpty.c @@ -51,11 +51,16 @@ # include <termios.h> #endif -#ifdef __sun__ +#if defined(__sun__) || defined(CONFIG_ANDROID) + /* Once Solaris has openpty(), this is going to be removed. */ static int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp) { +#if defined(CONFIG_ANDROID) + char pty_buf[PATH_MAX]; + #define ptsname(fd) pty_buf +#endif const char *slave; int mfd = -1, sfd = -1; @@ -67,17 +72,20 @@ static int openpty(int *amaster, int *aslave, char *name, if (grantpt(mfd) == -1 || unlockpt(mfd) == -1) goto err; - +#if defined(CONFIG_ANDROID) + ptsname_r(mfd, pty_buf, PATH_MAX); +#endif if ((slave = ptsname(mfd)) == NULL) goto err; if ((sfd = open(slave, O_RDONLY | O_NOCTTY)) == -1) goto err; +#ifndef CONFIG_ANDROID if (ioctl(sfd, I_PUSH, "ptem") == -1 || (termp != NULL && tcgetattr(sfd, termp) < 0)) goto err; - +#endif if (amaster) *amaster = mfd; if (aslave) @@ -93,7 +101,8 @@ err: close(mfd); return -1; } - +#endif +#ifdef __sun__ static void cfmakeraw (struct termios *termios_p) { termios_p->c_iflag &= @@ -112,7 +121,7 @@ int qemu_openpty_raw(int *aslave, char *pty_name) { int amaster; struct termios tty; -#if defined(__OpenBSD__) || defined(__DragonFly__) +#if defined(__OpenBSD__) || defined(__DragonFly__) || defined(CONFIG_ANDROID) char pty_buf[PATH_MAX]; #define q_ptsname(x) pty_buf #else -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html