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