~martin-decky/helenos/rcu

« back to all changes in this revision

Viewing changes to kernel/generic/src/mm/page.c

  • Committer: Jakub Jermar
  • Date: 2011-06-07 21:31:35 UTC
  • mfrom: (708.2.1 mainline)
  • Revision ID: jakub@jermar.eu-20110607213135-cxz8vhxq21pij1gb
Merge USB support.

Changes from bzr://helenos-usb.bzr.sourceforge.net/bzrroot/helenos-usb/mainline:

- replaced '-' with '_' in new driver names
- USB libs are built for each architecture
- devman starts early
- sys_thread_udelay() uses generic delay()
- sys_as_create_area() now creates cacheable areas by default

Show diffs side-by-side

added added

removed removed

Lines of Context:
59
59
 */
60
60
 
61
61
#include <mm/page.h>
 
62
#include <genarch/mm/page_ht.h>
 
63
#include <genarch/mm/page_pt.h>
62
64
#include <arch/mm/page.h>
63
65
#include <arch/mm/asid.h>
64
66
#include <mm/as.h>
69
71
#include <memstr.h>
70
72
#include <debug.h>
71
73
#include <arch.h>
 
74
#include <syscall/copy.h>
 
75
#include <errno.h>
72
76
 
73
77
/** Virtual operations for page subsystem. */
74
78
page_mapping_operations_t *page_mapping_operations = NULL;
171
175
        return page_mapping_operations->mapping_find(as, page, nolock);
172
176
}
173
177
 
 
178
/** Syscall wrapper for getting mapping of a virtual page.
 
179
 * 
 
180
 * @retval EOK Everything went find, @p uspace_frame and @p uspace_node
 
181
 *             contains correct values.
 
182
 * @retval ENOENT Virtual address has no mapping.
 
183
 */
 
184
sysarg_t sys_page_find_mapping(uintptr_t virt_address,
 
185
    uintptr_t *uspace_frame)
 
186
{
 
187
        mutex_lock(&AS->lock);
 
188
        
 
189
        pte_t *pte = page_mapping_find(AS, virt_address, false);
 
190
        if (!PTE_VALID(pte) || !PTE_PRESENT(pte)) {
 
191
                mutex_unlock(&AS->lock);
 
192
                
 
193
                return (sysarg_t) ENOENT;
 
194
        }
 
195
        
 
196
        uintptr_t phys_address = PTE_GET_FRAME(pte);
 
197
        
 
198
        mutex_unlock(&AS->lock);
 
199
        
 
200
        int rc = copy_to_uspace(uspace_frame,
 
201
            &phys_address, sizeof(phys_address));
 
202
        if (rc != EOK) {
 
203
                return (sysarg_t) rc;
 
204
        }
 
205
        
 
206
        return EOK;
 
207
}
 
208
 
174
209
/** @}
175
210
 */