blob: 0a23589aceb62b3b4e18fd09d9bff638ae1d5464 [file] [log] [blame]
#ifndef PARLIB_ARCH_H
#define PARLIB_ARCH_H
#include <ros/common.h>
#include <ros/trapframe.h>
#include <ros/arch/arch.h>
#define internal_function
#define ARCH_CL_SIZE 64
static __inline void
set_stack_pointer(void* sp)
{
asm volatile ("move sp, %0" : : "r"(sp) : "memory");
}
static __inline void
breakpoint(void)
{
asm volatile ("break");
}
static __inline uint64_t
read_tsc(void)
{
unsigned long cycles;
asm ("rdcycle %0" : "=r"(cycles));
return (uint64_t)cycles;
}
static __inline uint64_t
read_tscp(void)
{
return read_tsc();
}
static __inline uint64_t
read_tsc_serialized(void)
{
return read_tsc();
}
static __inline void
cpu_relax(void)
{
long ctr;
asm volatile("li %0, 8; 1: addi %0, %0, -1; bnez %0, 1b" : "=r"(ctr) : : "memory");
}
static inline void save_fp_state(struct ancillary_state* silly)
{
uint32_t fsr = read_fsr();
asm("fsd fs0,%0" : "=m"(silly->fpr[0]));
asm("fsd fs1,%0" : "=m"(silly->fpr[1]));
asm("fsd fs2,%0" : "=m"(silly->fpr[2]));
asm("fsd fs3,%0" : "=m"(silly->fpr[3]));
asm("fsd fs4,%0" : "=m"(silly->fpr[4]));
asm("fsd fs5,%0" : "=m"(silly->fpr[5]));
asm("fsd fs6,%0" : "=m"(silly->fpr[6]));
asm("fsd fs7,%0" : "=m"(silly->fpr[7]));
asm("fsd fs8,%0" : "=m"(silly->fpr[8]));
asm("fsd fs9,%0" : "=m"(silly->fpr[9]));
asm("fsd fs10,%0" : "=m"(silly->fpr[10]));
asm("fsd fs11,%0" : "=m"(silly->fpr[11]));
asm("fsd fs12,%0" : "=m"(silly->fpr[12]));
asm("fsd fs13,%0" : "=m"(silly->fpr[13]));
asm("fsd fs14,%0" : "=m"(silly->fpr[14]));
asm("fsd fs15,%0" : "=m"(silly->fpr[15]));
silly->fsr = fsr;
}
static inline void restore_fp_state(struct ancillary_state* silly)
{
uint32_t fsr = silly->fsr;
asm("fld fs0,%0" : : "m"(silly->fpr[0]));
asm("fld fs1,%0" : : "m"(silly->fpr[1]));
asm("fld fs2,%0" : : "m"(silly->fpr[2]));
asm("fld fs3,%0" : : "m"(silly->fpr[3]));
asm("fld fs4,%0" : : "m"(silly->fpr[4]));
asm("fld fs5,%0" : : "m"(silly->fpr[5]));
asm("fld fs6,%0" : : "m"(silly->fpr[6]));
asm("fld fs7,%0" : : "m"(silly->fpr[7]));
asm("fld fs8,%0" : : "m"(silly->fpr[8]));
asm("fld fs9,%0" : : "m"(silly->fpr[9]));
asm("fld fs10,%0" : : "m"(silly->fpr[10]));
asm("fld fs11,%0" : : "m"(silly->fpr[11]));
asm("fld fs12,%0" : : "m"(silly->fpr[12]));
asm("fld fs13,%0" : : "m"(silly->fpr[13]));
asm("fld fs14,%0" : : "m"(silly->fpr[14]));
asm("fld fs15,%0" : : "m"(silly->fpr[15]));
write_fsr(fsr);
}
#endif /* PARLIB_ARCH_H */