cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

fpu_syscall.c (1538B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Copyright 2015, Cyril Bur, IBM Corp.
      4 *
      5 * This test attempts to see if the FPU registers change across a syscall (fork).
      6 */
      7
      8#include <stdio.h>
      9#include <unistd.h>
     10#include <sys/syscall.h>
     11#include <sys/time.h>
     12#include <sys/types.h>
     13#include <sys/wait.h>
     14#include <stdlib.h>
     15
     16#include "utils.h"
     17
     18extern int test_fpu(double *darray, pid_t *pid);
     19
     20double darray[] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,
     21		     1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0,
     22		     2.1};
     23
     24int syscall_fpu(void)
     25{
     26	pid_t fork_pid;
     27	int i;
     28	int ret;
     29	int child_ret;
     30	for (i = 0; i < 1000; i++) {
     31		/* test_fpu will fork() */
     32		ret = test_fpu(darray, &fork_pid);
     33		if (fork_pid == -1)
     34			return -1;
     35		if (fork_pid == 0)
     36			exit(ret);
     37		waitpid(fork_pid, &child_ret, 0);
     38		if (ret || child_ret)
     39			return 1;
     40	}
     41
     42	return 0;
     43}
     44
     45int test_syscall_fpu(void)
     46{
     47	/*
     48	 * Setup an environment with much context switching
     49	 */
     50	pid_t pid2;
     51	pid_t pid = fork();
     52	int ret;
     53	int child_ret;
     54	FAIL_IF(pid == -1);
     55
     56	pid2 = fork();
     57	/* Can't FAIL_IF(pid2 == -1); because already forked once */
     58	if (pid2 == -1) {
     59		/*
     60		 * Couldn't fork, ensure test is a fail
     61		 */
     62		child_ret = ret = 1;
     63	} else {
     64		ret = syscall_fpu();
     65		if (pid2)
     66			waitpid(pid2, &child_ret, 0);
     67		else
     68			exit(ret);
     69	}
     70
     71	ret |= child_ret;
     72
     73	if (pid)
     74		waitpid(pid, &child_ret, 0);
     75	else
     76		exit(ret);
     77
     78	FAIL_IF(ret || child_ret);
     79	return 0;
     80}
     81
     82int main(int argc, char *argv[])
     83{
     84	return test_harness(test_syscall_fpu, "syscall_fpu");
     85
     86}