blob: 98d01bc4fa92f1267062645e31c9b632f74e2339 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Jeff Dikeba180fd2007-10-16 01:27:00 -07002 * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 * Licensed under the GPL
4 */
5
6#ifndef __UM_PROCESSOR_GENERIC_H
7#define __UM_PROCESSOR_GENERIC_H
8
9struct pt_regs;
10
11struct task_struct;
12
Linus Torvalds1da177e2005-04-16 15:20:36 -070013#include "asm/ptrace.h"
Allan Gravesfad1c452005-10-04 14:53:52 -040014#include "registers.h"
Jeff Dike3c917352006-09-27 01:50:40 -070015#include "sysdep/archsetjmp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070016
Richard Weinberger607647a2011-05-24 17:13:03 -070017#include <linux/prefetch.h>
18
Linus Torvalds1da177e2005-04-16 15:20:36 -070019struct mm_struct;
20
21struct thread_struct {
Jeff Dikeba180fd2007-10-16 01:27:00 -070022 struct task_struct *saved_task;
23 /*
24 * This flag is set to 1 before calling do_fork (and analyzed in
Paolo 'Blaisorblade' Giarrussoacef2e52005-05-01 08:58:56 -070025 * 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
Jeff Dikeba180fd2007-10-16 01:27:00 -070027 * from kernelspace (i.e. kernel_thread() or fork_idle(),
28 * as of 2.6.11).
29 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070030 int forking;
Linus Torvalds1da177e2005-04-16 15:20:36 -070031 struct pt_regs regs;
Linus Torvalds1da177e2005-04-16 15:20:36 -070032 int singlestep_syscall;
33 void *fault_addr;
Jeff Dikefab95c52007-10-16 01:27:05 -070034 jmp_buf *fault_catcher;
Linus Torvalds1da177e2005-04-16 15:20:36 -070035 struct task_struct *prev_sched;
36 unsigned long temp_stack;
Jeff Dikefab95c52007-10-16 01:27:05 -070037 jmp_buf *exec_buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -070038 struct arch_thread arch;
Jeff Dike77bf4402007-10-16 01:26:58 -070039 jmp_buf switch_buf;
40 int mm_count;
Linus Torvalds1da177e2005-04-16 15:20:36 -070041 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, \
Jeff Dikeba180fd2007-10-16 01:27:00 -070062 .regs = EMPTY_REGS, \
Linus Torvalds1da177e2005-04-16 15:20:36 -070063 .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
Eric Dumazet504f52b2011-03-22 16:30:41 -070071extern struct task_struct *alloc_task_struct_node(int node);
Linus Torvalds1da177e2005-04-16 15:20:36 -070072
Jeff Dike77bf4402007-10-16 01:26:58 -070073static inline void release_thread(struct task_struct *task)
74{
75}
76
Linus Torvalds1da177e2005-04-16 15:20:36 -070077extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
Paolo 'Blaisorblade' Giarrussoc16993d2005-05-01 08:58:54 -070078
79static inline void prepare_to_copy(struct task_struct *tsk)
80{
81}
82
Linus Torvalds1da177e2005-04-16 15:20:36 -070083
84extern unsigned long thread_saved_pc(struct task_struct *t);
85
86static 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 */
Jeff Dike536788f2008-02-08 04:22:07 -080096extern unsigned long task_size;
97
98#define TASK_SIZE (task_size)
Linus Torvalds1da177e2005-04-16 15:20:36 -070099
David Howells922a70d2008-02-08 04:19:26 -0800100#undef STACK_TOP
101#undef STACK_TOP_MAX
102
103extern 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
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109/* 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
114extern void start_thread(struct pt_regs *regs, unsigned long entry,
115 unsigned long stack);
116
117struct cpuinfo_um {
118 unsigned long loops_per_jiffy;
119 int ipi_pipe[2];
120};
121
122extern struct cpuinfo_um boot_cpu_data;
123
124#define my_cpu_data cpu_data[smp_processor_id()]
125
126#ifdef CONFIG_SMP
127extern 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
Allan Gravesfad1c452005-10-04 14:53:52 -0400134
Jeff Dike77bf4402007-10-16 01:26:58 -0700135#define KSTK_REG(tsk, reg) get_thread_reg(reg, &tsk->thread.switch_buf)
Jeff Dikec1127462008-02-04 22:30:36 -0800136extern unsigned long get_wchan(struct task_struct *p);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700137
138#endif