~martin-decky/helenos/rcu

« back to all changes in this revision

Viewing changes to boot/arch/mips32/loader/main.c

  • Committer: Martin Decky
  • Date: 2009-08-04 11:19:19 UTC
  • Revision ID: martin@uranus.dsrg.hide.ms.mff.cuni.cz-20090804111919-evyclddlr3v5lhmp
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2005 Martin Decky
 
3
 * All rights reserved.
 
4
 *
 
5
 * Redistribution and use in source and binary forms, with or without
 
6
 * modification, are permitted provided that the following conditions
 
7
 * are met:
 
8
 *
 
9
 * - Redistributions of source code must retain the above copyright
 
10
 *   notice, this list of conditions and the following disclaimer.
 
11
 * - Redistributions in binary form must reproduce the above copyright
 
12
 *   notice, this list of conditions and the following disclaimer in the
 
13
 *   documentation and/or other materials provided with the distribution.
 
14
 * - The name of the author may not be used to endorse or promote products
 
15
 *   derived from this software without specific prior written permission.
 
16
 *
 
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 
19
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 
20
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
22
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
27
 */
 
28
 
 
29
#include "main.h" 
 
30
#include <printf.h>
 
31
#include <align.h>
 
32
#include <macros.h>
 
33
#include <string.h>
 
34
#include "msim.h"
 
35
#include "asm.h"
 
36
#include "_components.h"
 
37
 
 
38
#define KERNEL_VIRTUAL_ADDRESS 0x80100000
 
39
 
 
40
char *release = STRING(RELEASE);
 
41
 
 
42
#ifdef REVISION
 
43
        char *revision = ", revision " STRING(REVISION);
 
44
#else
 
45
        char *revision = "";
 
46
#endif
 
47
 
 
48
#ifdef TIMESTAMP
 
49
        char *timestamp = "\nBuilt on " STRING(TIMESTAMP);
 
50
#else
 
51
        char *timestamp = "";
 
52
#endif
 
53
 
 
54
/** Print version information. */
 
55
static void version_print(void)
 
56
{
 
57
        printf("HelenOS MIPS32 Bootloader\nRelease %s%s%s\nCopyright (c) 2006 HelenOS project\n", release, revision, timestamp);
 
58
}
 
59
 
 
60
void bootstrap(void)
 
61
{
 
62
        version_print();
 
63
        
 
64
        component_t components[COMPONENTS];
 
65
        init_components(components);
 
66
        
 
67
        bootinfo_t bootinfo;
 
68
        
 
69
        printf("\nMemory statistics\n");
 
70
        printf(" kernel entry point at %L\n", KERNEL_VIRTUAL_ADDRESS);
 
71
        printf(" %L: boot info structure\n", &bootinfo);
 
72
        
 
73
        unsigned int i;
 
74
        for (i = 0; i < COMPONENTS; i++)
 
75
                printf(" %L: %s image (size %d bytes)\n", components[i].start, components[i].name, components[i].size);
 
76
        
 
77
        printf("\nCopying components\n");
 
78
        
 
79
        unsigned int top = 0;
 
80
        bootinfo.cnt = 0;
 
81
        for (i = 0; i < min(COMPONENTS, TASKMAP_MAX_RECORDS); i++) {
 
82
                printf(" %s...", components[i].name);
 
83
                top = ALIGN_UP(top, PAGE_SIZE);
 
84
                memcpy(((void *) KERNEL_VIRTUAL_ADDRESS) + top, components[i].start, components[i].size);
 
85
                if (i > 0) {
 
86
                        bootinfo.tasks[bootinfo.cnt].addr = ((void *) KERNEL_VIRTUAL_ADDRESS) + top;
 
87
                        bootinfo.tasks[bootinfo.cnt].size = components[i].size;
 
88
                        strncpy(bootinfo.tasks[bootinfo.cnt].name,
 
89
                            components[i].name, BOOTINFO_TASK_NAME_BUFLEN);
 
90
                        bootinfo.cnt++;
 
91
                }
 
92
                top += components[i].size;
 
93
                printf("done.\n");
 
94
        }
 
95
        
 
96
        unsigned int *cpumap = (unsigned int *) CPUMAP;
 
97
        bootinfo.cpumap = 0;
 
98
        for (i = 0; i < CPUMAP_MAX_RECORDS; i++) {
 
99
                if (cpumap[i] != 0)
 
100
                        bootinfo.cpumap |= (1 << i);
 
101
        }
 
102
        
 
103
        printf("\nBooting the kernel...\n");
 
104
        jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, &bootinfo);
 
105
}