parent
23ccb0a30c
commit
ce08351d4d
@ -0,0 +1,53 @@
|
||||
{
|
||||
name = "syndicate";
|
||||
machine = { pkgs, ... }: {
|
||||
genode.init.verbose = true;
|
||||
genode.init.children.syndicate_service = {
|
||||
package = with pkgs.nimPackages;
|
||||
buildNimPackage rec {
|
||||
pname = "syndicate";
|
||||
version = "unstable";
|
||||
nimDefines.posix = { };
|
||||
src = ./src;
|
||||
propagatedBuildInputs = [ genode npeg preserves syndicate ];
|
||||
nimBinOnly = true;
|
||||
meta.mainProgram = "test";
|
||||
};
|
||||
extraInputs = with pkgs.genodePackages; [ libc stdcxx ];
|
||||
configFile = builtins.toFile "nim.dhall" ''
|
||||
let Sigil = env:DHALL_SIGIL
|
||||
|
||||
let Init = Sigil.Init
|
||||
|
||||
let Child = Init.Child
|
||||
|
||||
let Libc = Sigil.Libc
|
||||
|
||||
in λ(binary : Text) →
|
||||
Child.flat
|
||||
Child.Attributes::{
|
||||
, binary
|
||||
, exitPropagate = True
|
||||
, resources = Sigil.Init.Resources::{
|
||||
, caps = 500
|
||||
, ram = Sigil.units.MiB 10
|
||||
}
|
||||
, routes =
|
||||
[ Sigil.Init.ServiceRoute.parentLabel
|
||||
"ROM"
|
||||
(Some "state")
|
||||
(Some "state")
|
||||
]
|
||||
, config =
|
||||
(Libc.toConfig Libc.default)
|
||||
with attributes = toMap { ld_verbose = "true" }
|
||||
}
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
start_all()
|
||||
machine.wait_until_serial_output("<ROM \"config\"")
|
||||
'';
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
# SPDX-FileCopyrightText: ☭ 2022 Emery Hemingway
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later.txt
|
||||
|
||||
import std/[asyncdispatch, options, streams, strutils, xmltree]
|
||||
import genode, genode/[reports, roms]
|
||||
import preserves, preserves/xmlhooks, syndicate
|
||||
|
||||
type RomAssertion {.preservesRecord: "ROM".} = object
|
||||
name: string
|
||||
content: XmlNode
|
||||
|
||||
type RomCallback = proc (t: var Turn; rom: RomClient) {.closure, gcsafe.}
|
||||
proc newRomHandler(env: GenodeEnv; label: string; turn: var Turn; cb: RomCallback): RomHandler =
|
||||
## Create a `RomHandler` that dispatches a callback within a Syndicate `Turn`.
|
||||
let facet = turn.facet
|
||||
result = newRomHandler(env, label) do (rom: RomClient):
|
||||
run(facet) do (turn: var Turn):
|
||||
cb(turn, rom)
|
||||
|
||||
componentConstructHook = proc(env: GenodeEnv) =
|
||||
|
||||
bootDataspace("main") do (ds: Ref; turn: var Turn):
|
||||
echo "bootDataspace…"
|
||||
# Syndicate boot hook
|
||||
|
||||
onPublish(turn, ds, grab()) do (a: Assertion):
|
||||
echo "seen in Syndicate dataspace ", ds, " - ", a
|
||||
|
||||
var configHandle, stateHandle: syndicate.Handle
|
||||
let configRom = newRomHandler(env, "config", turn) do (turn: var Turn; rom: RomClient):
|
||||
# config ROM hook
|
||||
var ass = RomAssertion(name: "config", content: rom.xml)
|
||||
echo "publish ", ass.name, " XML in dataspace: ", ass.content
|
||||
replace(turn, ds, configHandle, ass)
|
@ -0,0 +1 @@
|
||||
bin = @["test.nim"]
|
Loading…
Reference in new issue