Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9f555889 authored by David Howells's avatar David Howells Committed by Linus Torvalds
Browse files

MN10300: Add built-in testing for misalignment handler



Add configurable built-in testing for the MN10300 misalignment handler.

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 31ea24bb
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -15,6 +15,15 @@ config DEBUG_DECOMPRESS_KERNEL
	  decompressing Linux seeing "Uncompressing Linux... " and
	  "Ok, booting the kernel.\n" on console.

config TEST_MISALIGNMENT_HANDLER
	bool "Run tests on the misalignment handler"
	depends on DEBUG_KERNEL
	default n
	help
	  If you say Y here the kernel will execute a list of misaligned memory
	  accesses to make sure the misalignment handler deals them with
	  correctly.  If it does not, the kernel will throw a BUG.

config KPROBES
	bool "Kprobes"
	depends on DEBUG_KERNEL
+161 −0
Original line number Diff line number Diff line
@@ -650,3 +650,164 @@ static int misalignment_reg(unsigned long *registers, unsigned params,

	return 1;
}

/*
 * misalignment handler tests
 */
#ifdef CONFIG_TEST_MISALIGNMENT_HANDLER
static u8 __initdata testbuf[512] __attribute__((aligned(16))) = {
	[257] = 0x11,
	[258] = 0x22,
	[259] = 0x33,
	[260] = 0x44,
};

#define ASSERTCMP(X, OP, Y)						\
do {									\
	if (unlikely(!((X) OP (Y)))) {					\
		printk(KERN_ERR "\n");					\
		printk(KERN_ERR "MISALIGN: Assertion failed at line %u\n", \
		       __LINE__);					\
		printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n",	\
		       (unsigned long)(X), (unsigned long)(Y));		\
		BUG();							\
	}								\
} while(0)

static int __init test_misalignment(void)
{
	register void *r asm("e0");
	register u32 y asm("e1");
	void *p = testbuf, *q;
	u32 tmp, tmp2, x;

	printk(KERN_NOTICE "==>test_misalignment() [testbuf=%p]\n", p);
	p++;

	printk(KERN_NOTICE "___ MOV (Am),Dn ___\n");
	q = p + 256;
	asm volatile("mov	(%0),%1" : "+a"(q), "=d"(x));
	ASSERTCMP(q, ==, p + 256);
	ASSERTCMP(x, ==, 0x44332211);

	printk(KERN_NOTICE "___ MOV (256,Am),Dn ___\n");
	q = p;
	asm volatile("mov	(256,%0),%1" : "+a"(q), "=d"(x));
	ASSERTCMP(q, ==, p);
	ASSERTCMP(x, ==, 0x44332211);

	printk(KERN_NOTICE "___ MOV (Di,Am),Dn ___\n");
	tmp = 256;
	q = p;
	asm volatile("mov	(%2,%0),%1" : "+a"(q), "=d"(x), "+d"(tmp));
	ASSERTCMP(q, ==, p);
	ASSERTCMP(x, ==, 0x44332211);
	ASSERTCMP(tmp, ==, 256);

	printk(KERN_NOTICE "___ MOV (256,Rm),Rn ___\n");
	r = p;
	asm volatile("mov	(256,%0),%1" : "+r"(r), "=r"(y));
	ASSERTCMP(r, ==, p);
	ASSERTCMP(y, ==, 0x44332211);

	printk(KERN_NOTICE "___ MOV (Rm+),Rn ___\n");
	r = p + 256;
	asm volatile("mov	(%0+),%1" : "+r"(r), "=r"(y));
	ASSERTCMP(r, ==, p + 256 + 4);
	ASSERTCMP(y, ==, 0x44332211);

	printk(KERN_NOTICE "___ MOV (Rm+,8),Rn ___\n");
	r = p + 256;
	asm volatile("mov	(%0+,8),%1" : "+r"(r), "=r"(y));
	ASSERTCMP(r, ==, p + 256 + 8);
	ASSERTCMP(y, ==, 0x44332211);

	printk(KERN_NOTICE "___ MOV (7,SP),Rn ___\n");
	asm volatile(
		"add	-16,sp		\n"
		"mov	+0x11,%0	\n"
		"movbu	%0,(7,sp)	\n"
		"mov	+0x22,%0	\n"
		"movbu	%0,(8,sp)	\n"
		"mov	+0x33,%0	\n"
		"movbu	%0,(9,sp)	\n"
		"mov	+0x44,%0	\n"
		"movbu	%0,(10,sp)	\n"
		"mov	(7,sp),%1	\n"
		"add	+16,sp		\n"
		: "+a"(q), "=d"(x));
	ASSERTCMP(x, ==, 0x44332211);

	printk(KERN_NOTICE "___ MOV (259,SP),Rn ___\n");
	asm volatile(
		"add	-264,sp		\n"
		"mov	+0x11,%0	\n"
		"movbu	%0,(259,sp)	\n"
		"mov	+0x22,%0	\n"
		"movbu	%0,(260,sp)	\n"
		"mov	+0x33,%0	\n"
		"movbu	%0,(261,sp)	\n"
		"mov	+0x55,%0	\n"
		"movbu	%0,(262,sp)	\n"
		"mov	(259,sp),%1	\n"
		"add	+264,sp		\n"
		: "+d"(tmp), "=d"(x));
	ASSERTCMP(x, ==, 0x55332211);

	printk(KERN_NOTICE "___ MOV (260,SP),Rn ___\n");
	asm volatile(
		"add	-264,sp		\n"
		"mov	+0x11,%0	\n"
		"movbu	%0,(260,sp)	\n"
		"mov	+0x22,%0	\n"
		"movbu	%0,(261,sp)	\n"
		"mov	+0x33,%0	\n"
		"movbu	%0,(262,sp)	\n"
		"mov	+0x55,%0	\n"
		"movbu	%0,(263,sp)	\n"
		"mov	(260,sp),%1	\n"
		"add	+264,sp		\n"
		: "+d"(tmp), "=d"(x));
	ASSERTCMP(x, ==, 0x55332211);


	printk(KERN_NOTICE "___ MOV_LNE ___\n");
	tmp = 1;
	tmp2 = 2;
	q = p + 256;
	asm volatile(
		"setlb			\n"
		"mov	%2,%3		\n"
		"mov	%1,%2		\n"
		"cmp	+0,%1		\n"
		"mov_lne	(%0+,4),%1"
		: "+r"(q), "+d"(tmp), "+d"(tmp2), "=d"(x)
		:
		: "cc");
	ASSERTCMP(q, ==, p + 256 + 12);
	ASSERTCMP(x, ==, 0x44332211);

	printk(KERN_NOTICE "___ MOV in SETLB ___\n");
	tmp = 1;
	tmp2 = 2;
	q = p + 256;
	asm volatile(
		"setlb			\n"
		"mov	%1,%3		\n"
		"mov	(%0+),%1	\n"
		"cmp	+0,%1		\n"
		"lne			"
		: "+a"(q), "+d"(tmp), "+d"(tmp2), "=d"(x)
		:
		: "cc");

	ASSERTCMP(q, ==, p + 256 + 8);
	ASSERTCMP(x, ==, 0x44332211);

	printk(KERN_NOTICE "<==test_misalignment()\n");
	return 0;
}

arch_initcall(test_misalignment);

#endif /* CONFIG_TEST_MISALIGNMENT_HANDLER */