1f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancekstatic key_t probe_key;
2f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek
3f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancekvoid *probe_free_addr(void)
4f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek{
5f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	void *p;
6f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	int ret;
7f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	int shm_id = -1;
8f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek
9f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	if (probe_key == 0)
10f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek		probe_key = getipckey();
11f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek
12f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	/* create a shared memory resource with read and write permissions
13f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	 * We align this to SHMLBA so we should allocate at least
14f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	 * SHMLBA*2 in case SHMLBA > page_size. */
15f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	shm_id = shmget(probe_key, SHMLBA*2, SHM_RW | IPC_CREAT | IPC_EXCL);
16f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	if (shm_id == -1)
17f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek		tst_brkm(TBROK, cleanup, "probe: shmget failed");
18f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek
19f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	/* Probe an available linear address for attachment */
20f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	p = shmat(shm_id, NULL, 0);
21f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	if (p == (void *)-1)
22f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek		tst_brkm(TBROK, cleanup, "probe: shmat failed");
23f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	ret = shmdt(p);
24f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	if (ret == -1)
25f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek		tst_brkm(TBROK, cleanup, "probe: shmdt failed");
26f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek
27f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	rm_shm(shm_id);
28f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek
29f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	/* some architectures (e.g. parisc) are strange, so better always
30f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	 * align to next SHMLBA address. */
31f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	p = (void *)(((unsigned long)(p) + (SHMLBA - 1)) & ~(SHMLBA - 1));
32f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek	return p;
33f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek}
34