Re: [PATCH] Fix kernel version macros for revision numbers over 255

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi, Kazu
Thank you for the patch.
On Wed, May 10, 2023 at 3:09 PM HAGIO KAZUHITO(萩尾 一仁) <k-hagio-ab@xxxxxxx> wrote:
From: Kazuhito Hagio <k-hagio-ab@xxxxxxx>

The current comparison macros for kernel version shift minor number only
8 bits.  This can cause an unexpected result on kernels with revision
number over 255, e.g. Linux 4.14.314.

 
For this case, I saw kernel deal with it as below:

#define KERNEL_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + ((c) > 255 ? 255 : (c)))

Can you try to imitate the above macro definition and help to confirm if it can also work for your case? If yes, it should be good to follow up kernel change.

Thanks
Lianbo

In fact, on Linux 4.14.314 for x86_64 without CONFIG_RANDOMIZE_BASE=y
(KASLR), the following condition became false in x86_64_init().

    ((THIS_KERNEL_VERSION >= LINUX(4,14,84)) &&
     (THIS_KERNEL_VERSION < LINUX(4,15,0)))

As a result, crash used a wrong hard-coded value for PAGE_OFFSET and
failed to start a session with the following seek error.

  crash: seek error: physical address: 200e000  type: "pud page"

Shift the major and minor number by 24 and 16 bits respectively to fix
this issue.

Reported-by: Luiz Capitulino <luizcap@xxxxxxxxxx>
Signed-off-by: Kazuhito Hagio <k-hagio-ab@xxxxxxx>
---
 defs.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/defs.h b/defs.h
index 12ad6aaa0998..211fc9d55d33 100644
--- a/defs.h
+++ b/defs.h
@@ -807,10 +807,10 @@ struct kernel_table {                   /* kernel data */
         }                                                            \
 }

-#define THIS_KERNEL_VERSION ((kt->kernel_version[0] << 16) + \
-                            (kt->kernel_version[1] << 8) + \
+#define THIS_KERNEL_VERSION ((kt->kernel_version[0] << 24) + \
+                            (kt->kernel_version[1] << 16) + \
                             (kt->kernel_version[2]))
-#define LINUX(x,y,z) (((uint)(x) << 16) + ((uint)(y) << 8) + (uint)(z))
+#define LINUX(x,y,z) (((uint)(x) << 24) + ((uint)(y) << 16) + (uint)(z))

 #define THIS_GCC_VERSION    ((kt->gcc_version[0] << 16) + \
                              (kt->gcc_version[1] << 8) + \
--
2.31.1

--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux