Beispiel #1
0
static bt_paddr_t create_pgd(void) {
	bt_paddr_t pg, pgd;

	pg = bt_page_alloc(MMU_L1TBL_SIZE * 2);
	if(!pg) {
		return 0;
	}

	pgd = PGD_ALIGN(pg);
	// Here we should free the uneeded (unaligned part), but this requires
	// some small changes to the page allocator api.

	BT_u32 gap  = (BT_u32) (pgd - pg);
	if(gap) {
		bt_page_free(pg, gap);
	}

	bt_page_free((pgd + MMU_L1TBL_SIZE), (MMU_L1TBL_SIZE - gap));

	return pgd | (g_asid++);
}
Beispiel #2
0
unsigned long build_guest_tables(struct vcpu *v, struct domain_setup_info *dsi)
{
	pde_t *pgd;
	pte_t *pgt;
	u32 pgd_idx;
	u32 pgt_idx;
	unsigned long pg;

#define PGT_ENTRIES_PER_PAGE	512

	DECLARE_MAP_TRACK(dsi);

	pgd = (pde_t *)ALLOC_GUEST_TABLE(2);
	memcpy(pgd, &idle_pgd[0], PGD_SIZE);

	pgd_idx = PGD_IDX(dsi->v_start);
	pgt_idx = PGT_IDX(dsi->v_start);

	do {
		pgt = (pte_t *)ALLOC_GUEST_TABLE(0);

		/* Two page tables per each page */
		pgd[pgd_idx++] = MK_PDE((unsigned long)&pgt[0],   PDE_GUEST_TABLE);
		pgd[pgd_idx++] = MK_PDE((unsigned long)&pgt[256], PDE_GUEST_TABLE);

		do {
			pgt[pgt_idx++] = MK_PTE(ALLOC_GUEST_PAGE(), PTE_GUEST_PAGE);
		} while((NEXT_TRACK() < dsi->p_end) && (pgt_idx != PGT_ENTRIES_PER_PAGE));

		pgt_idx = 0;

	} while(NEXT_TRACK() < dsi->p_end);

	pgt = (pte_t *)ALLOC_GUEST_TABLE(0);
	pg = ALLOC_GUEST_TABLE(0);

	/* printf("Src Page = 0x%x\n", GET_HVT_PAGE()); */

	/* copy_page(pg, GET_HVT_PAGE()); */

	/* pgt[PGT_IDX(VECTORS_VIRT_BASE)] = MK_PTE(pg, PTE_VECTOR_PAGE); */

	/* pgd[PGD_IDX(VECTORS_VIRT_BASE)] = MK_PDE((unsigned long)&pgt[0], PDE_VECTOR_TABLE); */

	/* 
	 * For Fixmap Region.
	 * This will be removed as soon as possible.
	 */
	pgd_idx = PGD_IDX(HYPERVISOR_VIRT_START - (1 << PGD_SHIFT) * 2);

	pgt = (pte_t *)ALLOC_GUEST_TABLE(0);
	pgd[pgd_idx++] = MK_PDE((unsigned long)&pgt[0], PDE_GUEST_TABLE);
	pgd[pgd_idx++] = MK_PDE((unsigned long)&pgt[256], PDE_GUEST_TABLE);

#if 0
	install_mapcache_table(v, pgd);
#endif

	zap_low_mappings(pgd);

	/* guest start address (phys/virtual addr) */
	v->arch.guest_pstart = dsi->p_start;
	v->arch.guest_vstart = dsi->v_start;

	/* guest page table address (phys addr) */
	v->arch.guest_table  = mpt_base;
	v->arch.guest_vtable = PGD_ALIGN(dsi->v_end);

	printk("PT FRAMES = %d\n", TOTAL_GUEST_TABLES());
	return TOTAL_GUEST_TABLES();
}