Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/abs32le/include/mm/page.h

    r50fda24 rdc0b964  
    3737
    3838#include <arch/mm/frame.h>
     39#include <trace.h>
    3940
    4041#define PAGE_WIDTH  FRAME_WIDTH
     
    4344#ifdef KERNEL
    4445
    45 #ifndef __ASM__
    46         #define KA2PA(x)  (((uintptr_t) (x)) - 0x80000000)
    47         #define PA2KA(x)  (((uintptr_t) (x)) + 0x80000000)
    48 #else
    49         #define KA2PA(x)  ((x) - 0x80000000)
    50         #define PA2KA(x)  ((x) + 0x80000000)
    51 #endif
     46#define KA2PA(x)  (((uintptr_t) (x)) - UINT32_C(0x80000000))
     47#define PA2KA(x)  (((uintptr_t) (x)) + UINT32_C(0x80000000))
    5248
    5349/*
     
    6965
    7066/* Macros calculating indices for each level. */
    71 #define PTL0_INDEX_ARCH(vaddr)  (((vaddr) >> 22) & 0x3ff)
     67#define PTL0_INDEX_ARCH(vaddr)  (((vaddr) >> 22) & 0x3ffU)
    7268#define PTL1_INDEX_ARCH(vaddr)  0
    7369#define PTL2_INDEX_ARCH(vaddr)  0
    74 #define PTL3_INDEX_ARCH(vaddr)  (((vaddr) >> 12) & 0x3ff)
     70#define PTL3_INDEX_ARCH(vaddr)  (((vaddr) >> 12) & 0x3ffU)
    7571
    7672/* Get PTE address accessors for each level. */
     
    122118#define PTE_EXECUTABLE_ARCH(p)  1
    123119
    124 #ifndef __ASM__
    125 
    126120#include <mm/mm.h>
    127121#include <arch/interrupt.h>
    128 #include <arch/types.h>
    129122#include <typedefs.h>
    130 
    131 /* Page fault error codes. */
    132 
    133 /** When bit on this position is 0, the page fault was caused by a not-present
    134  * page.
    135  */
    136 #define PFERR_CODE_P            (1 << 0)
    137 
    138 /** When bit on this position is 1, the page fault was caused by a write. */
    139 #define PFERR_CODE_RW           (1 << 1)
    140 
    141 /** When bit on this position is 1, the page fault was caused in user mode. */
    142 #define PFERR_CODE_US           (1 << 2)
    143 
    144 /** When bit on this position is 1, a reserved bit was set in page directory. */
    145 #define PFERR_CODE_RSVD         (1 << 3)       
    146123
    147124/** Page Table Entry. */
    148125typedef struct {
    149         unsigned present : 1;
    150         unsigned writeable : 1;
    151         unsigned uaccessible : 1;
    152         unsigned page_write_through : 1;
    153         unsigned page_cache_disable : 1;
    154         unsigned accessed : 1;
    155         unsigned dirty : 1;
    156         unsigned pat : 1;
    157         unsigned global : 1;
    158         unsigned soft_valid : 1;        /**< Valid content even if the present bit is not set. */
    159         unsigned avl : 2;
    160         unsigned frame_address : 20;
    161 } __attribute__ ((packed)) pte_t;
     126        unsigned int present : 1;
     127        unsigned int writeable : 1;
     128        unsigned int uaccessible : 1;
     129        unsigned int page_write_through : 1;
     130        unsigned int page_cache_disable : 1;
     131        unsigned int accessed : 1;
     132        unsigned int dirty : 1;
     133        unsigned int pat : 1;
     134        unsigned int global : 1;
     135       
     136        /** Valid content even if the present bit is not set. */
     137        unsigned int soft_valid : 1;
     138        unsigned int avl : 2;
     139        unsigned int frame_address : 20;
     140} __attribute__((packed)) pte_t;
    162141
    163 static inline unsigned int get_pt_flags(pte_t *pt, size_t i)
     142NO_TRACE static inline unsigned int get_pt_flags(pte_t *pt, size_t i)
     143    REQUIRES_ARRAY_MUTABLE(pt, PTL0_ENTRIES_ARCH)
    164144{
    165145        pte_t *p = &pt[i];
    166146       
    167         return ((!p->page_cache_disable) << PAGE_CACHEABLE_SHIFT |
    168             (!p->present) << PAGE_PRESENT_SHIFT |
    169             p->uaccessible << PAGE_USER_SHIFT |
    170             1 << PAGE_READ_SHIFT |
    171             p->writeable << PAGE_WRITE_SHIFT |
    172             1 << PAGE_EXEC_SHIFT |
    173             p->global << PAGE_GLOBAL_SHIFT);
     147        return (
     148            ((unsigned int) (!p->page_cache_disable) << PAGE_CACHEABLE_SHIFT) |
     149            ((unsigned int) (!p->present) << PAGE_PRESENT_SHIFT) |
     150            ((unsigned int) p->uaccessible << PAGE_USER_SHIFT) |
     151            (1 << PAGE_READ_SHIFT) |
     152            ((unsigned int) p->writeable << PAGE_WRITE_SHIFT) |
     153            (1 << PAGE_EXEC_SHIFT) |
     154            ((unsigned int) p->global << PAGE_GLOBAL_SHIFT)
     155        );
    174156}
    175157
    176 static inline void set_pt_flags(pte_t *pt, size_t i, int flags)
     158NO_TRACE static inline void set_pt_flags(pte_t *pt, size_t i, int flags)
     159    WRITES(ARRAY_RANGE(pt, PTL0_ENTRIES_ARCH))
     160    REQUIRES_ARRAY_MUTABLE(pt, PTL0_ENTRIES_ARCH)
    177161{
    178162        pte_t *p = &pt[i];
     
    192176
    193177extern void page_arch_init(void);
    194 extern void page_fault(int n, istate_t *istate);
    195 
    196 #endif /* __ASM__ */
     178extern void page_fault(unsigned int, istate_t *);
    197179
    198180#endif /* KERNEL */
Note: See TracChangeset for help on using the changeset viewer.