[U-Boot] [PATCH v2 6/6] riscv: efi: Generate Microsoft PE format compliant images
Bin Meng
bmeng.cn at gmail.com
Wed Oct 3 00:05:55 UTC 2018
Hi Heinrich,
On Wed, Oct 3, 2018 at 2:19 AM Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>
> On 10/02/2018 04:39 PM, Bin Meng wrote:
> > Per Microsoft PE Format documentation [1], PointerToSymbolTable and
> > NumberOfSymbols should be zero for an image in the COFF file header.
> > Currently the COFF file header is hardcoded on RISC-V and these two
> > members are not zero.
> >
> > This updates the hardcoded structure to clear these two members, as
> > well as setting the flag IMAGE_FILE_LOCAL_SYMS_STRIPPED so that we
> > can generate compliant *.efi images.
> >
> > [1] https://docs.microsoft.com/zh-cn/windows/desktop/Debug/pe-format
> >
> > Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
> >
> > ---
> >
> > Changes in v2:
> > - use macros in pe.h for the characteristics field
> >
> > arch/riscv/lib/crt0_riscv_efi.S | 12 ++++++------
> > 1 file changed, 6 insertions(+), 6 deletions(-)
> >
> > diff --git a/arch/riscv/lib/crt0_riscv_efi.S b/arch/riscv/lib/crt0_riscv_efi.S
> > index 18f61f5..b7b5329 100644
> > --- a/arch/riscv/lib/crt0_riscv_efi.S
> > +++ b/arch/riscv/lib/crt0_riscv_efi.S
> > @@ -41,13 +41,13 @@ coff_header:
> > .short 2 /* nr_sections */
> > .long 0 /* TimeDateStamp */
> > .long 0 /* PointerToSymbolTable */
> > - .long 1 /* NumberOfSymbols */
> > + .long 0 /* NumberOfSymbols */
>
> Looking at the top of the file it is meant both for 32bit and for 64bit
> systems:
>
> #if __riscv_xlen == 64
> #define SIZE_LONG 8
> #define SAVE_LONG(reg, idx) sd reg, (idx*SIZE_LONG)(sp)
> #define LOAD_LONG(reg, idx) ld reg, (idx*SIZE_LONG)(sp)
> #define PE_MACHINE 0x5064
> #else
> #define SIZE_LONG 4
> #define SAVE_LONG(reg, idx) sw reg, (idx*SIZE_LONG)(sp)
> #define LOAD_LONG(reg, idx) lw reg, (idx*SIZE_LONG)(sp)
> #define PE_MACHINE 0x5032
> #endif
>
> But for 32bit and 64bit we cannot use the same values of characteristics
> and we need different optional header formats.
>
> For the ARM and the x86 architecture this has resulted in separate files
> crt0*.S - one for 32bit, the other for 64bit.
>
> Shouldn't we go the same way for RISC-V?
>
You observation is correct. We should use separate files to support
32-bit and 64-bit.
> > .short section_table - optional_header /* SizeOfOptionalHeader */
> > - /*
> > - * Characteristics: IMAGE_FILE_DEBUG_STRIPPED |
> > - * IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_LINE_NUMS_STRIPPED
> > - */
> > - .short 0x206
> > + /* Characteristics */
> > + .short (IMAGE_FILE_EXECUTABLE_IMAGE | \
> > + IMAGE_FILE_LINE_NUMS_STRIPPED | \
> > + IMAGE_FILE_LOCAL_SYMS_STRIPPED | \
> > + IMAGE_FILE_DEBUG_STRIPPED)
>
> These values suit 64bit only.
>
> As currently we only have a defconfig for a 64bit system -
> ax25-ae350_defconfig - let's merge this patch.
>
> @Bin:
> Your "riscv: Add QEMU virt board support" patch series adds a 32bit
> board. Please, consider adding a separate 32bit crt0*.S there.
>
Sure, will do it in coming patches.
> Reviewed-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>
> > optional_header:
> > .short 0x20b /* PE32+ format */
> > .byte 0x02 /* MajorLinkerVersion */
> >
Regards,
Bin
More information about the U-Boot
mailing list