From owner-p4-projects Sun Apr 28 20:34:54 2002 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7933337B419; Sun, 28 Apr 2002 20:34:42 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id 9875737B400 for ; Sun, 28 Apr 2002 20:34:41 -0700 (PDT) Received: (from perforce@localhost) by freefall.freebsd.org (8.11.6/8.11.6) id g3T3YfP21329 for perforce@freebsd.org; Sun, 28 Apr 2002 20:34:41 -0700 (PDT) (envelope-from jake@freebsd.org) Date: Sun, 28 Apr 2002 20:34:41 -0700 (PDT) Message-Id: <200204290334.g3T3YfP21329@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: perforce set sender to jake@freebsd.org using -f From: Jake Burkholder Subject: PERFORCE change 10430 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG 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 #include +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