nkeynes@2: #include nkeynes@2: #include "mem.h" nkeynes@2: nkeynes@2: struct watch_point { nkeynes@2: uint32_t start; nkeynes@2: uint32_t end; nkeynes@2: int flags; nkeynes@2: }; nkeynes@2: nkeynes@2: struct watch_point *watch_arr = NULL; nkeynes@2: int watch_count = 0, watch_capacity = 0; nkeynes@2: nkeynes@2: nkeynes@2: watch_point_t mem_new_watch( uint32_t start, uint32_t end, int flags ) nkeynes@2: { nkeynes@2: int num; nkeynes@2: if( watch_arr == NULL ) { nkeynes@2: watch_capacity = 10; nkeynes@2: watch_arr = calloc( sizeof(struct watch_point), watch_capacity ); nkeynes@2: num = 0; nkeynes@2: } else if( watch_count == watch_capacity ) { nkeynes@2: struct watch_point *tmp = realloc( watch_arr, sizeof(struct watch_point) * watch_capacity * 2 ); nkeynes@2: if( tmp == NULL ) nkeynes@2: return NULL; nkeynes@2: watch_arr = tmp; nkeynes@2: memset( &watch_arr[watch_capacity], 0, sizeof( struct watch_point ) * watch_capacity ); nkeynes@2: num = watch_capacity; nkeynes@2: watch_capacity *= 2; nkeynes@2: } else { nkeynes@2: for( num=0; num= watch_capacity ) nkeynes@6: return; nkeynes@2: watch->start = watch->end = 0; nkeynes@2: watch->flags = 0; nkeynes@2: watch_count--; nkeynes@2: } nkeynes@2: nkeynes@2: nkeynes@2: watch_point_t mem_is_watched( uint32_t addr, int size, int op ) nkeynes@2: { nkeynes@2: int i, count; nkeynes@2: addr &= 0x1FFFFFFF; nkeynes@2: for( i=0, count=0; count< watch_count; i++ ) { nkeynes@2: if( watch_arr[i].flags == 0 ) nkeynes@2: continue; nkeynes@2: count++; nkeynes@2: if( watch_arr[i].flags & op && nkeynes@2: watch_arr[i].start < addr+size && nkeynes@2: watch_arr[i].end >= addr ) { nkeynes@2: return &watch_arr[i]; nkeynes@2: } nkeynes@2: } nkeynes@2: return NULL; nkeynes@2: } nkeynes@2: