From addb491e301f271dada92cb45c41f2ae26542b4b Mon Sep 17 00:00:00 2001 From: Guokai Chen Date: Sun, 28 May 2023 19:57:40 +0800 Subject: [PATCH] tests: add oraclebp mmio test (#31) --- tests/oracletest/Makefile | 4 ++ tests/oracletest/README.md | 9 +++++ tests/oracletest/include/test.h | 8 ++++ tests/oracletest/src/main.c | 71 +++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 tests/oracletest/Makefile create mode 100644 tests/oracletest/README.md create mode 100644 tests/oracletest/include/test.h create mode 100644 tests/oracletest/src/main.c diff --git a/tests/oracletest/Makefile b/tests/oracletest/Makefile new file mode 100644 index 00000000..c5e93a2c --- /dev/null +++ b/tests/oracletest/Makefile @@ -0,0 +1,4 @@ +NAME := oracletest +SRCS := $(shell find -L ./src/ -name "*.[cS]") + +include $(AM_HOME)/Makefile.app diff --git a/tests/oracletest/README.md b/tests/oracletest/README.md new file mode 100644 index 00000000..e4d39825 --- /dev/null +++ b/tests/oracletest/README.md @@ -0,0 +1,9 @@ +# OracleBP Test + +## Purpose + +A fully functional OracleBP should predict well even after some unpredictable events like interrupt and MMIO accessing happen. This test wants to verify if the oracle predictor still works after a MMIO access that affects the control flow. + +## Verification + +Change final loop iteration count to see if there are too many mispredictions. \ No newline at end of file diff --git a/tests/oracletest/include/test.h b/tests/oracletest/include/test.h new file mode 100644 index 00000000..efdde715 --- /dev/null +++ b/tests/oracletest/include/test.h @@ -0,0 +1,8 @@ +#ifndef __AMUNIT_H__ +#define __AMUNIT_H__ + +#include +#include +#include + +#endif diff --git a/tests/oracletest/src/main.c b/tests/oracletest/src/main.c new file mode 100644 index 00000000..b7b3fcb3 --- /dev/null +++ b/tests/oracletest/src/main.c @@ -0,0 +1,71 @@ +#include + +#if defined(__ARCH_RISCV64_NOOP) || defined(__ARCH_RISCV32_NOOP) || defined(__ARCH_RISCV64_XS) +# define RTC_ADDR 0x3800bff8 +#endif + +#define TESTDUP 100 +#define FINALITERATION 8000 + +volatile int counter; + +void loop(int n) { + for (volatile int i = 0; i < n; i++) { + counter += 1; + } +} + +uint64_t get_time() { + return *(uint64_t *)(RTC_ADDR); +} + +int main() { + printf("Oracle BP test shall always pass\n"); + printf("Check perf counter for OracleBP correctness\n"); + + for (int i = 0; i < TESTDUP; i++) { + int a = get_time() % 10; + switch (a) + { + case 0: + loop(5); + break; + case 1: + loop(10); + break; + case 2: + loop(15); + break; + case 3: + loop(20); + break; + case 4: + loop(25); + break; + case 5: + loop(30); + break; + case 6: + loop(35); + break; + case 7: + loop(40); + break; + case 8: + loop(45); + break; + case 9: + loop(50); + break; + default: + printf("Should not reach here! Check your test environment\n"); + break; + } + } + + for (volatile int i = 0; i < FINALITERATION; i++) { + counter += i; + } + + return 0; +} -- GitLab