Skip to content

Commit

Permalink
probe: stlink: Fix 1-byte transfers
Browse files Browse the repository at this point in the history
Internally the 1-byte transfers are handled in 3 phases:
1. read/write 8-bit chunks from every unaligned addresses until the
   first aligned address is reached,
2. read/write 32-bit chunks from all aligned addresses,
2. read/write 8-bit chunks from the remaining unaligned addresses.

Size of the first unaligned read/write is set to the result of address
(4-byte) alignment check and can be either 1, 2, or 3 bytes (the value
of `unaligned_count` calculated as `addr & 0x3`). This is incorrect and
every transfer with the requested size smaller than `unaligned_count` is
terminated with the following error:

  Unhandled exception in handle_message (b'm'): result size (3) != requested size (1) [gdbserver]

Skip the first unaligned transfer if the requested size is smaller than
the result of the address alignment check. Handle the whole request in
the second, unaligned read/write.
  • Loading branch information
Filip Jagodzinski committed Nov 23, 2022
1 parent 72299f5 commit 4180abf
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions pyocd/probe/stlink_probe.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ def read_memory_block8(self, addr: int, size: int, **attrs: Any) -> Sequence[int

# read leading unaligned bytes
unaligned_count = addr & 3
if (size > 0) and (unaligned_count > 0):
if (size >= unaligned_count) and (unaligned_count > 0):
res += self._link.read_mem8(addr, unaligned_count, self._apsel, csw)
size -= unaligned_count
addr += unaligned_count
Expand All @@ -356,7 +356,7 @@ def write_memory_block8(self, addr: int, data: Sequence[int], **attrs: Any) -> N

# write leading unaligned bytes
unaligned_count = addr & 3
if (size > 0) and (unaligned_count > 0):
if (size >= unaligned_count) and (unaligned_count > 0):
self._link.write_mem8(addr, data[:unaligned_count], self._apsel, csw)
size -= unaligned_count
addr += unaligned_count
Expand Down

0 comments on commit 4180abf

Please sign in to comment.