xref: /kvm-unit-tests/lib/arm/asm/thread_info.h (revision ad14f089be824ef2baebb5960649271119c46d66)
11693644dSAndrew Jones #ifndef _ASMARM_THREAD_INFO_H_
21693644dSAndrew Jones #define _ASMARM_THREAD_INFO_H_
31693644dSAndrew Jones /*
41693644dSAndrew Jones  * Adapted from arch/arm64/include/asm/thread_info.h
51693644dSAndrew Jones  *
61693644dSAndrew Jones  * Copyright (C) 2015, Red Hat Inc, Andrew Jones <drjones@redhat.com>
71693644dSAndrew Jones  *
81693644dSAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
91693644dSAndrew Jones  */
10*ad14f089SAndrew Jones #include <asm/processor.h>
11*ad14f089SAndrew Jones #include <asm/page.h>
121693644dSAndrew Jones 
13*ad14f089SAndrew Jones #define __MIN_THREAD_SIZE	16384
14*ad14f089SAndrew Jones #if PAGE_SIZE > __MIN_THREAD_SIZE
15*ad14f089SAndrew Jones #define THREAD_SIZE		PAGE_SIZE
16*ad14f089SAndrew Jones #else
17*ad14f089SAndrew Jones #define THREAD_SIZE		__MIN_THREAD_SIZE
18*ad14f089SAndrew Jones #endif
191693644dSAndrew Jones #define THREAD_START_SP		(THREAD_SIZE - 16)
201693644dSAndrew Jones 
21f6d10793SAndrew Jones #define TIF_USER_MODE		(1U << 0)
22f6d10793SAndrew Jones 
231693644dSAndrew Jones struct thread_info {
241693644dSAndrew Jones 	int cpu;
25f6d10793SAndrew Jones 	unsigned int flags;
26*ad14f089SAndrew Jones #ifdef __arm__
27*ad14f089SAndrew Jones 	exception_fn exception_handlers[EXCPTN_MAX];
28*ad14f089SAndrew Jones #else
29*ad14f089SAndrew Jones 	vector_fn vector_handlers[VECTOR_MAX];
30*ad14f089SAndrew Jones 	exception_fn exception_handlers[VECTOR_MAX][EC_MAX];
31*ad14f089SAndrew Jones #endif
321693644dSAndrew Jones 	char ext[0];		/* allow unit tests to add extended info */
331693644dSAndrew Jones };
341693644dSAndrew Jones 
35f6d10793SAndrew Jones static inline struct thread_info *thread_info_sp(unsigned long sp)
36f6d10793SAndrew Jones {
37f6d10793SAndrew Jones 	return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));
38f6d10793SAndrew Jones }
39f6d10793SAndrew Jones 
401693644dSAndrew Jones register unsigned long current_stack_pointer asm("sp");
411693644dSAndrew Jones 
421693644dSAndrew Jones static inline struct thread_info *current_thread_info(void)
431693644dSAndrew Jones {
44f6d10793SAndrew Jones 	return thread_info_sp(current_stack_pointer);
451693644dSAndrew Jones }
461693644dSAndrew Jones 
47f6d10793SAndrew Jones extern void thread_info_init(struct thread_info *ti, unsigned int flags);
48f6d10793SAndrew Jones 
491693644dSAndrew Jones #endif /* _ASMARM_THREAD_INFO_H_ */
50