[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] xen:arm: Populate arm64 image header



On 09/01/2018 02:01 PM, Amit Tomer wrote:
> Hello,
> 
>> Yes, and in fact it seems one can work around this by cleverly
>> constructing the load addresses,
> 
> But we are really dealing a corner case here. No matter where
> we load the image, it would be relocated to 0x80000( since dram
> starts at 0x0000...) and unfortunately first 16MiB is reserved for
> ROM Firmware.
> 
>>>> This unwanted situation can be fixed by updating image_size field
>>>> along side kernel flags so that image wouldn't relocate from initial
>>>> load address.
>>>
>>> I think the first step is to fix your U-boot and rethink where you load
>>> your binaries.
>>
>> I think U-Boot perfectly complies with the kernel document. Xen not so
>> much. The kernel image format was deliberately updated to become more
>> flexible with certain memory layout situations as we have here.
>> There is for instance a problem if there is something precious at 512KB
>> into DRAM (secure memory owned by firmware), as regardless of the load
>> addresses the user chooses U-Boot will (rightfully!) revert to the
>> original "512KB into DRAM" address to keep compatibility with older
>> kernels - and it believes Xen is such a one because of the ancient
>> header format.
>>
>> But ...
>>
>>> Regarding the patch in itself, I think this is a good addition as it
>>> allow Xen to be loaded in more places. But please rewrite the commit
>>> message accordingly, this is an update to a new version.
>>
>> I totally agree with that, the commit message should be reworded to
>> stress that we want to comply with a newer version of the kernel image
>> header (which is around for four years by now!), and just mention that
>> it fixes problems with non-ancient U-Boots on certain platforms as an
>> additional reason.
>>
>>>> [1]:https://git.denx.de/?p=u-boot.git;a=blob;f=arch/arm/lib/image.c;h=699bf44e702f7a7084997406203fd7d2aaaf87fa;hb=HEAD#l50
>>>>
>>>>
>>>> These changes are derived from kernel v4.18 files
>>>>
>>>> Signed-off-by: Amit Singh Tomar <amittomer25@xxxxxxxxx>
>>>> ---
>>>>   xen/arch/arm/arm64/head.S                     |  5 ++-
>>>>   xen/arch/arm/arm64/lib/assembler.h            | 11 +++++
>>>>   xen/arch/arm/xen.lds.S                        |  3 ++
>>>>   xen/include/asm-arm/arm64/linux_header_vars.h | 62
>>>> +++++++++++++++++++++++++++
>>>>   4 files changed, 79 insertions(+), 2 deletions(-)
>>>>   create mode 100644 xen/include/asm-arm/arm64/linux_header_vars.h
>>>>
>>>> diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S
>>>> index d63734f..ce72c95 100644
>>>> --- a/xen/arch/arm/arm64/head.S
>>>> +++ b/xen/arch/arm/arm64/head.S
>>>> @@ -25,6 +25,7 @@
>>>>   #include <asm/early_printk.h>
>>>>   #include <efi/efierr.h>
>>>>   #include <asm/arm64/efibind.h>
>>>> +#include "lib/assembler.h"
>>>>     #define PT_PT     0xf7f /* nG=1 AF=1 SH=11 AP=01 NS=1 ATTR=111 T=1
>>>> P=1 */
>>>>   #define PT_MEM    0xf7d /* nG=1 AF=1 SH=11 AP=01 NS=1 ATTR=111 T=0
>>>> P=1 */
>>>> @@ -120,8 +121,8 @@ efi_head:
>>>>           add     x13, x18, #0x16
>>>>           b       real_start           /* branch to kernel start */
>>>>           .quad   0                    /* Image load offset from start
>>>> of RAM */
>>>> -        .quad   0                    /* reserved */
>>>> -        .quad   0                    /* reserved */
>>>> +        le64sym _kernel_size_le      /* Effective size of kernel
>>>> image, little-endian */
>>>> +        le64sym _kernel_flags_le     /* Informative flags,
>>>> little-endian */
>>>
>>> All the dance for to convert to little endian is not necessary on Xen.
>>> Please rework your series to avoid such code, this would also reduce
>>> quite significantly the series.
>>
>> Indeed!
> 
> How about this change?

The diff below doesn't make sense. Please just send a new version
without *any* endianess code and with the changed commit message -
focusing on the overdue image format update as the main rationale and
just mentioning the platform as an example.

Cheers,
Andre.

> 
> index ce72c95..ec29e01 100644
> --- a/xen/arch/arm/arm64/head.S
> +++ b/xen/arch/arm/arm64/head.S
> @@ -121,8 +121,8 @@ efi_head:
>          add     x13, x18, #0x16
>          b       real_start           /* branch to kernel start */
>          .quad   0                    /* Image load offset from start of RAM 
> */
> -        le64sym _kernel_size_le      /* Effective size of kernel
> image, little-endian */
> -        le64sym _kernel_flags_le     /* Informative flags, little-endian */
> +        .quad   _end - start      /* Effective size of kernel image,
> little-endian */
> +        .quad   __HEAD_FLAGS     /* Informative flags, little-endian */
>          .quad   0                    /* reserved */
>          .quad   0                    /* reserved */
>          .quad   0                    /* reserved */
> diff --git a/xen/arch/arm/arm64/lib/assembler.h
> b/xen/arch/arm/arm64/lib/assembler.h
> index c0ef758..05861b8 100644
> --- a/xen/arch/arm/arm64/lib/assembler.h
> +++ b/xen/arch/arm/arm64/lib/assembler.h
> @@ -9,15 +9,11 @@
>  #define CPU_BE(x...)
>  #define CPU_LE(x...) x
> 
> -    /*
> -     * Emit a 64-bit absolute little endian symbol reference in a way that
> -     * ensures that it will be resolved at build time, even when building a
> -     * PIE binary. This requires cooperation from the linker script, which
> -     * must emit the lo32/hi32 halves individually.
> -     */
> -    .macro  le64sym, sym
> -    .long   \sym\()_lo32
> -    .long   \sym\()_hi32
> -    .endm
> +#define __HEAD_FLAG_PAGE_SIZE  1 /* 4K hard-coded */
> +
> +#define __HEAD_FLAG_PHYS_BASE  1
> +
> +#define __HEAD_FLAGS    ((__HEAD_FLAG_PAGE_SIZE << 1) |  \
> 
> Thanks
> -Amit
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.