Exemplo n.º 1
0
int
_kvm_kvatop(kvm_t *kd, u_long va, off_t *pa)
{
    struct tte tte;
    off_t tte_off;
    u_long vpn;
    off_t pa_off;
    u_long pg_off;
    int rest;

    pg_off = va & PAGE_MASK;
    if (va >= VM_MIN_DIRECT_ADDRESS)
        pa_off = TLB_DIRECT_TO_PHYS(va) & ~PAGE_MASK;
    else {
        vpn = btop(va);
        tte_off = kd->vmst->vm_tsb_off +
                  ((vpn & kd->vmst->vm_tsb_mask) << TTE_SHIFT);
        if (!_kvm_read_phys(kd, tte_off, &tte, sizeof(tte)))
            goto invalid;
        if (!tte_match(&tte, va))
            goto invalid;
        pa_off = TTE_GET_PA(&tte);
    }
    rest = PAGE_SIZE - pg_off;
    pa_off = _kvm_find_off(kd->vmst, pa_off, rest);
    if (pa_off == KVM_OFF_NOTFOUND)
        goto invalid;
    *pa = pa_off + pg_off;
    return (rest);

invalid:
    _kvm_err(kd, 0, "invalid address (%lx)", va);
    return (0);
}
Exemplo n.º 2
0
void
uma_small_free(void *mem, int size, u_int8_t flags)
{
	vm_page_t m;

	m = PHYS_TO_VM_PAGE(TLB_DIRECT_TO_PHYS((vm_offset_t)mem));
	m->wire_count--;
	vm_page_free(m);
	atomic_subtract_int(&cnt.v_wire_count, 1);
}