diff options
| author | David Howells <dhowells@redhat.com> | 2008-11-12 10:35:04 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-11-12 13:41:17 -0500 |
| commit | 9f55588968095306d52bd30564666d4fadce5e39 (patch) | |
| tree | d75a97919e847f4dcdee8d6b75d6f06f2688f235 | |
| parent | 31ea24bba77a16d3220b0822838785cbafb78175 (diff) | |
MN10300: Add built-in testing for misalignment handler
Add configurable built-in testing for the MN10300 misalignment handler.
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | arch/mn10300/Kconfig.debug | 9 | ||||
| -rw-r--r-- | arch/mn10300/mm/misalignment.c | 161 |
2 files changed, 170 insertions, 0 deletions
diff --git a/arch/mn10300/Kconfig.debug b/arch/mn10300/Kconfig.debug index 524e33819f32..ff80e86b9bd2 100644 --- a/arch/mn10300/Kconfig.debug +++ b/arch/mn10300/Kconfig.debug | |||
| @@ -15,6 +15,15 @@ config DEBUG_DECOMPRESS_KERNEL | |||
| 15 | decompressing Linux seeing "Uncompressing Linux... " and | 15 | decompressing Linux seeing "Uncompressing Linux... " and |
| 16 | "Ok, booting the kernel.\n" on console. | 16 | "Ok, booting the kernel.\n" on console. |
| 17 | 17 | ||
| 18 | config TEST_MISALIGNMENT_HANDLER | ||
| 19 | bool "Run tests on the misalignment handler" | ||
| 20 | depends on DEBUG_KERNEL | ||
| 21 | default n | ||
| 22 | help | ||
| 23 | If you say Y here the kernel will execute a list of misaligned memory | ||
| 24 | accesses to make sure the misalignment handler deals them with | ||
| 25 | correctly. If it does not, the kernel will throw a BUG. | ||
| 26 | |||
| 18 | config KPROBES | 27 | config KPROBES |
| 19 | bool "Kprobes" | 28 | bool "Kprobes" |
| 20 | depends on DEBUG_KERNEL | 29 | depends on DEBUG_KERNEL |
diff --git a/arch/mn10300/mm/misalignment.c b/arch/mn10300/mm/misalignment.c index 416c43baaa21..93e09c4be1db 100644 --- a/arch/mn10300/mm/misalignment.c +++ b/arch/mn10300/mm/misalignment.c | |||
| @@ -650,3 +650,164 @@ static int misalignment_reg(unsigned long *registers, unsigned params, | |||
| 650 | 650 | ||
| 651 | return 1; | 651 | return 1; |
| 652 | } | 652 | } |
| 653 | |||
| 654 | /* | ||
| 655 | * misalignment handler tests | ||
| 656 | */ | ||
| 657 | #ifdef CONFIG_TEST_MISALIGNMENT_HANDLER | ||
| 658 | static u8 __initdata testbuf[512] __attribute__((aligned(16))) = { | ||
| 659 | [257] = 0x11, | ||
| 660 | [258] = 0x22, | ||
| 661 | [259] = 0x33, | ||
| 662 | [260] = 0x44, | ||
| 663 | }; | ||
| 664 | |||
| 665 | #define ASSERTCMP(X, OP, Y) \ | ||
| 666 | do { \ | ||
| 667 | if (unlikely(!((X) OP (Y)))) { \ | ||
| 668 | printk(KERN_ERR "\n"); \ | ||
| 669 | printk(KERN_ERR "MISALIGN: Assertion failed at line %u\n", \ | ||
| 670 | __LINE__); \ | ||
| 671 | printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n", \ | ||
| 672 | (unsigned long)(X), (unsigned long)(Y)); \ | ||
| 673 | BUG(); \ | ||
| 674 | } \ | ||
| 675 | } while(0) | ||
| 676 | |||
| 677 | static int __init test_misalignment(void) | ||
| 678 | { | ||
| 679 | register void *r asm("e0"); | ||
| 680 | register u32 y asm("e1"); | ||
| 681 | void *p = testbuf, *q; | ||
| 682 | u32 tmp, tmp2, x; | ||
| 683 | |||
| 684 | printk(KERN_NOTICE "==>test_misalignment() [testbuf=%p]\n", p); | ||
| 685 | p++; | ||
| 686 | |||
| 687 | printk(KERN_NOTICE "___ MOV (Am),Dn ___\n"); | ||
| 688 | q = p + 256; | ||
| 689 | asm volatile("mov (%0),%1" : "+a"(q), "=d"(x)); | ||
| 690 | ASSERTCMP(q, ==, p + 256); | ||
| 691 | ASSERTCMP(x, ==, 0x44332211); | ||
| 692 | |||
| 693 | printk(KERN_NOTICE "___ MOV (256,Am),Dn ___\n"); | ||
| 694 | q = p; | ||
| 695 | asm volatile("mov (256,%0),%1" : "+a"(q), "=d"(x)); | ||
| 696 | ASSERTCMP(q, ==, p); | ||
| 697 | ASSERTCMP(x, ==, 0x44332211); | ||
| 698 | |||
| 699 | printk(KERN_NOTICE "___ MOV (Di,Am),Dn ___\n"); | ||
| 700 | tmp = 256; | ||
| 701 | q = p; | ||
| 702 | asm volatile("mov (%2,%0),%1" : "+a"(q), "=d"(x), "+d"(tmp)); | ||
| 703 | ASSERTCMP(q, ==, p); | ||
| 704 | ASSERTCMP(x, ==, 0x44332211); | ||
| 705 | ASSERTCMP(tmp, ==, 256); | ||
| 706 | |||
| 707 | printk(KERN_NOTICE "___ MOV (256,Rm),Rn ___\n"); | ||
| 708 | r = p; | ||
| 709 | asm volatile("mov (256,%0),%1" : "+r"(r), "=r"(y)); | ||
| 710 | ASSERTCMP(r, ==, p); | ||
| 711 | ASSERTCMP(y, ==, 0x44332211); | ||
| 712 | |||
| 713 | printk(KERN_NOTICE "___ MOV (Rm+),Rn ___\n"); | ||
| 714 | r = p + 256; | ||
| 715 | asm volatile("mov (%0+),%1" : "+r"(r), "=r"(y)); | ||
| 716 | ASSERTCMP(r, ==, p + 256 + 4); | ||
| 717 | ASSERTCMP(y, ==, 0x44332211); | ||
| 718 | |||
| 719 | printk(KERN_NOTICE "___ MOV (Rm+,8),Rn ___\n"); | ||
| 720 | r = p + 256; | ||
| 721 | asm volatile("mov (%0+,8),%1" : "+r"(r), "=r"(y)); | ||
| 722 | ASSERTCMP(r, ==, p + 256 + 8); | ||
| 723 | ASSERTCMP(y, ==, 0x44332211); | ||
| 724 | |||
| 725 | printk(KERN_NOTICE "___ MOV (7,SP),Rn ___\n"); | ||
| 726 | asm volatile( | ||
| 727 | "add -16,sp \n" | ||
| 728 | "mov +0x11,%0 \n" | ||
| 729 | "movbu %0,(7,sp) \n" | ||
| 730 | "mov +0x22,%0 \n" | ||
| 731 | "movbu %0,(8,sp) \n" | ||
| 732 | "mov +0x33,%0 \n" | ||
| 733 | "movbu %0,(9,sp) \n" | ||
| 734 | "mov +0x44,%0 \n" | ||
| 735 | "movbu %0,(10,sp) \n" | ||
| 736 | "mov (7,sp),%1 \n" | ||
| 737 | "add +16,sp \n" | ||
| 738 | : "+a"(q), "=d"(x)); | ||
| 739 | ASSERTCMP(x, ==, 0x44332211); | ||
| 740 | |||
| 741 | printk(KERN_NOTICE "___ MOV (259,SP),Rn ___\n"); | ||
| 742 | asm volatile( | ||
| 743 | "add -264,sp \n" | ||
| 744 | "mov +0x11,%0 \n" | ||
| 745 | "movbu %0,(259,sp) \n" | ||
| 746 | "mov +0x22,%0 \n" | ||
| 747 | "movbu %0,(260,sp) \n" | ||
| 748 | "mov +0x33,%0 \n" | ||
| 749 | "movbu %0,(261,sp) \n" | ||
| 750 | "mov +0x55,%0 \n" | ||
| 751 | "movbu %0,(262,sp) \n" | ||
| 752 | "mov (259,sp),%1 \n" | ||
| 753 | "add +264,sp \n" | ||
| 754 | : "+d"(tmp), "=d"(x)); | ||
| 755 | ASSERTCMP(x, ==, 0x55332211); | ||
| 756 | |||
| 757 | printk(KERN_NOTICE "___ MOV (260,SP),Rn ___\n"); | ||
| 758 | asm volatile( | ||
| 759 | "add -264,sp \n" | ||
| 760 | "mov +0x11,%0 \n" | ||
| 761 | "movbu %0,(260,sp) \n" | ||
| 762 | "mov +0x22,%0 \n" | ||
| 763 | "movbu %0,(261,sp) \n" | ||
| 764 | "mov +0x33,%0 \n" | ||
| 765 | "movbu %0,(262,sp) \n" | ||
| 766 | "mov +0x55,%0 \n" | ||
| 767 | "movbu %0,(263,sp) \n" | ||
| 768 | "mov (260,sp),%1 \n" | ||
| 769 | "add +264,sp \n" | ||
| 770 | : "+d"(tmp), "=d"(x)); | ||
| 771 | ASSERTCMP(x, ==, 0x55332211); | ||
| 772 | |||
| 773 | |||
| 774 | printk(KERN_NOTICE "___ MOV_LNE ___\n"); | ||
| 775 | tmp = 1; | ||
| 776 | tmp2 = 2; | ||
| 777 | q = p + 256; | ||
| 778 | asm volatile( | ||
| 779 | "setlb \n" | ||
| 780 | "mov %2,%3 \n" | ||
| 781 | "mov %1,%2 \n" | ||
| 782 | "cmp +0,%1 \n" | ||
| 783 | "mov_lne (%0+,4),%1" | ||
| 784 | : "+r"(q), "+d"(tmp), "+d"(tmp2), "=d"(x) | ||
| 785 | : | ||
| 786 | : "cc"); | ||
| 787 | ASSERTCMP(q, ==, p + 256 + 12); | ||
| 788 | ASSERTCMP(x, ==, 0x44332211); | ||
| 789 | |||
| 790 | printk(KERN_NOTICE "___ MOV in SETLB ___\n"); | ||
| 791 | tmp = 1; | ||
| 792 | tmp2 = 2; | ||
| 793 | q = p + 256; | ||
| 794 | asm volatile( | ||
| 795 | "setlb \n" | ||
| 796 | "mov %1,%3 \n" | ||
| 797 | "mov (%0+),%1 \n" | ||
| 798 | "cmp +0,%1 \n" | ||
| 799 | "lne " | ||
| 800 | : "+a"(q), "+d"(tmp), "+d"(tmp2), "=d"(x) | ||
| 801 | : | ||
| 802 | : "cc"); | ||
| 803 | |||
| 804 | ASSERTCMP(q, ==, p + 256 + 8); | ||
| 805 | ASSERTCMP(x, ==, 0x44332211); | ||
| 806 | |||
| 807 | printk(KERN_NOTICE "<==test_misalignment()\n"); | ||
| 808 | return 0; | ||
| 809 | } | ||
| 810 | |||
| 811 | arch_initcall(test_misalignment); | ||
| 812 | |||
| 813 | #endif /* CONFIG_TEST_MISALIGNMENT_HANDLER */ | ||
