arm7_9_common: fix host endianness bug in arm7_9_full_context()
authorAntonio Borneo <borneo.antonio@gmail.com>
Sun, 22 Nov 2020 11:29:04 +0000 (12:29 +0100)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sat, 5 Dec 2020 23:18:29 +0000 (23:18 +0000)
commita56b7291911b4f42718d406dd2de857db4c11e0f
tree7ae235715f4ab92a4f4a3f6ef3325874242bc3bd
parent62686ab161e9c46a620dd592b2767634e9483c20
arm7_9_common: fix host endianness bug in arm7_9_full_context()

The original code passes to ->read_core_regs() and to
->read_xpsr() the pointer to the little-endian buffer reg.value.
This is incorrect because the two functions above require a
pointer to uint32_t, since they already run the conversion with
arm_le_to_h_u32() in the jtag callback.
This causes a mismatch on big-endian host and the registers get
read with the incorrect endianness.

Use an intermediate buffer to read the registers as uint32_t and
to track the destination reg.value pointer, then copy the value in
reg.value after the call to jtag_execute_queue().

Tested with qemu-armeb and an OpenOCD built through buildroot
configured for cortex-a7 big-endian.

Note that if jtag_execute_queue() fails, the openocd register
cache is not updated, so the already modified flags 'valid' and
'dirty' are incorrect. This part should be moved after the call to
jtag_execute_queue() too.

Change-Id: Iba70d964ffbb74bf0860bfd9d299f218e3bc65bf
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/5943
Tested-by: jenkins
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
src/target/arm7_9_common.c