Home | History | Annotate | Download | only in linux
      1 # Copyright 2017 syzkaller project authors. All rights reserved.
      2 # Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
      3 
      4 include <linux/fcntl.h>
      5 include <linux/stat.h>
      6 include <linux/ipc.h>
      7 include <linux/shm.h>
      8 include <linux/msg.h>
      9 include <linux/sem.h>
     10 
     11 resource ipc[int32]: 0, -1
     12 
     13 # TODO: describe ipc syscall
     14 
     15 resource ipc_msq[ipc]
     16 msgget(key proc[2039379027, 4], flags flags[msgget_flags]) ipc_msq
     17 msgget$private(key const[IPC_PRIVATE], flags flags[msgget_flags]) ipc_msq
     18 msgsnd(msqid ipc_msq, msgp ptr[in, msgbuf], sz len[msgp], flags flags[msgsnd_flags])
     19 msgrcv(msqid ipc_msq, msgp ptr[out, msgbuf], sz len[msgp], typ flags[msgbuf_type], flags flags[msgrcv_flags])
     20 msgctl$IPC_STAT(msqid ipc_msq, cmd const[IPC_STAT], buf buffer[out])
     21 msgctl$IPC_SET(msqid ipc_msq, cmd const[IPC_SET], buf ptr[in, msqid_ds])
     22 msgctl$IPC_RMID(msqid ipc_msq, cmd const[IPC_RMID])
     23 msgctl$IPC_INFO(msqid ipc_msq, cmd const[IPC_INFO], buf buffer[out])
     24 msgctl$MSG_INFO(msqid ipc_msq, cmd const[MSG_INFO], buf buffer[out])
     25 msgctl$MSG_STAT(msqid ipc_msq, cmd const[MSG_STAT], buf buffer[out])
     26 
     27 resource ipc_sem[ipc]
     28 semget(key proc[2039359027, 4], nsems flags[sem_sem_id], flags flags[semget_flags]) ipc_sem
     29 semget$private(key const[IPC_PRIVATE], nsems flags[sem_sem_id], flags flags[semget_flags]) ipc_sem
     30 semop(semid ipc_sem, ops ptr[in, array[sembuf]], nops len[ops])
     31 semtimedop(semid ipc_sem, ops ptr[in, array[sembuf]], nops len[ops], timeout ptr[in, timespec])
     32 semctl$IPC_STAT(semid ipc_sem, semnum const[0], cmd const[IPC_STAT], arg buffer[out])
     33 semctl$IPC_SET(semid ipc_sem, semnum const[0], cmd const[IPC_SET], arg ptr[in, semid_ds])
     34 semctl$IPC_RMID(semid ipc_sem, semnum const[0], cmd const[IPC_RMID])
     35 semctl$IPC_INFO(semid ipc_sem, semnum flags[sem_sem_id], cmd const[IPC_INFO], buf buffer[out])
     36 semctl$SEM_INFO(semid ipc_sem, semnum flags[sem_sem_id], cmd const[SEM_INFO], arg buffer[out])
     37 semctl$SEM_STAT(semid ipc_sem, semnum flags[sem_sem_id], cmd const[SEM_STAT], arg buffer[out])
     38 semctl$GETALL(semid ipc_sem, semnum const[0], cmd const[GETALL], arg buffer[out])
     39 semctl$GETNCNT(semid ipc_sem, semnum flags[sem_sem_id], cmd const[GETNCNT], arg buffer[out])
     40 semctl$GETPID(semid ipc_sem, semnum flags[sem_sem_id], cmd const[GETPID], arg buffer[out])
     41 semctl$GETVAL(semid ipc_sem, semnum flags[sem_sem_id], cmd const[GETVAL], arg buffer[out])
     42 semctl$GETZCNT(semid ipc_sem, semnum flags[sem_sem_id], cmd const[GETZCNT], arg buffer[out])
     43 semctl$SETALL(semid ipc_sem, semnum const[0], cmd const[SETALL], arg ptr[in, array[int16]])
     44 semctl$SETVAL(semid ipc_sem, semnum flags[sem_sem_id], cmd const[SETVAL], arg ptr[in, int32])
     45 
     46 resource ipc_shm[ipc]
     47 resource shmaddr[intptr]: 0
     48 # The unused arg is unused by syscall (does not exist at all),
     49 # but it helps to generate sane size values.
     50 shmget(key proc[2039339027, 4], size len[unused], flags flags[shmget_flags], unused vma) ipc_shm
     51 shmget$private(key const[IPC_PRIVATE], size len[unused], flags flags[shmget_flags], unused vma) ipc_shm
     52 shmat(shmid ipc_shm, addr vma, flags flags[shmat_flags]) shmaddr
     53 shmctl$IPC_STAT(shmid ipc_shm, cmd const[IPC_STAT], buf buffer[out])
     54 shmctl$IPC_SET(shmid ipc_shm, cmd const[IPC_SET], buf ptr[in, shmid_ds])
     55 shmctl$IPC_RMID(shmid ipc_shm, cmd const[IPC_RMID])
     56 shmctl$IPC_INFO(shmid ipc_shm, cmd const[IPC_INFO], buf buffer[out])
     57 shmctl$SHM_INFO(shmid ipc_shm, cmd const[SHM_INFO], buf buffer[out])
     58 shmctl$SHM_STAT(shmid ipc_shm, cmd const[SHM_STAT], buf buffer[out])
     59 shmctl$SHM_LOCK(shmid ipc_shm, cmd const[SHM_LOCK])
     60 shmctl$SHM_UNLOCK(shmid ipc_shm, cmd const[SHM_UNLOCK])
     61 shmdt(addr shmaddr)
     62 
     63 msgget_flags = IPC_CREAT, IPC_EXCL, S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH
     64 msgbuf_type = 0, 1, 2, 3
     65 msgsnd_flags = IPC_NOWAIT
     66 msgrcv_flags = IPC_NOWAIT, MSG_EXCEPT, MSG_NOERROR
     67 semget_flags = IPC_CREAT, IPC_EXCL, S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH
     68 semop_flags = IPC_NOWAIT, SEM_UNDO
     69 sem_sem_id = 0, 1, 2, 3, 4
     70 shmget_flags = IPC_CREAT, IPC_EXCL, SHM_HUGETLB, SHM_HUGE_2MB, SHM_HUGE_1GB, SHM_NORESERVE, S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH
     71 shmat_flags = SHM_RND, SHM_RDONLY, SHM_REMAP
     72 
     73 ipc_perm {
     74 	key	int32
     75 	uid	uid
     76 	gid	gid
     77 	cuid	uid
     78 	cgid	gid
     79 	mode	flags[open_mode, int32]
     80 	seq	int16
     81 	pad0	const[0, int16]
     82 	pad1	const[0, intptr]
     83 	pad2	const[0, intptr]
     84 }
     85 
     86 msqid_ds {
     87 	perm	ipc_perm
     88 	stime	intptr
     89 	rtime	intptr
     90 	ctime	intptr
     91 	cbytes	intptr
     92 	qnum	intptr
     93 	qbytes	intptr
     94 	lspid	pid
     95 	lrpid	pid
     96 	pad0	const[0, intptr]
     97 	pad1	const[0, intptr]
     98 }
     99 
    100 shmid_ds {
    101 	perm	ipc_perm
    102 	segsz	int32
    103 	atime	intptr
    104 	dtime	intptr
    105 	ctime	intptr
    106 	cpid	pid
    107 	lpid	pid
    108 	nattch	int16
    109 	unused0	const[0, int16]
    110 	unused1	const[0, intptr]
    111 	unused2	const[0, intptr]
    112 }
    113 
    114 semid_ds {
    115 	perm	ipc_perm
    116 	otime	intptr
    117 	ctime	intptr
    118 	nsems	intptr
    119 	pad0	const[0, intptr]
    120 	pad1	const[0, intptr]
    121 }
    122 
    123 sembuf {
    124 	num	flags[sem_sem_id, int16]
    125 	op	int16
    126 	flg	flags[semop_flags, int16]
    127 }
    128 
    129 msgbuf {
    130 	typ	flags[msgbuf_type, intptr]
    131 	data	array[int8]
    132 } [packed]
    133