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