diff options
| author | Jake Mannens <jake72360@gmail.com> | 2018-07-28 05:31:09 +1000 |
|---|---|---|
| committer | Jake Mannens <jake72360@gmail.com> | 2018-07-28 05:31:09 +1000 |
| commit | 4a91e12af177dc50a2427d335fd522658d821194 (patch) | |
| tree | 2d2d231ff426db952be2acb819deb7263e24529b /kernel/boot.s | |
| parent | 9400716f56057d9f2fcd7f7ad033dfcb131105a2 (diff) | |
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.
Diffstat (limited to 'kernel/boot.s')
| -rw-r--r-- | kernel/boot.s | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/kernel/boot.s b/kernel/boot.s index db846c9..d609611 100644 --- a/kernel/boot.s +++ b/kernel/boot.s @@ -2,6 +2,7 @@ global gdt global idt global kboot global register_isr +global register_trap extern con_init extern hd_init extern kmain @@ -191,8 +192,27 @@ register_isr: mov eax, [ebp+12] and al, 3 shl al, 5 - mov cl, [edx+5] - and cl, 0x9F + mov cl, 0x8E + or cl, al + mov [edx+5], cl + pop ebp + ret + +; void register_trap(uint8_t n, uint8_t dpl, void *handler); +register_trap: + push ebp + mov ebp, esp + mov edx, [ebp+8] + shl edx, 3 + add edx, idt + mov eax, [ebp+16] + mov [edx], ax + shr eax, 16 + mov [edx+6], ax + mov eax, [ebp+12] + and al, 3 + shl al, 5 + mov cl, 0x8F or cl, al mov [edx+5], cl pop ebp |
