Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 28 Apr 2002 20:34:41 -0700 (PDT)
From:      Jake Burkholder <jake@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 10430 for review
Message-ID:  <200204290334.g3T3YfP21329@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://people.freebsd.org/~peter/p4db/chv.cgi?CH=10430

Change 10430 by jake@jake_sparc64 on 2002/04/28 20:34:31

	Add support for an alternate signal trampoline, registered with
	a system call.  Add sysarch(SPARC_SIGTRAMP_INSTALL).

Affected files ...

... //depot/projects/sparc64/sys/sparc64/include/proc.h#10 edit
... //depot/projects/sparc64/sys/sparc64/include/sysarch.h#4 edit
... //depot/projects/sparc64/sys/sparc64/sparc64/machdep.c#77 edit
... //depot/projects/sparc64/sys/sparc64/sparc64/sys_machdep.c#12 edit
... //depot/projects/sparc64/sys/sparc64/sparc64/vm_machdep.c#52 edit

Differences ...

==== //depot/projects/sparc64/sys/sparc64/include/proc.h#10 (text+ko) ====

@@ -52,6 +52,7 @@
 
 struct mdproc {
 	struct	md_utrap *md_utrap;
+	void	*md_sigtramp;
 };
 
 #endif /* !_MACHINE_PROC_H_ */

==== //depot/projects/sparc64/sys/sparc64/include/sysarch.h#4 (text+ko) ====

@@ -41,12 +41,18 @@
 #define _MACHINE_SYSARCH_H_
 
 #define	SPARC_UTRAP_INSTALL	1
+#define	SPARC_SIGTRAMP_INSTALL	2
 
 struct sparc_utrap_install_args {
 	int num;
 	const struct sparc_utrap_args *handlers;
 };
 
+struct sparc_sigtramp_install_args {
+	void	*sia_new;
+	void	**sia_old;
+};
+
 struct sparc_utrap_args {
 	utrap_entry_t type;
 	utrap_handler_t new_precise;

==== //depot/projects/sparc64/sys/sparc64/sparc64/machdep.c#77 (text+ko) ====

@@ -282,6 +282,7 @@
 	 * Initialize proc0 stuff (p_contested needs to be done early).
 	 */
 	proc_linkup(&proc0, &proc0.p_ksegrp, &proc0.p_kse, &thread0);
+	proc0.p_md.md_sigtramp = NULL;
 	proc0.p_md.md_utrap = NULL;
 	proc0.p_uarea = (struct user *)uarea0;
 	proc0.p_stats = &proc0.p_uarea->u_stats;
@@ -421,7 +422,10 @@
 		/* NOTREACHED */
 	}
 
-	tf->tf_tpc = PS_STRINGS - *(p->p_sysent->sv_szsigcode);
+	if (p->p_md.md_sigtramp != NULL)
+		tf->tf_tpc = (u_long)p->p_md.md_sigtramp;
+	else
+		tf->tf_tpc = PS_STRINGS - *(p->p_sysent->sv_szsigcode);
 	tf->tf_tnpc = tf->tf_tpc + 4;
 	tf->tf_sp = (u_long)fp - SPOFF;
 
@@ -583,6 +587,7 @@
 	u_long sp;
 
 	/* XXX no cpu_exec */
+	td->td_proc->p_md.md_sigtramp = NULL;
 	if ((ut = td->td_proc->p_md.md_utrap) != NULL) {
 		ut->ut_refcnt--;
 		if (ut->ut_refcnt == 0)

==== //depot/projects/sparc64/sys/sparc64/sparc64/sys_machdep.c#12 (text+ko) ====

@@ -35,6 +35,7 @@
 #include <machine/utrap.h>
 #include <machine/sysarch.h>
 
+static int sparc_sigtramp_install(struct thread *td, char *args);
 static int sparc_utrap_install(struct thread *td, char *args);
 
 #ifndef	_SYS_SYSPROTO_H_
@@ -51,6 +52,9 @@
 
 	error = 0;
 	switch (uap->op) {
+	case SPARC_SIGTRAMP_INSTALL:
+		error = sparc_sigtramp_install(td, uap->parms);
+		break;
 	case SPARC_UTRAP_INSTALL:
 		error = sparc_utrap_install(td, uap->parms);
 		break;
@@ -62,6 +66,24 @@
 }
 
 static int
+sparc_sigtramp_install(struct thread *td, char *args)
+{
+	struct sparc_sigtramp_install_args sia;
+	struct proc *p;
+	int error;
+
+	p = td->td_proc;
+	if ((error = copyin(args, &sia, sizeof(sia))) != 0)
+		return (error);
+	if (sia.sia_old != NULL) {
+		if (suword(sia.sia_old, (long)p->p_md.md_sigtramp) != 0)
+			return (EFAULT);
+	}
+	p->p_md.md_sigtramp = sia.sia_new;
+	return (0);
+}
+
+static int
 sparc_utrap_install(struct thread *td, char *args)
 {
 	struct sparc_utrap_install_args uia;

==== //depot/projects/sparc64/sys/sparc64/sparc64/vm_machdep.c#52 (text+ko) ====

@@ -116,6 +116,7 @@
 	struct proc *p;
 
 	p = td->td_proc;
+	p->p_md.md_sigtramp = NULL;
 	if ((ut = p->p_md.md_utrap) != NULL) {
 		ut->ut_refcnt--;
 		if (ut->ut_refcnt == 0)
@@ -170,6 +171,7 @@
 	if ((flags & RFPROC) == 0)
 		return;
 
+	p2->p_md.md_sigtramp = td1->td_proc->p_md.md_sigtramp;
 	if ((ut = td1->td_proc->p_md.md_utrap) != NULL)
 		ut->ut_refcnt++;
 	p2->p_md.md_utrap = ut;

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe p4-projects" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200204290334.g3T3YfP21329>