Lines Matching defs:lg

20 #include "lg.h"
106 return &cpu->lg->pgdirs[i].pgdir[index];
164 return cpu->lg->pgdirs[cpu->cpu_pgd].gpgdir + index * sizeof(pgd_t);
244 base = (unsigned long)cpu->lg->mem_base / PAGE_SIZE;
281 pte_pfn(gpte) >= cpu->lg->pfn_limit)
288 (pgd_pfn(gpgd) >= cpu->lg->pfn_limit))
296 (pmd_pfn(gpmd) >= cpu->lg->pfn_limit))
601 static void flush_user_mappings(struct lguest *lg, int idx)
605 for (i = 0; i < pgd_index(lg->kernel_address); i++)
606 release_pgd(lg->pgdirs[idx].pgdir + i);
618 flush_user_mappings(cpu->lg, cpu->cpu_pgd);
662 static unsigned int find_pgdir(struct lguest *lg, unsigned long pgtable)
665 for (i = 0; i < ARRAY_SIZE(lg->pgdirs); i++)
666 if (lg->pgdirs[i].pgdir && lg->pgdirs[i].gpgdir == pgtable)
689 next = random32() % ARRAY_SIZE(cpu->lg->pgdirs);
691 if (!cpu->lg->pgdirs[next].pgdir) {
692 cpu->lg->pgdirs[next].pgdir =
695 if (!cpu->lg->pgdirs[next].pgdir)
705 free_page((long)cpu->lg->pgdirs[next].pgdir);
706 set_pgd(cpu->lg->pgdirs[next].pgdir, __pgd(0));
709 set_pgd(cpu->lg->pgdirs[next].pgdir +
724 cpu->lg->pgdirs[next].gpgdir = gpgdir;
726 flush_user_mappings(cpu->lg, next);
736 static void release_all_pagetables(struct lguest *lg)
741 for (i = 0; i < ARRAY_SIZE(lg->pgdirs); i++)
742 if (lg->pgdirs[i].pgdir) {
749 spgd = lg->pgdirs[i].pgdir + SWITCHER_PGD_INDEX;
761 release_pgd(lg->pgdirs[i].pgdir + j);
773 release_all_pagetables(cpu->lg);
794 release_all_pagetables(cpu->lg);
797 newpgdir = ARRAY_SIZE(cpu->lg->pgdirs);
800 newpgdir = find_pgdir(cpu->lg, pgtable);
807 if (newpgdir == ARRAY_SIZE(cpu->lg->pgdirs))
904 if (vaddr >= cpu->lg->kernel_address) {
906 for (i = 0; i < ARRAY_SIZE(cpu->lg->pgdirs); i++)
907 if (cpu->lg->pgdirs[i].pgdir)
911 int pgdir = find_pgdir(cpu->lg, gpgdir);
912 if (pgdir != ARRAY_SIZE(cpu->lg->pgdirs))
932 void guest_set_pgd(struct lguest *lg, unsigned long gpgdir, u32 idx)
940 pgdir = find_pgdir(lg, gpgdir);
941 if (pgdir < ARRAY_SIZE(lg->pgdirs))
943 release_pgd(lg->pgdirs[pgdir].pgdir + idx);
948 void guest_set_pmd(struct lguest *lg, unsigned long pmdp, u32 idx)
950 guest_pagetable_clear_all(&lg->cpus[0]);
962 int init_guest_pagetable(struct lguest *lg)
964 struct lg_cpu *cpu = &lg->cpus[0];
967 /* lg (and lg->cpus[]) starts zeroed: this allocates a new pgdir */
981 if (get_user(cpu->lg->kernel_address,
982 &cpu->lg->lguest_data->kernel_address)
988 &cpu->lg->lguest_data->reserve_mem)) {
989 kill_guest(cpu, "bad guest page %p", cpu->lg->lguest_data);
995 * "pgd_index(lg->kernel_address)". This assumes it won't hit the
999 if (pgd_index(cpu->lg->kernel_address) == SWITCHER_PGD_INDEX &&
1000 pmd_index(cpu->lg->kernel_address) == SWITCHER_PMD_INDEX)
1002 if (pgd_index(cpu->lg->kernel_address) >= SWITCHER_PGD_INDEX)
1005 cpu->lg->kernel_address);
1009 void free_guest_pagetable(struct lguest *lg)
1014 release_all_pagetables(lg);
1016 for (i = 0; i < ARRAY_SIZE(lg->pgdirs); i++)
1017 free_page((long)lg->pgdirs[i].pgdir);
1042 pmd_table = __va(pgd_pfn(cpu->lg->
1056 cpu->lg->pgdirs[cpu->cpu_pgd].pgdir[SWITCHER_PGD_INDEX] = switcher_pgd;