Compare commits

1 Commits
Author SHA1 Message Date
vhaudiquet 704624878e wip: duet 2026-09-04 01:38:46 +02:00
20 changed files with 428 additions and 0 deletions
+24
View File
@@ -0,0 +1,24 @@
<script setup lang="ts">
</script>
<template>
<div class="ml-auto mr-auto mt-2 mb-2 p-2 pl-4 bg-slate-100 rounded sm:max-w-[85%] max-w-[95%] border-l-2 border-slate-400 slot">
<slot />
</div>
<div class="ml-auto mr-auto mt-2 w-fit max-w-[80%] slot-desc">
<slot name="description" />
</div>
</template>
<style lang="css" scoped>
.slot :deep(blockquote) {
margin: 0;
font-style: italic;
}
.slot :deep(blockquote > *) {
font-size: 18px;
}
.slot-desc > * {
font-size: 16px;
}
</style>
+41
View File
@@ -0,0 +1,41 @@
<script setup lang="ts">
const props = withDefaults(defineProps<{
video: string,
poster?: string,
controls?: boolean | string,
autoplay?: boolean | string,
loop?: boolean | string,
muted?: boolean | string,
}>(), {
poster: undefined,
controls: true,
autoplay: false,
loop: false,
muted: false,
})
const parseBool = (value?: boolean | string) => value === true || value === "true"
</script>
<template>
<video
class="object-contain sm:max-w-[85%] max-w-[95%] m-auto"
:src="props.video"
:poster="props.poster"
:controls="parseBool(props.controls)"
:autoplay="parseBool(props.autoplay)"
:loop="parseBool(props.loop)"
:muted="parseBool(props.muted)"
preload="metadata"
playsinline
/>
<div class="ml-auto mr-auto mt-2 w-fit max-w-[80%] slot">
<slot />
</div>
</template>
<style lang="css" scoped>
.slot > * {
font-size: 16px;
}
</style>
+291
View File
@@ -0,0 +1,291 @@
---
date: '2026-08-30'
title: 'Running Ubuntu on the Lenovo IdeaPad Duet'
tags:
- ubuntu
- u-boot
- arm
- chromebook
---
I own a Lenovo IdeaPad Duet Chromebook, a ChromeOS tablet-laptop.
I had been running ChromeOS, then postmarketOS, which suddenly broke.
Time for some firmware hacking to try and get Ubuntu to run there!
<!-- more -->
## Lenovo IdeaPad Duet
::BlogImage{image="/img/duet-ubuntu/lenovo-ideapad-duet.jpg"}
*The Lenovo Ideapad Duet, 10.1" tablet, with a plug-and-play attachable keyboard, 1920x1200 screen, Mediatek MT8183 SoC, 4GiB RAM*
(Image credits: [Lenovo](https://www.lenovo.com/fr/fr/p/laptops/lenovo/chromebooks/lenovo-ct-x636/zziczctct1x))
::
I bought the device a while ago, during my first year at ENS Rennes.
It was cheap (~100€), used but in really nice condition. I love 10" laptops for their portability, and this one could even work with a stylus for note-taking, a workflow I wanted to try (turns out it wasn't really for me).
I also had never used ChromeOS, and was really curious.
At the time I was developing Android applications, and being able to natively code and run the app on-device sounded exciting.
It turned out disappointing because the performance in ChromeOS was not really there, and I had to run everything through a container which felt awkward. I silently stopped using the device.
A while later, I realized that [postmarketOS](https://postmarketos.org/) was compatible. This meant a real Linux distribution, based on [Alpine Linux](https://alpinelinux.org/), with any DE (GNOME, KDE, etc) and proper Linux tooling and performance. I had to try.
Installing postmarketOS was really easy, thanks to the effort they put into the [wiki](https://wiki.postmarketos.org/wiki/Lenovo_IdeaPad_Duet_Chromebook_(google-krane)) and [installation guide](https://wiki.postmarketos.org/wiki/Category:ChromeOS). Basically: put the device in developer mode, download an image, write it to a USB stick, and boot from it using the developer-mode menu. You then land in a live postmarketOS image you can use to install to the eMMC.
::BlogImage{image="/img/duet-ubuntu/duet-depthcharge.jpg"}
*The ChromeOS firmware 'developer mode' menu, which allows you to select boot media, USB or internal storage. Mine is in French. 'Start legacy BIOS' does not do anything here; I suspect this only works on x86 Chromebooks, and they just reused the same firmware.*
::
So far, so good; and they even have images with preinstalled DEs like GNOME. I'm a heavy GNOME user on my main computer, so I went with that one. Unfortunately, this turned out to be a mistake.
GNOME can be quite resource-hungry, which didn't suit the device's weak CPU and only 4 GiB of RAM. It was a bit slow, and there was too much friction to make it really usable.
I also find GNOME ill-suited for a "minimalist" workflow - it tends to go all out. Thinking about it now, a tiling window manager with a terminal-centric workflow would have surely been better for the device.
I kept using it anyway from time to time. Eventually I updated to postmarketOS 26.06 - and then the device refused to reboot.
I managed to reboot from the old 25.12 version, but even writing 26.06 on a USB key and booting from it does not seem to work. Something must have changed between the two versions that silently breaks booting on the Duet. While investigating that, I realized that all the necessary drivers were now present in the mainline kernel. I also now [work at Canonical on Ubuntu development, doing bring-up of RISC-V devices](https://vhaudiquet.fr/blog/joining-canonical-riscv/). Given the state of the Duet, an Ubuntu bring-up seemed really possible. So... I have a weekend. Let's do it!
## Installing Ubuntu?
At this point, I have almost no idea how postmarketOS boots on the device, what the boot flow looks like, and if anything will work with Ubuntu. One of the easiest ways to get 'something that looks like Ubuntu' is to replace the postmarketOS 26.06 rootfs with an Ubuntu rootfs. So that's what I did.
I booted into my postmarketOS 25.12 USB stick. First, I inspected the state of the internal eMMC storage:
::BlogImage{image="/img/duet-ubuntu/fdisk.jpg"}
*Running fdisk on /dev/mmcblk0, printing the partition table*
::
Ok. So there's a mysterious "ChromeOS Kernel" partition, a `/boot` EFI partition, and then the rootfs partition.
An easy way to then install the Ubuntu rootfs is to just replace that one. Which is exactly what I did, in the dumbest possible way:
::BlogCode
```console
# mount /dev/mmcblk0p3 /mnt
# ls /mnt/boot
Nothing, so /dev/mmcblk0p2 was mounted on /boot
# rm -rf /mnt/*
Removing all files on the old postmarketOS rootfs
# curl -L -O https://cdimage.ubuntu.com/.../ubuntu-base-26.04-base-arm64.tar.gz
Downloading the Ubuntu 'base' image, minimal Ubuntu rootfs
# tar -C /mnt -xzf ubuntu-base-26.04-base-arm64.tar.gz
Extracting that base Ubuntu rootfs at /dev/mmcblk0p3
```
::
With that, I was ready to `chroot` into `/mnt` to enjoy my new Ubuntu system.
::BlogImage{image="/img/duet-ubuntu/ubuntu-chroot.jpg"}
*Chrooted from postmarketOS 25.12 USB stick, into /dev/mmcblk0p3 with the new Ubuntu rootfs. I even installed some packages, like fastfetch! Notice the 6.12.87-mt81 kernel: it is the postmarketOS kernel from the USB stick.*
::
Ok, this is all very nice, but living my life inside a chroot forever and having to boot from USB just to mount the internal storage doesn't feel great at all. Time to see if we can boot into this new rootfs! I expected this to fail, as I assumed something was wrong with the new postmarketOS 26.06 kernel; but to my surprise it worked flawlessly (which means the 26.06 issue must have been in the rootfs startup programs, silently crashing something).
::BlogImage{image="/img/duet-ubuntu/ubuntu-rootfs-booted.jpg"}
*Booted from internal storage into the Ubuntu rootfs on /dev/mmcblk0p3. Notice the new 6.18.44-mt81 kernel: it is the postmarketOS kernel from the 26.06 installation, on the /dev/mmcblk0p1 or p2 boot partitions.*
::
As you can see, the device now calls itself `localhost`, so I'd have to do some setup to finish configuration; but I already had created my user account in the chroot before. Another issue: the new rootfs lacks the firmware for the postmarketOS kernel, so Wi-Fi no longer works. A simple fix is to take the 26.06 image, extract the `/lib/firmware/6.18.../*` tree, and copy it into the rootfs, which would restore Wi-Fi.
But that means staying with the postmarketOS kernel, unable to update. I did not want that, I want full Ubuntu running, including the kernel.
So I did the simplest thing: I installed the `linux-generic` package from the archive. It copied `vmlinuz` and `initrd` into `/dev/mmcblk0p2`, the `/boot` partition. I also copied the upstream dtb for the device into the `/boot` partition, so I could hardcode it in the kernel command line if needed. I expected everything to crash, nothing to work, as I did not know the bootloader, and thought the kernel would not get the correct DTB. I rebooted.
To my surprise, the machine booted normally. Even more so: I ran `fastfetch` again, **everything** was identical. **Including the kernel version.**
Wait, what? I overwrote that kernel in the `/boot` partition. Is that partition not used at all?
## Using Ubuntu Kernel
### Understanding the boot flow
Clearly, I needed to take a step back and start learning/understanding how the machine boots, as trying random stuff was not going to work anymore. So I read some resources, talked with Claude, giving him the URLs and asking for a boot flow explanation.
Turns out the boot flow is a bit complicated for Chromebooks. Here are schematics that Claude generated when explaining the chain for me. I find them quite clear.
::BlogImage{image="/img/duet-ubuntu/duet_firmware_chain.svg"}
Firmware boot chain for Chromebooks. The boot ROM contains the FSBL, that loads Coreboot, which has [upstream support for the Duet](https://github.com/coreboot/coreboot/blob/main/src/mainboard/google/kukui/panel_krane.c). Then, Coreboot loads the Arm Trusted Firmware (not relevant to this analysis), which then loads [Depthcharge](https://chromium.googlesource.com/chromiumos/platform/depthcharge/), the bootloader for ChromeOS devices.
::
So the ChromeOS bootloader, Depthcharge, is also the one responsible for the 'Developer Mode' menu allowing me to select booting from USB or internal storage. This is really interesting. Now, what is the next step? What does Depthcharge actually load?
::BlogImage{image="/img/duet-ubuntu/duet_emmc_layout_today.svg"}
Depthcharge booting internal storage. It only cares about the first, mysterious "ChromeOS kernel" partition. This actually contains a [FIT image](https://fitspec.osfw.foundation/), which is basically a bundle of kernel, initrd and device tree here.
::
That clears up the mistery! The `/boot` partition was never *actually* used at boot, only by postmarketOS to prepare the Depthcharge FIT image (using the `mkdepthcharge` tool). So installing my new kernel there was not enough. I would also have to re-generate the Depthcharge image.
### EFI environment needed
Although this would be very easy, it would unfortunately not work. See, in this bootflow, there was never an EFI-capable firmware present. Neither EDK2 nor U-Boot are used, Depthcharge directly loads and boots the kernel via the FIT image. That works fine for the postmarketOS kernel, but not for the Ubuntu kernel, which is an EFI executable and expects an EFI environment. **[Ubuntu only boots via UEFI](https://ubuntu.com/hardware/docs/image-cookbook/explanation/bootflow/)**.
So, we need a UEFI-capable firmware. The easiest to get working would be U-Boot: EDK2 can be harder to work with, and U-Boot already has support for the `mt8183` SoC. That support is only present as a config for the 'Pumpkin' reference development board of the SoC, so we will need to do some work into U-Boot to be able to boot it. Our goal is to get to chainload U-Boot via Depthcharge, to get a UEFI environment, that will be able to boot Grub which will then boot our Ubuntu kernel:
::BlogImage{image="/img/duet-ubuntu/duet_planned_efi_path.svg"}
*Target boot flow after DepthCharge.*
::
Let's get started hacking U-Boot! Wait, but do we even know how to print something to the screen? How are we going to debug this? We can't expect U-Boot with no drivers at all for the board to work right away printing debug logs... and bringing up a screen is not easy. Let's think this through.
## U-Boot
### Our target
Our goal is to have U-Boot chainloaded as a Depthcharge payload, for it to then be able to access the eMMC and load Grub that is there. Grub will then use the UEFI storage drivers, i.e. U-Boot drivers exposed over the EFI API, to load the kernel and initrd.
U-Boot already has support for the `mt8183`, so we won't need to write the drivers, which makes this work possible. Unfortunately, we will still-need board-specific adaptations for the Lenovo IdeaPad Duet, which I will also refer to by its codename `kukui-krane` (`kukui` being codename for the `mt8183`-based chromebooks, `krane` for the specific Lenovo IdeaPad Duet).
Realistically, we will need some form of logging to debug our U-Boot build. There are two options for that:
- Using a serial output on the board. This is actually possible, with what is called a [SuzyQable](https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/main/docs/ccd.md#suzyq-suzyqable) which allows to do 'CCD', Closed-Case Debug, and get an UART interface on Chromebooks. Unfortunately, I don't have such a cable (I've ordered one).
- Using the screen directly. This is harder, because we would need to write a driver for that specific panel, or the specific framebuffer as initialized by Coreboot. It is also something that we ultimately want: proper U-Boot support for the device. So let's go!
Coreboot source tree shows a `krane_panel.c` file which contains some of the panel initialization code. I was not so sure what to do with that, but I figured that either we could use Coreboot/Depthcharge code to rewrite a panel driver, or directly use the framebuffer that Coreboot did set up. So I gave that suggestion to Claude.
Immediately, it started with a wonderful idea: instead of directly trying to make that work into U-Boot, just write an assembly stub that would show colors on the screen. It also figured out how to read Coreboot's "LBIO" table to get the framebuffer details. I asked it for a detailed prompt for an agent to implement that, and it gave me one.
### krane-fb-stub
Now, I rebooted on the Duet, installed [OhMyPi](https://omp.sh/) and connected it to [GLM-5.3-Flash](https://z.ai/blog/glm-5.3-flash). I then gave it the prompt prepared by Claude, and it started implementing the stub and investigating all available kernel/firmware logs on-device.
::BlogQuote
> # Task: Build and test a minimal ARM64 "hello framebuffer" stub for a Lenovo
> # IdeaPad Duet (MT8183 / Krane)
>
> ## Goal
>
> Produce the smallest possible standalone ARM64 binary that depthcharge
> (the ChromeOS firmware bootloader) can load as if it were a Linux kernel,
> which does nothing but locate the already-initialized boot-splash framebuffer
> and fill it with solid colors at distinct checkpoints. This validates the
> whole depthcharge → custom-payload pipeline before any real U-Boot
> bring-up work begins. No U-Boot involved yet — this is a from-scratch
> freestanding binary, as small and dependency-free as possible.
#description
*Extract of Claude prompt fed to my local OhMyPi+GLM-5.3-Flash agent*
::
The agent happily started writing ARM assembly code as entry point, then C code for the mail "color display" thing, i.e. parsing Coreboot tables and device tree, finding the framebuffer, and utility code for showing colors.
The flow went like this: the agent would make a build, then bundle it into a Depthcharge image and flash it to the internal storage. Then I would reboot into it, see what happens, and report back to the agent. It took a total of 10 tries for us to get a fully working stub.
::BlogImage{image="/img/duet-ubuntu/omp-stub.jpg"}
*OhMyPi testing the framebuffer stub in QEMU, mid-implementation (**not** part of the prompt, by the way)*
::
There were small issues, like register layouts being wrong and needing re-inspection comparing Coreboot and Depthcharge trees. Debugging was a bit hard in the beginning, as "black screen, no backlight" could mean anything: from no payload to any part of the display driver being wrong.
Eventually, it figured out the real issue. Depthcharge was actually blanking the screen, killing the backlight, and disabling the display. That is a real problem, that the agent chose to circumvent by adding a *revival* step: exactly undoing what Depthcharge did, right after handoff.
Afterwards, debugging became easier: I became to see backlight patterns (blinks) that I could describe to the agent as feedback. Soon enough, there were colors on the screen.
Finally, the stub was complete, and showed the color sequence imagined by Claude: red (early init), yellow (DTB parsed), green (LBIO parsed), blue (all good). This was actually completely faked by the agent, as early init, DTB and LBIO are all necessary for detecting framebuffer, so it just parsed all and showed all colors in a sequence. In any case, using the framebuffer now works!
::BlogVideo{video="/img/duet-ubuntu/duet-stub.mp4"}
*The final stub booted on the Duet*
::
### U-Boot using the framebuffer
So, this framebuffer revival hack is a bit ugly; but I still do not have a serial cable and I would really like to be able to see U-Boot logs on the screen, and now we have a way to print to the screen, so let's go with that.
With the stub over, I asked the agent to prepare a prompt for a new session to make U-Boot work on the board, including graphical output using our work on the previous stub.
::BlogQuote
> # Task: bring up mainline U-Boot on the Lenovo IdeaPad Duet (google,krane sku176, MT8183)
>
> You are taking over a bring-up that just passed its first milestone: a minimal bare-metal payload ("krane-fb-stub") boots via depthcharge and draws to the panel. Your job is to replace it with mainline U-Boot as the payload, with a working framebuffer console, in a form that is upstreamable to mainline U-Boot later.
>
> ## Current state
> U-Boot shallow clone: /home/vhaudiquet/u-boot (mainline main, ~2026-08). SoC support exists: arch/arm/mach-mediatek/mt8183/. Reference target: configs/mt8183_pumpkin_defconfig (CONFIG_POSITION_INDEPENDENT=y, MTK serial, mtk-sd MMC, WDT, USB). dts/upstream/src/arm64/mediatek/mt8183-kukui-krane-sku176.dts exists; there is NO krane/kukui defconfig or board dir yet — that is your starting point.
#description
*Extract of the agent prompt for the new session, for U-Boot bringup*
::
This was unexpectedly a **lot** harder then the framebuffer stub. It took 27 tries before U-Boot ran properly on the device.
The first flash went in the worst possible way, i.e. the screen was pitch black again. This is really bad, as I cannot know anything about what is wrong from the observation.
I suggested the agent to use the same kind of debugging we did before: show me colored bands on the screen for every step. One in the stub (which was necessary for the revival step), one as first step in U-Boot, etc. This helped a lot to pinpoint the issues to the specific lines of code involved.
It turned out that the issue was very early in U-Boot (the agent added something like 13 checkpoints, and I only saw the second one). Actually, the steps were a bit more embarrassing, with errors made by the agent thinking something was already in U-Boot when it was in the stub, and other issues, but we ended up finding the big issue: an alignment problem.
There are two separate alignment requirements in play here, and they can't both be satisfied at the same address:
- depthcharge's boot protocol hands control to a fixed offset: `0x40` bytes into the payload. No matter what. On this device that offset is not a multiple of 4096.
- U-Boot, being built as position-independent code, requires its own entry point to be on a 4096-byte boundary. Its startup code literally checks this and spins forever if it doesn't hold, because the relocation math it does immediately afterward assumes it.
TODO finish alignment and shim
<!-- ```
Everything after that was a faster, more conventional slog: the video console turning out to need an environment variable it wasn't getting (inherited from a board config this one was forked from), a mysterious sub-second reset that turned out to be a panic handler quietly rebooting the board instead of showing an error, and a final crash traced to the video driver's memory mappings simply running U-Boot out of page-table space. None of those were especially deep bugs — mostly a matter of getting visibility into a device with no serial console and no way to leave a trace behind a reset.
``` -->
::BlogImage{image="/img/duet-ubuntu/first-uboot-prompt.jpg"}
*U-Boot finally appearing on the Duet. Appears in portrait instead of landscape, with all the diagnostic color bands from earlier.*
::
### Console and USB keyboard
Nice! We have U-Boot running. We can remove all of those silly diagnostic bands.
The console appears in portrait, and given that the device has an attached keyboard, it makes more sense to display it in landscape. So we need to add a `rot=3` parameter for the screen orientation by default.
Once we have this, we also need to rebuild U-Boot enabling all UEFI-support related configurations. Then, time to try and boot!
Wait, I can't type anything?
Right, so we first need to make the keyboard work in the U-Boot console, that will be helpful for debugging.
All we need is to enable a pre-init sequence that will run the USB set-up (even though the keyboard is attached via pogo pins, those pogo pins actually carry USB data lines).
Then we can start typing. Let me type 'help' to look at the commands and... weird, the console does not scroll. The text overwrites itself in a weird way? That was really puzzling. I re-opened the agent and explained the problem, as that did
not seem like a straightforward issue.
It turns out that it was not a straightforward issue at all, as it was actually an upstream bug. I prepared an [upstream patch that fixes scrolling on a weirdly rotated screen](https://lore.kernel.org/u-boot/20260831163056.3854693-1-valentin.haudiquet@canonical.com/T/#u) (i.e. screens were `rot=1` or `rot=3`). This is litterally a one-character fix, that the agent pointed out. Nice to be able to encounter that and fix it!
Now, we can finally try booting.
### Booting the eMMC
Let's go! `bootefi bootmgr` is the magic command to start the EFI boot manager and try to boot the EFI entries. Typing that, and... nothing. Right, we don't have any EFI bootable executable yet on the EFI partition... the Ubuntu chroot does not contain grub and it was never installed properly. So let's reboot into the chroot from the postmarketOS USB and install Grub:
::BlogCode
```
$ sudo apt install grub-efi-arm64
... installing grub package ...
$ sudo grub-install --target=arm64-efi --efi-directory=/boot/efi \
--boot-directory=/boot
... installing grub to /boot and /boot/efi ...
```
::
Now, we can try booting again. This time, `bootefi bootmgr` takes us to Grub!
::BlogImage{image="/img/duet-ubuntu/first-grub-console.jpg"}
*The Grub prompt appearing for the first time on the Duet. Sadly, that is not a Grub menu... something went wrong when grub tried to load its configuration.*
::
After investigating in Grub console, I can manually make it load `grub.cfg`; something seems wrong at handoff time, and Grub cannot access the eMMC. Maybe it is because U-Boot is still using it, so Grub cannot directly access it, and then Grub fully loads without it's config, U-Boot lets go of the eMMC, and Grub can now access it, but too late. In any case, we can manually progress to a menu.
The only issue is that this menu was portrait. After changing Grub config, we can finally get to a clean landscape Grub menu!
::BlogImage{image="/img/duet-ubuntu/first-grub-menu-landscape.jpg"}
*The Grub menu, finally working for the first time on the Duet.*
::
Finally, let's boot into Ubuntu! I see some kernel logs, of course in portrait, and... what is happening? Why is the display suddendly corrupting itself? Oh. Right. Our display framebuffer is a hack.
Remember the "revival" hack to reuse the framebuffer from coreboot for U-Boot and Grub?
Well, it seems that the kernel did not like it. After the end of the earlycon which uses that same EFI-provided framebuffer,
the kernel tries to set up the display for itself, finding it in this weird hacked state. At least that is my theory.
In any case, this makes the display show weird things, blinking bands and logs that are disappearing, with lines showing here and there. Something is wrong.
Given the display hack, and the fact that there was no way I was gonna see kernel logs on there, it felt only natural to try and implement a *real* panel driver for U-Boot and drop the hack once and for all. So that is what I (or rather, the agent) did.
## U-Boot panel driver
So.... we have to write a real panel driver. How do we do that? This was also the end of the weekend and I was starting to feel tired. But I was set on starting the real panel driver work when convenient for me.
## Kernel
+4
View File
@@ -38,6 +38,10 @@ export default defineNuxtConfig({
],
content: {
experimental: {
sqliteConnector: 'native',
},
build: {
markdown: {
highlight: {
Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

@@ -0,0 +1,24 @@
<svg width="100%" viewBox="0 0 680 380" role="img" style="" xmlns="http://www.w3.org/2000/svg"><title style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Current eMMC layout and what depthcharge actually boots</title><desc style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Depthcharge loads partition 1, a postmarketOS-packed kernel image, which then mounts the Ubuntu root filesystem on partition 3 with mismatched kernel modules; partition 2 is unused at boot time.</desc>
<defs><marker id="arrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></marker></defs>
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="260" y="30" width="160" height="50" rx="8" stroke-width="0.5" style="fill:rgb(241, 239, 232);stroke:rgb(95, 94, 90);color:rgb(11, 11, 11);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="55" text-anchor="middle" dominant-baseline="central" style="fill:rgb(68, 68, 65);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">Depthcharge</text></g>
<line x1="340" y1="80" x2="340" y2="118" marker-end="url(#arrow)" style="fill:none;stroke:rgb(137, 135, 129);color:rgb(11, 11, 11);stroke-width:1.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"><rect x="40" y="118" width="600" height="205" rx="20" stroke-width="0.5" style="fill:rgb(241, 239, 232);stroke:rgb(95, 94, 90);color:rgb(11, 11, 11);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="140" text-anchor="middle" style="fill:rgb(68, 68, 65);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:auto">eMMC storage (mmcblk0)</text>
<text x="340" y="158" text-anchor="middle" style="fill:rgb(95, 94, 90);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:auto">Custom 3-partition layout</text></g>
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="60" y="180" width="160" height="110" rx="10" stroke-width="0.5" style="fill:rgb(250, 238, 218);stroke:rgb(133, 79, 11);color:rgb(11, 11, 11);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="140" y="218" text-anchor="middle" dominant-baseline="central" style="fill:rgb(99, 56, 6);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">p1 · kernel</text>
<text x="140" y="252" text-anchor="middle" dominant-baseline="central" style="fill:rgb(133, 79, 11);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">pmOS FIT image</text></g>
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="240" y="180" width="160" height="110" rx="10" stroke-width="0.5" style="fill:rgb(241, 239, 232);stroke:rgb(95, 94, 90);color:rgb(11, 11, 11);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="320" y="218" text-anchor="middle" dominant-baseline="central" style="fill:rgb(68, 68, 65);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">p2 · /boot</text>
<text x="320" y="252" text-anchor="middle" dominant-baseline="central" style="fill:rgb(95, 94, 90);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Inactive at boot</text></g>
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="420" y="180" width="200" height="110" rx="10" stroke-width="0.5" style="fill:rgb(225, 245, 238);stroke:rgb(15, 110, 86);color:rgb(11, 11, 11);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="520" y="218" text-anchor="middle" dominant-baseline="central" style="fill:rgb(8, 80, 65);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">p3 · rootfs</text>
<text x="520" y="252" text-anchor="middle" dominant-baseline="central" style="fill:rgb(15, 110, 86);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Modules for wrong kernel</text></g>
<path d="M140,290 L140,312 L520,312 L520,290" fill="none" marker-end="url(#arrow)" style="fill:none;stroke:rgb(137, 135, 129);color:rgb(11, 11, 11);stroke-width:1.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="330" y="304" text-anchor="middle" style="fill:rgb(82, 81, 78);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:auto">kernel mounts root</text>
</svg>

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

@@ -0,0 +1,22 @@
<svg width="100%" viewBox="0 0 680 436" role="img" style="" xmlns="http://www.w3.org/2000/svg"><title style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">MT8183 Duet firmware boot chain</title><desc style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Four sequential firmware stages: Boot ROM, coreboot, TF-A BL31, then depthcharge.</desc>
<defs><marker id="arrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></marker></defs>
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="210" y="40" width="260" height="56" rx="8" stroke-width="0.5" style="fill:rgb(241, 239, 232);stroke:rgb(95, 94, 90);color:rgb(11, 11, 11);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="58" text-anchor="middle" dominant-baseline="central" style="fill:rgb(68, 68, 65);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">Boot ROM</text>
<text x="340" y="76" text-anchor="middle" dominant-baseline="central" style="fill:rgb(95, 94, 90);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Loads first-stage bootloader</text></g>
<line x1="340" y1="96" x2="340" y2="140" marker-end="url(#arrow)" style="fill:none;stroke:rgb(137, 135, 129);color:rgb(11, 11, 11);stroke-width:1.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="210" y="140" width="260" height="56" rx="8" stroke-width="0.5" style="fill:rgb(241, 239, 232);stroke:rgb(95, 94, 90);color:rgb(11, 11, 11);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="158" text-anchor="middle" dominant-baseline="central" style="fill:rgb(68, 68, 65);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">Coreboot</text>
<text x="340" y="176" text-anchor="middle" dominant-baseline="central" style="fill:rgb(95, 94, 90);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">DRAM, PMIC, panel init</text></g>
<line x1="340" y1="196" x2="340" y2="240" marker-end="url(#arrow)" style="fill:none;stroke:rgb(137, 135, 129);color:rgb(11, 11, 11);stroke-width:1.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="210" y="240" width="260" height="56" rx="8" stroke-width="0.5" style="fill:rgb(241, 239, 232);stroke:rgb(95, 94, 90);color:rgb(11, 11, 11);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="258" text-anchor="middle" dominant-baseline="central" style="fill:rgb(68, 68, 65);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">TF-A BL31</text>
<text x="340" y="276" text-anchor="middle" dominant-baseline="central" style="fill:rgb(95, 94, 90);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Secure monitor firmware</text></g>
<line x1="340" y1="296" x2="340" y2="340" marker-end="url(#arrow)" style="fill:none;stroke:rgb(137, 135, 129);color:rgb(11, 11, 11);stroke-width:1.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="210" y="340" width="260" height="56" rx="8" stroke-width="0.5" style="fill:rgb(250, 238, 218);stroke:rgb(133, 79, 11);color:rgb(11, 11, 11);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="358" text-anchor="middle" dominant-baseline="central" style="fill:rgb(99, 56, 6);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">Depthcharge</text>
<text x="340" y="376" text-anchor="middle" dominant-baseline="central" style="fill:rgb(133, 79, 11);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Verifies and loads kernel</text></g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

@@ -0,0 +1,22 @@
<svg width="100%" viewBox="0 0 680 436" role="img" style="" xmlns="http://www.w3.org/2000/svg"><title style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Planned U-Boot and EFI boot path, not yet flashed to internal storage</title><desc style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Depthcharge would chainload U-Boot instead of Linux directly, U-Boot provides a UEFI environment, which chainloads GRUB or an EFI-stub kernel, which then boots a matched Ubuntu kernel.</desc>
<defs><marker id="arrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></marker></defs>
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="210" y="40" width="260" height="56" rx="8" stroke-width="0.5" style="fill:rgb(238, 237, 254);stroke:rgb(83, 74, 183);color:rgb(11, 11, 11);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="58" text-anchor="middle" dominant-baseline="central" style="fill:rgb(60, 52, 137);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">U-Boot (in p1)</text>
<text x="340" y="76" text-anchor="middle" dominant-baseline="central" style="fill:rgb(83, 74, 183);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Chainloaded via depthcharge</text></g>
<line x1="340" y1="96" x2="340" y2="140" marker-end="url(#arrow)" style="fill:none;stroke:rgb(137, 135, 129);color:rgb(11, 11, 11);stroke-width:1.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="210" y="140" width="260" height="56" rx="8" stroke-width="0.5" style="fill:rgb(238, 237, 254);stroke:rgb(83, 74, 183);color:rgb(11, 11, 11);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="158" text-anchor="middle" dominant-baseline="central" style="fill:rgb(60, 52, 137);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">UEFI environment</text>
<text x="340" y="176" text-anchor="middle" dominant-baseline="central" style="fill:rgb(83, 74, 183);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">bootefi bootmgr</text></g>
<line x1="340" y1="196" x2="340" y2="240" marker-end="url(#arrow)" style="fill:none;stroke:rgb(137, 135, 129);color:rgb(11, 11, 11);stroke-width:1.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="210" y="240" width="260" height="56" rx="8" stroke-width="0.5" style="fill:rgb(238, 237, 254);stroke:rgb(83, 74, 183);color:rgb(11, 11, 11);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="258" text-anchor="middle" dominant-baseline="central" style="fill:rgb(60, 52, 137);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">GRUB / EFI stub</text>
<text x="340" y="276" text-anchor="middle" dominant-baseline="central" style="fill:rgb(83, 74, 183);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Loads matching kernel</text></g>
<line x1="340" y1="296" x2="340" y2="340" marker-end="url(#arrow)" style="fill:none;stroke:rgb(137, 135, 129);color:rgb(11, 11, 11);stroke-width:1.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="210" y="340" width="260" height="56" rx="8" stroke-width="0.5" style="fill:rgb(225, 245, 238);stroke:rgb(15, 110, 86);color:rgb(11, 11, 11);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="340" y="358" text-anchor="middle" dominant-baseline="central" style="fill:rgb(8, 80, 65);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">Ubuntu kernel</text>
<text x="340" y="376" text-anchor="middle" dominant-baseline="central" style="fill:rgb(15, 110, 86);stroke:none;color:rgb(11, 11, 11);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;anthropic-sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Mounts p3 cleanly</text></g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB