[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen master] build system: stubdom targets now depends on mini-os target



commit 42ddf48a29d2109e6b33fddd6dafd75e0747fd09
Author:     Wei Liu <wei.liu2@xxxxxxxxxx>
AuthorDate: Fri Jan 30 15:58:38 2015 +0000
Commit:     Wei Liu <wei.liu2@xxxxxxxxxx>
CommitDate: Fri Feb 27 16:04:50 2015 +0000

    build system: stubdom targets now depends on mini-os target

    Provide mini-os url and revision in Config.mk

    Make stubdom targets depend on mini-os-dir target. Make
    subtree-force-update{,-all} depend on mini-os-dir-force-update.

    Also make mktarball script generate mini-os archive.

    Original mini-os directory is renamed to mini-os-intree to help reduce
    patch length. That directory will be deleted in a separate patch.

    Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
    Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
    Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
    Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
    ---
    Changes in v3:
    1. Put mini-os targets in main Makefile.
    2. Stubdom clean and distclean don't depend on mini-os-dir.

    Changes in v2:
    1. Use hash in Config.mk.
---
 .gitignore                                         |    6 +-
 Config.mk                                          |    6 +
 Makefile                                           |   24 +-
 extras/mini-os-intree/COPYING                      |   36 +
 extras/mini-os-intree/Config.mk                    |   99 ++
 extras/mini-os-intree/Makefile                     |  224 +++
 extras/mini-os-intree/README                       |   46 +
 extras/mini-os-intree/app.lds                      |   11 +
 extras/mini-os-intree/arch/arm/arm32.S             |  294 ++++
 extras/mini-os-intree/arch/arm/events.c            |   31 +
 extras/mini-os-intree/arch/arm/hypercalls32.S      |   64 +
 extras/mini-os-intree/arch/arm/minios-arm32.lds    |   83 ++
 extras/mini-os-intree/arch/arm/mm.c                |  139 ++
 extras/mini-os-intree/arch/arm/panic.c             |   98 ++
 extras/mini-os-intree/arch/arm/sched.c             |   47 +
 extras/mini-os-intree/arch/arm/setup.c             |  119 ++
 extras/mini-os-intree/arch/arm/time.c              |  136 ++
 extras/mini-os-intree/arch/x86/Makefile            |   30 +
 extras/mini-os-intree/arch/x86/arch.mk             |   22 +
 extras/mini-os-intree/arch/x86/events.c            |   35 +
 extras/mini-os-intree/arch/x86/ioremap.c           |   75 +
 extras/mini-os-intree/arch/x86/iorw.c              |   35 +
 extras/mini-os-intree/arch/x86/minios-x86_32.lds   |   74 +
 extras/mini-os-intree/arch/x86/minios-x86_64.lds   |   74 +
 extras/mini-os-intree/arch/x86/mm.c                |  957 ++++++++++++
 extras/mini-os-intree/arch/x86/sched.c             |  139 ++
 extras/mini-os-intree/arch/x86/setup.c             |  168 +++
 extras/mini-os-intree/arch/x86/time.c              |  238 +++
 extras/mini-os-intree/arch/x86/traps.c             |  333 +++++
 extras/mini-os-intree/arch/x86/x86_32.S            |  305 ++++
 extras/mini-os-intree/arch/x86/x86_64.S            |  383 +++++
 extras/mini-os-intree/blkfront.c                   |  736 ++++++++++
 extras/mini-os-intree/config/MiniOS.mk             |   10 +
 extras/mini-os-intree/config/StdGNU.mk             |   47 +
 extras/mini-os-intree/config/arm32.mk              |   22 +
 extras/mini-os-intree/config/arm64.mk              |   19 +
 extras/mini-os-intree/config/x86_32.mk             |   20 +
 extras/mini-os-intree/config/x86_64.mk             |   33 +
 extras/mini-os-intree/console/console.c            |  164 ++
 extras/mini-os-intree/console/console.h            |    2 +
 extras/mini-os-intree/console/xenbus.c             |  195 +++
 extras/mini-os-intree/console/xencons_ring.c       |  195 +++
 extras/mini-os-intree/daytime.c                    |   67 +
 extras/mini-os-intree/domain_config                |   19 +
 extras/mini-os-intree/events.c                     |  269 ++++
 extras/mini-os-intree/fbfront.c                    |  710 +++++++++
 extras/mini-os-intree/gntmap.c                     |  250 ++++
 extras/mini-os-intree/gnttab.c                     |  196 +++
 extras/mini-os-intree/hypervisor.c                 |  132 ++
 extras/mini-os-intree/include/arch/cc.h            |   87 ++
 extras/mini-os-intree/include/arch/perf.h          |   15 +
 extras/mini-os-intree/include/arch/sys_arch.h      |   35 +
 extras/mini-os-intree/include/arm/arch_endian.h    |    7 +
 extras/mini-os-intree/include/arm/arch_limits.h    |    9 +
 extras/mini-os-intree/include/arm/arch_mm.h        |   38 +
 extras/mini-os-intree/include/arm/arch_sched.h     |   19 +
 extras/mini-os-intree/include/arm/arch_spinlock.h  |   36 +
 .../include/arm/arm32/arch_wordsize.h              |    1 +
 extras/mini-os-intree/include/arm/gic.h            |    1 +
 extras/mini-os-intree/include/arm/hypercall-arm.h  |   98 ++
 extras/mini-os-intree/include/arm/os.h             |  216 +++
 extras/mini-os-intree/include/arm/traps.h          |   20 +
 extras/mini-os-intree/include/blkfront.h           |   54 +
 extras/mini-os-intree/include/byteorder.h          |   36 +
 extras/mini-os-intree/include/byteswap.h           |   39 +
 extras/mini-os-intree/include/compiler.h           |   10 +
 extras/mini-os-intree/include/console.h            |   89 ++
 extras/mini-os-intree/include/ctype.h              |   60 +
 extras/mini-os-intree/include/endian.h             |   19 +
 extras/mini-os-intree/include/err.h                |   31 +
 extras/mini-os-intree/include/errno-base.h         |   39 +
 extras/mini-os-intree/include/errno.h              |  122 ++
 extras/mini-os-intree/include/events.h             |   59 +
 extras/mini-os-intree/include/fbfront.h            |   46 +
 extras/mini-os-intree/include/fcntl.h              |   99 ++
 extras/mini-os-intree/include/gntmap.h             |   35 +
 extras/mini-os-intree/include/gnttab.h             |   17 +
 extras/mini-os-intree/include/hypervisor.h         |   48 +
 extras/mini-os-intree/include/ioremap.h            |   33 +
 extras/mini-os-intree/include/iorw.h               |   16 +
 extras/mini-os-intree/include/kernel.h             |    9 +
 extras/mini-os-intree/include/lib-gpl.h            |   59 +
 extras/mini-os-intree/include/lib.h                |  230 +++
 extras/mini-os-intree/include/linux/types.h        |    5 +
 extras/mini-os-intree/include/lwipopts.h           |   23 +
 .../mini-os-intree/include/minios-external/README  |   24 +
 .../include/minios-external/bsd-COPYRIGHT          |  126 ++
 .../include/minios-external/bsd-queue.3            | 1044 +++++++++++++
 .../minios-external/bsd-sys-queue-h-seddery        |   72 +
 .../include/minios-external/bsd-sys-queue.h        |  637 ++++++++
 extras/mini-os-intree/include/mm.h                 |   82 +
 extras/mini-os-intree/include/netfront.h           |   24 +
 extras/mini-os-intree/include/pcifront.h           |   29 +
 extras/mini-os-intree/include/posix/arpa/inet.h    |    7 +
 extras/mini-os-intree/include/posix/dirent.h       |   24 +
 extras/mini-os-intree/include/posix/err.h          |   15 +
 extras/mini-os-intree/include/posix/fcntl.h        |   11 +
 extras/mini-os-intree/include/posix/limits.h       |   48 +
 extras/mini-os-intree/include/posix/net/if.h       |   85 ++
 extras/mini-os-intree/include/posix/netdb.h        |    9 +
 extras/mini-os-intree/include/posix/netinet/in.h   |    7 +
 extras/mini-os-intree/include/posix/netinet/tcp.h  |    6 +
 extras/mini-os-intree/include/posix/poll.h         |    1 +
 extras/mini-os-intree/include/posix/pthread.h      |   64 +
 extras/mini-os-intree/include/posix/signal.h       |   10 +
 extras/mini-os-intree/include/posix/stdlib.h       |    8 +
 extras/mini-os-intree/include/posix/strings.h      |   12 +
 extras/mini-os-intree/include/posix/sys/ioctl.h    |   16 +
 extras/mini-os-intree/include/posix/sys/mman.h     |   22 +
 extras/mini-os-intree/include/posix/sys/poll.h     |   79 +
 extras/mini-os-intree/include/posix/sys/select.h   |    7 +
 extras/mini-os-intree/include/posix/sys/socket.h   |   31 +
 extras/mini-os-intree/include/posix/sys/stat.h     |    7 +
 extras/mini-os-intree/include/posix/syslog.h       |   37 +
 extras/mini-os-intree/include/posix/termios.h      |   87 ++
 extras/mini-os-intree/include/posix/time.h         |   11 +
 extras/mini-os-intree/include/posix/unistd.h       |   16 +
 extras/mini-os-intree/include/sched.h              |   55 +
 extras/mini-os-intree/include/semaphore.h          |  110 ++
 extras/mini-os-intree/include/spinlock.h           |   55 +
 extras/mini-os-intree/include/sys/lock.h           |   52 +
 extras/mini-os-intree/include/sys/time.h           |   47 +
 extras/mini-os-intree/include/time.h               |   63 +
 extras/mini-os-intree/include/tpm_tis.h            |   61 +
 extras/mini-os-intree/include/tpmback.h            |  104 ++
 extras/mini-os-intree/include/tpmfront.h           |   97 ++
 extras/mini-os-intree/include/types.h              |   74 +
 extras/mini-os-intree/include/wait.h               |  105 ++
 extras/mini-os-intree/include/waittypes.h          |   32 +
 extras/mini-os-intree/include/x86/arch_endian.h    |    7 +
 extras/mini-os-intree/include/x86/arch_limits.h    |   20 +
 extras/mini-os-intree/include/x86/arch_mm.h        |  233 +++
 extras/mini-os-intree/include/x86/arch_sched.h     |   25 +
 extras/mini-os-intree/include/x86/arch_spinlock.h  |   94 ++
 extras/mini-os-intree/include/x86/os.h             |  572 ++++++++
 extras/mini-os-intree/include/x86/traps.h          |   78 +
 .../include/x86/x86_32/arch_wordsize.h             |    1 +
 .../include/x86/x86_32/hypercall-x86_32.h          |  337 +++++
 .../include/x86/x86_64/arch_wordsize.h             |    2 +
 .../include/x86/x86_64/hypercall-x86_64.h          |  344 +++++
 extras/mini-os-intree/include/xen/COPYING          |   38 +
 extras/mini-os-intree/include/xen/arch-arm.h       |  432 ++++++
 .../mini-os-intree/include/xen/arch-arm/hvm/save.h |   39 +
 extras/mini-os-intree/include/xen/arch-x86/cpuid.h |   90 ++
 .../mini-os-intree/include/xen/arch-x86/hvm/save.h |  630 ++++++++
 .../mini-os-intree/include/xen/arch-x86/xen-mca.h  |  440 ++++++
 .../include/xen/arch-x86/xen-x86_32.h              |  171 +++
 .../include/xen/arch-x86/xen-x86_64.h              |  202 +++
 extras/mini-os-intree/include/xen/arch-x86/xen.h   |  303 ++++
 extras/mini-os-intree/include/xen/arch-x86_32.h    |   27 +
 extras/mini-os-intree/include/xen/arch-x86_64.h    |   43 +
 extras/mini-os-intree/include/xen/callback.h       |  121 ++
 extras/mini-os-intree/include/xen/dom0_ops.h       |  120 ++
 extras/mini-os-intree/include/xen/domctl.h         | 1154 +++++++++++++++
 extras/mini-os-intree/include/xen/elfnote.h        |  271 ++++
 extras/mini-os-intree/include/xen/event_channel.h  |  385 +++++
 extras/mini-os-intree/include/xen/features.h       |  114 ++
 extras/mini-os-intree/include/xen/gcov.h           |  115 ++
 extras/mini-os-intree/include/xen/grant_table.h    |  682 +++++++++
 extras/mini-os-intree/include/xen/hvm/e820.h       |   34 +
 .../include/xen/hvm/hvm_info_table.h               |   72 +
 extras/mini-os-intree/include/xen/hvm/hvm_op.h     |  402 +++++
 .../include/xen/hvm/hvm_xs_strings.h               |   80 +
 extras/mini-os-intree/include/xen/hvm/ioreq.h      |  129 ++
 extras/mini-os-intree/include/xen/hvm/params.h     |  199 +++
 extras/mini-os-intree/include/xen/hvm/pvdrivers.h  |   49 +
 extras/mini-os-intree/include/xen/hvm/save.h       |  111 ++
 extras/mini-os-intree/include/xen/io/blkif.h       |  640 ++++++++
 extras/mini-os-intree/include/xen/io/console.h     |   51 +
 extras/mini-os-intree/include/xen/io/fbif.h        |  176 +++
 extras/mini-os-intree/include/xen/io/fsif.h        |  192 +++
 extras/mini-os-intree/include/xen/io/kbdif.h       |  132 ++
 extras/mini-os-intree/include/xen/io/libxenvchan.h |   97 ++
 extras/mini-os-intree/include/xen/io/netif.h       |  305 ++++
 extras/mini-os-intree/include/xen/io/pciif.h       |  125 ++
 extras/mini-os-intree/include/xen/io/protocols.h   |   40 +
 extras/mini-os-intree/include/xen/io/ring.h        |  312 ++++
 extras/mini-os-intree/include/xen/io/tpmif.h       |  143 ++
 extras/mini-os-intree/include/xen/io/usbif.h       |  150 ++
 extras/mini-os-intree/include/xen/io/vscsiif.h     |  260 ++++
 extras/mini-os-intree/include/xen/io/xenbus.h      |   80 +
 extras/mini-os-intree/include/xen/io/xs_wire.h     |  149 ++
 extras/mini-os-intree/include/xen/kexec.h          |  249 ++++
 extras/mini-os-intree/include/xen/mem_event.h      |  134 ++
 extras/mini-os-intree/include/xen/memory.h         |  587 ++++++++
 extras/mini-os-intree/include/xen/nmi.h            |   85 ++
 extras/mini-os-intree/include/xen/physdev.h        |  380 +++++
 extras/mini-os-intree/include/xen/platform.h       |  606 ++++++++
 extras/mini-os-intree/include/xen/sched.h          |  175 +++
 extras/mini-os-intree/include/xen/sysctl.h         |  719 +++++++++
 extras/mini-os-intree/include/xen/tmem.h           |  152 ++
 extras/mini-os-intree/include/xen/trace.h          |  331 +++++
 extras/mini-os-intree/include/xen/vcpu.h           |  240 +++
 extras/mini-os-intree/include/xen/version.h        |   96 ++
 extras/mini-os-intree/include/xen/xen-compat.h     |   44 +
 extras/mini-os-intree/include/xen/xen.h            |  899 ++++++++++++
 extras/mini-os-intree/include/xen/xencomm.h        |   41 +
 extras/mini-os-intree/include/xen/xenoprof.h       |  152 ++
 extras/mini-os-intree/include/xen/xsm/flask_op.h   |  201 +++
 extras/mini-os-intree/include/xenbus.h             |  120 ++
 extras/mini-os-intree/include/xmalloc.h            |   44 +
 extras/mini-os-intree/kernel.c                     |  198 +++
 extras/mini-os-intree/lib/ctype.c                  |   29 +
 extras/mini-os-intree/lib/math.c                   |  426 ++++++
 extras/mini-os-intree/lib/printf.c                 |  786 ++++++++++
 extras/mini-os-intree/lib/stack_chk_fail.c         |    8 +
 extras/mini-os-intree/lib/string.c                 |  228 +++
 extras/mini-os-intree/lib/sys.c                    | 1550 ++++++++++++++++++++
 extras/mini-os-intree/lib/xmalloc.c                |  319 ++++
 extras/mini-os-intree/lib/xs.c                     |  194 +++
 extras/mini-os-intree/lock.c                       |  112 ++
 extras/mini-os-intree/lwip-arch.c                  |  293 ++++
 extras/mini-os-intree/lwip-net.c                   |  386 +++++
 extras/mini-os-intree/main.c                       |  193 +++
 extras/mini-os-intree/minios.mk                    |   76 +
 extras/mini-os-intree/mm.c                         |  441 ++++++
 extras/mini-os-intree/netfront.c                   |  675 +++++++++
 extras/mini-os-intree/pcifront.c                   |  616 ++++++++
 extras/mini-os-intree/sched.c                      |  304 ++++
 extras/mini-os-intree/test.c                       |  577 ++++++++
 extras/mini-os-intree/tpm_tis.c                    | 1523 +++++++++++++++++++
 extras/mini-os-intree/tpmback.c                    | 1136 ++++++++++++++
 extras/mini-os-intree/tpmfront.c                   |  631 ++++++++
 extras/mini-os-intree/xenbus/xenbus.c              |  870 +++++++++++
 extras/mini-os/COPYING                             |   36 -
 extras/mini-os/Config.mk                           |   99 --
 extras/mini-os/Makefile                            |  224 ---
 extras/mini-os/README                              |   46 -
 extras/mini-os/app.lds                             |   11 -
 extras/mini-os/arch/arm/arm32.S                    |  294 ----
 extras/mini-os/arch/arm/events.c                   |   31 -
 extras/mini-os/arch/arm/hypercalls32.S             |   64 -
 extras/mini-os/arch/arm/minios-arm32.lds           |   83 --
 extras/mini-os/arch/arm/mm.c                       |  139 --
 extras/mini-os/arch/arm/panic.c                    |   98 --
 extras/mini-os/arch/arm/sched.c                    |   47 -
 extras/mini-os/arch/arm/setup.c                    |  119 --
 extras/mini-os/arch/arm/time.c                     |  136 --
 extras/mini-os/arch/x86/Makefile                   |   30 -
 extras/mini-os/arch/x86/arch.mk                    |   22 -
 extras/mini-os/arch/x86/events.c                   |   35 -
 extras/mini-os/arch/x86/ioremap.c                  |   75 -
 extras/mini-os/arch/x86/iorw.c                     |   35 -
 extras/mini-os/arch/x86/minios-x86_32.lds          |   74 -
 extras/mini-os/arch/x86/minios-x86_64.lds          |   74 -
 extras/mini-os/arch/x86/mm.c                       |  957 ------------
 extras/mini-os/arch/x86/sched.c                    |  139 --
 extras/mini-os/arch/x86/setup.c                    |  168 ---
 extras/mini-os/arch/x86/time.c                     |  238 ---
 extras/mini-os/arch/x86/traps.c                    |  333 -----
 extras/mini-os/arch/x86/x86_32.S                   |  305 ----
 extras/mini-os/arch/x86/x86_64.S                   |  383 -----
 extras/mini-os/blkfront.c                          |  736 ----------
 extras/mini-os/config/MiniOS.mk                    |   10 -
 extras/mini-os/config/StdGNU.mk                    |   47 -
 extras/mini-os/config/arm32.mk                     |   22 -
 extras/mini-os/config/arm64.mk                     |   19 -
 extras/mini-os/config/x86_32.mk                    |   20 -
 extras/mini-os/config/x86_64.mk                    |   33 -
 extras/mini-os/console/console.c                   |  164 --
 extras/mini-os/console/console.h                   |    2 -
 extras/mini-os/console/xenbus.c                    |  195 ---
 extras/mini-os/console/xencons_ring.c              |  195 ---
 extras/mini-os/daytime.c                           |   67 -
 extras/mini-os/domain_config                       |   19 -
 extras/mini-os/events.c                            |  269 ----
 extras/mini-os/fbfront.c                           |  710 ---------
 extras/mini-os/gntmap.c                            |  250 ----
 extras/mini-os/gnttab.c                            |  196 ---
 extras/mini-os/hypervisor.c                        |  132 --
 extras/mini-os/include/arch/cc.h                   |   87 --
 extras/mini-os/include/arch/perf.h                 |   15 -
 extras/mini-os/include/arch/sys_arch.h             |   35 -
 extras/mini-os/include/arm/arch_endian.h           |    7 -
 extras/mini-os/include/arm/arch_limits.h           |    9 -
 extras/mini-os/include/arm/arch_mm.h               |   38 -
 extras/mini-os/include/arm/arch_sched.h            |   19 -
 extras/mini-os/include/arm/arch_spinlock.h         |   36 -
 extras/mini-os/include/arm/arm32/arch_wordsize.h   |    1 -
 extras/mini-os/include/arm/gic.h                   |    1 -
 extras/mini-os/include/arm/hypercall-arm.h         |   98 --
 extras/mini-os/include/arm/os.h                    |  216 ---
 extras/mini-os/include/arm/traps.h                 |   20 -
 extras/mini-os/include/blkfront.h                  |   54 -
 extras/mini-os/include/byteorder.h                 |   36 -
 extras/mini-os/include/byteswap.h                  |   39 -
 extras/mini-os/include/compiler.h                  |   10 -
 extras/mini-os/include/console.h                   |   89 --
 extras/mini-os/include/ctype.h                     |   60 -
 extras/mini-os/include/endian.h                    |   19 -
 extras/mini-os/include/err.h                       |   31 -
 extras/mini-os/include/errno-base.h                |   39 -
 extras/mini-os/include/errno.h                     |  122 --
 extras/mini-os/include/events.h                    |   59 -
 extras/mini-os/include/fbfront.h                   |   46 -
 extras/mini-os/include/fcntl.h                     |   99 --
 extras/mini-os/include/gntmap.h                    |   35 -
 extras/mini-os/include/gnttab.h                    |   17 -
 extras/mini-os/include/hypervisor.h                |   48 -
 extras/mini-os/include/ioremap.h                   |   33 -
 extras/mini-os/include/iorw.h                      |   16 -
 extras/mini-os/include/kernel.h                    |    9 -
 extras/mini-os/include/lib-gpl.h                   |   59 -
 extras/mini-os/include/lib.h                       |  230 ---
 extras/mini-os/include/linux/types.h               |    5 -
 extras/mini-os/include/lwipopts.h                  |   23 -
 extras/mini-os/include/minios-external/README      |   24 -
 .../mini-os/include/minios-external/bsd-COPYRIGHT  |  126 --
 extras/mini-os/include/minios-external/bsd-queue.3 | 1044 -------------
 .../minios-external/bsd-sys-queue-h-seddery        |   72 -
 .../include/minios-external/bsd-sys-queue.h        |  637 --------
 extras/mini-os/include/mm.h                        |   82 -
 extras/mini-os/include/netfront.h                  |   24 -
 extras/mini-os/include/pcifront.h                  |   29 -
 extras/mini-os/include/posix/arpa/inet.h           |    7 -
 extras/mini-os/include/posix/dirent.h              |   24 -
 extras/mini-os/include/posix/err.h                 |   15 -
 extras/mini-os/include/posix/fcntl.h               |   11 -
 extras/mini-os/include/posix/limits.h              |   48 -
 extras/mini-os/include/posix/net/if.h              |   85 --
 extras/mini-os/include/posix/netdb.h               |    9 -
 extras/mini-os/include/posix/netinet/in.h          |    7 -
 extras/mini-os/include/posix/netinet/tcp.h         |    6 -
 extras/mini-os/include/posix/poll.h                |    1 -
 extras/mini-os/include/posix/pthread.h             |   64 -
 extras/mini-os/include/posix/signal.h              |   10 -
 extras/mini-os/include/posix/stdlib.h              |    8 -
 extras/mini-os/include/posix/strings.h             |   12 -
 extras/mini-os/include/posix/sys/ioctl.h           |   16 -
 extras/mini-os/include/posix/sys/mman.h            |   22 -
 extras/mini-os/include/posix/sys/poll.h            |   79 -
 extras/mini-os/include/posix/sys/select.h          |    7 -
 extras/mini-os/include/posix/sys/socket.h          |   31 -
 extras/mini-os/include/posix/sys/stat.h            |    7 -
 extras/mini-os/include/posix/syslog.h              |   37 -
 extras/mini-os/include/posix/termios.h             |   87 --
 extras/mini-os/include/posix/time.h                |   11 -
 extras/mini-os/include/posix/unistd.h              |   16 -
 extras/mini-os/include/sched.h                     |   55 -
 extras/mini-os/include/semaphore.h                 |  110 --
 extras/mini-os/include/spinlock.h                  |   55 -
 extras/mini-os/include/sys/lock.h                  |   52 -
 extras/mini-os/include/sys/time.h                  |   47 -
 extras/mini-os/include/time.h                      |   63 -
 extras/mini-os/include/tpm_tis.h                   |   61 -
 extras/mini-os/include/tpmback.h                   |  104 --
 extras/mini-os/include/tpmfront.h                  |   97 --
 extras/mini-os/include/types.h                     |   74 -
 extras/mini-os/include/wait.h                      |  105 --
 extras/mini-os/include/waittypes.h                 |   32 -
 extras/mini-os/include/x86/arch_endian.h           |    7 -
 extras/mini-os/include/x86/arch_limits.h           |   20 -
 extras/mini-os/include/x86/arch_mm.h               |  233 ---
 extras/mini-os/include/x86/arch_sched.h            |   25 -
 extras/mini-os/include/x86/arch_spinlock.h         |   94 --
 extras/mini-os/include/x86/os.h                    |  572 --------
 extras/mini-os/include/x86/traps.h                 |   78 -
 extras/mini-os/include/x86/x86_32/arch_wordsize.h  |    1 -
 .../mini-os/include/x86/x86_32/hypercall-x86_32.h  |  337 -----
 extras/mini-os/include/x86/x86_64/arch_wordsize.h  |    2 -
 .../mini-os/include/x86/x86_64/hypercall-x86_64.h  |  344 -----
 extras/mini-os/include/xen/COPYING                 |   38 -
 extras/mini-os/include/xen/arch-arm.h              |  432 ------
 extras/mini-os/include/xen/arch-arm/hvm/save.h     |   39 -
 extras/mini-os/include/xen/arch-x86/cpuid.h        |   90 --
 extras/mini-os/include/xen/arch-x86/hvm/save.h     |  630 --------
 extras/mini-os/include/xen/arch-x86/xen-mca.h      |  440 ------
 extras/mini-os/include/xen/arch-x86/xen-x86_32.h   |  171 ---
 extras/mini-os/include/xen/arch-x86/xen-x86_64.h   |  202 ---
 extras/mini-os/include/xen/arch-x86/xen.h          |  303 ----
 extras/mini-os/include/xen/arch-x86_32.h           |   27 -
 extras/mini-os/include/xen/arch-x86_64.h           |   43 -
 extras/mini-os/include/xen/callback.h              |  121 --
 extras/mini-os/include/xen/dom0_ops.h              |  120 --
 extras/mini-os/include/xen/domctl.h                | 1154 ---------------
 extras/mini-os/include/xen/elfnote.h               |  271 ----
 extras/mini-os/include/xen/event_channel.h         |  385 -----
 extras/mini-os/include/xen/features.h              |  114 --
 extras/mini-os/include/xen/gcov.h                  |  115 --
 extras/mini-os/include/xen/grant_table.h           |  682 ---------
 extras/mini-os/include/xen/hvm/e820.h              |   34 -
 extras/mini-os/include/xen/hvm/hvm_info_table.h    |   72 -
 extras/mini-os/include/xen/hvm/hvm_op.h            |  402 -----
 extras/mini-os/include/xen/hvm/hvm_xs_strings.h    |   80 -
 extras/mini-os/include/xen/hvm/ioreq.h             |  129 --
 extras/mini-os/include/xen/hvm/params.h            |  199 ---
 extras/mini-os/include/xen/hvm/pvdrivers.h         |   49 -
 extras/mini-os/include/xen/hvm/save.h              |  111 --
 extras/mini-os/include/xen/io/blkif.h              |  640 --------
 extras/mini-os/include/xen/io/console.h            |   51 -
 extras/mini-os/include/xen/io/fbif.h               |  176 ---
 extras/mini-os/include/xen/io/fsif.h               |  192 ---
 extras/mini-os/include/xen/io/kbdif.h              |  132 --
 extras/mini-os/include/xen/io/libxenvchan.h        |   97 --
 extras/mini-os/include/xen/io/netif.h              |  305 ----
 extras/mini-os/include/xen/io/pciif.h              |  125 --
 extras/mini-os/include/xen/io/protocols.h          |   40 -
 extras/mini-os/include/xen/io/ring.h               |  312 ----
 extras/mini-os/include/xen/io/tpmif.h              |  143 --
 extras/mini-os/include/xen/io/usbif.h              |  150 --
 extras/mini-os/include/xen/io/vscsiif.h            |  260 ----
 extras/mini-os/include/xen/io/xenbus.h             |   80 -
 extras/mini-os/include/xen/io/xs_wire.h            |  149 --
 extras/mini-os/include/xen/kexec.h                 |  249 ----
 extras/mini-os/include/xen/mem_event.h             |  134 --
 extras/mini-os/include/xen/memory.h                |  587 --------
 extras/mini-os/include/xen/nmi.h                   |   85 --
 extras/mini-os/include/xen/physdev.h               |  380 -----
 extras/mini-os/include/xen/platform.h              |  606 --------
 extras/mini-os/include/xen/sched.h                 |  175 ---
 extras/mini-os/include/xen/sysctl.h                |  719 ---------
 extras/mini-os/include/xen/tmem.h                  |  152 --
 extras/mini-os/include/xen/trace.h                 |  331 -----
 extras/mini-os/include/xen/vcpu.h                  |  240 ---
 extras/mini-os/include/xen/version.h               |   96 --
 extras/mini-os/include/xen/xen-compat.h            |   44 -
 extras/mini-os/include/xen/xen.h                   |  899 ------------
 extras/mini-os/include/xen/xencomm.h               |   41 -
 extras/mini-os/include/xen/xenoprof.h              |  152 --
 extras/mini-os/include/xen/xsm/flask_op.h          |  201 ---
 extras/mini-os/include/xenbus.h                    |  120 --
 extras/mini-os/include/xmalloc.h                   |   44 -
 extras/mini-os/kernel.c                            |  198 ---
 extras/mini-os/lib/ctype.c                         |   29 -
 extras/mini-os/lib/math.c                          |  426 ------
 extras/mini-os/lib/printf.c                        |  786 ----------
 extras/mini-os/lib/stack_chk_fail.c                |    8 -
 extras/mini-os/lib/string.c                        |  228 ---
 extras/mini-os/lib/sys.c                           | 1550 --------------------
 extras/mini-os/lib/xmalloc.c                       |  319 ----
 extras/mini-os/lib/xs.c                            |  194 ---
 extras/mini-os/lock.c                              |  112 --
 extras/mini-os/lwip-arch.c                         |  293 ----
 extras/mini-os/lwip-net.c                          |  386 -----
 extras/mini-os/main.c                              |  193 ---
 extras/mini-os/minios.mk                           |   76 -
 extras/mini-os/mm.c                                |  441 ------
 extras/mini-os/netfront.c                          |  675 ---------
 extras/mini-os/pcifront.c                          |  616 --------
 extras/mini-os/sched.c                             |  304 ----
 extras/mini-os/test.c                              |  577 --------
 extras/mini-os/tpm_tis.c                           | 1523 -------------------
 extras/mini-os/tpmback.c                           | 1136 --------------
 extras/mini-os/tpmfront.c                          |  631 --------
 extras/mini-os/xenbus/xenbus.c                     |  870 -----------
 stubdom/Makefile                                   |    4 +
 tools/misc/mktarball                               |    4 +-
 447 files changed, 40533 insertions(+), 40507 deletions(-)

diff --git a/.gitignore b/.gitignore
index cdbdca7..4979018 100644
--- a/.gitignore
+++ b/.gitignore
@@ -46,10 +46,8 @@ docs/man1/
 docs/man5/
 docs/pdf/
 docs/txt/
-extras/mini-os/include/mini-os
-extras/mini-os/include/x86/mini-os
-extras/mini-os/include/list.h
-extras/mini-os/mini-os*
+extras/mini-os
+extras/mini-os-remote
 install/*
 stubdom/autom4te.cache/
 stubdom/binutils-*
diff --git a/Config.mk b/Config.mk
index d12ad91..109f1f1 100644
--- a/Config.mk
+++ b/Config.mk
@@ -245,14 +245,20 @@ OVMF_UPSTREAM_URL ?= 
http://xenbits.xen.org/git-http/ovmf.git
 QEMU_UPSTREAM_URL ?= http://xenbits.xen.org/git-http/qemu-upstream-unstable.git
 QEMU_TRADITIONAL_URL ?= http://xenbits.xen.org/git-http/qemu-xen-unstable.git
 SEABIOS_UPSTREAM_URL ?= http://xenbits.xen.org/git-http/seabios.git
+MINIOS_UPSTREAM_URL ?= http://xenbits.xen.org/git-http/mini-os.git
 else
 OVMF_UPSTREAM_URL ?= git://xenbits.xen.org/ovmf.git
 QEMU_UPSTREAM_URL ?= git://xenbits.xen.org/qemu-upstream-unstable.git
 QEMU_TRADITIONAL_URL ?= git://xenbits.xen.org/qemu-xen-unstable.git
 SEABIOS_UPSTREAM_URL ?= git://xenbits.xen.org/seabios.git
+MINIOS_UPSTREAM_URL ?= git://xenbits.xen.org/mini-os.git
 endif
 OVMF_UPSTREAM_REVISION ?= 447d264115c476142f884af0be287622cd244423
 QEMU_UPSTREAM_REVISION ?= master
+MINIOS_UPSTREAM_REVISION ?= 55f7cd7427ef3e7fe3563a3da46d8664a2ed0d6d
+# Thu Jan 29 19:10:04 2015 +0000
+# Mini-OS: standalone build
+
 SEABIOS_UPSTREAM_REVISION ?= rel-1.7.5
 # Thu May 22 16:59:16 2014 -0400
 # python3 fixes for vgabios and csm builds.
diff --git a/Makefile b/Makefile
index ad6f917..e8a75ff 100644
--- a/Makefile
+++ b/Makefile
@@ -17,6 +17,22 @@ TARGS_DISTCLEAN=$(patsubst %, distclean-%, $(SUBSYSTEMS))
 export XEN_ROOT=$(CURDIR)
 include Config.mk

+.PHONY: mini-os-dir
+mini-os-dir:
+       GIT=$(GIT) $(XEN_ROOT)/scripts/git-checkout.sh \
+               $(MINIOS_UPSTREAM_URL) \
+               $(MINIOS_UPSTREAM_REVISION) \
+               $(XEN_ROOT)/extras/mini-os
+
+.PHONY: mini-os-dir-force-update
+mini-os-dir-force-update: mini-os-dir
+       set -ex; \
+       if [ "$(MINIOS_UPSTREAM_REVISION)" ]; then \
+               cd extras/mini-os-remote; \
+               $(GIT) fetch origin; \
+               $(GIT) reset --hard $(MINIOS_UPSTREAM_REVISION); \
+       fi
+
 SUBARCH := $(subst x86_32,i386,$(XEN_TARGET_ARCH))
 export XEN_TARGET_ARCH SUBARCH
 export DESTDIR
@@ -37,7 +53,7 @@ build-tools:
        $(MAKE) -C tools build

 .PHONY: build-stubdom
-build-stubdom:
+build-stubdom: mini-os-dir
        $(MAKE) -C stubdom build
 ifeq (x86_64,$(XEN_TARGET_ARCH))
        XEN_TARGET_ARCH=x86_32 $(MAKE) -C stubdom pv-grub
@@ -84,7 +100,7 @@ install-tools:
        $(MAKE) -C tools install

 .PHONY: install-stubdom
-install-stubdom: install-tools
+install-stubdom: install-tools mini-os-dir
        $(MAKE) -C stubdom install
 ifeq (x86_64,$(XEN_TARGET_ARCH))
        XEN_TARGET_ARCH=x86_32 $(MAKE) -C stubdom install-grub
@@ -125,11 +141,11 @@ rpmball: dist
        bash ./tools/misc/mkrpm $(XEN_ROOT) $$($(MAKE) -C xen xenversion 
--no-print-directory)

 .PHONY: subtree-force-update
-subtree-force-update:
+subtree-force-update: mini-os-dir-force-update
        $(MAKE) -C tools subtree-force-update

 .PHONY: subtree-force-update-all
-subtree-force-update-all:
+subtree-force-update-all: mini-os-dir-force-update
        $(MAKE) -C tools subtree-force-update-all

 # Make a source tarball, including qemu sub-trees.
diff --git a/extras/mini-os-intree/COPYING b/extras/mini-os-intree/COPYING
new file mode 100644
index 0000000..1d9df6c
--- /dev/null
+++ b/extras/mini-os-intree/COPYING
@@ -0,0 +1,36 @@
+Certain files in this directory are licensed by the GNU
+General Public License version 2 (GPLv2). By default these
+files are not built and linked into MiniOs. Enabling them
+will cause the whole work to become covered by the GPLv2.
+
+The current set of GPLv2 features are:
+CONFIG_TPMFRONT
+CONFIG_TPMBACK
+CONFIG_TPM_TIS
+
+Do not use these if you do not want your MiniOS build to become
+GPL licensed!
+
+Copyright (c) 2009 Citrix Systems, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
diff --git a/extras/mini-os-intree/Config.mk b/extras/mini-os-intree/Config.mk
new file mode 100644
index 0000000..e5d8ade
--- /dev/null
+++ b/extras/mini-os-intree/Config.mk
@@ -0,0 +1,99 @@
+#
+# Compare $(1) and $(2) and replace $(2) with $(1) if they differ
+#
+# Typically $(1) is a newly generated file and $(2) is the target file
+# being regenerated. This prevents changing the timestamp of $(2) only
+# due to being auto regenereated with the same contents.
+define move-if-changed
+        if ! cmp -s $(1) $(2); then mv -f $(1) $(2); else rm -f $(1); fi
+endef
+
+# cc-option: Check if compiler supports first option, else fall back to second.
+#
+# This is complicated by the fact that unrecognised -Wno-* options:
+#   (a) are ignored unless the compilation emits a warning; and
+#   (b) even then produce a warning rather than an error
+# To handle this we do a test compile, passing the option-under-test, on a code
+# fragment that will always produce a warning (integer assigned to pointer).
+# We then grep for the option-under-test in the compiler's output, the presence
+# of which would indicate an "unrecognized command-line option" warning/error.
+#
+# Usage: cflags-y += $(call cc-option,$(CC),-march=winchip-c6,-march=i586)
+cc-option = $(shell if test -z "`echo 'void*p=1;' | \
+              $(1) $(2) -S -o /dev/null -x c - 2>&1 | grep -- $(2) -`"; \
+              then echo "$(2)"; else echo "$(3)"; fi ;)
+
+# Compatibility with Xen's stubdom build environment.  If we are building
+# stubdom, some XEN_ variables are set, set MINIOS_ variables accordingly.
+#
+ifneq ($(XEN_ROOT),)
+MINI-OS_ROOT=$(XEN_ROOT)/extras/mini-os
+else
+MINI-OS_ROOT=$(TOPLEVEL_DIR)
+endif
+export MINI-OS_ROOT
+
+ifneq ($(XEN_TARGET_ARCH),)
+MINIOS_TARGET_ARCH = $(XEN_TARGET_ARCH)
+else
+MINIOS_COMPILE_ARCH    ?= $(shell uname -m | sed -e s/i.86/x86_32/ \
+                            -e s/i86pc/x86_32/ -e s/amd64/x86_64/ \
+                            -e s/armv7.*/arm32/ -e s/armv8.*/arm64/ \
+                            -e s/aarch64/arm64/)
+
+MINIOS_TARGET_ARCH     ?= $(MINIOS_COMPILE_ARCH)
+endif
+
+libc = $(stubdom)
+
+XEN_INTERFACE_VERSION := 0x00030205
+export XEN_INTERFACE_VERSION
+
+# Try to find out the architecture family TARGET_ARCH_FAM.
+# First check whether x86_... is contained (for x86_32, x86_32y, x86_64).
+# If not x86 then use $(MINIOS_TARGET_ARCH)
+ifeq ($(findstring x86_,$(MINIOS_TARGET_ARCH)),x86_)
+TARGET_ARCH_FAM = x86
+else
+TARGET_ARCH_FAM = $(MINIOS_TARGET_ARCH)
+endif
+
+# The architecture family directory below mini-os.
+TARGET_ARCH_DIR := arch/$(TARGET_ARCH_FAM)
+
+# Export these variables for possible use in architecture dependent makefiles.
+export TARGET_ARCH_DIR
+export TARGET_ARCH_FAM
+
+# This is used for architecture specific links.
+# This can be overwritten from arch specific rules.
+ARCH_LINKS =
+
+# The path pointing to the architecture specific header files.
+ARCH_INC := $(TARGET_ARCH_FAM)
+
+# For possible special header directories.
+# This can be overwritten from arch specific rules.
+EXTRA_INC = $(ARCH_INC)
+
+# Include the architecture family's special makerules.
+# This must be before include minios.mk!
+include $(MINI-OS_ROOT)/$(TARGET_ARCH_DIR)/arch.mk
+
+extra_incl := $(foreach dir,$(EXTRA_INC),-isystem 
$(MINI-OS_ROOT)/include/$(dir))
+
+DEF_CPPFLAGS += -isystem $(MINI-OS_ROOT)/include
+DEF_CPPFLAGS += -D__MINIOS__
+
+ifeq ($(libc),y)
+DEF_CPPFLAGS += -DHAVE_LIBC
+DEF_CPPFLAGS += -isystem $(MINI-OS_ROOT)/include/posix
+DEF_CPPFLAGS += -isystem $(XEN_ROOT)/tools/xenstore/include
+endif
+
+ifneq ($(LWIPDIR),)
+lwip=y
+DEF_CPPFLAGS += -DHAVE_LWIP
+DEF_CPPFLAGS += -isystem $(LWIPDIR)/src/include
+DEF_CPPFLAGS += -isystem $(LWIPDIR)/src/include/ipv4
+endif
diff --git a/extras/mini-os-intree/Makefile b/extras/mini-os-intree/Makefile
new file mode 100644
index 0000000..f16520e
--- /dev/null
+++ b/extras/mini-os-intree/Makefile
@@ -0,0 +1,224 @@
+# Common Makefile for mini-os.
+#
+# Every architecture directory below mini-os/arch has to have a
+# Makefile and a arch.mk.
+#
+
+OBJ_DIR=$(CURDIR)
+TOPLEVEL_DIR=$(CURDIR)
+
+ifeq ($(MINIOS_CONFIG),)
+include Config.mk
+else
+EXTRA_DEPS += $(MINIOS_CONFIG)
+include $(MINIOS_CONFIG)
+endif
+
+include $(MINI-OS_ROOT)/config/MiniOS.mk
+
+# Configuration defaults
+CONFIG_START_NETWORK ?= y
+CONFIG_SPARSE_BSS ?= y
+CONFIG_QEMU_XS_ARGS ?= n
+CONFIG_TEST ?= n
+CONFIG_PCIFRONT ?= n
+CONFIG_BLKFRONT ?= y
+CONFIG_TPMFRONT ?= n
+CONFIG_TPM_TIS ?= n
+CONFIG_TPMBACK ?= n
+CONFIG_NETFRONT ?= y
+CONFIG_FBFRONT ?= y
+CONFIG_KBDFRONT ?= y
+CONFIG_CONSFRONT ?= y
+CONFIG_XENBUS ?= y
+CONFIG_XC ?=y
+CONFIG_LWIP ?= $(lwip)
+
+# Export config items as compiler directives
+flags-$(CONFIG_START_NETWORK) += -DCONFIG_START_NETWORK
+flags-$(CONFIG_SPARSE_BSS) += -DCONFIG_SPARSE_BSS
+flags-$(CONFIG_QEMU_XS_ARGS) += -DCONFIG_QEMU_XS_ARGS
+flags-$(CONFIG_PCIFRONT) += -DCONFIG_PCIFRONT
+flags-$(CONFIG_BLKFRONT) += -DCONFIG_BLKFRONT
+flags-$(CONFIG_TPMFRONT) += -DCONFIG_TPMFRONT
+flags-$(CONFIG_TPM_TIS) += -DCONFIG_TPM_TIS
+flags-$(CONFIG_TPMBACK) += -DCONFIG_TPMBACK
+flags-$(CONFIG_NETFRONT) += -DCONFIG_NETFRONT
+flags-$(CONFIG_KBDFRONT) += -DCONFIG_KBDFRONT
+flags-$(CONFIG_FBFRONT) += -DCONFIG_FBFRONT
+flags-$(CONFIG_CONSFRONT) += -DCONFIG_CONSFRONT
+flags-$(CONFIG_XENBUS) += -DCONFIG_XENBUS
+
+DEF_CFLAGS += $(flags-y)
+
+# Symlinks and headers that must be created before building the C files
+GENERATED_HEADERS := include/list.h $(ARCH_LINKS) include/mini-os 
include/$(TARGET_ARCH_FAM)/mini-os
+
+EXTRA_DEPS += $(GENERATED_HEADERS)
+
+# Include common mini-os makerules.
+include minios.mk
+
+# Set tester flags
+# CFLAGS += -DBLKTEST_WRITE
+
+# Define some default flags for linking.
+LDLIBS :=
+APP_LDLIBS :=
+LDARCHLIB := -L$(OBJ_DIR)/$(TARGET_ARCH_DIR) -l$(ARCH_LIB_NAME)
+LDFLAGS_FINAL := -T $(TARGET_ARCH_DIR)/minios-$(MINIOS_TARGET_ARCH).lds
+
+# Prefix for global API names. All other symbols are localised before
+# linking with EXTRA_OBJS.
+GLOBAL_PREFIX := xenos_
+EXTRA_OBJS =
+
+TARGET := mini-os
+
+# Subdirectories common to mini-os
+SUBDIRS := lib xenbus console
+
+src-$(CONFIG_BLKFRONT) += blkfront.c
+src-$(CONFIG_TPMFRONT) += tpmfront.c
+src-$(CONFIG_TPM_TIS) += tpm_tis.c
+src-$(CONFIG_TPMBACK) += tpmback.c
+src-y += daytime.c
+src-y += events.c
+src-$(CONFIG_FBFRONT) += fbfront.c
+src-y += gntmap.c
+src-y += gnttab.c
+src-y += hypervisor.c
+src-y += kernel.c
+src-y += lock.c
+src-y += main.c
+src-y += mm.c
+src-$(CONFIG_NETFRONT) += netfront.c
+src-$(CONFIG_PCIFRONT) += pcifront.c
+src-y += sched.c
+src-$(CONFIG_TEST) += test.c
+
+src-y += lib/ctype.c
+src-y += lib/math.c
+src-y += lib/printf.c
+src-y += lib/stack_chk_fail.c
+src-y += lib/string.c
+src-y += lib/sys.c
+src-y += lib/xmalloc.c
+src-$(CONFIG_XENBUS) += lib/xs.c
+
+src-$(CONFIG_XENBUS) += xenbus/xenbus.c
+
+src-y += console/console.c
+src-y += console/xencons_ring.c
+src-$(CONFIG_CONSFRONT) += console/xenbus.c
+
+# The common mini-os objects to build.
+APP_OBJS :=
+OBJS := $(patsubst %.c,$(OBJ_DIR)/%.o,$(src-y))
+
+.PHONY: default
+default: $(OBJ_DIR)/$(TARGET)
+
+# Create special architecture specific links. The function arch_links
+# has to be defined in arch.mk (see include above).
+ifneq ($(ARCH_LINKS),)
+$(ARCH_LINKS):
+       $(arch_links)
+endif
+
+include/list.h: include/minios-external/bsd-sys-queue-h-seddery 
include/minios-external/bsd-sys-queue.h
+       perl $^ --prefix=minios  >$@.new
+       $(call move-if-changed,$@.new,$@)
+
+# Used by stubdom's Makefile
+.PHONY: links
+links: $(GENERATED_HEADERS)
+
+include/mini-os:
+       ln -sf . $@
+
+include/$(TARGET_ARCH_FAM)/mini-os:
+       ln -sf . $@
+
+.PHONY: arch_lib
+arch_lib:
+       $(MAKE) --directory=$(TARGET_ARCH_DIR) 
OBJ_DIR=$(OBJ_DIR)/$(TARGET_ARCH_DIR) || exit 1;
+
+ifeq ($(CONFIG_LWIP),y)
+# lwIP library
+LWC    := $(shell find $(LWIPDIR)/src -type f -name '*.c')
+LWC    := $(filter-out %6.c %ip6_addr.c %ethernetif.c, $(LWC))
+LWO    := $(patsubst %.c,%.o,$(LWC))
+LWO    += $(OBJ_DIR)/lwip-arch.o
+ifeq ($(CONFIG_NETFRONT),y)
+LWO += $(OBJ_DIR)/lwip-net.o
+endif
+
+$(OBJ_DIR)/lwip.a: $(LWO)
+       $(RM) $@
+       $(AR) cqs $@ $^
+
+OBJS += $(OBJ_DIR)/lwip.a
+endif
+
+OBJS := $(filter-out $(OBJ_DIR)/lwip%.o $(LWO), $(OBJS))
+
+ifeq ($(libc),y)
+ifeq ($(CONFIG_XC),y)
+APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libxc-$(XEN_TARGET_ARCH) -whole-archive 
-lxenguest -lxenctrl -no-whole-archive
+endif
+APP_LDLIBS += -lpci
+APP_LDLIBS += -lz
+APP_LDLIBS += -lm
+LDLIBS += -lc
+endif
+
+ifneq ($(APP_OBJS)-$(lwip),-y)
+OBJS := $(filter-out $(OBJ_DIR)/daytime.o, $(OBJS))
+endif
+
+$(OBJ_DIR)/$(TARGET)_app.o: $(APP_OBJS) app.lds
+       $(LD) -r -d $(LDFLAGS) -\( $^ -\) $(APP_LDLIBS) --undefined main -o $@
+
+ifneq ($(APP_OBJS),)
+APP_O=$(OBJ_DIR)/$(TARGET)_app.o
+endif
+
+$(OBJ_DIR)/$(TARGET): $(OBJS) $(APP_O) arch_lib
+       $(LD) -r $(LDFLAGS) $(HEAD_OBJ) $(APP_O) $(OBJS) $(LDARCHLIB) $(LDLIBS) 
-o $@.o
+       $(OBJCOPY) -w -G $(GLOBAL_PREFIX)* -G _start $@.o $@.o
+       $(LD) $(LDFLAGS) $(LDFLAGS_FINAL) $@.o $(EXTRA_OBJS) -o $@
+       gzip -f -9 -c $@ >$@.gz
+
+.PHONY: clean arch_clean
+
+arch_clean:
+       $(MAKE) --directory=$(TARGET_ARCH_DIR) 
OBJ_DIR=$(OBJ_DIR)/$(TARGET_ARCH_DIR) clean || exit 1;
+
+clean: arch_clean
+       for dir in $(addprefix $(OBJ_DIR)/,$(SUBDIRS)); do \
+               rm -f $$dir/*.o; \
+       done
+       rm -f include/list.h
+       rm -f $(OBJ_DIR)/*.o *~ $(OBJ_DIR)/core $(OBJ_DIR)/$(TARGET).elf 
$(OBJ_DIR)/$(TARGET).raw $(OBJ_DIR)/$(TARGET) $(OBJ_DIR)/$(TARGET).gz
+       find . $(OBJ_DIR) -type l | xargs rm -f
+       $(RM) $(OBJ_DIR)/lwip.a $(LWO)
+       rm -f tags TAGS
+
+
+define all_sources
+     ( find . -follow -name SCCS -prune -o -name '*.[chS]' -print )
+endef
+
+.PHONY: cscope
+cscope:
+       $(all_sources) > cscope.files
+       cscope -k -b -q
+
+.PHONY: tags
+tags:
+       $(all_sources) | xargs ctags
+
+.PHONY: TAGS
+TAGS:
+       $(all_sources) | xargs etags
diff --git a/extras/mini-os-intree/README b/extras/mini-os-intree/README
new file mode 100644
index 0000000..7960314
--- /dev/null
+++ b/extras/mini-os-intree/README
@@ -0,0 +1,46 @@
+ Minimal OS
+ ----------
+
+This shows some of the stuff that any guest OS will have to set up.
+
+This includes:
+
+ * installing a virtual exception table
+ * handling virtual exceptions
+ * handling asynchronous events
+ * enabling/disabling async events
+ * parsing start_info struct at start-of-day
+ * registering virtual interrupt handlers (for timer interrupts)
+ * a simple page and memory allocator
+ * minimal libc support
+ * minimal Copy-on-Write support
+ * network, block, framebuffer support
+ * transparent access to FileSystem exports (see tools/fs-back)
+
+- to build it just type make.
+
+- to build it with TCP/IP support, download LWIP 1.3.2 source code and type
+
+  make LWIPDIR=/path/to/lwip/source
+
+- to build it with much better libc support, see the stubdom/ directory
+
+- to start it do the following in domain0
+  # xl create -c domain_config
+
+This starts the kernel and prints out a bunch of stuff and then once every
+second the system time.
+
+If you have setup a disk in the config file (e.g.
+disk = [ 'file:/tmp/foo,hda,r' ] ), it will loop reading it.  If that disk is
+writable (e.g. disk = [ 'file:/tmp/foo,hda,w' ] ), it will write data patterns
+and re-read them.
+
+If you have setup a network in the config file (e.g. vif = [''] ), it will
+print incoming packets.
+
+If you have setup a VFB in the config file (e.g. vfb = ['type=sdl'] ), it will
+show a mouse with which you can draw color squares.
+
+If you have compiled it with TCP/IP support, it will run a daytime server on
+TCP port 13.
diff --git a/extras/mini-os-intree/app.lds b/extras/mini-os-intree/app.lds
new file mode 100644
index 0000000..4a48cc8
--- /dev/null
+++ b/extras/mini-os-intree/app.lds
@@ -0,0 +1,11 @@
+SECTIONS
+{
+        .app.bss : {
+                __app_bss_start = . ;
+                *(.bss .bss.*)
+                *(COMMON)
+                *(.lbss .lbss.*)
+                *(LARGE_COMMON)
+                __app_bss_end = . ;
+        }
+}
diff --git a/extras/mini-os-intree/arch/arm/arm32.S 
b/extras/mini-os-intree/arch/arm/arm32.S
new file mode 100644
index 0000000..a08a170
--- /dev/null
+++ b/extras/mini-os-intree/arch/arm/arm32.S
@@ -0,0 +1,294 @@
+@ Offset of the kernel within the RAM. This is a Linux/zImage convention which 
we
+@ rely on for now.
+#define ZIMAGE_KERNEL_OFFSET 0x8000
+
+.section .text
+
+.globl _start
+_start:
+       @ zImage header
+.rept   8
+        mov     r0, r0
+.endr
+        b       reset
+        .word   0x016f2818      @ Magic numbers to help the loader
+        .word   0              @ zImage start address (0 = relocatable)
+        .word   _edata - _start @ zImage end address (excludes bss section)
+       @ end of zImage header
+
+@ Called at boot time. Sets up MMU, exception vectors and stack, and then 
calls C arch_init() function.
+@ => r2 -> DTB
+@ <= never returns
+@ Note: this boot code needs to be within the first (1MB - 
ZIMAGE_KERNEL_OFFSET) of _start.
+reset:
+       @ Problem: the C code wants to be at a known address (_start), but Xen 
might
+       @ load us anywhere. We initialise the MMU (mapping virtual to physical 
@ addresses)
+       @ so everything ends up where the code expects it to be.
+       @
+       @ We calculate the offet between where the linker thought _start would 
be and where
+       @ it actually is and initialise the page tables to have that offset for 
every page.
+       @
+       @ When we turn on the MMU, we're still executing at the old address. We 
don't want
+       @ the code to disappear from under us. So we have to do the mapping in 
stages:
+       @
+       @ 1. set up a mapping to our current page from both its current and 
desired addresses
+       @ 2. enable the MMU
+       @ 3. jump to the new address
+       @ 4. remap all the other pages with the calculated offset
+
+       adr     r1, _start              @ r1 = physical address of _start
+       ldr     r3, =_start             @ r3 = (desired) virtual address of 
_start
+       sub     r9, r1, r3              @ r9 = (physical - virtual) offset
+
+       ldr     r7, =_page_dir          @ r7 = (desired) virtual addr of 
translation table
+       add     r1, r7, r9              @ r1 = physical addr of translation 
table
+
+       @ Tell the system where our page table is located.
+       @ This is the 16 KB top-level translation table, in which
+       @ each word maps one 1MB virtual section to a physical section.
+       @ Note: We leave TTBCR as 0, meaning that only TTBR0 is used and
+       @ we use the short-descriptor format (32-bit physical addresses).
+       orr     r0, r1, #0b0001011      @ Sharable, Inner/Outer Write-Back 
Write-Allocate Cacheable
+       mcr     p15, 0, r0, c2, c0, 0   @ set TTBR0
+
+       @ Set access permission for domains.
+       @ Domains are deprecated, but we have to configure them anyway.
+       @ We mark every page as being domain 0 and set domain 0 to "client mode"
+       @ (client mode = use access flags in page table).
+       mov     r0, #1                  @ 1 = client
+       mcr     p15, 0, r0, c3, c0, 0   @ DACR
+
+       @ Template (flags) for a 1 MB page-table entry.
+       @ TEX[2:0] C B = 001 1 1 (outer and inner write-back, write-allocate)
+       ldr     r8, =(0x2 +             /* Section entry */ \
+                     0xc +             /* C B */ \
+                     (3 << 10) +       /* Read/write */ \
+                     (1 << 12) +       /* TEX */ \
+                     (1 << 16) +       /* Sharable */ \
+                     (1<<19))          /* Non-secure */
+       @ r8 = template page table entry
+
+       @ Add an entry for the current physical section, at the old and new
+       @ addresses. It's OK if they're the same.
+       mov     r0, pc, lsr#20
+       mov     r0, r0, lsl#20          @ r0 = physical address of this code's 
section start
+       orr     r3, r0, r8              @ r3 = table entry for this section
+       ldr     r4, =_start             @ r4 = desired virtual address of this 
section
+       str     r3, [r1, r4, lsr#18]    @ map desired virtual section to this 
code
+       str     r3, [r1, r0, lsr#18]    @ map current section to this code too
+
+       @ Invalidate TLB
+       dsb                             @ Caching is off, but must still 
prevent reordering
+       mcr     p15, 0, r1, c8, c7, 0   @ TLBIALL
+
+       @ Enable MMU / SCTLR
+       mrc     p15, 0, r1, c1, c0, 0   @ SCTLR
+       orr     r1, r1, #3 << 11        @ enable icache, branch prediction
+       orr     r1, r1, #4 + 1          @ enable dcache, MMU
+       mcr     p15, 0, r1, c1, c0, 0   @ SCTLR
+       isb
+
+       ldr     r1, =stage2             @ Virtual address of stage2
+       bx      r1
+
+@ Called once the MMU is enabled. The boot code and the page table are mapped,
+@ but nothing else is yet.
+@
+@ => r2 -> dtb (physical)
+@    r7 = virtual address of page table
+@    r8 = section entry template (flags)
+@    r9 = desired physical - virtual offset
+@    pc -> somewhere in newly-mapped virtual code section
+stage2:
+       @ Invalidate TLB
+       mcr     p15, 0, r1, c8, c7, 0   @ TLBIALL
+       isb
+
+       @ The new mapping has now taken effect:
+       @ r7 -> page_dir
+
+       @ Fill in the whole top-level translation table (at page_dir).
+       @ Populate the whole pagedir with 1MB section descriptors.
+
+       mov     r1, r7                  @ r1 -> first section entry
+       add     r3, r1, #4*4*1024       @ limit (4 GB address space, 4 byte 
entries)
+       orr     r0, r8, r9              @ r0 = entry mapping section zero to 
start of physical RAM
+1:
+       str     r0, [r1],#4             @ write the section entry
+       add     r0, r0, #1 << 20        @ next physical page (wraps)
+       cmp     r1, r3
+       bne     1b
+
+       @ Invalidate TLB
+       dsb
+       mcr     p15, 0, r1, c8, c7, 0   @ TLBIALL
+       isb
+
+       @ Set VBAR -> exception_vector_table
+       @ SCTLR.V = 0
+       adr     r0, exception_vector_table
+       mcr     p15, 0, r0, c12, c0, 0
+
+       @ Enable hardware floating point:
+       @ 1. Access to CP10 and CP11 must be enabled in the Coprocessor Access
+       @    Control Register (CP15.CACR):
+       mrc     p15, 0, r1, c1, c0, 2           @ CACR
+       orr     r1, r1, #(3 << 20) + (3 << 22)  @ full access for CP10 & CP11
+       mcr     p15, 0, r1, c1, c0, 2
+       @ 2. The EN bit in the FPEXC register must be set:
+       vmrs    r0, FPEXC
+       orr     r0, r0, #1<<30          @ EN (enable)
+       vmsr    FPEXC, r0
+
+       @ Initialise 16 KB stack
+       ldr     sp, =_boot_stack_end
+
+       sub     r0, r2, r9              @ r0 -> device tree (virtual address)
+       mov     r1, r9                  @ r1 = physical_address_offset
+
+       b       arch_init
+
+.pushsection .bss
+@ Note: calling arch_init zeroes out this region.
+.align 12
+.globl shared_info_page
+shared_info_page:
+       .fill (1024), 4, 0x0
+
+.align 3
+.globl irqstack
+.globl irqstack_end
+irqstack:
+       .fill (1024), 4, 0x0
+irqstack_end:
+
+fault_dump:
+       .fill 18, 4, 0x0                @ On fault, we save the registers + 
CPSR + handler address
+
+.popsection
+
+fault:
+       cpsid   aif                     @ Disable interrupts
+
+       ldr     r13, =fault_dump
+       stmia   r13, {r0-r12}           @ Dump the non-banked registers 
directly (well, unless from FIQ mode)
+       str     r14, [r13, #15 << 2]    @ Our r14 is the faulting r15
+       mov     r0, r13
+
+       @ Save the caller's CPSR (our SPSR) too.
+       mrs     r1, SPSR
+       str     r1, [r13, #16 << 2]
+
+       @ Switch to the mode we came from to get r13 and r14.
+       @ If coming from user mode, use System mode instead so we're still
+       @ privileged.
+       and     r1, r1, #0x1f           @ r1 = SPSR mode
+       cmp     r1, #0x10               @ If from User mode
+       moveq   r1, #0x1f               @ Then use System mode instead
+
+       mrs     r3, CPSR                @ r3 = our CPSR
+       bic     r2, r3, #0x1f
+       orr     r2, r2, r1
+       msr     CPSR, r2                @ Change to mode r1
+
+       @ Save old mode's r13, r14
+       str     r13, [r0, #13 << 2]
+       str     r14, [r0, #14 << 2]
+
+       msr     CPSR, r3                @ Back to fault mode
+
+       ldr     r1, [r0, #17 << 2]
+       sub     r1, r1, #12             @ Fix to point at start of handler
+       str     r1, [r0, #17 << 2]
+
+       @ Call C code to format the register dump.
+       @ Clobbers the stack, but we're not going to return anyway.
+       ldr     sp, =_boot_stack_end
+       bl      dump_registers
+       b       do_exit
+
+@ We want to store a unique value to identify this handler, without corrupting
+@ any of the registers. So, we store r15 (which will point just after the 
branch).
+@ Later, we subtract 12 so the user gets pointed at the start of the exception
+@ handler.
+#define FAULT(name)                    \
+.globl fault_##name;                   \
+fault_##name:                          \
+       ldr     r13, =fault_dump;       \
+       str     r15, [r13, #17 << 2];   \
+       b       fault
+
+FAULT(reset)
+FAULT(undefined_instruction)
+FAULT(svc)
+FAULT(prefetch_call)
+FAULT(prefetch_abort)
+FAULT(data_abort)
+
+@ exception base address
+.align 5
+.globl exception_vector_table
+@ Note: remember to call CLREX if returning from an exception:
+@ "The architecture enables the local monitor to treat any exclusive store as
+@  matching a previous LDREX address. For this reason, use of the CLREX
+@  instruction to clear an existing tag is required on context switches."
+@ -- ARM Cortex-A Series Programmerâ??s Guide (Version: 4.0)
+exception_vector_table:
+       b       fault_reset
+       b       fault_undefined_instruction
+       b       fault_svc
+       b       fault_prefetch_call
+       b       fault_prefetch_abort
+       b       fault_data_abort
+       b       irq_handler @ IRQ
+       .word 0xe7f000f0    @ abort on FIQ
+
+@ Call fault_undefined_instruction in "Undefined mode"
+bug:
+       .word   0xe7f000f0      @ und/udf - a "Permanently Undefined" 
instruction
+
+irq_handler:
+       ldr     sp, =irqstack_end
+       push    {r0 - r12, r14}
+
+       ldr     r0, IRQ_handler
+       cmp     r0, #0
+       beq     bug
+       blx     r0              @ call handler
+
+       @ Return from IRQ
+       pop     {r0 - r12, r14}
+       clrex
+       subs    pc, lr, #4
+
+.globl IRQ_handler
+IRQ_handler:
+       .long   0x0
+
+
+.globl __arch_switch_threads
+@ => r0 = &prev->sp
+@    r1 = &next->sp
+@ <= returns to next thread's saved return address
+__arch_switch_threads:
+       push    {r4-r11}        @ Store callee-saved registers to old thread's 
stack
+       stmia   r0, {sp, lr}    @ Store current sp and ip to prev's struct 
thread
+
+       ldmia   r1, {sp, lr}    @ Load new sp, ip from next's struct thread
+       pop     {r4-r11}        @ Load callee-saved registers from new thread's 
stack
+
+       bx      lr
+
+@ This is called if you try to divide by zero. For now, we make a supervisor 
call,
+@ which will make us halt.
+.globl raise
+raise:
+       svc     0
+
+.globl arm_start_thread
+arm_start_thread:
+       pop     {r0, r1}
+       @ r0 = user data
+       @ r1 -> thread's main function
+       ldr     lr, =exit_thread
+       bx      r1
diff --git a/extras/mini-os-intree/arch/arm/events.c 
b/extras/mini-os-intree/arch/arm/events.c
new file mode 100644
index 0000000..441010d
--- /dev/null
+++ b/extras/mini-os-intree/arch/arm/events.c
@@ -0,0 +1,31 @@
+#include <mini-os/os.h>
+#include <mini-os/events.h>
+#include <mini-os/hypervisor.h>
+#include <mini-os/console.h>
+
+static void virq_debug(evtchn_port_t port, struct pt_regs *regs, void *params)
+{
+    printk("Received a virq_debug event\n");
+}
+
+evtchn_port_t debug_port = -1;
+void arch_init_events(void)
+{
+    debug_port = bind_virq(VIRQ_DEBUG, (evtchn_handler_t)virq_debug, 0);
+    if(debug_port == -1)
+        BUG();
+    unmask_evtchn(debug_port);
+}
+
+void arch_unbind_ports(void)
+{
+    if(debug_port != -1)
+    {
+        mask_evtchn(debug_port);
+        unbind_evtchn(debug_port);
+    }
+}
+
+void arch_fini_events(void)
+{
+}
diff --git a/extras/mini-os-intree/arch/arm/hypercalls32.S 
b/extras/mini-os-intree/arch/arm/hypercalls32.S
new file mode 100644
index 0000000..af8e175
--- /dev/null
+++ b/extras/mini-os-intree/arch/arm/hypercalls32.S
@@ -0,0 +1,64 @@
+/******************************************************************************
+ * hypercall.S
+ *
+ * Xen hypercall wrappers
+ *
+ * Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>, Citrix, 2012
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation; or, when distributed
+ * separately from the Linux kernel or incorporated into other
+ * software packages, subject to the following license:
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this source file (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy, modify,
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include <xen/xen.h>
+
+#define __HVC(imm16) .long ((0xE1400070 | (((imm16) & 0xFFF0) << 4) | ((imm16) 
& 0x000F)) & 0xFFFFFFFF)
+
+#define XEN_IMM 0xEA1
+
+#define HYPERCALL_SIMPLE(hypercall)            \
+.globl HYPERVISOR_##hypercall;                 \
+.align 4,0x90;                                 \
+HYPERVISOR_##hypercall:                                \
+        mov r12, #__HYPERVISOR_##hypercall;    \
+        __HVC(XEN_IMM);                                \
+        mov pc, lr;
+
+#define _hypercall0 HYPERCALL_SIMPLE
+#define _hypercall1 HYPERCALL_SIMPLE
+#define _hypercall2 HYPERCALL_SIMPLE
+#define _hypercall3 HYPERCALL_SIMPLE
+#define _hypercall4 HYPERCALL_SIMPLE
+
+_hypercall2(sched_op);
+_hypercall2(memory_op);
+_hypercall2(event_channel_op);
+_hypercall2(xen_version);
+_hypercall3(console_io);
+_hypercall1(physdev_op);
+_hypercall3(grant_table_op);
+_hypercall3(vcpu_op);
+_hypercall1(sysctl);
+_hypercall1(domctl);
+_hypercall2(hvm_op);
+_hypercall1(xsm_op);
diff --git a/extras/mini-os-intree/arch/arm/minios-arm32.lds 
b/extras/mini-os-intree/arch/arm/minios-arm32.lds
new file mode 100755
index 0000000..9627162
--- /dev/null
+++ b/extras/mini-os-intree/arch/arm/minios-arm32.lds
@@ -0,0 +1,83 @@
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+  /* Note: we currently assume that Xen will load the kernel image
+   * at start-of-RAM + 0x8000. We use this initial 32 KB for the stack
+   * and translation tables.
+   */
+  _boot_stack   = 0x400000;    /* 16 KB boot stack */
+  _boot_stack_end = 0x404000;
+  _page_dir      = 0x404000;   /* 16 KB translation table */
+  .             = 0x408000;
+  _text = .;                   /* Text and read-only data */
+  .text : {
+       *(.text)
+       *(.gnu.warning)
+       } = 0x9090
+
+  _etext = .;                  /* End of text section */
+
+  .rodata : { *(.rodata) *(.rodata.*) }
+  . = ALIGN(4096);
+  _erodata = .;
+
+  /* newlib initialization functions */
+  . = ALIGN(32 / 8);
+  PROVIDE (__preinit_array_start = .);
+  .preinit_array     : { *(.preinit_array) }
+  PROVIDE (__preinit_array_end = .);
+  PROVIDE (__init_array_start = .);
+  .init_array     : { *(.init_array) }
+  PROVIDE (__init_array_end = .);
+  PROVIDE (__fini_array_start = .);
+  .fini_array     : { *(.fini_array) }
+  PROVIDE (__fini_array_end = .);
+
+  .ctors : {
+        __CTOR_LIST__ = .;
+        *(.ctors)
+       CONSTRUCTORS
+        LONG(0)
+        __CTOR_END__ = .;
+        }
+
+  .dtors : {
+        __DTOR_LIST__ = .;
+        *(.dtors)
+        LONG(0)
+        __DTOR_END__ = .;
+        }
+
+  .data : {                    /* Data */
+       *(.data)
+       }
+
+  /* Note: linker will insert any extra sections here, just before .bss */
+
+  .bss : {
+       _edata = .;                     /* End of data included in image */
+       /* Nothing after here is included in the zImage's size */
+
+       __bss_start = .;
+       *(.bss)
+        *(.app.bss)
+       }
+  _end = . ;
+
+  /* Sections to be discarded */
+  /DISCARD/ : {
+       *(.text.exit)
+       *(.data.exit)
+       *(.exitcall.exit)
+       }
+
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+}
diff --git a/extras/mini-os-intree/arch/arm/mm.c 
b/extras/mini-os-intree/arch/arm/mm.c
new file mode 100644
index 0000000..efecc51
--- /dev/null
+++ b/extras/mini-os-intree/arch/arm/mm.c
@@ -0,0 +1,139 @@
+#include <mini-os/console.h>
+#include <xen/memory.h>
+#include <arch_mm.h>
+#include <mini-os/hypervisor.h>
+#include <libfdt.h>
+#include <lib.h>
+
+uint32_t physical_address_offset;
+
+unsigned long allocate_ondemand(unsigned long n, unsigned long alignment)
+{
+    // FIXME
+    BUG();
+}
+
+void arch_init_mm(unsigned long *start_pfn_p, unsigned long *max_pfn_p)
+{
+    int memory;
+    int prop_len = 0;
+    const uint64_t *regs;
+
+    printk("    _text: %p(VA)\n", &_text);
+    printk("    _etext: %p(VA)\n", &_etext);
+    printk("    _erodata: %p(VA)\n", &_erodata);
+    printk("    _edata: %p(VA)\n", &_edata);
+    printk("    stack start: %p(VA)\n", _boot_stack);
+    printk("    _end: %p(VA)\n", &_end);
+
+    if (fdt_num_mem_rsv(device_tree) != 0)
+        printk("WARNING: reserved memory not supported!\n");
+
+    memory = fdt_node_offset_by_prop_value(device_tree, -1, "device_type", 
"memory", sizeof("memory"));
+    if (memory < 0) {
+        printk("No memory found in FDT!\n");
+        BUG();
+    }
+
+    /* Xen will always provide us at least one bank of memory.
+     * Mini-OS will use the first bank for the time-being. */
+    regs = fdt_getprop(device_tree, memory, "reg", &prop_len);
+
+    /* The property must contain at least the start address
+     * and size, each of which is 8-bytes. */
+    if (regs == NULL || prop_len < 16) {
+        printk("Bad 'reg' property: %p %d\n", regs, prop_len);
+        BUG();
+    }
+
+    unsigned int end = (unsigned int) &_end;
+    paddr_t mem_base = fdt64_to_cpu(regs[0]);
+    uint64_t mem_size = fdt64_to_cpu(regs[1]);
+    printk("Found memory at 0x%llx (len 0x%llx)\n",
+            (unsigned long long) mem_base, (unsigned long long) mem_size);
+
+    BUG_ON(to_virt(mem_base) > (void *) &_text);          /* Our image isn't 
in our RAM! */
+    *start_pfn_p = PFN_UP(to_phys(end));
+    uint64_t heap_len = mem_size - (PFN_PHYS(*start_pfn_p) - mem_base);
+    *max_pfn_p = *start_pfn_p + PFN_DOWN(heap_len);
+
+    printk("Using pages %lu to %lu as free space for heap.\n", *start_pfn_p, 
*max_pfn_p);
+
+    /* The device tree is probably in memory that we're about to hand over to 
the page
+     * allocator, so move it to the end and reserve that space.
+     */
+    uint32_t fdt_size = fdt_totalsize(device_tree);
+    void *new_device_tree = to_virt(((*max_pfn_p << PAGE_SHIFT) - fdt_size) & 
PAGE_MASK);
+    if (new_device_tree != device_tree) {
+        memmove(new_device_tree, device_tree, fdt_size);
+    }
+    device_tree = new_device_tree;
+    *max_pfn_p = to_phys(new_device_tree) >> PAGE_SHIFT;
+}
+
+void arch_init_p2m(unsigned long max_pfn)
+{
+}
+
+void arch_init_demand_mapping_area(unsigned long cur_pfn)
+{
+}
+
+/* Get Xen's suggested physical page assignments for the grant table. */
+static paddr_t get_gnttab_base(void)
+{
+    int hypervisor;
+    int len = 0;
+    const uint64_t *regs;
+    paddr_t gnttab_base;
+
+    hypervisor = fdt_node_offset_by_compatible(device_tree, -1, "xen,xen");
+    BUG_ON(hypervisor < 0);
+
+    regs = fdt_getprop(device_tree, hypervisor, "reg", &len);
+    /* The property contains the address and size, 8-bytes each. */
+    if (regs == NULL || len < 16) {
+        printk("Bad 'reg' property: %p %d\n", regs, len);
+        BUG();
+    }
+
+    gnttab_base = fdt64_to_cpu(regs[0]);
+
+    printk("FDT suggests grant table base %llx\n", (unsigned long long) 
gnttab_base);
+
+    return gnttab_base;
+}
+
+grant_entry_t *arch_init_gnttab(int nr_grant_frames)
+{
+    struct xen_add_to_physmap xatp;
+    struct gnttab_setup_table setup;
+    xen_pfn_t frames[nr_grant_frames];
+    paddr_t gnttab_table;
+    int i, rc;
+
+    gnttab_table = get_gnttab_base();
+
+    for (i = 0; i < nr_grant_frames; i++)
+    {
+        xatp.domid = DOMID_SELF;
+        xatp.size = 0;      /* Seems to be unused */
+        xatp.space = XENMAPSPACE_grant_table;
+        xatp.idx = i;
+        xatp.gpfn = (gnttab_table >> PAGE_SHIFT) + i;
+        rc = HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp);
+        BUG_ON(rc != 0);
+    }
+
+    setup.dom = DOMID_SELF;
+    setup.nr_frames = nr_grant_frames;
+    set_xen_guest_handle(setup.frame_list, frames);
+    HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1);
+    if (setup.status != 0)
+    {
+        printk("GNTTABOP_setup_table failed; status = %d\n", setup.status);
+        BUG();
+    }
+
+    return to_virt(gnttab_table);
+}
diff --git a/extras/mini-os-intree/arch/arm/panic.c 
b/extras/mini-os-intree/arch/arm/panic.c
new file mode 100644
index 0000000..0ac49ad
--- /dev/null
+++ b/extras/mini-os-intree/arch/arm/panic.c
@@ -0,0 +1,98 @@
+/******************************************************************************
+ * panic.c
+ *
+ * Displays a register dump and stack trace for debugging.
+ *
+ * Copyright (c) 2014, Thomas Leonard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include <mini-os/os.h>
+#include <mini-os/console.h>
+#include <arch_mm.h>
+
+extern int irqstack[];
+extern int irqstack_end[];
+
+typedef void handler(void);
+
+extern handler fault_reset;
+extern handler fault_undefined_instruction;
+extern handler fault_svc;
+extern handler fault_prefetch_call;
+extern handler fault_prefetch_abort;
+extern handler fault_data_abort;
+
+void dump_registers(int *saved_registers) {
+    static int in_dump = 0;
+    int *sp, *stack_top, *x;
+    char *fault_name;
+    void *fault_handler;
+    int i;
+
+    if (in_dump)
+    {
+        printk("Crash while in dump_registers! Not generating a second 
report.\n");
+        return;
+    }
+
+    in_dump = 1;
+
+    fault_handler = (handler *) saved_registers[17];
+    if (fault_handler == fault_reset)
+        fault_name = "reset";
+    else if (fault_handler == fault_undefined_instruction)
+        fault_name = "undefined_instruction";
+    else if (fault_handler == fault_svc)
+        fault_name = "svc";
+    else if (fault_handler == fault_prefetch_call)
+        fault_name = "prefetch_call";
+    else if (fault_handler == fault_prefetch_abort)
+        fault_name = "prefetch_abort";
+    else if (fault_handler == fault_data_abort)
+        fault_name = "data_abort";
+    else
+        fault_name = "unknown fault type!";
+
+    printk("Fault handler at %p called (%s)\n", fault_handler, fault_name);
+
+    for (i = 0; i < 16; i++) {
+        printk("r%d = %x\n", i, saved_registers[i]);
+    }
+    printk("CPSR = %x\n", saved_registers[16]);
+
+    printk("Stack dump (innermost last)\n");
+    sp = (int *) saved_registers[13];
+
+    if (sp >= _boot_stack && sp <= _boot_stack_end)
+        stack_top = _boot_stack_end;                    /* The boot stack */
+    else if (sp >= irqstack && sp <= irqstack_end)
+        stack_top = irqstack_end;                       /* The IRQ stack */
+    else
+        stack_top = (int *) ((((unsigned long) sp) | (__STACK_SIZE-1)) + 1);   
     /* A normal thread stack */
+
+    for (x = stack_top - 1; x >= sp; x--)
+    {
+        printk("  [%8p] %8x\n", x, *x);
+    }
+    printk("End of stack\n");
+
+    in_dump = 0;
+}
diff --git a/extras/mini-os-intree/arch/arm/sched.c 
b/extras/mini-os-intree/arch/arm/sched.c
new file mode 100644
index 0000000..8091566
--- /dev/null
+++ b/extras/mini-os-intree/arch/arm/sched.c
@@ -0,0 +1,47 @@
+#include <mini-os/sched.h>
+#include <mini-os/xmalloc.h>
+#include <mini-os/console.h>
+
+void arm_start_thread(void);
+
+/* The AAPCS requires the callee (e.g. __arch_switch_threads) to preserve 
r4-r11. */
+#define CALLEE_SAVED_REGISTERS 8
+
+/* Architecture specific setup of thread creation */
+struct thread* arch_create_thread(char *name, void (*function)(void *),
+                                  void *data)
+{
+    struct thread *thread;
+
+    thread = xmalloc(struct thread);
+    /* We can't use lazy allocation here since the trap handler runs on the 
stack */
+    thread->stack = (char *)alloc_pages(STACK_SIZE_PAGE_ORDER);
+    thread->name = name;
+    printk("Thread \"%s\": pointer: 0x%p, stack: 0x%p\n", name, thread,
+            thread->stack);
+
+    /* Save pointer to the thread on the stack, used by current macro */
+    *((unsigned long *)thread->stack) = (unsigned long)thread;
+
+    /* Push the details to pass to arm_start_thread onto the stack. */
+    int *sp = (int *) (thread->stack + STACK_SIZE);
+    *(--sp) = (int) function;
+    *(--sp) = (int) data;
+
+    /* We leave room for the 8 callee-saved registers which we will
+     * try to restore on thread switch, even though they're not needed
+     * for the initial switch. */
+    thread->sp = (unsigned long) sp - 4 * CALLEE_SAVED_REGISTERS;
+
+    thread->ip = (unsigned long) arm_start_thread;
+
+    return thread;
+}
+
+void run_idle_thread(void)
+{
+    __asm__ __volatile__ ("mov sp, %0; bx %1"::
+            "r"(idle_thread->sp + 4 * CALLEE_SAVED_REGISTERS),
+            "r"(idle_thread->ip));
+    /* Never arrive here! */
+}
diff --git a/extras/mini-os-intree/arch/arm/setup.c 
b/extras/mini-os-intree/arch/arm/setup.c
new file mode 100644
index 0000000..06afe46
--- /dev/null
+++ b/extras/mini-os-intree/arch/arm/setup.c
@@ -0,0 +1,119 @@
+#include <mini-os/os.h>
+#include <mini-os/kernel.h>
+#include <mini-os/gic.h>
+#include <mini-os/console.h>
+#include <xen/xen.h>
+#include <xen/memory.h>
+#include <xen/hvm/params.h>
+#include <arch_mm.h>
+#include <libfdt.h>
+
+/*
+ * This structure contains start-of-day info, such as pagetable base pointer,
+ * address of the shared_info structure, and things like that.
+ * On x86, the hypervisor passes it to us. On ARM, we fill it in ourselves.
+ */
+union start_info_union start_info_union;
+
+/*
+ * Shared page for communicating with the hypervisor.
+ * Events flags go here, for example.
+ */
+shared_info_t *HYPERVISOR_shared_info;
+
+extern char shared_info_page[PAGE_SIZE];
+
+void *device_tree;
+
+static int hvm_get_parameter(int idx, uint64_t *value)
+{
+    struct xen_hvm_param xhv;
+    int ret;
+
+    xhv.domid = DOMID_SELF;
+    xhv.index = idx;
+    ret = HYPERVISOR_hvm_op(HVMOP_get_param, &xhv);
+    if (ret < 0) {
+        BUG();
+    }
+    *value = xhv.value;
+    return ret;
+}
+
+static void get_console(void)
+{
+    uint64_t v = -1;
+
+    hvm_get_parameter(HVM_PARAM_CONSOLE_EVTCHN, &v);
+    start_info.console.domU.evtchn = v;
+
+    hvm_get_parameter(HVM_PARAM_CONSOLE_PFN, &v);
+    start_info.console.domU.mfn = v;
+
+    printk("Console is on port %d\n", start_info.console.domU.evtchn);
+    printk("Console ring is at mfn %lx\n", (unsigned long) 
start_info.console.domU.mfn);
+}
+
+void get_xenbus(void)
+{
+    uint64_t value;
+
+    if (hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &value))
+        BUG();
+
+    start_info.store_evtchn = (int)value;
+
+    if(hvm_get_parameter(HVM_PARAM_STORE_PFN, &value))
+        BUG();
+    start_info.store_mfn = (unsigned long)value;
+}
+
+/*
+ * INITIAL C ENTRY POINT.
+ */
+void arch_init(void *dtb_pointer, uint32_t physical_offset)
+{
+    struct xen_add_to_physmap xatp;
+    int r;
+
+    memset(&__bss_start, 0, &_end - &__bss_start);
+
+    physical_address_offset = physical_offset;
+
+    xprintk("Virtual -> physical offset = %x\n", physical_address_offset);
+
+    xprintk("Checking DTB at %p...\n", dtb_pointer);
+
+    if ((r = fdt_check_header(dtb_pointer))) {
+        xprintk("Invalid DTB from Xen: %s\n", fdt_strerror(r));
+        BUG();
+    }
+    device_tree = dtb_pointer;
+
+    /* Map shared_info page */
+    xatp.domid = DOMID_SELF;
+    xatp.idx = 0;
+    xatp.space = XENMAPSPACE_shared_info;
+    xatp.gpfn = virt_to_pfn(shared_info_page);
+    if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp) != 0)
+        BUG();
+    HYPERVISOR_shared_info = (struct shared_info *)shared_info_page;
+
+    /* Fill in start_info */
+    get_console();
+    get_xenbus();
+
+    gic_init();
+
+    start_kernel();
+}
+
+void
+arch_fini(void)
+{
+}
+
+void
+arch_do_exit(void)
+{
+}
diff --git a/extras/mini-os-intree/arch/arm/time.c 
b/extras/mini-os-intree/arch/arm/time.c
new file mode 100644
index 0000000..a088981
--- /dev/null
+++ b/extras/mini-os-intree/arch/arm/time.c
@@ -0,0 +1,136 @@
+#include <mini-os/os.h>
+#include <mini-os/hypervisor.h>
+#include <mini-os/events.h>
+#include <mini-os/traps.h>
+#include <mini-os/types.h>
+#include <mini-os/time.h>
+#include <mini-os/lib.h>
+
+//#define VTIMER_DEBUG
+#ifdef VTIMER_DEBUG
+#define DEBUG(_f, _a...) \
+    printk("MINI_OS(file=vtimer.c, line=%d) " _f , __LINE__, ## _a)
+#else
+#define DEBUG(_f, _a...)    ((void)0)
+#endif
+
+/************************************************************************
+ * Time functions
+ *************************************************************************/
+
+static uint64_t cntvct_at_init;
+static uint32_t counter_freq;
+
+/* Compute with 96 bit intermediate result: (a*b)/c */
+uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
+{
+    union {
+        uint64_t ll;
+        struct {
+            uint32_t low, high;
+        } l;
+    } u, res;
+    uint64_t rl, rh;
+
+    u.ll = a;
+    rl = (uint64_t)u.l.low * (uint64_t)b;
+    rh = (uint64_t)u.l.high * (uint64_t)b;
+    rh += (rl >> 32);
+    res.l.high = rh / c;
+    res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
+    return res.ll;
+}
+
+static inline s_time_t ticks_to_ns(uint64_t ticks)
+{
+    return muldiv64(ticks, SECONDS(1), counter_freq);
+}
+
+static inline uint64_t ns_to_ticks(s_time_t ns)
+{
+    return muldiv64(ns, counter_freq, SECONDS(1));
+}
+
+/* Wall-clock time is not currently available on ARM, so this is always zero 
for now:
+ * http://wiki.xenproject.org/wiki/Xen_ARM_TODO#Expose_Wallclock_time_to_guests
+ */
+static struct timespec shadow_ts;
+
+static inline uint64_t read_virtual_count(void)
+{
+    uint32_t c_lo, c_hi;
+    __asm__ __volatile__("mrrc p15, 1, %0, %1, c14":"=r"(c_lo), "=r"(c_hi));
+    return (((uint64_t) c_hi) << 32) + c_lo;
+}
+
+/* monotonic_clock(): returns # of nanoseconds passed since time_init()
+ *        Note: This function is required to return accurate
+ *        time even in the absence of multiple timer ticks.
+ */
+uint64_t monotonic_clock(void)
+{
+    return ticks_to_ns(read_virtual_count() - cntvct_at_init);
+}
+
+int gettimeofday(struct timeval *tv, void *tz)
+{
+    uint64_t nsec = monotonic_clock();
+    nsec += shadow_ts.tv_nsec;
+
+    tv->tv_sec = shadow_ts.tv_sec;
+    tv->tv_sec += NSEC_TO_SEC(nsec);
+    tv->tv_usec = NSEC_TO_USEC(nsec % 1000000000UL);
+
+    return 0;
+}
+
+/* Set the timer and mask. */
+void write_timer_ctl(uint32_t value) {
+    __asm__ __volatile__(
+            "mcr p15, 0, %0, c14, c3, 1\n"
+            "isb"::"r"(value));
+}
+
+void set_vtimer_compare(uint64_t value) {
+    DEBUG("New CompareValue : %llx\n", value);
+
+    __asm__ __volatile__("mcrr p15, 3, %0, %H0, c14"
+            ::"r"(value));
+
+    /* Enable timer and unmask the output signal */
+    write_timer_ctl(1);
+}
+
+void unset_vtimer_compare(void) {
+    /* Disable timer and mask the output signal */
+    write_timer_ctl(2);
+}
+
+void block_domain(s_time_t until)
+{
+    uint64_t until_count = ns_to_ticks(until) + cntvct_at_init;
+    ASSERT(irqs_disabled());
+    if (read_virtual_count() < until_count)
+    {
+        set_vtimer_compare(until_count);
+        __asm__ __volatile__("wfi");
+        unset_vtimer_compare();
+
+        /* Give the IRQ handler a chance to handle whatever woke us up. */
+        local_irq_enable();
+        local_irq_disable();
+    }
+}
+
+void init_time(void)
+{
+    printk("Initialising timer interface\n");
+
+    __asm__ __volatile__("mrc p15, 0, %0, c14, c0, 0":"=r"(counter_freq));
+    cntvct_at_init = read_virtual_count();
+    printk("Virtual Count register is %llx, freq = %d Hz\n", cntvct_at_init, 
counter_freq);
+}
+
+void fini_time(void)
+{
+}
diff --git a/extras/mini-os-intree/arch/x86/Makefile 
b/extras/mini-os-intree/arch/x86/Makefile
new file mode 100644
index 0000000..9f04a93
--- /dev/null
+++ b/extras/mini-os-intree/arch/x86/Makefile
@@ -0,0 +1,30 @@
+#
+# x86 architecture specific makefiles.
+# It's is used for x86_32, x86_32y and x86_64
+#
+
+TOPLEVEL_DIR = $(CURDIR)/../..
+include ../../Config.mk
+
+# include arch.mk has to be before mini-os.mk!
+
+include arch.mk
+include ../../minios.mk
+
+# Sources here are all *.c *.S without $(MINIOS_TARGET_ARCH).S
+# This is handled in $(HEAD_ARCH_OBJ)
+ARCH_SRCS := $(wildcard *.c)
+
+# The objects built from the sources.
+ARCH_OBJS := $(patsubst %.c,$(OBJ_DIR)/%.o,$(ARCH_SRCS))
+
+all: $(OBJ_DIR)/$(ARCH_LIB)
+
+# $(HEAD_ARCH_OBJ) is only build here, needed on linking
+# in ../../Makefile.
+$(OBJ_DIR)/$(ARCH_LIB): $(ARCH_OBJS) $(OBJ_DIR)/$(HEAD_ARCH_OBJ)
+       $(AR) rv $(OBJ_DIR)/$(ARCH_LIB) $(ARCH_OBJS)
+
+clean:
+       rm -f $(OBJ_DIR)/$(ARCH_LIB) $(ARCH_OBJS) $(OBJ_DIR)/$(HEAD_ARCH_OBJ)
+
diff --git a/extras/mini-os-intree/arch/x86/arch.mk 
b/extras/mini-os-intree/arch/x86/arch.mk
new file mode 100644
index 0000000..81e8118
--- /dev/null
+++ b/extras/mini-os-intree/arch/x86/arch.mk
@@ -0,0 +1,22 @@
+#
+# Architecture special makerules for x86 family
+# (including x86_32, x86_32y and x86_64).
+#
+
+ifeq ($(MINIOS_TARGET_ARCH),x86_32)
+ARCH_CFLAGS  := -m32 -march=i686
+ARCH_LDFLAGS := -m elf_i386
+ARCH_ASFLAGS := -m32
+EXTRA_INC += $(TARGET_ARCH_FAM)/$(MINIOS_TARGET_ARCH)
+EXTRA_SRC += arch/$(EXTRA_INC)
+endif
+
+ifeq ($(MINIOS_TARGET_ARCH),x86_64)
+ARCH_CFLAGS := -m64 -mno-red-zone -fno-reorder-blocks
+ARCH_CFLAGS += -fno-asynchronous-unwind-tables
+ARCH_ASFLAGS := -m64
+ARCH_LDFLAGS := -m elf_x86_64
+EXTRA_INC += $(TARGET_ARCH_FAM)/$(MINIOS_TARGET_ARCH)
+EXTRA_SRC += arch/$(EXTRA_INC)
+endif
+
diff --git a/extras/mini-os-intree/arch/x86/events.c 
b/extras/mini-os-intree/arch/x86/events.c
new file mode 100644
index 0000000..5198cf3
--- /dev/null
+++ b/extras/mini-os-intree/arch/x86/events.c
@@ -0,0 +1,35 @@
+#include <mini-os/os.h>
+#include <mini-os/mm.h>
+#include <mini-os/events.h>
+
+#if defined(__x86_64__)
+char irqstack[2 * STACK_SIZE];
+
+static struct pda
+{
+    int irqcount;       /* offset 0 (used in x86_64.S) */
+    char *irqstackptr;  /*        8 */
+} cpu0_pda;
+#endif
+
+void arch_init_events(void)
+{
+#if defined(__x86_64__)
+    asm volatile("movl %0,%%fs ; movl %0,%%gs" :: "r" (0));
+    wrmsrl(0xc0000101, &cpu0_pda); /* 0xc0000101 is MSR_GS_BASE */
+    cpu0_pda.irqcount = -1;
+    cpu0_pda.irqstackptr = (void*) (((unsigned long)irqstack + 2 * STACK_SIZE)
+                                    & ~(STACK_SIZE - 1));
+#endif
+}
+
+void arch_unbind_ports(void)
+{
+}
+
+void arch_fini_events(void)
+{
+#if defined(__x86_64__)
+    wrmsrl(0xc0000101, NULL); /* 0xc0000101 is MSR_GS_BASE */
+#endif
+}
diff --git a/extras/mini-os-intree/arch/x86/ioremap.c 
b/extras/mini-os-intree/arch/x86/ioremap.c
new file mode 100644
index 0000000..4384b1c
--- /dev/null
+++ b/extras/mini-os-intree/arch/x86/ioremap.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2009,  Netronome Systems, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+
+#include <mini-os/types.h>
+#include <mini-os/lib.h>
+#include <mini-os/xmalloc.h>
+#include <mini-os/mm.h>
+#include <mini-os/ioremap.h>
+
+/* Map a physical address range into virtual address space with provided
+ * flags. Return a virtual address range it is mapped to. */
+static void *__do_ioremap(unsigned long phys_addr, unsigned long size,
+                          unsigned long prot)
+{
+    unsigned long va;
+    unsigned long mfns, mfn;
+    unsigned long num_pages, offset;
+
+    /* allow non page aligned addresses but for mapping we need to align them 
*/
+    offset = (phys_addr & ~PAGE_MASK);
+    num_pages = (offset + size + PAGE_SIZE - 1) / PAGE_SIZE;
+    phys_addr &= PAGE_MASK;
+    mfns = mfn = phys_addr >> PAGE_SHIFT;
+
+    va = (unsigned long)map_frames_ex(&mfns, num_pages, 0, 1, 1,
+                                      DOMID_IO, NULL, prot);
+    return (void *)(va + offset);
+}
+
+void *ioremap(unsigned long phys_addr, unsigned long size)
+{
+    return __do_ioremap(phys_addr, size, IO_PROT);
+}
+
+void *ioremap_nocache(unsigned long phys_addr, unsigned long size)
+{
+    return __do_ioremap(phys_addr, size, IO_PROT_NOCACHE);
+}
+
+/* Un-map the io-remapped region. Currently no list of existing mappings is
+ * maintained, so the caller has to supply the size */
+void iounmap(void *virt_addr, unsigned long size)
+{
+    unsigned long num_pages;
+    unsigned long va = (unsigned long)virt_addr;
+
+    /* work out number of frames to unmap */
+    num_pages = ((va & ~PAGE_MASK) + size + PAGE_SIZE - 1) / PAGE_SIZE;
+
+    unmap_frames(va & PAGE_MASK, num_pages);
+}
+
+
+
+/* -*-  Mode:C; c-basic-offset:4; tab-width:4 indent-tabs-mode:nil -*- */
diff --git a/extras/mini-os-intree/arch/x86/iorw.c 
b/extras/mini-os-intree/arch/x86/iorw.c
new file mode 100644
index 0000000..3080769
--- /dev/null
+++ b/extras/mini-os-intree/arch/x86/iorw.c
@@ -0,0 +1,35 @@
+#include <mini-os/iorw.h>
+
+void iowrite8(volatile void* addr, uint8_t val)
+{
+   *((volatile uint8_t*)addr) = val;
+}
+void iowrite16(volatile void* addr, uint16_t val)
+{
+   *((volatile uint16_t*)addr) = val;
+}
+void iowrite32(volatile void* addr, uint32_t val)
+{
+   *((volatile uint32_t*)addr) = val;
+}
+void iowrite64(volatile void* addr, uint64_t val)
+{
+   *((volatile uint64_t*)addr) = val;
+}
+
+uint8_t ioread8(volatile void* addr)
+{
+   return *((volatile uint8_t*) addr);
+}
+uint16_t ioread16(volatile void* addr)
+{
+   return *((volatile uint16_t*) addr);
+}
+uint32_t ioread32(volatile void* addr)
+{
+   return *((volatile uint32_t*) addr);
+}
+uint64_t ioread64(volatile void* addr)
+{
+   return *((volatile uint64_t*) addr);
+}
diff --git a/extras/mini-os-intree/arch/x86/minios-x86_32.lds 
b/extras/mini-os-intree/arch/x86/minios-x86_32.lds
new file mode 100644
index 0000000..f5cabb6
--- /dev/null
+++ b/extras/mini-os-intree/arch/x86/minios-x86_32.lds
@@ -0,0 +1,74 @@
+OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
+OUTPUT_ARCH(i386)
+ENTRY(_start)
+SECTIONS
+{
+  . = 0x0;
+  _text = .;                   /* Text and read-only data */
+  .text : {
+       *(.text)
+       *(.gnu.warning)
+       } = 0x9090
+
+  _etext = .;                  /* End of text section */
+
+  .rodata : { *(.rodata) *(.rodata.*) }
+  . = ALIGN(4096);
+  _erodata = .;
+
+  /* newlib initialization functions */
+  . = ALIGN(32 / 8);
+  PROVIDE (__preinit_array_start = .);
+  .preinit_array     : { *(.preinit_array) }
+  PROVIDE (__preinit_array_end = .);
+  PROVIDE (__init_array_start = .);
+  .init_array     : { *(.init_array) }
+  PROVIDE (__init_array_end = .);
+  PROVIDE (__fini_array_start = .);
+  .fini_array     : { *(.fini_array) }
+  PROVIDE (__fini_array_end = .);
+
+  .ctors : {
+        __CTOR_LIST__ = .;
+        *(.ctors)
+       CONSTRUCTORS
+        LONG(0)
+        __CTOR_END__ = .;
+        }
+
+  .dtors : {
+        __DTOR_LIST__ = .;
+        *(.dtors)
+        LONG(0)
+        __DTOR_END__ = .;
+        }
+
+  .data : {                    /* Data */
+       *(.data)
+       }
+
+  _edata = .;                  /* End of data section */
+
+  __bss_start = .;             /* BSS */
+  .bss : {
+       *(.bss)
+        *(.app.bss)
+       }
+  _end = . ;
+
+  /* Sections to be discarded */
+  /DISCARD/ : {
+       *(.text.exit)
+       *(.data.exit)
+       *(.exitcall.exit)
+       }
+
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+}
diff --git a/extras/mini-os-intree/arch/x86/minios-x86_64.lds 
b/extras/mini-os-intree/arch/x86/minios-x86_64.lds
new file mode 100644
index 0000000..3da0a9f
--- /dev/null
+++ b/extras/mini-os-intree/arch/x86/minios-x86_64.lds
@@ -0,0 +1,74 @@
+OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
+OUTPUT_ARCH(i386:x86-64)
+ENTRY(_start)
+SECTIONS
+{
+  . = 0x0;
+  _text = .;                   /* Text and read-only data */
+  .text : {
+       *(.text)
+       *(.gnu.warning)
+       } = 0x9090
+
+  _etext = .;                  /* End of text section */
+
+  .rodata : { *(.rodata) *(.rodata.*) }
+  . = ALIGN(4096);
+  _erodata = .;
+
+  /* newlib initialization functions */
+  . = ALIGN(64 / 8);
+  PROVIDE (__preinit_array_start = .);
+  .preinit_array     : { *(.preinit_array) }
+  PROVIDE (__preinit_array_end = .);
+  PROVIDE (__init_array_start = .);
+  .init_array     : { *(.init_array) }
+  PROVIDE (__init_array_end = .);
+  PROVIDE (__fini_array_start = .);
+  .fini_array     : { *(.fini_array) }
+  PROVIDE (__fini_array_end = .);
+
+  .ctors : {
+        __CTOR_LIST__ = .;
+        *(.ctors)
+       CONSTRUCTORS
+        QUAD(0)
+        __CTOR_END__ = .;
+        }
+
+  .dtors : {
+        __DTOR_LIST__ = .;
+        *(.dtors)
+        QUAD(0)
+        __DTOR_END__ = .;
+        }
+
+  .data : {                    /* Data */
+       *(.data)
+       }
+
+  _edata = .;                  /* End of data section */
+
+  __bss_start = .;             /* BSS */
+  .bss : {
+       *(.bss)
+        *(.app.bss)
+       }
+  _end = . ;
+
+  /* Sections to be discarded */
+  /DISCARD/ : {
+       *(.text.exit)
+       *(.data.exit)
+       *(.exitcall.exit)
+       }
+
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+}
diff --git a/extras/mini-os-intree/arch/x86/mm.c 
b/extras/mini-os-intree/arch/x86/mm.c
new file mode 100644
index 0000000..9c6d1b8
--- /dev/null
+++ b/extras/mini-os-intree/arch/x86/mm.c
@@ -0,0 +1,957 @@
+/*
+ ****************************************************************************
+ * (C) 2003 - Rolf Neugebauer - Intel Research Cambridge
+ * (C) 2005 - Grzegorz Milos - Intel Research Cambridge
+ ****************************************************************************
+ *
+ *        File: mm.c
+ *      Author: Rolf Neugebauer (neugebar@xxxxxxxxxxxxx)
+ *     Changes: Grzegorz Milos
+ *
+ *        Date: Aug 2003, chages Aug 2005
+ *
+ * Environment: Xen Minimal OS
+ * Description: memory management related functions
+ *              contains buddy page allocator from Xen.
+ *
+ ****************************************************************************
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include <mini-os/os.h>
+#include <mini-os/hypervisor.h>
+#include <mini-os/mm.h>
+#include <mini-os/types.h>
+#include <mini-os/lib.h>
+#include <mini-os/xmalloc.h>
+#include <xen/memory.h>
+
+#ifdef MM_DEBUG
+#define DEBUG(_f, _a...) \
+    printk("MINI_OS(file=mm.c, line=%d) " _f "\n", __LINE__, ## _a)
+#else
+#define DEBUG(_f, _a...)    ((void)0)
+#endif
+
+unsigned long *phys_to_machine_mapping;
+unsigned long mfn_zero;
+extern char stack[];
+extern void page_walk(unsigned long va);
+
+/*
+ * Make pt_pfn a new 'level' page table frame and hook it into the page
+ * table at offset in previous level MFN (pref_l_mfn). pt_pfn is a guest
+ * PFN.
+ */
+static void new_pt_frame(unsigned long *pt_pfn, unsigned long prev_l_mfn,
+                         unsigned long offset, unsigned long level)
+{
+    pgentry_t *tab = (pgentry_t *)start_info.pt_base;
+    unsigned long pt_page = (unsigned long)pfn_to_virt(*pt_pfn);
+    pgentry_t prot_e, prot_t;
+    mmu_update_t mmu_updates[1];
+    int rc;
+
+    prot_e = prot_t = 0;
+    DEBUG("Allocating new L%d pt frame for pfn=%lx, "
+          "prev_l_mfn=%lx, offset=%lx",
+          level, *pt_pfn, prev_l_mfn, offset);
+
+    /* We need to clear the page, otherwise we might fail to map it
+       as a page table page */
+    memset((void*) pt_page, 0, PAGE_SIZE);
+
+    switch ( level )
+    {
+    case L1_FRAME:
+        prot_e = L1_PROT;
+        prot_t = L2_PROT;
+        break;
+    case L2_FRAME:
+        prot_e = L2_PROT;
+        prot_t = L3_PROT;
+        break;
+#if defined(__x86_64__)
+    case L3_FRAME:
+        prot_e = L3_PROT;
+        prot_t = L4_PROT;
+        break;
+#endif
+    default:
+        printk("new_pt_frame() called with invalid level number %d\n", level);
+        do_exit();
+        break;
+    }
+
+    /* Make PFN a page table page */
+#if defined(__x86_64__)
+    tab = pte_to_virt(tab[l4_table_offset(pt_page)]);
+#endif
+    tab = pte_to_virt(tab[l3_table_offset(pt_page)]);
+
+    mmu_updates[0].ptr = (tab[l2_table_offset(pt_page)] & PAGE_MASK) +
+        sizeof(pgentry_t) * l1_table_offset(pt_page);
+    mmu_updates[0].val = (pgentry_t)pfn_to_mfn(*pt_pfn) << PAGE_SHIFT |
+        (prot_e & ~_PAGE_RW);
+
+    if ( (rc = HYPERVISOR_mmu_update(mmu_updates, 1, NULL, DOMID_SELF)) < 0 )
+    {
+        printk("ERROR: PTE for new page table page could not be updated\n");
+        printk("       mmu_update failed with rc=%d\n", rc);
+        do_exit();
+    }
+
+    /* Hook the new page table page into the hierarchy */
+    mmu_updates[0].ptr =
+        ((pgentry_t)prev_l_mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset;
+    mmu_updates[0].val = (pgentry_t)pfn_to_mfn(*pt_pfn) << PAGE_SHIFT | prot_t;
+
+    if ( (rc = HYPERVISOR_mmu_update(mmu_updates, 1, NULL, DOMID_SELF)) < 0 )
+    {
+        printk("ERROR: mmu_update failed with rc=%d\n", rc);
+        do_exit();
+    }
+
+    *pt_pfn += 1;
+}
+
+/*
+ * Checks if a pagetable frame is needed at 'level' to map a given
+ * address. Note, this function is specific to the initial page table
+ * building.
+ */
+static int need_pt_frame(unsigned long va, int level)
+{
+    unsigned long hyp_virt_start = HYPERVISOR_VIRT_START;
+#if defined(__x86_64__)
+    unsigned long hyp_virt_end = HYPERVISOR_VIRT_END;
+#else
+    unsigned long hyp_virt_end = 0xffffffff;
+#endif
+
+    /* In general frames will _not_ be needed if they were already
+       allocated to map the hypervisor into our VA space */
+#if defined(__x86_64__)
+    if ( level == L3_FRAME )
+    {
+        if ( l4_table_offset(va) >=
+             l4_table_offset(hyp_virt_start) &&
+             l4_table_offset(va) <=
+             l4_table_offset(hyp_virt_end))
+            return 0;
+        return 1;
+    }
+    else
+#endif
+
+    if ( level == L2_FRAME )
+    {
+#if defined(__x86_64__)
+        if ( l4_table_offset(va) >=
+             l4_table_offset(hyp_virt_start) &&
+             l4_table_offset(va) <=
+             l4_table_offset(hyp_virt_end))
+#endif
+            if ( l3_table_offset(va) >=
+                 l3_table_offset(hyp_virt_start) &&
+                 l3_table_offset(va) <=
+                 l3_table_offset(hyp_virt_end))
+                return 0;
+
+        return 1;
+    }
+    else
+        /* Always need l1 frames */
+        if ( level == L1_FRAME )
+            return 1;
+
+    printk("ERROR: Unknown frame level %d, hypervisor %llx,%llx\n",
+           level, hyp_virt_start, hyp_virt_end);
+    return -1;
+}
+
+/*
+ * Build the initial pagetable.
+ */
+static void build_pagetable(unsigned long *start_pfn, unsigned long *max_pfn)
+{
+    unsigned long start_address, end_address;
+    unsigned long pfn_to_map, pt_pfn = *start_pfn;
+    static mmu_update_t mmu_updates[L1_PAGETABLE_ENTRIES + 1];
+    pgentry_t *tab = (pgentry_t *)start_info.pt_base, page;
+    unsigned long pt_mfn = pfn_to_mfn(virt_to_pfn(start_info.pt_base));
+    unsigned long offset;
+    int count = 0;
+    int rc;
+
+    pfn_to_map =
+        (start_info.nr_pt_frames - NOT_L1_FRAMES) * L1_PAGETABLE_ENTRIES;
+
+    if ( *max_pfn >= virt_to_pfn(HYPERVISOR_VIRT_START) )
+    {
+        printk("WARNING: Mini-OS trying to use Xen virtual space. "
+               "Truncating memory from %dMB to ",
+               ((unsigned long)pfn_to_virt(*max_pfn) -
+                (unsigned long)&_text)>>20);
+        *max_pfn = virt_to_pfn(HYPERVISOR_VIRT_START - PAGE_SIZE);
+        printk("%dMB\n",
+               ((unsigned long)pfn_to_virt(*max_pfn) -
+                (unsigned long)&_text)>>20);
+    }
+
+    start_address = (unsigned long)pfn_to_virt(pfn_to_map);
+    end_address = (unsigned long)pfn_to_virt(*max_pfn);
+
+    /* We worked out the virtual memory range to map, now mapping loop */
+    printk("Mapping memory range 0x%lx - 0x%lx\n", start_address, end_address);
+
+    while ( start_address < end_address )
+    {
+        tab = (pgentry_t *)start_info.pt_base;
+        pt_mfn = pfn_to_mfn(virt_to_pfn(start_info.pt_base));
+
+#if defined(__x86_64__)
+        offset = l4_table_offset(start_address);
+        /* Need new L3 pt frame */
+        if ( !(start_address & L3_MASK) )
+            if ( need_pt_frame(start_address, L3_FRAME) )
+                new_pt_frame(&pt_pfn, pt_mfn, offset, L3_FRAME);
+
+        page = tab[offset];
+        pt_mfn = pte_to_mfn(page);
+        tab = to_virt(mfn_to_pfn(pt_mfn) << PAGE_SHIFT);
+#endif
+        offset = l3_table_offset(start_address);
+        /* Need new L2 pt frame */
+        if ( !(start_address & L2_MASK) )
+            if ( need_pt_frame(start_address, L2_FRAME) )
+                new_pt_frame(&pt_pfn, pt_mfn, offset, L2_FRAME);
+
+        page = tab[offset];
+        pt_mfn = pte_to_mfn(page);
+        tab = to_virt(mfn_to_pfn(pt_mfn) << PAGE_SHIFT);
+        offset = l2_table_offset(start_address);
+        /* Need new L1 pt frame */
+        if ( !(start_address & L1_MASK) )
+            if ( need_pt_frame(start_address, L1_FRAME) )
+                new_pt_frame(&pt_pfn, pt_mfn, offset, L1_FRAME);
+
+        page = tab[offset];
+        pt_mfn = pte_to_mfn(page);
+        offset = l1_table_offset(start_address);
+
+        mmu_updates[count].ptr =
+            ((pgentry_t)pt_mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset;
+        mmu_updates[count].val =
+            (pgentry_t)pfn_to_mfn(pfn_to_map++) << PAGE_SHIFT | L1_PROT;
+        count++;
+        if ( count == L1_PAGETABLE_ENTRIES || pfn_to_map == *max_pfn )
+        {
+            rc = HYPERVISOR_mmu_update(mmu_updates, count, NULL, DOMID_SELF);
+            if ( rc < 0 )
+            {
+                printk("ERROR: build_pagetable(): PTE could not be updated\n");
+                printk("       mmu_update failed with rc=%d\n", rc);
+                do_exit();
+            }
+            count = 0;
+        }
+        start_address += PAGE_SIZE;
+    }
+
+    *start_pfn = pt_pfn;
+}
+
+/*
+ * Mark portion of the address space read only.
+ */
+extern struct shared_info shared_info;
+static void set_readonly(void *text, void *etext)
+{
+    unsigned long start_address =
+        ((unsigned long) text + PAGE_SIZE - 1) & PAGE_MASK;
+    unsigned long end_address = (unsigned long) etext;
+    static mmu_update_t mmu_updates[L1_PAGETABLE_ENTRIES + 1];
+    pgentry_t *tab = (pgentry_t *)start_info.pt_base, page;
+    unsigned long mfn = pfn_to_mfn(virt_to_pfn(start_info.pt_base));
+    unsigned long offset;
+    int count = 0;
+    int rc;
+
+    printk("setting %p-%p readonly\n", text, etext);
+
+    while ( start_address + PAGE_SIZE <= end_address )
+    {
+        tab = (pgentry_t *)start_info.pt_base;
+        mfn = pfn_to_mfn(virt_to_pfn(start_info.pt_base));
+
+#if defined(__x86_64__)
+        offset = l4_table_offset(start_address);
+        page = tab[offset];
+        mfn = pte_to_mfn(page);
+        tab = to_virt(mfn_to_pfn(mfn) << PAGE_SHIFT);
+#endif
+        offset = l3_table_offset(start_address);
+        page = tab[offset];
+        mfn = pte_to_mfn(page);
+        tab = to_virt(mfn_to_pfn(mfn) << PAGE_SHIFT);
+        offset = l2_table_offset(start_address);
+        page = tab[offset];
+        mfn = pte_to_mfn(page);
+        tab = to_virt(mfn_to_pfn(mfn) << PAGE_SHIFT);
+
+        offset = l1_table_offset(start_address);
+
+        if ( start_address != (unsigned long)&shared_info )
+        {
+            mmu_updates[count].ptr =
+                ((pgentry_t)mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset;
+            mmu_updates[count].val = tab[offset] & ~_PAGE_RW;
+            count++;
+        }
+        else
+            printk("skipped %p\n", start_address);
+
+        start_address += PAGE_SIZE;
+
+        if ( count == L1_PAGETABLE_ENTRIES ||
+             start_address + PAGE_SIZE > end_address )
+        {
+            rc = HYPERVISOR_mmu_update(mmu_updates, count, NULL, DOMID_SELF);
+            if ( rc < 0 )
+            {
+                printk("ERROR: set_readonly(): PTE could not be updated\n");
+                do_exit();
+            }
+            count = 0;
+        }
+    }
+
+    {
+        mmuext_op_t op = {
+            .cmd = MMUEXT_TLB_FLUSH_ALL,
+        };
+        int count;
+        HYPERVISOR_mmuext_op(&op, 1, &count, DOMID_SELF);
+    }
+}
+
+/*
+ * A useful mem testing function. Write the address to every address in the
+ * range provided and read back the value. If verbose, print page walk to
+ * some VA
+ *
+ * If we get MEM_TEST_MAX_ERRORS we might as well stop
+ */
+#define MEM_TEST_MAX_ERRORS 10
+int mem_test(unsigned long *start_va, unsigned long *end_va, int verbose)
+{
+    unsigned long mask = 0x10000;
+    unsigned long *pointer;
+    int error_count = 0;
+
+    /* write values and print page walks */
+    if ( verbose && (((unsigned long)start_va) & 0xfffff) )
+    {
+        printk("MemTest Start: 0x%lx\n", start_va);
+        page_walk((unsigned long)start_va);
+    }
+    for ( pointer = start_va; pointer < end_va; pointer++ )
+    {
+        if ( verbose && !(((unsigned long)pointer) & 0xfffff) )
+        {
+            printk("Writing to %lx\n", pointer);
+            page_walk((unsigned long)pointer);
+        }
+        *pointer = (unsigned long)pointer & ~mask;
+    }
+    if ( verbose && (((unsigned long)end_va) & 0xfffff) )
+    {
+        printk("MemTest End: %lx\n", end_va-1);
+        page_walk((unsigned long)end_va-1);
+    }
+
+    /* verify values */
+    for ( pointer = start_va; pointer < end_va; pointer++ )
+    {
+        if ( ((unsigned long)pointer & ~mask) != *pointer )
+        {
+            printk("Read error at 0x%lx. Read: 0x%lx, should read 0x%lx\n",
+                   (unsigned long)pointer, *pointer,
+                   ((unsigned long)pointer & ~mask));
+            error_count++;
+            if ( error_count >= MEM_TEST_MAX_ERRORS )
+            {
+                printk("mem_test: too many errors\n");
+                return -1;
+            }
+        }
+    }
+    return 0;
+}
+
+
+/*
+ * get the PTE for virtual address va if it exists. Otherwise NULL.
+ */
+static pgentry_t *get_pgt(unsigned long va)
+{
+    unsigned long mfn;
+    pgentry_t *tab;
+    unsigned offset;
+
+    tab = (pgentry_t *)start_info.pt_base;
+    mfn = virt_to_mfn(start_info.pt_base);
+
+#if defined(__x86_64__)
+    offset = l4_table_offset(va);
+    if ( !(tab[offset] & _PAGE_PRESENT) )
+        return NULL;
+    mfn = pte_to_mfn(tab[offset]);
+    tab = mfn_to_virt(mfn);
+#endif
+    offset = l3_table_offset(va);
+    if ( !(tab[offset] & _PAGE_PRESENT) )
+        return NULL;
+    mfn = pte_to_mfn(tab[offset]);
+    tab = mfn_to_virt(mfn);
+    offset = l2_table_offset(va);
+    if ( !(tab[offset] & _PAGE_PRESENT) )
+        return NULL;
+    mfn = pte_to_mfn(tab[offset]);
+    tab = mfn_to_virt(mfn);
+    offset = l1_table_offset(va);
+    return &tab[offset];
+}
+
+
+/*
+ * return a valid PTE for a given virtual address. If PTE does not exist,
+ * allocate page-table pages.
+ */
+pgentry_t *need_pgt(unsigned long va)
+{
+    unsigned long pt_mfn;
+    pgentry_t *tab;
+    unsigned long pt_pfn;
+    unsigned offset;
+
+    tab = (pgentry_t *)start_info.pt_base;
+    pt_mfn = virt_to_mfn(start_info.pt_base);
+
+#if defined(__x86_64__)
+    offset = l4_table_offset(va);
+    if ( !(tab[offset] & _PAGE_PRESENT) )
+    {
+        pt_pfn = virt_to_pfn(alloc_page());
+        new_pt_frame(&pt_pfn, pt_mfn, offset, L3_FRAME);
+    }
+    ASSERT(tab[offset] & _PAGE_PRESENT);
+    pt_mfn = pte_to_mfn(tab[offset]);
+    tab = mfn_to_virt(pt_mfn);
+#endif
+    offset = l3_table_offset(va);
+    if ( !(tab[offset] & _PAGE_PRESENT) )
+    {
+        pt_pfn = virt_to_pfn(alloc_page());
+        new_pt_frame(&pt_pfn, pt_mfn, offset, L2_FRAME);
+    }
+    ASSERT(tab[offset] & _PAGE_PRESENT);
+    pt_mfn = pte_to_mfn(tab[offset]);
+    tab = mfn_to_virt(pt_mfn);
+    offset = l2_table_offset(va);
+    if ( !(tab[offset] & _PAGE_PRESENT) )
+    {
+        pt_pfn = virt_to_pfn(alloc_page());
+        new_pt_frame(&pt_pfn, pt_mfn, offset, L1_FRAME);
+    }
+    ASSERT(tab[offset] & _PAGE_PRESENT);
+    pt_mfn = pte_to_mfn(tab[offset]);
+    tab = mfn_to_virt(pt_mfn);
+
+    offset = l1_table_offset(va);
+    return &tab[offset];
+}
+
+/*
+ * Reserve an area of virtual address space for mappings and Heap
+ */
+static unsigned long demand_map_area_start;
+#ifdef __x86_64__
+#define DEMAND_MAP_PAGES ((128ULL << 30) / PAGE_SIZE)
+#else
+#define DEMAND_MAP_PAGES ((2ULL << 30) / PAGE_SIZE)
+#endif
+
+#ifndef HAVE_LIBC
+#define HEAP_PAGES 0
+#else
+unsigned long heap, brk, heap_mapped, heap_end;
+#ifdef __x86_64__
+#define HEAP_PAGES ((128ULL << 30) / PAGE_SIZE)
+#else
+#define HEAP_PAGES ((1ULL << 30) / PAGE_SIZE)
+#endif
+#endif

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.