aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extras/mini-os/Makefile29
-rw-r--r--extras/mini-os/app.lds11
-rw-r--r--extras/mini-os/arch/ia64/minios-ia64.lds5
-rw-r--r--extras/mini-os/arch/x86/minios-x86_32.lds1
-rw-r--r--extras/mini-os/arch/x86/minios-x86_64.lds1
-rw-r--r--extras/mini-os/arch/x86/mm.c7
-rw-r--r--extras/mini-os/include/ia64/arch_mm.h2
-rw-r--r--extras/mini-os/include/lib.h1
-rw-r--r--extras/mini-os/include/mm.h2
-rw-r--r--extras/mini-os/lib/sys.c35
-rw-r--r--extras/mini-os/main.c2
-rw-r--r--extras/mini-os/mm.c12
-rw-r--r--tools/ioemu/vl.c9
13 files changed, 91 insertions, 26 deletions
diff --git a/extras/mini-os/Makefile b/extras/mini-os/Makefile
index 7cc4d0222e..4bb78a6708 100644
--- a/extras/mini-os/Makefile
+++ b/extras/mini-os/Makefile
@@ -19,6 +19,7 @@ include minios.mk
# Define some default flags for linking.
LDLIBS :=
+APP_LDLIBS :=
LDARCHLIB := -L$(TARGET_ARCH_DIR) -l$(ARCH_LIB_NAME)
LDFLAGS_FINAL := -T $(TARGET_ARCH_DIR)/minios-$(XEN_TARGET_ARCH).lds
@@ -33,6 +34,7 @@ TARGET := mini-os
SUBDIRS := lib xenbus console
# The common mini-os objects to build.
+APP_OBJS :=
OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
OBJS += $(patsubst %.c,%.o,$(wildcard lib/*.c))
OBJS += $(patsubst %.c,%.o,$(wildcard xenbus/*.c))
@@ -75,28 +77,28 @@ OBJS := $(filter-out lwip%.o $(LWO), $(OBJS))
ifeq ($(caml),y)
CAMLLIB = $(shell ocamlc -where)
-OBJS += $(CAMLDIR)/caml.o
-OBJS += $(CAMLLIB)/libasmrun.a
+APP_OBJS += main-caml.o
+APP_OBJS += $(CAMLDIR)/caml.o
+APP_OBJS += $(CAMLLIB)/libasmrun.a
CFLAGS += -I$(CAMLLIB)
-LDLIBS += -lm
-else
-OBJS := $(filter-out main-caml.o, $(OBJS))
+APP_LDLIBS += -lm
endif
+OBJS := $(filter-out main-caml.o, $(OBJS))
ifeq ($(qemu),y)
-OBJS += $(QEMUDIR)/i386-dm-stubdom/qemu.a $(QEMUDIR)/i386-dm-stubdom/libqemu.a
+APP_OBJS += $(QEMUDIR)/i386-dm-stubdom/qemu.a $(QEMUDIR)/i386-dm-stubdom/libqemu.a
CFLAGS += -DCONFIG_QEMU
endif
ifneq ($(CDIR),)
-OBJS += $(CDIR)/main.a
-LDLIBS +=
+APP_OBJS += $(CDIR)/main.a
+APP_LDLIBS +=
endif
ifeq ($(libc),y)
LDLIBS += -L$(XEN_ROOT)/stubdom/libxc -lxenctrl -lxenguest
-LDLIBS += -lpci
-LDLIBS += -lz
+APP_LDLIBS += -lpci
+APP_LDLIBS += -lz
LDLIBS += -lc
endif
@@ -104,8 +106,11 @@ ifneq ($(caml)-$(qemu)-$(CDIR)-$(lwip),---y)
OBJS := $(filter-out daytime.o, $(OBJS))
endif
-$(TARGET): links $(OBJS) arch_lib
- $(LD) -r $(LDFLAGS) $(HEAD_OBJ) $(OBJS) $(LDARCHLIB) $(LDLIBS) -o $@.o
+app.o: $(APP_OBJS) app.lds
+ $(LD) -r -d $(LDFLAGS) $^ $(APP_LDLIBS) --undefined main -o $@
+
+$(TARGET): links $(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
diff --git a/extras/mini-os/app.lds b/extras/mini-os/app.lds
new file mode 100644
index 0000000000..4a48cc8d77
--- /dev/null
+++ b/extras/mini-os/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/arch/ia64/minios-ia64.lds b/extras/mini-os/arch/ia64/minios-ia64.lds
index 96911aa3fd..0b38a34e8e 100644
--- a/extras/mini-os/arch/ia64/minios-ia64.lds
+++ b/extras/mini-os/arch/ia64/minios-ia64.lds
@@ -59,7 +59,10 @@ SECTIONS
{ *(.IA_64.unwind) }
.bss : AT(ADDR(.bss) - (((5<<(61))+0x100000000) - (1 << 20)))
- { *(.bss) }
+ {
+ *(.bss)
+ *(.app.bss)
+ }
_end = .;
diff --git a/extras/mini-os/arch/x86/minios-x86_32.lds b/extras/mini-os/arch/x86/minios-x86_32.lds
index df5301944f..9bd0b77691 100644
--- a/extras/mini-os/arch/x86/minios-x86_32.lds
+++ b/extras/mini-os/arch/x86/minios-x86_32.lds
@@ -38,6 +38,7 @@ SECTIONS
__bss_start = .; /* BSS */
.bss : {
*(.bss)
+ *(.app.bss)
}
_end = . ;
diff --git a/extras/mini-os/arch/x86/minios-x86_64.lds b/extras/mini-os/arch/x86/minios-x86_64.lds
index f93800236b..361b264c5e 100644
--- a/extras/mini-os/arch/x86/minios-x86_64.lds
+++ b/extras/mini-os/arch/x86/minios-x86_64.lds
@@ -38,6 +38,7 @@ SECTIONS
__bss_start = .; /* BSS */
.bss : {
*(.bss)
+ *(.app.bss)
}
_end = . ;
diff --git a/extras/mini-os/arch/x86/mm.c b/extras/mini-os/arch/x86/mm.c
index dd556e4741..8bc90eddea 100644
--- a/extras/mini-os/arch/x86/mm.c
+++ b/extras/mini-os/arch/x86/mm.c
@@ -556,7 +556,6 @@ void *map_frames_ex(unsigned long *f, unsigned long n, unsigned long stride,
static void clear_bootstrap(void)
{
- struct xen_memory_reservation reservation;
xen_pfn_t mfns[] = { virt_to_mfn(&shared_info) };
int n = sizeof(mfns)/sizeof(*mfns);
pte_t nullpte = { };
@@ -567,11 +566,7 @@ static void clear_bootstrap(void)
if (HYPERVISOR_update_va_mapping((unsigned long) &_text, nullpte, UVMF_INVLPG))
printk("Unable to unmap first page\n");
- set_xen_guest_handle(reservation.extent_start, mfns);
- reservation.nr_extents = n;
- reservation.extent_order = 0;
- reservation.domid = DOMID_SELF;
- if (HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation) != n)
+ if (free_physical_pages(mfns, n) != n)
printk("Unable to free bootstrap pages\n");
}
diff --git a/extras/mini-os/include/ia64/arch_mm.h b/extras/mini-os/include/ia64/arch_mm.h
index adc1da6d0f..5a1a1a9c50 100644
--- a/extras/mini-os/include/ia64/arch_mm.h
+++ b/extras/mini-os/include/ia64/arch_mm.h
@@ -38,6 +38,6 @@
#define map_frames(f, n) map_frames_ex(f, n, 1, 0, 1, DOMID_SELF, 0, 0)
/* TODO */
#define map_zero(n, a) map_frames_ex(NULL, n, 0, 0, a, DOMID_SELF, 0, 0)
-#define do_map_zero(start, n) ((void)0)
+#define do_map_zero(start, n) ASSERT(n == 0)
#endif /* __ARCH_MM_H__ */
diff --git a/extras/mini-os/include/lib.h b/extras/mini-os/include/lib.h
index 016af66670..e5997d4574 100644
--- a/extras/mini-os/include/lib.h
+++ b/extras/mini-os/include/lib.h
@@ -187,6 +187,7 @@ extern struct file {
int alloc_fd(enum fd_type type);
void close_all_files(void);
extern struct thread *main_thread;
+void sparse(unsigned long data, size_t size);
#endif
#endif /* _LIB_H_ */
diff --git a/extras/mini-os/include/mm.h b/extras/mini-os/include/mm.h
index 8396ec6b31..b76a50f2f7 100644
--- a/extras/mini-os/include/mm.h
+++ b/extras/mini-os/include/mm.h
@@ -70,4 +70,6 @@ void *map_frames_ex(unsigned long *f, unsigned long n, unsigned long stride,
extern unsigned long heap, brk, heap_mapped, heap_end;
#endif
+int free_physical_pages(xen_pfn_t *mfns, int n);
+
#endif /* _MM_H_ */
diff --git a/extras/mini-os/lib/sys.c b/extras/mini-os/lib/sys.c
index f97991bd00..efa02e5af4 100644
--- a/extras/mini-os/lib/sys.c
+++ b/extras/mini-os/lib/sys.c
@@ -1108,6 +1108,41 @@ int munmap(void *start, size_t length)
return 0;
}
+void sparse(unsigned long data, size_t size)
+{
+ unsigned long newdata;
+ xen_pfn_t *mfns;
+ int i, n;
+
+ newdata = (data + PAGE_SIZE - 1) & PAGE_MASK;
+ if (newdata - data > size)
+ return;
+ size -= newdata - data;
+ data = newdata;
+ n = size / PAGE_SIZE;
+ size = n * PAGE_SIZE;
+
+ mfns = malloc(n * sizeof(*mfns));
+ for (i = 0; i < n; i++) {
+#ifdef LIBC_DEBUG
+ int j;
+ for (j=0; j<PAGE_SIZE; j++)
+ if (((char*)data + i * PAGE_SIZE)[j]) {
+ printk("%lx is not zero!\n", data + i * PAGE_SIZE + j);
+ exit(1);
+ }
+#endif
+ mfns[i] = virtual_to_mfn(data + i * PAGE_SIZE);
+ }
+
+ printk("sparsing %ldMB at %lx\n", size >> 20, data);
+
+ munmap((void *) data, size);
+ free_physical_pages(mfns, n);
+ do_map_zero(data, n);
+}
+
+
/* Not supported by FS yet. */
unsupported_function_crash(link);
unsupported_function(int, readlink, -1);
diff --git a/extras/mini-os/main.c b/extras/mini-os/main.c
index a8b68ac902..6e67b01138 100644
--- a/extras/mini-os/main.c
+++ b/extras/mini-os/main.c
@@ -39,6 +39,7 @@ void _fini(void)
{
}
+extern char __app_bss_start, __app_bss_end;
static void call_main(void *p)
{
char *args, /**path,*/ *msg, *c;
@@ -56,6 +57,7 @@ static void call_main(void *p)
* crashing. */
//sleep(1);
+ sparse((unsigned long) &__app_bss_start, &__app_bss_end - &__app_bss_start);
start_networking();
init_fs_frontend();
diff --git a/extras/mini-os/mm.c b/extras/mini-os/mm.c
index f204fa66ec..2cc9e9db6d 100644
--- a/extras/mini-os/mm.c
+++ b/extras/mini-os/mm.c
@@ -36,6 +36,7 @@
#include <os.h>
#include <hypervisor.h>
+#include <xen/memory.h>
#include <mm.h>
#include <types.h>
#include <lib.h>
@@ -360,6 +361,17 @@ void free_pages(void *pointer, int order)
}
+int free_physical_pages(xen_pfn_t *mfns, int n)
+{
+ struct xen_memory_reservation reservation;
+
+ set_xen_guest_handle(reservation.extent_start, mfns);
+ reservation.nr_extents = n;
+ reservation.extent_order = 0;
+ reservation.domid = DOMID_SELF;
+ return HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation);
+}
+
#ifdef HAVE_LIBC
void *sbrk(ptrdiff_t increment)
{
diff --git a/tools/ioemu/vl.c b/tools/ioemu/vl.c
index 6b708c2d29..c4832f5848 100644
--- a/tools/ioemu/vl.c
+++ b/tools/ioemu/vl.c
@@ -140,9 +140,9 @@
#define MAX_IOPORTS 65536
const char *bios_dir = CONFIG_QEMU_SHAREDIR;
-void **ioport_opaque;
-IOPortReadFunc *(*ioport_read_table)[MAX_IOPORTS];
-IOPortWriteFunc *(*ioport_write_table)[MAX_IOPORTS];
+void *ioport_opaque[MAX_IOPORTS];
+IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
+IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
/* Note: bs_table[MAX_DISKS] is a dummy block driver if none available
to store the VM snapshots */
BlockDriverState *bs_table[MAX_DISKS + MAX_SCSI_DISKS + 1], *fd_table[MAX_FD];
@@ -281,9 +281,6 @@ void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
void init_ioports(void)
{
- ioport_opaque = calloc(MAX_IOPORTS, sizeof(*ioport_opaque));
- ioport_read_table = calloc(3 * MAX_IOPORTS, sizeof(**ioport_read_table));
- ioport_write_table = calloc(3 * MAX_IOPORTS, sizeof(**ioport_write_table));
}
/* size is the word size in byte */