aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extras/mini-os/Makefile29
-rw-r--r--extras/mini-os/include/mm.h7
-rw-r--r--extras/mini-os/kernel.c11
-rw-r--r--extras/mini-os/mm.c1
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);
/*********************