]>
git.saurik.com Git - apple/xnu.git/blob - tools/tests/perf_index/test_fault_helper.c
1 #include "test_fault_helper.h"
7 #include <TargetConditionals.h>
10 #define MEMSIZE (1L<<28)
12 #define MEMSIZE (1L<<30)
15 static char* memblock
;
17 int test_fault_setup() {
19 int pgsz
= getpagesize();
22 memblock
= (char *)mmap(NULL
, MEMSIZE
, PROT_READ
| PROT_WRITE
, MAP_ANON
| MAP_PRIVATE
, -1, 0);
23 VERIFY(memblock
!= MAP_FAILED
, "mmap failed");
25 /* make sure memory is paged */
26 for(ptr
= memblock
; ptr
<memblock
+MEMSIZE
; ptr
+= pgsz
) {
30 /* set to read only, then back to read write so it faults on first write */
31 retval
= mprotect(memblock
, MEMSIZE
, PROT_READ
);
32 VERIFY(retval
== 0, "mprotect failed");
34 retval
= mprotect(memblock
, MEMSIZE
, PROT_READ
| PROT_WRITE
);
35 VERIFY(retval
== 0, "mprotect failed");
37 return PERFINDEX_SUCCESS
;
40 int test_fault_helper(int thread_id
, int num_threads
, long long length
, testtype_t testtype
) {
42 int pgsz
= getpagesize();
45 long long num_pages
= MEMSIZE
/ pgsz
;
46 long long region_len
= num_pages
/num_threads
;
47 long long region_start
= region_len
* thread_id
;
50 if(thread_id
< num_pages
% num_threads
) {
51 region_start
+= thread_id
;
55 region_start
+= num_pages
% num_threads
;
60 region_end
= region_start
+ region_len
;
62 long long left
= length
;
65 for(ptr
= memblock
+region_start
; ptr
<memblock
+region_end
; ptr
+= pgsz
) {
75 if(testtype
== TESTFAULT
) {
76 retval
= mprotect(memblock
+region_start
, region_len
, PROT_READ
) == 0;
77 VERIFY(retval
== 0, "mprotect failed");
78 retval
= mprotect(memblock
+region_start
, region_len
, PROT_READ
| PROT_WRITE
) == 0;
79 VERIFY(retval
== 0, "mprotect failed");
82 else if(testtype
== TESTZFOD
) {
83 retval
= munmap(memblock
+region_start
, region_len
) == 0;
84 VERIFY(retval
== 0, "munmap failed");
85 ptr
= mmap(memblock
+region_start
, region_len
, PROT_READ
| PROT_WRITE
, MAP_ANON
| MAP_PRIVATE
| MAP_FIXED
, -1, 0);
86 VERIFY(ptr
!= 0, "mmap failed");
89 return PERFINDEX_SUCCESS
;