From a149131dc2f73b8e3071bc575444efdee0f274ad Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Mon, 6 Aug 2018 21:43:54 +0200 Subject: [PATCH] run: add microcode chain bootloader to nova Fixes #2762 --- repos/ports/run/microcode.run | 24 ++++++++++++++++++++---- tool/autopilot.list | 1 + tool/boot/README | 11 +++++++---- tool/boot/bender | Bin 16520 -> 16768 bytes tool/boot/microcode | Bin 0 -> 17272 bytes tool/run/boot_dir/nova | 19 +++++++++++++++++++ 6 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 tool/boot/microcode diff --git a/repos/ports/run/microcode.run b/repos/ports/run/microcode.run index 13c3b850a..bbb034ef5 100644 --- a/repos/ports/run/microcode.run +++ b/repos/ports/run/microcode.run @@ -1,5 +1,9 @@ assert_spec x86 +set ::env(MAKEFLAGS) s +set path_microcode "[exec [genode_dir]/tool/ports/current microcode_intel]/src/app/intel/intel-ucode" +set microcode_files [glob -nocomplain -dir $path_microcode *-*-*] + if { [get_cmd_switch --autopilot] } { if {[have_include "power_on/qemu"]} { @@ -9,8 +13,23 @@ if { [get_cmd_switch --autopilot] } { # platform_info data about CPUs on other kernels missing assert_spec nova + + if { [have_spec x86_64] } { + file copy -force $path_microcode/06-3c-03 bin/micro.code + } else { + file copy -force $path_microcode/06-17-06 bin/micro.code + } } +if {![file exists bin/micro.code]} { + puts "\nMissing bin/micro.code file for your target machine." + puts "Please select for your target CPU the microcode patch located in $path_microcode/xx-xx-xx." + puts "and copy it to bin/micro.code. xx-xx-xx stands for your target CPU, family-model-stepping\n" + exit 0 +} + +proc apply_microcode { } { return true } + build "core init test/microcode" create_boot_directory @@ -33,10 +52,6 @@ install_config { } -set ::env(MAKEFLAGS) s -set path_microcode [exec [genode_dir]/tool/ports/current microcode_intel] -set microcode_files [glob -dir $path_microcode/src/app/intel *-*-*] - file copy -force {*}$microcode_files bin/ @@ -57,6 +72,7 @@ run_genode_until "microcode check done" 30 # cleanup if { [get_cmd_switch --autopilot] } { + file delete -force bin/micro.code foreach file $microcode_files { file delete bin/$file } diff --git a/tool/autopilot.list b/tool/autopilot.list index ebbfadba2..3f6ed181e 100644 --- a/tool/autopilot.list +++ b/tool/autopilot.list @@ -128,3 +128,4 @@ vmm weak_ptr xml_generator xml_node +microcode diff --git a/tool/boot/README b/tool/boot/README index 70f69efef..809465ac2 100644 --- a/tool/boot/README +++ b/tool/boot/README @@ -2,16 +2,19 @@ This directory contains boot-loader files needed to boot Genode and to create boot images. The tools are available in binary form. Pointers to the source code respectively the download source of binaries are described below. -:'bender' +:'bender', 'microcode' - The 'bender' tool is part of the 'morbo' toolchain available under GPL. + The tools are part of the 'morbo' toolchain available under GPL. The toolchain was obtained from https://github.com/TUD-OS/morbo. - For Genode the bender was modified so that binaries are only relocated up + For Genode bender was modified so that binaries are only relocated up to 2G physical. Additional, relocation can be limited to 256M for sel4. + The microcode tools expect to find a module named micro.code which contains + a valid Intel microcode file for the target CPU. + The changes are available from https://github.com/alex-ab/morbo.git. - branch genode_bender, git commit e4744198ed481886c48e3dee12c1fbd47411770f + git commit 003016e096fa132e2086b4db52d1fd965dbd7363 :'pulsar': diff --git a/tool/boot/bender b/tool/boot/bender index b79f5b7ba6d4f8458546c8c0eac0453a2736be52..52617f61e5b9b4ef69e2e7c2c0823ee655cc2a26 100755 GIT binary patch delta 9643 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 eM!{%$4FjalB@AC|e98NaA^y8aJ_jt>|B delta 9349 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