Project Description

When we experience a early boot crash, we are not able to analyze the kernel dump, as user-space wasn't able to load the crash system. The idea is to make the crash system compiled into the host kernel (think of initramfs) so that we can create a kernel dump really early in the boot process.

Goal for the Hackweeks

  1. Investigate if this is possible and the implications it would have (done in HW21)
  2. Hack up a PoC (done in HW22 and HW23)
  3. Prepare RFC series (giving it's only one week, we are entering wishful thinking territory here).

update HW23

  • I was able to include the crash kernel into the kernel Image.
  • I'll need to find a way to load that from init/main.c:start_kernel() probably after kcsan_init()
  • I workaround for a smoke test was to hack kexec_file_load() systemcall which has two problems:
    1. My initramfs in the porduction kernel does not have a new enough kexec version, that's not a blocker but where the week ended
    2. As the crash kernel is part of init.data it will be already stale once I can call kexec_file_load() from user-space.

The solution is probably to rewrite the POC so that the invocation can be done from init.text (that's my theory) but I'm not sure if I can reuse the kexec infrastructure in the kernel from there, which I rely on heavily.

update HW24

  • Day1
    • rebased on v6.12 with no problems others then me breaking the config
    • setting up a new compilation and qemu/virtme env
    • getting desperate as nothing works that used to work
  • Day 2
    • getting to call the invocation of loading the early kernel from __init after kcsan_init()
  • Day 3

    • fix problem of memdup not being able to alloc so much memory... use 64K page sizes for now
    • code refactoring
    • I'm now able to load the crash kernel
    • When using virtme I can boot into the crash kernel, also it doesn't boot completely (major milestone!), crash in elfcorehdr_read_notes()
  • Day 4

    • crash systems crashes (no pun intended) in copy_old_mempage() link; will need to understand elfcorehdr...
    • call path vmcore_init() -> parse_crash_elf_headers() -> elfcorehdr_read() -> read_from_oldmem() -> copy_oldmem_page() -> copy_to_iter()
  • Day 5

    • hacking arch/arm64/kernel/crash_dump.c:copy_old_mempage() to see if crash system really starts. It does.
    • fun fact: retested with more reserved memory and with UEFI FW, host kernel crashes in init but directly starts the crash kernel, so it works (somehow) \o/

update HW25

  • Day 1

    • rebased crash-kernel on v6.12.59 (for now), still crashing
    • we add three segments in the host kernel [ 0.031966] kexecearly: nrsegments = 3
      [ 0.031970] kexecearly: segment[0]: buf=0xffff467538000000 bufsz=0x3080a00 mem=0x5bc00000 memsz=0x3230000
      [ 0.053268] kexec
      early: segment[1]: buf=0xffff8000800c0000 bufsz=0x1000 mem=0x7fff0000 memsz=0x10000
      [ 0.053733] kexec_early: segment[2]: buf=0xffff46753f600000 bufsz=0x1f53 mem=0x7fe00000 memsz=0x10000
    • the second (segment[1]) is the one crashing: [ 0.209735] Unable to handle kernel level 3 address size fault at virtual address ffff800080ac0000 so let's try to find out what that is...
  • TODOs

    • fix elfcorehdr so that we actually can make use of all this...
    • test where in the boot __init() chain we can/should call kexec_early_dump()
    • do we really need memdup() or can we used the complied kernel for creating the segments?
    • refactor and rename everything (Kconfig menu shows in wrong place, Kconfig entry needs to go somewhere else, ekdump vs early_dump vs early_kdump

Resources

Looking for hackers with the skills:

kernel kdump

This project is part of:

Hack Week 21 Hack Week 22 Hack Week 23 Hack Week 24 Hack Week 25

Activity

  • 23 days ago: gniebler liked this project.
  • 25 days ago: horon liked this project.
  • 2 months ago: granvilteson23 joined this project.
  • 5 months ago: joe21 liked this project.
  • about 1 year ago: djais liked this project.
  • about 1 year ago: livdywan liked this project.
  • about 1 year ago: huanxie liked this project.
  • about 1 year ago: djais joined this project.
  • about 1 year ago: jmodak liked this project.
  • about 1 year ago: eomelette joined this project.
  • over 1 year ago: m.crivellari liked this project.
  • about 2 years ago: vbabka liked this project.
  • about 2 years ago: pvorel liked this project.
  • almost 3 years ago: jzerebecki liked this project.
  • almost 3 years ago: tdz liked this project.
  • almost 3 years ago: Zildj1an liked this project.
  • almost 3 years ago: Zildj1an joined this project.
  • almost 3 years ago: tschmitz liked this project.
  • almost 3 years ago: paolodepa liked this project.
  • almost 3 years ago: afeijoo liked this project.
  • over 3 years ago: clin liked this project.
  • over 3 years ago: ptesarik liked this project.
  • over 3 years ago: akumar joined this project.
  • over 3 years ago: akumar liked this project.
  • over 3 years ago: coolgw liked this project.
  • All Activity

    Comments

    • mbrugger
      about 2 years ago by mbrugger | Reply

      I got a tip to look into grub2 multiboot. Maybe we can load the crash kernel to the reserved memory region from grub. We then would only need to pass a kernel argument so that the kernel takes this into account.

    • ptesarik
      over 1 year ago by ptesarik | Reply

      FWIW I was contemplating a similar scheme back in 2016. My idea was to load: 1. kdump kernel 2. kdump initrd 3. production kernel 4. production initrd Then boot into the kdump kernel, update memory maps and kexec to the production kernel. When the production kernel crashes, pass control back to the kdump kernel. For the return to the kdump kernel, I was looking at the KEXEC_PRESERVE_CONTEXT flag, but in the end I doubt it's really helpful without further modifications to the production kernel. At this point, it's probably easier to boot the production kernel first and set up an initial crash kernel at early boot.

      Good luck!

    • mbrugger
      about 1 year ago by mbrugger | Reply

      [ 0.221029] Unable to handle kernel level 3 address size fault at virtual address ffff800080aa0000
      [ 0.222848] Mem abort info:
      [ 0.223419] ESR = 0x0000000096000003
      [ 0.224187] EC = 0x25: DABT (current EL), IL = 32 bits
      [ 0.225300] SET = 0, FnV = 0
      [ 0.225933] EA = 0, S1PTW = 0
      [ 0.226587] FSC = 0x03: level 3 address size fault
      [ 0.227600] Data abort info:
      [ 0.228198] ISV = 0, ISS = 0x00000003, ISS2 = 0x00000000
      [ 0.229351] CM = 0, WnR = 0, TnD = 0, TagAccess = 0
      [ 0.230385] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
      [ 0.231466] swapper pgtable: 64k pages, 48-bit VAs, pgdp=000000005d6b0000
      [ 0.232850] [ffff800080aa0000] pgd=100000005ef80003, p4d=100000005ef80003, pud=100000005ef80003, pmd=100000005ef90003, pte=00681591c0000f03
      [ 0.235548] Internal error: Oops: 0000000096000003 [#1] PREEMPT SMP
      [ 0.236828] Modules linked in:
      [ 0.237504] CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.12.0-dirty #9
      [ 0.239037] Hardware name: linux,dummy-virt (DT)
      [ 0.240047] pstate: a0400005 (NzCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
      [ 0.241563] pc : _memcpy+0x110/0x230
      [ 0.242374] lr : _copy
      toiter+0x374/0x670
      [ 0.243276] sp : ffff8000800efa20
      [ 0.244009] x29: ffff8000800efa70 x28: 0000000000000000 x27: ffff800080aa0000
      [ 0.245577] x26: ffff8000800efba0 x25: 00000000000001a8 x24: ffffd7d750365000
      [ 0.247124] x23: ffff8000800efbb0 x22: 0000000000000000 x21: ffff8000800efba0
      [ 0.248672] x20: 00000000000001a8 x19: 0000000000000000 x18: ffffffffffffffff
      [ 0.250234] x17: 0000000087130253 x16: 00000000e547dfaa x15: 0720072007200720
      [ 0.251792] x14: ffffa2fe3f221a00 x13: ffffd7d750365fb8 x12: ffffd7d75162c9c8
      [ 0.253349] x11: ffffd7d75169ca30 x10: ffffd7d7516849f0 x9 : ffffd7d751684a48
      [ 0.254900] x8 : 0000000000017fe8 x7 : c0000000ffffefff x6 : 0000000000000001
      [ 0.256457] x5 : ffff22febfcc1ba8 x4 : ffff800080aa01a8 x3 : 00000000ffffefff
      [ 0.258013] x2 : 00000000000001a8 x1 : ffff800080aa0000 x0 : ffff22febfcc1a00
      [ 0.259564] Call trace:
      [ 0.260109] _
      memcpy+0x110/0x230
      [ 0.260842] copyoldmempage+0xc8/0x110
      [ 0.261713] readfromoldmem+0x1bc/0x268
      [ 0.262595] elfcorehdrreadnotes+0x9c/0xd0
      [ 0.263536] mergenoteheaderself64.constprop.15+0x110/0x3b0
      [ 0.264813] vmcore
      init+0x298/0x794
      [ 0.265612] dooneinitcall+0x64/0x1e8
      [ 0.266455] kernelinitfreeable+0x238/0x288

    Similar Projects

    Add Qualcomm Snapdragon 765G (SM7250) basic device tree to mainline linux kernel by pvorel

    Qualcomm Snapdragon 765G (SM7250) (smartphone SoC) has no support in the linux kernel, nor in u-boot. Try to add basic device tree support. The hardest part will be to create boot.img which will be accepted by phone.

    UART is available for smartphone :).


    Improve UML page fault handler by ptesarik

    Description

    Improve UML handling of segmentation faults in kernel mode. Although such page faults are generally caused by a kernel bug, it is annoying if they cause an infinite loop, or panic the kernel. More importantly, a robust implementation allows to write KUnit tests for various guard pages, preventing potential kernel self-protection regressions.

    Goals

    Convert the UML page fault handler to use oops_* helpers, go through a few review rounds and finally get my patch series merged in 6.14.

    Resources

    Wrong initial attempt: https://lore.kernel.org/lkml/20231215121431.680-1-petrtesarik@huaweicloud.com/T/


    pudc - A PID 1 process that barks to the internet by mssola

    Description

    As a fun exercise in order to dig deeper into the Linux kernel, its interfaces, the RISC-V architecture, and all the dragons in between; I'm building a blog site cooked like this:

    • The backend is written in a mixture of C and RISC-V assembly.
    • The backend is actually PID1 (for real, not within a container).
    • We poll and parse incoming HTTP requests ourselves.
    • The frontend is a mere HTML page with htmx.

    The project is meant to be Linux-specific, so I'm going to use io_uring, pidfs, namespaces, and Linux-specific features in order to drive all of this.

    I'm open for suggestions and so on, but this is meant to be a solo project, as this is more of a learning exercise for me than anything else.

    Goals

    • Have a better understanding of different Linux features from user space down to the kernel internals.
    • Most importantly: have fun.

    Resources


    bpftrace contribution by mkoutny

    Description

    bpftrace is a great tool, no need to sing odes to it here. It can access any kernel data and process them in real time. It provides helpers for some common Linux kernel structures but not all.

    Goals

    • set up bpftrace toolchain
    • learn about bpftrace implementation and internals
    • implement support for percpu_counters
    • look into some of the first issues
    • send a refined PR (on Thu)

    Resources


    Backporting patches using LLM by jankara

    Description

    Backporting Linux kernel fixes (either for CVE issues or as part of general git-fixes workflow) is boring and mostly mechanical work (dealing with changes in context, renamed variables, new helper functions etc.). The idea of this project is to explore usage of LLM for backporting Linux kernel commits to SUSE kernels using LLM.

    Goals

    • Create safe environment allowing LLM to run and backport patches without exposing the whole filesystem to it (for privacy and security reasons).
    • Write prompt that will guide LLM through the backporting process. Fine tune it based on experimental results.
    • Explore success rate of LLMs when backporting various patches.

    Resources

    • Docker
    • Gemini CLI

    Repository

    Current version of the container with some instructions for use are at: https://gitlab.suse.de/jankara/gemini-cli-backporter