genode/base-nova/patches/xlt_rcv.patch

49 lines
1.4 KiB
Diff

diff --git a/src/pd.cpp b/src/pd.cpp
index 8160d73..be9aa63 100644
--- a/src/pd.cpp
+++ b/src/pd.cpp
@@ -173,6 +173,7 @@ void Pd::xlt_crd (Pd *pd, Crd xlt, Crd &crd)
sb = (sb - mdb->node_base) + (mdb->node_phys - node->node_phys) + node->node_base;
if ((ro = clamp (sb, rb, so, ro)) != ~0UL) {
+ trace (TRACE_DEL, "XLT OBJ PD:%p->%p SB:%#010lx RB:%#010lx O:%#04lx", pd, this, crd.base(), rb, so);
crd = Crd (crd.type(), rb, ro, mdb->node_attr);
return;
}
@@ -245,22 +246,32 @@ void Pd::rev_crd (Crd crd, bool self)
void Pd::xfer_items (Pd *src, Crd xlt, Crd del, Xfer *s, Xfer *d, unsigned long ti)
{
- for (Crd crd; ti--; s--) {
+ mword set_as_del;
+ for (Crd crd; ti--; s--) {
+
crd = *s;
+ set_as_del = 0;
- switch (s->flags() & 1) {
+ switch (s->flags() & 3) {
case 0:
xlt_crd (src, xlt, crd);
break;
+ case 2:
+ xlt_crd (src, xlt, crd);
+ if (crd.type()) break;
+
+ crd = *s;
+ set_as_del = 1;
+
case 1:
del_crd (src == &root && s->flags() & 0x800 ? &kern : src, del, crd, s->flags() >> 9 & 3, s->hotspot());
break;
};
if (d)
- *d-- = Xfer (crd, s->flags());
+ *d-- = Xfer (crd, s->flags() | set_as_del);
}
}