Skip to content

Commit

Permalink
Merge pull request #404 from flit/bugfix/rtx_fixes
Browse files Browse the repository at this point in the history
RTX5 fixes
  • Loading branch information
flit authored Sep 8, 2018
2 parents 1432213 + b162023 commit 59bb653
Show file tree
Hide file tree
Showing 6 changed files with 163 additions and 189 deletions.
15 changes: 8 additions & 7 deletions pyOCD/gdbserver/gdbserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -518,20 +518,21 @@ def _run_connection(self):

def handleMsg(self, msg):
try:
assert msg[0:1] == b'$', "invalid first char of message (!= $"
assert msg[0:1] == b'$', "invalid first char of message != $"

try:
handler, msgStart = self.COMMANDS[msg[1:2]]
if msgStart == 0:
reply = handler()
else:
reply = handler(msg[msgStart:])
detach = 1 if msg[1:2] in self.DETACH_COMMANDS else 0
return reply, detach
except (KeyError, IndexError):
self.log.error("Unknown RSP packet: %s", msg)
return self.createRSPPacket(b""), 0

if msgStart == 0:
reply = handler()
else:
reply = handler(msg[msgStart:])
detach = 1 if msg[1:2] in self.DETACH_COMMANDS else 0
return reply, detach

except Exception as e:
self.log.error("Unhandled exception in handleMsg: %s", e)
traceback.print_exc()
Expand Down
6 changes: 3 additions & 3 deletions pyOCD/rtos/argon.py
Original file line number Diff line number Diff line change
Expand Up @@ -405,8 +405,8 @@ def current_thread(self):
try:
return self._threads[id]
except KeyError:
log.debug("key error getting current thread id=%x", id)
log.debug("self._threads = %s", repr(self._threads))
log.debug("key error getting current thread id=%s; self._threads = %s",
("%x" % id) if (id is not None) else id, repr(self._threads))
return None

def is_valid_thread_id(self, threadId):
Expand All @@ -419,7 +419,7 @@ def get_current_thread_id(self):
if not self.is_enabled:
return None
if self.get_ipsr() > 0:
return 2
return HandlerModeThread.UNIQUE_ID
return self.get_actual_current_thread_id()

def get_actual_current_thread_id(self):
Expand Down
105 changes: 3 additions & 102 deletions pyOCD/rtos/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,109 +59,10 @@ def read_c_string(context, ptr):

return s

## @brief Standard Cortex-M register stacking context.
class CommonThreadContext(DebugContext):
# SP is handled specially, so it is not in this dict.
CORE_REGISTER_OFFSETS = {
0: 32, # r0
1: 36, # r1
2: 40, # r2
3: 44, # r3
4: 0, # r4
5: 4, # r5
6: 8, # r6
7: 12, # r7
8: 16, # r8
9: 20, # r9
10: 24, # r10
11: 28, # r11
12: 48, # r12
14: 52, # lr
15: 56, # pc
16: 60, # xpsr
}

def __init__(self, parentContext, thread):
super(CommonThreadContext, self).__init__(parentContext.core)
self._parent = parentContext
self._thread = thread

def readCoreRegistersRaw(self, reg_list):
reg_list = [register_name_to_index(reg) for reg in reg_list]
reg_vals = []

inException = self._get_ipsr() > 0
isCurrent = self._is_current()

sp = self._get_stack_pointer()
saveSp = sp
if not isCurrent:
sp -= 0x40
elif inException:
sp -= 0x20

for reg in reg_list:
if isCurrent:
if not inException:
# Not in an exception, so just read the live register.
reg_vals.append(self._core.readCoreRegisterRaw(reg))
continue
else:
# Check for regs we can't access.
if reg in (4, 5, 6, 7, 8, 9, 10, 11):
reg_vals.append(0)
continue

# Must handle stack pointer specially.
if reg == 13:
reg_vals.append(saveSp)
continue

spOffset = self.CORE_REGISTER_OFFSETS.get(reg, None)
if spOffset is None:
reg_vals.append(self._core.readCoreRegisterRaw(reg))
continue
if isCurrent and inException:
spOffset -= 0x20

try:
reg_vals.append(self._core.read32(sp + spOffset))
except DAPAccess.TransferError:
reg_vals.append(0)

return reg_vals

def _get_stack_pointer(self):
sp = 0
if self._is_current():
# Read live process stack.
sp = self._core.readCoreRegister('sp')

# In IRQ context, we have to adjust for hw saved state.
if self._get_ipsr() > 0:
sp += 0x20
else:
# Get stack pointer saved in thread struct.
sp = self._core.read32(self._thread._base + THREAD_STACK_POINTER_OFFSET)

# Skip saved thread state.
sp += 0x40
return sp

def _get_ipsr(self):
return self._core.readCoreRegister('xpsr') & 0xff

def _has_extended_frame(self):
return False

def _is_current(self):
return self._thread.is_current

def writeCoreRegistersRaw(self, reg_list, data_list):
self._core.writeCoreRegistersRaw(reg_list, data_list)

## @brief Class representing the handler mode.
class HandlerModeThread(TargetThread):
UNIQUE_ID = 2

def __init__(self, targetContext, provider):
super(HandlerModeThread, self).__init__()
self._target_context = targetContext
Expand All @@ -176,7 +77,7 @@ def priority(self):

@property
def unique_id(self):
return 2
return self.UNIQUE_ID

@property
def name(self):
Expand Down
2 changes: 1 addition & 1 deletion pyOCD/rtos/freertos.py
Original file line number Diff line number Diff line change
Expand Up @@ -495,7 +495,7 @@ def get_current_thread_id(self):
if not self.is_enabled:
return None
if self.get_ipsr() > 0:
return 2
return HandlerModeThread.UNIQUE_ID
return self.get_actual_current_thread_id()

def get_actual_current_thread_id(self):
Expand Down
Loading

0 comments on commit 59bb653

Please sign in to comment.