tools/testing/selftests/powerpc/tm/tm-tmspr.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/powerpc/tm/tm-tmspr.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/powerpc/tm/tm-tmspr.c- Extension
.c- Size
- 2968 bytes
- Lines
- 145
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
Dependency Surface
stdio.hstdlib.hunistd.hpthread.hstring.hutils.htm.h
Detected Declarations
function tfiar_tfharfunction texasrfunction test_tmsprfunction main
Annotated Snippet
if ( (tfhar != tfhar_rd) || (tfiar != tfiar_rd) ) {
passed = 0;
return;
}
}
return;
}
void texasr(void *in)
{
unsigned long i;
uint64_t result = 0;
for (i = 0; i < num_loops; i++) {
asm __volatile__(
"tbegin.;"
"beq 3f ;"
"tabort. 0 ;"
"tend.;"
/* Abort handler */
"3: ;"
::: "memory");
/* Check the TEXASR */
result = mfspr(SPRN_TEXASR);
if ((result & TEXASR_FS) == 0) {
passed = 0;
return;
}
}
return;
}
int test_tmspr()
{
pthread_t *thread;
int thread_num;
unsigned long i;
SKIP_IF(!have_htm());
SKIP_IF(htm_is_synthetic());
/* To cause some context switching */
thread_num = 10 * sysconf(_SC_NPROCESSORS_ONLN);
thread = malloc(thread_num * sizeof(pthread_t));
if (thread == NULL)
return EXIT_FAILURE;
/* Test TFIAR and TFHAR */
for (i = 0; i < thread_num; i += 2) {
if (pthread_create(&thread[i], NULL, (void *)tfiar_tfhar,
(void *)i))
return EXIT_FAILURE;
}
/* Test TEXASR */
for (i = 1; i < thread_num; i += 2) {
if (pthread_create(&thread[i], NULL, (void *)texasr, (void *)i))
return EXIT_FAILURE;
}
for (i = 0; i < thread_num; i++) {
if (pthread_join(thread[i], NULL) != 0)
return EXIT_FAILURE;
}
free(thread);
if (passed)
return 0;
else
return 1;
}
int main(int argc, char *argv[])
{
if (argc > 1) {
if (strcmp(argv[1], "-h") == 0) {
printf("Syntax:\t [<num loops>]\n");
return 0;
} else {
num_loops = atoi(argv[1]);
}
}
return test_harness(test_tmspr, "tm_tmspr");
}
Annotation
- Immediate include surface: `stdio.h`, `stdlib.h`, `unistd.h`, `pthread.h`, `string.h`, `utils.h`, `tm.h`.
- Detected declarations: `function tfiar_tfhar`, `function texasr`, `function test_tmspr`, `function main`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.