/* libunwind - a platform-independent unwind library
- Copyright (C) 2003-2004 Hewlett-Packard Co
- Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+ Copyright (C) 2008 Google, Inc
+ Contributed by Paul Pluzhnikov <ppluzhnikov@google.com>
+ Copyright (C) 2010 Konstantin Belousov <kib@freebsd.org>
This file is part of libunwind.
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-#include <libunwind.h>
-#include <setjmp.h>
-
-#include "jmpbuf.h"
-
-/* Why use K&R syntax here? setjmp() is often a macro and that
- expands into a call to, say, __setjmp() and we need to define the
- libunwind-version of setjmp() with the name of the actual function.
- Using K&R syntax lets us keep the setjmp() macro while keeping the
- syntax valid... This trick works provided setjmp() doesn't do
- anything other than a function call. */
-
-int
-setjmp (env)
- jmp_buf env;
-{
- void **wp = (void **) env;
-
- /* this should work on most platforms, but may not be
- performance-optimal; check the code! */
- wp[JB_SP] = __builtin_frame_address (0);
- wp[JB_RP] = (void *) __builtin_return_address (0);
- return 0;
-}
+#include "offsets.h"
+
+/* int _Uaarch64_getcontext_trace (unw_tdep_context_t *ucp)
+
+ Saves limited machine context in UCP necessary for fast trace. If fast trace
+ fails, caller will have to get the full context.
+*/
+
+ .global _Uaarch64_getcontext_trace
+ .hidden _Uaarch64_getcontext_trace
+ .type _Uaarch64_getcontext_trace, @function
+_Uaarch64_getcontext_trace:
+ .cfi_startproc
+
+ /* Save only FP, SP, PC - exclude this call. */
+ str x29, [x0, #(LINUX_UC_MCONTEXT_OFF + LINUX_SC_X29_OFF)]
+ mov x9, sp
+ str x9, [x0, #(LINUX_UC_MCONTEXT_OFF + LINUX_SC_SP_OFF)]
+ str x30, [x0, #(LINUX_UC_MCONTEXT_OFF + LINUX_SC_PC_OFF)]
+
+ ret
+ .cfi_endproc
+ .size _Uaarch64_getcontext_trace, . - _Uaarch64_getcontext_trace
+
+ /* We do not need executable stack. */
+ .section .note.GNU-stack,"",@progbits