Start supporting smp.

This commit is contained in:
TXuian 2024-03-12 16:31:21 +08:00
parent e054bb4c59
commit 9b92c71a21
5 changed files with 29 additions and 8 deletions

View File

@ -84,11 +84,10 @@ _boot_start:
@ check cpu id - cpu0 is primary cpu @ check cpu id - cpu0 is primary cpu
cmp r5, #0 cmp r5, #0
beq primary_cpu_init beq primary_cpu_init
bx r4 @ for secondary cpus, jump to argument function pointer passed in by ROM bl bootmain @ for secondary cpus, jump to argument function pointer passed in by ROM
@ control should not return from the secondary cpu entry point
b .
bl .
primary_cpu_init: primary_cpu_init:
/* init .bss */ /* init .bss */
/* clear the .bss section (zero init) */ /* clear the .bss section (zero init) */

View File

@ -213,8 +213,14 @@ static int _is_interruptable(void)
return !(val & DIS_INT); return !(val & DIS_INT);
} }
int _cur_cpu_id()
{
return cpu_get_current();
}
static struct XiziTrapDriver xizi_trap_driver = { static struct XiziTrapDriver xizi_trap_driver = {
.sys_irq_init = _sys_irq_init, .sys_irq_init = _sys_irq_init,
.cur_cpu_id = _cur_cpu_id,
.cpu_irq_enable = _cpu_irq_enable, .cpu_irq_enable = _cpu_irq_enable,
.cpu_irq_disable = _cpu_irq_disable, .cpu_irq_disable = _cpu_irq_disable,

View File

@ -215,8 +215,14 @@ static int _is_interruptable(void)
return !(val & DIS_INT); return !(val & DIS_INT);
} }
int _cur_cpu_id()
{
return cpu_get_current();
}
static struct XiziTrapDriver xizi_trap_driver = { static struct XiziTrapDriver xizi_trap_driver = {
.sys_irq_init = _sys_irq_init, .sys_irq_init = _sys_irq_init,
.cur_cpu_id = _cur_cpu_id,
.cpu_irq_enable = _cpu_irq_enable, .cpu_irq_enable = _cpu_irq_enable,
.cpu_irq_disable = _cpu_irq_disable, .cpu_irq_disable = _cpu_irq_disable,

View File

@ -60,6 +60,7 @@ struct XiziTrapDriver {
uint32_t curr_int[NR_CPU]; uint32_t curr_int[NR_CPU];
void (*sys_irq_init)(); void (*sys_irq_init)();
int (*cur_cpu_id)();
void (*cpu_irq_enable)(); void (*cpu_irq_enable)();
void (*cpu_irq_disable)(); void (*cpu_irq_disable)();

View File

@ -53,11 +53,20 @@ int main(void)
if (!hardkernel_init(&hardkernel_tag)) { if (!hardkernel_init(&hardkernel_tag)) {
return -1; return -1;
} }
/* init softkernel */
if (!softkernel_init(&hardkernel_tag, &softkernel_tag)) { struct TraceTag main_intr_tag;
return -1; AchieveResourceTag(&main_intr_tag, &hardkernel_tag, "intr-ac-resource");
struct XiziTrapDriver* p_intr_driver = (struct XiziTrapDriver*)AchieveResource(&main_intr_tag);
int cpu_id = p_intr_driver->cur_cpu_id();
if (cpu_id == 0) {
/* init softkernel */
if (!softkernel_init(&hardkernel_tag, &softkernel_tag)) {
return -1;
}
show_xizi_bar();
int cpu_count = NR_CPU;
} }
show_xizi_bar();
/* start first task */ /* start first task */
char* init_task_param[2] = { "/app/init", 0 }; char* init_task_param[2] = { "/app/init", 0 };