Looks like I was ok in my previous post.
In fact I seem to have isolated to a line in pte.cpp in function walk: template <typename P, typename E, unsigned L, unsigned B, bool F> P *Pte<P,E,L,B,F>::walk (Quota "a, E v, unsigned long n, bool a) { unsigned long l = L;
for (P *p, *e = static_cast<P *>(this);; e = static_cast<P *>(Buddy::phys_to_ptr (e->addr())) + (v >> (--l * B + PAGE_BITS) & ((1UL << B) - 1))) { //while(1); if (l == n) return e;
if (!e->val) {
if (!a) return nullptr; while(1); if (!e->set (0, Buddy::ptr_to_phys (p = new (quota) P) | (l == L ? 0 : P::PTE_N))) Pte::destroy(p, quota); //while(1); } } }
So I believe the culprit ine is: if (!e->set (0, Buddy::ptr_to_phys (p = new (quota) P) | (l == L ? 0 : P::PTE_N))) Pte::destroy(p, quota);
Guess I need to take time to examine, try to think and see if I can go further.