support SIGSEGV(page fault) and SIGILL(general protection error)
This commit is contained in:
@@ -373,12 +373,15 @@ void handle_interrupt(int vector, struct x86_regs *regs)
|
||||
}
|
||||
}
|
||||
|
||||
void sigill(void *);
|
||||
|
||||
void gpe_handler(struct x86_regs *regs)
|
||||
{
|
||||
kprintf("General protection fault (err: %lx, %lx:%lx)\n",
|
||||
regs->error, regs->cs, regs->rip);
|
||||
arch_show_interrupt_context(regs);
|
||||
panic("GPF");
|
||||
sigill(regs);
|
||||
// panic("GPF");
|
||||
}
|
||||
|
||||
void x86_issue_ipi(unsigned int apicid, unsigned int low)
|
||||
|
||||
@@ -16,3 +16,39 @@ struct sigaction {
|
||||
struct k_sigaction {
|
||||
struct sigaction sa;
|
||||
};
|
||||
|
||||
#define SIGHUP 1
|
||||
#define SIGINT 2
|
||||
#define SIGQUIT 3
|
||||
#define SIGILL 4
|
||||
#define SIGTRAP 5
|
||||
#define SIGABRT 6
|
||||
#define SIGIOT 6
|
||||
#define SIGBUS 7
|
||||
#define SIGFPE 8
|
||||
#define SIGKILL 9
|
||||
#define SIGUSR1 10
|
||||
#define SIGSEGV 11
|
||||
#define SIGUSR2 12
|
||||
#define SIGPIPE 13
|
||||
#define SIGALRM 14
|
||||
#define SIGTERM 15
|
||||
#define SIGSTKFLT 16
|
||||
#define SIGCHLD 17
|
||||
#define SIGCONT 18
|
||||
#define SIGSTOP 19
|
||||
#define SIGTSTP 20
|
||||
#define SIGTTIN 21
|
||||
#define SIGTTOU 22
|
||||
#define SIGURG 23
|
||||
#define SIGXCPU 24
|
||||
#define SIGXFSZ 25
|
||||
#define SIGVTALRM 26
|
||||
#define SIGPROF 27
|
||||
#define SIGWINCH 28
|
||||
#define SIGIO 29
|
||||
#define SIGPOLL SIGIO
|
||||
#define SIGPWR 30
|
||||
#define SIGSYS 31
|
||||
#define SIGUNUSED 31
|
||||
#define SIGRTMIN 32
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
#include <ihk/debug.h>
|
||||
#include <cls.h>
|
||||
#include <syscall.h>
|
||||
#include <process.h>
|
||||
#include <string.h>
|
||||
|
||||
void terminate(int, int, ihk_mc_user_context_t *);
|
||||
|
||||
//#define DEBUG_PRINT_SC
|
||||
|
||||
@@ -67,3 +71,80 @@ int obtain_clone_cpuid() {
|
||||
ihk_mc_spinlock_unlock_noirq(&cpuid_head_lock);
|
||||
return cpuid;
|
||||
}
|
||||
|
||||
SYSCALL_DECLARE(rt_sigreturn)
|
||||
{
|
||||
struct process *proc = cpu_local_var(current);
|
||||
char *kspbottom;
|
||||
asm volatile ("movq %%gs:132,%0" : "=r" (kspbottom));
|
||||
memcpy(kspbottom - 120, proc->sigstack, 120);
|
||||
|
||||
return proc->sigrc;
|
||||
}
|
||||
|
||||
void
|
||||
check_signal(unsigned long rc, unsigned long *regs)
|
||||
{
|
||||
struct process *proc = cpu_local_var(current);
|
||||
struct k_sigaction *k;
|
||||
int sig = proc->signal;
|
||||
|
||||
proc->signal = 0;
|
||||
if(sig){
|
||||
if(regs == NULL){ /* call from syscall */
|
||||
asm volatile ("movq %%gs:132,%0" : "=r" (regs));
|
||||
regs -= 16;
|
||||
}
|
||||
else{
|
||||
rc = regs[9]; /* rax */
|
||||
}
|
||||
|
||||
k = proc->sighandler->action + sig - 1;
|
||||
|
||||
if(k->sa.sa_handler == (void *)1){
|
||||
return;
|
||||
}
|
||||
else if(k->sa.sa_handler){
|
||||
unsigned long *usp; /* user stack */
|
||||
long w;
|
||||
|
||||
usp = (void *)regs[14];
|
||||
memcpy(proc->sigstack, regs, 128);
|
||||
proc->sigrc = rc;
|
||||
usp--;
|
||||
*usp = (unsigned long)k->sa.sa_restorer;
|
||||
w = 56 + 3;
|
||||
asm volatile ("pushq %0" :: "r" (w));
|
||||
asm volatile ("pushq %0" :: "r" (usp));
|
||||
w = 1 << 9;
|
||||
asm volatile ("pushq %0" :: "r" (w));
|
||||
w = 48 + 3;
|
||||
asm volatile ("pushq %0" :: "r" (w));
|
||||
asm volatile ("pushq %0" :: "r" (k->sa.sa_handler));
|
||||
asm volatile ("iretq");
|
||||
}
|
||||
else{
|
||||
if(sig == SIGCHLD || sig == SIGURG)
|
||||
return;
|
||||
terminate(0, sig, (ihk_mc_user_context_t *)regs[14]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
sigsegv(unsigned long *regs)
|
||||
{
|
||||
struct process *proc = cpu_local_var(current);
|
||||
|
||||
proc->signal = SIGSEGV;
|
||||
check_signal(0, regs);
|
||||
}
|
||||
|
||||
void
|
||||
sigill(unsigned long *regs)
|
||||
{
|
||||
struct process *proc = cpu_local_var(current);
|
||||
|
||||
proc->signal = SIGILL;
|
||||
check_signal(0, regs);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user