1115013Smarcel#include "uwx.h"
2115013Smarcel#include "uwx_self.h"
3115013Smarcel
4115013Smarcelstruct uwx_env *uenv;
5115013Smarcelstruct uwx_self_info *cbinfo;
6115013Smarcel
7115013Smarcelextern int uwx_get_frame_info(struct uwx_env *uenv);
8115013Smarcel
9115013Smarcelextern void dump_context(uint64_t *context);
10115013Smarcel
11121642Smarcelextern void prime_registers();
12121642Smarcel
13115013Smarcelint main(int argc, char **argv)
14115013Smarcel{
15115013Smarcel    int status;
16115013Smarcel    unsigned int *wp;
17115013Smarcel    uenv = uwx_init();
18115013Smarcel    printf("uwx_init returned %08x\n", uenv);
19115013Smarcel    cbinfo = uwx_self_init_info(uenv);
20115013Smarcel    status = uwx_register_callbacks(
21115013Smarcel		uenv,
22115013Smarcel		(intptr_t)cbinfo,
23115013Smarcel		uwx_self_copyin,
24115013Smarcel		uwx_self_lookupip);
25115013Smarcel    printf("uwx_register_callbacks returned %d\n", status);
26115013Smarcel    uwx_self_init_context(uenv);
27115013Smarcel    printf("In main():\n");
28115013Smarcel    dump_context((uint64_t *)uenv);
29121642Smarcel    prime_registers();
30115013Smarcel    uwx_free(uenv);
31115013Smarcel    return 0;
32115013Smarcel}
33115013Smarcel
34121642Smarcelint func1(void)
35115013Smarcel{
36115013Smarcel    uwx_self_init_context(uenv);
37121642Smarcel    printf("In func1():\n");
38115013Smarcel    dump_context((uint64_t *)uenv);
39121642Smarcel    return func2();
40115013Smarcel}
41115013Smarcel
42121642Smarcelint func2(void)
43115013Smarcel{
44115013Smarcel    uwx_self_init_context(uenv);
45121642Smarcel    printf("In func2():\n");
46115013Smarcel    dump_context((uint64_t *)uenv);
47121642Smarcel    return func3();
48115013Smarcel}
49115013Smarcel
50121642Smarcelint func3(void)
51115013Smarcel{
52115013Smarcel    uwx_self_init_context(uenv);
53121642Smarcel    printf("In func3():\n");
54115013Smarcel    dump_context((uint64_t *)uenv);
55121642Smarcel    return func4();
56115013Smarcel}
57115013Smarcel
58121642Smarcelint func4(void)
59115013Smarcel{
60115013Smarcel    int status;
61115013Smarcel    int foo[10];
62121642Smarcel    uint64_t *p;
63121642Smarcel    uint64_t disp;
64121642Smarcel    uint64_t val;
65121642Smarcel
66121642Smarcel    func5(foo);
67115013Smarcel    uwx_self_init_context(uenv);
68121642Smarcel    uwx_init_history(uenv);
69121642Smarcel    printf("In func4():\n");
70115013Smarcel    dump_context((uint64_t *)uenv);
71115013Smarcel    for (;;) {
72115013Smarcel	status = uwx_step(uenv);
73121642Smarcel	if (status != UWX_OK) {
74121642Smarcel	    printf("uwx_step returned %d\n", status);
75115013Smarcel	    break;
76121642Smarcel	}
77121642Smarcel	status = uwx_get_reg(uenv, UWX_REG_PFS, &val);
78121642Smarcel	if (status != UWX_OK) {
79121642Smarcel	    printf("uwx_get_reg returned %d\n", status);
80121642Smarcel	    break;
81121642Smarcel	}
82115013Smarcel	printf("After step:\n");
83115013Smarcel	dump_context((uint64_t *)uenv);
84121642Smarcel	status = uwx_get_spill_loc(uenv, UWX_REG_IP, &disp);
85121642Smarcel	if (status == UWX_OK) {
86121642Smarcel	    p = (uint64_t *)(disp & ~0x7LL);
87121642Smarcel	    if ((disp & 0x7) == UWX_DISP_RSTK(0))
88121642Smarcel		printf("IP spilled to backing store %08x = %08x\n",
89121642Smarcel						    (int)p, (int)(*p));
90121642Smarcel	    else if ((disp & 0x7) == UWX_DISP_MSTK(0))
91121642Smarcel		printf("IP spilled to mem stack %08x = %08x\n",
92121642Smarcel						    (int)p, (int)(*p));
93121642Smarcel	    else if ((disp & 0x7) == UWX_DISP_REG(0))
94121642Smarcel		printf("IP found in register %08x\n", (int)disp >> 4);
95121642Smarcel	    else
96121642Smarcel		printf("IP history not available\n");
97121642Smarcel	}
98115013Smarcel    }
99115013Smarcel    return 0;
100115013Smarcel}
101115013Smarcel
102121642Smarcelint func5(int *foo)
103115013Smarcel{
104115013Smarcel    foo[0] = 0;
105115013Smarcel    return 0;
106115013Smarcel}
107