summaryrefslogtreecommitdiff
path: root/src/cmd/tests/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/tests/kernel')
-rw-r--r--src/cmd/tests/kernel/misc.c10
-rw-r--r--src/cmd/tests/kernel/misc.s27
2 files changed, 37 insertions, 0 deletions
diff --git a/src/cmd/tests/kernel/misc.c b/src/cmd/tests/kernel/misc.c
index 7fc0866..d25e3dd 100644
--- a/src/cmd/tests/kernel/misc.c
+++ b/src/cmd/tests/kernel/misc.c
@@ -60,8 +60,18 @@ static void test_invalid_syscall(void) {
test(_syscall(~0, 0, 0, 0, 0, 0) < 0);
}
+extern void _sse_test(void *a);
+static void test_sse_restore(void) {
+ char buf[128] = "Hello world";
+ char buf2[128];
+ memcpy(buf2, buf, 128);
+ _sse_test(&buf);
+ test(memcmp(buf, buf2, 128) == 0);
+}
+
void r_k_misc(void) {
run_test(test_fault_kill);
run_test(test_efault);
run_test(test_invalid_syscall);
+ run_test(test_sse_restore);
}
diff --git a/src/cmd/tests/kernel/misc.s b/src/cmd/tests/kernel/misc.s
new file mode 100644
index 0000000..ae1b567
--- /dev/null
+++ b/src/cmd/tests/kernel/misc.s
@@ -0,0 +1,27 @@
+.section .text
+.global _sse_test
+.type _sse_test, @function
+
+/* Written in assembly to ensure gcc won't mess with the XMM registers */
+_sse_test:
+ movdqu (%rdi), %xmm1
+ push %rdi /* preserve */
+
+ call fork
+ cmp $0, %rax
+ je child
+
+ /* in parent - wait for the child to die */
+ mov %rax, %rdi
+ mov $0, %rsi
+ mov $0, %rdx
+ call _sys_wait2
+
+ pop %rdi
+ movdqu %xmm1, (%rdi)
+ ret
+
+child:
+ pxor %xmm1, %xmm1
+ mov $0, %rdi
+ call _sys_exit