From eb1b4c887f4b692cb1276286cda385a659acc180 Mon Sep 17 00:00:00 2001 From: Matthias Kruk Date: Mon, 25 Nov 2019 14:36:15 +0900 Subject: [PATCH] Protect tasks with a spinlock --- kernel/arch/defs.h | 1 + kernel/arch/task.S | 14 ++++++++++++++ kernel/include/arch.h | 5 +++++ 3 files changed, 20 insertions(+) diff --git a/kernel/arch/defs.h b/kernel/arch/defs.h index 42bfaa8..161568e 100644 --- a/kernel/arch/defs.h +++ b/kernel/arch/defs.h @@ -77,6 +77,7 @@ #define OFFSET_TASK_PRIVL 12 #define OFFSET_TASK_STATE 16 #define OFFSET_TASK_EBP0 20 +#define OFFSET_TASK_LOCK 24 #define CPU_SIZE (TSS_OFFSET + TSS_SIZE + 4) #define OFFSET_CPU_CTASK (TSS_OFFSET + TSS_SIZE) diff --git a/kernel/arch/task.S b/kernel/arch/task.S index 1897a6d..fb55a27 100644 --- a/kernel/arch/task.S +++ b/kernel/arch/task.S @@ -30,6 +30,8 @@ .global task_get_current .global task_set_current .global task_move_stack +.global task_lock +.global task_unlock task_prepare: /* @@ -484,3 +486,15 @@ task_move_stack: /* Stacks have been copied and stack pointers updated. We're done. */ 4: ret + +task_lock: + addl $OFFSET_TASK_LOCK, 4(%esp) + call spinlock_lock + subl $OFFSET_TASK_LOCK, 4(%esp) + ret + +task_unlock: + addl $OFFSET_TASK_LOCK, 4(%esp) + call spinlock_unlock + subl $OFFSET_TASK_LOCK, 4(%esp) + ret diff --git a/kernel/include/arch.h b/kernel/include/arch.h index 522e0dc..9ae6dfa 100644 --- a/kernel/include/arch.h +++ b/kernel/include/arch.h @@ -30,6 +30,7 @@ #ifndef __ASSEMBLY_SOURCE #include +#include typedef struct stack_frame stack_frame_t; @@ -62,6 +63,7 @@ struct task { u32_t t_privl; u32_t t_state; u32_t t_bp; + spinlock_t t_lock; u32_t t_tslice; u32_t t_rslice; @@ -108,6 +110,9 @@ task_t* task_get_current(void); void task_set_current(task_t*); void task_move_stack(void*, void*, u32_t); +void task_lock(task_t*); +int task_unlock(task_t*); + /* * Definitions, types, and prototypes related to paging */ -- 2.47.3