On Mon, Dec 18, 2017 at 08:31:21PM +0300, Yury Norov wrote: > On Fri, Dec 15, 2017 at 04:15:39PM -0500, Shih-Wei Li wrote: > > Here we provide the support for measuring various micro level > > operations on arm64. We iterate each of the tests for millions of > > times and output their average, minimum and maximum cost in timer > > counts. Instruction barriers are used before and after taking > > timestamps to avoid out-of-order execution or pipelining from > > skewing our measurements. > > > > The tests we currently support and measure are mostly > > straightforward by the function names and the respective comments. > > For IPI test, we measure the cost of sending IPI from a source > > VCPU to a target VCPU, until the target VCPU receives the IPI. > > > > Signed-off-by: Shih-Wei Li <shihwei@xxxxxxxxxxxxxxx> > > --- > > arm/Makefile.common | 1 + > > arm/micro-test.c | 289 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > > arm/unittests.cfg | 6 ++ > > 3 files changed, 296 insertions(+) > > create mode 100644 arm/micro-test.c > > > > diff --git a/arm/Makefile.common b/arm/Makefile.common > > index 0a039cf..c7d5c27 100644 > > --- a/arm/Makefile.common > > +++ b/arm/Makefile.common > > @@ -16,6 +16,7 @@ tests-common += $(TEST_DIR)/pmu.flat > > tests-common += $(TEST_DIR)/gic.flat > > tests-common += $(TEST_DIR)/psci.flat > > tests-common += $(TEST_DIR)/sieve.flat > > +tests-common += $(TEST_DIR)/micro-test.flat > > > > tests-all = $(tests-common) $(tests) > > all: directories $(tests-all) > > diff --git a/arm/micro-test.c b/arm/micro-test.c > > new file mode 100644 > > index 0000000..7df2272 > > --- /dev/null > > +++ b/arm/micro-test.c > > @@ -0,0 +1,289 @@ > > +#include <util.h> > > +#include <asm/gic.h> > > + > > +static volatile bool second_cpu_up; > > +static volatile bool first_cpu_ack; > > +static volatile bool ipi_acked; > > +static volatile bool ipi_received; > > +static volatile bool ipi_ready; > > +#define IPI_IRQ 1 > > + > > +#define TIMEOUT (1U << 28) > > + > > +#define ARR_SIZE(_x) ((int)(sizeof(_x) / sizeof(_x[0]))) > > +#define for_each_test(_iter, _tests, _tmp) \ > > + for (_tmp = 0, _iter = _tests; \ > > + _tmp < ARR_SIZE(_tests); \ > > + _tmp++, _iter++) > > + > > +#define CYCLE_COUNT(c1, c2) \ > > + (((c1) > (c2) || ((c1) == (c2))) ? 0 : (c2) - (c1)) > > Is my understanding correct that this is overflow protection? > c1 and c2 are 64-bit values. To overflow them you need 58 years > at 1G CPU freq. > That's assuming your cycle counter starts at 0, and that nobody programmed it near the overflow value to get an overflow interrupt. So if you get rid of this, you have to make sure the host never plays with the cycle counter behind your back, and that you've initialized it to zero. FWIW, when we first wrote some version of this code 5+ years ago in a different world, we actually saw overflow as a result of the way we ran this code. That may have changed, but it's not as clear cut. Thanks, -Christoffer