3 #include "xlat/kexec_load_flags.h"
4 #include "xlat/kexec_arch_values.h"
6 #ifndef KEXEC_ARCH_MASK
7 # define KEXEC_ARCH_MASK 0xffff0000
9 #ifndef KEXEC_SEGMENT_MAX
10 # define KEXEC_SEGMENT_MAX 16
14 print_kexec_segments(struct tcb *tcp, unsigned long addr, unsigned long len)
16 #if SUPPORTED_PERSONALITIES > 1
18 struct { u_int32_t buf, bufsz, mem, memsz; } seg32;
19 struct { u_int64_t buf, bufsz, mem, memsz; } seg64;
22 (current_wordsize == 4 ? sizeof(seg.seg32) : sizeof(seg.seg64))
24 (current_wordsize == 4 ? (uint64_t) seg.seg32.buf : seg.seg64.buf)
26 (current_wordsize == 4 ? (uint64_t) seg.seg32.bufsz : seg.seg64.bufsz)
28 (current_wordsize == 4 ? (uint64_t) seg.seg32.mem : seg.seg64.mem)
30 (current_wordsize == 4 ? (uint64_t) seg.seg32.memsz : seg.seg64.memsz)
38 # define sizeof_seg sizeof(seg)
39 # define seg_buf seg.buf
40 # define seg_bufsz seg.bufsz
41 # define seg_mem seg.mem
42 # define seg_memsz seg.memsz
44 unsigned int i, failed;
51 if (len > KEXEC_SEGMENT_MAX) {
52 tprintf("%#lx", addr);
58 for (i = 0; i < len; ++i) {
61 if (umoven(tcp, addr + i * sizeof_seg, sizeof_seg,
67 tprintf("{%#lx, %lu, %#lx, %lu}",
68 (long) seg_buf, (unsigned long) seg_bufsz,
69 (long) seg_mem, (unsigned long) seg_memsz);
73 tprintf(" %#lx", addr);
77 sys_kexec_load(struct tcb *tcp)
84 /* entry, nr_segments */
85 tprintf("%#lx, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
88 print_kexec_segments(tcp, tcp->u_arg[2], tcp->u_arg[1]);
93 printxval(kexec_arch_values, n & KEXEC_ARCH_MASK, "KEXEC_ARCH_???");
94 n &= ~KEXEC_ARCH_MASK;
97 printflags(kexec_load_flags, n, "KEXEC_???");