mirror of
https://github.com/xen-project/xen.git
synced 2026-10-30 03:00:05 +01:00
bitkeeper revision 1.1159.170.70 (41d2ca6aDWrk2tn4J3lpl18fPLfjRA)
Remove heavily arch-dep bootstrap code from common/kernel.c
This commit is contained in:
1 parent
0fcafc5fdb
commit
5938d3a91a
7 files changed
+257
-256
No files matched your search
@@ -150,7 +150,7 @@ start_paging:
|
||||
je start_secondary
|
||||
|
||||
/* Call into main C routine. This should never return.*/
|
||||
call cmain
|
||||
call __start_xen
|
||||
ud2 /* Force a panic (invalid opcode). */
|
||||
|
||||
/* This is the default interrupt handler. */
|
||||
|
||||
+191
-1
@@ -7,6 +7,9 @@
|
||||
#include <xen/serial.h>
|
||||
#include <xen/softirq.h>
|
||||
#include <xen/acpi.h>
|
||||
#include <xen/console.h>
|
||||
#include <xen/trace.h>
|
||||
#include <xen/multiboot.h>
|
||||
#include <asm/bitops.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/processor.h>
|
||||
@@ -15,6 +18,18 @@
|
||||
#include <asm/desc.h>
|
||||
#include <asm/domain_page.h>
|
||||
#include <asm/pdb.h>
|
||||
#include <asm/shadow.h>
|
||||
|
||||
/* opt_dom0_mem: Kilobytes of memory allocated to domain 0. */
|
||||
static unsigned int opt_dom0_mem = 16000;
|
||||
integer_param("dom0_mem", opt_dom0_mem);
|
||||
|
||||
/*
|
||||
* opt_xenheap_megabytes: Size of Xen heap in megabytes, excluding the
|
||||
* pfn_info table and allocation bitmap.
|
||||
*/
|
||||
static unsigned int opt_xenheap_megabytes = XENHEAP_DEFAULT_MB;
|
||||
integer_param("xenheap_megabytes", opt_xenheap_megabytes);
|
||||
|
||||
/* opt_noht: If true, Hyperthreading is ignored. */
|
||||
int opt_noht = 0;
|
||||
@@ -37,6 +52,8 @@ boolean_param("ignorebiostables", opt_ignorebiostables);
|
||||
static int opt_watchdog = 0;
|
||||
boolean_param("watchdog", opt_watchdog);
|
||||
|
||||
unsigned long xenheap_phys_end;
|
||||
|
||||
extern void arch_init_memory(void);
|
||||
extern void init_IRQ(void);
|
||||
extern void trap_init(void);
|
||||
@@ -330,7 +347,7 @@ static void __init do_initcalls(void)
|
||||
|
||||
unsigned long pci_mem_start = 0x10000000;
|
||||
|
||||
void __init start_of_day(void)
|
||||
static void __init start_of_day(void)
|
||||
{
|
||||
unsigned long low_mem_size;
|
||||
|
||||
@@ -440,3 +457,176 @@ void __init start_of_day(void)
|
||||
|
||||
watchdog_on = 1;
|
||||
}
|
||||
|
||||
void __init __start_xen(multiboot_info_t *mbi)
|
||||
{
|
||||
unsigned long max_page;
|
||||
unsigned char *cmdline;
|
||||
module_t *mod = (module_t *)__va(mbi->mods_addr);
|
||||
void *heap_start;
|
||||
unsigned long max_mem;
|
||||
unsigned long dom0_memory_start, dom0_memory_end;
|
||||
unsigned long initial_images_start, initial_images_end;
|
||||
|
||||
/* Parse the command-line options. */
|
||||
cmdline = (unsigned char *)(mbi->cmdline ? __va(mbi->cmdline) : NULL);
|
||||
cmdline_parse(cmdline);
|
||||
|
||||
/* Must do this early -- e.g., spinlocks rely on get_current(). */
|
||||
set_current(&idle0_task);
|
||||
|
||||
/* We initialise the serial devices very early so we can get debugging. */
|
||||
serial_init_stage1();
|
||||
|
||||
init_console();
|
||||
|
||||
/* We require memory and module information. */
|
||||
if ( (mbi->flags & 9) != 9 )
|
||||
{
|
||||
printk("FATAL ERROR: Bad flags passed by bootloader: 0x%x\n",
|
||||
(unsigned)mbi->flags);
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
|
||||
if ( mbi->mods_count == 0 )
|
||||
{
|
||||
printk("Require at least one Multiboot module!\n");
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
|
||||
if ( opt_xenheap_megabytes < 4 )
|
||||
{
|
||||
printk("Xen heap size is too small to safely continue!\n");
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
|
||||
xenheap_phys_end = opt_xenheap_megabytes << 20;
|
||||
|
||||
max_mem = max_page = (mbi->mem_upper+1024) >> (PAGE_SHIFT - 10);
|
||||
|
||||
#if defined(__i386__)
|
||||
|
||||
initial_images_start = DIRECTMAP_PHYS_END;
|
||||
initial_images_end = initial_images_start +
|
||||
(mod[mbi->mods_count-1].mod_end - mod[0].mod_start);
|
||||
if ( initial_images_end > (max_page << PAGE_SHIFT) )
|
||||
{
|
||||
printk("Not enough memory to stash the DOM0 kernel image.\n");
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
memmove((void *)initial_images_start, /* use low mapping */
|
||||
(void *)mod[0].mod_start, /* use low mapping */
|
||||
mod[mbi->mods_count-1].mod_end - mod[0].mod_start);
|
||||
|
||||
if ( opt_xenheap_megabytes > XENHEAP_DEFAULT_MB )
|
||||
{
|
||||
printk("Xen heap size is limited to %dMB - you specified %dMB.\n",
|
||||
XENHEAP_DEFAULT_MB, opt_xenheap_megabytes);
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
|
||||
ASSERT((sizeof(struct pfn_info) << 20) <=
|
||||
(FRAMETABLE_VIRT_END - FRAMETABLE_VIRT_START));
|
||||
|
||||
init_frametable((void *)FRAMETABLE_VIRT_START, max_page);
|
||||
|
||||
#elif defined(__x86_64__)
|
||||
|
||||
init_frametable(__va(xenheap_phys_end), max_page);
|
||||
|
||||
initial_images_start = __pa(frame_table) + frame_table_size;
|
||||
initial_images_end = initial_images_start +
|
||||
(mod[mbi->mods_count-1].mod_end - mod[0].mod_start);
|
||||
if ( initial_images_end > (max_page << PAGE_SHIFT) )
|
||||
{
|
||||
printk("Not enough memory to stash the DOM0 kernel image.\n");
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
memmove(__va(initial_images_start),
|
||||
__va(mod[0].mod_start),
|
||||
mod[mbi->mods_count-1].mod_end - mod[0].mod_start);
|
||||
|
||||
#endif
|
||||
|
||||
dom0_memory_start = (initial_images_end + ((4<<20)-1)) & ~((4<<20)-1);
|
||||
dom0_memory_end = dom0_memory_start + (opt_dom0_mem << 10);
|
||||
dom0_memory_end = (dom0_memory_end + PAGE_SIZE - 1) & PAGE_MASK;
|
||||
|
||||
/* Cheesy sanity check: enough memory for DOM0 allocation + some slack? */
|
||||
if ( (dom0_memory_end + (8<<20)) > (max_page << PAGE_SHIFT) )
|
||||
{
|
||||
printk("Not enough memory for DOM0 memory reservation.\n");
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
|
||||
printk("Initialised %luMB memory (%lu pages) on a %luMB machine\n",
|
||||
max_page >> (20-PAGE_SHIFT), max_page,
|
||||
max_mem >> (20-PAGE_SHIFT));
|
||||
|
||||
heap_start = memguard_init(&_end);
|
||||
heap_start = __va(init_heap_allocator(__pa(heap_start), max_page));
|
||||
|
||||
init_xenheap_pages(__pa(heap_start), xenheap_phys_end);
|
||||
printk("Xen heap size is %luKB\n",
|
||||
(xenheap_phys_end-__pa(heap_start))/1024 );
|
||||
|
||||
init_domheap_pages(dom0_memory_end, max_page << PAGE_SHIFT);
|
||||
|
||||
/* Initialise the slab allocator. */
|
||||
xmem_cache_init();
|
||||
xmem_cache_sizes_init(max_page);
|
||||
|
||||
domain_startofday();
|
||||
|
||||
start_of_day();
|
||||
|
||||
grant_table_init();
|
||||
|
||||
shadow_mode_init();
|
||||
|
||||
/* Create initial domain 0. */
|
||||
dom0 = do_createdomain(0, 0);
|
||||
if ( dom0 == NULL )
|
||||
panic("Error creating domain 0\n");
|
||||
|
||||
set_bit(DF_PRIVILEGED, &dom0->flags);
|
||||
|
||||
/* Grab the DOM0 command line. Skip past the image name. */
|
||||
cmdline = (unsigned char *)(mod[0].string ? __va(mod[0].string) : NULL);
|
||||
if ( cmdline != NULL )
|
||||
{
|
||||
while ( *cmdline == ' ' ) cmdline++;
|
||||
if ( (cmdline = strchr(cmdline, ' ')) != NULL )
|
||||
while ( *cmdline == ' ' ) cmdline++;
|
||||
}
|
||||
|
||||
/*
|
||||
* We're going to setup domain0 using the module(s) that we stashed safely
|
||||
* above our heap. The second module, if present, is an initrd ramdisk.
|
||||
*/
|
||||
if ( construct_dom0(dom0, dom0_memory_start, dom0_memory_end,
|
||||
(char *)initial_images_start,
|
||||
mod[0].mod_end-mod[0].mod_start,
|
||||
(mbi->mods_count == 1) ? 0 :
|
||||
(char *)initial_images_start +
|
||||
(mod[1].mod_start-mod[0].mod_start),
|
||||
(mbi->mods_count == 1) ? 0 :
|
||||
mod[mbi->mods_count-1].mod_end - mod[1].mod_start,
|
||||
cmdline) != 0)
|
||||
panic("Could not set up DOM0 guest OS\n");
|
||||
|
||||
/* The stash space for the initial kernel image can now be freed up. */
|
||||
init_domheap_pages(__pa(frame_table) + frame_table_size,
|
||||
dom0_memory_start);
|
||||
|
||||
scrub_heap_pages();
|
||||
|
||||
init_trace_bufs();
|
||||
|
||||
/* Give up the VGA console if DOM0 is configured to grab it. */
|
||||
console_endboot(cmdline && strstr(cmdline, "tty0"));
|
||||
|
||||
domain_unpause_by_systemcontroller(current);
|
||||
domain_unpause_by_systemcontroller(dom0);
|
||||
startup_cpu_idle_loop();
|
||||
}
|
||||
@@ -22,6 +22,18 @@ rwlock_t domlist_lock = RW_LOCK_UNLOCKED;
|
||||
struct domain *domain_hash[DOMAIN_HASH_SIZE];
|
||||
struct domain *domain_list;
|
||||
|
||||
xmem_cache_t *domain_struct_cachep;
|
||||
struct domain *dom0;
|
||||
|
||||
void __init domain_startofday(void)
|
||||
{
|
||||
domain_struct_cachep = xmem_cache_create(
|
||||
"domain_cache", sizeof(struct domain),
|
||||
0, SLAB_HWCACHE_ALIGN, NULL, NULL);
|
||||
if ( domain_struct_cachep == NULL )
|
||||
panic("No slab cache for domain structs.");
|
||||
}
|
||||
|
||||
struct domain *do_createdomain(domid_t dom_id, unsigned int cpu)
|
||||
{
|
||||
struct domain *d, **pd;
|
||||
|
||||
+38
-252
@@ -7,276 +7,61 @@
|
||||
* Copyright (c) 2002-2003 K A Fraser
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <xen/config.h>
|
||||
#include <xen/init.h>
|
||||
#include <xen/lib.h>
|
||||
#include <xen/errno.h>
|
||||
#include <xen/spinlock.h>
|
||||
#include <xen/multiboot.h>
|
||||
#include <xen/sched.h>
|
||||
#include <xen/mm.h>
|
||||
#include <xen/delay.h>
|
||||
#include <xen/compile.h>
|
||||
#include <xen/console.h>
|
||||
#include <xen/serial.h>
|
||||
#include <xen/trace.h>
|
||||
#include <asm/shadow.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/domain_page.h>
|
||||
#include <public/dom0_ops.h>
|
||||
#include <xen/sched.h>
|
||||
|
||||
/* opt_dom0_mem: Kilobytes of memory allocated to domain 0. */
|
||||
static unsigned int opt_dom0_mem = 16000;
|
||||
integer_param("dom0_mem", opt_dom0_mem);
|
||||
|
||||
/*
|
||||
* opt_xenheap_megabytes: Size of Xen heap in megabytes, excluding the
|
||||
* pfn_info table and allocation bitmap.
|
||||
*/
|
||||
static unsigned int opt_xenheap_megabytes = XENHEAP_DEFAULT_MB;
|
||||
integer_param("xenheap_megabytes", opt_xenheap_megabytes);
|
||||
|
||||
unsigned long xenheap_phys_end;
|
||||
|
||||
xmem_cache_t *domain_struct_cachep;
|
||||
struct domain *dom0;
|
||||
|
||||
vm_assist_info_t vm_assist_info[MAX_VMASST_TYPE + 1];
|
||||
|
||||
void start_of_day(void);
|
||||
|
||||
void cmain(multiboot_info_t *mbi)
|
||||
void cmdline_parse(char *cmdline)
|
||||
{
|
||||
unsigned long max_page;
|
||||
unsigned char *cmdline;
|
||||
module_t *mod = (module_t *)__va(mbi->mods_addr);
|
||||
void *heap_start;
|
||||
unsigned long max_mem;
|
||||
unsigned long dom0_memory_start, dom0_memory_end;
|
||||
unsigned long initial_images_start, initial_images_end;
|
||||
unsigned char *opt_end, *opt;
|
||||
struct kernel_param *param;
|
||||
|
||||
if ( cmdline == NULL )
|
||||
return;
|
||||
|
||||
/* Parse the command-line options. */
|
||||
cmdline = (unsigned char *)(mbi->cmdline ? __va(mbi->cmdline) : NULL);
|
||||
if ( cmdline != NULL )
|
||||
while ( *cmdline == ' ' )
|
||||
cmdline++;
|
||||
cmdline = strchr(cmdline, ' '); /* skip the image name */
|
||||
while ( cmdline != NULL )
|
||||
{
|
||||
unsigned char *opt_end, *opt;
|
||||
struct kernel_param *param;
|
||||
while ( *cmdline == ' ' )
|
||||
cmdline++;
|
||||
cmdline = strchr(cmdline, ' '); /* skip the image name */
|
||||
while ( cmdline != NULL )
|
||||
if ( *cmdline == '\0' )
|
||||
break;
|
||||
opt_end = strchr(cmdline, ' ');
|
||||
if ( opt_end != NULL )
|
||||
*opt_end++ = '\0';
|
||||
opt = strchr(cmdline, '=');
|
||||
if ( opt != NULL )
|
||||
*opt++ = '\0';
|
||||
for ( param = &__setup_start; param != &__setup_end; param++ )
|
||||
{
|
||||
while ( *cmdline == ' ' )
|
||||
cmdline++;
|
||||
if ( *cmdline == '\0' )
|
||||
break;
|
||||
opt_end = strchr(cmdline, ' ');
|
||||
if ( opt_end != NULL )
|
||||
*opt_end++ = '\0';
|
||||
opt = strchr(cmdline, '=');
|
||||
if ( opt != NULL )
|
||||
*opt++ = '\0';
|
||||
for ( param = &__setup_start; param != &__setup_end; param++ )
|
||||
if ( strcmp(param->name, cmdline ) != 0 )
|
||||
continue;
|
||||
switch ( param->type )
|
||||
{
|
||||
if ( strcmp(param->name, cmdline ) != 0 )
|
||||
continue;
|
||||
switch ( param->type )
|
||||
case OPT_STR:
|
||||
if ( opt != NULL )
|
||||
{
|
||||
case OPT_STR:
|
||||
if ( opt != NULL )
|
||||
{
|
||||
strncpy(param->var, opt, param->len);
|
||||
((char *)param->var)[param->len-1] = '\0';
|
||||
}
|
||||
break;
|
||||
case OPT_UINT:
|
||||
if ( opt != NULL )
|
||||
*(unsigned int *)param->var =
|
||||
simple_strtol(opt, (char **)&opt, 0);
|
||||
break;
|
||||
case OPT_BOOL:
|
||||
*(int *)param->var = 1;
|
||||
break;
|
||||
strncpy(param->var, opt, param->len);
|
||||
((char *)param->var)[param->len-1] = '\0';
|
||||
}
|
||||
break;
|
||||
case OPT_UINT:
|
||||
if ( opt != NULL )
|
||||
*(unsigned int *)param->var =
|
||||
simple_strtol(opt, (char **)&opt, 0);
|
||||
break;
|
||||
case OPT_BOOL:
|
||||
*(int *)param->var = 1;
|
||||
break;
|
||||
}
|
||||
cmdline = opt_end;
|
||||
}
|
||||
cmdline = opt_end;
|
||||
}
|
||||
|
||||
/* Must do this early -- e.g., spinlocks rely on get_current(). */
|
||||
set_current(&idle0_task);
|
||||
|
||||
/* We initialise the serial devices very early so we can get debugging. */
|
||||
serial_init_stage1();
|
||||
|
||||
init_console();
|
||||
|
||||
/* HELLO WORLD --- start-of-day banner text. */
|
||||
printk(XEN_BANNER);
|
||||
printk(" http://www.cl.cam.ac.uk/netos/xen\n");
|
||||
printk(" University of Cambridge Computer Laboratory\n\n");
|
||||
printk(" Xen version %d.%d%s (%s@%s) (%s) %s\n",
|
||||
XEN_VERSION, XEN_SUBVERSION, XEN_EXTRAVERSION,
|
||||
XEN_COMPILE_BY, XEN_COMPILE_DOMAIN,
|
||||
XEN_COMPILER, XEN_COMPILE_DATE);
|
||||
printk(" Latest ChangeSet: %s\n\n", XEN_CHANGESET);
|
||||
set_printk_prefix("(XEN) ");
|
||||
|
||||
/* We require memory and module information. */
|
||||
if ( (mbi->flags & 9) != 9 )
|
||||
{
|
||||
printk("FATAL ERROR: Bad flags passed by bootloader: 0x%x\n",
|
||||
(unsigned)mbi->flags);
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
|
||||
if ( mbi->mods_count == 0 )
|
||||
{
|
||||
printk("Require at least one Multiboot module!\n");
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
|
||||
if ( opt_xenheap_megabytes < 4 )
|
||||
{
|
||||
printk("Xen heap size is too small to safely continue!\n");
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
|
||||
xenheap_phys_end = opt_xenheap_megabytes << 20;
|
||||
|
||||
max_mem = max_page = (mbi->mem_upper+1024) >> (PAGE_SHIFT - 10);
|
||||
|
||||
#if defined(__i386__)
|
||||
|
||||
initial_images_start = DIRECTMAP_PHYS_END;
|
||||
initial_images_end = initial_images_start +
|
||||
(mod[mbi->mods_count-1].mod_end - mod[0].mod_start);
|
||||
if ( initial_images_end > (max_page << PAGE_SHIFT) )
|
||||
{
|
||||
printk("Not enough memory to stash the DOM0 kernel image.\n");
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
memmove((void *)initial_images_start, /* use low mapping */
|
||||
(void *)mod[0].mod_start, /* use low mapping */
|
||||
mod[mbi->mods_count-1].mod_end - mod[0].mod_start);
|
||||
|
||||
if ( opt_xenheap_megabytes > XENHEAP_DEFAULT_MB )
|
||||
{
|
||||
printk("Xen heap size is limited to %dMB - you specified %dMB.\n",
|
||||
XENHEAP_DEFAULT_MB, opt_xenheap_megabytes);
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
|
||||
ASSERT((sizeof(struct pfn_info) << 20) <=
|
||||
(FRAMETABLE_VIRT_END - FRAMETABLE_VIRT_START));
|
||||
|
||||
init_frametable((void *)FRAMETABLE_VIRT_START, max_page);
|
||||
|
||||
#elif defined(__x86_64__)
|
||||
|
||||
init_frametable(__va(xenheap_phys_end), max_page);
|
||||
|
||||
initial_images_start = __pa(frame_table) + frame_table_size;
|
||||
initial_images_end = initial_images_start +
|
||||
(mod[mbi->mods_count-1].mod_end - mod[0].mod_start);
|
||||
if ( initial_images_end > (max_page << PAGE_SHIFT) )
|
||||
{
|
||||
printk("Not enough memory to stash the DOM0 kernel image.\n");
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
memmove(__va(initial_images_start),
|
||||
__va(mod[0].mod_start),
|
||||
mod[mbi->mods_count-1].mod_end - mod[0].mod_start);
|
||||
|
||||
#endif
|
||||
|
||||
dom0_memory_start = (initial_images_end + ((4<<20)-1)) & ~((4<<20)-1);
|
||||
dom0_memory_end = dom0_memory_start + (opt_dom0_mem << 10);
|
||||
dom0_memory_end = (dom0_memory_end + PAGE_SIZE - 1) & PAGE_MASK;
|
||||
|
||||
/* Cheesy sanity check: enough memory for DOM0 allocation + some slack? */
|
||||
if ( (dom0_memory_end + (8<<20)) > (max_page << PAGE_SHIFT) )
|
||||
{
|
||||
printk("Not enough memory for DOM0 memory reservation.\n");
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
|
||||
printk("Initialised %luMB memory (%lu pages) on a %luMB machine\n",
|
||||
max_page >> (20-PAGE_SHIFT), max_page,
|
||||
max_mem >> (20-PAGE_SHIFT));
|
||||
|
||||
heap_start = memguard_init(&_end);
|
||||
heap_start = __va(init_heap_allocator(__pa(heap_start), max_page));
|
||||
|
||||
init_xenheap_pages(__pa(heap_start), xenheap_phys_end);
|
||||
printk("Xen heap size is %luKB\n",
|
||||
(xenheap_phys_end-__pa(heap_start))/1024 );
|
||||
|
||||
init_domheap_pages(dom0_memory_end, max_page << PAGE_SHIFT);
|
||||
|
||||
/* Initialise the slab allocator. */
|
||||
xmem_cache_init();
|
||||
xmem_cache_sizes_init(max_page);
|
||||
|
||||
domain_struct_cachep = xmem_cache_create(
|
||||
"domain_cache", sizeof(struct domain),
|
||||
0, SLAB_HWCACHE_ALIGN, NULL, NULL);
|
||||
if ( domain_struct_cachep == NULL )
|
||||
panic("No slab cache for task structs.");
|
||||
|
||||
start_of_day();
|
||||
|
||||
grant_table_init();
|
||||
|
||||
/* Create initial domain 0. */
|
||||
dom0 = do_createdomain(0, 0);
|
||||
if ( dom0 == NULL )
|
||||
panic("Error creating domain 0\n");
|
||||
|
||||
set_bit(DF_PRIVILEGED, &dom0->flags);
|
||||
|
||||
shadow_mode_init();
|
||||
|
||||
/* Grab the DOM0 command line. Skip past the image name. */
|
||||
cmdline = (unsigned char *)(mod[0].string ? __va(mod[0].string) : NULL);
|
||||
if ( cmdline != NULL )
|
||||
{
|
||||
while ( *cmdline == ' ' ) cmdline++;
|
||||
if ( (cmdline = strchr(cmdline, ' ')) != NULL )
|
||||
while ( *cmdline == ' ' ) cmdline++;
|
||||
}
|
||||
|
||||
/*
|
||||
* We're going to setup domain0 using the module(s) that we stashed safely
|
||||
* above our heap. The second module, if present, is an initrd ramdisk.
|
||||
*/
|
||||
if ( construct_dom0(dom0, dom0_memory_start, dom0_memory_end,
|
||||
(char *)initial_images_start,
|
||||
mod[0].mod_end-mod[0].mod_start,
|
||||
(mbi->mods_count == 1) ? 0 :
|
||||
(char *)initial_images_start +
|
||||
(mod[1].mod_start-mod[0].mod_start),
|
||||
(mbi->mods_count == 1) ? 0 :
|
||||
mod[mbi->mods_count-1].mod_end - mod[1].mod_start,
|
||||
cmdline) != 0)
|
||||
panic("Could not set up DOM0 guest OS\n");
|
||||
|
||||
/* The stash space for the initial kernel image can now be freed up. */
|
||||
init_domheap_pages(__pa(frame_table) + frame_table_size,
|
||||
dom0_memory_start);
|
||||
|
||||
scrub_heap_pages();
|
||||
|
||||
init_trace_bufs();
|
||||
|
||||
/* Give up the VGA console if DOM0 is configured to grab it. */
|
||||
console_endboot(cmdline && strstr(cmdline, "tty0"));
|
||||
|
||||
domain_unpause_by_systemcontroller(current);
|
||||
domain_unpause_by_systemcontroller(dom0);
|
||||
startup_cpu_idle_loop();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -290,6 +75,7 @@ long do_xen_version(int cmd)
|
||||
return (XEN_VERSION<<16) | (XEN_SUBVERSION);
|
||||
}
|
||||
|
||||
vm_assist_info_t vm_assist_info[MAX_VMASST_TYPE + 1];
|
||||
long do_vm_assist(unsigned int cmd, unsigned int type)
|
||||
{
|
||||
return vm_assist(current, cmd, type);
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <xen/config.h>
|
||||
#include <xen/compile.h>
|
||||
#include <xen/init.h>
|
||||
#include <xen/lib.h>
|
||||
#include <xen/errno.h>
|
||||
@@ -416,6 +417,17 @@ void init_console(void)
|
||||
init_vga();
|
||||
|
||||
serial_set_rx_handler(sercon_handle, serial_rx);
|
||||
|
||||
/* HELLO WORLD --- start-of-day banner text. */
|
||||
printk(XEN_BANNER);
|
||||
printk(" http://www.cl.cam.ac.uk/netos/xen\n");
|
||||
printk(" University of Cambridge Computer Laboratory\n\n");
|
||||
printk(" Xen version %d.%d%s (%s@%s) (%s) %s\n",
|
||||
XEN_VERSION, XEN_SUBVERSION, XEN_EXTRAVERSION,
|
||||
XEN_COMPILE_BY, XEN_COMPILE_DOMAIN,
|
||||
XEN_COMPILER, XEN_COMPILE_DATE);
|
||||
printk(" Latest ChangeSet: %s\n\n", XEN_CHANGESET);
|
||||
set_printk_prefix("(XEN) ");
|
||||
}
|
||||
|
||||
void console_endboot(int disable_vga)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#ifndef __XEN_DOMAIN_H__
|
||||
#define __XEN_DOMAIN_H__
|
||||
|
||||
|
||||
extern void domain_startofday(void);
|
||||
|
||||
/*
|
||||
* Arch-specifics.
|
||||
|
||||
@@ -19,7 +19,8 @@ printk("Memory Reservation 0x%lx, %lu bytes\n", (_p), (_l))
|
||||
|
||||
struct domain;
|
||||
|
||||
/* kernel.c */
|
||||
void cmdline_parse(char *cmdline);
|
||||
|
||||
#define printk printf
|
||||
void printf(const char *format, ...);
|
||||
void panic(const char *format, ...);
|
||||
|
||||