Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/mm/page.c

    r235e6c7 rb93d637  
    6060
    6161#include <mm/page.h>
     62#include <genarch/mm/page_ht.h>
     63#include <genarch/mm/page_pt.h>
    6264#include <arch/mm/page.h>
    6365#include <arch/mm/asid.h>
     
    7072#include <debug.h>
    7173#include <arch.h>
     74#include <syscall/copy.h>
     75#include <errno.h>
    7276
    7377/** Virtual operations for page subsystem. */
     
    108112 * using flags. Allocate and setup any missing page tables.
    109113 *
    110  * @param as    Address space to which page belongs.
     114 * @param as    Address space to wich page belongs.
    111115 * @param page  Virtual address of the page to be mapped.
    112116 * @param frame Physical address of memory frame to which the mapping is
     
    135139 * this call visible.
    136140 *
    137  * @param as   Address space to which page belongs.
     141 * @param as   Address space to wich page belongs.
    138142 * @param page Virtual address of the page to be demapped.
    139143 *
     
    152156}
    153157
    154 /** Find mapping for virtual page.
    155  *
    156  * @param as     Address space to which page belongs.
    157  * @param page   Virtual page.
    158  * @param nolock True if the page tables need not be locked.
     158/** Find mapping for virtual page
     159 *
     160 * Find mapping for virtual page.
     161 *
     162 * @param as   Address space to wich page belongs.
     163 * @param page Virtual page.
    159164 *
    160165 * @return NULL if there is no such mapping; requested mapping
     
    162167 *
    163168 */
    164 NO_TRACE pte_t *page_mapping_find(as_t *as, uintptr_t page, bool nolock)
    165 {
    166         ASSERT(nolock || page_table_locked(as));
     169NO_TRACE pte_t *page_mapping_find(as_t *as, uintptr_t page)
     170{
     171        ASSERT(page_table_locked(as));
    167172       
    168173        ASSERT(page_mapping_operations);
    169174        ASSERT(page_mapping_operations->mapping_find);
    170175       
    171         return page_mapping_operations->mapping_find(as, page, nolock);
     176        return page_mapping_operations->mapping_find(as, page);
     177}
     178
     179/** Syscall wrapper for getting mapping of a virtual page.
     180 *
     181 * @retval EOK Everything went find, @p uspace_frame and @p uspace_node
     182 *             contains correct values.
     183 * @retval ENOENT Virtual address has no mapping.
     184 */
     185sysarg_t sys_page_find_mapping(uintptr_t virt_address,
     186    uintptr_t *uspace_frame)
     187{
     188        mutex_lock(&AS->lock);
     189       
     190        pte_t *pte = page_mapping_find(AS, virt_address);
     191        if (!PTE_VALID(pte) || !PTE_PRESENT(pte)) {
     192                mutex_unlock(&AS->lock);
     193               
     194                return (sysarg_t) ENOENT;
     195        }
     196       
     197        uintptr_t phys_address = PTE_GET_FRAME(pte);
     198       
     199        mutex_unlock(&AS->lock);
     200       
     201        int rc = copy_to_uspace(uspace_frame,
     202            &phys_address, sizeof(phys_address));
     203        if (rc != EOK) {
     204                return (sysarg_t) rc;
     205        }
     206       
     207        return EOK;
    172208}
    173209
Note: See TracChangeset for help on using the changeset viewer.