mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-29 18:18:54 +00:00
3c24715d16
Inspired by the excellent imx_linux.run script.
135 lines
3.2 KiB
Plaintext
135 lines
3.2 KiB
Plaintext
if {![have_include "load/ipxe"]} {
|
|
puts "run script requires load/ipxe"
|
|
exit 1
|
|
}
|
|
|
|
proc _arch { } {
|
|
if {[have_spec "x86_32"]} { return "x86_32" }
|
|
if {[have_spec "x86_64"]} { return "x86_64" }
|
|
puts "not supported architecture!"
|
|
exit 1
|
|
}
|
|
|
|
set arch [_arch]
|
|
set ramdisk [run_dir]/rootfs.cpio
|
|
|
|
create_boot_directory
|
|
|
|
build { pc_linux busybox }
|
|
|
|
# Create expected boot directory, as we cannot use build_boot_image
|
|
exec mkdir -p [run_dir]/boot
|
|
|
|
#
|
|
# Create script to run inside the initramfs under /etc/init.d/rcS
|
|
#
|
|
proc _init_rcs { } {
|
|
set file_path [run_dir]/rcS
|
|
set fd [open $file_path w]
|
|
puts $fd {#!bin/sh
|
|
mount -t proc none /proc
|
|
mount -t sysfs none /sys
|
|
mount -t tmpfs none /var
|
|
mount -t tmpfs none /dev
|
|
/sbin/mdev -s
|
|
mkdir /var/log
|
|
echo "****"
|
|
echo "**** Please connect to console in a new terminal"
|
|
echo "****"
|
|
}
|
|
close $fd
|
|
return $file_path
|
|
}
|
|
|
|
set init_rcs [_init_rcs]
|
|
|
|
#
|
|
# CPIO content description used by `gen_init_cpio`
|
|
#
|
|
proc _cpio_desc { } {
|
|
global init_rcs arch
|
|
set bblist [open busybox/$arch/busybox.links r]
|
|
set file_path [run_dir]/cpio.desc
|
|
set fd [open $file_path w]
|
|
|
|
puts $fd "dir /bin 0755 0 0"
|
|
puts $fd "dir /dev 0755 0 0"
|
|
puts $fd "dir /etc 0755 0 0"
|
|
puts $fd "dir /etc/init.d 0755 0 0"
|
|
puts $fd "dir /proc 0755 0 0"
|
|
puts $fd "dir /root 0700 0 0"
|
|
puts $fd "dir /sbin 0755 0 0"
|
|
puts $fd "dir /sys 0755 0 0"
|
|
puts $fd "dir /usr 0755 0 0"
|
|
puts $fd "dir /usr/bin 0755 0 0"
|
|
puts $fd "dir /usr/sbin 0755 0 0"
|
|
puts $fd "dir /var 0755 0 0"
|
|
puts $fd "nod /dev/console 0622 0 0 c 5 1"
|
|
puts $fd "nod /dev/null 0666 0 0 c 1 3"
|
|
puts $fd "file /bin/busybox busybox/$arch/busybox 0755 0 0"
|
|
puts $fd "file /etc/init.d/rcS $init_rcs 0755 0 0"
|
|
|
|
foreach line [split [read $bblist] \n] {
|
|
if {[string trim $line] != ""} {
|
|
puts $fd "slink $line /bin/busybox 0755 0 0"
|
|
}
|
|
}
|
|
close $bblist
|
|
close $fd
|
|
|
|
return $file_path
|
|
}
|
|
|
|
set cpio_desc [_cpio_desc]
|
|
|
|
proc _uart { } {
|
|
if {[have_board "pc"]} { return "ttyS0" }
|
|
puts "not supported board!"
|
|
exit 1
|
|
}
|
|
|
|
set uart [_uart]
|
|
|
|
create_ipxe_config
|
|
update_ipxe_boot_dir
|
|
|
|
proc _boot_script { } {
|
|
global uart
|
|
set file_path [run_dir]/boot.cfg
|
|
set fd [open $file_path w]
|
|
puts $fd "#!ipxe
|
|
kernel bzImage console=$uart,115200 root=/dev/ram ip=dhcp debug rdinit=/linuxrc initrd=rootfs.cpio.gz
|
|
initrd rootfs.cpio.gz
|
|
boot
|
|
"
|
|
close $fd
|
|
return $file_path
|
|
}
|
|
|
|
# example to amend rootfs with wifi firmware
|
|
if {false} {
|
|
import_from_depot [depot_user]/raw/pc_wifi_firmware
|
|
|
|
exec tar -C [run_dir]/genode -xf [run_dir]/genode/pc_wifi_firmware.tar iwlwifi-QuZ-a0-hr-b0-68.ucode
|
|
|
|
set fd [open $cpio_desc a]
|
|
puts $fd "dir /lib 0755 0 0"
|
|
puts $fd "dir /lib/firmware 0755 0 0"
|
|
puts $fd "file /lib/firmware/iwlwifi-QuZ-a0-hr-b0-68.ucode [run_dir]/genode/iwlwifi-QuZ-a0-hr-b0-68.ucode 0755 0 0"
|
|
close $fd
|
|
}
|
|
|
|
set boot_script [_boot_script]
|
|
|
|
|
|
# Provide kernel image and create initial-ram-filesystem
|
|
file copy pc_linux/$arch/arch/x86/boot/bzImage [run_dir]/
|
|
exec pc_linux/$arch/usr/gen_init_cpio $cpio_desc > $ramdisk
|
|
exec gzip $ramdisk
|
|
|
|
# Trick run tools that the kernel started
|
|
proc run_boot_string { } { return "Booting Linux" }
|
|
|
|
run_genode_until forever
|
|
interact
|