[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] Remove in-tree mini-os directory
commit 7280bb923ad9853f541207f8e1aa1b4f1c513c91 Author: Wei Liu <wei.liu2@xxxxxxxxxx> AuthorDate: Fri Jan 30 16:03:18 2015 +0000 Commit: Wei Liu <wei.liu2@xxxxxxxxxx> CommitDate: Fri Feb 27 16:04:54 2015 +0000 Remove in-tree mini-os directory 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> --- 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 ----------- 221 files changed, 0 insertions(+), 40498 deletions(-) diff --git a/extras/mini-os-intree/COPYING b/extras/mini-os-intree/COPYING deleted file mode 100644 index 1d9df6c..0000000 --- a/extras/mini-os-intree/COPYING +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index e5d8ade..0000000 --- a/extras/mini-os-intree/Config.mk +++ /dev/null @@ -1,99 +0,0 @@ -# -# 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 deleted file mode 100644 index f16520e..0000000 --- a/extras/mini-os-intree/Makefile +++ /dev/null @@ -1,224 +0,0 @@ -# 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 deleted file mode 100644 index 7960314..0000000 --- a/extras/mini-os-intree/README +++ /dev/null @@ -1,46 +0,0 @@ - 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 deleted file mode 100644 index 4a48cc8..0000000 --- a/extras/mini-os-intree/app.lds +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index a08a170..0000000 --- a/extras/mini-os-intree/arch/arm/arm32.S +++ /dev/null @@ -1,294 +0,0 @@ -@ 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 deleted file mode 100644 index 441010d..0000000 --- a/extras/mini-os-intree/arch/arm/events.c +++ /dev/null @@ -1,31 +0,0 @@ -#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 deleted file mode 100644 index af8e175..0000000 --- a/extras/mini-os-intree/arch/arm/hypercalls32.S +++ /dev/null @@ -1,64 +0,0 @@ -/****************************************************************************** - * 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 deleted file mode 100755 index 9627162..0000000 --- a/extras/mini-os-intree/arch/arm/minios-arm32.lds +++ /dev/null @@ -1,83 +0,0 @@ -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 deleted file mode 100644 index efecc51..0000000 --- a/extras/mini-os-intree/arch/arm/mm.c +++ /dev/null @@ -1,139 +0,0 @@ -#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 deleted file mode 100644 index 0ac49ad..0000000 --- a/extras/mini-os-intree/arch/arm/panic.c +++ /dev/null @@ -1,98 +0,0 @@ -/****************************************************************************** - * 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 deleted file mode 100644 index 8091566..0000000 --- a/extras/mini-os-intree/arch/arm/sched.c +++ /dev/null @@ -1,47 +0,0 @@ -#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 deleted file mode 100644 index 06afe46..0000000 --- a/extras/mini-os-intree/arch/arm/setup.c +++ /dev/null @@ -1,119 +0,0 @@ -#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 deleted file mode 100644 index a088981..0000000 --- a/extras/mini-os-intree/arch/arm/time.c +++ /dev/null @@ -1,136 +0,0 @@ -#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 deleted file mode 100644 index 9f04a93..0000000 --- a/extras/mini-os-intree/arch/x86/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -# -# 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 deleted file mode 100644 index 81e8118..0000000 --- a/extras/mini-os-intree/arch/x86/arch.mk +++ /dev/null @@ -1,22 +0,0 @@ -# -# 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 deleted file mode 100644 index 5198cf3..0000000 --- a/extras/mini-os-intree/arch/x86/events.c +++ /dev/null @@ -1,35 +0,0 @@ -#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 deleted file mode 100644 index 4384b1c..0000000 --- a/extras/mini-os-intree/arch/x86/ioremap.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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 deleted file mode 100644 index 3080769..0000000 --- a/extras/mini-os-intree/arch/x86/iorw.c +++ /dev/null @@ -1,35 +0,0 @@ -#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 deleted file mode 100644 index f5cabb6..0000000 --- a/extras/mini-os-intree/arch/x86/minios-x86_32.lds +++ /dev/null @@ -1,74 +0,0 @@ -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 deleted file mode 100644 index 3da0a9f..0000000 --- a/extras/mini-os-intree/arch/x86/minios-x86_64.lds +++ /dev/null @@ -1,74 +0,0 @@ -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 deleted file mode 100644 index 9c6d1b8..0000000 --- a/extras/mini-os-intree/arch/x86/mm.c +++ /dev/null @@ -1,957 +0,0 @@ -/* - **************************************************************************** - * (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 - -void arch_init_demand_mapping_area(unsigned long cur_pfn) -{ - cur_pfn++; - - demand_map_area_start = (unsigned long) pfn_to_virt(cur_pfn); - cur_pfn += DEMAND_MAP_PAGES; - printk("Demand map pfns at %lx-%lx.\n", - demand_map_area_start, pfn_to_virt(cur_pfn)); - -#ifdef HAVE_LIBC - cur_pfn++; - heap_mapped = brk = heap = (unsigned long) pfn_to_virt(cur_pfn); - cur_pfn += HEAP_PAGES; - heap_end = (unsigned long) pfn_to_virt(cur_pfn); - printk("Heap resides at %lx-%lx.\n", brk, heap_end); -#endif -} - -unsigned long allocate_ondemand(unsigned long n, unsigned long alignment) -{ - unsigned long x; - unsigned long y = 0; - - /* Find a properly aligned run of n contiguous frames */ - for ( x = 0; - x <= DEMAND_MAP_PAGES - n; - x = (x + y + 1 + alignment - 1) & ~(alignment - 1) ) - { - unsigned long addr = demand_map_area_start + x * PAGE_SIZE; - pgentry_t *pgt = get_pgt(addr); - for ( y = 0; y < n; y++, addr += PAGE_SIZE ) - { - if ( !(addr & L1_MASK) ) - pgt = get_pgt(addr); - if ( pgt ) - { - if ( *pgt & _PAGE_PRESENT ) - break; - pgt++; - } - } - if ( y == n ) - break; - } - if ( y != n ) - { - printk("Failed to find %ld frames!\n", n); - return 0; - } - return demand_map_area_start + x * PAGE_SIZE; -} - -/* - * Map an array of MFNs contiguously into virtual address space starting at - * va. map f[i*stride]+i*increment for i in 0..n-1. - */ -#define MAP_BATCH ((STACK_SIZE / 2) / sizeof(mmu_update_t)) -void do_map_frames(unsigned long va, - const unsigned long *mfns, unsigned long n, - unsigned long stride, unsigned long incr, - domid_t id, int *err, unsigned long prot) -{ - pgentry_t *pgt = NULL; - unsigned long done = 0; - unsigned long i; - int rc; - - if ( !mfns ) - { - printk("do_map_frames: no mfns supplied\n"); - return; - } - DEBUG("va=%p n=0x%lx, mfns[0]=0x%lx stride=0x%lx incr=0x%lx prot=0x%lx\n", - va, n, mfns[0], stride, incr, prot); - - if ( err ) - memset(err, 0x00, n * sizeof(int)); - while ( done < n ) - { - unsigned long todo; - - if ( err ) - todo = 1; - else - todo = n - done; - - if ( todo > MAP_BATCH ) - todo = MAP_BATCH; - - { - mmu_update_t mmu_updates[todo]; - - for ( i = 0; i < todo; i++, va += PAGE_SIZE, pgt++) - { - if ( !pgt || !(va & L1_MASK) ) - pgt = need_pgt(va); - - mmu_updates[i].ptr = virt_to_mach(pgt) | MMU_NORMAL_PT_UPDATE; - mmu_updates[i].val = ((pgentry_t)(mfns[(done + i) * stride] + - (done + i) * incr) - << PAGE_SHIFT) | prot; - } - - rc = HYPERVISOR_mmu_update(mmu_updates, todo, NULL, id); - if ( rc < 0 ) - { - if (err) - err[done * stride] = rc; - else { - printk("Map %ld (%lx, ...) at %p failed: %d.\n", - todo, mfns[done * stride] + done * incr, va, rc); - do_exit(); - } - } - } - done += todo; - } -} - -/* - * Map an array of MFNs contiguous into virtual address space. Virtual - * addresses are allocated from the on demand area. - */ -void *map_frames_ex(const unsigned long *mfns, unsigned long n, - unsigned long stride, unsigned long incr, - unsigned long alignment, - domid_t id, int *err, unsigned long prot) -{ - unsigned long va = allocate_ondemand(n, alignment); - - if ( !va ) - return NULL; - - do_map_frames(va, mfns, n, stride, incr, id, err, prot); - - return (void *)va; -} - -/* - * Unmap nun_frames frames mapped at virtual address va. - */ -#define UNMAP_BATCH ((STACK_SIZE / 2) / sizeof(multicall_entry_t)) -int unmap_frames(unsigned long va, unsigned long num_frames) -{ - int n = UNMAP_BATCH; - multicall_entry_t call[n]; - int ret; - int i; - - ASSERT(!((unsigned long)va & ~PAGE_MASK)); - - DEBUG("va=%p, num=0x%lx\n", va, num_frames); - - while ( num_frames ) { - if ( n > num_frames ) - n = num_frames; - - for ( i = 0; i < n; i++ ) - { - int arg = 0; - /* simply update the PTE for the VA and invalidate TLB */ - call[i].op = __HYPERVISOR_update_va_mapping; - call[i].args[arg++] = va; - call[i].args[arg++] = 0; -#ifdef __i386__ - call[i].args[arg++] = 0; -#endif - call[i].args[arg++] = UVMF_INVLPG; - - va += PAGE_SIZE; - } - - ret = HYPERVISOR_multicall(call, n); - if ( ret ) - { - printk("update_va_mapping hypercall failed with rc=%d.\n", ret); - return -ret; - } - - for ( i = 0; i < n; i++ ) - { - if ( call[i].result ) - { - printk("update_va_mapping failed for with rc=%d.\n", ret); - return -(call[i].result); - } - } - num_frames -= n; - } - return 0; -} - -/* - * Allocate pages which are contiguous in machine memory. - * Returns a VA to where they are mapped or 0 on failure. - * - * addr_bits indicates if the region has restrictions on where it is - * located. Typical values are 32 (if for example PCI devices can't access - * 64bit memory) or 0 for no restrictions. - * - * Allocated pages can be freed using the page allocators free_pages() - * function. - * - * based on Linux function xen_create_contiguous_region() - */ -#define MAX_CONTIG_ORDER 9 /* 2MB */ -unsigned long alloc_contig_pages(int order, unsigned int addr_bits) -{ - unsigned long in_va, va; - unsigned long in_frames[1UL << order], out_frames, mfn; - multicall_entry_t call[1UL << order]; - unsigned int i, num_pages = 1UL << order; - int ret, exch_success; - - /* pass in num_pages 'extends' of size 1 and - * request 1 extend of size 'order */ - struct xen_memory_exchange exchange = { - .in = { - .nr_extents = num_pages, - .extent_order = 0, - .domid = DOMID_SELF - }, - .out = { - .nr_extents = 1, - .extent_order = order, - .address_bits = addr_bits, - .domid = DOMID_SELF - }, - .nr_exchanged = 0 - }; - - if ( order > MAX_CONTIG_ORDER ) - { - printk("alloc_contig_pages: order too large 0x%x > 0x%x\n", - order, MAX_CONTIG_ORDER); - return 0; - } - - /* Allocate some potentially discontiguous pages */ - in_va = alloc_pages(order); - if ( !in_va ) - { - printk("alloc_contig_pages: could not get enough pages (order=0x%x\n", - order); - return 0; - } - - /* set up arguments for exchange hyper call */ - set_xen_guest_handle(exchange.in.extent_start, in_frames); - set_xen_guest_handle(exchange.out.extent_start, &out_frames); - - /* unmap current frames, keep a list of MFNs */ - for ( i = 0; i < num_pages; i++ ) - { - int arg = 0; - - va = in_va + (PAGE_SIZE * i); - in_frames[i] = virt_to_mfn(va); - - /* update P2M mapping */ - phys_to_machine_mapping[virt_to_pfn(va)] = INVALID_P2M_ENTRY; - - /* build multi call */ - call[i].op = __HYPERVISOR_update_va_mapping; - call[i].args[arg++] = va; - call[i].args[arg++] = 0; -#ifdef __i386__ - call[i].args[arg++] = 0; -#endif - call[i].args[arg++] = UVMF_INVLPG; - } - - ret = HYPERVISOR_multicall(call, i); - if ( ret ) - { - printk("Odd, update_va_mapping hypercall failed with rc=%d.\n", ret); - return 0; - } - - /* try getting a contig range of MFNs */ - out_frames = virt_to_pfn(in_va); /* PFNs to populate */ - ret = HYPERVISOR_memory_op(XENMEM_exchange, &exchange); - if ( ret ) { - printk("mem exchanged order=0x%x failed with rc=%d, nr_exchanged=%d\n", - order, ret, exchange.nr_exchanged); - /* we still need to return the allocated pages above to the pool - * ie. map them back into the 1:1 mapping etc. so we continue but - * in the end return the pages to the page allocator and return 0. */ - exch_success = 0; - } - else - exch_success = 1; - - /* map frames into 1:1 and update p2m */ - for ( i = 0; i < num_pages; i++ ) - { - int arg = 0; - pte_t pte; - - va = in_va + (PAGE_SIZE * i); - mfn = i < exchange.nr_exchanged ? (out_frames + i) : in_frames[i]; - pte = __pte(mfn << PAGE_SHIFT | L1_PROT); - - /* update P2M mapping */ - phys_to_machine_mapping[virt_to_pfn(va)] = mfn; - - /* build multi call */ - call[i].op = __HYPERVISOR_update_va_mapping; - call[i].args[arg++] = va; -#ifdef __x86_64__ - call[i].args[arg++] = (pgentry_t)pte.pte; -#else - call[i].args[arg++] = pte.pte_low; - call[i].args[arg++] = pte.pte_high; -#endif - call[i].args[arg++] = UVMF_INVLPG; - } - ret = HYPERVISOR_multicall(call, i); - if ( ret ) - { - printk("update_va_mapping hypercall no. 2 failed with rc=%d.\n", ret); - return 0; - } - - if ( !exch_success ) - { - /* since the exchanged failed we just free the pages as well */ - free_pages((void *) in_va, order); - return 0; - } - - return in_va; -} - -/* - * Clear some of the bootstrap memory - */ -static void clear_bootstrap(void) -{ - pte_t nullpte = { }; - int rc; - - /* Use first page as the CoW zero page */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |