Skip to contentSkip to conversation

sparc: unify ipcbuf.h

PATCH Applied Sam Ravnborg 2 participants 6 messages Dec 28, 2008 – Jan 4, 2009 SPARC + UltraSPARC (sparc/sparc64)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 sparc: unify ipcbuf.h

Looking closer the two structures only differed on the size of __kernel_umode_t.
Add a sparc32 specific padding to cover this difference.

The other types had same size on sparc32 and sparc64.

---
 arch/sparc/include/asm/Kbuild      |    2 --
 arch/sparc/include/asm/ipcbuf.h    |   36 ++++++++++++++++++++++++++++++------
 arch/sparc/include/asm/ipcbuf_32.h |   31 -------------------------------
 arch/sparc/include/asm/ipcbuf_64.h |   28 ----------------------------
 4 files changed, 30 insertions(+), 67 deletions(-)
 delete mode 100644 arch/sparc/include/asm/ipcbuf_32.h
 delete mode 100644 arch/sparc/include/asm/ipcbuf_64.h
arch/sparc/include/asm/Kbuild +0 -2
index 89c260a..b938232 100644
@@ -1,8 +1,6 @@
 # User exported sparc header files
 include include/asm-generic/Kbuild.asm
 
-header-y += ipcbuf_32.h
-header-y += ipcbuf_64.h
 header-y += posix_types_32.h
 header-y += posix_types_64.h
 header-y += ptrace_32.h
arch/sparc/include/asm/ipcbuf.h +30 -6
index 17d6ef7..1e8d84f 100644
@@ -1,8 +1,32 @@
-#ifndef ___ASM_SPARC_IPCBUF_H
-#define ___ASM_SPARC_IPCBUF_H
+#ifndef __SPARC_IPCBUF_H
+#define __SPARC_IPCBUF_H
+
+/*
+ * The ipc64_perm structure for sparc architecture.
+ * Note extra padding because this structure is passed back and forth
+ * between kernel and user space.
+ *
+ * Pad space is left for:
+ * - 32 bit mode (only sparc32, it is 32 bit on sparc64)
+ * - 32-bit seq
+ * - 2 miscellaneous 64-bit values
+ */
+
+struct ipc64_perm
+{
+	__kernel_key_t	key;
+	__kernel_uid_t	uid;
+	__kernel_gid_t	gid;
+	__kernel_uid_t	cuid;
+	__kernel_gid_t	cgid;
 #if defined(__sparc__) && defined(__arch64__)
-#include <asm/ipcbuf_64.h>
-#else
-#include <asm/ipcbuf_32.h>
-#endif
+	unsigned short __pad0;
 #endif
+	__kernel_mode_t	mode;
+	unsigned short	__pad1;
+	unsigned short	seq;
+	unsigned long	__unused1;
+	unsigned long	__unused2;
+};
+
+#endif /* __SPARC_IPCBUF_H */
arch/sparc/include/asm/ipcbuf_32.h deleted +0 -31
deleted file mode 100644
index 6387209..0000000
@@ -1,31 +0,0 @@
-#ifndef _SPARC_IPCBUF_H
-#define _SPARC_IPCBUF_H
-
-/*
- * The ipc64_perm structure for sparc architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space is left for:
- * - 32-bit mode
- * - 32-bit seq
- * - 2 miscellaneous 64-bit values (so that this structure matches
- *				    sparc64 ipc64_perm)
- */
-
-struct ipc64_perm
-{
-	__kernel_key_t		key;
-	__kernel_uid32_t	uid;
-	__kernel_gid32_t	gid;
-	__kernel_uid32_t	cuid;
-	__kernel_gid32_t	cgid;
-	unsigned short		__pad1;
-	__kernel_mode_t		mode;
-	unsigned short		__pad2;
-	unsigned short		seq;
-	unsigned long long	__unused1;
-	unsigned long long	__unused2;
-};
-
-#endif /* _SPARC_IPCBUF_H */
arch/sparc/include/asm/ipcbuf_64.h deleted +0 -28
deleted file mode 100644
index a44b855..0000000
@@ -1,28 +0,0 @@
-#ifndef _SPARC64_IPCBUF_H
-#define _SPARC64_IPCBUF_H
-
-/*
- * The ipc64_perm structure for sparc64 architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space is left for:
- * - 32-bit seq
- * - 2 miscellaneous 64-bit values
- */
-
-struct ipc64_perm
-{
-	__kernel_key_t	key;
-	__kernel_uid_t	uid;
-	__kernel_gid_t	gid;
-	__kernel_uid_t	cuid;
-	__kernel_gid_t	cgid;
-	__kernel_mode_t	mode;
-	unsigned short	__pad1;
-	unsigned short	seq;
-	unsigned long	__unused1;
-	unsigned long	__unused2;
-};
-
-#endif /* _SPARC64_IPCBUF_H */
Signature · 1 line
1.6.0.2.GIT
maintainer
#1 lore raw

From: Sam Ravnborg <[email protected]>
Date: Sun, 28 Dec 2008 21:04:18 +0100

Quoted 7 lines

Looking closer the two structures only differed on the size of __kernel_umode_t.
Add a sparc32 specific padding to cover this difference.

The other types had same size on sparc32 and sparc64.

I'm not sure this will work.

You've changed the size of the structure on 32-bit.

The last two "unused" members of ipc64_perm are "unsigned long long", not just plain "unsigned long" in the 32-bit variant.

But you've used plain "unsigned long" in the unified copy.

#2 lore raw
In reply to Sam Ravnborg
Quoted 11 lines · David Miller

From: Sam Ravnborg <[email protected]>
Date: Sun, 28 Dec 2008 21:04:18 +0100

Quoted 7 lines

Looking closer the two structures only differed on the size of __kernel_umode_t.
Add a sparc32 specific padding to cover this difference.

The other types had same size on sparc32 and sparc64.

Quoted 8 lines

I'm not sure this will work.

You've changed the size of the structure on 32-bit.

The last two "unused" members of ipc64_perm are "unsigned long long", not just plain "unsigned long" in the 32-bit variant.

But you've used plain "unsigned long" in the unified copy.

Good catch - this is obviously wrong.
I think I confused myself with the fact that
(sparc32)long long eqals to (sparc64)long
but not the other way around.

So the padding should be changed to long long which will do the right thing on both sparc32 and sparc64.

I considered changing the padding to use __u64, __u16 etc, but I could see that no other archicettures do so for their ipcbuf definition.

No patch as I am waiting until you push out the updated sparc-next tree. Or you can just fix it up yourself if you prefer.

Sam

maintainer
#3 lore raw
In reply to Sam Ravnborg

From: Sam Ravnborg <[email protected]>
Date: Sat, 3 Jan 2009 09:43:59 +0100

Quoted 2 lines

No patch as I am waiting until you push out the updated sparc-next tree.

I was waiting for some test builds to finish :-)

I just pushed everything to sparc-2.6.git on kernel.org

#4 lore raw

PATCH 1/1 sparc: unify ipcbuf.h

In reply to Sam Ravnborg

The ony difference is the size of the mode.
sparc has extra padding to compensate for this.

---

Compared to v1:
- fixed size of padding as noted by davem
- corrected #ifdef so mode padding is used on sparc - not sparc64 (ups)
- simplified ifdef to use only __arch64__ as discussed in another mail

Only build tested on saprc64 as my sparc toolchain needs an update due to stricter version checks in compiler.h

Sam

 arch/sparc/include/asm/Kbuild                    |    3 --
 arch/sparc/include/asm/{ipcbuf_64.h => ipcbuf.h} |   16 +++++++----
 arch/sparc/include/asm/ipcbuf_32.h               |   31 ----------------------
 3 files changed, 10 insertions(+), 40 deletions(-)
 rename arch/sparc/include/asm/{ipcbuf_64.h => ipcbuf.h} (56%)
 delete mode 100644 arch/sparc/include/asm/ipcbuf_32.h
arch/sparc/include/asm/Kbuild +0 -3
index 58f9b3a..aeaec45 100644
@@ -1,9 +1,6 @@
 # User exported sparc header files
 include include/asm-generic/Kbuild.asm
 
-header-y += ipcbuf_32.h
-header-y += ipcbuf_64.h
-
 header-y += apc.h
 header-y += asi.h
 header-y += display7seg.h
arch/sparc/include/asm/ipcbuf.h renamed from arch/sparc/include/asm/ipcbuf_64.h +10 -6
similarity index 56%
rename from arch/sparc/include/asm/ipcbuf_64.h
rename to arch/sparc/include/asm/ipcbuf.h
index a44b855..66013b4 100644
@@ -1,13 +1,14 @@
-#ifndef _SPARC64_IPCBUF_H
-#define _SPARC64_IPCBUF_H
+#ifndef __SPARC_IPCBUF_H
+#define __SPARC_IPCBUF_H
 
 /*
- * The ipc64_perm structure for sparc64 architecture.
+ * The ipc64_perm structure for sparc/sparc64 architecture.
  * Note extra padding because this structure is passed back and forth
  * between kernel and user space.
  *
  * Pad space is left for:
  * - 32-bit seq
+ * - on sparc for 32 bit mode (it is 32 bit on sparc64)
  * - 2 miscellaneous 64-bit values
  */
 
@@ -18,11 +19,14 @@ struct ipc64_perm
 	__kernel_gid_t	gid;
 	__kernel_uid_t	cuid;
 	__kernel_gid_t	cgid;
+#ifndef __arch64__
+	unsigned short	__pad0;
+#endif
 	__kernel_mode_t	mode;
 	unsigned short	__pad1;
 	unsigned short	seq;
-	unsigned long	__unused1;
-	unsigned long	__unused2;
+	unsigned long long __unused1;
+	unsigned long long __unused2;
 };
 
-#endif /* _SPARC64_IPCBUF_H */
+#endif /* __SPARC_IPCBUF_H */
arch/sparc/include/asm/ipcbuf_32.h deleted +0 -31
deleted file mode 100644
index 6387209..0000000
@@ -1,31 +0,0 @@
-#ifndef _SPARC_IPCBUF_H
-#define _SPARC_IPCBUF_H
-
-/*
- * The ipc64_perm structure for sparc architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space is left for:
- * - 32-bit mode
- * - 32-bit seq
- * - 2 miscellaneous 64-bit values (so that this structure matches
- *				    sparc64 ipc64_perm)
- */
-
-struct ipc64_perm
-{
-	__kernel_key_t		key;
-	__kernel_uid32_t	uid;
-	__kernel_gid32_t	gid;
-	__kernel_uid32_t	cuid;
-	__kernel_gid32_t	cgid;
-	unsigned short		__pad1;
-	__kernel_mode_t		mode;
-	unsigned short		__pad2;
-	unsigned short		seq;
-	unsigned long long	__unused1;
-	unsigned long long	__unused2;
-};
-
-#endif /* _SPARC_IPCBUF_H */
Signature · 1 line
1.6.0.2.GIT