diff options
-rw-r--r-- | extras/mini-os/Makefile | 29 | ||||
-rw-r--r-- | extras/mini-os/include/mm.h | 7 | ||||
-rw-r--r-- | extras/mini-os/kernel.c | 11 | ||||
-rw-r--r-- | extras/mini-os/mm.c | 1 |
4 files changed, 31 insertions, 17 deletions
diff --git a/extras/mini-os/Makefile b/extras/mini-os/Makefile index 3a31e3a0d6..56eb4ff1df 100644 --- a/extras/mini-os/Makefile +++ b/extras/mini-os/Makefile @@ -6,18 +6,23 @@ include $(CURDIR)/../../Config.mk 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 @@ default: $(TARGET) 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 --git a/extras/mini-os/include/mm.h b/extras/mini-os/include/mm.h index a620bdd209..2b33c454c7 100644 --- a/extras/mini-os/include/mm.h +++ b/extras/mini-os/include/mm.h @@ -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_to_phys(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 --git a/extras/mini-os/kernel.c b/extras/mini-os/kernel.c index 3ac572a035..49dbf6034b 100644 --- a/extras/mini-os/kernel.c +++ b/extras/mini-os/kernel.c @@ -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,12 +171,15 @@ 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 --git a/extras/mini-os/mm.c b/extras/mini-os/mm.c index a008e65a0a..f1fc5448b4 100644 --- a/extras/mini-os/mm.c +++ b/extras/mini-os/mm.c @@ -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); /********************* |