/* * kexec-cris.c * Copyright (C) 2008 AXIS Communications AB * Written by Edgar E. Iglesias * * This source code is licensed under the GNU General Public License, * Version 2. See the file COPYING for more details. */ #include #include #include #include #include #include #include "../../kexec.h" #include "../../kexec-syscall.h" #include "kexec-cris.h" #include #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. */ int get_memory_ranges(struct memory_range **range, int *ranges, unsigned long kexec_flags) { int memory_ranges = 0; memory_range[memory_ranges].start = 0x40000000; memory_range[memory_ranges].end = 0x41000000; memory_range[memory_ranges].type = RANGE_RAM; memory_ranges++; memory_range[memory_ranges].start = 0xc0000000; memory_range[memory_ranges].end = 0xc1000000; memory_range[memory_ranges].type = RANGE_RAM; memory_ranges++; *range = memory_range; *ranges = memory_ranges; return 0; } struct file_type file_type[] = { {"elf-cris", elf_cris_probe, elf_cris_load, elf_cris_usage}, }; int file_types = sizeof(file_type) / sizeof(file_type[0]); void arch_usage(void) { } int arch_process_options(int argc, char **argv) { static const struct option options[] = { KEXEC_ARCH_OPTIONS { 0, 0, NULL, 0 }, }; static const char short_options[] = KEXEC_ARCH_OPT_STR; int opt; opterr = 0; /* Don't complain about unrecognized options here */ while((opt = getopt_long(argc, argv, short_options, options, 0)) != -1) { switch(opt) { default: break; } } /* Reset getopt for the next pass; called in other source modules */ opterr = 1; optind = 1; return 0; } const struct arch_map_entry arches[] = { { "cris", KEXEC_ARCH_CRIS }, { "crisv32", KEXEC_ARCH_CRIS }, { 0 }, }; int arch_compat_trampoline(struct kexec_info *info) { return 0; } void arch_update_purgatory(struct kexec_info *info) { } int is_crashkernel_mem_reserved(void) { return 1; } unsigned long virt_to_phys(unsigned long addr) { return (addr) & 0x7fffffff; } /* * add_segment() should convert base to a physical address on superh, * while the default is just to work with base as is */ 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_buffer() should convert base to a physical address on superh, * while the default is just to work with base as is */ unsigned long add_buffer(struct kexec_info *info, const void *buf, unsigned long bufsz, unsigned long memsz, unsigned long buf_align, unsigned long buf_min, unsigned long buf_max, int buf_end) { return add_buffer_phys_virt(info, buf, bufsz, memsz, buf_align, buf_min, buf_max, buf_end, 1); }