selftests/powerpc: Move set_dscr() into rfi_flush.c
This version of set_dscr() was added for the RFI flush test, and is fairly specific to it. It also clashes with the version of set_dscr() in dscr/dscr.h. So move it into the RFI flush test where it's used. Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20200819015727.1977134-3-mpe@ellerman.id.au
This commit is contained in:
parent
17c98a541d
commit
d89002397c
@ -35,7 +35,6 @@ int pick_online_cpu(void);
|
||||
int read_debugfs_file(char *debugfs_file, int *result);
|
||||
int write_debugfs_file(char *debugfs_file, int result);
|
||||
int read_sysfs_file(char *debugfs_file, char *result, size_t result_size);
|
||||
void set_dscr(unsigned long val);
|
||||
int perf_event_open_counter(unsigned int type,
|
||||
unsigned long config, int group_fd);
|
||||
int perf_event_enable(int fd);
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <stdint.h>
|
||||
#include <malloc.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
@ -41,6 +42,40 @@ static void syscall_loop(char *p, unsigned long iterations,
|
||||
}
|
||||
}
|
||||
|
||||
static void sigill_handler(int signr, siginfo_t *info, void *unused)
|
||||
{
|
||||
static int warned = 0;
|
||||
ucontext_t *ctx = (ucontext_t *)unused;
|
||||
unsigned long *pc = &UCONTEXT_NIA(ctx);
|
||||
|
||||
/* mtspr 3,RS to check for move to DSCR below */
|
||||
if ((*((unsigned int *)*pc) & 0xfc1fffff) == 0x7c0303a6) {
|
||||
if (!warned++)
|
||||
printf("WARNING: Skipping over dscr setup. Consider running 'ppc64_cpu --dscr=1' manually.\n");
|
||||
*pc += 4;
|
||||
} else {
|
||||
printf("SIGILL at %p\n", pc);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
static void set_dscr(unsigned long val)
|
||||
{
|
||||
static int init = 0;
|
||||
struct sigaction sa;
|
||||
|
||||
if (!init) {
|
||||
memset(&sa, 0, sizeof(sa));
|
||||
sa.sa_sigaction = sigill_handler;
|
||||
sa.sa_flags = SA_SIGINFO;
|
||||
if (sigaction(SIGILL, &sa, NULL))
|
||||
perror("sigill_handler");
|
||||
init = 1;
|
||||
}
|
||||
|
||||
asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR));
|
||||
}
|
||||
|
||||
int rfi_flush_test(void)
|
||||
{
|
||||
char *p;
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include <fcntl.h>
|
||||
#include <link.h>
|
||||
#include <sched.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -273,40 +272,6 @@ int perf_event_reset(int fd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sigill_handler(int signr, siginfo_t *info, void *unused)
|
||||
{
|
||||
static int warned = 0;
|
||||
ucontext_t *ctx = (ucontext_t *)unused;
|
||||
unsigned long *pc = &UCONTEXT_NIA(ctx);
|
||||
|
||||
/* mtspr 3,RS to check for move to DSCR below */
|
||||
if ((*((unsigned int *)*pc) & 0xfc1fffff) == 0x7c0303a6) {
|
||||
if (!warned++)
|
||||
printf("WARNING: Skipping over dscr setup. Consider running 'ppc64_cpu --dscr=1' manually.\n");
|
||||
*pc += 4;
|
||||
} else {
|
||||
printf("SIGILL at %p\n", pc);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
void set_dscr(unsigned long val)
|
||||
{
|
||||
static int init = 0;
|
||||
struct sigaction sa;
|
||||
|
||||
if (!init) {
|
||||
memset(&sa, 0, sizeof(sa));
|
||||
sa.sa_sigaction = sigill_handler;
|
||||
sa.sa_flags = SA_SIGINFO;
|
||||
if (sigaction(SIGILL, &sa, NULL))
|
||||
perror("sigill_handler");
|
||||
init = 1;
|
||||
}
|
||||
|
||||
asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR));
|
||||
}
|
||||
|
||||
int using_hash_mmu(bool *using_hash)
|
||||
{
|
||||
char line[128];
|
||||
|
Loading…
Reference in New Issue
Block a user