forked from xuos/xiuos
Fix some bugs.
This commit is contained in:
parent
a2e5b49b19
commit
fc380de895
|
@ -40,22 +40,7 @@ static void _sys_clock_init()
|
||||||
{
|
{
|
||||||
uint32_t freq = get_main_clock(IPG_CLK);
|
uint32_t freq = get_main_clock(IPG_CLK);
|
||||||
gpt_init(CLKSRC_IPG_CLK, freq / 1000000, RESTART_MODE, WAIT_MODE_EN | STOP_MODE_EN);
|
gpt_init(CLKSRC_IPG_CLK, freq / 1000000, RESTART_MODE, WAIT_MODE_EN | STOP_MODE_EN);
|
||||||
switch (cur_cpuid()) {
|
gpt_set_compare_event(kGPTOutputCompare1, OUTPUT_CMP_DISABLE, 1000);
|
||||||
case 0:
|
|
||||||
gpt_set_compare_event(kGPTOutputCompare1, OUTPUT_CMP_DISABLE, 1000);
|
|
||||||
gpt_counter_enable(kGPTOutputCompare1);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
gpt_set_compare_event(kGPTOutputCompare2, OUTPUT_CMP_DISABLE, 5000);
|
|
||||||
gpt_counter_enable(kGPTOutputCompare2);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
gpt_set_compare_event(kGPTOutputCompare3, OUTPUT_CMP_DISABLE, 10000);
|
|
||||||
gpt_counter_enable(kGPTOutputCompare3);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t _get_clock_int()
|
static uint32_t _get_clock_int()
|
||||||
|
@ -75,20 +60,7 @@ static uint64_t _get_second()
|
||||||
|
|
||||||
static void _clear_clock_intr()
|
static void _clear_clock_intr()
|
||||||
{
|
{
|
||||||
switch (cur_cpuid()) {
|
gpt_get_compare_event(kGPTOutputCompare1);
|
||||||
case 0:
|
|
||||||
gpt_get_compare_event(kGPTOutputCompare1);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
gpt_get_compare_event(kGPTOutputCompare2);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
gpt_get_compare_event(kGPTOutputCompare3);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
gpt_get_compare_event(kGPTOutputCompare1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool _is_timer_expired()
|
static bool _is_timer_expired()
|
||||||
|
|
|
@ -47,8 +47,10 @@ static struct XiziTrapDriver xizi_trap_driver;
|
||||||
|
|
||||||
void panic(char* s)
|
void panic(char* s)
|
||||||
{
|
{
|
||||||
xizi_trap_driver.cpu_irq_disable();
|
// xizi_trap_driver.cpu_irq_disable();
|
||||||
spinlock_unlock(&whole_kernel_lock);
|
if (is_spinlock_locked(&whole_kernel_lock) && whole_kernel_lock.owner_cpu == cur_cpuid()) {
|
||||||
|
spinlock_unlock(&whole_kernel_lock);
|
||||||
|
}
|
||||||
KPrintf("panic: %s\n", s);
|
KPrintf("panic: %s\n", s);
|
||||||
for (;;)
|
for (;;)
|
||||||
;
|
;
|
||||||
|
|
|
@ -47,43 +47,16 @@ trap_return:
|
||||||
ldmfd r13!, {r14}
|
ldmfd r13!, {r14}
|
||||||
ldmfd r13!, {r2}
|
ldmfd r13!, {r2}
|
||||||
msr spsr_cxsf, r2
|
msr spsr_cxsf, r2
|
||||||
ldr r0, [r13], #4
|
ldmfd r13!, {r0-r12, pc}^ // restore context and return
|
||||||
ldr r1, [r13], #4
|
|
||||||
ldr r2, [r13], #4
|
|
||||||
ldr r3, [r13], #4
|
|
||||||
ldr r4, [r13], #4
|
|
||||||
ldr r5, [r13], #4
|
|
||||||
ldr r6, [r13], #4
|
|
||||||
ldr r7, [r13], #4
|
|
||||||
ldr r8, [r13], #4
|
|
||||||
ldr r9, [r13], #4
|
|
||||||
ldr r10, [r13], #4
|
|
||||||
ldr r11, [r13], #4
|
|
||||||
ldr r12, [r13], #4
|
|
||||||
ldm r13!, {pc}^
|
|
||||||
|
|
||||||
user_trap_swi_enter:
|
user_trap_swi_enter:
|
||||||
# save trapframe to swi stack
|
# save trapframe to swi stack
|
||||||
sub sp, sp, #56
|
stmfd sp!, {r0-r12, r14} // save context
|
||||||
str r14, [sp, #52]
|
mrs r2, spsr // copy spsr to r2
|
||||||
str r12, [sp, #48]
|
stmfd r13!, {r2} // save r2(spsr) to the stack
|
||||||
str r11, [sp, #44]
|
|
||||||
str r10, [sp, #40]
|
|
||||||
str r9, [sp, #36]
|
|
||||||
str r8, [sp, #32]
|
|
||||||
str r7, [sp, #28]
|
|
||||||
str r6, [sp, #24]
|
|
||||||
str r5, [sp, #20]
|
|
||||||
str r4, [sp, #16]
|
|
||||||
str r3, [sp, #12]
|
|
||||||
str r2, [sp, #8]
|
|
||||||
str r1, [sp, #4]
|
|
||||||
str r0, [sp]
|
|
||||||
|
|
||||||
mrs r2, spsr
|
stmfd r13!, {r14} // save r14 again to have one uniform trapframe
|
||||||
stmfd r13!, {r2}
|
stmfd r13, {sp, lr}^ // save user mode sp and lr
|
||||||
stmfd r13!, {r14}
|
|
||||||
stmfd r13, {sp, lr}^
|
|
||||||
sub r13, r13, #8
|
sub r13, r13, #8
|
||||||
|
|
||||||
# call syscall handler
|
# call syscall handler
|
||||||
|
@ -92,17 +65,12 @@ user_trap_swi_enter:
|
||||||
b trap_return
|
b trap_return
|
||||||
|
|
||||||
trap_irq_enter:
|
trap_irq_enter:
|
||||||
# save context in irq stack
|
# save it on the stack as r14 is banked
|
||||||
sub r14, r14, #4
|
sub r14, r14, #4 // r14 (lr) contains the interrupted PC
|
||||||
sub sp, sp, #16
|
stmfd r13!, {r0-r2, r14} //
|
||||||
str r14, [sp, #12]
|
mrs r1, spsr // save spsr_irq
|
||||||
str r2, [sp, #8]
|
mov r0, r13 // save stack stop (r13_irq)
|
||||||
str r1, [sp, #4]
|
add r13, r13, #16 // reset the IRQ stack
|
||||||
str r0, [sp]
|
|
||||||
|
|
||||||
mrs r1, spsr
|
|
||||||
mov r0, r13 // irq stack stop
|
|
||||||
add r13, r13, #16 // reset IRQ stack
|
|
||||||
|
|
||||||
# switch to the SVC mode
|
# switch to the SVC mode
|
||||||
mrs r2, cpsr
|
mrs r2, cpsr
|
||||||
|
@ -111,25 +79,15 @@ trap_irq_enter:
|
||||||
msr cpsr_cxsf, r2
|
msr cpsr_cxsf, r2
|
||||||
|
|
||||||
# build the trap frame
|
# build the trap frame
|
||||||
ldr r2, [r0, #12]
|
ldr r2, [r0, #12] // read the r14_irq, then save it
|
||||||
stmfd r13!, {r2}
|
stmfd r13!, {r2}
|
||||||
sub r13, r13, #40
|
stmfd r13!, {r3-r12} // r4-r12 are preserved (non-banked)
|
||||||
str r12, [r13, #36]
|
ldmfd r0, {r3-r5} // copy r0-r2 over from irq stack
|
||||||
str r11, [r13, #32]
|
|
||||||
str r10, [r13, #28]
|
|
||||||
str r9, [r13, #24]
|
|
||||||
str r8, [r13, #20]
|
|
||||||
str r7, [r13, #16]
|
|
||||||
str r6, [r13, #12]
|
|
||||||
str r5, [r13, #8]
|
|
||||||
str r4, [r13, #4]
|
|
||||||
str r3, [r13]
|
|
||||||
|
|
||||||
ldmfd r0, {r3-r5}
|
|
||||||
stmfd r13!, {r3-r5}
|
stmfd r13!, {r3-r5}
|
||||||
stmfd r13!, {r1}
|
stmfd r13!, {r1} // save spsr
|
||||||
stmfd r13!, {lr}
|
stmfd r13!, {lr} // save lr_svc
|
||||||
stmfd r13, {sp, lr}^
|
|
||||||
|
stmfd r13, {sp, lr}^ // save user mode sp and lr
|
||||||
sub r13, r13, #8
|
sub r13, r13, #8
|
||||||
|
|
||||||
mov r0, r13 // trapframe as parameters
|
mov r0, r13 // trapframe as parameters
|
||||||
|
|
|
@ -69,9 +69,15 @@ Modification:
|
||||||
int task_exec(struct TaskMicroDescriptor* task, char* img_start, char* name, char** argv)
|
int task_exec(struct TaskMicroDescriptor* task, char* img_start, char* name, char** argv)
|
||||||
{
|
{
|
||||||
/* load img to task */
|
/* load img to task */
|
||||||
|
if (img_start == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
/* 1. load elf header */
|
/* 1. load elf header */
|
||||||
struct elfhdr elf;
|
struct elfhdr elf;
|
||||||
memcpy((void*)&elf, img_start, sizeof(elf));
|
memcpy((void*)&elf, img_start, sizeof(elf));
|
||||||
|
if (elf.magic != ELF_MAGIC) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
// pgdir for new task
|
// pgdir for new task
|
||||||
struct TopLevelPageDirectory pgdir;
|
struct TopLevelPageDirectory pgdir;
|
||||||
pgdir.pd_addr = NULL;
|
pgdir.pd_addr = NULL;
|
||||||
|
|
Loading…
Reference in New Issue