diff mbox series

efi_loader: Align runtime section to 64kb

Message ID 20180917024512.58088-1-agraf@suse.de
State Superseded
Headers show
Series efi_loader: Align runtime section to 64kb | expand

Commit Message

Alexander Graf Sept. 17, 2018, 2:45 a.m. UTC
The UEFI spec mandates that runtime sections are 64kb aligned to enable
support for 64kb page size OSs.

This patch ensures that we extend the runtime section to 64kb to be spec
compliant.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 lib/efi_loader/efi_memory.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

Comments

Heinrich Schuchardt Sept. 17, 2018, 5:42 a.m. UTC | #1
On 09/17/2018 04:45 AM, Alexander Graf wrote:
> The UEFI spec mandates that runtime sections are 64kb aligned to enable
%s/kb/ kiB/g
The spec requires a multiple of 64,000 not of 65,536.

> support for 64kb page size OSs.
> 
> This patch ensures that we extend the runtime section to 64kb to be spec
> compliant.
> 
> Signed-off-by: Alexander Graf <agraf@suse.de>
> ---
>  lib/efi_loader/efi_memory.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
> index 4f8cb545ad..66ad54a152 100644
> --- a/lib/efi_loader/efi_memory.c
> +++ b/lib/efi_loader/efi_memory.c
> @@ -11,6 +11,7 @@
>  #include <mapmem.h>
>  #include <watchdog.h>
>  #include <linux/list_sort.h>
> +#include <linux/sizes.h>
>  
>  DECLARE_GLOBAL_DATA_PTR;
>  
> @@ -526,10 +527,10 @@ static void add_u_boot_and_runtime(void)
>  	uboot_pages = (gd->ram_top - uboot_start) >> EFI_PAGE_SHIFT;
>  	efi_add_memory_map(uboot_start, uboot_pages, EFI_LOADER_DATA, false);
>  
> -	/* Add Runtime Services */
> -	runtime_start = (ulong)&__efi_runtime_start & ~EFI_PAGE_MASK;
> +	/* Add Runtime Services,must be 64kb aligned */
> +	runtime_start = (ulong)&__efi_runtime_start & ~(SZ_64K - 1);

Please, add a comment in the code referring to the requirement in the
UEFI spec.

Best regards

Heinrich

>  	runtime_end = (ulong)&__efi_runtime_stop;
> -	runtime_end = (runtime_end + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;
> +	runtime_end = (runtime_end + SZ_64K - 1) & ~(SZ_64K - 1);
>  	runtime_pages = (runtime_end - runtime_start) >> EFI_PAGE_SHIFT;
>  	efi_add_memory_map(runtime_start, runtime_pages,
>  			   EFI_RUNTIME_SERVICES_CODE, false);
>
Heinrich Schuchardt Sept. 17, 2018, 5:47 a.m. UTC | #2
On 09/17/2018 04:45 AM, Alexander Graf wrote:
> The UEFI spec mandates that runtime sections are 64kb aligned to enable
> support for 64kb page size OSs.

Where in the spec did you find this? I could neither find the term
"runtime section" nor "64kb" in the text.

Best regards

Heinrich

> 
> This patch ensures that we extend the runtime section to 64kb to be spec
> compliant.
> 
> Signed-off-by: Alexander Graf <agraf@suse.de>
> ---
>  lib/efi_loader/efi_memory.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
> index 4f8cb545ad..66ad54a152 100644
> --- a/lib/efi_loader/efi_memory.c
> +++ b/lib/efi_loader/efi_memory.c
> @@ -11,6 +11,7 @@
>  #include <mapmem.h>
>  #include <watchdog.h>
>  #include <linux/list_sort.h>
> +#include <linux/sizes.h>
>  
>  DECLARE_GLOBAL_DATA_PTR;
>  
> @@ -526,10 +527,10 @@ static void add_u_boot_and_runtime(void)
>  	uboot_pages = (gd->ram_top - uboot_start) >> EFI_PAGE_SHIFT;
>  	efi_add_memory_map(uboot_start, uboot_pages, EFI_LOADER_DATA, false);
>  
> -	/* Add Runtime Services */
> -	runtime_start = (ulong)&__efi_runtime_start & ~EFI_PAGE_MASK;
> +	/* Add Runtime Services,must be 64kb aligned */
> +	runtime_start = (ulong)&__efi_runtime_start & ~(SZ_64K - 1);
>  	runtime_end = (ulong)&__efi_runtime_stop;
> -	runtime_end = (runtime_end + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;
> +	runtime_end = (runtime_end + SZ_64K - 1) & ~(SZ_64K - 1);
>  	runtime_pages = (runtime_end - runtime_start) >> EFI_PAGE_SHIFT;
>  	efi_add_memory_map(runtime_start, runtime_pages,
>  			   EFI_RUNTIME_SERVICES_CODE, false);
>
Alexander Graf Sept. 17, 2018, 11:43 a.m. UTC | #3
On 16.09.18 22:42, Heinrich Schuchardt wrote:
> On 09/17/2018 04:45 AM, Alexander Graf wrote:
>> The UEFI spec mandates that runtime sections are 64kb aligned to enable
> %s/kb/ kiB/g
> The spec requires a multiple of 64,000 not of 65,536.

The other way around you mean I guess? We do usually use "kb" for
multiples of 1024 though, no?

> 
>> support for 64kb page size OSs.
>>
>> This patch ensures that we extend the runtime section to 64kb to be spec
>> compliant.
>>
>> Signed-off-by: Alexander Graf <agraf@suse.de>
>> ---
>>  lib/efi_loader/efi_memory.c | 7 ++++---
>>  1 file changed, 4 insertions(+), 3 deletions(-)
>>
>> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
>> index 4f8cb545ad..66ad54a152 100644
>> --- a/lib/efi_loader/efi_memory.c
>> +++ b/lib/efi_loader/efi_memory.c
>> @@ -11,6 +11,7 @@
>>  #include <mapmem.h>
>>  #include <watchdog.h>
>>  #include <linux/list_sort.h>
>> +#include <linux/sizes.h>
>>  
>>  DECLARE_GLOBAL_DATA_PTR;
>>  
>> @@ -526,10 +527,10 @@ static void add_u_boot_and_runtime(void)
>>  	uboot_pages = (gd->ram_top - uboot_start) >> EFI_PAGE_SHIFT;
>>  	efi_add_memory_map(uboot_start, uboot_pages, EFI_LOADER_DATA, false);
>>  
>> -	/* Add Runtime Services */
>> -	runtime_start = (ulong)&__efi_runtime_start & ~EFI_PAGE_MASK;
>> +	/* Add Runtime Services,must be 64kb aligned */
>> +	runtime_start = (ulong)&__efi_runtime_start & ~(SZ_64K - 1);
> 
> Please, add a comment in the code referring to the requirement in the
> UEFI spec.

Sure, it's part of 2.6.3 (AArch64 Platforms) in the 2.7 spec.


Alex
diff mbox series

Patch

diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
index 4f8cb545ad..66ad54a152 100644
--- a/lib/efi_loader/efi_memory.c
+++ b/lib/efi_loader/efi_memory.c
@@ -11,6 +11,7 @@ 
 #include <mapmem.h>
 #include <watchdog.h>
 #include <linux/list_sort.h>
+#include <linux/sizes.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -526,10 +527,10 @@  static void add_u_boot_and_runtime(void)
 	uboot_pages = (gd->ram_top - uboot_start) >> EFI_PAGE_SHIFT;
 	efi_add_memory_map(uboot_start, uboot_pages, EFI_LOADER_DATA, false);
 
-	/* Add Runtime Services */
-	runtime_start = (ulong)&__efi_runtime_start & ~EFI_PAGE_MASK;
+	/* Add Runtime Services,must be 64kb aligned */
+	runtime_start = (ulong)&__efi_runtime_start & ~(SZ_64K - 1);
 	runtime_end = (ulong)&__efi_runtime_stop;
-	runtime_end = (runtime_end + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;
+	runtime_end = (runtime_end + SZ_64K - 1) & ~(SZ_64K - 1);
 	runtime_pages = (runtime_end - runtime_start) >> EFI_PAGE_SHIFT;
 	efi_add_memory_map(runtime_start, runtime_pages,
 			   EFI_RUNTIME_SERVICES_CODE, false);