123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- From fb2d200423299843818884801e2598dd643ec834 Mon Sep 17 00:00:00 2001
- From: Stefan O'Rear <sorear@fastmail.com>
- Date: Wed, 9 Sep 2020 11:57:54 -0700
- Subject: [PATCH 15/16] Change definitions of F_GETLK, F_SETLK, F_SETLKW
- * gdb HEAD wants ELF_NFPREG, so I set it in bits/user.h to the value
- gdb needs. (glibc does #define ELF_NFPREG NFPREG and expects gdb
- to define NFPREG. I don't get this.)
- * Restore accidentally removed errno setting in waitpid, fixes a gdb
- assertion failure.
- * 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 we use
- the right one.
- Signed-off-by: Stefan O'Rear <sorear@fastmail.com>
- Signed-off-by: Khem Raj <raj.khem@gmail.com>
- ---
- 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 ++
- arch/riscv64/bits/user.h | 1 +
- src/process/waitpid.c | 2 +-
- 9 files changed, 77 insertions(+), 4 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 <signal.h>
-
- #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
- diff --git a/arch/riscv64/bits/user.h b/arch/riscv64/bits/user.h
- index 2da743ea..0d37de0b 100644
- --- a/arch/riscv64/bits/user.h
- +++ b/arch/riscv64/bits/user.h
- @@ -1,5 +1,6 @@
- #include <signal.h>
-
- #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/src/process/waitpid.c b/src/process/waitpid.c
- index e5ff27ca..9de4073f 100644
- --- a/src/process/waitpid.c
- +++ b/src/process/waitpid.c
- @@ -3,5 +3,5 @@
-
- pid_t waitpid(pid_t pid, int *status, int options)
- {
- - return __wait4(pid, status, options, 0, 1);
- + return __syscall_ret(__wait4(pid, status, options, 0, 1));
- }
- --
- 2.29.2
|