vm_map_pageable(9r)vm_map_pageable(9r)NAMEvm_map_pageable - General: Sets pageability of the specified address
range
SYNOPSIS
kern_return_t vm_map_pageable(
vm_map_t map,
vm_offset_t start,
vm_offset_t end,
vm_prot_t access_type );
ARGUMENTS
Specifies the address map associated with an individual process. Spec‐
ifies the starting address of an address range. Typically, this is the
address of the user's buffer where the DMA operation occurs. Specifies
the ending address of a consecutive range of addresses beginning with
the start argument. Specifies the access mode to be set for memory
specified by the start and end arguments. You can set this argument to
VM_PROT_NONE or to the bitwise inclusive OR of the protection bits
VM_PROT_READ and VM_PROT_WRITE. These bits are defined in the file
<mach/vm_prot.h> and have the following meanings: Modifies the memory
attributes so that the specified range of addresses is no longer
locked. This should be done after the DMA operation has completed.
Verifies that the specifed range of addresses is readable by the speci‐
fied process. If so, the range of addresses is locked in memory to
remain stable throughout the DMA operation. Verifies that the specifed
range of addresses is writable by the specified process. If so, the
range of addresses is locked in memory to remain stable throughout the
DMA operation. Verifies that the specifed range of addresses is read‐
able and writable by the specified process. If so, the range of
addresses is locked in memory to remain stable throughout the DMA oper‐
ation.
DESCRIPTION
The vm_map_pageable routine ensures that the address range you speci‐
fied in the start and end arguments is accessible. If the address range
is accessible by the specified process, the memory associated with this
address range will have its locked attributes modified as specified by
the access_type argument. A kernel module can call this routine prior
to performing a DMA operation to ensure that: The currently running
process has read or write access permission to the user's buffer The
memory representing the user's buffer is locked so that it remains
available throughout the DMA operation.
NOTES
This routine may block in the kernel. Therefore, you should release all
locks and lower the SPL before calling vm_map_pageable. When the rou‐
tine returns, you should relock the data and check the data integrity.
RETURN VALUES
Upon successful completion, the vm_map_pageable routine returns the
value 0 (zero). Otherwise, it returns a nonzero value to indicate an
error.
EXAMPLE
The following code fragment shows how the vm_map_pageable routine
ensures that the user's buffer is accessible to cause the corresponding
memory to be locked:
if (vm_map_pageable(current_task()->map,
trunc_page(bp->b_un.b_addr),
round_page(bp->b_un.b_addr + (int)bp->b_bcount),
(bp->b_flags == B_READ ? VM_PROT_READ : VM_PROT_WRITE))) {
/***************************************************
* Here you implement the code to perform the *
* actual DMA operation. Upon conclusion of the *
* DMA operation, add the following code to *
* release the locked attribute. *
***************************************************/
if (vm_map_pageable(current_task()->map,
trunc_page(bp->b_un.b_addr),
round_page(bp->b_un.b_addr + (int)bp->b_bcount),
VM_PROT_NONE)) {
SEE ALSO
Routines: current_task(9r), round_page(9r), trunc_page(9r)vm_map_pageable(9r)