1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2006 Atmark Techno, Inc. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef _ASM_MICROBLAZE_THREAD_INFO_H 7*4882a593Smuzhiyun #define _ASM_MICROBLAZE_THREAD_INFO_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifdef __KERNEL__ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* we have 8k stack */ 12*4882a593Smuzhiyun #define THREAD_SHIFT 13 13*4882a593Smuzhiyun #define THREAD_SIZE (1 << THREAD_SHIFT) 14*4882a593Smuzhiyun #define THREAD_SIZE_ORDER 1 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 17*4882a593Smuzhiyun # include <linux/types.h> 18*4882a593Smuzhiyun # include <asm/processor.h> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /* 21*4882a593Smuzhiyun * low level task data that entry.S needs immediate access to 22*4882a593Smuzhiyun * - this struct should fit entirely inside of one cache line 23*4882a593Smuzhiyun * - this struct shares the supervisor stack pages 24*4882a593Smuzhiyun * - if the contents of this structure are changed, the assembly constants 25*4882a593Smuzhiyun * must also be changed 26*4882a593Smuzhiyun */ 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct cpu_context { 29*4882a593Smuzhiyun __u32 r1; /* stack pointer */ 30*4882a593Smuzhiyun __u32 r2; 31*4882a593Smuzhiyun /* dedicated registers */ 32*4882a593Smuzhiyun __u32 r13; 33*4882a593Smuzhiyun __u32 r14; 34*4882a593Smuzhiyun __u32 r15; 35*4882a593Smuzhiyun __u32 r16; 36*4882a593Smuzhiyun __u32 r17; 37*4882a593Smuzhiyun __u32 r18; 38*4882a593Smuzhiyun /* non-volatile registers */ 39*4882a593Smuzhiyun __u32 r19; 40*4882a593Smuzhiyun __u32 r20; 41*4882a593Smuzhiyun __u32 r21; 42*4882a593Smuzhiyun __u32 r22; 43*4882a593Smuzhiyun __u32 r23; 44*4882a593Smuzhiyun __u32 r24; 45*4882a593Smuzhiyun __u32 r25; 46*4882a593Smuzhiyun __u32 r26; 47*4882a593Smuzhiyun __u32 r27; 48*4882a593Smuzhiyun __u32 r28; 49*4882a593Smuzhiyun __u32 r29; 50*4882a593Smuzhiyun __u32 r30; 51*4882a593Smuzhiyun /* r31 is used as current task pointer */ 52*4882a593Smuzhiyun /* special purpose registers */ 53*4882a593Smuzhiyun __u32 msr; 54*4882a593Smuzhiyun __u32 ear; 55*4882a593Smuzhiyun __u32 esr; 56*4882a593Smuzhiyun __u32 fsr; 57*4882a593Smuzhiyun }; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun typedef struct { 60*4882a593Smuzhiyun unsigned long seg; 61*4882a593Smuzhiyun } mm_segment_t; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun struct thread_info { 64*4882a593Smuzhiyun struct task_struct *task; /* main task structure */ 65*4882a593Smuzhiyun unsigned long flags; /* low level flags */ 66*4882a593Smuzhiyun unsigned long status; /* thread-synchronous flags */ 67*4882a593Smuzhiyun __u32 cpu; /* current CPU */ 68*4882a593Smuzhiyun __s32 preempt_count; /* 0 => preemptable,< 0 => BUG*/ 69*4882a593Smuzhiyun mm_segment_t addr_limit; /* thread address space */ 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun struct cpu_context cpu_context; 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /* 75*4882a593Smuzhiyun * macros/functions for gaining access to the thread information structure 76*4882a593Smuzhiyun */ 77*4882a593Smuzhiyun #define INIT_THREAD_INFO(tsk) \ 78*4882a593Smuzhiyun { \ 79*4882a593Smuzhiyun .task = &tsk, \ 80*4882a593Smuzhiyun .flags = 0, \ 81*4882a593Smuzhiyun .cpu = 0, \ 82*4882a593Smuzhiyun .preempt_count = INIT_PREEMPT_COUNT, \ 83*4882a593Smuzhiyun .addr_limit = KERNEL_DS, \ 84*4882a593Smuzhiyun } 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* how to get the thread information struct from C */ current_thread_info(void)87*4882a593Smuzhiyunstatic inline struct thread_info *current_thread_info(void) 88*4882a593Smuzhiyun { 89*4882a593Smuzhiyun register unsigned long sp asm("r1"); 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun return (struct thread_info *)(sp & ~(THREAD_SIZE-1)); 92*4882a593Smuzhiyun } 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /* thread information allocation */ 95*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */ 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* 98*4882a593Smuzhiyun * thread information flags 99*4882a593Smuzhiyun * - these are process state flags that various assembly files may 100*4882a593Smuzhiyun * need to access 101*4882a593Smuzhiyun * - pending work-to-be-done flags are in LSW 102*4882a593Smuzhiyun * - other flags in MSW 103*4882a593Smuzhiyun */ 104*4882a593Smuzhiyun #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ 105*4882a593Smuzhiyun #define TIF_NOTIFY_RESUME 1 /* resumption notification requested */ 106*4882a593Smuzhiyun #define TIF_SIGPENDING 2 /* signal pending */ 107*4882a593Smuzhiyun #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ 108*4882a593Smuzhiyun /* restore singlestep on return to user mode */ 109*4882a593Smuzhiyun #define TIF_SINGLESTEP 4 110*4882a593Smuzhiyun #define TIF_NOTIFY_SIGNAL 5 /* signal notifications exist */ 111*4882a593Smuzhiyun #define TIF_MEMDIE 6 /* is terminating due to OOM killer */ 112*4882a593Smuzhiyun #define TIF_SYSCALL_AUDIT 9 /* syscall auditing active */ 113*4882a593Smuzhiyun #define TIF_SECCOMP 10 /* secure computing */ 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun /* true if poll_idle() is polling TIF_NEED_RESCHED */ 116*4882a593Smuzhiyun #define TIF_POLLING_NRFLAG 16 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) 119*4882a593Smuzhiyun #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) 120*4882a593Smuzhiyun #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) 121*4882a593Smuzhiyun #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) 122*4882a593Smuzhiyun #define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) 123*4882a593Smuzhiyun #define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL) 124*4882a593Smuzhiyun #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) 125*4882a593Smuzhiyun #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) 126*4882a593Smuzhiyun #define _TIF_SECCOMP (1 << TIF_SECCOMP) 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun /* work to do in syscall trace */ 129*4882a593Smuzhiyun #define _TIF_WORK_SYSCALL_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \ 130*4882a593Smuzhiyun _TIF_SYSCALL_AUDIT | _TIF_SECCOMP) 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun /* work to do on interrupt/exception return */ 133*4882a593Smuzhiyun #define _TIF_WORK_MASK 0x0000FFFE 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun /* work to do on any return to u-space */ 136*4882a593Smuzhiyun #define _TIF_ALLWORK_MASK 0x0000FFFF 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun /* 139*4882a593Smuzhiyun * Thread-synchronous status. 140*4882a593Smuzhiyun * 141*4882a593Smuzhiyun * This is different from the flags in that nobody else 142*4882a593Smuzhiyun * ever touches our thread-synchronous status, so we don't 143*4882a593Smuzhiyun * have to worry about atomic accesses. 144*4882a593Smuzhiyun */ 145*4882a593Smuzhiyun /* FPU was used by this task this quantum (SMP) */ 146*4882a593Smuzhiyun #define TS_USEDFPU 0x0001 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #endif /* __KERNEL__ */ 149*4882a593Smuzhiyun #endif /* _ASM_MICROBLAZE_THREAD_INFO_H */ 150