[Intel-gfx] [PATCH igt] tools/error_decode: Print ASCII user buffers
Chris Wilson
chris at chris-wilson.co.uk
Wed Nov 15 13:48:52 UTC 2017
Quoting Tvrtko Ursulin (2017-11-15 13:35:43)
>
> On 14/11/2017 13:19, Chris Wilson wrote:
> > Look at the first 16 characters of the user buffer and if they are all
> > printable, assume that user buffer contains ASCII data (e.g. a debug log)
> > that we want to simply print out. Otherwise, we treat it as a binary data
> > and hexdump as before.
> >
> > Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> > ---
> > tools/intel_error_decode.c | 20 ++++++++++++++++++++
> > 1 file changed, 20 insertions(+)
> >
> > diff --git a/tools/intel_error_decode.c b/tools/intel_error_decode.c
> > index cdef3b18..84ef72b6 100644
> > --- a/tools/intel_error_decode.c
> > +++ b/tools/intel_error_decode.c
> > @@ -51,6 +51,7 @@
> > #include <assert.h>
> > #include <intel_bufmgr.h>
> > #include <zlib.h>
> > +#include <ctype.h>
> >
> > #include "intel_chipset.h"
> > #include "intel_io.h"
> > @@ -434,6 +435,16 @@ print_fault_data(unsigned devid, uint32_t data1, uint32_t data0)
> >
> > #define MAX_RINGS 10 /* I really hope this never... */
> >
> > +static bool maybe_ascii(const void *data, int check)
> > +{
> > + const char *c = data;
> > + while (check--) {
> > + if (!isprint(*c++))
> > + return false;
> > + }
> > + return true;
> > +}
> > +
> > static void decode(struct drm_intel_decode *ctx,
> > const char *buffer_name,
> > const char *ring_name,
> > @@ -458,6 +469,15 @@ static void decode(struct drm_intel_decode *ctx,
> > drm_intel_decode_set_batch_pointer(ctx, data, gtt_offset,
> > *count);
> > drm_intel_decode(ctx);
> > + } else if (maybe_ascii(data, 16)) {
>
> Is there a matching i915 patch for this? I am wondering if we could put
> a stronger signature header if we are going to save some logs in our bos.
No, this is content from (entirely under the control of) userspace.
> > + char *c = (char *)data;
> > + int max = 4 * *count;
> > + for (int i = 0; i < max; i++) {
> > + if (!c[i])
> > + break;
> > + putchar(c[i]);
>
> Why char by char if the only termination is nul byte and not just puts?
Is there a putsn? There's no guarantee of a nul terminator either.
-Chris
More information about the Intel-gfx
mailing list