summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4u
diff options
context:
space:
mode:
authoredp <none@none>2007-04-30 16:52:44 -0700
committeredp <none@none>2007-04-30 16:52:44 -0700
commit59f2ff5c96304fcfa3d97e66fbe1c521f42ac103 (patch)
tree83f79c6c2972601c696eb9acd8f395cd5383ab83 /usr/src/uts/sun4u
parent5888947a459aa6129cfa764f1718fd91d66ca935 (diff)
downloadillumos-joyent-59f2ff5c96304fcfa3d97e66fbe1c521f42ac103.tar.gz
6545740 sparc brandz syscall wrappers only exist on DEBUG kernels
Diffstat (limited to 'usr/src/uts/sun4u')
-rw-r--r--usr/src/uts/sun4u/ml/trap_table.s62
1 files changed, 35 insertions, 27 deletions
diff --git a/usr/src/uts/sun4u/ml/trap_table.s b/usr/src/uts/sun4u/ml/trap_table.s
index 8972d229ee..42fd217205 100644
--- a/usr/src/uts/sun4u/ml/trap_table.s
+++ b/usr/src/uts/sun4u/ml/trap_table.s
@@ -177,20 +177,38 @@
.align 32
/*
- * SYSCALL is used for system calls on both ILP32 and LP64 kernels
- * depending on the "which" parameter (should be syscall_trap,
- * syscall_trap32, or nosys for unused system call traps).
+ * SYSCALL is used for unsupported syscall interfaces (with 'which'
+ * set to 'nosys') and legacy support of old SunOS 4.x syscalls (with
+ * 'which' set to 'syscall_trap32').
+ *
+ * The SYSCALL_TRAP* macros are used for syscall entry points.
+ * SYSCALL_TRAP is used to support LP64 syscalls and SYSCALL_TRAP32
+ * is used to support ILP32. Each macro can only be used once
+ * since they each define a symbol. The symbols are used as hot patch
+ * points by the brand infrastructure to dynamically enable and disable
+ * brand syscall interposition. See the comments around BRAND_CALLBACK
+ * and brand_plat_interposition_enable() for more information.
*/
-#define SYSCALL(which) \
- TT_TRACE(trace_gen) ;\
- SYSCALL_NOTT(which)
-
#define SYSCALL_NOTT(which) \
set (which), %g1 ;\
ba,pt %xcc, sys_trap ;\
sub %g0, 1, %g4 ;\
.align 32
+#define SYSCALL(which) \
+ TT_TRACE(trace_gen) ;\
+ SYSCALL_NOTT(which)
+
+#define SYSCALL_TRAP32 \
+ TT_TRACE(trace_gen) ;\
+ ALTENTRY(syscall_trap32_patch_point) \
+ SYSCALL_NOTT(syscall_trap32)
+
+#define SYSCALL_TRAP \
+ TT_TRACE(trace_gen) ;\
+ ALTENTRY(syscall_trap_patch_point) \
+ SYSCALL_NOTT(syscall_trap)
+
#define FLUSHW() \
set trap, %g1 ;\
mov T_FLUSHW, %g3 ;\
@@ -1444,11 +1462,7 @@ trap_table0:
BAD; /* 105 range check ?? */
GOTO(.fix_alignment); /* 106 do unaligned references */
BAD; /* 107 unused */
-#ifndef DEBUG
- SYSCALL(syscall_trap32); /* 108 ILP32 system call on LP64 */
-#else /* DEBUG */
- GOTO(syscall_wrapper32); /* 108 ILP32 system call on LP64 */
-#endif /* DEBUG */
+ SYSCALL_TRAP32; /* 108 ILP32 system call on LP64 */
GOTO(set_trap0_addr); /* 109 set trap0 address */
BAD; BAD; BAD4; /* 10A - 10F unused */
TRP4; TRP4; TRP4; TRP4; /* 110 - 11F V9 user trap handlers */
@@ -1468,11 +1482,7 @@ trap_table0:
BAD; /* 139 unused */
DTRACE_RETURN; /* 13A dtrace pid return probe */
BAD; BAD4; /* 13B - 13F unused */
-#ifndef DEBUG
- SYSCALL(syscall_trap); /* 140 LP64 system call */
-#else /* DEBUG */
- GOTO(syscall_wrapper); /* 140 LP64 system call */
-#endif /* DEBUG */
+ SYSCALL_TRAP; /* 140 LP64 system call */
SYSCALL(nosys); /* 141 unused system call trap */
#ifdef DEBUG_USER_TRAPTRACECTL
GOTO(.traptrace_freeze); /* 142 freeze traptrace */
@@ -3012,13 +3022,15 @@ fast_trap_dummy_call:
retl
nop
-#ifdef DEBUG
/*
- * Currently we only support syscall interposition for branded zones on
- * DEBUG kernels. The only brand that makes use of this functionality is
- * the fake Solaris 10 brand. Since this brand is only used for exercising
- * the framework, we don't want this overhead incurred on production
- * systems.
+ * Currently the brand syscall interposition code is not enabled by
+ * default. Instead, when a branded zone is first booted the brand
+ * infrastructure will patch the trap table so that the syscall
+ * entry points are redirected to syscall_wrapper32 and syscall_wrapper
+ * for ILP32 and LP64 syscalls respectively. this is done in
+ * brand_plat_interposition_enable(). Note that the syscall wrappers
+ * below do not collect any trap trace data since the syscall hot patch
+ * points are reached after trap trace data has already been collected.
*/
#define BRAND_CALLBACK(callback_id) \
CPU_ADDR(%g2, %g1) /* load CPU struct addr to %g2 */ ;\
@@ -3047,17 +3059,13 @@ fast_trap_dummy_call:
1:
ENTRY_NP(syscall_wrapper32)
- TT_TRACE(trace_gen)
BRAND_CALLBACK(BRAND_CB_SYSCALL32)
SYSCALL_NOTT(syscall_trap32)
SET_SIZE(syscall_wrapper32)
ENTRY_NP(syscall_wrapper)
- TT_TRACE(trace_gen)
BRAND_CALLBACK(BRAND_CB_SYSCALL)
SYSCALL_NOTT(syscall_trap)
SET_SIZE(syscall_wrapper)
-#endif /* DEBUG */
-
#endif /* lint */