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