cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pgtable-64.c (2558B)


      1/*
      2 * This file is subject to the terms and conditions of the GNU General Public
      3 * License.  See the file "COPYING" in the main directory of this archive
      4 * for more details.
      5 *
      6 * Copyright (C) 1999, 2000 by Silicon Graphics
      7 * Copyright (C) 2003 by Ralf Baechle
      8 */
      9#include <linux/export.h>
     10#include <linux/init.h>
     11#include <linux/mm.h>
     12#include <asm/fixmap.h>
     13#include <asm/pgalloc.h>
     14#include <asm/tlbflush.h>
     15
     16void pgd_init(unsigned long page)
     17{
     18	unsigned long *p, *end;
     19	unsigned long entry;
     20
     21#if !defined(__PAGETABLE_PUD_FOLDED)
     22	entry = (unsigned long)invalid_pud_table;
     23#elif !defined(__PAGETABLE_PMD_FOLDED)
     24	entry = (unsigned long)invalid_pmd_table;
     25#else
     26	entry = (unsigned long)invalid_pte_table;
     27#endif
     28
     29	p = (unsigned long *) page;
     30	end = p + PTRS_PER_PGD;
     31
     32	do {
     33		p[0] = entry;
     34		p[1] = entry;
     35		p[2] = entry;
     36		p[3] = entry;
     37		p[4] = entry;
     38		p += 8;
     39		p[-3] = entry;
     40		p[-2] = entry;
     41		p[-1] = entry;
     42	} while (p != end);
     43}
     44
     45#ifndef __PAGETABLE_PMD_FOLDED
     46void pmd_init(unsigned long addr, unsigned long pagetable)
     47{
     48	unsigned long *p, *end;
     49
     50	p = (unsigned long *) addr;
     51	end = p + PTRS_PER_PMD;
     52
     53	do {
     54		p[0] = pagetable;
     55		p[1] = pagetable;
     56		p[2] = pagetable;
     57		p[3] = pagetable;
     58		p[4] = pagetable;
     59		p += 8;
     60		p[-3] = pagetable;
     61		p[-2] = pagetable;
     62		p[-1] = pagetable;
     63	} while (p != end);
     64}
     65EXPORT_SYMBOL_GPL(pmd_init);
     66#endif
     67
     68#ifndef __PAGETABLE_PUD_FOLDED
     69void pud_init(unsigned long addr, unsigned long pagetable)
     70{
     71	unsigned long *p, *end;
     72
     73	p = (unsigned long *)addr;
     74	end = p + PTRS_PER_PUD;
     75
     76	do {
     77		p[0] = pagetable;
     78		p[1] = pagetable;
     79		p[2] = pagetable;
     80		p[3] = pagetable;
     81		p[4] = pagetable;
     82		p += 8;
     83		p[-3] = pagetable;
     84		p[-2] = pagetable;
     85		p[-1] = pagetable;
     86	} while (p != end);
     87}
     88#endif
     89
     90pmd_t mk_pmd(struct page *page, pgprot_t prot)
     91{
     92	pmd_t pmd;
     93
     94	pmd_val(pmd) = (page_to_pfn(page) << _PFN_SHIFT) | pgprot_val(prot);
     95
     96	return pmd;
     97}
     98
     99void set_pmd_at(struct mm_struct *mm, unsigned long addr,
    100		pmd_t *pmdp, pmd_t pmd)
    101{
    102	*pmdp = pmd;
    103}
    104
    105void __init pagetable_init(void)
    106{
    107	unsigned long vaddr;
    108	pgd_t *pgd_base;
    109
    110	/* Initialize the entire pgd.  */
    111	pgd_init((unsigned long)swapper_pg_dir);
    112#ifndef __PAGETABLE_PUD_FOLDED
    113	pud_init((unsigned long)invalid_pud_table, (unsigned long)invalid_pmd_table);
    114#endif
    115#ifndef __PAGETABLE_PMD_FOLDED
    116	pmd_init((unsigned long)invalid_pmd_table, (unsigned long)invalid_pte_table);
    117#endif
    118	pgd_base = swapper_pg_dir;
    119	/*
    120	 * Fixed mappings:
    121	 */
    122	vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
    123	fixrange_init(vaddr, vaddr + FIXADDR_SIZE, pgd_base);
    124}