18f70d46cSAaron LI/* 2*e84206a6SAaron LI * Copyright (c) 2018-2021 Maxime Villard, m00nbsd.net 38f70d46cSAaron LI * All rights reserved. 48f70d46cSAaron LI * 58f70d46cSAaron LI * This code is part of the NVMM hypervisor. 68f70d46cSAaron LI * 78f70d46cSAaron LI * Redistribution and use in source and binary forms, with or without 88f70d46cSAaron LI * modification, are permitted provided that the following conditions 98f70d46cSAaron LI * are met: 108f70d46cSAaron LI * 1. Redistributions of source code must retain the above copyright 118f70d46cSAaron LI * notice, this list of conditions and the following disclaimer. 128f70d46cSAaron LI * 2. Redistributions in binary form must reproduce the above copyright 138f70d46cSAaron LI * notice, this list of conditions and the following disclaimer in the 148f70d46cSAaron LI * documentation and/or other materials provided with the distribution. 158f70d46cSAaron LI * 168f70d46cSAaron LI * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 178f70d46cSAaron LI * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 188f70d46cSAaron LI * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 198f70d46cSAaron LI * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 208f70d46cSAaron LI * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 218f70d46cSAaron LI * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 228f70d46cSAaron LI * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 238f70d46cSAaron LI * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 248f70d46cSAaron LI * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 258f70d46cSAaron LI * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 268f70d46cSAaron LI * SUCH DAMAGE. 278f70d46cSAaron LI */ 288f70d46cSAaron LI 298f70d46cSAaron LI .globl test1_begin, test1_end 308f70d46cSAaron LI .globl test2_begin, test2_end 318f70d46cSAaron LI .globl test3_begin, test3_end 328f70d46cSAaron LI .globl test4_begin, test4_end 338f70d46cSAaron LI .globl test5_begin, test5_end 348f70d46cSAaron LI .globl test6_begin, test6_end 358f70d46cSAaron LI .globl test7_begin, test7_end 368f70d46cSAaron LI .globl test8_begin, test8_end 378f70d46cSAaron LI .globl test9_begin, test9_end 388f70d46cSAaron LI .globl test10_begin, test10_end 398f70d46cSAaron LI .globl test11_begin, test11_end 408f70d46cSAaron LI .globl test12_begin, test12_end 418f70d46cSAaron LI .globl test13_begin, test13_end 428f70d46cSAaron LI .globl test14_begin, test14_end 438f70d46cSAaron LI .globl test_64bit_15_begin, test_64bit_15_end 448f70d46cSAaron LI .globl test_64bit_16_begin, test_64bit_16_end 458f70d46cSAaron LI .text 468f70d46cSAaron LI .code64 478f70d46cSAaron LI 488f70d46cSAaron LI#define TEST_END \ 498f70d46cSAaron LI movq $0xFFFFFFFFFFFFFFFF,%rcx; \ 508f70d46cSAaron LI rdmsr ; 518f70d46cSAaron LI 528f70d46cSAaron LI .align 64 538f70d46cSAaron LItest1_begin: 548f70d46cSAaron LI movq $0x1000,%rax 558f70d46cSAaron LI movq $0x1000,%rbp 568f70d46cSAaron LI 578f70d46cSAaron LI movq $0x1000,(%rax) 588f70d46cSAaron LI 598f70d46cSAaron LI movq $1,%r11 608f70d46cSAaron LI movq $0x2000,(%rax,%r11,8) 618f70d46cSAaron LI 628f70d46cSAaron LI movq (%rbp),%r8 638f70d46cSAaron LI movq 8(%rbp),%rbx 648f70d46cSAaron LI addq %rbx,%r8 658f70d46cSAaron LI movq %r8,(%rbp) 668f70d46cSAaron LI movb $4,(%rbp) 678f70d46cSAaron LI 688f70d46cSAaron LI TEST_END 698f70d46cSAaron LItest1_end: 708f70d46cSAaron LI 718f70d46cSAaron LI .align 64 728f70d46cSAaron LItest2_begin: 738f70d46cSAaron LI movq $0x1000,%rax 748f70d46cSAaron LI 758f70d46cSAaron LI movq $0x1000,(%rax) 768f70d46cSAaron LI movq $0x00FF,%rbx 778f70d46cSAaron LI orb %bl,(%rax) 788f70d46cSAaron LI movq $0x0400,%rcx 798f70d46cSAaron LI orw %cx,(%rax) 808f70d46cSAaron LI 818f70d46cSAaron LI movq $0x0200,%rcx 828f70d46cSAaron LI orq (%rax),%rcx 838f70d46cSAaron LI movq %rcx,(%rax) 848f70d46cSAaron LI 858f70d46cSAaron LI TEST_END 868f70d46cSAaron LItest2_end: 878f70d46cSAaron LI 888f70d46cSAaron LI .align 64 898f70d46cSAaron LItest3_begin: 908f70d46cSAaron LI movq $0x1000,%rax 918f70d46cSAaron LI 928f70d46cSAaron LI movq $0x1FFF,(%rax) 938f70d46cSAaron LI movq $0x1FF0,%rbx 948f70d46cSAaron LI andq %rbx,(%rax) 958f70d46cSAaron LI movq $0x10C1,%rcx 968f70d46cSAaron LI andb %cl,(%rax) 978f70d46cSAaron LI 988f70d46cSAaron LI TEST_END 998f70d46cSAaron LItest3_end: 1008f70d46cSAaron LI 1018f70d46cSAaron LI .align 64 1028f70d46cSAaron LItest4_begin: 1038f70d46cSAaron LI movq $0x1000,%rax 1048f70d46cSAaron LI 1058f70d46cSAaron LI movq $0x1FFF,(%rax) 1068f70d46cSAaron LI movq $0x1FF0,%rbx 1078f70d46cSAaron LI xorq %rbx,(%rax) 1088f70d46cSAaron LI movq $0x10C0,%rcx 1098f70d46cSAaron LI xorw %cx,(%rax) 1108f70d46cSAaron LI 1118f70d46cSAaron LI TEST_END 1128f70d46cSAaron LItest4_end: 1138f70d46cSAaron LI 1148f70d46cSAaron LI .align 64 1158f70d46cSAaron LItest5_begin: 1168f70d46cSAaron LI movq $0xFFFFFFFF00001000,%rax 1178f70d46cSAaron LI 1188f70d46cSAaron LI movq $0x1FFF,(%eax) 1198f70d46cSAaron LI movb $0,(%eax,%ebx,1) 1208f70d46cSAaron LI 1218f70d46cSAaron LI TEST_END 1228f70d46cSAaron LItest5_end: 1238f70d46cSAaron LI 1248f70d46cSAaron LI .align 64 1258f70d46cSAaron LItest6_begin: 1268f70d46cSAaron LI movq $0xFFA0,%rax 1278f70d46cSAaron LI movabs %rax,0x1000 1288f70d46cSAaron LI 1298f70d46cSAaron LI movabs 0x1000,%al 1308f70d46cSAaron LI orb $0x0B,%al 1318f70d46cSAaron LI movabs %al,0x1000 1328f70d46cSAaron LI 1338f70d46cSAaron LI TEST_END 1348f70d46cSAaron LItest6_end: 1358f70d46cSAaron LI 1368f70d46cSAaron LI .align 64 1378f70d46cSAaron LItest7_begin: 1388f70d46cSAaron LI movq $0x56,%rax 1398f70d46cSAaron LI 1408f70d46cSAaron LI movq $1,%rcx 1418f70d46cSAaron LI movq $0x1000,%rdi 1428f70d46cSAaron LI rep stosb 1438f70d46cSAaron LI 1448f70d46cSAaron LI movq $0x1234,%rax 1458f70d46cSAaron LI stosw 1468f70d46cSAaron LI 1478f70d46cSAaron LI TEST_END 1488f70d46cSAaron LItest7_end: 1498f70d46cSAaron LI 1508f70d46cSAaron LI .align 64 1518f70d46cSAaron LItest8_begin: 1528f70d46cSAaron LI movq $0x1008,%rsi 1538f70d46cSAaron LI movq $0x12345678,(%rsi) 1548f70d46cSAaron LI 1558f70d46cSAaron LI movq $0x1000,%rdi 1568f70d46cSAaron LI 1578f70d46cSAaron LI lodsw 1588f70d46cSAaron LI movw %ax,(%rdi) 1598f70d46cSAaron LI addq $2,%rdi 1608f70d46cSAaron LI 1618f70d46cSAaron LI lodsb 1628f70d46cSAaron LI movb %al,(%rdi) 1638f70d46cSAaron LI addq $1,%rdi 1648f70d46cSAaron LI 1658f70d46cSAaron LI lodsb 1668f70d46cSAaron LI movb %al,(%rdi) 1678f70d46cSAaron LI addq $2,%rdi 1688f70d46cSAaron LI 1698f70d46cSAaron LI TEST_END 1708f70d46cSAaron LItest8_end: 1718f70d46cSAaron LI 1728f70d46cSAaron LI .align 64 1738f70d46cSAaron LItest9_begin: 1748f70d46cSAaron LI movq $0x1000,%rax 1758f70d46cSAaron LI 1768f70d46cSAaron LI movq $0x12345678,8(%rax) 1778f70d46cSAaron LI 1788f70d46cSAaron LI movq $0x1008,%rsi 1798f70d46cSAaron LI movq $0x1000,%rdi 1808f70d46cSAaron LI 1818f70d46cSAaron LI movq $4,%rcx 1828f70d46cSAaron LI rep movsb 1838f70d46cSAaron LI 1848f70d46cSAaron LI movq $2,%rcx 1858f70d46cSAaron LI rep movsw 1868f70d46cSAaron LI 1878f70d46cSAaron LI TEST_END 1888f70d46cSAaron LItest9_end: 1898f70d46cSAaron LI 1908f70d46cSAaron LI .align 64 1918f70d46cSAaron LItest10_begin: 1928f70d46cSAaron LI movq $0x1000,%rax 1938f70d46cSAaron LI movq $0x12345678,(%rax) 1948f70d46cSAaron LI 1958f70d46cSAaron LI movq $0xFFFFFFFFFFFFFFFF,%rbx 1968f70d46cSAaron LI movzbl (%rax),%ebx 1978f70d46cSAaron LI movq %rbx,(%rax) 1988f70d46cSAaron LI 1998f70d46cSAaron LI TEST_END 2008f70d46cSAaron LItest10_end: 2018f70d46cSAaron LI 2028f70d46cSAaron LI .align 64 2038f70d46cSAaron LItest11_begin: 2048f70d46cSAaron LI movq $0x1000,%rax 2058f70d46cSAaron LI movq $0x12345678,(%rax) 2068f70d46cSAaron LI 2078f70d46cSAaron LI movq $0xFFFFFFFFFFFFFFFF,%rbx 2088f70d46cSAaron LI movzwq (%rax),%rbx 2098f70d46cSAaron LI movq %rbx,(%rax) 2108f70d46cSAaron LI 2118f70d46cSAaron LI TEST_END 2128f70d46cSAaron LItest11_end: 2138f70d46cSAaron LI 2148f70d46cSAaron LI .align 64 2158f70d46cSAaron LItest12_begin: 2168f70d46cSAaron LI movq $0x1000,%rax 2178f70d46cSAaron LI movq $0xFFFFFFFFF2345678,(%rax) 2188f70d46cSAaron LI 2198f70d46cSAaron LI cmpb $0x78,(%rax) 2208f70d46cSAaron LI jne .L12_failure 2218f70d46cSAaron LI cmpb $0x77,(%rax) 2228f70d46cSAaron LI jl .L12_failure 2238f70d46cSAaron LI cmpb $0x79,(%rax) 2248f70d46cSAaron LI jg .L12_failure 2258f70d46cSAaron LI 2268f70d46cSAaron LI cmpw $0x5678,(%rax) 2278f70d46cSAaron LI jne .L12_failure 2288f70d46cSAaron LI cmpw $0x5677,(%rax) 2298f70d46cSAaron LI jl .L12_failure 2308f70d46cSAaron LI cmpw $0x5679,(%rax) 2318f70d46cSAaron LI jg .L12_failure 2328f70d46cSAaron LI 2338f70d46cSAaron LI cmpl $0xF2345678,(%rax) 2348f70d46cSAaron LI jne .L12_failure 2358f70d46cSAaron LI cmpl $0xF2345677,(%rax) 2368f70d46cSAaron LI jl .L12_failure 2378f70d46cSAaron LI cmpl $0xF2345679,(%rax) 2388f70d46cSAaron LI jg .L12_failure 2398f70d46cSAaron LI 2408f70d46cSAaron LI cmpq $0xFFFFFFFFF2345678,(%rax) 2418f70d46cSAaron LI jne .L12_failure 2428f70d46cSAaron LI cmpq $0xFFFFFFFFF2345677,(%rax) 2438f70d46cSAaron LI jl .L12_failure 2448f70d46cSAaron LI cmpq $0xFFFFFFFFF2345679,(%rax) 2458f70d46cSAaron LI jg .L12_failure 2468f70d46cSAaron LI 2478f70d46cSAaron LI.L12_success: 2488f70d46cSAaron LI movq $1,(%rax) 2498f70d46cSAaron LI TEST_END 2508f70d46cSAaron LI.L12_failure: 2518f70d46cSAaron LI movq $0,(%rax) 2528f70d46cSAaron LI TEST_END 2538f70d46cSAaron LItest12_end: 2548f70d46cSAaron LI 2558f70d46cSAaron LI .align 64 2568f70d46cSAaron LItest13_begin: 2578f70d46cSAaron LI movq $0x1000,%rax 2588f70d46cSAaron LI movq $0x000000001000A0FF,(%rax) 2598f70d46cSAaron LI 2608f70d46cSAaron LI movq $0xFFFF,%rcx 2618f70d46cSAaron LI subb %cl,(%rax) 2628f70d46cSAaron LI 2638f70d46cSAaron LI movq $0xA000,%rcx 2648f70d46cSAaron LI subw %cx,(%rax) 2658f70d46cSAaron LI 2668f70d46cSAaron LI movq $0x0000000F1000A0FF,%rcx 2678f70d46cSAaron LI subq (%rax),%rcx 2688f70d46cSAaron LI 2698f70d46cSAaron LI movq %rcx,(%rax) 2708f70d46cSAaron LI 2718f70d46cSAaron LI TEST_END 2728f70d46cSAaron LItest13_end: 2738f70d46cSAaron LI 2748f70d46cSAaron LI .align 64 2758f70d46cSAaron LItest14_begin: 2768f70d46cSAaron LI movq $0x1000,%rax 2778f70d46cSAaron LI movq $0xA0FF,(%rax) 2788f70d46cSAaron LI 2798f70d46cSAaron LI testb $0x0F,(%rax) 2808f70d46cSAaron LI jz .L14_failure 2818f70d46cSAaron LI 2828f70d46cSAaron LI testw $0x0F00,(%rax) 2838f70d46cSAaron LI jnz .L14_failure 2848f70d46cSAaron LI 2858f70d46cSAaron LI testl $0xA000,(%rax) 2868f70d46cSAaron LI jz .L14_failure 2878f70d46cSAaron LI 2888f70d46cSAaron LI.L14_success: 2898f70d46cSAaron LI movq $1,(%rax) 2908f70d46cSAaron LI TEST_END 2918f70d46cSAaron LI.L14_failure: 2928f70d46cSAaron LI movq $0,(%rax) 2938f70d46cSAaron LI TEST_END 2948f70d46cSAaron LItest14_end: 2958f70d46cSAaron LI 2968f70d46cSAaron LI .align 64 2978f70d46cSAaron LItest_64bit_15_begin: 2988f70d46cSAaron LI movq $0x1000,%rax 2998f70d46cSAaron LI movq $0x120000,%rbx 3008f70d46cSAaron LI movq $0x003400,%rcx 3018f70d46cSAaron LI movq $0x000056,%rdx 3028f70d46cSAaron LI 3038f70d46cSAaron LI xchgq %rbx,(%rax) 3048f70d46cSAaron LI xchgw (%rax),%cx 3058f70d46cSAaron LI xchgb %dl,(%rax) 3068f70d46cSAaron LI 3078f70d46cSAaron LI TEST_END 3088f70d46cSAaron LItest_64bit_15_end: 3098f70d46cSAaron LI 3108f70d46cSAaron LI .align 64 3118f70d46cSAaron LItest_64bit_16_begin: 3128f70d46cSAaron LI movq $0x1000,%rax 3138f70d46cSAaron LI movq $0x000000,%rbx 3148f70d46cSAaron LI movq $0x000000,%rcx 3158f70d46cSAaron LI movq $0x000000,%rdx 3168f70d46cSAaron LI 3178f70d46cSAaron LI movq $0x123456,(%rax) 3188f70d46cSAaron LI xchgq %rbx,(%eax) 3198f70d46cSAaron LI movq $0,(%rax) 3208f70d46cSAaron LI xchgq %rbx,(%eax) 3218f70d46cSAaron LI 3228f70d46cSAaron LI TEST_END 3238f70d46cSAaron LItest_64bit_16_end: 3248f70d46cSAaron LI 3258f70d46cSAaron LI/* -------------------------------------------------------------------------- */ 3268f70d46cSAaron LI 3278f70d46cSAaron LI .globl test_16bit_1_begin, test_16bit_1_end 3288f70d46cSAaron LI .globl test_16bit_2_begin, test_16bit_2_end 3298f70d46cSAaron LI .globl test_16bit_3_begin, test_16bit_3_end 3308f70d46cSAaron LI .globl test_16bit_4_begin, test_16bit_4_end 3318f70d46cSAaron LI .globl test_16bit_5_begin, test_16bit_5_end 3328f70d46cSAaron LI .globl test_16bit_6_begin, test_16bit_6_end 3338f70d46cSAaron LI 3348f70d46cSAaron LI#define TEST16_END \ 3358f70d46cSAaron LI rdmsr 3368f70d46cSAaron LI 3378f70d46cSAaron LI .code16 3388f70d46cSAaron LI 3398f70d46cSAaron LI .align 64 3408f70d46cSAaron LItest_16bit_1_begin: 3418f70d46cSAaron LI movw $0x10f1,%bx 3428f70d46cSAaron LI movw $0x123,%dx 3438f70d46cSAaron LI 3448f70d46cSAaron LI movb %dl,(%bx) 3458f70d46cSAaron LI 3468f70d46cSAaron LI TEST16_END 3478f70d46cSAaron LItest_16bit_1_end: 3488f70d46cSAaron LI 3498f70d46cSAaron LI .align 64 3508f70d46cSAaron LItest_16bit_2_begin: 3518f70d46cSAaron LI movw $0x10f1,%bx 3528f70d46cSAaron LI movw $2,%di 3538f70d46cSAaron LI movw $0x123,%dx 3548f70d46cSAaron LI 3558f70d46cSAaron LI movw %dx,(%bx,%di) 3568f70d46cSAaron LI 3578f70d46cSAaron LI TEST16_END 3588f70d46cSAaron LItest_16bit_2_end: 3598f70d46cSAaron LI 3608f70d46cSAaron LI .align 64 3618f70d46cSAaron LItest_16bit_3_begin: 3628f70d46cSAaron LI movw $0x10f1,%bp 3638f70d46cSAaron LI movw $2,%si 3648f70d46cSAaron LI movw $0x678,%dx 3658f70d46cSAaron LI 3668f70d46cSAaron LI movw %dx,-2(%bp,%si) 3678f70d46cSAaron LI 3688f70d46cSAaron LI TEST16_END 3698f70d46cSAaron LItest_16bit_3_end: 3708f70d46cSAaron LI 3718f70d46cSAaron LI .align 64 3728f70d46cSAaron LItest_16bit_4_begin: 3738f70d46cSAaron LI movw $0x10f0,%bp 3748f70d46cSAaron LI movw $2,%si 3758f70d46cSAaron LI movw $2+4+4,%di 3768f70d46cSAaron LI movw $0xFFFF,%dx 3778f70d46cSAaron LI movl $0x0001,%eax 3788f70d46cSAaron LI movl $0x0010,%ebx 3798f70d46cSAaron LI movl $0x1000,%ecx 3808f70d46cSAaron LI 3818f70d46cSAaron LI movw %dx,4(%bp,%si) /* 16bit opr 16bit adr */ 3828f70d46cSAaron LI andl %eax,4(%bp,%si) /* 32bit opr 16bit adr */ 3838f70d46cSAaron LI orw %bx,4(%ebp,%esi) /* 16bit opr 32bit adr */ 3848f70d46cSAaron LI orl %ecx,-4(%bp,%di) /* 32bit opr 16bit adr, negative */ 3858f70d46cSAaron LI 3868f70d46cSAaron LI TEST16_END 3878f70d46cSAaron LItest_16bit_4_end: 3888f70d46cSAaron LI 3898f70d46cSAaron LI .align 64 3908f70d46cSAaron LItest_16bit_5_begin: 3918f70d46cSAaron LI movb $0x12,0x1234 3928f70d46cSAaron LI 3938f70d46cSAaron LI TEST16_END 3948f70d46cSAaron LItest_16bit_5_end: 3958f70d46cSAaron LI 3968f70d46cSAaron LI .align 64 3978f70d46cSAaron LItest_16bit_6_begin: 3988f70d46cSAaron LI movw $0x1234,%bp 3998f70d46cSAaron LI movw $4,%di 4008f70d46cSAaron LI movw $0x1200,%bx 4018f70d46cSAaron LI movw $0x0034,%cx 4028f70d46cSAaron LI 4038f70d46cSAaron LI xchgw %bx,(%bp) 4048f70d46cSAaron LI xchgb -4(%bp,%di),%cl 4058f70d46cSAaron LI 4068f70d46cSAaron LI TEST16_END 4078f70d46cSAaron LItest_16bit_6_end: 408