# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID dc213d745642690b4bbc34af951e57f0d04c2d04
# Parent cb70d4f8d7182b0d1b5bcee7044f59fbe4dc9839
Allow linking of mini-os with application-specific object code.
From: Jacob Gorm Hansen
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
extras/mini-os/Makefile | 29 +++++++++++++++++++----------
extras/mini-os/include/mm.h | 7 ++-----
extras/mini-os/kernel.c | 11 ++++++++++-
extras/mini-os/mm.c | 1 -
4 files changed, 31 insertions(+), 17 deletions(-)
diff -r cb70d4f8d718 -r dc213d745642 extras/mini-os/Makefile
--- a/extras/mini-os/Makefile Mon May 15 07:51:07 2006 +0100
+++ b/extras/mini-os/Makefile Mon May 15 16:32:09 2006 +0100
@@ -6,18 +6,23 @@ override TARGET_ARCH := $(XEN_TARGET
override TARGET_ARCH := $(XEN_TARGET_ARCH)
# NB. '-Wcast-qual' is nasty, so I omitted it.
-CFLAGS := -fno-builtin -Wall -Werror -Iinclude/ -Wredundant-decls -Wno-format
+CFLAGS := -fno-builtin -Wall -Werror -Wredundant-decls -Wno-format
CFLAGS += -Wstrict-prototypes -Wnested-externs -Wpointer-arith -Winline
+
+override CPPFLAGS := -Iinclude $(CPPFLAGS)
+ASFLAGS = -D__ASSEMBLY__
+
+LDFLAGS := -N -T minios-$(TARGET_ARCH).lds
ifeq ($(TARGET_ARCH),x86_32)
CFLAGS += -m32 -march=i686
-LDFLAGS := -m elf_i386
+LDFLAGS += -m elf_i386
endif
ifeq ($(TARGET_ARCH),x86_64)
CFLAGS += -m64 -mno-red-zone -fpic -fno-reorder-blocks
CFLAGS += -fno-asynchronous-unwind-tables
-LDFLAGS := -m elf_x86_64
+LDFLAGS += -m elf_x86_64
endif
ifeq ($(debug),y)
@@ -28,12 +33,12 @@ endif
TARGET := mini-os
-OBJS := $(TARGET_ARCH).o
-OBJS += $(patsubst %.c,%.o,$(wildcard *.c))
+HEAD := $(TARGET_ARCH).o
+OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
OBJS += $(patsubst %.c,%.o,$(wildcard lib/*.c))
OBJS += $(patsubst %.c,%.o,$(wildcard xenbus/*.c))
OBJS += $(patsubst %.c,%.o,$(wildcard console/*.c))
-
+
HDRS := $(wildcard include/*.h)
HDRS += $(wildcard include/xen/*.h)
@@ -44,21 +49,25 @@ links:
links:
[ -e include/xen ] || ln -sf ../../../xen/include/public include/xen
-$(TARGET): links $(OBJS)
- $(LD) -N -T minios-$(TARGET_ARCH).lds $(OBJS) -o $@.elf
+libminios.a: $(OBJS) $(HEAD)
+ ar r libminios.a $(HEAD) $(OBJS)
+
+$(TARGET): links libminios.a $(HEAD)
+ $(LD) $(LDFLAGS) $(HEAD) -L. -lminios -o $@.elf
gzip -f -9 -c $@.elf >$@.gz
.PHONY: clean
clean:
find . -type f -name '*.o' | xargs rm -f
rm -f *.o *~ core $(TARGET).elf $(TARGET).raw $(TARGET) $(TARGET).gz
+ rm -f libminios.a
find . -type l | xargs rm -f
%.o: %.c $(HDRS) Makefile
- $(CC) $(CFLAGS) -c $< -o $@
+ $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
%.o: %.S $(HDRS) Makefile
- $(CC) $(CFLAGS) -D__ASSEMBLY__ -c $< -o $@
+ $(CC) $(ASFLAGS) $(CPPFLAGS) -c $< -o $@
define all_sources
( find . -follow -name SCCS -prune -o -name '*.[chS]' -print )
diff -r cb70d4f8d718 -r dc213d745642 extras/mini-os/include/mm.h
--- a/extras/mini-os/include/mm.h Mon May 15 07:51:07 2006 +0100
+++ b/extras/mini-os/include/mm.h Mon May 15 16:32:09 2006 +0100
@@ -130,6 +130,7 @@
#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK)
extern unsigned long *phys_to_machine_mapping;
+extern char _text, _etext, _edata, _end;
#define pfn_to_mfn(_pfn) (phys_to_machine_mapping[(_pfn)])
static __inline__ unsigned long phys_to_machine(unsigned long phys)
{
@@ -147,11 +148,7 @@ static __inline__ unsigned long machine_
return phys;
}
-#if defined(__x86_64__)
-#define VIRT_START 0xFFFFFFFF80000000UL
-#elif defined(__i386__)
-#define VIRT_START 0xC0000000UL
-#endif
+#define VIRT_START ((unsigned long)&_text)
#define to_phys(x) ((unsigned long)(x)-VIRT_START)
#define to_virt(x) ((void *)((unsigned long)(x)+VIRT_START))
diff -r cb70d4f8d718 -r dc213d745642 extras/mini-os/kernel.c
--- a/extras/mini-os/kernel.c Mon May 15 07:51:07 2006 +0100
+++ b/extras/mini-os/kernel.c Mon May 15 16:32:09 2006 +0100
@@ -106,6 +106,12 @@ void setup_xen_features(void)
}
}
+/* This should be overridden by the application we are linked against. */
+__attribute__((weak)) int app_main(start_info_t *si)
+{
+ printk("Dummy main: start_info=%p\n", si);
+ return 0;
+}
/*
* INITIAL C ENTRY POINT.
@@ -165,11 +171,14 @@ void start_kernel(start_info_t *si)
/* Init the console driver. */
init_console();
- /* Init scheduler. */
+ /* Init scheduler. */
init_sched();
/* Init XenBus from a separate thread */
create_thread("init_xs", init_xs, NULL);
+
+ /* Call (possibly overridden) app_main() */
+ app_main(&start_info);
/* Everything initialised, start idle thread */
run_idle_thread();
diff -r cb70d4f8d718 -r dc213d745642 extras/mini-os/mm.c
--- a/extras/mini-os/mm.c Mon May 15 07:51:07 2006 +0100
+++ b/extras/mini-os/mm.c Mon May 15 16:32:09 2006 +0100
@@ -50,7 +50,6 @@
unsigned long *phys_to_machine_mapping;
extern char *stack;
-extern char _text, _etext, _edata, _end;
extern void page_walk(unsigned long virt_addr);
/*********************
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|