bits.odin 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961
  1. package linux
  2. import "base:intrinsics"
  3. @(private)
  4. log2 :: intrinsics.constant_log2
  5. /*
  6. Represents an error returned by most of syscalls
  7. */
  8. Errno :: enum i32 {
  9. NONE = 0,
  10. // Errno-base
  11. EPERM = 1,
  12. ENOENT = 2,
  13. ESRCH = 3,
  14. EINTR = 4,
  15. EIO = 5,
  16. ENXIO = 6,
  17. E2BIG = 7,
  18. ENOEXEC = 8,
  19. EBADF = 9,
  20. ECHILD = 10,
  21. EAGAIN = 11,
  22. ENOMEM = 12,
  23. EACCES = 13,
  24. EFAULT = 14,
  25. ENOTBLK = 15,
  26. EBUSY = 16,
  27. EEXIST = 17,
  28. EXDEV = 18,
  29. ENODEV = 19,
  30. ENOTDIR = 20,
  31. EISDIR = 21,
  32. EINVAL = 22,
  33. ENFILE = 23,
  34. EMFILE = 24,
  35. ENOTTY = 25,
  36. ETXTBSY = 26,
  37. EFBIG = 27,
  38. ENOSPC = 28,
  39. ESPIPE = 29,
  40. EROFS = 30,
  41. EMLINK = 31,
  42. EPIPE = 32,
  43. EDOM = 33,
  44. ERANGE = 34,
  45. // Linux
  46. EDEADLK = 35,
  47. ENAMETOOLONG = 36,
  48. ENOLCK = 37,
  49. ENOSYS = 38,
  50. ENOTEMPTY = 39,
  51. ELOOP = 40,
  52. EUNKNOWN_41 = 41,
  53. ENOMSG = 42,
  54. EIDRM = 43,
  55. ECHRNG = 44,
  56. EL2NSYNC = 45,
  57. EL3HLT = 46,
  58. EL3RST = 47,
  59. ELNRNG = 48,
  60. EUNATCH = 49,
  61. ENOCSI = 50,
  62. EL2HLT = 51,
  63. EBADE = 52,
  64. EBADR = 53,
  65. EXFULL = 54,
  66. ENOANO = 55,
  67. EBADRQC = 56,
  68. EBADSLT = 57,
  69. EUNKNOWN_58 = 58,
  70. EBFONT = 59,
  71. ENOSTR = 60,
  72. ENODATA = 61,
  73. ETIME = 62,
  74. ENOSR = 63,
  75. ENONET = 64,
  76. ENOPKG = 65,
  77. EREMOTE = 66,
  78. ENOLINK = 67,
  79. EADV = 68,
  80. ESRMNT = 69,
  81. ECOMM = 70,
  82. EPROTO = 71,
  83. EMULTIHOP = 72,
  84. EDOTDOT = 73,
  85. EBADMSG = 74,
  86. EOVERFLOW = 75,
  87. ENOTUNIQ = 76,
  88. EBADFD = 77,
  89. EREMCHG = 78,
  90. ELIBACC = 79,
  91. ELIBBAD = 80,
  92. ELIBSCN = 81,
  93. ELIBMAX = 82,
  94. ELIBEXEC = 83,
  95. EILSEQ = 84,
  96. ERESTART = 85,
  97. ESTRPIPE = 86,
  98. EUSERS = 87,
  99. ENOTSOCK = 88,
  100. EDESTADDRREQ = 89,
  101. EMSGSIZE = 90,
  102. EPROTOTYPE = 91,
  103. ENOPROTOOPT = 92,
  104. EPROTONOSUPPORT = 93,
  105. ESOCKTNOSUPPORT = 94,
  106. EOPNOTSUPP = 95,
  107. EPFNOSUPPORT = 96,
  108. EAFNOSUPPORT = 97,
  109. EADDRINUSE = 98,
  110. EADDRNOTAVAIL = 99,
  111. ENETDOWN = 100,
  112. ENETUNREACH = 101,
  113. ENETRESET = 102,
  114. ECONNABORTED = 103,
  115. ECONNRESET = 104,
  116. ENOBUFS = 105,
  117. EISCONN = 106,
  118. ENOTCONN = 107,
  119. ESHUTDOWN = 108,
  120. ETOOMANYREFS = 109,
  121. ETIMEDOUT = 110,
  122. ECONNREFUSED = 111,
  123. EHOSTDOWN = 112,
  124. EHOSTUNREACH = 113,
  125. EALREADY = 114,
  126. EINPROGRESS = 115,
  127. ESTALE = 116,
  128. EUCLEAN = 117,
  129. ENOTNAM = 118,
  130. ENAVAIL = 119,
  131. EISNAM = 120,
  132. EREMOTEIO = 121,
  133. EDQUOT = 122,
  134. ENOMEDIUM = 123,
  135. EMEDIUMTYPE = 124,
  136. ECANCELED = 125,
  137. ENOKEY = 126,
  138. EKEYEXPIRED = 127,
  139. EKEYREVOKED = 128,
  140. EKEYREJECTED = 129,
  141. EOWNERDEAD = 130,
  142. ENOTRECOVERABLE = 131,
  143. ERFKILL = 132,
  144. EHWPOISON = 133,
  145. // Errno aliases
  146. EWOULDBLOCK = EAGAIN,
  147. EDEADLOCK = EDEADLK,
  148. }
  149. /*
  150. Bits for Open_Flags.
  151. RDONLY flag is not present, because it has the value of 0, i.e. it is the
  152. default, unless WRONLY or RDWR is specified.
  153. */
  154. when ODIN_ARCH != .arm64 && ODIN_ARCH != .arm32 {
  155. Open_Flags_Bits :: enum {
  156. WRONLY = 0,
  157. RDWR = 1,
  158. CREAT = 6,
  159. EXCL = 7,
  160. NOCTTY = 8,
  161. TRUNC = 9,
  162. APPEND = 10,
  163. NONBLOCK = 11,
  164. DSYNC = 12,
  165. ASYNC = 13,
  166. DIRECT = 14,
  167. LARGEFILE = 15,
  168. DIRECTORY = 16,
  169. NOFOLLOW = 17,
  170. NOATIME = 18,
  171. CLOEXEC = 19,
  172. PATH = 21,
  173. }
  174. // https://github.com/torvalds/linux/blob/7367539ad4b0f8f9b396baf02110962333719a48/include/uapi/asm-generic/fcntl.h#L19
  175. #assert(1 << uint(Open_Flags_Bits.WRONLY) == 0o0000000_1)
  176. #assert(1 << uint(Open_Flags_Bits.RDWR) == 0o0000000_2)
  177. #assert(1 << uint(Open_Flags_Bits.CREAT) == 0o00000_100)
  178. #assert(1 << uint(Open_Flags_Bits.EXCL) == 0o00000_200)
  179. #assert(1 << uint(Open_Flags_Bits.NOCTTY) == 0o00000_400)
  180. #assert(1 << uint(Open_Flags_Bits.TRUNC) == 0o0000_1000)
  181. #assert(1 << uint(Open_Flags_Bits.APPEND) == 0o0000_2000)
  182. #assert(1 << uint(Open_Flags_Bits.NONBLOCK) == 0o0000_4000)
  183. #assert(1 << uint(Open_Flags_Bits.DSYNC) == 0o000_10000)
  184. #assert(1 << uint(Open_Flags_Bits.ASYNC) == 0o000_20000)
  185. #assert(1 << uint(Open_Flags_Bits.DIRECT) == 0o000_40000)
  186. #assert(1 << uint(Open_Flags_Bits.LARGEFILE) == 0o00_100000)
  187. #assert(1 << uint(Open_Flags_Bits.DIRECTORY) == 0o00_200000)
  188. #assert(1 << uint(Open_Flags_Bits.NOFOLLOW) == 0o00_400000)
  189. #assert(1 << uint(Open_Flags_Bits.NOATIME) == 0o0_1000000)
  190. #assert(1 << uint(Open_Flags_Bits.CLOEXEC) == 0o0_2000000)
  191. #assert(1 << uint(Open_Flags_Bits.PATH) == 0o_10000000)
  192. } else {
  193. Open_Flags_Bits :: enum {
  194. WRONLY = 0,
  195. RDWR = 1,
  196. CREAT = 6,
  197. EXCL = 7,
  198. NOCTTY = 8,
  199. TRUNC = 9,
  200. APPEND = 10,
  201. NONBLOCK = 11,
  202. DSYNC = 12,
  203. ASYNC = 13,
  204. DIRECTORY = 14,
  205. NOFOLLOW = 15,
  206. DIRECT = 16,
  207. LARGEFILE = 17,
  208. NOATIME = 18,
  209. CLOEXEC = 19,
  210. PATH = 21,
  211. }
  212. }
  213. /*
  214. Bits for FD_Flags bitset
  215. */
  216. FD_Flags_Bits :: enum {
  217. SYMLINK_NOFOLLOW = 8,
  218. REMOVEDIR = 9,
  219. EACCESS = 9,
  220. SYMLINK_FOLLOW = 10,
  221. NO_AUTOMOUNT = 11,
  222. EMPTY_PATH = 12,
  223. STATX_FORCE_SYNC = 13,
  224. STATX_DONT_SYNC = 14,
  225. RECURSIVE = 15,
  226. }
  227. /*
  228. The bits for the Mode bitset.
  229. */
  230. Mode_Bits :: enum {
  231. IXOTH = 0, // 0o0000001
  232. IWOTH = 1, // 0o0000002
  233. IROTH = 2, // 0o0000004
  234. IXGRP = 3, // 0o0000010
  235. IWGRP = 4, // 0o0000020
  236. IRGRP = 5, // 0o0000040
  237. IXUSR = 6, // 0o0000100
  238. IWUSR = 7, // 0o0000200
  239. IRUSR = 8, // 0o0000400
  240. ISVTX = 9, // 0o0001000
  241. ISGID = 10, // 0o0002000
  242. ISUID = 11, // 0o0004000
  243. IFIFO = 12, // 0o0010000
  244. IFCHR = 13, // 0o0020000
  245. IFDIR = 14, // 0o0040000
  246. IFREG = 15, // 0o0100000
  247. }
  248. /*
  249. The bits used by the Statx_Mask bitset
  250. */
  251. Statx_Mask_Bits :: enum {
  252. TYPE = 0,
  253. MODE = 1,
  254. NLINK = 2,
  255. UID = 3,
  256. GID = 4,
  257. ATIME = 5,
  258. MTIME = 6,
  259. CTIME = 7,
  260. INO = 8,
  261. SIZE = 9,
  262. BLOCKS = 10,
  263. BTIME = 11,
  264. MNT_ID = 12,
  265. DIOALIGN = 13,
  266. }
  267. /*
  268. Bits found in Statx_Attr bitset
  269. You should not use these directly
  270. */
  271. Statx_Attr_Bits :: enum {
  272. COMPRESSED = 2, // 0x00000004
  273. IMMUTABLE = 4, // 0x00000010
  274. APPEND = 5, // 0x00000020
  275. NODUMP = 6, // 0x00000040
  276. ENCRYPTED = 11, // 0x00000800
  277. AUTOMOUNT = 12, // 0x00001000
  278. MOUNT_ROOT = 13, // 0x00002000
  279. VERITY = 20, // 0x00100000
  280. DAX = 21, // 0x00200000
  281. }
  282. /*
  283. Magic bits for filesystems returned by Stat_FS
  284. */
  285. FS_Magic :: enum u32 {
  286. ADFS_SUPER_MAGIC = 0xadf5,
  287. AFFS_SUPER_MAGIC = 0xadff,
  288. AFS_SUPER_MAGIC = 0x5346414f,
  289. ANON_INODE_FS_MAGIC = 0x09041934,
  290. AUTOFS_SUPER_MAGIC = 0x0187,
  291. BDEVFS_MAGIC = 0x62646576,
  292. BEFS_SUPER_MAGIC = 0x42465331,
  293. BFS_MAGIC = 0x1badface,
  294. BINFMTFS_MAGIC = 0x42494e4d,
  295. BPF_FS_MAGIC = 0xcafe4a11,
  296. BTRFS_SUPER_MAGIC = 0x9123683e,
  297. BTRFS_TEST_MAGIC = 0x73727279,
  298. CGROUP_SUPER_MAGIC = 0x27e0eb,
  299. CGROUP2_SUPER_MAGIC = 0x63677270,
  300. CIFS_MAGIC_NUMBER = 0xff534d42,
  301. CODA_SUPER_MAGIC = 0x73757245,
  302. COH_SUPER_MAGIC = 0x012ff7b7,
  303. CRAMFS_MAGIC = 0x28cd3d45,
  304. DEBUGFS_MAGIC = 0x64626720,
  305. DEVFS_SUPER_MAGIC = 0x1373,
  306. DEVPTS_SUPER_MAGIC = 0x1cd1,
  307. ECRYPTFS_SUPER_MAGIC = 0xf15f,
  308. EFIVARFS_MAGIC = 0xde5e81e4,
  309. EFS_SUPER_MAGIC = 0x00414a53,
  310. EXT_SUPER_MAGIC = 0x137d,
  311. EXT2_OLD_SUPER_MAGIC = 0xef51,
  312. EXT2_SUPER_MAGIC = 0xef53,
  313. EXT3_SUPER_MAGIC = 0xef53,
  314. EXT4_SUPER_MAGIC = 0xef53,
  315. F2FS_SUPER_MAGIC = 0xf2f52010,
  316. FUSE_SUPER_MAGIC = 0x65735546,
  317. FUTEXFS_SUPER_MAGIC = 0xbad1dea,
  318. HFS_SUPER_MAGIC = 0x4244,
  319. HOSTFS_SUPER_MAGIC = 0x00c0ffee,
  320. HPFS_SUPER_MAGIC = 0xf995e849,
  321. HUGETLBFS_MAGIC = 0x958458f6,
  322. ISOFS_SUPER_MAGIC = 0x9660,
  323. JFFS2_SUPER_MAGIC = 0x72b6,
  324. JFS_SUPER_MAGIC = 0x3153464a,
  325. MINIX_SUPER_MAGIC = 0x137f,
  326. MINIX_SUPER_MAGIC2 = 0x138f,
  327. MINIX2_SUPER_MAGIC = 0x2468,
  328. MINIX2_SUPER_MAGIC2 = 0x2478,
  329. MINIX3_SUPER_MAGIC = 0x4d5a,
  330. MQUEUE_MAGIC = 0x19800202,
  331. MSDOS_SUPER_MAGIC = 0x4d44,
  332. MTD_INODE_FS_MAGIC = 0x11307854,
  333. NCP_SUPER_MAGIC = 0x564c,
  334. NFS_SUPER_MAGIC = 0x6969,
  335. NILFS_SUPER_MAGIC = 0x3434,
  336. NSFS_MAGIC = 0x6e736673,
  337. NTFS_SB_MAGIC = 0x5346544e,
  338. OCFS2_SUPER_MAGIC = 0x7461636f,
  339. OPENPROM_SUPER_MAGIC = 0x9fa1,
  340. OVERLAYFS_SUPER_MAGIC = 0x794c7630,
  341. PIPEFS_MAGIC = 0x50495045,
  342. PROC_SUPER_MAGIC = 0x9fa0,
  343. PSTOREFS_MAGIC = 0x6165676c,
  344. QNX4_SUPER_MAGIC = 0x002f,
  345. QNX6_SUPER_MAGIC = 0x68191122,
  346. RAMFS_MAGIC = 0x858458f6,
  347. REISERFS_SUPER_MAGIC = 0x52654973,
  348. ROMFS_MAGIC = 0x7275,
  349. SECURITYFS_MAGIC = 0x73636673,
  350. SELINUX_MAGIC = 0xf97cff8c,
  351. SMACK_MAGIC = 0x43415d53,
  352. SMB_SUPER_MAGIC = 0x517b,
  353. SMB2_MAGIC_NUMBER = 0xfe534d42,
  354. SOCKFS_MAGIC = 0x534f434b,
  355. SQUASHFS_MAGIC = 0x73717368,
  356. SYSFS_MAGIC = 0x62656572,
  357. SYSV2_SUPER_MAGIC = 0x012ff7b6,
  358. SYSV4_SUPER_MAGIC = 0x012ff7b5,
  359. TMPFS_MAGIC = 0x01021994,
  360. TRACEFS_MAGIC = 0x74726163,
  361. UDF_SUPER_MAGIC = 0x15013346,
  362. UFS_MAGIC = 0x00011954,
  363. USBDEVICE_SUPER_MAGIC = 0x9fa2,
  364. V9FS_MAGIC = 0x01021997,
  365. VXFS_SUPER_MAGIC = 0xa501fcf5,
  366. XENFS_SUPER_MAGIC = 0xabba1974,
  367. XENIX_SUPER_MAGIC = 0x012ff7b4,
  368. XFS_SUPER_MAGIC = 0x58465342,
  369. _XIAFS_SUPER_MAGIC = 0x012fd16d,
  370. }
  371. /*
  372. Bits for FS_Flags bitset
  373. */
  374. FS_Flags_Bits :: enum {
  375. RDONLY = 0,
  376. NOSUID = 1,
  377. NODEV = 2,
  378. NOEXEC = 3,
  379. SYNCHRONOUS = 4,
  380. VALID = 5,
  381. MANDLOCK = 6,
  382. NOATIME = 10,
  383. NODIRATIME = 11,
  384. RELATIME = 12,
  385. NOSYMFOLLOW = 13,
  386. }
  387. Seek_Whence :: enum i16 {
  388. SET = 0,
  389. CUR = 1,
  390. END = 2,
  391. DATA = 3,
  392. HOLE = 4,
  393. }
  394. /*
  395. Bits for Close_Range_Flags
  396. */
  397. Close_Range_Flags_Bits :: enum {
  398. CLOEXEC = 2,
  399. UNSHARE = 1,
  400. }
  401. /*
  402. Bits for Rename_Flags
  403. */
  404. Rename_Flags_Bits :: enum {
  405. EXCHANGE = 1,
  406. NOREPLACE = 0,
  407. WHITEOUT = 2,
  408. }
  409. /*
  410. Type of the file in a directory entry
  411. */
  412. Dirent_Type :: enum u8 {
  413. UNKNOWN = 0,
  414. FIFO = 1,
  415. CHR = 2,
  416. DIR = 4,
  417. BLK = 6,
  418. REG = 8,
  419. LNK = 10,
  420. SOCK = 12,
  421. WHT = 14,
  422. }
  423. /*
  424. Type of a lock for fcntl(2)
  425. */
  426. FLock_Type :: enum i16 {
  427. RDLCK = 0,
  428. WRLCK = 1,
  429. UNLCK = 2,
  430. }
  431. /*
  432. Bits for FD_Notifications
  433. */
  434. FD_Notifications_Bits :: enum {
  435. ACCESS = 0,
  436. MODIFY = 1,
  437. CREATE = 2,
  438. DELETE = 3,
  439. RENAME = 4,
  440. ATTRIB = 5,
  441. MULTISHOT = 31,
  442. }
  443. /*
  444. Bits for seal
  445. */
  446. Seal_Bits :: enum {
  447. SEAL = 0,
  448. SHRINK = 1,
  449. GROW = 2,
  450. WRITE = 3,
  451. FUTURE_WRITE = 4,
  452. }
  453. RW_Hint :: enum u64 {
  454. WRITE_LIFE_NOT_SET = 0,
  455. WRITE_LIFE_NONE = 1,
  456. WRITE_LIFE_SHORT = 2,
  457. WRITE_LIFE_MEDIUM = 3,
  458. WRITE_LIFE_LONG = 4,
  459. WRITE_LIFE_EXTREME = 5,
  460. }
  461. FD_Lease :: enum {
  462. RDLCK = 0,
  463. WRLCK = 1,
  464. UNLCK = 2,
  465. }
  466. /*
  467. Kind of owner for FD_Owner
  468. */
  469. F_Owner_Type :: enum i32 {
  470. OWNER_TID = 0,
  471. OWNER_PID = 1,
  472. OWNER_PGRP = 2,
  473. }
  474. /*
  475. Command for fcntl(2)
  476. */
  477. FCntl_Command :: enum {
  478. DUPFD = 0,
  479. GETFD = 1,
  480. SETFD = 2,
  481. GETFL = 3,
  482. SETFL = 4,
  483. GETLK = 5,
  484. SETLK = 6,
  485. SETLKW = 7,
  486. SETOWN = 8,
  487. GETOWN = 9,
  488. SETSIG = 10,
  489. GETSIG = 11,
  490. SETOWN_EX = 15,
  491. GETOWN_EX = 16,
  492. // OFD_GETLK = 36,
  493. // OFD_SETLK = 37,
  494. // OFD_SETLKW = 38,
  495. SETLEASE = 1024,
  496. GETLEASE = 1025,
  497. NOTIFY = 1026,
  498. DUPFD_CLOEXEC = 1030,
  499. SETPIPE_SZ = 1031,
  500. GETPIPE_SZ = 1032,
  501. ADD_SEALS = 1033,
  502. GET_SEALS = 1034,
  503. GET_RW_HINT = 1035,
  504. SET_RW_HINT = 1036,
  505. GET_FILE_RW_HINT = 1037,
  506. SET_FILE_RW_HINT = 1038,
  507. // F_OK = 0,
  508. }
  509. Fd_Poll_Events_Bits :: enum {
  510. IN = 0,
  511. PRI = 1,
  512. OUT = 2,
  513. ERR = 3,
  514. HUP = 4,
  515. NVAL = 5,
  516. RDNORM = 6,
  517. RDBAND = 7,
  518. WRNORM = 8,
  519. WRBAND = 9,
  520. MSG = 10,
  521. REMOVE = 12,
  522. RDHUP = 13,
  523. }
  524. Inotify_Init_Bits :: enum {
  525. NONBLOCK = 11,
  526. CLOEXEC = 19,
  527. }
  528. Inotify_Event_Bits :: enum u32 {
  529. ACCESS = 0,
  530. MODIFY = 1,
  531. ATTRIB = 2,
  532. CLOSE_WRITE = 3,
  533. CLOSE_NOWRITE = 4,
  534. OPEN = 5,
  535. MOVED_FROM = 6,
  536. MOVED_TO = 7,
  537. CREATE = 8,
  538. DELETE = 9,
  539. DELETE_SELF = 10,
  540. MOVE_SELF = 11,
  541. UNMOUNT = 13,
  542. Q_OVERFLOW = 14,
  543. IGNORED = 15,
  544. ONLYDIR = 24,
  545. DONT_FOLLOW = 25,
  546. EXCL_UNLINK = 26,
  547. MASK_CREATE = 28,
  548. MASK_ADD = 29,
  549. ISDIR = 30,
  550. ONESHOT = 31,
  551. }
  552. /*
  553. Bits for Mem_Protection bitfield
  554. */
  555. Mem_Protection_Bits :: enum{
  556. READ = 0,
  557. WRITE = 1,
  558. EXEC = 2,
  559. SEM = 3,
  560. // platform-specific section start
  561. ARM64_BTI = 4,
  562. ARM64_MTE = 5,
  563. // platform-specific section end
  564. GROWSDOWN = 24,
  565. GROWSUP = 25,
  566. }
  567. /*
  568. Bits for Map_Flags
  569. */
  570. Map_Flags_Bits :: enum {
  571. SHARED = 0,
  572. PRIVATE = 1,
  573. SHARED_VALIDATE = 2,
  574. FIXED = 4,
  575. ANONYMOUS = 5,
  576. // platform-dependent section start
  577. X86_32BIT = 6,
  578. X86_ABOVE4G = 7,
  579. // platform-dependent section end
  580. GROWSDOWN = 8,
  581. DENYWRITE = 11,
  582. EXECUTABLE = 12,
  583. LOCKED = 13,
  584. NORESERVE = 14,
  585. POPULATE = 15,
  586. NONBLOCK = 16,
  587. STACK = 17,
  588. HUGETLB = 18,
  589. SYNC = 19,
  590. FIXED_NOREPLACE = 20,
  591. UNINITIALIZED = 26,
  592. }
  593. /*
  594. Bits for MLock_Flags
  595. */
  596. MLock_Flags_Bits :: enum {
  597. ONFAULT = 0,
  598. }
  599. /*
  600. Bits for MSync_Flags
  601. */
  602. MSync_Flags_Bits :: enum {
  603. ASYNC = 0,
  604. INVALIDATE = 1,
  605. SYNC = 2,
  606. }
  607. /*
  608. Argument for madvice(2)
  609. */
  610. MAdvice :: enum {
  611. NORMAL = 0,
  612. RANDOM = 1,
  613. SEQUENTIAL = 2,
  614. WILLNEED = 3,
  615. DONTNEED = 4,
  616. FREE = 8,
  617. REMOVE = 9,
  618. DONTFORK = 10,
  619. DOFORK = 11,
  620. MERGEABLE = 12,
  621. UNMERGEABLE = 13,
  622. HUGEPAGE = 14,
  623. NOHUGEPAGE = 15,
  624. DONTDUMP = 16,
  625. DODUMP = 17,
  626. WIPEONFORK = 18,
  627. KEEPONFORK = 19,
  628. COLD = 20,
  629. PAGEOUT = 21,
  630. POPULATE_READ = 22,
  631. POPULATE_WRITE = 23,
  632. DONTNEED_LOCKED = 24,
  633. COLLAPSE = 25,
  634. HWPOISON = 100,
  635. SOFT_OFFLINE = 101,
  636. }
  637. /*
  638. Bits for PKey_Access_Rights
  639. */
  640. PKey_Access_Bits :: enum {
  641. DISABLE_ACCESS = 0,
  642. DISABLE_WRITE = 2,
  643. }
  644. /*
  645. Bits for MRemap_Flags
  646. */
  647. MRemap_Flags_Bits :: enum {
  648. MAYMOVE = 0,
  649. FIXED = 1,
  650. DONTUNMAP = 2,
  651. }
  652. /*
  653. Bits for Get_Random_Flags
  654. */
  655. Get_Random_Flags_Bits :: enum {
  656. RANDOM = 0,
  657. NONBLOCK = 1,
  658. INSECURE = 2,
  659. }
  660. /*
  661. Bits for Perf_Flags
  662. */
  663. Perf_Flags_Bits :: enum {
  664. FD_NO_GROUP = 0,
  665. FD_OUTPUT = 1,
  666. PID_CGROUP = 2,
  667. FD_CLOEXEC = 3,
  668. }
  669. /*
  670. Union tag for Perf_Event_Attr struct
  671. */
  672. Perf_Event_Type :: enum u32 {
  673. HARDWARE = 0,
  674. SOFTWARE = 1,
  675. TRACEPOINT = 2,
  676. HW_CACHE = 3,
  677. RAW = 4,
  678. BREAKPOINT = 5,
  679. }
  680. Perf_Event_Flags_Bits :: enum u64 {
  681. Disabled = 0,
  682. Inherit = 1,
  683. Pinned = 2,
  684. Exclusive = 3,
  685. Exclude_User = 4,
  686. Exclude_Kernel = 5,
  687. Exclude_HV = 6,
  688. Exclude_Idle = 7,
  689. Mmap = 8,
  690. Comm = 9,
  691. Freq = 10,
  692. Inherit_Stat = 11,
  693. Enable_On_Exec = 12,
  694. Task = 13,
  695. Watermark = 14,
  696. Precise_IP_0 = 15,
  697. Precise_IP_1 = 16,
  698. Mmap_Data = 17,
  699. Sample_Id_All = 18,
  700. Exclude_Host = 19,
  701. Exclude_Guest = 20,
  702. Exclude_Callchain_Kernel = 21,
  703. Exclude_Callchain_User = 22,
  704. Mmap2 = 23,
  705. Comm_Exec = 24,
  706. Use_Clockid = 25,
  707. Context_Switch = 26,
  708. Write_Backward = 27,
  709. Namespaces = 28,
  710. KSymbol = 29,
  711. BPF_Event = 30,
  712. Aux_Output = 31,
  713. CGroup = 32,
  714. Text_Poke = 33,
  715. Build_Id = 34,
  716. Inherit_Thread = 35,
  717. Remove_On_Exec = 36,
  718. Sigtrap = 37,
  719. }
  720. Perf_Cap_Flags_Bits :: enum u64 {
  721. Bit0 = 0,
  722. Bit0_Is_Deprecated = 1,
  723. User_Rdpmc = 2,
  724. User_Time = 3,
  725. User_Time_Zero = 4,
  726. User_Time_Short = 5,
  727. }
  728. /*
  729. Specifies the type of the hardware event that you want to get info about
  730. */
  731. Perf_Hardware_Id :: enum u64 {
  732. CPU_CYCLES = 0,
  733. INSTRUCTIONS = 1,
  734. CACHE_REFERENCES = 2,
  735. CACHE_MISSES = 3,
  736. BRANCH_INSTRUCTIONS = 4,
  737. BRANCH_MISSES = 5,
  738. BUS_CYCLES = 6,
  739. STALLED_CYCLES_FRONTEND = 7,
  740. STALLED_CYCLES_BACKEND = 8,
  741. REF_CPU_CYCLES = 9,
  742. }
  743. /*
  744. Specifies the cache for the particular cache event that you want to get info about
  745. */
  746. Perf_Hardware_Cache_Id :: enum u64 {
  747. L1D = 0,
  748. L1I = 1,
  749. LL = 2,
  750. DTLB = 3,
  751. ITLB = 4,
  752. BPU = 5,
  753. NODE = 6,
  754. }
  755. /*
  756. Specifies the cache op that you want to get info about
  757. */
  758. Perf_Hardware_Cache_Op_Id :: enum u64 {
  759. READ = 0,
  760. WRITE = 1,
  761. PREFETCH = 2,
  762. }
  763. /*
  764. Specifies the cache operation result that you want to get info about
  765. */
  766. Perf_Hardware_Cache_Result_Id :: enum u64 {
  767. ACCESS = 0,
  768. MISS = 1,
  769. }
  770. /*
  771. Specifies the particular software event that you want to get info about
  772. */
  773. Perf_Software_Id :: enum u64 {
  774. CPU_CLOCK = 0,
  775. TASK_CLOCK = 1,
  776. PAGE_FAULTS = 2,
  777. CONTEXT_SWITCHES = 3,
  778. CPU_MIGRATIONS = 4,
  779. PAGE_FAULTS_MIN = 5,
  780. PAGE_FAULTS_MAJ = 6,
  781. ALIGNMENT_FAULTS = 7,
  782. EMULATION_FAULTS = 8,
  783. DUMMY = 9,
  784. BPF_OUTPUT = 10,
  785. CGROUP_SWITCHES = 11,
  786. }
  787. /*
  788. Specifies which values to include in the sample
  789. */
  790. Perf_Event_Sample_Type_Bits :: enum {
  791. IP = 0,
  792. TID = 1,
  793. TIME = 2,
  794. ADDR = 3,
  795. READ = 4,
  796. CALLCHAIN = 5,
  797. ID = 6,
  798. CPU = 7,
  799. PERIOD = 8,
  800. STREAM_ID = 9,
  801. RAW = 10,
  802. BRANCH_STACK = 11,
  803. REGS_USER = 12,
  804. STACK_USER = 13,
  805. WEIGHT = 14,
  806. DATA_SRC = 15,
  807. IDENTIFIER = 16,
  808. TRANSACTION = 17,
  809. REGS_INTR = 18,
  810. PHYS_ADDR = 19,
  811. AUX = 20,
  812. CGROUP = 21,
  813. DATA_PAGE_SIZE = 22,
  814. CODE_PAGE_SIZE = 23,
  815. WEIGHT_STRUCT = 24,
  816. }
  817. /// Describes field sets to include in mmaped page
  818. Perf_Read_Format_Bits :: enum {
  819. TOTAL_TIME_ENABLED = 0,
  820. TOTAL_TIME_RUNNING = 1,
  821. ID = 2,
  822. GROUP = 3,
  823. LOST = 4,
  824. }
  825. /*
  826. Chooses the breakpoint type
  827. */
  828. Hardware_Breakpoint_Type :: enum u32 {
  829. EMPTY = 0,
  830. R = 1,
  831. W = 2,
  832. X = 4,
  833. RW = R | W,
  834. INVALID = RW | X,
  835. }
  836. /*
  837. Bits for Branch_Sample_Type
  838. */
  839. Branch_Sample_Type_Bits :: enum {
  840. USER = 0,
  841. KERNEL = 1,
  842. HV = 2,
  843. ANY = 3,
  844. ANY_CALL = 4,
  845. ANY_RETURN = 5,
  846. IND_CALL = 6,
  847. ABORT_TX = 7,
  848. IN_TX = 8,
  849. NO_TX = 9,
  850. COND = 10,
  851. CALL_STACK = 11,
  852. IND_JUMP = 12,
  853. CALL = 13,
  854. NO_FLAGS = 14,
  855. NO_CYCLES = 15,
  856. TYPE_SAVE = 16,
  857. HW_INDEX = 17,
  858. PRIV_SAVE = 18,
  859. }
  860. /*
  861. Represent the type of Id
  862. */
  863. Id_Type :: enum uint {
  864. ALL = 0,
  865. PID = 1,
  866. PGID = 2,
  867. PIDFD = 3,
  868. }
  869. /*
  870. Options for wait syscalls
  871. */
  872. Wait_Option :: enum {
  873. WNOHANG = 0,
  874. WUNTRACED = 1,
  875. WSTOPPED = 1,
  876. WEXITED = 2,
  877. WCONTINUED = 3,
  878. WNOWAIT = 24,
  879. // // For processes created using clone
  880. __WNOTHREAD = 29,
  881. __WALL = 30,
  882. __WCLONE = 31,
  883. }
  884. /*
  885. Bits for flags for pidfd
  886. */
  887. Pid_FD_Flags_Bits :: enum {
  888. NONBLOCK = 11,
  889. }
  890. /*
  891. Priority for process, process group, user
  892. */
  893. Priority_Which :: enum i32 {
  894. PROCESS = 0,
  895. PGRP = 1,
  896. USER = 2,
  897. }
  898. Signal :: enum i32 {
  899. // POSIX-defined signals
  900. SIGINT = 2, // Interactive attention signal.
  901. SIGILL = 4, // Illegal instruction.
  902. SIGABRT = 6, // Abnormal termination.
  903. SIGFPE = 8, // Erroneous arithmetic operation.
  904. SIGSEGV = 11, // Invalid access to storage.
  905. SIGTERM = 15, // Termination request.
  906. // Other POSIX signals
  907. SIGHUP = 1, // Hangup.
  908. SIGQUIT = 3, // Quit.
  909. SIGTRAP = 5, // Trace/breakpoint trap.
  910. SIGKILL = 9, // Killed.
  911. SIGPIPE = 13, // Broken pipe.
  912. SIGALRM = 14, // Alarm clock.
  913. // Adjustments needed for most linux systems
  914. SIGSTKFLT = 16, // Stack fault (obsolete).
  915. SIGPWR = 30, // Power failure imminent.
  916. // Historical signals specified by POSIX.
  917. SIGBUS = 7, // Bus error.
  918. SIGSYS = 31, // Bad system call.
  919. // New(er) POSIX signals (1003.1-2008, 1003.1-2013).
  920. SIGURG = 23, // Urgent data is available at a socket.
  921. SIGSTOP = 19, // Stop, unblockable.
  922. SIGTSTP = 20, // Keyboard stop.
  923. SIGCONT = 18, // Continue.
  924. SIGCHLD = 17, // Child terminated or stopped.
  925. SIGTTIN = 21, // Background read from control terminal.
  926. SIGTTOU = 22, // Background write to control terminal.
  927. SIGPOLL = 29, // Pollable event occurred (System V).
  928. SIGXFSZ = 25, // File size limit exceeded.
  929. SIGXCPU = 24, // CPU time limit exceeded.
  930. SIGVTALRM = 26, // Virtual timer expired.
  931. SIGPROF = 27, // Profiling timer expired.
  932. SIGUSR1 = 10, // User-defined signal 1.
  933. SIGUSR2 = 12, // User-defined signal 2.
  934. // Nonstandard signals found in all modern POSIX systems (including both BSD and Linux).
  935. SIGWINCH = 28, // Window size change (4.3 BSD, Sun).
  936. // Archaic names for compatibility.
  937. SIGIO = SIGPOLL, // I/O now possible (4.2 BSD).
  938. SIGIOT = SIGABRT, // IOT instruction, abort() on a PDP-11.
  939. SIGCLD = SIGCHLD, // Old System V name
  940. }
  941. Sig_Mask_Kind :: enum i32 {
  942. SIG_BLOCK = 0,
  943. SIG_UNBLOCK = 1,
  944. SIG_SETMASK = 2,
  945. }
  946. Sig_Stack_Flag :: enum i32 {
  947. DISABLE = 0,
  948. ONSTACK = 1,
  949. AUTODISARM = 31,
  950. }
  951. Sig_Action_Flag :: enum u32 {
  952. NOCLDSTOP = 0,
  953. NOCLDWAIT = 1,
  954. SIGINFO = 2,
  955. UNSUPPORTED = 10,
  956. EXPOSE_TAGBITS = 11,
  957. RESTORER = 26,
  958. ONSTACK = 27,
  959. RESTART = 28,
  960. NODEFER = 30,
  961. RESETHAND = 31,
  962. }
  963. /*
  964. Translation of code in Sig_Info for when signo is SIGCHLD
  965. */
  966. Sig_Child_Code :: enum {
  967. NONE,
  968. EXITED,
  969. KILLED,
  970. DUMPED,
  971. TRAPPED,
  972. STOPPED,
  973. CONTINUED,
  974. }
  975. /*
  976. Type of socket to create
  977. - For TCP you want to use SOCK_STREAM
  978. - For UDP you want to use SOCK_DGRAM
  979. Also see `Protocol`
  980. */
  981. Socket_Type :: enum {
  982. STREAM = 1,
  983. DGRAM = 2,
  984. RAW = 3,
  985. RDM = 4,
  986. SEQPACKET = 5,
  987. DCCP = 6,
  988. PACKET = 10,
  989. }
  990. /*
  991. Bits for Socket_FD_Flags
  992. */
  993. Socket_FD_Flags_Bits :: enum {
  994. NONBLOCK = 11,
  995. CLOEXEC = 19,
  996. }
  997. /*
  998. Protocol family
  999. */
  1000. Protocol_Family :: enum u16 {
  1001. UNSPEC = 0,
  1002. LOCAL = 1,
  1003. UNIX = LOCAL,
  1004. FILE = LOCAL,
  1005. INET = 2,
  1006. AX25 = 3,
  1007. IPX = 4,
  1008. APPLETALK = 5,
  1009. NETROM = 6,
  1010. BRIDGE = 7,
  1011. ATMPVC = 8,
  1012. X25 = 9,
  1013. INET6 = 10,
  1014. ROSE = 11,
  1015. DECnet = 12,
  1016. NETBEUI = 13,
  1017. SECURITY = 14,
  1018. KEY = 15,
  1019. NETLINK = 16,
  1020. ROUTE = NETLINK,
  1021. PACKET = 17,
  1022. ASH = 18,
  1023. ECONET = 19,
  1024. ATMSVC = 20,
  1025. RDS = 21,
  1026. SNA = 22,
  1027. IRDA = 23,
  1028. PPPOX = 24,
  1029. WANPIPE = 25,
  1030. LLC = 26,
  1031. IB = 27,
  1032. MPLS = 28,
  1033. CAN = 29,
  1034. TIPC = 30,
  1035. BLUETOOTH = 31,
  1036. IUCV = 32,
  1037. RXRPC = 33,
  1038. ISDN = 34,
  1039. PHONET = 35,
  1040. IEEE802154 = 36,
  1041. CAIF = 37,
  1042. ALG = 38,
  1043. NFC = 39,
  1044. VSOCK = 40,
  1045. KCM = 41,
  1046. QIPCRTR = 42,
  1047. SMC = 43,
  1048. XDP = 44,
  1049. MCTP = 45,
  1050. }
  1051. /*
  1052. The protocol number according to IANA protocol number list
  1053. Full list of protocol numbers:
  1054. https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
  1055. Supported by the OS protocols can be queried by reading:
  1056. /etc/protocols
  1057. */
  1058. Protocol :: enum {
  1059. HOPOPT = 0,
  1060. ICMP = 1,
  1061. IGMP = 2,
  1062. GGP = 3,
  1063. IPv4 = 4,
  1064. ST = 5,
  1065. TCP = 6,
  1066. CBT = 7,
  1067. EGP = 8,
  1068. IGP = 9,
  1069. BBN_RCC_MON = 10,
  1070. NVP_II = 11,
  1071. PUP = 12,
  1072. EMCON = 14,
  1073. XNET = 15,
  1074. CHAOS = 16,
  1075. UDP = 17,
  1076. MUX = 18,
  1077. DCN_MEAS = 19,
  1078. HMP = 20,
  1079. PRM = 21,
  1080. XNS_IDP = 22,
  1081. TRUNK_1 = 23,
  1082. TRUNK_2 = 24,
  1083. LEAF_1 = 25,
  1084. LEAF_2 = 26,
  1085. RDP = 27,
  1086. IRTP = 28,
  1087. ISO_TP4 = 29,
  1088. NETBLT = 30,
  1089. MFE_NSP = 31,
  1090. MERIT_INP = 32,
  1091. DCCP = 33,
  1092. THREE_PC = 34,
  1093. IDPR = 35,
  1094. XTP = 36,
  1095. DDP = 37,
  1096. IDPR_CMTP = 38,
  1097. TP_PlusPlus = 39,
  1098. IL = 40,
  1099. IPv6 = 41,
  1100. SDRP = 42,
  1101. IPv6_Route = 43,
  1102. IPv6_Frag = 44,
  1103. IDRP = 45,
  1104. RSVP = 46,
  1105. GRE = 47,
  1106. DSR = 48,
  1107. BNA = 49,
  1108. ESP = 50,
  1109. AH = 51,
  1110. I_NLSP = 52,
  1111. NARP = 54,
  1112. MOBILE = 55,
  1113. TLSP = 56,
  1114. SKIP = 57,
  1115. IPv6_ICMP = 58,
  1116. IPv6_NoNxt = 59,
  1117. IPv6_Opts = 60,
  1118. CFTP = 62,
  1119. SAT_EXPAK = 64,
  1120. KRYPTOLAN = 65,
  1121. RVD = 66,
  1122. IPPC = 67,
  1123. SAT_MON = 69,
  1124. VISA = 70,
  1125. IPCV = 71,
  1126. CPNX = 72,
  1127. CPHB = 73,
  1128. WSN = 74,
  1129. PVP = 75,
  1130. BR_SAT_MON = 76,
  1131. SUN_ND = 77,
  1132. WB_MON = 78,
  1133. WB_EXPAK = 79,
  1134. ISO_IP = 80,
  1135. VMTP = 81,
  1136. SECURE_VMTP = 82,
  1137. VINES = 83,
  1138. IPTM = 84,
  1139. NSFNET_IGP = 85,
  1140. DGP = 86,
  1141. TCF = 87,
  1142. EIGRP = 88,
  1143. OSPFIGP = 89,
  1144. Sprite_RPC = 90,
  1145. LARP = 91,
  1146. MTP = 92,
  1147. AX_25 = 93,
  1148. IPIP = 94,
  1149. SCC_SP = 96,
  1150. ETHERIP = 97,
  1151. ENCAP = 98,
  1152. GMTP = 100,
  1153. IFMP = 101,
  1154. PNNI = 102,
  1155. PIM = 103,
  1156. ARIS = 104,
  1157. SCPS = 105,
  1158. QNX = 106,
  1159. A_N = 107,
  1160. IPComp = 108,
  1161. SNP = 109,
  1162. Compaq_Peer = 110,
  1163. IPX_in_IP = 111,
  1164. VRRP = 112,
  1165. PGM = 113,
  1166. L2TP = 115,
  1167. DDX = 116,
  1168. IATP = 117,
  1169. STP = 118,
  1170. SRP = 119,
  1171. UTI = 120,
  1172. SMP = 121,
  1173. PTP = 123,
  1174. FIRE = 125,
  1175. CRTP = 126,
  1176. CRUDP = 127,
  1177. SSCOPMCE = 128,
  1178. IPLT = 129,
  1179. SPS = 130,
  1180. PIPE = 131,
  1181. SCTP = 132,
  1182. FC = 133,
  1183. RSVP_E2E_IGNORE = 134,
  1184. UDPLite = 136,
  1185. MPLS_in_IP = 137,
  1186. manet = 138,
  1187. HIP = 139,
  1188. Shim6 = 140,
  1189. WESP = 141,
  1190. ROHC = 142,
  1191. Ethernet = 143,
  1192. AGGFRAG = 144,
  1193. NSH = 145,
  1194. Reserved = 255,
  1195. }
  1196. /*
  1197. API Level for getsockopt(2)/setsockopt(2)
  1198. */
  1199. Socket_API_Level :: enum {
  1200. // Comes from <bits/socket-constants.h>
  1201. SOCKET = 1,
  1202. // Copy-pasted from protocol numbers
  1203. TCP = 6,
  1204. UDP = 17,
  1205. // Comes from <bits/socket.h>
  1206. RAW = 255,
  1207. DECNET = 261,
  1208. X25 = 262,
  1209. PACKET = 263,
  1210. ATM = 264,
  1211. AAL = 265,
  1212. IRDA = 266,
  1213. NETBEUI = 267,
  1214. LLC = 268,
  1215. DCCP = 269,
  1216. NETLINK = 270,
  1217. TIPC = 271,
  1218. RXRPC = 272,
  1219. PPPOL2TP = 273,
  1220. BLUETOOTH = 274,
  1221. PNPIPE = 275,
  1222. RDS = 276,
  1223. IUCV = 277,
  1224. CAIF = 278,
  1225. ALG = 279,
  1226. NFC = 280,
  1227. KCM = 281,
  1228. TLS = 282,
  1229. XDP = 283,
  1230. MPTCP = 284,
  1231. MCTP = 285,
  1232. SMC = 286,
  1233. }
  1234. /*
  1235. If Socket_API_Level == .SOCKET, these are the options
  1236. you can specify in getsockopt(2)/setsockopt(2)
  1237. */
  1238. Socket_Option :: enum {
  1239. DEBUG = 1,
  1240. REUSEADDR = 2,
  1241. TYPE = 3,
  1242. ERROR = 4,
  1243. DONTROUTE = 5,
  1244. BROADCAST = 6,
  1245. SNDBUF = 7,
  1246. RCVBUF = 8,
  1247. SNDBUFFORCE = 32,
  1248. RCVBUFFORCE = 33,
  1249. KEEPALIVE = 9,
  1250. OOBINLINE = 10,
  1251. NO_CHECK = 11,
  1252. PRIORITY = 12,
  1253. LINGER = 13,
  1254. BSDCOMPAT = 14,
  1255. REUSEPORT = 15,
  1256. PASSCRED = 16,
  1257. PEERCRED = 17,
  1258. RCVLOWAT = 18,
  1259. SNDLOWAT = 19,
  1260. RCVTIMEO_OLD = 20,
  1261. SNDTIMEO_OLD = 21,
  1262. SECURITY_AUTHENTICATION = 22,
  1263. SECURITY_ENCRYPTION_TRANSPORT = 23,
  1264. SECURITY_ENCRYPTION_NETWORK = 24,
  1265. BINDTODEVICE = 25,
  1266. ATTACH_FILTER = 26,
  1267. DETACH_FILTER = 27,
  1268. GET_FILTER = ATTACH_FILTER,
  1269. PEERNAME = 28,
  1270. ACCEPTCONN = 30,
  1271. PEERSEC = 31,
  1272. PASSSEC = 34,
  1273. IP_ADD_MEMBERSHIP = 35,
  1274. MARK = 36,
  1275. PROTOCOL = 38,
  1276. DOMAIN = 39,
  1277. RXQ_OVFL = 40,
  1278. WIFI_STATUS = 41,
  1279. PEEK_OFF = 42,
  1280. NOFCS = 43,
  1281. LOCK_FILTER = 44,
  1282. SELECT_ERR_QUEUE = 45,
  1283. BUSY_POLL = 46,
  1284. MAX_PACING_RATE = 47,
  1285. BPF_EXTENSIONS = 48,
  1286. INCOMING_CPU = 49,
  1287. ATTACH_BPF = 50,
  1288. DETACH_BPF = DETACH_FILTER,
  1289. ATTACH_REUSEPORT_CBPF = 51,
  1290. ATTACH_REUSEPORT_EBPF = 52,
  1291. CNX_ADVICE = 53,
  1292. TIMESTAMPING_OPT_STATS = 54,
  1293. MEMINFO = 55,
  1294. INCOMING_NAPI_ID = 56,
  1295. COOKIE = 57,
  1296. TIMESTAMPING_PKTINFO = 58,
  1297. PEERGROUPS = 59,
  1298. ZEROCOPY = 60,
  1299. TXTIME = 61,
  1300. BINDTOIFINDEX = 62,
  1301. TIMESTAMP_OLD = 29,
  1302. TIMESTAMPNS_OLD = 35,
  1303. TIMESTAMPING_OLD = 37,
  1304. TIMESTAMP_NEW = 63,
  1305. TIMESTAMPNS_NEW = 64,
  1306. TIMESTAMPING_NEW = 65,
  1307. RCVTIMEO_NEW = 66,
  1308. SNDTIMEO_NEW = 67,
  1309. DETACH_REUSEPORT_BPF = 68,
  1310. PREFER_BUSY_POLL = 69,
  1311. BUSY_POLL_BUDGET = 70,
  1312. NETNS_COOKIE = 71,
  1313. BUF_LOCK = 72,
  1314. RESERVE_MEM = 73,
  1315. TXREHASH = 74,
  1316. RCVMARK = 75,
  1317. TIMESTAMP = TIMESTAMP_OLD when _SOCKET_OPTION_OLD else TIMESTAMP_NEW,
  1318. TIMESTAMPNS = TIMESTAMPNS_OLD when _SOCKET_OPTION_OLD else TIMESTAMPNS_NEW,
  1319. TIMESTAMPING = TIMESTAMPING_OLD when _SOCKET_OPTION_OLD else TIMESTAMPING_NEW,
  1320. RCVTIMEO = RCVTIMEO_OLD when _SOCKET_OPTION_OLD else RCVTIMEO_NEW,
  1321. SNDTIMEO = SNDTIMEO_OLD when _SOCKET_OPTION_OLD else SNDTIMEO_NEW,
  1322. }
  1323. @(private)
  1324. _SOCKET_OPTION_OLD :: size_of(rawptr) == 8 /* || size_of(time_t) == size_of(__kernel_long_t) */
  1325. Socket_UDP_Option :: enum {
  1326. CORK = 1,
  1327. ENCAP = 100,
  1328. NO_CHECK6_TX = 101,
  1329. NO_CHECK6_RX = 102,
  1330. SEGMENT = 103,
  1331. GRO = 104,
  1332. }
  1333. UPD_Encapsulation :: enum {
  1334. ENCAP_ESPINUDP_NON_IKE = 1,
  1335. ENCAP_ESPINUDP = 2,
  1336. ENCAP_L2TPINUDP = 3,
  1337. ENCAP_GTP0 = 4,
  1338. ENCAP_GTP1U = 5,
  1339. }
  1340. Socket_TCP_Option :: enum {
  1341. NODELAY = 1,
  1342. MAXSEG = 2,
  1343. CORK = 3,
  1344. KEEPIDLE = 4,
  1345. KEEPINTVL = 5,
  1346. KEEPCNT = 6,
  1347. SYNCNT = 7,
  1348. LINGER2 = 8,
  1349. DEFER_ACCEPT = 9,
  1350. WINDOW_CLAMP = 10,
  1351. INFO = 11,
  1352. QUICKACK = 12,
  1353. CONGESTION = 13,
  1354. MD5SIG = 14,
  1355. COOKIE_TRANSACTIONS = 15,
  1356. THIN_LINEAR_TIMEOUTS = 16,
  1357. THIN_DUPACK = 17,
  1358. USER_TIMEOUT = 18,
  1359. REPAIR = 19,
  1360. REPAIR_QUEUE = 20,
  1361. QUEUE_SEQ = 21,
  1362. REPAIR_OPTIONS = 22,
  1363. FASTOPEN = 23,
  1364. TIMESTAMP = 24,
  1365. NOTSENT_LOWAT = 25,
  1366. CC_INFO = 26,
  1367. SAVE_SYN = 27,
  1368. SAVED_SYN = 28,
  1369. REPAIR_WINDOW = 29,
  1370. FASTOPEN_CONNECT = 30,
  1371. ULP = 31,
  1372. MD5SIG_EXT = 32,
  1373. FASTOPEN_KEY = 33,
  1374. FASTOPEN_NO_COOKIE = 34,
  1375. ZEROCOPY_RECEIVE = 35,
  1376. INQ = 36,
  1377. CM_INQ = INQ,
  1378. TX_DELAY = 37,
  1379. }
  1380. /*
  1381. Bits for Socket_Msg
  1382. */
  1383. Socket_Msg_Bits :: enum {
  1384. OOB = 0,
  1385. PEEK = 1,
  1386. DONTROUTE = 2,
  1387. TRYHARD = DONTROUTE,
  1388. CTRUNC = 3,
  1389. PROXY = 4,
  1390. TRUNC = 5,
  1391. DONTWAIT = 6,
  1392. EOR = 7,
  1393. WAITALL = 8,
  1394. FIN = 9,
  1395. SYN = 10,
  1396. CONFIRM = 11,
  1397. RST = 12,
  1398. ERRQUEUE = 13,
  1399. NOSIGNAL = 14,
  1400. MORE = 15,
  1401. WAITFORONE = 16,
  1402. BATCH = 18,
  1403. ZEROCOPY = 22,
  1404. FASTOPEN = 29,
  1405. CMSG_CLOEXEC = 30,
  1406. }
  1407. /*
  1408. Argument to shutdown(2)
  1409. */
  1410. Shutdown_How :: enum i32 {
  1411. RD = 0,
  1412. WR = 1,
  1413. RDWR = 2,
  1414. }
  1415. /*
  1416. Second argument to futex(2) syscall
  1417. */
  1418. Futex_Op :: enum u32 {
  1419. WAIT = 0,
  1420. WAKE = 1,
  1421. FD = 2,
  1422. REQUEUE = 3,
  1423. CMP_REQUEUE = 4,
  1424. WAKE_OP = 5,
  1425. LOCK_PI = 6,
  1426. UNLOCK_PI = 7,
  1427. TRYLOCK_PI = 8,
  1428. WAIT_BITSET = 9,
  1429. WAKE_BITSET = 10,
  1430. WAIT_REQUEUE_PI = 11,
  1431. CMP_REQUEUE_PI = 12,
  1432. LOCK_PI2 = 13,
  1433. }
  1434. /*
  1435. Bits for Futex_Flags
  1436. */
  1437. Futex_Flags_Bits :: enum {
  1438. PRIVATE = 7,
  1439. REALTIME = 8,
  1440. }
  1441. /*
  1442. Kind of operation on futex, see FUTEX_WAKE_OP
  1443. */
  1444. Futex_Arg_Op :: enum {
  1445. SET = 0, /* uaddr2 = oparg */
  1446. ADD = 1, /* uaddr2 += oparg */
  1447. OR = 2, /* uaddr2 |= oparg */
  1448. ANDN = 3, /* uaddr2 &= ~oparg */
  1449. XOR = 4, /* uaddr2 ^= oparg */
  1450. PO2_SET = 0, /* uaddr2 = 1<<oparg */
  1451. PO2_ADD = 1, /* uaddr2 += 1<<oparg */
  1452. PO2_OR = 2, /* uaddr2 |= 1<<oparg */
  1453. PO2_ANDN = 3, /* uaddr2 &~= 1<<oparg */
  1454. PO2_XOR = 4, /* uaddr2 ^= 1<<oparg */
  1455. }
  1456. /*
  1457. Kind of comparison operation on futex, see FUTEX_WAKE_OP
  1458. */
  1459. Futex_Cmp_Op :: enum {
  1460. EQ = 0, /* if (oldval == cmparg) wake */
  1461. NE = 1, /* if (oldval != cmparg) wake */
  1462. LT = 2, /* if (oldval < cmparg) wake */
  1463. LE = 3, /* if (oldval <= cmparg) wake */
  1464. GT = 4, /* if (oldval > cmparg) wake */
  1465. GE = 5, /* if (oldval >= cmparg) wake */
  1466. }
  1467. /*
  1468. The kind of resource limits
  1469. */
  1470. RLimit_Kind :: enum i32 {
  1471. CPU = 0,
  1472. FSIZE = 1,
  1473. DATA = 2,
  1474. STACK = 3,
  1475. CORE = 4,
  1476. RSS = 5,
  1477. NOFILE = 7,
  1478. AS = 9,
  1479. NPROC = 6,
  1480. MEMLOCK = 8,
  1481. LOCKS = 10,
  1482. SIGPENDING = 11,
  1483. MSGQUEUE = 12,
  1484. NICE = 13,
  1485. RTPRIO = 14,
  1486. RTTIME = 15,
  1487. NLIMITS = 16,
  1488. }
  1489. /*
  1490. Represents the user of resources
  1491. */
  1492. RUsage_Who :: enum i32 {
  1493. CHILDREN = -1,
  1494. SELF = 0,
  1495. THREAD = 1,
  1496. LWP = THREAD,
  1497. }
  1498. /*
  1499. Bits for Personality_Flags
  1500. */
  1501. UNAME26 :: 17
  1502. ADDR_NO_RANDOMIZE :: 18
  1503. FDPIC_FUNCPTRS :: 19
  1504. MMAP_PAGE_ZERO :: 20
  1505. ADDR_COMPAT_LAYOUT :: 21
  1506. READ_IMPLIES_EXEC :: 22
  1507. ADDR_LIMIT_32BIT :: 23
  1508. SHORT_INODE :: 24
  1509. WHOLE_SECONDS :: 25
  1510. STICKY_TIMEOUTS :: 26
  1511. ADDR_LIMIT_3GB :: 27
  1512. /*
  1513. Personality type
  1514. These go into the bottom 8 bits of the personality value
  1515. */
  1516. PER_LINUX :: 0x0000
  1517. PER_LINUX_32BIT :: 0x0000 | ADDR_LIMIT_32BIT
  1518. PER_LINUX_FDPIC :: 0x0000 | FDPIC_FUNCPTRS
  1519. PER_SVR4 :: 0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO
  1520. PER_SVR3 :: 0x0002 | STICKY_TIMEOUTS | SHORT_INODE
  1521. PER_SCOSVR3 :: 0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS | SHORT_INODE
  1522. PER_OSR5 :: 0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS
  1523. PER_WYSEV386 :: 0x0004 | STICKY_TIMEOUTS | SHORT_INODE
  1524. PER_ISCR4 :: 0x0005 | STICKY_TIMEOUTS
  1525. PER_BSD :: 0x0006
  1526. PER_SUNOS :: 0x0006 | STICKY_TIMEOUTS
  1527. PER_XENIX :: 0x0007 | STICKY_TIMEOUTS | SHORT_INODE
  1528. PER_LINUX32 :: 0x0008
  1529. PER_LINUX32_3GB :: 0x0008 | ADDR_LIMIT_3GB
  1530. PER_IRIX32 :: 0x0009 | STICKY_TIMEOUTS
  1531. PER_IRIXN32 :: 0x000a | STICKY_TIMEOUTS
  1532. PER_IRIX64 :: 0x000b | STICKY_TIMEOUTS
  1533. PER_RISCOS :: 0x000c
  1534. PER_SOLARIS :: 0x000d | STICKY_TIMEOUTS
  1535. PER_UW7 :: 0x000e | STICKY_TIMEOUTS | MMAP_PAGE_ZERO
  1536. PER_OSF4 :: 0x000f
  1537. PER_HPUX :: 0x0010
  1538. PER_MASK :: 0x00ff
  1539. /*
  1540. Bits for access modes for shared memory
  1541. */
  1542. IPC_Mode_Bits :: enum {
  1543. WROTH = 1,
  1544. RDOTH = 2,
  1545. WRGRP = 4,
  1546. RDGRP = 5,
  1547. WRUSR = 7,
  1548. RDUSR = 8,
  1549. DEST = 9,
  1550. LOCKED = 10,
  1551. }
  1552. /*
  1553. Shared memory flags bits
  1554. */
  1555. IPC_Flags_Bits :: enum {
  1556. IPC_CREAT = 9,
  1557. IPC_EXCL = 10,
  1558. IPC_NOWAIT = 11,
  1559. // Semaphore
  1560. SEM_UNDO = 9,
  1561. // Shared memory
  1562. SHM_HUGETLB = 11,
  1563. SHM_NORESERVE = 12,
  1564. SHM_RDONLY = 12,
  1565. SHM_RND = 13,
  1566. SHM_REMAP = 14,
  1567. SHM_EXEC = 15,
  1568. // Message queue
  1569. MSG_NOERROR = 12,
  1570. MSG_EXCEPT = 13,
  1571. MSG_COPY = 14,
  1572. }
  1573. /*
  1574. IPC memory commands
  1575. */
  1576. IPC_Cmd :: enum i16 {
  1577. // IPC common
  1578. IPC_RMID = 0,
  1579. IPC_SET = 1,
  1580. IPC_STAT = 2,
  1581. // Shared memory
  1582. SHM_LOCK = 11,
  1583. SHM_UNLOCK = 12,
  1584. SHM_STAT = 13,
  1585. SHM_INFO = 14,
  1586. SHM_STAT_ANY = 15,
  1587. // Semaphore
  1588. GETPID = 11,
  1589. GETVAL = 12,
  1590. GETALL = 13,
  1591. GETNCNT = 14,
  1592. GETZCNT = 15,
  1593. SETVAL = 16,
  1594. SETALL = 17,
  1595. SEM_STAT = 18,
  1596. SEM_INFO = 19,
  1597. SEM_STAT_ANY = 20,
  1598. // Message queue
  1599. MSG_STAT = 11,
  1600. MSG_INFO = 12,
  1601. MSG_STAT_ANY = 13,
  1602. }
  1603. /*
  1604. File locking operation bits
  1605. */
  1606. FLock_Op_Bits :: enum {
  1607. SH = 1,
  1608. EX = 2,
  1609. NB = 4,
  1610. UN = 8,
  1611. }
  1612. /*
  1613. ptrace requests
  1614. */
  1615. PTrace_Request :: enum {
  1616. TRACEME = 0,
  1617. PEEKTEXT = 1,
  1618. PEEKDATA = 2,
  1619. PEEKUSER = 3,
  1620. POKETEXT = 4,
  1621. POKEDATA = 5,
  1622. POKEUSER = 6,
  1623. CONT = 7,
  1624. KILL = 8,
  1625. SINGLESTEP = 9,
  1626. GETREGS = 12,
  1627. SETREGS = 13,
  1628. GETFPREGS = 14,
  1629. SETFPREGS = 15,
  1630. ATTACH = 16,
  1631. DETACH = 17,
  1632. GETFPXREGS = 18,
  1633. SETFPXREGS = 19,
  1634. SYSCALL = 24,
  1635. GET_THREAD_AREA = 25,
  1636. SET_THREAD_AREA = 26,
  1637. ARCH_PRCTL = 30,
  1638. SYSEMU = 31,
  1639. SYSEMU_SINGLESTEP = 32,
  1640. SINGLEBLOCK = 33,
  1641. SETOPTIONS = 0x4200,
  1642. GETEVENTMSG = 0x4201,
  1643. GETSIGINFO = 0x4202,
  1644. SETSIGINFO = 0x4203,
  1645. GETREGSET = 0x4204,
  1646. SETREGSET = 0x4205,
  1647. SEIZE = 0x4206,
  1648. INTERRUPT = 0x4207,
  1649. LISTEN = 0x4208,
  1650. PEEKSIGINFO = 0x4209,
  1651. GETSIGMASK = 0x420a,
  1652. SETSIGMASK = 0x420b,
  1653. SECCOMP_GET_FILTER = 0x420c,
  1654. SECCOMP_GET_METADATA = 0x420d,
  1655. GET_SYSCALL_INFO = 0x420e,
  1656. GET_RSEQ_CONFIGURATION = 0x420f,
  1657. }
  1658. /*
  1659. ptrace options
  1660. */
  1661. PTrace_Options_Bits :: enum {
  1662. TRACESYSGOOD = 0,
  1663. TRACEFORK = 1,
  1664. TRACEVFORK = 2,
  1665. TRACECLONE = 3,
  1666. TRACEEXEC = 4,
  1667. TRACEVFORKDONE = 5,
  1668. TRACEEXIT = 6,
  1669. TRACESECCOMP = 7,
  1670. EXITKILL = 20,
  1671. SUSPEND_SECCOMP = 21,
  1672. }
  1673. /*
  1674. ptrace event codes.
  1675. */
  1676. PTrace_Event_Code :: enum {
  1677. EVENT_FORK = 1,
  1678. EVENT_VFORK = 2,
  1679. EVENT_CLONE = 3,
  1680. EVENT_EXEC = 4,
  1681. EVENT_VFORK_DONE = 5,
  1682. EVENT_EXIT = 6,
  1683. EVENT_SECCOMP = 7,
  1684. EVENT_STOP = 128,
  1685. }
  1686. /*
  1687. ptrace's get syscall info operation.
  1688. */
  1689. PTrace_Get_Syscall_Info_Op :: enum u8 {
  1690. NONE = 0,
  1691. ENTRY = 1,
  1692. EXIT = 2,
  1693. SECCOMP = 3,
  1694. }
  1695. /*
  1696. ptrace's PEEKSIGINFO flags bits
  1697. */
  1698. PTrace_Peek_Sig_Info_Flags_Bits :: enum {
  1699. SHARED = 0,
  1700. }
  1701. /*
  1702. Syslog actions.
  1703. */
  1704. Syslog_Action :: enum i32 {
  1705. CLOSE = 0,
  1706. OPEN = 1,
  1707. READ = 2,
  1708. READ_ALL = 3,
  1709. READ_CLEAR = 4,
  1710. CLEAR = 5,
  1711. CONSOLE_OFF = 6,
  1712. CONSOLE_ON = 7,
  1713. CONSOLE_LEVEL = 8,
  1714. SIZE_UNREAD = 9,
  1715. SIZE_BUFFER = 10,
  1716. }
  1717. /*
  1718. Bits for splice flags.
  1719. */
  1720. Splice_Flags_Bits :: enum {
  1721. MOVE = 0x01,
  1722. NONBLOCK = 0x02,
  1723. MORE = 0x04,
  1724. GIFT = 0x08,
  1725. }
  1726. /*
  1727. Clock IDs for various system clocks.
  1728. */
  1729. Clock_Id :: enum {
  1730. REALTIME = 0,
  1731. MONOTONIC = 1,
  1732. PROCESS_CPUTIME_ID = 2,
  1733. THREAD_CPUTIME_ID = 3,
  1734. MONOTONIC_RAW = 4,
  1735. REALTIME_COARSE = 5,
  1736. MONOTONIC_COARSE = 6,
  1737. BOOTTIME = 7,
  1738. REALTIME_ALARM = 8,
  1739. BOOTTIME_ALARM = 9,
  1740. }
  1741. /*
  1742. Bits for POSIX interval timer flags.
  1743. */
  1744. ITimer_Flags_Bits :: enum {
  1745. ABSTIME = 1,
  1746. }
  1747. /*
  1748. Bits for epoll_create(2) flags.
  1749. */
  1750. EPoll_Flags_Bits :: enum {
  1751. FDCLOEXEC = 19,
  1752. }
  1753. EPoll_Event_Kind :: enum u32 {
  1754. IN = log2(0x001),
  1755. PRI = log2(0x002),
  1756. OUT = log2(0x004),
  1757. RDNORM = log2(0x040),
  1758. RDBAND = log2(0x080),
  1759. WRNORM = log2(0x100),
  1760. WRBAND = log2(0x200),
  1761. MSG = log2(0x400),
  1762. ERR = log2(0x008),
  1763. HUP = log2(0x010),
  1764. RDHUP = log2(0x2000),
  1765. EXCLUSIVE = log2(1<<28),
  1766. WAKEUP = log2(1<<29),
  1767. ONESHOT = log2(1<<30),
  1768. ET = log2(1<<31),
  1769. }
  1770. EPoll_Event_Set :: bit_set[EPoll_Event_Kind; u32]
  1771. EPoll_Ctl_Opcode :: enum i32 {
  1772. ADD = 1,
  1773. DEL = 2,
  1774. MOD = 3,
  1775. }
  1776. /*
  1777. Bits for execveat(2) flags.
  1778. */
  1779. Execveat_Flags_Bits :: enum {
  1780. AT_SYMLINK_NOFOLLOW = 8,
  1781. AT_EMPTY_PATH = 12,
  1782. }
  1783. RISCV_HWProbe_Key :: enum i64 {
  1784. UNSUPPORTED = -1,
  1785. MVENDORID = 0,
  1786. MARCHID = 1,
  1787. MIMPID = 2,
  1788. BASE_BEHAVIOR = 3,
  1789. IMA_EXT_0 = 4,
  1790. // Deprecated, try `.MISALIGNED_SCALAR_PERF` first, if that is `.UNSUPPORTED`, use this.
  1791. CPUPERF_0 = 5,
  1792. ZICBOZ_BLOCK_SIZE = 6,
  1793. HIGHEST_VIRT_ADDRESS = 7,
  1794. TIME_CSR_FREQ = 8,
  1795. MISALIGNED_SCALAR_PERF = 9,
  1796. }
  1797. RISCV_HWProbe_Flags_Bits :: enum {
  1798. WHICH_CPUS,
  1799. }
  1800. RISCV_HWProbe_Base_Behavior_Bits :: enum {
  1801. IMA,
  1802. }
  1803. RISCV_HWProbe_IMA_Ext_0_Bits :: enum {
  1804. FD,
  1805. C,
  1806. V,
  1807. EXT_ZBA,
  1808. EXT_ZBB,
  1809. EXT_ZBS,
  1810. EXT_ZICBOZ,
  1811. EXT_ZBC,
  1812. EXT_ZBKB,
  1813. EXT_ZBKC,
  1814. EXT_ZBKX,
  1815. EXT_ZKND,
  1816. EXT_ZKNE,
  1817. EXT_ZKNH,
  1818. EXT_ZKSED,
  1819. EXT_ZKSH,
  1820. EXT_ZKT,
  1821. EXT_ZVBB,
  1822. EXT_ZVBC,
  1823. EXT_ZVKB,
  1824. EXT_ZVKG,
  1825. EXT_ZVKNED,
  1826. EXT_ZVKNHA,
  1827. EXT_ZVKNHB,
  1828. EXT_ZVKSED,
  1829. EXT_ZVKSH,
  1830. EXT_ZVKT,
  1831. EXT_ZFH,
  1832. EXT_ZFHMIN,
  1833. EXT_ZIHINTNTL,
  1834. EXT_ZVFH,
  1835. EXT_ZVFHMIN,
  1836. EXT_ZFA,
  1837. EXT_ZTSO,
  1838. EXT_ZACAS,
  1839. EXT_ZICOND,
  1840. EXT_ZIHINTPAUSE,
  1841. EXT_ZVE32X,
  1842. EXT_ZVE32F,
  1843. EXT_ZVE64X,
  1844. EXT_ZVE64F,
  1845. EXT_ZVE64D,
  1846. EXT_ZIMOP,
  1847. EXT_ZCA,
  1848. EXT_ZCB,
  1849. EXT_ZCD,
  1850. EXT_ZCF,
  1851. EXT_ZCMOP,
  1852. EXT_ZAWRS,
  1853. }
  1854. RISCV_HWProbe_Misaligned_Scalar_Perf :: enum {
  1855. UNKNOWN,
  1856. EMULATED,
  1857. SLOW,
  1858. FAST,
  1859. UNSUPPORTED,
  1860. }