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 static inline void release_thread(struct task_struct *task) 72 { 73 } 74 75 extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); 76 77 extern unsigned long thread_saved_pc(struct task_struct *t); 78 79 static inline void mm_copy_segments(struct mm_struct *from_mm, 80 struct mm_struct *new_mm) 81 { 82 } 83 84 #define init_stack (init_thread_union.stack) 85 86 /* 87 * User space process size: 3GB (default). 88 */ 89 extern unsigned long task_size; 90 91 #define TASK_SIZE (task_size) 92 93 #undef STACK_TOP 94 #undef STACK_TOP_MAX 95 96 extern unsigned long stacksizelim; 97 98 #define STACK_ROOM (stacksizelim) 99 #define STACK_TOP (TASK_SIZE - 2 * PAGE_SIZE) 100 #define STACK_TOP_MAX STACK_TOP 101 102 /* This decides where the kernel will search for a free chunk of vm 103 * space during mmap's. 104 */ 105 #define TASK_UNMAPPED_BASE (0x40000000) 106 107 extern void start_thread(struct pt_regs *regs, unsigned long entry, 108 unsigned long stack); 109 110 struct cpuinfo_um { 111 unsigned long loops_per_jiffy; 112 int ipi_pipe[2]; 113 }; 114 115 extern struct cpuinfo_um boot_cpu_data; 116 117 #define my_cpu_data cpu_data[smp_processor_id()] 118 119 #ifdef CONFIG_SMP 120 extern struct cpuinfo_um cpu_data[]; 121 #define current_cpu_data cpu_data[smp_processor_id()] 122 #else 123 #define cpu_data (&boot_cpu_data) 124 #define current_cpu_data boot_cpu_data 125 #endif 126 127 128 #define KSTK_REG(tsk, reg) get_thread_reg(reg, &tsk->thread.switch_buf) 129 extern unsigned long get_wchan(struct task_struct *p); 130 131 #endif 132