countertest: support counter-write test
This commit is contained in:
parent
8440fe6a15
commit
f90c6fdcfb
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef __WRITE_H__
|
||||||
|
#define __WRITE_H__
|
||||||
|
|
||||||
|
void test_minstret();
|
||||||
|
void test_counter_write();
|
||||||
|
|
||||||
|
#endif // __WRITE_H__
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue