From: Dmitry V. Levin Date: Sat, 7 May 2016 22:59:05 +0000 (+0000) Subject: kexec.c: use print_array function X-Git-Tag: v4.12~219 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ba4a4c60cffd91097446fbc7ae583e12df0fea89;p=strace kexec.c: use print_array function * kexec.c (print_seg): Change for use as print_array callback. (print_kexec_segments): Use print_array. --- diff --git a/kexec.c b/kexec.c index 89b75282..02d6a57b 100644 --- a/kexec.c +++ b/kexec.c @@ -37,50 +37,45 @@ # define KEXEC_SEGMENT_MAX 16 #endif -static void -print_seg(const unsigned long *seg) +static bool +print_seg(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data) { + const unsigned long *seg; + unsigned long seg_buf[4]; + + if (elem_size < sizeof(seg_buf)) { + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(seg_buf); ++i) + seg_buf[i] = ((unsigned int *) elem_buf)[i]; + seg = seg_buf; + } else { + seg = elem_buf; + } + tprints("{"); printaddr(seg[0]); tprintf(", %lu, ", seg[1]); printaddr(seg[2]); tprintf(", %lu}", seg[3]); + + return true; } static void print_kexec_segments(struct tcb *tcp, const unsigned long addr, const unsigned long len) { - unsigned long seg[4]; - const size_t sizeof_seg = ARRAY_SIZE(seg) * current_wordsize; - unsigned int i; - - if (!len) { - tprints("[]"); - return; - } - if (len > KEXEC_SEGMENT_MAX) { printaddr(addr); return; } - if (umove_ulong_array_or_printaddr(tcp, addr, seg, ARRAY_SIZE(seg))) - return; - - tprints("["); - print_seg(seg); - - for (i = 1; i < len; ++i) { - tprints(", "); - if (umove_ulong_array_or_printaddr(tcp, - addr + i * sizeof_seg, - seg, ARRAY_SIZE(seg))) - break; - print_seg(seg); - } + unsigned long seg[4]; + const size_t sizeof_seg = ARRAY_SIZE(seg) * current_wordsize; - tprints("]"); + print_array(tcp, addr, len, seg, sizeof_seg, + umoven_or_printaddr, print_seg, 0); } SYS_FUNC(kexec_load)