| Excerpt from UltraSPARC Virtual Machine Specification |
| Compiled from version 3.0.20+15 |
| Publication date 2017-09-25 08:21 |
| Copyright © 2008, 2015 Oracle and/or its affiliates. All rights reserved. |
| Extracted via "pdftotext -f 547 -l 572 -layout sun4v_20170925.pdf" |
| Authors: |
| Charles Kunzman |
| Sam Glidden |
| Mark Cianchetti |
| |
| |
| Chapter 36. Coprocessor services |
| The following APIs provide access via the Hypervisor to hardware assisted data processing functionality. |
| These APIs may only be provided by certain platforms, and may not be available to all virtual machines |
| even on supported platforms. Restrictions on the use of these APIs may be imposed in order to support |
| live-migration and other system management activities. |
| |
| 36.1. Data Analytics Accelerator |
| The Data Analytics Accelerator (DAX) functionality is a collection of hardware coprocessors that provide |
| high speed processoring of database-centric operations. The coprocessors may support one or more of |
| the following data query operations: search, extraction, compression, decompression, and translation. The |
| functionality offered may vary by virtual machine implementation. |
| |
| The DAX is a virtual device to sun4v guests, with supported data operations indicated by the virtual device |
| compatibility property. Functionality is accessed through the submission of Command Control Blocks |
| (CCBs) via the ccb_submit API function. The operations are processed asynchronously, with the status |
| of the submitted operations reported through a Completion Area linked to each CCB. Each CCB has a |
| separate Completion Area and, unless execution order is specifically restricted through the use of serial- |
| conditional flags, the execution order of submitted CCBs is arbitrary. Likewise, the time to completion |
| for a given CCB is never guaranteed. |
| |
| Guest software may implement a software timeout on CCB operations, and if the timeout is exceeded, the |
| operation may be cancelled or killed via the ccb_kill API function. It is recommended for guest software |
| to implement a software timeout to account for certain RAS errors which may result in lost CCBs. It is |
| recommended such implementation use the ccb_info API function to check the status of a CCB prior to |
| killing it in order to determine if the CCB is still in queue, or may have been lost due to a RAS error. |
| |
| There is no fixed limit on the number of outstanding CCBs guest software may have queued in the virtual |
| machine, however, internal resource limitations within the virtual machine can cause CCB submissions |
| to be temporarily rejected with EWOULDBLOCK. In such cases, guests should continue to attempt |
| submissions until they succeed; waiting for an outstanding CCB to complete is not necessary, and would |
| not be a guarantee that a future submission would succeed. |
| |
| The availablility of DAX coprocessor command service is indicated by the presence of the DAX virtual |
| device node in the guest MD (Section 8.24.17, “Database Analytics Accelerators (DAX) virtual-device |
| node”). |
| |
| 36.1.1. DAX Compatibility Property |
| The query functionality may vary based on the compatibility property of the virtual device: |
| |
| 36.1.1.1. "ORCL,sun4v-dax" Device Compatibility |
| Available CCB commands: |
| |
| • No-op/Sync |
| |
| • Extract |
| |
| • Scan Value |
| |
| • Inverted Scan Value |
| |
| • Scan Range |
| |
| |
| 509 |
| Coprocessor services |
| |
| |
| • Inverted Scan Range |
| |
| • Translate |
| |
| • Inverted Translate |
| |
| • Select |
| |
| See Section 36.2.1, “Query CCB Command Formats” for the corresponding CCB input and output formats. |
| |
| Only version 0 CCBs are available. |
| |
| 36.1.1.2. "ORCL,sun4v-dax-fc" Device Compatibility |
| "ORCL,sun4v-dax-fc" is compatible with the "ORCL,sun4v-dax" interface, and includes additional CCB |
| bit fields and controls. |
| |
| 36.1.1.3. "ORCL,sun4v-dax2" Device Compatibility |
| Available CCB commands: |
| |
| • No-op/Sync |
| |
| • Extract |
| |
| • Scan Value |
| |
| • Inverted Scan Value |
| |
| • Scan Range |
| |
| • Inverted Scan Range |
| |
| • Translate |
| |
| • Inverted Translate |
| |
| • Select |
| |
| See Section 36.2.1, “Query CCB Command Formats” for the corresponding CCB input and output formats. |
| |
| Version 0 and 1 CCBs are available. Only version 0 CCBs may use Huffman encoded data, whereas only |
| version 1 CCBs may use OZIP. |
| |
| 36.1.2. DAX Virtual Device Interrupts |
| The DAX virtual device has multiple interrupts associated with it which may be used by the guest if |
| desired. The number of device interrupts available to the guest is indicated in the virtual device node of the |
| guest MD (Section 8.24.17, “Database Analytics Accelerators (DAX) virtual-device node”). If the device |
| node indicates N interrupts available, the guest may use any value from 0 to N - 1 (inclusive) in a CCB |
| interrupt number field. Using values outside this range will result in the CCB being rejected for an invalid |
| field value. |
| |
| The interrupts may be bound and managed using the standard sun4v device interrupts API (Chapter 16, |
| Device interrupt services). Sysino interrupts are not available for DAX devices. |
| |
| 36.2. Coprocessor Control Block (CCB) |
| CCBs are either 64 or 128 bytes long, depending on the operation type. The exact contents of the CCB |
| are command specific, but all CCBs contain at least one memory buffer address. All memory locations |
| |
| |
| 510 |
| Coprocessor services |
| |
| |
| referenced by a CCB must be pinned in memory until the CCB either completes execution or is killed |
| via the ccb_kill API call. Changes in virtual address mappings occurring after CCB submission are not |
| guaranteed to be visible, and as such all virtual address updates need to be synchronized with CCB |
| execution. |
| |
| All CCBs begin with a common 32-bit header. |
| |
| Table 36.1. CCB Header Format |
| Bits Field Description |
| [31:28] CCB version. For API version 2.0: set to 1 if CCB uses OZIP encoding; set to 0 if the CCB |
| uses Huffman encoding; otherwise either 0 or 1. For API version 1.0: always set to 0. |
| [27] When API version 2.0 is negotiated, this is the Pipeline Flag [512]. It is reserved in |
| API version 1.0 |
| [26] Long CCB flag [512] |
| [25] Conditional synchronization flag [512] |
| [24] Serial synchronization flag |
| [23:16] CCB operation code: |
| 0x00 No Operation (No-op) or Sync |
| 0x01 Extract |
| 0x02 Scan Value |
| 0x12 Inverted Scan Value |
| 0x03 Scan Range |
| 0x13 Inverted Scan Range |
| 0x04 Translate |
| 0x14 Inverted Translate |
| 0x05 Select |
| [15:13] Reserved |
| [12:11] Table address type |
| 0b'00 No address |
| 0b'01 Alternate context virtual address |
| 0b'10 Real address |
| 0b'11 Primary context virtual address |
| [10:8] Output/Destination address type |
| 0b'000 No address |
| 0b'001 Alternate context virtual address |
| 0b'010 Real address |
| 0b'011 Primary context virtual address |
| 0b'100 Reserved |
| 0b'101 Reserved |
| 0b'110 Reserved |
| 0b'111 Reserved |
| [7:5] Secondary source address type |
| |
| |
| 511 |
| Coprocessor services |
| |
| |
| Bits Field Description |
| 0b'000 No address |
| 0b'001 Alternate context virtual address |
| 0b'010 Real address |
| 0b'011 Primary context virtual address |
| 0b'100 Reserved |
| 0b'101 Reserved |
| 0b'110 Reserved |
| 0b'111 Reserved |
| [4:2] Primary source address type |
| 0b'000 No address |
| 0b'001 Alternate context virtual address |
| 0b'010 Real address |
| 0b'011 Primary context virtual address |
| 0b'100 Reserved |
| 0b'101 Reserved |
| 0b'110 Reserved |
| 0b'111 Reserved |
| [1:0] Completion area address type |
| 0b'00 No address |
| 0b'01 Alternate context virtual address |
| 0b'10 Real address |
| 0b'11 Primary context virtual address |
| |
| The Long CCB flag indicates whether the submitted CCB is 64 or 128 bytes long; value is 0 for 64 bytes |
| and 1 for 128 bytes. |
| |
| The Serial and Conditional flags allow simple relative ordering between CCBs. Any CCB with the Serial |
| flag set will execute sequentially relative to any previous CCB that is also marked as Serial in the same |
| CCB submission. CCBs without the Serial flag set execute independently, even if they are between CCBs |
| with the Serial flag set. CCBs marked solely with the Serial flag will execute upon the completion of the |
| previous Serial CCB, regardless of the completion status of that CCB. The Conditional flag allows CCBs |
| to conditionally execute based on the successful execution of the closest CCB marked with the Serial flag. |
| A CCB may only be conditional on exactly one CCB, however, a CCB may be marked both Conditional |
| and Serial to allow execution chaining. The flags do NOT allow fan-out chaining, where multiple CCBs |
| execute in parallel based on the completion of another CCB. |
| |
| The Pipeline flag is an optimization that directs the output of one CCB (the "source" CCB) directly to |
| the input of the next CCB (the "target" CCB). The target CCB thus does not need to read the input from |
| memory. The Pipeline flag is advisory and may be dropped. |
| |
| Both the Pipeline and Serial bits must be set in the source CCB. The Conditional bit must be set in the |
| target CCB. Exactly one CCB must be made conditional on the source CCB; either 0 or 2 target CCBs |
| is invalid. However, Pipelines can be extended beyond two CCBs: the sequence would start with a CCB |
| with both the Pipeline and Serial bits set, proceed through CCBs with the Pipeline, Serial, and Conditional |
| bits set, and terminate at a CCB that has the Conditional bit set, but not the Pipeline bit. |
| |
| |
| 512 |
| Coprocessor services |
| |
| |
| The input of the target CCB must start within 64 bytes of the output of the source CCB or the pipeline flag |
| will be ignored. All CCBs in a pipeline must be submitted in the same call to ccb_submit. |
| |
| The various address type fields indicate how the various address values used in the CCB should be |
| interpreted by the virtual machine. Not all of the types specified are used by every CCB format. Types |
| which are not applicable to the given CCB command should be indicated as type 0 (No address). Virtual |
| addresses used in the CCB must have translation entries present in either the TLB or a configured TSB |
| for the submitting virtual processor. Virtual addresses which cannot be translated by the virtual machine |
| will result in the CCB submission being rejected, with the causal virtual address indicated. The CCB |
| may be resubmitted after inserting the translation, or the address may be translated by guest software and |
| resubmitted using the real address translation. |
| |
| 36.2.1. Query CCB Command Formats |
| 36.2.1.1. Supported Data Formats, Elements Sizes and Offsets |
| Data for query commands may be encoded in multiple possible formats. The data query commands use a |
| common set of values to indicate the encoding formats of the data being processed. Some encoding formats |
| require multiple data streams for processing, requiring the specification of both primary data formats (the |
| encoded data) and secondary data streams (meta-data for the encoded data). |
| |
| 36.2.1.1.1. Primary Input Format |
| |
| The primary input format code is a 4-bit field when it is used. There are 10 primary input formats available. |
| The packed formats are not endian neutral. Code values not listed below are reserved. |
| |
| Code Format Description |
| 0x0 Fixed width byte packed Up to 16 bytes |
| 0x1 Fixed width bit packed Up to 15 bits (CCB version 0) or 23 bits (CCB version |
| 1); bits are read most significant bit to least significant bit |
| within a byte |
| 0x2 Variable width byte packed Data stream of lengths must be provided as a secondary |
| input |
| 0x4 Fixed width byte packed with run Up to 16 bytes; data stream of run lengths must be |
| length encoding provided as a secondary input |
| 0x5 Fixed width bit packed with run Up to 15 bits (CCB version 0) or 23 bits (CCB version |
| length encoding 1); bits are read most significant bit to least significant bit |
| within a byte; data stream of run lengths must be provided |
| as a secondary input |
| 0x8 Fixed width byte packed with Up to 16 bytes before the encoding; compressed stream |
| Huffman (CCB version 0) or bits are read most significant bit to least significant bit |
| OZIP (CCB version 1) encoding within a byte; pointer to the encoding table must be |
| provided |
| 0x9 Fixed width bit packed with Up to 15 bits (CCB version 0) or 23 bits (CCB version |
| Huffman (CCB version 0) or 1); compressed stream bits are read most significant bit to |
| OZIP (CCB version 1) encoding least significant bit within a byte; pointer to the encoding |
| table must be provided |
| 0xA Variable width byte packed with Up to 16 bytes before the encoding; compressed stream |
| Huffman (CCB version 0) or bits are read most significant bit to least significant bit |
| OZIP (CCB version 1) encoding within a byte; data stream of lengths must be provided as |
| a secondary input; pointer to the encoding table must be |
| provided |
| |
| |
| 513 |
| Coprocessor services |
| |
| |
| Code Format Description |
| 0xC Fixed width byte packed with Up to 16 bytes before the encoding; compressed stream |
| run length encoding, followed by bits are read most significant bit to least significant bit |
| Huffman (CCB version 0) or within a byte; data stream of run lengths must be provided |
| OZIP (CCB version 1) encoding as a secondary input; pointer to the encoding table must |
| be provided |
| 0xD Fixed width bit packed with Up to 15 bits (CCB version 0) or 23 bits(CCB version 1) |
| run length encoding, followed by before the encoding; compressed stream bits are read most |
| Huffman (CCB version 0) or significant bit to least significant bit within a byte; data |
| OZIP (CCB version 1) encoding stream of run lengths must be provided as a secondary |
| input; pointer to the encoding table must be provided |
| |
| If OZIP encoding is used, there must be no reserved bytes in the table. |
| |
| 36.2.1.1.2. Primary Input Element Size |
| |
| For primary input data streams with fixed size elements, the element size must be indicated in the CCB |
| command. The size is encoded as the number of bits or bytes, minus one. The valid value range for this |
| field depends on the input format selected, as listed in the table above. |
| |
| 36.2.1.1.3. Secondary Input Format |
| |
| For primary input data streams which require a secondary input stream, the secondary input stream is |
| always encoded in a fixed width, bit-packed format. The bits are read from most significant bit to least |
| significant bit within a byte. There are two encoding options for the secondary input stream data elements, |
| depending on whether the value of 0 is needed: |
| |
| Secondary Input Description |
| Format Code |
| 0 Element is stored as value minus 1 (0 evaluates to 1, 1 evaluates |
| to 2, etc) |
| 1 Element is stored as value |
| |
| 36.2.1.1.4. Secondary Input Element Size |
| |
| Secondary input element size is encoded as a two bit field: |
| |
| Secondary Input Size Description |
| Code |
| 0x0 1 bit |
| 0x1 2 bits |
| 0x2 4 bits |
| 0x3 8 bits |
| |
| 36.2.1.1.5. Input Element Offsets |
| |
| Bit-wise input data streams may have any alignment within the base addressed byte. The offset, specified |
| from most significant bit to least significant bit, is provided as a fixed 3 bit field for each input type. A |
| value of 0 indicates that the first input element begins at the most significant bit in the first byte, and a |
| value of 7 indicates it begins with the least significant bit. |
| |
| This field should be zero for any byte-wise primary input data streams. |
| |
| |
| 514 |
| Coprocessor services |
| |
| |
| 36.2.1.1.6. Output Format |
| |
| Query commands support multiple sizes and encodings for output data streams. There are four possible |
| output encodings, and up to four supported element sizes per encoding. Not all output encodings are |
| supported for every command. The format is indicated by a 4-bit field in the CCB: |
| |
| Output Format Code Description |
| 0x0 Byte aligned, 1 byte elements |
| 0x1 Byte aligned, 2 byte elements |
| 0x2 Byte aligned, 4 byte elements |
| 0x3 Byte aligned, 8 byte elements |
| 0x4 16 byte aligned, 16 byte elements |
| 0x5 Reserved |
| 0x6 Reserved |
| 0x7 Reserved |
| 0x8 Packed vector of single bit elements |
| 0x9 Reserved |
| 0xA Reserved |
| 0xB Reserved |
| 0xC Reserved |
| 0xD 2 byte elements where each element is the index value of a bit, |
| from an bit vector, which was 1. |
| 0xE 4 byte elements where each element is the index value of a bit, |
| from an bit vector, which was 1. |
| 0xF Reserved |
| |
| 36.2.1.1.7. Application Data Integrity (ADI) |
| |
| On platforms which support ADI, the ADI version number may be specified for each separate memory |
| access type used in the CCB command. ADI checking only occurs when reading data. When writing data, |
| the specified ADI version number overwrites any existing ADI value in memory. |
| |
| An ADI version value of 0 or 0xF indicates the ADI checking is disabled for that data access, even if it is |
| enabled in memory. By setting the appropriate flag in CCB_SUBMIT (Section 36.3.1, “ccb_submit”) it is |
| also an option to disable ADI checking for all inputs accessed via virtual address for all CCBs submitted |
| during that hypercall invocation. |
| |
| The ADI value is only guaranteed to be checked on the first 64 bytes of each data access. Mismatches on |
| subsequent data chunks may not be detected, so guest software should be careful to use page size checking |
| to protect against buffer overruns. |
| |
| 36.2.1.1.8. Page size checking |
| |
| All data accesses used in CCB commands must be bounded within a single memory page. When addresses |
| are provided using a virtual address, the page size for checking is extracted from the TTE for that virtual |
| address. When using real addresses, the guest must supply the page size in the same field as the address |
| value. The page size must be one of the sizes supported by the underlying virtual machine. Using a value |
| that is not supported may result in the CCB submission being rejected or the generation of a CCB parsing |
| error in the completion area. |
| |
| |
| 515 |
| Coprocessor services |
| |
| |
| 36.2.1.2. Extract command |
| |
| Converts an input vector in one format to an output vector in another format. All input format types are |
| supported. |
| |
| The only supported output format is a padded, byte-aligned output stream, using output codes 0x0 - 0x4. |
| When the specified output element size is larger than the extracted input element size, zeros are padded to |
| the extracted input element. First, if the decompressed input size is not a whole number of bytes, 0 bits are |
| padded to the most significant bit side till the next byte boundary. Next, if the output element size is larger |
| than the byte padded input element, bytes of value 0 are added based on the Padding Direction bit in the |
| CCB. If the output element size is smaller than the byte-padded input element size, the input element is |
| truncated by dropped from the least significant byte side until the selected output size is reached. |
| |
| The return value of the CCB completion area is invalid. The “number of elements processed” field in the |
| CCB completion area will be valid. |
| |
| The extract CCB is a 64-byte “short format” CCB. |
| |
| The extract CCB command format can be specified by the following packed C structure for a big-endian |
| machine: |
| |
| |
| struct extract_ccb { |
| uint32_t header; |
| uint32_t control; |
| uint64_t completion; |
| uint64_t primary_input; |
| uint64_t data_access_control; |
| uint64_t secondary_input; |
| uint64_t reserved; |
| uint64_t output; |
| uint64_t table; |
| }; |
| |
| |
| The exact field offsets, sizes, and composition are as follows: |
| |
| Offset Size Field Description |
| 0 4 CCB header (Table 36.1, “CCB Header Format”) |
| 4 4 Command control |
| Bits Field Description |
| [31:28] Primary Input Format (see Section 36.2.1.1.1, “Primary Input |
| Format”) |
| [27:23] Primary Input Element Size (see Section 36.2.1.1.2, “Primary |
| Input Element Size”) |
| [22:20] Primary Input Starting Offset (see Section 36.2.1.1.5, “Input |
| Element Offsets”) |
| [19] Secondary Input Format (see Section 36.2.1.1.3, “Secondary |
| Input Format”) |
| [18:16] Secondary Input Starting Offset (see Section 36.2.1.1.5, “Input |
| Element Offsets”) |
| |
| |
| 516 |
| Coprocessor services |
| |
| |
| Offset Size Field Description |
| Bits Field Description |
| [15:14] Secondary Input Element Size (see Section 36.2.1.1.4, |
| “Secondary Input Element Size” |
| [13:10] Output Format (see Section 36.2.1.1.6, “Output Format”) |
| [9] Padding Direction selector: A value of 1 causes padding bytes |
| to be added to the left side of output elements. A value of 0 |
| causes padding bytes to be added to the right side of output |
| elements. |
| [8:0] Reserved |
| 8 8 Completion |
| Bits Field Description |
| [63:60] ADI version (see Section 36.2.1.1.7, “Application Data |
| Integrity (ADI)”) |
| [59] If set to 1, a virtual device interrupt will be generated using |
| the device interrupt number specified in the lower bits of this |
| completion word. If 0, the lower bits of this completion word |
| are ignored. |
| [58:6] Completion area address bits [58:6]. Address type is |
| determined by CCB header. |
| [5:0] Virtual device interrupt number for completion interrupt, if |
| enabled. |
| 16 8 Primary Input |
| Bits Field Description |
| [63:60] ADI version (see Section 36.2.1.1.7, “Application Data |
| Integrity (ADI)”) |
| [59:56] If using real address, these bits should be filled in with the |
| page size code for the page boundary checking the guest wants |
| the virtual machine to use when accessing this data stream |
| (checking is only guaranteed to be performed when using API |
| version 1.1 and later). If using a virtual address, this field will |
| be used as as primary input address bits [59:56]. |
| [55:0] Primary input address bits [55:0]. Address type is determined |
| by CCB header. |
| 24 8 Data Access Control |
| Bits Field Description |
| [63:62] Flow Control |
| Value Description |
| 0b'00 Disable flow control |
| 0b'01 Enable flow control (only valid with "ORCL,sun4v- |
| dax-fc" compatible virtual device variants) |
| 0b'10 Reserved |
| 0b'11 Reserved |
| [61:60] Reserved (API 1.0) |
| |
| |
| 517 |
| Coprocessor services |
| |
| |
| Offset Size Field Description |
| Bits Field Description |
| Pipeline target (API 2.0) |
| Value Description |
| 0b'00 Connect to primary input |
| 0b'01 Connect to secondary input |
| 0b'10 Reserved |
| 0b'11 Reserved |
| [59:40] Output buffer size given in units of 64 bytes, minus 1. Value of |
| 0 means 64 bytes, value of 1 means 128 bytes, etc. Buffer size is |
| only enforced if flow control is enabled in Flow Control field. |
| [39:32] Reserved |
| [31:30] Output Data Cache Allocation |
| Value Description |
| 0b'00 Do not allocate cache lines for output data stream. |
| 0b'01 Force cache lines for output data stream to be |
| allocated in the cache that is local to the submitting |
| virtual cpu. |
| 0b'10 Allocate cache lines for output data stream, but allow |
| existing cache lines associated with the data to remain |
| in their current cache instance. Any memory not |
| already in cache will be allocated in the cache local |
| to the submitting virtual cpu. |
| 0b'11 Reserved |
| [29:26] Reserved |
| [25:24] Primary Input Length Format |
| Value Description |
| 0b'00 Number of primary symbols |
| 0b'01 Number of primary bytes |
| 0b'10 Number of primary bits |
| 0b'11 Reserved |
| [23:0] Primary Input Length |
| Format Field Value |
| # of primary symbols Number of input elements to process, |
| minus 1. Command execution stops |
| once count is reached. |
| # of primary bytes Number of input bytes to process, |
| minus 1. Command execution stops |
| once count is reached. The count is |
| done before any decompression or |
| decoding. |
| # of primary bits Number of input bits to process, |
| minus 1. Command execution stops |
| |
| |
| |
| 518 |
| Coprocessor services |
| |
| |
| Offset Size Field Description |
| Bits Field Description |
| Format Field Value |
| once count is reached. The count is |
| done before any decompression or |
| decoding, and does not include any |
| bits skipped by the Primary Input |
| Offset field value of the command |
| control word. |
| 32 8 Secondary Input, if used by Primary Input Format. Same fields as Primary |
| Input. |
| 40 8 Reserved |
| 48 8 Output (same fields as Primary Input) |
| 56 8 Symbol Table (if used by Primary Input) |
| Bits Field Description |
| [63:60] ADI version (see Section 36.2.1.1.7, “Application Data |
| Integrity (ADI)”) |
| [59:56] If using real address, these bits should be filled in with the |
| page size code for the page boundary checking the guest wants |
| the virtual machine to use when accessing this data stream |
| (checking is only guaranteed to be performed when using API |
| version 1.1 and later). If using a virtual address, this field will |
| be used as as symbol table address bits [59:56]. |
| [55:4] Symbol table address bits [55:4]. Address type is determined |
| by CCB header. |
| [3:0] Symbol table version |
| Value Description |
| 0 Huffman encoding. Must use 64 byte aligned table |
| address. (Only available when using version 0 CCBs) |
| 1 OZIP encoding. Must use 16 byte aligned table |
| address. (Only available when using version 1 CCBs) |
| |
| |
| 36.2.1.3. Scan commands |
| |
| The scan commands search a stream of input data elements for values which match the selection criteria. |
| All the input format types are supported. There are multiple formats for the scan commands, allowing the |
| scan to search for exact matches to one value, exact matches to either of two values, or any value within |
| a specified range. The specific type of scan is indicated by the command code in the CCB header. For the |
| scan range commands, the boundary conditions can be specified as greater-than-or-equal-to a value, less- |
| than-or-equal-to a value, or both by using two boundary values. |
| |
| There are two supported formats for the output stream: the bit vector and index array formats (codes 0x8, |
| 0xD, and 0xE). For the standard scan command using the bit vector output, for each input element there |
| exists one bit in the vector that is set if the input element matched the scan criteria, or clear if not. The |
| inverted scan command inverts the polarity of the bits in the output. The most significant bit of the first |
| byte of the output stream corresponds to the first element in the input stream. The standard index array |
| output format contains one array entry for each input element that matched the scan criteria. Each array |
| |
| |
| |
| 519 |
| Coprocessor services |
| |
| |
| entry is the index of an input element that matched the scan criteria. An inverted scan command produces |
| a similar array, but of all the input elements which did NOT match the scan criteria. |
| |
| The return value of the CCB completion area contains the number of input elements found which match |
| the scan criteria (or number that did not match for the inverted scans). The “number of elements processed” |
| field in the CCB completion area will be valid, indicating the number of input elements processed. |
| |
| These commands are 128-byte “long format” CCBs. |
| |
| The scan CCB command format can be specified by the following packed C structure for a big-endian |
| machine: |
| |
| |
| struct scan_ccb { |
| uint32_t header; |
| uint32_t control; |
| uint64_t completion; |
| uint64_t primary_input; |
| uint64_t data_access_control; |
| uint64_t secondary_input; |
| uint64_t match_criteria0; |
| uint64_t output; |
| uint64_t table; |
| uint64_t match_criteria1; |
| uint64_t match_criteria2; |
| uint64_t match_criteria3; |
| uint64_t reserved[5]; |
| }; |
| |
| |
| The exact field offsets, sizes, and composition are as follows: |
| |
| Offset Size Field Description |
| 0 4 CCB header (Table 36.1, “CCB Header Format”) |
| 4 4 Command control |
| Bits Field Description |
| [31:28] Primary Input Format (see Section 36.2.1.1.1, “Primary Input |
| Format”) |
| [27:23] Primary Input Element Size (see Section 36.2.1.1.2, “Primary |
| Input Element Size”) |
| [22:20] Primary Input Starting Offset (see Section 36.2.1.1.5, “Input |
| Element Offsets”) |
| [19] Secondary Input Format (see Section 36.2.1.1.3, “Secondary |
| Input Format”) |
| [18:16] Secondary Input Starting Offset (see Section 36.2.1.1.5, “Input |
| Element Offsets”) |
| [15:14] Secondary Input Element Size (see Section 36.2.1.1.4, |
| “Secondary Input Element Size” |
| [13:10] Output Format (see Section 36.2.1.1.6, “Output Format”) |
| [9:5] Operand size for first scan criteria value. In a scan value |
| operation, this is one of two potential exact match values. |
| In a scan range operation, this is the size of the upper range |
| |
| |
| 520 |
| Coprocessor services |
| |
| |
| Offset Size Field Description |
| Bits Field Description |
| boundary. The value of this field is the number of bytes in the |
| operand, minus 1. Values 0xF-0x1E are reserved. A value of |
| 0x1F indicates this operand is not in use for this scan operation. |
| [4:0] Operand size for second scan criteria value. In a scan value |
| operation, this is one of two potential exact match values. |
| In a scan range operation, this is the size of the lower range |
| boundary. The value of this field is the number of bytes in the |
| operand, minus 1. Values 0xF-0x1E are reserved. A value of |
| 0x1F indicates this operand is not in use for this scan operation. |
| 8 8 Completion (same fields as Section 36.2.1.2, “Extract command”) |
| 16 8 Primary Input (same fields as Section 36.2.1.2, “Extract command”) |
| 24 8 Data Access Control (same fields as Section 36.2.1.2, “Extract command”) |
| 32 8 Secondary Input, if used by Primary Input Format. Same fields as Primary |
| Input. |
| 40 4 Most significant 4 bytes of first scan criteria operand. If first operand is less |
| than 4 bytes, the value is left-aligned to the lowest address bytes. |
| 44 4 Most significant 4 bytes of second scan criteria operand. If second operand |
| is less than 4 bytes, the value is left-aligned to the lowest address bytes. |
| 48 8 Output (same fields as Primary Input) |
| 56 8 Symbol Table (if used by Primary Input). Same fields as Section 36.2.1.2, |
| “Extract command” |
| 64 4 Next 4 most significant bytes of first scan criteria operand occurring after the |
| bytes specified at offset 40, if needed by the operand size. If first operand |
| is less than 8 bytes, the valid bytes are left-aligned to the lowest address. |
| 68 4 Next 4 most significant bytes of second scan criteria operand occurring after |
| the bytes specified at offset 44, if needed by the operand size. If second |
| operand is less than 8 bytes, the valid bytes are left-aligned to the lowest |
| address. |
| 72 4 Next 4 most significant bytes of first scan criteria operand occurring after the |
| bytes specified at offset 64, if needed by the operand size. If first operand |
| is less than 12 bytes, the valid bytes are left-aligned to the lowest address. |
| 76 4 Next 4 most significant bytes of second scan criteria operand occurring after |
| the bytes specified at offset 68, if needed by the operand size. If second |
| operand is less than 12 bytes, the valid bytes are left-aligned to the lowest |
| address. |
| 80 4 Next 4 most significant bytes of first scan criteria operand occurring after the |
| bytes specified at offset 72, if needed by the operand size. If first operand |
| is less than 16 bytes, the valid bytes are left-aligned to the lowest address. |
| 84 4 Next 4 most significant bytes of second scan criteria operand occurring after |
| the bytes specified at offset 76, if needed by the operand size. If second |
| operand is less than 16 bytes, the valid bytes are left-aligned to the lowest |
| address. |
| |
| |
| |
| |
| 521 |
| Coprocessor services |
| |
| |
| 36.2.1.4. Translate commands |
| |
| The translate commands takes an input array of indices, and a table of single bit values indexed by those |
| indices, and outputs a bit vector or index array created by reading the tables bit value at each index in |
| the input array. The output should therefore contain exactly one bit per index in the input data stream, |
| when outputting as a bit vector. When outputting as an index array, the number of elements depends on the |
| values read in the bit table, but will always be less than, or equal to, the number of input elements. Only |
| a restricted subset of the possible input format types are supported. No variable width or Huffman/OZIP |
| encoded input streams are allowed. The primary input data element size must be 3 bytes or less. |
| |
| The maximum table index size allowed is 15 bits, however, larger input elements may be used to provide |
| additional processing of the output values. If 2 or 3 byte values are used, the least significant 15 bits are |
| used as an index into the bit table. The most significant 9 bits (when using 3-byte input elements) or single |
| bit (when using 2-byte input elements) are compared against a fixed 9-bit test value provided in the CCB. |
| If the values match, the value from the bit table is used as the output element value. If the values do not |
| match, the output data element value is forced to 0. |
| |
| In the inverted translate operation, the bit value read from bit table is inverted prior to its use. The additional |
| additional processing based on any additional non-index bits remains unchanged, and still forces the output |
| element value to 0 on a mismatch. The specific type of translate command is indicated by the command |
| code in the CCB header. |
| |
| There are two supported formats for the output stream: the bit vector and index array formats (codes 0x8, |
| 0xD, and 0xE). The index array format is an array of indices of bits which would have been set if the |
| output format was a bit array. |
| |
| The return value of the CCB completion area contains the number of bits set in the output bit vector, |
| or number of elements in the output index array. The “number of elements processed” field in the CCB |
| completion area will be valid, indicating the number of input elements processed. |
| |
| These commands are 64-byte “short format” CCBs. |
| |
| The translate CCB command format can be specified by the following packed C structure for a big-endian |
| machine: |
| |
| |
| struct translate_ccb { |
| uint32_t header; |
| uint32_t control; |
| uint64_t completion; |
| uint64_t primary_input; |
| uint64_t data_access_control; |
| uint64_t secondary_input; |
| uint64_t reserved; |
| uint64_t output; |
| uint64_t table; |
| }; |
| |
| |
| The exact field offsets, sizes, and composition are as follows: |
| |
| |
| Offset Size Field Description |
| 0 4 CCB header (Table 36.1, “CCB Header Format”) |
| |
| |
| 522 |
| Coprocessor services |
| |
| |
| Offset Size Field Description |
| 4 4 Command control |
| Bits Field Description |
| [31:28] Primary Input Format (see Section 36.2.1.1.1, “Primary Input |
| Format”) |
| [27:23] Primary Input Element Size (see Section 36.2.1.1.2, “Primary |
| Input Element Size”) |
| [22:20] Primary Input Starting Offset (see Section 36.2.1.1.5, “Input |
| Element Offsets”) |
| [19] Secondary Input Format (see Section 36.2.1.1.3, “Secondary |
| Input Format”) |
| [18:16] Secondary Input Starting Offset (see Section 36.2.1.1.5, “Input |
| Element Offsets”) |
| [15:14] Secondary Input Element Size (see Section 36.2.1.1.4, |
| “Secondary Input Element Size” |
| [13:10] Output Format (see Section 36.2.1.1.6, “Output Format”) |
| [9] Reserved |
| [8:0] Test value used for comparison against the most significant bits |
| in the input values, when using 2 or 3 byte input elements. |
| 8 8 Completion (same fields as Section 36.2.1.2, “Extract command” |
| 16 8 Primary Input (same fields as Section 36.2.1.2, “Extract command” |
| 24 8 Data Access Control (same fields as Section 36.2.1.2, “Extract command”, |
| except Primary Input Length Format may not use the 0x0 value) |
| 32 8 Secondary Input, if used by Primary Input Format. Same fields as Primary |
| Input. |
| 40 8 Reserved |
| 48 8 Output (same fields as Primary Input) |
| 56 8 Bit Table |
| Bits Field Description |
| [63:60] ADI version (see Section 36.2.1.1.7, “Application Data |
| Integrity (ADI)”) |
| [59:56] If using real address, these bits should be filled in with the |
| page size code for the page boundary checking the guest wants |
| the virtual machine to use when accessing this data stream |
| (checking is only guaranteed to be performed when using API |
| version 1.1 and later). If using a virtual address, this field will |
| be used as as bit table address bits [59:56] |
| [55:4] Bit table address bits [55:4]. Address type is determined by |
| CCB header. Address must be 64-byte aligned (CCB version |
| 0) or 16-byte aligned (CCB version 1). |
| [3:0] Bit table version |
| Value Description |
| 0 4KB table size |
| 1 8KB table size |
| |
| |
| |
| 523 |
| Coprocessor services |
| |
| |
| 36.2.1.5. Select command |
| The select command filters the primary input data stream by using a secondary input bit vector to determine |
| which input elements to include in the output. For each bit set at a given index N within the bit vector, |
| the Nth input element is included in the output. If the bit is not set, the element is not included. Only a |
| restricted subset of the possible input format types are supported. No variable width or run length encoded |
| input streams are allowed, since the secondary input stream is used for the filtering bit vector. |
| |
| The only supported output format is a padded, byte-aligned output stream. The stream follows the same |
| rules and restrictions as padded output stream described in Section 36.2.1.2, “Extract command”. |
| |
| The return value of the CCB completion area contains the number of bits set in the input bit vector. The |
| "number of elements processed" field in the CCB completion area will be valid, indicating the number |
| of input elements processed. |
| |
| The select CCB is a 64-byte “short format” CCB. |
| |
| The select CCB command format can be specified by the following packed C structure for a big-endian |
| machine: |
| |
| |
| struct select_ccb { |
| uint32_t header; |
| uint32_t control; |
| uint64_t completion; |
| uint64_t primary_input; |
| uint64_t data_access_control; |
| uint64_t secondary_input; |
| uint64_t reserved; |
| uint64_t output; |
| uint64_t table; |
| }; |
| |
| |
| The exact field offsets, sizes, and composition are as follows: |
| |
| Offset Size Field Description |
| 0 4 CCB header (Table 36.1, “CCB Header Format”) |
| 4 4 Command control |
| Bits Field Description |
| [31:28] Primary Input Format (see Section 36.2.1.1.1, “Primary Input |
| Format”) |
| [27:23] Primary Input Element Size (see Section 36.2.1.1.2, “Primary |
| Input Element Size”) |
| [22:20] Primary Input Starting Offset (see Section 36.2.1.1.5, “Input |
| Element Offsets”) |
| [19] Secondary Input Format (see Section 36.2.1.1.3, “Secondary |
| Input Format”) |
| [18:16] Secondary Input Starting Offset (see Section 36.2.1.1.5, “Input |
| Element Offsets”) |
| [15:14] Secondary Input Element Size (see Section 36.2.1.1.4, |
| “Secondary Input Element Size” |
| |
| |
| 524 |
| Coprocessor services |
| |
| |
| Offset Size Field Description |
| Bits Field Description |
| [13:10] Output Format (see Section 36.2.1.1.6, “Output Format”) |
| [9] Padding Direction selector: A value of 1 causes padding bytes |
| to be added to the left side of output elements. A value of 0 |
| causes padding bytes to be added to the right side of output |
| elements. |
| [8:0] Reserved |
| 8 8 Completion (same fields as Section 36.2.1.2, “Extract command” |
| 16 8 Primary Input (same fields as Section 36.2.1.2, “Extract command” |
| 24 8 Data Access Control (same fields as Section 36.2.1.2, “Extract command”) |
| 32 8 Secondary Bit Vector Input. Same fields as Primary Input. |
| 40 8 Reserved |
| 48 8 Output (same fields as Primary Input) |
| 56 8 Symbol Table (if used by Primary Input). Same fields as Section 36.2.1.2, |
| “Extract command” |
| |
| 36.2.1.6. No-op and Sync commands |
| The no-op (no operation) command is a CCB which has no processing effect. The CCB, when processed |
| by the virtual machine, simply updates the completion area with its execution status. The CCB may have |
| the serial-conditional flags set in order to restrict when it executes. |
| |
| The sync command is a variant of the no-op command which with restricted execution timing. A sync |
| command CCB will only execute when all previous commands submitted in the same request have |
| completed. This is stronger than the conditional flag sequencing, which is only dependent on a single |
| previous serial CCB. While the relative ordering is guaranteed, virtual machine implementations with |
| shared hardware resources may cause the sync command to wait for longer than the minimum required |
| time. |
| |
| The return value of the CCB completion area is invalid for these CCBs. The “number of elements |
| processed” field is also invalid for these CCBs. |
| |
| These commands are 64-byte “short format” CCBs. |
| |
| The no-op CCB command format can be specified by the following packed C structure for a big-endian |
| machine: |
| |
| |
| struct nop_ccb { |
| uint32_t header; |
| uint32_t control; |
| uint64_t completion; |
| uint64_t reserved[6]; |
| }; |
| |
| |
| The exact field offsets, sizes, and composition are as follows: |
| |
| Offset Size Field Description |
| 0 4 CCB header (Table 36.1, “CCB Header Format”) |
| |
| |
| 525 |
| Coprocessor services |
| |
| |
| Offset Size Field Description |
| 4 4 Command control |
| Bits Field Description |
| [31] If set, this CCB functions as a Sync command. If clear, this |
| CCB functions as a No-op command. |
| [30:0] Reserved |
| 8 8 Completion (same fields as Section 36.2.1.2, “Extract command” |
| 16 46 Reserved |
| |
| 36.2.2. CCB Completion Area |
| All CCB commands use a common 128-byte Completion Area format, which can be specified by the |
| following packed C structure for a big-endian machine: |
| |
| |
| struct completion_area { |
| uint8_t status_flag; |
| uint8_t error_note; |
| uint8_t rsvd0[2]; |
| uint32_t error_values; |
| uint32_t output_size; |
| uint32_t rsvd1; |
| uint64_t run_time; |
| uint64_t run_stats; |
| uint32_t elements; |
| uint8_t rsvd2[20]; |
| uint64_t return_value; |
| uint64_t extra_return_value[8]; |
| }; |
| |
| |
| The Completion Area must be a 128-byte aligned memory location. The exact layout can be described |
| using byte offsets and sizes relative to the memory base: |
| |
| Offset Size Field Description |
| 0 1 CCB execution status |
| 0x0 Command not yet completed |
| 0x1 Command ran and succeeded |
| 0x2 Command ran and failed (partial results may be been |
| produced) |
| 0x3 Command ran and was killed (partial execution may |
| have occurred) |
| 0x4 Command was not run |
| 0x5-0xF Reserved |
| 1 1 Error reason code |
| 0x0 Reserved |
| 0x1 Buffer overflow |
| |
| |
| 526 |
| Coprocessor services |
| |
| |
| Offset Size Field Description |
| 0x2 CCB decoding error |
| 0x3 Page overflow |
| 0x4-0x6 Reserved |
| 0x7 Command was killed |
| 0x8 Command execution timeout |
| 0x9 ADI miscompare error |
| 0xA Data format error |
| 0xB-0xD Reserved |
| 0xE Unexpected hardware error (Do not retry) |
| 0xF Unexpected hardware error (Retry is ok) |
| 0x10-0x7F Reserved |
| 0x80 Partial Symbol Warning |
| 0x81-0xFF Reserved |
| 2 2 Reserved |
| 4 4 If a partial symbol warning was generated, this field contains the number |
| of remaining bits which were not decoded. |
| 8 4 Number of bytes of output produced |
| 12 4 Reserved |
| 16 8 Runtime of command (unspecified time units) |
| 24 8 Reserved |
| 32 4 Number of elements processed |
| 36 20 Reserved |
| 56 8 Return value |
| 64 64 Extended return value |
| |
| The CCB completion area should be treated as read-only by guest software. The CCB execution status |
| byte will be cleared by the Hypervisor to reflect the pending execution status when the CCB is submitted |
| successfully. All other fields are considered invalid upon CCB submission until the CCB execution status |
| byte becomes non-zero. |
| |
| CCBs which complete with status 0x2 or 0x3 may produce partial results and/or side effects due to partial |
| execution of the CCB command. Some valid data may be accessible depending on the fault type, however, |
| it is recommended that guest software treat the destination buffer as being in an unknown state. If a CCB |
| completes with a status byte of 0x2, the error reason code byte can be read to determine what corrective |
| action should be taken. |
| |
| A buffer overflow indicates that the results of the operation exceeded the size of the output buffer indicated |
| in the CCB. The operation can be retried by resubmitting the CCB with a larger output buffer. |
| |
| A CCB decoding error indicates that the CCB contained some invalid field values. It may be also be |
| triggered if the CCB output is directed at a non-existent secondary input and the pipelining hint is followed. |
| |
| A page overflow error indicates that the operation required accessing a memory location beyond the page |
| size associated with a given address. No data will have been read or written past the page boundary, but |
| partial results may have been written to the destination buffer. The CCB can be resubmitted with a larger |
| page size memory allocation to complete the operation. |
| |
| |
| 527 |
| Coprocessor services |
| |
| |
| In the case of pipelined CCBs, a page overflow error will be triggered if the output from the pipeline source |
| CCB ends before the input of the pipeline target CCB. Page boundaries are ignored when the pipeline |
| hint is followed. |
| |
| Command kill indicates that the CCB execution was halted or prevented by use of the ccb_kill API call. |
| |
| Command timeout indicates that the CCB execution began, but did not complete within a pre-determined |
| limit set by the virtual machine. The command may have produced some or no output. The CCB may be |
| resubmitted with no alterations. |
| |
| ADI miscompare indicates that the memory buffer version specified in the CCB did not match the value |
| in memory when accessed by the virtual machine. Guest software should not attempt to resubmit the CCB |
| without determining the cause of the version mismatch. |
| |
| A data format error indicates that the input data stream did not follow the specified data input formatting |
| selected in the CCB. |
| |
| Some CCBs which encounter hardware errors may be resubmitted without change. Persistent hardware |
| errors may result in multiple failures until RAS software can identify and isolate the faulty component. |
| |
| The output size field indicates the number of bytes of valid output in the destination buffer. This field is |
| not valid for all possible CCB commands. |
| |
| The runtime field indicates the execution time of the CCB command once it leaves the internal virtual |
| machine queue. The time units are fixed, but unspecified, allowing only relative timing comparisons |
| by guest software. The time units may also vary by hardware platform, and should not be construed to |
| represent any absolute time value. |
| |
| Some data query commands process data in units of elements. If applicable to the command, the number of |
| elements processed is indicated in the listed field. This field is not valid for all possible CCB commands. |
| |
| The return value and extended return value fields are output locations for commands which do not use |
| a destination output buffer, or have secondary return results. The field is not valid for all possible CCB |
| commands. |
| |
| 36.3. Hypervisor API Functions |
| 36.3.1. ccb_submit |
| trap# FAST_TRAP |
| function# CCB_SUBMIT |
| arg0 address |
| arg1 length |
| arg2 flags |
| arg3 reserved |
| ret0 status |
| ret1 length |
| ret2 status data |
| ret3 reserved |
| |
| Submit one or more coprocessor control blocks (CCBs) for evaluation and processing by the virtual |
| machine. The CCBs are passed in a linear array indicated by address. length indicates the size of |
| the array in bytes. |
| |
| |
| 528 |
| Coprocessor services |
| |
| |
| The address should be aligned to the size indicated by length, rounded up to the nearest power of |
| two. Virtual machines implementations may reject submissions which do not adhere to that alignment. |
| length must be a multiple of 64 bytes. If length is zero, the maximum supported array length will be |
| returned as length in ret1. In all other cases, the length value in ret1 will reflect the number of bytes |
| successfully consumed from the input CCB array. |
| |
| Implementation note |
| Virtual machines should never reject submissions based on the alignment of address if the |
| entire array is contained within a single memory page of the smallest page size supported by the |
| virtual machine. |
| |
| A guest may choose to submit addresses used in this API function, including the CCB array address, |
| as either a real or virtual addresses, with the type of each address indicated in flags. Virtual addresses |
| must be present in either the TLB or an active TSB to be processed. The translation context for virtual |
| addresses is determined by a combination of CCB contents and the flags argument. |
| |
| The flags argument is divided into multiple fields defined as follows: |
| |
| |
| Bits Field Description |
| [63:16] Reserved |
| [15] Disable ADI for VA reads (in API 2.0) |
| Reserved (in API 1.0) |
| [14] Virtual addresses within CCBs are translated in privileged context |
| [13:12] Alternate translation context for virtual addresses within CCBs: |
| 0b'00 CCBs requesting alternate context are rejected |
| 0b'01 Reserved |
| 0b'10 CCBs requesting alternate context use secondary context |
| 0b'11 CCBs requesting alternate context use nucleus context |
| [11:9] Reserved |
| [8] Queue info flag |
| [7] All-or-nothing flag |
| [6] If address is a virtual address, treat its translation context as privileged |
| [5:4] Address type of address: |
| 0b'00 Real address |
| 0b'01 Virtual address in primary context |
| 0b'10 Virtual address in secondary context |
| 0b'11 Virtual address in nucleus context |
| [3:2] Reserved |
| [1:0] CCB command type: |
| 0b'00 Reserved |
| 0b'01 Reserved |
| 0b'10 Query command |
| 0b'11 Reserved |
| |
| |
| |
| 529 |
| Coprocessor services |
| |
| |
| The CCB submission type and address type for the CCB array must be provided in the flags argument. |
| All other fields are optional values which change the default behavior of the CCB processing. |
| |
| When set to one, the "Disable ADI for VA reads" bit will turn off ADI checking when using a virtual |
| address to load data. ADI checking will still be done when loading real-addressed memory. This bit is only |
| available when using major version 2 of the coprocessor API group; at major version 1 it is reserved. For |
| more information about using ADI and DAX, see Section 36.2.1.1.7, “Application Data Integrity (ADI)”. |
| |
| By default, all virtual addresses are treated as user addresses. If the virtual address translations are |
| privileged, they must be marked as such in the appropriate flags field. The virtual addresses used within |
| the submitted CCBs must all be translated with the same privilege level. |
| |
| By default, all virtual addresses used within the submitted CCBs are translated using the primary context |
| active at the time of the submission. The address type field within a CCB allows each address to request |
| translation in an alternate address context. The address context used when the alternate address context is |
| requested is selected in the flags argument. |
| |
| The all-or-nothing flag specifies whether the virtual machine should allow partial submissions of the |
| input CCB array. When using CCBs with serial-conditional flags, it is strongly recommended to use |
| the all-or-nothing flag to avoid broken conditional chains. Using long CCB chains on a machine under |
| high coprocessor load may make this impractical, however, and require submitting without the flag. |
| When submitting serial-conditional CCBs without the all-or-nothing flag, guest software must manually |
| implement the serial-conditional behavior at any point where the chain was not submitted in a single API |
| call, and resubmission of the remaining CCBs should clear any conditional flag that might be set in the |
| first remaining CCB. Failure to do so will produce indeterminate CCB execution status and ordering. |
| |
| When the all-or-nothing flag is not specified, callers should check the value of length in ret1 to determine |
| how many CCBs from the array were successfully submitted. Any remaining CCBs can be resubmitted |
| without modifications. |
| |
| The value of length in ret1 is also valid when the API call returns an error, and callers should always |
| check its value to determine which CCBs in the array were already processed. This will additionally |
| identify which CCB encountered the processing error, and was not submitted successfully. |
| |
| If the queue info flag is used during submission, and at least one CCB was successfully submitted, the |
| length value in ret1 will be a multi-field value defined as follows: |
| Bits Field Description |
| [63:48] DAX unit instance identifier |
| [47:32] DAX queue instance identifier |
| [31:16] Reserved |
| [15:0] Number of CCB bytes successfully submitted |
| |
| The value of status data depends on the status value. See error status code descriptions for details. |
| The value is undefined for status values that do not specifically list a value for the status data. |
| |
| The API has a reserved input and output register which will be used in subsequent minor versions of this |
| API function. Guest software implementations should treat that register as voltile across the function call |
| in order to maintain forward compatibility. |
| |
| 36.3.1.1. Errors |
| EOK One or more CCBs have been accepted and enqueued in the virtual machine |
| and no errors were been encountered during submission. Some submitted |
| CCBs may not have been enqueued due to internal virtual machine limitations, |
| and may be resubmitted without changes. |
| |
| |
| 530 |
| Coprocessor services |
| |
| |
| EWOULDBLOCK An internal resource conflict within the virtual machine has prevented it from |
| being able to complete the CCB submissions sufficiently quickly, requiring |
| it to abandon processing before it was complete. Some CCBs may have been |
| successfully enqueued prior to the block, and all remaining CCBs may be |
| resubmitted without changes. |
| EBADALIGN CCB array is not on a 64-byte boundary, or the array length is not a multiple |
| of 64 bytes. |
| ENORADDR A real address used either for the CCB array, or within one of the submitted |
| CCBs, is not valid for the guest. Some CCBs may have been enqueued prior |
| to the error being detected. |
| ENOMAP A virtual address used either for the CCB array, or within one of the submitted |
| CCBs, could not be translated by the virtual machine using either the TLB |
| or TSB contents. The submission may be retried after adding the required |
| mapping, or by converting the virtual address into a real address. Due to the |
| shared nature of address translation resources, there is no theoretical limit on |
| the number of times the translation may fail, and it is recommended all guests |
| implement some real address based backup. The virtual address which failed |
| translation is returned as status data in ret2. Some CCBs may have been |
| enqueued prior to the error being detected. |
| EINVAL The virtual machine detected an invalid CCB during submission, or invalid |
| input arguments, such as bad flag values. Note that not all invalid CCB values |
| will be detected during submission, and some may be reported as errors in the |
| completion area instead. Some CCBs may have been enqueued prior to the |
| error being detected. This error may be returned if the CCB version is invalid. |
| ETOOMANY The request was submitted with the all-or-nothing flag set, and the array size is |
| greater than the virtual machine can support in a single request. The maximum |
| supported size for the current virtual machine can be queried by submitting a |
| request with a zero length array, as described above. |
| ENOACCESS The guest does not have permission to submit CCBs, or an address used in a |
| CCBs lacks sufficient permissions to perform the required operation (no write |
| permission on the destination buffer address, for example). A virtual address |
| which fails permission checking is returned as status data in ret2. Some |
| CCBs may have been enqueued prior to the error being detected. |
| EUNAVAILABLE The requested CCB operation could not be performed at this time. The |
| restricted operation availability may apply only to the first unsuccessfully |
| submitted CCB, or may apply to a larger scope. The status should not be |
| interpreted as permanent, and the guest should attempt to submit CCBs in |
| the future which had previously been unable to be performed. The status |
| data provides additional information about scope of the restricted availability |
| as follows: |
| Value Description |
| 0 Processing for the exact CCB instance submitted was unavailable, |
| and it is recommended the guest emulate the operation. The |
| guest should continue to submit all other CCBs, and assume no |
| restrictions beyond this exact CCB instance. |
| 1 Processing is unavailable for all CCBs using the requested opcode, |
| and it is recommended the guest emulate the operation. The |
| guest should continue to submit all other CCBs that use different |
| opcodes, but can expect continued rejections of CCBs using the |
| same opcode in the near future. |
| |
| |
| 531 |
| Coprocessor services |
| |
| |
| Value Description |
| 2 Processing is unavailable for all CCBs using the requested CCB |
| version, and it is recommended the guest emulate the operation. |
| The guest should continue to submit all other CCBs that use |
| different CCB versions, but can expect continued rejections of |
| CCBs using the same CCB version in the near future. |
| 3 Processing is unavailable for all CCBs on the submitting vcpu, |
| and it is recommended the guest emulate the operation or resubmit |
| the CCB on a different vcpu. The guest should continue to submit |
| CCBs on all other vcpus but can expect continued rejections of all |
| CCBs on this vcpu in the near future. |
| 4 Processing is unavailable for all CCBs, and it is recommended |
| the guest emulate the operation. The guest should expect all CCB |
| submissions to be similarly rejected in the near future. |
| |
| |
| 36.3.2. ccb_info |
| |
| trap# FAST_TRAP |
| function# CCB_INFO |
| arg0 address |
| ret0 status |
| ret1 CCB state |
| ret2 position |
| ret3 dax |
| ret4 queue |
| |
| Requests status information on a previously submitted CCB. The previously submitted CCB is identified |
| by the 64-byte aligned real address of the CCBs completion area. |
| |
| A CCB can be in one of 4 states: |
| |
| |
| State Value Description |
| COMPLETED 0 The CCB has been fetched and executed, and is no longer active in |
| the virtual machine. |
| ENQUEUED 1 The requested CCB is current in a queue awaiting execution. |
| INPROGRESS 2 The CCB has been fetched and is currently being executed. It may still |
| be possible to stop the execution using the ccb_kill hypercall. |
| NOTFOUND 3 The CCB could not be located in the virtual machine, and does not |
| appear to have been executed. This may occur if the CCB was lost |
| due to a hardware error, or the CCB may not have been successfully |
| submitted to the virtual machine in the first place. |
| |
| Implementation note |
| Some platforms may not be able to report CCBs that are currently being processed, and therefore |
| guest software should invoke the ccb_kill hypercall prior to assuming the request CCB will never |
| be executed because it was in the NOTFOUND state. |
| |
| |
| 532 |
| Coprocessor services |
| |
| |
| The position return value is only valid when the state is ENQUEUED. The value returned is the number |
| of other CCBs ahead of the requested CCB, to provide a relative estimate of when the CCB may execute. |
| |
| The dax return value is only valid when the state is ENQUEUED. The value returned is the DAX unit |
| instance identifier for the DAX unit processing the queue where the requested CCB is located. The value |
| matches the value that would have been, or was, returned by ccb_submit using the queue info flag. |
| |
| The queue return value is only valid when the state is ENQUEUED. The value returned is the DAX |
| queue instance identifier for the DAX unit processing the queue where the requested CCB is located. The |
| value matches the value that would have been, or was, returned by ccb_submit using the queue info flag. |
| |
| 36.3.2.1. Errors |
| |
| EOK The request was processed and the CCB state is valid. |
| EBADALIGN address is not on a 64-byte aligned. |
| ENORADDR The real address provided for address is not valid. |
| EINVAL The CCB completion area contents are not valid. |
| EWOULDBLOCK Internal resource constraints prevented the CCB state from being queried at this |
| time. The guest should retry the request. |
| ENOACCESS The guest does not have permission to access the coprocessor virtual device |
| functionality. |
| |
| 36.3.3. ccb_kill |
| |
| trap# FAST_TRAP |
| function# CCB_KILL |
| arg0 address |
| ret0 status |
| ret1 result |
| |
| Request to stop execution of a previously submitted CCB. The previously submitted CCB is identified by |
| the 64-byte aligned real address of the CCBs completion area. |
| |
| The kill attempt can produce one of several values in the result return value, reflecting the CCB state |
| and actions taken by the Hypervisor: |
| |
| Result Value Description |
| COMPLETED 0 The CCB has been fetched and executed, and is no longer active in |
| the virtual machine. It could not be killed and no action was taken. |
| DEQUEUED 1 The requested CCB was still enqueued when the kill request was |
| submitted, and has been removed from the queue. Since the CCB |
| never began execution, no memory modifications were produced by |
| it, and the completion area will never be updated. The same CCB may |
| be submitted again, if desired, with no modifications required. |
| KILLED 2 The CCB had been fetched and was being executed when the kill |
| request was submitted. The CCB execution was stopped, and the CCB |
| is no longer active in the virtual machine. The CCB completion area |
| will reflect the killed status, with the subsequent implications that |
| partial results may have been produced. Partial results may include full |
| |
| |
| 533 |
| Coprocessor services |
| |
| |
| Result Value Description |
| command execution if the command was stopped just prior to writing |
| to the completion area. |
| NOTFOUND 3 The CCB could not be located in the virtual machine, and does not |
| appear to have been executed. This may occur if the CCB was lost |
| due to a hardware error, or the CCB may not have been successfully |
| submitted to the virtual machine in the first place. CCBs in the state |
| are guaranteed to never execute in the future unless resubmitted. |
| |
| 36.3.3.1. Interactions with Pipelined CCBs |
| |
| If the pipeline target CCB is killed but the pipeline source CCB was skipped, the completion area of the |
| target CCB may contain status (4,0) "Command was skipped" instead of (3,7) "Command was killed". |
| |
| If the pipeline source CCB is killed, the pipeline target CCB's completion status may read (1,0) "Success". |
| This does not mean the target CCB was processed; since the source CCB was killed, there was no |
| meaningful output on which the target CCB could operate. |
| |
| 36.3.3.2. Errors |
| |
| EOK The request was processed and the result is valid. |
| EBADALIGN address is not on a 64-byte aligned. |
| ENORADDR The real address provided for address is not valid. |
| EINVAL The CCB completion area contents are not valid. |
| EWOULDBLOCK Internal resource constraints prevented the CCB from being killed at this time. |
| The guest should retry the request. |
| ENOACCESS The guest does not have permission to access the coprocessor virtual device |
| functionality. |
| |
| 36.3.4. dax_info |
| trap# FAST_TRAP |
| function# DAX_INFO |
| ret0 status |
| ret1 Number of enabled DAX units |
| ret2 Number of disabled DAX units |
| |
| Returns the number of DAX units that are enabled for the calling guest to submit CCBs. The number of |
| DAX units that are disabled for the calling guest are also returned. A disabled DAX unit would have been |
| available for CCB submission to the calling guest had it not been offlined. |
| |
| 36.3.4.1. Errors |
| |
| EOK The request was processed and the number of enabled/disabled DAX units |
| are valid. |
| |
| |
| |
| |
| 534 |
| |