On 9/22/25 12:38 PM, Pingfan Liu wrote:
Hi Chen,

On Fri, Sep 19, 2025 at 3:35 PM Chen Wandun <[email protected]> wrote:
I encountered the following error while makedumpfile without enableing
kernel CONFIG_PROC_KCORE and CONFIG_KALLSYMS_ALL, this error only exists
before commit 29fe506 (kexec: make -a the default), this commit change
from kexec_load to kexec_file_load.

read_from_vmcore: Can't seek the dump memory(/proc/vmcore). (offset: 
ffff800084f4c000) Invalid argument
readpage_elf: Can't read the dump memory(/proc/vmcore).
readmem: type_addr: 1, addr:41f29800, size:8
vaddr_to_paddr_arm64: Can't read pgd
readmem: Can't convert a virtual address(ffff800082edf8a0) to physical address.
readmem: type_addr: 0, addr:ffff800082edf8a0, size:390
check_release: Can't get the address of system_utsname.

Although several error messages appear when loading second kernel using kexec 
without
kernel CONFIG_PROC_KCORE and CONFIG_KALLSYMS_ALL, but kexec return 0.

Can't open (/proc/kcore).
Can't get the symbol of _text to calculate page_offset.
Can't get the symbol of _text to calculate page_offset.

If kexec unable to get the _text address, it will result in 
elf_info.kern_paddr_start
to be a large value, and also phdr->p_filesz/phdr->p_offset to be a large 
value, such as:

readelf -l /proc/vmcore
Program Headers:
   Type           Offset             VirtAddr           PhysAddr
                  FileSiz            MemSiz              Flags  Align
   NOTE           0x0000000000001000 0x0000000000000000 0x0000000000000000
                  0x0000000000001a44 0x0000000000001a44         0x4
   LOAD           0x0000000000003000 0xffffffffffffffff 0x00007fffc0200000
                  0xffff800083020000 0xffff800083020000  RWE    0x0
   LOAD           0xffff800083023000 0x0000000000000000 0x0000000040000000
                  0x00000001e6e00000 0x00000001e6e00000  RWE    0x0
   LOAD           0xffff800269e23000 0x00000001f6e00000 0x0000000236e00000
                  0x0000000009200000 0x0000000009200000  RWE    0x0

This patch avoiding makedumpfile failure by ending the kexec process and 
explicitly
notifying error.

I'm afraid I cannot agree with your proposed fix. The makedumpfile
works on /proc/vmcore. In my opinion, if there isn't enough
information for makedumpfile to work properly, you should try to fix
and supplement it in the first kernel.
Yes, you're right, and that's also how this patch is done;

Without this patch:
If kexec can't get the address of _text, kexec will finish “normally” with returning 0,
but will fail when makedumpfile. This is not what we expected.

With this patch:
kexec will abort if can't get the address ot _text and explicitly notifying error, and
first kernel should provide correct info based on error message.

Thanks,
Wandun


Thanks,

Pingfan

Reported-by: Zhao Meijing <[email protected]>
Signed-off-by: Chen Wandun <[email protected]>
---
  kexec/arch/arm64/crashdump-arm64.c | 6 ++++--
  1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/kexec/arch/arm64/crashdump-arm64.c 
b/kexec/arch/arm64/crashdump-arm64.c
index 73cb611..8629610 100644
--- a/kexec/arch/arm64/crashdump-arm64.c
+++ b/kexec/arch/arm64/crashdump-arm64.c
@@ -94,9 +94,11 @@ static int iomem_range_callback(void *UNUSED(data), int 
UNUSED(nr),
                  * For compatibility, deduce by comparing the gap "__init_begin - 
_stext"
                  * and the res size of "Kernel code" in /proc/iomem
                  */
-               if (kva_text_end - kva_stext == length)
+               if (kva_text_end - kva_stext == length) {
+                       if (!kva_text)
+                               die("Cannot get kernel _text symbol address\n");
                         elf_info.kern_paddr_start = base - (kva_stext - 
kva_text);
-               else
+               } else
                         elf_info.kern_paddr_start = base;
         }
         else if (strncmp(str, KERNEL_DATA, strlen(KERNEL_DATA)) == 0)
--
2.25.1



Reply via email to