Loading tools/testing/selftests/powerpc/alignment/.gitignore +0 −1 Original line number Original line Diff line number Diff line copy_first_unaligned copy_first_unaligned copy_paste_unaligned_common alignment_handler alignment_handler tools/testing/selftests/powerpc/alignment/Makefile +1 −1 Original line number Original line Diff line number Diff line Loading @@ -2,4 +2,4 @@ TEST_GEN_PROGS := copy_first_unaligned alignment_handler include ../../lib.mk include ../../lib.mk $(TEST_GEN_PROGS): ../harness.c ../utils.c copy_paste_unaligned_common.c $(TEST_GEN_PROGS): ../harness.c ../utils.c tools/testing/selftests/powerpc/alignment/copy_first_unaligned.c +32 −1 Original line number Original line Diff line number Diff line Loading @@ -11,15 +11,46 @@ * * */ */ #include <signal.h> #include <string.h> #include <string.h> #include <unistd.h> #include <unistd.h> #include "utils.h" #include "utils.h" #include "instructions.h" #include "instructions.h" #include "copy_paste_unaligned_common.h" unsigned int expected_instruction = PPC_INST_COPY_FIRST; unsigned int expected_instruction = PPC_INST_COPY_FIRST; unsigned int instruction_mask = 0xfc2007fe; unsigned int instruction_mask = 0xfc2007fe; void signal_action_handler(int signal_num, siginfo_t *info, void *ptr) { ucontext_t *ctx = ptr; #ifdef __powerpc64__ unsigned int *pc = (unsigned int *)ctx->uc_mcontext.gp_regs[PT_NIP]; #else unsigned int *pc = (unsigned int *)ctx->uc_mcontext.uc_regs->gregs[PT_NIP]; #endif /* * Check that the signal was on the correct instruction, using a * mask because the compiler assigns the register at RB. */ if ((*pc & instruction_mask) == expected_instruction) _exit(0); /* We hit the right instruction */ _exit(1); } void setup_signal_handler(void) { struct sigaction signal_action; memset(&signal_action, 0, sizeof(signal_action)); signal_action.sa_sigaction = signal_action_handler; signal_action.sa_flags = SA_SIGINFO; sigaction(SIGBUS, &signal_action, NULL); } char cacheline_buf[128] __cacheline_aligned; int test_copy_first_unaligned(void) int test_copy_first_unaligned(void) { { /* Only run this test on a P9 or later */ /* Only run this test on a P9 or later */ Loading tools/testing/selftests/powerpc/alignment/copy_paste_unaligned_common.cdeleted 100644 → 0 +0 −53 Original line number Original line Diff line number Diff line /* * Copyright 2016, Chris Smart, IBM Corporation. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * * Common code for copy, copy_first, paste and paste_last unaligned * tests. * */ #include <signal.h> #include <string.h> #include <unistd.h> #include "utils.h" #include "instructions.h" #include "copy_paste_unaligned_common.h" unsigned int expected_instruction; unsigned int instruction_mask; char cacheline_buf[128] __cacheline_aligned; void signal_action_handler(int signal_num, siginfo_t *info, void *ptr) { ucontext_t *ctx = ptr; #if defined(__powerpc64__) unsigned int *pc = (unsigned int *)ctx->uc_mcontext.gp_regs[PT_NIP]; #else unsigned int *pc = (unsigned int *)ctx->uc_mcontext.uc_regs->gregs[PT_NIP]; #endif /* * Check that the signal was on the correct instruction, using a * mask because the compiler assigns the register at RB. */ if ((*pc & instruction_mask) == expected_instruction) _exit(0); /* We hit the right instruction */ _exit(1); } void setup_signal_handler(void) { struct sigaction signal_action; memset(&signal_action, 0, sizeof(signal_action)); signal_action.sa_sigaction = signal_action_handler; signal_action.sa_flags = SA_SIGINFO; sigaction(SIGBUS, &signal_action, NULL); } tools/testing/selftests/powerpc/alignment/copy_paste_unaligned_common.hdeleted 100644 → 0 +0 −26 Original line number Original line Diff line number Diff line /* * Copyright 2016, Chris Smart, IBM Corporation. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * * Declarations for common code for copy, copy_first, paste and * paste_last unaligned tests. * */ #ifndef _SELFTESTS_POWERPC_COPY_PASTE_H #define _SELFTESTS_POWERPC_COPY_PASTE_H #include <signal.h> int main(int argc, char *argv[]); void signal_action_handler(int signal_num, siginfo_t *info, void *ptr); void setup_signal_handler(void); extern char cacheline_buf[128] __cacheline_aligned; extern unsigned int expected_instruction; extern unsigned int instruction_mask; #endif /* _SELFTESTS_POWERPC_COPY_PASTE_H */ Loading
tools/testing/selftests/powerpc/alignment/.gitignore +0 −1 Original line number Original line Diff line number Diff line copy_first_unaligned copy_first_unaligned copy_paste_unaligned_common alignment_handler alignment_handler
tools/testing/selftests/powerpc/alignment/Makefile +1 −1 Original line number Original line Diff line number Diff line Loading @@ -2,4 +2,4 @@ TEST_GEN_PROGS := copy_first_unaligned alignment_handler include ../../lib.mk include ../../lib.mk $(TEST_GEN_PROGS): ../harness.c ../utils.c copy_paste_unaligned_common.c $(TEST_GEN_PROGS): ../harness.c ../utils.c
tools/testing/selftests/powerpc/alignment/copy_first_unaligned.c +32 −1 Original line number Original line Diff line number Diff line Loading @@ -11,15 +11,46 @@ * * */ */ #include <signal.h> #include <string.h> #include <string.h> #include <unistd.h> #include <unistd.h> #include "utils.h" #include "utils.h" #include "instructions.h" #include "instructions.h" #include "copy_paste_unaligned_common.h" unsigned int expected_instruction = PPC_INST_COPY_FIRST; unsigned int expected_instruction = PPC_INST_COPY_FIRST; unsigned int instruction_mask = 0xfc2007fe; unsigned int instruction_mask = 0xfc2007fe; void signal_action_handler(int signal_num, siginfo_t *info, void *ptr) { ucontext_t *ctx = ptr; #ifdef __powerpc64__ unsigned int *pc = (unsigned int *)ctx->uc_mcontext.gp_regs[PT_NIP]; #else unsigned int *pc = (unsigned int *)ctx->uc_mcontext.uc_regs->gregs[PT_NIP]; #endif /* * Check that the signal was on the correct instruction, using a * mask because the compiler assigns the register at RB. */ if ((*pc & instruction_mask) == expected_instruction) _exit(0); /* We hit the right instruction */ _exit(1); } void setup_signal_handler(void) { struct sigaction signal_action; memset(&signal_action, 0, sizeof(signal_action)); signal_action.sa_sigaction = signal_action_handler; signal_action.sa_flags = SA_SIGINFO; sigaction(SIGBUS, &signal_action, NULL); } char cacheline_buf[128] __cacheline_aligned; int test_copy_first_unaligned(void) int test_copy_first_unaligned(void) { { /* Only run this test on a P9 or later */ /* Only run this test on a P9 or later */ Loading
tools/testing/selftests/powerpc/alignment/copy_paste_unaligned_common.cdeleted 100644 → 0 +0 −53 Original line number Original line Diff line number Diff line /* * Copyright 2016, Chris Smart, IBM Corporation. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * * Common code for copy, copy_first, paste and paste_last unaligned * tests. * */ #include <signal.h> #include <string.h> #include <unistd.h> #include "utils.h" #include "instructions.h" #include "copy_paste_unaligned_common.h" unsigned int expected_instruction; unsigned int instruction_mask; char cacheline_buf[128] __cacheline_aligned; void signal_action_handler(int signal_num, siginfo_t *info, void *ptr) { ucontext_t *ctx = ptr; #if defined(__powerpc64__) unsigned int *pc = (unsigned int *)ctx->uc_mcontext.gp_regs[PT_NIP]; #else unsigned int *pc = (unsigned int *)ctx->uc_mcontext.uc_regs->gregs[PT_NIP]; #endif /* * Check that the signal was on the correct instruction, using a * mask because the compiler assigns the register at RB. */ if ((*pc & instruction_mask) == expected_instruction) _exit(0); /* We hit the right instruction */ _exit(1); } void setup_signal_handler(void) { struct sigaction signal_action; memset(&signal_action, 0, sizeof(signal_action)); signal_action.sa_sigaction = signal_action_handler; signal_action.sa_flags = SA_SIGINFO; sigaction(SIGBUS, &signal_action, NULL); }
tools/testing/selftests/powerpc/alignment/copy_paste_unaligned_common.hdeleted 100644 → 0 +0 −26 Original line number Original line Diff line number Diff line /* * Copyright 2016, Chris Smart, IBM Corporation. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * * Declarations for common code for copy, copy_first, paste and * paste_last unaligned tests. * */ #ifndef _SELFTESTS_POWERPC_COPY_PASTE_H #define _SELFTESTS_POWERPC_COPY_PASTE_H #include <signal.h> int main(int argc, char *argv[]); void signal_action_handler(int signal_num, siginfo_t *info, void *ptr); void setup_signal_handler(void); extern char cacheline_buf[128] __cacheline_aligned; extern unsigned int expected_instruction; extern unsigned int instruction_mask; #endif /* _SELFTESTS_POWERPC_COPY_PASTE_H */