David Karoly c0a7601219 kernel/arm: store current thread pointer in TPIDRPRW register
Use the Privileged Only Thread ID Register aka TPIDRPRW to store
the current thread pointer.

The Privileged Only Thread ID Register is only accessible
in privileged modes, and is read/write.

see: ARMv7 Architecture Reference Manual,
section B3.12.46 CP15 c13 Software Thread ID registers

Change-Id: I5273bee8a80b78cdc547b2f6c96632d120eb3d55
Reviewed-on: https://review.haiku-os.org/c/haiku/+/5608
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
2022-09-02 16:23:53 +00:00

47 lines
1005 B
C

/*
* Copyright 2003-2022, Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Axel Dörfler <axeld@pinc-software.de>
* Ingo Weinhold <bonefish@cs.tu-berlin.de>
* Johannes Wischert <johanneswi@gmail.com>
*/
#ifndef _KERNEL_ARCH_ARM_THREAD_H
#define _KERNEL_ARCH_ARM_THREAD_H
#include <arch/cpu.h>
#ifdef __cplusplus
extern "C" {
#endif
void arm_push_iframe(struct iframe_stack *stack, struct iframe *frame);
void arm_pop_iframe(struct iframe_stack *stack);
struct iframe *arm_get_user_iframe(void);
extern inline Thread *
arch_thread_get_current_thread(void)
{
// read pointer to thread data structure from TPIDRPRW
Thread* t;
asm volatile("MRC p15, 0, %0, c13, c0, 4" : "=r" (t));
return t;
}
extern inline void
arch_thread_set_current_thread(Thread *t)
{
// set TPIDRPRW to point to thread data structure
asm volatile("MCR p15, 0, %0, c13, c0, 4" : : "r" (t));
}
#ifdef __cplusplus
}
#endif
#endif /* _KERNEL_ARCH_ARM_THREAD_H */