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 | */ |