diff --git a/base-nova/Makefile b/base-nova/Makefile index d9e2c96ff6..7ecfce3623 100644 --- a/base-nova/Makefile +++ b/base-nova/Makefile @@ -7,8 +7,9 @@ VERBOSE ?= @ ECHO = @echo -GIT_URL = git://github.com/IntelLabs/NOVA.git -GIT_REV = 16dd65c15dac298dc5b36d636d79fa0110bd5736 +GIT_URL = https://github.com/alex-ab/NOVA.git +GIT_REV = HEAD +GIT_BRANCH = r1 CONTRIB_DIR = contrib PATCHES = $(shell find patches -name '*.patch') @@ -40,7 +41,7 @@ $(CONTRIB_DIR)/.git: $(VERBOSE)git clone $(GIT_URL) $(CONTRIB_DIR) $(CONTRIB_DIR): $(CONTRIB_DIR)/.git - $(VERBOSE)cd $(CONTRIB_DIR); git reset --hard $(GIT_REV) + $(VERBOSE)cd $(CONTRIB_DIR); git reset --hard $(GIT_REV); git checkout $(GIT_BRANCH) $(ECHO) "applying patches to '$(CONTRIB_DIR)/'" $(VERBOSE)for i in $(PATCHES); do patch -d $@ -p1 < $$i; done diff --git a/base-nova/patches/del_able_utcb.patch b/base-nova/patches/del_able_utcb.patch deleted file mode 100644 index c9f24528e5..0000000000 --- a/base-nova/patches/del_able_utcb.patch +++ /dev/null @@ -1,45 +0,0 @@ -diff --git a/src/ec.cpp b/src/ec.cpp -index 5d5a66c..a69cfef 100644 ---- a/src/ec.cpp -+++ b/src/ec.cpp -@@ -64,6 +64,8 @@ Ec::Ec (Pd *own, mword sel, Pd *p, void (*f)(), unsigned c, unsigned e, mword u, - - trace (TRACE_SYSCALL, "EC:%p created (PD:%p CPU:%#x UTCB:%#lx ESP:%lx EVT:%#x)", this, p, c, u, s, e); - -+ pd->insert_utcb (u, Buddy::ptr_to_phys(utcb) >> 12); -+ - } else { - - regs.dst_portal = NUM_VMI - 2; -diff --git a/src/space_mem.cpp b/src/space_mem.cpp -index 5341836..60e2fdc 100644 ---- a/src/space_mem.cpp -+++ b/src/space_mem.cpp -@@ -132,12 +132,12 @@ void Space_mem::insert_root (uint64 s, uint64 e, mword a) - } - } - --bool Space_mem::insert_utcb (mword b) -+bool Space_mem::insert_utcb (mword b, mword phys) - { - if (!b) - return true; - -- Mdb *mdb = new Mdb (this, 0, b >> PAGE_BITS, 0); -+ Mdb *mdb = new Mdb (this, phys, b >> PAGE_BITS, 0, 0x3); - - if (tree_insert (mdb)) - return true; -diff --git a/include/space_mem.h b/include/space_mem.h -index e155dad..1584395 100644 ---- a/include/space_mem.h -+++ b/include/space_mem.h -@@ -68,7 +68,7 @@ class Space_mem : public Space - INIT - void insert_root (uint64, uint64, mword = 0x7); - -- bool insert_utcb (mword); -+ bool insert_utcb (mword, mword = 0); - - void update (Mdb *, mword = 0); - diff --git a/base-nova/patches/portal_id.patch b/base-nova/patches/portal_id.patch deleted file mode 100644 index 4c1b65d023..0000000000 --- a/base-nova/patches/portal_id.patch +++ /dev/null @@ -1,98 +0,0 @@ -diff --git a/include/ec.h b/include/ec.h -index 10d895c..4442b38 100644 ---- a/include/ec.h -+++ b/include/ec.h -@@ -30,6 +30,7 @@ - #include "tss.h" - - class Utcb; -+class Pt; - - class Ec : public Kobject, public Refcount, public Queue - { -@@ -131,6 +132,8 @@ class Ec : public Kobject, public Refcount, public Queue - regs.REG(ip) = regs.ARG_IP; - } - -+ inline mword local_pt_id(const Ec *, const Pt *, const mword); -+ - public: - static Ec *current CPULOCAL_HOT; - static Ec *fpowner CPULOCAL; -diff --git a/include/pt.h b/include/pt.h -index 3067914..3883fdd 100644 ---- a/include/pt.h -+++ b/include/pt.h -@@ -34,6 +34,7 @@ class Pt : public Kobject - Refptr const ec; - Mtd const mtd; - mword const ip; -+ Refptr const pd; - - Pt (Pd *, mword, Ec *, Mtd, mword); - -diff --git a/src/pt.cpp b/src/pt.cpp -index ed5e692..23b9b5c 100644 ---- a/src/pt.cpp -+++ b/src/pt.cpp -@@ -25,7 +25,7 @@ - INIT_PRIORITY (PRIO_SLAB) - Slab_cache Pt::cache (sizeof (Pt), 32); - --Pt::Pt (Pd *own, mword sel, Ec *e, Mtd m, mword addr) : Kobject (PT, static_cast(own), sel), ec (e), mtd (m), ip (addr) -+Pt::Pt (Pd *own, mword sel, Ec *e, Mtd m, mword addr) : Kobject (PT, static_cast(own), sel), ec (e), mtd (m), ip (addr), pd(own) - { - trace (TRACE_SYSCALL, "PT:%p created (EC:%p IP:%#lx)", this, e, ip); - } -diff --git a/src/syscall.cpp b/src/syscall.cpp -index 564e249..e0286fb 100644 ---- a/src/syscall.cpp -+++ b/src/syscall.cpp -@@ -31,6 +31,29 @@ - #include "utcb.h" - #include "vectors.h" - -+mword Ec::local_pt_id(const Ec * ec, const Pt * pt, const mword pt_sel) -+{ -+ if (EXPECT_FALSE (ec->pd != pt->pd)) { -+ Crd crd = Crd(Crd::OBJ, pt_sel, 0); -+ ec->pd->xlt_crd(Pd::current, Crd(Crd::OBJ, 0), crd); -+ if (crd.type() == Crd::OBJ) { -+ // Doesn't work, since Space_obj is only local to a pd available -+ //Kobject *local_obj = ec->pd->Space_obj::lookup(crd.base()).obj(); -+ //trace(0, "kobject %u", local_obj->type()); -+ return crd.base(); -+ } else { -+ trace(0, "----- pt=%lx ec=%lx %p?=%p, call: %p:%#lx->%p:?", -+ pt->node_base, ec->node_base, -+ &*ec->pd, &*pt->pd, -+ Pd::current, pt_sel, -+ &*ec->pd); -+ trace(0, "base:order:attr type - %#lx:%#x:%#x %u", crd.base(), crd.order(), crd.attr(), crd.type()); -+ return 0; -+ } -+ } -+ return pt->node_base; -+} -+ - template - void Ec::sys_finish() - { -@@ -93,7 +116,7 @@ void Ec::send_msg() - current->set_partner (ec); - current->regs.mtd = pt->mtd.val; - ec->cont = recv_kern; -- ec->regs.set_pt (pt->node_base); -+ ec->regs.set_pt (ec->local_pt_id(ec, pt, current->evt + r->dst_portal)); - ec->regs.set_ip (pt->ip); - ec->make_current(); - } -@@ -122,7 +147,7 @@ void Ec::sys_call() - current->set_partner (ec); - ec->cont = recv_user; - ec->regs.set_ip (pt->ip); -- ec->regs.set_pt (pt->node_base); -+ ec->regs.set_pt (ec->local_pt_id(ec, pt, s->pt())); - ec->make_current(); - } - diff --git a/base-nova/patches/remove_utcb.patch b/base-nova/patches/remove_utcb.patch deleted file mode 100644 index 139678ce03..0000000000 --- a/base-nova/patches/remove_utcb.patch +++ /dev/null @@ -1,48 +0,0 @@ -diff --git a/include/space_mem.h b/include/space_mem.h -index e155dad..224917c 100644 ---- a/include/space_mem.h -+++ b/include/space_mem.h -@@ -70,6 +70,8 @@ class Space_mem : public Space - - bool insert_utcb (mword); - -+ bool remove_utcb (mword); -+ - void update (Mdb *, mword = 0); - - static void shootdown(); -diff --git a/src/space_mem.cpp b/src/space_mem.cpp -index 5341836..bcae116 100644 ---- a/src/space_mem.cpp -+++ b/src/space_mem.cpp -@@ -146,3 +146,17 @@ bool Space_mem::insert_utcb (mword b) - - return false; - } -+ -+bool Space_mem::remove_utcb (mword b) -+{ -+ if (!b) -+ return false; -+ -+ Mdb *mdb = tree_lookup(b >> PAGE_BITS, false); -+ if (!tree_remove (mdb)) -+ return false; -+ -+ delete mdb; -+ -+ return true; -+} -diff --git a/src/syscall.cpp b/src/syscall.cpp -index 564e249..13f1134 100644 ---- a/src/syscall.cpp -+++ b/src/syscall.cpp -@@ -254,6 +277,8 @@ void Ec::sys_create_ec() - - if (!Space_obj::insert_root (ec)) { - trace (TRACE_ERROR, "%s: Non-NULL CAP (%#lx)", __func__, r->sel()); -+ if (!pd->remove_utcb(r->utcb())) -+ trace (TRACE_ERROR, "%s: Cannot remove UTCB", __func__); - delete ec; - sys_finish(); - } diff --git a/base-nova/patches/translate.patch b/base-nova/patches/translate.patch deleted file mode 100644 index 619a47607c..0000000000 --- a/base-nova/patches/translate.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff --git a/src/pd.cpp b/src/pd.cpp -index 8160d73..be6fd41 100644 ---- a/src/pd.cpp -+++ b/src/pd.cpp -@@ -167,6 +167,20 @@ void Pd::xlt_crd (Pd *pd, Crd xlt, Crd &crd) - if ((ro = clamp (node->node_base, rb, node->node_order, ro)) != ~0UL) - break; - -+ if (!node) { -+ /* Special handling on Genode: -+ * If a translate of an item inside the same PD (receiver/sender in same PD) -+ * are of no success, then return the very same item. -+ */ -+ Mdb *first = snd->tree_lookup (crd.base()); -+ if (first && first->space == rcv && first == mdb) { -+ rb = xlt.base(); -+ ro = xlt.order(); -+ if ((ro = clamp (first->node_base, rb, first->node_order, ro)) != ~0UL) -+ node = first; -+ } -+ } -+ - if (node) { - - so = clamp (mdb->node_base, sb, mdb->node_order, so); diff --git a/base-nova/patches/xlt_rcv.patch b/base-nova/patches/xlt_rcv.patch deleted file mode 100644 index 670039433b..0000000000 --- a/base-nova/patches/xlt_rcv.patch +++ /dev/null @@ -1,48 +0,0 @@ -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); - } - }