]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/contrib/ia64/libuwx/test/dumpmyself.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / contrib / ia64 / libuwx / test / dumpmyself.c
1 #include "uwx.h"
2 #include "uwx_self.h"
3
4 struct uwx_env *uenv;
5 struct uwx_self_info *cbinfo;
6
7 extern int uwx_get_frame_info(struct uwx_env *uenv);
8
9 extern void dump_context(uint64_t *context);
10
11 extern void prime_registers();
12
13 int main(int argc, char **argv)
14 {
15     int status;
16     unsigned int *wp;
17     uenv = uwx_init();
18     printf("uwx_init returned %08x\n", uenv);
19     cbinfo = uwx_self_init_info(uenv);
20     status = uwx_register_callbacks(
21                 uenv,
22                 (intptr_t)cbinfo,
23                 uwx_self_copyin,
24                 uwx_self_lookupip);
25     printf("uwx_register_callbacks returned %d\n", status);
26     uwx_self_init_context(uenv);
27     printf("In main():\n");
28     dump_context((uint64_t *)uenv);
29     prime_registers();
30     uwx_free(uenv);
31     return 0;
32 }
33
34 int func1(void)
35 {
36     uwx_self_init_context(uenv);
37     printf("In func1():\n");
38     dump_context((uint64_t *)uenv);
39     return func2();
40 }
41
42 int func2(void)
43 {
44     uwx_self_init_context(uenv);
45     printf("In func2():\n");
46     dump_context((uint64_t *)uenv);
47     return func3();
48 }
49
50 int func3(void)
51 {
52     uwx_self_init_context(uenv);
53     printf("In func3():\n");
54     dump_context((uint64_t *)uenv);
55     return func4();
56 }
57
58 int func4(void)
59 {
60     int status;
61     int foo[10];
62     uint64_t *p;
63     uint64_t disp;
64     uint64_t val;
65
66     func5(foo);
67     uwx_self_init_context(uenv);
68     uwx_init_history(uenv);
69     printf("In func4():\n");
70     dump_context((uint64_t *)uenv);
71     for (;;) {
72         status = uwx_step(uenv);
73         if (status != UWX_OK) {
74             printf("uwx_step returned %d\n", status);
75             break;
76         }
77         status = uwx_get_reg(uenv, UWX_REG_PFS, &val);
78         if (status != UWX_OK) {
79             printf("uwx_get_reg returned %d\n", status);
80             break;
81         }
82         printf("After step:\n");
83         dump_context((uint64_t *)uenv);
84         status = uwx_get_spill_loc(uenv, UWX_REG_IP, &disp);
85         if (status == UWX_OK) {
86             p = (uint64_t *)(disp & ~0x7LL);
87             if ((disp & 0x7) == UWX_DISP_RSTK(0))
88                 printf("IP spilled to backing store %08x = %08x\n",
89                                                     (int)p, (int)(*p));
90             else if ((disp & 0x7) == UWX_DISP_MSTK(0))
91                 printf("IP spilled to mem stack %08x = %08x\n",
92                                                     (int)p, (int)(*p));
93             else if ((disp & 0x7) == UWX_DISP_REG(0))
94                 printf("IP found in register %08x\n", (int)disp >> 4);
95             else
96                 printf("IP history not available\n");
97         }
98     }
99     return 0;
100 }
101
102 int func5(int *foo)
103 {
104     foo[0] = 0;
105     return 0;
106 }