Subversion Repositories HelenOS

Rev

Rev 2236 | Rev 2293 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2236 Rev 2254
Line 31... Line 31...
31
#include "_components.h"
31
#include "_components.h"
32
#include <printf.h>
32
#include <printf.h>
33
 
33
 
34
#include "mm.h"
34
#include "mm.h"
35
 
35
 
36
#define KERNEL_PHY_ADDRESS 0x00100000
36
#define KERNEL_VIRTUAL_ADDRESS 0x80100000
37
 
37
 
38
char *release = RELEASE;
38
char *release = RELEASE;
39
 
39
 
40
#ifdef REVISION
40
#ifdef REVISION
41
    char *revision = ", revision " REVISION;
41
    char *revision = ", revision " REVISION;
Line 54... Line 54...
54
{
54
{
55
    printf("HelenOS ARM32 Bootloader\nRelease %s%s%s\nCopyright (c) 2007 HelenOS project\n",
55
    printf("HelenOS ARM32 Bootloader\nRelease %s%s%s\nCopyright (c) 2007 HelenOS project\n",
56
        release, revision, timestamp);
56
        release, revision, timestamp);
57
}
57
}
58
 
58
 
-
 
59
/** Copies all images to #KERNEL_VIRTUAL_ADDRESS and jumps there. */
59
void bootstrap(void)
60
void bootstrap(void)
60
{
61
{
-
 
62
    mmu_start();
61
    version_print();
63
    version_print();
62
   
64
   
63
    component_t components[COMPONENTS];
65
    component_t components[COMPONENTS];
64
    bootinfo_t bootinfo;
66
    bootinfo_t bootinfo;
65
    init_components(components);
67
    init_components(components);
66
   
68
   
67
    printf("\nMemory statistics\n");
69
    printf("\nMemory statistics\n");
68
    printf(" kernel entry point at %L\n", KERNEL_PHY_ADDRESS);
70
    printf(" kernel entry point at %L\n", KERNEL_VIRTUAL_ADDRESS);
69
    printf(" %L: boot info structure\n", &bootinfo);
71
    printf(" %L: boot info structure\n", &bootinfo);
70
 
72
 
71
    unsigned int i, j;
73
    unsigned int i, j;
72
    for (i = 0; i < COMPONENTS; i++) {
74
    for (i = 0; i < COMPONENTS; i++) {
73
        printf(" %L: %s image (size %d bytes)\n",
75
        printf(" %L: %s image (size %d bytes)\n",
Line 78... Line 80...
78
    unsigned int top = 0;
80
    unsigned int top = 0;
79
    bootinfo.cnt = 0;
81
    bootinfo.cnt = 0;
80
    for (i = 0; i < COMPONENTS; i++) {
82
    for (i = 0; i < COMPONENTS; i++) {
81
        printf(" %s...", components[i].name);
83
        printf(" %s...", components[i].name);
82
        top = ALIGN_UP(top, PAGE_SIZE);
84
        top = ALIGN_UP(top, PAGE_SIZE);
83
        memcpy(((void *) KERNEL_PHY_ADDRESS) + top, components[i].start, components[i].size);
85
        memcpy(((void *) KERNEL_VIRTUAL_ADDRESS) + top, components[i].start, components[i].size);
84
        if (i > 0) {
86
        if (i > 0) {
85
            bootinfo.tasks[bootinfo.cnt].addr = ((void *) KERNEL_PHY_ADDRESS) + top;
87
            bootinfo.tasks[bootinfo.cnt].addr = ((void *) KERNEL_VIRTUAL_ADDRESS) + top;
86
            bootinfo.tasks[bootinfo.cnt].size = components[i].size;
88
            bootinfo.tasks[bootinfo.cnt].size = components[i].size;
87
            bootinfo.cnt++;
89
            bootinfo.cnt++;
88
        }
90
        }
89
 
91
 
90
        top += components[i].size;
92
        top += components[i].size;
91
        printf("done.\n");
93
        printf("done.\n");
92
    }
94
    }
93
   
95
   
94
    mm_kernel_mapping();
-
 
95
   
-
 
96
    printf("\nBooting the kernel...\n");
96
    printf("\nBooting the kernel...\n");
97
    jump_to_kernel((void *) PA2KA(KERNEL_PHY_ADDRESS), &bootinfo, sizeof(bootinfo));
97
    jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, &bootinfo, sizeof(bootinfo));
98
}
98
}
99
 
99