From 3ffa14b043225b9766132b1979db7ddb8d91ba5e Mon Sep 17 00:00:00 2001
From: Antonio Borneo <borneo.antonio@gmail.com>
Date: Wed, 16 Sep 2020 15:26:40 +0200
Subject: [PATCH] target/aarch64: fix use of 'target->private_config'

The function adiv5_jim_configure() casts the void pointer
'target->private_config' to a struct adiv5_private_config pointer.
This is tricky in case of aarch64, where the private data are in a
struct aarch64_private_config that has as first element the struct
adiv5_private_config.

While the current solution is working fine, it's not clean and
requires special attention for any further code development.

Override 'target->private_config' to the correct pointer while
calling adiv5_jim_configure().

Change-Id: Ic2fc047dd1e57013943d96e6d5879a919d1eb7b3
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/5847
Tested-by: jenkins
Reviewed-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
---
 src/target/aarch64.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/target/aarch64.c b/src/target/aarch64.c
index 8d23bcabc..d111a0568 100644
--- a/src/target/aarch64.c
+++ b/src/target/aarch64.c
@@ -2504,8 +2504,13 @@ static int aarch64_jim_configure(struct target *target, Jim_GetOptInfo *goi)
 	 * options, JIM_OK if it correctly parsed the topmost option
 	 * and JIM_ERR if an error occurred during parameter evaluation.
 	 * For JIM_CONTINUE, we check our own params.
+	 *
+	 * adiv5_jim_configure() assumes 'private_config' to point to
+	 * 'struct adiv5_private_config'. Override 'private_config'!
 	 */
+	target->private_config = &pc->adiv5_config;
 	e = adiv5_jim_configure(target, goi);
+	target->private_config = pc;
 	if (e != JIM_CONTINUE)
 		return e;