This is an automated email from Gerrit.

Christopher Head ([email protected]) just uploaded a new patch set to Gerrit, 
which you can find at http://openocd.zylin.com/5235

-- gerrit

commit 057bed7ee206eb1b07d632c7c8dc1c5b31b49618
Author: Christopher Head <[email protected]>
Date:   Fri Jun 14 15:12:28 2019 -0700

    target: allow profiling from running
    
    There are a handful of implementations of profiling. There is the
    default implementation, which repeatedly halts and resumes the target,
    sampling PC each time. There is the Cortex-M implementation, which uses
    PCSR if available, otherwise falling back to halting and resuming and
    sampling PC. There is the OR1K implementation, which reads NPC
    repeatedly. Finally, there is the NDS32 implementation which uses some
    kind of AICE commands with which I am unfamiliar.
    
    None of these (with the possible exception of the NDS32 implementation)
    actually require the target to be halted when starting profiling. The
    Cortex-M and OR1K actually resume the target as pretty much their first
    action. The default implementation doesn’t do this, but is written in
    such a way that the target just flips back and forth between halted and
    running, and the code will do the right thing from either initial state.
    The NDS32 implementation I don’t know about.
    
    As such, for everything except NDS32, it is not really necessary that
    the target be halted to start profiling. For the non-PCSR Cortex-M and
    default implementations, there is no real harm in such a requirement,
    because profiling is intrusive anyway, but there is no benefit. For the
    PCSR-based Cortex-M and the OR1K, requiring that the target is halted is
    annoying because it makes profiling more intrusive.
    
    Remove the must-be-halted check from the target_profiling function. Add
    it to the NDS32 implementation because I am not sure if that will break
    when invoked with a running target. Do not add it to any of the other
    implementations because they don’t need it.
    
    Change-Id: I479dce999a80eccccfd3be4fa192c904f0a45709
    Signed-off-by: Christopher Head <[email protected]>

diff --git a/src/target/nds32.c b/src/target/nds32.c
index 4115ea4..49cec28 100644
--- a/src/target/nds32.c
+++ b/src/target/nds32.c
@@ -2499,6 +2499,11 @@ int nds32_profiling(struct target *target, uint32_t 
*samples,
        struct aice_port_s *aice = target_to_aice(target);
        struct nds32 *nds32 = target_to_nds32(target);
 
+       if (target->state != TARGET_HALTED) {
+               LOG_WARNING("target %s is not halted (profiling)", 
target->cmd_name);
+               return ERROR_TARGET_NOT_HALTED;
+       }
+
        if (max_num_samples < iteration)
                iteration = max_num_samples;
 
diff --git a/src/target/target.c b/src/target/target.c
index 1e42c5e..2a67eab 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -1270,10 +1270,6 @@ unsigned target_address_bits(struct target *target)
 int target_profiling(struct target *target, uint32_t *samples,
                        uint32_t max_num_samples, uint32_t *num_samples, 
uint32_t seconds)
 {
-       if (target->state != TARGET_HALTED) {
-               LOG_WARNING("target %s is not halted (profiling)", 
target->cmd_name);
-               return ERROR_TARGET_NOT_HALTED;
-       }
        return target->type->profiling(target, samples, max_num_samples,
                        num_samples, seconds);
 }

-- 


_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to