@@ -41,6 +41,129 @@ pub type u_short = ::c_ushort;
41
41
// making the type definition system dependent. Better not bind it exactly.
42
42
pub type kvm_t = :: c_void ;
43
43
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
+
44
167
s ! {
45
168
pub struct aiocb {
46
169
pub aio_fildes: :: c_int,
@@ -380,6 +503,97 @@ s! {
380
503
pub rux_su: u64 ,
381
504
pub rux_tu: u64 ,
382
505
}
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
+ }
383
597
}
384
598
385
599
s_no_extra_traits ! {
@@ -722,6 +936,10 @@ cfg_if! {
722
936
}
723
937
}
724
938
939
+ // sys/devicestat.h
940
+ pub const DEVSTAT_N_TRANS_FLAGS : :: c_int = 4 ;
941
+ pub const DEVSTAT_NAME_LEN : :: c_int = 16 ;
942
+
725
943
pub const SIGEV_THREAD_ID : :: c_int = 4 ;
726
944
727
945
pub const EXTATTR_NAMESPACE_EMPTY : :: c_int = 0 ;
@@ -2119,6 +2337,26 @@ pub const P2_ASLR_DISABLE: ::c_int = 0x00000080;
2119
2337
pub const P2_ASLR_IGNSTART : :: c_int = 0x00000100 ;
2120
2338
pub const P_TREE_GRPEXITED : :: c_int = 0x00000008 ;
2121
2339
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 CPUCLOCK_WHICH_PID : :: c_int = 0 ;
2358
+ pub const CPUCLOCK_WHICH_TID : :: c_int = 1 ;
2359
+
2122
2360
const_fn ! {
2123
2361
{ const } fn _ALIGN( p: usize ) -> usize {
2124
2362
( p + _ALIGNBYTES) & !_ALIGNBYTES
@@ -2591,6 +2829,9 @@ extern "C" {
2591
2829
pub fn procctl ( idtype : :: idtype_t , id : :: id_t , cmd : :: c_int , data : * mut :: c_void ) -> :: c_int ;
2592
2830
2593
2831
pub fn getpagesize ( ) -> :: c_int ;
2832
+
2833
+ pub fn adjtime ( arg1 : * const :: timeval , arg2 : * mut :: timeval ) -> :: c_int ;
2834
+ pub fn clock_getcpuclockid2 ( arg1 : :: id_t , arg2 : :: c_int , arg3 : clockid_t ) -> :: c_int ;
2594
2835
}
2595
2836
2596
2837
#[ link( name = "kvm" ) ]
@@ -2735,6 +2976,37 @@ extern "C" {
2735
2976
) -> :: c_int ;
2736
2977
}
2737
2978
2979
+ #[ link( name = "devstat" ) ]
2980
+ extern "C" {
2981
+ pub fn devstat_getnumdevs ( kd : * mut kvm_t ) -> :: c_int ;
2982
+ pub fn devstat_getgeneration ( kd : * mut kvm_t ) -> :: c_long ;
2983
+ pub fn devstat_getversion ( kd : * mut kvm_t ) -> :: c_int ;
2984
+ pub fn devstat_checkversion ( kd : * mut kvm_t ) -> :: c_int ;
2985
+ pub fn devstat_getdevs ( kd : * mut kvm_t , stats : * mut statinfo ) -> :: c_int ;
2986
+ pub fn devstat_selectdevs (
2987
+ dev_select : * mut * mut device_selection ,
2988
+ num_selected : * mut :: c_int ,
2989
+ num_selections : * mut :: c_int ,
2990
+ select_generation : * mut :: c_long ,
2991
+ current_generation : :: c_long ,
2992
+ devices : * mut devstat ,
2993
+ numdevs : :: c_int ,
2994
+ matches : * mut devstat_match ,
2995
+ num_matches : :: c_int ,
2996
+ dev_selections : * mut * mut :: c_char ,
2997
+ num_dev_selections : :: c_int ,
2998
+ select_mode : devstat_select_mode ,
2999
+ maxshowdevs : :: c_int ,
3000
+ perf_select : :: c_int ,
3001
+ ) -> :: c_int ;
3002
+ pub fn devstat_buildmatch (
3003
+ match_str : * mut :: c_char ,
3004
+ matches : * mut * mut devstat_match ,
3005
+ num_matches : * mut :: c_int ,
3006
+ ) -> :: c_int ;
3007
+ pub fn devstat_compute_etime ( cur_time : * mut bintime , prev_time : * mut bintime ) -> :: c_double ;
3008
+ }
3009
+
2738
3010
cfg_if ! {
2739
3011
if #[ cfg( freebsd14) ] {
2740
3012
mod freebsd14;
0 commit comments