 |
Index for Section 9r |
|
 |
Alphabetical listing for V |
|
 |
Bottom of page |
|
vm_map_pageable(9r)
NAME
vm_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
map Specifies the address map associated with an individual process.
start
Specifies the starting address of an address range. Typically, this is
the address of the user's buffer where the DMA operation occurs.
end Specifies the ending address of a consecutive range of addresses
beginning with the start argument.
access_type
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:
VM_PROT_NONE
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.
VM_PROT_READ
Verifies that the specifed range of addresses is readable by
the specified process. If so, the range of addresses is locked
in memory to remain stable throughout the DMA operation.
VM_PROT_WRITE
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.
VM_PROT_WRITE
Verifies that the specifed range of addresses is readable and
writable by the specified process. If so, the range of
addresses is locked in memory to remain stable throughout the
DMA operation.
DESCRIPTION
The vm_map_pageable routine ensures that the address range you specified 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 routine
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)
 |
Index for Section 9r |
|
 |
Alphabetical listing for V |
|
 |
Top of page |
|