diff --git a/tests/oracletest/Makefile b/tests/oracletest/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..c5e93a2c17922314fb7c027e750e145d851bdcd7 --- /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 0000000000000000000000000000000000000000..e4d39825f5542fa64fe897312e3a0475eb40492b --- /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 0000000000000000000000000000000000000000..efdde715a1a111d30c519c8966e706e8d0491a88 --- /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 0000000000000000000000000000000000000000..b7b3fcb3bdbef5ea1d9ef3da3897491ddf459d41 --- /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; +}