You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
5.0 KiB
207 lines
5.0 KiB
proc binary_name_ld_lib_so { } { return "ld-okl4.lib.so" } |
|
proc binary_name_core_o { } { return "core-okl4.o" } |
|
proc binary_name_timer { } { return "pit_timer_drv" } |
|
|
|
proc kernel_files { } { return okl4 } |
|
|
|
|
|
## |
|
# Get the base-okl4 repository |
|
# |
|
proc base_okl4_dir {} { return [repository_contains mk/spec-okl4.mk] } |
|
|
|
|
|
## |
|
# Read the location of the OKL4 directory from 'etc/okl4.conf' |
|
# |
|
proc okl4_dir { } { |
|
global _okl4_dir |
|
|
|
if {![info exists _okl4_dir]} { |
|
if {[file exists etc/okl4.conf]} { |
|
set _okl4_dir [exec sed -n "/^OKL4_DIR/s/^.*=\\s*//p" etc/okl4.conf] |
|
if {[file exists $_okl4_dir]} { return $_okl4_dir } |
|
} |
|
|
|
set _okl4_dir [base_okl4_dir]/contrib/okl4 |
|
} |
|
|
|
return $_okl4_dir |
|
} |
|
|
|
|
|
set weaver_xml_template { |
|
<machine> |
|
<word_size size="0x20" /> |
|
<virtual_memory name="virtual"> |
|
<region base="0x120000" size="0x3fe00000" /> |
|
</virtual_memory> |
|
<physical_memory name="system_dram"> |
|
<region base="0x0" size="0xa000" type="dedicated" /> |
|
</physical_memory> |
|
<physical_memory name="bios"> |
|
<region base="0xf0000" size="0x10000" type="dedicated" /> |
|
</physical_memory> |
|
<physical_memory name="rom_expansion"> |
|
<region base="0x100000" size="0x1800000" type="dedicated" /> |
|
</physical_memory> |
|
<physical_memory name="physical"> |
|
<region base="0x2000000" size="0x30000000" type="conventional" /> |
|
</physical_memory> |
|
<phys_device name="timer_dev"> |
|
<interrupt name="int_timer0" number="0" /> |
|
</phys_device> |
|
<phys_device name="serial_dev"> |
|
<interrupt name="int_serial0" number="4" /> |
|
</phys_device> |
|
<phys_device name="rtc_dev"> |
|
</phys_device> |
|
<page_size size="0x1000" /> |
|
<page_size size="0x400000" /> |
|
</machine> |
|
<physical_pool name="system_dram" direct="true"> |
|
<memory src="system_dram" /> |
|
</physical_pool> |
|
|
|
<virtual_pool name="virtual"> |
|
<memory src="virtual" /> |
|
</virtual_pool> |
|
|
|
<physical_pool name="bios" direct="true"> |
|
<memory src="bios" /> |
|
</physical_pool> |
|
|
|
<physical_pool name="rom_expansion" direct="true"> |
|
<memory src="rom_expansion" /> |
|
</physical_pool> |
|
|
|
<physical_pool name="physical" direct="true"> |
|
<memory src="physical" /> |
|
</physical_pool> |
|
|
|
<kernel file="okl4_kernel" xip="false" > |
|
<dynamic max_threads="0x400" /> |
|
<config> |
|
<option key="root_caps" value="4096"/> |
|
</config> |
|
</kernel> |
|
|
|
<rootprogram file="core" virtpool="virtual" physpool="physical" direct="true" /> |
|
} |
|
|
|
|
|
proc run_boot_string { } { |
|
return "\n\r\033\\\[1m\033\\\[33mOKL4 -" |
|
} |
|
|
|
|
|
proc core_link_address { } { return "0x03000000" } |
|
|
|
|
|
## |
|
# Populate directory with binaries on OKL4 |
|
# |
|
proc run_boot_dir {binaries} { |
|
|
|
global weaver_xml_template |
|
|
|
# |
|
# Build kernel and dynamic linker if needed |
|
# |
|
set kernel_arg "" |
|
set ld_arg "" |
|
if {![file exists [run_dir]/genode/okl4]} { set kernel_arg kernel/okl4 } |
|
if {![file exists [run_dir]/genode/ld.lib.so]} { set ld_arg lib/ld/okl4 } |
|
set targets "$kernel_arg $ld_arg" |
|
if {[llength $targets]} { build $targets } |
|
if {$kernel_arg != ""} { file copy -force bin/okl4 [run_dir]/genode/okl4 } |
|
|
|
build_core_image $binaries |
|
exec mv [run_dir]/image.elf [run_dir].image |
|
|
|
# |
|
# Generate ELF weaver config |
|
# |
|
set fh [open "[run_dir].weaver.xml" "WRONLY CREAT TRUNC"] |
|
puts $fh {<?xml version="1.0"?>} |
|
puts $fh {<!DOCTYPE image SYSTEM "weaver-1.1.dtd">} |
|
puts $fh {<image>} |
|
regsub okl4_kernel $weaver_xml_template "[run_dir]/genode/okl4" weaver_xml_template |
|
regsub core $weaver_xml_template "[run_dir].image" weaver_xml_template |
|
puts $fh $weaver_xml_template |
|
puts $fh {</image>} |
|
close $fh |
|
|
|
# |
|
# Run ELF Weaver to create a boot image |
|
# |
|
set ret [exec "./tool/okl4/elfweaver" merge --output "[run_dir]/image.elf" "[run_dir].weaver.xml"] |
|
if {[regexp "error" $ret dummy]} { |
|
puts stderr "Elfweaver failed: $ret" |
|
exit -6 |
|
} |
|
exec [cross_dev_prefix]strip [run_dir]/image.elf |
|
|
|
# |
|
# Keep only the ELF boot image, but remove stripped binaries |
|
# |
|
exec rm -rf [run_dir]/genode |
|
|
|
if {[have_include "image/iso"] || [have_include "image/disk"]} { |
|
|
|
if {[have_include "image/disk"]} { |
|
exec mkdir -p [run_dir]/boot/grub |
|
exec cp [genode_dir]/tool/boot/bender [run_dir]/boot/bender |
|
} |
|
|
|
if {[have_include "image/iso"]} { |
|
install_iso_bootloader_to_run_dir |
|
} |
|
|
|
# |
|
# Generate GRUB config file |
|
# |
|
# The core binary is part of the 'binaries' list but it must |
|
# appear right after 'sigma0' as boot module. Hence the special case. |
|
# |
|
set fh [open "[run_dir]/boot/grub/grub.cfg" "WRONLY CREAT TRUNC"] |
|
puts $fh "set timeout=0" |
|
puts $fh "menuentry 'Genode on OKL4' {" |
|
puts $fh " insmod multiboot" |
|
puts $fh " multiboot /boot/bender" |
|
puts $fh " module /image.elf" |
|
puts $fh "}" |
|
close $fh |
|
} |
|
|
|
# |
|
# Build image |
|
# |
|
run_image |
|
|
|
if {[have_include "load/tftp"]} { |
|
# |
|
# Install PXE bootloader pulsar |
|
# |
|
install_pxe_bootloader_to_run_dir |
|
|
|
# |
|
# Generate pulsar config file |
|
# |
|
set fh [open "[run_dir]/config-52-54-00-12-34-56" "WRONLY CREAT TRUNC"] |
|
# load okl4 at 256M to avoid overwritting binary, adjust by need |
|
puts $fh " addr 0x10000000" |
|
puts $fh " exec /boot/bender" |
|
puts $fh " load /image.elf" |
|
close $fh |
|
|
|
generate_tftp_config |
|
} |
|
} |
|
|
|
|
|
## |
|
# Base source archive within depot |
|
# |
|
proc base_src { } { return base-okl4 } |
|
|
|
|