16a2c23ddSRichard Henderson #include <sys/mman.h> 26a2c23ddSRichard Henderson #include <sys/shm.h> 36a2c23ddSRichard Henderson #include <unistd.h> 46a2c23ddSRichard Henderson #include <stdio.h> 56a2c23ddSRichard Henderson main()66a2c23ddSRichard Hendersonint main() 76a2c23ddSRichard Henderson { 86a2c23ddSRichard Henderson int psize = getpagesize(); 96a2c23ddSRichard Henderson int id; 106a2c23ddSRichard Henderson void *p; 116a2c23ddSRichard Henderson 126a2c23ddSRichard Henderson /* 136a2c23ddSRichard Henderson * We need a shared mapping to enter CF_PARALLEL mode. 146a2c23ddSRichard Henderson * The easiest way to get that is shmat. 156a2c23ddSRichard Henderson */ 166a2c23ddSRichard Henderson id = shmget(IPC_PRIVATE, 2 * psize, IPC_CREAT | 0600); 176a2c23ddSRichard Henderson if (id < 0) { 186a2c23ddSRichard Henderson perror("shmget"); 196a2c23ddSRichard Henderson return 2; 206a2c23ddSRichard Henderson } 216a2c23ddSRichard Henderson p = shmat(id, NULL, 0); 226a2c23ddSRichard Henderson if (p == MAP_FAILED) { 236a2c23ddSRichard Henderson perror("shmat"); 246a2c23ddSRichard Henderson return 2; 256a2c23ddSRichard Henderson } 266a2c23ddSRichard Henderson 276a2c23ddSRichard Henderson /* Protect the second page. */ 286a2c23ddSRichard Henderson if (mprotect(p + psize, psize, PROT_NONE) < 0) { 296a2c23ddSRichard Henderson perror("mprotect"); 306a2c23ddSRichard Henderson return 2; 316a2c23ddSRichard Henderson } 326a2c23ddSRichard Henderson 336a2c23ddSRichard Henderson /* 346a2c23ddSRichard Henderson * Load 4 bytes, 6 bytes from the end of the page. 356a2c23ddSRichard Henderson * On success this will load 0 from the newly allocated shm. 366a2c23ddSRichard Henderson */ 376a2c23ddSRichard Henderson return *(int *)(p + psize - 6); 386a2c23ddSRichard Henderson } 39