rmmap_create Kernel Service
Purpose
Defines an Effective Address [EA] to Real Address [RA] translation region.
Syntax
Parameters
Item | Description |
---|---|
eaddr | Required process effective address of the mapping region. |
iomp | The bus memory to which the effective address described by the eaddr parameter must correspond. For real memory, the bus id must be set to REALMEM_BID and the bus address must be set to the real memory address. The size field must be at least PAGESIZE, no larger than SEGSIZE, and a multiple of PAGESIZE. The key must be set to IO_MEM_MAP. The flags field is not used. |
flags | The flags select page and segment attributes of the translation.
Not all page attribute flags are compatible. The valid combinations
of page attribute flags follow.
|
Description
The translation regions that are created with rmmap_create kernel service are maintained in I/O mapping segments. Any single such segment might translate up to 256 Megabytes of real memory or memory mapped I/O in a single region. The only granularity for which the rmmap_remove service might be started is a single mapping that is created by a single call to the rmmap_create.
There are constraints on the size of the mapping and the flags parameter, described later, which causes the call to fail regardless of whether adequate effective address space exists.
If rmmap_create kernel service is called with the effective address of zero, the function attempts to find free space in the process address space. If successful, an I/O mapping segment is created and the effective address (which is passed by reference) is changed to the effective address which is mapped to the first page of the iomp memory.
If rmmap_create kernel service is called with a non-zero effective address, it is taken as the required effective address which must translate to the passed iomp memory. This function verifies that the requested range is free. If not, it fails and returns EINVAL. If the mapping at the effective address is not contained in a single segment, the function fails and returns ENOSPC. Otherwise, the region is allocated and the effective address is not modified. The effective address is mapped to the first page of the iomp memory. References outside of the mapped regions but within the same segment are invalid.
The effective address (if provided) and the bus address must be a multiple of PAGESIZE or EINVAL is returned.
I/O mapping segments are not inherited by child processes after a fork subroutine.
I/O mapping segments are not inherited by child processes after a fork subroutine, except when RMMAP_INHERIT is specified. These segments are deleted by exec, exit, or rmmap_remove of the last range in a segment.
Only certain combinations of flags are permitted, depending on the type of memory that is mapped. For real memory mappings, RMMAP_PAGE_M is required while RMMAP_PAGE_W, RMMAP_PAGE_I, and RMMAP_PAGE_G are not allowed. For I/O mappings, it is valid to specify only RMMAP_PAGE_M, with no other page attribute flags. It is also valid to specify RMMAP_PAGE_I and optionally, either or both of RMMAP_PAGE_M, and RMMAP_PAGE_G. RMMAP_PAGE_W is never allowed.
The real address range that is described by the iomp parameter must be unique within this I/O mapping segment.
Execution Environment
The rmmap_create kernel service can be called only from the process environment.
Return Values
On successful completion, rmmap_create kernel service returns zero and modifies the effective address to the value at which the newly created mapping region was attached to the process address space. Otherwise, it returns one of following errors:
Item | Description |
---|---|
EINVAL | Some type of parameter error occurred. These parameters include, but are not limited to, size errors and mutually exclusive flag selections. |
ENOMEM | The operating system cannot allocate the necessary data structures to represent the mapping. |
ENOSPC | Effective address space exhausted in the region indicated by eaddr. |
EPERM | This hardware platform does not implement this service. |
Implementation Specifics
This service only functions on PowerPC microprocessors.