Imported Upstream version 1.2
[platform/upstream/libunwind.git] / src / aarch64 / getcontext.S
similarity index 54%
rename from src/setjmp/setjmp.c
rename to src/aarch64/getcontext.S
index feb83f7..25ed5b6 100644 (file)
@@ -1,6 +1,7 @@
 /* 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.
 
@@ -23,27 +24,29 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 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