vm: address-space: add function to translate virtual addresses to physical
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
#include <kernel/vm.h>
|
#include <kernel/vm.h>
|
||||||
|
|
||||||
#define ADDRESS_SPACE_COPY_ALL ((size_t) - 1)
|
#define ADDRESS_SPACE_COPY_ALL ((size_t) - 1)
|
||||||
|
#define ADDRESS_SPACE_F_
|
||||||
|
|
||||||
struct address_space;
|
struct address_space;
|
||||||
struct vm_object;
|
struct vm_object;
|
||||||
@@ -158,6 +159,12 @@ extern kern_status_t address_space_memmove_v(
|
|||||||
size_t bytes_to_move,
|
size_t bytes_to_move,
|
||||||
size_t *nr_bytes_moved);
|
size_t *nr_bytes_moved);
|
||||||
|
|
||||||
|
extern kern_status_t address_space_translate(
|
||||||
|
struct address_space *space,
|
||||||
|
virt_addr_t in,
|
||||||
|
phys_addr_t *out,
|
||||||
|
unsigned long *irq_flags);
|
||||||
|
|
||||||
void address_space_dump(struct address_space *region);
|
void address_space_dump(struct address_space *region);
|
||||||
|
|
||||||
DEFINE_OBJECT_LOCK_FUNCTION(address_space, s_base)
|
DEFINE_OBJECT_LOCK_FUNCTION(address_space, s_base)
|
||||||
|
|||||||
@@ -1413,6 +1413,42 @@ extern kern_status_t address_space_memmove_v(
|
|||||||
return KERN_OK;
|
return KERN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kern_status_t address_space_translate(
|
||||||
|
struct address_space *space,
|
||||||
|
virt_addr_t in,
|
||||||
|
phys_addr_t *out,
|
||||||
|
unsigned long *irq_flags)
|
||||||
|
{
|
||||||
|
if (in >= VM_KERNEL_BASE) {
|
||||||
|
return vm_virt_to_phys((const void *)in);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct vm_area *area = get_entry(space, in, GET_ENTRY_EXACT);
|
||||||
|
if (!area || !area->vma_object) {
|
||||||
|
return KERN_NO_ENTRY;
|
||||||
|
}
|
||||||
|
|
||||||
|
off_t offset = in - area->vma_base + area->vma_object_offset;
|
||||||
|
struct vm_object *vmo = area->vma_object;
|
||||||
|
vm_object_lock(vmo);
|
||||||
|
address_space_unlock(space);
|
||||||
|
struct vm_page *pg = vm_object_get_page(
|
||||||
|
vmo,
|
||||||
|
offset,
|
||||||
|
VMO_ALLOCATE_MISSING_PAGE | VMO_REQUEST_MISSING_PAGE,
|
||||||
|
irq_flags);
|
||||||
|
if (!pg) {
|
||||||
|
return KERN_NO_ENTRY;
|
||||||
|
}
|
||||||
|
|
||||||
|
phys_addr_t paddr = vm_page_get_paddr(pg);
|
||||||
|
paddr += (in & VM_PAGE_MASK);
|
||||||
|
vm_object_unlock(vmo);
|
||||||
|
address_space_lock(space);
|
||||||
|
|
||||||
|
return paddr;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef TRACE
|
#ifdef TRACE
|
||||||
void address_space_dump(struct address_space *region)
|
void address_space_dump(struct address_space *region)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user