1// SPDX-License-Identifier: GPL-2.0+ 2 3/* 4 * Copyright 2018 IBM Corporation. 5 */ 6 7#define __SANE_USERSPACE_TYPES__ 8 9#include <sys/types.h> 10#include <stdint.h> 11#include <unistd.h> 12#include <signal.h> 13#include <stdlib.h> 14#include <string.h> 15#include <stdio.h> 16#include <sys/utsname.h> 17#include "reg.h" 18#include "utils.h" 19#include "flush_utils.h" 20 21static inline __u64 load(void *addr) 22{ 23 __u64 tmp; 24 25 asm volatile("ld %0,0(%1)" : "=r"(tmp) : "b"(addr)); 26 27 return tmp; 28} 29 30void syscall_loop(char *p, unsigned long iterations, 31 unsigned long zero_size) 32{ 33 for (unsigned long i = 0; i < iterations; i++) { 34 for (unsigned long j = 0; j < zero_size; j += CACHELINE_SIZE) 35 load(p + j); 36 getppid(); 37 } 38} 39 40void syscall_loop_uaccess(char *p, unsigned long iterations, 41 unsigned long zero_size) 42{ 43 struct utsname utsname; 44 45 for (unsigned long i = 0; i < iterations; i++) { 46 for (unsigned long j = 0; j < zero_size; j += CACHELINE_SIZE) 47 load(p + j); 48 uname(&utsname); 49 } 50} 51 52static void sigill_handler(int signr, siginfo_t *info, void *unused) 53{ 54 static int warned; 55 ucontext_t *ctx = (ucontext_t *)unused; 56 unsigned long *pc = &UCONTEXT_NIA(ctx); 57 58 /* mtspr 3,RS to check for move to DSCR below */ 59 if ((*((unsigned int *)*pc) & 0xfc1fffff) == 0x7c0303a6) { 60 if (!warned++) 61 printf("WARNING: Skipping over dscr setup. Consider running 'ppc64_cpu --dscr=1' manually.\n"); 62 *pc += 4; 63 } else { 64 printf("SIGILL at %p\n", pc); 65 abort(); 66 } 67} 68 69void set_dscr(unsigned long val) 70{ 71 static int init; 72 struct sigaction sa; 73 74 if (!init) { 75 memset(&sa, 0, sizeof(sa)); 76 sa.sa_sigaction = sigill_handler; 77 sa.sa_flags = SA_SIGINFO; 78 if (sigaction(SIGILL, &sa, NULL)) 79 perror("sigill_handler"); 80 init = 1; 81 } 82 83 mtspr(SPRN_DSCR, val); 84} 85