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++); }
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(); }