1*8ede0bdbSAl Viro /* 2*8ede0bdbSAl Viro * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 3*8ede0bdbSAl Viro * Licensed under the GPL 4*8ede0bdbSAl Viro */ 5*8ede0bdbSAl Viro 6*8ede0bdbSAl Viro #ifndef __UM_PROCESSOR_GENERIC_H 7*8ede0bdbSAl Viro #define __UM_PROCESSOR_GENERIC_H 8*8ede0bdbSAl Viro 9*8ede0bdbSAl Viro struct pt_regs; 10*8ede0bdbSAl Viro 11*8ede0bdbSAl Viro struct task_struct; 12*8ede0bdbSAl Viro 13*8ede0bdbSAl Viro #include "asm/ptrace.h" 14*8ede0bdbSAl Viro #include "registers.h" 15*8ede0bdbSAl Viro #include "sysdep/archsetjmp.h" 16*8ede0bdbSAl Viro 17*8ede0bdbSAl Viro struct mm_struct; 18*8ede0bdbSAl Viro 19*8ede0bdbSAl Viro struct thread_struct { 20*8ede0bdbSAl Viro struct task_struct *saved_task; 21*8ede0bdbSAl Viro /* 22*8ede0bdbSAl Viro * This flag is set to 1 before calling do_fork (and analyzed in 23*8ede0bdbSAl Viro * copy_thread) to mark that we are begin called from userspace (fork / 24*8ede0bdbSAl Viro * vfork / clone), and reset to 0 after. It is left to 0 when called 25*8ede0bdbSAl Viro * from kernelspace (i.e. kernel_thread() or fork_idle(), 26*8ede0bdbSAl Viro * as of 2.6.11). 27*8ede0bdbSAl Viro */ 28*8ede0bdbSAl Viro int forking; 29*8ede0bdbSAl Viro struct pt_regs regs; 30*8ede0bdbSAl Viro int singlestep_syscall; 31*8ede0bdbSAl Viro void *fault_addr; 32*8ede0bdbSAl Viro jmp_buf *fault_catcher; 33*8ede0bdbSAl Viro struct task_struct *prev_sched; 34*8ede0bdbSAl Viro unsigned long temp_stack; 35*8ede0bdbSAl Viro jmp_buf *exec_buf; 36*8ede0bdbSAl Viro struct arch_thread arch; 37*8ede0bdbSAl Viro jmp_buf switch_buf; 38*8ede0bdbSAl Viro int mm_count; 39*8ede0bdbSAl Viro struct { 40*8ede0bdbSAl Viro int op; 41*8ede0bdbSAl Viro union { 42*8ede0bdbSAl Viro struct { 43*8ede0bdbSAl Viro int pid; 44*8ede0bdbSAl Viro } fork, exec; 45*8ede0bdbSAl Viro struct { 46*8ede0bdbSAl Viro int (*proc)(void *); 47*8ede0bdbSAl Viro void *arg; 48*8ede0bdbSAl Viro } thread; 49*8ede0bdbSAl Viro struct { 50*8ede0bdbSAl Viro void (*proc)(void *); 51*8ede0bdbSAl Viro void *arg; 52*8ede0bdbSAl Viro } cb; 53*8ede0bdbSAl Viro } u; 54*8ede0bdbSAl Viro } request; 55*8ede0bdbSAl Viro }; 56*8ede0bdbSAl Viro 57*8ede0bdbSAl Viro #define INIT_THREAD \ 58*8ede0bdbSAl Viro { \ 59*8ede0bdbSAl Viro .forking = 0, \ 60*8ede0bdbSAl Viro .regs = EMPTY_REGS, \ 61*8ede0bdbSAl Viro .fault_addr = NULL, \ 62*8ede0bdbSAl Viro .prev_sched = NULL, \ 63*8ede0bdbSAl Viro .temp_stack = 0, \ 64*8ede0bdbSAl Viro .exec_buf = NULL, \ 65*8ede0bdbSAl Viro .arch = INIT_ARCH_THREAD, \ 66*8ede0bdbSAl Viro .request = { 0 } \ 67*8ede0bdbSAl Viro } 68*8ede0bdbSAl Viro 69*8ede0bdbSAl Viro extern struct task_struct *alloc_task_struct(void); 70*8ede0bdbSAl Viro 71*8ede0bdbSAl Viro static inline void release_thread(struct task_struct *task) 72*8ede0bdbSAl Viro { 73*8ede0bdbSAl Viro } 74*8ede0bdbSAl Viro 75*8ede0bdbSAl Viro extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); 76*8ede0bdbSAl Viro 77*8ede0bdbSAl Viro static inline void prepare_to_copy(struct task_struct *tsk) 78*8ede0bdbSAl Viro { 79*8ede0bdbSAl Viro } 80*8ede0bdbSAl Viro 81*8ede0bdbSAl Viro 82*8ede0bdbSAl Viro extern unsigned long thread_saved_pc(struct task_struct *t); 83*8ede0bdbSAl Viro 84*8ede0bdbSAl Viro static inline void mm_copy_segments(struct mm_struct *from_mm, 85*8ede0bdbSAl Viro struct mm_struct *new_mm) 86*8ede0bdbSAl Viro { 87*8ede0bdbSAl Viro } 88*8ede0bdbSAl Viro 89*8ede0bdbSAl Viro #define init_stack (init_thread_union.stack) 90*8ede0bdbSAl Viro 91*8ede0bdbSAl Viro /* 92*8ede0bdbSAl Viro * User space process size: 3GB (default). 93*8ede0bdbSAl Viro */ 94*8ede0bdbSAl Viro extern unsigned long task_size; 95*8ede0bdbSAl Viro 96*8ede0bdbSAl Viro #define TASK_SIZE (task_size) 97*8ede0bdbSAl Viro 98*8ede0bdbSAl Viro #undef STACK_TOP 99*8ede0bdbSAl Viro #undef STACK_TOP_MAX 100*8ede0bdbSAl Viro 101*8ede0bdbSAl Viro extern unsigned long stacksizelim; 102*8ede0bdbSAl Viro 103*8ede0bdbSAl Viro #define STACK_ROOM (stacksizelim) 104*8ede0bdbSAl Viro #define STACK_TOP (TASK_SIZE - 2 * PAGE_SIZE) 105*8ede0bdbSAl Viro #define STACK_TOP_MAX STACK_TOP 106*8ede0bdbSAl Viro 107*8ede0bdbSAl Viro /* This decides where the kernel will search for a free chunk of vm 108*8ede0bdbSAl Viro * space during mmap's. 109*8ede0bdbSAl Viro */ 110*8ede0bdbSAl Viro #define TASK_UNMAPPED_BASE (0x40000000) 111*8ede0bdbSAl Viro 112*8ede0bdbSAl Viro extern void start_thread(struct pt_regs *regs, unsigned long entry, 113*8ede0bdbSAl Viro unsigned long stack); 114*8ede0bdbSAl Viro 115*8ede0bdbSAl Viro struct cpuinfo_um { 116*8ede0bdbSAl Viro unsigned long loops_per_jiffy; 117*8ede0bdbSAl Viro int ipi_pipe[2]; 118*8ede0bdbSAl Viro }; 119*8ede0bdbSAl Viro 120*8ede0bdbSAl Viro extern struct cpuinfo_um boot_cpu_data; 121*8ede0bdbSAl Viro 122*8ede0bdbSAl Viro #define my_cpu_data cpu_data[smp_processor_id()] 123*8ede0bdbSAl Viro 124*8ede0bdbSAl Viro #ifdef CONFIG_SMP 125*8ede0bdbSAl Viro extern struct cpuinfo_um cpu_data[]; 126*8ede0bdbSAl Viro #define current_cpu_data cpu_data[smp_processor_id()] 127*8ede0bdbSAl Viro #else 128*8ede0bdbSAl Viro #define cpu_data (&boot_cpu_data) 129*8ede0bdbSAl Viro #define current_cpu_data boot_cpu_data 130*8ede0bdbSAl Viro #endif 131*8ede0bdbSAl Viro 132*8ede0bdbSAl Viro 133*8ede0bdbSAl Viro #define KSTK_REG(tsk, reg) get_thread_reg(reg, &tsk->thread.switch_buf) 134*8ede0bdbSAl Viro extern unsigned long get_wchan(struct task_struct *p); 135*8ede0bdbSAl Viro 136*8ede0bdbSAl Viro #endif 137