summaryrefslogtreecommitdiff
path: root/include/asm/interrupt.h
AgeCommit message (Collapse)Author
2018-08-20Defined macros cli() and sti() in asm/interrupt.h to disable and enableJake Mannens
interrupts respectively. Added the scheduling primatives sleep_on() and interruptible_sleep_on() to sched.c. sleep_on() adds the current task to the specified wait queue then puts it into an uninterruptible sleep. Wait queues are formed by having each waiting task holding a pointer to the waiting task that preceeded it, then placing a pointer to it's own task struct into the queue's head pointer. When the first task in the queue is awoken, it wakes the preceeding task prior to returning from sleep_on(). The function interruptible_sleep_on() works in a similar manner, however when a task is awoken from interruptible_sleep_on(), it wakes up the first task in it's wait queue, then puts itself back to sleep. The purpose of this, is to automatically dissolve and reform the wait queue. As each task in the queue is a awakened, tasks that need to handle signals will do so whilst tasks that have no pending signals and are still waiting will place themselves back into the wait queue by calling interruptible_sleep_on() again. Whilst this method isn't the most effiecient due to waking every task in a wait queue because one received a signal, it does avoid the mess and complications involved in maintaining the queue as an array or linked list. Added prototypes for the scheduling primatives wake_up(), sleep_on() and interruptible_sleep_on() to kernel/sched.h so that these functions may be used throughout the kernel. Added code to temporaily re-enable interrupts in reschedule() so that the idle loop may continue to function even if interrupts were disabled prior to calling the function.
2018-08-06Defined ssize_t in unistd.h.Jake Mannens
Added the _syscall2 macro to unistd.h to facilitate system calls that require two arguments to be passed. Modified the ATA driver to simply abort initialisation if a drive is not found, or cannot be configured. This will allow the kernel to function on a diskless system without invoking panic() unnecessarily. Added the functions irq_enable() and irq_disable() to asm/interrupt.h to make it easier for C code to mask and unmask IRQ's on each PIC. Moved the declaration for rsputs() from kernel/con.h to the new kernel/serial.h file since this is a function provided by the serial driver. Implemented a basic I/O input framework. This involves the new system call sys_read, which takes an I/O read request and directs it to the appropriate kernel handler function depending on the calling process' ctty value. This mechanism is identical to the sys_puts system call. Added the rsread() function to service sys_read calls from processes whose ctty value is equal to 1. This function will continually copy data from the serial buffer to the location specified. If there is not a sufficient amount of new data in the buffer to satisfy the request, the process is put into the TSTATE_UNINTERRUPTIBLE state and the scheduler is called to switch tasks. Prior to calling the scheduler, the function will set the waiting_task pointer to the calling process. This pointer will later be used by the interrupt handler to wake the process when new data arrives. Added an interrupt handler to service the IRQ4 (UART) interrupt. This subroutine is a stub which will save the machine's state then transfer control to rs_handler() in serial.c which will read bytes from the serial port and place them in a buffer. Before returning, rs_handler() checks the waiting_task pointer to see if a task is waiting for the newly received data and if so, it sets the task's state to TSTATE_RUNNING before resetting the pointer to NULL and returning. Ideally, the scheduler should be invoked at this point to select another task but since our basic round-robin scheduler currently has no concept of task priorities (and for the sake of simplicity), we will avoid invoking the scheduler in response to interrupts for now.
2018-07-28Added new function register_trap() which creates trap gate entries inJake Mannens
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.
2018-06-25Added the header asm/interrupt.h which includes a prototype for theJake Mannens
assembly function register_isr making it usable within the C portions of the source. Added a new file panic.s with the function panic that will print a panic message, disable interrupts and halt the system. Created the skeleton framework for paging in the new file page.s. The new function paging_init (called in kboot) will setup a simple page directory with two tables covering all addresses 0-8MB. It will also mark pages from 0-1MB as 'supervisor-only' to protect the kernel. NOTE: The function paging_init must be called before initialising the IDT as it does not disable interrupts! Modified the page fault handler to print the offending linear address along with the supplied error code. Following that, the handler will initiate a kernel panic. This function (along with panic) assumes console I/O to be operational. Modified the userspace test code to deliberately intiate a page fault by accessing an unmapped page.