aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/kexec.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kexec.c')
-rw-r--r--kernel/kexec.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/kernel/kexec.c b/kernel/kexec.c
index 474a84715eac..c0613f7d6730 100644
--- a/kernel/kexec.c
+++ b/kernel/kexec.c
@@ -151,8 +151,10 @@ static int do_kimage_alloc(struct kimage **rimage, unsigned long entry,
151 image->nr_segments = nr_segments; 151 image->nr_segments = nr_segments;
152 segment_bytes = nr_segments * sizeof(*segments); 152 segment_bytes = nr_segments * sizeof(*segments);
153 result = copy_from_user(image->segment, segments, segment_bytes); 153 result = copy_from_user(image->segment, segments, segment_bytes);
154 if (result) 154 if (result) {
155 result = -EFAULT;
155 goto out; 156 goto out;
157 }
156 158
157 /* 159 /*
158 * Verify we have good destination addresses. The caller is 160 * Verify we have good destination addresses. The caller is
@@ -827,7 +829,7 @@ static int kimage_load_normal_segment(struct kimage *image,
827 result = copy_from_user(ptr, buf, uchunk); 829 result = copy_from_user(ptr, buf, uchunk);
828 kunmap(page); 830 kunmap(page);
829 if (result) { 831 if (result) {
830 result = (result < 0) ? result : -EIO; 832 result = -EFAULT;
831 goto out; 833 goto out;
832 } 834 }
833 ubytes -= uchunk; 835 ubytes -= uchunk;
@@ -882,7 +884,7 @@ static int kimage_load_crash_segment(struct kimage *image,
882 kexec_flush_icache_page(page); 884 kexec_flush_icache_page(page);
883 kunmap(page); 885 kunmap(page);
884 if (result) { 886 if (result) {
885 result = (result < 0) ? result : -EIO; 887 result = -EFAULT;
886 goto out; 888 goto out;
887 } 889 }
888 ubytes -= uchunk; 890 ubytes -= uchunk;
@@ -1089,9 +1091,10 @@ void crash_kexec(struct pt_regs *regs)
1089 1091
1090size_t crash_get_memory_size(void) 1092size_t crash_get_memory_size(void)
1091{ 1093{
1092 size_t size; 1094 size_t size = 0;
1093 mutex_lock(&kexec_mutex); 1095 mutex_lock(&kexec_mutex);
1094 size = crashk_res.end - crashk_res.start + 1; 1096 if (crashk_res.end != crashk_res.start)
1097 size = crashk_res.end - crashk_res.start + 1;
1095 mutex_unlock(&kexec_mutex); 1098 mutex_unlock(&kexec_mutex);
1096 return size; 1099 return size;
1097} 1100}
@@ -1134,7 +1137,7 @@ int crash_shrink_memory(unsigned long new_size)
1134 1137
1135 free_reserved_phys_range(end, crashk_res.end); 1138 free_reserved_phys_range(end, crashk_res.end);
1136 1139
1137 if (start == end) 1140 if ((start == end) && (crashk_res.parent != NULL))
1138 release_resource(&crashk_res); 1141 release_resource(&crashk_res);
1139 crashk_res.end = end - 1; 1142 crashk_res.end = end - 1;
1140 1143