xref: /minix3/minix/lib/libmagicrt/magic_asr.c (revision b2ed49a5d83e311ee0fa9e5ff613639b1bf77aaf)
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 Moolenbroek static 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 Moolenbroek static 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 Moolenbroek static 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 Moolenbroek PUBLIC 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 Moolenbroek PUBLIC 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 Moolenbroek PUBLIC 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