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

hugetlb.h (1947B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
      4 */
      5
      6#ifndef __ASM_HUGETLB_H
      7#define __ASM_HUGETLB_H
      8
      9#include <asm/page.h>
     10
     11uint64_t pmd_to_entrylo(unsigned long pmd_val);
     12
     13#define __HAVE_ARCH_PREPARE_HUGEPAGE_RANGE
     14static inline int prepare_hugepage_range(struct file *file,
     15					 unsigned long addr,
     16					 unsigned long len)
     17{
     18	unsigned long task_size = STACK_TOP;
     19	struct hstate *h = hstate_file(file);
     20
     21	if (len & ~huge_page_mask(h))
     22		return -EINVAL;
     23	if (addr & ~huge_page_mask(h))
     24		return -EINVAL;
     25	if (len > task_size)
     26		return -ENOMEM;
     27	if (task_size - len < addr)
     28		return -EINVAL;
     29	return 0;
     30}
     31
     32#define __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR
     33static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
     34					    unsigned long addr, pte_t *ptep)
     35{
     36	pte_t clear;
     37	pte_t pte = *ptep;
     38
     39	pte_val(clear) = (unsigned long)invalid_pte_table;
     40	set_pte_at(mm, addr, ptep, clear);
     41	return pte;
     42}
     43
     44#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH
     45static inline pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
     46					  unsigned long addr, pte_t *ptep)
     47{
     48	pte_t pte;
     49
     50	pte = huge_ptep_get_and_clear(vma->vm_mm, addr, ptep);
     51	flush_tlb_page(vma, addr);
     52	return pte;
     53}
     54
     55#define __HAVE_ARCH_HUGE_PTE_NONE
     56static inline int huge_pte_none(pte_t pte)
     57{
     58	unsigned long val = pte_val(pte) & ~_PAGE_GLOBAL;
     59	return !val || (val == (unsigned long)invalid_pte_table);
     60}
     61
     62#define __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS
     63static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
     64					     unsigned long addr,
     65					     pte_t *ptep, pte_t pte,
     66					     int dirty)
     67{
     68	int changed = !pte_same(*ptep, pte);
     69
     70	if (changed) {
     71		set_pte_at(vma->vm_mm, addr, ptep, pte);
     72		/*
     73		 * There could be some standard sized pages in there,
     74		 * get them all.
     75		 */
     76		flush_tlb_range(vma, addr, addr + HPAGE_SIZE);
     77	}
     78	return changed;
     79}
     80
     81#include <asm-generic/hugetlb.h>
     82
     83#endif /* __ASM_HUGETLB_H */