Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 248b74c7 authored by Al Viro's avatar Al Viro Committed by Richard Weinberger
Browse files

um: start switching the references to host mcontext_t to its userland type

parent 05c46db4
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -6,9 +6,4 @@
#ifndef __PROCESS_H__
#define __PROCESS_H__

#include <signal.h>

extern void sig_handler(int sig, struct sigcontext *sc);
extern void alarm_handler(int sig, struct sigcontext *sc);

#endif
+1 −0
Original line number Diff line number Diff line
void alarm_handler(int, mcontext_t *);
+16 −19
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ void (*sig_info[NSIG])(int, struct uml_pt_regs *) = {
	[SIGIO]		= sigio_handler,
	[SIGVTALRM]	= timer_handler };

static void sig_handler_common(int sig, struct sigcontext *sc)
static void sig_handler_common(int sig, mcontext_t *mc)
{
	struct uml_pt_regs r;
	int save_errno = errno;
@@ -34,8 +34,8 @@ static void sig_handler_common(int sig, struct sigcontext *sc)
	r.is_user = 0;
	if (sig == SIGSEGV) {
		/* For segfaults, we want the data from the sigcontext. */
		copy_sc(&r, sc);
		GET_FAULTINFO_FROM_SC(r.faultinfo, sc);
		copy_sc(&r, (struct sigcontext *)mc);
		GET_FAULTINFO_FROM_MC(r.faultinfo, mc);
	}

	/* enable signals if sig isn't IRQ signal */
@@ -62,7 +62,7 @@ static void sig_handler_common(int sig, struct sigcontext *sc)
static int signals_enabled;
static unsigned int signals_pending;

void sig_handler(int sig, struct sigcontext *sc)
void sig_handler(int sig, mcontext_t *mc)
{
	int enabled;

@@ -74,23 +74,23 @@ void sig_handler(int sig, struct sigcontext *sc)

	block_signals();

	sig_handler_common(sig, sc);
	sig_handler_common(sig, mc);

	set_signals(enabled);
}

static void real_alarm_handler(struct sigcontext *sc)
static void real_alarm_handler(mcontext_t *mc)
{
	struct uml_pt_regs regs;

	if (sc != NULL)
		copy_sc(&regs, sc);
	if (mc != NULL)
		copy_sc(&regs, (struct sigcontext *)mc);
	regs.is_user = 0;
	unblock_signals();
	timer_handler(SIGVTALRM, &regs);
}

void alarm_handler(int sig, struct sigcontext *sc)
void alarm_handler(int sig, mcontext_t *mc)
{
	int enabled;

@@ -102,7 +102,7 @@ void alarm_handler(int sig, struct sigcontext *sc)

	block_signals();

	real_alarm_handler(sc);
	real_alarm_handler(mc);
	set_signals(enabled);
}

@@ -121,7 +121,7 @@ void set_sigstack(void *sig_stack, int size)
		panic("enabling signal stack failed, errno = %d\n", errno);
}

static void (*handlers[_NSIG])(int sig, struct sigcontext *sc) = {
static void (*handlers[_NSIG])(int sig, mcontext_t *mc) = {
	[SIGSEGV] = sig_handler,
	[SIGBUS] = sig_handler,
	[SIGILL] = sig_handler,
@@ -133,8 +133,11 @@ static void (*handlers[_NSIG])(int sig, struct sigcontext *sc) = {
	[SIGVTALRM] = alarm_handler
};

static void handle_signal(int sig, struct sigcontext *sc)

static void hard_handler(int sig, siginfo_t *info, void *p)
{
	struct ucontext *uc = p;
	mcontext_t *mc = &uc->uc_mcontext;
	unsigned long pending = 1UL << sig;

	do {
@@ -160,7 +163,7 @@ static void handle_signal(int sig, struct sigcontext *sc)
		while ((sig = ffs(pending)) != 0){
			sig--;
			pending &= ~(1 << sig);
			(*handlers[sig])(sig, sc);
			(*handlers[sig])(sig, mc);
		}

		/*
@@ -174,12 +177,6 @@ static void handle_signal(int sig, struct sigcontext *sc)
	} while (pending);
}

static void hard_handler(int sig, siginfo_t *info, void *p)
{
	struct ucontext *uc = p;
	handle_signal(sig, (struct sigcontext *) &uc->uc_mcontext);
}

void set_handler(int sig)
{
	struct sigaction action;
+1 −1
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@
#include <sys/time.h>
#include "kern_util.h"
#include "os.h"
#include "process.h"
#include "internal.h"

int set_interval(void)
{
+7 −0
Original line number Diff line number Diff line
@@ -22,4 +22,11 @@
		(fi).trap_no = SC_TRAPNO(sc); \
	}

#define GET_FAULTINFO_FROM_MC(fi, mc) \
	{ \
		(fi).cr2 = (mc)->cr2; \
		(fi).error_code = (mc)->gregs[REG_ERR]; \
		(fi).trap_no = (mc)->gregs[REG_TRAPNO]; \
	}

#endif
Loading