#ifndef _KERNEL_MEM_BITS_MMU_H
#define _KERNEL_MEM_BITS_MMU_H

#include <libkern/types.h>

enum MMU_FLAGS {
    MMU_FLAG_PERM_WRITE = (1 << 0),
    MMU_FLAG_PERM_READ = (1 << 1),
    MMU_FLAG_PERM_EXEC = (1 << 2),
    MMU_FLAG_UNCACHED = (1 << 3),
    MMU_FLAG_NONPRIV = (1 << 4),
    MMU_FLAG_INVALID = (1 << 5),
    MMU_FLAG_COW = (1 << 6), // TODO: Remove this flag.
    MMU_FLAG_HUGE_PAGE = (1 << 7),
    MMU_FLAG_DEVICE = MMU_FLAG_PERM_READ | MMU_FLAG_PERM_WRITE | MMU_FLAG_UNCACHED,
};
typedef uint32_t mmu_flags_t;

enum MMU_PF_INFO_FLAGS {
    MMU_PF_INFO_ON_NOT_PRESENT = (1 << 0),
    MMU_PF_INFO_ON_WRITE = (1 << 1),
    MMU_PF_INFO_ON_NONPRIV_ACCESS = (1 << 2),
    MMU_PF_INFO_SECURITY_VIOLATION = (1 << 3),
};
typedef uint32_t mmu_pf_info_flags_t;

enum PTABLE_LEVELS {
    PTABLE_LV0 = 0,
    PTABLE_LV1 = 1,
    PTABLE_LV2 = 2,
    PTABLE_LV3 = 3,
};
typedef enum PTABLE_LEVELS ptable_lv_t;

enum PTABLE_ENTITY_STATES {
    PTABLE_ENTITY_PRESENT,
    PTABLE_ENTITY_INVALID,
    PTABLE_ENTITY_ALLOC, // For arm32 pspace, other targets never return this state.
};
typedef uint32_t ptable_state_t;

#endif // _KERNEL_MEM_BITS_MMU_H