summaryrefslogtreecommitdiff
path: root/include/errno.h
diff options
context:
space:
mode:
authorJake Mannens <jake72360@gmail.com>2018-07-25 01:17:39 +1000
committerJake Mannens <jake72360@gmail.com>2018-07-25 01:17:39 +1000
commit45819c035d0b92275de68e559f066cbe50996926 (patch)
tree0ae32cffc4567dee891ecca9e5162731b341d1a0 /include/errno.h
parenta0aa45ea6f4027dd4080cf1456a2fc5d9e94f87b (diff)
Fixed a bug in switch_to() in which the value of EBX was not popped
prior to return. This meant that switching to the same task did not abort properly as the incorrect return address was popped off the stack. Fixed a bug where the task register was not initialized before the scheduler. This meant that on the first task switch, the CPU would dump it's current state to a random address (0 most likely), potentially corrupting important data. This has been corrected by introducing a 'garbage TSS' (and associated descriptor in the GDT) which is selected before the scheduler is initialized as a safe place for the data to be written. Modified the scheduler so that it now waits indefinitely until a task becomes ready to run. This fixes the possible bug where the scheduler won't re-schedule the currently running task if it is the only task on the system. Add signal handling capabilities to the kernel. The bulk of this is present in the subroutine check_signals() defined in traps.s. This function is called on every timer tick and system call prior to userspace return. The subroutine operates by pushing fake state information onto the kernel's stack, then using it to return to userspace. Prior to this, the subroutine pushes the return address 0xFFFFE000 onto the user's stack. This address corresponds to the unmapped page located between the top of the user's stack (lower) and the kernel's stack page (upper). When the user's signal handler tries to return, it will cause a page fault that will be used as a notification mechanism to inform the kernel that the signal handler is done. The kernel will then switch to the originally pushed state information and use it to return the task to the original execution state. Due to it's nature, check_signals() must only be called prior to exiting the kernel since it may not return. Added the header file 'signal.h' which defines (most) of the POSIX signals as well as the prototype for the signal() function. Added the 'signal' element to the task structure. This field is a bitmap of all currently pending signals. Added the 'sig_handlers' element to the task structure. This is an array of all user-defined signal handlers. Currently, a value of 0 indicates the default handler should be used whilst any other value is considered to be the address of a userspace signal handler. The ability to ignore a signal is not yet present but will be added sometime soon. Added the sys_signal system call to register a signal. Added the stub function sighandler_default() to sched.c which handles all signals not caught by the user.
Diffstat (limited to 'include/errno.h')
0 files changed, 0 insertions, 0 deletions