Ignore:
File:
1 edited

Legend:

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

    r7a0359b r98000fb  
    2727 */
    2828
    29 /** @addtogroup arm32mm
     29/** @addtogroup arm32mm 
    3030 * @{
    3131 */
     
    4040#include <mm/mm.h>
    4141#include <arch/exception.h>
    42 #include <trace.h>
    4342
    4443#define PAGE_WIDTH      FRAME_WIDTH
     
    7675/* Get PTE address accessors for each level. */
    7776#define GET_PTL1_ADDRESS_ARCH(ptl0, i) \
    78         ((pte_t *) ((((pte_t *)(ptl0))[(i)].l0).coarse_table_addr << 10))
     77        ((pte_t *) ((((pte_level0_t *)(ptl0))[(i)]).coarse_table_addr << 10))
    7978#define GET_PTL2_ADDRESS_ARCH(ptl1, i) \
    8079        (ptl1)
     
    8281        (ptl2)
    8382#define GET_FRAME_ADDRESS_ARCH(ptl3, i) \
    84         ((uintptr_t) ((((pte_t *)(ptl3))[(i)].l1).frame_base_addr << 12))
     83        ((uintptr_t) ((((pte_level1_t *)(ptl3))[(i)]).frame_base_addr << 12))
    8584
    8685/* Set PTE address accessors for each level. */
    8786#define SET_PTL0_ADDRESS_ARCH(ptl0) \
    88         (set_ptl0_addr((pte_t *) (ptl0)))
     87        (set_ptl0_addr((pte_level0_t *) (ptl0)))
    8988#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) \
    90         (((pte_t *) (ptl0))[(i)].l0.coarse_table_addr = (a) >> 10)
     89        (((pte_level0_t *) (ptl0))[(i)].coarse_table_addr = (a) >> 10)
    9190#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a)
    9291#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a)
    9392#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) \
    94         (((pte_t *) (ptl3))[(i)].l1.frame_base_addr = (a) >> 12)
     93        (((pte_level1_t *) (ptl3))[(i)].frame_base_addr = (a) >> 12)
    9594
    9695/* Get PTE flags accessors for each level. */
    9796#define GET_PTL1_FLAGS_ARCH(ptl0, i) \
    98         get_pt_level0_flags((pte_t *) (ptl0), (size_t) (i))
     97        get_pt_level0_flags((pte_level0_t *) (ptl0), (size_t) (i))
    9998#define GET_PTL2_FLAGS_ARCH(ptl1, i) \
    10099        PAGE_PRESENT
     
    102101        PAGE_PRESENT
    103102#define GET_FRAME_FLAGS_ARCH(ptl3, i) \
    104         get_pt_level1_flags((pte_t *) (ptl3), (size_t) (i))
     103        get_pt_level1_flags((pte_level1_t *) (ptl3), (size_t) (i))
    105104
    106105/* Set PTE flags accessors for each level. */
    107106#define SET_PTL1_FLAGS_ARCH(ptl0, i, x) \
    108         set_pt_level0_flags((pte_t *) (ptl0), (size_t) (i), (x))
     107        set_pt_level0_flags((pte_level0_t *) (ptl0), (size_t) (i), (x))
    109108#define SET_PTL2_FLAGS_ARCH(ptl1, i, x)
    110109#define SET_PTL3_FLAGS_ARCH(ptl2, i, x)
    111110#define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \
    112         set_pt_level1_flags((pte_t *) (ptl3), (size_t) (i), (x))
     111        set_pt_level1_flags((pte_level1_t *) (ptl3), (size_t) (i), (x))
    113112
    114113/* Macros for querying the last-level PTE entries. */
     
    116115        (*((uint32_t *) (pte)) != 0)
    117116#define PTE_PRESENT_ARCH(pte) \
    118         (((pte_t *) (pte))->l0.descriptor_type != 0)
     117        (((pte_level0_t *) (pte))->descriptor_type != 0)
    119118#define PTE_GET_FRAME_ARCH(pte) \
    120         (((pte_t *) (pte))->l1.frame_base_addr << FRAME_WIDTH)
     119        (((pte_level1_t *) (pte))->frame_base_addr << FRAME_WIDTH)
    121120#define PTE_WRITABLE_ARCH(pte) \
    122         (((pte_t *) (pte))->l1.access_permission_0 == PTE_AP_USER_RW_KERNEL_RW)
     121        (((pte_level1_t *) (pte))->access_permission_0 == \
     122            PTE_AP_USER_RW_KERNEL_RW)
    123123#define PTE_EXECUTABLE_ARCH(pte) \
    124124        1
     
    159159} ATTRIBUTE_PACKED pte_level1_t;
    160160
    161 typedef union {
    162         pte_level0_t l0;
    163         pte_level1_t l1;
    164 } pte_t;
    165161
    166162/* Level 1 page tables access permissions */
     
    193189/** Sets the address of level 0 page table.
    194190 *
    195  * @param pt Pointer to the page table to set.
    196  *
    197  */
    198 NO_TRACE static inline void set_ptl0_addr(pte_t *pt)
     191 * @param pt    Pointer to the page table to set.
     192 */   
     193static inline void set_ptl0_addr(pte_level0_t *pt)
    199194{
    200195        asm volatile (
     
    207202/** Returns level 0 page table entry flags.
    208203 *
    209  * @param pt Level 0 page table.
    210  * @param i  Index of the entry to return.
    211  *
    212  */
    213 NO_TRACE static inline int get_pt_level0_flags(pte_t *pt, size_t i)
    214 {
    215         pte_level0_t *p = &pt[i].l0;
     204 *  @param pt     Level 0 page table.
     205 *  @param i      Index of the entry to return.
     206 */
     207static inline int get_pt_level0_flags(pte_level0_t *pt, size_t i)
     208{
     209        pte_level0_t *p = &pt[i];
    216210        int np = (p->descriptor_type == PTE_DESCRIPTOR_NOT_PRESENT);
    217        
     211
    218212        return (np << PAGE_PRESENT_SHIFT) | (1 << PAGE_USER_SHIFT) |
    219213            (1 << PAGE_READ_SHIFT) | (1 << PAGE_WRITE_SHIFT) |
     
    223217/** Returns level 1 page table entry flags.
    224218 *
    225  * @param pt Level 1 page table.
    226  * @param i  Index of the entry to return.
    227  *
    228  */
    229 NO_TRACE static inline int get_pt_level1_flags(pte_t *pt, size_t i)
    230 {
    231         pte_level1_t *p = &pt[i].l1;
    232        
     219 *  @param pt     Level 1 page table.
     220 *  @param i      Index of the entry to return.
     221 */
     222static inline int get_pt_level1_flags(pte_level1_t *pt, size_t i)
     223{
     224        pte_level1_t *p = &pt[i];
     225
    233226        int dt = p->descriptor_type;
    234227        int ap = p->access_permission_0;
    235        
     228
    236229        return ((dt == PTE_DESCRIPTOR_NOT_PRESENT) << PAGE_PRESENT_SHIFT) |
    237230            ((ap == PTE_AP_USER_RO_KERNEL_RW) << PAGE_READ_SHIFT) |
     
    245238}
    246239
     240
    247241/** Sets flags of level 0 page table entry.
    248242 *
    249  * @param pt    level 0 page table
    250  * @param i     index of the entry to be changed
    251  * @param flags new flags
    252  *
    253  */
    254 NO_TRACE static inline void set_pt_level0_flags(pte_t *pt, size_t i, int flags)
    255 {
    256         pte_level0_t *p = &pt[i].l0;
    257        
     243 *  @param pt     level 0 page table
     244 *  @param i      index of the entry to be changed
     245 *  @param flags  new flags
     246 */
     247static inline void set_pt_level0_flags(pte_level0_t *pt, size_t i, int flags)
     248{
     249        pte_level0_t *p = &pt[i];
     250
    258251        if (flags & PAGE_NOT_PRESENT) {
    259252                p->descriptor_type = PTE_DESCRIPTOR_NOT_PRESENT;
     
    266259                p->descriptor_type = PTE_DESCRIPTOR_COARSE_TABLE;
    267260                p->should_be_zero = 0;
    268         }
     261    }
    269262}
    270263
     
    272265/** Sets flags of level 1 page table entry.
    273266 *
    274  * We use same access rights for the whole page. When page
    275  * is not preset we store 1 in acess_rigts_3 so that at least
    276  * one bit is 1 (to mark correct page entry, see #PAGE_VALID_ARCH).
    277  *
    278  * @param pt    Level 1 page table.
    279  * @param i     Index of the entry to be changed.
    280  * @param flags New flags.
    281  *
    282  */
    283 NO_TRACE static inline void set_pt_level1_flags(pte_t *pt, size_t i, int flags)
    284 {
    285         pte_level1_t *p = &pt[i].l1;
     267 *  We use same access rights for the whole page. When page is not preset we
     268 *  store 1 in acess_rigts_3 so that at least one bit is 1 (to mark correct
     269 *  page entry, see #PAGE_VALID_ARCH).
     270 *
     271 *  @param pt     Level 1 page table.
     272 *  @param i      Index of the entry to be changed.
     273 *  @param flags  New flags.
     274 */ 
     275static inline void set_pt_level1_flags(pte_level1_t *pt, size_t i, int flags)
     276{
     277        pte_level1_t *p = &pt[i];
    286278       
    287279        if (flags & PAGE_NOT_PRESENT) {
     
    292284                p->access_permission_3 = p->access_permission_0;
    293285        }
    294        
     286 
    295287        p->cacheable = p->bufferable = (flags & PAGE_CACHEABLE) != 0;
    296        
     288
    297289        /* default access permission */
    298290        p->access_permission_0 = p->access_permission_1 =
    299291            p->access_permission_2 = p->access_permission_3 =
    300292            PTE_AP_USER_NO_KERNEL_RW;
    301        
     293
    302294        if (flags & PAGE_USER)  {
    303295                if (flags & PAGE_READ) {
Note: See TracChangeset for help on using the changeset viewer.