Skip to content

Commit 6fecb44

Browse files
committed
vmclock: add vmclock ABI Rust bindings
Add bindings for vmclock ABI from Linux 6.13, also add the logic in tools/bindgen.sh to automate the process. Signed-off-by: Babis Chalios <bchalios@amazon.es>
1 parent a86844e commit 6fecb44

File tree

5 files changed

+301
-0
lines changed

5 files changed

+301
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#![allow(clippy::all)]
5+
#![allow(non_upper_case_globals)]
6+
#![allow(non_camel_case_types)]
7+
#![allow(non_snake_case)]
8+
9+
pub mod vmclock_abi;
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
// automatically generated by tools/bindgen.sh
5+
6+
#![allow(
7+
non_camel_case_types,
8+
non_upper_case_globals,
9+
dead_code,
10+
non_snake_case,
11+
clippy::ptr_as_ptr,
12+
clippy::undocumented_unsafe_blocks,
13+
missing_debug_implementations,
14+
clippy::tests_outside_test_module,
15+
unsafe_op_in_unsafe_fn,
16+
clippy::redundant_static_lifetimes
17+
)]
18+
19+
use serde::{Deserialize, Serialize};
20+
21+
pub const __BITS_PER_LONG: u32 = 64;
22+
pub const __BITS_PER_LONG_LONG: u32 = 64;
23+
pub const __FD_SETSIZE: u32 = 1024;
24+
pub const VMCLOCK_MAGIC: u32 = 1263289174;
25+
pub const VMCLOCK_COUNTER_ARM_VCNT: u8 = 0;
26+
pub const VMCLOCK_COUNTER_X86_TSC: u8 = 1;
27+
pub const VMCLOCK_COUNTER_INVALID: u8 = 255;
28+
pub const VMCLOCK_TIME_UTC: u8 = 0;
29+
pub const VMCLOCK_TIME_TAI: u8 = 1;
30+
pub const VMCLOCK_TIME_MONOTONIC: u8 = 2;
31+
pub const VMCLOCK_TIME_INVALID_SMEARED: u8 = 3;
32+
pub const VMCLOCK_TIME_INVALID_MAYBE_SMEARED: u8 = 4;
33+
pub const VMCLOCK_FLAG_TAI_OFFSET_VALID: u64 = 1;
34+
pub const VMCLOCK_FLAG_DISRUPTION_SOON: u64 = 2;
35+
pub const VMCLOCK_FLAG_DISRUPTION_IMMINENT: u64 = 4;
36+
pub const VMCLOCK_FLAG_PERIOD_ESTERROR_VALID: u64 = 8;
37+
pub const VMCLOCK_FLAG_PERIOD_MAXERROR_VALID: u64 = 16;
38+
pub const VMCLOCK_FLAG_TIME_ESTERROR_VALID: u64 = 32;
39+
pub const VMCLOCK_FLAG_TIME_MAXERROR_VALID: u64 = 64;
40+
pub const VMCLOCK_FLAG_TIME_MONOTONIC: u64 = 128;
41+
pub const VMCLOCK_STATUS_UNKNOWN: u8 = 0;
42+
pub const VMCLOCK_STATUS_INITIALIZING: u8 = 1;
43+
pub const VMCLOCK_STATUS_SYNCHRONIZED: u8 = 2;
44+
pub const VMCLOCK_STATUS_FREERUNNING: u8 = 3;
45+
pub const VMCLOCK_STATUS_UNRELIABLE: u8 = 4;
46+
pub const VMCLOCK_SMEARING_STRICT: u8 = 0;
47+
pub const VMCLOCK_SMEARING_NOON_LINEAR: u8 = 1;
48+
pub const VMCLOCK_SMEARING_UTC_SLS: u8 = 2;
49+
pub const VMCLOCK_LEAP_NONE: u8 = 0;
50+
pub const VMCLOCK_LEAP_PRE_POS: u8 = 1;
51+
pub const VMCLOCK_LEAP_PRE_NEG: u8 = 2;
52+
pub const VMCLOCK_LEAP_POS: u8 = 3;
53+
pub const VMCLOCK_LEAP_POST_POS: u8 = 4;
54+
pub const VMCLOCK_LEAP_POST_NEG: u8 = 5;
55+
pub type __s8 = ::std::os::raw::c_schar;
56+
pub type __u8 = ::std::os::raw::c_uchar;
57+
pub type __s16 = ::std::os::raw::c_short;
58+
pub type __u16 = ::std::os::raw::c_ushort;
59+
pub type __s32 = ::std::os::raw::c_int;
60+
pub type __u32 = ::std::os::raw::c_uint;
61+
pub type __s64 = ::std::os::raw::c_longlong;
62+
pub type __u64 = ::std::os::raw::c_ulonglong;
63+
#[repr(C)]
64+
#[derive(Debug, Default, Copy, Clone, PartialEq)]
65+
pub struct __kernel_fd_set {
66+
pub fds_bits: [::std::os::raw::c_ulong; 16usize],
67+
}
68+
#[allow(clippy::unnecessary_operation, clippy::identity_op)]
69+
const _: () = {
70+
["Size of __kernel_fd_set"][::std::mem::size_of::<__kernel_fd_set>() - 128usize];
71+
["Alignment of __kernel_fd_set"][::std::mem::align_of::<__kernel_fd_set>() - 8usize];
72+
["Offset of field: __kernel_fd_set::fds_bits"]
73+
[::std::mem::offset_of!(__kernel_fd_set, fds_bits) - 0usize];
74+
};
75+
pub type __kernel_sighandler_t =
76+
::std::option::Option<unsafe extern "C" fn(arg1: ::std::os::raw::c_int)>;
77+
pub type __kernel_key_t = ::std::os::raw::c_int;
78+
pub type __kernel_mqd_t = ::std::os::raw::c_int;
79+
pub type __kernel_old_uid_t = ::std::os::raw::c_ushort;
80+
pub type __kernel_old_gid_t = ::std::os::raw::c_ushort;
81+
pub type __kernel_old_dev_t = ::std::os::raw::c_ulong;
82+
pub type __kernel_long_t = ::std::os::raw::c_long;
83+
pub type __kernel_ulong_t = ::std::os::raw::c_ulong;
84+
pub type __kernel_ino_t = __kernel_ulong_t;
85+
pub type __kernel_mode_t = ::std::os::raw::c_uint;
86+
pub type __kernel_pid_t = ::std::os::raw::c_int;
87+
pub type __kernel_ipc_pid_t = ::std::os::raw::c_int;
88+
pub type __kernel_uid_t = ::std::os::raw::c_uint;
89+
pub type __kernel_gid_t = ::std::os::raw::c_uint;
90+
pub type __kernel_suseconds_t = __kernel_long_t;
91+
pub type __kernel_daddr_t = ::std::os::raw::c_int;
92+
pub type __kernel_uid32_t = ::std::os::raw::c_uint;
93+
pub type __kernel_gid32_t = ::std::os::raw::c_uint;
94+
pub type __kernel_size_t = __kernel_ulong_t;
95+
pub type __kernel_ssize_t = __kernel_long_t;
96+
pub type __kernel_ptrdiff_t = __kernel_long_t;
97+
#[repr(C)]
98+
#[derive(Debug, Default, Copy, Clone, PartialEq)]
99+
pub struct __kernel_fsid_t {
100+
pub val: [::std::os::raw::c_int; 2usize],
101+
}
102+
#[allow(clippy::unnecessary_operation, clippy::identity_op)]
103+
const _: () = {
104+
["Size of __kernel_fsid_t"][::std::mem::size_of::<__kernel_fsid_t>() - 8usize];
105+
["Alignment of __kernel_fsid_t"][::std::mem::align_of::<__kernel_fsid_t>() - 4usize];
106+
["Offset of field: __kernel_fsid_t::val"]
107+
[::std::mem::offset_of!(__kernel_fsid_t, val) - 0usize];
108+
};
109+
pub type __kernel_off_t = __kernel_long_t;
110+
pub type __kernel_loff_t = ::std::os::raw::c_longlong;
111+
pub type __kernel_old_time_t = __kernel_long_t;
112+
pub type __kernel_time_t = __kernel_long_t;
113+
pub type __kernel_time64_t = ::std::os::raw::c_longlong;
114+
pub type __kernel_clock_t = __kernel_long_t;
115+
pub type __kernel_timer_t = ::std::os::raw::c_int;
116+
pub type __kernel_clockid_t = ::std::os::raw::c_int;
117+
pub type __kernel_caddr_t = *mut ::std::os::raw::c_char;
118+
pub type __kernel_uid16_t = ::std::os::raw::c_ushort;
119+
pub type __kernel_gid16_t = ::std::os::raw::c_ushort;
120+
pub type __s128 = i128;
121+
pub type __u128 = u128;
122+
pub type __le16 = __u16;
123+
pub type __be16 = __u16;
124+
pub type __le32 = __u32;
125+
pub type __be32 = __u32;
126+
pub type __le64 = __u64;
127+
pub type __be64 = __u64;
128+
pub type __sum16 = __u16;
129+
pub type __wsum = __u32;
130+
pub type __poll_t = ::std::os::raw::c_uint;
131+
#[repr(C)]
132+
#[derive(Debug, Default, Copy, Clone, PartialEq, Serialize, Deserialize)]
133+
pub struct vmclock_abi {
134+
pub magic: __le32,
135+
pub size: __le32,
136+
pub version: __le16,
137+
pub counter_id: __u8,
138+
pub time_type: __u8,
139+
pub seq_count: __le32,
140+
pub disruption_marker: __le64,
141+
pub flags: __le64,
142+
pub pad: [__u8; 2usize],
143+
pub clock_status: __u8,
144+
pub leap_second_smearing_hint: __u8,
145+
pub tai_offset_sec: __le16,
146+
pub leap_indicator: __u8,
147+
pub counter_period_shift: __u8,
148+
pub counter_value: __le64,
149+
pub counter_period_frac_sec: __le64,
150+
pub counter_period_esterror_rate_frac_sec: __le64,
151+
pub counter_period_maxerror_rate_frac_sec: __le64,
152+
pub time_sec: __le64,
153+
pub time_frac_sec: __le64,
154+
pub time_esterror_nanosec: __le64,
155+
pub time_maxerror_nanosec: __le64,
156+
}
157+
#[allow(clippy::unnecessary_operation, clippy::identity_op)]
158+
const _: () = {
159+
["Size of vmclock_abi"][::std::mem::size_of::<vmclock_abi>() - 104usize];
160+
["Alignment of vmclock_abi"][::std::mem::align_of::<vmclock_abi>() - 8usize];
161+
["Offset of field: vmclock_abi::magic"][::std::mem::offset_of!(vmclock_abi, magic) - 0usize];
162+
["Offset of field: vmclock_abi::size"][::std::mem::offset_of!(vmclock_abi, size) - 4usize];
163+
["Offset of field: vmclock_abi::version"]
164+
[::std::mem::offset_of!(vmclock_abi, version) - 8usize];
165+
["Offset of field: vmclock_abi::counter_id"]
166+
[::std::mem::offset_of!(vmclock_abi, counter_id) - 10usize];
167+
["Offset of field: vmclock_abi::time_type"]
168+
[::std::mem::offset_of!(vmclock_abi, time_type) - 11usize];
169+
["Offset of field: vmclock_abi::seq_count"]
170+
[::std::mem::offset_of!(vmclock_abi, seq_count) - 12usize];
171+
["Offset of field: vmclock_abi::disruption_marker"]
172+
[::std::mem::offset_of!(vmclock_abi, disruption_marker) - 16usize];
173+
["Offset of field: vmclock_abi::flags"][::std::mem::offset_of!(vmclock_abi, flags) - 24usize];
174+
["Offset of field: vmclock_abi::pad"][::std::mem::offset_of!(vmclock_abi, pad) - 32usize];
175+
["Offset of field: vmclock_abi::clock_status"]
176+
[::std::mem::offset_of!(vmclock_abi, clock_status) - 34usize];
177+
["Offset of field: vmclock_abi::leap_second_smearing_hint"]
178+
[::std::mem::offset_of!(vmclock_abi, leap_second_smearing_hint) - 35usize];
179+
["Offset of field: vmclock_abi::tai_offset_sec"]
180+
[::std::mem::offset_of!(vmclock_abi, tai_offset_sec) - 36usize];
181+
["Offset of field: vmclock_abi::leap_indicator"]
182+
[::std::mem::offset_of!(vmclock_abi, leap_indicator) - 38usize];
183+
["Offset of field: vmclock_abi::counter_period_shift"]
184+
[::std::mem::offset_of!(vmclock_abi, counter_period_shift) - 39usize];
185+
["Offset of field: vmclock_abi::counter_value"]
186+
[::std::mem::offset_of!(vmclock_abi, counter_value) - 40usize];
187+
["Offset of field: vmclock_abi::counter_period_frac_sec"]
188+
[::std::mem::offset_of!(vmclock_abi, counter_period_frac_sec) - 48usize];
189+
["Offset of field: vmclock_abi::counter_period_esterror_rate_frac_sec"]
190+
[::std::mem::offset_of!(vmclock_abi, counter_period_esterror_rate_frac_sec) - 56usize];
191+
["Offset of field: vmclock_abi::counter_period_maxerror_rate_frac_sec"]
192+
[::std::mem::offset_of!(vmclock_abi, counter_period_maxerror_rate_frac_sec) - 64usize];
193+
["Offset of field: vmclock_abi::time_sec"]
194+
[::std::mem::offset_of!(vmclock_abi, time_sec) - 72usize];
195+
["Offset of field: vmclock_abi::time_frac_sec"]
196+
[::std::mem::offset_of!(vmclock_abi, time_frac_sec) - 80usize];
197+
["Offset of field: vmclock_abi::time_esterror_nanosec"]
198+
[::std::mem::offset_of!(vmclock_abi, time_esterror_nanosec) - 88usize];
199+
["Offset of field: vmclock_abi::time_maxerror_nanosec"]
200+
[::std::mem::offset_of!(vmclock_abi, time_maxerror_nanosec) - 96usize];
201+
};

src/vmm/src/devices/acpi/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

4+
mod generated;
45
pub mod vmgenid;
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
diff --git a/src/vmm/src/devices/acpi/generated/vmclock_abi.rs b/src/vmm/src/devices/acpi/generated/vmclock_abi.rs
2+
index e841ca111..134c8393f 100644
3+
--- a/src/vmm/src/devices/acpi/generated/vmclock_abi.rs
4+
+++ b/src/vmm/src/devices/acpi/generated/vmclock_abi.rs
5+
@@ -16,40 +16,42 @@
6+
clippy::redundant_static_lifetimes
7+
)]
8+
9+
+use serde::{Deserialize, Serialize};
10+
+
11+
pub const __BITS_PER_LONG: u32 = 64;
12+
pub const __BITS_PER_LONG_LONG: u32 = 64;
13+
pub const __FD_SETSIZE: u32 = 1024;
14+
pub const VMCLOCK_MAGIC: u32 = 1263289174;
15+
-pub const VMCLOCK_COUNTER_ARM_VCNT: u32 = 0;
16+
-pub const VMCLOCK_COUNTER_X86_TSC: u32 = 1;
17+
-pub const VMCLOCK_COUNTER_INVALID: u32 = 255;
18+
-pub const VMCLOCK_TIME_UTC: u32 = 0;
19+
-pub const VMCLOCK_TIME_TAI: u32 = 1;
20+
-pub const VMCLOCK_TIME_MONOTONIC: u32 = 2;
21+
-pub const VMCLOCK_TIME_INVALID_SMEARED: u32 = 3;
22+
-pub const VMCLOCK_TIME_INVALID_MAYBE_SMEARED: u32 = 4;
23+
-pub const VMCLOCK_FLAG_TAI_OFFSET_VALID: u32 = 1;
24+
-pub const VMCLOCK_FLAG_DISRUPTION_SOON: u32 = 2;
25+
-pub const VMCLOCK_FLAG_DISRUPTION_IMMINENT: u32 = 4;
26+
-pub const VMCLOCK_FLAG_PERIOD_ESTERROR_VALID: u32 = 8;
27+
-pub const VMCLOCK_FLAG_PERIOD_MAXERROR_VALID: u32 = 16;
28+
-pub const VMCLOCK_FLAG_TIME_ESTERROR_VALID: u32 = 32;
29+
-pub const VMCLOCK_FLAG_TIME_MAXERROR_VALID: u32 = 64;
30+
-pub const VMCLOCK_FLAG_TIME_MONOTONIC: u32 = 128;
31+
-pub const VMCLOCK_STATUS_UNKNOWN: u32 = 0;
32+
-pub const VMCLOCK_STATUS_INITIALIZING: u32 = 1;
33+
-pub const VMCLOCK_STATUS_SYNCHRONIZED: u32 = 2;
34+
-pub const VMCLOCK_STATUS_FREERUNNING: u32 = 3;
35+
-pub const VMCLOCK_STATUS_UNRELIABLE: u32 = 4;
36+
-pub const VMCLOCK_SMEARING_STRICT: u32 = 0;
37+
-pub const VMCLOCK_SMEARING_NOON_LINEAR: u32 = 1;
38+
-pub const VMCLOCK_SMEARING_UTC_SLS: u32 = 2;
39+
-pub const VMCLOCK_LEAP_NONE: u32 = 0;
40+
-pub const VMCLOCK_LEAP_PRE_POS: u32 = 1;
41+
-pub const VMCLOCK_LEAP_PRE_NEG: u32 = 2;
42+
-pub const VMCLOCK_LEAP_POS: u32 = 3;
43+
-pub const VMCLOCK_LEAP_POST_POS: u32 = 4;
44+
-pub const VMCLOCK_LEAP_POST_NEG: u32 = 5;
45+
+pub const VMCLOCK_COUNTER_ARM_VCNT: u8 = 0;
46+
+pub const VMCLOCK_COUNTER_X86_TSC: u8 = 1;
47+
+pub const VMCLOCK_COUNTER_INVALID: u8 = 255;
48+
+pub const VMCLOCK_TIME_UTC: u8 = 0;
49+
+pub const VMCLOCK_TIME_TAI: u8 = 1;
50+
+pub const VMCLOCK_TIME_MONOTONIC: u8 = 2;
51+
+pub const VMCLOCK_TIME_INVALID_SMEARED: u8 = 3;
52+
+pub const VMCLOCK_TIME_INVALID_MAYBE_SMEARED: u8 = 4;
53+
+pub const VMCLOCK_FLAG_TAI_OFFSET_VALID: u64 = 1;
54+
+pub const VMCLOCK_FLAG_DISRUPTION_SOON: u64 = 2;
55+
+pub const VMCLOCK_FLAG_DISRUPTION_IMMINENT: u64 = 4;
56+
+pub const VMCLOCK_FLAG_PERIOD_ESTERROR_VALID: u64 = 8;
57+
+pub const VMCLOCK_FLAG_PERIOD_MAXERROR_VALID: u64 = 16;
58+
+pub const VMCLOCK_FLAG_TIME_ESTERROR_VALID: u64 = 32;
59+
+pub const VMCLOCK_FLAG_TIME_MAXERROR_VALID: u64 = 64;
60+
+pub const VMCLOCK_FLAG_TIME_MONOTONIC: u64 = 128;
61+
+pub const VMCLOCK_STATUS_UNKNOWN: u8 = 0;
62+
+pub const VMCLOCK_STATUS_INITIALIZING: u8 = 1;
63+
+pub const VMCLOCK_STATUS_SYNCHRONIZED: u8 = 2;
64+
+pub const VMCLOCK_STATUS_FREERUNNING: u8 = 3;
65+
+pub const VMCLOCK_STATUS_UNRELIABLE: u8 = 4;
66+
+pub const VMCLOCK_SMEARING_STRICT: u8 = 0;
67+
+pub const VMCLOCK_SMEARING_NOON_LINEAR: u8 = 1;
68+
+pub const VMCLOCK_SMEARING_UTC_SLS: u8 = 2;
69+
+pub const VMCLOCK_LEAP_NONE: u8 = 0;
70+
+pub const VMCLOCK_LEAP_PRE_POS: u8 = 1;
71+
+pub const VMCLOCK_LEAP_PRE_NEG: u8 = 2;
72+
+pub const VMCLOCK_LEAP_POS: u8 = 3;
73+
+pub const VMCLOCK_LEAP_POST_POS: u8 = 4;
74+
+pub const VMCLOCK_LEAP_POST_NEG: u8 = 5;
75+
pub type __s8 = ::std::os::raw::c_schar;
76+
pub type __u8 = ::std::os::raw::c_uchar;
77+
pub type __s16 = ::std::os::raw::c_short;
78+
@@ -127,7 +129,7 @@ pub type __sum16 = __u16;
79+
pub type __wsum = __u32;
80+
pub type __poll_t = ::std::os::raw::c_uint;
81+
#[repr(C)]
82+
-#[derive(Debug, Default, Copy, Clone, PartialEq)]
83+
+#[derive(Debug, Default, Copy, Clone, PartialEq, Serialize, Deserialize)]
84+
pub struct vmclock_abi {
85+
pub magic: __le32,
86+
pub size: __le32,

tools/bindgen.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,10 @@ fc-bindgen \
166166
--allowlist-var "ARCH_.*" \
167167
"$ARCH_X86_INCLUDE/uapi/asm/prctl.h" >src/vmm/src/arch/x86_64/generated/arch_prctl.rs
168168

169+
info "BINDGEN include/uapi/linux/vmclock-abi.h"
170+
fc-bindgen \
171+
"$KERNEL_DIR/include/uapi/linux/vmclock-abi.h" > src/vmm/src/devices/acpi/generated/vmclock_abi.rs
172+
169173
# Apply any patches
170174
info "Apply patches"
171175
for PATCH in $(dirname $0)/bindgen-patches/*.patch; do

0 commit comments

Comments
 (0)