cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hugepage-shm.c (2580B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * hugepage-shm:
      4 *
      5 * Example of using huge page memory in a user application using Sys V shared
      6 * memory system calls.  In this example the app is requesting 256MB of
      7 * memory that is backed by huge pages.  The application uses the flag
      8 * SHM_HUGETLB in the shmget system call to inform the kernel that it is
      9 * requesting huge pages.
     10 *
     11 * For the ia64 architecture, the Linux kernel reserves Region number 4 for
     12 * huge pages.  That means that if one requires a fixed address, a huge page
     13 * aligned address starting with 0x800000... will be required.  If a fixed
     14 * address is not required, the kernel will select an address in the proper
     15 * range.
     16 * Other architectures, such as ppc64, i386 or x86_64 are not so constrained.
     17 *
     18 * Note: The default shared memory limit is quite low on many kernels,
     19 * you may need to increase it via:
     20 *
     21 * echo 268435456 > /proc/sys/kernel/shmmax
     22 *
     23 * This will increase the maximum size per shared memory segment to 256MB.
     24 * The other limit that you will hit eventually is shmall which is the
     25 * total amount of shared memory in pages. To set it to 16GB on a system
     26 * with a 4kB pagesize do:
     27 *
     28 * echo 4194304 > /proc/sys/kernel/shmall
     29 */
     30
     31#include <stdlib.h>
     32#include <stdio.h>
     33#include <sys/types.h>
     34#include <sys/ipc.h>
     35#include <sys/shm.h>
     36#include <sys/mman.h>
     37
     38#ifndef SHM_HUGETLB
     39#define SHM_HUGETLB 04000
     40#endif
     41
     42#define LENGTH (256UL*1024*1024)
     43
     44#define dprintf(x)  printf(x)
     45
     46/* Only ia64 requires this */
     47#ifdef __ia64__
     48#define ADDR (void *)(0x8000000000000000UL)
     49#define SHMAT_FLAGS (SHM_RND)
     50#else
     51#define ADDR (void *)(0x0UL)
     52#define SHMAT_FLAGS (0)
     53#endif
     54
     55int main(void)
     56{
     57	int shmid;
     58	unsigned long i;
     59	char *shmaddr;
     60
     61	shmid = shmget(2, LENGTH, SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W);
     62	if (shmid < 0) {
     63		perror("shmget");
     64		exit(1);
     65	}
     66	printf("shmid: 0x%x\n", shmid);
     67
     68	shmaddr = shmat(shmid, ADDR, SHMAT_FLAGS);
     69	if (shmaddr == (char *)-1) {
     70		perror("Shared memory attach failure");
     71		shmctl(shmid, IPC_RMID, NULL);
     72		exit(2);
     73	}
     74	printf("shmaddr: %p\n", shmaddr);
     75
     76	dprintf("Starting the writes:\n");
     77	for (i = 0; i < LENGTH; i++) {
     78		shmaddr[i] = (char)(i);
     79		if (!(i % (1024 * 1024)))
     80			dprintf(".");
     81	}
     82	dprintf("\n");
     83
     84	dprintf("Starting the Check...");
     85	for (i = 0; i < LENGTH; i++)
     86		if (shmaddr[i] != (char)i) {
     87			printf("\nIndex %lu mismatched\n", i);
     88			exit(3);
     89		}
     90	dprintf("Done.\n");
     91
     92	if (shmdt((const void *)shmaddr) != 0) {
     93		perror("Detach failure");
     94		shmctl(shmid, IPC_RMID, NULL);
     95		exit(4);
     96	}
     97
     98	shmctl(shmid, IPC_RMID, NULL);
     99
    100	return 0;
    101}