Ignore:
File:
1 edited

Legend:

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

    raf863d0 rfdaad75d  
    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
     
    4343#include <arch/mm/page.h>
    4444#include <arch/mm/as.h>
    45 #include <arch/types.h>
     45#include <typedefs.h>
    4646#include <memstr.h>
    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                mutex_lock(&AS_KERNEL->lock);
     87               
     88                pte_t *src_ptl0 =
     89                    (pte_t *) PA2KA((uintptr_t) AS_KERNEL->genarch.page_table);
     90               
     91                uintptr_t src =
     92                    (uintptr_t) &src_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)];
     93                uintptr_t dst =
     94                    (uintptr_t) &dst_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)];
     95               
    9596                memsetb(dst_ptl0, table_size, 0);
    96                 memcpy((void *) dst, (void *) src, table_size - (src - (uintptr_t) src_ptl0));
     97                memcpy((void *) dst, (void *) src,
     98                    table_size - (src - (uintptr_t) src_ptl0));
     99               
    97100                mutex_unlock(&AS_KERNEL->lock);
    98                 interrupts_restore(ipl);
    99101        }
    100 
     102       
    101103        return (pte_t *) KA2PA((uintptr_t) dst_ptl0);
    102104}
     
    107109 *
    108110 * @param page_table Physical address of PTL0.
     111 *
    109112 */
    110113void ptl0_destroy(pte_t *page_table)
    111114{
    112         frame_free((uintptr_t)page_table);
     115        frame_free((uintptr_t) page_table);
    113116}
    114117
     
    118121 * Interrupts must be disabled.
    119122 *
    120  * @param as Address space.
     123 * @param as   Address space.
    121124 * @param lock If false, do not attempt to lock the address space.
     125 *
    122126 */
    123127void pt_lock(as_t *as, bool lock)
     
    132136 * Interrupts must be disabled.
    133137 *
    134  * @param as Address space.
     138 * @param as     Address space.
    135139 * @param unlock If false, do not attempt to unlock the address space.
     140 *
    136141 */
    137142void pt_unlock(as_t *as, bool unlock)
     
    141146}
    142147
     148/** Test whether page tables are locked.
     149 *
     150 * @param as            Address space where the page tables belong.
     151 *
     152 * @return              True if the page tables belonging to the address soace
     153 *                      are locked, otherwise false.
     154 */
     155bool pt_locked(as_t *as)
     156{
     157        return mutex_locked(&as->lock);
     158}
     159
    143160/** @}
    144161 */
Note: See TracChangeset for help on using the changeset viewer.