summaryrefslogtreecommitdiff
path: root/vm/vm_user.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm/vm_user.c')
-rw-r--r--vm/vm_user.c70
1 files changed, 59 insertions, 11 deletions
diff --git a/vm/vm_user.c b/vm/vm_user.c
index 2f41d322..b13ba8dc 100644
--- a/vm/vm_user.c
+++ b/vm/vm_user.c
@@ -242,7 +242,7 @@ kern_return_t vm_read(
vm_address_t address,
vm_size_t size,
pointer_t *data,
- vm_size_t *data_size)
+ mach_msg_type_number_t *data_size)
{
kern_return_t error;
vm_map_copy_t ipc_address;
@@ -265,7 +265,7 @@ kern_return_t vm_write(
vm_map_t map,
vm_address_t address,
pointer_t data,
- vm_size_t size)
+ mach_msg_type_number_t size)
{
if (map == VM_MAP_NULL)
return KERN_INVALID_ARGUMENT;
@@ -345,14 +345,16 @@ kern_return_t vm_map(
object = VM_OBJECT_NULL;
offset = 0;
copy = FALSE;
- } else if ((object = vm_object_enter(memory_object, size, FALSE))
- == VM_OBJECT_NULL)
+ } else if ((object = vm_object_lookup_name (memory_object)) == VM_OBJECT_NULL &&
+ (object = vm_object_enter(memory_object, size, FALSE)) == VM_OBJECT_NULL)
{
ipc_port_t real_memobj;
vm_prot_t prot;
+
result = memory_object_proxy_lookup (memory_object, &real_memobj,
&prot);
if (result != KERN_SUCCESS)
+ /* Really no luck */
return result;
/* Reduce the allowed access to the memory object. */
@@ -532,17 +534,28 @@ kern_return_t vm_msync(
return vm_map_msync(map, (vm_offset_t) address, size, sync_flags);
}
-kern_return_t experimental_vm_allocate_contiguous(host_priv, map, result_vaddr, result_paddr, size)
- host_t host_priv;
- vm_map_t map;
- vm_address_t *result_vaddr;
- vm_address_t *result_paddr;
- vm_size_t size;
+/*
+ * vm_allocate_contiguous allocates "zero fill" physical memory and maps
+ * it into in the specfied map.
+ */
+/* TODO: respect physical alignment (palign)
+ * and minimum physical address (pmin)
+ */
+kern_return_t vm_allocate_contiguous(
+ host_t host_priv,
+ vm_map_t map,
+ vm_address_t *result_vaddr,
+ rpc_phys_addr_t *result_paddr,
+ vm_size_t size,
+ rpc_phys_addr_t pmin,
+ rpc_phys_addr_t pmax,
+ rpc_phys_addr_t palign)
{
vm_size_t alloc_size;
unsigned int npages;
unsigned int i;
unsigned int order;
+ unsigned int selector;
vm_page_t pages;
vm_object_t object;
kern_return_t kr;
@@ -554,6 +567,27 @@ kern_return_t experimental_vm_allocate_contiguous(host_priv, map, result_vaddr,
if (map == VM_MAP_NULL)
return KERN_INVALID_TASK;
+ /* FIXME */
+ if (pmin != 0)
+ return KERN_INVALID_ARGUMENT;
+
+ if (palign == 0)
+ palign = PAGE_SIZE;
+
+ /* FIXME */
+ if (palign != PAGE_SIZE)
+ return KERN_INVALID_ARGUMENT;
+
+ selector = VM_PAGE_SEL_DMA;
+ if (pmax > VM_PAGE_DMA_LIMIT)
+#ifdef VM_PAGE_DMA32_LIMIT
+ selector = VM_PAGE_SEL_DMA32;
+ if (pmax > VM_PAGE_DMA32_LIMIT)
+#endif
+ selector = VM_PAGE_SEL_DIRECTMAP;
+ if (pmax > VM_PAGE_DIRECTMAP_LIMIT)
+ selector = VM_PAGE_SEL_HIGHMEM;
+
size = vm_page_round(size);
if (size == 0)
@@ -573,7 +607,7 @@ kern_return_t experimental_vm_allocate_contiguous(host_priv, map, result_vaddr,
alloc_size = (1 << (order + PAGE_SHIFT));
npages = vm_page_atop(alloc_size);
- pages = vm_page_grab_contig(alloc_size, VM_PAGE_SEL_DIRECTMAP);
+ pages = vm_page_grab_contig(alloc_size, selector);
if (pages == NULL) {
vm_object_deallocate(object);
@@ -625,3 +659,17 @@ kern_return_t experimental_vm_allocate_contiguous(host_priv, map, result_vaddr,
return KERN_SUCCESS;
}
+
+kern_return_t experimental_vm_allocate_contiguous(host_priv, map, result_vaddr, result_paddr, size)
+ host_t host_priv;
+ vm_map_t map;
+ vm_address_t *result_vaddr;
+ vm_address_t *result_paddr;
+ vm_size_t size;
+{
+ rpc_phys_addr_t paddr;
+ kern_return_t ret;
+ ret = vm_allocate_contiguous(host_priv, map, result_vaddr, &paddr, size, 0, ~0ULL, 0);
+ *result_paddr = paddr;
+ return ret;
+}