RAM boundary which includes all the sections is needed for creating
identity page mapping and to enable d-cache for those areas.

Signed-off-by: Pratyush Anand <pan...@redhat.com>
---
 kexec/arch/arm64/include/types.h | 16 ++++++++++++++++
 kexec/arch/arm64/kexec-arm64.c   | 16 +++++++++++++++-
 purgatory/arch/arm64/entry.S     | 10 ++++++++++
 3 files changed, 41 insertions(+), 1 deletion(-)
 create mode 100644 kexec/arch/arm64/include/types.h

diff --git a/kexec/arch/arm64/include/types.h b/kexec/arch/arm64/include/types.h
new file mode 100644
index 000000000000..08f833a6d585
--- /dev/null
+++ b/kexec/arch/arm64/include/types.h
@@ -0,0 +1,16 @@
+#ifndef _TYPES_H_
+#define _TYPES_H_
+
+#define min(x,y) ({ \
+       typeof(x) _x = (x);     \
+       typeof(y) _y = (y);     \
+       (void) (&_x == &_y);    \
+       _x < _y ? _x : _y; })
+
+#define max(x,y) ({ \
+       typeof(x) _x = (x);     \
+       typeof(y) _y = (y);     \
+       (void) (&_x == &_y);    \
+       _x > _y ? _x : _y; })
+
+#endif /* _TYPES_H_ */
diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c
index 12c589f8001c..8ce4a61fc9c2 100644
--- a/kexec/arch/arm64/kexec-arm64.c
+++ b/kexec/arch/arm64/kexec-arm64.c
@@ -28,6 +28,7 @@
 #include "fs2dt.h"
 #include "kexec-syscall.h"
 #include "arch/options.h"
+#include "types.h"
 
 /* Global varables the core kexec routines expect. */
 
@@ -588,9 +589,11 @@ static uint64_t read_sink(const char *command_line)
 int arm64_load_other_segments(struct kexec_info *info,
        unsigned long kernel_entry, char *option)
 {
-       int result;
+       int result, i;
        struct mem_ehdr ehdr;
        unsigned long dtb_base;
+       unsigned long arm64_ram_start = -1;
+       unsigned long arm64_ram_end = 0;
        unsigned long hole_min, hole_max;
        char *initrd_buf = NULL;
        uint64_t purgatory_sink;
@@ -720,6 +723,17 @@ int arm64_load_other_segments(struct kexec_info *info,
 
                elf_rel_set_symbol(&info->rhdr, "arm64_dtb_addr", &dtb_base,
                                sizeof(dtb_base));
+               for (i = 0; i < info->nr_segments; i++) {
+                       arm64_ram_start = min(arm64_ram_start,
+                                       (unsigned long)info->segment[i].mem);
+                       arm64_ram_end = max(arm64_ram_end,
+                               ((unsigned long)info->segment[i].mem + 
+                               info->segment[i].memsz));
+               }
+               elf_rel_set_symbol(&info->rhdr, "arm64_ram_start",
+                               &arm64_ram_start, sizeof(arm64_ram_start));
+               elf_rel_set_symbol(&info->rhdr, "arm64_ram_end",
+                               &arm64_ram_end, sizeof(arm64_ram_end));
        }
 
        return 0;
diff --git a/purgatory/arch/arm64/entry.S b/purgatory/arch/arm64/entry.S
index 140e91d87ab1..0713ccdec4ad 100644
--- a/purgatory/arch/arm64/entry.S
+++ b/purgatory/arch/arm64/entry.S
@@ -52,3 +52,13 @@ size arm64_kernel_entry
 arm64_dtb_addr:
        .quad   0
 size arm64_dtb_addr
+
+.globl arm64_ram_start
+arm64_ram_start:
+       .quad   0
+size arm64_ram_start
+
+.globl arm64_ram_end
+arm64_ram_end:
+       .quad   0
+size arm64_ram_end
-- 
2.1.0


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to