forked from Bananymous/banan-os
				
			Kernel: add default signal actions
This commit is contained in:
		
							parent
							
								
									5f2549b198
								
							
						
					
					
						commit
						217e5f81cc
					
				| 
						 | 
					@ -43,9 +43,3 @@ signal_trampoline:
 | 
				
			||||||
	addq $16, %rsp
 | 
						addq $16, %rsp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret
 | 
						ret
 | 
				
			||||||
 | 
					 | 
				
			||||||
.global test_signal
 | 
					 | 
				
			||||||
test_signal:
 | 
					 | 
				
			||||||
	movq $99, %rax
 | 
					 | 
				
			||||||
	int $0x80
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
| 
						 | 
					@ -158,6 +158,10 @@ namespace Kernel
 | 
				
			||||||
		userspace_info_t m_userspace_info;
 | 
							userspace_info_t m_userspace_info;
 | 
				
			||||||
		ExitStatus m_exit_status;
 | 
							ExitStatus m_exit_status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							vaddr_t m_signal_handlers[_SIGMAX + 1] { };
 | 
				
			||||||
 | 
							uint64_t m_signal_mask { (1ull << SIGCHLD) | (1ull << SIGURG) };
 | 
				
			||||||
 | 
							static_assert(_SIGMAX < 64);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		BAN::UniqPtr<PageTable> m_page_table;
 | 
							BAN::UniqPtr<PageTable> m_page_table;
 | 
				
			||||||
		BAN::RefPtr<TTY> m_tty;
 | 
							BAN::RefPtr<TTY> m_tty;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@
 | 
				
			||||||
#include <kernel/Memory/PageTableScope.h>
 | 
					#include <kernel/Memory/PageTableScope.h>
 | 
				
			||||||
#include <kernel/Process.h>
 | 
					#include <kernel/Process.h>
 | 
				
			||||||
#include <kernel/Scheduler.h>
 | 
					#include <kernel/Scheduler.h>
 | 
				
			||||||
 | 
					#include <kernel/Signal.h>
 | 
				
			||||||
#include <LibELF/ELF.h>
 | 
					#include <LibELF/ELF.h>
 | 
				
			||||||
#include <LibELF/Values.h>
 | 
					#include <LibELF/Values.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +16,6 @@
 | 
				
			||||||
#include <sys/sysmacros.h>
 | 
					#include <sys/sysmacros.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern "C" void signal_trampoline();
 | 
					extern "C" void signal_trampoline();
 | 
				
			||||||
extern "C" void test_signal();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Kernel
 | 
					namespace Kernel
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -798,16 +798,77 @@ namespace Kernel
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		ASSERT(&Process::current() == this);
 | 
							ASSERT(&Process::current() == this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Skip masked (ignored) signals
 | 
				
			||||||
 | 
							if (m_signal_mask & (1ull << signal))
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		LockGuard lock_guard(m_lock);
 | 
							LockGuard lock_guard(m_lock);
 | 
				
			||||||
		asm volatile("cli");
 | 
							if (m_signal_handlers[signal])
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								asm volatile("cli");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		uintptr_t* return_rsp_ptr = (uintptr_t*)return_rsp;
 | 
								uintptr_t* return_rsp_ptr = (uintptr_t*)return_rsp;
 | 
				
			||||||
		*--return_rsp_ptr = return_rip;
 | 
								*--return_rsp_ptr = return_rip;
 | 
				
			||||||
		*--return_rsp_ptr = signal;
 | 
								*--return_rsp_ptr = signal;
 | 
				
			||||||
		*--return_rsp_ptr = (uintptr_t)test_signal;
 | 
								*--return_rsp_ptr = m_signal_handlers[signal];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return_rsp = (uintptr_t)return_rsp_ptr;
 | 
								return_rsp = (uintptr_t)return_rsp_ptr;
 | 
				
			||||||
		return_rip = (uintptr_t)signal_trampoline;
 | 
								return_rip = (uintptr_t)signal_trampoline;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								switch (signal)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									// Abnormal termination of the process with additional actions.
 | 
				
			||||||
 | 
									case SIGABRT:
 | 
				
			||||||
 | 
									case SIGBUS:
 | 
				
			||||||
 | 
									case SIGFPE:
 | 
				
			||||||
 | 
									case SIGILL:
 | 
				
			||||||
 | 
									case SIGQUIT:
 | 
				
			||||||
 | 
									case SIGSEGV:
 | 
				
			||||||
 | 
									case SIGSYS:
 | 
				
			||||||
 | 
									case SIGTRAP:
 | 
				
			||||||
 | 
									case SIGXCPU:
 | 
				
			||||||
 | 
									case SIGXFSZ:
 | 
				
			||||||
 | 
										// TODO: additional actions
 | 
				
			||||||
 | 
										// fall through
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Abnormal termination of the process
 | 
				
			||||||
 | 
									case SIGALRM:
 | 
				
			||||||
 | 
									case SIGHUP:
 | 
				
			||||||
 | 
									case SIGINT:
 | 
				
			||||||
 | 
									case SIGKILL:
 | 
				
			||||||
 | 
									case SIGPIPE:
 | 
				
			||||||
 | 
									case SIGTERM:
 | 
				
			||||||
 | 
									case SIGUSR1:
 | 
				
			||||||
 | 
									case SIGUSR2:
 | 
				
			||||||
 | 
									case SIGPOLL:
 | 
				
			||||||
 | 
									case SIGPROF:
 | 
				
			||||||
 | 
									case SIGVTALRM:
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										auto message = BAN::String::formatted("killed by signal {}\n", signal);
 | 
				
			||||||
 | 
										(void)m_tty->write(0, message.data(), message.size());
 | 
				
			||||||
 | 
										lock_guard.~LockGuard();
 | 
				
			||||||
 | 
										exit(128 + signal);
 | 
				
			||||||
 | 
										ASSERT_NOT_REACHED();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Ignore the signal
 | 
				
			||||||
 | 
									case SIGCHLD:
 | 
				
			||||||
 | 
									case SIGURG:
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Stop the process:
 | 
				
			||||||
 | 
									case SIGTSTP:
 | 
				
			||||||
 | 
									case SIGTTIN:
 | 
				
			||||||
 | 
									case SIGTTOU:
 | 
				
			||||||
 | 
										ASSERT_NOT_REACHED();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Continue the process, if it is stopped; otherwise, ignore the signal.
 | 
				
			||||||
 | 
									case SIGCONT:
 | 
				
			||||||
 | 
										ASSERT_NOT_REACHED();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue