Skip to content

Commit 59b3d02

Browse files
thgarnieIngo Molnar
authored andcommitted
x86/mm: Update physical mapping variable names
Change the variable names in kernel_physical_mapping_init() and related functions to correctly reflect physical and virtual memory addresses. Also add comments on each function to describe usage and alignment constraints. Signed-off-by: Thomas Garnier <thgarnie@google.com> Signed-off-by: Kees Cook <keescook@chromium.org> Cc: Alexander Kuleshov <kuleshovmail@gmail.com> Cc: Alexander Popov <alpopov@ptsecurity.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Andy Lutomirski <luto@kernel.org> Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Cc: Baoquan He <bhe@redhat.com> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Borislav Petkov <bp@suse.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Christian Borntraeger <borntraeger@de.ibm.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Dave Young <dyoung@redhat.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Jan Beulich <JBeulich@suse.com> Cc: Joerg Roedel <jroedel@suse.de> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Juergen Gross <jgross@suse.com> Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Lv Zheng <lv.zheng@intel.com> Cc: Mark Salter <msalter@redhat.com> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Matt Fleming <matt@codeblueprint.co.uk> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephen Smalley <sds@tycho.nsa.gov> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Toshi Kani <toshi.kani@hpe.com> Cc: Xiao Guangrong <guangrong.xiao@linux.intel.com> Cc: Yinghai Lu <yinghai@kernel.org> Cc: kernel-hardening@lists.openwall.com Cc: linux-doc@vger.kernel.org Link: http://lkml.kernel.org/r/1466556426-32664-3-git-send-email-keescook@chromium.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
1 parent d899a7d commit 59b3d02

File tree

1 file changed

+96
-66
lines changed

1 file changed

+96
-66
lines changed

arch/x86/mm/init_64.c

Lines changed: 96 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -328,22 +328,30 @@ void __init cleanup_highmap(void)
328328
}
329329
}
330330

331+
/*
332+
* Create PTE level page table mapping for physical addresses.
333+
* It returns the last physical address mapped.
334+
*/
331335
static unsigned long __meminit
332-
phys_pte_init(pte_t *pte_page, unsigned long addr, unsigned long end,
336+
phys_pte_init(pte_t *pte_page, unsigned long paddr, unsigned long paddr_end,
333337
pgprot_t prot)
334338
{
335-
unsigned long pages = 0, next;
336-
unsigned long last_map_addr = end;
339+
unsigned long pages = 0, paddr_next;
340+
unsigned long paddr_last = paddr_end;
341+
pte_t *pte;
337342
int i;
338343

339-
pte_t *pte = pte_page + pte_index(addr);
344+
pte = pte_page + pte_index(paddr);
345+
i = pte_index(paddr);
340346

341-
for (i = pte_index(addr); i < PTRS_PER_PTE; i++, addr = next, pte++) {
342-
next = (addr & PAGE_MASK) + PAGE_SIZE;
343-
if (addr >= end) {
347+
for (; i < PTRS_PER_PTE; i++, paddr = paddr_next, pte++) {
348+
paddr_next = (paddr & PAGE_MASK) + PAGE_SIZE;
349+
if (paddr >= paddr_end) {
344350
if (!after_bootmem &&
345-
!e820_any_mapped(addr & PAGE_MASK, next, E820_RAM) &&
346-
!e820_any_mapped(addr & PAGE_MASK, next, E820_RESERVED_KERN))
351+
!e820_any_mapped(paddr & PAGE_MASK, paddr_next,
352+
E820_RAM) &&
353+
!e820_any_mapped(paddr & PAGE_MASK, paddr_next,
354+
E820_RESERVED_KERN))
347355
set_pte(pte, __pte(0));
348356
continue;
349357
}
@@ -361,37 +369,44 @@ phys_pte_init(pte_t *pte_page, unsigned long addr, unsigned long end,
361369
}
362370

363371
if (0)
364-
printk(" pte=%p addr=%lx pte=%016lx\n",
365-
pte, addr, pfn_pte(addr >> PAGE_SHIFT, PAGE_KERNEL).pte);
372+
pr_info(" pte=%p addr=%lx pte=%016lx\n", pte, paddr,
373+
pfn_pte(paddr >> PAGE_SHIFT, PAGE_KERNEL).pte);
366374
pages++;
367-
set_pte(pte, pfn_pte(addr >> PAGE_SHIFT, prot));
368-
last_map_addr = (addr & PAGE_MASK) + PAGE_SIZE;
375+
set_pte(pte, pfn_pte(paddr >> PAGE_SHIFT, prot));
376+
paddr_last = (paddr & PAGE_MASK) + PAGE_SIZE;
369377
}
370378

371379
update_page_count(PG_LEVEL_4K, pages);
372380

373-
return last_map_addr;
381+
return paddr_last;
374382
}
375383

384+
/*
385+
* Create PMD level page table mapping for physical addresses. The virtual
386+
* and physical address have to be aligned at this level.
387+
* It returns the last physical address mapped.
388+
*/
376389
static unsigned long __meminit
377-
phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end,
390+
phys_pmd_init(pmd_t *pmd_page, unsigned long paddr, unsigned long paddr_end,
378391
unsigned long page_size_mask, pgprot_t prot)
379392
{
380-
unsigned long pages = 0, next;
381-
unsigned long last_map_addr = end;
393+
unsigned long pages = 0, paddr_next;
394+
unsigned long paddr_last = paddr_end;
382395

383-
int i = pmd_index(address);
396+
int i = pmd_index(paddr);
384397

385-
for (; i < PTRS_PER_PMD; i++, address = next) {
386-
pmd_t *pmd = pmd_page + pmd_index(address);
398+
for (; i < PTRS_PER_PMD; i++, paddr = paddr_next) {
399+
pmd_t *pmd = pmd_page + pmd_index(paddr);
387400
pte_t *pte;
388401
pgprot_t new_prot = prot;
389402

390-
next = (address & PMD_MASK) + PMD_SIZE;
391-
if (address >= end) {
403+
paddr_next = (paddr & PMD_MASK) + PMD_SIZE;
404+
if (paddr >= paddr_end) {
392405
if (!after_bootmem &&
393-
!e820_any_mapped(address & PMD_MASK, next, E820_RAM) &&
394-
!e820_any_mapped(address & PMD_MASK, next, E820_RESERVED_KERN))
406+
!e820_any_mapped(paddr & PMD_MASK, paddr_next,
407+
E820_RAM) &&
408+
!e820_any_mapped(paddr & PMD_MASK, paddr_next,
409+
E820_RESERVED_KERN))
395410
set_pmd(pmd, __pmd(0));
396411
continue;
397412
}
@@ -400,8 +415,8 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end,
400415
if (!pmd_large(*pmd)) {
401416
spin_lock(&init_mm.page_table_lock);
402417
pte = (pte_t *)pmd_page_vaddr(*pmd);
403-
last_map_addr = phys_pte_init(pte, address,
404-
end, prot);
418+
paddr_last = phys_pte_init(pte, paddr,
419+
paddr_end, prot);
405420
spin_unlock(&init_mm.page_table_lock);
406421
continue;
407422
}
@@ -420,7 +435,7 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end,
420435
if (page_size_mask & (1 << PG_LEVEL_2M)) {
421436
if (!after_bootmem)
422437
pages++;
423-
last_map_addr = next;
438+
paddr_last = paddr_next;
424439
continue;
425440
}
426441
new_prot = pte_pgprot(pte_clrhuge(*(pte_t *)pmd));
@@ -430,51 +445,60 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end,
430445
pages++;
431446
spin_lock(&init_mm.page_table_lock);
432447
set_pte((pte_t *)pmd,
433-
pfn_pte((address & PMD_MASK) >> PAGE_SHIFT,
448+
pfn_pte((paddr & PMD_MASK) >> PAGE_SHIFT,
434449
__pgprot(pgprot_val(prot) | _PAGE_PSE)));
435450
spin_unlock(&init_mm.page_table_lock);
436-
last_map_addr = next;
451+
paddr_last = paddr_next;
437452
continue;
438453
}
439454

440455
pte = alloc_low_page();
441-
last_map_addr = phys_pte_init(pte, address, end, new_prot);
456+
paddr_last = phys_pte_init(pte, paddr, paddr_end, new_prot);
442457

443458
spin_lock(&init_mm.page_table_lock);
444459
pmd_populate_kernel(&init_mm, pmd, pte);
445460
spin_unlock(&init_mm.page_table_lock);
446461
}
447462
update_page_count(PG_LEVEL_2M, pages);
448-
return last_map_addr;
463+
return paddr_last;
449464
}
450465

466+
/*
467+
* Create PUD level page table mapping for physical addresses. The virtual
468+
* and physical address have to be aligned at this level.
469+
* It returns the last physical address mapped.
470+
*/
451471
static unsigned long __meminit
452-
phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end,
453-
unsigned long page_size_mask)
472+
phys_pud_init(pud_t *pud_page, unsigned long paddr, unsigned long paddr_end,
473+
unsigned long page_size_mask)
454474
{
455-
unsigned long pages = 0, next;
456-
unsigned long last_map_addr = end;
457-
int i = pud_index(addr);
475+
unsigned long pages = 0, paddr_next;
476+
unsigned long paddr_last = paddr_end;
477+
int i = pud_index(paddr);
458478

459-
for (; i < PTRS_PER_PUD; i++, addr = next) {
460-
pud_t *pud = pud_page + pud_index(addr);
479+
for (; i < PTRS_PER_PUD; i++, paddr = paddr_next) {
480+
pud_t *pud = pud_page + pud_index(paddr);
461481
pmd_t *pmd;
462482
pgprot_t prot = PAGE_KERNEL;
463483

464-
next = (addr & PUD_MASK) + PUD_SIZE;
465-
if (addr >= end) {
484+
paddr_next = (paddr & PUD_MASK) + PUD_SIZE;
485+
if (paddr >= paddr_end) {
466486
if (!after_bootmem &&
467-
!e820_any_mapped(addr & PUD_MASK, next, E820_RAM) &&
468-
!e820_any_mapped(addr & PUD_MASK, next, E820_RESERVED_KERN))
487+
!e820_any_mapped(paddr & PUD_MASK, paddr_next,
488+
E820_RAM) &&
489+
!e820_any_mapped(paddr & PUD_MASK, paddr_next,
490+
E820_RESERVED_KERN))
469491
set_pud(pud, __pud(0));
470492
continue;
471493
}
472494

473495
if (pud_val(*pud)) {
474496
if (!pud_large(*pud)) {
475497
pmd = pmd_offset(pud, 0);
476-
last_map_addr = phys_pmd_init(pmd, addr, end,
477-
page_size_mask, prot);
498+
paddr_last = phys_pmd_init(pmd, paddr,
499+
paddr_end,
500+
page_size_mask,
501+
prot);
478502
__flush_tlb_all();
479503
continue;
480504
}
@@ -493,7 +517,7 @@ phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end,
493517
if (page_size_mask & (1 << PG_LEVEL_1G)) {
494518
if (!after_bootmem)
495519
pages++;
496-
last_map_addr = next;
520+
paddr_last = paddr_next;
497521
continue;
498522
}
499523
prot = pte_pgprot(pte_clrhuge(*(pte_t *)pud));
@@ -503,16 +527,16 @@ phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end,
503527
pages++;
504528
spin_lock(&init_mm.page_table_lock);
505529
set_pte((pte_t *)pud,
506-
pfn_pte((addr & PUD_MASK) >> PAGE_SHIFT,
530+
pfn_pte((paddr & PUD_MASK) >> PAGE_SHIFT,
507531
PAGE_KERNEL_LARGE));
508532
spin_unlock(&init_mm.page_table_lock);
509-
last_map_addr = next;
533+
paddr_last = paddr_next;
510534
continue;
511535
}
512536

513537
pmd = alloc_low_page();
514-
last_map_addr = phys_pmd_init(pmd, addr, end, page_size_mask,
515-
prot);
538+
paddr_last = phys_pmd_init(pmd, paddr, paddr_end,
539+
page_size_mask, prot);
516540

517541
spin_lock(&init_mm.page_table_lock);
518542
pud_populate(&init_mm, pud, pmd);
@@ -522,38 +546,44 @@ phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end,
522546

523547
update_page_count(PG_LEVEL_1G, pages);
524548

525-
return last_map_addr;
549+
return paddr_last;
526550
}
527551

552+
/*
553+
* Create page table mapping for the physical memory for specific physical
554+
* addresses. The virtual and physical addresses have to be aligned on PUD level
555+
* down. It returns the last physical address mapped.
556+
*/
528557
unsigned long __meminit
529-
kernel_physical_mapping_init(unsigned long start,
530-
unsigned long end,
558+
kernel_physical_mapping_init(unsigned long paddr_start,
559+
unsigned long paddr_end,
531560
unsigned long page_size_mask)
532561
{
533562
bool pgd_changed = false;
534-
unsigned long next, last_map_addr = end;
535-
unsigned long addr;
563+
unsigned long vaddr, vaddr_start, vaddr_end, vaddr_next, paddr_last;
536564

537-
start = (unsigned long)__va(start);
538-
end = (unsigned long)__va(end);
539-
addr = start;
565+
paddr_last = paddr_end;
566+
vaddr = (unsigned long)__va(paddr_start);
567+
vaddr_end = (unsigned long)__va(paddr_end);
568+
vaddr_start = vaddr;
540569

541-
for (; start < end; start = next) {
542-
pgd_t *pgd = pgd_offset_k(start);
570+
for (; vaddr < vaddr_end; vaddr = vaddr_next) {
571+
pgd_t *pgd = pgd_offset_k(vaddr);
543572
pud_t *pud;
544573

545-
next = (start & PGDIR_MASK) + PGDIR_SIZE;
574+
vaddr_next = (vaddr & PGDIR_MASK) + PGDIR_SIZE;
546575

547576
if (pgd_val(*pgd)) {
548577
pud = (pud_t *)pgd_page_vaddr(*pgd);
549-
last_map_addr = phys_pud_init(pud, __pa(start),
550-
__pa(end), page_size_mask);
578+
paddr_last = phys_pud_init(pud, __pa(vaddr),
579+
__pa(vaddr_end),
580+
page_size_mask);
551581
continue;
552582
}
553583

554584
pud = alloc_low_page();
555-
last_map_addr = phys_pud_init(pud, __pa(start), __pa(end),
556-
page_size_mask);
585+
paddr_last = phys_pud_init(pud, __pa(vaddr), __pa(vaddr_end),
586+
page_size_mask);
557587

558588
spin_lock(&init_mm.page_table_lock);
559589
pgd_populate(&init_mm, pgd, pud);
@@ -562,11 +592,11 @@ kernel_physical_mapping_init(unsigned long start,
562592
}
563593

564594
if (pgd_changed)
565-
sync_global_pgds(addr, end - 1, 0);
595+
sync_global_pgds(vaddr_start, vaddr_end - 1, 0);
566596

567597
__flush_tlb_all();
568598

569-
return last_map_addr;
599+
return paddr_last;
570600
}
571601

572602
#ifndef CONFIG_NUMA

0 commit comments

Comments
 (0)