Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Luis Machado <lgustavo@codesourcery.com>
To: Simon Marchi <simon.marchi@polymtl.ca>
Cc: <gdb-patches@sourceware.org>
Subject: Re: [PATCH] Add -verify option to load command
Date: Fri, 06 Jan 2017 19:33:00 -0000	[thread overview]
Message-ID: <3a9784ff-cae4-f0f0-5209-636ca69dd1d5@codesourcery.com> (raw)
In-Reply-To: <01a92fce926525df375f1317da45e2df@polymtl.ca>

On 01/06/2017 01:17 PM, Simon Marchi wrote:
> On 2017-01-06 11:41, Luis Machado wrote:
>> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
>> index 44ae068..39de23c 100644
>> --- a/gdb/doc/gdb.texinfo
>> +++ b/gdb/doc/gdb.texinfo
>> @@ -19592,7 +19592,7 @@ Show the current status of displaying
>> communications between
>>  @table @code
>>
>>  @kindex load @var{filename}
>> -@item load @var{filename}
>> +@item load @var{filename} [-verify]
>
> I just noticed the documentation here doesn't talk about OFFSET.
>

Ah, see? More documentation bits that are inconsistent. I'll fix this. 
Thanks for spotting it.

>> @@ -2099,19 +2101,30 @@ generic_load (const char *args, int from_tty)
>>    filename = tilde_expand (argv[0]);
>>    make_cleanup (xfree, filename);
>>
>> -  if (argv[1] != NULL)
>> +  arg_idx = 1;
>> +  if (argv[arg_idx] != NULL)
>>      {
>>        const char *endptr;
>>
>> -      cbdata.load_offset = strtoulst (argv[1], &endptr, 0);
>> +      if (strcmp (argv[arg_idx], "-verify") == 0)
>> +    {
>> +      verify = 1;
>> +      arg_idx++;
>> +    }
>> +
>> +      if (argv[arg_idx] != NULL)
>> +    {
>> +      cbdata.load_offset = strtoul ((const char *) argv[arg_idx],
>> +                    (char **) &endptr, 0);
>>
>> -      /* If the last word was not a valid number then
>> -         treat it as a file name with spaces in.  */
>> -      if (argv[1] == endptr)
>> -        error (_("Invalid download offset:%s."), argv[1]);
>> +      /* If the last word was not a valid number then
>> +         treat it as a file name with spaces in.  */
>> +      if (argv[arg_idx] == endptr)
>> +        error (_("Invalid download offset:%s."), argv[arg_idx]);
>
> You could sneak a space after the colon here :).
>
> I know that's old code, but I don't really understand it.  According to
> the help text of load, from your other patch, the offset can be an
> expression, s I assume "$foo + 1" should work.  The check with strtoul
> would clearly not accept that.
>

The problem with handling old code that we didn't fully write is that 
one may not always know the reason. This is one of those cases.

>> @@ -2140,7 +2153,7 @@ generic_load (const char *args, int from_tty)
>>    steady_clock::time_point start_time = steady_clock::now ();
>>
>>    if (target_write_memory_blocks (cbdata.requests, flash_discard,
>> -                  load_progress) != 0)
>> +                  load_progress, verify) != 0)
>>      error (_("Load failed"));
>>
>>    steady_clock::time_point end_time = steady_clock::now ();
>> @@ -3952,8 +3965,8 @@ that lies within the boundaries of this symbol
>> file in memory."),
>>    c = add_cmd ("load", class_files, load_command, _("\
>>  Dynamically load FILE into the running program, and record its
>> symbols\n\
>>  for access from GDB.\n\
>> -A load offset may also be given.\n\
>> -Usage: load [FILE] [offset expression]"), &cmdlist);
>> +A load offset and write verification option may also be given.\n\
>> +Usage: load [FILE] [-verify] [offset expression]"), &cmdlist);
>
> Is there a reason why you placed the [-verify] between the two other
> arguments and not before them?  That's where I would usually expect the
> "dash" arguments to be placed in the usage message.
>

No. I think it is just the way it was implemented.

I could refactor it to make it work better for sure.

> From what I understand it is possible to use load without specifying
> FILE, which will load the executable currently loaded in gdb.   So I
> think all these forms should be valid:
>

I notice the current way load works is slightly off. For example, you 
can't do "load <offset>" without a symbol file. GDB will complain about 
not finding file <offset>. Sounds like that is another improvement.

> (gdb) load -verify
> (gdb) load myfile
> (gdb) load -verify myfile
> (gdb) load myfile myoffset
> (gdb) load -verify myfile myoffset
>
> Ideally, we should be able to place the "dash" arguments anywhere, just
> like with any good command line tool.  Since we don't have that, I think
> that having between the command and the positional arguments makes more
> sense.  That's my opinion though, I'm curious to hear what others think.
>

I'm fine with whatever positioning is deemed appropriate. Personally, i 
like the -verify at the end. :-)

>> +  /* Do we need to verify if the data was properly written to the
>> target's
>> +     memory?  */
>> +  if (verify)
>> +    {
>> +      /* Go through all memory regions that GDB wrote to and verify the
>> +     contents.  */
>> +      for (i = 0; VEC_iterate (memory_write_request_s, blocks, i, r);
>> ++i)
>> +    if (target_verify_memory (r->data, r->begin, r->end - r->begin)
>> <= 0)
>> +      error ("Load verification failed for region starting at 0x%x",
>> +         (unsigned int) r->begin);
>> +    else
>> +      current_uiout->message ("Verified load, size 0x%x lma 0x%x\n",
>> +                  (unsigned int) (r->end - r->begin),
>> +                  (unsigned int) r->begin);
>
> I guess the end and begin fields of memory_write_request should be of
> type CORE_ADDR, and this should use paddress.
>

I'll get it fixed. Thanks.

>> diff --git a/gdb/target.h b/gdb/target.h
>> index e239c2c..6fc89d4 100644
>> --- a/gdb/target.h
>> +++ b/gdb/target.h
>> @@ -1497,11 +1497,14 @@ enum flash_preserve_mode
>>       feedback to user.  It will be called with the baton corresponding
>>       to the request currently being written.  It may also be called
>>       with a NULL baton, when preserved flash sectors are being
>> rewritten.
>> +   VERIFY is non-zero if verification should be performed for the
>> data written
>> +   to the target's memory and zero if no verification should be
>> performed.
>
> Make sure that the line wrapping matches the other arguments.
>

Indeed.

>>
>>     The function returns 0 on success, and error otherwise.  */
>>  int target_write_memory_blocks (VEC(memory_write_request_s) *requests,
>>                  enum flash_preserve_mode preserve_flash_p,
>> -                void (*progress_cb) (ULONGEST, void *));
>> +                void (*progress_cb) (ULONGEST, void *),
>> +                int verify);
>
> bool? (for the whole call chain)
>

That makes sense.

> Thanks,
>
> Simon

Thanks for reviewing it.

Luis


  reply	other threads:[~2017-01-06 19:33 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-06 16:42 Luis Machado
2017-01-06 18:17 ` Eli Zaretskii
2017-01-06 18:30   ` Luis Machado
2017-01-07  7:53     ` Eli Zaretskii
2017-01-06 19:17 ` Simon Marchi
2017-01-06 19:33   ` Luis Machado [this message]
2017-01-06 19:59     ` Simon Marchi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3a9784ff-cae4-f0f0-5209-636ca69dd1d5@codesourcery.com \
    --to=lgustavo@codesourcery.com \
    --cc=gdb-patches@sourceware.org \
    --cc=simon.marchi@polymtl.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox