linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* binfmt_flat cleanups and RISC-V support
@ 2019-06-10 21:20 Christoph Hellwig
  2019-06-10 21:20 ` [PATCH 01/15] binfmt_flat: remove flat_reloc_valid Christoph Hellwig
                   ` (16 more replies)
  0 siblings, 17 replies; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

Hi Greg,

below is a larger stash of cleanups for the binfmt_misc code,
preparing for the last patch that now trivially adds RISC-V
support, which will be used for the RISC-V nommu series I am
about to post.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH 01/15] binfmt_flat: remove flat_reloc_valid
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-11  9:44   ` Vladimir Murzin
  2019-06-10 21:20 ` [PATCH 02/15] binfmt_flat: remove flat_set_persistent Christoph Hellwig
                   ` (15 subsequent siblings)
  16 siblings, 1 reply; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

This helper is the same for all architectures, open code it in the only
caller.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 arch/arm/include/asm/flat.h        | 1 -
 arch/c6x/include/asm/flat.h        | 1 -
 arch/h8300/include/asm/flat.h      | 1 -
 arch/m68k/include/asm/flat.h       | 1 -
 arch/microblaze/include/asm/flat.h | 1 -
 arch/sh/include/asm/flat.h         | 1 -
 arch/xtensa/include/asm/flat.h     | 1 -
 fs/binfmt_flat.c                   | 2 +-
 8 files changed, 1 insertion(+), 8 deletions(-)

diff --git a/arch/arm/include/asm/flat.h b/arch/arm/include/asm/flat.h
index f0c75ddeea23..10cce9ecf151 100644
--- a/arch/arm/include/asm/flat.h
+++ b/arch/arm/include/asm/flat.h
@@ -10,7 +10,6 @@
 
 #define	flat_argvp_envp_on_stack()		1
 #define	flat_old_ram_flag(flags)		(flags)
-#define	flat_reloc_valid(reloc, size)		((reloc) <= (size))
 
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
diff --git a/arch/c6x/include/asm/flat.h b/arch/c6x/include/asm/flat.h
index 76fd0bb962a3..ecc6aea6606c 100644
--- a/arch/c6x/include/asm/flat.h
+++ b/arch/c6x/include/asm/flat.h
@@ -6,7 +6,6 @@
 
 #define flat_argvp_envp_on_stack()			0
 #define flat_old_ram_flag(flags)			(flags)
-#define flat_reloc_valid(reloc, size)			((reloc) <= (size))
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
 {
diff --git a/arch/h8300/include/asm/flat.h b/arch/h8300/include/asm/flat.h
index f4cdfcbdd2ba..dcc7775115dd 100644
--- a/arch/h8300/include/asm/flat.h
+++ b/arch/h8300/include/asm/flat.h
@@ -10,7 +10,6 @@
 
 #define	flat_argvp_envp_on_stack()		1
 #define	flat_old_ram_flag(flags)		1
-#define	flat_reloc_valid(reloc, size)		((reloc) <= (size))
 #define	flat_set_persistent(relval, p)		0
 
 /*
diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h
index 4f1d1e373420..a631caf5e18f 100644
--- a/arch/m68k/include/asm/flat.h
+++ b/arch/m68k/include/asm/flat.h
@@ -10,7 +10,6 @@
 
 #define	flat_argvp_envp_on_stack()		1
 #define	flat_old_ram_flag(flags)		(flags)
-#define	flat_reloc_valid(reloc, size)		((reloc) <= (size))
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
 {
diff --git a/arch/microblaze/include/asm/flat.h b/arch/microblaze/include/asm/flat.h
index 3d2747d4c967..34be5ed011be 100644
--- a/arch/microblaze/include/asm/flat.h
+++ b/arch/microblaze/include/asm/flat.h
@@ -15,7 +15,6 @@
 
 #define	flat_argvp_envp_on_stack()	0
 #define	flat_old_ram_flag(flags)	(flags)
-#define	flat_reloc_valid(reloc, size)	((reloc) <= (size))
 #define	flat_set_persistent(relval, p)		0
 
 /*
diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h
index 843d458b8329..8f2929b32f2e 100644
--- a/arch/sh/include/asm/flat.h
+++ b/arch/sh/include/asm/flat.h
@@ -13,7 +13,6 @@
 
 #define	flat_argvp_envp_on_stack()		0
 #define	flat_old_ram_flag(flags)		(flags)
-#define	flat_reloc_valid(reloc, size)		((reloc) <= (size))
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
 {
diff --git a/arch/xtensa/include/asm/flat.h b/arch/xtensa/include/asm/flat.h
index b8532d7877b3..6ee5a35eb0ec 100644
--- a/arch/xtensa/include/asm/flat.h
+++ b/arch/xtensa/include/asm/flat.h
@@ -6,7 +6,6 @@
 
 #define flat_argvp_envp_on_stack()			0
 #define flat_old_ram_flag(flags)			(flags)
-#define flat_reloc_valid(reloc, size)			((reloc) <= (size))
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
 {
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index 82a48e830018..afddea583999 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -345,7 +345,7 @@ calc_reloc(unsigned long r, struct lib_info *p, int curid, int internalp)
 	start_code = p->lib_list[id].start_code;
 	text_len = p->lib_list[id].text_len;
 
-	if (!flat_reloc_valid(r, start_brk - start_data + text_len)) {
+	if (r > start_brk - start_data + text_len) {
 		pr_err("reloc outside program 0x%lx (0 - 0x%lx/0x%lx)",
 		       r, start_brk-start_data+text_len, text_len);
 		goto failed;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 02/15] binfmt_flat: remove flat_set_persistent
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
  2019-06-10 21:20 ` [PATCH 01/15] binfmt_flat: remove flat_reloc_valid Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-11  9:45   ` Vladimir Murzin
  2019-06-10 21:20 ` [PATCH 03/15] binfmt_flat: provide a default version of flat_get_relocate_addr Christoph Hellwig
                   ` (14 subsequent siblings)
  16 siblings, 1 reply; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

This helper is a no-op on all architectures, remove it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 arch/arm/include/asm/flat.h        | 1 -
 arch/c6x/include/asm/flat.h        | 1 -
 arch/h8300/include/asm/flat.h      | 1 -
 arch/m68k/include/asm/flat.h       | 5 -----
 arch/microblaze/include/asm/flat.h | 1 -
 arch/sh/include/asm/flat.h         | 1 -
 arch/xtensa/include/asm/flat.h     | 1 -
 fs/binfmt_flat.c                   | 2 --
 8 files changed, 13 deletions(-)

diff --git a/arch/arm/include/asm/flat.h b/arch/arm/include/asm/flat.h
index 10cce9ecf151..576241d74704 100644
--- a/arch/arm/include/asm/flat.h
+++ b/arch/arm/include/asm/flat.h
@@ -31,6 +31,5 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
 }
 
 #define	flat_get_relocate_addr(rel)		(rel)
-#define	flat_set_persistent(relval, p)		0
 
 #endif /* __ARM_FLAT_H__ */
diff --git a/arch/c6x/include/asm/flat.h b/arch/c6x/include/asm/flat.h
index ecc6aea6606c..ac87368efad1 100644
--- a/arch/c6x/include/asm/flat.h
+++ b/arch/c6x/include/asm/flat.h
@@ -18,6 +18,5 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
 	return 0;
 }
 #define flat_get_relocate_addr(rel)			(rel)
-#define flat_set_persistent(relval, p)			0
 
 #endif /* __ASM_C6X_FLAT_H */
diff --git a/arch/h8300/include/asm/flat.h b/arch/h8300/include/asm/flat.h
index dcc7775115dd..7ef7eefded3d 100644
--- a/arch/h8300/include/asm/flat.h
+++ b/arch/h8300/include/asm/flat.h
@@ -10,7 +10,6 @@
 
 #define	flat_argvp_envp_on_stack()		1
 #define	flat_old_ram_flag(flags)		1
-#define	flat_set_persistent(relval, p)		0
 
 /*
  * on the H8 a couple of the relocations have an instruction in the
diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h
index a631caf5e18f..955617bb937b 100644
--- a/arch/m68k/include/asm/flat.h
+++ b/arch/m68k/include/asm/flat.h
@@ -30,11 +30,6 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
 }
 #define	flat_get_relocate_addr(rel)		(rel)
 
-static inline int flat_set_persistent(u32 relval, u32 *persistent)
-{
-	return 0;
-}
-
 #define FLAT_PLAT_INIT(regs) \
 	do { \
 		if (current->mm) \
diff --git a/arch/microblaze/include/asm/flat.h b/arch/microblaze/include/asm/flat.h
index 34be5ed011be..846084fa7f04 100644
--- a/arch/microblaze/include/asm/flat.h
+++ b/arch/microblaze/include/asm/flat.h
@@ -15,7 +15,6 @@
 
 #define	flat_argvp_envp_on_stack()	0
 #define	flat_old_ram_flag(flags)	(flags)
-#define	flat_set_persistent(relval, p)		0
 
 /*
  * Microblaze works a little differently from other arches, because
diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h
index 8f2929b32f2e..6f3b18679a98 100644
--- a/arch/sh/include/asm/flat.h
+++ b/arch/sh/include/asm/flat.h
@@ -25,7 +25,6 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
 	return 0;
 }
 #define	flat_get_relocate_addr(rel)		(rel)
-#define	flat_set_persistent(relval, p)		({ (void)p; 0; })
 
 #define FLAT_PLAT_INIT(_r) \
   do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \
diff --git a/arch/xtensa/include/asm/flat.h b/arch/xtensa/include/asm/flat.h
index 6ee5a35eb0ec..b1bc0d9a8d4e 100644
--- a/arch/xtensa/include/asm/flat.h
+++ b/arch/xtensa/include/asm/flat.h
@@ -18,6 +18,5 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
 	return 0;
 }
 #define flat_get_relocate_addr(rel)			(rel)
-#define flat_set_persistent(relval, p)			0
 
 #endif /* __ASM_XTENSA_FLAT_H */
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index afddea583999..a4c0b245ab1f 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -787,8 +787,6 @@ static int load_flat_file(struct linux_binprm *bprm,
 			if (get_user(relval, reloc + i))
 				return -EFAULT;
 			relval = ntohl(relval);
-			if (flat_set_persistent(relval, &persistent))
-				continue;
 			addr = flat_get_relocate_addr(relval);
 			rp = (u32 __user *)calc_reloc(addr, libinfo, id, 1);
 			if (rp == (u32 __user *)RELOC_FAILED) {
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 03/15] binfmt_flat: provide a default version of flat_get_relocate_addr
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
  2019-06-10 21:20 ` [PATCH 01/15] binfmt_flat: remove flat_reloc_valid Christoph Hellwig
  2019-06-10 21:20 ` [PATCH 02/15] binfmt_flat: remove flat_set_persistent Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-11  9:46   ` Vladimir Murzin
  2019-06-10 21:20 ` [PATCH 04/15] binfmt_flat: remove flat_old_ram_flag Christoph Hellwig
                   ` (13 subsequent siblings)
  16 siblings, 1 reply; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

This way only the two architectures that do masking need to provide
the helper.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 arch/arm/include/asm/flat.h    | 2 --
 arch/c6x/include/asm/flat.h    | 1 -
 arch/m68k/include/asm/flat.h   | 1 -
 arch/sh/include/asm/flat.h     | 1 -
 arch/xtensa/include/asm/flat.h | 1 -
 fs/binfmt_flat.c               | 4 ++++
 6 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/arch/arm/include/asm/flat.h b/arch/arm/include/asm/flat.h
index 576241d74704..a185fe023b60 100644
--- a/arch/arm/include/asm/flat.h
+++ b/arch/arm/include/asm/flat.h
@@ -30,6 +30,4 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
 #endif
 }
 
-#define	flat_get_relocate_addr(rel)		(rel)
-
 #endif /* __ARM_FLAT_H__ */
diff --git a/arch/c6x/include/asm/flat.h b/arch/c6x/include/asm/flat.h
index ac87368efad1..c4d703b454c6 100644
--- a/arch/c6x/include/asm/flat.h
+++ b/arch/c6x/include/asm/flat.h
@@ -17,6 +17,5 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
 	put_unaligned(addr, (__force u32 *)rp);
 	return 0;
 }
-#define flat_get_relocate_addr(rel)			(rel)
 
 #endif /* __ASM_C6X_FLAT_H */
diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h
index 955617bb937b..217fa89c8e34 100644
--- a/arch/m68k/include/asm/flat.h
+++ b/arch/m68k/include/asm/flat.h
@@ -28,7 +28,6 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
 	return put_user(addr, rp);
 #endif
 }
-#define	flat_get_relocate_addr(rel)		(rel)
 
 #define FLAT_PLAT_INIT(regs) \
 	do { \
diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h
index 6f3b18679a98..0d520b4cc5ea 100644
--- a/arch/sh/include/asm/flat.h
+++ b/arch/sh/include/asm/flat.h
@@ -24,7 +24,6 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
 	put_unaligned(addr, (__force u32 *)rp);
 	return 0;
 }
-#define	flat_get_relocate_addr(rel)		(rel)
 
 #define FLAT_PLAT_INIT(_r) \
   do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \
diff --git a/arch/xtensa/include/asm/flat.h b/arch/xtensa/include/asm/flat.h
index b1bc0d9a8d4e..a1d88aa3ef8a 100644
--- a/arch/xtensa/include/asm/flat.h
+++ b/arch/xtensa/include/asm/flat.h
@@ -17,6 +17,5 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
 	put_unaligned(addr, (__force u32 *)rp);
 	return 0;
 }
-#define flat_get_relocate_addr(rel)			(rel)
 
 #endif /* __ASM_XTENSA_FLAT_H */
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index a4c0b245ab1f..c0e4535dc1ec 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -43,6 +43,10 @@
 #include <asm/cacheflush.h>
 #include <asm/page.h>
 
+#ifndef flat_get_relocate_addr
+#define flat_get_relocate_addr(rel)	(rel)
+#endif
+
 /****************************************************************************/
 
 /*
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 04/15] binfmt_flat: remove flat_old_ram_flag
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (2 preceding siblings ...)
  2019-06-10 21:20 ` [PATCH 03/15] binfmt_flat: provide a default version of flat_get_relocate_addr Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-11  6:04   ` Greg Ungerer
  2019-06-11  9:47   ` Vladimir Murzin
  2019-06-10 21:20 ` [PATCH 05/15] binfmt_flat: replace flat_argvp_envp_on_stack with a Kconfig variable Christoph Hellwig
                   ` (12 subsequent siblings)
  16 siblings, 2 replies; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

Instead add a Kconfig variable that only h8300 selects.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 arch/arm/include/asm/flat.h        | 1 -
 arch/c6x/include/asm/flat.h        | 1 -
 arch/h8300/Kconfig                 | 1 +
 arch/h8300/include/asm/flat.h      | 1 -
 arch/m68k/include/asm/flat.h       | 1 -
 arch/microblaze/include/asm/flat.h | 1 -
 arch/sh/include/asm/flat.h         | 1 -
 arch/xtensa/include/asm/flat.h     | 1 -
 fs/Kconfig.binfmt                  | 3 +++
 fs/binfmt_flat.c                   | 3 ++-
 10 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/arch/arm/include/asm/flat.h b/arch/arm/include/asm/flat.h
index a185fe023b60..acf162111ee2 100644
--- a/arch/arm/include/asm/flat.h
+++ b/arch/arm/include/asm/flat.h
@@ -9,7 +9,6 @@
 #include <linux/uaccess.h>
 
 #define	flat_argvp_envp_on_stack()		1
-#define	flat_old_ram_flag(flags)		(flags)
 
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
diff --git a/arch/c6x/include/asm/flat.h b/arch/c6x/include/asm/flat.h
index c4d703b454c6..353e4d06e8c0 100644
--- a/arch/c6x/include/asm/flat.h
+++ b/arch/c6x/include/asm/flat.h
@@ -5,7 +5,6 @@
 #include <asm/unaligned.h>
 
 #define flat_argvp_envp_on_stack()			0
-#define flat_old_ram_flag(flags)			(flags)
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
 {
diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig
index ecfc4b4b6373..d30e8727b02d 100644
--- a/arch/h8300/Kconfig
+++ b/arch/h8300/Kconfig
@@ -2,6 +2,7 @@
 config H8300
         def_bool y
 	select ARCH_32BIT_OFF_T
+	select BINFMT_FLAT_OLD_ALWAYS_RAM
 	select GENERIC_ATOMIC64
 	select HAVE_UID16
 	select VIRT_TO_BUS
diff --git a/arch/h8300/include/asm/flat.h b/arch/h8300/include/asm/flat.h
index 7ef7eefded3d..14cc928d5478 100644
--- a/arch/h8300/include/asm/flat.h
+++ b/arch/h8300/include/asm/flat.h
@@ -9,7 +9,6 @@
 #include <asm/unaligned.h>
 
 #define	flat_argvp_envp_on_stack()		1
-#define	flat_old_ram_flag(flags)		1
 
 /*
  * on the H8 a couple of the relocations have an instruction in the
diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h
index 217fa89c8e34..7b1fb5c2809e 100644
--- a/arch/m68k/include/asm/flat.h
+++ b/arch/m68k/include/asm/flat.h
@@ -9,7 +9,6 @@
 #include <linux/uaccess.h>
 
 #define	flat_argvp_envp_on_stack()		1
-#define	flat_old_ram_flag(flags)		(flags)
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
 {
diff --git a/arch/microblaze/include/asm/flat.h b/arch/microblaze/include/asm/flat.h
index 846084fa7f04..1cd8d7f4cf12 100644
--- a/arch/microblaze/include/asm/flat.h
+++ b/arch/microblaze/include/asm/flat.h
@@ -14,7 +14,6 @@
 #include <asm/unaligned.h>
 
 #define	flat_argvp_envp_on_stack()	0
-#define	flat_old_ram_flag(flags)	(flags)
 
 /*
  * Microblaze works a little differently from other arches, because
diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h
index 0d520b4cc5ea..015678d7b771 100644
--- a/arch/sh/include/asm/flat.h
+++ b/arch/sh/include/asm/flat.h
@@ -12,7 +12,6 @@
 #include <asm/unaligned.h>
 
 #define	flat_argvp_envp_on_stack()		0
-#define	flat_old_ram_flag(flags)		(flags)
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
 {
diff --git a/arch/xtensa/include/asm/flat.h b/arch/xtensa/include/asm/flat.h
index a1d88aa3ef8a..b215c1e66958 100644
--- a/arch/xtensa/include/asm/flat.h
+++ b/arch/xtensa/include/asm/flat.h
@@ -5,7 +5,6 @@
 #include <asm/unaligned.h>
 
 #define flat_argvp_envp_on_stack()			0
-#define flat_old_ram_flag(flags)			(flags)
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
 {
diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
index f87ddd1b6d72..5658e12ad944 100644
--- a/fs/Kconfig.binfmt
+++ b/fs/Kconfig.binfmt
@@ -97,6 +97,9 @@ config BINFMT_FLAT
 	help
 	  Support uClinux FLAT format binaries.
 
+config BINFMT_FLAT_OLD_ALWAYS_RAM
+	bool
+
 config BINFMT_ZFLAT
 	bool "Enable ZFLAT support"
 	depends on BINFMT_FLAT
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index c0e4535dc1ec..18d82fd5f57c 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -488,7 +488,8 @@ static int load_flat_file(struct linux_binprm *bprm,
 	 * fix up the flags for the older format,  there were all kinds
 	 * of endian hacks,  this only works for the simple cases
 	 */
-	if (rev == OLD_FLAT_VERSION && flat_old_ram_flag(flags))
+	if (IS_ENABLED(CONFIG_BINFMT_FLAT_OLD_ALWAYS_RAM) &&
+	    rev == OLD_FLAT_VERSION)
 		flags = FLAT_FLAG_RAM;
 
 #ifndef CONFIG_BINFMT_ZFLAT
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 05/15] binfmt_flat: replace flat_argvp_envp_on_stack with a Kconfig variable
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (3 preceding siblings ...)
  2019-06-10 21:20 ` [PATCH 04/15] binfmt_flat: remove flat_old_ram_flag Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-11  9:49   ` Vladimir Murzin
  2019-06-10 21:20 ` [PATCH 06/15] binfmt_flat: remove the uapi <linux/flat.h> header Christoph Hellwig
                   ` (11 subsequent siblings)
  16 siblings, 1 reply; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

This will eventually allow us to kill the need for an <asm/flat.h> for
many cases.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 arch/arm/Kconfig                   | 1 +
 arch/arm/include/asm/flat.h        | 2 --
 arch/c6x/include/asm/flat.h        | 1 -
 arch/h8300/Kconfig                 | 1 +
 arch/h8300/include/asm/flat.h      | 2 --
 arch/m68k/Kconfig                  | 1 +
 arch/m68k/include/asm/flat.h       | 1 -
 arch/microblaze/include/asm/flat.h | 2 --
 arch/sh/include/asm/flat.h         | 1 -
 arch/xtensa/include/asm/flat.h     | 1 -
 fs/Kconfig.binfmt                  | 3 +++
 fs/binfmt_flat.c                   | 5 +++--
 12 files changed, 9 insertions(+), 12 deletions(-)

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 8869742a85df..b1b48c0bde76 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -30,6 +30,7 @@ config ARM
 	select ARCH_USE_BUILTIN_BSWAP
 	select ARCH_USE_CMPXCHG_LOCKREF
 	select ARCH_WANT_IPC_PARSE_VERSION
+	select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
 	select BUILDTIME_EXTABLE_SORT if MMU
 	select CLONE_BACKWARDS
 	select CPU_PM if SUSPEND || CPU_IDLE
diff --git a/arch/arm/include/asm/flat.h b/arch/arm/include/asm/flat.h
index acf162111ee2..bbc27901446f 100644
--- a/arch/arm/include/asm/flat.h
+++ b/arch/arm/include/asm/flat.h
@@ -8,8 +8,6 @@
 
 #include <linux/uaccess.h>
 
-#define	flat_argvp_envp_on_stack()		1
-
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
 {
diff --git a/arch/c6x/include/asm/flat.h b/arch/c6x/include/asm/flat.h
index 353e4d06e8c0..2d57a9204d21 100644
--- a/arch/c6x/include/asm/flat.h
+++ b/arch/c6x/include/asm/flat.h
@@ -4,7 +4,6 @@
 
 #include <asm/unaligned.h>
 
-#define flat_argvp_envp_on_stack()			0
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
 {
diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig
index d30e8727b02d..7457f190caaa 100644
--- a/arch/h8300/Kconfig
+++ b/arch/h8300/Kconfig
@@ -2,6 +2,7 @@
 config H8300
         def_bool y
 	select ARCH_32BIT_OFF_T
+	select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
 	select BINFMT_FLAT_OLD_ALWAYS_RAM
 	select GENERIC_ATOMIC64
 	select HAVE_UID16
diff --git a/arch/h8300/include/asm/flat.h b/arch/h8300/include/asm/flat.h
index 14cc928d5478..4683146f0e9e 100644
--- a/arch/h8300/include/asm/flat.h
+++ b/arch/h8300/include/asm/flat.h
@@ -8,8 +8,6 @@
 
 #include <asm/unaligned.h>
 
-#define	flat_argvp_envp_on_stack()		1
-
 /*
  * on the H8 a couple of the relocations have an instruction in the
  * top byte.  As there can only be 24bits of address space,  we just
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index 218e037ef901..fd69ee5ad6ab 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -7,6 +7,7 @@ config M68K
 	select ARCH_MIGHT_HAVE_PC_PARPORT if ISA
 	select ARCH_NO_COHERENT_DMA_MMAP if !MMU
 	select ARCH_NO_PREEMPT if !COLDFIRE
+	select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
 	select HAVE_IDE
 	select HAVE_AOUT if MMU
 	select HAVE_DEBUG_BUGVERBOSE
diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h
index 7b1fb5c2809e..d7102fcd43eb 100644
--- a/arch/m68k/include/asm/flat.h
+++ b/arch/m68k/include/asm/flat.h
@@ -8,7 +8,6 @@
 
 #include <linux/uaccess.h>
 
-#define	flat_argvp_envp_on_stack()		1
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
 {
diff --git a/arch/microblaze/include/asm/flat.h b/arch/microblaze/include/asm/flat.h
index 1cd8d7f4cf12..9e3d8e01d294 100644
--- a/arch/microblaze/include/asm/flat.h
+++ b/arch/microblaze/include/asm/flat.h
@@ -13,8 +13,6 @@
 
 #include <asm/unaligned.h>
 
-#define	flat_argvp_envp_on_stack()	0
-
 /*
  * Microblaze works a little differently from other arches, because
  * of the MICROBLAZE_64 reloc type. Here, a 32 bit address is split
diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h
index 015678d7b771..1002343dd84a 100644
--- a/arch/sh/include/asm/flat.h
+++ b/arch/sh/include/asm/flat.h
@@ -11,7 +11,6 @@
 
 #include <asm/unaligned.h>
 
-#define	flat_argvp_envp_on_stack()		0
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
 {
diff --git a/arch/xtensa/include/asm/flat.h b/arch/xtensa/include/asm/flat.h
index b215c1e66958..3d357371b28b 100644
--- a/arch/xtensa/include/asm/flat.h
+++ b/arch/xtensa/include/asm/flat.h
@@ -4,7 +4,6 @@
 
 #include <asm/unaligned.h>
 
-#define flat_argvp_envp_on_stack()			0
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
 					u32 *addr, u32 *persistent)
 {
diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
index 5658e12ad944..82f7d7f234f3 100644
--- a/fs/Kconfig.binfmt
+++ b/fs/Kconfig.binfmt
@@ -97,6 +97,9 @@ config BINFMT_FLAT
 	help
 	  Support uClinux FLAT format binaries.
 
+config BINFMT_FLAT_ARGVP_ENVP_ON_STACK
+	bool
+
 config BINFMT_FLAT_OLD_ALWAYS_RAM
 	bool
 
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index 18d82fd5f57c..c09651087eda 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -124,14 +124,15 @@ static int create_flat_tables(struct linux_binprm *bprm, unsigned long arg_start
 
 	sp -= bprm->envc + 1;
 	sp -= bprm->argc + 1;
-	sp -= flat_argvp_envp_on_stack() ? 2 : 0;
+	if (IS_ENABLED(CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK))
+		sp -= 2; /* argvp + envp */
 	sp -= 1;  /* &argc */
 
 	current->mm->start_stack = (unsigned long)sp & -FLAT_STACK_ALIGN;
 	sp = (unsigned long __user *)current->mm->start_stack;
 
 	__put_user(bprm->argc, sp++);
-	if (flat_argvp_envp_on_stack()) {
+	if (IS_ENABLED(CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK)) {
 		unsigned long argv, envp;
 		argv = (unsigned long)(sp + 2);
 		envp = (unsigned long)(sp + 2 + bprm->argc + 1);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 06/15] binfmt_flat: remove the uapi <linux/flat.h> header
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (4 preceding siblings ...)
  2019-06-10 21:20 ` [PATCH 05/15] binfmt_flat: replace flat_argvp_envp_on_stack with a Kconfig variable Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-11  9:51   ` Vladimir Murzin
  2019-06-10 21:20 ` [PATCH 07/15] binfmt_flat: use __be32 for the on-disk format Christoph Hellwig
                   ` (10 subsequent siblings)
  16 siblings, 1 reply; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

The split between the two flat.h files is completely arbitrary, and the
uapi version even contains CONFIG_ ifdefs that can't work in userspace.
The only userspace program known to use the header is elf2flt, and it
ships with its own version of the combined header.

Use the chance to move the <asm/flat.h> inclusion out of this file, as it
is in no way needed for the format defintion, but just for the binfmt
implementation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/binfmt_flat.c          |  1 +
 include/linux/flat.h      | 45 ++++++++++++++++++++++++++---
 include/uapi/linux/flat.h | 59 ---------------------------------------
 3 files changed, 42 insertions(+), 63 deletions(-)
 delete mode 100644 include/uapi/linux/flat.h

diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index c09651087eda..6ae0f9af3fc9 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -42,6 +42,7 @@
 #include <asm/unaligned.h>
 #include <asm/cacheflush.h>
 #include <asm/page.h>
+#include <asm/flat.h>
 
 #ifndef flat_get_relocate_addr
 #define flat_get_relocate_addr(rel)	(rel)
diff --git a/include/linux/flat.h b/include/linux/flat.h
index 569b67d64d5c..21d901ba191b 100644
--- a/include/linux/flat.h
+++ b/include/linux/flat.h
@@ -10,8 +10,47 @@
 #ifndef _LINUX_FLAT_H
 #define _LINUX_FLAT_H
 
-#include <uapi/linux/flat.h>
-#include <asm/flat.h>
+#define	FLAT_VERSION			0x00000004L
+
+#ifdef CONFIG_BINFMT_SHARED_FLAT
+#define	MAX_SHARED_LIBS			(4)
+#else
+#define	MAX_SHARED_LIBS			(1)
+#endif
+
+/*
+ * To make everything easier to port and manage cross platform
+ * development,  all fields are in network byte order.
+ */
+
+struct flat_hdr {
+	char magic[4];
+	unsigned long rev;          /* version (as above) */
+	unsigned long entry;        /* Offset of first executable instruction
+	                               with text segment from beginning of file */
+	unsigned long data_start;   /* Offset of data segment from beginning of
+	                               file */
+	unsigned long data_end;     /* Offset of end of data segment
+	                               from beginning of file */
+	unsigned long bss_end;      /* Offset of end of bss segment from beginning
+	                               of file */
+
+	/* (It is assumed that data_end through bss_end forms the bss segment.) */
+
+	unsigned long stack_size;   /* Size of stack, in bytes */
+	unsigned long reloc_start;  /* Offset of relocation records from
+	                               beginning of file */
+	unsigned long reloc_count;  /* Number of relocation records */
+	unsigned long flags;
+	unsigned long build_date;   /* When the program/library was built */
+	unsigned long filler[5];    /* Reservered, set to zero */
+};
+
+#define FLAT_FLAG_RAM    0x0001 /* load program entirely into RAM */
+#define FLAT_FLAG_GOTPIC 0x0002 /* program is PIC with GOT */
+#define FLAT_FLAG_GZIP   0x0004 /* all but the header is compressed */
+#define FLAT_FLAG_GZDATA 0x0008 /* only data/relocs are compressed (for XIP) */
+#define FLAT_FLAG_KTRACE 0x0010 /* output useful kernel trace for debugging */
 
 /*
  * While it would be nice to keep this header clean,  users of older
@@ -22,8 +61,6 @@
  *        with the format above,  except to fix bugs with old format support.
  */
 
-#include <asm/byteorder.h>
-
 #define	OLD_FLAT_VERSION			0x00000002L
 #define OLD_FLAT_RELOC_TYPE_TEXT	0
 #define OLD_FLAT_RELOC_TYPE_DATA	1
diff --git a/include/uapi/linux/flat.h b/include/uapi/linux/flat.h
deleted file mode 100644
index 27e595e44fb7..000000000000
--- a/include/uapi/linux/flat.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-/*
- * Copyright (C) 2002-2003  David McCullough <davidm@snapgear.com>
- * Copyright (C) 1998       Kenneth Albanowski <kjahds@kjahds.com>
- *                          The Silver Hammer Group, Ltd.
- *
- * This file provides the definitions and structures needed to
- * support uClinux flat-format executables.
- */
-
-#ifndef _UAPI_LINUX_FLAT_H
-#define _UAPI_LINUX_FLAT_H
-
-
-#define	FLAT_VERSION			0x00000004L
-
-#ifdef CONFIG_BINFMT_SHARED_FLAT
-#define	MAX_SHARED_LIBS			(4)
-#else
-#define	MAX_SHARED_LIBS			(1)
-#endif
-
-/*
- * To make everything easier to port and manage cross platform
- * development,  all fields are in network byte order.
- */
-
-struct flat_hdr {
-	char magic[4];
-	unsigned long rev;          /* version (as above) */
-	unsigned long entry;        /* Offset of first executable instruction
-	                               with text segment from beginning of file */
-	unsigned long data_start;   /* Offset of data segment from beginning of
-	                               file */
-	unsigned long data_end;     /* Offset of end of data segment
-	                               from beginning of file */
-	unsigned long bss_end;      /* Offset of end of bss segment from beginning
-	                               of file */
-
-	/* (It is assumed that data_end through bss_end forms the bss segment.) */
-
-	unsigned long stack_size;   /* Size of stack, in bytes */
-	unsigned long reloc_start;  /* Offset of relocation records from
-	                               beginning of file */
-	unsigned long reloc_count;  /* Number of relocation records */
-	unsigned long flags;       
-	unsigned long build_date;   /* When the program/library was built */
-	unsigned long filler[5];    /* Reservered, set to zero */
-};
-
-#define FLAT_FLAG_RAM    0x0001 /* load program entirely into RAM */
-#define FLAT_FLAG_GOTPIC 0x0002 /* program is PIC with GOT */
-#define FLAT_FLAG_GZIP   0x0004 /* all but the header is compressed */
-#define FLAT_FLAG_GZDATA 0x0008 /* only data/relocs are compressed (for XIP) */
-#define FLAT_FLAG_KTRACE 0x0010 /* output useful kernel trace for debugging */
-
-
-
-#endif /* _UAPI_LINUX_FLAT_H */
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 07/15] binfmt_flat: use __be32 for the on-disk format
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (5 preceding siblings ...)
  2019-06-10 21:20 ` [PATCH 06/15] binfmt_flat: remove the uapi <linux/flat.h> header Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-11  8:25   ` Geert Uytterhoeven
  2019-06-11  9:57   ` Vladimir Murzin
  2019-06-10 21:20 ` [PATCH 08/15] binfmt_flat: add endianess annotations Christoph Hellwig
                   ` (9 subsequent siblings)
  16 siblings, 2 replies; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

So far binfmt_flat has onl been supported on 32-bit platforms, so the
variable size of the fields didn't matter.  But the upcoming RISC-V
nommu port supports 64-bit CPUs, and we now have a conflict between
the elf2flt creation tool that always uses 32-bit fields and the kernel
that uses (unsigned) long field.  Switch to the userspace view as the
rest of the binfmt_flat format is completely architecture neutral,
and binfmt_flat isn't the right binary format for huge executables to
start with.

While we're at it also ensure these fields are using __be types as
they big endian and are byteswapped when loaded.

Signed-off-by: Christoph Hellwig <hch@lst.de>

wip
---
 include/linux/flat.h | 48 ++++++++++++++++++++++----------------------
 1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/include/linux/flat.h b/include/linux/flat.h
index 21d901ba191b..59e892d5fadb 100644
--- a/include/linux/flat.h
+++ b/include/linux/flat.h
@@ -24,26 +24,26 @@
  */
 
 struct flat_hdr {
-	char magic[4];
-	unsigned long rev;          /* version (as above) */
-	unsigned long entry;        /* Offset of first executable instruction
-	                               with text segment from beginning of file */
-	unsigned long data_start;   /* Offset of data segment from beginning of
-	                               file */
-	unsigned long data_end;     /* Offset of end of data segment
-	                               from beginning of file */
-	unsigned long bss_end;      /* Offset of end of bss segment from beginning
-	                               of file */
+	char	magic[4];
+	__be32	rev;          /* version (as above) */
+	__be32	entry;        /* Offset of first executable instruction
+				 with text segment from beginning of file */
+	__be32	data_start;   /* Offset of data segment from beginning of
+				 file */
+	__be32	data_end;     /* Offset of end of data segment from beginning
+				 of file */
+	__be32	bss_end;      /* Offset of end of bss segment from beginning
+				 of file */
 
 	/* (It is assumed that data_end through bss_end forms the bss segment.) */
 
-	unsigned long stack_size;   /* Size of stack, in bytes */
-	unsigned long reloc_start;  /* Offset of relocation records from
-	                               beginning of file */
-	unsigned long reloc_count;  /* Number of relocation records */
-	unsigned long flags;
-	unsigned long build_date;   /* When the program/library was built */
-	unsigned long filler[5];    /* Reservered, set to zero */
+	__be32	stack_size;   /* Size of stack, in bytes */
+	__be32	reloc_start;  /* Offset of relocation records from beginning of
+				 file */
+	__be32	reloc_count;  /* Number of relocation records */
+	__be32	flags;
+	__be32	build_date;   /* When the program/library was built */
+	__u32	filler[5];    /* Reservered, set to zero */
 };
 
 #define FLAT_FLAG_RAM    0x0001 /* load program entirely into RAM */
@@ -67,19 +67,19 @@ struct flat_hdr {
 #define OLD_FLAT_RELOC_TYPE_BSS		2
 
 typedef union {
-	unsigned long	value;
+	u32		value;
 	struct {
 # if defined(mc68000) && !defined(CONFIG_COLDFIRE)
-		signed long offset : 30;
-		unsigned long type : 2;
+		s32	offset : 30;
+		u32	type : 2;
 #   	define OLD_FLAT_FLAG_RAM    0x1 /* load program entirely into RAM */
 # elif defined(__BIG_ENDIAN_BITFIELD)
-		unsigned long type : 2;
-		signed long offset : 30;
+		u32	type : 2;
+		s32	offset : 30;
 #   	define OLD_FLAT_FLAG_RAM    0x1 /* load program entirely into RAM */
 # elif defined(__LITTLE_ENDIAN_BITFIELD)
-		signed long offset : 30;
-		unsigned long type : 2;
+		s32	offset : 30;
+		u32	type : 2;
 #   	define OLD_FLAT_FLAG_RAM    0x1 /* load program entirely into RAM */
 # else
 #   	error "Unknown bitfield order for flat files."
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 08/15] binfmt_flat: add endianess annotations
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (6 preceding siblings ...)
  2019-06-10 21:20 ` [PATCH 07/15] binfmt_flat: use __be32 for the on-disk format Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-11  9:58   ` Vladimir Murzin
  2019-06-10 21:20 ` [PATCH 09/15] binfmt_flat: add a ARCH_HAS_BINFMT_FLAT option Christoph Hellwig
                   ` (8 subsequent siblings)
  16 siblings, 1 reply; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

Most binfmt_flat on-disk fields are big endian.  Use the proper __be32
type where applicable.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/binfmt_flat.c | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index 6ae0f9af3fc9..6c1848dee724 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -421,7 +421,8 @@ static int load_flat_file(struct linux_binprm *bprm,
 	unsigned long textpos, datapos, realdatastart;
 	u32 text_len, data_len, bss_len, stack_len, full_data, flags;
 	unsigned long len, memp, memp_size, extra, rlim;
-	u32 __user *reloc, *rp;
+	__be32 __user *reloc;
+	u32 __user *rp;
 	struct inode *inode;
 	int i, rev, relocs;
 	loff_t fpos;
@@ -594,7 +595,7 @@ static int load_flat_file(struct linux_binprm *bprm,
 			goto err;
 		}
 
-		reloc = (u32 __user *)
+		reloc = (__be32 __user *)
 			(datapos + (ntohl(hdr->reloc_start) - text_len));
 		memp = realdatastart;
 		memp_size = len;
@@ -619,7 +620,7 @@ static int load_flat_file(struct linux_binprm *bprm,
 				MAX_SHARED_LIBS * sizeof(u32),
 				FLAT_DATA_ALIGN);
 
-		reloc = (u32 __user *)
+		reloc = (__be32 __user *)
 			(datapos + (ntohl(hdr->reloc_start) - text_len));
 		memp = textpos;
 		memp_size = len;
@@ -785,15 +786,16 @@ static int load_flat_file(struct linux_binprm *bprm,
 		u32 __maybe_unused persistent = 0;
 		for (i = 0; i < relocs; i++) {
 			u32 addr, relval;
+			__be32 tmp;
 
 			/*
 			 * Get the address of the pointer to be
 			 * relocated (of course, the address has to be
 			 * relocated first).
 			 */
-			if (get_user(relval, reloc + i))
+			if (get_user(tmp, reloc + i))
 				return -EFAULT;
-			relval = ntohl(relval);
+			relval = ntohl(tmp);
 			addr = flat_get_relocate_addr(relval);
 			rp = (u32 __user *)calc_reloc(addr, libinfo, id, 1);
 			if (rp == (u32 __user *)RELOC_FAILED) {
@@ -812,8 +814,13 @@ static int load_flat_file(struct linux_binprm *bprm,
 				 * Do the relocation.  PIC relocs in the data section are
 				 * already in target order
 				 */
-				if ((flags & FLAT_FLAG_GOTPIC) == 0)
-					addr = ntohl(addr);
+				if ((flags & FLAT_FLAG_GOTPIC) == 0) {
+					/*
+					 * Meh, the same value can have a different
+					 * byte order based on a flag..
+					 */
+					addr = ntohl((__force __be32)addr);
+				}
 				addr = calc_reloc(addr, libinfo, id, 0);
 				if (addr == RELOC_FAILED) {
 					ret = -ENOEXEC;
@@ -828,11 +835,10 @@ static int load_flat_file(struct linux_binprm *bprm,
 		}
 	} else {
 		for (i = 0; i < relocs; i++) {
-			u32 relval;
+			__be32 relval;
 			if (get_user(relval, reloc + i))
 				return -EFAULT;
-			relval = ntohl(relval);
-			old_reloc(relval);
+			old_reloc(ntohl(relval));
 		}
 	}
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 09/15] binfmt_flat: add a ARCH_HAS_BINFMT_FLAT option
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (7 preceding siblings ...)
  2019-06-10 21:20 ` [PATCH 08/15] binfmt_flat: add endianess annotations Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-11  9:59   ` Vladimir Murzin
  2019-06-10 21:20 ` [PATCH 10/15] binfmt_flat: make support for old format binaries optional Christoph Hellwig
                   ` (7 subsequent siblings)
  16 siblings, 1 reply; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

Allow architectures to opt into ARCH_HAS_BINFMT_FLAT support instead of
assuming that all nommu ports support the format.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 arch/arm/Kconfig        | 1 +
 arch/c6x/Kconfig        | 1 +
 arch/h8300/Kconfig      | 1 +
 arch/m68k/Kconfig       | 1 +
 arch/microblaze/Kconfig | 1 +
 arch/sh/Kconfig         | 1 +
 arch/xtensa/Kconfig     | 1 +
 fs/Kconfig.binfmt       | 5 ++++-
 8 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index b1b48c0bde76..695a26c68064 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -4,6 +4,7 @@ config ARM
 	default y
 	select ARCH_32BIT_OFF_T
 	select ARCH_CLOCKSOURCE_DATA
+	select ARCH_HAS_BINFMT_FLAT
 	select ARCH_HAS_DEBUG_VIRTUAL if MMU
 	select ARCH_HAS_DEVMEM_IS_ALLOWED
 	select ARCH_HAS_ELF_RANDOMIZE
diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig
index eeb0471268a0..78dfe186d708 100644
--- a/arch/c6x/Kconfig
+++ b/arch/c6x/Kconfig
@@ -7,6 +7,7 @@
 config C6X
 	def_bool y
 	select ARCH_32BIT_OFF_T
+	select ARCH_HAS_BINFMT_FLAT
 	select ARCH_HAS_SYNC_DMA_FOR_CPU
 	select ARCH_HAS_SYNC_DMA_FOR_DEVICE
 	select CLKDEV_LOOKUP
diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig
index 7457f190caaa..ec800e9d5aad 100644
--- a/arch/h8300/Kconfig
+++ b/arch/h8300/Kconfig
@@ -2,6 +2,7 @@
 config H8300
         def_bool y
 	select ARCH_32BIT_OFF_T
+	select ARCH_HAS_BINFMT_FLAT
 	select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
 	select BINFMT_FLAT_OLD_ALWAYS_RAM
 	select GENERIC_ATOMIC64
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index fd69ee5ad6ab..c0c43c624afa 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -3,6 +3,7 @@ config M68K
 	bool
 	default y
 	select ARCH_32BIT_OFF_T
+	select ARCH_HAS_BINFMT_FLAT
 	select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA
 	select ARCH_MIGHT_HAVE_PC_PARPORT if ISA
 	select ARCH_NO_COHERENT_DMA_MMAP if !MMU
diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
index f11433daab4a..d411de05b628 100644
--- a/arch/microblaze/Kconfig
+++ b/arch/microblaze/Kconfig
@@ -3,6 +3,7 @@ config MICROBLAZE
 	def_bool y
 	select ARCH_32BIT_OFF_T
 	select ARCH_NO_SWAP
+	select ARCH_HAS_BINFMT_FLAT if !MMU
 	select ARCH_HAS_DMA_COHERENT_TO_PFN if MMU
 	select ARCH_HAS_GCOV_PROFILE_ALL
 	select ARCH_HAS_SYNC_DMA_FOR_CPU
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig
index b77f512bb176..df3e6215b78c 100644
--- a/arch/sh/Kconfig
+++ b/arch/sh/Kconfig
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 config SUPERH
 	def_bool y
+	select ARCH_HAS_BINFMT_FLAT if !MMU
 	select ARCH_HAS_PTE_SPECIAL
 	select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
 	select ARCH_MIGHT_HAVE_PC_PARPORT
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index 6ec1b75eabc5..ebc135bda921 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -2,6 +2,7 @@
 config XTENSA
 	def_bool y
 	select ARCH_32BIT_OFF_T
+	select ARCH_HAS_BINFMT_FLAT if !MMU
 	select ARCH_HAS_SYNC_DMA_FOR_CPU
 	select ARCH_HAS_SYNC_DMA_FOR_DEVICE
 	select ARCH_NO_COHERENT_DMA_MMAP if !MMU
diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
index 82f7d7f234f3..286b425b30b9 100644
--- a/fs/Kconfig.binfmt
+++ b/fs/Kconfig.binfmt
@@ -91,9 +91,12 @@ config BINFMT_SCRIPT
 
 	  Most systems will not boot if you say M or N here.  If unsure, say Y.
 
+config ARCH_HAS_BINFMT_FLAT
+	bool
+
 config BINFMT_FLAT
 	bool "Kernel support for flat binaries"
-	depends on !MMU || ARM || M68K
+	depends on ARCH_HAS_BINFMT_FLAT
 	help
 	  Support uClinux FLAT format binaries.
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 10/15] binfmt_flat: make support for old format binaries optional
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (8 preceding siblings ...)
  2019-06-10 21:20 ` [PATCH 09/15] binfmt_flat: add a ARCH_HAS_BINFMT_FLAT option Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-10 21:20 ` [PATCH 11/15] binfmt_flat: provide an asm-generic/flat.h Christoph Hellwig
                   ` (6 subsequent siblings)
  16 siblings, 0 replies; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

No need to carry the extra code around, given that systems using flat
binaries are generally very resource constrained.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/Kconfig.binfmt |  7 +++++++
 fs/binfmt_flat.c  | 29 +++++++++++++++++++++--------
 2 files changed, 28 insertions(+), 8 deletions(-)

diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
index 286b425b30b9..62dc4f577ba1 100644
--- a/fs/Kconfig.binfmt
+++ b/fs/Kconfig.binfmt
@@ -106,6 +106,13 @@ config BINFMT_FLAT_ARGVP_ENVP_ON_STACK
 config BINFMT_FLAT_OLD_ALWAYS_RAM
 	bool
 
+config BINFMT_FLAT_OLD
+	bool "Enable support for very old legacy flat binaries"
+	depends on BINFMT_FLAT
+	help
+	  Support decade old uClinux FLAT format binaries.  Unless you know
+	  you have some of those say N here.
+
 config BINFMT_ZFLAT
 	bool "Enable ZFLAT support"
 	depends on BINFMT_FLAT
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index 6c1848dee724..ed7d969593d2 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -374,6 +374,7 @@ calc_reloc(unsigned long r, struct lib_info *p, int curid, int internalp)
 
 /****************************************************************************/
 
+#ifdef CONFIG_BINFMT_FLAT_OLD
 static void old_reloc(unsigned long rl)
 {
 	static const char *segment[] = { "TEXT", "DATA", "BSS", "*UNKNOWN*" };
@@ -411,6 +412,7 @@ static void old_reloc(unsigned long rl)
 
 	pr_debug("Relocation became %lx\n", val);
 }
+#endif /* CONFIG_BINFMT_FLAT_OLD */
 
 /****************************************************************************/
 
@@ -461,6 +463,7 @@ static int load_flat_file(struct linux_binprm *bprm,
 	if (flags & FLAT_FLAG_KTRACE)
 		pr_info("Loading file: %s\n", bprm->filename);
 
+#ifdef CONFIG_BINFMT_FLAT_OLD
 	if (rev != FLAT_VERSION && rev != OLD_FLAT_VERSION) {
 		pr_err("bad flat file version 0x%x (supported 0x%lx and 0x%lx)\n",
 		       rev, FLAT_VERSION, OLD_FLAT_VERSION);
@@ -476,6 +479,22 @@ static int load_flat_file(struct linux_binprm *bprm,
 		goto err;
 	}
 
+	/*
+	 * fix up the flags for the older format,  there were all kinds
+	 * of endian hacks,  this only works for the simple cases
+	 */
+	if (IS_ENABLED(CONFIG_BINFMT_FLAT_OLD_ALWAYS_RAM) &&
+	    rev == OLD_FLAT_VERSION)
+		flags = FLAT_FLAG_RAM;
+#else /* CONFIG_BINFMT_FLAT_OLD */
+	if (rev != FLAT_VERSION) {
+		pr_err("bad flat file version 0x%x (supported 0x%lx)\n",
+		       rev, FLAT_VERSION);
+		ret = -ENOEXEC;
+		goto err;
+	}
+#endif /* !CONFIG_BINFMT_FLAT_OLD */
+
 	/*
 	 * Make sure the header params are sane.
 	 * 28 bits (256 MB) is way more than reasonable in this case.
@@ -487,14 +506,6 @@ static int load_flat_file(struct linux_binprm *bprm,
 		goto err;
 	}
 
-	/*
-	 * fix up the flags for the older format,  there were all kinds
-	 * of endian hacks,  this only works for the simple cases
-	 */
-	if (IS_ENABLED(CONFIG_BINFMT_FLAT_OLD_ALWAYS_RAM) &&
-	    rev == OLD_FLAT_VERSION)
-		flags = FLAT_FLAG_RAM;
-
 #ifndef CONFIG_BINFMT_ZFLAT
 	if (flags & (FLAT_FLAG_GZIP|FLAT_FLAG_GZDATA)) {
 		pr_err("Support for ZFLAT executables is not enabled.\n");
@@ -833,6 +844,7 @@ static int load_flat_file(struct linux_binprm *bprm,
 					goto err;
 			}
 		}
+#ifdef CONFIG_BINFMT_FLAT_OLD
 	} else {
 		for (i = 0; i < relocs; i++) {
 			__be32 relval;
@@ -840,6 +852,7 @@ static int load_flat_file(struct linux_binprm *bprm,
 				return -EFAULT;
 			old_reloc(ntohl(relval));
 		}
+#endif /* CONFIG_BINFMT_FLAT_OLD */
 	}
 
 	flush_icache_range(start_code, end_code);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 11/15] binfmt_flat: provide an asm-generic/flat.h
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (9 preceding siblings ...)
  2019-06-10 21:20 ` [PATCH 10/15] binfmt_flat: make support for old format binaries optional Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-11 10:01   ` Vladimir Murzin
  2019-06-10 21:20 ` [PATCH 12/15] binfmt_flat: remove the persistent argument from flat_get_addr_from_rp Christoph Hellwig
                   ` (5 subsequent siblings)
  16 siblings, 1 reply; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

This file implements the flat get/put reloc helpers for architectures
that do not need to overload the relocs by simply using get_user/put_user.

Note that many nommu architectures currently use {get,put}_unaligned, which
looks a little bogus and should probably later be switched over to this
version as well.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 arch/arm/include/asm/Kbuild                   |  1 +
 arch/m68k/include/asm/flat.h                  | 21 +------------------
 .../asm => include/asm-generic}/flat.h        | 12 ++++-------
 3 files changed, 6 insertions(+), 28 deletions(-)
 rename {arch/arm/include/asm => include/asm-generic}/flat.h (73%)

diff --git a/arch/arm/include/asm/Kbuild b/arch/arm/include/asm/Kbuild
index a8f149ab45b8..6b2dc15b6dff 100644
--- a/arch/arm/include/asm/Kbuild
+++ b/arch/arm/include/asm/Kbuild
@@ -5,6 +5,7 @@ generic-y += early_ioremap.h
 generic-y += emergency-restart.h
 generic-y += exec.h
 generic-y += extable.h
+generic-y += flat.h
 generic-y += irq_regs.h
 generic-y += kdebug.h
 generic-y += local.h
diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h
index d7102fcd43eb..46379e08cdd6 100644
--- a/arch/m68k/include/asm/flat.h
+++ b/arch/m68k/include/asm/flat.h
@@ -6,26 +6,7 @@
 #ifndef __M68KNOMMU_FLAT_H__
 #define __M68KNOMMU_FLAT_H__
 
-#include <linux/uaccess.h>
-
-static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
-					u32 *addr, u32 *persistent)
-{
-#ifdef CONFIG_CPU_HAS_NO_UNALIGNED
-	return copy_from_user(addr, rp, 4) ? -EFAULT : 0;
-#else
-	return get_user(*addr, rp);
-#endif
-}
-
-static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
-{
-#ifdef CONFIG_CPU_HAS_NO_UNALIGNED
-	return copy_to_user(rp, &addr, 4) ? -EFAULT : 0;
-#else
-	return put_user(addr, rp);
-#endif
-}
+#include <asm-generic/flat.h>
 
 #define FLAT_PLAT_INIT(regs) \
 	do { \
diff --git a/arch/arm/include/asm/flat.h b/include/asm-generic/flat.h
similarity index 73%
rename from arch/arm/include/asm/flat.h
rename to include/asm-generic/flat.h
index bbc27901446f..fcd2b45c0735 100644
--- a/arch/arm/include/asm/flat.h
+++ b/include/asm-generic/flat.h
@@ -1,15 +1,11 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/*
- * arch/arm/include/asm/flat.h -- uClinux flat-format executables
- */
-
-#ifndef __ARM_FLAT_H__
-#define __ARM_FLAT_H__
+#ifndef _ASM_GENERIC_FLAT_H
+#define _ASM_GENERIC_FLAT_H
 
 #include <linux/uaccess.h>
 
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
-					u32 *addr, u32 *persistent)
+		u32 *addr, u32 *persistent)
 {
 #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
 	return copy_from_user(addr, rp, 4) ? -EFAULT : 0;
@@ -27,4 +23,4 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
 #endif
 }
 
-#endif /* __ARM_FLAT_H__ */
+#endif /* _ASM_GENERIC_FLAT_H */
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 12/15] binfmt_flat: remove the persistent argument from flat_get_addr_from_rp
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (10 preceding siblings ...)
  2019-06-10 21:20 ` [PATCH 11/15] binfmt_flat: provide an asm-generic/flat.h Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-10 21:20 ` [PATCH 13/15] binfmt_flat: move the MAX_SHARED_LIBS definition to binfmt_flat.c Christoph Hellwig
                   ` (4 subsequent siblings)
  16 siblings, 0 replies; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

The argument is never used.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 arch/c6x/include/asm/flat.h        | 2 +-
 arch/h8300/include/asm/flat.h      | 2 +-
 arch/microblaze/include/asm/flat.h | 2 +-
 arch/sh/include/asm/flat.h         | 2 +-
 arch/xtensa/include/asm/flat.h     | 2 +-
 fs/binfmt_flat.c                   | 4 +---
 include/asm-generic/flat.h         | 2 +-
 7 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/arch/c6x/include/asm/flat.h b/arch/c6x/include/asm/flat.h
index 2d57a9204d21..9e6544b51386 100644
--- a/arch/c6x/include/asm/flat.h
+++ b/arch/c6x/include/asm/flat.h
@@ -5,7 +5,7 @@
 #include <asm/unaligned.h>
 
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
-					u32 *addr, u32 *persistent)
+					u32 *addr)
 {
 	*addr = get_unaligned((__force u32 *)rp);
 	return 0;
diff --git a/arch/h8300/include/asm/flat.h b/arch/h8300/include/asm/flat.h
index 4683146f0e9e..78070f924177 100644
--- a/arch/h8300/include/asm/flat.h
+++ b/arch/h8300/include/asm/flat.h
@@ -17,7 +17,7 @@
 
 #define	flat_get_relocate_addr(rel)		(rel & ~0x00000001)
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
-					u32 *addr, u32 *persistent)
+					u32 *addr)
 {
 	u32 val = get_unaligned((__force u32 *)rp);
 	if (!(flags & FLAT_FLAG_GOTPIC))
diff --git a/arch/microblaze/include/asm/flat.h b/arch/microblaze/include/asm/flat.h
index 9e3d8e01d294..1ab86770eaee 100644
--- a/arch/microblaze/include/asm/flat.h
+++ b/arch/microblaze/include/asm/flat.h
@@ -28,7 +28,7 @@
  */
 
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
-					u32 *addr, u32 *persistent)
+					u32 *addr)
 {
 	u32 *p = (__force u32 *)rp;
 
diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h
index 1002343dd84a..fee4f25555cb 100644
--- a/arch/sh/include/asm/flat.h
+++ b/arch/sh/include/asm/flat.h
@@ -12,7 +12,7 @@
 #include <asm/unaligned.h>
 
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
-					u32 *addr, u32 *persistent)
+					u32 *addr)
 {
 	*addr = get_unaligned((__force u32 *)rp);
 	return 0;
diff --git a/arch/xtensa/include/asm/flat.h b/arch/xtensa/include/asm/flat.h
index 3d357371b28b..ed5870c779f9 100644
--- a/arch/xtensa/include/asm/flat.h
+++ b/arch/xtensa/include/asm/flat.h
@@ -5,7 +5,7 @@
 #include <asm/unaligned.h>
 
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
-					u32 *addr, u32 *persistent)
+					u32 *addr)
 {
 	*addr = get_unaligned((__force u32 *)rp);
 	return 0;
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index ed7d969593d2..114ea225c5a5 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -794,7 +794,6 @@ static int load_flat_file(struct linux_binprm *bprm,
 	 * __start to address 4 so that is okay).
 	 */
 	if (rev > OLD_FLAT_VERSION) {
-		u32 __maybe_unused persistent = 0;
 		for (i = 0; i < relocs; i++) {
 			u32 addr, relval;
 			__be32 tmp;
@@ -815,8 +814,7 @@ static int load_flat_file(struct linux_binprm *bprm,
 			}
 
 			/* Get the pointer's value.  */
-			ret = flat_get_addr_from_rp(rp, relval, flags,
-							&addr, &persistent);
+			ret = flat_get_addr_from_rp(rp, relval, flags, &addr);
 			if (unlikely(ret))
 				goto err;
 
diff --git a/include/asm-generic/flat.h b/include/asm-generic/flat.h
index fcd2b45c0735..1928a3596938 100644
--- a/include/asm-generic/flat.h
+++ b/include/asm-generic/flat.h
@@ -5,7 +5,7 @@
 #include <linux/uaccess.h>
 
 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
-		u32 *addr, u32 *persistent)
+		u32 *addr)
 {
 #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
 	return copy_from_user(addr, rp, 4) ? -EFAULT : 0;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 13/15] binfmt_flat: move the MAX_SHARED_LIBS definition to binfmt_flat.c
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (11 preceding siblings ...)
  2019-06-10 21:20 ` [PATCH 12/15] binfmt_flat: remove the persistent argument from flat_get_addr_from_rp Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-10 21:20 ` [PATCH 14/15] binfmt_flat: don't offset the data start Christoph Hellwig
                   ` (3 subsequent siblings)
  16 siblings, 0 replies; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

MAX_SHARED_LIBS is an implementation detail of the kernel loader,
and should be kept away from the file format definition.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/binfmt_flat.c     | 6 ++++++
 include/linux/flat.h | 6 ------
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index 114ea225c5a5..2c7f32d5435f 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -68,6 +68,12 @@
 #define RELOC_FAILED 0xff00ff01		/* Relocation incorrect somewhere */
 #define UNLOADED_LIB 0x7ff000ff		/* Placeholder for unused library */
 
+#ifdef CONFIG_BINFMT_SHARED_FLAT
+#define	MAX_SHARED_LIBS			(4)
+#else
+#define	MAX_SHARED_LIBS			(1)
+#endif
+
 struct lib_info {
 	struct {
 		unsigned long start_code;		/* Start of text segment */
diff --git a/include/linux/flat.h b/include/linux/flat.h
index 59e892d5fadb..a2232f1bd41b 100644
--- a/include/linux/flat.h
+++ b/include/linux/flat.h
@@ -12,12 +12,6 @@
 
 #define	FLAT_VERSION			0x00000004L
 
-#ifdef CONFIG_BINFMT_SHARED_FLAT
-#define	MAX_SHARED_LIBS			(4)
-#else
-#define	MAX_SHARED_LIBS			(1)
-#endif
-
 /*
  * To make everything easier to port and manage cross platform
  * development,  all fields are in network byte order.
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 14/15] binfmt_flat: don't offset the data start
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (12 preceding siblings ...)
  2019-06-10 21:20 ` [PATCH 13/15] binfmt_flat: move the MAX_SHARED_LIBS definition to binfmt_flat.c Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-10 21:20 ` [PATCH 15/15] riscv: add binfmt_flat support Christoph Hellwig
                   ` (2 subsequent siblings)
  16 siblings, 0 replies; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

Ever since the initial commit of the binfmt_flat shared library
support back in the bitkeeper days we've offset the actual in-memory
.data start by one field per possible shared library, or 1 in case
shared library support isn't enabled.  I can't find anything in the
loader that actually makes use of it, nor was it present before
shared library support it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/binfmt_flat.c | 20 ++++++++------------
 1 file changed, 8 insertions(+), 12 deletions(-)

diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index 2c7f32d5435f..e1ccc9f14150 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -572,7 +572,7 @@ static int load_flat_file(struct linux_binprm *bprm,
 			goto err;
 		}
 
-		len = data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long);
+		len = data_len + extra;
 		len = PAGE_ALIGN(len);
 		realdatastart = vm_mmap(NULL, 0, len,
 			PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0);
@@ -586,9 +586,7 @@ static int load_flat_file(struct linux_binprm *bprm,
 			vm_munmap(textpos, text_len);
 			goto err;
 		}
-		datapos = ALIGN(realdatastart +
-				MAX_SHARED_LIBS * sizeof(unsigned long),
-				FLAT_DATA_ALIGN);
+		datapos = ALIGN(realdatastart, FLAT_DATA_ALIGN);
 
 		pr_debug("Allocated data+bss+stack (%u bytes): %lx\n",
 			 data_len + bss_len + stack_len, datapos);
@@ -618,7 +616,7 @@ static int load_flat_file(struct linux_binprm *bprm,
 		memp_size = len;
 	} else {
 
-		len = text_len + data_len + extra + MAX_SHARED_LIBS * sizeof(u32);
+		len = text_len + data_len + extra;
 		len = PAGE_ALIGN(len);
 		textpos = vm_mmap(NULL, 0, len,
 			PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0);
@@ -633,9 +631,7 @@ static int load_flat_file(struct linux_binprm *bprm,
 		}
 
 		realdatastart = textpos + ntohl(hdr->data_start);
-		datapos = ALIGN(realdatastart +
-				MAX_SHARED_LIBS * sizeof(u32),
-				FLAT_DATA_ALIGN);
+		datapos = ALIGN(realdatastart, FLAT_DATA_ALIGN);
 
 		reloc = (__be32 __user *)
 			(datapos + (ntohl(hdr->reloc_start) - text_len));
@@ -652,8 +648,9 @@ static int load_flat_file(struct linux_binprm *bprm,
 					 (text_len + full_data
 						  - sizeof(struct flat_hdr)),
 					 0);
-			memmove((void *) datapos, (void *) realdatastart,
-					full_data);
+			if (datapos != realdatastart)
+				memmove((void *)datapos, (void *)realdatastart,
+						full_data);
 #else
 			/*
 			 * This is used on MMU systems mainly for testing.
@@ -709,8 +706,7 @@ static int load_flat_file(struct linux_binprm *bprm,
 		if (IS_ERR_VALUE(result)) {
 			ret = result;
 			pr_err("Unable to read code+data+bss, errno %d\n", ret);
-			vm_munmap(textpos, text_len + data_len + extra +
-				MAX_SHARED_LIBS * sizeof(u32));
+			vm_munmap(textpos, text_len + data_len + extra);
 			goto err;
 		}
 	}
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 15/15] riscv: add binfmt_flat support
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (13 preceding siblings ...)
  2019-06-10 21:20 ` [PATCH 14/15] binfmt_flat: don't offset the data start Christoph Hellwig
@ 2019-06-10 21:20 ` Christoph Hellwig
  2019-06-11  8:16   ` Vladimir Murzin
  2019-06-11  6:51 ` binfmt_flat cleanups and RISC-V support Greg Ungerer
  2019-06-11  8:05 ` Vladimir Murzin
  16 siblings, 1 reply; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-10 21:20 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

Use the generic support with arguments are on the stack.  Same as arm
and m68k.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 arch/riscv/Kconfig            | 2 ++
 arch/riscv/include/asm/Kbuild | 1 +
 2 files changed, 3 insertions(+)

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 0c4b12205632..2e3b60cdeef4 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -17,7 +17,9 @@ config RISCV
 	select OF
 	select OF_EARLY_FLATTREE
 	select OF_IRQ
+	select ARCH_HAS_BINFMT_FLAT
 	select ARCH_WANT_FRAME_POINTERS
+	select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
 	select CLONE_BACKWARDS
 	select COMMON_CLK
 	select GENERIC_CLOCKEVENTS
diff --git a/arch/riscv/include/asm/Kbuild b/arch/riscv/include/asm/Kbuild
index 5ee646619cc3..1efaeddf1e4b 100644
--- a/arch/riscv/include/asm/Kbuild
+++ b/arch/riscv/include/asm/Kbuild
@@ -5,6 +5,7 @@ generic-y += compat.h
 generic-y += device.h
 generic-y += div64.h
 generic-y += extable.h
+generic-y += flat.h
 generic-y += dma.h
 generic-y += dma-contiguous.h
 generic-y += dma-mapping.h
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 38+ messages in thread

* Re: [PATCH 04/15] binfmt_flat: remove flat_old_ram_flag
  2019-06-10 21:20 ` [PATCH 04/15] binfmt_flat: remove flat_old_ram_flag Christoph Hellwig
@ 2019-06-11  6:04   ` Greg Ungerer
  2019-06-11  7:36     ` Christoph Hellwig
  2019-06-11  9:47   ` Vladimir Murzin
  1 sibling, 1 reply; 38+ messages in thread
From: Greg Ungerer @ 2019-06-11  6:04 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

Hi Christoph,

On 11/6/19 7:20 am, Christoph Hellwig wrote:
> Instead add a Kconfig variable that only h8300 selects.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>   arch/arm/include/asm/flat.h        | 1 -
>   arch/c6x/include/asm/flat.h        | 1 -
>   arch/h8300/Kconfig                 | 1 +
>   arch/h8300/include/asm/flat.h      | 1 -
>   arch/m68k/include/asm/flat.h       | 1 -
>   arch/microblaze/include/asm/flat.h | 1 -
>   arch/sh/include/asm/flat.h         | 1 -
>   arch/xtensa/include/asm/flat.h     | 1 -
>   fs/Kconfig.binfmt                  | 3 +++
>   fs/binfmt_flat.c                   | 3 ++-
>   10 files changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/arch/arm/include/asm/flat.h b/arch/arm/include/asm/flat.h
> index a185fe023b60..acf162111ee2 100644
> --- a/arch/arm/include/asm/flat.h
> +++ b/arch/arm/include/asm/flat.h
> @@ -9,7 +9,6 @@
>   #include <linux/uaccess.h>
>   
>   #define	flat_argvp_envp_on_stack()		1
> -#define	flat_old_ram_flag(flags)		(flags)
>   
>   static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>   					u32 *addr, u32 *persistent)
> diff --git a/arch/c6x/include/asm/flat.h b/arch/c6x/include/asm/flat.h
> index c4d703b454c6..353e4d06e8c0 100644
> --- a/arch/c6x/include/asm/flat.h
> +++ b/arch/c6x/include/asm/flat.h
> @@ -5,7 +5,6 @@
>   #include <asm/unaligned.h>
>   
>   #define flat_argvp_envp_on_stack()			0
> -#define flat_old_ram_flag(flags)			(flags)
>   static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>   					u32 *addr, u32 *persistent)
>   {
> diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig
> index ecfc4b4b6373..d30e8727b02d 100644
> --- a/arch/h8300/Kconfig
> +++ b/arch/h8300/Kconfig
> @@ -2,6 +2,7 @@
>   config H8300
>           def_bool y
>   	select ARCH_32BIT_OFF_T
> +	select BINFMT_FLAT_OLD_ALWAYS_RAM
>   	select GENERIC_ATOMIC64
>   	select HAVE_UID16
>   	select VIRT_TO_BUS
> diff --git a/arch/h8300/include/asm/flat.h b/arch/h8300/include/asm/flat.h
> index 7ef7eefded3d..14cc928d5478 100644
> --- a/arch/h8300/include/asm/flat.h
> +++ b/arch/h8300/include/asm/flat.h
> @@ -9,7 +9,6 @@
>   #include <asm/unaligned.h>
>   
>   #define	flat_argvp_envp_on_stack()		1
> -#define	flat_old_ram_flag(flags)		1
>   
>   /*
>    * on the H8 a couple of the relocations have an instruction in the
> diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h
> index 217fa89c8e34..7b1fb5c2809e 100644
> --- a/arch/m68k/include/asm/flat.h
> +++ b/arch/m68k/include/asm/flat.h
> @@ -9,7 +9,6 @@
>   #include <linux/uaccess.h>
>   
>   #define	flat_argvp_envp_on_stack()		1
> -#define	flat_old_ram_flag(flags)		(flags)
>   static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>   					u32 *addr, u32 *persistent)
>   {
> diff --git a/arch/microblaze/include/asm/flat.h b/arch/microblaze/include/asm/flat.h
> index 846084fa7f04..1cd8d7f4cf12 100644
> --- a/arch/microblaze/include/asm/flat.h
> +++ b/arch/microblaze/include/asm/flat.h
> @@ -14,7 +14,6 @@
>   #include <asm/unaligned.h>
>   
>   #define	flat_argvp_envp_on_stack()	0
> -#define	flat_old_ram_flag(flags)	(flags)
>   
>   /*
>    * Microblaze works a little differently from other arches, because
> diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h
> index 0d520b4cc5ea..015678d7b771 100644
> --- a/arch/sh/include/asm/flat.h
> +++ b/arch/sh/include/asm/flat.h
> @@ -12,7 +12,6 @@
>   #include <asm/unaligned.h>
>   
>   #define	flat_argvp_envp_on_stack()		0
> -#define	flat_old_ram_flag(flags)		(flags)
>   static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>   					u32 *addr, u32 *persistent)
>   {
> diff --git a/arch/xtensa/include/asm/flat.h b/arch/xtensa/include/asm/flat.h
> index a1d88aa3ef8a..b215c1e66958 100644
> --- a/arch/xtensa/include/asm/flat.h
> +++ b/arch/xtensa/include/asm/flat.h
> @@ -5,7 +5,6 @@
>   #include <asm/unaligned.h>
>   
>   #define flat_argvp_envp_on_stack()			0
> -#define flat_old_ram_flag(flags)			(flags)
>   static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>   					u32 *addr, u32 *persistent)
>   {
> diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
> index f87ddd1b6d72..5658e12ad944 100644
> --- a/fs/Kconfig.binfmt
> +++ b/fs/Kconfig.binfmt
> @@ -97,6 +97,9 @@ config BINFMT_FLAT
>   	help
>   	  Support uClinux FLAT format binaries.
>   
> +config BINFMT_FLAT_OLD_ALWAYS_RAM
> +	bool
> +
>   config BINFMT_ZFLAT
>   	bool "Enable ZFLAT support"
>   	depends on BINFMT_FLAT
> diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
> index c0e4535dc1ec..18d82fd5f57c 100644
> --- a/fs/binfmt_flat.c
> +++ b/fs/binfmt_flat.c
> @@ -488,7 +488,8 @@ static int load_flat_file(struct linux_binprm *bprm,
>   	 * fix up the flags for the older format,  there were all kinds
>   	 * of endian hacks,  this only works for the simple cases
>   	 */
> -	if (rev == OLD_FLAT_VERSION && flat_old_ram_flag(flags))
> +	if (IS_ENABLED(CONFIG_BINFMT_FLAT_OLD_ALWAYS_RAM) &&
> +	    rev == OLD_FLAT_VERSION)

The flags are from the binary file header here, so this is going to lose
that check for most platforms (except h8300 where it would always have
been true).

Regards
Greg


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: binfmt_flat cleanups and RISC-V support
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (14 preceding siblings ...)
  2019-06-10 21:20 ` [PATCH 15/15] riscv: add binfmt_flat support Christoph Hellwig
@ 2019-06-11  6:51 ` Greg Ungerer
  2019-06-11  7:38   ` Christoph Hellwig
  2019-06-11  8:05 ` Vladimir Murzin
  16 siblings, 1 reply; 38+ messages in thread
From: Greg Ungerer @ 2019-06-11  6:51 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel

Hi Christoph,

On 11/6/19 7:20 am, Christoph Hellwig wrote:
> below is a larger stash of cleanups for the binfmt_misc code,
> preparing for the last patch that now trivially adds RISC-V
> support, which will be used for the RISC-V nommu series I am
> about to post.

Whole series looks pretty good. Just the one comment I made.

I normally take these through the m68knommu git tree,
if you have no problem with that I'll push it in there.
It will hit linux-next from there.

Thanks
Greg



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 04/15] binfmt_flat: remove flat_old_ram_flag
  2019-06-11  6:04   ` Greg Ungerer
@ 2019-06-11  7:36     ` Christoph Hellwig
  2019-06-11 13:07       ` Greg Ungerer
  0 siblings, 1 reply; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-11  7:36 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Christoph Hellwig, Michal Simek, linux-arm-kernel, linux-c6x-dev,
	uclinux-h8-devel, linux-m68k, linux-riscv, linux-sh,
	linux-xtensa, linux-kernel

On Tue, Jun 11, 2019 at 04:04:39PM +1000, Greg Ungerer wrote:
>> index c0e4535dc1ec..18d82fd5f57c 100644
>> --- a/fs/binfmt_flat.c
>> +++ b/fs/binfmt_flat.c
>> @@ -488,7 +488,8 @@ static int load_flat_file(struct linux_binprm *bprm,
>>   	 * fix up the flags for the older format,  there were all kinds
>>   	 * of endian hacks,  this only works for the simple cases
>>   	 */
>> -	if (rev == OLD_FLAT_VERSION && flat_old_ram_flag(flags))
>> +	if (IS_ENABLED(CONFIG_BINFMT_FLAT_OLD_ALWAYS_RAM) &&
>> +	    rev == OLD_FLAT_VERSION)
>
> The flags are from the binary file header here, so this is going to lose
> that check for most platforms (except h8300 where it would always have
> been true).

Indeed.  The old code is:

	if (rev == OLD_FLAT_VERSION && flat_old_ram_flag(flags))
		flags = FLAT_FLAG_RAM;

which for !h8300 evaluates to:

	if (rev == OLD_FLAT_VERSION && flags)
		flags = FLAT_FLAG_RAM;

so basically if any flag was set it was turned into FLAT_FLAG_RAM.
Was that really intentional?  I guess even if it wasn't the is no
point in changing this historic behavior now.

So I guess what we could do it something like:

	if (rev == OLD_FLAT_VERSION &&
	    (flags || IS_ENABLED(CONFIG_BINFMT_FLAT_OLD_ALWAYS_RAM)))
		flags = FLAT_FLAG_RAM;

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: binfmt_flat cleanups and RISC-V support
  2019-06-11  6:51 ` binfmt_flat cleanups and RISC-V support Greg Ungerer
@ 2019-06-11  7:38   ` Christoph Hellwig
  2019-06-11 13:02     ` Greg Ungerer
  0 siblings, 1 reply; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-11  7:38 UTC (permalink / raw)
  To: Greg Ungerer
  Cc: Christoph Hellwig, Michal Simek, linux-arm-kernel, linux-c6x-dev,
	uclinux-h8-devel, linux-m68k, linux-riscv, linux-sh,
	linux-xtensa, linux-kernel

On Tue, Jun 11, 2019 at 04:51:02PM +1000, Greg Ungerer wrote:
> Hi Christoph,
>
> On 11/6/19 7:20 am, Christoph Hellwig wrote:
>> below is a larger stash of cleanups for the binfmt_misc code,
>> preparing for the last patch that now trivially adds RISC-V
>> support, which will be used for the RISC-V nommu series I am
>> about to post.
>
> Whole series looks pretty good. Just the one comment I made.
>
> I normally take these through the m68knommu git tree,
> if you have no problem with that I'll push it in there.
> It will hit linux-next from there.

Yes, that's fine.  We'll need it to bring up riscv nommu support,
but there is no actual dependency on the patches for it to compile,
just for it to actually be useful.

Btw, it seems like the uclinux-dev list is dead, is there a replacement
for it?

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: binfmt_flat cleanups and RISC-V support
  2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
                   ` (15 preceding siblings ...)
  2019-06-11  6:51 ` binfmt_flat cleanups and RISC-V support Greg Ungerer
@ 2019-06-11  8:05 ` Vladimir Murzin
  2019-06-11  8:11   ` Christoph Hellwig
  16 siblings, 1 reply; 38+ messages in thread
From: Vladimir Murzin @ 2019-06-11  8:05 UTC (permalink / raw)
  To: Christoph Hellwig, Greg Ungerer
  Cc: uclinux-h8-devel, linux-xtensa, Michal Simek, linux-c6x-dev,
	linux-sh, linux-kernel, linux-m68k, linux-riscv,
	linux-arm-kernel

Hi Christoph,

On 6/10/19 10:20 PM, Christoph Hellwig wrote:
> Hi Greg,
> 
> below is a larger stash of cleanups for the binfmt_misc code,
> preparing for the last patch that now trivially adds RISC-V
> support, which will be used for the RISC-V nommu series I am
> about to post.


I'm wondering if you have a branch with these changes so I can give
it a try on ARM NOMMU platforms?

Cheers
Vladimir

> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> 


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: binfmt_flat cleanups and RISC-V support
  2019-06-11  8:05 ` Vladimir Murzin
@ 2019-06-11  8:11   ` Christoph Hellwig
  2019-06-11 10:08     ` Vladimir Murzin
  0 siblings, 1 reply; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-11  8:11 UTC (permalink / raw)
  To: Vladimir Murzin
  Cc: Christoph Hellwig, Greg Ungerer, uclinux-h8-devel, linux-xtensa,
	Michal Simek, linux-c6x-dev, linux-sh, linux-kernel, linux-m68k,
	linux-riscv, linux-arm-kernel

On Tue, Jun 11, 2019 at 09:05:45AM +0100, Vladimir Murzin wrote:
> I'm wondering if you have a branch with these changes so I can give
> it a try on ARM NOMMU platforms?


    git://git.infradead.org/users/hch/riscv.git riscv-flat

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 15/15] riscv: add binfmt_flat support
  2019-06-10 21:20 ` [PATCH 15/15] riscv: add binfmt_flat support Christoph Hellwig
@ 2019-06-11  8:16   ` Vladimir Murzin
  2019-06-11  9:20     ` Christoph Hellwig
  0 siblings, 1 reply; 38+ messages in thread
From: Vladimir Murzin @ 2019-06-11  8:16 UTC (permalink / raw)
  To: Christoph Hellwig, Greg Ungerer
  Cc: uclinux-h8-devel, linux-xtensa, Michal Simek, linux-c6x-dev,
	linux-sh, linux-kernel, linux-m68k, linux-riscv,
	linux-arm-kernel

On 6/10/19 10:20 PM, Christoph Hellwig wrote:
> Use the generic support with arguments are on the stack.  Same as arm
> and m68k.

Out of curiosity, what is reason for keeping arguments on the stack?

ARM port of uClibc has following comment around manipulating of argv/argc:

        /*
         * uClinux/arm stacks look a little different from normal
         * MMU-full Linux/arm stacks (for no good reason)
         */

So I though it is kind of legacy.

Thanks
Vladimir

> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  arch/riscv/Kconfig            | 2 ++
>  arch/riscv/include/asm/Kbuild | 1 +
>  2 files changed, 3 insertions(+)
> 
> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> index 0c4b12205632..2e3b60cdeef4 100644
> --- a/arch/riscv/Kconfig
> +++ b/arch/riscv/Kconfig
> @@ -17,7 +17,9 @@ config RISCV
>  	select OF
>  	select OF_EARLY_FLATTREE
>  	select OF_IRQ
> +	select ARCH_HAS_BINFMT_FLAT
>  	select ARCH_WANT_FRAME_POINTERS
> +	select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
>  	select CLONE_BACKWARDS
>  	select COMMON_CLK
>  	select GENERIC_CLOCKEVENTS
> diff --git a/arch/riscv/include/asm/Kbuild b/arch/riscv/include/asm/Kbuild
> index 5ee646619cc3..1efaeddf1e4b 100644
> --- a/arch/riscv/include/asm/Kbuild
> +++ b/arch/riscv/include/asm/Kbuild
> @@ -5,6 +5,7 @@ generic-y += compat.h
>  generic-y += device.h
>  generic-y += div64.h
>  generic-y += extable.h
> +generic-y += flat.h
>  generic-y += dma.h
>  generic-y += dma-contiguous.h
>  generic-y += dma-mapping.h
> 


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 07/15] binfmt_flat: use __be32 for the on-disk format
  2019-06-10 21:20 ` [PATCH 07/15] binfmt_flat: use __be32 for the on-disk format Christoph Hellwig
@ 2019-06-11  8:25   ` Geert Uytterhoeven
  2019-06-11  9:57   ` Vladimir Murzin
  1 sibling, 0 replies; 38+ messages in thread
From: Geert Uytterhoeven @ 2019-06-11  8:25 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Greg Ungerer, Michal Simek, Linux ARM, linux-c6x-dev,
	moderated list:H8/300 ARCHITECTURE, linux-m68k, linux-riscv,
	Linux-sh list, linux-xtensa, Linux Kernel Mailing List

Hi Christoph,

On Mon, Jun 10, 2019 at 11:21 PM Christoph Hellwig <hch@lst.de> wrote:
> So far binfmt_flat has onl been supported on 32-bit platforms, so the
> variable size of the fields didn't matter.  But the upcoming RISC-V
> nommu port supports 64-bit CPUs, and we now have a conflict between
> the elf2flt creation tool that always uses 32-bit fields and the kernel
> that uses (unsigned) long field.  Switch to the userspace view as the
> rest of the binfmt_flat format is completely architecture neutral,
> and binfmt_flat isn't the right binary format for huge executables to
> start with.
>
> While we're at it also ensure these fields are using __be types as
> they big endian and are byteswapped when loaded.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>

> --- a/include/linux/flat.h
> +++ b/include/linux/flat.h

> @@ -67,19 +67,19 @@ struct flat_hdr {
>  #define OLD_FLAT_RELOC_TYPE_BSS                2
>
>  typedef union {
> -       unsigned long   value;
> +       u32             value;
>         struct {
>  # if defined(mc68000) && !defined(CONFIG_COLDFIRE)
> -               signed long offset : 30;
> -               unsigned long type : 2;
> +               s32     offset : 30;
> +               u32     type : 2;
>  #      define OLD_FLAT_FLAG_RAM    0x1 /* load program entirely into RAM */
>  # elif defined(__BIG_ENDIAN_BITFIELD)
> -               unsigned long type : 2;
> -               signed long offset : 30;
> +               u32     type : 2;
> +               s32     offset : 30;
>  #      define OLD_FLAT_FLAG_RAM    0x1 /* load program entirely into RAM */
>  # elif defined(__LITTLE_ENDIAN_BITFIELD)
> -               signed long offset : 30;
> -               unsigned long type : 2;
> +               s32     offset : 30;
> +               u32     type : 2;
>  #      define OLD_FLAT_FLAG_RAM    0x1 /* load program entirely into RAM */

The definitions of OLD_FLAT_FLAG_RAM are identical, so could be
factored out.
However, they appear to be unused.

>  # else
>  #      error "Unknown bitfield order for flat files."

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 15/15] riscv: add binfmt_flat support
  2019-06-11  8:16   ` Vladimir Murzin
@ 2019-06-11  9:20     ` Christoph Hellwig
  0 siblings, 0 replies; 38+ messages in thread
From: Christoph Hellwig @ 2019-06-11  9:20 UTC (permalink / raw)
  To: Vladimir Murzin
  Cc: Christoph Hellwig, Greg Ungerer, uclinux-h8-devel, linux-xtensa,
	Michal Simek, linux-c6x-dev, linux-sh, linux-kernel, linux-m68k,
	linux-riscv, linux-arm-kernel

On Tue, Jun 11, 2019 at 09:16:43AM +0100, Vladimir Murzin wrote:
> On 6/10/19 10:20 PM, Christoph Hellwig wrote:
> > Use the generic support with arguments are on the stack.  Same as arm
> > and m68k.
> 
> Out of curiosity, what is reason for keeping arguments on the stack?
> 
> ARM port of uClibc has following comment around manipulating of argv/argc:
> 
>         /*
>          * uClinux/arm stacks look a little different from normal
>          * MMU-full Linux/arm stacks (for no good reason)
>          */
> 
> So I though it is kind of legacy.

I just copied m68k and arm.  But dropping this makes the uclinux
crt1 code simpler, so I'll drop the flag for the next version.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 01/15] binfmt_flat: remove flat_reloc_valid
  2019-06-10 21:20 ` [PATCH 01/15] binfmt_flat: remove flat_reloc_valid Christoph Hellwig
@ 2019-06-11  9:44   ` Vladimir Murzin
  0 siblings, 0 replies; 38+ messages in thread
From: Vladimir Murzin @ 2019-06-11  9:44 UTC (permalink / raw)
  To: Christoph Hellwig, Greg Ungerer
  Cc: uclinux-h8-devel, linux-xtensa, Michal Simek, linux-c6x-dev,
	linux-sh, linux-kernel, linux-m68k, linux-riscv,
	linux-arm-kernel

On 6/10/19 10:20 PM, Christoph Hellwig wrote:
> This helper is the same for all architectures, open code it in the only
> caller.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  arch/arm/include/asm/flat.h        | 1 -
>  arch/c6x/include/asm/flat.h        | 1 -
>  arch/h8300/include/asm/flat.h      | 1 -
>  arch/m68k/include/asm/flat.h       | 1 -
>  arch/microblaze/include/asm/flat.h | 1 -
>  arch/sh/include/asm/flat.h         | 1 -
>  arch/xtensa/include/asm/flat.h     | 1 -
>  fs/binfmt_flat.c                   | 2 +-
>  8 files changed, 1 insertion(+), 8 deletions(-)

For ARM bits:

Tested-by: Vladimir Murzin <vladimir.murzin@arm.com>
Reviewed-by: Vladimir Murzin <vladimir.murzin@arm.com>


> 
> diff --git a/arch/arm/include/asm/flat.h b/arch/arm/include/asm/flat.h
> index f0c75ddeea23..10cce9ecf151 100644
> --- a/arch/arm/include/asm/flat.h
> +++ b/arch/arm/include/asm/flat.h
> @@ -10,7 +10,6 @@
>  
>  #define	flat_argvp_envp_on_stack()		1
>  #define	flat_old_ram_flag(flags)		(flags)
> -#define	flat_reloc_valid(reloc, size)		((reloc) <= (size))
>  
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  					u32 *addr, u32 *persistent)
> diff --git a/arch/c6x/include/asm/flat.h b/arch/c6x/include/asm/flat.h
> index 76fd0bb962a3..ecc6aea6606c 100644
> --- a/arch/c6x/include/asm/flat.h
> +++ b/arch/c6x/include/asm/flat.h
> @@ -6,7 +6,6 @@
>  
>  #define flat_argvp_envp_on_stack()			0
>  #define flat_old_ram_flag(flags)			(flags)
> -#define flat_reloc_valid(reloc, size)			((reloc) <= (size))
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  					u32 *addr, u32 *persistent)
>  {
> diff --git a/arch/h8300/include/asm/flat.h b/arch/h8300/include/asm/flat.h
> index f4cdfcbdd2ba..dcc7775115dd 100644
> --- a/arch/h8300/include/asm/flat.h
> +++ b/arch/h8300/include/asm/flat.h
> @@ -10,7 +10,6 @@
>  
>  #define	flat_argvp_envp_on_stack()		1
>  #define	flat_old_ram_flag(flags)		1
> -#define	flat_reloc_valid(reloc, size)		((reloc) <= (size))
>  #define	flat_set_persistent(relval, p)		0
>  
>  /*
> diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h
> index 4f1d1e373420..a631caf5e18f 100644
> --- a/arch/m68k/include/asm/flat.h
> +++ b/arch/m68k/include/asm/flat.h
> @@ -10,7 +10,6 @@
>  
>  #define	flat_argvp_envp_on_stack()		1
>  #define	flat_old_ram_flag(flags)		(flags)
> -#define	flat_reloc_valid(reloc, size)		((reloc) <= (size))
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  					u32 *addr, u32 *persistent)
>  {
> diff --git a/arch/microblaze/include/asm/flat.h b/arch/microblaze/include/asm/flat.h
> index 3d2747d4c967..34be5ed011be 100644
> --- a/arch/microblaze/include/asm/flat.h
> +++ b/arch/microblaze/include/asm/flat.h
> @@ -15,7 +15,6 @@
>  
>  #define	flat_argvp_envp_on_stack()	0
>  #define	flat_old_ram_flag(flags)	(flags)
> -#define	flat_reloc_valid(reloc, size)	((reloc) <= (size))
>  #define	flat_set_persistent(relval, p)		0
>  
>  /*
> diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h
> index 843d458b8329..8f2929b32f2e 100644
> --- a/arch/sh/include/asm/flat.h
> +++ b/arch/sh/include/asm/flat.h
> @@ -13,7 +13,6 @@
>  
>  #define	flat_argvp_envp_on_stack()		0
>  #define	flat_old_ram_flag(flags)		(flags)
> -#define	flat_reloc_valid(reloc, size)		((reloc) <= (size))
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  					u32 *addr, u32 *persistent)
>  {
> diff --git a/arch/xtensa/include/asm/flat.h b/arch/xtensa/include/asm/flat.h
> index b8532d7877b3..6ee5a35eb0ec 100644
> --- a/arch/xtensa/include/asm/flat.h
> +++ b/arch/xtensa/include/asm/flat.h
> @@ -6,7 +6,6 @@
>  
>  #define flat_argvp_envp_on_stack()			0
>  #define flat_old_ram_flag(flags)			(flags)
> -#define flat_reloc_valid(reloc, size)			((reloc) <= (size))
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  					u32 *addr, u32 *persistent)
>  {
> diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
> index 82a48e830018..afddea583999 100644
> --- a/fs/binfmt_flat.c
> +++ b/fs/binfmt_flat.c
> @@ -345,7 +345,7 @@ calc_reloc(unsigned long r, struct lib_info *p, int curid, int internalp)
>  	start_code = p->lib_list[id].start_code;
>  	text_len = p->lib_list[id].text_len;
>  
> -	if (!flat_reloc_valid(r, start_brk - start_data + text_len)) {
> +	if (r > start_brk - start_data + text_len) {
>  		pr_err("reloc outside program 0x%lx (0 - 0x%lx/0x%lx)",
>  		       r, start_brk-start_data+text_len, text_len);
>  		goto failed;
> 


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 02/15] binfmt_flat: remove flat_set_persistent
  2019-06-10 21:20 ` [PATCH 02/15] binfmt_flat: remove flat_set_persistent Christoph Hellwig
@ 2019-06-11  9:45   ` Vladimir Murzin
  0 siblings, 0 replies; 38+ messages in thread
From: Vladimir Murzin @ 2019-06-11  9:45 UTC (permalink / raw)
  To: Christoph Hellwig, Greg Ungerer
  Cc: uclinux-h8-devel, linux-xtensa, Michal Simek, linux-c6x-dev,
	linux-sh, linux-kernel, linux-m68k, linux-riscv,
	linux-arm-kernel

On 6/10/19 10:20 PM, Christoph Hellwig wrote:
> This helper is a no-op on all architectures, remove it.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  arch/arm/include/asm/flat.h        | 1 -
>  arch/c6x/include/asm/flat.h        | 1 -
>  arch/h8300/include/asm/flat.h      | 1 -
>  arch/m68k/include/asm/flat.h       | 5 -----
>  arch/microblaze/include/asm/flat.h | 1 -
>  arch/sh/include/asm/flat.h         | 1 -
>  arch/xtensa/include/asm/flat.h     | 1 -
>  fs/binfmt_flat.c                   | 2 --
>  8 files changed, 13 deletions(-)
> 

For ARM bits:

Tested-by: Vladimir Murzin <vladimir.murzin@arm.com>
Reviewed-by: Vladimir Murzin <vladimir.murzin@arm.com>


> diff --git a/arch/arm/include/asm/flat.h b/arch/arm/include/asm/flat.h
> index 10cce9ecf151..576241d74704 100644
> --- a/arch/arm/include/asm/flat.h
> +++ b/arch/arm/include/asm/flat.h
> @@ -31,6 +31,5 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
>  }
>  
>  #define	flat_get_relocate_addr(rel)		(rel)
> -#define	flat_set_persistent(relval, p)		0
>  
>  #endif /* __ARM_FLAT_H__ */
> diff --git a/arch/c6x/include/asm/flat.h b/arch/c6x/include/asm/flat.h
> index ecc6aea6606c..ac87368efad1 100644
> --- a/arch/c6x/include/asm/flat.h
> +++ b/arch/c6x/include/asm/flat.h
> @@ -18,6 +18,5 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
>  	return 0;
>  }
>  #define flat_get_relocate_addr(rel)			(rel)
> -#define flat_set_persistent(relval, p)			0
>  
>  #endif /* __ASM_C6X_FLAT_H */
> diff --git a/arch/h8300/include/asm/flat.h b/arch/h8300/include/asm/flat.h
> index dcc7775115dd..7ef7eefded3d 100644
> --- a/arch/h8300/include/asm/flat.h
> +++ b/arch/h8300/include/asm/flat.h
> @@ -10,7 +10,6 @@
>  
>  #define	flat_argvp_envp_on_stack()		1
>  #define	flat_old_ram_flag(flags)		1
> -#define	flat_set_persistent(relval, p)		0
>  
>  /*
>   * on the H8 a couple of the relocations have an instruction in the
> diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h
> index a631caf5e18f..955617bb937b 100644
> --- a/arch/m68k/include/asm/flat.h
> +++ b/arch/m68k/include/asm/flat.h
> @@ -30,11 +30,6 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
>  }
>  #define	flat_get_relocate_addr(rel)		(rel)
>  
> -static inline int flat_set_persistent(u32 relval, u32 *persistent)
> -{
> -	return 0;
> -}
> -
>  #define FLAT_PLAT_INIT(regs) \
>  	do { \
>  		if (current->mm) \
> diff --git a/arch/microblaze/include/asm/flat.h b/arch/microblaze/include/asm/flat.h
> index 34be5ed011be..846084fa7f04 100644
> --- a/arch/microblaze/include/asm/flat.h
> +++ b/arch/microblaze/include/asm/flat.h
> @@ -15,7 +15,6 @@
>  
>  #define	flat_argvp_envp_on_stack()	0
>  #define	flat_old_ram_flag(flags)	(flags)
> -#define	flat_set_persistent(relval, p)		0
>  
>  /*
>   * Microblaze works a little differently from other arches, because
> diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h
> index 8f2929b32f2e..6f3b18679a98 100644
> --- a/arch/sh/include/asm/flat.h
> +++ b/arch/sh/include/asm/flat.h
> @@ -25,7 +25,6 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
>  	return 0;
>  }
>  #define	flat_get_relocate_addr(rel)		(rel)
> -#define	flat_set_persistent(relval, p)		({ (void)p; 0; })
>  
>  #define FLAT_PLAT_INIT(_r) \
>    do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \
> diff --git a/arch/xtensa/include/asm/flat.h b/arch/xtensa/include/asm/flat.h
> index 6ee5a35eb0ec..b1bc0d9a8d4e 100644
> --- a/arch/xtensa/include/asm/flat.h
> +++ b/arch/xtensa/include/asm/flat.h
> @@ -18,6 +18,5 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
>  	return 0;
>  }
>  #define flat_get_relocate_addr(rel)			(rel)
> -#define flat_set_persistent(relval, p)			0
>  
>  #endif /* __ASM_XTENSA_FLAT_H */
> diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
> index afddea583999..a4c0b245ab1f 100644
> --- a/fs/binfmt_flat.c
> +++ b/fs/binfmt_flat.c
> @@ -787,8 +787,6 @@ static int load_flat_file(struct linux_binprm *bprm,
>  			if (get_user(relval, reloc + i))
>  				return -EFAULT;
>  			relval = ntohl(relval);
> -			if (flat_set_persistent(relval, &persistent))
> -				continue;
>  			addr = flat_get_relocate_addr(relval);
>  			rp = (u32 __user *)calc_reloc(addr, libinfo, id, 1);
>  			if (rp == (u32 __user *)RELOC_FAILED) {
> 


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 03/15] binfmt_flat: provide a default version of flat_get_relocate_addr
  2019-06-10 21:20 ` [PATCH 03/15] binfmt_flat: provide a default version of flat_get_relocate_addr Christoph Hellwig
@ 2019-06-11  9:46   ` Vladimir Murzin
  0 siblings, 0 replies; 38+ messages in thread
From: Vladimir Murzin @ 2019-06-11  9:46 UTC (permalink / raw)
  To: Christoph Hellwig, Greg Ungerer
  Cc: uclinux-h8-devel, linux-xtensa, Michal Simek, linux-c6x-dev,
	linux-sh, linux-kernel, linux-m68k, linux-riscv,
	linux-arm-kernel

On 6/10/19 10:20 PM, Christoph Hellwig wrote:
> This way only the two architectures that do masking need to provide
> the helper.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  arch/arm/include/asm/flat.h    | 2 --
>  arch/c6x/include/asm/flat.h    | 1 -
>  arch/m68k/include/asm/flat.h   | 1 -
>  arch/sh/include/asm/flat.h     | 1 -
>  arch/xtensa/include/asm/flat.h | 1 -
>  fs/binfmt_flat.c               | 4 ++++
>  6 files changed, 4 insertions(+), 6 deletions(-)


For ARM bits:

Tested-by: Vladimir Murzin <vladimir.murzin@arm.com>
Reviewed-by: Vladimir Murzin <vladimir.murzin@arm.com>


> 
> diff --git a/arch/arm/include/asm/flat.h b/arch/arm/include/asm/flat.h
> index 576241d74704..a185fe023b60 100644
> --- a/arch/arm/include/asm/flat.h
> +++ b/arch/arm/include/asm/flat.h
> @@ -30,6 +30,4 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
>  #endif
>  }
>  
> -#define	flat_get_relocate_addr(rel)		(rel)
> -
>  #endif /* __ARM_FLAT_H__ */
> diff --git a/arch/c6x/include/asm/flat.h b/arch/c6x/include/asm/flat.h
> index ac87368efad1..c4d703b454c6 100644
> --- a/arch/c6x/include/asm/flat.h
> +++ b/arch/c6x/include/asm/flat.h
> @@ -17,6 +17,5 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
>  	put_unaligned(addr, (__force u32 *)rp);
>  	return 0;
>  }
> -#define flat_get_relocate_addr(rel)			(rel)
>  
>  #endif /* __ASM_C6X_FLAT_H */
> diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h
> index 955617bb937b..217fa89c8e34 100644
> --- a/arch/m68k/include/asm/flat.h
> +++ b/arch/m68k/include/asm/flat.h
> @@ -28,7 +28,6 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
>  	return put_user(addr, rp);
>  #endif
>  }
> -#define	flat_get_relocate_addr(rel)		(rel)
>  
>  #define FLAT_PLAT_INIT(regs) \
>  	do { \
> diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h
> index 6f3b18679a98..0d520b4cc5ea 100644
> --- a/arch/sh/include/asm/flat.h
> +++ b/arch/sh/include/asm/flat.h
> @@ -24,7 +24,6 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
>  	put_unaligned(addr, (__force u32 *)rp);
>  	return 0;
>  }
> -#define	flat_get_relocate_addr(rel)		(rel)
>  
>  #define FLAT_PLAT_INIT(_r) \
>    do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \
> diff --git a/arch/xtensa/include/asm/flat.h b/arch/xtensa/include/asm/flat.h
> index b1bc0d9a8d4e..a1d88aa3ef8a 100644
> --- a/arch/xtensa/include/asm/flat.h
> +++ b/arch/xtensa/include/asm/flat.h
> @@ -17,6 +17,5 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
>  	put_unaligned(addr, (__force u32 *)rp);
>  	return 0;
>  }
> -#define flat_get_relocate_addr(rel)			(rel)
>  
>  #endif /* __ASM_XTENSA_FLAT_H */
> diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
> index a4c0b245ab1f..c0e4535dc1ec 100644
> --- a/fs/binfmt_flat.c
> +++ b/fs/binfmt_flat.c
> @@ -43,6 +43,10 @@
>  #include <asm/cacheflush.h>
>  #include <asm/page.h>
>  
> +#ifndef flat_get_relocate_addr
> +#define flat_get_relocate_addr(rel)	(rel)
> +#endif
> +
>  /****************************************************************************/
>  
>  /*
> 


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 04/15] binfmt_flat: remove flat_old_ram_flag
  2019-06-10 21:20 ` [PATCH 04/15] binfmt_flat: remove flat_old_ram_flag Christoph Hellwig
  2019-06-11  6:04   ` Greg Ungerer
@ 2019-06-11  9:47   ` Vladimir Murzin
  1 sibling, 0 replies; 38+ messages in thread
From: Vladimir Murzin @ 2019-06-11  9:47 UTC (permalink / raw)
  To: Christoph Hellwig, Greg Ungerer
  Cc: uclinux-h8-devel, linux-xtensa, Michal Simek, linux-c6x-dev,
	linux-sh, linux-kernel, linux-m68k, linux-riscv,
	linux-arm-kernel

On 6/10/19 10:20 PM, Christoph Hellwig wrote:
> Instead add a Kconfig variable that only h8300 selects.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  arch/arm/include/asm/flat.h        | 1 -
>  arch/c6x/include/asm/flat.h        | 1 -
>  arch/h8300/Kconfig                 | 1 +
>  arch/h8300/include/asm/flat.h      | 1 -
>  arch/m68k/include/asm/flat.h       | 1 -
>  arch/microblaze/include/asm/flat.h | 1 -
>  arch/sh/include/asm/flat.h         | 1 -
>  arch/xtensa/include/asm/flat.h     | 1 -
>  fs/Kconfig.binfmt                  | 3 +++
>  fs/binfmt_flat.c                   | 3 ++-
>  10 files changed, 6 insertions(+), 8 deletions(-)
> 

For ARM bits:

Tested-by: Vladimir Murzin <vladimir.murzin@arm.com>
Reviewed-by: Vladimir Murzin <vladimir.murzin@arm.com>


> diff --git a/arch/arm/include/asm/flat.h b/arch/arm/include/asm/flat.h
> index a185fe023b60..acf162111ee2 100644
> --- a/arch/arm/include/asm/flat.h
> +++ b/arch/arm/include/asm/flat.h
> @@ -9,7 +9,6 @@
>  #include <linux/uaccess.h>
>  
>  #define	flat_argvp_envp_on_stack()		1
> -#define	flat_old_ram_flag(flags)		(flags)
>  
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  					u32 *addr, u32 *persistent)
> diff --git a/arch/c6x/include/asm/flat.h b/arch/c6x/include/asm/flat.h
> index c4d703b454c6..353e4d06e8c0 100644
> --- a/arch/c6x/include/asm/flat.h
> +++ b/arch/c6x/include/asm/flat.h
> @@ -5,7 +5,6 @@
>  #include <asm/unaligned.h>
>  
>  #define flat_argvp_envp_on_stack()			0
> -#define flat_old_ram_flag(flags)			(flags)
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  					u32 *addr, u32 *persistent)
>  {
> diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig
> index ecfc4b4b6373..d30e8727b02d 100644
> --- a/arch/h8300/Kconfig
> +++ b/arch/h8300/Kconfig
> @@ -2,6 +2,7 @@
>  config H8300
>          def_bool y
>  	select ARCH_32BIT_OFF_T
> +	select BINFMT_FLAT_OLD_ALWAYS_RAM
>  	select GENERIC_ATOMIC64
>  	select HAVE_UID16
>  	select VIRT_TO_BUS
> diff --git a/arch/h8300/include/asm/flat.h b/arch/h8300/include/asm/flat.h
> index 7ef7eefded3d..14cc928d5478 100644
> --- a/arch/h8300/include/asm/flat.h
> +++ b/arch/h8300/include/asm/flat.h
> @@ -9,7 +9,6 @@
>  #include <asm/unaligned.h>
>  
>  #define	flat_argvp_envp_on_stack()		1
> -#define	flat_old_ram_flag(flags)		1
>  
>  /*
>   * on the H8 a couple of the relocations have an instruction in the
> diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h
> index 217fa89c8e34..7b1fb5c2809e 100644
> --- a/arch/m68k/include/asm/flat.h
> +++ b/arch/m68k/include/asm/flat.h
> @@ -9,7 +9,6 @@
>  #include <linux/uaccess.h>
>  
>  #define	flat_argvp_envp_on_stack()		1
> -#define	flat_old_ram_flag(flags)		(flags)
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  					u32 *addr, u32 *persistent)
>  {
> diff --git a/arch/microblaze/include/asm/flat.h b/arch/microblaze/include/asm/flat.h
> index 846084fa7f04..1cd8d7f4cf12 100644
> --- a/arch/microblaze/include/asm/flat.h
> +++ b/arch/microblaze/include/asm/flat.h
> @@ -14,7 +14,6 @@
>  #include <asm/unaligned.h>
>  
>  #define	flat_argvp_envp_on_stack()	0
> -#define	flat_old_ram_flag(flags)	(flags)
>  
>  /*
>   * Microblaze works a little differently from other arches, because
> diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h
> index 0d520b4cc5ea..015678d7b771 100644
> --- a/arch/sh/include/asm/flat.h
> +++ b/arch/sh/include/asm/flat.h
> @@ -12,7 +12,6 @@
>  #include <asm/unaligned.h>
>  
>  #define	flat_argvp_envp_on_stack()		0
> -#define	flat_old_ram_flag(flags)		(flags)
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  					u32 *addr, u32 *persistent)
>  {
> diff --git a/arch/xtensa/include/asm/flat.h b/arch/xtensa/include/asm/flat.h
> index a1d88aa3ef8a..b215c1e66958 100644
> --- a/arch/xtensa/include/asm/flat.h
> +++ b/arch/xtensa/include/asm/flat.h
> @@ -5,7 +5,6 @@
>  #include <asm/unaligned.h>
>  
>  #define flat_argvp_envp_on_stack()			0
> -#define flat_old_ram_flag(flags)			(flags)
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  					u32 *addr, u32 *persistent)
>  {
> diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
> index f87ddd1b6d72..5658e12ad944 100644
> --- a/fs/Kconfig.binfmt
> +++ b/fs/Kconfig.binfmt
> @@ -97,6 +97,9 @@ config BINFMT_FLAT
>  	help
>  	  Support uClinux FLAT format binaries.
>  
> +config BINFMT_FLAT_OLD_ALWAYS_RAM
> +	bool
> +
>  config BINFMT_ZFLAT
>  	bool "Enable ZFLAT support"
>  	depends on BINFMT_FLAT
> diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
> index c0e4535dc1ec..18d82fd5f57c 100644
> --- a/fs/binfmt_flat.c
> +++ b/fs/binfmt_flat.c
> @@ -488,7 +488,8 @@ static int load_flat_file(struct linux_binprm *bprm,
>  	 * fix up the flags for the older format,  there were all kinds
>  	 * of endian hacks,  this only works for the simple cases
>  	 */
> -	if (rev == OLD_FLAT_VERSION && flat_old_ram_flag(flags))
> +	if (IS_ENABLED(CONFIG_BINFMT_FLAT_OLD_ALWAYS_RAM) &&
> +	    rev == OLD_FLAT_VERSION)
>  		flags = FLAT_FLAG_RAM;
>  
>  #ifndef CONFIG_BINFMT_ZFLAT
> 


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 05/15] binfmt_flat: replace flat_argvp_envp_on_stack with a Kconfig variable
  2019-06-10 21:20 ` [PATCH 05/15] binfmt_flat: replace flat_argvp_envp_on_stack with a Kconfig variable Christoph Hellwig
@ 2019-06-11  9:49   ` Vladimir Murzin
  0 siblings, 0 replies; 38+ messages in thread
From: Vladimir Murzin @ 2019-06-11  9:49 UTC (permalink / raw)
  To: Christoph Hellwig, Greg Ungerer
  Cc: uclinux-h8-devel, linux-xtensa, Michal Simek, linux-c6x-dev,
	linux-sh, linux-kernel, linux-m68k, linux-riscv,
	linux-arm-kernel

On 6/10/19 10:20 PM, Christoph Hellwig wrote:
> This will eventually allow us to kill the need for an <asm/flat.h> for
> many cases.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  arch/arm/Kconfig                   | 1 +
>  arch/arm/include/asm/flat.h        | 2 --
>  arch/c6x/include/asm/flat.h        | 1 -
>  arch/h8300/Kconfig                 | 1 +
>  arch/h8300/include/asm/flat.h      | 2 --
>  arch/m68k/Kconfig                  | 1 +
>  arch/m68k/include/asm/flat.h       | 1 -
>  arch/microblaze/include/asm/flat.h | 2 --
>  arch/sh/include/asm/flat.h         | 1 -
>  arch/xtensa/include/asm/flat.h     | 1 -
>  fs/Kconfig.binfmt                  | 3 +++
>  fs/binfmt_flat.c                   | 5 +++--
>  12 files changed, 9 insertions(+), 12 deletions(-)
>

For ARM bits:

Tested-by: Vladimir Murzin <vladimir.murzin@arm.com>
Reviewed-by: Vladimir Murzin <vladimir.murzin@arm.com>


> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 8869742a85df..b1b48c0bde76 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -30,6 +30,7 @@ config ARM
>  select ARCH_USE_BUILTIN_BSWAP
>  select ARCH_USE_CMPXCHG_LOCKREF
>  select ARCH_WANT_IPC_PARSE_VERSION
> +select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
>  select BUILDTIME_EXTABLE_SORT if MMU
>  select CLONE_BACKWARDS
>  select CPU_PM if SUSPEND || CPU_IDLE
> diff --git a/arch/arm/include/asm/flat.h b/arch/arm/include/asm/flat.h
> index acf162111ee2..bbc27901446f 100644
> --- a/arch/arm/include/asm/flat.h
> +++ b/arch/arm/include/asm/flat.h
> @@ -8,8 +8,6 @@
>
>  #include <linux/uaccess.h>
>
> -#defineflat_argvp_envp_on_stack()1
> -
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  u32 *addr, u32 *persistent)
>  {
> diff --git a/arch/c6x/include/asm/flat.h b/arch/c6x/include/asm/flat.h
> index 353e4d06e8c0..2d57a9204d21 100644
> --- a/arch/c6x/include/asm/flat.h
> +++ b/arch/c6x/include/asm/flat.h
> @@ -4,7 +4,6 @@
>
>  #include <asm/unaligned.h>
>
> -#define flat_argvp_envp_on_stack()0
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  u32 *addr, u32 *persistent)
>  {
> diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig
> index d30e8727b02d..7457f190caaa 100644
> --- a/arch/h8300/Kconfig
> +++ b/arch/h8300/Kconfig
> @@ -2,6 +2,7 @@
>  config H8300
>          def_bool y
>  select ARCH_32BIT_OFF_T
> +select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
>  select BINFMT_FLAT_OLD_ALWAYS_RAM
>  select GENERIC_ATOMIC64
>  select HAVE_UID16
> diff --git a/arch/h8300/include/asm/flat.h b/arch/h8300/include/asm/flat.h
> index 14cc928d5478..4683146f0e9e 100644
> --- a/arch/h8300/include/asm/flat.h
> +++ b/arch/h8300/include/asm/flat.h
> @@ -8,8 +8,6 @@
>
>  #include <asm/unaligned.h>
>
> -#defineflat_argvp_envp_on_stack()1
> -
>  /*
>   * on the H8 a couple of the relocations have an instruction in the
>   * top byte.  As there can only be 24bits of address space,  we just
> diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
> index 218e037ef901..fd69ee5ad6ab 100644
> --- a/arch/m68k/Kconfig
> +++ b/arch/m68k/Kconfig
> @@ -7,6 +7,7 @@ config M68K
>  select ARCH_MIGHT_HAVE_PC_PARPORT if ISA
>  select ARCH_NO_COHERENT_DMA_MMAP if !MMU
>  select ARCH_NO_PREEMPT if !COLDFIRE
> +select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
>  select HAVE_IDE
>  select HAVE_AOUT if MMU
>  select HAVE_DEBUG_BUGVERBOSE
> diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h
> index 7b1fb5c2809e..d7102fcd43eb 100644
> --- a/arch/m68k/include/asm/flat.h
> +++ b/arch/m68k/include/asm/flat.h
> @@ -8,7 +8,6 @@
>
>  #include <linux/uaccess.h>
>
> -#defineflat_argvp_envp_on_stack()1
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  u32 *addr, u32 *persistent)
>  {
> diff --git a/arch/microblaze/include/asm/flat.h b/arch/microblaze/include/asm/flat.h
> index 1cd8d7f4cf12..9e3d8e01d294 100644
> --- a/arch/microblaze/include/asm/flat.h
> +++ b/arch/microblaze/include/asm/flat.h
> @@ -13,8 +13,6 @@
>
>  #include <asm/unaligned.h>
>
> -#defineflat_argvp_envp_on_stack()0
> -
>  /*
>   * Microblaze works a little differently from other arches, because
>   * of the MICROBLAZE_64 reloc type. Here, a 32 bit address is split
> diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h
> index 015678d7b771..1002343dd84a 100644
> --- a/arch/sh/include/asm/flat.h
> +++ b/arch/sh/include/asm/flat.h
> @@ -11,7 +11,6 @@
>
>  #include <asm/unaligned.h>
>
> -#defineflat_argvp_envp_on_stack()0
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  u32 *addr, u32 *persistent)
>  {
> diff --git a/arch/xtensa/include/asm/flat.h b/arch/xtensa/include/asm/flat.h
> index b215c1e66958..3d357371b28b 100644
> --- a/arch/xtensa/include/asm/flat.h
> +++ b/arch/xtensa/include/asm/flat.h
> @@ -4,7 +4,6 @@
>
>  #include <asm/unaligned.h>
>
> -#define flat_argvp_envp_on_stack()0
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
>  u32 *addr, u32 *persistent)
>  {
> diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
> index 5658e12ad944..82f7d7f234f3 100644
> --- a/fs/Kconfig.binfmt
> +++ b/fs/Kconfig.binfmt
> @@ -97,6 +97,9 @@ config BINFMT_FLAT
>  help
>    Support uClinux FLAT format binaries.
>
> +config BINFMT_FLAT_ARGVP_ENVP_ON_STACK
> +bool
> +
>  config BINFMT_FLAT_OLD_ALWAYS_RAM
>  bool
>
> diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
> index 18d82fd5f57c..c09651087eda 100644
> --- a/fs/binfmt_flat.c
> +++ b/fs/binfmt_flat.c
> @@ -124,14 +124,15 @@ static int create_flat_tables(struct linux_binprm *bprm, unsigned long arg_start
>
>  sp -= bprm->envc + 1;
>  sp -= bprm->argc + 1;
> -sp -= flat_argvp_envp_on_stack() ? 2 : 0;
> +if (IS_ENABLED(CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK))
> +sp -= 2; /* argvp + envp */
>  sp -= 1;  /* &argc */
>
>  current->mm->start_stack = (unsigned long)sp & -FLAT_STACK_ALIGN;
>  sp = (unsigned long __user *)current->mm->start_stack;
>
>  __put_user(bprm->argc, sp++);
> -if (flat_argvp_envp_on_stack()) {
> +if (IS_ENABLED(CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK)) {
>  unsigned long argv, envp;
>  argv = (unsigned long)(sp + 2);
>  envp = (unsigned long)(sp + 2 + bprm->argc + 1);
>

IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 06/15] binfmt_flat: remove the uapi <linux/flat.h> header
  2019-06-10 21:20 ` [PATCH 06/15] binfmt_flat: remove the uapi <linux/flat.h> header Christoph Hellwig
@ 2019-06-11  9:51   ` Vladimir Murzin
  0 siblings, 0 replies; 38+ messages in thread
From: Vladimir Murzin @ 2019-06-11  9:51 UTC (permalink / raw)
  To: Christoph Hellwig, Greg Ungerer
  Cc: uclinux-h8-devel, linux-xtensa, Michal Simek, linux-c6x-dev,
	linux-sh, linux-kernel, linux-m68k, linux-riscv,
	linux-arm-kernel

On 6/10/19 10:20 PM, Christoph Hellwig wrote:
> The split between the two flat.h files is completely arbitrary, and the
> uapi version even contains CONFIG_ ifdefs that can't work in userspace.
> The only userspace program known to use the header is elf2flt, and it
> ships with its own version of the combined header.
> 
> Use the chance to move the <asm/flat.h> inclusion out of this file, as it
> is in no way needed for the format defintion, but just for the binfmt
> implementation.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  fs/binfmt_flat.c          |  1 +
>  include/linux/flat.h      | 45 ++++++++++++++++++++++++++---
>  include/uapi/linux/flat.h | 59 ---------------------------------------
>  3 files changed, 42 insertions(+), 63 deletions(-)
>  delete mode 100644 include/uapi/linux/flat.h

FWIW:

Reviewed-by: Vladimir Murzin <vladimir.murzin@arm.com>

> 
> diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
> index c09651087eda..6ae0f9af3fc9 100644
> --- a/fs/binfmt_flat.c
> +++ b/fs/binfmt_flat.c
> @@ -42,6 +42,7 @@
>  #include <asm/unaligned.h>
>  #include <asm/cacheflush.h>
>  #include <asm/page.h>
> +#include <asm/flat.h>
>  
>  #ifndef flat_get_relocate_addr
>  #define flat_get_relocate_addr(rel)	(rel)
> diff --git a/include/linux/flat.h b/include/linux/flat.h
> index 569b67d64d5c..21d901ba191b 100644
> --- a/include/linux/flat.h
> +++ b/include/linux/flat.h
> @@ -10,8 +10,47 @@
>  #ifndef _LINUX_FLAT_H
>  #define _LINUX_FLAT_H
>  
> -#include <uapi/linux/flat.h>
> -#include <asm/flat.h>
> +#define	FLAT_VERSION			0x00000004L
> +
> +#ifdef CONFIG_BINFMT_SHARED_FLAT
> +#define	MAX_SHARED_LIBS			(4)
> +#else
> +#define	MAX_SHARED_LIBS			(1)
> +#endif
> +
> +/*
> + * To make everything easier to port and manage cross platform
> + * development,  all fields are in network byte order.
> + */
> +
> +struct flat_hdr {
> +	char magic[4];
> +	unsigned long rev;          /* version (as above) */
> +	unsigned long entry;        /* Offset of first executable instruction
> +	                               with text segment from beginning of file */
> +	unsigned long data_start;   /* Offset of data segment from beginning of
> +	                               file */
> +	unsigned long data_end;     /* Offset of end of data segment
> +	                               from beginning of file */
> +	unsigned long bss_end;      /* Offset of end of bss segment from beginning
> +	                               of file */
> +
> +	/* (It is assumed that data_end through bss_end forms the bss segment.) */
> +
> +	unsigned long stack_size;   /* Size of stack, in bytes */
> +	unsigned long reloc_start;  /* Offset of relocation records from
> +	                               beginning of file */
> +	unsigned long reloc_count;  /* Number of relocation records */
> +	unsigned long flags;
> +	unsigned long build_date;   /* When the program/library was built */
> +	unsigned long filler[5];    /* Reservered, set to zero */
> +};
> +
> +#define FLAT_FLAG_RAM    0x0001 /* load program entirely into RAM */
> +#define FLAT_FLAG_GOTPIC 0x0002 /* program is PIC with GOT */
> +#define FLAT_FLAG_GZIP   0x0004 /* all but the header is compressed */
> +#define FLAT_FLAG_GZDATA 0x0008 /* only data/relocs are compressed (for XIP) */
> +#define FLAT_FLAG_KTRACE 0x0010 /* output useful kernel trace for debugging */
>  
>  /*
>   * While it would be nice to keep this header clean,  users of older
> @@ -22,8 +61,6 @@
>   *        with the format above,  except to fix bugs with old format support.
>   */
>  
> -#include <asm/byteorder.h>
> -
>  #define	OLD_FLAT_VERSION			0x00000002L
>  #define OLD_FLAT_RELOC_TYPE_TEXT	0
>  #define OLD_FLAT_RELOC_TYPE_DATA	1
> diff --git a/include/uapi/linux/flat.h b/include/uapi/linux/flat.h
> deleted file mode 100644
> index 27e595e44fb7..000000000000
> --- a/include/uapi/linux/flat.h
> +++ /dev/null
> @@ -1,59 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
> -/*
> - * Copyright (C) 2002-2003  David McCullough <davidm@snapgear.com>
> - * Copyright (C) 1998       Kenneth Albanowski <kjahds@kjahds.com>
> - *                          The Silver Hammer Group, Ltd.
> - *
> - * This file provides the definitions and structures needed to
> - * support uClinux flat-format executables.
> - */
> -
> -#ifndef _UAPI_LINUX_FLAT_H
> -#define _UAPI_LINUX_FLAT_H
> -
> -
> -#define	FLAT_VERSION			0x00000004L
> -
> -#ifdef CONFIG_BINFMT_SHARED_FLAT
> -#define	MAX_SHARED_LIBS			(4)
> -#else
> -#define	MAX_SHARED_LIBS			(1)
> -#endif
> -
> -/*
> - * To make everything easier to port and manage cross platform
> - * development,  all fields are in network byte order.
> - */
> -
> -struct flat_hdr {
> -	char magic[4];
> -	unsigned long rev;          /* version (as above) */
> -	unsigned long entry;        /* Offset of first executable instruction
> -	                               with text segment from beginning of file */
> -	unsigned long data_start;   /* Offset of data segment from beginning of
> -	                               file */
> -	unsigned long data_end;     /* Offset of end of data segment
> -	                               from beginning of file */
> -	unsigned long bss_end;      /* Offset of end of bss segment from beginning
> -	                               of file */
> -
> -	/* (It is assumed that data_end through bss_end forms the bss segment.) */
> -
> -	unsigned long stack_size;   /* Size of stack, in bytes */
> -	unsigned long reloc_start;  /* Offset of relocation records from
> -	                               beginning of file */
> -	unsigned long reloc_count;  /* Number of relocation records */
> -	unsigned long flags;       
> -	unsigned long build_date;   /* When the program/library was built */
> -	unsigned long filler[5];    /* Reservered, set to zero */
> -};
> -
> -#define FLAT_FLAG_RAM    0x0001 /* load program entirely into RAM */
> -#define FLAT_FLAG_GOTPIC 0x0002 /* program is PIC with GOT */
> -#define FLAT_FLAG_GZIP   0x0004 /* all but the header is compressed */
> -#define FLAT_FLAG_GZDATA 0x0008 /* only data/relocs are compressed (for XIP) */
> -#define FLAT_FLAG_KTRACE 0x0010 /* output useful kernel trace for debugging */
> -
> -
> -
> -#endif /* _UAPI_LINUX_FLAT_H */
> 


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 07/15] binfmt_flat: use __be32 for the on-disk format
  2019-06-10 21:20 ` [PATCH 07/15] binfmt_flat: use __be32 for the on-disk format Christoph Hellwig
  2019-06-11  8:25   ` Geert Uytterhoeven
@ 2019-06-11  9:57   ` Vladimir Murzin
  1 sibling, 0 replies; 38+ messages in thread
From: Vladimir Murzin @ 2019-06-11  9:57 UTC (permalink / raw)
  To: Christoph Hellwig, Greg Ungerer
  Cc: uclinux-h8-devel, linux-xtensa, Michal Simek, linux-c6x-dev,
	linux-sh, linux-kernel, linux-m68k, linux-riscv,
	linux-arm-kernel

On 6/10/19 10:20 PM, Christoph Hellwig wrote:
> So far binfmt_flat has onl been supported on 32-bit platforms, so the
			^^^^
			only
> variable size of the fields didn't matter.  But the upcoming RISC-V
> nommu port supports 64-bit CPUs, and we now have a conflict between
> the elf2flt creation tool that always uses 32-bit fields and the kernel
> that uses (unsigned) long field.  Switch to the userspace view as the
> rest of the binfmt_flat format is completely architecture neutral,
> and binfmt_flat isn't the right binary format for huge executables to
> start with.
> 
> While we're at it also ensure these fields are using __be types as
> they big endian and are byteswapped when loaded.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> 
> wip
  ^^^
Unintended?

> ---
>  include/linux/flat.h | 48 ++++++++++++++++++++++----------------------
>  1 file changed, 24 insertions(+), 24 deletions(-)


With comment message fixed:

Reviewed-by: Vladimir Murzin <vladimir.murzin@arm.com>

> 
> diff --git a/include/linux/flat.h b/include/linux/flat.h
> index 21d901ba191b..59e892d5fadb 100644
> --- a/include/linux/flat.h
> +++ b/include/linux/flat.h
> @@ -24,26 +24,26 @@
>   */
>  
>  struct flat_hdr {
> -	char magic[4];
> -	unsigned long rev;          /* version (as above) */
> -	unsigned long entry;        /* Offset of first executable instruction
> -	                               with text segment from beginning of file */
> -	unsigned long data_start;   /* Offset of data segment from beginning of
> -	                               file */
> -	unsigned long data_end;     /* Offset of end of data segment
> -	                               from beginning of file */
> -	unsigned long bss_end;      /* Offset of end of bss segment from beginning
> -	                               of file */
> +	char	magic[4];
> +	__be32	rev;          /* version (as above) */
> +	__be32	entry;        /* Offset of first executable instruction
> +				 with text segment from beginning of file */
> +	__be32	data_start;   /* Offset of data segment from beginning of
> +				 file */
> +	__be32	data_end;     /* Offset of end of data segment from beginning
> +				 of file */
> +	__be32	bss_end;      /* Offset of end of bss segment from beginning
> +				 of file */
>  
>  	/* (It is assumed that data_end through bss_end forms the bss segment.) */
>  
> -	unsigned long stack_size;   /* Size of stack, in bytes */
> -	unsigned long reloc_start;  /* Offset of relocation records from
> -	                               beginning of file */
> -	unsigned long reloc_count;  /* Number of relocation records */
> -	unsigned long flags;
> -	unsigned long build_date;   /* When the program/library was built */
> -	unsigned long filler[5];    /* Reservered, set to zero */
> +	__be32	stack_size;   /* Size of stack, in bytes */
> +	__be32	reloc_start;  /* Offset of relocation records from beginning of
> +				 file */
> +	__be32	reloc_count;  /* Number of relocation records */
> +	__be32	flags;
> +	__be32	build_date;   /* When the program/library was built */
> +	__u32	filler[5];    /* Reservered, set to zero */
>  };
>  
>  #define FLAT_FLAG_RAM    0x0001 /* load program entirely into RAM */
> @@ -67,19 +67,19 @@ struct flat_hdr {
>  #define OLD_FLAT_RELOC_TYPE_BSS		2
>  
>  typedef union {
> -	unsigned long	value;
> +	u32		value;
>  	struct {
>  # if defined(mc68000) && !defined(CONFIG_COLDFIRE)
> -		signed long offset : 30;
> -		unsigned long type : 2;
> +		s32	offset : 30;
> +		u32	type : 2;
>  #   	define OLD_FLAT_FLAG_RAM    0x1 /* load program entirely into RAM */
>  # elif defined(__BIG_ENDIAN_BITFIELD)
> -		unsigned long type : 2;
> -		signed long offset : 30;
> +		u32	type : 2;
> +		s32	offset : 30;
>  #   	define OLD_FLAT_FLAG_RAM    0x1 /* load program entirely into RAM */
>  # elif defined(__LITTLE_ENDIAN_BITFIELD)
> -		signed long offset : 30;
> -		unsigned long type : 2;
> +		s32	offset : 30;
> +		u32	type : 2;
>  #   	define OLD_FLAT_FLAG_RAM    0x1 /* load program entirely into RAM */
>  # else
>  #   	error "Unknown bitfield order for flat files."
> 


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 08/15] binfmt_flat: add endianess annotations
  2019-06-10 21:20 ` [PATCH 08/15] binfmt_flat: add endianess annotations Christoph Hellwig
@ 2019-06-11  9:58   ` Vladimir Murzin
  0 siblings, 0 replies; 38+ messages in thread
From: Vladimir Murzin @ 2019-06-11  9:58 UTC (permalink / raw)
  To: Christoph Hellwig, Greg Ungerer
  Cc: uclinux-h8-devel, linux-xtensa, Michal Simek, linux-c6x-dev,
	linux-sh, linux-kernel, linux-m68k, linux-riscv,
	linux-arm-kernel

On 6/10/19 10:20 PM, Christoph Hellwig wrote:
> Most binfmt_flat on-disk fields are big endian.  Use the proper __be32
> type where applicable.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  fs/binfmt_flat.c | 26 ++++++++++++++++----------
>  1 file changed, 16 insertions(+), 10 deletions(-)

Tested-by: Vladimir Murzin <vladimir.murzin@arm.com>
Reviewed-by: Vladimir Murzin <vladimir.murzin@arm.com>

> 
> diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
> index 6ae0f9af3fc9..6c1848dee724 100644
> --- a/fs/binfmt_flat.c
> +++ b/fs/binfmt_flat.c
> @@ -421,7 +421,8 @@ static int load_flat_file(struct linux_binprm *bprm,
>  	unsigned long textpos, datapos, realdatastart;
>  	u32 text_len, data_len, bss_len, stack_len, full_data, flags;
>  	unsigned long len, memp, memp_size, extra, rlim;
> -	u32 __user *reloc, *rp;
> +	__be32 __user *reloc;
> +	u32 __user *rp;
>  	struct inode *inode;
>  	int i, rev, relocs;
>  	loff_t fpos;
> @@ -594,7 +595,7 @@ static int load_flat_file(struct linux_binprm *bprm,
>  			goto err;
>  		}
>  
> -		reloc = (u32 __user *)
> +		reloc = (__be32 __user *)
>  			(datapos + (ntohl(hdr->reloc_start) - text_len));
>  		memp = realdatastart;
>  		memp_size = len;
> @@ -619,7 +620,7 @@ static int load_flat_file(struct linux_binprm *bprm,
>  				MAX_SHARED_LIBS * sizeof(u32),
>  				FLAT_DATA_ALIGN);
>  
> -		reloc = (u32 __user *)
> +		reloc = (__be32 __user *)
>  			(datapos + (ntohl(hdr->reloc_start) - text_len));
>  		memp = textpos;
>  		memp_size = len;
> @@ -785,15 +786,16 @@ static int load_flat_file(struct linux_binprm *bprm,
>  		u32 __maybe_unused persistent = 0;
>  		for (i = 0; i < relocs; i++) {
>  			u32 addr, relval;
> +			__be32 tmp;
>  
>  			/*
>  			 * Get the address of the pointer to be
>  			 * relocated (of course, the address has to be
>  			 * relocated first).
>  			 */
> -			if (get_user(relval, reloc + i))
> +			if (get_user(tmp, reloc + i))
>  				return -EFAULT;
> -			relval = ntohl(relval);
> +			relval = ntohl(tmp);
>  			addr = flat_get_relocate_addr(relval);
>  			rp = (u32 __user *)calc_reloc(addr, libinfo, id, 1);
>  			if (rp == (u32 __user *)RELOC_FAILED) {
> @@ -812,8 +814,13 @@ static int load_flat_file(struct linux_binprm *bprm,
>  				 * Do the relocation.  PIC relocs in the data section are
>  				 * already in target order
>  				 */
> -				if ((flags & FLAT_FLAG_GOTPIC) == 0)
> -					addr = ntohl(addr);
> +				if ((flags & FLAT_FLAG_GOTPIC) == 0) {
> +					/*
> +					 * Meh, the same value can have a different
> +					 * byte order based on a flag..
> +					 */
> +					addr = ntohl((__force __be32)addr);
> +				}
>  				addr = calc_reloc(addr, libinfo, id, 0);
>  				if (addr == RELOC_FAILED) {
>  					ret = -ENOEXEC;
> @@ -828,11 +835,10 @@ static int load_flat_file(struct linux_binprm *bprm,
>  		}
>  	} else {
>  		for (i = 0; i < relocs; i++) {
> -			u32 relval;
> +			__be32 relval;
>  			if (get_user(relval, reloc + i))
>  				return -EFAULT;
> -			relval = ntohl(relval);
> -			old_reloc(relval);
> +			old_reloc(ntohl(relval));
>  		}
>  	}
>  
> 


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 09/15] binfmt_flat: add a ARCH_HAS_BINFMT_FLAT option
  2019-06-10 21:20 ` [PATCH 09/15] binfmt_flat: add a ARCH_HAS_BINFMT_FLAT option Christoph Hellwig
@ 2019-06-11  9:59   ` Vladimir Murzin
  0 siblings, 0 replies; 38+ messages in thread
From: Vladimir Murzin @ 2019-06-11  9:59 UTC (permalink / raw)
  To: Christoph Hellwig, Greg Ungerer
  Cc: uclinux-h8-devel, linux-xtensa, Michal Simek, linux-c6x-dev,
	linux-sh, linux-kernel, linux-m68k, linux-riscv,
	linux-arm-kernel

On 6/10/19 10:20 PM, Christoph Hellwig wrote:
> Allow architectures to opt into ARCH_HAS_BINFMT_FLAT support instead of
> assuming that all nommu ports support the format.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  arch/arm/Kconfig        | 1 +
>  arch/c6x/Kconfig        | 1 +
>  arch/h8300/Kconfig      | 1 +
>  arch/m68k/Kconfig       | 1 +
>  arch/microblaze/Kconfig | 1 +
>  arch/sh/Kconfig         | 1 +
>  arch/xtensa/Kconfig     | 1 +
>  fs/Kconfig.binfmt       | 5 ++++-
>  8 files changed, 11 insertions(+), 1 deletion(-)


For ARM bits:

Reviewed-by: Vladimir Murzin <vladimir.murzin@arm.com>


> 
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index b1b48c0bde76..695a26c68064 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -4,6 +4,7 @@ config ARM
>  	default y
>  	select ARCH_32BIT_OFF_T
>  	select ARCH_CLOCKSOURCE_DATA
> +	select ARCH_HAS_BINFMT_FLAT
>  	select ARCH_HAS_DEBUG_VIRTUAL if MMU
>  	select ARCH_HAS_DEVMEM_IS_ALLOWED
>  	select ARCH_HAS_ELF_RANDOMIZE
> diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig
> index eeb0471268a0..78dfe186d708 100644
> --- a/arch/c6x/Kconfig
> +++ b/arch/c6x/Kconfig
> @@ -7,6 +7,7 @@
>  config C6X
>  	def_bool y
>  	select ARCH_32BIT_OFF_T
> +	select ARCH_HAS_BINFMT_FLAT
>  	select ARCH_HAS_SYNC_DMA_FOR_CPU
>  	select ARCH_HAS_SYNC_DMA_FOR_DEVICE
>  	select CLKDEV_LOOKUP
> diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig
> index 7457f190caaa..ec800e9d5aad 100644
> --- a/arch/h8300/Kconfig
> +++ b/arch/h8300/Kconfig
> @@ -2,6 +2,7 @@
>  config H8300
>          def_bool y
>  	select ARCH_32BIT_OFF_T
> +	select ARCH_HAS_BINFMT_FLAT
>  	select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
>  	select BINFMT_FLAT_OLD_ALWAYS_RAM
>  	select GENERIC_ATOMIC64
> diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
> index fd69ee5ad6ab..c0c43c624afa 100644
> --- a/arch/m68k/Kconfig
> +++ b/arch/m68k/Kconfig
> @@ -3,6 +3,7 @@ config M68K
>  	bool
>  	default y
>  	select ARCH_32BIT_OFF_T
> +	select ARCH_HAS_BINFMT_FLAT
>  	select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA
>  	select ARCH_MIGHT_HAVE_PC_PARPORT if ISA
>  	select ARCH_NO_COHERENT_DMA_MMAP if !MMU
> diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
> index f11433daab4a..d411de05b628 100644
> --- a/arch/microblaze/Kconfig
> +++ b/arch/microblaze/Kconfig
> @@ -3,6 +3,7 @@ config MICROBLAZE
>  	def_bool y
>  	select ARCH_32BIT_OFF_T
>  	select ARCH_NO_SWAP
> +	select ARCH_HAS_BINFMT_FLAT if !MMU
>  	select ARCH_HAS_DMA_COHERENT_TO_PFN if MMU
>  	select ARCH_HAS_GCOV_PROFILE_ALL
>  	select ARCH_HAS_SYNC_DMA_FOR_CPU
> diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig
> index b77f512bb176..df3e6215b78c 100644
> --- a/arch/sh/Kconfig
> +++ b/arch/sh/Kconfig
> @@ -1,6 +1,7 @@
>  # SPDX-License-Identifier: GPL-2.0
>  config SUPERH
>  	def_bool y
> +	select ARCH_HAS_BINFMT_FLAT if !MMU
>  	select ARCH_HAS_PTE_SPECIAL
>  	select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
>  	select ARCH_MIGHT_HAVE_PC_PARPORT
> diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
> index 6ec1b75eabc5..ebc135bda921 100644
> --- a/arch/xtensa/Kconfig
> +++ b/arch/xtensa/Kconfig
> @@ -2,6 +2,7 @@
>  config XTENSA
>  	def_bool y
>  	select ARCH_32BIT_OFF_T
> +	select ARCH_HAS_BINFMT_FLAT if !MMU
>  	select ARCH_HAS_SYNC_DMA_FOR_CPU
>  	select ARCH_HAS_SYNC_DMA_FOR_DEVICE
>  	select ARCH_NO_COHERENT_DMA_MMAP if !MMU
> diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
> index 82f7d7f234f3..286b425b30b9 100644
> --- a/fs/Kconfig.binfmt
> +++ b/fs/Kconfig.binfmt
> @@ -91,9 +91,12 @@ config BINFMT_SCRIPT
>  
>  	  Most systems will not boot if you say M or N here.  If unsure, say Y.
>  
> +config ARCH_HAS_BINFMT_FLAT
> +	bool
> +
>  config BINFMT_FLAT
>  	bool "Kernel support for flat binaries"
> -	depends on !MMU || ARM || M68K
> +	depends on ARCH_HAS_BINFMT_FLAT
>  	help
>  	  Support uClinux FLAT format binaries.
>  
> 


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 11/15] binfmt_flat: provide an asm-generic/flat.h
  2019-06-10 21:20 ` [PATCH 11/15] binfmt_flat: provide an asm-generic/flat.h Christoph Hellwig
@ 2019-06-11 10:01   ` Vladimir Murzin
  0 siblings, 0 replies; 38+ messages in thread
From: Vladimir Murzin @ 2019-06-11 10:01 UTC (permalink / raw)
  To: Christoph Hellwig, Greg Ungerer
  Cc: uclinux-h8-devel, linux-xtensa, Michal Simek, linux-c6x-dev,
	linux-sh, linux-kernel, linux-m68k, linux-riscv,
	linux-arm-kernel

On 6/10/19 10:20 PM, Christoph Hellwig wrote:
> This file implements the flat get/put reloc helpers for architectures
> that do not need to overload the relocs by simply using get_user/put_user.
> 
> Note that many nommu architectures currently use {get,put}_unaligned, which
> looks a little bogus and should probably later be switched over to this
> version as well.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  arch/arm/include/asm/Kbuild                   |  1 +
>  arch/m68k/include/asm/flat.h                  | 21 +------------------
>  .../asm => include/asm-generic}/flat.h        | 12 ++++-------
>  3 files changed, 6 insertions(+), 28 deletions(-)
>  rename {arch/arm/include/asm => include/asm-generic}/flat.h (73%)

FWIW:

Reviewed-by: Vladimir Murzin <vladimir.murzin@arm.com>

> 
> diff --git a/arch/arm/include/asm/Kbuild b/arch/arm/include/asm/Kbuild
> index a8f149ab45b8..6b2dc15b6dff 100644
> --- a/arch/arm/include/asm/Kbuild
> +++ b/arch/arm/include/asm/Kbuild
> @@ -5,6 +5,7 @@ generic-y += early_ioremap.h
>  generic-y += emergency-restart.h
>  generic-y += exec.h
>  generic-y += extable.h
> +generic-y += flat.h
>  generic-y += irq_regs.h
>  generic-y += kdebug.h
>  generic-y += local.h
> diff --git a/arch/m68k/include/asm/flat.h b/arch/m68k/include/asm/flat.h
> index d7102fcd43eb..46379e08cdd6 100644
> --- a/arch/m68k/include/asm/flat.h
> +++ b/arch/m68k/include/asm/flat.h
> @@ -6,26 +6,7 @@
>  #ifndef __M68KNOMMU_FLAT_H__
>  #define __M68KNOMMU_FLAT_H__
>  
> -#include <linux/uaccess.h>
> -
> -static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
> -					u32 *addr, u32 *persistent)
> -{
> -#ifdef CONFIG_CPU_HAS_NO_UNALIGNED
> -	return copy_from_user(addr, rp, 4) ? -EFAULT : 0;
> -#else
> -	return get_user(*addr, rp);
> -#endif
> -}
> -
> -static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
> -{
> -#ifdef CONFIG_CPU_HAS_NO_UNALIGNED
> -	return copy_to_user(rp, &addr, 4) ? -EFAULT : 0;
> -#else
> -	return put_user(addr, rp);
> -#endif
> -}
> +#include <asm-generic/flat.h>
>  
>  #define FLAT_PLAT_INIT(regs) \
>  	do { \
> diff --git a/arch/arm/include/asm/flat.h b/include/asm-generic/flat.h
> similarity index 73%
> rename from arch/arm/include/asm/flat.h
> rename to include/asm-generic/flat.h
> index bbc27901446f..fcd2b45c0735 100644
> --- a/arch/arm/include/asm/flat.h
> +++ b/include/asm-generic/flat.h
> @@ -1,15 +1,11 @@
>  /* SPDX-License-Identifier: GPL-2.0 */
> -/*
> - * arch/arm/include/asm/flat.h -- uClinux flat-format executables
> - */
> -
> -#ifndef __ARM_FLAT_H__
> -#define __ARM_FLAT_H__
> +#ifndef _ASM_GENERIC_FLAT_H
> +#define _ASM_GENERIC_FLAT_H
>  
>  #include <linux/uaccess.h>
>  
>  static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
> -					u32 *addr, u32 *persistent)
> +		u32 *addr, u32 *persistent)
>  {
>  #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
>  	return copy_from_user(addr, rp, 4) ? -EFAULT : 0;
> @@ -27,4 +23,4 @@ static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
>  #endif
>  }
>  
> -#endif /* __ARM_FLAT_H__ */
> +#endif /* _ASM_GENERIC_FLAT_H */
> 


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: binfmt_flat cleanups and RISC-V support
  2019-06-11  8:11   ` Christoph Hellwig
@ 2019-06-11 10:08     ` Vladimir Murzin
  0 siblings, 0 replies; 38+ messages in thread
From: Vladimir Murzin @ 2019-06-11 10:08 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Greg Ungerer, uclinux-h8-devel, linux-xtensa, Michal Simek,
	linux-c6x-dev, linux-sh, linux-kernel, linux-m68k, linux-riscv,
	linux-arm-kernel

On 6/11/19 9:11 AM, Christoph Hellwig wrote:
> On Tue, Jun 11, 2019 at 09:05:45AM +0100, Vladimir Murzin wrote:
>> I'm wondering if you have a branch with these changes so I can give
>> it a try on ARM NOMMU platforms?
> 
> 
>     git://git.infradead.org/users/hch/riscv.git riscv-flat
> 

Thanks! I gave it a go and provided my tags for relevant patches.

Cheers
Vladimir

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: binfmt_flat cleanups and RISC-V support
  2019-06-11  7:38   ` Christoph Hellwig
@ 2019-06-11 13:02     ` Greg Ungerer
  0 siblings, 0 replies; 38+ messages in thread
From: Greg Ungerer @ 2019-06-11 13:02 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel


On 11/6/19 5:38 pm, Christoph Hellwig wrote:
> On Tue, Jun 11, 2019 at 04:51:02PM +1000, Greg Ungerer wrote:
>> Hi Christoph,
>>
>> On 11/6/19 7:20 am, Christoph Hellwig wrote:
>>> below is a larger stash of cleanups for the binfmt_misc code,
>>> preparing for the last patch that now trivially adds RISC-V
>>> support, which will be used for the RISC-V nommu series I am
>>> about to post.
>>
>> Whole series looks pretty good. Just the one comment I made.
>>
>> I normally take these through the m68knommu git tree,
>> if you have no problem with that I'll push it in there.
>> It will hit linux-next from there.
> 
> Yes, that's fine.  We'll need it to bring up riscv nommu support,
> but there is no actual dependency on the patches for it to compile,
> just for it to actually be useful.
> 
> Btw, it seems like the uclinux-dev list is dead, is there a replacement
> for it?

No, unfortunately no replacement. Generally I think anything that comes
up goes to the architecture list that issues come up on. Probably not
ideal, especially for things like this that are across all arches.

Regards
Greg


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 04/15] binfmt_flat: remove flat_old_ram_flag
  2019-06-11  7:36     ` Christoph Hellwig
@ 2019-06-11 13:07       ` Greg Ungerer
  0 siblings, 0 replies; 38+ messages in thread
From: Greg Ungerer @ 2019-06-11 13:07 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Michal Simek, linux-arm-kernel, linux-c6x-dev, uclinux-h8-devel,
	linux-m68k, linux-riscv, linux-sh, linux-xtensa, linux-kernel



On 11/6/19 5:36 pm, Christoph Hellwig wrote:
> On Tue, Jun 11, 2019 at 04:04:39PM +1000, Greg Ungerer wrote:
>>> index c0e4535dc1ec..18d82fd5f57c 100644
>>> --- a/fs/binfmt_flat.c
>>> +++ b/fs/binfmt_flat.c
>>> @@ -488,7 +488,8 @@ static int load_flat_file(struct linux_binprm *bprm,
>>>    	 * fix up the flags for the older format,  there were all kinds
>>>    	 * of endian hacks,  this only works for the simple cases
>>>    	 */
>>> -	if (rev == OLD_FLAT_VERSION && flat_old_ram_flag(flags))
>>> +	if (IS_ENABLED(CONFIG_BINFMT_FLAT_OLD_ALWAYS_RAM) &&
>>> +	    rev == OLD_FLAT_VERSION)
>>
>> The flags are from the binary file header here, so this is going to lose
>> that check for most platforms (except h8300 where it would always have
>> been true).
> 
> Indeed.  The old code is:
> 
> 	if (rev == OLD_FLAT_VERSION && flat_old_ram_flag(flags))
> 		flags = FLAT_FLAG_RAM;
> 
> which for !h8300 evaluates to:
> 
> 	if (rev == OLD_FLAT_VERSION && flags)
> 		flags = FLAT_FLAG_RAM;
> 
> so basically if any flag was set it was turned into FLAT_FLAG_RAM.
> Was that really intentional?

Probably not, looking at the flags. For the compressed flag it
makes some sense. But I don't think many of the others need load
to RAM behavior.


>  I guess even if it wasn't the is no
> point in changing this historic behavior now.
> 
> So I guess what we could do it something like:
> 
> 	if (rev == OLD_FLAT_VERSION &&
> 	    (flags || IS_ENABLED(CONFIG_BINFMT_FLAT_OLD_ALWAYS_RAM)))
> 		flags = FLAT_FLAG_RAM;

Yeah, that to looks to preserve the old behavior.

Regards
Greg


^ permalink raw reply	[flat|nested] 38+ messages in thread

end of thread, other threads:[~2019-06-11 13:07 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-10 21:20 binfmt_flat cleanups and RISC-V support Christoph Hellwig
2019-06-10 21:20 ` [PATCH 01/15] binfmt_flat: remove flat_reloc_valid Christoph Hellwig
2019-06-11  9:44   ` Vladimir Murzin
2019-06-10 21:20 ` [PATCH 02/15] binfmt_flat: remove flat_set_persistent Christoph Hellwig
2019-06-11  9:45   ` Vladimir Murzin
2019-06-10 21:20 ` [PATCH 03/15] binfmt_flat: provide a default version of flat_get_relocate_addr Christoph Hellwig
2019-06-11  9:46   ` Vladimir Murzin
2019-06-10 21:20 ` [PATCH 04/15] binfmt_flat: remove flat_old_ram_flag Christoph Hellwig
2019-06-11  6:04   ` Greg Ungerer
2019-06-11  7:36     ` Christoph Hellwig
2019-06-11 13:07       ` Greg Ungerer
2019-06-11  9:47   ` Vladimir Murzin
2019-06-10 21:20 ` [PATCH 05/15] binfmt_flat: replace flat_argvp_envp_on_stack with a Kconfig variable Christoph Hellwig
2019-06-11  9:49   ` Vladimir Murzin
2019-06-10 21:20 ` [PATCH 06/15] binfmt_flat: remove the uapi <linux/flat.h> header Christoph Hellwig
2019-06-11  9:51   ` Vladimir Murzin
2019-06-10 21:20 ` [PATCH 07/15] binfmt_flat: use __be32 for the on-disk format Christoph Hellwig
2019-06-11  8:25   ` Geert Uytterhoeven
2019-06-11  9:57   ` Vladimir Murzin
2019-06-10 21:20 ` [PATCH 08/15] binfmt_flat: add endianess annotations Christoph Hellwig
2019-06-11  9:58   ` Vladimir Murzin
2019-06-10 21:20 ` [PATCH 09/15] binfmt_flat: add a ARCH_HAS_BINFMT_FLAT option Christoph Hellwig
2019-06-11  9:59   ` Vladimir Murzin
2019-06-10 21:20 ` [PATCH 10/15] binfmt_flat: make support for old format binaries optional Christoph Hellwig
2019-06-10 21:20 ` [PATCH 11/15] binfmt_flat: provide an asm-generic/flat.h Christoph Hellwig
2019-06-11 10:01   ` Vladimir Murzin
2019-06-10 21:20 ` [PATCH 12/15] binfmt_flat: remove the persistent argument from flat_get_addr_from_rp Christoph Hellwig
2019-06-10 21:20 ` [PATCH 13/15] binfmt_flat: move the MAX_SHARED_LIBS definition to binfmt_flat.c Christoph Hellwig
2019-06-10 21:20 ` [PATCH 14/15] binfmt_flat: don't offset the data start Christoph Hellwig
2019-06-10 21:20 ` [PATCH 15/15] riscv: add binfmt_flat support Christoph Hellwig
2019-06-11  8:16   ` Vladimir Murzin
2019-06-11  9:20     ` Christoph Hellwig
2019-06-11  6:51 ` binfmt_flat cleanups and RISC-V support Greg Ungerer
2019-06-11  7:38   ` Christoph Hellwig
2019-06-11 13:02     ` Greg Ungerer
2019-06-11  8:05 ` Vladimir Murzin
2019-06-11  8:11   ` Christoph Hellwig
2019-06-11 10:08     ` Vladimir Murzin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).