Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/mm/as_pt.c

    rd99c1d2 rada559c  
    3333/**
    3434 * @file
    35  * @brief       Address space functions for 4-level hierarchical pagetables.
     35 * @brief Address space functions for 4-level hierarchical pagetables.
    3636 */
    3737
     
    4747#include <arch.h>
    4848
    49 static pte_t *ptl0_create(int flags);
    50 static void ptl0_destroy(pte_t *page_table);
     49static pte_t *ptl0_create(unsigned int);
     50static void ptl0_destroy(pte_t *);
    5151
    52 static void pt_lock(as_t *as, bool lock);
    53 static void pt_unlock(as_t *as, bool unlock);
     52static void pt_lock(as_t *, bool);
     53static void pt_unlock(as_t *, bool);
     54static bool pt_locked(as_t *);
    5455
    5556as_operations_t as_pt_operations = {
     
    5758        .page_table_destroy = ptl0_destroy,
    5859        .page_table_lock = pt_lock,
    59         .page_table_unlock = pt_unlock
     60        .page_table_unlock = pt_unlock,
     61        .page_table_locked = pt_locked,
    6062};
    6163
     
    6769 *
    6870 * @return New PTL0.
     71 *
    6972 */
    70 pte_t *ptl0_create(int flags)
     73pte_t *ptl0_create(unsigned int flags)
    7174{
    72         pte_t *src_ptl0, *dst_ptl0;
    73         ipl_t ipl;
    74         int table_size;
    75 
    76         dst_ptl0 = (pte_t *) frame_alloc(PTL0_SIZE, FRAME_KA);
    77         table_size = FRAME_SIZE << PTL0_SIZE;
    78 
    79         if (flags & FLAG_AS_KERNEL) {
     75        pte_t *dst_ptl0 = (pte_t *) frame_alloc(PTL0_SIZE, FRAME_KA);
     76        size_t table_size = FRAME_SIZE << PTL0_SIZE;
     77       
     78        if (flags & FLAG_AS_KERNEL)
    8079                memsetb(dst_ptl0, table_size, 0);
    81         } else {
    82                 uintptr_t src, dst;
    83        
     80        else {
    8481                /*
    8582                 * Copy the kernel address space portion to new PTL0.
     83                 *
    8684                 */
    87                  
    88                 ipl = interrupts_disable();
    89                 mutex_lock(&AS_KERNEL->lock);           
    90                 src_ptl0 = (pte_t *) PA2KA((uintptr_t) AS_KERNEL->genarch.page_table);
    91 
    92                 src = (uintptr_t) &src_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)];
    93                 dst = (uintptr_t) &dst_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)];
    94 
     85               
     86                ipl_t ipl = interrupts_disable();
     87                mutex_lock(&AS_KERNEL->lock);
     88               
     89                pte_t *src_ptl0 =
     90                    (pte_t *) PA2KA((uintptr_t) AS_KERNEL->genarch.page_table);
     91               
     92                uintptr_t src =
     93                    (uintptr_t) &src_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)];
     94                uintptr_t dst =
     95                    (uintptr_t) &dst_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)];
     96               
    9597                memsetb(dst_ptl0, table_size, 0);
    96                 memcpy((void *) dst, (void *) src, table_size - (src - (uintptr_t) src_ptl0));
     98                memcpy((void *) dst, (void *) src,
     99                    table_size - (src - (uintptr_t) src_ptl0));
     100               
    97101                mutex_unlock(&AS_KERNEL->lock);
    98102                interrupts_restore(ipl);
    99103        }
    100 
     104       
    101105        return (pte_t *) KA2PA((uintptr_t) dst_ptl0);
    102106}
     
    107111 *
    108112 * @param page_table Physical address of PTL0.
     113 *
    109114 */
    110115void ptl0_destroy(pte_t *page_table)
    111116{
    112         frame_free((uintptr_t)page_table);
     117        frame_free((uintptr_t) page_table);
    113118}
    114119
     
    118123 * Interrupts must be disabled.
    119124 *
    120  * @param as Address space.
     125 * @param as   Address space.
    121126 * @param lock If false, do not attempt to lock the address space.
     127 *
    122128 */
    123129void pt_lock(as_t *as, bool lock)
     
    132138 * Interrupts must be disabled.
    133139 *
    134  * @param as Address space.
     140 * @param as     Address space.
    135141 * @param unlock If false, do not attempt to unlock the address space.
     142 *
    136143 */
    137144void pt_unlock(as_t *as, bool unlock)
     
    141148}
    142149
     150/** Test whether page tables are locked.
     151 *
     152 * @param as            Address space where the page tables belong.
     153 *
     154 * @return              True if the page tables belonging to the address soace
     155 *                      are locked, otherwise false.
     156 */
     157bool pt_locked(as_t *as)
     158{
     159        return mutex_locked(&as->lock);
     160}
     161
    143162/** @}
    144163 */
Note: See TracChangeset for help on using the changeset viewer.