rem: return 0;
add: return B_OK;
context: get_physical_page_tmap(addr_t pa, addr_t *va, int flags){	int index;	paddr_chunk_desc *replaced_pchunk;restart:	mutex_lock(&iospace_mutex);	// see if the page is already mapped	index = pa / IOSPACE_CHUNK_SIZE;	if (paddr_desc[index].va != 0) {		if (paddr_desc[index].ref_count++ == 0) {			// pull this descriptor out of the lru list			queue_remove_item(&mapped_paddr_lru, &paddr_desc[index]);		}		*va = paddr_desc[index].va + pa % IOSPACE_CHUNK_SIZE;		mutex_unlock(&iospace_mutex);		return 0;	}	// map it	if (first_free_vmapping < num_virtual_chunks) {		// there's a free hole		paddr_desc[index].va = first_free_vmapping * IOSPACE_CHUNK_SIZE + IOSPACE_BASE;		*va = paddr_desc[index].va + pa % IOSPACE_CHUNK_SIZE;		virtual_pmappings[first_free_vmapping] = &paddr_desc[index];		paddr_desc[index].ref_count++;		// push up the first_free_vmapping pointer		for (; first_free_vmapping < num_virtual_chunks; first_free_vmapping++) {			if(virtual_pmappings[first_free_vmapping] == NULL)				break;		}		map_iospace_chunk(paddr_desc[index].va, index * IOSPACE_CHUNK_SIZE);		mutex_unlock(&iospace_mutex);		return 0;	}	// replace an earlier mapping	if (queue_peek(&mapped_paddr_lru) == NULL) {		// no free slots available		if (flags == PHYSICAL_PAGE_NO_WAIT) {			// punt back to the caller and let them handle this			mutex_unlock(&iospace_mutex);			return ENOMEM;		} else {			mutex_unlock(&iospace_mutex);			acquire_sem(iospace_full_sem);			goto restart;		}	}	replaced_pchunk = queue_dequeue(&mapped_paddr_lru);	paddr_desc[index].va = replaced_pchunk->va;	replaced_pchunk->va = 0;	*va = paddr_desc[index].va + pa % IOSPACE_CHUNK_SIZE;	paddr_desc[index].ref_count++;	map_iospace_chunk(paddr_desc[index].va, index * IOSPACE_CHUNK_SIZE);	mutex_unlock(&iospace_mutex);	return 0;}