Difference between revisions of "Error Codes"

From Open-IOV
Jump to navigation Jump to search
m (Re-sync page from tracked wiki source: fix cross-document links and diagram; refresh status)
m (Fix repository links: point to the cgit tree URLs (git.vgpu.io/open-iov.git/tree/...))
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
{{About message}}
= GSP Error Codes =
= GSP Error Codes =


<blockquote>'''Historical document — superseded.''' The GSP-specific POSIX-style names in this page are historical labels from early reverse engineering, not wire statuses. The emulation uses NVIDIA <code>NV_STATUS</code> values: <code>NV_OK</code> <code>0</code>, <code>NV_ERR_NOT_SUPPORTED</code> <code>0x56</code>, <code>NV_ERR_INVALID_PARAMETER</code> <code>0x3B</code>. Canonical reference: [https://git.vgpu.io/open-iov/blob/master/docs/09-reference/glossary-and-faq.md <code>../docs/09-reference/glossary-and-faq.md</code>] and the kernel's <code>NV_STATUS</code> usage (<code>../kernel/</code>).</blockquote>
<blockquote>'''Historical document — superseded.''' The GSP-specific POSIX-style names in this page are historical labels from early reverse engineering, not wire statuses. The emulation uses NVIDIA <code>NV_STATUS</code> values: <code>NV_OK</code> <code>0</code>, <code>NV_ERR_NOT_SUPPORTED</code> <code>0x56</code>, <code>NV_ERR_INVALID_PARAMETER</code> <code>0x3B</code>. Canonical reference: [https://git.vgpu.io/open-iov.git/tree/docs/09-reference/glossary-and-faq.md <code>../docs/09-reference/glossary-and-faq.md</code>] and the kernel's <code>NV_STATUS</code> usage (<code>../kernel/</code>).</blockquote>


== Standard POSIX Errors (Negative Return Values) ==
== Standard POSIX Errors (Negative Return Values) ==

Latest revision as of 04:40, 12 October 2026

An absence of critical technical documentation has historically slowed growth and adoption of developer ecosystems for GPU virtualization.

This CC-BY-4.0 licensed content can either be used with attribution, or used as inspiration for new documentation, created by GPU vendors for public commercial distribution as developer documentation.

Where possible, this documentation will clearly label dates and versions of observed-but-not-guaranteed behaviour vs. vendor-documented stable interfaces/behaviour with guarantees of forward or backward compatibility.

GSP Error Codes

Historical document — superseded. The GSP-specific POSIX-style names in this page are historical labels from early reverse engineering, not wire statuses. The emulation uses NVIDIA NV_STATUS values: NV_OK 0, NV_ERR_NOT_SUPPORTED 0x56, NV_ERR_INVALID_PARAMETER 0x3B. Canonical reference: ../docs/09-reference/glossary-and-faq.md and the kernel's NV_STATUS usage (../kernel/).

Standard POSIX Errors (Negative Return Values)

Code Hex Name Description
0 0x00000000 OK Success
-1 0xFFFFFFFF EPERM Operation not permitted
-2 0xFFFFFFFE ENOENT No such file/entry
-3 0xFFFFFFFD EINVAL Invalid argument
-6 0xFFFFFFFA ENODEV No such device
-12 0xFFFFFFF4 ENOMEM Out of memory
-16 0xFFFFFFEE EBUSY Device/resource busy
-22 0xFFFFFFEA EINVAL Invalid argument
-28 0xFFFFFFE4 ENOSPC No space left on device
-37 0xFFFFFFDB ENOLCK No locks available
-56 0xFFFFFFC8 EBADMSG Bad message
-84 0xFFFFFFAC EOVERFLOW Value too large
-90 0xFFFFA6 ENOSTR Not a stream
-91 0xFFFFA5 ENODATA No data available
-94 0xFFFFA2 ENOSR Out of streams resources
-97 0xFFFFFF9F EPROTO Protocol error
-111 0xFFFFFF91 ETIMEDOUT Connection timed out

GSP-Specific Error Codes (Observed in Firmware)

Memory Errors

Code Hex Name Description
0x1E 0x0000001E ETIME WPR/RPC timeout
0x1F 0x0000001F EDEV Device error
0x25 0x00000025 EOVERFLOW Region/offset overflow
0x37 0x00000037 EINVAL Invalid alignment/size
0x51 0x00000051 ENOMEM Allocator exhausted
0x56 0x00000056 EBUSY Resource busy
0xFFFF 0xFFFFFFFF EPERM Permission denied

RPC Errors

Code Hex Name Description
0x1D 0x0000001D EFAULT Bad address in RPC
0x1E 0x0000001E ETIMEDOUT RPC timeout
0x1F 0x0000001F EPROTO Protocol violation
0x20 0x00000020 EBADRPC Invalid RPC type
0x21 0x00000021 EBADSEQ Sequence mismatch
0x22 0x00000022 EBADSIZE Payload size error

BAR Errors

Code Hex Name Description
0x30 0x00000030 EBARINVAL Invalid BAR index
0x31 0x00000031 EBARPERM BAR access denied
0x32 0x00000032 EBARSIZE Aperture size error
0x33 0x00000033 EBARALIGN Alignment error
0x34 0x00000034 EBARRANGE Offset out of range
0x35 0x00000035 EBARBUSY BAR busy

WPR Errors

Code Hex Name Description
0x40 0x00000040 EWPRINVAL Invalid WPR region
0x41 0x00000041 EWPRPERM WPR permission denied
0x42 0x00000042 EWPROVERLAP Overlapping WPR regions
0x43 0x00000043 EWPRBUSY WPR operation in progress
0x44 0x00000044 EWPRTIMEOUT WPR timeout

Migration Errors

Code Hex Name Description
0x50 0x00000050 EMIGINVAL Invalid migration phase
0x51 0x00000051 EMIGNOMEM Migration buffer OOM
0x52 0x00000052 EMIGBUSY Migration in progress
0x53 0x00000053 EMIGPHASE Phase mismatch
0x54 0x00000054 EMIGVERIFY Verification failed
0x55 0x00000055 EMIGCOMMIT Commit failed
0x56 0x00000056 EMIGABORT Migration aborted

Scheduler Errors

Code Hex Name Description
0x60 0x00000060 ESCHINVAL Invalid schedule params
0x61 0x00000061 ESCHPRIO Priority error
0x62 0x00000062 ESCHYIELD Yield failed
0x63 0x00000063 ESCHPREEMPT Preemption error

Notification Errors

Code Hex Name Description
0x70 0x00000070 ENOTIFYINVAL Invalid notification
0x71 0x00000071 ENOTIFYBUSY Notification queue full
0x72 0x00000072 ENOTIFYDROP Notification dropped

Error Code Mapping (Kernel Driver)

static int gsp_errno_to_errno(int gsp_err) {
    switch (gsp_err) {
    case 0: return 0;
    case -1: return -EPERM;
    case -2: return -ENOENT;
    case -3: return -EINVAL;
    case -6: return -ENODEV;
    case -12: return -ENOMEM;
    case -16: return -EBUSY;
    case -22: return -EINVAL;
    case -28: return -ENOSPC;
    case -37: return -ENOLCK;
    case -56: return -EBADMSG;
    case -84: return -EOVERFLOW;
    case -90: return -ENOSTR;
    case -91: return -ENODATA;
    case -94: return -ENOSR;
    case -97: return -EPROTO;
    case -111: return -ETIMEDOUT;
    
    // GSP-specific
    case 0x1E: return -ETIMEDOUT;
    case 0x1F: return -EIO;
    case 0x25: return -EOVERFLOW;
    case 0x37: return -EINVAL;
    case 0x51: return -ENOMEM;
    case 0x56: return -EBUSY;
    case 0xFFFF: return -EPERM;
    
    // BAR
    case 0x30: return -EINVAL;
    case 0x31: return -EPERM;
    case 0x32: return -EINVAL;
    case 0x33: return -EINVAL;
    case 0x34: return -ERANGE;
    case 0x35: return -EBUSY;
    
    // WPR
    case 0x40: return -EINVAL;
    case 0x41: return -EPERM;
    case 0x42: return -EEXIST;
    case 0x43: return -EBUSY;
    case 0x44: return -ETIMEDOUT;
    
    // Migration
    case 0x50: return -EINVAL;
    case 0x51: return -ENOMEM;
    case 0x52: return -EBUSY;
    case 0x53: return -EINVAL;
    case 0x54: return -EIO;
    case 0x55: return -EIO;
    case 0x56: return -ECANCELED;
    
    // Scheduler
    case 0x60: return -EINVAL;
    case 0x61: return -EINVAL;
    case 0x62: return -EAGAIN;
    case 0x63: return -EAGAIN;
    
    // Notification
    case 0x70: return -EINVAL;
    case 0x71: return -EAGAIN;
    case 0x72: return -ENOBUFS;
    
    default: return -EIO;
    }
}

Debugging Error Codes

GSP Log Format

GSP_ERROR: rpc_type=0x0A seq=0x1234 err=0x31 (EBARPERM) vf=2 addr=0x7F000000

Common Error Scenarios

Scenario Error Code Resolution
VF writes to unmapped BAR 0x31 (EBARPERM) Check VF BAR config
Migration verify fails 0x54 (EMIGVERIFY) Check memory integrity
WPR timeout on page fault 0x44 (EWPRTIMEOUT) Increase timeout
RPC sequence mismatch 0x21 (EBADSEQ) Reset RPC client
Allocator exhausted 0x51 (ENOMEM) Free unused VF memory
BAR aperture too small 0x32 (EBARSIZE) Increase aperture

Error Injection (Testing)

// Inject errors for testing
#define GSP_INJECT_ERROR(rpc_type, err_code) \
    gsp_test_inject_error(gsp, rpc_type, err_code)

void gsp_test_inject_error(struct gsp_device *gsp, 
                           uint32_t rpc_type, int err_code) {
    struct inject_payload p = {
        .rpc_type = rpc_type,
        .error_code = err_code,
        .enable = 1,
    };
    gsp_rpc_send_sync(gsp->rpc, RPC_DEBUG, &p, sizeof(p), NULL, NULL);
}