|  | #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 */ |