xref: /linux/arch/um/include/asm/processor-generic.h (revision 9429ec96c2718c0d1e3317cf60a87a0405223814)
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 	struct pt_regs regs;
24 	int singlestep_syscall;
25 	void *fault_addr;
26 	jmp_buf *fault_catcher;
27 	struct task_struct *prev_sched;
28 	unsigned long temp_stack;
29 	jmp_buf *exec_buf;
30 	struct arch_thread arch;
31 	jmp_buf switch_buf;
32 	int mm_count;
33 	struct {
34 		int op;
35 		union {
36 			struct {
37 				int pid;
38 			} fork, exec;
39 			struct {
40 				int (*proc)(void *);
41 				void *arg;
42 			} thread;
43 			struct {
44 				void (*proc)(void *);
45 				void *arg;
46 			} cb;
47 		} u;
48 	} request;
49 };
50 
51 #define INIT_THREAD \
52 { \
53 	.regs		   	= EMPTY_REGS,	\
54 	.fault_addr		= NULL, \
55 	.prev_sched		= NULL, \
56 	.temp_stack		= 0, \
57 	.exec_buf		= NULL, \
58 	.arch			= INIT_ARCH_THREAD, \
59 	.request		= { 0 } \
60 }
61 
62 static inline void release_thread(struct task_struct *task)
63 {
64 }
65 
66 extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
67 
68 extern unsigned long thread_saved_pc(struct task_struct *t);
69 
70 static inline void mm_copy_segments(struct mm_struct *from_mm,
71 				    struct mm_struct *new_mm)
72 {
73 }
74 
75 #define init_stack	(init_thread_union.stack)
76 
77 /*
78  * User space process size: 3GB (default).
79  */
80 extern unsigned long task_size;
81 
82 #define TASK_SIZE (task_size)
83 
84 #undef STACK_TOP
85 #undef STACK_TOP_MAX
86 
87 extern unsigned long stacksizelim;
88 
89 #define STACK_ROOM	(stacksizelim)
90 #define STACK_TOP	(TASK_SIZE - 2 * PAGE_SIZE)
91 #define STACK_TOP_MAX	STACK_TOP
92 
93 /* This decides where the kernel will search for a free chunk of vm
94  * space during mmap's.
95  */
96 #define TASK_UNMAPPED_BASE	(0x40000000)
97 
98 extern void start_thread(struct pt_regs *regs, unsigned long entry,
99 			 unsigned long stack);
100 
101 struct cpuinfo_um {
102 	unsigned long loops_per_jiffy;
103 	int ipi_pipe[2];
104 };
105 
106 extern struct cpuinfo_um boot_cpu_data;
107 
108 #define my_cpu_data		cpu_data[smp_processor_id()]
109 
110 #ifdef CONFIG_SMP
111 extern struct cpuinfo_um cpu_data[];
112 #define current_cpu_data cpu_data[smp_processor_id()]
113 #else
114 #define cpu_data (&boot_cpu_data)
115 #define current_cpu_data boot_cpu_data
116 #endif
117 
118 
119 #define KSTK_REG(tsk, reg) get_thread_reg(reg, &tsk->thread.switch_buf)
120 extern unsigned long get_wchan(struct task_struct *p);
121 
122 #endif
123