Hi Jiri,

Le 11/06/2025 à 12:02, Jiri Slaby (SUSE) a écrit :
_IO*() is the proper way of defining ioctl numbers. All these vt numbers
were synthetically built up the same way the _IO() macro does.

So instead of implicit hex numbers, use _IO() properly.

To not change the pre-existing numbers, use only _IO() (and not _IOR()
or _IOW()). The latter would change the numbers indeed.

On powerpc your assumption is wrong, because _IOC_NONE is not 0:

$ git grep _IOC_NONE arch/powerpc/
arch/powerpc/include/uapi/asm/ioctl.h:#define _IOC_NONE 1U

Therefore the value changes even with _IO(), leading to failure of Xorg as reported by Christian.

Christophe


Objdump of vt_ioctl.o reveals no difference with this patch.

Again, VT_GETCONSIZECSRPOS already uses _IOR(), so everything is paved
for this patch.

Signed-off-by: Jiri Slaby (SUSE) <jirisl...@kernel.org>
Cc: Nicolas Pitre <n...@fluxnic.net>
---
  include/uapi/linux/vt.h | 34 +++++++++++++++++-----------------
  1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/include/uapi/linux/vt.h b/include/uapi/linux/vt.h
index 714483d68c69..b60fcdfb2746 100644
--- a/include/uapi/linux/vt.h
+++ b/include/uapi/linux/vt.h
@@ -14,9 +14,9 @@
                /* Note: the ioctl VT_GETSTATE does not work for
                   consoles 16 and higher (since it returns a short) */
-/* 0x56 is 'V', to avoid collision with termios and kd */
+/* 'V' to avoid collision with termios and kd */
-#define VT_OPENQRY 0x5600 /* find available vt */
+#define VT_OPENQRY             _IO('V', 0x00)  /* find available vt */
struct vt_mode {
        __u8 mode;              /* vt mode */
@@ -25,8 +25,8 @@ struct vt_mode {
        __s16 acqsig;           /* signal to raise on acquisition */
        __s16 frsig;            /* unused (set to 0) */
  };
-#define VT_GETMODE     0x5601  /* get mode of active vt */
-#define VT_SETMODE     0x5602  /* set mode of active vt */
+#define VT_GETMODE             _IO('V', 0x01)  /* get mode of active vt */
+#define VT_SETMODE             _IO('V', 0x02)  /* set mode of active vt */
  #define               VT_AUTO         0x00    /* auto vt switching */
  #define               VT_PROCESS      0x01    /* process controls switching */
  #define               VT_ACKACQ       0x02    /* acknowledge switch */
@@ -36,21 +36,21 @@ struct vt_stat {
        __u16 v_signal; /* signal to send */
        __u16 v_state;          /* vt bitmask */
  };
-#define VT_GETSTATE    0x5603  /* get global vt state info */
-#define VT_SENDSIG     0x5604  /* signal to send to bitmask of vts */
+#define VT_GETSTATE            _IO('V', 0x03)  /* get global vt state info */
+#define VT_SENDSIG             _IO('V', 0x04)  /* signal to send to bitmask of 
vts */
-#define VT_RELDISP 0x5605 /* release display */
+#define VT_RELDISP             _IO('V', 0x05)  /* release display */
-#define VT_ACTIVATE 0x5606 /* make vt active */
-#define VT_WAITACTIVE  0x5607  /* wait for vt active */
-#define VT_DISALLOCATE 0x5608  /* free memory associated to vt */
+#define VT_ACTIVATE            _IO('V', 0x06)  /* make vt active */
+#define VT_WAITACTIVE          _IO('V', 0x07)  /* wait for vt active */
+#define VT_DISALLOCATE         _IO('V', 0x08)  /* free memory associated to vt 
*/
struct vt_sizes {
        __u16 v_rows;           /* number of rows */
        __u16 v_cols;           /* number of columns */
        __u16 v_scrollsize;     /* number of lines of scrollback */
  };
-#define VT_RESIZE      0x5609  /* set kernel's idea of screensize */
+#define VT_RESIZE              _IO('V', 0x09)  /* set kernel's idea of 
screensize */
struct vt_consize {
        __u16 v_rows;   /* number of rows */
@@ -60,10 +60,10 @@ struct vt_consize {
        __u16 v_vcol;   /* number of pixel columns on screen */
        __u16 v_ccol;   /* number of pixel columns per character */
  };
-#define VT_RESIZEX      0x560A  /* set kernel's idea of screensize + more */
-#define VT_LOCKSWITCH   0x560B  /* disallow vt switching */
-#define VT_UNLOCKSWITCH 0x560C  /* allow vt switching */
-#define VT_GETHIFONTMASK 0x560D  /* return hi font mask */
+#define VT_RESIZEX             _IO('V', 0x0A)  /* set kernel's idea of 
screensize + more */
+#define VT_LOCKSWITCH          _IO('V', 0x0B)  /* disallow vt switching */
+#define VT_UNLOCKSWITCH                _IO('V', 0x0C)  /* allow vt switching */
+#define VT_GETHIFONTMASK       _IO('V', 0x0D)  /* return hi font mask */
struct vt_event {
        __u32 event;
@@ -77,14 +77,14 @@ struct vt_event {
        __u32 pad[4];           /* Padding for expansion */
  };
-#define VT_WAITEVENT 0x560E /* Wait for an event */
+#define VT_WAITEVENT           _IO('V', 0x0E)  /* Wait for an event */
struct vt_setactivate {
        __u32 console;
        struct vt_mode mode;
  };
-#define VT_SETACTIVATE 0x560F /* Activate and set the mode of a console */
+#define VT_SETACTIVATE         _IO('V', 0x0F)  /* Activate and set the mode of 
a console */
/* get console size and cursor position */
  struct vt_consizecsrpos {


Reply via email to