1 // APIs in FreeBSD 13 that have changed since 11.
2 
3 pub type nlink_t = u64;
4 pub type dev_t = u64;
5 pub type ino_t = ::c_ulong;
6 pub type shmatt_t = ::c_uint;
7 pub type kpaddr_t = u64;
8 pub type kssize_t = i64;
9 pub type domainset_t = __c_anonymous_domainset;
10 
11 s! {
12     pub struct shmid_ds {
13         pub shm_perm: ::ipc_perm,
14         pub shm_segsz: ::size_t,
15         pub shm_lpid: ::pid_t,
16         pub shm_cpid: ::pid_t,
17         pub shm_nattch: ::shmatt_t,
18         pub shm_atime: ::time_t,
19         pub shm_dtime: ::time_t,
20         pub shm_ctime: ::time_t,
21     }
22 
23     pub struct kevent {
24         pub ident: ::uintptr_t,
25         pub filter: ::c_short,
26         pub flags: ::c_ushort,
27         pub fflags: ::c_uint,
28         pub data: ::intptr_t,
29         pub udata: *mut ::c_void,
30         pub ext: [u64; 4],
31     }
32 
33     pub struct sockcred2 {
34         pub sc_version: ::c_int,
35         pub sc_pid: ::pid_t,
36         pub sc_uid: ::uid_t,
37         pub sc_euid: ::uid_t,
38         pub sc_gid: ::gid_t,
39         pub sc_egid: ::gid_t,
40         pub sc_ngroups: ::c_int,
41         pub sc_groups: [::gid_t; 1],
42     }
43 
44     pub struct kvm_page {
45         pub kp_version: ::u_int,
46         pub kp_paddr: ::kpaddr_t,
47         pub kp_kmap_vaddr: ::kvaddr_t,
48         pub kp_dmap_vaddr: ::kvaddr_t,
49         pub kp_prot: ::vm_prot_t,
50         pub kp_offset: ::off_t,
51         pub kp_len: ::size_t,
52     }
53 
54     pub struct __c_anonymous_domainset {
55         _priv: [::uintptr_t; 4],
56     }
57 
58     pub struct kinfo_proc {
59         /// Size of this structure.
60         pub ki_structsize: ::c_int,
61         /// Reserved: layout identifier.
62         pub ki_layout: ::c_int,
63         /// Address of command arguments.
64         pub ki_args: *mut ::pargs,
65         // This is normally "struct proc".
66         /// Address of proc.
67         pub ki_paddr: *mut ::c_void,
68         // This is normally "struct user".
69         /// Kernel virtual address of u-area.
70         pub ki_addr: *mut ::c_void,
71         // This is normally "struct vnode".
72         /// Pointer to trace file.
73         pub ki_tracep: *mut ::c_void,
74         // This is normally "struct vnode".
75         /// Pointer to executable file.
76         pub ki_textvp: *mut ::c_void,
77         // This is normally "struct filedesc".
78         /// Pointer to open file info.
79         pub ki_fd: *mut ::c_void,
80         // This is normally "struct vmspace".
81         /// Pointer to kernel vmspace struct.
82         pub ki_vmspace: *mut ::c_void,
83         /// Sleep address.
84         pub ki_wchan: *const ::c_void,
85         /// Process identifier.
86         pub ki_pid: ::pid_t,
87         /// Parent process ID.
88         pub ki_ppid: ::pid_t,
89         /// Process group ID.
90         pub ki_pgid: ::pid_t,
91         /// tty process group ID.
92         pub ki_tpgid: ::pid_t,
93         /// Process session ID.
94         pub ki_sid: ::pid_t,
95         /// Terminal session ID.
96         pub ki_tsid: ::pid_t,
97         /// Job control counter.
98         pub ki_jobc: ::c_short,
99         /// Unused (just here for alignment).
100         pub ki_spare_short1: ::c_short,
101         /// Controlling tty dev.
102         pub ki_tdev_freebsd11: u32,
103         /// Signals arrived but not delivered.
104         pub ki_siglist: ::sigset_t,
105         /// Current signal mask.
106         pub ki_sigmask: ::sigset_t,
107         /// Signals being ignored.
108         pub ki_sigignore: ::sigset_t,
109         /// Signals being caught by user.
110         pub ki_sigcatch: ::sigset_t,
111         /// Effective user ID.
112         pub ki_uid: ::uid_t,
113         /// Real user ID.
114         pub ki_ruid: ::uid_t,
115         /// Saved effective user ID.
116         pub ki_svuid: ::uid_t,
117         /// Real group ID.
118         pub ki_rgid: ::gid_t,
119         /// Saved effective group ID.
120         pub ki_svgid: ::gid_t,
121         /// Number of groups.
122         pub ki_ngroups: ::c_short,
123         /// Unused (just here for alignment).
124         pub ki_spare_short2: ::c_short,
125         /// Groups.
126         pub ki_groups: [::gid_t; ::KI_NGROUPS],
127         /// Virtual size.
128         pub ki_size: ::vm_size_t,
129         /// Current resident set size in pages.
130         pub ki_rssize: ::segsz_t,
131         /// Resident set size before last swap.
132         pub ki_swrss: ::segsz_t,
133         /// Text size (pages) XXX.
134         pub ki_tsize: ::segsz_t,
135         /// Data size (pages) XXX.
136         pub ki_dsize: ::segsz_t,
137         /// Stack size (pages).
138         pub ki_ssize: ::segsz_t,
139         /// Exit status for wait & stop signal.
140         pub ki_xstat: ::u_short,
141         /// Accounting flags.
142         pub ki_acflag: ::u_short,
143         /// %cpu for process during `ki_swtime`.
144         pub ki_pctcpu: ::fixpt_t,
145         /// Time averaged value of `ki_cpticks`.
146         pub ki_estcpu: ::u_int,
147         /// Time since last blocked.
148         pub ki_slptime: ::u_int,
149         /// Time swapped in or out.
150         pub ki_swtime: ::u_int,
151         /// Number of copy-on-write faults.
152         pub ki_cow: ::u_int,
153         /// Real time in microsec.
154         pub ki_runtime: u64,
155         /// Starting time.
156         pub ki_start: ::timeval,
157         /// Time used by process children.
158         pub ki_childtime: ::timeval,
159         /// P_* flags.
160         pub ki_flag: ::c_long,
161         /// KI_* flags (below).
162         pub ki_kiflag: ::c_long,
163         /// Kernel trace points.
164         pub ki_traceflag: ::c_int,
165         /// S* process status.
166         pub ki_stat: ::c_char,
167         /// Process "nice" value.
168         pub ki_nice: i8, // signed char
169         /// Process lock (prevent swap) count.
170         pub ki_lock: ::c_char,
171         /// Run queue index.
172         pub ki_rqindex: ::c_char,
173         /// Which cpu we are on.
174         pub ki_oncpu_old: ::c_uchar,
175         /// Last cpu we were on.
176         pub ki_lastcpu_old: ::c_uchar,
177         /// Thread name.
178         pub ki_tdname: [::c_char; ::TDNAMLEN + 1],
179         /// Wchan message.
180         pub ki_wmesg: [::c_char; ::WMESGLEN + 1],
181         /// Setlogin name.
182         pub ki_login: [::c_char; ::LOGNAMELEN + 1],
183         /// Lock name.
184         pub ki_lockname: [::c_char; ::LOCKNAMELEN + 1],
185         /// Command name.
186         pub ki_comm: [::c_char; ::COMMLEN + 1],
187         /// Emulation name.
188         pub ki_emul: [::c_char; ::KI_EMULNAMELEN + 1],
189         /// Login class.
190         pub ki_loginclass: [::c_char; ::LOGINCLASSLEN + 1],
191         /// More thread name.
192         pub ki_moretdname: [::c_char; ::MAXCOMLEN - ::TDNAMLEN + 1],
193         /// Spare string space.
194         pub ki_sparestrings: [[::c_char; 23]; 2], // little hack to allow PartialEq
195         /// Spare room for growth.
196         pub ki_spareints: [::c_int; ::KI_NSPARE_INT],
197         /// Controlling tty dev.
198         pub ki_tdev: u64,
199         /// Which cpu we are on.
200         pub ki_oncpu: ::c_int,
201         /// Last cpu we were on.
202         pub ki_lastcpu: ::c_int,
203         /// PID of tracing process.
204         pub ki_tracer: ::c_int,
205         /// P2_* flags.
206         pub ki_flag2: ::c_int,
207         /// Default FIB number.
208         pub ki_fibnum: ::c_int,
209         /// Credential flags.
210         pub ki_cr_flags: ::u_int,
211         /// Process jail ID.
212         pub ki_jid: ::c_int,
213         /// Number of threads in total.
214         pub ki_numthreads: ::c_int,
215         /// Thread ID.
216         pub ki_tid: ::lwpid_t,
217         /// Process priority.
218         pub ki_pri: ::priority,
219         /// Process rusage statistics.
220         pub ki_rusage: ::rusage,
221         /// rusage of children processes.
222         pub ki_rusage_ch: ::rusage,
223         // This is normally "struct pcb".
224         /// Kernel virtual addr of pcb.
225         pub ki_pcb: *mut ::c_void,
226         /// Kernel virtual addr of stack.
227         pub ki_kstack: *mut ::c_void,
228         /// User convenience pointer.
229         pub ki_udata: *mut ::c_void,
230         // This is normally "struct thread".
231         pub ki_tdaddr: *mut ::c_void,
232         // This is normally "struct pwddesc".
233         /// Pointer to process paths info.
234         pub ki_pd: *mut ::c_void,
235         pub ki_spareptrs: [*mut ::c_void; ::KI_NSPARE_PTR],
236         pub ki_sparelongs: [::c_long; ::KI_NSPARE_LONG],
237         /// PS_* flags.
238         pub ki_sflag: ::c_long,
239         /// kthread flag.
240         pub ki_tdflags: ::c_long,
241     }
242 }
243 
244 s_no_extra_traits! {
245     pub struct dirent {
246         pub d_fileno: ::ino_t,
247         pub d_off: ::off_t,
248         pub d_reclen: u16,
249         pub d_type: u8,
250         d_pad0: u8,
251         pub d_namlen: u16,
252         d_pad1: u16,
253         pub d_name: [::c_char; 256],
254     }
255 
256     pub struct statfs {
257         pub f_version: u32,
258         pub f_type: u32,
259         pub f_flags: u64,
260         pub f_bsize: u64,
261         pub f_iosize: u64,
262         pub f_blocks: u64,
263         pub f_bfree: u64,
264         pub f_bavail: i64,
265         pub f_files: u64,
266         pub f_ffree: i64,
267         pub f_syncwrites: u64,
268         pub f_asyncwrites: u64,
269         pub f_syncreads: u64,
270         pub f_asyncreads: u64,
271         f_spare: [u64; 10],
272         pub f_namemax: u32,
273         pub f_owner: ::uid_t,
274         pub f_fsid: ::fsid_t,
275         f_charspare: [::c_char; 80],
276         pub f_fstypename: [::c_char; 16],
277         pub f_mntfromname: [::c_char; 1024],
278         pub f_mntonname: [::c_char; 1024],
279     }
280 
281     pub struct vnstat {
282         pub vn_fileid: u64,
283         pub vn_size: u64,
284         pub vn_dev: u64,
285         pub vn_fsid: u64,
286         pub vn_mntdir: *mut ::c_char,
287         pub vn_type: ::c_int,
288         pub vn_mode: u16,
289         pub vn_devname: [::c_char; ::SPECNAMELEN as usize + 1],
290     }
291 }
292 
293 cfg_if! {
294     if #[cfg(feature = "extra_traits")] {
295         impl PartialEq for statfs {
296             fn eq(&self, other: &statfs) -> bool {
297                 self.f_version == other.f_version
298                     && self.f_type == other.f_type
299                     && self.f_flags == other.f_flags
300                     && self.f_bsize == other.f_bsize
301                     && self.f_iosize == other.f_iosize
302                     && self.f_blocks == other.f_blocks
303                     && self.f_bfree == other.f_bfree
304                     && self.f_bavail == other.f_bavail
305                     && self.f_files == other.f_files
306                     && self.f_ffree == other.f_ffree
307                     && self.f_syncwrites == other.f_syncwrites
308                     && self.f_asyncwrites == other.f_asyncwrites
309                     && self.f_syncreads == other.f_syncreads
310                     && self.f_asyncreads == other.f_asyncreads
311                     && self.f_namemax == other.f_namemax
312                     && self.f_owner == other.f_owner
313                     && self.f_fsid == other.f_fsid
314                     && self.f_fstypename == other.f_fstypename
315                     && self
316                     .f_mntfromname
317                     .iter()
318                     .zip(other.f_mntfromname.iter())
319                     .all(|(a,b)| a == b)
320                     && self
321                     .f_mntonname
322                     .iter()
323                     .zip(other.f_mntonname.iter())
324                     .all(|(a,b)| a == b)
325             }
326         }
327         impl Eq for statfs {}
328         impl ::fmt::Debug for statfs {
329             fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
330                 f.debug_struct("statfs")
331                     .field("f_bsize", &self.f_bsize)
332                     .field("f_iosize", &self.f_iosize)
333                     .field("f_blocks", &self.f_blocks)
334                     .field("f_bfree", &self.f_bfree)
335                     .field("f_bavail", &self.f_bavail)
336                     .field("f_files", &self.f_files)
337                     .field("f_ffree", &self.f_ffree)
338                     .field("f_syncwrites", &self.f_syncwrites)
339                     .field("f_asyncwrites", &self.f_asyncwrites)
340                     .field("f_syncreads", &self.f_syncreads)
341                     .field("f_asyncreads", &self.f_asyncreads)
342                     .field("f_namemax", &self.f_namemax)
343                     .field("f_owner", &self.f_owner)
344                     .field("f_fsid", &self.f_fsid)
345                     .field("f_fstypename", &self.f_fstypename)
346                     .field("f_mntfromname", &&self.f_mntfromname[..])
347                     .field("f_mntonname", &&self.f_mntonname[..])
348                     .finish()
349             }
350         }
351         impl ::hash::Hash for statfs {
352             fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
353                 self.f_version.hash(state);
354                 self.f_type.hash(state);
355                 self.f_flags.hash(state);
356                 self.f_bsize.hash(state);
357                 self.f_iosize.hash(state);
358                 self.f_blocks.hash(state);
359                 self.f_bfree.hash(state);
360                 self.f_bavail.hash(state);
361                 self.f_files.hash(state);
362                 self.f_ffree.hash(state);
363                 self.f_syncwrites.hash(state);
364                 self.f_asyncwrites.hash(state);
365                 self.f_syncreads.hash(state);
366                 self.f_asyncreads.hash(state);
367                 self.f_namemax.hash(state);
368                 self.f_owner.hash(state);
369                 self.f_fsid.hash(state);
370                 self.f_charspare.hash(state);
371                 self.f_fstypename.hash(state);
372                 self.f_mntfromname.hash(state);
373                 self.f_mntonname.hash(state);
374             }
375         }
376 
377         impl PartialEq for dirent {
378             fn eq(&self, other: &dirent) -> bool {
379                 self.d_fileno == other.d_fileno
380                     && self.d_off == other.d_off
381                     && self.d_reclen == other.d_reclen
382                     && self.d_type == other.d_type
383                     && self.d_namlen == other.d_namlen
384                     && self
385                     .d_name[..self.d_namlen as _]
386                     .iter()
387                     .zip(other.d_name.iter())
388                     .all(|(a,b)| a == b)
389             }
390         }
391         impl Eq for dirent {}
392         impl ::fmt::Debug for dirent {
393             fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
394                 f.debug_struct("dirent")
395                     .field("d_fileno", &self.d_fileno)
396                     .field("d_off", &self.d_off)
397                     .field("d_reclen", &self.d_reclen)
398                     .field("d_type", &self.d_type)
399                     .field("d_namlen", &self.d_namlen)
400                     .field("d_name", &&self.d_name[..self.d_namlen as _])
401                     .finish()
402             }
403         }
404         impl ::hash::Hash for dirent {
405             fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
406                 self.d_fileno.hash(state);
407                 self.d_off.hash(state);
408                 self.d_reclen.hash(state);
409                 self.d_type.hash(state);
410                 self.d_namlen.hash(state);
411                 self.d_name[..self.d_namlen as _].hash(state);
412             }
413         }
414 
415         impl PartialEq for vnstat {
416             fn eq(&self, other: &vnstat) -> bool {
417                 let self_vn_devname: &[::c_char] = &self.vn_devname;
418                 let other_vn_devname: &[::c_char] = &other.vn_devname;
419 
420                 self.vn_fileid == other.vn_fileid &&
421                 self.vn_size == other.vn_size &&
422                 self.vn_dev == other.vn_dev &&
423                 self.vn_fsid == other.vn_fsid &&
424                 self.vn_mntdir == other.vn_mntdir &&
425                 self.vn_type == other.vn_type &&
426                 self.vn_mode == other.vn_mode &&
427                 self_vn_devname == other_vn_devname
428             }
429         }
430         impl Eq for vnstat {}
431         impl ::fmt::Debug for vnstat {
432             fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
433                 let self_vn_devname: &[::c_char] = &self.vn_devname;
434 
435                 f.debug_struct("vnstat")
436                     .field("vn_fileid", &self.vn_fileid)
437                     .field("vn_size", &self.vn_size)
438                     .field("vn_dev", &self.vn_dev)
439                     .field("vn_fsid", &self.vn_fsid)
440                     .field("vn_mntdir", &self.vn_mntdir)
441                     .field("vn_type", &self.vn_type)
442                     .field("vn_mode", &self.vn_mode)
443                     .field("vn_devname", &self_vn_devname)
444                     .finish()
445             }
446         }
447         impl ::hash::Hash for vnstat {
448             fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
449                 let self_vn_devname: &[::c_char] = &self.vn_devname;
450 
451                 self.vn_fileid.hash(state);
452                 self.vn_size.hash(state);
453                 self.vn_dev.hash(state);
454                 self.vn_fsid.hash(state);
455                 self.vn_mntdir.hash(state);
456                 self.vn_type.hash(state);
457                 self.vn_mode.hash(state);
458                 self_vn_devname.hash(state);
459             }
460         }
461     }
462 }
463 
464 pub const RAND_MAX: ::c_int = 0x7fff_ffff;
465 pub const ELAST: ::c_int = 97;
466 
467 pub const KF_TYPE_EVENTFD: ::c_int = 13;
468 
469 /// max length of devicename
470 pub const SPECNAMELEN: ::c_int = 255;
471 pub const KI_NSPARE_PTR: usize = 5;
472 
473 /// domainset policies
474 pub const DOMAINSET_POLICY_INVALID: ::c_int = 0;
475 pub const DOMAINSET_POLICY_ROUNDROBIN: ::c_int = 1;
476 pub const DOMAINSET_POLICY_FIRSTTOUCH: ::c_int = 2;
477 pub const DOMAINSET_POLICY_PREFER: ::c_int = 3;
478 pub const DOMAINSET_POLICY_INTERLEAVE: ::c_int = 4;
479 
480 pub const MINCORE_SUPER: ::c_int = 0x60;
481 
482 f! {
483     pub fn SOCKCRED2SIZE(ngrps: usize) -> usize {
484         let ngrps = if ngrps > 0 {
485             ngrps - 1
486         } else {
487             0
488         };
489         ::mem::size_of::<sockcred2>() + ::mem::size_of::<::gid_t>() * ngrps
490     }
491 }
492 
493 extern "C" {
aio_readv(aiocbp: *mut ::aiocb) -> ::c_int494     pub fn aio_readv(aiocbp: *mut ::aiocb) -> ::c_int;
aio_writev(aiocbp: *mut ::aiocb) -> ::c_int495     pub fn aio_writev(aiocbp: *mut ::aiocb) -> ::c_int;
setgrent()496     pub fn setgrent();
mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int497     pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int;
freelocale(loc: ::locale_t)498     pub fn freelocale(loc: ::locale_t);
msgrcv( msqid: ::c_int, msgp: *mut ::c_void, msgsz: ::size_t, msgtyp: ::c_long, msgflg: ::c_int, ) -> ::ssize_t499     pub fn msgrcv(
500         msqid: ::c_int,
501         msgp: *mut ::c_void,
502         msgsz: ::size_t,
503         msgtyp: ::c_long,
504         msgflg: ::c_int,
505     ) -> ::ssize_t;
clock_nanosleep( clk_id: ::clockid_t, flags: ::c_int, rqtp: *const ::timespec, rmtp: *mut ::timespec, ) -> ::c_int506     pub fn clock_nanosleep(
507         clk_id: ::clockid_t,
508         flags: ::c_int,
509         rqtp: *const ::timespec,
510         rmtp: *mut ::timespec,
511     ) -> ::c_int;
512 
eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int513     pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int;
514 
fdatasync(fd: ::c_int) -> ::c_int515     pub fn fdatasync(fd: ::c_int) -> ::c_int;
516 
getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t517     pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t;
getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int518     pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int;
elf_aux_info(aux: ::c_int, buf: *mut ::c_void, buflen: ::c_int) -> ::c_int519     pub fn elf_aux_info(aux: ::c_int, buf: *mut ::c_void, buflen: ::c_int) -> ::c_int;
setproctitle_fast(fmt: *const ::c_char, ...)520     pub fn setproctitle_fast(fmt: *const ::c_char, ...);
timingsafe_bcmp(a: *const ::c_void, b: *const ::c_void, len: ::size_t) -> ::c_int521     pub fn timingsafe_bcmp(a: *const ::c_void, b: *const ::c_void, len: ::size_t) -> ::c_int;
timingsafe_memcmp(a: *const ::c_void, b: *const ::c_void, len: ::size_t) -> ::c_int522     pub fn timingsafe_memcmp(a: *const ::c_void, b: *const ::c_void, len: ::size_t) -> ::c_int;
523 
cpuset_getdomain( level: ::cpulevel_t, which: ::cpuwhich_t, id: ::id_t, setsize: ::size_t, mask: *mut ::domainset_t, policy: *mut ::c_int, ) -> ::c_int524     pub fn cpuset_getdomain(
525         level: ::cpulevel_t,
526         which: ::cpuwhich_t,
527         id: ::id_t,
528         setsize: ::size_t,
529         mask: *mut ::domainset_t,
530         policy: *mut ::c_int,
531     ) -> ::c_int;
cpuset_setdomain( level: ::cpulevel_t, which: ::cpuwhich_t, id: ::id_t, setsize: ::size_t, mask: *const ::domainset_t, policy: ::c_int, ) -> ::c_int532     pub fn cpuset_setdomain(
533         level: ::cpulevel_t,
534         which: ::cpuwhich_t,
535         id: ::id_t,
536         setsize: ::size_t,
537         mask: *const ::domainset_t,
538         policy: ::c_int,
539     ) -> ::c_int;
540 
copy_file_range( infd: ::c_int, inoffp: *mut ::off_t, outfd: ::c_int, outoffp: *mut ::off_t, len: ::size_t, flags: ::c_uint, ) -> ::ssize_t541     pub fn copy_file_range(
542         infd: ::c_int,
543         inoffp: *mut ::off_t,
544         outfd: ::c_int,
545         outoffp: *mut ::off_t,
546         len: ::size_t,
547         flags: ::c_uint,
548     ) -> ::ssize_t;
549 }
550 
551 #[link(name = "kvm")]
552 extern "C" {
kvm_kerndisp(kd: *mut ::kvm_t) -> ::kssize_t553     pub fn kvm_kerndisp(kd: *mut ::kvm_t) -> ::kssize_t;
554 }
555 
556 cfg_if! {
557     if #[cfg(any(target_arch = "x86_64",
558                  target_arch = "aarch64",
559                  target_arch = "riscv64"))] {
560         mod b64;
561         pub use self::b64::*;
562     }
563 }
564 
565 cfg_if! {
566     if #[cfg(target_arch = "x86_64")] {
567         mod x86_64;
568         pub use self::x86_64::*;
569     }
570 }
571