blob: e829416d89be1f3b781321ff8974e16246ad3cde [file] [log] [blame]
#pragma once
#define SPRINGBOK_SIMPRINT_ERROR (0)
#define SPRINGBOK_SIMPRINT_WARNING (1)
#define SPRINGBOK_SIMPRINT_INFO (2)
#define SPRINGBOK_SIMPRINT_DEBUG (3)
#define SPRINGBOK_SIMPRINT_NOISY (4)
#define springbok_simprint_error(s, n) springbok_simprint(SPRINGBOK_SIMPRINT_ERROR, s, n)
#define springbok_simprint_warning(s, n) springbok_simprint(SPRINGBOK_SIMPRINT_WARNING, s, n)
#define springbok_simprint_info(s, n) springbok_simprint(SPRINGBOK_SIMPRINT_INFO, s, n)
#define springbok_simprint_debug(s, n) springbok_simprint(SPRINGBOK_SIMPRINT_DEBUG, s, n)
#define springbok_simprint_noisy(s, n) springbok_simprint(SPRINGBOK_SIMPRINT_NOISY, s, n)
// simprint
// Description:
// This intrinsic prints a string and a number to the simulator console.
// Inputs:
// _loglevel:
// The logging level in decreasing priority (0 is highest priority, 4 is lowest)
// _string:
// A pointer to the null-terminated string to print
// _number:
// The number to print
// Outputs:
// none
static inline void springbok_simprint(int _loglevel, const char *_string, int _number) {
// simprint a0, a1, a2 # "-------[rs2][rs1]000[rd ]1111011"
register int loglevel __asm__ ("a0") = _loglevel;
register const char *string __asm__ ("a1") = _string;
register int number __asm__ ("a2") = _number;
__asm__ volatile ("\t.word 0x00C5857B\n" :
/* no outputs */ :
"r"(loglevel), "r"(string), "r"(number) :
/* no clobbers */);
}
// icount
// Description:
// This intrinsic returns a 32-bit value representing the number of instructions executed since reset.
// Inputs:
// none
// Outputs:
// the number of instructions executed since reset
static inline unsigned int springbok_icount(void) {
int retval;
__asm__ volatile("csrr %0, 0x7c0;" : "=r"(retval));
return retval;
}
// ccount
// Description:
// This intrinsic returns a 32-bit value representing the number of unhalted cycles since reset.
// Inputs:
// none
// Outputs:
// the number of unhalted cycles since reset
static inline unsigned int springbok_ccount(void) {
// ccount a0 # "------------00001001[rd ]1111011"
int retval;
__asm__ volatile("csrr %0, 0x7c1;" : "=r"(retval));
return retval;
}
// hostreq
// Description:
// This intrinsic halts Springbok and triggers a host request interrupt in an attached management core.
// Inputs:
// none
// Outputs:
// none
static inline void springbok_hostreq(void) {
// hostreq # "-----------------010-----1111011"
__asm__ volatile ("\t.word 0x0000207B\n" :
/* no outputs */ :
/* no inputs */ :
/* no clobbers */);
}
// finish
// Description:
// This intrinsic halts and resets Springbok while triggerring a completion interrupt in an attached management core.
// It's included here for completeness, but it should not actually be called by C/C++ applications as it bypasses
// C/C++ destructors and crt stack sentinel verification.
// Inputs:
// none
// Outputs:
// none
__attribute__((noreturn)) static inline void springbok_finish(void) {
// finish # "-----------------011-----1111011"
__asm__ volatile ("\t.word 0x0000307B\n" :
/* no outputs */ :
/* no inputs */ :
/* no clobbers */);
while(1);
}