/ kernel / include / io_uring.h
io_uring.h
  1  #ifndef IO_URING_H
  2  #define IO_URING_H
  3  
  4  #include "types.h"
  5  
  6  // io_uring opcodes
  7  #define IORING_OP_NOP           0
  8  #define IORING_OP_READV         1
  9  #define IORING_OP_WRITEV        2
 10  #define IORING_OP_READ          3
 11  #define IORING_OP_WRITE         4
 12  #define IORING_OP_OPENAT        5
 13  #define IORING_OP_CLOSE         6
 14  #define IORING_OP_STATX         7
 15  #define IORING_OP_ACCEPT        8
 16  #define IORING_OP_CONNECT       9
 17  #define IORING_OP_FORK          10
 18  
 19  // io_uring setup flags
 20  #define IORING_SETUP_IOPOLL     (1U << 0)
 21  #define IORING_SETUP_SQPOLL     (1U << 1)
 22  
 23  // io_uring_register opcodes
 24  #define IORING_REGISTER_BUFFERS          0
 25  #define IORING_UNREGISTER_BUFFERS        1
 26  #define IORING_REGISTER_FILES            2
 27  #define IORING_UNREGISTER_FILES          3
 28  #define IORING_REGISTER_EVENTFD          4
 29  #define IORING_UNREGISTER_EVENTFD        5
 30  #define IORING_REGISTER_FILES_UPDATE     6
 31  #define IORING_REGISTER_EVENTFD_ASYNC    7
 32  #define IORING_REGISTER_PROBE            8
 33  
 34  // Submission Queue Entry
 35  struct io_uring_sqe {
 36      uint8_t opcode;         // Operation type
 37      uint8_t flags;          // IOSQE_ flags
 38      uint16_t ioprio;        // Priority
 39      int32_t fd;             // File descriptor
 40      union {
 41          uint64_t off;       // Offset
 42          uint64_t addr2;
 43      };
 44      union {
 45          uint64_t addr;      // Pointer to buffer or iovecs
 46          uint64_t splice_off_in;
 47      };
 48      uint32_t len;           // Buffer size or number of iovecs
 49      union {
 50          uint32_t misc_flags;
 51          uint32_t rw_flags;
 52          uint32_t poll_events;
 53          uint32_t sync_range_flags;
 54          uint32_t msg_flags;
 55          uint32_t timeout_flags;
 56          uint32_t accept_flags;
 57          uint32_t cancel_flags;
 58          uint32_t open_flags;
 59          uint32_t statx_flags;
 60      };
 61      uint64_t user_data;     // User data (copied to CQE)
 62      union {
 63          uint16_t buf_index;
 64          uint64_t __pad2[3];
 65      };
 66  };
 67  
 68  // Completion Queue Entry
 69  struct io_uring_cqe {
 70      uint64_t user_data;     // User data from submission
 71      int32_t res;            // Result of operation
 72      uint32_t flags;
 73  };
 74  
 75  // io_uring parameters
 76  struct io_uring_params {
 77      uint32_t sq_entries;
 78      uint32_t cq_entries;
 79      uint32_t flags;
 80      uint32_t sq_thread_cpu;
 81      uint32_t sq_thread_idle;
 82      uint32_t features;
 83      uint32_t resv[4];
 84      struct io_sqring_offsets {
 85          uint32_t head;
 86          uint32_t tail;
 87          uint32_t ring_mask;
 88          uint32_t ring_entries;
 89          uint32_t flags;
 90          uint32_t dropped;
 91          uint32_t array;
 92          uint32_t resv[3];
 93      } sq_off;
 94      struct io_cqring_offsets {
 95          uint32_t head;
 96          uint32_t tail;
 97          uint32_t ring_mask;
 98          uint32_t ring_entries;
 99          uint32_t overflow;
100          uint32_t cqes;
101          uint32_t resv[4];
102      } cq_off;
103  };
104  
105  // Shared memory region for io_uring (accessible by userspace)
106  #define IORING_SHARED_MEMORY_BASE  0x00200000  // 2MB mark
107  #define IORING_MAX_SHARED_SIZE     0x00100000  // 1MB total for all rings
108  
109  // io_uring instance
110  struct io_uring {
111      struct io_uring_params params;
112      
113      // Submission queue
114      uint32_t *sq_head;
115      uint32_t *sq_tail;
116      uint32_t *sq_mask;
117      uint32_t *sq_entries;
118      uint32_t *sq_flags;
119      uint32_t *sq_dropped;
120      uint32_t *sq_array;
121      struct io_uring_sqe *sqes;
122      
123      // Completion queue
124      uint32_t *cq_head;
125      uint32_t *cq_tail;
126      uint32_t *cq_mask;
127      uint32_t *cq_entries;
128      uint32_t *cq_overflow;
129      struct io_uring_cqe *cqes;
130      
131      // Ring sizes
132      size_t sq_ring_size;
133      size_t cq_ring_size;
134      size_t sqes_size;
135      
136      // Memory addresses for userspace
137      uint32_t sq_ring_addr;
138      uint32_t cq_ring_addr;
139      uint32_t sqes_addr;
140  };
141  
142  // System call numbers
143  #define SYS_io_uring_setup      0
144  #define SYS_io_uring_enter      1
145  #define SYS_io_uring_register   2
146  
147  // Function prototypes
148  int io_uring_setup(uint32_t entries, struct io_uring_params *params);
149  int io_uring_enter(int fd, uint32_t to_submit, uint32_t min_complete, 
150                     uint32_t flags, void *sig);
151  int io_uring_register(int fd, uint32_t opcode, void *arg, uint32_t nr_args);
152  
153  // Initialize io_uring subsystem
154  void io_uring_init(void);
155  
156  #endif // IO_URING_H