Subversion Repositories HelenOS

Rev

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

Rev 955 Rev 1037
Line 61... Line 61...
61
#include <arch/smp/mps.h>
61
#include <arch/smp/mps.h>
62
#endif /* CONFIG_SMP */
62
#endif /* CONFIG_SMP */
63
#include <smp/smp.h>
63
#include <smp/smp.h>
64
 
64
 
65
config_t config;    /**< Global configuration structure. */
65
config_t config;    /**< Global configuration structure. */
-
 
66
init_t init = {0};  /**< Initial user-space tasks */
66
 
67
 
67
context_t ctx;
68
context_t ctx;
68
 
69
 
69
/**
70
/**
70
 * These 'hardcoded' variables will be intialized by
71
 * These 'hardcoded' variables will be intialized by
Line 73... Line 74...
73
 */
74
 */
74
__address hardcoded_load_address = 0;
75
__address hardcoded_load_address = 0;
75
size_t hardcoded_ktext_size = 0;
76
size_t hardcoded_ktext_size = 0;
76
size_t hardcoded_kdata_size = 0;
77
size_t hardcoded_kdata_size = 0;
77
 
78
 
78
__address init_addr = 0;
-
 
79
size_t init_size = 0;
-
 
80
 
-
 
81
void main_bsp(void);
79
void main_bsp(void);
82
void main_ap(void);
80
void main_ap(void);
83
 
81
 
84
/*
82
/*
85
 * These two functions prevent stack from underflowing during the
83
 * These two functions prevent stack from underflowing during the
Line 108... Line 106...
108
    config.cpu_count = 1;
106
    config.cpu_count = 1;
109
    config.cpu_active = 1;
107
    config.cpu_active = 1;
110
   
108
   
111
    config.base = hardcoded_load_address;
109
    config.base = hardcoded_load_address;
112
    config.memory_size = get_memory_size();
110
    config.memory_size = get_memory_size();
113
    config.init_addr = init_addr;
-
 
114
    config.init_size = init_size;
-
 
115
   
111
   
116
    config.kernel_size = ALIGN_UP(hardcoded_ktext_size + hardcoded_kdata_size, PAGE_SIZE);
112
    config.kernel_size = ALIGN_UP(hardcoded_ktext_size + hardcoded_kdata_size, PAGE_SIZE);
117
    stackaddr = config.base + config.kernel_size;
113
    stackaddr = config.base + config.kernel_size;
-
 
114
   
118
    /* Avoid placing kernel on top of init */
115
    /* Avoid placing kernel on top of init */
-
 
116
    count_t i;
119
    if (overlaps(stackaddr,CONFIG_STACK_SIZE,
117
    bool overlap = false;
120
             config.init_addr, config.init_size)) {
118
    for (i = 0; i < init.cnt; i++)
121
       
-
 
122
        stackaddr = ALIGN_UP(config.init_addr+config.init_size,
119
        if (overlaps(stackaddr, CONFIG_STACK_SIZE, init.tasks[i].addr, init.tasks[i].size)) {
123
                     CONFIG_STACK_SIZE);
120
            stackaddr = ALIGN_UP(init.tasks[i].addr + init.tasks[i].size, CONFIG_STACK_SIZE);
124
        config.init_size = ALIGN_UP(config.init_size,CONFIG_STACK_SIZE) + CONFIG_STACK_SIZE;
121
            init.tasks[i].size = ALIGN_UP(init.tasks[i].size, CONFIG_STACK_SIZE) + CONFIG_STACK_SIZE;
-
 
122
            overlap = true;
-
 
123
        }
-
 
124
   
125
    } else {
125
    if (!overlap)
126
        config.kernel_size += CONFIG_STACK_SIZE;
126
        config.kernel_size += CONFIG_STACK_SIZE;
127
    }
-
 
128
   
127
   
129
    context_save(&ctx);
128
    context_save(&ctx);
130
    context_set(&ctx, FADDR(main_bsp_separated_stack),
129
    context_set(&ctx, FADDR(main_bsp_separated_stack),
131
            stackaddr, CONFIG_STACK_SIZE);
130
            stackaddr, CONFIG_STACK_SIZE);
132
    context_restore(&ctx);
131
    context_restore(&ctx);
Line 149... Line 148...
149
     * kconsole data structures must be initialized very early
148
     * kconsole data structures must be initialized very early
150
     * because other subsystems will register their respective
149
     * because other subsystems will register their respective
151
     * commands.
150
     * commands.
152
     */
151
     */
153
    kconsole_init();
152
    kconsole_init();
154
 
153
   
155
    /*
154
    /*
156
     * Exception handler initialization, before architecture
155
     * Exception handler initialization, before architecture
157
     * starts adding its own handlers
156
     * starts adding its own handlers
158
     */
157
     */
159
    exc_init();
158
    exc_init();
Line 187... Line 186...
187
    timeout_init();
186
    timeout_init();
188
    scheduler_init();
187
    scheduler_init();
189
    task_init();
188
    task_init();
190
    thread_init();
189
    thread_init();
191
   
190
   
-
 
191
    count_t i;
192
    if (config.init_size > 0)
192
    for (i = 0; i < init.cnt; i++)
193
        printf("config.init_addr=%P, config.init_size=%d\n", config.init_addr, config.init_size);
193
        printf("init[%d].addr=%P, init[%d].size=%d\n", i, init.tasks[i].addr, i, init.tasks[i].size);
194
   
194
   
195
    ipc_init();
195
    ipc_init();
196
    /*
196
    /*
197
     * Create kernel task.
197
     * Create kernel task.
198
     */
198
     */