[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openocd-development
Subject:    [OpenOCD-devel] [PATCH]: 61356ae armv7m: always set xPSR.T=1 when starting an algorithm
From:       gerrit () openocd ! org (gerrit)
Date:       2018-08-27 21:34:34
Message-ID: 20180827213434.3BD5625225AE () mail ! openocd ! org
[Download RAW message or body]

This is an automated email from Gerrit.

Cody Schafer (openocd@codyps.com) just uploaded a new patch set to Gerrit, which you \
can find at http://openocd.zylin.com/4658

-- gerrit

commit 61356aee6c9cb7a45b64bb7efe8314d6aba66596
Author: Cody P Schafer <openocd@codyps.com>
Date:   Mon Aug 27 10:50:46 2018 -0400

    armv7m: always set xPSR.T=1 when starting an algorithm
    
    When using the built-in stlink on a st nucleo-f767zi, in some conditions
    every-other flash (using `program` or `flash_write image erase fw.elf`)
    was failing.
    
    Investigation revealed than in some cases after running an algorithm,
    the xPSR.T bit (thumb mode, required on armv7m) was being unset. As a
    result, when the processor was started to run the algorithm, it
    immediately locked up with a usage fault.
    
    It is unclear precisesly why xPSR.T is being set to 0, but explicitly
    setting xPSR.T in start_algorithm causes flashing on the st
    nucleo-f767zi to proceed successfully.
    
    Setting xPSR here more cleanly starts our algorithms, as it more closely
    models a reset. That said, this is an extra register write that may or
    may not be needed & is likely working around an adapter (st-link)
    specific issue.
    
    Ticket: https://sourceforge.net/p/openocd/tickets/203/
    Signed-off-by: Cody P Schafer <openocd@codyps.com>
    Change-Id: I4dc3427ab195d06c3fd780ea768027fefccc4c28

diff --git a/src/target/armv7m.c b/src/target/armv7m.c
index 7d3bd73..2a640b4 100644
--- a/src/target/armv7m.c
+++ b/src/target/armv7m.c
@@ -407,6 +407,20 @@ int armv7m_start_algorithm(struct target *target,
 		armv7m_set_core_reg(reg, reg_params[i].value);
 	}
 
+	{
+		/* Ensure xPSR.T is set to avoid trying to run things in arm
+		 * (non-thumb) mode, which armv7m does not support.
+		 *
+		 * This works around what may be a st-link adapter bug where
+		 * the read-back of xPSR is inaccurate, causing us to clear
+		 * xPSR.T
+		 */
+		struct reg *reg = &armv7m->arm.core_cache->reg_list[ARMV7M_xPSR];
+		buf_set_u32(reg->value, 0, 32, 0x01000000);
+		reg->valid = 1;
+		reg->dirty = 1;
+	}
+
 	if (armv7m_algorithm_info->core_mode != ARM_MODE_ANY &&
 			armv7m_algorithm_info->core_mode != core_mode) {
 

-- 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic