@@ -41,6 +41,129 @@ pub type u_short = ::c_ushort;
4141// making the type definition system dependent. Better not bind it exactly.
4242pub type kvm_t = :: c_void ;
4343
44+ e ! {
45+ pub enum devstat_support_flags {
46+ DEVSTAT_ALL_SUPPORTED = 0x00 ,
47+ DEVSTAT_NO_BLOCKSIZE = 0x01 ,
48+ DEVSTAT_NO_ORDERED_TAGS = 0x02 ,
49+ DEVSTAT_BS_UNAVAILABLE = 0x04 ,
50+ }
51+
52+ pub enum devstat_trans_flags {
53+ DEVSTAT_NO_DATA = 0x00 ,
54+ DEVSTAT_READ = 0x01 ,
55+ DEVSTAT_WRITE = 0x02 ,
56+ DEVSTAT_FREE = 0x03 ,
57+ }
58+
59+ pub enum devstat_tag_type {
60+ DEVSTAT_TAG_SIMPLE = 0x00 ,
61+ DEVSTAT_TAG_HEAD = 0x01 ,
62+ DEVSTAT_TAG_ORDERED = 0x02 ,
63+ DEVSTAT_TAG_NONE = 0x03 ,
64+ }
65+
66+ pub enum devstat_match_flags {
67+ DEVSTAT_MATCH_NONE = 0x00 ,
68+ DEVSTAT_MATCH_TYPE = 0x01 ,
69+ DEVSTAT_MATCH_IF = 0x02 ,
70+ DEVSTAT_MATCH_PASS = 0x04 ,
71+ }
72+
73+ pub enum devstat_priority {
74+ DEVSTAT_PRIORITY_MIN = 0x000 ,
75+ DEVSTAT_PRIORITY_OTHER = 0x020 ,
76+ DEVSTAT_PRIORITY_PASS = 0x030 ,
77+ DEVSTAT_PRIORITY_FD = 0x040 ,
78+ DEVSTAT_PRIORITY_WFD = 0x050 ,
79+ DEVSTAT_PRIORITY_TAPE = 0x060 ,
80+ DEVSTAT_PRIORITY_CD = 0x090 ,
81+ DEVSTAT_PRIORITY_DISK = 0x110 ,
82+ DEVSTAT_PRIORITY_ARRAY = 0x120 ,
83+ DEVSTAT_PRIORITY_MAX = 0xfff ,
84+ }
85+
86+ pub enum devstat_type_flags {
87+ DEVSTAT_TYPE_DIRECT = 0x000 ,
88+ DEVSTAT_TYPE_SEQUENTIAL = 0x001 ,
89+ DEVSTAT_TYPE_PRINTER = 0x002 ,
90+ DEVSTAT_TYPE_PROCESSOR = 0x003 ,
91+ DEVSTAT_TYPE_WORM = 0x004 ,
92+ DEVSTAT_TYPE_CDROM = 0x005 ,
93+ DEVSTAT_TYPE_SCANNER = 0x006 ,
94+ DEVSTAT_TYPE_OPTICAL = 0x007 ,
95+ DEVSTAT_TYPE_CHANGER = 0x008 ,
96+ DEVSTAT_TYPE_COMM = 0x009 ,
97+ DEVSTAT_TYPE_ASC0 = 0x00a ,
98+ DEVSTAT_TYPE_ASC1 = 0x00b ,
99+ DEVSTAT_TYPE_STORARRAY = 0x00c ,
100+ DEVSTAT_TYPE_ENCLOSURE = 0x00d ,
101+ DEVSTAT_TYPE_FLOPPY = 0x00e ,
102+ DEVSTAT_TYPE_MASK = 0x00f ,
103+ DEVSTAT_TYPE_IF_SCSI = 0x010 ,
104+ DEVSTAT_TYPE_IF_IDE = 0x020 ,
105+ DEVSTAT_TYPE_IF_OTHER = 0x030 ,
106+ DEVSTAT_TYPE_IF_MASK = 0x0f0 ,
107+ DEVSTAT_TYPE_PASS = 0x100 ,
108+ }
109+
110+ pub enum devstat_metric {
111+ DSM_NONE ,
112+ DSM_TOTAL_BYTES ,
113+ DSM_TOTAL_BYTES_READ ,
114+ DSM_TOTAL_BYTES_WRITE ,
115+ DSM_TOTAL_TRANSFERS ,
116+ DSM_TOTAL_TRANSFERS_READ ,
117+ DSM_TOTAL_TRANSFERS_WRITE ,
118+ DSM_TOTAL_TRANSFERS_OTHER ,
119+ DSM_TOTAL_BLOCKS ,
120+ DSM_TOTAL_BLOCKS_READ ,
121+ DSM_TOTAL_BLOCKS_WRITE ,
122+ DSM_KB_PER_TRANSFER ,
123+ DSM_KB_PER_TRANSFER_READ ,
124+ DSM_KB_PER_TRANSFER_WRITE ,
125+ DSM_TRANSFERS_PER_SECOND ,
126+ DSM_TRANSFERS_PER_SECOND_READ ,
127+ DSM_TRANSFERS_PER_SECOND_WRITE ,
128+ DSM_TRANSFERS_PER_SECOND_OTHER ,
129+ DSM_MB_PER_SECOND ,
130+ DSM_MB_PER_SECOND_READ ,
131+ DSM_MB_PER_SECOND_WRITE ,
132+ DSM_BLOCKS_PER_SECOND ,
133+ DSM_BLOCKS_PER_SECOND_READ ,
134+ DSM_BLOCKS_PER_SECOND_WRITE ,
135+ DSM_MS_PER_TRANSACTION ,
136+ DSM_MS_PER_TRANSACTION_READ ,
137+ DSM_MS_PER_TRANSACTION_WRITE ,
138+ DSM_SKIP ,
139+ DSM_TOTAL_BYTES_FREE ,
140+ DSM_TOTAL_TRANSFERS_FREE ,
141+ DSM_TOTAL_BLOCKS_FREE ,
142+ DSM_KB_PER_TRANSFER_FREE ,
143+ DSM_MB_PER_SECOND_FREE ,
144+ DSM_TRANSFERS_PER_SECOND_FREE ,
145+ DSM_BLOCKS_PER_SECOND_FREE ,
146+ DSM_MS_PER_TRANSACTION_OTHER ,
147+ DSM_MS_PER_TRANSACTION_FREE ,
148+ DSM_BUSY_PCT ,
149+ DSM_QUEUE_LENGTH ,
150+ DSM_TOTAL_DURATION ,
151+ DSM_TOTAL_DURATION_READ ,
152+ DSM_TOTAL_DURATION_WRITE ,
153+ DSM_TOTAL_DURATION_FREE ,
154+ DSM_TOTAL_DURATION_OTHER ,
155+ DSM_TOTAL_BUSY_TIME ,
156+ DSM_MAX ,
157+ }
158+
159+ pub enum devstat_select_mode {
160+ DS_SELECT_ADD ,
161+ DS_SELECT_ONLY ,
162+ DS_SELECT_REMOVE ,
163+ DS_SELECT_ADDONLY ,
164+ }
165+ }
166+
44167s ! {
45168 pub struct aiocb {
46169 pub aio_fildes: :: c_int,
@@ -380,6 +503,97 @@ s! {
380503 pub rux_su: u64 ,
381504 pub rux_tu: u64 ,
382505 }
506+
507+ pub struct bintime {
508+ pub sec: :: time_t,
509+ pub frac: u64 ,
510+ }
511+
512+ pub struct clockinfo {
513+ /// clock frequency
514+ pub hz: :: c_int,
515+ /// micro-seconds per hz tick
516+ pub tick: :: c_int,
517+ pub spare: :: c_int,
518+ /// statistics clock frequency
519+ pub stathz: :: c_int,
520+ /// profiling clock frequency
521+ pub profhz: :: c_int,
522+ }
523+
524+ pub struct devstat {
525+ /// Update sequence
526+ pub sequence0: :: u_int,
527+ /// Allocated entry
528+ pub allocated: :: c_int,
529+ /// started ops
530+ pub start_count: :: u_int,
531+ /// completed ops
532+ pub end_count: :: u_int,
533+ /// busy time unaccounted for since this time
534+ pub busy_from: bintime,
535+ pub dev_links: * mut devstat,
536+ /// Devstat device number.
537+ pub device_number: u32 ,
538+ pub device_name: [ :: c_char; DEVSTAT_NAME_LEN as usize ] ,
539+ pub unit_number: :: c_int,
540+ pub bytes: [ u64 ; DEVSTAT_N_TRANS_FLAGS as usize ] ,
541+ pub operations: [ u64 ; DEVSTAT_N_TRANS_FLAGS as usize ] ,
542+ pub duration: [ bintime; DEVSTAT_N_TRANS_FLAGS as usize ] ,
543+ pub busy_time: bintime,
544+ /// Time the device was created.
545+ pub creation_time: bintime,
546+ /// Block size, bytes
547+ pub block_size: u32 ,
548+ /// The number of simple, ordered, and head of queue tags sent.
549+ pub tag_types: [ u64 ; 3 ] ,
550+ /// Which statistics are supported by a given device.
551+ pub flags: devstat_support_flags,
552+ /// Device type
553+ pub device_type: devstat_type_flags,
554+ /// Controls list pos.
555+ pub priority: devstat_priority,
556+ /// Identification for GEOM nodes
557+ pub id: * const :: c_void,
558+ /// Update sequence
559+ pub sequence1: :: u_int,
560+ }
561+
562+ pub struct devstat_match {
563+ pub match_fields: devstat_match_flags,
564+ pub device_type: devstat_type_flags,
565+ pub num_match_categories: :: c_int,
566+ }
567+
568+ pub struct devstat_match_table {
569+ pub match_str: * const :: c_char,
570+ pub type_: devstat_type_flags,
571+ pub match_field: devstat_match_flags,
572+ }
573+
574+ pub struct device_selection {
575+ pub device_number: u32 ,
576+ pub device_name: [ :: c_char; DEVSTAT_NAME_LEN as usize ] ,
577+ pub unit_number: :: c_int,
578+ pub selected: :: c_int,
579+ pub bytes: u64 ,
580+ pub position: :: c_int,
581+ }
582+
583+ pub struct devinfo {
584+ pub devices: * mut devstat,
585+ pub mem_ptr: * mut u8 ,
586+ pub generation: :: c_long,
587+ pub numdevs: :: c_int,
588+ }
589+
590+ pub struct statinfo {
591+ pub cp_time: [ :: c_long; CPUSTATES as usize ] ,
592+ pub tk_nin: :: c_long,
593+ pub tk_nout: :: c_long,
594+ pub dinfo: * mut devinfo,
595+ pub snap_time: :: c_double,
596+ }
383597}
384598
385599s_no_extra_traits ! {
@@ -722,6 +936,10 @@ cfg_if! {
722936 }
723937}
724938
939+ // sys/devicestat.h
940+ pub const DEVSTAT_N_TRANS_FLAGS : :: c_int = 4 ;
941+ pub const DEVSTAT_NAME_LEN : :: c_int = 16 ;
942+
725943pub const SIGEV_THREAD_ID : :: c_int = 4 ;
726944
727945pub const EXTATTR_NAMESPACE_EMPTY : :: c_int = 0 ;
@@ -2119,6 +2337,30 @@ pub const P2_ASLR_DISABLE: ::c_int = 0x00000080;
21192337pub const P2_ASLR_IGNSTART : :: c_int = 0x00000100 ;
21202338pub const P_TREE_GRPEXITED : :: c_int = 0x00000008 ;
21212339
2340+ // time.h
2341+
2342+ /// not on dst
2343+ pub const DST_NONE : :: c_int = 0 ;
2344+ /// USA style dst
2345+ pub const DST_USA : :: c_int = 1 ;
2346+ /// Australian style dst
2347+ pub const DST_AUST : :: c_int = 2 ;
2348+ /// Western European dst
2349+ pub const DST_WET : :: c_int = 3 ;
2350+ /// Middle European dst
2351+ pub const DST_MET : :: c_int = 4 ;
2352+ /// Eastern European dst
2353+ pub const DST_EET : :: c_int = 5 ;
2354+ /// Canada
2355+ pub const DST_CAN : :: c_int = 6 ;
2356+
2357+ pub const ITIMER_REAL : :: c_int = 0 ;
2358+ pub const ITIMER_VIRTUAL : :: c_int = 1 ;
2359+ pub const ITIMER_PROF : :: c_int = 2 ;
2360+
2361+ pub const CPUCLOCK_WHICH_PID : :: c_int = 0 ;
2362+ pub const CPUCLOCK_WHICH_TID : :: c_int = 1 ;
2363+
21222364const_fn ! {
21232365 { const } fn _ALIGN( p: usize ) -> usize {
21242366 ( p + _ALIGNBYTES) & !_ALIGNBYTES
@@ -2591,6 +2833,9 @@ extern "C" {
25912833 pub fn procctl ( idtype : :: idtype_t , id : :: id_t , cmd : :: c_int , data : * mut :: c_void ) -> :: c_int ;
25922834
25932835 pub fn getpagesize ( ) -> :: c_int ;
2836+
2837+ pub fn adjtime ( arg1 : * const :: timeval , arg2 : * mut :: timeval ) -> :: c_int ;
2838+ pub fn clock_getcpuclockid2 ( arg1 : :: id_t , arg2 : :: c_int , arg3 : clockid_t ) -> :: c_int ;
25942839}
25952840
25962841#[ link( name = "kvm" ) ]
@@ -2735,6 +2980,37 @@ extern "C" {
27352980 ) -> :: c_int ;
27362981}
27372982
2983+ #[ link( name = "devstat" ) ]
2984+ extern "C" {
2985+ pub fn devstat_getnumdevs ( kd : * mut kvm_t ) -> :: c_int ;
2986+ pub fn devstat_getgeneration ( kd : * mut kvm_t ) -> :: c_long ;
2987+ pub fn devstat_getversion ( kd : * mut kvm_t ) -> :: c_int ;
2988+ pub fn devstat_checkversion ( kd : * mut kvm_t ) -> :: c_int ;
2989+ pub fn devstat_getdevs ( kd : * mut kvm_t , stats : * mut statinfo ) -> :: c_int ;
2990+ pub fn devstat_selectdevs (
2991+ dev_select : * mut * mut device_selection ,
2992+ num_selected : * mut :: c_int ,
2993+ num_selections : * mut :: c_int ,
2994+ select_generation : * mut :: c_long ,
2995+ current_generation : :: c_long ,
2996+ devices : * mut devstat ,
2997+ numdevs : :: c_int ,
2998+ matches : * mut devstat_match ,
2999+ num_matches : :: c_int ,
3000+ dev_selections : * mut * mut :: c_char ,
3001+ num_dev_selections : :: c_int ,
3002+ select_mode : devstat_select_mode ,
3003+ maxshowdevs : :: c_int ,
3004+ perf_select : :: c_int ,
3005+ ) -> :: c_int ;
3006+ pub fn devstat_buildmatch (
3007+ match_str : * mut :: c_char ,
3008+ matches : * mut * mut devstat_match ,
3009+ num_matches : * mut :: c_int ,
3010+ ) -> :: c_int ;
3011+ pub fn devstat_compute_etime ( cur_time : * mut bintime , prev_time : * mut bintime ) -> :: c_double ;
3012+ }
3013+
27383014cfg_if ! {
27393015 if #[ cfg( freebsd14) ] {
27403016 mod freebsd14;
0 commit comments