diff mbox

[v2,2/3] efi/libstub: add random.c to ARM build

Message ID CAKv+Gu_=et=2zHBTYOr9thz2kS0cXHHYg96oWGRdD3D10fqXtw@mail.gmail.com
State New
Headers show

Commit Message

Ard Biesheuvel Nov. 2, 2016, 9:37 a.m. UTC
On 20 October 2016 at 12:21, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> Make random.c build for ARM by moving the fallback definition of

> EFI_ALLOC_ALIGN to efistub.h

>

> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

> ---

>  drivers/firmware/efi/libstub/Makefile          | 4 ++--

>  drivers/firmware/efi/libstub/efi-stub-helper.c | 9 ---------

>  drivers/firmware/efi/libstub/efistub.h         | 9 +++++++++

>  3 files changed, 11 insertions(+), 11 deletions(-)

>


I need the following hunks on top to make this build on ARM:

""
"""

This is because ARM does not have a division routine in the
decompressor, and the fact that the division by 'align' should always
involve a power of 2 is not visible to the compiler.

If nobody objects, I will fold this in when applying

Thanks,
Ard.


> diff --git a/drivers/firmware/efi/libstub/Makefile b/drivers/firmware/efi/libstub/Makefile

> index c06945160a41..40ddf8f763a8 100644

> --- a/drivers/firmware/efi/libstub/Makefile

> +++ b/drivers/firmware/efi/libstub/Makefile

> @@ -36,11 +36,11 @@ arm-deps := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c fdt_empty_tree.c fdt_sw.c sort.c

>  $(obj)/lib-%.o: $(srctree)/lib/%.c FORCE

>         $(call if_changed_rule,cc_o_c)

>

> -lib-$(CONFIG_EFI_ARMSTUB)      += arm-stub.o fdt.o string.o \

> +lib-$(CONFIG_EFI_ARMSTUB)      += arm-stub.o fdt.o string.o random.o \

>                                    $(patsubst %.c,lib-%.o,$(arm-deps))

>

>  lib-$(CONFIG_ARM)              += arm32-stub.o

> -lib-$(CONFIG_ARM64)            += arm64-stub.o random.o

> +lib-$(CONFIG_ARM64)            += arm64-stub.o

>  CFLAGS_arm64-stub.o            := -DTEXT_OFFSET=$(TEXT_OFFSET)

>

>  #

> diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c

> index aded10662020..3c2fe209bbfe 100644

> --- a/drivers/firmware/efi/libstub/efi-stub-helper.c

> +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c

> @@ -32,15 +32,6 @@

>

>  static unsigned long __chunk_size = EFI_READ_CHUNK_SIZE;

>

> -/*

> - * Allow the platform to override the allocation granularity: this allows

> - * systems that have the capability to run with a larger page size to deal

> - * with the allocations for initrd and fdt more efficiently.

> - */

> -#ifndef EFI_ALLOC_ALIGN

> -#define EFI_ALLOC_ALIGN                EFI_PAGE_SIZE

> -#endif

> -

>  #define EFI_MMAP_NR_SLACK_SLOTS        8

>

>  struct file_info {

> diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h

> index ee49cd23ee63..fe1f22584c69 100644

> --- a/drivers/firmware/efi/libstub/efistub.h

> +++ b/drivers/firmware/efi/libstub/efistub.h

> @@ -15,6 +15,15 @@

>   */

>  #undef __init

>

> +/*

> + * Allow the platform to override the allocation granularity: this allows

> + * systems that have the capability to run with a larger page size to deal

> + * with the allocations for initrd and fdt more efficiently.

> + */

> +#ifndef EFI_ALLOC_ALIGN

> +#define EFI_ALLOC_ALIGN                EFI_PAGE_SIZE

> +#endif

> +

>  void efi_char16_printk(efi_system_table_t *, efi_char16_t *);

>

>  efi_status_t efi_open_volume(efi_system_table_t *sys_table_arg, void *__image,

> --

> 2.7.4

>


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Comments

Arnd Bergmann Nov. 15, 2016, 3:11 p.m. UTC | #1
On Wednesday, November 2, 2016 9:37:13 AM CET Ard Biesheuvel wrote:
> @@ -98,7 +100,7 @@

>                 efi_memory_desc_t *md = (void *)memory_map + map_offset;

>                 unsigned long slots;

> 

> -               slots = get_entry_num_slots(md, size, align);

> +               slots = get_entry_num_slots(md, size, ilog2(align));

>                 MD_NUM_SLOTS(md) = slots;

>                 total_slots += slots;

>         }

> """

> 

> This is because ARM does not have a division routine in the

> decompressor, and the fact that the division by 'align' should always

> involve a power of 2 is not visible to the compiler.

> 

> If nobody objects, I will fold this in when applying

> 

> 


I'm getting a link error here when building with -Os:

drivers/firmware/efi/libstub/random.stub.o: In function `efi_random_alloc':
random.c:(.text.efi_random_alloc+0x264): undefined reference to `__aeabi_llsr'

If I compile this with -O2, the ilog2 gets inlined and everything
works.

	Arnd

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Ard Biesheuvel Nov. 15, 2016, 3:19 p.m. UTC | #2
On 15 November 2016 at 15:11, Arnd Bergmann <arnd@arndb.de> wrote:
> On Wednesday, November 2, 2016 9:37:13 AM CET Ard Biesheuvel wrote:

>> @@ -98,7 +100,7 @@

>>                 efi_memory_desc_t *md = (void *)memory_map + map_offset;

>>                 unsigned long slots;

>>

>> -               slots = get_entry_num_slots(md, size, align);

>> +               slots = get_entry_num_slots(md, size, ilog2(align));

>>                 MD_NUM_SLOTS(md) = slots;

>>                 total_slots += slots;

>>         }

>> """

>>

>> This is because ARM does not have a division routine in the

>> decompressor, and the fact that the division by 'align' should always

>> involve a power of 2 is not visible to the compiler.

>>

>> If nobody objects, I will fold this in when applying

>>

>>

>

> I'm getting a link error here when building with -Os:

>

> drivers/firmware/efi/libstub/random.stub.o: In function `efi_random_alloc':

> random.c:(.text.efi_random_alloc+0x264): undefined reference to `__aeabi_llsr'

>

> If I compile this with -O2, the ilog2 gets inlined and everything

> works.

>


This is caused by the fact that 'start' and 'end are u64 rather than
unsigned long, and the stub does not have the u64 logical shift right
routines.
But interestingly, it does cover another issue with this code, i.e.,
that you cannot do allocations over 4 GB in the ARM stub, even on LPAE
capable hardware.

I will send out a patch to fix this.

Thanks,
Ard.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
diff mbox

Patch

--- a/drivers/firmware/efi/libstub/random.c
+++ b/drivers/firmware/efi/libstub/random.c
@@ -8,6 +8,7 @@ 
  */

 #include <linux/efi.h>
+#include <linux/log2.h>
 #include <asm/efi.h>

 #include "efistub.h"
@@ -41,8 +42,9 @@ 
  */
 static unsigned long get_entry_num_slots(efi_memory_desc_t *md,
                                         unsigned long size,
-                                        unsigned long align)
+                                        unsigned long align_shift)
 {
+       unsigned long align = 1UL << align_shift;
        u64 start, end;

        if (md->type != EFI_CONVENTIONAL_MEMORY)
@@ -55,7 +57,7 @@ 
        if (start > end)
                return 0;

-       return (end - start + 1) / align;
+       return (end - start + 1) >> align_shift;
 }

 /*
@@ -98,7 +100,7 @@ 
                efi_memory_desc_t *md = (void *)memory_map + map_offset;
                unsigned long slots;

-               slots = get_entry_num_slots(md, size, align);
+               slots = get_entry_num_slots(md, size, ilog2(align));
                MD_NUM_SLOTS(md) = slots;
                total_slots += slots;
        }