]> xenbits.xensource.com Git - xen.git/commitdiff
stubdom: sparse application's BSS by linking it separately first, put
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 16 Apr 2008 09:05:57 +0000 (10:05 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 16 Apr 2008 09:05:57 +0000 (10:05 +0100)
markers at its beginning and end, and then link with mini-os.
That permits to stick a bit more to upstream qemu.

Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
13 files changed:
extras/mini-os/Makefile
extras/mini-os/app.lds [new file with mode: 0644]
extras/mini-os/arch/ia64/minios-ia64.lds
extras/mini-os/arch/x86/minios-x86_32.lds
extras/mini-os/arch/x86/minios-x86_64.lds
extras/mini-os/arch/x86/mm.c
extras/mini-os/include/ia64/arch_mm.h
extras/mini-os/include/lib.h
extras/mini-os/include/mm.h
extras/mini-os/lib/sys.c
extras/mini-os/main.c
extras/mini-os/mm.c
tools/ioemu/vl.c

index 7cc4d0222e141622e30cad89e91181717863a4ba..4bb78a6708bcd16130358669115960a80a55a0ca 100644 (file)
@@ -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 (file)
index 0000000..4a48cc8
--- /dev/null
@@ -0,0 +1,11 @@
+SECTIONS
+{
+        .app.bss : {
+                __app_bss_start = . ;
+                *(.bss .bss.*)
+                *(COMMON)
+                *(.lbss .lbss.*)
+                *(LARGE_COMMON)
+                __app_bss_end = . ;
+        }
+}
index 96911aa3fd9917ba6a3a747e06375408f8842306..0b38a34e8e979acbccdfcce87668a0f3cb743871 100644 (file)
@@ -59,7 +59,10 @@ SECTIONS
   { *(.IA_64.unwind) }
 
   .bss : AT(ADDR(.bss) - (((5<<(61))+0x100000000) - (1 << 20)))
-  { *(.bss) }
+  {
+    *(.bss)
+    *(.app.bss)
+  }
 
   _end = .;
 
index df5301944f28b028fd07e0292f53414faf914031..9bd0b77691ed0e417eb7e011f8d2602e2c4980a5 100644 (file)
@@ -38,6 +38,7 @@ SECTIONS
   __bss_start = .;             /* BSS */
   .bss : {
        *(.bss)
+        *(.app.bss)
        }
   _end = . ;
 
index f93800236b5460f507a588ccd371f4d02452b3e9..361b264c5eedecf10d4878847cf46b5280a359e0 100644 (file)
@@ -38,6 +38,7 @@ SECTIONS
   __bss_start = .;             /* BSS */
   .bss : {
        *(.bss)
+        *(.app.bss)
        }
   _end = . ;
 
index dd556e47413827d53dfd878e60a7daac2b4476f2..8bc90eddea6d1463b1b92868c3e8ab9eabca0285 100644 (file)
@@ -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");
 }
 
index adc1da6d0f2df7921c972c5d5a00910f99ce5191..5a1a1a9c50b258ebbeb2016fca8b960b05fb277a 100644 (file)
@@ -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__ */
index 016af66670d3cab103b7356f35501322cbbcb197..e5997d4574bd722bd28ea35768302f3d9af36123 100644 (file)
@@ -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_ */
index 8396ec6b31e85fd55d076b7a1b411f92ef42f0f2..b76a50f2f7b92b8532546c62c5d513b97761aba5 100644 (file)
@@ -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_ */
index f97991bd006e3a67bdc7a57b9c51fbf3e17d9290..efa02e5af4a323ddbe5be3e6b2debfeaf5fe1a6a 100644 (file)
@@ -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);
index a8b68ac902020bd971c7f26ed044d77eee8ac659..6e67b01138458ac655a4bc81c150a09c255fd0d2 100644 (file)
@@ -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();
 
index f204fa66ec5b8eb5955c56c4bc7746fbf73c0ff2..2cc9e9db6dbd42ad28dd5e775e337b3322962332 100644 (file)
@@ -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)
 {
index 6b708c2d29e563471b738c484611d3fdf4c17d57..c4832f5848c824001e1feeeb0624740b1e440b5b 100644 (file)
 #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 */