summaryrefslogtreecommitdiff
path: root/kexec/arch/mips/kexec-mips.c
diff options
context:
space:
mode:
Diffstat (limited to 'kexec/arch/mips/kexec-mips.c')
-rw-r--r--kexec/arch/mips/kexec-mips.c51
1 files changed, 15 insertions, 36 deletions
diff --git a/kexec/arch/mips/kexec-mips.c b/kexec/arch/mips/kexec-mips.c
index cb75a2d..bd12bb3 100644
--- a/kexec/arch/mips/kexec-mips.c
+++ b/kexec/arch/mips/kexec-mips.c
@@ -21,8 +21,6 @@
#include "kexec-mips.h"
#include <arch/options.h>
-#define MAX_MEMORY_RANGES 64
-#define MAX_LINE 160
static struct memory_range memory_range[MAX_MEMORY_RANGES];
/* Return a sorted list of memory ranges. */
@@ -31,16 +29,6 @@ int get_memory_ranges(struct memory_range **range, int *ranges,
{
int memory_ranges = 0;
-#if 1
- /* this is valid for gemini2 platform based on tx4938
- * in our case, /proc/iomem doesn't report ram space
- */
- memory_range[memory_ranges].start = 0x00000000;
- memory_range[memory_ranges].end = 0x04000000;
- memory_range[memory_ranges].type = RANGE_RAM;
- memory_ranges++;
-#else
-#error Please, fix this for your platform
const char iomem[] = "/proc/iomem";
char line[MAX_LINE];
FILE *fp;
@@ -61,31 +49,19 @@ int get_memory_ranges(struct memory_range **range, int *ranges,
continue;
str = line + consumed;
end = end + 1;
-#if 0
- printf("%016Lx-%016Lx : %s\n", start, end, str);
-#endif
if (memcmp(str, "System RAM\n", 11) == 0) {
type = RANGE_RAM;
} else if (memcmp(str, "reserved\n", 9) == 0) {
type = RANGE_RESERVED;
- } else if (memcmp(str, "ACPI Tables\n", 12) == 0) {
- type = RANGE_ACPI;
- } else if (memcmp(str, "ACPI Non-volatile Storage\n", 26) == 0) {
- type = RANGE_ACPI_NVS;
} else {
continue;
}
memory_range[memory_ranges].start = start;
memory_range[memory_ranges].end = end;
memory_range[memory_ranges].type = type;
-#if 0
- printf("%016Lx-%016Lx : %x\n", start, end, type);
-#endif
memory_ranges++;
}
fclose(fp);
-#endif
-
*range = memory_range;
*ranges = memory_ranges;
return 0;
@@ -98,8 +74,18 @@ int file_types = sizeof(file_type) / sizeof(file_type[0]);
void arch_usage(void)
{
+#ifdef __mips64
+ fprintf(stderr, " --elf32-core-headers Prepare core headers in "
+ "ELF32 format\n");
+#endif
}
+#ifdef __mips64
+struct arch_options_t arch_options = {
+ .core_header_type = CORE_TYPE_ELF64
+};
+#endif
+
int arch_process_options(int argc, char **argv)
{
static const struct option options[] = {
@@ -126,12 +112,14 @@ const struct arch_map_entry arches[] = {
/* For compatibility with older patches
* use KEXEC_ARCH_DEFAULT instead of KEXEC_ARCH_MIPS here.
*/
- { "mips", KEXEC_ARCH_DEFAULT },
+ { "mips", KEXEC_ARCH_MIPS },
+ { "mips64", KEXEC_ARCH_MIPS },
{ NULL, 0 },
};
int arch_compat_trampoline(struct kexec_info *UNUSED(info))
{
+
return 0;
}
@@ -139,18 +127,9 @@ void arch_update_purgatory(struct kexec_info *UNUSED(info))
{
}
-/*
- * Adding a dummy function, so that build on mips will not break.
- * Need to implement the actual checking code
- */
-int is_crashkernel_mem_reserved(void)
-{
- return 1;
-}
-
unsigned long virt_to_phys(unsigned long addr)
{
- return addr - 0x80000000;
+ return addr & 0x7fffffff;
}
/*
@@ -159,7 +138,7 @@ unsigned long virt_to_phys(unsigned long addr)
void add_segment(struct kexec_info *info, const void *buf, size_t bufsz,
unsigned long base, size_t memsz)
{
- add_segment_phys_virt(info, buf, bufsz, base, memsz, 1);
+ add_segment_phys_virt(info, buf, bufsz, virt_to_phys(base), memsz, 1);
}
/*