1182918Smarius#include "uwx.h"
2182918Smarius#include "uwx_self.h"
3182918Smarius
4182918Smariusstruct uwx_env *uenv;
5182918Smariusstruct uwx_self_info *cbinfo;
6182918Smarius
7182918Smariusextern int uwx_get_frame_info(struct uwx_env *uenv);
8182918Smarius
9182918Smariusextern void dump_context(uint64_t *context);
10182918Smarius
11182918Smariusextern void prime_registers();
12182918Smarius
13182918Smariusint main(int argc, char **argv)
14182918Smarius{
15182918Smarius    int status;
16182918Smarius    unsigned int *wp;
17182918Smarius    uenv = uwx_init();
18182918Smarius    printf("uwx_init returned %08x\n", uenv);
19182918Smarius    cbinfo = uwx_self_init_info(uenv);
20182918Smarius    status = uwx_register_callbacks(
21182918Smarius		uenv,
22182918Smarius		(intptr_t)cbinfo,
23182918Smarius		uwx_self_copyin,
24182918Smarius		uwx_self_lookupip);
25182918Smarius    printf("uwx_register_callbacks returned %d\n", status);
26182918Smarius    uwx_self_init_context(uenv);
27182918Smarius    printf("In main():\n");
28182918Smarius    dump_context((uint64_t *)uenv);
29182918Smarius    prime_registers();
30182918Smarius    uwx_free(uenv);
31182918Smarius    return 0;
32182918Smarius}
33182918Smarius
34182918Smariusint func1(void)
35182918Smarius{
36182918Smarius    uwx_self_init_context(uenv);
37182918Smarius    printf("In func1():\n");
38182918Smarius    dump_context((uint64_t *)uenv);
39182918Smarius    return func2();
40182918Smarius}
41182918Smarius
42182918Smariusint func2(void)
43197164Smarius{
44197164Smarius    uwx_self_init_context(uenv);
45197164Smarius    printf("In func2():\n");
46197164Smarius    dump_context((uint64_t *)uenv);
47182918Smarius    return func3();
48182918Smarius}
49182918Smarius
50182918Smariusint func3(void)
51182918Smarius{
52182918Smarius    uwx_self_init_context(uenv);
53182918Smarius    printf("In func3():\n");
54182918Smarius    dump_context((uint64_t *)uenv);
55182918Smarius    return func4();
56182918Smarius}
57182918Smarius
58182918Smariusint func4(void)
59182918Smarius{
60182918Smarius    int status;
61182918Smarius    int foo[10];
62182918Smarius    uint64_t *p;
63182918Smarius    uint64_t disp;
64182918Smarius    uint64_t val;
65182918Smarius
66182918Smarius    func5(foo);
67182918Smarius    uwx_self_init_context(uenv);
68182918Smarius    uwx_init_history(uenv);
69182918Smarius    printf("In func4():\n");
70182918Smarius    dump_context((uint64_t *)uenv);
71182918Smarius    for (;;) {
72182918Smarius	status = uwx_step(uenv);
73182918Smarius	if (status != UWX_OK) {
74182918Smarius	    printf("uwx_step returned %d\n", status);
75182918Smarius	    break;
76182918Smarius	}
77182918Smarius	status = uwx_get_reg(uenv, UWX_REG_PFS, &val);
78182918Smarius	if (status != UWX_OK) {
79182918Smarius	    printf("uwx_get_reg returned %d\n", status);
80182918Smarius	    break;
81182918Smarius	}
82182918Smarius	printf("After step:\n");
83182918Smarius	dump_context((uint64_t *)uenv);
84182918Smarius	status = uwx_get_spill_loc(uenv, UWX_REG_IP, &disp);
85227848Smarius	if (status == UWX_OK) {
86182918Smarius	    p = (uint64_t *)(disp & ~0x7LL);
87182918Smarius	    if ((disp & 0x7) == UWX_DISP_RSTK(0))
88182918Smarius		printf("IP spilled to backing store %08x = %08x\n",
89182918Smarius						    (int)p, (int)(*p));
90182918Smarius	    else if ((disp & 0x7) == UWX_DISP_MSTK(0))
91182918Smarius		printf("IP spilled to mem stack %08x = %08x\n",
92182918Smarius						    (int)p, (int)(*p));
93182918Smarius	    else if ((disp & 0x7) == UWX_DISP_REG(0))
94182918Smarius		printf("IP found in register %08x\n", (int)disp >> 4);
95182918Smarius	    else
96182918Smarius		printf("IP history not available\n");
97182918Smarius	}
98182918Smarius    }
99182918Smarius    return 0;
100182918Smarius}
101182918Smarius
102182918Smariusint func5(int *foo)
103182918Smarius{
104182918Smarius    foo[0] = 0;
105182918Smarius    return 0;
106182918Smarius}
107182918Smarius