diff options
author | Christoph Hellwig <hch@lst.de> | 2019-06-13 03:08:55 -0400 |
---|---|---|
committer | Greg Ungerer <gerg@kernel.org> | 2019-06-23 19:16:47 -0400 |
commit | 34b4664ac4824d6c7a8b29db24b18733df07b2f4 (patch) | |
tree | b94e0eccb77f806991a97477d09f30ff2ba91b1b /include/linux/flat.h | |
parent | 3f8b76a66e0d49e3afaba595b9762c126448e783 (diff) |
binfmt_flat: use fixed size type for the on-disk format
So far binfmt_flat has only 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 byte swapped when loaded.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Vladimir Murzin <vladimir.murzin@arm.com>
Signed-off-by: Greg Ungerer <gerg@linux-m68k.org>
Diffstat (limited to 'include/linux/flat.h')
-rw-r--r-- | include/linux/flat.h | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/include/linux/flat.h b/include/linux/flat.h index 19c586b74b99..d586bb6e64a7 100644 --- a/include/linux/flat.h +++ b/include/linux/flat.h | |||
@@ -24,26 +24,26 @@ | |||
24 | */ | 24 | */ |
25 | 25 | ||
26 | struct flat_hdr { | 26 | struct flat_hdr { |
27 | char magic[4]; | 27 | char magic[4]; |
28 | unsigned long rev; /* version (as above) */ | 28 | __be32 rev; /* version (as above) */ |
29 | unsigned long entry; /* Offset of first executable instruction | 29 | __be32 entry; /* Offset of first executable instruction |
30 | with text segment from beginning of file */ | 30 | with text segment from beginning of file */ |
31 | unsigned long data_start; /* Offset of data segment from beginning of | 31 | __be32 data_start; /* Offset of data segment from beginning of |
32 | file */ | 32 | file */ |
33 | unsigned long data_end; /* Offset of end of data segment | 33 | __be32 data_end; /* Offset of end of data segment from beginning |
34 | from beginning of file */ | 34 | of file */ |
35 | unsigned long bss_end; /* Offset of end of bss segment from beginning | 35 | __be32 bss_end; /* Offset of end of bss segment from beginning |
36 | of file */ | 36 | of file */ |
37 | 37 | ||
38 | /* (It is assumed that data_end through bss_end forms the bss segment.) */ | 38 | /* (It is assumed that data_end through bss_end forms the bss segment.) */ |
39 | 39 | ||
40 | unsigned long stack_size; /* Size of stack, in bytes */ | 40 | __be32 stack_size; /* Size of stack, in bytes */ |
41 | unsigned long reloc_start; /* Offset of relocation records from | 41 | __be32 reloc_start; /* Offset of relocation records from beginning of |
42 | beginning of file */ | 42 | file */ |
43 | unsigned long reloc_count; /* Number of relocation records */ | 43 | __be32 reloc_count; /* Number of relocation records */ |
44 | unsigned long flags; | 44 | __be32 flags; |
45 | unsigned long build_date; /* When the program/library was built */ | 45 | __be32 build_date; /* When the program/library was built */ |
46 | unsigned long filler[5]; /* Reservered, set to zero */ | 46 | __u32 filler[5]; /* Reservered, set to zero */ |
47 | }; | 47 | }; |
48 | 48 | ||
49 | #define FLAT_FLAG_RAM 0x0001 /* load program entirely into RAM */ | 49 | #define FLAT_FLAG_RAM 0x0001 /* load program entirely into RAM */ |
@@ -67,15 +67,15 @@ struct flat_hdr { | |||
67 | #define OLD_FLAT_RELOC_TYPE_BSS 2 | 67 | #define OLD_FLAT_RELOC_TYPE_BSS 2 |
68 | 68 | ||
69 | typedef union { | 69 | typedef union { |
70 | unsigned long value; | 70 | u32 value; |
71 | struct { | 71 | struct { |
72 | #if defined(__LITTLE_ENDIAN_BITFIELD) || \ | 72 | #if defined(__LITTLE_ENDIAN_BITFIELD) || \ |
73 | (defined(mc68000) && !defined(CONFIG_COLDFIRE)) | 73 | (defined(mc68000) && !defined(CONFIG_COLDFIRE)) |
74 | signed long offset : 30; | 74 | s32 offset : 30; |
75 | unsigned long type : 2; | 75 | u32 type : 2; |
76 | # elif defined(__BIG_ENDIAN_BITFIELD) | 76 | # elif defined(__BIG_ENDIAN_BITFIELD) |
77 | unsigned long type : 2; | 77 | u32 type : 2; |
78 | signed long offset : 30; | 78 | s32 offset : 30; |
79 | # else | 79 | # else |
80 | # error "Unknown bitfield order for flat files." | 80 | # error "Unknown bitfield order for flat files." |
81 | # endif | 81 | # endif |