If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202307060950.2rBIE1wF-lkp@xxxxxxxxx/
All error/warnings (new ones prefixed by >>):
kernel/kexec.c: In function 'kimage_alloc_init':
kernel/kexec.c:33:30: error: implicit declaration of function 'phys_to_boot_phys' [-Werror=implicit-function-declaration]
33 | if ((entry < phys_to_boot_phys(crashk_res.start)) ||
| ^~~~~~~~~~~~~~~~~
kernel/kexec.c:43:14: error: invalid use of undefined type 'struct kimage'
43 | image->start = entry;
| ^~
kernel/kexec.c:44:14: error: invalid use of undefined type 'struct kimage'
44 | image->nr_segments = nr_segments;
| ^~
In file included from include/linux/string.h:254,
from include/linux/bitmap.h:11,
from include/linux/cpumask.h:12,
from include/linux/smp.h:13,
from include/linux/lockdep.h:14,
from include/linux/spinlock.h:63,
from include/linux/mmzone.h:8,
from include/linux/gfp.h:7,
from include/linux/mm.h:7,
from kernel/kexec.c:10:
kernel/kexec.c:45:62: error: invalid application of 'sizeof' to incomplete type 'struct kexec_segment'
45 | memcpy(image->segment, segments, nr_segments * sizeof(*segments));
| ^
include/linux/fortify-string.h:636:48: note: in definition of macro '__fortify_memcpy_chk'
636 | const size_t __fortify_size = (size_t)(size); \
| ^~~~
kernel/kexec.c:45:9: note: in expansion of macro 'memcpy'
45 | memcpy(image->segment, segments, nr_segments * sizeof(*segments));
| ^~~~~~
kernel/kexec.c:45:21: error: invalid use of undefined type 'struct kimage'
45 | memcpy(image->segment, segments, nr_segments * sizeof(*segments));
| ^~
include/linux/fortify-string.h:637:34: note: in definition of macro '__fortify_memcpy_chk'
637 | const size_t __p_size = (p_size); \
| ^~~~~~
include/linux/fortify-string.h:694:17: note: in expansion of macro '__struct_size'
694 | __struct_size(p), __struct_size(q), \
| ^~~~~~~~~~~~~
kernel/kexec.c:45:9: note: in expansion of macro 'memcpy'
45 | memcpy(image->segment, segments, nr_segments * sizeof(*segments));
| ^~~~~~
kernel/kexec.c:45:21: error: invalid use of undefined type 'struct kimage'
45 | memcpy(image->segment, segments, nr_segments * sizeof(*segments));
| ^~
include/linux/fortify-string.h:639:40: note: in definition of macro '__fortify_memcpy_chk'
639 | const size_t __p_size_field = (p_size_field); \
| ^~~~~~~~~~~~
include/linux/fortify-string.h:695:17: note: in expansion of macro '__member_size'
695 | __member_size(p), __member_size(q), \
| ^~~~~~~~~~~~~
kernel/kexec.c:45:9: note: in expansion of macro 'memcpy'
45 | memcpy(image->segment, segments, nr_segments * sizeof(*segments));
| ^~~~~~
kernel/kexec.c:45:21: error: invalid use of undefined type 'struct kimage'
45 | memcpy(image->segment, segments, nr_segments * sizeof(*segments));
| ^~
include/linux/fortify-string.h:648:27: note: in definition of macro '__fortify_memcpy_chk'
648 | __underlying_##op(p, q, __fortify_size); \
| ^
kernel/kexec.c:45:9: note: in expansion of macro 'memcpy'
45 | memcpy(image->segment, segments, nr_segments * sizeof(*segments));
| ^~~~~~
kernel/kexec.c:49:22: error: invalid use of undefined type 'struct kimage'
49 | image->control_page = crashk_res.start;
| ^~
kernel/kexec.c:50:22: error: invalid use of undefined type 'struct kimage'
50 | image->type = KEXEC_TYPE_CRASH;
| ^~
kernel/kexec.c:50:31: error: 'KEXEC_TYPE_CRASH' undeclared (first use in this function); did you mean 'KEXEC_ON_CRASH'?
50 | image->type = KEXEC_TYPE_CRASH;
| ^~~~~~~~~~~~~~~~
| KEXEC_ON_CRASH
kernel/kexec.c:50:31: note: each undeclared identifier is reported only once for each function it appears in
kernel/kexec.c:63:14: error: invalid use of undefined type 'struct kimage'
63 | image->control_code_page = kimage_alloc_control_pages(image,
| ^~
kernel/kexec.c:63:36: error: implicit declaration of function 'kimage_alloc_control_pages' [-Werror=implicit-function-declaration]
63 | image->control_code_page = kimage_alloc_control_pages(image,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
kernel/kexec.c:64:54: error: 'KEXEC_CONTROL_PAGE_SIZE' undeclared (first use in this function)
64 | get_order(KEXEC_CONTROL_PAGE_SIZE));
| ^~~~~~~~~~~~~~~~~~~~~~~
kernel/kexec.c:65:19: error: invalid use of undefined type 'struct kimage'
65 | if (!image->control_code_page) {
| ^~
kernel/kexec.c:71:22: error: invalid use of undefined type 'struct kimage'
71 | image->swap_page = kimage_alloc_control_pages(image, 0);
| ^~
kernel/kexec.c:72:27: error: invalid use of undefined type 'struct kimage'
72 | if (!image->swap_page) {
| ^~
kernel/kexec.c:81:37: error: invalid use of undefined type 'struct kimage'
81 | kimage_free_page_list(&image->control_pages);
| ^~
kernel/kexec.c: In function 'do_kexec_load':
kernel/kexec.c:103:31: error: 'kexec_crash_image' undeclared (first use in this function); did you mean 'kexec_crash_loaded'?
103 | dest_image = &kexec_crash_image;
| ^~~~~~~~~~~~~~~~~
| kexec_crash_loaded
kernel/kexec.c:105:25: error: implicit declaration of function 'arch_kexec_unprotect_crashkres' [-Werror=implicit-function-declaration]
105 | arch_kexec_unprotect_crashkres();
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kernel/kexec.c:107:31: error: 'kexec_image' undeclared (first use in this function)
107 | dest_image = &kexec_image;
| ^~~~~~~~~~~
In file included from include/linux/atomic.h:82,
from include/linux/cpumask.h:13:
include/linux/atomic/atomic-instrumented.h:4715:55: error: invalid type argument of unary '*' (have 'int')
4715 | instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
| ^~~~~~~~~
kernel/kexec.c:122:29: note: in expansion of macro 'xchg'
122 | kimage_free(xchg(&kexec_crash_image, NULL));
| ^~~~
include/linux/atomic/atomic-instrumented.h:4715:38: warning: passing argument 1 of 'instrument_atomic_read_write' makes pointer from integer without a cast [-Wint-conversion]
4715 | instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
| ^~~~~~~~
| |
| int
kernel/kexec.c:122:29: note: in expansion of macro 'xchg'
122 | kimage_free(xchg(&kexec_crash_image, NULL));
| ^~~~
In file included from include/linux/atomic/atomic-instrumented.h:17:
include/linux/instrumented.h:94:79: note: expected 'const volatile void *' but argument is of type 'int'
94 | static __always_inline void instrument_atomic_read_write(const volatile void *v, size_t size)
| ~~~~~~~~~~~~~~~~~~~~~^
In file included from arch/riscv/include/asm/atomic.h:19,
from include/linux/atomic.h:7:
arch/riscv/include/asm/cmpxchg.h:145:20: error: invalid type argument of unary '*' (have 'int')
145 | __typeof__(*(ptr)) _x_ = (x); \
| ^~~~~~
include/linux/atomic/atomic-arch-fallback.h:12:18: note: in expansion of macro 'arch_xchg'
12 | #define raw_xchg arch_xchg
| ^~~~~~~~~
include/linux/atomic/atomic-instrumented.h:4716:9: note: in expansion of macro 'raw_xchg'
4716 | raw_xchg(__ai_ptr, __VA_ARGS__); \
| ^~~~~~~~
kernel/kexec.c:122:29: note: in expansion of macro 'xchg'
122 | kimage_free(xchg(&kexec_crash_image, NULL));
| ^~~~
arch/riscv/include/asm/cmpxchg.h:145:34: warning: initialization of 'int' from 'void *' makes integer from pointer without a cast [-Wint-conversion]
145 | __typeof__(*(ptr)) _x_ = (x); \
| ^
include/linux/atomic/atomic-arch-fallback.h:12:18: note: in expansion of macro 'arch_xchg'
12 | #define raw_xchg arch_xchg
| ^~~~~~~~~
include/linux/atomic/atomic-instrumented.h:4716:9: note: in expansion of macro 'raw_xchg'
4716 | raw_xchg(__ai_ptr, __VA_ARGS__); \
| ^~~~~~~~
kernel/kexec.c:122:29: note: in expansion of macro 'xchg'
122 | kimage_free(xchg(&kexec_crash_image, NULL));
| ^~~~
arch/riscv/include/asm/cmpxchg.h:146:21: error: invalid type argument of unary '*' (have 'int')
146 | (__typeof__(*(ptr))) __arch_xchg((ptr), _x_, sizeof(*(ptr))); \
| ^~~~~~
include/linux/atomic/atomic-arch-fallback.h:12:18: note: in expansion of macro 'arch_xchg'
12 | #define raw_xchg arch_xchg
| ^~~~~~~~~
include/linux/atomic/atomic-instrumented.h:4716:9: note: in expansion of macro 'raw_xchg'
4716 | raw_xchg(__ai_ptr, __VA_ARGS__); \
| ^~~~~~~~
kernel/kexec.c:122:29: note: in expansion of macro 'xchg'
122 | kimage_free(xchg(&kexec_crash_image, NULL));
| ^~~~
arch/riscv/include/asm/cmpxchg.h:121:20: error: invalid type argument of unary '*' (have 'int')
121 | __typeof__(*(ptr)) __ret; \
| ^~~~~~
arch/riscv/include/asm/cmpxchg.h:146:30: note: in expansion of macro '__arch_xchg'
146 | (__typeof__(*(ptr))) __arch_xchg((ptr), _x_, sizeof(*(ptr))); \
| ^~~~~~~~~~~
include/linux/atomic/atomic-arch-fallback.h:12:18: note: in expansion of macro 'arch_xchg'
12 | #define raw_xchg arch_xchg
| ^~~~~~~~~
include/linux/atomic/atomic-instrumented.h:4716:9: note: in expansion of macro 'raw_xchg'
4716 | raw_xchg(__ai_ptr, __VA_ARGS__); \
| ^~~~~~~~
kernel/kexec.c:122:29: note: in expansion of macro 'xchg'
122 | kimage_free(xchg(&kexec_crash_image, NULL));
| ^~~~
arch/riscv/include/asm/cmpxchg.h:146:61: error: invalid type argument of unary '*' (have 'int')
146 | (__typeof__(*(ptr))) __arch_xchg((ptr), _x_, sizeof(*(ptr))); \
| ^~~~~~
arch/riscv/include/asm/cmpxchg.h:122:17: note: in definition of macro '__arch_xchg'
122 | switch (size) { \
| ^~~~
include/linux/atomic/atomic-arch-fallback.h:12:18: note: in expansion of macro 'arch_xchg'
12 | #define raw_xchg arch_xchg
| ^~~~~~~~~
include/linux/atomic/atomic-instrumented.h:4716:9: note: in expansion of macro 'raw_xchg'
4716 | raw_xchg(__ai_ptr, __VA_ARGS__); \
| ^~~~~~~~
kernel/kexec.c:122:29: note: in expansion of macro 'xchg'
122 | kimage_free(xchg(&kexec_crash_image, NULL));
| ^~~~
arch/riscv/include/asm/cmpxchg.h:126:47: error: invalid type argument of unary '*' (have 'int')
126 | : "=r" (__ret), "+A" (*__ptr) \
| ^~~~~~
arch/riscv/include/asm/cmpxchg.h:146:30: note: in expansion of macro '__arch_xchg'
146 | (__typeof__(*(ptr))) __arch_xchg((ptr), _x_, sizeof(*(ptr))); \
| ^~~~~~~~~~~
include/linux/atomic/atomic-arch-fallback.h:12:18: note: in expansion of macro 'arch_xchg'
12 | #define raw_xchg arch_xchg
| ^~~~~~~~~
include/linux/atomic/atomic-instrumented.h:4716:9: note: in expansion of macro 'raw_xchg'
4716 | raw_xchg(__ai_ptr, __VA_ARGS__); \
| ^~~~~~~~
kernel/kexec.c:122:29: note: in expansion of macro 'xchg'
122 | kimage_free(xchg(&kexec_crash_image, NULL));
| ^~~~
arch/riscv/include/asm/cmpxchg.h:133:47: error: invalid type argument of unary '*' (have 'int')
133 | : "=r" (__ret), "+A" (*__ptr) \
| ^~~~~~
arch/riscv/include/asm/cmpxchg.h:146:30: note: in expansion of macro '__arch_xchg'
146 | (__typeof__(*(ptr))) __arch_xchg((ptr), _x_, sizeof(*(ptr))); \
| ^~~~~~~~~~~
include/linux/atomic/atomic-arch-fallback.h:12:18: note: in expansion of macro 'arch_xchg'
12 | #define raw_xchg arch_xchg
| ^~~~~~~~~
include/linux/atomic/atomic-instrumented.h:4716:9: note: in expansion of macro 'raw_xchg'
4716 | raw_xchg(__ai_ptr, __VA_ARGS__); \
| ^~~~~~~~
kernel/kexec.c:122:29: note: in expansion of macro 'xchg'
122 | kimage_free(xchg(&kexec_crash_image, NULL));
| ^~~~
kernel/kexec.c:130:22: error: invalid use of undefined type 'struct kimage'
130 | image->preserve_context = 1;
| ^~
kernel/kexec.c:132:15: error: implicit declaration of function 'machine_kexec_prepare' [-Werror=implicit-function-declaration]
132 | ret = machine_kexec_prepare(image);
| ^~~~~~~~~~~~~~~~~~~~~
kernel/kexec.c:140:15: error: implicit declaration of function 'kimage_crash_copy_vmcoreinfo'; did you mean 'arch_crash_save_vmcoreinfo'? [-Werror=implicit-function-declaration]
140 | ret = kimage_crash_copy_vmcoreinfo(image);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
| arch_crash_save_vmcoreinfo
kernel/kexec.c:145:56: error: invalid use of undefined type 'struct kimage'
145 | ret = kimage_load_segment(image, &image->segment[i]);
| ^~
kernel/kexec.c:152:15: error: implicit declaration of function 'machine_kexec_post_load' [-Werror=implicit-function-declaration]
152 | ret = machine_kexec_post_load(image);
| ^~~~~~~~~~~~~~~~~~~~~~~
kernel/kexec.c:161:17: error: implicit declaration of function 'arch_kexec_protect_crashkres' [-Werror=implicit-function-declaration]
161 | arch_kexec_protect_crashkres();
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
kernel/kexec.c: In function 'kexec_load_check':
kernel/kexec.c:194:26: error: 'KEXEC_TYPE_CRASH' undeclared (first use in this function); did you mean 'KEXEC_ON_CRASH'?
194 | KEXEC_TYPE_CRASH : KEXEC_TYPE_DEFAULT;
| ^~~~~~~~~~~~~~~~
| KEXEC_ON_CRASH
kernel/kexec.c:194:45: error: 'KEXEC_TYPE_DEFAULT' undeclared (first use in this function); did you mean 'KEXEC_ARCH_DEFAULT'?
194 | KEXEC_TYPE_CRASH : KEXEC_TYPE_DEFAULT;
| ^~~~~~~~~~~~~~~~~~
| KEXEC_ARCH_DEFAULT
kernel/kexec.c:198:14: error: implicit declaration of function 'kexec_load_permitted' [-Werror=implicit-function-declaration]
198 | if (!kexec_load_permitted(image_type))
| ^~~~~~~~~~~~~~~~~~~~
kernel/kexec.c:218:22: error: 'KEXEC_FLAGS' undeclared (first use in this function); did you mean 'QC_FLAGS'?
218 | if ((flags & KEXEC_FLAGS) != (flags & ~KEXEC_ARCH_MASK))
| ^~~~~~~~~~~
| QC_FLAGS
kernel/kexec.c: In function '__do_sys_kexec_load':
kernel/kexec.c:241:43: error: 'KEXEC_ARCH' undeclared (first use in this function); did you mean 'KEXEC_ARCH_SH'?
241 | if (((flags & KEXEC_ARCH_MASK) != KEXEC_ARCH) &&
| ^~~~~~~~~~
| KEXEC_ARCH_SH
kernel/kexec.c:245:73: error: invalid use of undefined type 'struct kexec_segment'
245 | ksegments = memdup_user(segments, nr_segments * sizeof(ksegments[0]));
| ^
kernel/kexec.c:245:63: error: invalid application of 'sizeof' to incomplete type 'struct kexec_segment'
245 | ksegments = memdup_user(segments, nr_segments * sizeof(ksegments[0]));
| ^
cc1: some warnings being treated as errors
Kconfig warnings: (for reference only)
WARNING: unmet direct dependencies detected for KEXEC
Depends on [n]: ARCH_SUPPORTS_KEXEC [=n]
Selected by [y]:
- CRASH_DUMP [=y] && ARCH_SUPPORTS_CRASH_DUMP [=y]
vim +/phys_to_boot_phys +33 kernel/kexec.c
de90a6bcaede81 Minfei Huang 2015-11-06 8
c59ede7b78db32 Randy Dunlap 2006-01-11 9 #include <linux/capability.h>
dc009d92435f99 Eric W. Biederman 2005-06-25 @10 #include <linux/mm.h>
dc009d92435f99 Eric W. Biederman 2005-06-25 11 #include <linux/file.h>
a210fd32a46bae Mimi Zohar 2018-07-13 12 #include <linux/security.h>
dc009d92435f99 Eric W. Biederman 2005-06-25 13 #include <linux/kexec.h>
8c5a1cf0ad3ac5 Andrew Morton 2008-08-15 14 #include <linux/mutex.h>
dc009d92435f99 Eric W. Biederman 2005-06-25 15 #include <linux/list.h>
dc009d92435f99 Eric W. Biederman 2005-06-25 16 #include <linux/syscalls.h>
a43cac0d9dc207 Dave Young 2015-09-09 17 #include <linux/vmalloc.h>
2965faa5e03d1e Dave Young 2015-09-09 18 #include <linux/slab.h>
dc009d92435f99 Eric W. Biederman 2005-06-25 19
a43cac0d9dc207 Dave Young 2015-09-09 20 #include "kexec_internal.h"
a43cac0d9dc207 Dave Young 2015-09-09 21
255aedd90e3e80 Vivek Goyal 2014-08-08 22 static int kimage_alloc_init(struct kimage **rimage, unsigned long entry,
72414d3f1d22fc Maneesh Soni 2005-06-25 23 unsigned long nr_segments,
5d700a0fd71ded Arnd Bergmann 2021-09-08 24 struct kexec_segment *segments,
255aedd90e3e80 Vivek Goyal 2014-08-08 25 unsigned long flags)
dc009d92435f99 Eric W. Biederman 2005-06-25 26 {
255aedd90e3e80 Vivek Goyal 2014-08-08 27 int ret;
dc009d92435f99 Eric W. Biederman 2005-06-25 28 struct kimage *image;
255aedd90e3e80 Vivek Goyal 2014-08-08 29 bool kexec_on_panic = flags & KEXEC_ON_CRASH;
255aedd90e3e80 Vivek Goyal 2014-08-08 30
255aedd90e3e80 Vivek Goyal 2014-08-08 31 if (kexec_on_panic) {
255aedd90e3e80 Vivek Goyal 2014-08-08 32 /* Verify we have a valid entry point */
43546d8669d62d Russell King 2016-08-02 @33 if ((entry < phys_to_boot_phys(crashk_res.start)) ||
43546d8669d62d Russell King 2016-08-02 34 (entry > phys_to_boot_phys(crashk_res.end)))
255aedd90e3e80 Vivek Goyal 2014-08-08 35 return -EADDRNOTAVAIL;
255aedd90e3e80 Vivek Goyal 2014-08-08 36 }
dc009d92435f99 Eric W. Biederman 2005-06-25 37
dc009d92435f99 Eric W. Biederman 2005-06-25 38 /* Allocate and initialize a controlling structure */
dabe78628dd886 Vivek Goyal 2014-08-08 39 image = do_kimage_alloc_init();
dabe78628dd886 Vivek Goyal 2014-08-08 40 if (!image)
dabe78628dd886 Vivek Goyal 2014-08-08 41 return -ENOMEM;
dabe78628dd886 Vivek Goyal 2014-08-08 42
dabe78628dd886 Vivek Goyal 2014-08-08 @43 image->start = entry;
5d700a0fd71ded Arnd Bergmann 2021-09-08 44 image->nr_segments = nr_segments;
5d700a0fd71ded Arnd Bergmann 2021-09-08 @45 memcpy(image->segment, segments, nr_segments * sizeof(*segments));
dabe78628dd886 Vivek Goyal 2014-08-08 46
255aedd90e3e80 Vivek Goyal 2014-08-08 47 if (kexec_on_panic) {
cdf4b3fa03bab1 Xunlei Pang 2016-01-20 48 /* Enable special crash kernel control page alloc policy. */
255aedd90e3e80 Vivek Goyal 2014-08-08 49 image->control_page = crashk_res.start;
255aedd90e3e80 Vivek Goyal 2014-08-08 @50 image->type = KEXEC_TYPE_CRASH;
255aedd90e3e80 Vivek Goyal 2014-08-08 51 }
255aedd90e3e80 Vivek Goyal 2014-08-08 52
cdf4b3fa03bab1 Xunlei Pang 2016-01-20 53 ret = sanity_check_segment_list(image);
cdf4b3fa03bab1 Xunlei Pang 2016-01-20 54 if (ret)
cdf4b3fa03bab1 Xunlei Pang 2016-01-20 55 goto out_free_image;
cdf4b3fa03bab1 Xunlei Pang 2016-01-20 56
dc009d92435f99 Eric W. Biederman 2005-06-25 57 /*
dc009d92435f99 Eric W. Biederman 2005-06-25 58 * Find a location for the control code buffer, and add it
dc009d92435f99 Eric W. Biederman 2005-06-25 59 * the vector of segments so that it's pages will also be
dc009d92435f99 Eric W. Biederman 2005-06-25 60 * counted as destination pages.
dc009d92435f99 Eric W. Biederman 2005-06-25 61 */
255aedd90e3e80 Vivek Goyal 2014-08-08 62 ret = -ENOMEM;
dc009d92435f99 Eric W. Biederman 2005-06-25 @63 image->control_code_page = kimage_alloc_control_pages(image,
163f6876f5c3ff Huang Ying 2008-08-15 @64 get_order(KEXEC_CONTROL_PAGE_SIZE));
dc009d92435f99 Eric W. Biederman 2005-06-25 65 if (!image->control_code_page) {
e1bebcf41ed0aa Fabian Frederick 2014-06-06 66 pr_err("Could not allocate control_code_buffer\n");
2965faa5e03d1e Dave Young 2015-09-09 67 goto out_free_image;
dc009d92435f99 Eric W. Biederman 2005-06-25 68 }
dd5f726076cc76 Vivek Goyal 2014-08-08 69
2965faa5e03d1e Dave Young 2015-09-09 70 if (!kexec_on_panic) {
2965faa5e03d1e Dave Young 2015-09-09 71 image->swap_page = kimage_alloc_control_pages(image, 0);
2965faa5e03d1e Dave Young 2015-09-09 @72 if (!image->swap_page) {
2965faa5e03d1e Dave Young 2015-09-09 73 pr_err("Could not allocate swap buffer\n");
2965faa5e03d1e Dave Young 2015-09-09 74 goto out_free_control_pages;
dc009d92435f99 Eric W. Biederman 2005-06-25 75 }
dc009d92435f99 Eric W. Biederman 2005-06-25 76 }
72414d3f1d22fc Maneesh Soni 2005-06-25 77
2965faa5e03d1e Dave Young 2015-09-09 78 *rimage = image;
2965faa5e03d1e Dave Young 2015-09-09 79 return 0;
2965faa5e03d1e Dave Young 2015-09-09 80 out_free_control_pages:
2965faa5e03d1e Dave Young 2015-09-09 @81 kimage_free_page_list(&image->control_pages);
2965faa5e03d1e Dave Young 2015-09-09 82 out_free_image:
2965faa5e03d1e Dave Young 2015-09-09 83 kfree(image);
2965faa5e03d1e Dave Young 2015-09-09 84 return ret;
dc009d92435f99 Eric W. Biederman 2005-06-25 85 }
dc009d92435f99 Eric W. Biederman 2005-06-25 86
0eea08678ebe9f Minfei Huang 2016-05-23 87 static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
5d700a0fd71ded Arnd Bergmann 2021-09-08 88 struct kexec_segment *segments, unsigned long flags)
0eea08678ebe9f Minfei Huang 2016-05-23 89 {
0eea08678ebe9f Minfei Huang 2016-05-23 90 struct kimage **dest_image, *image;
0eea08678ebe9f Minfei Huang 2016-05-23 91 unsigned long i;
0eea08678ebe9f Minfei Huang 2016-05-23 92 int ret;
0eea08678ebe9f Minfei Huang 2016-05-23 93
4b692e86161935 Arnd Bergmann 2021-09-08 94 /*
4b692e86161935 Arnd Bergmann 2021-09-08 95 * Because we write directly to the reserved memory region when loading
05c6257433b721 Valentin Schneider 2022-06-30 96 * crash kernels we need a serialization here to prevent multiple crash
05c6257433b721 Valentin Schneider 2022-06-30 97 * kernels from attempting to load simultaneously.
4b692e86161935 Arnd Bergmann 2021-09-08 98 */
05c6257433b721 Valentin Schneider 2022-06-30 99 if (!kexec_trylock())
4b692e86161935 Arnd Bergmann 2021-09-08 100 return -EBUSY;
4b692e86161935 Arnd Bergmann 2021-09-08 101
0eea08678ebe9f Minfei Huang 2016-05-23 102 if (flags & KEXEC_ON_CRASH) {
0eea08678ebe9f Minfei Huang 2016-05-23 @103 dest_image = &kexec_crash_image;
0eea08678ebe9f Minfei Huang 2016-05-23 104 if (kexec_crash_image)
0eea08678ebe9f Minfei Huang 2016-05-23 @105 arch_kexec_unprotect_crashkres();
0eea08678ebe9f Minfei Huang 2016-05-23 106 } else {
0eea08678ebe9f Minfei Huang 2016-05-23 @107 dest_image = &kexec_image;
0eea08678ebe9f Minfei Huang 2016-05-23 108 }
0eea08678ebe9f Minfei Huang 2016-05-23 109
0eea08678ebe9f Minfei Huang 2016-05-23 110 if (nr_segments == 0) {
0eea08678ebe9f Minfei Huang 2016-05-23 111 /* Uninstall image */
0eea08678ebe9f Minfei Huang 2016-05-23 112 kimage_free(xchg(dest_image, NULL));
4b692e86161935 Arnd Bergmann 2021-09-08 113 ret = 0;
4b692e86161935 Arnd Bergmann 2021-09-08 114 goto out_unlock;
0eea08678ebe9f Minfei Huang 2016-05-23 115 }
0eea08678ebe9f Minfei Huang 2016-05-23 116 if (flags & KEXEC_ON_CRASH) {
0eea08678ebe9f Minfei Huang 2016-05-23 117 /*
0eea08678ebe9f Minfei Huang 2016-05-23 118 * Loading another kernel to switch to if this one
0eea08678ebe9f Minfei Huang 2016-05-23 119 * crashes. Free any current crash dump kernel before
0eea08678ebe9f Minfei Huang 2016-05-23 120 * we corrupt it.
0eea08678ebe9f Minfei Huang 2016-05-23 121 */
0eea08678ebe9f Minfei Huang 2016-05-23 @122 kimage_free(xchg(&kexec_crash_image, NULL));
0eea08678ebe9f Minfei Huang 2016-05-23 123 }
0eea08678ebe9f Minfei Huang 2016-05-23 124
0eea08678ebe9f Minfei Huang 2016-05-23 125 ret = kimage_alloc_init(&image, entry, nr_segments, segments, flags);
0eea08678ebe9f Minfei Huang 2016-05-23 126 if (ret)
4b692e86161935 Arnd Bergmann 2021-09-08 127 goto out_unlock;
0eea08678ebe9f Minfei Huang 2016-05-23 128
0eea08678ebe9f Minfei Huang 2016-05-23 129 if (flags & KEXEC_PRESERVE_CONTEXT)
0eea08678ebe9f Minfei Huang 2016-05-23 130 image->preserve_context = 1;
0eea08678ebe9f Minfei Huang 2016-05-23 131
0eea08678ebe9f Minfei Huang 2016-05-23 @132 ret = machine_kexec_prepare(image);
0eea08678ebe9f Minfei Huang 2016-05-23 133 if (ret)
0eea08678ebe9f Minfei Huang 2016-05-23 134 goto out;
0eea08678ebe9f Minfei Huang 2016-05-23 135
1229384f5b856d Xunlei Pang 2017-07-12 136 /*
1229384f5b856d Xunlei Pang 2017-07-12 137 * Some architecture(like S390) may touch the crash memory before
1229384f5b856d Xunlei Pang 2017-07-12 138 * machine_kexec_prepare(), we must copy vmcoreinfo data after it.
1229384f5b856d Xunlei Pang 2017-07-12 139 */
1229384f5b856d Xunlei Pang 2017-07-12 @140 ret = kimage_crash_copy_vmcoreinfo(image);
1229384f5b856d Xunlei Pang 2017-07-12 141 if (ret)
1229384f5b856d Xunlei Pang 2017-07-12 142 goto out;
1229384f5b856d Xunlei Pang 2017-07-12 143
0eea08678ebe9f Minfei Huang 2016-05-23 144 for (i = 0; i < nr_segments; i++) {
0eea08678ebe9f Minfei Huang 2016-05-23 @145 ret = kimage_load_segment(image, &image->segment[i]);
0eea08678ebe9f Minfei Huang 2016-05-23 146 if (ret)
0eea08678ebe9f Minfei Huang 2016-05-23 147 goto out;
0eea08678ebe9f Minfei Huang 2016-05-23 148 }
0eea08678ebe9f Minfei Huang 2016-05-23 149
0eea08678ebe9f Minfei Huang 2016-05-23 150 kimage_terminate(image);
0eea08678ebe9f Minfei Huang 2016-05-23 151
de68e4daea9084 Pavel Tatashin 2019-12-04 @152 ret = machine_kexec_post_load(image);
de68e4daea9084 Pavel Tatashin 2019-12-04 153 if (ret)
de68e4daea9084 Pavel Tatashin 2019-12-04 154 goto out;
de68e4daea9084 Pavel Tatashin 2019-12-04 155
0eea08678ebe9f Minfei Huang 2016-05-23 156 /* Install the new kernel and uninstall the old */
0eea08678ebe9f Minfei Huang 2016-05-23 157 image = xchg(dest_image, image);
0eea08678ebe9f Minfei Huang 2016-05-23 158
0eea08678ebe9f Minfei Huang 2016-05-23 159 out:
0eea08678ebe9f Minfei Huang 2016-05-23 160 if ((flags & KEXEC_ON_CRASH) && kexec_crash_image)
0eea08678ebe9f Minfei Huang 2016-05-23 @161 arch_kexec_protect_crashkres();
0eea08678ebe9f Minfei Huang 2016-05-23 162
0eea08678ebe9f Minfei Huang 2016-05-23 163 kimage_free(image);
4b692e86161935 Arnd Bergmann 2021-09-08 164 out_unlock:
05c6257433b721 Valentin Schneider 2022-06-30 165 kexec_unlock();
0eea08678ebe9f Minfei Huang 2016-05-23 166 return ret;
0eea08678ebe9f Minfei Huang 2016-05-23 167 }
0eea08678ebe9f Minfei Huang 2016-05-23 168
dc009d92435f99 Eric W. Biederman 2005-06-25 169 /*
dc009d92435f99 Eric W. Biederman 2005-06-25 170 * Exec Kernel system call: for obvious reasons only root may call it.
dc009d92435f99 Eric W. Biederman 2005-06-25 171 *
dc009d92435f99 Eric W. Biederman 2005-06-25 172 * This call breaks up into three pieces.
dc009d92435f99 Eric W. Biederman 2005-06-25 173 * - A generic part which loads the new kernel from the current
dc009d92435f99 Eric W. Biederman 2005-06-25 174 * address space, and very carefully places the data in the
dc009d92435f99 Eric W. Biederman 2005-06-25 175 * allocated pages.
dc009d92435f99 Eric W. Biederman 2005-06-25 176 *
dc009d92435f99 Eric W. Biederman 2005-06-25 177 * - A generic part that interacts with the kernel and tells all of
dc009d92435f99 Eric W. Biederman 2005-06-25 178 * the devices to shut down. Preventing on-going dmas, and placing
dc009d92435f99 Eric W. Biederman 2005-06-25 179 * the devices in a consistent state so a later kernel can
dc009d92435f99 Eric W. Biederman 2005-06-25 180 * reinitialize them.
dc009d92435f99 Eric W. Biederman 2005-06-25 181 *
dc009d92435f99 Eric W. Biederman 2005-06-25 182 * - A machine specific part that includes the syscall number
002ace782cc8ee Geert Uytterhoeven 2013-09-15 183 * and then copies the image to it's final destination. And
dc009d92435f99 Eric W. Biederman 2005-06-25 184 * jumps into the image at entry.
dc009d92435f99 Eric W. Biederman 2005-06-25 185 *
dc009d92435f99 Eric W. Biederman 2005-06-25 186 * kexec does not sync, or unmount filesystems so if you need
dc009d92435f99 Eric W. Biederman 2005-06-25 187 * that to happen you need to do that yourself.
dc009d92435f99 Eric W. Biederman 2005-06-25 188 */
8c5a1cf0ad3ac5 Andrew Morton 2008-08-15 189
6b27aef09fea32 Dominik Brodowski 2018-03-17 190 static inline int kexec_load_check(unsigned long nr_segments,
6b27aef09fea32 Dominik Brodowski 2018-03-17 191 unsigned long flags)
dc009d92435f99 Eric W. Biederman 2005-06-25 192 {
a42aaad2e47b23 Ricardo Ribalda 2023-01-04 193 int image_type = (flags & KEXEC_ON_CRASH) ?
a42aaad2e47b23 Ricardo Ribalda 2023-01-04 @194 KEXEC_TYPE_CRASH : KEXEC_TYPE_DEFAULT;
a210fd32a46bae Mimi Zohar 2018-07-13 195 int result;
a210fd32a46bae Mimi Zohar 2018-07-13 196
dc009d92435f99 Eric W. Biederman 2005-06-25 197 /* We only trust the superuser with rebooting the system. */
a42aaad2e47b23 Ricardo Ribalda 2023-01-04 @198 if (!kexec_load_permitted(image_type))
dc009d92435f99 Eric W. Biederman 2005-06-25 199 return -EPERM;
dc009d92435f99 Eric W. Biederman 2005-06-25 200
a210fd32a46bae Mimi Zohar 2018-07-13 201 /* Permit LSMs and IMA to fail the kexec */
b64fcae74b6d69 Kees Cook 2020-10-02 202 result = security_kernel_load_data(LOADING_KEXEC_IMAGE, false);
a210fd32a46bae Mimi Zohar 2018-07-13 203 if (result < 0)
a210fd32a46bae Mimi Zohar 2018-07-13 204 return result;
a210fd32a46bae Mimi Zohar 2018-07-13 205
7d31f4602f8d36 Matthew Garrett 2019-08-19 206 /*
7d31f4602f8d36 Matthew Garrett 2019-08-19 207 * kexec can be used to circumvent module loading restrictions, so
7d31f4602f8d36 Matthew Garrett 2019-08-19 208 * prevent loading in that case
7d31f4602f8d36 Matthew Garrett 2019-08-19 209 */
7d31f4602f8d36 Matthew Garrett 2019-08-19 210 result = security_locked_down(LOCKDOWN_KEXEC);
7d31f4602f8d36 Matthew Garrett 2019-08-19 211 if (result)
7d31f4602f8d36 Matthew Garrett 2019-08-19 212 return result;
7d31f4602f8d36 Matthew Garrett 2019-08-19 213
dc009d92435f99 Eric W. Biederman 2005-06-25 214 /*
dc009d92435f99 Eric W. Biederman 2005-06-25 215 * Verify we have a legal set of flags
dc009d92435f99 Eric W. Biederman 2005-06-25 216 * This leaves us room for future extensions.
dc009d92435f99 Eric W. Biederman 2005-06-25 217 */
dc009d92435f99 Eric W. Biederman 2005-06-25 @218 if ((flags & KEXEC_FLAGS) != (flags & ~KEXEC_ARCH_MASK))
dc009d92435f99 Eric W. Biederman 2005-06-25 219 return -EINVAL;
dc009d92435f99 Eric W. Biederman 2005-06-25 220
dc009d92435f99 Eric W. Biederman 2005-06-25 221 /* Put an artificial cap on the number
dc009d92435f99 Eric W. Biederman 2005-06-25 222 * of segments passed to kexec_load.
dc009d92435f99 Eric W. Biederman 2005-06-25 223 */
dc009d92435f99 Eric W. Biederman 2005-06-25 224 if (nr_segments > KEXEC_SEGMENT_MAX)
dc009d92435f99 Eric W. Biederman 2005-06-25 225 return -EINVAL;
dc009d92435f99 Eric W. Biederman 2005-06-25 226
6b27aef09fea32 Dominik Brodowski 2018-03-17 227 return 0;
6b27aef09fea32 Dominik Brodowski 2018-03-17 228 }
6b27aef09fea32 Dominik Brodowski 2018-03-17 229
:::::: The code at line 33 was first introduced by commit
:::::: 43546d8669d62d75fa69ca9a45d2f586665f56bd kexec: allow architectures to override boot mapping
:::::: TO: Russell King <rmk+kernel@xxxxxxxxxxxxxxxx>
:::::: CC: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>