| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.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 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 13 | #include "asm/ptrace.h" | 
|  | 14 | #include "choose-mode.h" | 
| Allan Graves | fad1c45 | 2005-10-04 14:53:52 -0400 | [diff] [blame] | 15 | #include "registers.h" | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 16 |  | 
|  | 17 | struct mm_struct; | 
|  | 18 |  | 
|  | 19 | struct thread_struct { | 
| Paolo 'Blaisorblade' Giarrusso | acef2e5 | 2005-05-01 08:58:56 -0700 | [diff] [blame] | 20 | /* This flag is set to 1 before calling do_fork (and analyzed in | 
|  | 21 | * copy_thread) to mark that we are begin called from userspace (fork / | 
|  | 22 | * vfork / clone), and reset to 0 after. It is left to 0 when called | 
|  | 23 | * from kernelspace (i.e. kernel_thread() or fork_idle(), as of 2.6.11). */ | 
| Jeff Dike | 3eddddc | 2005-09-16 19:27:46 -0700 | [diff] [blame] | 24 | struct task_struct *saved_task; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 25 | int forking; | 
|  | 26 | int nsyscalls; | 
|  | 27 | struct pt_regs regs; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 28 | int singlestep_syscall; | 
|  | 29 | void *fault_addr; | 
|  | 30 | void *fault_catcher; | 
|  | 31 | struct task_struct *prev_sched; | 
|  | 32 | unsigned long temp_stack; | 
|  | 33 | void *exec_buf; | 
|  | 34 | struct arch_thread arch; | 
|  | 35 | union { | 
|  | 36 | #ifdef CONFIG_MODE_TT | 
|  | 37 | struct { | 
|  | 38 | int extern_pid; | 
|  | 39 | int tracing; | 
|  | 40 | int switch_pipe[2]; | 
|  | 41 | int vm_seq; | 
|  | 42 | } tt; | 
|  | 43 | #endif | 
|  | 44 | #ifdef CONFIG_MODE_SKAS | 
|  | 45 | struct { | 
|  | 46 | void *switch_buf; | 
|  | 47 | void *fork_buf; | 
|  | 48 | int mm_count; | 
|  | 49 | } skas; | 
|  | 50 | #endif | 
|  | 51 | } mode; | 
|  | 52 | struct { | 
|  | 53 | int op; | 
|  | 54 | union { | 
|  | 55 | struct { | 
|  | 56 | int pid; | 
|  | 57 | } fork, exec; | 
|  | 58 | struct { | 
|  | 59 | int (*proc)(void *); | 
|  | 60 | void *arg; | 
|  | 61 | } thread; | 
|  | 62 | struct { | 
|  | 63 | void (*proc)(void *); | 
|  | 64 | void *arg; | 
|  | 65 | } cb; | 
|  | 66 | } u; | 
|  | 67 | } request; | 
|  | 68 | }; | 
|  | 69 |  | 
|  | 70 | #define INIT_THREAD \ | 
|  | 71 | { \ | 
|  | 72 | .forking		= 0, \ | 
|  | 73 | .nsyscalls		= 0, \ | 
|  | 74 | .regs		   	= EMPTY_REGS, \ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 75 | .fault_addr		= NULL, \ | 
|  | 76 | .prev_sched		= NULL, \ | 
|  | 77 | .temp_stack		= 0, \ | 
|  | 78 | .exec_buf		= NULL, \ | 
|  | 79 | .arch			= INIT_ARCH_THREAD, \ | 
|  | 80 | .request		= { 0 } \ | 
|  | 81 | } | 
|  | 82 |  | 
|  | 83 | typedef struct { | 
|  | 84 | unsigned long seg; | 
|  | 85 | } mm_segment_t; | 
|  | 86 |  | 
|  | 87 | extern struct task_struct *alloc_task_struct(void); | 
|  | 88 |  | 
|  | 89 | extern void release_thread(struct task_struct *); | 
|  | 90 | extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); | 
| Paolo 'Blaisorblade' Giarrusso | c16993d | 2005-05-01 08:58:54 -0700 | [diff] [blame] | 91 |  | 
|  | 92 | static inline void prepare_to_copy(struct task_struct *tsk) | 
|  | 93 | { | 
|  | 94 | } | 
|  | 95 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 96 |  | 
|  | 97 | extern unsigned long thread_saved_pc(struct task_struct *t); | 
|  | 98 |  | 
|  | 99 | static inline void mm_copy_segments(struct mm_struct *from_mm, | 
|  | 100 | struct mm_struct *new_mm) | 
|  | 101 | { | 
|  | 102 | } | 
|  | 103 |  | 
|  | 104 | #define init_stack	(init_thread_union.stack) | 
|  | 105 |  | 
|  | 106 | /* | 
|  | 107 | * User space process size: 3GB (default). | 
|  | 108 | */ | 
|  | 109 | extern unsigned long task_size; | 
|  | 110 |  | 
|  | 111 | #define TASK_SIZE	(task_size) | 
|  | 112 |  | 
|  | 113 | /* This decides where the kernel will search for a free chunk of vm | 
|  | 114 | * space during mmap's. | 
|  | 115 | */ | 
|  | 116 | #define TASK_UNMAPPED_BASE	(0x40000000) | 
|  | 117 |  | 
|  | 118 | extern void start_thread(struct pt_regs *regs, unsigned long entry, | 
|  | 119 | unsigned long stack); | 
|  | 120 |  | 
|  | 121 | struct cpuinfo_um { | 
|  | 122 | unsigned long loops_per_jiffy; | 
|  | 123 | int ipi_pipe[2]; | 
|  | 124 | }; | 
|  | 125 |  | 
|  | 126 | extern struct cpuinfo_um boot_cpu_data; | 
|  | 127 |  | 
|  | 128 | #define my_cpu_data		cpu_data[smp_processor_id()] | 
|  | 129 |  | 
|  | 130 | #ifdef CONFIG_SMP | 
|  | 131 | extern struct cpuinfo_um cpu_data[]; | 
|  | 132 | #define current_cpu_data cpu_data[smp_processor_id()] | 
|  | 133 | #else | 
|  | 134 | #define cpu_data (&boot_cpu_data) | 
|  | 135 | #define current_cpu_data boot_cpu_data | 
|  | 136 | #endif | 
|  | 137 |  | 
| Allan Graves | fad1c45 | 2005-10-04 14:53:52 -0400 | [diff] [blame] | 138 |  | 
|  | 139 | #ifdef CONFIG_MODE_SKAS | 
|  | 140 | #define KSTK_REG(tsk, reg) \ | 
|  | 141 | ({ union uml_pt_regs regs; \ | 
|  | 142 | get_thread_regs(®s, tsk->thread.mode.skas.switch_buf); \ | 
|  | 143 | UPT_REG(®s, reg); }) | 
|  | 144 | #else | 
|  | 145 | #define KSTK_REG(tsk, reg) (0xbadbabe) | 
|  | 146 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 147 | #define get_wchan(p) (0) | 
|  | 148 |  | 
|  | 149 | #endif |