mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
44d947eff1
There are cases where the test is not expecting to have the transaction aborted, but, the test process might have been rescheduled, either in the OS level or by KVM (if it is running on a KVM guest machine). The process reschedule will cause a treclaim/recheckpoint which will cause the transaction to doom, aborting the transaction as soon as the process is rescheduled back to the CPU. This might cause the test to fail, but this is not a failure in essence. If that is the case, TEXASR[FC] is indicated with either TM_CAUSE_RESCHEDULE or TM_CAUSE_KVM_RESCHEDULE for KVM interruptions. In this scenario, ignore these two failures and avoid the whole test to return failure. Signed-off-by: Breno Leitao <leitao@debian.org> Reviewed-by: Gustavo Romero <gromero@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
97 lines
1.8 KiB
C
97 lines
1.8 KiB
C
/*
|
|
* Copyright 2015, Michael Ellerman, IBM Corp.
|
|
* Licensed under GPLv2.
|
|
*/
|
|
|
|
#ifndef _SELFTESTS_POWERPC_TM_TM_H
|
|
#define _SELFTESTS_POWERPC_TM_TM_H
|
|
|
|
#include <asm/tm.h>
|
|
#include <asm/cputable.h>
|
|
#include <stdbool.h>
|
|
|
|
#include "utils.h"
|
|
|
|
static inline bool have_htm(void)
|
|
{
|
|
#ifdef PPC_FEATURE2_HTM
|
|
return have_hwcap2(PPC_FEATURE2_HTM);
|
|
#else
|
|
printf("PPC_FEATURE2_HTM not defined, can't check AT_HWCAP2\n");
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
static inline bool have_htm_nosc(void)
|
|
{
|
|
#ifdef PPC_FEATURE2_HTM_NOSC
|
|
return have_hwcap2(PPC_FEATURE2_HTM_NOSC);
|
|
#else
|
|
printf("PPC_FEATURE2_HTM_NOSC not defined, can't check AT_HWCAP2\n");
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
static inline long failure_code(void)
|
|
{
|
|
return __builtin_get_texasru() >> 24;
|
|
}
|
|
|
|
static inline bool failure_is_persistent(void)
|
|
{
|
|
return (failure_code() & TM_CAUSE_PERSISTENT) == TM_CAUSE_PERSISTENT;
|
|
}
|
|
|
|
static inline bool failure_is_syscall(void)
|
|
{
|
|
return (failure_code() & TM_CAUSE_SYSCALL) == TM_CAUSE_SYSCALL;
|
|
}
|
|
|
|
static inline bool failure_is_unavailable(void)
|
|
{
|
|
return (failure_code() & TM_CAUSE_FAC_UNAV) == TM_CAUSE_FAC_UNAV;
|
|
}
|
|
|
|
static inline bool failure_is_reschedule(void)
|
|
{
|
|
if ((failure_code() & TM_CAUSE_RESCHED) == TM_CAUSE_RESCHED ||
|
|
(failure_code() & TM_CAUSE_KVM_RESCHED) == TM_CAUSE_KVM_RESCHED)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
static inline bool failure_is_nesting(void)
|
|
{
|
|
return (__builtin_get_texasru() & 0x400000);
|
|
}
|
|
|
|
static inline int tcheck(void)
|
|
{
|
|
long cr;
|
|
asm volatile ("tcheck 0" : "=r"(cr) : : "cr0");
|
|
return (cr >> 28) & 4;
|
|
}
|
|
|
|
static inline bool tcheck_doomed(void)
|
|
{
|
|
return tcheck() & 8;
|
|
}
|
|
|
|
static inline bool tcheck_active(void)
|
|
{
|
|
return tcheck() & 4;
|
|
}
|
|
|
|
static inline bool tcheck_suspended(void)
|
|
{
|
|
return tcheck() & 2;
|
|
}
|
|
|
|
static inline bool tcheck_transactional(void)
|
|
{
|
|
return tcheck() & 6;
|
|
}
|
|
|
|
#endif /* _SELFTESTS_POWERPC_TM_TM_H */
|