Module Name: src
Committed By: martin
Date: Wed Mar 23 20:41:31 UTC 2011
Modified Files:
src/sys/arch/sparc/include: trap.h
src/sys/arch/sparc/sparc: syscall.c
src/sys/arch/sparc64/include: trap.h
src/sys/arch/sparc64/sparc64: syscall.c
Log Message:
Add a syscall variant passing the return address in %g5 (we need %g7 for
pthread_self and %g2 is an application register, so we can not use those
anymore).
To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/sparc/include/trap.h
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/sparc/sparc/syscall.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/sparc64/include/trap.h
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/sparc64/sparc64/syscall.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sparc/include/trap.h
diff -u src/sys/arch/sparc/include/trap.h:1.16 src/sys/arch/sparc/include/trap.h:1.17
--- src/sys/arch/sparc/include/trap.h:1.16 Sun Dec 11 12:19:06 2005
+++ src/sys/arch/sparc/include/trap.h Wed Mar 23 20:41:30 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.h,v 1.16 2005/12/11 12:19:06 christos Exp $ */
+/* $NetBSD: trap.h,v 1.17 2011/03/23 20:41:30 martin Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -131,6 +131,7 @@
/* flags to system call (flags in %g1 along with syscall number) */
#define SYSCALL_G2RFLAG 0x400 /* on success, return to %g2 rather than npc */
#define SYSCALL_G7RFLAG 0x800 /* use %g7 as above (deprecated) */
+#define SYSCALL_G5RFLAG 0x1000 /* use %g5 as above (only ABI compatible way) */
/*
* `software trap' macros to keep people happy (sparc v8 manual says not
Index: src/sys/arch/sparc/sparc/syscall.c
diff -u src/sys/arch/sparc/sparc/syscall.c:1.23 src/sys/arch/sparc/sparc/syscall.c:1.24
--- src/sys/arch/sparc/sparc/syscall.c:1.23 Mon Dec 20 00:25:44 2010
+++ src/sys/arch/sparc/sparc/syscall.c Wed Mar 23 20:41:31 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: syscall.c,v 1.23 2010/12/20 00:25:44 matt Exp $ */
+/* $NetBSD: syscall.c,v 1.24 2011/03/23 20:41:31 martin Exp $ */
/*
* Copyright (c) 1996
@@ -49,7 +49,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.23 2010/12/20 00:25:44 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.24 2011/03/23 20:41:31 martin Exp $");
#include "opt_sparc_arch.h"
#include "opt_multiprocessor.h"
@@ -108,8 +108,8 @@
static inline int
handle_new(struct trapframe *tf, register_t *code)
{
- int new = *code & (SYSCALL_G7RFLAG | SYSCALL_G2RFLAG);
- *code &= ~(SYSCALL_G7RFLAG | SYSCALL_G2RFLAG);
+ int new = *code & (SYSCALL_G7RFLAG|SYSCALL_G2RFLAG|SYSCALL_G5RFLAG);
+ *code &= ~(SYSCALL_G7RFLAG|SYSCALL_G2RFLAG|SYSCALL_G5RFLAG);
return new;
}
@@ -249,8 +249,13 @@
tf->tf_out[0] = rval.o[0];
tf->tf_out[1] = rval.o[1];
if (new) {
- /* jmp %g2 (or %g7, deprecated) on success */
- i = tf->tf_global[new & SYSCALL_G2RFLAG ? 2 : 7];
+ /* jmp %g5, (or %g2 or %g7, deprecated) on success */
+ if (new & SYSCALL_G5RFLAG)
+ i = tf->tf_global[5];
+ else if (new & SYSCALL_G2RFLAG)
+ i = tf->tf_global[2];
+ else
+ i = tf->tf_global[7];
if (i & 3) {
error = EINVAL;
goto bad;
@@ -334,8 +339,13 @@
tf->tf_out[0] = rval.o[0];
tf->tf_out[1] = rval.o[1];
if (new) {
- /* jmp %g2 (or %g7, deprecated) on success */
- i = tf->tf_global[new & SYSCALL_G2RFLAG ? 2 : 7];
+ /* jmp %g5, (or %g2 or %g7, deprecated) on success */
+ if (new & SYSCALL_G5RFLAG)
+ i = tf->tf_global[5];
+ else if (new & SYSCALL_G2RFLAG)
+ i = tf->tf_global[2];
+ else
+ i = tf->tf_global[7];
if (i & 3) {
error = EINVAL;
goto bad;
Index: src/sys/arch/sparc64/include/trap.h
diff -u src/sys/arch/sparc64/include/trap.h:1.7 src/sys/arch/sparc64/include/trap.h:1.8
--- src/sys/arch/sparc64/include/trap.h:1.7 Mon Dec 13 06:40:13 2010
+++ src/sys/arch/sparc64/include/trap.h Wed Mar 23 20:41:31 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.h,v 1.7 2010/12/13 06:40:13 mrg Exp $ */
+/* $NetBSD: trap.h,v 1.8 2011/03/23 20:41:31 martin Exp $ */
/*
* Copyright (c) 1996-1999 Eduardo Horvath
@@ -142,6 +142,7 @@
/* flags to system call (flags in %g1 along with syscall number) */
#define SYSCALL_G2RFLAG 0x400 /* on success, return to %g2 rather than npc */
#define SYSCALL_G7RFLAG 0x800 /* use %g7 as above (deprecated) */
+#define SYSCALL_G5RFLAG 0x1000 /* use %g5 as above (only ABI compatible way) */
/*
* `software trap' macros to keep people happy (sparc v8 manual says not
Index: src/sys/arch/sparc64/sparc64/syscall.c
diff -u src/sys/arch/sparc64/sparc64/syscall.c:1.37 src/sys/arch/sparc64/sparc64/syscall.c:1.38
--- src/sys/arch/sparc64/sparc64/syscall.c:1.37 Fri Apr 23 19:18:10 2010
+++ src/sys/arch/sparc64/sparc64/syscall.c Wed Mar 23 20:41:31 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: syscall.c,v 1.37 2010/04/23 19:18:10 rmind Exp $ */
+/* $NetBSD: syscall.c,v 1.38 2011/03/23 20:41:31 martin Exp $ */
/*-
* Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -79,7 +79,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.37 2010/04/23 19:18:10 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.38 2011/03/23 20:41:31 martin Exp $");
#include "opt_sa.h"
@@ -127,12 +127,18 @@
static inline int
handle_old(struct trapframe64 *tf, register_t *code)
{
- int new = *code & (SYSCALL_G7RFLAG | SYSCALL_G2RFLAG);
- *code &= ~(SYSCALL_G7RFLAG | SYSCALL_G2RFLAG);
- if (new)
- tf->tf_pc = tf->tf_global[new & SYSCALL_G2RFLAG ? 2 : 7];
- else
+ int new = *code & (SYSCALL_G7RFLAG|SYSCALL_G2RFLAG|SYSCALL_G5RFLAG);
+ *code &= ~(SYSCALL_G7RFLAG|SYSCALL_G2RFLAG|SYSCALL_G5RFLAG);
+ if (new) {
+ if (new & SYSCALL_G5RFLAG)
+ tf->tf_pc = tf->tf_global[5];
+ else if (new & SYSCALL_G7RFLAG)
+ tf->tf_pc = tf->tf_global[7];
+ else
+ tf->tf_pc = tf->tf_global[2];
+ } else {
tf->tf_pc = tf->tf_npc;
+ }
return new;
}