]>
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>
9 #define MEMSIZE (1L<<30)
11 static char* memblock
;
13 int test_fault_setup() {
15 int pgsz
= getpagesize();
18 memblock
= (char *)mmap(NULL
, MEMSIZE
, PROT_READ
| PROT_WRITE
, MAP_ANON
| MAP_PRIVATE
, -1, 0);
19 VERIFY(memblock
!= MAP_FAILED
, "mmap failed");
21 /* make sure memory is paged */
22 for(ptr
= memblock
; ptr
<memblock
+MEMSIZE
; ptr
+= pgsz
) {
26 /* set to read only, then back to read write so it faults on first write */
27 retval
= mprotect(memblock
, MEMSIZE
, PROT_READ
);
28 VERIFY(retval
== 0, "mprotect failed");
30 retval
= mprotect(memblock
, MEMSIZE
, PROT_READ
| PROT_WRITE
);
31 VERIFY(retval
== 0, "mprotect failed");
33 return PERFINDEX_SUCCESS
;
36 int test_fault_helper(int thread_id
, int num_threads
, long long length
, testtype_t testtype
) {
38 int pgsz
= getpagesize();
41 long long num_pages
= MEMSIZE
/ pgsz
;
42 long long region_len
= num_pages
/num_threads
;
43 long long region_start
= region_len
* thread_id
;
46 if(thread_id
< num_pages
% num_threads
) {
47 region_start
+= thread_id
;
51 region_start
+= num_pages
% num_threads
;
56 region_end
= region_start
+ region_len
;
58 long long left
= length
;
61 for(ptr
= memblock
+region_start
; ptr
<memblock
+region_end
; ptr
+= pgsz
) {
71 if(testtype
== TESTFAULT
) {
72 retval
= mprotect(memblock
+region_start
, region_len
, PROT_READ
) == 0;
73 VERIFY(retval
== 0, "mprotect failed");
74 retval
= mprotect(memblock
+region_start
, region_len
, PROT_READ
| PROT_WRITE
) == 0;
75 VERIFY(retval
== 0, "mprotect failed");
78 else if(testtype
== TESTZFOD
) {
79 retval
= munmap(memblock
+region_start
, region_len
) == 0;
80 VERIFY(retval
== 0, "munmap failed");
81 ptr
= mmap(memblock
+region_start
, region_len
, PROT_READ
| PROT_WRITE
, MAP_ANON
| MAP_PRIVATE
| MAP_FIXED
, -1, 0);
82 VERIFY(ptr
!= 0, "mmap failed");
85 return PERFINDEX_SUCCESS
;