diff --git a/TODO b/TODO
index c7e341d9a51a201e5579211093e9c5572e7c8de3..bdbb0ecc747f48d271d8bb00866011823f727866 100644
--- a/TODO
+++ b/TODO
@@ -309,7 +309,8 @@ fairly easy to complete:
 
 - use dynamic allocations for working memory. Scan & fix code
 for excessive stack allocations. take linux/scripts/checkstack.pl and
-see what the worst offenders are.  Example, on amd64:
+see what the worst offenders are. Dynamic stack allocations are found
+at the bottom of the list below.  Example, on amd64:
 
  $ objdump -d | checkstack.pl | head -10
  0x004311e3 image_open [openocd]:                      13464
diff --git a/src/target/arm11_dbgtap.c b/src/target/arm11_dbgtap.c
index 0f7e4953ab8af55217c00d52e0936d2d94c9c363..26de4ceb2f8bdd7da36d664f2cfb74667697a296 100644
--- a/src/target/arm11_dbgtap.c
+++ b/src/target/arm11_dbgtap.c
@@ -880,10 +880,11 @@ int arm11_sc7_run(struct arm11_common * arm11, struct arm11_sc7_action * actions
  */
 void arm11_sc7_clear_vbw(struct arm11_common * arm11)
 {
-	struct arm11_sc7_action		clear_bw[arm11->brp + arm11->wrp + 1];
+	size_t clear_bw_size = arm11->brp + arm11->wrp + 1;
+	struct arm11_sc7_action		*clear_bw = malloc(sizeof(struct arm11_sc7_action) * clear_bw_size);
 	struct arm11_sc7_action *	pos = clear_bw;
 
-	for (size_t i = 0; i < ARRAY_SIZE(clear_bw); i++)
+	for (size_t i = 0; i < clear_bw_size; i++)
 	{
 		clear_bw[i].write	= true;
 		clear_bw[i].value	= 0;
@@ -899,7 +900,9 @@ void arm11_sc7_clear_vbw(struct arm11_common * arm11)
 
 	(pos++)->address = ARM11_SC7_VCR;
 
-	arm11_sc7_run(arm11, clear_bw, ARRAY_SIZE(clear_bw));
+	arm11_sc7_run(arm11, clear_bw, clear_bw_size);
+
+	free (clear_bw);
 }
 
 /** Write VCR register