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