irq context switch do not use flag variable anymore
This commit is contained in:
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
.extern k_curr_task
|
.extern k_curr_task
|
||||||
.extern k_next_task
|
.extern k_next_task
|
||||||
.extern k_task_irq_switch_flag
|
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
irq_entry:
|
irq_entry:
|
||||||
@@ -55,25 +54,33 @@ irq_entry:
|
|||||||
csrr a0, mcause
|
csrr a0, mcause
|
||||||
mv a1, sp
|
mv a1, sp
|
||||||
|
|
||||||
slli a0, a0, 16
|
// the bumblebee mstatus register is different
|
||||||
srli a0, a0, 16
|
// name bit detail
|
||||||
|
// INTERRUPT 31 0: exception or nmi, 1 irq
|
||||||
|
// MINHV 30 reading irq vector table
|
||||||
|
// MPP 29:28 == mstatus.MPP
|
||||||
|
// MPIE 27 == mstatus.MPIE
|
||||||
|
// Reserved 26:24 0
|
||||||
|
// MPIL 23:16 previous interrupt level
|
||||||
|
// Reserved 15:12 0
|
||||||
|
// EXCCODE 11:0 exception code
|
||||||
|
slli a0, a0, 20
|
||||||
|
srli a0, a0, 20
|
||||||
call cpu_irq_entry
|
call cpu_irq_entry
|
||||||
|
|
||||||
la t0, k_task_irq_switch_flag
|
la t0, k_curr_task
|
||||||
lw t1, (t0)
|
la t1, k_next_task
|
||||||
beqz t1, irq_restore
|
|
||||||
sw zero,(t0)
|
beq t0, t1, irq_restore
|
||||||
|
|
||||||
// save sp to k_curr_task.sp
|
// save sp to k_curr_task.sp
|
||||||
la t0, k_curr_task // t0 = &k_curr_task
|
la t0, k_curr_task // t0 = &k_curr_task
|
||||||
lw t1, (t0)
|
lw t2, (t0) // t2 = k_curr_task->sp
|
||||||
sw sp, (t1)
|
sw sp, (t2) // k_curr_task->sp = sp
|
||||||
|
|
||||||
// switch task
|
// switch task
|
||||||
// k_curr_task = k_next_task
|
lw t1, (t1) // t1 = k_next_task
|
||||||
la t1, k_next_task // t1 = &k_next_task
|
sw t1, (t0) // k_curr_task = k_next_task
|
||||||
lw t1, (t1) // t1 = k_next_task
|
|
||||||
sw t1, (t0)
|
|
||||||
|
|
||||||
// load new task sp
|
// load new task sp
|
||||||
lw sp, (t1)
|
lw sp, (t1)
|
||||||
|
@@ -32,7 +32,7 @@ __KERNEL__ void cpu_context_switch(void)
|
|||||||
|
|
||||||
__KERNEL__ void cpu_irq_context_switch(void)
|
__KERNEL__ void cpu_irq_context_switch(void)
|
||||||
{
|
{
|
||||||
port_irq_context_switch();
|
// DO NOTHING
|
||||||
}
|
}
|
||||||
|
|
||||||
__KERNEL__ void cpu_sched_start(void)
|
__KERNEL__ void cpu_sched_start(void)
|
||||||
|
@@ -31,11 +31,3 @@ __PORT__ void port_systick_config(uint32_t cycle_per_tick)
|
|||||||
*(volatile uint32_t *)(CLINT_CTRL_ADDR + CLINT_MTIMECMP + 4) = 0xFFFFFFFF & (mtimecmp >> 32);
|
*(volatile uint32_t *)(CLINT_CTRL_ADDR + CLINT_MTIMECMP + 4) = 0xFFFFFFFF & (mtimecmp >> 32);
|
||||||
*(volatile uint32_t *)(CLINT_CTRL_ADDR + CLINT_MTIMECMP + 0) = 0xFFFFFFFF & (mtimecmp >> 0);
|
*(volatile uint32_t *)(CLINT_CTRL_ADDR + CLINT_MTIMECMP + 0) = 0xFFFFFFFF & (mtimecmp >> 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int k_task_irq_switch_flag = 0;
|
|
||||||
__PORT__ void port_irq_context_switch()
|
|
||||||
{
|
|
||||||
k_task_irq_switch_flag = 1;
|
|
||||||
}
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
.equ REGBYTES, 4
|
#include "port.h"
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
.global rv32_trap_entry
|
.global rv32_trap_entry
|
||||||
@@ -53,25 +53,23 @@ rv32_trap_entry:
|
|||||||
j irq_restore
|
j irq_restore
|
||||||
|
|
||||||
handle_irq:
|
handle_irq:
|
||||||
slli a0, a0, 16
|
slli a0, a0, 1
|
||||||
srli a0, a0, 16
|
srli a0, a0, 1
|
||||||
call cpu_irq_entry
|
call cpu_irq_entry
|
||||||
|
|
||||||
la t0, k_task_irq_switch_flag
|
la t0, k_curr_task
|
||||||
lw t1, (t0)
|
la t1, k_next_task
|
||||||
beqz t1, irq_restore
|
|
||||||
sw zero,(t0)
|
beq t0, t1, irq_restore
|
||||||
|
|
||||||
// save sp to k_curr_task.sp
|
// save sp to k_curr_task.sp
|
||||||
la t0, k_curr_task // t0 = &k_curr_task
|
la t0, k_curr_task // t0 = &k_curr_task
|
||||||
lw t1, (t0)
|
lw t2, (t0)
|
||||||
sw sp, (t1)
|
sw sp, (t2)
|
||||||
|
|
||||||
// switch task
|
// switch task
|
||||||
// k_curr_task = k_next_task
|
|
||||||
la t1, k_next_task // t1 = &k_next_task
|
|
||||||
lw t1, (t1) // t1 = k_next_task
|
lw t1, (t1) // t1 = k_next_task
|
||||||
sw t1, (t0)
|
sw t1, (t0) // k_curr_task = k_next_task
|
||||||
|
|
||||||
// load new task sp
|
// load new task sp
|
||||||
lw sp, (t1)
|
lw sp, (t1)
|
||||||
|
Reference in New Issue
Block a user