[PATCH v2 11/13] y2038: xtensa: extend sysvipc data structures

2018-04-12 Thread Arnd Bergmann
xtensa, uses a nonstandard variation of the generic sysvipc
data structures, intended to have the padding moved around
so it can deal with big-endian 32-bit user space that has
64-bit time_t.

xtensa tries hard to define the structures so they work
in both big-endian and little-endian systems with padding
on the right side.
However, they only succeeded for for two of the three structures,
and their struct shmid64_ds ended up being defined in two
identical copies, and the big-endian one is wrong.

This takes just take the same approach here that we have for
the asm-generic headers and adds separate 32-bit fields for the
upper halves of the timestamps, to let libc deal with the mess
in user space.

Signed-off-by: Arnd Bergmann 
---
 arch/xtensa/include/uapi/asm/msgbuf.h | 25 ---
 arch/xtensa/include/uapi/asm/sembuf.h | 17 
 arch/xtensa/include/uapi/asm/shmbuf.h | 37 ---
 3 files changed, 28 insertions(+), 51 deletions(-)

diff --git a/arch/xtensa/include/uapi/asm/msgbuf.h 
b/arch/xtensa/include/uapi/asm/msgbuf.h
index 36e2e103ca38..d6915e9f071c 100644
--- a/arch/xtensa/include/uapi/asm/msgbuf.h
+++ b/arch/xtensa/include/uapi/asm/msgbuf.h
@@ -7,7 +7,6 @@
  * between kernel and user space.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
  * - 2 miscellaneous 32-bit values
  *
  * This file is subject to the terms and conditions of the GNU General
@@ -21,19 +20,19 @@
 struct msqid64_ds {
struct ipc64_perm msg_perm;
 #ifdef __XTENSA_EB__
-   unsigned int__unused1;
-   __kernel_time_t msg_stime;  /* last msgsnd time */
-   unsigned int__unused2;
-   __kernel_time_t msg_rtime;  /* last msgrcv time */
-   unsigned int__unused3;
-   __kernel_time_t msg_ctime;  /* last change time */
+   unsigned long  msg_stime_high;
+   unsigned long  msg_stime;   /* last msgsnd time */
+   unsigned long  msg_rtime_high;
+   unsigned long  msg_rtime;   /* last msgrcv time */
+   unsigned long  msg_ctime_high;
+   unsigned long  msg_ctime;   /* last change time */
 #elif defined(__XTENSA_EL__)
-   __kernel_time_t msg_stime;  /* last msgsnd time */
-   unsigned int__unused1;
-   __kernel_time_t msg_rtime;  /* last msgrcv time */
-   unsigned int__unused2;
-   __kernel_time_t msg_ctime;  /* last change time */
-   unsigned int__unused3;
+   unsigned long  msg_stime;   /* last msgsnd time */
+   unsigned long  msg_stime_high;
+   unsigned long  msg_rtime;   /* last msgrcv time */
+   unsigned long  msg_rtime_high;
+   unsigned long  msg_ctime;   /* last change time */
+   unsigned long  msg_ctime_high;
 #else
 # error processor byte order undefined!
 #endif
diff --git a/arch/xtensa/include/uapi/asm/sembuf.h 
b/arch/xtensa/include/uapi/asm/sembuf.h
index f61b6331a10c..09f348d643f1 100644
--- a/arch/xtensa/include/uapi/asm/sembuf.h
+++ b/arch/xtensa/include/uapi/asm/sembuf.h
@@ -14,7 +14,6 @@
  * between kernel and user space.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
  * - 2 miscellaneous 32-bit values
  *
  */
@@ -27,15 +26,15 @@
 struct semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
 #ifdef __XTENSA_EL__
-   __kernel_time_t sem_otime;  /* last semop time */
-   unsigned long   __unused1;
-   __kernel_time_t sem_ctime;  /* last change time */
-   unsigned long   __unused2;
+   unsigned long   sem_otime;  /* last semop time */
+   unsigned long   sem_otime_high;
+   unsigned long   sem_ctime;  /* last change time */
+   unsigned long   sem_ctime_high;
 #else
-   unsigned long   __unused1;
-   __kernel_time_t sem_otime;  /* last semop time */
-   unsigned long   __unused2;
-   __kernel_time_t sem_ctime;  /* last change time */
+   unsigned long   sem_otime_high;
+   unsigned long   sem_otime;  /* last semop time */
+   unsigned long   sem_ctime_high;
+   unsigned long   sem_ctime;  /* last change time */
 #endif
unsigned long   sem_nsems;  /* no. of semaphores in array */
unsigned long   __unused3;
diff --git a/arch/xtensa/include/uapi/asm/shmbuf.h 
b/arch/xtensa/include/uapi/asm/shmbuf.h
index 26550bdc8430..554a57a6a90f 100644
--- a/arch/xtensa/include/uapi/asm/shmbuf.h
+++ b/arch/xtensa/include/uapi/asm/shmbuf.h
@@ -4,10 +4,10 @@
  *
  * The shmid64_ds structure for Xtensa architecture.
  * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
+ * between kernel and user space, but the padding is on the wrong
+ * side for big-endian xtensa, for historic reasons.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
  * - 2 

[PATCH v2 11/13] y2038: xtensa: extend sysvipc data structures

2018-04-12 Thread Arnd Bergmann
xtensa, uses a nonstandard variation of the generic sysvipc
data structures, intended to have the padding moved around
so it can deal with big-endian 32-bit user space that has
64-bit time_t.

xtensa tries hard to define the structures so they work
in both big-endian and little-endian systems with padding
on the right side.
However, they only succeeded for for two of the three structures,
and their struct shmid64_ds ended up being defined in two
identical copies, and the big-endian one is wrong.

This takes just take the same approach here that we have for
the asm-generic headers and adds separate 32-bit fields for the
upper halves of the timestamps, to let libc deal with the mess
in user space.

Signed-off-by: Arnd Bergmann 
---
 arch/xtensa/include/uapi/asm/msgbuf.h | 25 ---
 arch/xtensa/include/uapi/asm/sembuf.h | 17 
 arch/xtensa/include/uapi/asm/shmbuf.h | 37 ---
 3 files changed, 28 insertions(+), 51 deletions(-)

diff --git a/arch/xtensa/include/uapi/asm/msgbuf.h 
b/arch/xtensa/include/uapi/asm/msgbuf.h
index 36e2e103ca38..d6915e9f071c 100644
--- a/arch/xtensa/include/uapi/asm/msgbuf.h
+++ b/arch/xtensa/include/uapi/asm/msgbuf.h
@@ -7,7 +7,6 @@
  * between kernel and user space.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
  * - 2 miscellaneous 32-bit values
  *
  * This file is subject to the terms and conditions of the GNU General
@@ -21,19 +20,19 @@
 struct msqid64_ds {
struct ipc64_perm msg_perm;
 #ifdef __XTENSA_EB__
-   unsigned int__unused1;
-   __kernel_time_t msg_stime;  /* last msgsnd time */
-   unsigned int__unused2;
-   __kernel_time_t msg_rtime;  /* last msgrcv time */
-   unsigned int__unused3;
-   __kernel_time_t msg_ctime;  /* last change time */
+   unsigned long  msg_stime_high;
+   unsigned long  msg_stime;   /* last msgsnd time */
+   unsigned long  msg_rtime_high;
+   unsigned long  msg_rtime;   /* last msgrcv time */
+   unsigned long  msg_ctime_high;
+   unsigned long  msg_ctime;   /* last change time */
 #elif defined(__XTENSA_EL__)
-   __kernel_time_t msg_stime;  /* last msgsnd time */
-   unsigned int__unused1;
-   __kernel_time_t msg_rtime;  /* last msgrcv time */
-   unsigned int__unused2;
-   __kernel_time_t msg_ctime;  /* last change time */
-   unsigned int__unused3;
+   unsigned long  msg_stime;   /* last msgsnd time */
+   unsigned long  msg_stime_high;
+   unsigned long  msg_rtime;   /* last msgrcv time */
+   unsigned long  msg_rtime_high;
+   unsigned long  msg_ctime;   /* last change time */
+   unsigned long  msg_ctime_high;
 #else
 # error processor byte order undefined!
 #endif
diff --git a/arch/xtensa/include/uapi/asm/sembuf.h 
b/arch/xtensa/include/uapi/asm/sembuf.h
index f61b6331a10c..09f348d643f1 100644
--- a/arch/xtensa/include/uapi/asm/sembuf.h
+++ b/arch/xtensa/include/uapi/asm/sembuf.h
@@ -14,7 +14,6 @@
  * between kernel and user space.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
  * - 2 miscellaneous 32-bit values
  *
  */
@@ -27,15 +26,15 @@
 struct semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
 #ifdef __XTENSA_EL__
-   __kernel_time_t sem_otime;  /* last semop time */
-   unsigned long   __unused1;
-   __kernel_time_t sem_ctime;  /* last change time */
-   unsigned long   __unused2;
+   unsigned long   sem_otime;  /* last semop time */
+   unsigned long   sem_otime_high;
+   unsigned long   sem_ctime;  /* last change time */
+   unsigned long   sem_ctime_high;
 #else
-   unsigned long   __unused1;
-   __kernel_time_t sem_otime;  /* last semop time */
-   unsigned long   __unused2;
-   __kernel_time_t sem_ctime;  /* last change time */
+   unsigned long   sem_otime_high;
+   unsigned long   sem_otime;  /* last semop time */
+   unsigned long   sem_ctime_high;
+   unsigned long   sem_ctime;  /* last change time */
 #endif
unsigned long   sem_nsems;  /* no. of semaphores in array */
unsigned long   __unused3;
diff --git a/arch/xtensa/include/uapi/asm/shmbuf.h 
b/arch/xtensa/include/uapi/asm/shmbuf.h
index 26550bdc8430..554a57a6a90f 100644
--- a/arch/xtensa/include/uapi/asm/shmbuf.h
+++ b/arch/xtensa/include/uapi/asm/shmbuf.h
@@ -4,10 +4,10 @@
  *
  * The shmid64_ds structure for Xtensa architecture.
  * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
+ * between kernel and user space, but the padding is on the wrong
+ * side for big-endian xtensa, for historic reasons.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
  * - 2 miscellaneous 32-bit