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