Skip to content

Commit 353aac5

Browse files
committed
wip
1 parent 1ac8c4f commit 353aac5

File tree

7 files changed

+65
-29
lines changed

7 files changed

+65
-29
lines changed

src/kernel/hjert-api/api.h

+6
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ struct Domain : public Object {
9090
Res<O> create(Args &&...args) {
9191
return Hj::create<O>(_cap, std::forward<Args>(args)...);
9292
}
93+
94+
Res<Cap> attach(Object &obj) {
95+
Cap out;
96+
try$(_dup(_cap, &out, obj));
97+
return Ok(out);
98+
}
9399
};
94100

95101
struct Task : public Object {

src/kernel/hjert-api/syscalls.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ Res<> _now(TimeStamp *ts);
88

99
Res<> _log(char const *msg, usize len);
1010

11-
Res<> _create(Cap dest, Cap *cap, Props const *props);
11+
Res<> _create(Cap dest, Cap *out, Props const *props);
1212

1313
Res<> _label(Cap cap, char const *label, usize len);
1414

1515
Res<> _drop(Cap cap);
1616

1717
Res<> _pledge(Cap cap, Flags<Pledge> pledges);
1818

19-
Res<> _dup(Cap node, Cap *dst, Cap src);
19+
Res<> _dup(Cap dest, Cap *out, Cap cap);
2020

2121
Res<> _start(Cap cap, usize ip, usize sp, Args const *args);
2222

src/kernel/hjert-api/types.h

+19-9
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
namespace Hj {
88

99
#define FOREACH_TYPE(TYPE) \
10-
TYPE(NONE) \
1110
TYPE(DOMAIN) \
1211
TYPE(TASK) \
1312
TYPE(SPACE) \
@@ -167,23 +166,23 @@ struct Msg {
167166
constexpr Msg(Arg label)
168167
: label(label) {}
169168

170-
void store(usize idx, Arg arg) {
169+
void storeArg(usize idx, Arg arg) {
171170
flags &= ~(1 << idx);
172171
args[idx] = arg;
173172
}
174173

175-
void store(usize idx, Cap cap) {
176-
flags |= 1 << idx;
177-
args[idx] = cap.raw();
178-
}
179-
180-
Res<Arg> loadVal(usize idx) const {
174+
Res<Arg> loadArg(usize idx) const {
181175
if (not(flags & (1 << idx))) {
182176
return Ok(args[idx]);
183177
}
184178
return Error::invalidData("not-a-value");
185179
}
186180

181+
void storeCap(usize idx, Cap cap) {
182+
flags |= 1 << idx;
183+
args[idx] = cap.raw();
184+
}
185+
187186
Res<Cap> loadCap(usize idx) const {
188187
if (flags & (1 << idx)) {
189188
return Ok(Cap(args[idx]));
@@ -266,7 +265,6 @@ using MapFlags = Hal::VmmFlags;
266265

267266
struct DomainProps {
268267
static constexpr Type TYPE = Type::DOMAIN;
269-
usize size = 4096;
270268
};
271269

272270
struct TaskProps {
@@ -330,4 +328,16 @@ struct Props : public _Props {
330328
}
331329
};
332330

331+
struct Mapper {
332+
usize _bits;
333+
334+
usize len() {
335+
return 1 << _bits;
336+
}
337+
338+
usize mask() {
339+
return len() - 1;
340+
}
341+
};
342+
333343
} // namespace Hj

src/kernel/hjert-core/domain.cpp

+19-9
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ Res<Hj::Cap> Domain::add(Hj::Cap dest, Strong<Object> obj) {
1111

1212
auto c = dest.raw();
1313

14-
if (c != 0)
15-
return try$(get<Domain>(c & MASK))->add(c >> SHIFT, obj);
14+
if (c != 0) {
15+
auto subDomain = try$(_getUnlock<Domain>(c & MASK));
16+
auto newCap = try$(subDomain->add(c >> SHIFT, obj));
17+
return Ok(Hj::Cap{newCap._raw | (c & ~MASK)});
18+
}
1619

1720
for (c = 1; c < _slots.len(); c++) {
1821
if (not _slots[c]) {
@@ -24,27 +27,34 @@ Res<Hj::Cap> Domain::add(Hj::Cap dest, Strong<Object> obj) {
2427
return Error::invalidHandle("no free slots");
2528
}
2629

27-
Res<Strong<Object>> Domain::get(Hj::Cap cap) {
28-
ObjectLockScope scope(*this);
29-
30+
Res<Strong<Object>> Domain::_getUnlock(Hj::Cap cap) {
3031
auto c = cap.raw();
3132

32-
if (c & ~MASK)
33-
return try$(get<Domain>(c & MASK))->get(c >> SHIFT);
33+
if (c & ~MASK) {
34+
auto subDomain = try$(_getUnlock<Domain>(c & MASK));
35+
return subDomain->get(c >> SHIFT);
36+
}
3437

3538
if (not _slots[c])
3639
return Error::invalidHandle("slot is empty");
3740

3841
return Ok(*_slots[c]);
3942
}
4043

44+
Res<Strong<Object>> Domain::get(Hj::Cap cap) {
45+
ObjectLockScope scope(*this);
46+
return _getUnlock(cap);
47+
}
48+
4149
Res<> Domain::drop(Hj::Cap cap) {
4250
ObjectLockScope scope(*this);
4351

4452
auto c = cap.raw();
4553

46-
if (c & ~MASK)
47-
return try$(get<Domain>(c & MASK))->drop(c >> SHIFT);
54+
if (c & ~MASK) {
55+
auto subDomain = try$(_getUnlock<Domain>(c & MASK));
56+
return subDomain->drop(c >> SHIFT);
57+
}
4858

4959
if (not _slots[c])
5060
return Error::invalidHandle("slot is empty");

src/kernel/hjert-core/domain.h

+11-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ struct Domain : public BaseObject<Domain, Hj::Type::DOMAIN> {
88
using Slot = Opt<Strong<Object>>;
99

1010
static constexpr usize SHIFT = 11;
11-
static constexpr usize LEN = 2 << 11;
11+
static constexpr usize LEN = 1 << 11;
1212
static constexpr usize MASK = LEN - 1;
1313

1414
Array<Slot, LEN> _slots;
@@ -17,16 +17,24 @@ struct Domain : public BaseObject<Domain, Hj::Type::DOMAIN> {
1717

1818
Res<Hj::Cap> add(Hj::Cap dest, Strong<Object> obj);
1919

20+
Res<Strong<Object>> _getUnlock(Hj::Cap cap);
21+
2022
Res<Strong<Object>> get(Hj::Cap cap);
2123

2224
template <typename T>
23-
Res<Strong<T>> get(Hj::Cap cap) {
24-
auto obj = try$(get(cap));
25+
Res<Strong<T>> _getUnlock(Hj::Cap cap) {
26+
auto obj = try$(_getUnlock(cap));
2527
if (not obj.is<T>())
2628
return Error::invalidHandle("type missmatch");
2729
return Ok(try$(obj.cast<T>()));
2830
}
2931

32+
template <typename T>
33+
Res<Strong<T>> get(Hj::Cap cap) {
34+
ObjectLockScope scope(*this);
35+
return _getUnlock<T>(cap);
36+
}
37+
3038
Res<> drop(Hj::Cap cap);
3139
};
3240

src/kernel/hjert-core/syscalls.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Res<> doLog(Task &self, UserSlice<char const> msg) {
3737
});
3838
}
3939

40-
Res<> doCreate(Task &self, Hj::Cap dest, User<Hj::Cap> cap, User<Hj::Props> p) {
40+
Res<> doCreate(Task &self, Hj::Cap dest, User<Hj::Cap> out, User<Hj::Props> p) {
4141
auto props = try$(p.load(self.space()));
4242
auto obj = try$(props.visit(
4343
Visitor{
@@ -95,7 +95,7 @@ Res<> doCreate(Task &self, Hj::Cap dest, User<Hj::Cap> cap, User<Hj::Props> p) {
9595
},
9696
}));
9797

98-
return cap.store(self.space(), try$(self.domain().add(dest, obj)));
98+
return out.store(self.space(), try$(self.domain().add(dest, obj)));
9999
}
100100

101101
Res<> doLabel(Task &self, Hj::Cap cap, UserSlice<char const> label) {
@@ -122,12 +122,12 @@ Res<> doPledge(Task &self, Hj::Cap cap, Flags<Hj::Pledge> pledges) {
122122
return obj->pledge(pledges);
123123
}
124124

125-
Res<> doDup(Task &self, Hj::Cap node, User<Hj::Cap> dst, Hj::Cap src) {
126-
if (src.isRoot())
125+
Res<> doDup(Task &self, Hj::Cap dest, User<Hj::Cap> out, Hj::Cap cap) {
126+
if (cap.isRoot())
127127
return Error::invalidHandle("cannot duplicate root");
128128

129-
auto obj = try$(self.domain().get(src));
130-
return dst.store(self.space(), try$(self.domain().add(node, obj)));
129+
auto obj = try$(self.domain().get(cap));
130+
return out.store(self.space(), try$(self.domain().add(dest, obj)));
131131
}
132132

133133
Res<> doStart(Task &self, Hj::Cap cap, usize ip, usize sp, User<Hj::Args const> args) {

src/libs/karm-base/macros.h

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ namespace Karm {
1818

1919
#define ALWAYS_INLINE [[gnu::always_inline]]
2020

21+
#define _ var$(placeholder)
22+
2123
/* --- Utilities ------------------------------------------------------------ */
2224

2325
template <typename T, typename U>

0 commit comments

Comments
 (0)