aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/util/memleak/getreti386.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/util/memleak/getreti386.c')
-rw-r--r--nx-X11/util/memleak/getreti386.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/nx-X11/util/memleak/getreti386.c b/nx-X11/util/memleak/getreti386.c
new file mode 100644
index 000000000..80038b7cc
--- /dev/null
+++ b/nx-X11/util/memleak/getreti386.c
@@ -0,0 +1,54 @@
+/*
+ * some bits copied from mprof by Ben Zorn
+ *
+ * Copyright (c) 1995 Jeffrey Hsu
+ */
+
+/* $XFree86: xc/util/memleak/getreti386.c,v 3.2 1996/10/16 14:46:28 dawes Exp $ */
+
+#define get_current_fp(first_local) ((unsigned)&(first_local) + 4)
+#define prev_fp_from_fp(fp) *((unsigned *) fp)
+#define ret_addr_from_fp(fp) *((unsigned *) (fp+4))
+
+#ifdef __FreeBSD__
+#define CRT0_ADDRESS 0x10d3
+#endif
+#if defined(__NetBSD__) || defined(__OpenBSD__)
+#define CRT0_ADDRESS 0x109a
+#endif
+#ifdef linux
+#define CRT0_ADDRESS 0x80482fc
+#endif
+
+static unsigned long
+junk (int *foo)
+{
+ return (unsigned long) foo + 4;
+}
+
+void
+getStackTrace(unsigned long *results, int max)
+{
+
+ int first_local;
+ unsigned long fp, ret_addr;
+
+ first_local = 0;
+ fp = junk(&first_local);
+ fp = get_current_fp(first_local);
+ ret_addr = ret_addr_from_fp(fp);
+
+ while (ret_addr > CRT0_ADDRESS && max-- > 1) {
+ *results++ = ret_addr;
+ if (fp < (unsigned long) &first_local)
+ break;
+ fp = prev_fp_from_fp(fp);
+ if (!fp)
+ break;
+ if (fp < (unsigned long) &first_local)
+ break;
+ ret_addr = ret_addr_from_fp(fp);
+ }
+ *results++ = 0;
+
+}