riscv: Add support for HI20 PE relocations

Message ID 20180605172032.2150-1-agraf@suse.de
State Accepted
Commit de452c04c391948dbff68029e900fbb10dd5efb2
Headers show
Series
  • riscv: Add support for HI20 PE relocations
Related show

Commit Message

Alexander Graf June 5, 2018, 5:20 p.m.
The PE standard allows for HI20/LOW12 relocations. Within the efi_loader
target we always know that our relocation target is 4k aligned, so we
don't need to worry about the LOW12 part.

This patch adds support for the respective relocations. With this and a
few grub patches I have cooking in parallel I'm able to run grub on RISC-V.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 include/pe.h                      |  3 +++
 lib/efi_loader/efi_image_loader.c | 14 ++++++++++++++
 2 files changed, 17 insertions(+)

Comments

Rick Chen June 6, 2018, 9:15 a.m. | #1
> -----Original Message-----
> From: Alexander Graf [mailto:agraf@suse.de]
> Sent: Wednesday, June 06, 2018 1:21 AM
> To: u-boot@lists.denx.de
> Cc: Rick Jian-Zhi Chen(陳建志)
> Subject: [PATCH] riscv: Add support for HI20 PE relocations
>
> The PE standard allows for HI20/LOW12 relocations. Within the efi_loader target
> we always know that our relocation target is 4k aligned, so we don't need to
> worry about the LOW12 part.
>
> This patch adds support for the respective relocations. With this and a few grub
> patches I have cooking in parallel I'm able to run grub on RISC-V.
>
> Signed-off-by: Alexander Graf <agraf@suse.de>
> ---
>  include/pe.h                      |  3 +++
>  lib/efi_loader/efi_image_loader.c | 14 ++++++++++++++
>  2 files changed, 17 insertions(+)
>
> diff --git a/include/pe.h b/include/pe.h index d73eb142cb..36e1908b7e 100644
> --- a/include/pe.h
> +++ b/include/pe.h
> @@ -201,10 +201,13 @@ typedef struct _IMAGE_RELOCATION
>  #define IMAGE_REL_BASED_MIPS_JMPADDR            5
>  #define IMAGE_REL_BASED_ARM_MOV32A              5 /* yes, 5 too */
>  #define IMAGE_REL_BASED_ARM_MOV32               5 /* yes, 5 too */
> +#define IMAGE_REL_BASED_RISCV_HI20           5 /* yes, 5 too */
>  #define IMAGE_REL_BASED_SECTION                 6
>  #define IMAGE_REL_BASED_REL                     7
>  #define IMAGE_REL_BASED_ARM_MOV32T              7 /* yes, 7 too */
>  #define IMAGE_REL_BASED_THUMB_MOV32             7 /* yes, 7 too */
> +#define IMAGE_REL_BASED_RISCV_LOW12I         7 /* yes, 7 too */
> +#define IMAGE_REL_BASED_RISCV_LOW12S         8
>  #define IMAGE_REL_BASED_MIPS_JMPADDR16          9
>  #define IMAGE_REL_BASED_IA64_IMM64              9 /* yes, 9 too */
>  #define IMAGE_REL_BASED_DIR64                   10
> diff --git a/lib/efi_loader/efi_image_loader.c b/lib/efi_loader/efi_image_loader.c
> index 3cffe9ef46..6892171ccd 100644
> --- a/lib/efi_loader/efi_image_loader.c
> +++ b/lib/efi_loader/efi_image_loader.c
> @@ -126,6 +126,20 @@ static efi_status_t efi_loader_relocate(const
> IMAGE_BASE_RELOCATION *rel,
>                       case IMAGE_REL_BASED_DIR64:
>                               *x64 += (uint64_t)delta;
>                               break;
> +#ifdef __riscv
> +                     case IMAGE_REL_BASED_RISCV_HI20:
> +                             *x32 = ((*x32 & 0xfffff000) + (uint32_t)delta) |
> +                                     (*x32 & 0x00000fff);
> +                             break;
> +                     case IMAGE_REL_BASED_RISCV_LOW12I:
> +                     case IMAGE_REL_BASED_RISCV_LOW12S:
> +                             /* We know that we're 4k aligned */
> +                             if (delta & 0xfff) {
> +                                     printf("Unsupported reloc offset\n");
> +                                     return EFI_LOAD_ERROR;
> +                             }
> +                             break;
> +#endif
>                       default:
>                               printf("Unknown Relocation off %x type %x\n",
>                                      offset, type);
> --
> 2.12.3

Hi Alex

The title of this patch seems to be as" efi_loader: Add support for
HI20 PE relocations for RISC-V "
And I am not sure if it shall belong to efi tree.

Rick
Alexander Graf June 6, 2018, 9:18 a.m. | #2
On 06.06.18 11:15, Rick Chen wrote:
>> -----Original Message-----
>> From: Alexander Graf [mailto:agraf@suse.de]
>> Sent: Wednesday, June 06, 2018 1:21 AM
>> To: u-boot@lists.denx.de
>> Cc: Rick Jian-Zhi Chen(陳建志)
>> Subject: [PATCH] riscv: Add support for HI20 PE relocations
>>
>> The PE standard allows for HI20/LOW12 relocations. Within the efi_loader target
>> we always know that our relocation target is 4k aligned, so we don't need to
>> worry about the LOW12 part.
>>
>> This patch adds support for the respective relocations. With this and a few grub
>> patches I have cooking in parallel I'm able to run grub on RISC-V.
>>
>> Signed-off-by: Alexander Graf <agraf@suse.de>
>> ---
>>  include/pe.h                      |  3 +++
>>  lib/efi_loader/efi_image_loader.c | 14 ++++++++++++++
>>  2 files changed, 17 insertions(+)
>>
>> diff --git a/include/pe.h b/include/pe.h index d73eb142cb..36e1908b7e 100644
>> --- a/include/pe.h
>> +++ b/include/pe.h
>> @@ -201,10 +201,13 @@ typedef struct _IMAGE_RELOCATION
>>  #define IMAGE_REL_BASED_MIPS_JMPADDR            5
>>  #define IMAGE_REL_BASED_ARM_MOV32A              5 /* yes, 5 too */
>>  #define IMAGE_REL_BASED_ARM_MOV32               5 /* yes, 5 too */
>> +#define IMAGE_REL_BASED_RISCV_HI20           5 /* yes, 5 too */
>>  #define IMAGE_REL_BASED_SECTION                 6
>>  #define IMAGE_REL_BASED_REL                     7
>>  #define IMAGE_REL_BASED_ARM_MOV32T              7 /* yes, 7 too */
>>  #define IMAGE_REL_BASED_THUMB_MOV32             7 /* yes, 7 too */
>> +#define IMAGE_REL_BASED_RISCV_LOW12I         7 /* yes, 7 too */
>> +#define IMAGE_REL_BASED_RISCV_LOW12S         8
>>  #define IMAGE_REL_BASED_MIPS_JMPADDR16          9
>>  #define IMAGE_REL_BASED_IA64_IMM64              9 /* yes, 9 too */
>>  #define IMAGE_REL_BASED_DIR64                   10
>> diff --git a/lib/efi_loader/efi_image_loader.c b/lib/efi_loader/efi_image_loader.c
>> index 3cffe9ef46..6892171ccd 100644
>> --- a/lib/efi_loader/efi_image_loader.c
>> +++ b/lib/efi_loader/efi_image_loader.c
>> @@ -126,6 +126,20 @@ static efi_status_t efi_loader_relocate(const
>> IMAGE_BASE_RELOCATION *rel,
>>                       case IMAGE_REL_BASED_DIR64:
>>                               *x64 += (uint64_t)delta;
>>                               break;
>> +#ifdef __riscv
>> +                     case IMAGE_REL_BASED_RISCV_HI20:
>> +                             *x32 = ((*x32 & 0xfffff000) + (uint32_t)delta) |
>> +                                     (*x32 & 0x00000fff);
>> +                             break;
>> +                     case IMAGE_REL_BASED_RISCV_LOW12I:
>> +                     case IMAGE_REL_BASED_RISCV_LOW12S:
>> +                             /* We know that we're 4k aligned */
>> +                             if (delta & 0xfff) {
>> +                                     printf("Unsupported reloc offset\n");
>> +                                     return EFI_LOAD_ERROR;
>> +                             }
>> +                             break;
>> +#endif
>>                       default:
>>                               printf("Unknown Relocation off %x type %x\n",
>>                                      offset, type);
>> --
>> 2.12.3
> 
> Hi Alex
> 
> The title of this patch seems to be as" efi_loader: Add support for
> HI20 PE relocations for RISC-V "
> And I am not sure if it shall belong to efi tree.

I'll be happy to take it via the efi tree, yes. It only affects the efi
PE loader.


Alex
Rick Chen June 6, 2018, 9:30 a.m. | #3
2018-06-06 17:18 GMT+08:00 Alexander Graf <agraf@suse.de>:
>
>
> On 06.06.18 11:15, Rick Chen wrote:
>>> -----Original Message-----
>>> From: Alexander Graf [mailto:agraf@suse.de]
>>> Sent: Wednesday, June 06, 2018 1:21 AM
>>> To: u-boot@lists.denx.de
>>> Cc: Rick Jian-Zhi Chen(陳建志)
>>> Subject: [PATCH] riscv: Add support for HI20 PE relocations
>>>
>>> The PE standard allows for HI20/LOW12 relocations. Within the efi_loader target
>>> we always know that our relocation target is 4k aligned, so we don't need to
>>> worry about the LOW12 part.
>>>
>>> This patch adds support for the respective relocations. With this and a few grub
>>> patches I have cooking in parallel I'm able to run grub on RISC-V.
>>>
>>> Signed-off-by: Alexander Graf <agraf@suse.de>
>>> ---
>>>  include/pe.h                      |  3 +++
>>>  lib/efi_loader/efi_image_loader.c | 14 ++++++++++++++
>>>  2 files changed, 17 insertions(+)
>>>
>>> diff --git a/include/pe.h b/include/pe.h index d73eb142cb..36e1908b7e 100644
>>> --- a/include/pe.h
>>> +++ b/include/pe.h
>>> @@ -201,10 +201,13 @@ typedef struct _IMAGE_RELOCATION
>>>  #define IMAGE_REL_BASED_MIPS_JMPADDR            5
>>>  #define IMAGE_REL_BASED_ARM_MOV32A              5 /* yes, 5 too */
>>>  #define IMAGE_REL_BASED_ARM_MOV32               5 /* yes, 5 too */
>>> +#define IMAGE_REL_BASED_RISCV_HI20           5 /* yes, 5 too */
>>>  #define IMAGE_REL_BASED_SECTION                 6
>>>  #define IMAGE_REL_BASED_REL                     7
>>>  #define IMAGE_REL_BASED_ARM_MOV32T              7 /* yes, 7 too */
>>>  #define IMAGE_REL_BASED_THUMB_MOV32             7 /* yes, 7 too */
>>> +#define IMAGE_REL_BASED_RISCV_LOW12I         7 /* yes, 7 too */
>>> +#define IMAGE_REL_BASED_RISCV_LOW12S         8
>>>  #define IMAGE_REL_BASED_MIPS_JMPADDR16          9
>>>  #define IMAGE_REL_BASED_IA64_IMM64              9 /* yes, 9 too */
>>>  #define IMAGE_REL_BASED_DIR64                   10
>>> diff --git a/lib/efi_loader/efi_image_loader.c b/lib/efi_loader/efi_image_loader.c
>>> index 3cffe9ef46..6892171ccd 100644
>>> --- a/lib/efi_loader/efi_image_loader.c
>>> +++ b/lib/efi_loader/efi_image_loader.c
>>> @@ -126,6 +126,20 @@ static efi_status_t efi_loader_relocate(const
>>> IMAGE_BASE_RELOCATION *rel,
>>>                       case IMAGE_REL_BASED_DIR64:
>>>                               *x64 += (uint64_t)delta;
>>>                               break;
>>> +#ifdef __riscv
>>> +                     case IMAGE_REL_BASED_RISCV_HI20:
>>> +                             *x32 = ((*x32 & 0xfffff000) + (uint32_t)delta) |
>>> +                                     (*x32 & 0x00000fff);
>>> +                             break;
>>> +                     case IMAGE_REL_BASED_RISCV_LOW12I:
>>> +                     case IMAGE_REL_BASED_RISCV_LOW12S:
>>> +                             /* We know that we're 4k aligned */
>>> +                             if (delta & 0xfff) {
>>> +                                     printf("Unsupported reloc offset\n");
>>> +                                     return EFI_LOAD_ERROR;
>>> +                             }
>>> +                             break;
>>> +#endif
>>>                       default:
>>>                               printf("Unknown Relocation off %x type %x\n",
>>>                                      offset, type);
>>> --
>>> 2.12.3
>>
>> Hi Alex
>>
>> The title of this patch seems to be as" efi_loader: Add support for
>> HI20 PE relocations for RISC-V "
>> And I am not sure if it shall belong to efi tree.
>
> I'll be happy to take it via the efi tree, yes. It only affects the efi
> PE loader.
>
>

Hi Alex

Thanks a lot. :)

Rick

> Alex
Alexander Graf June 12, 2018, 7:54 a.m. | #4
> The PE standard allows for HI20/LOW12 relocations. Within the efi_loader
> target we always know that our relocation target is 4k aligned, so we
> don't need to worry about the LOW12 part.
> 
> This patch adds support for the respective relocations. With this and a
> few grub patches I have cooking in parallel I'm able to run grub on RISC-V.
> 
> Signed-off-by: Alexander Graf <agraf@suse.de>

Thanks, applied to efi-next

Alex

Patch

diff --git a/include/pe.h b/include/pe.h
index d73eb142cb..36e1908b7e 100644
--- a/include/pe.h
+++ b/include/pe.h
@@ -201,10 +201,13 @@  typedef struct _IMAGE_RELOCATION
 #define IMAGE_REL_BASED_MIPS_JMPADDR            5
 #define IMAGE_REL_BASED_ARM_MOV32A              5 /* yes, 5 too */
 #define IMAGE_REL_BASED_ARM_MOV32               5 /* yes, 5 too */
+#define IMAGE_REL_BASED_RISCV_HI20		5 /* yes, 5 too */
 #define IMAGE_REL_BASED_SECTION                 6
 #define IMAGE_REL_BASED_REL                     7
 #define IMAGE_REL_BASED_ARM_MOV32T              7 /* yes, 7 too */
 #define IMAGE_REL_BASED_THUMB_MOV32             7 /* yes, 7 too */
+#define IMAGE_REL_BASED_RISCV_LOW12I		7 /* yes, 7 too */
+#define IMAGE_REL_BASED_RISCV_LOW12S		8
 #define IMAGE_REL_BASED_MIPS_JMPADDR16          9
 #define IMAGE_REL_BASED_IA64_IMM64              9 /* yes, 9 too */
 #define IMAGE_REL_BASED_DIR64                   10
diff --git a/lib/efi_loader/efi_image_loader.c b/lib/efi_loader/efi_image_loader.c
index 3cffe9ef46..6892171ccd 100644
--- a/lib/efi_loader/efi_image_loader.c
+++ b/lib/efi_loader/efi_image_loader.c
@@ -126,6 +126,20 @@  static efi_status_t efi_loader_relocate(const IMAGE_BASE_RELOCATION *rel,
 			case IMAGE_REL_BASED_DIR64:
 				*x64 += (uint64_t)delta;
 				break;
+#ifdef __riscv
+			case IMAGE_REL_BASED_RISCV_HI20:
+				*x32 = ((*x32 & 0xfffff000) + (uint32_t)delta) |
+				        (*x32 & 0x00000fff);
+				break;
+			case IMAGE_REL_BASED_RISCV_LOW12I:
+			case IMAGE_REL_BASED_RISCV_LOW12S:
+				/* We know that we're 4k aligned */
+				if (delta & 0xfff) {
+					printf("Unsupported reloc offset\n");
+					return EFI_LOAD_ERROR;
+				}
+				break;
+#endif
 			default:
 				printf("Unknown Relocation off %x type %x\n",
 				       offset, type);