On Fri, Mar 5, 2021, 08:08 Alexander Gabitov via OpenOCD-devel <
openocd-devel@lists.sourceforge.net> wrote:

> The better way — is to fix jlink_clock_data interface. Unsigned type was a
> bad choice. Historically it was added to standart for unsigned arithmetics
> only(for rolling over max value to zero).
>
> static void jlink_clock_data(const uint8_t *out, int out_offset,
>                  const uint8_t *tms_out, int tms_offset,
>                  uint8_t *in, int in_offset,
>                  int length)
>

Alexander,

both in_offset and length carry unsigned values only; for me they should
remain unsigned and the mathematics should be modified to not use negative
values

Regards
Antonio



{
>     do {
>         int available_length = (JLINK_TAP_BUFFER_SIZE * 8) - tap_length;
>         if (available_length < length ||
>             (in && pending_scan_results_length ==
> MAX_PENDING_SCAN_RESULTS)) {
>             if (jlink_flush() != ERROR_OK)
>                 return;
>             available_length = JLINK_TAP_BUFFER_SIZE * 8;
>         }
>         struct pending_scan_result *pending_scan_result =
>             &pending_scan_results_buffer[pending_scan_results_length];
>         int scan_length = length > available_length ? available_length :
> length;
>         ….
> }
>
>
> --
> Alexander Gabitov
>
>
>
> Пятница, 5 марта 2021, 8:12 +03:00 от Alexander Gabitov via OpenOCD-devel <
> openocd-devel@lists.sourceforge.net>:
>
> I’m working on API.
>
> By the way. I think there is a bug(jlink.c:2032):
>         unsigned available_length = JLINK_TAP_BUFFER_SIZE - tap_length / 8;
>         if (!available_length ||
>             (in && pending_scan_results_length ==
> MAX_PENDING_SCAN_RESULTS)) {
>             if (jlink_flush() != ERROR_OK)
>                 return;
>             available_length = JLINK_TAP_BUFFER_SIZE;
>         }
>         struct pending_scan_result *pending_scan_result =
>             &pending_scan_results_buffer[pending_scan_results_length];
>         unsigned scan_length =
> *length > available_length ?            available_length : length;*
>
> Here length is amount of bits, but *available_length *is amount of bytes!
> So this expression seems to be wrong.
>
> Also during debug i found that first condition becomes true only when
> second clause is true — *pending_scan_results_length ==
> MAX_PENDING_SCAN_RESULTS.*
> And more over condition "!available_length" — looks very strange due to
> formula which calculates it.
>
> I would correct it all like that:
>         int available_length = (JLINK_TAP_BUFFER_SIZE * 8) - tap_length;
>         if (available_length < length ||
>             (in && pending_scan_results_length ==
> MAX_PENDING_SCAN_RESULTS)) {
>             if (jlink_flush() != ERROR_OK)
>                 return;
>             available_length = JLINK_TAP_BUFFER_SIZE * 8;
>         }
>         struct pending_scan_result *pending_scan_result =
>             &pending_scan_results_buffer[pending_scan_results_length];
>         unsigned scan_length = length > available_length ?
>             available_length : length;
>
> --
> Alexander Gabitov
>
>
> _______________________________________________
> OpenOCD-devel mailing list
> OpenOCD-devel@lists.sourceforge.net
> <http:///compose?To=openocd%2dde...@lists.sourceforge.net>
> https://lists.sourceforge.net/lists/listinfo/openocd-devel
>
>
> _______________________________________________
> OpenOCD-devel mailing list
> OpenOCD-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/openocd-devel
>
_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to