|
@@ -49,23 +49,43 @@ impl KernelVersion {
|
|
|
|
|
|
/// Returns the kernel version of the currently running kernel.
|
|
|
pub fn current() -> Result<Self, impl Error> {
|
|
|
- let kernel_version = Self::get_kernel_version();
|
|
|
+ Self::get_kernel_version()
|
|
|
+ }
|
|
|
|
|
|
- // The kernel version is clamped to 4.19.255 on kernels 4.19.222 and above.
|
|
|
- //
|
|
|
- // See https://github.com/torvalds/linux/commit/a256aac.
|
|
|
- const CLAMPED_KERNEL_MAJOR: u8 = 4;
|
|
|
- const CLAMPED_KERNEL_MINOR: u8 = 19;
|
|
|
- if let Ok(Self {
|
|
|
- major: CLAMPED_KERNEL_MAJOR,
|
|
|
- minor: CLAMPED_KERNEL_MINOR,
|
|
|
- patch: 222..,
|
|
|
- }) = kernel_version
|
|
|
- {
|
|
|
- return Ok(Self::new(CLAMPED_KERNEL_MAJOR, CLAMPED_KERNEL_MINOR, 255));
|
|
|
+ /// The equivalent of LINUX_VERSION_CODE.
|
|
|
+ pub(crate) fn code(self) -> u32 {
|
|
|
+ let Self {
|
|
|
+ major,
|
|
|
+ minor,
|
|
|
+ mut patch,
|
|
|
+ } = self;
|
|
|
+
|
|
|
+ // Certain LTS kernels went above the "max" 255 patch so
|
|
|
+ // backports were done to cap the patch version
|
|
|
+ let max_patch = match (major, minor) {
|
|
|
+ // On 4.4 + 4.9, any patch 257 or above was hardcoded to 255.
|
|
|
+ // See: https://github.com/torvalds/linux/commit/a15813a +
|
|
|
+ // https://github.com/torvalds/linux/commit/42efb098
|
|
|
+ (4, 4 | 9) => 257,
|
|
|
+ // On 4.14, any patch 252 or above was hardcoded to 255.
|
|
|
+ // See: https://github.com/torvalds/linux/commit/e131e0e
|
|
|
+ (4, 14) => 252,
|
|
|
+ // On 4.19, any patch 222 or above was hardcoded to 255.
|
|
|
+ // See: https://github.com/torvalds/linux/commit/a256aac
|
|
|
+ (4, 19) => 222,
|
|
|
+ // For other kernels (i.e., newer LTS kernels as other
|
|
|
+ // ones won't reach 255+ patches) clamp it to 255. See:
|
|
|
+ // https://github.com/torvalds/linux/commit/9b82f13e
|
|
|
+ _ => 255,
|
|
|
+ };
|
|
|
+
|
|
|
+ // anything greater or equal to `max_patch` is hardcoded to
|
|
|
+ // 255.
|
|
|
+ if patch >= max_patch {
|
|
|
+ patch = 255;
|
|
|
}
|
|
|
|
|
|
- kernel_version
|
|
|
+ (u32::from(major) << 16) + (u32::from(minor) << 8) + u32::from(patch)
|
|
|
}
|
|
|
|
|
|
// This is ported from https://github.com/torvalds/linux/blob/3f01e9f/tools/lib/bpf/libbpf_probes.c#L21-L101.
|