lkml.org 
[lkml]   [2021]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH] powerpc: Fix kernel-jump address for ppc64 wrapper boot
    From
    Date
    Hello,


    在 2021/6/8 12:55, Christophe Leroy 写道:
    >
    >
    > Le 04/06/2021 à 11:22, He Ying a écrit :
    >>  From "64-bit PowerPC ELF Application Binary Interface Supplement 1.9",
    >> we know that the value of a function pointer in a language like C is
    >> the address of the function descriptor and the first doubleword
    >> of the function descriptor contains the address of the entry point
    >> of the function.
    >>
    >> So, when we want to jump to an address (e.g. addr) to execute for
    >> PPC-elf64abi, we should assign the address of addr *NOT* addr itself
    >> to the function pointer or system will jump to the wrong address.
    >>
    >> Link:
    >> https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html#FUNC-DES
    >> Signed-off-by: He Ying <heying24@huawei.com>
    >> ---
    >>   arch/powerpc/boot/main.c | 9 +++++++++
    >>   1 file changed, 9 insertions(+)
    >>
    >> diff --git a/arch/powerpc/boot/main.c b/arch/powerpc/boot/main.c
    >> index cae31a6e8f02..50fd7f11b642 100644
    >> --- a/arch/powerpc/boot/main.c
    >> +++ b/arch/powerpc/boot/main.c
    >> @@ -268,7 +268,16 @@ void start(void)
    >>       if (console_ops.close)
    >>           console_ops.close();
    >>   +#ifdef CONFIG_PPC64_BOOT_WRAPPER
    >
    > This kind of need doesn't desserve a #ifdef, see
    > https://www.kernel.org/doc/html/latest/process/coding-style.html#conditional-compilation
    >
    > You can do:
    >
    >
    >     kentry = (kernel_entry_t)(IS_ENABLED(CONFIG_PPC64_BOOT_WRAPPER) ?
    > &vmlinux.addr : vmlinux.addr);
    >
    >
    > Or, if you prefer something less compact:
    >
    >
    >     if (IS_ENABLED(CONFIG_PPC64_BOOT_WRAPPER))
    >         kentry = (kernel_entry_t) &vmlinux.addr;
    >     else
    >         kentry = (kernel_entry_t) vmlinux.addr;

    Thanks for reviewing. But from Oliver's reply, this patch should be dropped.

    Because all ppc platforms will not build wrapper to ppc64be ELF currently.

    And ppc64le uses LE ABI (ABIv2) which doesn't use function descriptors.

    So this may not be a problem for now.


    Thanks again.

    >
    >
    >> +    /*
    >> +     * For PPC-elf64abi, the value of a function pointer is the address
    >> +     * of the function descriptor. And the first doubleword of a
    >> function
    >> +     * descriptor contains the address of the entry point of the
    >> function.
    >> +     */
    >> +    kentry = (kernel_entry_t) &vmlinux.addr;
    >> +#else
    >>       kentry = (kernel_entry_t) vmlinux.addr;
    >> +#endif
    >>       if (ft_addr) {
    >>           if(platform_ops.kentry)
    >>               platform_ops.kentry(ft_addr, vmlinux.addr);
    >>
    > .

    \
     
     \ /
      Last update: 2021-06-08 13:04    [W:4.458 / U:0.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site