merge clone variants
[trinity.git] / shm.c
blobf9835667add34c97bcada71775e0db4176e61699
1 /*
2 * Shared mapping creation.
3 */
5 #include <stdlib.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <sys/mman.h>
9 #include "arch.h"
10 #include "child.h"
11 #include "log.h"
12 #include "params.h"
13 #include "pids.h"
14 #include "random.h"
15 #include "shm.h"
16 #include "utils.h"
18 struct shm_s *shm;
20 #define SHM_PROT_PAGES 30
22 void create_shm(void)
24 void *p;
25 unsigned int shm_pages;
27 /* round up shm to nearest page size */
28 shm_pages = ((sizeof(struct shm_s) + page_size - 1) & ~(page_size - 1)) / page_size;
30 /* Waste some address space to set up some "protection" near the SHM location. */
31 p = alloc_shared((SHM_PROT_PAGES + shm_pages + SHM_PROT_PAGES) * page_size);
33 /* clear whole mapping, including the redzones. */
34 memset(p, 0, shm_pages * page_size);
36 /* set the redzones to PROT_NONE */
37 mprotect(p, SHM_PROT_PAGES * page_size, PROT_NONE);
38 mprotect(p + (SHM_PROT_PAGES + shm_pages) * page_size,
39 SHM_PROT_PAGES * page_size, PROT_NONE);
41 shm = p + SHM_PROT_PAGES * page_size;
44 void create_shm_arrays(void)
46 shm->child_syscall_count = alloc_shared(max_children * sizeof(unsigned long));
48 shm->pids = alloc_shared(max_children * sizeof(pid_t));
50 shm->tv = alloc_shared(max_children * sizeof(struct timeval));
52 shm->previous_syscallno = alloc_shared(max_children * sizeof(unsigned int));
53 shm->syscallno = alloc_shared(max_children * sizeof(unsigned int));
55 shm->previous_a1 = alloc_shared(max_children * sizeof(unsigned long));
56 shm->previous_a2 = alloc_shared(max_children * sizeof(unsigned long));
57 shm->previous_a3 = alloc_shared(max_children * sizeof(unsigned long));
58 shm->previous_a4 = alloc_shared(max_children * sizeof(unsigned long));
59 shm->previous_a5 = alloc_shared(max_children * sizeof(unsigned long));
60 shm->previous_a6 = alloc_shared(max_children * sizeof(unsigned long));
62 shm->a1 = alloc_shared(max_children * sizeof(unsigned long));
63 shm->a2 = alloc_shared(max_children * sizeof(unsigned long));
64 shm->a3 = alloc_shared(max_children * sizeof(unsigned long));
65 shm->a4 = alloc_shared(max_children * sizeof(unsigned long));
66 shm->a5 = alloc_shared(max_children * sizeof(unsigned long));
67 shm->a6 = alloc_shared(max_children * sizeof(unsigned long));
69 shm->mappings = alloc_shared(max_children * sizeof(struct map *));
70 shm->num_mappings = alloc_shared(max_children * sizeof(unsigned int));
72 shm->seeds = alloc_shared(max_children * sizeof(int));
73 shm->child_type = alloc_shared(max_children * sizeof(unsigned char));
74 shm->kill_count = alloc_shared(max_children * sizeof(unsigned char));
75 shm->logfiles = alloc_shared(max_children * sizeof(FILE *));
76 shm->retval = alloc_shared(max_children * sizeof(unsigned long));
77 shm->scratch = alloc_shared(max_children * sizeof(unsigned long));
78 shm->do32bit = alloc_shared(max_children * sizeof(bool));
81 void init_shm(void)
83 unsigned int i;
85 output(2, "shm is at %p\n", shm);
87 shm->total_syscalls_done = 1;
89 if (user_set_seed == TRUE)
90 shm->seed = init_seed(seed);
91 else
92 shm->seed = new_seed();
93 /* Set seed in parent thread */
94 set_seed(0);
96 for (i = 0; i < max_children; i++) {
98 shm->pids[i] = EMPTY_PIDSLOT;
100 shm->previous_syscallno[i] = -1;
101 shm->syscallno[i] = -1;
103 shm->previous_a1[i] = shm->a1[i] = -1;
104 shm->previous_a2[i] = shm->a2[i] = -1;
105 shm->previous_a3[i] = shm->a3[i] = -1;
106 shm->previous_a4[i] = shm->a4[i] = -1;
107 shm->previous_a5[i] = shm->a5[i] = -1;
108 shm->previous_a6[i] = shm->a6[i] = -1;