diff --git a/repos/gems/run/tresor_utils.run b/repos/gems/run/tresor_utils.run
new file mode 100644
index 0000000000..0b03aaf3ea
--- /dev/null
+++ b/repos/gems/run/tresor_utils.run
@@ -0,0 +1,160 @@
+assert_spec linux
+
+proc tresor_img_file { } { return "tresor.img" }
+
+append build_components {
+ core init timer server/lx_block server/lx_fs server/vfs app/sequence
+ app/tresor_init_trust_anchor app/tresor_init app/tresor_check
+ lib/vfs_tresor_crypto_aes_cbc lib/vfs_tresor_trust_anchor lib/vfs_jitterentropy
+ lib/libc lib/libcrypto }
+
+build $build_components
+
+create_boot_directory
+
+append config {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+install_config $config
+
+exec rm -rf bin/tresor.img
+exec truncate -s 32M bin/tresor.img
+
+append boot_modules {
+ core init timer lx_block lx_fs sequence vfs vfs.lib.so vfs_jitterentropy.lib.so
+ ld.lib.so libcrypto.lib.so libc.lib.so tresor_init_trust_anchor tresor_init
+ tresor_check vfs_tresor_trust_anchor.lib.so tresor.img vfs_tresor_crypto_aes_cbc.lib.so }
+
+build_boot_image $boot_modules
+
+run_genode_until {.*child "sequence" exited with exit value 0.*\n} 240
diff --git a/repos/gems/src/app/tresor_check/main.cc b/repos/gems/src/app/tresor_check/main.cc
index 9cbb0a4838..2e00c3939a 100644
--- a/repos/gems/src/app/tresor_check/main.cc
+++ b/repos/gems/src/app/tresor_check/main.cc
@@ -16,208 +16,97 @@
#include
#include
#include
-#include
+#include
-#include
-
-/* gems includes */
-#include
+/* tresor includes */
+#include
+#include
+#include
+#include
+#include
+#include
using namespace Genode;
+using namespace Tresor;
-namespace Tresor {
+namespace Tresor_check { class Main; }
- char const *module_name(unsigned long)
- {
- return "?";
- }
-}
-
-class Main
+class Tresor_check::Main : private Vfs::Env::User, private Tresor::Module_composition, public Tresor::Module, public Module_channel
{
private:
- enum { TX_BUF_SIZE = Block::Session::TX_QUEUE_SIZE * Tresor::BLOCK_SIZE };
+ enum State { INIT, REQ_GENERATED, CHECK_SBS_SUCCEEDED };
- Env &_env;
- Heap _heap { _env.ram(), _env.rm() };
- Allocator_avl _blk_alloc { &_heap };
- Block::Connection<> _blk { _env, &_blk_alloc, TX_BUF_SIZE };
- Signal_handler _blk_handler { _env.ep(), *this, &Main::_execute };
- Tresor::Request _blk_req { };
- Tresor::Io_buffer _blk_buf { };
- Tresor_check::Library _tresor_check { };
+ Env &_env;
+ Heap _heap { _env.ram(), _env.rm() };
+ Attached_rom_dataspace _config_rom { _env, "config" };
+ Vfs::Simple_env _vfs_env { _env, _heap, _config_rom.xml().sub_node("vfs"), *this };
+ Signal_handler _sigh { _env.ep(), *this, &Main::_handle_signal };
+ Trust_anchor _trust_anchor { _vfs_env, _config_rom.xml().sub_node("trust-anchor") };
+ Crypto _crypto { _vfs_env, _config_rom.xml().sub_node("crypto") };
+ Block_io _block_io { _vfs_env, _config_rom.xml().sub_node("block-io") };
+ Vbd_check _vbd_check { };
+ Ft_check _ft_check { };
+ Sb_check _sb_check { };
+ bool _generated_req_success { };
+ State _state { INIT };
- Genode::size_t _blk_ratio {
- Tresor::BLOCK_SIZE / _blk.info().block_size };
+ NONCOPYABLE(Main);
- void _execute()
+ void _generated_req_completed(State_uint state_uint) override
{
- for (bool progress { true }; progress; ) {
-
- progress = false;
-
- _tresor_check.execute(_blk_buf);
- if (_tresor_check.execute_progress()) {
- progress = true;
- }
-
- Tresor::Request const req {
- _tresor_check.peek_completed_client_request() };
-
- if (req.valid()) {
- _tresor_check.drop_completed_client_request(req);
- if (req.success()) {
- _env.parent().exit(0);
- } else {
- error("request was not successful");;
- _env.parent().exit(-1);
- }
- }
-
- struct Invalid_io_request : Exception { };
-
- while (_blk.tx()->ready_to_submit()) {
-
- Tresor::Io_buffer::Index data_index { 0 };
- Tresor::Request request { };
- _tresor_check.has_io_request(request, data_index);
-
- if (!request.valid()) {
- break;
- }
- if (_blk_req.valid()) {
- break;
- }
- try {
- request.tag(data_index.value);
- Block::Packet_descriptor::Opcode op;
- switch (request.operation()) {
- case Tresor::Request::Operation::READ:
- op = Block::Packet_descriptor::READ;
- break;
- case Tresor::Request::Operation::WRITE:
- op = Block::Packet_descriptor::WRITE;
- break;
- default:
- throw Invalid_io_request();
- }
- Block::Packet_descriptor packet {
- _blk.alloc_packet(Tresor::BLOCK_SIZE), op,
- request.block_number() * _blk_ratio,
- request.count() * _blk_ratio };
-
- if (request.operation() == Tresor::Request::Operation::WRITE) {
- *reinterpret_cast(
- _blk.tx()->packet_content(packet)) =
- _blk_buf.item(data_index);
- }
- _blk.tx()->try_submit_packet(packet);
- _blk_req = request;
- _tresor_check.io_request_in_progress(data_index);
- progress = true;
- }
- catch (Block::Session::Tx::Source::Packet_alloc_failed) {
- break;
- }
- }
-
- while (_blk.tx()->ack_avail()) {
-
- Block::Packet_descriptor packet =
- _blk.tx()->try_get_acked_packet();
-
- if (!_blk_req.valid()) {
- break;
- }
-
- bool const read =
- packet.operation() == Block::Packet_descriptor::READ;
-
- bool const write =
- packet.operation() == Block::Packet_descriptor::WRITE;
-
- bool const op_match =
- (read && _blk_req.read()) ||
- (write && _blk_req.write());
-
- bool const bn_match =
- packet.block_number() / _blk_ratio == _blk_req.block_number();
-
- if (!bn_match || !op_match) {
- break;
- }
-
- _blk_req.success(packet.succeeded());
-
- Tresor::Io_buffer::Index const data_index { _blk_req.tag() };
- bool const success { _blk_req.success() };
-
- if (read && success) {
- _blk_buf.item(data_index) =
- *reinterpret_cast(
- _blk.tx()->packet_content(packet));
- }
- _tresor_check.io_request_completed(data_index, success);
- _blk.tx()->release_packet(packet);
- _blk_req = Tresor::Request();
- progress = true;
- }
+ if (!_generated_req_success) {
+ error("command pool: request failed because generated request failed)");
+ _env.parent().exit(-1);
+ return;
}
- _blk.tx()->wakeup();
+ _state = (State)state_uint;
+ }
+
+ void wakeup_vfs_user() override { _sigh.local_submit(); }
+
+ void _wakeup_back_end_services() { _vfs_env.io().commit(); }
+
+ void _handle_signal()
+ {
+ execute_modules();
+ _wakeup_back_end_services();
}
public:
- Main(Env &env)
- :
- _env { env }
+ Main(Env &env) : Module_channel { COMMAND_POOL, 0 }, _env { env }
{
- if (_blk_ratio == 0) {
- error("backend block size not supported");
- _env.parent().exit(-1);
- return;
- }
-
- if (!_tresor_check.client_request_acceptable()) {
- error("failed to submit request");
- _env.parent().exit(-1);
- }
- _tresor_check.submit_client_request(
- Tresor::Request(
- Tresor::Request::Operation::READ,
- false, 0, 0, 0, 0, 0));
-
- _blk.tx_channel()->sigh_ack_avail(_blk_handler);
- _blk.tx_channel()->sigh_ready_to_submit(_blk_handler);
-
- _execute();
+ add_module(COMMAND_POOL, *this);
+ add_module(CRYPTO, _crypto);
+ add_module(TRUST_ANCHOR, _trust_anchor);
+ add_module(BLOCK_IO, _block_io);
+ add_module(VBD_CHECK, _vbd_check);
+ add_module(FT_CHECK, _ft_check);
+ add_module(SB_CHECK, _sb_check);
+ add_channel(*this);
+ _handle_signal();
}
- ~Main()
+ void execute(bool &progress) override
{
- _blk.tx_channel()->sigh_ack_avail(Signal_context_capability());
- _blk.tx_channel()->sigh_ready_to_submit(Signal_context_capability());
+ switch(_state) {
+ case INIT:
+
+ generate_req(CHECK_SBS_SUCCEEDED, progress, _generated_req_success);
+ _state = REQ_GENERATED;
+ break;
+
+ case CHECK_SBS_SUCCEEDED: _env.parent().exit(0); break;
+ default: break;
+ }
}
};
-extern "C" int memcmp(const void *p0, const void *p1, Genode::size_t size)
-{
- return Genode::memcmp(p0, p1, size);
-}
-
-extern "C" void adainit();
-
-void Component::construct(Genode::Env &env)
-{
- env.exec_static_constructors();
- Timer::Connection timer { env };
- timer.msleep(3000);
- Genode::log("start checking");
-
- Tresor::assert_valid_object_size();
-
- tresor_check_cxx_init();
-
- static Main main(env);
+void Component::construct(Genode::Env &env) { static Tresor_check::Main main { env }; }
+
+namespace Libc {
+
+ struct Env;
+ struct Component { void construct(Libc::Env &) { } };
}
diff --git a/repos/gems/src/app/tresor_check/target.mk b/repos/gems/src/app/tresor_check/target.mk
index 7a02b65167..d9689ae5f9 100644
--- a/repos/gems/src/app/tresor_check/target.mk
+++ b/repos/gems/src/app/tresor_check/target.mk
@@ -1,9 +1,7 @@
-REQUIRES += x86_64
-
TARGET := tresor_check
SRC_CC += main.cc
INC_DIR += $(PRG_DIR)
-LIBS += base tresor_check_cxx
+LIBS += base tresor
CONFIG_XSD = config.xsd
diff --git a/tool/autopilot.list b/tool/autopilot.list
index fb6d64fa0a..2bfc2f13d6 100644
--- a/tool/autopilot.list
+++ b/tool/autopilot.list
@@ -79,6 +79,7 @@ timeout_smp
timer_accuracy
tool_chain_auto
tresor_tester
+tresor_utils
tz_vmm
usb_block
usb_hid_raw