changelog shortlog graph tags branches files raw help

Mercurial > core / changeset: opcodes

changeset 250: 80cf0c525294
parent 249: d874847c85c5
child 251: 85571b4a3fcc
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 29 Mar 2024 21:07:03 -0400
files: lisp/ffi/uring/constants.lisp lisp/ffi/uring/macs.lisp lisp/ffi/uring/opcode.lisp
description: opcodes
     1.1--- a/lisp/ffi/uring/constants.lisp	Fri Mar 29 19:04:17 2024 -0400
     1.2+++ b/lisp/ffi/uring/constants.lisp	Fri Mar 29 21:07:03 2024 -0400
     1.3@@ -59,59 +59,6 @@
     1.4  (:integer ioring-setup-defer-taskrun "IORING_SETUP_DEFER_TASKRUN")
     1.5  (:integer ioring-setup-no-mmap "IORING_SETUP_NO_MMAP")
     1.6  (:integer ioring-setup-registered-fd-only "IORING_SETUP_REGISTERED_FD_ONLY")
     1.7- (:enum io-uring-op
     1.8-        (
     1.9-         (ioring-op-nop "IORING_OP_NOP")
    1.10-         (ioring-op-ready "IORING_OP_READV")
    1.11-         (ioring-op-writev "IORING_OP_WRITEV")
    1.12-         (ioring-op-fsync "IORING_OP_FSYNC")
    1.13-         (ioring-op-read-fixed "IORING_OP_READ_FIXED")
    1.14-         (ioring-op-write-fixed "IORING_OP_WRITE_FIXED")
    1.15-         (ioring-op-poll-add "IORING_OP_POLL_ADD")
    1.16-         (ioring-op-poll-remove "IORING_OP_POLL_REMOVE")
    1.17-         (ioring-op-sync-file-range "IORING_OP_SYNC_FILE_RANGE")
    1.18-         (ioring-op-sendmsg "IORING_OP_SENDMSG")
    1.19-         (ioring-op-recvmsg "IORING_OP_RECVMSG")
    1.20-         (ioring-op-timeout "IORING_OP_TIMEOUT")
    1.21-         (ioring-op-timeout-remove "IORING_OP_TIMEOUT_REMOVE")
    1.22-         (ioring-op-accept "IORING_OP_ACCEPT")
    1.23-         (ioring-op-async-cancel "IORING_OP_ASYNC_CANCEL")
    1.24-         (ioring-op-link-timeout "IORING_OP_LINK_TIMEOUT")
    1.25-         (ioring-op-connect "IORING_OP_CONNECT")
    1.26-         (ioring-op-fallocate "IORING_OP_FALLOCATE")
    1.27-         (ioring-op-openat "IORING_OP_OPENAT")
    1.28-         (ioring-op-close "IORING_OP_CLOSE")
    1.29-         (ioring-op-files-update "IORING_OP_FILES_UPDATE")
    1.30-         (ioring-op-statx "IORING_OP_STATX")
    1.31-         (ioring-op-read "IORING_OP_READ")
    1.32-         (ioring-op-write "IORING_OP_WRITE")
    1.33-         (ioring-op-fadvise "IORING_OP_FADVISE")
    1.34-         (ioring-op-madvise "IORING_OP_MADVISE")
    1.35-         (ioring-op-send "IORING_OP_SEND")
    1.36-         (ioring-op-recv "IORING_OP_RECV")
    1.37-         (ioring-op-openat2 "IORING_OP_OPENAT2")
    1.38-         (ioring-op-epoll-ctl "IORING_OP_EPOLL_CTL")
    1.39-         (ioring-op-splice "IORING_OP_SPLICE")
    1.40-         (ioring-op-provide-buffers "IORING_OP_PROVIDE_BUFFERS")
    1.41-         (ioring-op-remove-buffers "IORING_OP_REMOVE_BUFFERS")
    1.42-         (ioring-op-tee "IORING_OP_TEE")
    1.43-         (ioring-op-shutdown "IORING_OP_SHUTDOWN")
    1.44-         (ioring-op-renameat "IORING_OP_RENAMEAT")
    1.45-         (ioring-op-unlinkat "IORING_OP_UNLINKAT")
    1.46-         (ioring-op-mkdirat "IORING_OP_MKDIRAT")
    1.47-         (ioring-op-symlinkat "IORING_OP_SYMLINKAT")
    1.48-         (ioring-op-linkat "IORING_OP_LINKAT")
    1.49-         (ioring-op-msg-ring "IORING_OP_MSG_RING")
    1.50-         (ioring-op-fsetxattr "IORING_OP_FSETXATTR")
    1.51-         (ioring-op-setxattr "IORING_OP_SETXATTR")
    1.52-         (ioring-op-fgetxattr "IORING_OP_FGETXATTR")
    1.53-         (ioring-op-getxattr "IORING_OP_GETXATTR")
    1.54-         (ioring-op-socket "IORING_OP_SOCKET")
    1.55-         (ioring-op-uring-cmd "IORING_OP_URING_CMD")
    1.56-         (ioring-op-send-zc "IORING_OP_SEND_ZC")
    1.57-         (ioring-op-sendmsg-zc "IORING_OP_SENDMSG_ZC")
    1.58-         (ioring-op-last "IORING_OP_LAST"))
    1.59-        t)
    1.60  (:integer ioring-uring-cmd-fixed "IORING_URING_CMD_FIXED")
    1.61  (:integer ioring-fsync-datasync "IORING_FSYNC_DATASYNC")
    1.62  (:integer ioring-timeout-abs "IORING_TIMEOUT_ABS")
    1.63@@ -244,7 +191,7 @@
    1.64                              (unsigned-char ops-len "__u8" "ops_len")
    1.65                              ;; (unsigned-short resv "__u16" "resv")
    1.66                              ;; ((array unsigned-int 3) resv2 "__u32" "resv2[3]")
    1.67-                             ((array (struct io-uring-probe-op)) ops "struct io_uring_probe_op" "ops[1]")))
    1.68+                             ((array (struct io-uring-probe-op)) ops "struct io_uring_probe_op" "ops[0]" :distrust-length t)))
    1.69  (:structure io-uring-buf ("struct io_uring_buf"
    1.70                            (unsigned-long addr "__u64" "addr")
    1.71                            (unsigned-int len "__u32" "len")
     2.1--- a/lisp/ffi/uring/macs.lisp	Fri Mar 29 19:04:17 2024 -0400
     2.2+++ b/lisp/ffi/uring/macs.lisp	Fri Mar 29 21:07:03 2024 -0400
     2.3@@ -12,3 +12,25 @@
     2.4 
     2.5 (defmacro def-with-ring (name &body args)
     2.6   `(defalien-int ,name (ring (* (struct io-uring))) ,@args))
     2.7+
     2.8+(defvar *io-opcodes* nil)
     2.9+
    2.10+;; io_uring_prep_*
    2.11+(defmacro def-io-op (val name slots &body builder)
    2.12+  "Define a wrapper for an io-uring opcode. This macro will create a
    2.13+structure class with NAME and SLOTS. BUILDER is the body of the BUILD
    2.14+method for this struct, with CONST bound to VAR."
    2.15+  (let ((struct-name (symbolicate "IO-OP-" name))
    2.16+        (const-name (symbolicate "+IO-" name "+"))
    2.17+        (alien-name (symbolicate "IORING-OP-" name)))
    2.18+    `(progn
    2.19+       (defconstant ,const-name ,val)
    2.20+       (defstruct ,struct-name ,@slots)
    2.21+       (defmethod build ((self ,struct-name) &key &allow-other-keys)
    2.22+         ,@builder)
    2.23+       (pushnew ',alien-name *io-opcodes*))))
    2.24+
    2.25+(defmacro def-alien-enum-with (name list)
    2.26+  `(define-alien-type ,name
    2.27+       (enum ,name
    2.28+             ,@(symbol-value list))))
     3.1--- a/lisp/ffi/uring/opcode.lisp	Fri Mar 29 19:04:17 2024 -0400
     3.2+++ b/lisp/ffi/uring/opcode.lisp	Fri Mar 29 21:07:03 2024 -0400
     3.3@@ -9,12 +9,66 @@
     3.4 ;;; Code:
     3.5 (in-package :uring)
     3.6 
     3.7-(defmacro def-io-op ((name (var const)) slots &body builder)
     3.8-  "Define a wrapper for an io-uring opcode. This macro will create a
     3.9-structure class with NAME and SLOTS. BUILDER is the body of the BUILD
    3.10-method for this struct, with CONST bound to VAR."
    3.11-  `(progn
    3.12-     (defstruct ,name ,@slots)
    3.13-     (defmethod build ((self ,name) &key &allow-other-keys)
    3.14-       (let ((,var ,const))
    3.15-         ,@builder))))
    3.16+(def-io-op 0 nop nil)
    3.17+(def-io-op 1 ready nil)
    3.18+(def-io-op 2 writev nil)
    3.19+(def-io-op 3 fsync nil)
    3.20+(def-io-op 4 read-fixed nil)
    3.21+(def-io-op 5 write-fixed nil)
    3.22+(def-io-op 6 poll-add nil)
    3.23+(def-io-op 7 poll-remove nil)
    3.24+(def-io-op 8 sync-file-range nil)
    3.25+(def-io-op 9 sendmsg nil)
    3.26+(def-io-op 10 recvmsg nil)
    3.27+(def-io-op 11 timeout nil)
    3.28+(def-io-op 12 timeout-remove nil)
    3.29+(def-io-op 13 accept nil)
    3.30+(def-io-op 14 async-cancel nil)
    3.31+(def-io-op 15 link-timeout nil)
    3.32+(def-io-op 16 connect nil)
    3.33+(def-io-op 17 fallocate nil)
    3.34+(def-io-op 18 openat nil)
    3.35+(def-io-op 19 close nil)
    3.36+(def-io-op 20 files-update nil)
    3.37+(def-io-op 21 statx nil)
    3.38+(def-io-op 22 read nil)
    3.39+(def-io-op 23 write nil)
    3.40+(def-io-op 24 fadvise nil)
    3.41+(def-io-op 25 madvise nil)
    3.42+(def-io-op 26 send nil)
    3.43+(def-io-op 27 recv nil)
    3.44+(def-io-op 28 openat2 nil)
    3.45+(def-io-op 29 epoll-ctl nil)
    3.46+(def-io-op 30 splice nil)
    3.47+(def-io-op 31 provide-buffers nil)
    3.48+(def-io-op 32 remove-buffers nil)
    3.49+(def-io-op 33 tee nil)
    3.50+(def-io-op 34 shutdown nil)
    3.51+(def-io-op 35 renameat nil)
    3.52+(def-io-op 36 unlinkat nil)
    3.53+(def-io-op 37 mkdirat nil)
    3.54+(def-io-op 38 symlinkat nil)
    3.55+(def-io-op 39 msg-ring nil)
    3.56+(def-io-op 40 fsetxattr nil)
    3.57+(def-io-op 41 setxattr nil)
    3.58+(def-io-op 42 fgetxattr nil)
    3.59+(def-io-op 43 getxattr nil)
    3.60+(def-io-op 44 socket nil)
    3.61+(def-io-op 45 uring-cmd nil)
    3.62+(def-io-op 46 send-zc nil)
    3.63+(def-io-op 47 sendmsg-zc nil)
    3.64+(def-io-op 48 last nil)
    3.65+
    3.66+(def-alien-enum-with io-uring-op *io-opcodes*)
    3.67+
    3.68+(defun opcode-supported-p (op &optional probe)
    3.69+  (declare (type octet op))
    3.70+  (let ((p (or probe (io-uring-get-probe))))
    3.71+    (if (> op (io-uring-probe-last-op p))
    3.72+        nil
    3.73+        (/= 0
    3.74+            (logand
    3.75+             (io-uring-probe-op-flags (addr (deref (io-uring-probe-ops p) op)))
    3.76+             io-uring-op-supported)))))
    3.77+
    3.78+