forked from xuos/xiuos
Start supporting smp.
This commit is contained in:
parent
e054bb4c59
commit
9b92c71a21
|
@ -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) */
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)();
|
||||||
|
|
|
@ -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 };
|
||||||
|
|
Loading…
Reference in New Issue