]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - arch/x86/entry/vsyscall/vsyscall_64.c
x86/vsyscall/64: Use proper accessor to update P4D entry
[mirror_ubuntu-bionic-kernel.git] / arch / x86 / entry / vsyscall / vsyscall_64.c
index 1faf40f2dda9a862f974d4f06616402875e32ffc..542392b6aab6a3d19d1a2a418f43a147f9e705dd 100644 (file)
@@ -344,18 +344,18 @@ int in_gate_area_no_mm(unsigned long addr)
  * vsyscalls but leave the page not present.  If so, we skip calling
  * this.
  */
-static void __init set_vsyscall_pgtable_user_bits(void)
+void __init set_vsyscall_pgtable_user_bits(pgd_t *root)
 {
        pgd_t *pgd;
        p4d_t *p4d;
        pud_t *pud;
        pmd_t *pmd;
 
-       pgd = pgd_offset_k(VSYSCALL_ADDR);
+       pgd = pgd_offset_pgd(root, VSYSCALL_ADDR);
        set_pgd(pgd, __pgd(pgd_val(*pgd) | _PAGE_USER));
        p4d = p4d_offset(pgd, VSYSCALL_ADDR);
 #if CONFIG_PGTABLE_LEVELS >= 5
-       p4d->p4d |= _PAGE_USER;
+       set_p4d(p4d, __p4d(p4d_val(*p4d) | _PAGE_USER));
 #endif
        pud = pud_offset(p4d, VSYSCALL_ADDR);
        set_pud(pud, __pud(pud_val(*pud) | _PAGE_USER));
@@ -373,7 +373,7 @@ void __init map_vsyscall(void)
                             vsyscall_mode == NATIVE
                             ? PAGE_KERNEL_VSYSCALL
                             : PAGE_KERNEL_VVAR);
-               set_vsyscall_pgtable_user_bits();
+               set_vsyscall_pgtable_user_bits(swapper_pg_dir);
        }
 
        BUILD_BUG_ON((unsigned long)__fix_to_virt(VSYSCALL_PAGE) !=