freebsd-dev/stand/kboot
Warner Losh 33e5b27254 kboot: Add parsing of /proc/iomem into seg.c
We'll be using this code for most / all of the platforms since iomem is
the only interface that can tell us of the reserved to the linux kernel
areas that we cannot place the new kernel into, but that we are free to
use once we hit trampoline. aarch64 will use this shortly, and similar
code in amd64 will be refactored when I make that platform work.

Sponsored by:		Netflix
Reviewed by:		tsoome
Differential Revision:	https://reviews.freebsd.org/D38309
2023-02-03 08:41:39 -07:00
..
arch kboot: Add aarch64 fdt fixup 2023-02-03 08:41:38 -07:00
bootinfo.c kboot: copy EFI's bootinfo.c and adjust 2022-12-07 11:00:54 -07:00
conf.c kboot: Add support for ZFS volumes 2023-01-13 14:22:39 -07:00
crt1.c stand: Spell License correctly 2022-07-26 16:31:13 -06:00
host_syscall.h kboot: Assert errno is negative 2023-02-02 14:09:55 -07:00
host_syscalls.c kboot: Sort kexec_load alphabetically 2023-01-07 13:24:45 -07:00
hostcons.c kboot: Use (void) instead of () for functiosn with no args 2022-12-09 07:57:50 -07:00
hostdisk.c kboot: Probe all disks and partitions for a kernel 2023-02-03 08:41:38 -07:00
hostfs.c kboot: For hostfs, return better errors from read, where possible. 2023-02-02 13:06:31 -07:00
init.c kboot: add minmalist init functionality 2022-09-01 11:08:24 -06:00
kboot.h kboot: Add parsing of /proc/iomem into seg.c 2023-02-03 08:41:39 -07:00
kbootfdt.c kboot: Allow loading fdt from different sources 2022-12-08 22:07:52 -07:00
main.c kboot: Probe all disks and partitions for a kernel 2023-02-03 08:41:38 -07:00
Makefile kboot: Create segment handling code at main level 2023-02-03 08:41:39 -07:00
README kboot: Add readme 2022-12-03 12:48:45 -07:00
seg.c kboot: Add parsing of /proc/iomem into seg.c 2023-02-03 08:41:39 -07:00
termios_gen.h kboot: Add missing license to termios 2022-12-04 13:31:06 -07:00
termios.c kboot: implement stripped down termios 2022-07-28 15:35:42 -06:00
termios.h kboot: implement stripped down termios 2022-07-28 15:35:42 -06:00
util.c kboot: Use unsigned long long. 2022-12-02 12:41:01 -07:00
version

So to make a Linux initrd:

(1) mkdir .../initrd
(2) mkdir -p .../initrd/boot/defaults
(3) cd src/stand; make install DESTDIR=.../initrd
(4) Copy kernel to .../initrd/boot/kernel
(5) cd .../initrd
(6) cp boot/loader.kboot init
(7) find . | sort | cpio -o -H newc | gzip > /tmp/initrd.cpio
(8) download or build your linux kernel
(9) qemu-system-x86_64 -kernel ~/vmlinuz-5.19.0-051900-generic \
	-initrd /tmp/initrd.cpio \
	-m 256m -nographic \
	-monitor telnet::4444,server,nowait -serial stdio \
	-append "console=ttyS0"
    (though you may need more than 256M of ram to actually boot FreeBSD and do
     anything interesting with it and the serial console to stdio bit hasn't
     been the most stable recipe lately).

Notes:
For #6 you might need to strip loader.kboot if you copy it directly and don't
	use make install.
For #7 the sort is important, and you may need LC_ALL=C for its invocation
For #7 gzip is but one of many methods, but it's the simplest to do.
For #9, this means we can automate it using methods from
	src/tools/boot/rootgen.sh when the time comes.
#9 also likely generalizes to other architectures
For #8, see https://kernel.ubuntu.com/~kernel-ppa/mainline/ to download
	a kernel suitable for testing... For arm, I've been using the
	non 64k page kernels and 5.19 seems to not suck.

aarch64:
qemu-system-aarch64 -m 1024 -cpu cortex-a57 -M virt \
	-kernel ~/linuxboot/arm64/kernel/boot/vmlinuz-5.19.0-051900-generic \
	-initrd ~/linuxboot/arm64/initrd.img -m 256m -nographic \
	-monitor telnet::4444,server,nowait -serial stdio \
	-append "console=ttyAMA0"

General

Add -g -G to have gdb stop and wait for the debugger. This is useful for
debugging the trampoline (hbreak will set a hardware break that's durable across
code changes).  If you set the breakpoint for the trampoline and it never hits,
then there's likely no RAM there and you got the PA to load to wrong. When
debugging the trampiline and up to that, use gdb /boot/loader. When debugging
the kernel, use kernel.full to get all the debugging. hbreak panic() is useful
on the latter since you'll see the original panic, not the panic you get from
there not being an early console.