diff mbox series

riscv: Fix efi header for RV32

Message ID 20201013192331.3236458-1-atish.patra@wdc.com
State Accepted
Delegated to: Andes
Headers show
Series riscv: Fix efi header for RV32 | expand

Commit Message

Atish Patra Oct. 13, 2020, 7:23 p.m. UTC
RV32 should use PE32 format instead of PE32+ as the efi header format.
This requires following changes
1. A different header magic value
2. An additional parameter known as BaseOfData. Currently, it is set to
   zero in absence of any usage.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
---
 arch/riscv/lib/crt0_riscv_efi.S | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Bin Meng Oct. 14, 2020, 1:03 a.m. UTC | #1
On Wed, Oct 14, 2020 at 3:23 AM Atish Patra <atish.patra@wdc.com> wrote:
>
> RV32 should use PE32 format instead of PE32+ as the efi header format.
> This requires following changes
> 1. A different header magic value
> 2. An additional parameter known as BaseOfData. Currently, it is set to
>    zero in absence of any usage.
>
> Signed-off-by: Atish Patra <atish.patra@wdc.com>
> ---
>  arch/riscv/lib/crt0_riscv_efi.S | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/arch/riscv/lib/crt0_riscv_efi.S b/arch/riscv/lib/crt0_riscv_efi.S
> index 87fe1e56f906..4aaa49ad0777 100644
> --- a/arch/riscv/lib/crt0_riscv_efi.S
> +++ b/arch/riscv/lib/crt0_riscv_efi.S
> @@ -15,11 +15,13 @@
>  #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     IMAGE_FILE_MACHINE_RISCV64
> +#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR64_MAGIC

nits: the indentation seems to be incorrect

>  #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     IMAGE_FILE_MACHINE_RISCV32
> +#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR32_MAGIC
>  #endif
>
>
> @@ -48,7 +50,7 @@ coff_header:
>                  IMAGE_FILE_LOCAL_SYMS_STRIPPED | \
>                  IMAGE_FILE_DEBUG_STRIPPED)
>  optional_header:
> -       .short  IMAGE_NT_OPTIONAL_HDR64_MAGIC   /* PE32+ format */

nits: PE32(+) ?

> +       .short  PE_MAGIC                        /* PE32+ format */
>         .byte   0x02                            /* MajorLinkerVersion */
>         .byte   0x14                            /* MinorLinkerVersion */
>         .long   _edata - _start                 /* SizeOfCode */
> @@ -56,6 +58,9 @@ optional_header:
>         .long   0                               /* SizeOfUninitializedData */
>         .long   _start - ImageBase              /* AddressOfEntryPoint */
>         .long   _start - ImageBase              /* BaseOfCode */
> +#if __riscv_xlen == 32
> +       .long   0                               /* BaseOfData */
> +#endif
>
>  extra_header_fields:
>         .quad   0                               /* ImageBase */

Looks good otherwise
Reviewed-by: Bin Meng <bin.meng@windriver.com>
Heinrich Schuchardt Oct. 14, 2020, 1:16 a.m. UTC | #2
Am 14. Oktober 2020 03:03:28 MESZ schrieb Bin Meng <bmeng.cn@gmail.com>:
>On Wed, Oct 14, 2020 at 3:23 AM Atish Patra <atish.patra@wdc.com>
>wrote:
>>
>> RV32 should use PE32 format instead of PE32+ as the efi header
>format.
>> This requires following changes
>> 1. A different header magic value
>> 2. An additional parameter known as BaseOfData. Currently, it is set
>to
>>    zero in absence of any usage.
>>
>> Signed-off-by: Atish Patra <atish.patra@wdc.com>
>> ---
>>  arch/riscv/lib/crt0_riscv_efi.S | 7 ++++++-
>>  1 file changed, 6 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/riscv/lib/crt0_riscv_efi.S
>b/arch/riscv/lib/crt0_riscv_efi.S
>> index 87fe1e56f906..4aaa49ad0777 100644
>> --- a/arch/riscv/lib/crt0_riscv_efi.S
>> +++ b/arch/riscv/lib/crt0_riscv_efi.S
>> @@ -15,11 +15,13 @@
>>  #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     IMAGE_FILE_MACHINE_RISCV64
>> +#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR64_MAGIC
>
>nits: the indentation seems to be incorrect
>
>>  #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     IMAGE_FILE_MACHINE_RISCV32
>> +#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR32_MAGIC
>>  #endif
>>
>>
>> @@ -48,7 +50,7 @@ coff_header:
>>                  IMAGE_FILE_LOCAL_SYMS_STRIPPED | \
>>                  IMAGE_FILE_DEBUG_STRIPPED)
>>  optional_header:
>> -       .short  IMAGE_NT_OPTIONAL_HDR64_MAGIC   /* PE32+ format */
>
>nits: PE32(+) ?
>
>> +       .short  PE_MAGIC                        /* PE32+ format */
>>         .byte   0x02                            /* MajorLinkerVersion
>*/
>>         .byte   0x14                            /* MinorLinkerVersion
>*/
>>         .long   _edata - _start                 /* SizeOfCode */
>> @@ -56,6 +58,9 @@ optional_header:
>>         .long   0                               /*
>SizeOfUninitializedData */
>>         .long   _start - ImageBase              /*
>AddressOfEntryPoint */
>>         .long   _start - ImageBase              /* BaseOfCode */
>> +#if __riscv_xlen == 32
>> +       .long   0                               /* BaseOfData */
>> +#endif
>>

The PE32 header has to be 96 bytes long, the PE32+ header 112 bytes long.

See https://docs.microsoft.com/en-us/windows/win32/debug/pe-format

Best regards

Heinrich


>>  extra_header_fields:
>>         .quad   0                               /* ImageBase */
>
>Looks good otherwise
>Reviewed-by: Bin Meng <bin.meng@windriver.com>
Rick Chen Nov. 4, 2020, 1:49 a.m. UTC | #3
Hi Atish

> From: U-Boot [mailto:u-boot-bounces@lists.denx.de] On Behalf Of Heinrich Schuchardt
> Sent: Wednesday, October 14, 2020 9:16 AM
> To: Bin Meng; Atish Patra
> Cc: U-Boot Mailing List; Anup Patel; Jagan Teki; Marek Vasut; Simon Goldschmidt; David Abdurachmanov; Tom Rini
> Subject: Re: [PATCH] riscv: Fix efi header for RV32
>
> Am 14. Oktober 2020 03:03:28 MESZ schrieb Bin Meng <bmeng.cn@gmail.com>:
> >On Wed, Oct 14, 2020 at 3:23 AM Atish Patra <atish.patra@wdc.com>
> >wrote:
> >>
> >> RV32 should use PE32 format instead of PE32+ as the efi header
> >format.
> >> This requires following changes
> >> 1. A different header magic value
> >> 2. An additional parameter known as BaseOfData. Currently, it is set
> >to
> >>    zero in absence of any usage.
> >>
> >> Signed-off-by: Atish Patra <atish.patra@wdc.com>
> >> ---
> >>  arch/riscv/lib/crt0_riscv_efi.S | 7 ++++++-
> >>  1 file changed, 6 insertions(+), 1 deletion(-)
> >>

Reviewed-by: Rick Chen <rick@andestech.com>

> >> diff --git a/arch/riscv/lib/crt0_riscv_efi.S
> >b/arch/riscv/lib/crt0_riscv_efi.S
> >> index 87fe1e56f906..4aaa49ad0777 100644
> >> --- a/arch/riscv/lib/crt0_riscv_efi.S
> >> +++ b/arch/riscv/lib/crt0_riscv_efi.S
> >> @@ -15,11 +15,13 @@
> >>  #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     IMAGE_FILE_MACHINE_RISCV64
> >> +#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR64_MAGIC
> >
> >nits: the indentation seems to be incorrect
> >
> >>  #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     IMAGE_FILE_MACHINE_RISCV32
> >> +#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR32_MAGIC
> >>  #endif
> >>
> >>
> >> @@ -48,7 +50,7 @@ coff_header:
> >>                  IMAGE_FILE_LOCAL_SYMS_STRIPPED | \
> >>                  IMAGE_FILE_DEBUG_STRIPPED)
> >>  optional_header:
> >> -       .short  IMAGE_NT_OPTIONAL_HDR64_MAGIC   /* PE32+ format */
> >
> >nits: PE32(+) ?
> >
> >> +       .short  PE_MAGIC                        /* PE32+ format */
> >>         .byte   0x02                            /* MajorLinkerVersion
> >*/
> >>         .byte   0x14                            /* MinorLinkerVersion
> >*/
> >>         .long   _edata - _start                 /* SizeOfCode */
> >> @@ -56,6 +58,9 @@ optional_header:
> >>         .long   0                               /*
> >SizeOfUninitializedData */
> >>         .long   _start - ImageBase              /*
> >AddressOfEntryPoint */
> >>         .long   _start - ImageBase              /* BaseOfCode */
> >> +#if __riscv_xlen == 32
> >> +       .long   0                               /* BaseOfData */
> >> +#endif
> >>
>
> The PE32 header has to be 96 bytes long, the PE32+ header 112 bytes long.
>
> See https://docs.microsoft.com/en-us/windows/win32/debug/pe-format
>

Do you have any comments ?

The other headers seem for Windows-Specific Fields. If no other
comments furthermore.
I will pull it into riscv tree later.

Thanks,
Rick

> Best regards
>
> Heinrich
>
>
> >>  extra_header_fields:
> >>         .quad   0                               /* ImageBase */
> >
> >Looks good otherwise
> >Reviewed-by: Bin Meng <bin.meng@windriver.com>
Leo Liang Nov. 11, 2020, 8:25 a.m. UTC | #4
Hi Atish and Heinrich,

On Tue, Oct 13, 2020 at 12:23:31PM -0700, Atish Patra wrote:
> RV32 should use PE32 format instead of PE32+ as the efi header format.
> This requires following changes
> 1. A different header magic value
> 2. An additional parameter known as BaseOfData. Currently, it is set to
>    zero in absence of any usage.
> 
> Signed-off-by: Atish Patra <atish.patra@wdc.com>
> Reviewed-by: Bin Meng <bin.meng@windriver.com>
> Reviewed-by: Rick Chen <rick@andestech.com>
> ---
>  arch/riscv/lib/crt0_riscv_efi.S | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/riscv/lib/crt0_riscv_efi.S b/arch/riscv/lib/crt0_riscv_efi.S
> index 87fe1e56f906..4aaa49ad0777 100644
> --- a/arch/riscv/lib/crt0_riscv_efi.S
> +++ b/arch/riscv/lib/crt0_riscv_efi.S
> @@ -15,11 +15,13 @@
>  #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	IMAGE_FILE_MACHINE_RISCV64
> +#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR64_MAGIC
>  #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	IMAGE_FILE_MACHINE_RISCV32
> +#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR32_MAGIC
>  #endif
>  
>  
> @@ -48,7 +50,7 @@ coff_header:
>  		 IMAGE_FILE_LOCAL_SYMS_STRIPPED | \
>  		 IMAGE_FILE_DEBUG_STRIPPED)
>  optional_header:
> -	.short	IMAGE_NT_OPTIONAL_HDR64_MAGIC	/* PE32+ format */
> +	.short	PE_MAGIC			/* PE32+ format */
>  	.byte	0x02				/* MajorLinkerVersion */
>  	.byte	0x14				/* MinorLinkerVersion */
>  	.long	_edata - _start			/* SizeOfCode */
> @@ -56,6 +58,9 @@ optional_header:
>  	.long	0				/* SizeOfUninitializedData */
>  	.long	_start - ImageBase		/* AddressOfEntryPoint */
>  	.long	_start - ImageBase		/* BaseOfCode */
> +#if __riscv_xlen == 32
> +	.long	0				/* BaseOfData */
> +#endif
>  
>  extra_header_fields:
>  	.quad	0				/* ImageBase */

diff --git a/arch/riscv/lib/crt0_riscv_efi.S b/arch/riscv/lib/crt0_riscv_efi.S
index 4aaa49ad07..f47c4a6d82 100644
--- a/arch/riscv/lib/crt0_riscv_efi.S
+++ b/arch/riscv/lib/crt0_riscv_efi.S
@@ -63,7 +63,11 @@ optional_header:
 #endif

 extra_header_fields:
+#if __riscv_xlen == 32
+       .long   0                               /* ImageBase */
+#else if
        .quad   0                               /* ImageBase */
+#endif
        .long   0x20                            /* SectionAlignment */
        .long   0x8                             /* FileAlignment */
        .short  0                               /* MajorOperatingSystemVersion */
@@ -83,10 +87,17 @@ extra_header_fields:
        .long   0                               /* CheckSum */
        .short  IMAGE_SUBSYSTEM_EFI_APPLICATION /* Subsystem */
        .short  0                               /* DllCharacteristics */
+#if __riscv_xlen == 32
+       .long   0                               /* SizeOfStackReserve */
+       .long   0                               /* SizeOfStackCommit */
+       .long   0                               /* SizeOfHeapReserve */
+       .long   0                               /* SizeOfHeapCommit */
+#else if
        .quad   0                               /* SizeOfStackReserve */
        .quad   0                               /* SizeOfStackCommit */
        .quad   0                               /* SizeOfHeapReserve */
        .quad   0                               /* SizeOfHeapCommit */
+#endif
        .long   0                               /* LoaderFlags */
        .long   0x6                             /* NumberOfRvaAndSizes */

Based on Atish's patch, 
would the above modification fit more closely to the specification that Heinrich provided ?

Best regards,
Leo
Leo Liang Nov. 12, 2020, 2:46 a.m. UTC | #5
On Wed, Nov 11, 2020 at 04:25:53PM +0800, Leo Liang wrote:
> Hi Atish and Heinrich,
> 
> On Tue, Oct 13, 2020 at 12:23:31PM -0700, Atish Patra wrote:
> > RV32 should use PE32 format instead of PE32+ as the efi header format.
> > This requires following changes
> > 1. A different header magic value
> > 2. An additional parameter known as BaseOfData. Currently, it is set to
> >    zero in absence of any usage.
> > 
> > Signed-off-by: Atish Patra <atish.patra@wdc.com>
> > Reviewed-by: Bin Meng <bin.meng@windriver.com>
> > Reviewed-by: Rick Chen <rick@andestech.com>
> > ---
> >  arch/riscv/lib/crt0_riscv_efi.S | 7 ++++++-
> >  1 file changed, 6 insertions(+), 1 deletion(-)
> > 
> > diff --git a/arch/riscv/lib/crt0_riscv_efi.S b/arch/riscv/lib/crt0_riscv_efi.S
> > index 87fe1e56f906..4aaa49ad0777 100644
> > --- a/arch/riscv/lib/crt0_riscv_efi.S
> > +++ b/arch/riscv/lib/crt0_riscv_efi.S
> > @@ -15,11 +15,13 @@
> >  #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	IMAGE_FILE_MACHINE_RISCV64
> > +#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR64_MAGIC
> >  #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	IMAGE_FILE_MACHINE_RISCV32
> > +#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR32_MAGIC
> >  #endif
> >  
> >  
> > @@ -48,7 +50,7 @@ coff_header:
> >  		 IMAGE_FILE_LOCAL_SYMS_STRIPPED | \
> >  		 IMAGE_FILE_DEBUG_STRIPPED)
> >  optional_header:
> > -	.short	IMAGE_NT_OPTIONAL_HDR64_MAGIC	/* PE32+ format */
> > +	.short	PE_MAGIC			/* PE32+ format */
> >  	.byte	0x02				/* MajorLinkerVersion */
> >  	.byte	0x14				/* MinorLinkerVersion */
> >  	.long	_edata - _start			/* SizeOfCode */
> > @@ -56,6 +58,9 @@ optional_header:
> >  	.long	0				/* SizeOfUninitializedData */
> >  	.long	_start - ImageBase		/* AddressOfEntryPoint */
> >  	.long	_start - ImageBase		/* BaseOfCode */
> > +#if __riscv_xlen == 32
> > +	.long	0				/* BaseOfData */
> > +#endif
> >  
> >  extra_header_fields:
> >  	.quad	0				/* ImageBase */
> 
> diff --git a/arch/riscv/lib/crt0_riscv_efi.S b/arch/riscv/lib/crt0_riscv_efi.S
> index 4aaa49ad07..f47c4a6d82 100644
> --- a/arch/riscv/lib/crt0_riscv_efi.S
> +++ b/arch/riscv/lib/crt0_riscv_efi.S
> @@ -63,7 +63,11 @@ optional_header:
>  #endif
> 
>  extra_header_fields:
> +#if __riscv_xlen == 32
> +       .long   0                               /* ImageBase */
> +#else if
>         .quad   0                               /* ImageBase */
> +#endif
>         .long   0x20                            /* SectionAlignment */
>         .long   0x8                             /* FileAlignment */
>         .short  0                               /* MajorOperatingSystemVersion */
> @@ -83,10 +87,17 @@ extra_header_fields:
>         .long   0                               /* CheckSum */
>         .short  IMAGE_SUBSYSTEM_EFI_APPLICATION /* Subsystem */
>         .short  0                               /* DllCharacteristics */
> +#if __riscv_xlen == 32
> +       .long   0                               /* SizeOfStackReserve */
> +       .long   0                               /* SizeOfStackCommit */
> +       .long   0                               /* SizeOfHeapReserve */
> +       .long   0                               /* SizeOfHeapCommit */
> +#else if
>         .quad   0                               /* SizeOfStackReserve */
>         .quad   0                               /* SizeOfStackCommit */
>         .quad   0                               /* SizeOfHeapReserve */
>         .quad   0                               /* SizeOfHeapCommit */
> +#endif
>         .long   0                               /* LoaderFlags */
>         .long   0x6                             /* NumberOfRvaAndSizes */
> 
> Based on Atish's patch, 
> would the above modification fit more closely to the specification that Heinrich provided ?
> 
> Best regards,
> Leo

Sending a new patch seems more reasonable.
I will send a new patch later based on this patch.

Best regards,
Leo
Atish Patra Nov. 12, 2020, 8:09 a.m. UTC | #6
On Wed, Nov 11, 2020 at 12:26 AM Leo Liang <ycliang@andestech.com> wrote:
>
> Hi Atish and Heinrich,
>
> On Tue, Oct 13, 2020 at 12:23:31PM -0700, Atish Patra wrote:
> > RV32 should use PE32 format instead of PE32+ as the efi header format.
> > This requires following changes
> > 1. A different header magic value
> > 2. An additional parameter known as BaseOfData. Currently, it is set to
> >    zero in absence of any usage.
> >
> > Signed-off-by: Atish Patra <atish.patra@wdc.com>
> > Reviewed-by: Bin Meng <bin.meng@windriver.com>
> > Reviewed-by: Rick Chen <rick@andestech.com>
> > ---
> >  arch/riscv/lib/crt0_riscv_efi.S | 7 ++++++-
> >  1 file changed, 6 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/riscv/lib/crt0_riscv_efi.S b/arch/riscv/lib/crt0_riscv_efi.S
> > index 87fe1e56f906..4aaa49ad0777 100644
> > --- a/arch/riscv/lib/crt0_riscv_efi.S
> > +++ b/arch/riscv/lib/crt0_riscv_efi.S
> > @@ -15,11 +15,13 @@
> >  #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   IMAGE_FILE_MACHINE_RISCV64
> > +#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR64_MAGIC
> >  #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   IMAGE_FILE_MACHINE_RISCV32
> > +#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR32_MAGIC
> >  #endif
> >
> >
> > @@ -48,7 +50,7 @@ coff_header:
> >                IMAGE_FILE_LOCAL_SYMS_STRIPPED | \
> >                IMAGE_FILE_DEBUG_STRIPPED)
> >  optional_header:
> > -     .short  IMAGE_NT_OPTIONAL_HDR64_MAGIC   /* PE32+ format */
> > +     .short  PE_MAGIC                        /* PE32+ format */
> >       .byte   0x02                            /* MajorLinkerVersion */
> >       .byte   0x14                            /* MinorLinkerVersion */
> >       .long   _edata - _start                 /* SizeOfCode */
> > @@ -56,6 +58,9 @@ optional_header:
> >       .long   0                               /* SizeOfUninitializedData */
> >       .long   _start - ImageBase              /* AddressOfEntryPoint */
> >       .long   _start - ImageBase              /* BaseOfCode */
> > +#if __riscv_xlen == 32
> > +     .long   0                               /* BaseOfData */
> > +#endif
> >
> >  extra_header_fields:
> >       .quad   0                               /* ImageBase */
>
> diff --git a/arch/riscv/lib/crt0_riscv_efi.S b/arch/riscv/lib/crt0_riscv_efi.S
> index 4aaa49ad07..f47c4a6d82 100644
> --- a/arch/riscv/lib/crt0_riscv_efi.S
> +++ b/arch/riscv/lib/crt0_riscv_efi.S
> @@ -63,7 +63,11 @@ optional_header:
>  #endif
>
>  extra_header_fields:
> +#if __riscv_xlen == 32
> +       .long   0                               /* ImageBase */
> +#else if
>         .quad   0                               /* ImageBase */
> +#endif
>         .long   0x20                            /* SectionAlignment */
>         .long   0x8                             /* FileAlignment */
>         .short  0                               /* MajorOperatingSystemVersion */
> @@ -83,10 +87,17 @@ extra_header_fields:
>         .long   0                               /* CheckSum */
>         .short  IMAGE_SUBSYSTEM_EFI_APPLICATION /* Subsystem */
>         .short  0                               /* DllCharacteristics */
> +#if __riscv_xlen == 32
> +       .long   0                               /* SizeOfStackReserve */
> +       .long   0                               /* SizeOfStackCommit */
> +       .long   0                               /* SizeOfHeapReserve */
> +       .long   0                               /* SizeOfHeapCommit */
> +#else if
>         .quad   0                               /* SizeOfStackReserve */
>         .quad   0                               /* SizeOfStackCommit */
>         .quad   0                               /* SizeOfHeapReserve */
>         .quad   0                               /* SizeOfHeapCommit */
> +#endif
>         .long   0                               /* LoaderFlags */
>         .long   0x6                             /* NumberOfRvaAndSizes */
>

Sorry for not responding to this thread earlier. It went to a
different filter due to a filtering mistake.

> Based on Atish's patch,
> would the above modification fit more closely to the specification that Heinrich provided ?
>

The above changes look good to me and matches the PE32 spec. Thanks for the fix.

> Best regards,
> Leo
diff mbox series

Patch

diff --git a/arch/riscv/lib/crt0_riscv_efi.S b/arch/riscv/lib/crt0_riscv_efi.S
index 87fe1e56f906..4aaa49ad0777 100644
--- a/arch/riscv/lib/crt0_riscv_efi.S
+++ b/arch/riscv/lib/crt0_riscv_efi.S
@@ -15,11 +15,13 @@ 
 #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	IMAGE_FILE_MACHINE_RISCV64
+#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR64_MAGIC
 #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	IMAGE_FILE_MACHINE_RISCV32
+#define PE_MAGIC        IMAGE_NT_OPTIONAL_HDR32_MAGIC
 #endif
 
 
@@ -48,7 +50,7 @@  coff_header:
 		 IMAGE_FILE_LOCAL_SYMS_STRIPPED | \
 		 IMAGE_FILE_DEBUG_STRIPPED)
 optional_header:
-	.short	IMAGE_NT_OPTIONAL_HDR64_MAGIC	/* PE32+ format */
+	.short	PE_MAGIC			/* PE32+ format */
 	.byte	0x02				/* MajorLinkerVersion */
 	.byte	0x14				/* MinorLinkerVersion */
 	.long	_edata - _start			/* SizeOfCode */
@@ -56,6 +58,9 @@  optional_header:
 	.long	0				/* SizeOfUninitializedData */
 	.long	_start - ImageBase		/* AddressOfEntryPoint */
 	.long	_start - ImageBase		/* BaseOfCode */
+#if __riscv_xlen == 32
+	.long	0				/* BaseOfData */
+#endif
 
 extra_header_fields:
 	.quad	0				/* ImageBase */