1#include "uwx.h"
2#include "uwx_self.h"
3
4struct uwx_env *uenv;
5struct uwx_self_info *cbinfo;
6
7extern int uwx_get_frame_info(struct uwx_env *uenv);
8
9extern void dump_context(uint64_t *context);
10
11extern void prime_registers();
12
13int 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
34int 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
42int 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
50int 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
58int 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
102int func5(int *foo)
103{
104    foo[0] = 0;
105    return 0;
106}
107