nova: use kernel branch adjusted to Genode

Since we have now more than a handful patches to the vanilla kernel, we
better switch to a separate git repository in order to review and to maintain
the patches more effectively.

Remove the patches, they are already in the kernel branch.

Fixes #394
This commit is contained in:
Alexander Boettcher 2012-11-28 09:54:44 +01:00 committed by Norman Feske
parent f762e8e4fd
commit 08d87adb4b
6 changed files with 4 additions and 267 deletions

View File

@ -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

View File

@ -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);

View File

@ -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<Sc>
{
@@ -131,6 +132,8 @@ class Ec : public Kobject, public Refcount, public Queue<Sc>
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<Ec> const ec;
Mtd const mtd;
mword const ip;
+ Refptr<Pd> 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<Space_obj *>(own), sel), ec (e), mtd (m), ip (addr)
+Pt::Pt (Pd *own, mword sel, Ec *e, Mtd m, mword addr) : Kobject (PT, static_cast<Space_obj *>(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 <Sys_regs::Status T>
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();
}

View File

@ -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<Sys_regs::BAD_CAP>();
}

View File

@ -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);

View File

@ -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);
}
}