@@ -25,7 +25,7 @@ namespace Hjert::Core {
2525static constexpr bool DEBUG_SYSCALLS = false ;
2626
2727Res<> doNow (Task& self, User<Instant> ts) {
28- return ts.store (self.space (), clockNow ());
28+ return ts.store (self.space (), Clock::monotonicInstant ());
2929}
3030
3131Res<> doLog (Task& self, UserSlice<Str> msg) {
@@ -55,70 +55,70 @@ Res<> doCreate(Task& self, Hj::Cap dest, User<Hj::Cap> out, User<Hj::Props> p) {
5555 return Error::invalidInput (" invalid props" );
5656
5757 auto obj = try $(props.visit (
58- Visitor{
59- [&](Hj::DomainProps&) -> Res<Arc<Object>> {
60- return Ok (try $(Domain::create ()));
61- },
62- [&](Hj::TaskProps& props) -> Res<Arc<Object>> {
63- try $(self.ensure (Hj::Pledge::TASK));
64-
65- auto dom = props.domain .isRoot ()
66- ? try $(self._domain )
67- : try $(self.domain ().get <Domain>(props.domain ));
68-
69- auto spa = props.space .isRoot ()
70- ? try $(self._space )
71- : try $(self.domain ().get <Space>(props.space ));
72-
73- auto obj = try $(Task::create (Hj::Mode::USER, spa, dom));
74-
75- auto pledges = self.pledges ();
76- try $(obj->pledge (pledges));
77-
78- return Ok (obj);
79- },
80- [&](Hj::SpaceProps&) -> Res<Arc<Object>> {
81- try $(self.ensure (Hj::Pledge::MEM));
82-
83- return Ok (try $(Space::create ()));
84- },
85- [&](Hj::VmoProps& props) -> Res<Arc<Object>> {
86- try $(self.ensure (Hj::Pledge::MEM));
87-
88- if (not props.vmo .isRoot ()) {
89- auto vmo = try $(self.domain ().get <Vmo>(props.vmo ));
90- return Ok (try $(Vmo::makeSlice (vmo, {props.phys , props.len })));
91- }
92-
93- bool isDma = props.flags .has (Hj::VmoFlags::DMA);
94- if (isDma) {
95- try $(self.ensure (Hj::Pledge::HW));
96- return Ok (try $(Vmo::makeDma ({props.phys , props.len })));
97- }
98-
99- if (props.len > 2_GiB) {
100- return Error::invalidInput (" Vmo size too large" );
101- }
102-
103- return Ok (try $(Vmo::alloc (props.len , props.flags )));
104- },
105- [&](Hj::IopProps& props) -> Res<Arc<Object>> {
106- try $(self.ensure (Hj::Pledge::HW));
107- return Ok (try $(Iop::create ({props.base , props.len })));
108- },
109- [&](Hj::ChannelProps& props) -> Res<Arc<Object>> {
110- return Ok (try $(Channel::create (props.bufCap , props.capsCap )));
111- },
112- [&](Hj::IrqProps& props) -> Res<Arc<Object>> {
58+ [&](Hj::DomainProps&) -> Res<Arc<Object>> {
59+ return Ok (try $(Domain::create ()));
60+ },
61+ [&](Hj::TaskProps& props) -> Res<Arc<Object>> {
62+ try $(self.ensure (Hj::Pledge::TASK));
63+
64+ auto dom = props.domain .isRoot ()
65+ ? try $(self._domain )
66+ : try $(self.domain ().get <Domain>(props.domain ));
67+
68+ auto spa = props.space .isRoot ()
69+ ? try $(self._space )
70+ : try $(self.domain ().get <Space>(props.space ));
71+
72+ auto obj = try $(Task::create (Hj::Mode::USER, spa, dom));
73+
74+ auto pledges = self.pledges ();
75+ try $(obj->pledge (pledges));
76+
77+ return Ok (obj);
78+ },
79+ [&](Hj::SpaceProps&) -> Res<Arc<Object>> {
80+ try $(self.ensure (Hj::Pledge::MEM));
81+
82+ return Space::create ();
83+ },
84+ [&](Hj::VmoProps& props) -> Res<Arc<Object>> {
85+ try $(self.ensure (Hj::Pledge::MEM));
86+
87+ if (not props.vmo .isRoot ()) {
88+ auto vmo = try $(self.domain ().get <Vmo>(props.vmo ));
89+ return Vmo::makeSlice (vmo, {props.phys , props.len });
90+ }
91+
92+ bool isDma = props.flags .has (Hj::VmoFlags::DMA);
93+ if (isDma) {
11394 try $(self.ensure (Hj::Pledge::HW));
114- return Ok (try $(Irq::create (props.irq )));
115- },
116- [&](Hj::ListenerProps&) -> Res<Arc<Object>> {
117- return Ok (try $(Listener::create ()));
118- },
119- [&](Hj::PipeProps& props) -> Res<Arc<Object>> {
120- return Ok (try $(Pipe::create (props.bufCap )));
121- },
95+ return Vmo::makeDma ({props.phys , props.len });
96+ }
97+
98+ if (props.len > 2_GiB)
99+ return Error::invalidInput (" Vmo size too large" );
100+
101+ return Vmo::alloc (props.len , props.flags );
102+ },
103+ [&](Hj::IopProps& props) -> Res<Arc<Object>> {
104+ try $(self.ensure (Hj::Pledge::HW));
105+ return Iop::create ({props.base , props.len });
106+ },
107+ [&](Hj::ChannelProps& props) -> Res<Arc<Object>> {
108+ return Channel::create (props.bufCap , props.capsCap );
109+ },
110+ [&](Hj::IrqProps& props) -> Res<Arc<Object>> {
111+ try $(self.ensure (Hj::Pledge::HW));
112+ return Irq::create (props.irq );
113+ },
114+ [&](Hj::ListenerProps&) -> Res<Arc<Object>> {
115+ return Listener::create ();
116+ },
117+ [&](Hj::PipeProps& props) -> Res<Arc<Object>> {
118+ return Pipe::create (props.bufCap );
119+ },
120+ [&](Hj::ClockProps&) -> Res<Arc<Object>> {
121+ return Clock::create ();
122122 }
123123 ));
124124
@@ -141,9 +141,8 @@ Res<> doDrop(Task& self, Hj::Cap cap) {
141141}
142142
143143Res<> doPledge (Task& self, Hj::Cap cap, Flags<Hj::Pledge> pledges) {
144- if (cap.isRoot ()) {
144+ if (cap.isRoot ())
145145 return self.pledge (pledges);
146- }
147146
148147 auto obj = try $(self.domain ().get <Task>(cap));
149148 return obj->pledge (pledges);
0 commit comments