1 #ifndef _LINUX__INIT_TASK_H 2 #define _LINUX__INIT_TASK_H 3 4 #include <linux/rcupdate.h> 5 #include <linux/irqflags.h> 6 #include <linux/utsname.h> 7 #include <linux/lockdep.h> 8 #include <linux/ipc.h> 9 #include <linux/pid_namespace.h> 10 #include <linux/user_namespace.h> 11 #include <linux/securebits.h> 12 #include <net/net_namespace.h> 13 14 extern struct files_struct init_files; 15 extern struct fs_struct init_fs; 16 17 #define INIT_KIOCTX(name, which_mm) \ 18 { \ 19 .users = ATOMIC_INIT(1), \ 20 .dead = 0, \ 21 .mm = &which_mm, \ 22 .user_id = 0, \ 23 .next = NULL, \ 24 .wait = __WAIT_QUEUE_HEAD_INITIALIZER(name.wait), \ 25 .ctx_lock = __SPIN_LOCK_UNLOCKED(name.ctx_lock), \ 26 .reqs_active = 0U, \ 27 .max_reqs = ~0U, \ 28 } 29 30 #define INIT_MM(name) \ 31 { \ 32 .mm_rb = RB_ROOT, \ 33 .pgd = swapper_pg_dir, \ 34 .mm_users = ATOMIC_INIT(2), \ 35 .mm_count = ATOMIC_INIT(1), \ 36 .mmap_sem = __RWSEM_INITIALIZER(name.mmap_sem), \ 37 .page_table_lock = __SPIN_LOCK_UNLOCKED(name.page_table_lock), \ 38 .mmlist = LIST_HEAD_INIT(name.mmlist), \ 39 .cpu_vm_mask = CPU_MASK_ALL, \ 40 } 41 42 #define INIT_SIGNALS(sig) { \ 43 .count = ATOMIC_INIT(1), \ 44 .wait_chldexit = __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),\ 45 .shared_pending = { \ 46 .list = LIST_HEAD_INIT(sig.shared_pending.list), \ 47 .signal = {{0}}}, \ 48 .posix_timers = LIST_HEAD_INIT(sig.posix_timers), \ 49 .cpu_timers = INIT_CPU_TIMERS(sig.cpu_timers), \ 50 .rlim = INIT_RLIMITS, \ 51 .cputimer = { \ 52 .cputime = INIT_CPUTIME, \ 53 .running = 0, \ 54 .lock = __SPIN_LOCK_UNLOCKED(sig.cputimer.lock), \ 55 }, \ 56 } 57 58 extern struct nsproxy init_nsproxy; 59 #define INIT_NSPROXY(nsproxy) { \ 60 .pid_ns = &init_pid_ns, \ 61 .count = ATOMIC_INIT(1), \ 62 .uts_ns = &init_uts_ns, \ 63 .mnt_ns = NULL, \ 64 INIT_NET_NS(net_ns) \ 65 INIT_IPC_NS(ipc_ns) \ 66 } 67 68 #define INIT_SIGHAND(sighand) { \ 69 .count = ATOMIC_INIT(1), \ 70 .action = { { { .sa_handler = NULL, } }, }, \ 71 .siglock = __SPIN_LOCK_UNLOCKED(sighand.siglock), \ 72 .signalfd_wqh = __WAIT_QUEUE_HEAD_INITIALIZER(sighand.signalfd_wqh), \ 73 } 74 75 extern struct group_info init_groups; 76 77 #define INIT_STRUCT_PID { \ 78 .count = ATOMIC_INIT(1), \ 79 .tasks = { \ 80 { .first = &init_task.pids[PIDTYPE_PID].node }, \ 81 { .first = &init_task.pids[PIDTYPE_PGID].node }, \ 82 { .first = &init_task.pids[PIDTYPE_SID].node }, \ 83 }, \ 84 .rcu = RCU_HEAD_INIT, \ 85 .level = 0, \ 86 .numbers = { { \ 87 .nr = 0, \ 88 .ns = &init_pid_ns, \ 89 .pid_chain = { .next = NULL, .pprev = NULL }, \ 90 }, } \ 91 } 92 93 #define INIT_PID_LINK(type) \ 94 { \ 95 .node = { \ 96 .next = NULL, \ 97 .pprev = &init_struct_pid.tasks[type].first, \ 98 }, \ 99 .pid = &init_struct_pid, \ 100 } 101 102 #ifdef CONFIG_AUDITSYSCALL 103 #define INIT_IDS \ 104 .loginuid = -1, \ 105 .sessionid = -1, 106 #else 107 #define INIT_IDS 108 #endif 109 110 #ifdef CONFIG_SECURITY_FILE_CAPABILITIES 111 /* 112 * Because of the reduced scope of CAP_SETPCAP when filesystem 113 * capabilities are in effect, it is safe to allow CAP_SETPCAP to 114 * be available in the default configuration. 115 */ 116 # define CAP_INIT_BSET CAP_FULL_SET 117 #else 118 # define CAP_INIT_BSET CAP_INIT_EFF_SET 119 #endif 120 121 extern struct cred init_cred; 122 123 /* 124 * INIT_TASK is used to set up the first task table, touch at 125 * your own risk!. Base=0, limit=0x1fffff (=2MB) 126 */ 127 #define INIT_TASK(tsk) \ 128 { \ 129 .state = 0, \ 130 .stack = &init_thread_info, \ 131 .usage = ATOMIC_INIT(2), \ 132 .flags = PF_KTHREAD, \ 133 .lock_depth = -1, \ 134 .prio = MAX_PRIO-20, \ 135 .static_prio = MAX_PRIO-20, \ 136 .normal_prio = MAX_PRIO-20, \ 137 .policy = SCHED_NORMAL, \ 138 .cpus_allowed = CPU_MASK_ALL, \ 139 .mm = NULL, \ 140 .active_mm = &init_mm, \ 141 .se = { \ 142 .group_node = LIST_HEAD_INIT(tsk.se.group_node), \ 143 }, \ 144 .rt = { \ 145 .run_list = LIST_HEAD_INIT(tsk.rt.run_list), \ 146 .time_slice = HZ, \ 147 .nr_cpus_allowed = NR_CPUS, \ 148 }, \ 149 .tasks = LIST_HEAD_INIT(tsk.tasks), \ 150 .ptraced = LIST_HEAD_INIT(tsk.ptraced), \ 151 .ptrace_entry = LIST_HEAD_INIT(tsk.ptrace_entry), \ 152 .real_parent = &tsk, \ 153 .parent = &tsk, \ 154 .children = LIST_HEAD_INIT(tsk.children), \ 155 .sibling = LIST_HEAD_INIT(tsk.sibling), \ 156 .group_leader = &tsk, \ 157 .real_cred = &init_cred, \ 158 .cred = &init_cred, \ 159 .cred_exec_mutex = \ 160 __MUTEX_INITIALIZER(tsk.cred_exec_mutex), \ 161 .comm = "swapper", \ 162 .thread = INIT_THREAD, \ 163 .fs = &init_fs, \ 164 .files = &init_files, \ 165 .signal = &init_signals, \ 166 .sighand = &init_sighand, \ 167 .nsproxy = &init_nsproxy, \ 168 .pending = { \ 169 .list = LIST_HEAD_INIT(tsk.pending.list), \ 170 .signal = {{0}}}, \ 171 .blocked = {{0}}, \ 172 .alloc_lock = __SPIN_LOCK_UNLOCKED(tsk.alloc_lock), \ 173 .journal_info = NULL, \ 174 .cpu_timers = INIT_CPU_TIMERS(tsk.cpu_timers), \ 175 .fs_excl = ATOMIC_INIT(0), \ 176 .pi_lock = __SPIN_LOCK_UNLOCKED(tsk.pi_lock), \ 177 .timer_slack_ns = 50000, /* 50 usec default slack */ \ 178 .pids = { \ 179 [PIDTYPE_PID] = INIT_PID_LINK(PIDTYPE_PID), \ 180 [PIDTYPE_PGID] = INIT_PID_LINK(PIDTYPE_PGID), \ 181 [PIDTYPE_SID] = INIT_PID_LINK(PIDTYPE_SID), \ 182 }, \ 183 .dirties = INIT_PROP_LOCAL_SINGLE(dirties), \ 184 INIT_IDS \ 185 INIT_TRACE_IRQFLAGS \ 186 INIT_LOCKDEP \ 187 } 188 189 190 #define INIT_CPU_TIMERS(cpu_timers) \ 191 { \ 192 LIST_HEAD_INIT(cpu_timers[0]), \ 193 LIST_HEAD_INIT(cpu_timers[1]), \ 194 LIST_HEAD_INIT(cpu_timers[2]), \ 195 } 196 197 198 #endif 199