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 1268ea0e0bSAndrew Jones #define MIN_THREAD_SHIFT 14 /* THREAD_SIZE == 16K */ 1368ea0e0bSAndrew Jones #if PAGE_SHIFT > MIN_THREAD_SHIFT 1468ea0e0bSAndrew Jones #define THREAD_SHIFT PAGE_SHIFT 15ad14f089SAndrew Jones #define THREAD_SIZE PAGE_SIZE 1668ea0e0bSAndrew Jones #define THREAD_MASK PAGE_MASK 17ad14f089SAndrew Jones #else 1868ea0e0bSAndrew Jones #define THREAD_SHIFT MIN_THREAD_SHIFT 1968ea0e0bSAndrew Jones #define THREAD_SIZE (_AC(1,UL) << THREAD_SHIFT) 2068ea0e0bSAndrew Jones #define THREAD_MASK (~(THREAD_SIZE-1)) 21ad14f089SAndrew Jones #endif 2268ea0e0bSAndrew Jones 2368ea0e0bSAndrew Jones #ifndef __ASSEMBLY__ 2468ea0e0bSAndrew Jones #include <asm/processor.h> 25*632f935cSAndrew Jones #include <alloc.h> 2668ea0e0bSAndrew Jones 2768ea0e0bSAndrew Jones #ifdef __arm__ 2868ea0e0bSAndrew Jones #include <asm/ptrace.h> 2968ea0e0bSAndrew Jones /* 3068ea0e0bSAndrew Jones * arm needs room left at the top for the exception stacks, 3168ea0e0bSAndrew Jones * and the stack needs to be 8-byte aligned 3268ea0e0bSAndrew Jones */ 3368ea0e0bSAndrew Jones #define THREAD_START_SP \ 3468ea0e0bSAndrew Jones ((THREAD_SIZE - (sizeof(struct pt_regs) * 8)) & ~7) 3568ea0e0bSAndrew Jones #else 361693644dSAndrew Jones #define THREAD_START_SP (THREAD_SIZE - 16) 3768ea0e0bSAndrew Jones #endif 381693644dSAndrew Jones 39*632f935cSAndrew Jones static inline void *thread_stack_alloc(void) 40*632f935cSAndrew Jones { 41*632f935cSAndrew Jones void *sp = memalign(THREAD_SIZE, THREAD_SIZE); 42*632f935cSAndrew Jones return sp + THREAD_START_SP; 43*632f935cSAndrew Jones } 44*632f935cSAndrew Jones 45f6d10793SAndrew Jones #define TIF_USER_MODE (1U << 0) 46f6d10793SAndrew Jones 471693644dSAndrew Jones struct thread_info { 481693644dSAndrew Jones int cpu; 49f6d10793SAndrew Jones unsigned int flags; 50ad14f089SAndrew Jones #ifdef __arm__ 51ad14f089SAndrew Jones exception_fn exception_handlers[EXCPTN_MAX]; 52ad14f089SAndrew Jones #else 53ad14f089SAndrew Jones vector_fn vector_handlers[VECTOR_MAX]; 54ad14f089SAndrew Jones exception_fn exception_handlers[VECTOR_MAX][EC_MAX]; 55ad14f089SAndrew Jones #endif 561693644dSAndrew Jones char ext[0]; /* allow unit tests to add extended info */ 571693644dSAndrew Jones }; 581693644dSAndrew Jones 59f6d10793SAndrew Jones static inline struct thread_info *thread_info_sp(unsigned long sp) 60f6d10793SAndrew Jones { 61f6d10793SAndrew Jones return (struct thread_info *)(sp & ~(THREAD_SIZE - 1)); 62f6d10793SAndrew Jones } 63f6d10793SAndrew Jones 641693644dSAndrew Jones register unsigned long current_stack_pointer asm("sp"); 651693644dSAndrew Jones 661693644dSAndrew Jones static inline struct thread_info *current_thread_info(void) 671693644dSAndrew Jones { 68f6d10793SAndrew Jones return thread_info_sp(current_stack_pointer); 691693644dSAndrew Jones } 701693644dSAndrew Jones 71f6d10793SAndrew Jones extern void thread_info_init(struct thread_info *ti, unsigned int flags); 72f6d10793SAndrew Jones 7368ea0e0bSAndrew Jones #endif /* !__ASSEMBLY__ */ 741693644dSAndrew Jones #endif /* _ASMARM_THREAD_INFO_H_ */ 75