[PATCH v5 0/5] LoongArch: add KHO support and selftests

George Guo posted 5 patches 3 weeks ago
arch/loongarch/Kconfig                     |  4 ++
drivers/firmware/efi/Kconfig               | 12 ++++
drivers/firmware/efi/efi.c                 | 78 ++++++++++++++++++++++
drivers/firmware/efi/libstub/efi-stub.c    | 25 +++++++
include/linux/efi.h                        | 36 ++++++++++
kernel/crash_core.c                        |  7 ++
kernel/kexec_core.c                        |  5 ++
kernel/kexec_internal.h                    |  3 +
kernel/liveupdate/kexec_handover.c         | 33 +++++++++
kernel/liveupdate/kho_block.c              |  1 +
tools/testing/selftests/kho/loongarch.conf | 11 +++
tools/testing/selftests/kho/vmtest.sh      |  3 +-
12 files changed, 217 insertions(+), 1 deletion(-)
create mode 100644 tools/testing/selftests/kho/loongarch.conf
[PATCH v5 0/5] LoongArch: add KHO support and selftests
Posted by George Guo 3 weeks ago
This series enables Kexec HandOver (KHO) on 64-bit LoongArch and adds
LoongArch coverage to the KHO QEMU selftest.  KHO is the remaining
architecture gate needed by Live Update (LUO) on LoongArch.

The transport is the central problem.  Arm64 and riscv can pass the KHO
state FDT and scratch area through properties under /chosen in a boot
FDT.  LoongArch boots through EFI without a boot FDT, so that path is not
available.

EFI KHO channel:

v5 reworks the EFI transport following Pratyush's and Huacai's reviews
[1, 2].  Instead of rebuilding the EFI configuration table in
LoongArch code and switching st->tables before kexec, the common EFI stub
allocates and installs a persistent table under
LINUX_EFI_KEXEC_HANDOVER_GUID.  This follows the model used by
LINUX_EFI_MEMRESERVE_TABLE_GUID.

The common EFI table parser reserves the stub-allocated table, reads it
during early boot, and calls kho_populate().  An early initcall keeps the
table persistently mapped so it can also be updated on the crash kexec
path.  The implementation is architecture-independent; LoongArch only
selects EFI_KHO when KEXEC_HANDOVER is enabled.

The EFI table is global, but kexec can keep separate normal and crash
images and can replace a loaded candidate.  Updating the table while a
candidate image is being loaded could therefore leave it pointing at a
failed candidate while the previously installed image remains the one
that will be executed.  v5 records the KHO data in struct kimage and
synchronizes the channel from the image selected for execution.  Images
without KHO data, including legacy and crash images, clear the channel so
the next kernel boots cold rather than reviving stale state.

The GUID name is changed to LINUX_EFI_KEXEC_HANDOVER_GUID as suggested by
Huacai and Pratyush [3].  Existing x86 KHO support continues to use its
setup_data transport.  Besides supporting non-UEFI boot, that entry is
consumed by the x86 decompressor before normal EFI table parsing, so KASLR
only uses KHO scratch areas and does not overwrite preserved memory.  The
new channel is installed by the generic EFI-stub entry path and relies on
EFI_GENERIC_STUB, which x86 does not select.  Moving x86 would therefore
require installing the table from the x86-specific EFI stub and scanning it
in the decompressor, not just selecting EFI_KHO.

LoongArch enablement and build fix:

The architecture patch now only enables ARCH_SUPPORTS_KEXEC_HANDOVER and
selects the generic EFI channel.  No LoongArch setup reader, kexec writer,
or EFI system-table replacement remains.

The linux/mm.h build fix is moved from luo_session.c to kho_block.c, where
the virt_to_phys() and phys_to_virt() calls reside after the liveupdate
refactoring.  This addresses Pratyush's review [4].  Adding linux/mm.h to
asm/io.h was previously attempted, but creates an include cycle under
CONFIG_KFENCE [5].  The fix precedes LoongArch enablement so every
intermediate commit builds with CONFIG_KFENCE=y.

Selftest:

The LoongArch vmtest boots vmlinux.efi through EDK2 because the initial
EFI stub invocation installs the channel being tested.  QEMU_EFI can
override the firmware filename for distributions that install it under a
different name or path.

CONFIG_ACPI_SPCR_TABLE lets the bare earlycon parameter obtain the UART
description from EDK2's SPCR table.  CONFIG_PCI_HOST_GENERIC keeps i8042
enabled while ensuring that the QEMU virt machine's PCI I/O space is
mapped before the legacy fallback probe, addressing Huacai's concern that
the same kernel configuration should remain usable for hosts and guests.

With EFI runtime reset services available, panic=-1 and QEMU's existing
-no-reboot option terminate the test normally.  The generic QEMU runner
therefore remains unchanged and does not mask failures by forcibly
terminating QEMU after a timeout.

The LoongArch vmtest uses the default KHO scratch-sizing path.  This
series is based on the generic fix that calculates per-node scratch sizes
before scratch allocation [6].

The KHO vmtest passes on:

  * LoongArch with KVM using QEMU_EFI.fd from edk2-loongarch64.
  * x86_64 with KVM, as regression coverage for the generic kexec/KHO
    changes.

Patch layout:

  1. Add the generic EFI KHO channel and its ABI.
  2. Synchronize the channel from the selected image at execution.
  3. Fix the kho_block.c header dependency exposed by LoongArch/KFENCE.
  4. Enable KHO on 64-bit LoongArch through the generic EFI channel.
  5. Add LoongArch to the KHO QEMU selftest.

Changes since v4:

  * Allocate and install the KHO table from the common EFI stub, following
    the EFI memreserve-table model (Pratyush).
  * Parse, reserve, map, and update the channel in generic EFI code; remove
    the LoongArch-specific reader, writer, and st->tables replacement
    (Pratyush, Huacai).
  * Synchronize the global channel at execution rather than image load;
    clear it for cold and crash images and use the scratch payload size.
  * Rename the GUID to LINUX_EFI_KEXEC_HANDOVER_GUID (Huacai, Pratyush).
  * Move the linux/mm.h include from luo_session.c to the actual caller,
    kho_block.c, and place the fix before architecture enablement
    (Pratyush, Huacai).
  * Boot the vmtest through EDK2, allow QEMU_EFI to override the firmware,
    and use vmlinux.efi to exercise the EFI stub and channel.
  * Keep i8042 enabled and select PCI_HOST_GENERIC instead of disabling
    the host configuration in the selftest (Huacai).
  * Enable ACPI_SPCR_TABLE and use the SPCR-provided early console.
  * Exercise the default KHO scratch-sizing path in the LoongArch vmtest;
    depend on the separately posted generic sizing fix [6].
  * Drop the generic QEMU timeout now that EFI runtime reset services make
    the LoongArch guest terminate normally.
  * Rebase onto Linux 7.3-rc1.

[1] Pratyush Yadav:
    https://lore.kernel.org/r/2vxzo6f96fmn.fsf@kernel.org/
[2] Huacai Chen:
    https://lore.kernel.org/r/CAAhV-H4PKRNCa4g=6TGepP+trtM82JiMoWgVr3O7PqbZYP9uGw@mail.gmail.com/
[3] https://lore.kernel.org/r/2vxzse4m54nz.fsf@kernel.org/
[4] https://lore.kernel.org/r/2vxzfr0l6fam.fsf@kernel.org/
[5] https://lore.kernel.org/r/202605211925.DbDvQ6ii-lkp@intel.com/
[6] https://lore.kernel.org/loongarch/20260904025101.9959-1-dongtai.guo@linux.dev/

Previous version:

v4: https://lore.kernel.org/loongarch/20260807103714.33074-1-dongtai.guo@linux.dev/

George Guo (5):
  efi: add a KHO configuration table channel
  liveupdate: synchronize EFI KHO channel at execution
  liveupdate: kho_block: include linux/mm.h for virt/phys translation
  LoongArch: enable kexec handover (KHO)
  selftests/kho: add LoongArch vmtest support

 arch/loongarch/Kconfig                     |  4 ++
 drivers/firmware/efi/Kconfig               | 12 ++++
 drivers/firmware/efi/efi.c                 | 78 ++++++++++++++++++++++
 drivers/firmware/efi/libstub/efi-stub.c    | 25 +++++++
 include/linux/efi.h                        | 36 ++++++++++
 kernel/crash_core.c                        |  7 ++
 kernel/kexec_core.c                        |  5 ++
 kernel/kexec_internal.h                    |  3 +
 kernel/liveupdate/kexec_handover.c         | 33 +++++++++
 kernel/liveupdate/kho_block.c              |  1 +
 tools/testing/selftests/kho/loongarch.conf | 11 +++
 tools/testing/selftests/kho/vmtest.sh      |  3 +-
 12 files changed, 217 insertions(+), 1 deletion(-)
 create mode 100644 tools/testing/selftests/kho/loongarch.conf


base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
prerequisite-patch-id: a2f06addb17cc379b9f98674f087a1642588dc6e
-- 
2.53.0
Re: [PATCH v5 0/5] LoongArch: add KHO support and selftests
Posted by Huacai Chen 6 days, 14 hours ago
Hi, George,

On Fri, Sep 4, 2026 at 6:10 PM George Guo <dongtai.guo@linux.dev> wrote:
>
> This series enables Kexec HandOver (KHO) on 64-bit LoongArch and adds
> LoongArch coverage to the KHO QEMU selftest.  KHO is the remaining
> architecture gate needed by Live Update (LUO) on LoongArch.
>
> The transport is the central problem.  Arm64 and riscv can pass the KHO
> state FDT and scratch area through properties under /chosen in a boot
> FDT.  LoongArch boots through EFI without a boot FDT, so that path is not
> available.
>
> EFI KHO channel:
>
> v5 reworks the EFI transport following Pratyush's and Huacai's reviews
> [1, 2].  Instead of rebuilding the EFI configuration table in
> LoongArch code and switching st->tables before kexec, the common EFI stub
> allocates and installs a persistent table under
> LINUX_EFI_KEXEC_HANDOVER_GUID.  This follows the model used by
> LINUX_EFI_MEMRESERVE_TABLE_GUID.
>
> The common EFI table parser reserves the stub-allocated table, reads it
> during early boot, and calls kho_populate().  An early initcall keeps the
> table persistently mapped so it can also be updated on the crash kexec
> path.  The implementation is architecture-independent; LoongArch only
> selects EFI_KHO when KEXEC_HANDOVER is enabled.
>
> The EFI table is global, but kexec can keep separate normal and crash
> images and can replace a loaded candidate.  Updating the table while a
> candidate image is being loaded could therefore leave it pointing at a
> failed candidate while the previously installed image remains the one
> that will be executed.  v5 records the KHO data in struct kimage and
> synchronizes the channel from the image selected for execution.  Images
> without KHO data, including legacy and crash images, clear the channel so
> the next kernel boots cold rather than reviving stale state.
>
> The GUID name is changed to LINUX_EFI_KEXEC_HANDOVER_GUID as suggested by
> Huacai and Pratyush [3].  Existing x86 KHO support continues to use its
> setup_data transport.  Besides supporting non-UEFI boot, that entry is
> consumed by the x86 decompressor before normal EFI table parsing, so KASLR
> only uses KHO scratch areas and does not overwrite preserved memory.  The
> new channel is installed by the generic EFI-stub entry path and relies on
> EFI_GENERIC_STUB, which x86 does not select.  Moving x86 would therefore
> require installing the table from the x86-specific EFI stub and scanning it
> in the decompressor, not just selecting EFI_KHO.
>
> LoongArch enablement and build fix:
>
> The architecture patch now only enables ARCH_SUPPORTS_KEXEC_HANDOVER and
> selects the generic EFI channel.  No LoongArch setup reader, kexec writer,
> or EFI system-table replacement remains.
>
> The linux/mm.h build fix is moved from luo_session.c to kho_block.c, where
> the virt_to_phys() and phys_to_virt() calls reside after the liveupdate
> refactoring.  This addresses Pratyush's review [4].  Adding linux/mm.h to
> asm/io.h was previously attempted, but creates an include cycle under
> CONFIG_KFENCE [5].  The fix precedes LoongArch enablement so every
> intermediate commit builds with CONFIG_KFENCE=y.
>
> Selftest:
>
> The LoongArch vmtest boots vmlinux.efi through EDK2 because the initial
> EFI stub invocation installs the channel being tested.  QEMU_EFI can
> override the firmware filename for distributions that install it under a
> different name or path.
>
> CONFIG_ACPI_SPCR_TABLE lets the bare earlycon parameter obtain the UART
> description from EDK2's SPCR table.  CONFIG_PCI_HOST_GENERIC keeps i8042
> enabled while ensuring that the QEMU virt machine's PCI I/O space is
> mapped before the legacy fallback probe, addressing Huacai's concern that
> the same kernel configuration should remain usable for hosts and guests.
>
> With EFI runtime reset services available, panic=-1 and QEMU's existing
> -no-reboot option terminate the test normally.  The generic QEMU runner
> therefore remains unchanged and does not mask failures by forcibly
> terminating QEMU after a timeout.
>
> The LoongArch vmtest uses the default KHO scratch-sizing path.  This
> series is based on the generic fix that calculates per-node scratch sizes
> before scratch allocation [6].
>
> The KHO vmtest passes on:
>
>   * LoongArch with KVM using QEMU_EFI.fd from edk2-loongarch64.
>   * x86_64 with KVM, as regression coverage for the generic kexec/KHO
>     changes.
>
> Patch layout:
>
>   1. Add the generic EFI KHO channel and its ABI.
>   2. Synchronize the channel from the selected image at execution.
>   3. Fix the kho_block.c header dependency exposed by LoongArch/KFENCE.
>   4. Enable KHO on 64-bit LoongArch through the generic EFI channel.
>   5. Add LoongArch to the KHO QEMU selftest.
>
> Changes since v4:
>
>   * Allocate and install the KHO table from the common EFI stub, following
>     the EFI memreserve-table model (Pratyush).
>   * Parse, reserve, map, and update the channel in generic EFI code; remove
>     the LoongArch-specific reader, writer, and st->tables replacement
>     (Pratyush, Huacai).
>   * Synchronize the global channel at execution rather than image load;
>     clear it for cold and crash images and use the scratch payload size.
>   * Rename the GUID to LINUX_EFI_KEXEC_HANDOVER_GUID (Huacai, Pratyush).
>   * Move the linux/mm.h include from luo_session.c to the actual caller,
>     kho_block.c, and place the fix before architecture enablement
>     (Pratyush, Huacai).
>   * Boot the vmtest through EDK2, allow QEMU_EFI to override the firmware,
>     and use vmlinux.efi to exercise the EFI stub and channel.
>   * Keep i8042 enabled and select PCI_HOST_GENERIC instead of disabling
>     the host configuration in the selftest (Huacai).
>   * Enable ACPI_SPCR_TABLE and use the SPCR-provided early console.
>   * Exercise the default KHO scratch-sizing path in the LoongArch vmtest;
>     depend on the separately posted generic sizing fix [6].
>   * Drop the generic QEMU timeout now that EFI runtime reset services make
>     the LoongArch guest terminate normally.
>   * Rebase onto Linux 7.3-rc1.
>
> [1] Pratyush Yadav:
>     https://lore.kernel.org/r/2vxzo6f96fmn.fsf@kernel.org/
> [2] Huacai Chen:
>     https://lore.kernel.org/r/CAAhV-H4PKRNCa4g=6TGepP+trtM82JiMoWgVr3O7PqbZYP9uGw@mail.gmail.com/
> [3] https://lore.kernel.org/r/2vxzse4m54nz.fsf@kernel.org/
> [4] https://lore.kernel.org/r/2vxzfr0l6fam.fsf@kernel.org/
> [5] https://lore.kernel.org/r/202605211925.DbDvQ6ii-lkp@intel.com/
> [6] https://lore.kernel.org/loongarch/20260904025101.9959-1-dongtai.guo@linux.dev/
>
> Previous version:
>
> v4: https://lore.kernel.org/loongarch/20260807103714.33074-1-dongtai.guo@linux.dev/
>
> George Guo (5):
>   efi: add a KHO configuration table channel
Add....

>   liveupdate: synchronize EFI KHO channel at execution
Synchronize.....

>   liveupdate: kho_block: include linux/mm.h for virt/phys translation
Include..... (and I think kho_block can be removed)

>   LoongArch: enable kexec handover (KHO)
Enable.....

>   selftests/kho: add LoongArch vmtest support
Add.....


Huacai
>
>  arch/loongarch/Kconfig                     |  4 ++
>  drivers/firmware/efi/Kconfig               | 12 ++++
>  drivers/firmware/efi/efi.c                 | 78 ++++++++++++++++++++++
>  drivers/firmware/efi/libstub/efi-stub.c    | 25 +++++++
>  include/linux/efi.h                        | 36 ++++++++++
>  kernel/crash_core.c                        |  7 ++
>  kernel/kexec_core.c                        |  5 ++
>  kernel/kexec_internal.h                    |  3 +
>  kernel/liveupdate/kexec_handover.c         | 33 +++++++++
>  kernel/liveupdate/kho_block.c              |  1 +
>  tools/testing/selftests/kho/loongarch.conf | 11 +++
>  tools/testing/selftests/kho/vmtest.sh      |  3 +-
>  12 files changed, 217 insertions(+), 1 deletion(-)
>  create mode 100644 tools/testing/selftests/kho/loongarch.conf
>
>
> base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
> prerequisite-patch-id: a2f06addb17cc379b9f98674f087a1642588dc6e
> --
> 2.53.0
Re: [PATCH v5 0/5] LoongArch: add KHO support and selftests
Posted by Baoquan He 2 weeks, 5 days ago
On 09/04/26 at 06:08pm, George Guo wrote:
> This series enables Kexec HandOver (KHO) on 64-bit LoongArch and adds
> LoongArch coverage to the KHO QEMU selftest.  KHO is the remaining
> architecture gate needed by Live Update (LUO) on LoongArch.
> 
> The transport is the central problem.  Arm64 and riscv can pass the KHO
> state FDT and scratch area through properties under /chosen in a boot
> FDT.  LoongArch boots through EFI without a boot FDT, so that path is not
> available.

I didn't look into your patchset very carefully, but I doubt you
are reinventing the wheel. X86 didn't have FDT, seems it introduces FDT
for KHO support. LoongArch doesn't have FDT, so you reworks the EFI
transport. Is there a reason you don't want to follow the standard KHO
way using FDT too?

Please correct me if I am wrong.

> 
> EFI KHO channel:
> 
> v5 reworks the EFI transport following Pratyush's and Huacai's reviews
> [1, 2].  Instead of rebuilding the EFI configuration table in
> LoongArch code and switching st->tables before kexec, the common EFI stub
> allocates and installs a persistent table under
> LINUX_EFI_KEXEC_HANDOVER_GUID.  This follows the model used by
> LINUX_EFI_MEMRESERVE_TABLE_GUID.

> 
> The common EFI table parser reserves the stub-allocated table, reads it
> during early boot, and calls kho_populate().  An early initcall keeps the
> table persistently mapped so it can also be updated on the crash kexec
> path.  The implementation is architecture-independent; LoongArch only
> selects EFI_KHO when KEXEC_HANDOVER is enabled.
> 
> The EFI table is global, but kexec can keep separate normal and crash
> images and can replace a loaded candidate.  Updating the table while a
> candidate image is being loaded could therefore leave it pointing at a
> failed candidate while the previously installed image remains the one
> that will be executed.  v5 records the KHO data in struct kimage and
> synchronizes the channel from the image selected for execution.  Images
> without KHO data, including legacy and crash images, clear the channel so
> the next kernel boots cold rather than reviving stale state.
> 
> The GUID name is changed to LINUX_EFI_KEXEC_HANDOVER_GUID as suggested by
> Huacai and Pratyush [3].  Existing x86 KHO support continues to use its
> setup_data transport.  Besides supporting non-UEFI boot, that entry is
> consumed by the x86 decompressor before normal EFI table parsing, so KASLR
> only uses KHO scratch areas and does not overwrite preserved memory.  The
> new channel is installed by the generic EFI-stub entry path and relies on
> EFI_GENERIC_STUB, which x86 does not select.  Moving x86 would therefore
> require installing the table from the x86-specific EFI stub and scanning it
> in the decompressor, not just selecting EFI_KHO.
> 
> LoongArch enablement and build fix:
> 
> The architecture patch now only enables ARCH_SUPPORTS_KEXEC_HANDOVER and
> selects the generic EFI channel.  No LoongArch setup reader, kexec writer,
> or EFI system-table replacement remains.
> 
> The linux/mm.h build fix is moved from luo_session.c to kho_block.c, where
> the virt_to_phys() and phys_to_virt() calls reside after the liveupdate
> refactoring.  This addresses Pratyush's review [4].  Adding linux/mm.h to
> asm/io.h was previously attempted, but creates an include cycle under
> CONFIG_KFENCE [5].  The fix precedes LoongArch enablement so every
> intermediate commit builds with CONFIG_KFENCE=y.
> 
> Selftest:
> 
> The LoongArch vmtest boots vmlinux.efi through EDK2 because the initial
> EFI stub invocation installs the channel being tested.  QEMU_EFI can
> override the firmware filename for distributions that install it under a
> different name or path.
> 
> CONFIG_ACPI_SPCR_TABLE lets the bare earlycon parameter obtain the UART
> description from EDK2's SPCR table.  CONFIG_PCI_HOST_GENERIC keeps i8042
> enabled while ensuring that the QEMU virt machine's PCI I/O space is
> mapped before the legacy fallback probe, addressing Huacai's concern that
> the same kernel configuration should remain usable for hosts and guests.
> 
> With EFI runtime reset services available, panic=-1 and QEMU's existing
> -no-reboot option terminate the test normally.  The generic QEMU runner
> therefore remains unchanged and does not mask failures by forcibly
> terminating QEMU after a timeout.
> 
> The LoongArch vmtest uses the default KHO scratch-sizing path.  This
> series is based on the generic fix that calculates per-node scratch sizes
> before scratch allocation [6].
> 
> The KHO vmtest passes on:
> 
>   * LoongArch with KVM using QEMU_EFI.fd from edk2-loongarch64.
>   * x86_64 with KVM, as regression coverage for the generic kexec/KHO
>     changes.
> 
> Patch layout:
> 
>   1. Add the generic EFI KHO channel and its ABI.
>   2. Synchronize the channel from the selected image at execution.
>   3. Fix the kho_block.c header dependency exposed by LoongArch/KFENCE.
>   4. Enable KHO on 64-bit LoongArch through the generic EFI channel.
>   5. Add LoongArch to the KHO QEMU selftest.
> 
> Changes since v4:
> 
>   * Allocate and install the KHO table from the common EFI stub, following
>     the EFI memreserve-table model (Pratyush).
>   * Parse, reserve, map, and update the channel in generic EFI code; remove
>     the LoongArch-specific reader, writer, and st->tables replacement
>     (Pratyush, Huacai).
>   * Synchronize the global channel at execution rather than image load;
>     clear it for cold and crash images and use the scratch payload size.
>   * Rename the GUID to LINUX_EFI_KEXEC_HANDOVER_GUID (Huacai, Pratyush).
>   * Move the linux/mm.h include from luo_session.c to the actual caller,
>     kho_block.c, and place the fix before architecture enablement
>     (Pratyush, Huacai).
>   * Boot the vmtest through EDK2, allow QEMU_EFI to override the firmware,
>     and use vmlinux.efi to exercise the EFI stub and channel.
>   * Keep i8042 enabled and select PCI_HOST_GENERIC instead of disabling
>     the host configuration in the selftest (Huacai).
>   * Enable ACPI_SPCR_TABLE and use the SPCR-provided early console.
>   * Exercise the default KHO scratch-sizing path in the LoongArch vmtest;
>     depend on the separately posted generic sizing fix [6].
>   * Drop the generic QEMU timeout now that EFI runtime reset services make
>     the LoongArch guest terminate normally.
>   * Rebase onto Linux 7.3-rc1.
> 
> [1] Pratyush Yadav:
>     https://lore.kernel.org/r/2vxzo6f96fmn.fsf@kernel.org/
> [2] Huacai Chen:
>     https://lore.kernel.org/r/CAAhV-H4PKRNCa4g=6TGepP+trtM82JiMoWgVr3O7PqbZYP9uGw@mail.gmail.com/
> [3] https://lore.kernel.org/r/2vxzse4m54nz.fsf@kernel.org/
> [4] https://lore.kernel.org/r/2vxzfr0l6fam.fsf@kernel.org/
> [5] https://lore.kernel.org/r/202605211925.DbDvQ6ii-lkp@intel.com/
> [6] https://lore.kernel.org/loongarch/20260904025101.9959-1-dongtai.guo@linux.dev/
> 
> Previous version:
> 
> v4: https://lore.kernel.org/loongarch/20260807103714.33074-1-dongtai.guo@linux.dev/
> 
> George Guo (5):
>   efi: add a KHO configuration table channel
>   liveupdate: synchronize EFI KHO channel at execution
>   liveupdate: kho_block: include linux/mm.h for virt/phys translation
>   LoongArch: enable kexec handover (KHO)
>   selftests/kho: add LoongArch vmtest support
> 
>  arch/loongarch/Kconfig                     |  4 ++
>  drivers/firmware/efi/Kconfig               | 12 ++++
>  drivers/firmware/efi/efi.c                 | 78 ++++++++++++++++++++++
>  drivers/firmware/efi/libstub/efi-stub.c    | 25 +++++++
>  include/linux/efi.h                        | 36 ++++++++++
>  kernel/crash_core.c                        |  7 ++
>  kernel/kexec_core.c                        |  5 ++
>  kernel/kexec_internal.h                    |  3 +
>  kernel/liveupdate/kexec_handover.c         | 33 +++++++++
>  kernel/liveupdate/kho_block.c              |  1 +
>  tools/testing/selftests/kho/loongarch.conf | 11 +++
>  tools/testing/selftests/kho/vmtest.sh      |  3 +-
>  12 files changed, 217 insertions(+), 1 deletion(-)
>  create mode 100644 tools/testing/selftests/kho/loongarch.conf
> 
> 
> base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
> prerequisite-patch-id: a2f06addb17cc379b9f98674f087a1642588dc6e
> -- 
> 2.53.0
Re: [PATCH v5 0/5] LoongArch: add KHO support and selftests
Posted by Baoquan He 2 weeks, 5 days ago
On 09/07/26 at 09:47am, Baoquan He wrote:
> On 09/04/26 at 06:08pm, George Guo wrote:
> > This series enables Kexec HandOver (KHO) on 64-bit LoongArch and adds
> > LoongArch coverage to the KHO QEMU selftest.  KHO is the remaining
> > architecture gate needed by Live Update (LUO) on LoongArch.
> > 
> > The transport is the central problem.  Arm64 and riscv can pass the KHO
> > state FDT and scratch area through properties under /chosen in a boot
> > FDT.  LoongArch boots through EFI without a boot FDT, so that path is not
> > available.
> 
> I didn't look into your patchset very carefully, but I doubt you
> are reinventing the wheel. X86 didn't have FDT, seems it introduces FDT
> for KHO support. LoongArch doesn't have FDT, so you reworks the EFI
> transport. Is there a reason you don't want to follow the standard KHO
> way using FDT too?
> 
> Please correct me if I am wrong.

I was wrong. x86 doesn't introduce FDT, it just adds a SETUP_KEXEC_KHO
entry into setup_data in setup_kho(). Please forgot about it, and sorry
for the noise.

> 
> > 
> > EFI KHO channel:
> > 
> > v5 reworks the EFI transport following Pratyush's and Huacai's reviews
> > [1, 2].  Instead of rebuilding the EFI configuration table in
> > LoongArch code and switching st->tables before kexec, the common EFI stub
> > allocates and installs a persistent table under
> > LINUX_EFI_KEXEC_HANDOVER_GUID.  This follows the model used by
> > LINUX_EFI_MEMRESERVE_TABLE_GUID.
> 
> > 
> > The common EFI table parser reserves the stub-allocated table, reads it
> > during early boot, and calls kho_populate().  An early initcall keeps the
> > table persistently mapped so it can also be updated on the crash kexec
> > path.  The implementation is architecture-independent; LoongArch only
> > selects EFI_KHO when KEXEC_HANDOVER is enabled.
> > 
> > The EFI table is global, but kexec can keep separate normal and crash
> > images and can replace a loaded candidate.  Updating the table while a
> > candidate image is being loaded could therefore leave it pointing at a
> > failed candidate while the previously installed image remains the one
> > that will be executed.  v5 records the KHO data in struct kimage and
> > synchronizes the channel from the image selected for execution.  Images
> > without KHO data, including legacy and crash images, clear the channel so
> > the next kernel boots cold rather than reviving stale state.
> > 
> > The GUID name is changed to LINUX_EFI_KEXEC_HANDOVER_GUID as suggested by
> > Huacai and Pratyush [3].  Existing x86 KHO support continues to use its
> > setup_data transport.  Besides supporting non-UEFI boot, that entry is
> > consumed by the x86 decompressor before normal EFI table parsing, so KASLR
> > only uses KHO scratch areas and does not overwrite preserved memory.  The
> > new channel is installed by the generic EFI-stub entry path and relies on
> > EFI_GENERIC_STUB, which x86 does not select.  Moving x86 would therefore
> > require installing the table from the x86-specific EFI stub and scanning it
> > in the decompressor, not just selecting EFI_KHO.
> > 
> > LoongArch enablement and build fix:
> > 
> > The architecture patch now only enables ARCH_SUPPORTS_KEXEC_HANDOVER and
> > selects the generic EFI channel.  No LoongArch setup reader, kexec writer,
> > or EFI system-table replacement remains.
> > 
> > The linux/mm.h build fix is moved from luo_session.c to kho_block.c, where
> > the virt_to_phys() and phys_to_virt() calls reside after the liveupdate
> > refactoring.  This addresses Pratyush's review [4].  Adding linux/mm.h to
> > asm/io.h was previously attempted, but creates an include cycle under
> > CONFIG_KFENCE [5].  The fix precedes LoongArch enablement so every
> > intermediate commit builds with CONFIG_KFENCE=y.
> > 
> > Selftest:
> > 
> > The LoongArch vmtest boots vmlinux.efi through EDK2 because the initial
> > EFI stub invocation installs the channel being tested.  QEMU_EFI can
> > override the firmware filename for distributions that install it under a
> > different name or path.
> > 
> > CONFIG_ACPI_SPCR_TABLE lets the bare earlycon parameter obtain the UART
> > description from EDK2's SPCR table.  CONFIG_PCI_HOST_GENERIC keeps i8042
> > enabled while ensuring that the QEMU virt machine's PCI I/O space is
> > mapped before the legacy fallback probe, addressing Huacai's concern that
> > the same kernel configuration should remain usable for hosts and guests.
> > 
> > With EFI runtime reset services available, panic=-1 and QEMU's existing
> > -no-reboot option terminate the test normally.  The generic QEMU runner
> > therefore remains unchanged and does not mask failures by forcibly
> > terminating QEMU after a timeout.
> > 
> > The LoongArch vmtest uses the default KHO scratch-sizing path.  This
> > series is based on the generic fix that calculates per-node scratch sizes
> > before scratch allocation [6].
> > 
> > The KHO vmtest passes on:
> > 
> >   * LoongArch with KVM using QEMU_EFI.fd from edk2-loongarch64.
> >   * x86_64 with KVM, as regression coverage for the generic kexec/KHO
> >     changes.
> > 
> > Patch layout:
> > 
> >   1. Add the generic EFI KHO channel and its ABI.
> >   2. Synchronize the channel from the selected image at execution.
> >   3. Fix the kho_block.c header dependency exposed by LoongArch/KFENCE.
> >   4. Enable KHO on 64-bit LoongArch through the generic EFI channel.
> >   5. Add LoongArch to the KHO QEMU selftest.
> > 
> > Changes since v4:
> > 
> >   * Allocate and install the KHO table from the common EFI stub, following
> >     the EFI memreserve-table model (Pratyush).
> >   * Parse, reserve, map, and update the channel in generic EFI code; remove
> >     the LoongArch-specific reader, writer, and st->tables replacement
> >     (Pratyush, Huacai).
> >   * Synchronize the global channel at execution rather than image load;
> >     clear it for cold and crash images and use the scratch payload size.
> >   * Rename the GUID to LINUX_EFI_KEXEC_HANDOVER_GUID (Huacai, Pratyush).
> >   * Move the linux/mm.h include from luo_session.c to the actual caller,
> >     kho_block.c, and place the fix before architecture enablement
> >     (Pratyush, Huacai).
> >   * Boot the vmtest through EDK2, allow QEMU_EFI to override the firmware,
> >     and use vmlinux.efi to exercise the EFI stub and channel.
> >   * Keep i8042 enabled and select PCI_HOST_GENERIC instead of disabling
> >     the host configuration in the selftest (Huacai).
> >   * Enable ACPI_SPCR_TABLE and use the SPCR-provided early console.
> >   * Exercise the default KHO scratch-sizing path in the LoongArch vmtest;
> >     depend on the separately posted generic sizing fix [6].
> >   * Drop the generic QEMU timeout now that EFI runtime reset services make
> >     the LoongArch guest terminate normally.
> >   * Rebase onto Linux 7.3-rc1.
> > 
> > [1] Pratyush Yadav:
> >     https://lore.kernel.org/r/2vxzo6f96fmn.fsf@kernel.org/
> > [2] Huacai Chen:
> >     https://lore.kernel.org/r/CAAhV-H4PKRNCa4g=6TGepP+trtM82JiMoWgVr3O7PqbZYP9uGw@mail.gmail.com/
> > [3] https://lore.kernel.org/r/2vxzse4m54nz.fsf@kernel.org/
> > [4] https://lore.kernel.org/r/2vxzfr0l6fam.fsf@kernel.org/
> > [5] https://lore.kernel.org/r/202605211925.DbDvQ6ii-lkp@intel.com/
> > [6] https://lore.kernel.org/loongarch/20260904025101.9959-1-dongtai.guo@linux.dev/
> > 
> > Previous version:
> > 
> > v4: https://lore.kernel.org/loongarch/20260807103714.33074-1-dongtai.guo@linux.dev/
> > 
> > George Guo (5):
> >   efi: add a KHO configuration table channel
> >   liveupdate: synchronize EFI KHO channel at execution
> >   liveupdate: kho_block: include linux/mm.h for virt/phys translation
> >   LoongArch: enable kexec handover (KHO)
> >   selftests/kho: add LoongArch vmtest support
> > 
> >  arch/loongarch/Kconfig                     |  4 ++
> >  drivers/firmware/efi/Kconfig               | 12 ++++
> >  drivers/firmware/efi/efi.c                 | 78 ++++++++++++++++++++++
> >  drivers/firmware/efi/libstub/efi-stub.c    | 25 +++++++
> >  include/linux/efi.h                        | 36 ++++++++++
> >  kernel/crash_core.c                        |  7 ++
> >  kernel/kexec_core.c                        |  5 ++
> >  kernel/kexec_internal.h                    |  3 +
> >  kernel/liveupdate/kexec_handover.c         | 33 +++++++++
> >  kernel/liveupdate/kho_block.c              |  1 +
> >  tools/testing/selftests/kho/loongarch.conf | 11 +++
> >  tools/testing/selftests/kho/vmtest.sh      |  3 +-
> >  12 files changed, 217 insertions(+), 1 deletion(-)
> >  create mode 100644 tools/testing/selftests/kho/loongarch.conf
> > 
> > 
> > base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
> > prerequisite-patch-id: a2f06addb17cc379b9f98674f087a1642588dc6e
> > -- 
> > 2.53.0
Re: [PATCH v5 0/5] LoongArch: add KHO support and selftests
Posted by Mike Rapoport 2 weeks, 5 days ago
Hi George,

On Fri, Sep 04, 2026 at 06:08:47PM +0800, George Guo wrote:
> This series enables Kexec HandOver (KHO) on 64-bit LoongArch and adds
> LoongArch coverage to the KHO QEMU selftest.  KHO is the remaining
> architecture gate needed by Live Update (LUO) on LoongArch.
> 
> The transport is the central problem.  Arm64 and riscv can pass the KHO
> state FDT and scratch area through properties under /chosen in a boot
> FDT.  LoongArch boots through EFI without a boot FDT, so that path is not
> available.
> 
> EFI KHO channel:

I can't say I like "transport" and "channel" terminology. We don't send
anything anywhere.
 
> v5 reworks the EFI transport following Pratyush's and Huacai's reviews
> [1, 2].  Instead of rebuilding the EFI configuration table in
> LoongArch code and switching st->tables before kexec, the common EFI stub
> allocates and installs a persistent table under
> LINUX_EFI_KEXEC_HANDOVER_GUID.  This follows the model used by
> LINUX_EFI_MEMRESERVE_TABLE_GUID.
> 
> The common EFI table parser reserves the stub-allocated table, reads it
> during early boot, and calls kho_populate().  An early initcall keeps the
> table persistently mapped so it can also be updated on the crash kexec
> path.  The implementation is architecture-independent; LoongArch only
> selects EFI_KHO when KEXEC_HANDOVER is enabled.
> 
> The EFI table is global, but kexec can keep separate normal and crash
> images and can replace a loaded candidate.  Updating the table while a
> candidate image is being loaded could therefore leave it pointing at a
> failed candidate while the previously installed image remains the one
> that will be executed.  v5 records the KHO data in struct kimage and
> synchronizes the channel from the image selected for execution.  Images
> without KHO data, including legacy and crash images, clear the channel so
> the next kernel boots cold rather than reviving stale state.
> 
> The GUID name is changed to LINUX_EFI_KEXEC_HANDOVER_GUID as suggested by
> Huacai and Pratyush [3].  Existing x86 KHO support continues to use its
> setup_data transport.  Besides supporting non-UEFI boot, that entry is
> consumed by the x86 decompressor before normal EFI table parsing, so KASLR
> only uses KHO scratch areas and does not overwrite preserved memory.  The
> new channel is installed by the generic EFI-stub entry path and relies on
> EFI_GENERIC_STUB, which x86 does not select.  Moving x86 would therefore
> require installing the table from the x86-specific EFI stub and scanning it
> in the decompressor, not just selecting EFI_KHO.
> 
> LoongArch enablement and build fix:
> 
> The architecture patch now only enables ARCH_SUPPORTS_KEXEC_HANDOVER and
> selects the generic EFI channel.  No LoongArch setup reader, kexec writer,
> or EFI system-table replacement remains.
> 
> The linux/mm.h build fix is moved from luo_session.c to kho_block.c, where
> the virt_to_phys() and phys_to_virt() calls reside after the liveupdate
> refactoring.  This addresses Pratyush's review [4].  Adding linux/mm.h to
> asm/io.h was previously attempted, but creates an include cycle under
> CONFIG_KFENCE [5].  The fix precedes LoongArch enablement so every
> intermediate commit builds with CONFIG_KFENCE=y.
> 
> Selftest:
> 
> The LoongArch vmtest boots vmlinux.efi through EDK2 because the initial
> EFI stub invocation installs the channel being tested.  QEMU_EFI can
> override the firmware filename for distributions that install it under a
> different name or path.
> 
> CONFIG_ACPI_SPCR_TABLE lets the bare earlycon parameter obtain the UART
> description from EDK2's SPCR table.  CONFIG_PCI_HOST_GENERIC keeps i8042
> enabled while ensuring that the QEMU virt machine's PCI I/O space is
> mapped before the legacy fallback probe, addressing Huacai's concern that
> the same kernel configuration should remain usable for hosts and guests.
> 
> With EFI runtime reset services available, panic=-1 and QEMU's existing
> -no-reboot option terminate the test normally.  The generic QEMU runner
> therefore remains unchanged and does not mask failures by forcibly
> terminating QEMU after a timeout.
> 
> The LoongArch vmtest uses the default KHO scratch-sizing path.  This
> series is based on the generic fix that calculates per-node scratch sizes
> before scratch allocation [6].

The text here and in the patches changelog reads reads as LLM-generated
text. First, it's quite blind and unreadable with wall-to-wall text.
Second, LLMs tend to describe what they did in the context of a session,
but since we apply the cover letter to the liveupdate tree, the description
here should *only* describe why the changes are required and how they are
implemented. The history belongs to changes since vN-1 section.

And last, but not least, please add LLM attribution as per 

https://docs.kernel.org/process/coding-assistants.html#attribution
 
> The KHO vmtest passes on:
> 
>   * LoongArch with KVM using QEMU_EFI.fd from edk2-loongarch64.
>   * x86_64 with KVM, as regression coverage for the generic kexec/KHO
>     changes.
> 
> Patch layout:
> 
>   1. Add the generic EFI KHO channel and its ABI.
>   2. Synchronize the channel from the selected image at execution.
>   3. Fix the kho_block.c header dependency exposed by LoongArch/KFENCE.
>   4. Enable KHO on 64-bit LoongArch through the generic EFI channel.
>   5. Add LoongArch to the KHO QEMU selftest.
> 
> Changes since v4:
> 
>   * Allocate and install the KHO table from the common EFI stub, following
>     the EFI memreserve-table model (Pratyush).
>   * Parse, reserve, map, and update the channel in generic EFI code; remove
>     the LoongArch-specific reader, writer, and st->tables replacement
>     (Pratyush, Huacai).
>   * Synchronize the global channel at execution rather than image load;
>     clear it for cold and crash images and use the scratch payload size.
>   * Rename the GUID to LINUX_EFI_KEXEC_HANDOVER_GUID (Huacai, Pratyush).
>   * Move the linux/mm.h include from luo_session.c to the actual caller,
>     kho_block.c, and place the fix before architecture enablement
>     (Pratyush, Huacai).
>   * Boot the vmtest through EDK2, allow QEMU_EFI to override the firmware,
>     and use vmlinux.efi to exercise the EFI stub and channel.
>   * Keep i8042 enabled and select PCI_HOST_GENERIC instead of disabling
>     the host configuration in the selftest (Huacai).
>   * Enable ACPI_SPCR_TABLE and use the SPCR-provided early console.
>   * Exercise the default KHO scratch-sizing path in the LoongArch vmtest;
>     depend on the separately posted generic sizing fix [6].
>   * Drop the generic QEMU timeout now that EFI runtime reset services make
>     the LoongArch guest terminate normally.
>   * Rebase onto Linux 7.3-rc1.
> 
> [1] Pratyush Yadav:
>     https://lore.kernel.org/r/2vxzo6f96fmn.fsf@kernel.org/
> [2] Huacai Chen:
>     https://lore.kernel.org/r/CAAhV-H4PKRNCa4g=6TGepP+trtM82JiMoWgVr3O7PqbZYP9uGw@mail.gmail.com/
> [3] https://lore.kernel.org/r/2vxzse4m54nz.fsf@kernel.org/
> [4] https://lore.kernel.org/r/2vxzfr0l6fam.fsf@kernel.org/
> [5] https://lore.kernel.org/r/202605211925.DbDvQ6ii-lkp@intel.com/
> [6] https://lore.kernel.org/loongarch/20260904025101.9959-1-dongtai.guo@linux.dev/
> 
> Previous version:
> 
> v4: https://lore.kernel.org/loongarch/20260807103714.33074-1-dongtai.guo@linux.dev/
> 
> George Guo (5):
>   efi: add a KHO configuration table channel
>   liveupdate: synchronize EFI KHO channel at execution
>   liveupdate: kho_block: include linux/mm.h for virt/phys translation
>   LoongArch: enable kexec handover (KHO)
>   selftests/kho: add LoongArch vmtest support
> 
>  arch/loongarch/Kconfig                     |  4 ++
>  drivers/firmware/efi/Kconfig               | 12 ++++
>  drivers/firmware/efi/efi.c                 | 78 ++++++++++++++++++++++
>  drivers/firmware/efi/libstub/efi-stub.c    | 25 +++++++
>  include/linux/efi.h                        | 36 ++++++++++
>  kernel/crash_core.c                        |  7 ++
>  kernel/kexec_core.c                        |  5 ++
>  kernel/kexec_internal.h                    |  3 +
>  kernel/liveupdate/kexec_handover.c         | 33 +++++++++
>  kernel/liveupdate/kho_block.c              |  1 +
>  tools/testing/selftests/kho/loongarch.conf | 11 +++
>  tools/testing/selftests/kho/vmtest.sh      |  3 +-
>  12 files changed, 217 insertions(+), 1 deletion(-)
>  create mode 100644 tools/testing/selftests/kho/loongarch.conf
> 
> 
> base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
> prerequisite-patch-id: a2f06addb17cc379b9f98674f087a1642588dc6e
> -- 
> 2.53.0

-- 
Sincerely yours,
Mike.