diff options
Diffstat (limited to 'src/cmd/tests/kernel')
-rw-r--r-- | src/cmd/tests/kernel/misc.c | 10 | ||||
-rw-r--r-- | src/cmd/tests/kernel/misc.s | 27 |
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 |