Fix kernel version macros for revision numbers over 255

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.

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@amazon.com>
Tested-by: Luiz Capitulino <luizcap@amazon.com>
Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
This commit is contained in:
Kazuhito Hagio 2023-05-10 16:09:03 +09:00
parent 2505a65ff5
commit 040a56e9f9

6
defs.h
View File

@ -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) + \