Re: MIPS: relocation issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 28.01.20 11:49, Peter Mamonov wrote:
Hi Oleksij,

Below you will find the patch, which adds the `whereami` command. The command
prints several addresses belonging to code, data, bss, heap and stack areas.
I've run it on qemu/malta with relocations enabled and disabled as per Antony's
mail. Output comparison shows that only the stack is relocated. Looks like
relocation doesn't work as expected. Also note that the stack was relocated
from the uncached KSEG1 to the cached KSEG0 segment, which is inconsistent at
least.


ACK. The patch "MIPS: remove .bss to __rel_start overlay" should fix it. Please test :)

Relocation enabled:

	barebox@qemu malta:/ whereami
	code   @ a0829bcc (a0829bc0)
	data   @ a085f3c0
	bss    @ a0861ae0
	heap   @ a0428c38
	stack  @ 8fb8fd50
	barebox@qemu malta:/ version

	barebox 2020.01.0-00104-gfe12ba2776 #3 Tue Jan 28 13:34:06 MSK 2020


Relocation disabled:

	barebox@qemu malta:/ whereami
	code   @ a0829bcc (a0829bc0)
	data   @ a085f1e0
	bss    @ a0861900
	heap   @ a0428c38
	stack  @ a03ffd50

This functionality is available with command iomem.

Regards,
Peter
---
  commands/Kconfig    |  5 +++++
  commands/Makefile   |  1 +
  commands/whereami.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
  3 files changed, 51 insertions(+)
  create mode 100644 commands/whereami.c

diff --git a/commands/Kconfig b/commands/Kconfig
index add0d26ee9..a660e09db4 100644
--- a/commands/Kconfig
+++ b/commands/Kconfig
@@ -2217,6 +2217,11 @@ config CMD_UBSAN
  	  This is a test command for the undefined behavior sanitizer.
  	  It triggers various undefined behavior, and detect it.
+config CMD_WHEREAMI
+	tristate "whereami"
+	depends on MIPS
+	default y
+
  # end Miscellaneous commands
  endmenu
diff --git a/commands/Makefile b/commands/Makefile
index 8e8c449bc1..dfa3d6e447 100644
--- a/commands/Makefile
+++ b/commands/Makefile
@@ -128,6 +128,7 @@ obj-$(CONFIG_CMD_NAND_BITFLIP)	+= nand-bitflip.o
  obj-$(CONFIG_CMD_SEED)		+= seed.o
  obj-$(CONFIG_CMD_IP_ROUTE_GET)  += ip-route-get.o
  obj-$(CONFIG_CMD_UBSAN)		+= ubsan.o
+obj-$(CONFIG_CMD_WHEREAMI)	+= whereami.o
UBSAN_SANITIZE_ubsan.o := y diff --git a/commands/whereami.c b/commands/whereami.c
new file mode 100644
index 0000000000..3edb070fe8
--- /dev/null
+++ b/commands/whereami.c
@@ -0,0 +1,45 @@
+#include <common.h>
+#include <command.h>
+#include <complete.h>
+
+static volatile int data = 1;
+static volatile int bss;
+
+static void* code();
+static noinline void* code()
+{
+	void *ret;
+	__asm__ __volatile__(
+		".set	push\n"
+		".set	noreorder\n"
+		".set	noat\n"
+		"	move	$1, $31\n"
+		"	bal	255f\n"
+		"	nop\n"
+		"255:	move	%0, $31\n"
+		"	move	$31, $1\n"
+		".set	pop\n"
+		:"=r" (ret)
+	);
+	return ret;
+}
+
+static int do_whereami(int argc, char *argv[])
+{
+	volatile int stack;
+	int *heapp = malloc(sizeof(int));
+
+	printf("code   @ %p (%p)\n", code(), &code);
+	printf("data   @ %p\n", &data);
+	printf("bss    @ %p\n", &bss);
+	printf("heap   @ %p\n", heapp);
+	printf("stack  @ %p\n", &stack);
+	return 0;
+}
+
+BAREBOX_CMD_START(whereami)
+	.cmd		= do_whereami,
+	BAREBOX_CMD_DESC("print addresses from code, stack, heap and data sections")
+	BAREBOX_CMD_GROUP(CMD_GRP_INFO)
+	BAREBOX_CMD_COMPLETE(empty_complete)
+BAREBOX_CMD_END


Kind regards,
Oleksij Rempel

--
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/barebox



[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux