xref: /haiku/headers/private/kernel/arch/arm/arch_thread.h (revision c0a7601219d686caaeaa50806fbdaed375d70960)
1bb1325a3SFrançois Revol /*
2*c0a76012SDavid Karoly  * Copyright 2003-2022, Haiku Inc. All rights reserved.
3bb1325a3SFrançois Revol  * Distributed under the terms of the MIT License.
4bb1325a3SFrançois Revol  *
5bb1325a3SFrançois Revol  * Authors:
6bb1325a3SFrançois Revol  * 		Axel Dörfler <axeld@pinc-software.de>
7bb1325a3SFrançois Revol  * 		Ingo Weinhold <bonefish@cs.tu-berlin.de>
8bb1325a3SFrançois Revol  *		Johannes Wischert <johanneswi@gmail.com>
9bb1325a3SFrançois Revol  */
10bb1325a3SFrançois Revol #ifndef _KERNEL_ARCH_ARM_THREAD_H
11bb1325a3SFrançois Revol #define _KERNEL_ARCH_ARM_THREAD_H
12bb1325a3SFrançois Revol 
13bb1325a3SFrançois Revol #include <arch/cpu.h>
14bb1325a3SFrançois Revol 
15bb1325a3SFrançois Revol #ifdef __cplusplus
16bb1325a3SFrançois Revol extern "C" {
17bb1325a3SFrançois Revol #endif
18bb1325a3SFrançois Revol 
19bb1325a3SFrançois Revol void arm_push_iframe(struct iframe_stack *stack, struct iframe *frame);
20bb1325a3SFrançois Revol void arm_pop_iframe(struct iframe_stack *stack);
21bb1325a3SFrançois Revol struct iframe *arm_get_user_iframe(void);
22bb1325a3SFrançois Revol 
23bb1325a3SFrançois Revol 
244535495dSIngo Weinhold extern inline Thread *
25bb1325a3SFrançois Revol arch_thread_get_current_thread(void)
26bb1325a3SFrançois Revol {
27*c0a76012SDavid Karoly 	// read pointer to thread data structure from TPIDRPRW
28*c0a76012SDavid Karoly 	Thread* t;
29*c0a76012SDavid Karoly 	asm volatile("MRC p15, 0, %0, c13, c0, 4" : "=r" (t));
30*c0a76012SDavid Karoly 	return t;
31bb1325a3SFrançois Revol }
32bb1325a3SFrançois Revol 
33bb1325a3SFrançois Revol 
34bb1325a3SFrançois Revol extern inline void
354535495dSIngo Weinhold arch_thread_set_current_thread(Thread *t)
36bb1325a3SFrançois Revol {
37*c0a76012SDavid Karoly 	// set TPIDRPRW to point to thread data structure
38*c0a76012SDavid Karoly 	asm volatile("MCR p15, 0, %0, c13, c0, 4" : : "r" (t));
39bb1325a3SFrançois Revol }
40bb1325a3SFrançois Revol 
41bb1325a3SFrançois Revol #ifdef __cplusplus
42bb1325a3SFrançois Revol }
43bb1325a3SFrançois Revol #endif
44bb1325a3SFrançois Revol 
45bb1325a3SFrançois Revol 
46bb1325a3SFrançois Revol #endif /* _KERNEL_ARCH_ARM_THREAD_H */
47