ofp-util: Work on decoding OF1.1 flow_mods.
[openvswitch] / lib / backtrace.c
index 80cae54a6a15310643631fae55718bbb623a2424..c6829d77c19bda1feef4cec6ad8f58ae40266145 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2011 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  */
 
 #include <config.h>
+
 #include "backtrace.h"
+
 #include <errno.h>
 #include <inttypes.h>
 #include <stdbool.h>
 #include <stdio.h>
-#include "compiler.h"
 
-#define THIS_MODULE VLM_backtrace
+#include "compiler.h"
 #include "vlog.h"
 
-static uintptr_t OVS_UNUSED
+VLOG_DEFINE_THIS_MODULE(backtrace);
+
+#ifdef HAVE_BACKTRACE
+#include <execinfo.h>
+void
+backtrace_capture(struct backtrace *b)
+{
+    void *frames[BACKTRACE_MAX_FRAMES];
+    int i;
+
+    b->n_frames = backtrace(frames, BACKTRACE_MAX_FRAMES);
+    for (i = 0; i < b->n_frames; i++) {
+        b->frames[i] = (uintptr_t) frames[i];
+    }
+}
+#elif __GNUC__
+static uintptr_t
 get_max_stack(void)
 {
     static const char file_name[] = "/proc/self/maps";
@@ -69,20 +86,8 @@ stack_high(void)
 static uintptr_t
 stack_low(void)
 {
-#ifdef __i386__
-    uintptr_t low;
-    asm("movl %%esp,%0" : "=g" (low));
-    return low;
-#elif __x86_64__
-    uintptr_t low;
-    asm("movq %%rsp,%0" : "=g" (low));
+    uintptr_t low = (uintptr_t) &low;
     return low;
-#else
-    /* This causes a warning in GCC that cannot be disabled, so use it only on
-     * non-x86. */
-    int dummy;
-    return (uintptr_t) &dummy;
-#endif
 }
 
 static bool
@@ -108,3 +113,10 @@ backtrace_capture(struct backtrace *backtrace)
     }
     backtrace->n_frames = n;
 }
+#else  /* !HAVE_BACKTRACE && !__GNUC__ */
+void
+backtrace_capture(struct backtrace *backtrace)
+{
+    backtrace->n_frames = 0;
+}
+#endif