4 #include "log.h" // for BUG
7 #include "trinity.h" // page_size
9 unsigned int get_interesting_32bit_value(void)
11 switch (rand() % 11) {
13 /* common case, return small values*/
16 case 0: return 0x00000000;
17 case 1: return 0x00000001;
18 case 2: return rand() % 256;
19 case 3: return 0x00000fff; // 4095
20 case 4: return 0x00001000; // 4096
21 case 5: return 0x00001001; // 4097
22 case 6: return 0x00008000;
23 case 7: return 0x0000fffe;
24 case 8: return 0x0000ffff;
26 BUG("unreachable!\n");
31 /* less common case, go crazy */
33 switch (rand() % 15) {
34 case 0: return 0x00010000;
35 case 1: return 0x0fffffff;
36 case 2: return 0x40000000;
37 case 3: return 0x7fffffff;
38 case 4: return 0x80000000;
39 case 5: return 0x80000001;
40 case 6: return 0x8fffffff;
41 case 7: return 0xc0000000;
42 case 8: return 0xf0000000;
43 case 9: return 0xff000000;
44 case 10: return 0xffff0000;
45 case 11: return 0xffffe000;
46 case 12: return 0xffffff00 | (rand() % 256);
47 case 13: return 0xffffffff;
48 case 14: return 0xffffffff - page_size
;
50 BUG("unreachable!\n");
56 BUG("unreachable!\n");
60 BUG("unreachable!\n");
65 static unsigned long per_arch_interesting_addr(unsigned long low
)
69 #if defined(__x86_64__)
73 case 0: return 0x00007fffffffffffUL
; // x86-64 canonical addr end.
74 case 1: return 0x0000800000000000UL
; // First x86-64 non-canonical addr
75 case 2: return 0xffff800000000000UL
| (low
<< 4); // x86-64 canonical addr range 2 begin
76 case 3: return VDSO_ADDR
| (low
& 0x0fffff);
78 BUG("unreachable!\n");
83 // FIXME: Add more arch specific addresses here.
87 #endif /* __WORDSIZE */
89 unsigned long get_interesting_value(void)
92 return get_interesting_32bit_value();
94 unsigned long low
= 0;
97 low
= get_interesting_32bit_value();
99 switch (rand() % 13) {
102 case 2: return 0x0000000100000000UL
| low
;
103 case 3: return 0x7fffffff00000000UL
| low
;
104 case 4: return 0x8000000000000000UL
| low
;
105 case 5: return 0xffffffff00000000UL
| low
;
106 case 6: return 0xffffffffffffff00UL
| (rand() % 256);
107 case 7: return 0xffffffffffffffffUL
- page_size
;
108 case 8: return PAGE_OFFSET
| (low
<< 4);
109 case 9: return KERNEL_ADDR
| (low
& 0xffffff);
110 case 10: return MODULE_ADDR
| (low
& 0xffffff);
111 case 11: return per_arch_interesting_addr(low
);
112 case 12: return (low
<< 32);
115 BUG("unreachable!\n");
117 #endif /* __WORDSIZE */