xref: /dflybsd-src/test/testcases/libnvmm/h_mem_assist_asm.S (revision e84206a6156728f25f14aa8391a556add61c2aa0)
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