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,
3. 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 24, 2022
1 parent 72299f5 commit a353c96
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions pyocd/probe/stlink_probe.py
Original file line number Diff line number Diff line change
Expand Up @@ -329,8 +329,8 @@ def read_memory_block8(self, addr: int, size: int, **attrs: Any) -> Sequence[int
res = []

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

# write leading unaligned bytes
unaligned_count = addr & 3
if (size > 0) and (unaligned_count > 0):
unaligned_count = 3 & (4 - (addr & 3))
if (size > 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 a353c96

Please sign in to comment.