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

pgalloc.h (1995B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _ASM_POWERPC_BOOK3S_32_PGALLOC_H
      3#define _ASM_POWERPC_BOOK3S_32_PGALLOC_H
      4
      5#include <linux/threads.h>
      6#include <linux/slab.h>
      7
      8static inline pgd_t *pgd_alloc(struct mm_struct *mm)
      9{
     10	return kmem_cache_alloc(PGT_CACHE(PGD_INDEX_SIZE),
     11			pgtable_gfp_flags(mm, GFP_KERNEL));
     12}
     13
     14static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
     15{
     16	kmem_cache_free(PGT_CACHE(PGD_INDEX_SIZE), pgd);
     17}
     18
     19/*
     20 * We don't have any real pmd's, and this code never triggers because
     21 * the pgd will always be present..
     22 */
     23/* #define pmd_alloc_one(mm,address)       ({ BUG(); ((pmd_t *)2); }) */
     24#define pmd_free(mm, x) 		do { } while (0)
     25#define __pmd_free_tlb(tlb,x,a)		do { } while (0)
     26/* #define pgd_populate(mm, pmd, pte)      BUG() */
     27
     28static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp,
     29				       pte_t *pte)
     30{
     31	*pmdp = __pmd(__pa(pte) | _PMD_PRESENT);
     32}
     33
     34static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp,
     35				pgtable_t pte_page)
     36{
     37	*pmdp = __pmd(__pa(pte_page) | _PMD_PRESENT);
     38}
     39
     40static inline void pgtable_free(void *table, unsigned index_size)
     41{
     42	if (!index_size) {
     43		pte_fragment_free((unsigned long *)table, 0);
     44	} else {
     45		BUG_ON(index_size > MAX_PGTABLE_INDEX_SIZE);
     46		kmem_cache_free(PGT_CACHE(index_size), table);
     47	}
     48}
     49
     50#define get_hugepd_cache_index(x)  (x)
     51
     52static inline void pgtable_free_tlb(struct mmu_gather *tlb,
     53				    void *table, int shift)
     54{
     55	unsigned long pgf = (unsigned long)table;
     56	BUG_ON(shift > MAX_PGTABLE_INDEX_SIZE);
     57	pgf |= shift;
     58	tlb_remove_table(tlb, (void *)pgf);
     59}
     60
     61static inline void __tlb_remove_table(void *_table)
     62{
     63	void *table = (void *)((unsigned long)_table & ~MAX_PGTABLE_INDEX_SIZE);
     64	unsigned shift = (unsigned long)_table & MAX_PGTABLE_INDEX_SIZE;
     65
     66	pgtable_free(table, shift);
     67}
     68
     69static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table,
     70				  unsigned long address)
     71{
     72	pgtable_free_tlb(tlb, table, 0);
     73}
     74#endif /* _ASM_POWERPC_BOOK3S_32_PGALLOC_H */