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()) {
 | 
					 | 
				
			||||||
    case 0:
 | 
					 | 
				
			||||||
    gpt_set_compare_event(kGPTOutputCompare1, OUTPUT_CMP_DISABLE, 1000);
 | 
					    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()) {
 | 
					 | 
				
			||||||
    case 0:
 | 
					 | 
				
			||||||
    gpt_get_compare_event(kGPTOutputCompare1);
 | 
					    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();
 | 
				
			||||||
 | 
					    if (is_spinlock_locked(&whole_kernel_lock) && whole_kernel_lock.owner_cpu == cur_cpuid()) {
 | 
				
			||||||
        spinlock_unlock(&whole_kernel_lock);
 | 
					        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