@@ -109,6 +109,7 @@ local DEVICE_EXTFLAGS = {
109109 "random": "NO_USER_IO_WITHOUT_VIO",
110110 "urandom": "NO_USER_IO_WITHOUT_VIO",
111111 "kmsg": "MFILE_F_NOUSRMMAP | MFILE_F_NOUSRIO", // mmap() isn't allowed, and I/O has special behavior
112+ "void": none,
112113 "tty": "MFILE_F_NOUSRMMAP | MFILE_F_NOUSRIO", // It's a TTY, so no mmap() or "normal" I/O
113114};
114115
@@ -122,6 +123,7 @@ local DEVICE_SIZES = {
122123 "random": "0", // Has a custom stat function
123124 "urandom": "(uint64_t)-1",
124125 "kmsg": "0",
126+ "void": "0",
125127 "tty": "0", // Has a custom stat function
126128};
127129
@@ -135,6 +137,7 @@ local DEVICES = {
135137 ("random", 0666 | __S_IFCHR, makedev(1, 8)),
136138 ("urandom", 0666 | __S_IFCHR, makedev(1, 9)),
137139 ("kmsg", 0644 | __S_IFCHR, makedev(1, 11)),
140+ ("void", 0666 | __S_IFCHR, makedev(1, 999)), // KOS-specific: writes are no-ops, reads return undefined data
138141 ("tty", 0666 | __S_IFCHR, makedev(5, 0)),
139142};
140143local STMODE_MAP = { __S_IFCHR: "S_IFCHR", __S_IFBLK: "S_IFBLK" };
@@ -294,6 +297,7 @@ static_assert(devfs_devnode_makeino(S_IFCHR, makedev(1, 7)) == (__ino_t)_SELECT_
294297static_assert (devfs_devnode_makeino (S_IFCHR , makedev (1 , 8 )) == (__ino_t )_SELECT_INO (UINT32_C (0x800047 ), UINT64_C (0x800047 )));
295298static_assert (devfs_devnode_makeino (S_IFCHR , makedev (1 , 9 )) == (__ino_t )_SELECT_INO (UINT32_C (0x80004f ), UINT64_C (0x80004f )));
296299static_assert (devfs_devnode_makeino (S_IFCHR , makedev (1 , 11 )) == (__ino_t )_SELECT_INO (UINT32_C (0x80005f ), UINT64_C (0x80005f )));
300+ static_assert (devfs_devnode_makeino (S_IFCHR , makedev (1 , 999 )) == (__ino_t )_SELECT_INO (UINT32_C (0x801f3f ), UINT64_C (0x801f3f )));
297301static_assert (devfs_devnode_makeino (S_IFCHR , makedev (5 , 0 )) == (__ino_t )_SELECT_INO (UINT32_C (0x2800007 ), UINT64_C (0x2800007 )));
298302#undef __CCAST
299303#define __CCAST
@@ -405,6 +409,18 @@ PRIVATE struct devdirent dirent_dev_kmsg = {
405409 .fd_name = "kmsg"
406410 }
407411};
412+ PRIVATE struct devdirent dirent_dev_void = {
413+ .dd_dev = AWREF_INIT (& dev_void ),
414+ .dd_dirent = {
415+ .fd_refcnt = 2 , /* +1: dirent_dev_void, +1: dev_void.dv_dirent */
416+ .fd_ops = & devdirent_ops ,
417+ .fd_ino = (ino_t )_SELECT_INO (UINT32_C (0x801f3f ), UINT64_C (0x801f3f )),
418+ .fd_hash = FDIRENT_HASH_INIT (0x87b4eb26 , 0x64696f76 , 0x29eab484 , 0x64696f76 ),
419+ .fd_namelen = 4 ,
420+ .fd_type = IFTODT (S_IFCHR ),
421+ .fd_name = "void"
422+ }
423+ };
408424PRIVATE struct devdirent dirent_dev_tty = {
409425 .dd_dev = AWREF_INIT (& dev_tty ),
410426 .dd_dirent = {
@@ -417,8 +433,8 @@ PRIVATE struct devdirent dirent_dev_tty = {
417433 .fd_name = "tty"
418434 }
419435};
420- _SELECT_INO (DEFINE_INTERN_ALIAS (_devfs__fs_nodes__INIT , dev_port ),
421- DEFINE_INTERN_ALIAS (_devfs__fs_nodes__INIT , dev_port ));
436+ _SELECT_INO (DEFINE_INTERN_ALIAS (_devfs__fs_nodes__INIT , dev_urandom ),
437+ DEFINE_INTERN_ALIAS (_devfs__fs_nodes__INIT , dev_urandom ));
422438DEFINE_INTERN_ALIAS (_devfs_byname_tree__INIT , dev_port );
423439INTDEF struct chrdev_ops const dev_mem_ops ;
424440INTDEF struct chrdev_ops const dev_kmem_ops ;
@@ -429,6 +445,7 @@ INTDEF struct chrdev_ops const dev_full_ops;
429445INTDEF struct chrdev_ops const dev_random_ops ;
430446INTDEF struct chrdev_ops const dev_urandom_ops ;
431447INTDEF struct chrdev_ops const dev_kmsg_ops ;
448+ INTDEF struct chrdev_ops const dev_void_ops ;
432449INTDEF struct chrdev_ops const dev_tty_ops ;
433450
434451/* Device: `/dev/mem' */
@@ -598,7 +615,7 @@ PUBLIC struct device dev_port = {
598615 MFILE_F_NOATIME | MFILE_F_NOMTIME |
599616 MFILE_F_FIXEDFILESIZE |
600617 NO_USER_IO_WITHOUT_VIO |
601- _SELECT_INO (0 , 0 )),
618+ _SELECT_INO (_MFILE_FN__RBRED , _MFILE_FN__RBRED )),
602619 MFILE_INIT_mf_trunclock ,
603620 MFILE_INIT_mf_filesize ((uint64_t )(port_t )- 1 ),
604621 MFILE_INIT_mf_atime (0 , 0 ),
@@ -616,7 +633,7 @@ PUBLIC struct device dev_port = {
616633 FNODE_INIT_fn_changed ,
617634 .fn_supent = {
618635 .rb_lhs = _SELECT_INO (& dev_kmem .dv_devnode .dn_node , & dev_kmem .dv_devnode .dn_node ),
619- .rb_rhs = _SELECT_INO (& dev_urandom .dv_devnode .dn_node , & dev_urandom .dv_devnode .dn_node ),
636+ .rb_rhs = _SELECT_INO (& dev_full .dv_devnode .dn_node , & dev_full .dv_devnode .dn_node ),
620637 },
621638 FNODE_INIT_fn_allnodes ,
622639 },
@@ -675,7 +692,7 @@ PUBLIC struct device dev_zero = {
675692 .dv_dirent = & dirent_dev_zero ,
676693 .dv_byname_node = {
677694 .rb_par = & dev_urandom ,
678- .rb_lhs = NULL ,
695+ .rb_lhs = & dev_void ,
679696 .rb_rhs = NULL
680697 }
681698};
@@ -698,7 +715,7 @@ PUBLIC struct device dev_full = {
698715 MFILE_F_FIXEDFILESIZE |
699716 MFILE_F_NOUSRMMAP | MFILE_F_NOUSRIO |
700717 _MFILE_DEVFS_BYNAME_RED |
701- _SELECT_INO (_MFILE_FN__RBRED , _MFILE_FN__RBRED )),
718+ _SELECT_INO (0 , 0 )),
702719 MFILE_INIT_mf_trunclock ,
703720 MFILE_INIT_mf_filesize (0 ),
704721 MFILE_INIT_mf_atime (0 , 0 ),
@@ -816,8 +833,8 @@ PUBLIC struct device dev_urandom = {
816833 .fn_super = & devfs .rs_sup ,
817834 FNODE_INIT_fn_changed ,
818835 .fn_supent = {
819- .rb_lhs = _SELECT_INO (& dev_full .dv_devnode .dn_node , & dev_full .dv_devnode .dn_node ),
820- .rb_rhs = _SELECT_INO (& dev_tty .dv_devnode .dn_node , & dev_tty .dv_devnode .dn_node ),
836+ .rb_lhs = _SELECT_INO (& dev_port .dv_devnode .dn_node , & dev_port .dv_devnode .dn_node ),
837+ .rb_rhs = _SELECT_INO (& dev_void .dv_devnode .dn_node , & dev_void .dv_devnode .dn_node ),
821838 },
822839 FNODE_INIT_fn_allnodes ,
823840 },
@@ -850,7 +867,7 @@ PUBLIC struct device dev_kmsg = {
850867 MFILE_F_FIXEDFILESIZE |
851868 MFILE_F_NOUSRMMAP | MFILE_F_NOUSRIO |
852869 _MFILE_DEVFS_BYNAME_RED |
853- _SELECT_INO (_MFILE_FN__RBRED , _MFILE_FN__RBRED )),
870+ _SELECT_INO (0 , 0 )),
854871 MFILE_INIT_mf_trunclock ,
855872 MFILE_INIT_mf_filesize (0 ),
856873 MFILE_INIT_mf_atime (0 , 0 ),
@@ -883,6 +900,56 @@ PUBLIC struct device dev_kmsg = {
883900 }
884901};
885902
903+ /* Device: `/dev/void' */
904+ PUBLIC struct device dev_void = {
905+ .dv_devnode = {
906+ .dn_node = {
907+ .fn_file = {
908+ MFILE_INIT_mf_refcnt (1 ), /* +1: dev_void */
909+ MFILE_INIT_mf_ops (& dev_void_ops .cdo_dev .do_node .dvno_node .no_file ),
910+ MFILE_INIT_mf_lock ,
911+ MFILE_INIT_mf_parts (MFILE_PARTS_ANONYMOUS ),
912+ MFILE_INIT_mf_initdone ,
913+ MFILE_INIT_mf_changed (MFILE_PARTS_ANONYMOUS ),
914+ MFILE_INIT_mf_blockshift (PAGESHIFT , PAGESHIFT ),
915+ MFILE_INIT_mf_meta ,
916+ MFILE_INIT_mf_flags (MFILE_F_ATTRCHANGED | MFILE_F_CHANGED |
917+ MFILE_F_NOATIME | MFILE_F_NOMTIME |
918+ MFILE_F_FIXEDFILESIZE |
919+ _MFILE_DEVFS_BYNAME_RED |
920+ _SELECT_INO (0 , 0 )),
921+ MFILE_INIT_mf_trunclock ,
922+ MFILE_INIT_mf_filesize (0 ),
923+ MFILE_INIT_mf_atime (0 , 0 ),
924+ MFILE_INIT_mf_mtime (0 , 0 ),
925+ MFILE_INIT_mf_ctime (0 , 0 ),
926+ MFILE_INIT_mf_btime (0 , 0 ),
927+ MFILE_INIT_mf_msalign (NULL )
928+ },
929+ .fn_nlink = 1 ,
930+ .fn_mode = 0666 | S_IFCHR ,
931+ .fn_uid = 0 ,
932+ .fn_gid = 0 ,
933+ .fn_ino = (ino_t )_SELECT_INO (UINT32_C (0x801f3f ), UINT64_C (0x801f3f )),
934+ .fn_super = & devfs .rs_sup ,
935+ FNODE_INIT_fn_changed ,
936+ .fn_supent = {
937+ .rb_lhs = _SELECT_INO (& dev_kmsg .dv_devnode .dn_node , & dev_kmsg .dv_devnode .dn_node ),
938+ .rb_rhs = _SELECT_INO (& dev_tty .dv_devnode .dn_node , & dev_tty .dv_devnode .dn_node ),
939+ },
940+ FNODE_INIT_fn_allnodes ,
941+ },
942+ .dn_devno = makedev (1 , 999 )
943+ },
944+ .dv_driver = & drv_self ,
945+ .dv_dirent = & dirent_dev_void ,
946+ .dv_byname_node = {
947+ .rb_par = & dev_zero ,
948+ .rb_lhs = NULL ,
949+ .rb_rhs = NULL
950+ }
951+ };
952+
886953/* Device: `/dev/tty' */
887954PUBLIC struct device dev_tty = {
888955 .dv_devnode = {
@@ -918,7 +985,7 @@ PUBLIC struct device dev_tty = {
918985 .fn_super = & devfs .rs_sup ,
919986 FNODE_INIT_fn_changed ,
920987 .fn_supent = {
921- .rb_lhs = _SELECT_INO (& dev_kmsg . dv_devnode . dn_node , & dev_kmsg . dv_devnode . dn_node ),
988+ .rb_lhs = _SELECT_INO (NULL , NULL ),
922989 .rb_rhs = _SELECT_INO (NULL , NULL ),
923990 },
924991 FNODE_INIT_fn_allnodes ,
0 commit comments