Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx> writes: > Implements two basic tests of RSEQ functionality, and one more > exhaustive parameterizable test. > > The first, "basic_test" only asserts that RSEQ works moderately > correctly. > E.g. that: > - The CPUID pointer works > - Code infinitely looping within a critical section will eventually be > interrupted. > - Critical sections are interrupted by signals. > > "basic_percpu_ops_test" is a slightly more "realistic" variant, > implementing a few simple per-cpu operations and testing their > correctness. > > "param_test" is a parametrizable restartable sequences test. See > the "--help" output for usage. > > As part of those tests, a helper library "rseq" implements a user-space > API around restartable sequences. It uses the cpu_opv system call as > fallback when single-stepped by a debugger. It exposes the instruction > pointer addresses where the rseq assembly blocks begin and end, as well > as the associated abort instruction pointer, in the __rseq_table > section. This section allows debuggers may know where to place > breakpoints when single-stepping through assembly blocks which may be > aborted at any point by the kernel. > > The following rseq APIs are implemented in this helper library: > - rseq_register_current_thread()/rseq_unregister_current_thread(): > register/unregister current thread's use of rseq, > - rseq_current_cpu_raw(): > current CPU number, > - rseq_start(): > beginning of a restartable sequence, > - rseq_cpu_at_start(): > CPU number at start of restartable sequence, > - rseq_finish(): > End of restartable sequence made of zero or more loads, completed by > a word-sized store, > - rseq_finish2(): > End of restartable sequence made of zero or more loads, one > speculative word-sized store, completed by a word-sized store, > - rseq_finish2_release(): > End of restartable sequence made of zero or more loads, one > speculative word-sized store, completed by a word-sized store with > release semantic, > - rseq_finish_memcpy(): > End of restartable sequence made of zero or more loads, a > speculative copy of a variable length memory region, completed by a > word-sized store. > - rseq_finish_memcpy_release(): > End of restartable sequence made of zero or more loads, a > speculative copy of a variable length memory region, completed by a > word-sized store with release semantic. > > PowerPC tests have been implemented by Boqun Feng. Hi Boqun, I'm having trouble testing these, I get: ~/linus/tools/testing/selftests/cpu-opv$ ./basic_cpu_opv_test Testing test_compare_eq same Testing test_compare_eq different Testing test_compare_ne same Testing test_compare_ne different Testing test_2compare_eq index Testing test_2compare_ne index Testing test_memcpy Testing test_memcpy_u32 Testing test_add Testing test_two_add Testing test_or Testing test_and Testing test_xor Testing test_lshift Testing test_rshift Testing test_cmpxchg success Testing test_cmpxchg fail ~/linus/tools/testing/selftests/rseq$ ./basic_test testing current cpu testing critical section testing critical section is interrupted by signal ~/linus/tools/testing/selftests/rseq$ ./basic_percpu_ops_test ./basic_percpu_ops_test: error while loading shared libraries: R_PPC64_ADDR16_HI re10d8f10a0 for symbol `' out of range ~/linus/tools/testing/selftests/rseq$ ./param_test ./param_test: error while loading shared libraries: R_PPC64_ADDR16_HI re136251b48 for symbol `' out of range Any idea what's going on with the last two? I assume you don't see that in your test setup :) cheers -- To unsubscribe from this list: send the line "unsubscribe linux-api" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html