feat: difftest framework
This commit is contained in:
parent
97cf418c86
commit
849f2bb5f3
15 changed files with 318 additions and 84 deletions
|
@ -1,3 +0,0 @@
|
|||
---
|
||||
Language: Cpp
|
||||
BasedOnStyle: LLVM
|
20
nemu/Kconfig
20
nemu/Kconfig
|
@ -126,6 +126,26 @@ endmenu
|
|||
|
||||
menu "Testing and Debugging"
|
||||
|
||||
choice
|
||||
prompt "Choose log level"
|
||||
default LOG_TRACE
|
||||
config LOG_TRACE
|
||||
bool "trace"
|
||||
config LOG_INFO
|
||||
bool "info"
|
||||
config LOG_WARNING
|
||||
bool "warning"
|
||||
config LOG_ERROR
|
||||
bool "error"
|
||||
endchoice
|
||||
|
||||
config LOG_LEVEL
|
||||
int
|
||||
default 1 if LOG_ERROR
|
||||
default 2 if LOG_WARNING
|
||||
default 3 if LOG_INFO
|
||||
default 4 if LOG_TRACE
|
||||
default 0
|
||||
|
||||
config TRACE
|
||||
bool "Enable tracer"
|
||||
|
|
|
@ -16,41 +16,59 @@
|
|||
#ifndef __DEBUG_H__
|
||||
#define __DEBUG_H__
|
||||
|
||||
#include <macro.h>
|
||||
#include <stdio.h>
|
||||
#include <utils.h>
|
||||
#include <macro.h>
|
||||
|
||||
IFDEF(CONFIG_ITRACE, void log_itrace_print());
|
||||
|
||||
#define Trace(format, ...) \
|
||||
_Log("[TRACE] " format "\n", ## __VA_ARGS__)
|
||||
#if (CONFIG_LOG_LEVEL >= 4)
|
||||
#define Trace(format, ...) _Log("[TRACE] " format "\n", ##__VA_ARGS__)
|
||||
#else
|
||||
#define Trace(format, ...)
|
||||
#endif
|
||||
|
||||
#define Log(format, ...) \
|
||||
_Log(ANSI_FMT("[INFO] %s:%d %s() ", ANSI_FG_BLUE) format "\n", \
|
||||
__FILE__, __LINE__, __func__, ## __VA_ARGS__)
|
||||
#if (CONFIG_LOG_LEVEL >= 3)
|
||||
#define Log(format, ...) \
|
||||
_Log(ANSI_FMT("[INFO] %s:%d %s() ", ANSI_FG_BLUE) format "\n", __FILE__, \
|
||||
__LINE__, __func__, ##__VA_ARGS__)
|
||||
#else
|
||||
#define Log(format, ...)
|
||||
#endif
|
||||
|
||||
#define Warning(format, ...) \
|
||||
_Log(ANSI_FMT("[WARNING] %s:%d %s() ", ANSI_FG_YELLOW) format "\n", \
|
||||
__FILE__, __LINE__, __func__, ## __VA_ARGS__)
|
||||
#if (CONFIG_LOG_LEVEL >= 2)
|
||||
#define Warning(format, ...) \
|
||||
_Log(ANSI_FMT("[WARNING] %s:%d %s() ", ANSI_FG_YELLOW) format "\n", \
|
||||
__FILE__, __LINE__, __func__, ##__VA_ARGS__)
|
||||
#else
|
||||
#define Warning(format, ...)
|
||||
#endif
|
||||
|
||||
#define Error(format, ...) \
|
||||
_Log(ANSI_FMT("[ERROR] %s:%d %s() ", ANSI_FG_RED) format "\n", \
|
||||
__FILE__, __LINE__, __func__, ## __VA_ARGS__)
|
||||
#if (CONFIG_LOG_LEVEL >= 1)
|
||||
#define Error(format, ...) \
|
||||
_Log(ANSI_FMT("[ERROR] %s:%d %s() ", ANSI_FG_RED) format "\n", __FILE__, \
|
||||
__LINE__, __func__, ##__VA_ARGS__)
|
||||
#else
|
||||
#define Error(format, ...)
|
||||
#endif
|
||||
|
||||
#define Assert(cond, format, ...) \
|
||||
do { \
|
||||
if (!(cond)) { \
|
||||
MUXDEF(CONFIG_TARGET_AM, printf(ANSI_FMT(format, ANSI_FG_RED) "\n", ## __VA_ARGS__), \
|
||||
(fflush(stdout), fprintf(stderr, ANSI_FMT(format, ANSI_FG_RED) "\n", ## __VA_ARGS__))); \
|
||||
IFNDEF(CONFIG_TARGET_AM, extern FILE* log_fp; fflush(log_fp)); \
|
||||
IFDEF(CONFIG_ITRACE, log_itrace_print()); \
|
||||
extern void assert_fail_msg(); \
|
||||
assert_fail_msg(); \
|
||||
assert(cond); \
|
||||
} \
|
||||
#define Assert(cond, format, ...) \
|
||||
do { \
|
||||
if (!(cond)) { \
|
||||
MUXDEF( \
|
||||
CONFIG_TARGET_AM, \
|
||||
printf(ANSI_FMT(format, ANSI_FG_RED) "\n", ##__VA_ARGS__), \
|
||||
(fflush(stdout), fprintf(stderr, ANSI_FMT(format, ANSI_FG_RED) "\n", \
|
||||
##__VA_ARGS__))); \
|
||||
IFNDEF(CONFIG_TARGET_AM, extern FILE *log_fp; fflush(log_fp)); \
|
||||
IFDEF(CONFIG_ITRACE, log_itrace_print()); \
|
||||
extern void assert_fail_msg(); \
|
||||
assert_fail_msg(); \
|
||||
assert(cond); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define panic(format, ...) Assert(0, format, ## __VA_ARGS__)
|
||||
#define panic(format, ...) Assert(0, format, ##__VA_ARGS__)
|
||||
|
||||
#define TODO() panic("please implement me")
|
||||
|
||||
|
|
|
@ -13,25 +13,34 @@
|
|||
* See the Mulan PSL v2 for more details.
|
||||
***************************************************************************************/
|
||||
|
||||
#include <isa.h>
|
||||
#include "types.h"
|
||||
#include <cpu/cpu.h>
|
||||
#include <cpu/decode.h>
|
||||
#include <difftest-def.h>
|
||||
#include <isa.h>
|
||||
#include <memory/paddr.h>
|
||||
|
||||
__EXPORT void difftest_memcpy(paddr_t addr, void *buf, size_t n, bool direction) {
|
||||
assert(0);
|
||||
__EXPORT void difftest_memcpy(paddr_t addr, void *buf, size_t n,
|
||||
bool direction) {
|
||||
if (direction == DIFFTEST_TO_REF) {
|
||||
memcpy(guest_to_host(addr), buf, n);
|
||||
} else {
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
__EXPORT void difftest_regcpy(void *dut, bool direction) {
|
||||
assert(0);
|
||||
// assert(0);
|
||||
if (direction == DIFFTEST_TO_DUT)
|
||||
memcpy(dut, &cpu, sizeof(CPU_state));
|
||||
else
|
||||
memcpy(&cpu, dut, sizeof(CPU_state));
|
||||
}
|
||||
|
||||
__EXPORT void difftest_exec(uint64_t n) {
|
||||
assert(0);
|
||||
}
|
||||
__EXPORT void difftest_exec(uint64_t n) { cpu_exec(n); }
|
||||
|
||||
__EXPORT void difftest_raise_intr(word_t NO) {
|
||||
assert(0);
|
||||
// assert(0);
|
||||
}
|
||||
|
||||
__EXPORT void difftest_init(int port) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue