static inline int untyped_comparator(cte_t *a, cte_t *b, tie_comp_t tie_break) { int cmp; /* Compare base address and size of the untyped object */ cmp = compare(cap_untyped_cap_get_capPtr(a->cap), cap_untyped_cap_get_capPtr(b->cap)); if (cmp != EQ) { return cmp; } cmp = - compare(cap_untyped_cap_get_capBlockSize(a->cap), cap_untyped_cap_get_capBlockSize(b->cap)); if (cmp != EQ) { return cmp; } /* Do common late comparisons */ return tie_break(a, b, NULL); }
exception_t performASIDControlInvocation(void* frame, cte_t* slot, cte_t* parent, asid_t asid_base) { cap_untyped_cap_ptr_set_capFreeIndex(&(parent->cap), MAX_FREE_INDEX(cap_untyped_cap_get_capBlockSize(parent->cap))); memzero(frame, 1 << pageBitsForSize(X86_SmallPage)); cteInsert( cap_asid_pool_cap_new( asid_base, /* capASIDBase */ WORD_REF(frame) /* capASIDPool */ ), parent, slot ); /* Haskell error: "ASID pool's base must be aligned" */ assert((asid_base & MASK(asidLowBits)) == 0); x86KSASIDTable[asid_base >> asidLowBits] = (asid_pool_t*)frame; return EXCEPTION_NONE; }