2 #include <linux/kexec.h>
4 static const struct xlat kexec_arch_values[] = {
5 XLAT(KEXEC_ARCH_DEFAULT),
7 XLAT(KEXEC_ARCH_X86_64),
9 XLAT(KEXEC_ARCH_PPC64),
10 XLAT(KEXEC_ARCH_IA_64),
12 XLAT(KEXEC_ARCH_S390),
14 XLAT(KEXEC_ARCH_MIPS_LE),
15 XLAT(KEXEC_ARCH_MIPS),
19 static const struct xlat kexec_flags[] = {
21 XLAT(KEXEC_PRESERVE_CONTEXT),
26 print_kexec_segments(struct tcb *tcp, unsigned long addr, unsigned long len)
28 #if SUPPORTED_PERSONALITIES > 1
30 struct { u_int32_t buf, bufsz, mem, memsz; } seg32;
31 struct { u_int64_t buf, bufsz, mem, memsz; } seg64;
34 (current_wordsize == 4 ? sizeof(seg.seg32) : sizeof(seg.seg64))
36 (current_wordsize == 4 ? (uint64_t) seg.seg32.buf : seg.seg64.buf)
38 (current_wordsize == 4 ? (uint64_t) seg.seg32.bufsz : seg.seg64.bufsz)
40 (current_wordsize == 4 ? (uint64_t) seg.seg32.mem : seg.seg64.mem)
42 (current_wordsize == 4 ? (uint64_t) seg.seg32.memsz : seg.seg64.memsz)
44 struct kexec_segment seg;
45 # define sizeof_seg sizeof(seg)
46 # define seg_buf seg.buf
47 # define seg_bufsz seg.bufsz
48 # define seg_mem seg.mem
49 # define seg_memsz seg.memsz
51 unsigned int i, failed;
58 if (len > KEXEC_SEGMENT_MAX) {
59 tprintf("%#lx", addr);
65 for (i = 0; i < len; ++i) {
68 if (umoven(tcp, addr + i * sizeof_seg, sizeof_seg,
74 tprintf("{%#lx, %lu, %#lx, %lu}",
75 (long) seg_buf, (unsigned long) seg_bufsz,
76 (long) seg_mem, (unsigned long) seg_memsz);
80 tprintf(" %#lx", addr);
84 sys_kexec_load(struct tcb *tcp)
91 /* entry, nr_segments */
92 tprintf("%#lx, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
95 print_kexec_segments(tcp, tcp->u_arg[2], tcp->u_arg[1]);
100 printxval(kexec_arch_values, n & KEXEC_ARCH_MASK, "KEXEC_ARCH_???");
101 n &= ~KEXEC_ARCH_MASK;
104 printflags(kexec_flags, n, "KEXEC_???");