Parameter Info Block (PIB), all offsets in pointer-length words Name Offset Meaning buffer_size 0 Size of the destination buffer The total number of bytes in all of the segments that require a buffer to be created in the destination address space. This is specified so that the kernel can allocate one large buffer for all segments before traversing the segment list. When returning from a method, the buffer size only includes buffers allocated by the caller; "inout" segments where the caller specified a non-NULL ptr, and the callee did not increase the length, are not included (because the kernel does not need to allocate a caller-side buffer for them). objlist_ptr 1 Pointer to the object list objlist_len 2 Length of the object list The object list is a list of pointers into segment data describing where object IDs can be found. When copying a segment to the destination address space, it will convert all IDs (allocating a new ID if necessary). The object list must be in order (first by segment, then by address); an exception may be thrown if it is out of order or if it contains invalid entries. Segments with object IDs cannot have the Shared flag. Unmarshalling code should always verify that any ID it expects is actually in the object list. ptrlist_ptr 3 Pointer to the pointer list ptrlist_len 4 Length of the pointer list The pointer list, like the object list, is a list of pointers to segment data. Each pointer pointed to must also point within segment data, and will be modified by the ORB when copied to point to the equivalent location in the destination address space. The pointer list must be in order (first by segment, then by address); an exception may be thrown if it is out of order of if it contains invalid entries. Segments with internal pointers cannot have the Shared flag (shared segments can still be pointed to, of course). Unmarshalling code should always verify that any internal pointer it expects actually points within a valid segment. num_segments 5 Number of data segments segment.ptr 6+n*3 Pointer to data segment segment.len 7+n*3 Length of data segment in bytes segment.flags 8+n*3 Attributes of data segment Each segment describes data being transmitted to and/or from the callee. For out segments, the caller may designate a buffer to hold the data, or it may leave the ptr field NULL. The caller may replace an out segment pointer with its own (it must do this if it was NULL), and it may change the length of the segment. Except when flags such as Push or Shared force the kernel to map, rather than copy, the data, it will choose which method to use based on the size, page-alignment, and overmap status of the segment. Segment Flags (see doc/orb/memory-management for more details): In 0x01 Data is copied/mapped from caller to callee Out 0x02 Data is copied/mapped from callee to caller Shared 0x04 A permanent shared mapping is created Push 0x08 The region is unmapped from the source and transferred to the destination. Inline 0x10 The callee cannot change the length of an Out segment. Ignored for In segments. Immutable 0x20 The segment is to be mapped read-only in the destination. Copy 0x8000 The segment is permanently copied into the destination address space, with read/write access (unless Immutable is set).