mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-04 09:09:56 +00:00
Fix the Linux kernel version number calculation
The Linux compatibility code was converting the version number (e.g. 2.6.32) in two different ways and then comparing the results. The linux_map_osrel() function converted MAJOR.MINOR.PATCH similar to what FreeBSD does natively. I.e. where major=v0, minor=v1, and patch=v2 v = v0 * 1000000 + v1 * 1000 + v2; The LINUX_KERNVER() macro, on the other hand, converted the value with bit shifts. I.e. where major=a, minor=b, and patch=c v = (((a) << 16) + ((b) << 8) + (c)) The Linux kernel uses the later format via the KERNEL_VERSION() macro in include/generated/uapi/linux/version.h Fix is to use the LINUX_KERNVER() macro in linux_map_osrel() as well as in the .trans_osrel functions. PR: 229209 Reviewed by: emaste, cem, imp (mentor) Approved by: imp (mentor) Differential Revision: https://reviews.freebsd.org/D15952
This commit is contained in:
parent
03d7aee8a7
commit
3575504976
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=335515
@ -799,10 +799,11 @@ linux_trans_osrel(const Elf_Note *note, int32_t *osrel)
|
||||
return (false);
|
||||
|
||||
/*
|
||||
* For Linux we encode osrel as follows (see linux_mib.c):
|
||||
* VVVMMMIII (version, major, minor), see linux_mib.c.
|
||||
* For Linux we encode osrel using the Linux convention of
|
||||
* (version << 16) | (major << 8) | (minor)
|
||||
* See macro in linux_mib.h
|
||||
*/
|
||||
*osrel = desc[1] * 1000000 + desc[2] * 1000 + desc[3];
|
||||
*osrel = LINUX_KERNVER(desc[1], desc[2], desc[3]);
|
||||
|
||||
return (true);
|
||||
}
|
||||
|
@ -993,10 +993,11 @@ linux32_trans_osrel(const Elf_Note *note, int32_t *osrel)
|
||||
return (false);
|
||||
|
||||
/*
|
||||
* For Linux we encode osrel as follows (see linux_mib.c):
|
||||
* VVVMMMIII (version, major, minor), see linux_mib.c.
|
||||
* For Linux we encode osrel using the Linux convention of
|
||||
* (version << 16) | (major << 8) | (minor)
|
||||
* See macro in linux_mib.h
|
||||
*/
|
||||
*osrel = desc[1] * 1000000 + desc[2] * 1000 + desc[3];
|
||||
*osrel = LINUX_KERNVER(desc[1], desc[2], desc[3]);
|
||||
|
||||
return (true);
|
||||
}
|
||||
|
@ -149,8 +149,8 @@ linux_map_osrel(char *osrelease, int *osrel)
|
||||
if (osrelease == sep || sep != eosrelease)
|
||||
return (EINVAL);
|
||||
|
||||
v = v0 * 1000000 + v1 * 1000 + v2;
|
||||
if (v < 1000000)
|
||||
v = LINUX_KERNVER(v0, v1, v2);
|
||||
if (v < LINUX_KERNVER(1, 0, 0))
|
||||
return (EINVAL);
|
||||
|
||||
if (osrel != NULL)
|
||||
|
@ -970,10 +970,11 @@ linux_trans_osrel(const Elf_Note *note, int32_t *osrel)
|
||||
return (false);
|
||||
|
||||
/*
|
||||
* For Linux we encode osrel as follows (see linux_mib.c):
|
||||
* VVVMMMIII (version, major, minor), see linux_mib.c.
|
||||
* For Linux we encode osrel using the Linux convention of
|
||||
* (version << 16) | (major << 8) | (minor)
|
||||
* See macro in linux_mib.h
|
||||
*/
|
||||
*osrel = desc[1] * 1000000 + desc[2] * 1000 + desc[3];
|
||||
*osrel = LINUX_KERNVER(desc[1], desc[2], desc[3]);
|
||||
|
||||
return (true);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user