Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/arm split PUSHFRAMEINSVC into two pieces so that we...
details: https://anonhg.NetBSD.org/src/rev/f681fb54a688
branches: trunk
changeset: 354980:f681fb54a688
user: chs <chs%NetBSD.org@localhost>
date: Fri Jul 07 00:34:09 2017 +0000
description:
split PUSHFRAMEINSVC into two pieces so that we can insert some additional
instructions in the middle in undefinedinstruction_bounce, namely to add
some additional space on the stack before the trapframe for undefineds from
SVC mode. this extra space allows dtrace to emulate a "push" instruction.
the initial version was from me and some improvements were from nick.
diffstat:
sys/arch/arm/arm32/exception.S | 8 +++++---
sys/arch/arm/include/arm32/frame.h | 25 +++++++++++++++++++++----
2 files changed, 26 insertions(+), 7 deletions(-)
diffs (86 lines):
diff -r b21e5852bf22 -r f681fb54a688 sys/arch/arm/arm32/exception.S
--- a/sys/arch/arm/arm32/exception.S Thu Jul 06 22:10:14 2017 +0000
+++ b/sys/arch/arm/arm32/exception.S Fri Jul 07 00:34:09 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: exception.S,v 1.23 2015/06/21 15:00:06 matt Exp $ */
+/* $NetBSD: exception.S,v 1.24 2017/07/07 00:34:09 chs Exp $ */
/*
* Copyright (c) 1994-1997 Mark Brinicombe.
@@ -51,7 +51,7 @@
#include <arm/locore.h>
- RCSID("$NetBSD: exception.S,v 1.23 2015/06/21 15:00:06 matt Exp $")
+ RCSID("$NetBSD: exception.S,v 1.24 2017/07/07 00:34:09 chs Exp $")
.text
.align 0
@@ -258,7 +258,9 @@
*/
ENTRY_NP(undefinedinstruction_bounce)
- PUSHFRAMEINSVC
+ PUSHXXXREGSANDSWITCH
+ PUSHDTRACEGAP
+ PUSHTRAPFRAME(r2)
ENABLE_ALIGNMENT_FAULTS
mov r0, sp
diff -r b21e5852bf22 -r f681fb54a688 sys/arch/arm/include/arm32/frame.h
--- a/sys/arch/arm/include/arm32/frame.h Thu Jul 06 22:10:14 2017 +0000
+++ b/sys/arch/arm/include/arm32/frame.h Fri Jul 07 00:34:09 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: frame.h,v 1.43 2017/06/22 08:44:21 skrll Exp $ */
+/* $NetBSD: frame.h,v 1.44 2017/07/07 00:34:09 chs Exp $ */
/*
* Copyright (c) 1994-1997 Mark Brinicombe.
@@ -95,6 +95,7 @@
#include "opt_cpuoptions.h"
#include "opt_arm_debug.h"
#include "opt_cputypes.h"
+#include "opt_dtrace.h"
#include <arm/locore.h>
@@ -440,13 +441,25 @@
msr cpsr_c, tmp /* Punch into SVC mode */
#endif
-#define PUSHFRAMEINSVC \
+#define PUSHXXXREGSANDSWITCH \
stmdb sp, {r0-r3}; /* Save 4 registers */ \
mov r0, lr; /* Save xxx32 r14 */ \
mov r1, sp; /* Save xxx32 sp */ \
mrs r3, spsr; /* Save xxx32 spsr */ \
- SET_CPSR_MODE(r2, PSR_SVC32_MODE); \
- bic r2, sp, #7; /* Align new SVC sp */ \
+ SET_CPSR_MODE(r2, PSR_SVC32_MODE)
+
+#ifdef KDTRACE_HOOKS
+#define PUSHDTRACEGAP \
+ and r2, r3, #(PSR_MODE); \
+ cmp r2, #(PSR_SVC32_MODE); /* were we in SVC mode? */ \
+ mov r2, sp; \
+ subeq r2, r2, #(4 * 16); /* if so, leave a gap for dtrace */
+#else
+#define PUSHDTRACEGAP /* nothing */
+#endif
+
+#define PUSHTRAPFRAME(rX) \
+ bic r2, rX, #7; /* Align new SVC sp */ \
str r0, [r2, #-4]!; /* Push return address */ \
stmdb r2!, {sp, lr}; /* Push SVC sp, lr */ \
mov sp, r2; /* Keep stack aligned */ \
@@ -458,6 +471,10 @@
mrs r0, spsr; /* Get the SPSR */ \
str r0, [sp, #-TF_R0]! /* Push the SPSR onto the stack */
+#define PUSHFRAMEINSVC \
+ PUSHXXXREGSANDSWITCH; \
+ PUSHTRAPFRAME(sp)
+
/*
* PULLFRAMEFROMSVCANDEXIT - macro to pull a trap frame from the stack
* in SVC32 mode and restore the saved processor mode and PC.
Home |
Main Index |
Thread Index |
Old Index