@@ -205,6 +205,34 @@ static int get_crash_memory_ranges(struct crash_mem **mem_ranges)
205
205
return ret ;
206
206
}
207
207
208
+ /**
209
+ * get_reserved_memory_ranges - Get reserve memory ranges. This list includes
210
+ * memory regions that should be added to the
211
+ * memory reserve map to ensure the region is
212
+ * protected from any mischief.
213
+ * @mem_ranges: Range list to add the memory ranges to.
214
+ *
215
+ * Returns 0 on success, negative errno on error.
216
+ */
217
+ static int get_reserved_memory_ranges (struct crash_mem * * mem_ranges )
218
+ {
219
+ int ret ;
220
+
221
+ ret = add_rtas_mem_range (mem_ranges );
222
+ if (ret )
223
+ goto out ;
224
+
225
+ ret = add_tce_mem_ranges (mem_ranges );
226
+ if (ret )
227
+ goto out ;
228
+
229
+ ret = add_reserved_mem_ranges (mem_ranges );
230
+ out :
231
+ if (ret )
232
+ pr_err ("Failed to setup reserved memory ranges\n" );
233
+ return ret ;
234
+ }
235
+
208
236
/**
209
237
* __locate_mem_hole_top_down - Looks top down for a large enough memory hole
210
238
* in the memory regions between buf_min & buf_max
@@ -897,8 +925,8 @@ int setup_new_fdt_ppc64(const struct kimage *image, void *fdt,
897
925
unsigned long initrd_load_addr ,
898
926
unsigned long initrd_len , const char * cmdline )
899
927
{
900
- struct crash_mem * umem = NULL ;
901
- int ret ;
928
+ struct crash_mem * umem = NULL , * rmem = NULL ;
929
+ int i , nr_ranges , ret ;
902
930
903
931
ret = setup_new_fdt (image , fdt , initrd_load_addr , initrd_len , cmdline );
904
932
if (ret )
@@ -941,7 +969,27 @@ int setup_new_fdt_ppc64(const struct kimage *image, void *fdt,
941
969
}
942
970
}
943
971
972
+ /* Update memory reserve map */
973
+ ret = get_reserved_memory_ranges (& rmem );
974
+ if (ret )
975
+ goto out ;
976
+
977
+ nr_ranges = rmem ? rmem -> nr_ranges : 0 ;
978
+ for (i = 0 ; i < nr_ranges ; i ++ ) {
979
+ u64 base , size ;
980
+
981
+ base = rmem -> ranges [i ].start ;
982
+ size = rmem -> ranges [i ].end - base + 1 ;
983
+ ret = fdt_add_mem_rsv (fdt , base , size );
984
+ if (ret ) {
985
+ pr_err ("Error updating memory reserve map: %s\n" ,
986
+ fdt_strerror (ret ));
987
+ goto out ;
988
+ }
989
+ }
990
+
944
991
out :
992
+ kfree (rmem );
945
993
kfree (umem );
946
994
return ret ;
947
995
}
@@ -1024,10 +1072,10 @@ int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
1024
1072
1025
1073
/* Get exclude memory ranges needed for setting up kdump segments */
1026
1074
ret = get_exclude_memory_ranges (& (image -> arch .exclude_ranges ));
1027
- if (ret )
1075
+ if (ret ) {
1028
1076
pr_err ("Failed to setup exclude memory ranges for buffer lookup\n" );
1029
- /* Return this until all changes for panic kernel are in */
1030
- return - EOPNOTSUPP ;
1077
+ return ret ;
1078
+ }
1031
1079
}
1032
1080
1033
1081
return kexec_image_probe_default (image , buf , buf_len );
0 commit comments