mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
stubdom: sparse application's BSS by linking it separately first, put
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>
This commit is contained in:
1 parent
f464d312c7
commit
28baa78877
13 files changed
+91
-26
No files matched your search
+17
-12
@@ -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
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
SECTIONS
|
||||
{
|
||||
.app.bss : {
|
||||
__app_bss_start = . ;
|
||||
*(.bss .bss.*)
|
||||
*(COMMON)
|
||||
*(.lbss .lbss.*)
|
||||
*(LARGE_COMMON)
|
||||
__app_bss_end = . ;
|
||||
}
|
||||
}
|
||||
@@ -59,7 +59,10 @@ SECTIONS
|
||||
{ *(.IA_64.unwind) }
|
||||
|
||||
.bss : AT(ADDR(.bss) - (((5<<(61))+0x100000000) - (1 << 20)))
|
||||
{ *(.bss) }
|
||||
{
|
||||
*(.bss)
|
||||
*(.app.bss)
|
||||
}
|
||||
|
||||
_end = .;
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ SECTIONS
|
||||
__bss_start = .; /* BSS */
|
||||
.bss : {
|
||||
*(.bss)
|
||||
*(.app.bss)
|
||||
}
|
||||
_end = . ;
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ SECTIONS
|
||||
__bss_start = .; /* BSS */
|
||||
.bss : {
|
||||
*(.bss)
|
||||
*(.app.bss)
|
||||
}
|
||||
_end = . ;
|
||||
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
@@ -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__ */
|
||||
@@ -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_ */
|
||||
@@ -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_ */
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
+3
-6
@@ -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 */
|
||||
|
||||