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