From 4a91e12af177dc50a2427d335fd522658d821194 Mon Sep 17 00:00:00 2001 From: Jake Mannens Date: Sat, 28 Jul 2018 05:31:09 +1000 Subject: Added new function register_trap() which creates trap gate entries in the IDT. This function takes the same parameters as register_isr() which creates interrupt gate entries in the IDT. The register_isr() function now sets the gate type to 0x0E regardless of what was already in the descriptor. This is to break reliance on the IDT already being initialized to a known state as well as avoiding conflicts with the new register_trap() function. Added declaration for the 'ticks' variable in kernel/sched.h so that it's value may be used throughout the kernel. Changed the system call gate to a trap gate. This means that interrupts will not be disabled prior to entry into the system call handler. This will allow hardware functions such as the timer to operate continuously even if the user makes a system call. Added checks to the timer interrupt handler. These checks prevent the scheduler from being called if the interrupt occurred during kernel mode execution. The idea here, is that the timer interrupt handler only services the hardware (increments the tick count and sends an EOI to the PIC's) if a system call was already running in the kernel. The system call handler has also been expanded to check if the timer fired prior to returning to userspace. If the timer did fire, the syscall handler will invoke the scheduler (as the timer handler would have), so that it can decide if it's time to switch tasks. --- include/kernel/sched.h | 1 + 1 file changed, 1 insertion(+) (limited to 'include/kernel') diff --git a/include/kernel/sched.h b/include/kernel/sched.h index ac508b9..3d6699c 100644 --- a/include/kernel/sched.h +++ b/include/kernel/sched.h @@ -55,6 +55,7 @@ struct task_struct { } __attribute__((packed)); extern struct task_struct *ctask; +extern uint32_t ticks; void sched_init(void); -- cgit v1.3