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