linux/tools/testing/selftests/powerpc/tm/tm.h
<<
>>
Prefs
   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
  15static 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
  25static 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
  35static inline long failure_code(void)
  36{
  37        return __builtin_get_texasru() >> 24;
  38}
  39
  40static inline bool failure_is_persistent(void)
  41{
  42        return (failure_code() & TM_CAUSE_PERSISTENT) == TM_CAUSE_PERSISTENT;
  43}
  44
  45static inline bool failure_is_syscall(void)
  46{
  47        return (failure_code() & TM_CAUSE_SYSCALL) == TM_CAUSE_SYSCALL;
  48}
  49
  50static inline bool failure_is_nesting(void)
  51{
  52        return (__builtin_get_texasru() & 0x400000);
  53}
  54
  55static inline int tcheck(void)
  56{
  57        long cr;
  58        asm volatile ("tcheck 0" : "=r"(cr) : : "cr0");
  59        return (cr >> 28) & 4;
  60}
  61
  62static inline bool tcheck_doomed(void)
  63{
  64        return tcheck() & 8;
  65}
  66
  67static inline bool tcheck_active(void)
  68{
  69        return tcheck() & 4;
  70}
  71
  72static inline bool tcheck_suspended(void)
  73{
  74        return tcheck() & 2;
  75}
  76
  77static inline bool tcheck_transactional(void)
  78{
  79        return tcheck() & 6;
  80}
  81
  82#endif /* _SELFTESTS_POWERPC_TM_TM_H */
  83