1*b2ed49a5SDavid van Moolenbroek #include <unistd.h> 2*b2ed49a5SDavid van Moolenbroek #include <stdlib.h> 3*b2ed49a5SDavid van Moolenbroek #include <time.h> 4*b2ed49a5SDavid van Moolenbroek #include <magic_def.h> 5*b2ed49a5SDavid van Moolenbroek #include <magic_mem.h> 6*b2ed49a5SDavid van Moolenbroek #include <magic_asr.h> 7*b2ed49a5SDavid van Moolenbroek #include <magic.h> 8*b2ed49a5SDavid van Moolenbroek 9*b2ed49a5SDavid van Moolenbroek #ifdef __MINIX 10*b2ed49a5SDavid van Moolenbroek static unsigned long magic_rand_next; magic_srand(unsigned int seed)11*b2ed49a5SDavid van Moolenbroekstatic void magic_srand(unsigned int seed) 12*b2ed49a5SDavid van Moolenbroek { 13*b2ed49a5SDavid van Moolenbroek magic_rand_next = (unsigned long) seed; 14*b2ed49a5SDavid van Moolenbroek } 15*b2ed49a5SDavid van Moolenbroek magic_rand()16*b2ed49a5SDavid van Moolenbroekstatic int magic_rand() 17*b2ed49a5SDavid van Moolenbroek { 18*b2ed49a5SDavid van Moolenbroek magic_rand_next = magic_rand_next * 1103515245 + 12345; 19*b2ed49a5SDavid van Moolenbroek return (int)(magic_rand_next % ((unsigned long)RAND_MAX + 1)); 20*b2ed49a5SDavid van Moolenbroek } magic_rand_seed()21*b2ed49a5SDavid van Moolenbroekstatic int magic_rand_seed() 22*b2ed49a5SDavid van Moolenbroek { 23*b2ed49a5SDavid van Moolenbroek int x; 24*b2ed49a5SDavid van Moolenbroek return (int)&x + (int)&magic_rand_seed; 25*b2ed49a5SDavid van Moolenbroek } 26*b2ed49a5SDavid van Moolenbroek #else 27*b2ed49a5SDavid van Moolenbroek #define magic_srand srand 28*b2ed49a5SDavid van Moolenbroek #define magic_rand rand 29*b2ed49a5SDavid van Moolenbroek #define magic_rand_seed() time(0) 30*b2ed49a5SDavid van Moolenbroek #endif 31*b2ed49a5SDavid van Moolenbroek 32*b2ed49a5SDavid van Moolenbroek #define MINIMUM_PADDING 1 33*b2ed49a5SDavid van Moolenbroek magic_asr_get_padding_size(int region)34*b2ed49a5SDavid van MoolenbroekPUBLIC int magic_asr_get_padding_size(int region) { 35*b2ed49a5SDavid van Moolenbroek int padding = 0; 36*b2ed49a5SDavid van Moolenbroek 37*b2ed49a5SDavid van Moolenbroek switch(region) { 38*b2ed49a5SDavid van Moolenbroek case MAGIC_STATE_HEAP | MAGIC_ASR_FLAG_INIT: 39*b2ed49a5SDavid van Moolenbroek if(_magic_asr_heap_max_offset){ 40*b2ed49a5SDavid van Moolenbroek padding = (magic_rand() % _magic_asr_heap_max_offset) + MINIMUM_PADDING; 41*b2ed49a5SDavid van Moolenbroek } 42*b2ed49a5SDavid van Moolenbroek break; 43*b2ed49a5SDavid van Moolenbroek case MAGIC_STATE_HEAP: 44*b2ed49a5SDavid van Moolenbroek if(_magic_asr_heap_max_padding){ 45*b2ed49a5SDavid van Moolenbroek padding = (magic_rand() % _magic_asr_heap_max_padding) + MINIMUM_PADDING; 46*b2ed49a5SDavid van Moolenbroek } 47*b2ed49a5SDavid van Moolenbroek break; 48*b2ed49a5SDavid van Moolenbroek case MAGIC_STATE_MAP | MAGIC_ASR_FLAG_INIT: 49*b2ed49a5SDavid van Moolenbroek if(_magic_asr_map_max_offset_pages){ 50*b2ed49a5SDavid van Moolenbroek padding = ((magic_rand() % _magic_asr_map_max_offset_pages) + MINIMUM_PADDING) * magic_get_sys_pagesize(); 51*b2ed49a5SDavid van Moolenbroek } 52*b2ed49a5SDavid van Moolenbroek break; 53*b2ed49a5SDavid van Moolenbroek case MAGIC_STATE_MAP: 54*b2ed49a5SDavid van Moolenbroek if(_magic_asr_map_max_padding_pages){ 55*b2ed49a5SDavid van Moolenbroek padding = ((magic_rand() % _magic_asr_map_max_padding_pages) + MINIMUM_PADDING) * magic_get_sys_pagesize(); 56*b2ed49a5SDavid van Moolenbroek } 57*b2ed49a5SDavid van Moolenbroek break; 58*b2ed49a5SDavid van Moolenbroek default: 59*b2ed49a5SDavid van Moolenbroek padding = -1; 60*b2ed49a5SDavid van Moolenbroek } 61*b2ed49a5SDavid van Moolenbroek return padding; 62*b2ed49a5SDavid van Moolenbroek } 63*b2ed49a5SDavid van Moolenbroek magic_asr_permute_dsentries(struct _magic_dsentry ** first_dsentry_ptr)64*b2ed49a5SDavid van MoolenbroekPUBLIC void magic_asr_permute_dsentries(struct _magic_dsentry **first_dsentry_ptr){ 65*b2ed49a5SDavid van Moolenbroek struct _magic_dsentry *first_dsentry = *first_dsentry_ptr, *dsentry = first_dsentry, *last_dsentry; 66*b2ed49a5SDavid van Moolenbroek int n_dsentries = 0; 67*b2ed49a5SDavid van Moolenbroek int i; 68*b2ed49a5SDavid van Moolenbroek 69*b2ed49a5SDavid van Moolenbroek if(!_magic_asr_heap_map_do_permutate){ 70*b2ed49a5SDavid van Moolenbroek /* 71*b2ed49a5SDavid van Moolenbroek * Dsentries order is reversed anyway, because newer dsentries are 72*b2ed49a5SDavid van Moolenbroek * placed at the start of the linked list, instead of the end 73*b2ed49a5SDavid van Moolenbroek */ 74*b2ed49a5SDavid van Moolenbroek return; 75*b2ed49a5SDavid van Moolenbroek } 76*b2ed49a5SDavid van Moolenbroek 77*b2ed49a5SDavid van Moolenbroek while(dsentry != NULL){ 78*b2ed49a5SDavid van Moolenbroek last_dsentry = dsentry; 79*b2ed49a5SDavid van Moolenbroek n_dsentries++; 80*b2ed49a5SDavid van Moolenbroek dsentry = dsentry->next; 81*b2ed49a5SDavid van Moolenbroek } 82*b2ed49a5SDavid van Moolenbroek 83*b2ed49a5SDavid van Moolenbroek for(i=0; i < n_dsentries; i++){ 84*b2ed49a5SDavid van Moolenbroek int j; 85*b2ed49a5SDavid van Moolenbroek int pos = magic_rand() % (n_dsentries - i); 86*b2ed49a5SDavid van Moolenbroek struct _magic_dsentry *prev_dsentry = NULL; 87*b2ed49a5SDavid van Moolenbroek 88*b2ed49a5SDavid van Moolenbroek if((i == 0) && (pos == (n_dsentries -1))){ 89*b2ed49a5SDavid van Moolenbroek /* 90*b2ed49a5SDavid van Moolenbroek * Rest of for-loop won't function correctly when last dsentry is chosen first. 91*b2ed49a5SDavid van Moolenbroek * Instead, nothing has to be done in this case. 92*b2ed49a5SDavid van Moolenbroek */ 93*b2ed49a5SDavid van Moolenbroek continue; 94*b2ed49a5SDavid van Moolenbroek } 95*b2ed49a5SDavid van Moolenbroek 96*b2ed49a5SDavid van Moolenbroek dsentry = first_dsentry; 97*b2ed49a5SDavid van Moolenbroek 98*b2ed49a5SDavid van Moolenbroek for(j=0;j<pos;j++){ 99*b2ed49a5SDavid van Moolenbroek prev_dsentry = dsentry; 100*b2ed49a5SDavid van Moolenbroek dsentry = dsentry->next; 101*b2ed49a5SDavid van Moolenbroek } 102*b2ed49a5SDavid van Moolenbroek 103*b2ed49a5SDavid van Moolenbroek if(pos == 0){ 104*b2ed49a5SDavid van Moolenbroek first_dsentry = first_dsentry->next; 105*b2ed49a5SDavid van Moolenbroek }else{ 106*b2ed49a5SDavid van Moolenbroek prev_dsentry->next = dsentry->next; 107*b2ed49a5SDavid van Moolenbroek } 108*b2ed49a5SDavid van Moolenbroek 109*b2ed49a5SDavid van Moolenbroek dsentry->next = NULL; 110*b2ed49a5SDavid van Moolenbroek last_dsentry->next = dsentry; 111*b2ed49a5SDavid van Moolenbroek last_dsentry = dsentry; 112*b2ed49a5SDavid van Moolenbroek } 113*b2ed49a5SDavid van Moolenbroek *first_dsentry_ptr = first_dsentry; 114*b2ed49a5SDavid van Moolenbroek } 115*b2ed49a5SDavid van Moolenbroek magic_asr_init()116*b2ed49a5SDavid van MoolenbroekPUBLIC void magic_asr_init(){ 117*b2ed49a5SDavid van Moolenbroek int seed, heap_offset; 118*b2ed49a5SDavid van Moolenbroek if(_magic_asr_seed){ 119*b2ed49a5SDavid van Moolenbroek seed = _magic_asr_seed; 120*b2ed49a5SDavid van Moolenbroek }else{ 121*b2ed49a5SDavid van Moolenbroek seed = magic_rand_seed(); 122*b2ed49a5SDavid van Moolenbroek } 123*b2ed49a5SDavid van Moolenbroek magic_srand(seed); 124*b2ed49a5SDavid van Moolenbroek 125*b2ed49a5SDavid van Moolenbroek heap_offset = magic_asr_get_padding_size(MAGIC_STATE_HEAP|MAGIC_ASR_FLAG_INIT); 126*b2ed49a5SDavid van Moolenbroek if(heap_offset){ 127*b2ed49a5SDavid van Moolenbroek sbrk(heap_offset); 128*b2ed49a5SDavid van Moolenbroek } 129*b2ed49a5SDavid van Moolenbroek } 130