Home | History | Annotate | Download | only in tm
      1 /*
      2  * Copyright 2015, Michael Ellerman, IBM Corp.
      3  * Licensed under GPLv2.
      4  */
      5 
      6 #ifndef _SELFTESTS_POWERPC_TM_TM_H
      7 #define _SELFTESTS_POWERPC_TM_TM_H
      8 
      9 #include <asm/tm.h>
     10 #include <asm/cputable.h>
     11 #include <stdbool.h>
     12 
     13 #include "utils.h"
     14 
     15 static inline bool have_htm(void)
     16 {
     17 #ifdef PPC_FEATURE2_HTM
     18 	return have_hwcap2(PPC_FEATURE2_HTM);
     19 #else
     20 	printf("PPC_FEATURE2_HTM not defined, can't check AT_HWCAP2\n");
     21 	return false;
     22 #endif
     23 }
     24 
     25 static inline bool have_htm_nosc(void)
     26 {
     27 #ifdef PPC_FEATURE2_HTM_NOSC
     28 	return have_hwcap2(PPC_FEATURE2_HTM_NOSC);
     29 #else
     30 	printf("PPC_FEATURE2_HTM_NOSC not defined, can't check AT_HWCAP2\n");
     31 	return false;
     32 #endif
     33 }
     34 
     35 static inline long failure_code(void)
     36 {
     37 	return __builtin_get_texasru() >> 24;
     38 }
     39 
     40 static inline bool failure_is_persistent(void)
     41 {
     42 	return (failure_code() & TM_CAUSE_PERSISTENT) == TM_CAUSE_PERSISTENT;
     43 }
     44 
     45 static inline bool failure_is_syscall(void)
     46 {
     47 	return (failure_code() & TM_CAUSE_SYSCALL) == TM_CAUSE_SYSCALL;
     48 }
     49 
     50 static inline bool failure_is_unavailable(void)
     51 {
     52 	return (failure_code() & TM_CAUSE_FAC_UNAV) == TM_CAUSE_FAC_UNAV;
     53 }
     54 
     55 static inline bool failure_is_nesting(void)
     56 {
     57 	return (__builtin_get_texasru() & 0x400000);
     58 }
     59 
     60 static inline int tcheck(void)
     61 {
     62 	long cr;
     63 	asm volatile ("tcheck 0" : "=r"(cr) : : "cr0");
     64 	return (cr >> 28) & 4;
     65 }
     66 
     67 static inline bool tcheck_doomed(void)
     68 {
     69 	return tcheck() & 8;
     70 }
     71 
     72 static inline bool tcheck_active(void)
     73 {
     74 	return tcheck() & 4;
     75 }
     76 
     77 static inline bool tcheck_suspended(void)
     78 {
     79 	return tcheck() & 2;
     80 }
     81 
     82 static inline bool tcheck_transactional(void)
     83 {
     84 	return tcheck() & 6;
     85 }
     86 
     87 #endif /* _SELFTESTS_POWERPC_TM_TM_H */
     88