source: trunk/packages/xen-3.1/xen-3.1/extras/mini-os/kernel.c @ 34

Last change on this file since 34 was 34, checked in by hartmans, 18 years ago

Add xen and xen-common

File size: 4.7 KB
Line 
1/******************************************************************************
2 * kernel.c
3 *
4 * Assorted crap goes here, including the initial C entry point, jumped at
5 * from head.S.
6 *
7 * Copyright (c) 2002-2003, K A Fraser & R Neugebauer
8 * Copyright (c) 2005, Grzegorz Milos, Intel Research Cambridge
9 * Copyright (c) 2006, Robert Kaiser, FH Wiesbaden
10 *
11 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to
13 * deal in the Software without restriction, including without limitation the
14 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
15 * sell copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
17 *
18 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 * DEALINGS IN THE SOFTWARE.
28 */
29
30#include <os.h>
31#include <hypervisor.h>
32#include <mm.h>
33#include <events.h>
34#include <time.h>
35#include <types.h>
36#include <lib.h>
37#include <sched.h>
38#include <xenbus.h>
39#include <gnttab.h>
40#include <netfront.h>
41#include <xen/features.h>
42#include <xen/version.h>
43
44
45u8 xen_features[XENFEAT_NR_SUBMAPS * 32];
46
47void setup_xen_features(void)
48{
49    xen_feature_info_t fi;
50    int i, j;
51
52    for (i = 0; i < XENFEAT_NR_SUBMAPS; i++) 
53    {
54        fi.submap_idx = i;
55        if (HYPERVISOR_xen_version(XENVER_get_features, &fi) < 0)
56            break;
57       
58        for (j=0; j<32; j++)
59            xen_features[i*32+j] = !!(fi.submap & 1<<j);
60    }
61}
62
63void test_xenbus(void);
64
65static void xenbus_tester(void *p)
66{
67    printk("Xenbus tests disabled, because of a Xend bug.\n");
68    /* test_xenbus(); */
69}
70
71static void periodic_thread(void *p)
72{
73    struct timeval tv;
74    printk("Periodic thread started.\n");
75    for(;;)
76    {
77        gettimeofday(&tv);
78        printk("T(s=%ld us=%ld)\n", tv.tv_sec, tv.tv_usec);
79        sleep(1000);
80    }
81}
82
83static void netfront_thread(void *p)
84{
85    init_netfront(&start_info);
86}
87
88/* This should be overridden by the application we are linked against. */
89__attribute__((weak)) int app_main(start_info_t *si)
90{
91    printk("Dummy main: start_info=%p\n", si);
92    create_thread("xenbus_tester", xenbus_tester, si);
93    create_thread("periodic_thread", periodic_thread, si);
94    create_thread("netfront", netfront_thread, si);
95    return 0;
96}
97
98/*
99 * INITIAL C ENTRY POINT.
100 */
101void start_kernel(start_info_t *si)
102{
103    static char hello[] = "Bootstrapping...\n";
104
105    (void)HYPERVISOR_console_io(CONSOLEIO_write, strlen(hello), hello);
106
107    arch_init(si);
108
109    trap_init();
110
111    /* print out some useful information  */
112    printk("Xen Minimal OS!\n");
113    printk("start_info:   %p\n",    si);
114    printk("  nr_pages:   %lu",     si->nr_pages);
115    printk("  shared_inf: %08lx\n", si->shared_info);
116    printk("  pt_base:    %p",      (void *)si->pt_base); 
117    printk("  mod_start:  0x%lx\n", si->mod_start);
118    printk("  mod_len:    %lu\n",   si->mod_len); 
119    printk("  flags:      0x%x\n",  (unsigned int)si->flags);
120    printk("  cmd_line:   %s\n", 
121           si->cmd_line ? (const char *)si->cmd_line : "NULL");
122
123    /* Set up events. */
124    init_events();
125   
126    /* ENABLE EVENT DELIVERY. This is disabled at start of day. */
127    __sti();
128
129    arch_print_info();
130
131    setup_xen_features();
132
133    /* Init memory management. */
134    init_mm();
135
136    /* Init time and timers. */
137    init_time();
138
139    /* Init the console driver. */
140    init_console();
141
142    /* Init grant tables */
143    init_gnttab();
144   
145    /* Init scheduler. */
146    init_sched();
147 
148    /* Init XenBus */
149    init_xenbus();
150
151    /* Call (possibly overridden) app_main() */
152    app_main(&start_info);
153
154    /* Everything initialised, start idle thread */
155    run_idle_thread();
156}
157
158
159/*
160 * do_exit: This is called whenever an IRET fails in entry.S.
161 * This will generally be because an application has got itself into
162 * a really bad state (probably a bad CS or SS). It must be killed.
163 * Of course, minimal OS doesn't have applications :-)
164 */
165
166void do_exit(void)
167{
168    printk("Do_exit called!\n");
169    for( ;; )
170    {
171        struct sched_shutdown sched_shutdown = { .reason = SHUTDOWN_crash };
172        HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
173    }
174}
Note: See TracBrowser for help on using the repository browser.