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