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

List:       openocd-development
Subject:    [OpenOCD-devel] [PATCH]: 772975c (merge): aarch64_debug: 'aarch64 debug' telnet command
From:       gerrit () openocd ! org (gerrit)
Date:       2016-02-17 23:01:15
Message-ID: 20160217230115.232AF19846CB () mail ! openocd ! org
[Download RAW message or body]

This is an automated email from Gerrit.

Alamy Liu (alamy.liu@gmail.com) just uploaded a new patch set to Gerrit, which you \
can find at http://openocd.zylin.com/3344

-- gerrit

commit 772975c18191d870850cf2d47e70c663f7a8c65d
Author: Alamy Liu <alamy.liu@gmail.com>
Date:   Thu Dec 3 16:00:49 2015 -0800

    (merge): aarch64_debug: 'aarch64 debug' telnet command
    
    Change-Id: I1e43cefe5c65412f9cf10047854e37a75b41b0df
    Signed-off-by: Alamy Liu <alamy.liu@gmail.com>

diff --git a/src/target/aarch64_debug.c b/src/target/aarch64_debug.c
index bbc2230..b327c1b 100644
--- a/src/target/aarch64_debug.c
+++ b/src/target/aarch64_debug.c
@@ -19,6 +19,8 @@ extern int aarch64_exec_opcode(struct target *target,
 void print_edscr_detail(struct command_context *cmd_ctx, uint32_t edscr)
 {
 	struct target *target = get_current_target(cmd_ctx);
+	enum target_debug_reason backup_debug_reason = target->debug_reason;
+	target->debug_reason = armv8_edscr_debug_reason(edscr);
 
 	command_print(cmd_ctx,
 		"EDSCR = 0x%.8"PRIx32 "\n"
@@ -48,6 +50,8 @@ void print_edscr_detail(struct command_context *cmd_ctx, uint32_t \
edscr)  (edscr & ARMV8_EDSCR_HDE) ? 1 : 0, EDSCR_STATUS(edscr), \
debug_reason_name(target),  (edscr & ARMV8_EDSCR_PIPEADV) ? 1: 0
 		);
+
+	target->debug_reason = backup_debug_reason;
 }
 
 void print_edesr_detail(struct command_context *cmd_ctx, uint32_t edesr)
@@ -90,6 +94,34 @@ void print_edprsr_detail(struct command_context *cmd_ctx, uint32_t \
edprsr)  );
 }
 
+void print_target_debug_info_status(struct command_context *cmd_ctx, struct target \
*target) +{
+	struct aarch64_common *aarch64 = target_to_aarch64(target);
+	struct armv8_common *armv8 = &aarch64->armv8_common;
+	struct adiv5_dap *dap = armv8->arm.dap;
+	int rc = ERROR_FAIL;
+	uint32_t edprsr, edesr;
+
+	command_print(cmd_ctx, "----- Target %s -----", target_name(target));
+
+	dap_ap_select(dap, armv8->debug_ap);
+
+	print_edscr_detail(cmd_ctx, aarch64->cpudbg_edscr);
+
+	rc = mem_ap_read_atomic_u32(dap,
+			armv8->debug_base + ARMV8_REG_EDESR, &edesr);
+	if (rc == ERROR_OK) {
+		print_edesr_detail(cmd_ctx, edesr);
+	}
+
+	rc = mem_ap_read_atomic_u32(dap,
+			armv8->debug_base + ARMV8_REG_EDPRSR, &edprsr);
+	if (rc == ERROR_OK) {
+		print_edprsr_detail(cmd_ctx, edprsr);
+	}
+}
+
+/* ---------------------------------------- */
 int print_target_debug_info_cti(
 	struct command_context *cmd_ctx,
 	struct target *target)
@@ -156,7 +188,7 @@ int print_target_debug_info_cti(
 	if (rc != ERROR_OK)	goto err;
 
 	command_print(cmd_ctx,
-        "\tcontrol (glben) = %08x    gate = %08x\n"
+		"\tcontrol (glben) = %08x    gate = %08x\n"
 		"\tasicctl = %08x            appset = %08x\n"
 		"\ttrig in status = %08x     trig out status = %08x\n"
 		"\t  ch in status = %08x       ch out status = %08x\n"
@@ -178,37 +210,102 @@ err:
 	return rc;
 }
 
-void print_target_debug_info(struct command_context *cmd_ctx, struct target *target)
+/* ---------------------------------------- */
+#define ARMV8_BP_NUM		(4)		// Should be 16
+#define ARMV8_WP_NUM		(4)
+int print_target_debug_info_bpwp(
+	struct command_context *cmd_ctx,
+	struct target *target)
 {
 	struct aarch64_common *aarch64 = target_to_aarch64(target);
 	struct armv8_common *armv8 = &aarch64->armv8_common;
 	struct adiv5_dap *dap = armv8->arm.dap;
+//	struct aarch64_brp *brp_list = aarch64->brp_list;
+
 	int rc = ERROR_FAIL;
-	uint32_t edprsr, edesr;
+	int i;
+	uint32_t dbgbcr, dbgbvr_lo, dbgbvr_hi;
+	uint64_t dbgbvr;
 
-	command_print(cmd_ctx, "----- Target %s -----", target_name(target));
+	command_print(cmd_ctx, "Target %s", target_name(target));
 
-	dap_ap_select(dap, armv8->debug_ap);
+	/* H9.2.2 DBGBCR<n>_EL1, n = 0-15 */
+	for (i = 0; i < ARMV8_BP_NUM; i++) {
+		rc = mem_ap_read_u32(dap,
+			armv8->debug_base + ARMV8_REG_DBGBCR_EL1(i), &dbgbcr);
+		if (rc != ERROR_OK)	goto err;
+		rc = mem_ap_read_u32(dap,
+			armv8->debug_base + ARMV8_REG_DBGBVR_EL1_LO(i), &dbgbvr_lo);
+		if (rc != ERROR_OK)	goto err;
+		rc = mem_ap_read_u32(dap,
+			armv8->debug_base + ARMV8_REG_DBGBVR_EL1_HI(i), &dbgbvr_hi);
+		if (rc != ERROR_OK)	goto err;
+		rc = dap_run(dap);
+		if (rc != ERROR_OK)	goto err;
 
-	print_edscr_detail(cmd_ctx, aarch64->cpudbg_edscr);
+		dbgbvr = ((uint64_t)dbgbvr_hi << 32) | (uint64_t)dbgbvr_lo;
+
+		command_print(cmd_ctx,
+			"  BP(%d) BCR=0x%08"PRIx32"(BT:0x%02x,LBN:0x%02x,BAS:0x%02x,E:%d) \
Addr=0x%.16"PRIX64, +			i,
+			dbgbcr,
+			(dbgbcr & ARMV8_DBGBCR_BT_MASK) >> ARMV8_DBGBCR_BT_SHIFT,
+			(dbgbcr & ARMV8_DBGBCR_LBN_MASK) >> ARMV8_DBGBCR_LBN_SHIFT,
+			(dbgbcr & ARMV8_DBGBCR_BAS_MASK) >> ARMV8_DBGBCR_BAS_SHIFT,
+			(dbgbcr & ARMV8_DBGBCR_E) ? 1 : 0,
+			dbgbvr);
+	}
+
+#if 0
+	/* H9.2.8 DBGWCR<n>_EL1, n = 0-15 */
+	for (i = 0; i < 15; i++) {
+		rc = aarch64_dap_read_memap_register_u32(target,
+			armv8->debug_base + ARMV8_REG_DBGWCR_EL1(i), &dbgbcr);
+		if (rc != ERROR_OK)	goto err;
+		rc = aarch64_dap_read_memap_register_u32(target,
+			armv8->debug_base + ARMV8_REG_DBGWVR_EL1_LO(i), &dbgbvr_lo);
+		if (rc != ERROR_OK)	goto err;
+		rc = aarch64_dap_read_memap_register_u32(target,
+			armv8->debug_base + ARMV8_REG_DBGWVR_EL1_HI(i), &dbgbvr_hi);
+		if (rc != ERROR_OK)	goto err;
 
-	rc = mem_ap_read_atomic_u32(dap,
-			armv8->debug_base + ARMV8_REG_EDESR, &edesr);
-	if (rc == ERROR_OK) {
-		print_edesr_detail(cmd_ctx, edesr);
 	}
+#endif
 
-	rc = mem_ap_read_atomic_u32(dap,
-			armv8->debug_base + ARMV8_REG_EDPRSR, &edprsr);
-	if (rc == ERROR_OK) {
-		print_edprsr_detail(cmd_ctx, edprsr);
+err:
+	return rc;
+}
+
+void print_target_debug_info_all(
+	struct command_context *cmd_ctx,
+	struct target *target)
+{
+	print_target_debug_info_status  (cmd_ctx, target);
+	print_target_debug_info_cti     (cmd_ctx, target);
+	print_target_debug_info_bpwp    (cmd_ctx, target);
+}
+
+COMMAND_HANDLER(aarch64_handle_debug_info_status_command)
+{
+	struct target *target = get_current_target(CMD_CTX);
+	bool opt_smp = false;
+
+	if (CMD_ARGC >= 1) {
+		opt_smp = (strcmp(CMD_ARGV[0], "smp") == 0);
 	}
 
-	rc = print_target_debug_info_cti(cmd_ctx, target);
+	if (!opt_smp) {
+		print_target_debug_info_status(CMD_CTX, target);
+		return ERROR_OK;
+	}
 
+	for (target = all_targets; target; target = target->next)
+		print_target_debug_info_status(CMD_CTX, target);
+
+	return ERROR_OK;
 }
 
-COMMAND_HANDLER(aarch64_handle_debug_info_command)
+COMMAND_HANDLER(aarch64_handle_debug_info_cti_command)
 {
 	struct target *target = get_current_target(CMD_CTX);
 	bool opt_smp = false;
@@ -218,18 +315,53 @@ COMMAND_HANDLER(aarch64_handle_debug_info_command)
 	}
 
 	if (!opt_smp) {
-		print_target_debug_info(CMD_CTX, target);
+		print_target_debug_info_cti(CMD_CTX, target);
 		return ERROR_OK;
 	}
 
-	for (target = all_targets; target; target = target->next) {
-		print_target_debug_info(CMD_CTX, target);
-		command_print(CMD_CTX, "\n");
+	for (target = all_targets; target; target = target->next)
+		print_target_debug_info_cti(CMD_CTX, target);
+
+	return ERROR_OK;
+}
+
+COMMAND_HANDLER(aarch64_handle_debug_info_bpwp_command)
+{
+	struct target *target = get_current_target(CMD_CTX);
+	bool opt_smp = false;
+
+	if (CMD_ARGC >= 1) {
+		opt_smp = (strcmp(CMD_ARGV[0], "smp") == 0);
 	}
 
+	if (!opt_smp) {
+		print_target_debug_info_bpwp(CMD_CTX, target);
+		return ERROR_OK;
+	}
+
+	for (target = all_targets; target; target = target->next)
+		print_target_debug_info_bpwp(CMD_CTX, target);
+
+	return ERROR_OK;
+}
+
+/* Falls into this function if nothing matched in the subcommand table */
+COMMAND_HANDLER(aarch64_handle_debug_info_command)
+{
+	struct target *target;
+
+/*
+	for (i = 0; i < CMD_ARGC; i++)
+		command_print(CMD_CTX, "parm %d = %s\n", i, CMD_ARGV[i]);
+*/
+
+	for (target = all_targets; target; target = target->next)
+		print_target_debug_info_all(CMD_CTX, target);
+
 	return ERROR_OK;
 }
 
+/* ---------------------------------------- */
 
 /*
 		d2801543	mov	x3, #0xAA
@@ -455,7 +587,31 @@ COMMAND_HANDLER(aarch64_handle_debug_command)
 }
 #endif
 
+static const struct command_registration aarch64_debug_info_subcommand_handlers[] = \
{ +	{
+		.name = "status",		/* aarch64 debug info status */
+		.handler = aarch64_handle_debug_info_status_command,
+		.mode = COMMAND_EXEC,
+		.help = "aarch64 debug info status [smp]",
+		.usage = "",
+	},
+	{
+		.name = "cti",			/* aarch64 debug info cti */
+		.handler = aarch64_handle_debug_info_cti_command,
+		.mode = COMMAND_EXEC,
+		.help = "aarch64 debug info cti [smp]",
+		.usage = "",
+	},
+	{
+		.name = "bpwp",			/* aarch64 debug info bpwp */
+		.handler = aarch64_handle_debug_info_bpwp_command,
+		.mode = COMMAND_EXEC,
+		.help = "aarch64 debug info bpwp [smp]",
+		.usage = "",
+	},
 
+	COMMAND_REGISTRATION_DONE
+};
 
 static const struct command_registration aarch64_debug_cache_subcommand_handlers[] = \
{  {
@@ -489,6 +645,7 @@ const struct command_registration \
                aarch64_debug_subcommand_handlers[] = {
 		.handler = aarch64_handle_debug_info_command,
 		.mode = COMMAND_EXEC,
 		.help = "debugging information",
+		.chain = aarch64_debug_info_subcommand_handlers,
 		.usage = "",
 	},
 

-- 

------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
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