1*6a2c23ddSRichard Henderson #include <sys/mman.h> 2*6a2c23ddSRichard Henderson #include <sys/shm.h> 3*6a2c23ddSRichard Henderson #include <unistd.h> 4*6a2c23ddSRichard Henderson #include <stdio.h> 5*6a2c23ddSRichard Henderson main()6*6a2c23ddSRichard Hendersonint main() 7*6a2c23ddSRichard Henderson { 8*6a2c23ddSRichard Henderson int psize = getpagesize(); 9*6a2c23ddSRichard Henderson int id; 10*6a2c23ddSRichard Henderson void *p; 11*6a2c23ddSRichard Henderson 12*6a2c23ddSRichard Henderson /* 13*6a2c23ddSRichard Henderson * We need a shared mapping to enter CF_PARALLEL mode. 14*6a2c23ddSRichard Henderson * The easiest way to get that is shmat. 15*6a2c23ddSRichard Henderson */ 16*6a2c23ddSRichard Henderson id = shmget(IPC_PRIVATE, 2 * psize, IPC_CREAT | 0600); 17*6a2c23ddSRichard Henderson if (id < 0) { 18*6a2c23ddSRichard Henderson perror("shmget"); 19*6a2c23ddSRichard Henderson return 2; 20*6a2c23ddSRichard Henderson } 21*6a2c23ddSRichard Henderson p = shmat(id, NULL, 0); 22*6a2c23ddSRichard Henderson if (p == MAP_FAILED) { 23*6a2c23ddSRichard Henderson perror("shmat"); 24*6a2c23ddSRichard Henderson return 2; 25*6a2c23ddSRichard Henderson } 26*6a2c23ddSRichard Henderson 27*6a2c23ddSRichard Henderson /* Protect the second page. */ 28*6a2c23ddSRichard Henderson if (mprotect(p + psize, psize, PROT_NONE) < 0) { 29*6a2c23ddSRichard Henderson perror("mprotect"); 30*6a2c23ddSRichard Henderson return 2; 31*6a2c23ddSRichard Henderson } 32*6a2c23ddSRichard Henderson 33*6a2c23ddSRichard Henderson /* 34*6a2c23ddSRichard Henderson * Load 4 bytes, 6 bytes from the end of the page. 35*6a2c23ddSRichard Henderson * On success this will load 0 from the newly allocated shm. 36*6a2c23ddSRichard Henderson */ 37*6a2c23ddSRichard Henderson return *(int *)(p + psize - 6); 38*6a2c23ddSRichard Henderson } 39