[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 1/3] lib/ukdebug: Move hexdump output demultiplexer
Reviewed-by: Felipe Huici <felipe.huici@xxxxxxxxx> On Tue, Mar 31, 2020 at 11:50 PM Simon Kuenzer <simon.kuenzer@xxxxxxxxx> wrote: > > This commit moves the output demultiplexer from hexdump to an own > place so that it could be used by other ukdebug-internal routines. > > Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> > --- > lib/ukdebug/Makefile.uk | 1 + > lib/ukdebug/hexdump.c | 142 ++++++++-------------------------------- > lib/ukdebug/outf.c | 85 ++++++++++++++++++++++++ > lib/ukdebug/outf.h | 114 ++++++++++++++++++++++++++++++++ > 4 files changed, 227 insertions(+), 115 deletions(-) > create mode 100644 lib/ukdebug/outf.c > create mode 100644 lib/ukdebug/outf.h > > diff --git a/lib/ukdebug/Makefile.uk b/lib/ukdebug/Makefile.uk > index 8f46061d..6b3acf7a 100644 > --- a/lib/ukdebug/Makefile.uk > +++ b/lib/ukdebug/Makefile.uk > @@ -8,6 +8,7 @@ LIBUKDEBUG_CXXFLAGS-y += -D__IN_LIBUKDEBUG__ > > LIBUKDEBUG_SRCS-y += $(LIBUKDEBUG_BASE)/print.c > LIBUKDEBUG_SRCS-$(CONFIG_HAVE_LIBC) += $(LIBUKDEBUG_BASE)/snprintf.c > +LIBUKDEBUG_SRCS-y += $(LIBUKDEBUG_BASE)/outf.c > LIBUKDEBUG_SRCS-y += $(LIBUKDEBUG_BASE)/hexdump.c > LIBUKDEBUG_SRCS-$(CONFIG_LIBUKDEBUG_TRACEPOINTS) += > $(LIBUKDEBUG_BASE)/trace.c > LIBUKDEBUG_SRCS-$(CONFIG_LIBVFSCORE) += $(LIBUKDEBUG_BASE)/extra.ld > diff --git a/lib/ukdebug/hexdump.c b/lib/ukdebug/hexdump.c > index fc57c673..0708489d 100644 > --- a/lib/ukdebug/hexdump.c > +++ b/lib/ukdebug/hexdump.c > @@ -36,9 +36,7 @@ > */ > > #include <string.h> > -#include <inttypes.h> > -#include <stdarg.h> > -#include "snprintf.h" > +#include "outf.h" > > #include <uk/arch/types.h> > #include <uk/essentials.h> > @@ -49,90 +47,11 @@ > (UK_HXDF_GRPBYTE | UK_HXDF_GRPWORD | UK_HXDF_GRPDWORD > \ > | UK_HXDF_GRPQWORD) > > -enum _hxd_output_type { > - UK_HXDOUT_FILE = 0, > - UK_HXDOUT_BUFFER, > -#if CONFIG_LIBUKDEBUG_PRINTK > - UK_HXDOUT_KERN, > -#endif > - UK_HXDOUT_DEBUG, > -}; > - > -struct _hxd_output { > - enum _hxd_output_type type; > - > - union { > - /* UK_HXDOUT_KERN, UK_HXDOUT_DEBUG */ > - struct { > - int lvl; /* UK_HXDOUT_KERN only */ > - const char *libname; > - const char *srcname; > - unsigned int srcline; > - } ukprint; > - > - /* UK_HXDOUT_FILE */ > - struct { > - FILE *fp; > - } file; > - > - /* UK_HXDOUT_BUFFER */ > - struct { > - char *pos; > - size_t left; > - } buffer; > - }; > -}; > - > -/** > - * Send a formatted string to an output device > - */ > -static int _hxd_outf(struct _hxd_output *o, const char *fmt, ...) > -{ > - int ret = 0; > - va_list ap; > - > - va_start(ap, fmt); > - switch (o->type) { > - case UK_HXDOUT_FILE: > - /* Use standard libc approach when printing to a file */ > - ret = vfprintf(o->file.fp, fmt, ap); > - break; > - case UK_HXDOUT_BUFFER: > - ret = __uk_vsnprintf(o->buffer.pos, o->buffer.left, fmt, ap); > - > - if (ret > 0) { > - /* in order to overwrite '\0' by successive calls, > - * we move the buffer pointer by (ret-1) characters > - */ > - o->buffer.pos += (ret - 1); > - o->buffer.left -= (ret - 1); > - } > - break; > - case UK_HXDOUT_DEBUG: > - _uk_vprintd(o->ukprint.libname, > - o->ukprint.srcname, o->ukprint.srcline, > - fmt, ap); > - break; > -#if CONFIG_LIBUKDEBUG_PRINTK > - case UK_HXDOUT_KERN: > - _uk_vprintk(o->ukprint.lvl, o->ukprint.libname, > - o->ukprint.srcname, o->ukprint.srcline, > - fmt, ap); > - break; > -#endif > - default: > - break; > - } > - va_end(ap); > - > - return ret; > -} > - > /** > * Plot one hexdump data line > * This function is called by _hxd() > */ > -static inline size_t _hxd_line(struct _hxd_output *o, const unsigned char > *data, > +static inline size_t _hxd_line(struct out_dev *o, const unsigned char *data, > size_t len, size_t linelen, int flags) > { > size_t i, grplen = 0; > @@ -151,13 +70,13 @@ static inline size_t _hxd_line(struct _hxd_output *o, > const unsigned char *data, > /* hex section */ > for (i = 0; i < len; ++i) { > c = *(data + i); > - iret = _hxd_outf(o, "%02x ", (unsigned char)c); > + iret = outf(o, "%02x ", (unsigned char)c); > if (iret < 0) > return iret; > ret += iret; > > if (i && grplen && ((i + 1) % grplen == 0)) { > - iret = _hxd_outf(o, " "); > + iret = outf(o, " "); > if (iret < 0) > return iret; > ret += iret; > @@ -168,45 +87,45 @@ static inline size_t _hxd_line(struct _hxd_output *o, > const unsigned char *data, > if (flags & UK_HXDF_ASCIISEC) { > /* fillup to align ascii section */ > for (; i < linelen; ++i) { > - iret = _hxd_outf(o, " "); > + iret = outf(o, " "); > if (iret < 0) > return iret; > ret += iret; > > if (i && grplen && ((i + 1) % grplen == 0)) { > - iret = _hxd_outf(o, " "); > + iret = outf(o, " "); > if (iret < 0) > return iret; > ret += iret; > } > } > if (!grplen) { > - iret = _hxd_outf(o, " "); > + iret = outf(o, " "); > if (iret < 0) > return iret; > ret += iret; > } > > /* print ascii characters */ > - iret = _hxd_outf(o, "|"); > + iret = outf(o, "|"); > if (iret < 0) > return iret; > ret += iret; > for (i = 0; i < len; ++i) { > c = *(data + i); > - iret = _hxd_outf(o, "%c", > - (c >= ' ' && c <= '~') ? c : '.'); > + iret = outf(o, "%c", > + (c >= ' ' && c <= '~') ? c : '.'); > if (iret < 0) > return iret; > ret += iret; > } > - iret = _hxd_outf(o, "|"); > + iret = outf(o, "|"); > if (iret < 0) > return iret; > ret += iret; > } > > - iret = _hxd_outf(o, "\n"); > + iret = outf(o, "\n"); > if (iret < 0) > return iret; > ret += iret; > @@ -227,7 +146,7 @@ static inline size_t _hxd_line(struct _hxd_output *o, > const unsigned char *data, > * @param line_prefix String to be prepended to each line, can be NULL > * @return Returns the number of printed characters to output o > */ > -static int _hxd(struct _hxd_output *o, const void *data, size_t len, > +static int _hxd(struct out_dev *o, const void *data, size_t len, > size_t addr0, int flags, unsigned int grps_per_line, > const char *line_prefix) > { > @@ -266,7 +185,7 @@ static int _hxd(struct _hxd_output *o, const void *data, > size_t len, > ((const unsigned char *)data) + i, > linebytes) > == 0) { > if (!prevc) { > - iret = _hxd_outf(o, "*\n"); > + iret = outf(o, "*\n"); > if (iret < 0) > return iret; > ret += iret; > @@ -278,16 +197,15 @@ static int _hxd(struct _hxd_output *o, const void > *data, size_t len, > prevc = 0; > > if (line_prefix) { > - iret = _hxd_outf(o, "%s", line_prefix); > + iret = outf(o, "%s", line_prefix); > if (iret < 0) > return iret; > ret += iret; > } > > if (flags & UK_HXDF_ADDR) { > - iret = _hxd_outf(o, "%08"__PRIuptr > - " ", > - (__uptr)(i + addr0)); > + iret = outf(o, "%08"__PRIuptr" ", > + (__uptr)(i + addr0)); > if (iret < 0) > return iret; > ret += iret; > @@ -308,21 +226,20 @@ int uk_hexdumpsn(char *str, size_t size, const void > *data, size_t len, > size_t addr0, int flags, unsigned int grps_per_line, > const char *line_prefix) > { > - struct _hxd_output o = {.type = UK_HXDOUT_BUFFER, > - .buffer.pos = str, > - .buffer.left = size}; > - UK_ASSERT(str != NULL); > + struct out_dev o; > > + UK_ASSERT(str != NULL); > + out_dev_init_buffer(&o, str, size); > return _hxd(&o, data, len, addr0, flags, grps_per_line, line_prefix); > } > > int uk_hexdumpf(FILE *fp, const void *data, size_t len, size_t addr0, int > flags, > unsigned int grps_per_line, const char *line_prefix) > { > - struct _hxd_output o = {.type = UK_HXDOUT_FILE, > - .file.fp = fp}; > - UK_ASSERT(fp != NULL); > + struct out_dev o; > > + UK_ASSERT(fp != NULL); > + out_dev_init_file(&o, fp); > return _hxd(&o, data, len, addr0, flags, grps_per_line, line_prefix); > } > > @@ -331,11 +248,9 @@ void _uk_hexdumpd(const char *libname, const char > *srcname, > size_t addr0, int flags, unsigned int grps_per_line, > const char *line_prefix) > { > - struct _hxd_output o = {.type = UK_HXDOUT_DEBUG, > - .ukprint.libname = libname, > - .ukprint.srcname = srcname, > - .ukprint.srcline = srcline}; > + struct out_dev o; > > + out_dev_init_debug(&o, libname, srcname, srcline); > _hxd(&o, data, len, addr0, flags, grps_per_line, line_prefix); > } > > @@ -345,12 +260,9 @@ void _uk_hexdumpk(int lvl, const char *libname, const > char *srcname, > size_t addr0, int flags, unsigned int grps_per_line, > const char *line_prefix) > { > - struct _hxd_output o = {.type = UK_HXDOUT_KERN, > - .ukprint.lvl = lvl, > - .ukprint.libname = libname, > - .ukprint.srcname = srcname, > - .ukprint.srcline = srcline}; > + struct out_dev o; > > + out_dev_init_kern(&o, lvl, libname, srcname, srcline); > _hxd(&o, data, len, addr0, flags, grps_per_line, line_prefix); > } > #endif > diff --git a/lib/ukdebug/outf.c b/lib/ukdebug/outf.c > new file mode 100644 > index 00000000..1258be93 > --- /dev/null > +++ b/lib/ukdebug/outf.c > @@ -0,0 +1,85 @@ > +/* SPDX-License-Identifier: BSD-3-Clause */ > +/* > + * Internal helper for text output redirection > + * > + * Authors: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> > + * > + * > + * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * 3. Neither the name of the copyright holder nor the names of its > + * contributors may be used to endorse or promote products derived from > + * this software without specific prior written permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS > IS" > + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE > + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF > + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS > + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN > + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) > + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > + * POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include "outf.h" > + > +#include <string.h> > +#include <stdarg.h> > +#include <uk/assert.h> > +#include "snprintf.h" > + > +int outf(struct out_dev *dev, const char *fmt, ...) > +{ > + int ret = 0; > + va_list ap; > + > + UK_ASSERT(dev); > + > + va_start(ap, fmt); > + switch (dev->type) { > + case OUTDEV_FILE: > + /* Use standard libc approach when printing to a file */ > + ret = vfprintf(dev->file.fp, fmt, ap); > + break; > + case OUTDEV_BUFFER: > + ret = __uk_vsnprintf(dev->buffer.pos, dev->buffer.left, fmt, > ap); > + > + if (ret > 0) { > + /* in order to overwrite '\0' by successive calls, > + * we move the buffer pointer by (ret-1) characters > + */ > + dev->buffer.pos += (ret - 1); > + dev->buffer.left -= (ret - 1); > + } > + break; > + case OUTDEV_DEBUG: > + _uk_vprintd(dev->uk_pr.libname, > + dev->uk_pr.srcname, dev->uk_pr.srcline, > + fmt, ap); > + break; > +#if CONFIG_LIBUKDEBUG_PRINTK > + case OUTDEV_KERN: > + _uk_vprintk(dev->uk_pr.lvl, dev->uk_pr.libname, > + dev->uk_pr.srcname, dev->uk_pr.srcline, > + fmt, ap); > + break; > +#endif > + default: > + break; > + } > + va_end(ap); > + > + return ret; > +} > diff --git a/lib/ukdebug/outf.h b/lib/ukdebug/outf.h > new file mode 100644 > index 00000000..c4cd470d > --- /dev/null > +++ b/lib/ukdebug/outf.h > @@ -0,0 +1,114 @@ > +/* SPDX-License-Identifier: BSD-3-Clause */ > +/* > + * Internal helper for text output redirection > + * > + * Authors: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> > + * > + * > + * Copyright (c) 2020, NEC Europe Ltd., NEC Corporation. All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * 3. Neither the name of the copyright holder nor the names of its > + * contributors may be used to endorse or promote products derived from > + * this software without specific prior written permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS > IS" > + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE > + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF > + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS > + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN > + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) > + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > + * POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#ifndef __UKDEBUG_INTERNAL_OUTF_H__ > +#define __UKDEBUG_INTERNAL_OUTF_H__ > + > +#include <uk/config.h> > +#include <inttypes.h> > +#include <stdio.h> > + > +enum out_dev_type { > + OUTDEV_FILE = 0, > + OUTDEV_BUFFER, > +#if CONFIG_LIBUKDEBUG_PRINTK > + OUTDEV_KERN, > +#endif > + OUTDEV_DEBUG, > +}; > + > +struct out_dev { > + enum out_dev_type type; > + > + union { > + /* OUTDEV_KERN, OUTDEV_DEBUG */ > + struct { > + int lvl; /* OUTDEV_KERN only */ > + const char *libname; > + const char *srcname; > + unsigned int srcline; > + } uk_pr; > + > + /* UK_HXDOUT_FILE */ > + struct { > + FILE *fp; > + } file; > + > + /* UK_HXDOUT_BUFFER */ > + struct { > + char *pos; > + size_t left; > + } buffer; > + }; > +}; > + > +/** > + * Sends a formatted string to a given output device > + */ > +int outf(struct out_dev *dev, const char *fmt, ...); > + > +#define out_dev_init_file(dev, fp) \ > + do { \ > + (dev)->type = OUTDEV_FILE; \ > + (dev)->file.fp = (fp); \ > + } while (0) > + > +#define out_dev_init_buffer(dev, addr, len) \ > + do { \ > + (dev)->type = OUTDEV_BUFFER; \ > + (dev)->buffer.pos = (addr); \ > + (dev)->buffer.left = (len); \ > + } while (0) > + > +#if CONFIG_LIBUKDEBUG_PRINTK > +#define out_dev_init_kern(dev, lvl, libname, srcname, srcline) \ > + do { \ > + (dev)->type = OUTDEV_KERN; \ > + (dev)->uk_pr.lvl = (lvl); \ > + (dev)->uk_pr.libname = (libname); \ > + (dev)->uk_pr.srcname = (srcname); \ > + (dev)->uk_pr.srcline = (srcline); \ > + } while (0) > +#endif > + > +#define out_dev_init_debug(dev, libname, srcname, srcline) \ > + do { \ > + (dev)->type = OUTDEV_DEBUG; \ > + (dev)->uk_pr.libname = (libname); \ > + (dev)->uk_pr.srcname = (srcname); \ > + (dev)->uk_pr.srcline = (srcline); \ > + } while (0) > + > +#endif /* __UKDEBUG_INTERNAL_OUTF_H__ */ > -- > 2.20.1 > > > _______________________________________________ > Minios-devel mailing list > Minios-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/mailman/listinfo/minios-devel _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |