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