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 */ 10ad14f089SAndrew Jones #include <asm/page.h> 111693644dSAndrew Jones 12*68ea0e0bSAndrew Jones #define MIN_THREAD_SHIFT 14 /* THREAD_SIZE == 16K */ 13*68ea0e0bSAndrew Jones #if PAGE_SHIFT > MIN_THREAD_SHIFT 14*68ea0e0bSAndrew Jones #define THREAD_SHIFT PAGE_SHIFT 15ad14f089SAndrew Jones #define THREAD_SIZE PAGE_SIZE 16*68ea0e0bSAndrew Jones #define THREAD_MASK PAGE_MASK 17ad14f089SAndrew Jones #else 18*68ea0e0bSAndrew Jones #define THREAD_SHIFT MIN_THREAD_SHIFT 19*68ea0e0bSAndrew Jones #define THREAD_SIZE (_AC(1,UL) << THREAD_SHIFT) 20*68ea0e0bSAndrew Jones #define THREAD_MASK (~(THREAD_SIZE-1)) 21ad14f089SAndrew Jones #endif 22*68ea0e0bSAndrew Jones 23*68ea0e0bSAndrew Jones #ifndef __ASSEMBLY__ 24*68ea0e0bSAndrew Jones #include <asm/processor.h> 25*68ea0e0bSAndrew Jones 26*68ea0e0bSAndrew Jones #ifdef __arm__ 27*68ea0e0bSAndrew Jones #include <asm/ptrace.h> 28*68ea0e0bSAndrew Jones /* 29*68ea0e0bSAndrew Jones * arm needs room left at the top for the exception stacks, 30*68ea0e0bSAndrew Jones * and the stack needs to be 8-byte aligned 31*68ea0e0bSAndrew Jones */ 32*68ea0e0bSAndrew Jones #define THREAD_START_SP \ 33*68ea0e0bSAndrew Jones ((THREAD_SIZE - (sizeof(struct pt_regs) * 8)) & ~7) 34*68ea0e0bSAndrew Jones #else 351693644dSAndrew Jones #define THREAD_START_SP (THREAD_SIZE - 16) 36*68ea0e0bSAndrew Jones #endif 371693644dSAndrew Jones 38f6d10793SAndrew Jones #define TIF_USER_MODE (1U << 0) 39f6d10793SAndrew Jones 401693644dSAndrew Jones struct thread_info { 411693644dSAndrew Jones int cpu; 42f6d10793SAndrew Jones unsigned int flags; 43ad14f089SAndrew Jones #ifdef __arm__ 44ad14f089SAndrew Jones exception_fn exception_handlers[EXCPTN_MAX]; 45ad14f089SAndrew Jones #else 46ad14f089SAndrew Jones vector_fn vector_handlers[VECTOR_MAX]; 47ad14f089SAndrew Jones exception_fn exception_handlers[VECTOR_MAX][EC_MAX]; 48ad14f089SAndrew Jones #endif 491693644dSAndrew Jones char ext[0]; /* allow unit tests to add extended info */ 501693644dSAndrew Jones }; 511693644dSAndrew Jones 52f6d10793SAndrew Jones static inline struct thread_info *thread_info_sp(unsigned long sp) 53f6d10793SAndrew Jones { 54f6d10793SAndrew Jones return (struct thread_info *)(sp & ~(THREAD_SIZE - 1)); 55f6d10793SAndrew Jones } 56f6d10793SAndrew Jones 571693644dSAndrew Jones register unsigned long current_stack_pointer asm("sp"); 581693644dSAndrew Jones 591693644dSAndrew Jones static inline struct thread_info *current_thread_info(void) 601693644dSAndrew Jones { 61f6d10793SAndrew Jones return thread_info_sp(current_stack_pointer); 621693644dSAndrew Jones } 631693644dSAndrew Jones 64f6d10793SAndrew Jones extern void thread_info_init(struct thread_info *ti, unsigned int flags); 65f6d10793SAndrew Jones 66*68ea0e0bSAndrew Jones #endif /* !__ASSEMBLY__ */ 671693644dSAndrew Jones #endif /* _ASMARM_THREAD_INFO_H_ */ 68