]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
x86/kexec: Add extra pointers to transition page table PGD, PUD, PMD and PTE
authorDaniel Kiper <daniel.kiper@oracle.com>
Thu, 21 Jun 2012 13:24:09 +0000 (15:24 +0200)
committerDaniel Kiper <daniel.kiper@oracle.com>
Thu, 28 Jun 2012 07:45:20 +0000 (09:45 +0200)
Some implementations (e.g. Xen PVOPS) could not use part of identity page table
to construct transition page table. It means that they require separate PUDs,
PMDs and PTEs for virtual and physical (identity) mapping. To satisfy that
requirement add extra pointer to PGD, PUD, PMD and PTE and align existing code.

Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
arch/x86/include/asm/kexec.h
arch/x86/kernel/machine_kexec_64.c

index 317ff1703d0b0a5e7eaf17b94fd93640b8e62997..3cf560065046261e94610180ec37a49e99e14e6d 100644 (file)
@@ -157,9 +157,13 @@ struct kimage_arch {
 };
 #else
 struct kimage_arch {
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
+       pgd_t *pgd;
+       pud_t *pud0;
+       pud_t *pud1;
+       pmd_t *pmd0;
+       pmd_t *pmd1;
+       pte_t *pte0;
+       pte_t *pte1;
 };
 #endif
 
index b3ea9db39db6f7ee9f9dab00632f754d8a75827d..976e54b79a03e766ccd32301636487fffea5e5aa 100644 (file)
@@ -137,9 +137,9 @@ out:
 
 static void free_transition_pgtable(struct kimage *image)
 {
-       free_page((unsigned long)image->arch.pud);
-       free_page((unsigned long)image->arch.pmd);
-       free_page((unsigned long)image->arch.pte);
+       free_page((unsigned long)image->arch.pud0);
+       free_page((unsigned long)image->arch.pmd0);
+       free_page((unsigned long)image->arch.pte0);
 }
 
 static int init_transition_pgtable(struct kimage *image, pgd_t *pgd)
@@ -157,7 +157,7 @@ static int init_transition_pgtable(struct kimage *image, pgd_t *pgd)
                pud = (pud_t *)get_zeroed_page(GFP_KERNEL);
                if (!pud)
                        goto err;
-               image->arch.pud = pud;
+               image->arch.pud0 = pud;
                set_pgd(pgd, __pgd(__pa(pud) | _KERNPG_TABLE));
        }
        pud = pud_offset(pgd, vaddr);
@@ -165,7 +165,7 @@ static int init_transition_pgtable(struct kimage *image, pgd_t *pgd)
                pmd = (pmd_t *)get_zeroed_page(GFP_KERNEL);
                if (!pmd)
                        goto err;
-               image->arch.pmd = pmd;
+               image->arch.pmd0 = pmd;
                set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE));
        }
        pmd = pmd_offset(pud, vaddr);
@@ -173,7 +173,7 @@ static int init_transition_pgtable(struct kimage *image, pgd_t *pgd)
                pte = (pte_t *)get_zeroed_page(GFP_KERNEL);
                if (!pte)
                        goto err;
-               image->arch.pte = pte;
+               image->arch.pte0 = pte;
                set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE));
        }
        pte = pte_offset_kernel(pmd, vaddr);