countertest: support counter-write test

This commit is contained in:
Xu, Zefan 2024-05-30 12:30:49 +08:00
parent 8440fe6a15
commit f90c6fdcfb
3 changed files with 106 additions and 0 deletions

View File

@ -0,0 +1,7 @@
#ifndef __WRITE_H__
#define __WRITE_H__
void test_minstret();
void test_counter_write();
#endif // __WRITE_H__

View File

@ -11,6 +11,7 @@
#include "enable.h" #include "enable.h"
#include "probe.h" #include "probe.h"
#include "inhibit.h" #include "inhibit.h"
#include "write.h"
extern void m_trap_entry(); extern void m_trap_entry();
int error = 0; int error = 0;
@ -20,6 +21,7 @@ int main() {
csr_write(mtvec, m_trap_entry); csr_write(mtvec, m_trap_entry);
// probe machine counter // probe machine counter
printf("Probing machine counter...\n");
for (int i = 0; i < COUNTER_NUM; i++) { for (int i = 0; i < COUNTER_NUM; i++) {
if (arr_func_probe_machine_cntr[i]) { if (arr_func_probe_machine_cntr[i]) {
int res = arr_func_probe_machine_cntr[i](); int res = arr_func_probe_machine_cntr[i]();
@ -34,6 +36,7 @@ int main() {
} }
// probe unprivileged counter // probe unprivileged counter
printf("Probing unprivileged counter...\n");
for (int i = 0; i < COUNTER_NUM; i++) { for (int i = 0; i < COUNTER_NUM; i++) {
if (arr_func_probe_unpriv_cntr[i]) { if (arr_func_probe_unpriv_cntr[i]) {
int res = arr_func_probe_unpriv_cntr[i](); int res = arr_func_probe_unpriv_cntr[i]();
@ -45,10 +48,22 @@ int main() {
} }
// test counter-enable // test counter-enable
printf("Testing counter-enable...\n");
test_counter_enable(); test_counter_enable();
// test counter-inhibit // test counter-inhibit
printf("Testing counter-inhibit...\n");
test_counter_inhibit(); test_counter_inhibit();
// test writing to counter
printf("Testing writing to counter...\n");
test_counter_write();
// test minstret
printf("Testing minstret...\n");
test_minstret();
printf("Finished!\n");
return error; return error;
} }

View File

@ -0,0 +1,84 @@
#include <am.h>
#include <csr.h>
#include <xsextra.h>
#include <klib.h>
#include <klib-macros.h>
#include "priv.h"
#include "countertest.h"
#include "counter.h"
#include "write.h"
#define check_minstret_diff(diff) \
do { \
asm volatile ( \
"csrr %0, minstret \n" \
"j " #diff "f \n" \
"9: nop \n" \
"8: nop \n" \
"7: nop \n" \
"6: nop \n" \
"5: nop \n" \
"4: nop \n" \
"3: nop \n" \
"csrr %1, minstret \n" \
: "=r" (minstret_start), "=r" (minstret_end) \
); \
if (minstret_end - minstret_start != diff) { \
printf(MSG_WARNING "minstret is not accurate.\n"); \
printf("minstret_end - minstret_start should be %d, ", diff); \
printf("but it is %d - %d = %d.\n", minstret_end, minstret_start, minstret_end - minstret_start); \
/* error += 1; */ \
} \
} while (0)
void test_minstret() {
// test minstret
uint64_t minstret_start, minstret_end;
check_minstret_diff(3);
check_minstret_diff(4);
check_minstret_diff(5);
check_minstret_diff(6);
check_minstret_diff(7);
check_minstret_diff(8);
check_minstret_diff(9);
}
void test_counter_write() {
goto_priv_mode(MODE_M);
for (int i = 0; i < COUNTER_NUM; i++) {
if (arr_func_write_machine_counter[i]) {
arr_func_write_machine_counter[i](0xFFFFFFFF);
}
}
for (int i = 0; i < COUNTER_NUM; i++) {
if (arr_func_read_machine_counter[i]) {
uint64_t cur = arr_func_read_machine_counter[i]();
if (cur < 0xFFFFFFFF) {
printf(MSG_WARNING "worte 0xFFFFFFFF to counter %d, ", i);
printf("but read 0x%X.\n", cur);
}
}
}
for (int i = 0; i < COUNTER_NUM; i++) {
if (arr_func_write_machine_counter[i]) {
arr_func_write_machine_counter[i](0);
}
}
for (int i = 0; i < COUNTER_NUM; i++) {
if (arr_func_read_machine_counter[i]) {
uint64_t cur = arr_func_read_machine_counter[i]();
if (cur >= 0xFFFFFFFF) {
printf(MSG_WARNING "worte 0x0 to counter %d, ", i);
printf("but read 0x%X.\n", cur);
}
}
}
}