From: Antti Kantee Date: Thu, 30 Apr 2015 10:17:20 +0000 (+0000) Subject: Shuffle bits so that multiboot isn't *the* way to boot. X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=0e0ca75d5ea8da9f5310b0f93d5b21a8b1c1123e;p=people%2Fliuw%2Frumprun.git Shuffle bits so that multiboot isn't *the* way to boot. --- diff --git a/platform/baremetal/Makefile b/platform/baremetal/Makefile index 4b82b40..7155432 100644 --- a/platform/baremetal/Makefile +++ b/platform/baremetal/Makefile @@ -36,7 +36,7 @@ endif all: app-tools include/bmk/machine rumprun.o commonlibs buildtest -OBJS_BMK-y+= intr.o clock.o kernel.o undefs.o +OBJS_BMK-y+= intr.o clock.o kernel.o multiboot.o undefs.o OBJS_BMK-y+= rumpuser.o rumpconfig.o OBJS_BMK-${HASPCI}+= rumppci.o diff --git a/platform/baremetal/arch/i386/Makefile.inc b/platform/baremetal/arch/i386/Makefile.inc index 9cee7b0..7f44935 100644 --- a/platform/baremetal/arch/i386/Makefile.inc +++ b/platform/baremetal/arch/i386/Makefile.inc @@ -1,4 +1,4 @@ -OBJS_BMK+= arch/i386/locore32.o arch/i386/machdep.o +OBJS_BMK+= arch/i386/locore32.o arch/i386/machdep.o arch/i386/boot.o LDSCRIPT= arch/i386/kern.ldscript CFLAGS+= -mno-sse -mno-mmx -march=i686 diff --git a/platform/baremetal/arch/i386/locore32.S b/platform/baremetal/arch/i386/locore32.S index 4551eaf..175d436 100644 --- a/platform/baremetal/arch/i386/locore32.S +++ b/platform/baremetal/arch/i386/locore32.S @@ -52,7 +52,7 @@ ENTRY(_start32) cmpl $MULTIBOOT_BOOTLOADER_MAGIC, %eax jne nomultiboot - call bmk_main + call bmk_cpu_boot jmp haltme nomultiboot: diff --git a/platform/baremetal/arch/i386/machdep.c b/platform/baremetal/arch/i386/machdep.c index de9d7c6..e894864 100644 --- a/platform/baremetal/arch/i386/machdep.c +++ b/platform/baremetal/arch/i386/machdep.c @@ -214,9 +214,6 @@ bmk_cpu_init(void) outb(TIMER_MODE, TIMER_RATEGEN | TIMER_16BIT); outb(TIMER_CNTR, (TIMER_HZ/HZ) & 0xff); outb(TIMER_CNTR, (TIMER_HZ/HZ) >> 8); - - /* aaand we're good to interrupt */ - spl0(); } int diff --git a/platform/baremetal/include/arch/i386/md.h b/platform/baremetal/include/arch/i386/md.h index c721f3b..35c3acb 100644 --- a/platform/baremetal/include/arch/i386/md.h +++ b/platform/baremetal/include/arch/i386/md.h @@ -73,6 +73,9 @@ hlt(void) __asm__ __volatile__("hlt"); } + +struct multiboot_info; +void bmk_cpu_boot(struct multiboot_info *); #endif /* !_LOCORE */ #endif /* _BMK..._H_ */ diff --git a/platform/baremetal/include/bmk/kernel.h b/platform/baremetal/include/bmk/kernel.h index ccc3fa6..760d1de 100644 --- a/platform/baremetal/include/bmk/kernel.h +++ b/platform/baremetal/include/bmk/kernel.h @@ -4,7 +4,8 @@ #include -#define MEMSTART 0x100000 +extern unsigned long bmk_memsize, bmk_membase; + #define PAGE_SHIFT 12 #define PAGE_SIZE (1< #include -static unsigned long bmk_membase; -static unsigned long bmk_memsize; +unsigned long bmk_membase; +unsigned long bmk_memsize; LIST_HEAD(, stackcache) cacheofstacks = LIST_HEAD_INITIALIZER(cacheofstacks); struct stackcache { @@ -156,67 +156,6 @@ bmk_platform_splx(unsigned long x) return; /* XXX */ } -static int -parsemem(uint32_t addr, uint32_t len) -{ - struct multiboot_mmap_entry *mbm; - unsigned long memsize; - unsigned long ossize, osbegin, osend; - extern char _end[], _begin[]; - uint32_t off; - - /* - * Look for our memory. We assume it's just in one chunk - * starting at MEMSTART. - */ - for (off = 0; off < len; off += mbm->size + sizeof(mbm->size)) { - mbm = (void *)(addr + off); - if (mbm->addr == MEMSTART - && mbm->type == MULTIBOOT_MEMORY_AVAILABLE) { - break; - } - } - bmk_assert(off < len); - - memsize = mbm->len; - osbegin = (unsigned long)_begin; - osend = round_page((unsigned long)_end); - ossize = osend - osbegin; - - bmk_membase = mbm->addr + ossize; - bmk_memsize = memsize - ossize; - - bmk_assert((bmk_membase & (PAGE_SIZE-1)) == 0); - - return 0; -} - -void -bmk_main(struct multiboot_info *mbi) -{ - static char cmdline[2048]; - - bmk_printf_init(bmk_cons_putc, NULL); - bmk_core_init(BMK_THREAD_STACK_PAGE_ORDER, PAGE_SIZE); - - if (bmk_strlen((char *)mbi->cmdline) > sizeof(cmdline)-1) - bmk_platform_halt("command line too long"); /* XXX */ - bmk_memcpy(cmdline, (char *)mbi->cmdline, sizeof(cmdline)); - - bmk_printf("rump kernel bare metal bootstrap\n\n"); - if ((mbi->flags & MULTIBOOT_MEMORY_INFO) == 0) { - bmk_printf("multiboot memory info not available\n"); - return; - } - if (parsemem(mbi->mmap_addr, mbi->mmap_length)) - return; - bmk_cpu_init(); - bmk_isr_init(); - - /* enough bootstrap already, jump to main thread */ - bmk_sched_init(bmk_mainthread, cmdline); -} - /* * console. quick, cheap, dirty, etc. * Should eventually keep an in-memory log. printf-debugging is currently @@ -285,6 +224,14 @@ bmk_init(void) cons_putat(' ', x % CONS_WIDTH, x / CONS_WIDTH); } +void +bmk_run(char *cmdline) +{ + + /* initialize scheduler and jump to main thread */ + bmk_sched_init(bmk_mainthread, cmdline); +} + void __attribute__((noreturn)) bmk_platform_halt(const char *panicstring) { diff --git a/platform/baremetal/multiboot.c b/platform/baremetal/multiboot.c new file mode 100644 index 0000000..8cb8cee --- /dev/null +++ b/platform/baremetal/multiboot.c @@ -0,0 +1,99 @@ +/*- + * Copyright (c) 2014 Antti Kantee. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include +#include +#include + +#define MEMSTART 0x100000 + +static int +parsemem(uint32_t addr, uint32_t len) +{ + struct multiboot_mmap_entry *mbm; + unsigned long memsize; + unsigned long ossize, osbegin, osend; + extern char _end[], _begin[]; + uint32_t off; + + /* + * Look for our memory. We assume it's just in one chunk + * starting at MEMSTART. + */ + for (off = 0; off < len; off += mbm->size + sizeof(mbm->size)) { + mbm = (void *)(addr + off); + if (mbm->addr == MEMSTART + && mbm->type == MULTIBOOT_MEMORY_AVAILABLE) { + break; + } + } + bmk_assert(off < len); + + memsize = mbm->len; + osbegin = (unsigned long)_begin; + osend = round_page((unsigned long)_end); + ossize = osend - osbegin; + + bmk_membase = mbm->addr + ossize; + bmk_memsize = memsize - ossize; + + bmk_assert((bmk_membase & (PAGE_SIZE-1)) == 0); + + return 0; +} + +char bmk_multiboot_cmdline[BMK_MULTIBOOT_CMDLINE_SIZE]; + +void +bmk_multiboot(struct multiboot_info *mbi) +{ + unsigned long cmdlinelen; + + bmk_init(); /* XXX: convert to cons_clear */ + bmk_printf_init(bmk_cons_putc, NULL); + bmk_core_init(BMK_THREAD_STACK_PAGE_ORDER, PAGE_SIZE); + + bmk_printf("rump kernel bare metal multibootstrap\n\n"); + + /* save the command line before something overwrites it */ + cmdlinelen = bmk_strlen((char *)mbi->cmdline); + if (cmdlinelen >= BMK_MULTIBOOT_CMDLINE_SIZE) + bmk_platform_halt("command line too long, " + "increase BMK_MULTIBOOT_CMDLINE_SIZE"); + bmk_strcpy(bmk_multiboot_cmdline, (char *)mbi->cmdline); + + if ((mbi->flags & MULTIBOOT_MEMORY_INFO) == 0) + bmk_platform_halt("multiboot memory info not available\n"); + + if (parsemem(mbi->mmap_addr, mbi->mmap_length) != 0) + bmk_platform_halt("multiboot memory parse failed"); + + bmk_isr_init(); +}