|The region is not cached.|
|Writes to the region may be combined or performed out of order.|
|Writes to the region are committed synchronously.|
|Writes to the region are committed asynchronously.|
|The region cannot be written to.|
Memory ranges are described by
.Vt struct mem_range_desc :
uint64_t mr_base; /* physical base address */ uint64_t mr_len; /* physical length of region */ int mr_flags; /* attributes of region */ char mr_owner;
In addition to the region attributes listed above, the following flags may also be set in the mr_flags field:
|The regions base address cannot be changed.|
|The regions length cannot be changed.|
|The region is believed to have been established by the system firmware.|
|The region is currently active.|
|We believe the region to be invalid or otherwise erroneous.|
|The region cannot be disabled.|
|The region is currently owned by another process and may not be altered.|
Operations are performed using struct mem_range_op:
struct mem_range_desc *mo_desc; int mo_arg;
The MEMRANGE_GET ioctl is used to retrieve current memory range attributes. If mo_arg is set to 0, it will be updated with the total number of memory range descriptors. If greater than 0, the array at mo_desc will be filled with a corresponding number of descriptor structures, or the maximum, whichever is less.
The MEMRANGE_SET ioctl is used to add, alter and remove memory range attributes. A range with the MDF_FIXACTIVE flag may not be removed; a range with the MDF_BUSY flag may not be removed or updated.
mo_arg should be set to MEMRANGE_SET_UPDATE to update an existing or establish a new range, or to MEMRANGE_SET_REMOVE to remove a range.
[EOPNOTSUPP] Memory range operations are not supported on this architecture. [ENXIO] No memory range descriptors are available (e.g. firmware has not enabled any). [EINVAL] The memory range supplied as an argument is invalid or overlaps another range in a fashion not supported by this architecture. [EBUSY] An attempt to remove or update a range failed because the range is busy. [ENOSPC] An attempt to create a new range failed due to a shortage of hardware resources (e.g. descriptor slots). [ENOENT] An attempt to remove a range failed because no range matches the descriptor base/length supplied. [EPERM] An attempt to remove a range failed because the range is permanently enabled.
The mem and kmem files appeared in AT&T v6 . The ioctl interface for memory range attributes was added in
.Fx 3.2 .
Busy range attributes are not yet managed correctly.
This device is required for all users of kvm(3) to operate.