summaryrefslogtreecommitdiffstats
path: root/sys/contrib/ia64/libuwx/test/dumpmyself.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/ia64/libuwx/test/dumpmyself.c')
-rw-r--r--sys/contrib/ia64/libuwx/test/dumpmyself.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/sys/contrib/ia64/libuwx/test/dumpmyself.c b/sys/contrib/ia64/libuwx/test/dumpmyself.c
new file mode 100644
index 0000000..c2b63d0
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/test/dumpmyself.c
@@ -0,0 +1,106 @@
+#include "uwx.h"
+#include "uwx_self.h"
+
+struct uwx_env *uenv;
+struct uwx_self_info *cbinfo;
+
+extern int uwx_get_frame_info(struct uwx_env *uenv);
+
+extern void dump_context(uint64_t *context);
+
+extern void prime_registers();
+
+int main(int argc, char **argv)
+{
+ int status;
+ unsigned int *wp;
+ uenv = uwx_init();
+ printf("uwx_init returned %08x\n", uenv);
+ cbinfo = uwx_self_init_info(uenv);
+ status = uwx_register_callbacks(
+ uenv,
+ (intptr_t)cbinfo,
+ uwx_self_copyin,
+ uwx_self_lookupip);
+ printf("uwx_register_callbacks returned %d\n", status);
+ uwx_self_init_context(uenv);
+ printf("In main():\n");
+ dump_context((uint64_t *)uenv);
+ prime_registers();
+ uwx_free(uenv);
+ return 0;
+}
+
+int func1(void)
+{
+ uwx_self_init_context(uenv);
+ printf("In func1():\n");
+ dump_context((uint64_t *)uenv);
+ return func2();
+}
+
+int func2(void)
+{
+ uwx_self_init_context(uenv);
+ printf("In func2():\n");
+ dump_context((uint64_t *)uenv);
+ return func3();
+}
+
+int func3(void)
+{
+ uwx_self_init_context(uenv);
+ printf("In func3():\n");
+ dump_context((uint64_t *)uenv);
+ return func4();
+}
+
+int func4(void)
+{
+ int status;
+ int foo[10];
+ uint64_t *p;
+ uint64_t disp;
+ uint64_t val;
+
+ func5(foo);
+ uwx_self_init_context(uenv);
+ uwx_init_history(uenv);
+ printf("In func4():\n");
+ dump_context((uint64_t *)uenv);
+ for (;;) {
+ status = uwx_step(uenv);
+ if (status != UWX_OK) {
+ printf("uwx_step returned %d\n", status);
+ break;
+ }
+ status = uwx_get_reg(uenv, UWX_REG_PFS, &val);
+ if (status != UWX_OK) {
+ printf("uwx_get_reg returned %d\n", status);
+ break;
+ }
+ printf("After step:\n");
+ dump_context((uint64_t *)uenv);
+ status = uwx_get_spill_loc(uenv, UWX_REG_IP, &disp);
+ if (status == UWX_OK) {
+ p = (uint64_t *)(disp & ~0x7LL);
+ if ((disp & 0x7) == UWX_DISP_RSTK(0))
+ printf("IP spilled to backing store %08x = %08x\n",
+ (int)p, (int)(*p));
+ else if ((disp & 0x7) == UWX_DISP_MSTK(0))
+ printf("IP spilled to mem stack %08x = %08x\n",
+ (int)p, (int)(*p));
+ else if ((disp & 0x7) == UWX_DISP_REG(0))
+ printf("IP found in register %08x\n", (int)disp >> 4);
+ else
+ printf("IP history not available\n");
+ }
+ }
+ return 0;
+}
+
+int func5(int *foo)
+{
+ foo[0] = 0;
+ return 0;
+}
OpenPOWER on IntegriCloud