From 44f0ac6579629beda8723d318c0a053f979068cc Mon Sep 17 00:00:00 2001 From: acevest Date: Sat, 5 Oct 2019 18:23:15 +0800 Subject: [PATCH] irq context switch do not use flag variable anymore --- arch/risc-v/bumblebee/gcc/riscv_port_s.S | 33 ++++++++++++++---------- arch/risc-v/common/tos_cpu.c | 2 +- arch/risc-v/rv32i/gcc/port_c.c | 8 ------ arch/risc-v/spike/gcc/riscv_port_s.S | 22 +++++++--------- 4 files changed, 31 insertions(+), 34 deletions(-) diff --git a/arch/risc-v/bumblebee/gcc/riscv_port_s.S b/arch/risc-v/bumblebee/gcc/riscv_port_s.S index 9ec8b570..ef6c9352 100644 --- a/arch/risc-v/bumblebee/gcc/riscv_port_s.S +++ b/arch/risc-v/bumblebee/gcc/riscv_port_s.S @@ -5,7 +5,6 @@ .extern k_curr_task .extern k_next_task -.extern k_task_irq_switch_flag .align 2 irq_entry: @@ -55,25 +54,33 @@ irq_entry: csrr a0, mcause mv a1, sp - slli a0, a0, 16 - srli a0, a0, 16 + // the bumblebee mstatus register is different + // 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 - la t0, k_task_irq_switch_flag - lw t1, (t0) - beqz t1, irq_restore - sw zero,(t0) + la t0, k_curr_task + la t1, k_next_task + + beq t0, t1, irq_restore // save sp to k_curr_task.sp la t0, k_curr_task // t0 = &k_curr_task - lw t1, (t0) - sw sp, (t1) + lw t2, (t0) // t2 = k_curr_task->sp + sw sp, (t2) // k_curr_task->sp = sp // switch task - // k_curr_task = k_next_task - la t1, k_next_task // t1 = &k_next_task - lw t1, (t1) // t1 = k_next_task - sw t1, (t0) + lw t1, (t1) // t1 = k_next_task + sw t1, (t0) // k_curr_task = k_next_task // load new task sp lw sp, (t1) diff --git a/arch/risc-v/common/tos_cpu.c b/arch/risc-v/common/tos_cpu.c index d841eef6..0791b0e6 100644 --- a/arch/risc-v/common/tos_cpu.c +++ b/arch/risc-v/common/tos_cpu.c @@ -32,7 +32,7 @@ __KERNEL__ void cpu_context_switch(void) __KERNEL__ void cpu_irq_context_switch(void) { - port_irq_context_switch(); + // DO NOTHING } __KERNEL__ void cpu_sched_start(void) diff --git a/arch/risc-v/rv32i/gcc/port_c.c b/arch/risc-v/rv32i/gcc/port_c.c index ef0de3f9..c53a1f80 100644 --- a/arch/risc-v/rv32i/gcc/port_c.c +++ b/arch/risc-v/rv32i/gcc/port_c.c @@ -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 + 0) = 0xFFFFFFFF & (mtimecmp >> 0); } - - - -int k_task_irq_switch_flag = 0; -__PORT__ void port_irq_context_switch() -{ - k_task_irq_switch_flag = 1; -} diff --git a/arch/risc-v/spike/gcc/riscv_port_s.S b/arch/risc-v/spike/gcc/riscv_port_s.S index b32e8d82..925889eb 100644 --- a/arch/risc-v/spike/gcc/riscv_port_s.S +++ b/arch/risc-v/spike/gcc/riscv_port_s.S @@ -1,4 +1,4 @@ -.equ REGBYTES, 4 +#include "port.h" .align 2 .global rv32_trap_entry @@ -53,25 +53,23 @@ rv32_trap_entry: j irq_restore handle_irq: - slli a0, a0, 16 - srli a0, a0, 16 + slli a0, a0, 1 + srli a0, a0, 1 call cpu_irq_entry - la t0, k_task_irq_switch_flag - lw t1, (t0) - beqz t1, irq_restore - sw zero,(t0) + la t0, k_curr_task + la t1, k_next_task + + beq t0, t1, irq_restore // save sp to k_curr_task.sp la t0, k_curr_task // t0 = &k_curr_task - lw t1, (t0) - sw sp, (t1) + lw t2, (t0) + sw sp, (t2) // switch task - // k_curr_task = k_next_task - la t1, k_next_task // 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 lw sp, (t1)