Ignore:
File:
1 edited

Legend:

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

    rdc0b964 r50fda24  
    3737
    3838#include <arch/mm/frame.h>
    39 #include <trace.h>
    4039
    4140#define PAGE_WIDTH  FRAME_WIDTH
     
    4443#ifdef KERNEL
    4544
    46 #define KA2PA(x)  (((uintptr_t) (x)) - UINT32_C(0x80000000))
    47 #define PA2KA(x)  (((uintptr_t) (x)) + UINT32_C(0x80000000))
     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
    4852
    4953/*
     
    6569
    6670/* Macros calculating indices for each level. */
    67 #define PTL0_INDEX_ARCH(vaddr)  (((vaddr) >> 22) & 0x3ffU)
     71#define PTL0_INDEX_ARCH(vaddr)  (((vaddr) >> 22) & 0x3ff)
    6872#define PTL1_INDEX_ARCH(vaddr)  0
    6973#define PTL2_INDEX_ARCH(vaddr)  0
    70 #define PTL3_INDEX_ARCH(vaddr)  (((vaddr) >> 12) & 0x3ffU)
     74#define PTL3_INDEX_ARCH(vaddr)  (((vaddr) >> 12) & 0x3ff)
    7175
    7276/* Get PTE address accessors for each level. */
     
    118122#define PTE_EXECUTABLE_ARCH(p)  1
    119123
     124#ifndef __ASM__
     125
    120126#include <mm/mm.h>
    121127#include <arch/interrupt.h>
     128#include <arch/types.h>
    122129#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)       
    123146
    124147/** Page Table Entry. */
    125148typedef struct {
    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;
    141 
    142 NO_TRACE static inline unsigned int get_pt_flags(pte_t *pt, size_t i)
    143     REQUIRES_ARRAY_MUTABLE(pt, PTL0_ENTRIES_ARCH)
     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;
     162
     163static inline unsigned int get_pt_flags(pte_t *pt, size_t i)
    144164{
    145165        pte_t *p = &pt[i];
    146166       
    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         );
     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);
    156174}
    157175
    158 NO_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)
     176static inline void set_pt_flags(pte_t *pt, size_t i, int flags)
    161177{
    162178        pte_t *p = &pt[i];
     
    176192
    177193extern void page_arch_init(void);
    178 extern void page_fault(unsigned int, istate_t *);
     194extern void page_fault(int n, istate_t *istate);
     195
     196#endif /* __ASM__ */
    179197
    180198#endif /* KERNEL */
Note: See TracChangeset for help on using the changeset viewer.