akaros/kern/arch/x86/kpt.h
<<
>>
Prefs
   1/* Copyright (c) 2015 Google Inc.
   2 * Barret Rhoden <brho@cs.berkeley.edu>
   3 * See LICENSE for details.
   4 *
   5 * 64 bit KPT helpers */
   6
   7#pragma once
   8
   9#include <arch/ros/mmu64.h>
  10
  11static inline bool kpte_is_present(kpte_t *kpte)
  12{
  13        return *kpte & PTE_P ? TRUE : FALSE;
  14}
  15
  16static inline bool kpte_is_unmapped(kpte_t *kpte)
  17{
  18        return *kpte == 0;
  19}
  20
  21static inline bool kpte_is_mapped(kpte_t *kpte)
  22{
  23        return *kpte != 0;
  24}
  25
  26static inline bool kpte_is_paged_out(kpte_t *kpte)
  27{
  28        return *kpte != 0;
  29}
  30
  31static inline bool kpte_is_dirty(kpte_t *kpte)
  32{
  33        return *kpte & PTE_D ? TRUE : FALSE;
  34}
  35
  36static inline bool kpte_is_accessed(kpte_t *kpte)
  37{
  38        return *kpte & PTE_A ? TRUE : FALSE;
  39}
  40
  41static inline bool kpte_is_jumbo(kpte_t *kpte)
  42{
  43        return *kpte & PTE_PS ? TRUE : FALSE;
  44}
  45
  46static inline physaddr_t kpte_get_paddr(kpte_t *kpte)
  47{
  48        return (physaddr_t)*kpte & ~(PGSIZE - 1);
  49}
  50
  51/* Returns the PTE in an unsigned long, for debugging mostly. */
  52static inline unsigned long kpte_print(kpte_t *kpte)
  53{
  54        return *kpte;
  55}
  56
  57static inline void kpte_write(kpte_t *kpte, physaddr_t pa, int settings)
  58{
  59        assert(!PGOFF(pa));
  60        /* The arch-bits like PTE_D, PTE_PS, etc are all in the native KPT
  61         * format */
  62        *kpte = build_kpte(pa, settings);
  63}
  64
  65static inline void kpte_clear_present(kpte_t *kpte)
  66{
  67        *kpte &= ~PTE_P;
  68}
  69
  70static inline void kpte_clear_dirty(kpte_t *kpte)
  71{
  72        *kpte &= ~PTE_D;
  73}
  74
  75static inline void kpte_clear(kpte_t *kpte)
  76{
  77        *kpte = 0;
  78}
  79
  80static inline bool kpte_has_perm_ur(kpte_t *kpte)
  81{
  82        return (*kpte & PTE_USER_RO) == PTE_USER_RO;
  83}
  84
  85static inline bool kpte_has_perm_urw(kpte_t *kpte)
  86{
  87        return (*kpte & PTE_USER_RW) == PTE_USER_RW;
  88}
  89
  90static inline int kpte_get_settings(kpte_t *kpte)
  91{
  92        return *kpte & 0xfff;
  93}
  94
  95static inline void kpte_replace_perm(kpte_t *kpte, int perm)
  96{
  97        *kpte = (*kpte & ~PTE_PERM) | perm;
  98}
  99