Fwd: Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function

Lakshmi Ramasubramanian nramas at linux.microsoft.com
Thu Feb 11 12:47:54 EST 2021


On 2/11/21 9:42 AM, Lakshmi Ramasubramanian wrote:
> Hi Rob,
> 
> [PATCH] powerpc: Rename kexec elfcorehdr_addr to elf_headers_mem
> 
> This change causes build problem for x86_64 architecture (please see the 
> mail from kernel test bot below) since arch/x86/include/asm/kexec.h uses 
> "elf_load_addr" for the ELF header buffer address and not 
> "elf_headers_mem".
> 
> struct kimage_arch {
>      ...
> 
>      /* Core ELF header buffer */
>      void *elf_headers;
>      unsigned long elf_headers_sz;
>      unsigned long elf_load_addr;
> };
> 
> I am thinking of limiting of_kexec_alloc_and_setup_fdt() to ARM64 and 
> PPC64 since they are the only ones using this function now.
> 
> #if defined(CONFIG_ARM64) && defined(CONFIG_PPC64)
Sorry - I meant to say
#if defined(CONFIG_ARM64) || defined(CONFIG_PPC64)

> void *of_kexec_alloc_and_setup_fdt(const struct kimage *image,
>                     unsigned long initrd_load_addr,
>                     unsigned long initrd_len,
>                     const char *cmdline)
> {
>      ...
> }
> #endif /* defined(CONFIG_ARM64) && defined(CONFIG_PPC64) */
> 
> Please let me know if you have any concerns.
> 
> thanks,
>   -lakshmi
> 
> -------- Forwarded Message --------
> Subject: Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function
> Date: Fri, 12 Feb 2021 00:50:20 +0800
> From: kernel test robot <lkp at intel.com>
> To: Lakshmi Ramasubramanian <nramas at linux.microsoft.com>
> CC: kbuild-all at lists.01.org
> 
> Hi Lakshmi,
> 
> I love your patch! Yet something to improve:
> 
> [auto build test ERROR on integrity/next-integrity]
> [also build test ERROR on v5.11-rc7 next-20210211]
> [cannot apply to powerpc/next robh/for-next arm64/for-next/core]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch]
> 
> url: 
> https://github.com/0day-ci/linux/commits/Lakshmi-Ramasubramanian/Carry-forward-IMA-measurement-log-on-kexec-on-ARM64/20210211-071924 
> 
> base: 
> https://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git next-integrity 
> 
> config: x86_64-randconfig-m001-20210211 (attached as .config)
> compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
> reproduce (this is a W=1 build):
>          # 
> https://github.com/0day-ci/linux/commit/12ae86067d115b84092353109e8798693d102f0d 
> 
>          git remote add linux-review https://github.com/0day-ci/linux
>          git fetch --no-tags linux-review 
> Lakshmi-Ramasubramanian/Carry-forward-IMA-measurement-log-on-kexec-on-ARM64/20210211-071924 
> 
>          git checkout 12ae86067d115b84092353109e8798693d102f0d
>          # save the attached .config to linux build tree
>          make W=1 ARCH=x86_64
> If you fix the issue, kindly add following tag as appropriate
> Reported-by: kernel test robot <lkp at intel.com>
> 
> All errors (new ones prefixed by >>):
> 
>     drivers/of/kexec.c: In function 'of_kexec_alloc_and_setup_fdt':
>>> drivers/of/kexec.c:183:17: error: 'const struct kimage_arch' has no 
>>> member named 'elf_headers_mem'; did you mean 'elf_headers_sz'?
>       183 |     image->arch.elf_headers_mem,
>           |                 ^~~~~~~~~~~~~~~
>           |                 elf_headers_sz
>     drivers/of/kexec.c:192:42: error: 'const struct kimage_arch' has no 
> member named 'elf_headers_mem'; did you mean 'elf_headers_sz'?
>       192 |   ret = fdt_add_mem_rsv(fdt, image->arch.elf_headers_mem,
>           |                                          ^~~~~~~~~~~~~~~
>           |                                          elf_headers_sz
> 
> 
> vim +183 drivers/of/kexec.c
> 
>      65
>      66    /*
>      67     * of_kexec_alloc_and_setup_fdt - Alloc and setup a new 
> Flattened Device Tree
>      68     *
>      69     * @image:        kexec image being loaded.
>      70     * @initrd_load_addr:    Address where the next initrd will 
> be loaded.
>      71     * @initrd_len:        Size of the next initrd, or 0 if there 
> will be none.
>      72     * @cmdline:        Command line for the next kernel, or NULL 
> if there will
>      73     *            be none.
>      74     *
>      75     * Return: fdt on success, or NULL errno on error.
>      76     */
>      77    void *of_kexec_alloc_and_setup_fdt(const struct kimage *image,
>      78                       unsigned long initrd_load_addr,
>      79                       unsigned long initrd_len,
>      80                       const char *cmdline)
>      81    {
>      82        void *fdt;
>      83        int ret, chosen_node;
>      84        const void *prop;
>      85        unsigned long fdt_size;
>      86
>      87        fdt_size = fdt_totalsize(initial_boot_params) +
>      88               (cmdline ? strlen(cmdline) : 0) +
>      89               FDT_EXTRA_SPACE;
>      90
>      91        fdt = kvmalloc(fdt_size, GFP_KERNEL);
>      92        if (!fdt)
>      93            return NULL;
>      94
>      95        ret = fdt_open_into(initial_boot_params, fdt, fdt_size);
>      96        if (ret < 0) {
>      97            pr_err("Error %d setting up the new device tree.\n", 
> ret);
>      98            goto out;
>      99        }
>     100
>     101        /* Remove memory reservation for the current device tree. */
>     102        ret = fdt_find_and_del_mem_rsv(fdt, 
> __pa(initial_boot_params),
>     103                           fdt_totalsize(initial_boot_params));
>     104        if (ret == -EINVAL) {
>     105            pr_err("Error removing memory reservation.\n");
>     106            goto out;
>     107        }
>     108
>     109        chosen_node = fdt_path_offset(fdt, "/chosen");
>     110        if (chosen_node == -FDT_ERR_NOTFOUND)
>     111            chosen_node = fdt_add_subnode(fdt, 
> fdt_path_offset(fdt, "/"),
>     112                              "chosen");
>     113        if (chosen_node < 0) {
>     114            ret = chosen_node;
>     115            goto out;
>     116        }
>     117
>     118        ret = fdt_delprop(fdt, chosen_node, FDT_PROP_KEXEC_ELFHDR);
>     119        if (ret && ret != -FDT_ERR_NOTFOUND)
>     120            goto out;
>     121        ret = fdt_delprop(fdt, chosen_node, FDT_PROP_MEM_RANGE);
>     122        if (ret && ret != -FDT_ERR_NOTFOUND)
>     123            goto out;
>     124
>     125        /* Did we boot using an initrd? */
>     126        prop = fdt_getprop(fdt, chosen_node, 
> "linux,initrd-start", NULL);
>     127        if (prop) {
>     128            u64 tmp_start, tmp_end, tmp_size;
>     129
>     130            tmp_start = fdt64_to_cpu(*((const fdt64_t *) prop));
>     131
>     132            prop = fdt_getprop(fdt, chosen_node, 
> "linux,initrd-end", NULL);
>     133            if (!prop) {
>     134                ret = -EINVAL;
>     135                goto out;
>     136            }
>     137
>     138            tmp_end = fdt64_to_cpu(*((const fdt64_t *) prop));
>     139
>     140            /*
>     141             * kexec reserves exact initrd size, while firmware may
>     142             * reserve a multiple of PAGE_SIZE, so check for both.
>     143             */
>     144            tmp_size = tmp_end - tmp_start;
>     145            ret = fdt_find_and_del_mem_rsv(fdt, tmp_start, 
> tmp_size);
>     146            if (ret == -ENOENT)
>     147                ret = fdt_find_and_del_mem_rsv(fdt, tmp_start,
>     148                                   round_up(tmp_size, PAGE_SIZE));
>     149            if (ret == -EINVAL)
>     150                goto out;
>     151        }
>     152
>     153        /* add initrd-* */
>     154        if (initrd_load_addr) {
>     155            ret = fdt_setprop_u64(fdt, chosen_node, 
> FDT_PROP_INITRD_START,
>     156                          initrd_load_addr);
>     157            if (ret)
>     158                goto out;
>     159
>     160            ret = fdt_setprop_u64(fdt, chosen_node, 
> FDT_PROP_INITRD_END,
>     161                          initrd_load_addr + initrd_len);
>     162            if (ret)
>     163                goto out;
>     164
>     165            ret = fdt_add_mem_rsv(fdt, initrd_load_addr, 
> initrd_len);
>     166            if (ret)
>     167                goto out;
>     168
>     169        } else {
>     170            ret = fdt_delprop(fdt, chosen_node, 
> FDT_PROP_INITRD_START);
>     171            if (ret && (ret != -FDT_ERR_NOTFOUND))
>     172                goto out;
>     173
>     174            ret = fdt_delprop(fdt, chosen_node, 
> FDT_PROP_INITRD_END);
>     175            if (ret && (ret != -FDT_ERR_NOTFOUND))
>     176                goto out;
>     177        }
>     178
>     179        if (image->type == KEXEC_TYPE_CRASH) {
>     180            /* add linux,elfcorehdr */
>     181            ret = fdt_appendprop_addrrange(fdt, 0, chosen_node,
>     182                    FDT_PROP_KEXEC_ELFHDR,
>   > 183                    image->arch.elf_headers_mem,
> 
> ---
> 0-DAY CI Kernel Test Service, Intel Corporation
> https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
> 




More information about the linux-arm-kernel mailing list