diff --git a/watchsyscall/wa_callbacks.c b/watchsyscall/wa_callbacks.c index 4675302b664c3ab8ad2d33c2c863456fbad49b97..63d3435d55ddd347693c08bbdd575cd3f8a87770 100644 --- a/watchsyscall/wa_callbacks.c +++ b/watchsyscall/wa_callbacks.c @@ -74,20 +74,29 @@ typedef struct } reg_values_t; #define PAGESIZE 4096 -#define MAXADDRSPERPAGE ((PAGESIZE/(2*sizeof(int)))-(8*sizeof(int))) +#define MAXADDRSPERPAGE ((PAGESIZE/(2*sizeof(int)))-(16*sizeof(int))) +#define INITIAL_SET_SIZE 5 typedef struct addr_list addr_list_t; struct addr_list { - int pairs; + short pairs; + short max; addr_list_t *next; struct { int start; int end; - } addrs[MAXADDRSPERPAGE]; + } addrs[INITIAL_SET_SIZE]; // may over allocate }; +addr_list_t OK_first = +{ + 0, INITIAL_SET_SIZE, NULL, {{0,0},{0,0},{0,0},{0,0},{0,0}} +}; + + + addr_list_t *OK_list=NULL; @@ -113,7 +122,7 @@ void add_to_list(int start, int end) { page_no++; //print_str_debug("checking for space.\n"); - if(al->pairs<MAXADDRSPERPAGE) + if(al->pairs<al->max) { #ifdef DEBUG_ADD print_str_debug("Found space in this list_entry. page="); @@ -138,10 +147,10 @@ void add_to_list(int start, int end) print_str_debug("\n"); #endif // no space in any list item. - assert(sizeof(addr_list_t)); - cgc_allocate(sizeof(addr_list_t), 0==0, &al); + cgc_allocate( sizeof(addr_list_t)+(8*(MAXADDRSPERPAGE-INITIAL_SET_SIZE)) , 0==0, &al); al->next=OK_list; al->pairs=1; + al->max=MAXADDRSPERPAGE; al->addrs[0].start=start; al->addrs[0].end=end; OK_list=al; @@ -153,13 +162,15 @@ void add_to_list(int start, int end) void zipr_init_addrs( int ret, int start, int end) { #ifdef DEBUG -// char *str=" in init: start="; -// print_str("in init: start="); -// print_int(start); -// print_str(" end="); -// print_int(end); -// print_str("\n"); + char *str=" in init: start="; + print_str("in init: start="); + print_int(start); + print_str(" end="); + print_int(end); + print_str("\n"); #endif + if(OK_list==NULL) + OK_list=&OK_first; add_to_list(start,end); }