From 26dca4cada48dbcc16bafc998fa7b5f618b12e03 Mon Sep 17 00:00:00 2001 From: Stefan O'Rear Date: Wed, 9 Sep 2020 11:57:54 -0700 Subject: [PATCH 07/10] Add msg/sem/shm structs and other missing defines * Define shmid_ds, semid_ds, and semid_ds data structures * Define ELF_NFPREG, It is used by some userspace applications like gdb * Zero IPC_64 because the kernel only recognizes one set of IPC commands. * Copy the IPC_TIME64 bits from arch/arm/bits to trigger the musl code for fixing time64 IPC_STAT results. I'm not super happy with this, maybe there should be a new mechanism in musl for fixing IPC_STAT for unconditionally-time64 architectures. * riscv32 _does_ provide both F_GETLK and F_GETLK32; make sure the right one in chosen. Signed-off-by: Stefan O'Rear Signed-off-by: Khem Raj --- arch/riscv32/bits/fcntl.h | 7 ++++--- arch/riscv32/bits/ipcstat.h | 1 + arch/riscv32/bits/msg.h | 18 ++++++++++++++++++ arch/riscv32/bits/sem.h | 18 ++++++++++++++++++ arch/riscv32/bits/shm.h | 31 +++++++++++++++++++++++++++++++ arch/riscv32/bits/user.h | 1 + arch/riscv32/syscall_arch.h | 2 ++ 7 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 arch/riscv32/bits/ipcstat.h create mode 100644 arch/riscv32/bits/msg.h create mode 100644 arch/riscv32/bits/sem.h create mode 100644 arch/riscv32/bits/shm.h diff --git a/arch/riscv32/bits/fcntl.h b/arch/riscv32/bits/fcntl.h index ecb4d18f..66f84fac 100644 --- a/arch/riscv32/bits/fcntl.h +++ b/arch/riscv32/bits/fcntl.h @@ -24,14 +24,15 @@ #define F_SETFD 2 #define F_GETFL 3 #define F_SETFL 4 -#define F_GETLK 5 -#define F_SETLK 6 -#define F_SETLKW 7 #define F_SETOWN 8 #define F_GETOWN 9 #define F_SETSIG 10 #define F_GETSIG 11 +#define F_GETLK 12 +#define F_SETLK 13 +#define F_SETLKW 14 + #define F_SETOWN_EX 15 #define F_GETOWN_EX 16 diff --git a/arch/riscv32/bits/ipcstat.h b/arch/riscv32/bits/ipcstat.h new file mode 100644 index 00000000..4f4fcb0c --- /dev/null +++ b/arch/riscv32/bits/ipcstat.h @@ -0,0 +1 @@ +#define IPC_STAT 0x102 diff --git a/arch/riscv32/bits/msg.h b/arch/riscv32/bits/msg.h new file mode 100644 index 00000000..7bbbb2bf --- /dev/null +++ b/arch/riscv32/bits/msg.h @@ -0,0 +1,18 @@ +struct msqid_ds { + struct ipc_perm msg_perm; + unsigned long __msg_stime_lo; + unsigned long __msg_stime_hi; + unsigned long __msg_rtime_lo; + unsigned long __msg_rtime_hi; + unsigned long __msg_ctime_lo; + unsigned long __msg_ctime_hi; + unsigned long msg_cbytes; + msgqnum_t msg_qnum; + msglen_t msg_qbytes; + pid_t msg_lspid; + pid_t msg_lrpid; + unsigned long __unused[2]; + time_t msg_stime; + time_t msg_rtime; + time_t msg_ctime; +}; diff --git a/arch/riscv32/bits/sem.h b/arch/riscv32/bits/sem.h new file mode 100644 index 00000000..544e3d2a --- /dev/null +++ b/arch/riscv32/bits/sem.h @@ -0,0 +1,18 @@ +struct semid_ds { + struct ipc_perm sem_perm; + unsigned long __sem_otime_lo; + unsigned long __sem_otime_hi; + unsigned long __sem_ctime_lo; + unsigned long __sem_ctime_hi; +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned short sem_nsems; + char __sem_nsems_pad[sizeof(long)-sizeof(short)]; +#else + char __sem_nsems_pad[sizeof(long)-sizeof(short)]; + unsigned short sem_nsems; +#endif + long __unused3; + long __unused4; + time_t sem_otime; + time_t sem_ctime; +}; diff --git a/arch/riscv32/bits/shm.h b/arch/riscv32/bits/shm.h new file mode 100644 index 00000000..725fb469 --- /dev/null +++ b/arch/riscv32/bits/shm.h @@ -0,0 +1,31 @@ +#define SHMLBA 4096 + +struct shmid_ds { + struct ipc_perm shm_perm; + size_t shm_segsz; + unsigned long __shm_atime_lo; + unsigned long __shm_atime_hi; + unsigned long __shm_dtime_lo; + unsigned long __shm_dtime_hi; + unsigned long __shm_ctime_lo; + unsigned long __shm_ctime_hi; + pid_t shm_cpid; + pid_t shm_lpid; + unsigned long shm_nattch; + unsigned long __pad1; + unsigned long __pad2; + unsigned long __pad3; + time_t shm_atime; + time_t shm_dtime; + time_t shm_ctime; +}; + +struct shminfo { + unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4]; +}; + +struct shm_info { + int __used_ids; + unsigned long shm_tot, shm_rss, shm_swp; + unsigned long __swap_attempts, __swap_successes; +}; diff --git a/arch/riscv32/bits/user.h b/arch/riscv32/bits/user.h index 2da743ea..0d37de0b 100644 --- a/arch/riscv32/bits/user.h +++ b/arch/riscv32/bits/user.h @@ -1,5 +1,6 @@ #include #define ELF_NGREG 32 +#define ELF_NFPREG 33 typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG]; typedef union __riscv_mc_fp_state elf_fpregset_t; diff --git a/arch/riscv32/syscall_arch.h b/arch/riscv32/syscall_arch.h index 9e916c76..c507f15f 100644 --- a/arch/riscv32/syscall_arch.h +++ b/arch/riscv32/syscall_arch.h @@ -76,3 +76,5 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo /* We don't have a clock_gettime function. #define VDSO_CGT_SYM "__vdso_clock_gettime" #define VDSO_CGT_VER "LINUX_2.6" */ + +#define IPC_64 0 -- 2.21.0