1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
|
From 19405120ae3c3897bad0d458df0818e015f017ab Mon Sep 17 00:00:00 2001
From: Justus Winter <4winter@informatik.uni-hamburg.de>
Date: Wed, 18 Sep 2013 15:59:31 +0200
Subject: [PATCH 2/8] Add proc_set_init_task, make runsystem pid 1
* hurd/process.defs (proc_set_init_task): New procedure.
* hurd/process_reply.defs (proc_set_init_task): Likewise.
* hurd/process_request.defs (proc_set_init_task): Likewise.
* include/pids.h: Add HURD_PID_INIT as 1, adjust others accordingly.
* init/init.c (start_child): Register the child task.
* proc/proc.h (init_proc): New variable.
(create_startup_proc): Rename to create_init_proc.
* proc/main.c (main): Create placeholder proc object for pid 1.
* proc/mgt.c: Use init_proc instead of startup_proc, as the former is
the new root of the process tree.
(create_startup_proc): Rename to create_init_proc.
(S_proc_set_init_task): New function.
---
hurd/process.defs | 6 +++-
hurd/process_reply.defs | 2 +-
hurd/process_request.defs | 7 ++++-
include/pids.h | 7 +++--
init/init.c | 2 +-
proc/main.c | 9 ++++--
proc/mgt.c | 76 ++++++++++++++++++++++++++++++++++-------------
proc/proc.h | 8 +++--
8 files changed, 85 insertions(+), 32 deletions(-)
diff --git a/hurd/process.defs b/hurd/process.defs
index bf90556..498faba 100644
--- a/hurd/process.defs
+++ b/hurd/process.defs
@@ -373,7 +373,11 @@ routine proc_getnports (
/*** Routines related to early server bootstrapping ***/
-skip; /* Reserved for proc_set_init_task */
+/* Set the task of process HURD_PID_INIT. Only the startup process
+ HURD_PID_STARTUP may use this interface. */
+routine proc_set_init_task (
+ process: process_t;
+ task: task_t);
/* Inform the process server that the process is important. */
routine proc_mark_important (
diff --git a/hurd/process_reply.defs b/hurd/process_reply.defs
index ed46d55..80454a6 100644
--- a/hurd/process_reply.defs
+++ b/hurd/process_reply.defs
@@ -177,7 +177,7 @@ simpleroutine proc_getnports_reply (
/*** Routines related to early server bootstrapping ***/
-skip; /* Reserved for proc_set_init_task */
+skip; /* proc_set_init_task */
skip; /* proc_mark_important */
simpleroutine proc_is_important_reply (
diff --git a/hurd/process_request.defs b/hurd/process_request.defs
index 38e7146..7565f03 100644
--- a/hurd/process_request.defs
+++ b/hurd/process_request.defs
@@ -374,7 +374,12 @@ simpleroutine proc_getnports_request (
/*** Routines related to early server bootstrapping ***/
-skip; /* Reserved for proc_set_init_task */
+/* Set the task of process HURD_PID_INIT. Only the startup process
+ HURD_PID_STARTUP may use this interface. */
+simpleroutine proc_set_init_task_request (
+ process: process_t;
+ ureplyport reply: reply_port_t;
+ task: task_t);
/* Inform the process server that the process is important. */
simpleroutine proc_mark_important_request (
diff --git a/include/pids.h b/include/pids.h
index 22415f4..dff7635 100644
--- a/include/pids.h
+++ b/include/pids.h
@@ -22,8 +22,9 @@
#ifndef _HURD_PROCESSES_H
#define _HURD_PROCESSES_H
-#define HURD_PID_STARTUP 1
-#define HURD_PID_KERNEL 2
-#define HURD_PID_PROC 3
+#define HURD_PID_INIT 1
+#define HURD_PID_STARTUP 2
+#define HURD_PID_KERNEL 3
+#define HURD_PID_PROC 4
#endif /* _HURD_PROCESSES_H */
diff --git a/init/init.c b/init/init.c
index b7b40bd..6bc6701 100644
--- a/init/init.c
+++ b/init/init.c
@@ -1058,7 +1058,7 @@ start_child (const char *prog, char **progargs)
NULL, 0, /* OSF Mach */
#endif
0, &child_task);
- proc_child (procserver, child_task);
+ proc_set_init_task (procserver, child_task);
proc_task2pid (procserver, child_task, &child_pid);
proc_task2proc (procserver, child_task, &default_ports[INIT_PORT_PROC]);
diff --git a/proc/main.c b/proc/main.c
index 73742ed..f1f4e1b 100644
--- a/proc/main.c
+++ b/proc/main.c
@@ -1,5 +1,5 @@
/* Initialization of the proc server
- Copyright (C) 1993,94,95,96,97,99,2000,01 Free Software Foundation, Inc.
+ Copyright (C) 1993,94,95,96,97,99,2000,01,13 Free Software Foundation, Inc.
This file is part of the GNU Hurd.
@@ -88,7 +88,12 @@ main (int argc, char **argv, char **envp)
generic_port = ports_get_right (genport);
/* Create the initial proc object for init (PID 1). */
- startup_proc = create_startup_proc ();
+ init_proc = create_init_proc ();
+
+ /* Create the startup proc object for /hurd/init (PID 2). */
+ startup_proc = allocate_proc (MACH_PORT_NULL);
+ startup_proc->p_deadmsg = 1;
+ complete_proc (startup_proc, HURD_PID_STARTUP);
/* Create our own proc object. */
self_proc = allocate_proc (mach_task_self ());
diff --git a/proc/mgt.c b/proc/mgt.c
index b8aa0fc..02d69db 100644
--- a/proc/mgt.c
+++ b/proc/mgt.c
@@ -1,5 +1,6 @@
/* Process management
- Copyright (C) 1992,93,94,95,96,99,2000,01,02 Free Software Foundation, Inc.
+ Copyright (C) 1992,93,94,95,96,99,2000,01,02,13
+ Free Software Foundation, Inc.
This file is part of the GNU Hurd.
@@ -184,7 +185,7 @@ S_proc_child (struct proc *parentp,
/* Process hierarchy. Remove from our current location
and place us under our new parent. Sanity check to make sure
parent is currently init. */
- assert (childp->p_parent == startup_proc);
+ assert (childp->p_parent == init_proc);
if (childp->p_sib)
childp->p_sib->p_prevsib = childp->p_prevsib;
*childp->p_prevsib = childp->p_sib;
@@ -586,7 +587,7 @@ allocate_proc (task_t task)
/* Allocate and initialize the proc structure for init (PID 1),
the original parent of all other procs. */
struct proc *
-create_startup_proc (void)
+create_init_proc (void)
{
static const uid_t zero;
struct proc *p;
@@ -595,7 +596,7 @@ create_startup_proc (void)
p = allocate_proc (MACH_PORT_NULL);
assert (p);
- p->p_pid = HURD_PID_STARTUP;
+ p->p_pid = HURD_PID_INIT;
p->p_parent = p;
p->p_sib = 0;
@@ -643,7 +644,7 @@ proc_death_notify (struct proc *p)
}
/* Complete a new process that has been allocated but not entirely initialized.
- This gets called for every process except startup_proc (PID 1). */
+ This gets called for every process except init_proc (PID 1). */
void
complete_proc (struct proc *p, pid_t pid)
{
@@ -662,30 +663,47 @@ complete_proc (struct proc *p, pid_t pid)
p->p_pid = pid;
- ids_ref (&nullids);
- p->p_id = &nullids;
+ if (pid == HURD_PID_STARTUP)
+ {
+ /* Equip HURD_PID_STARTUP with the same credentials as
+ HURD_PID_INIT. */
+ static const uid_t zero;
+ p->p_id = make_ids (&zero, 1);
+ assert (p->p_id);
+ }
+ else
+ {
+ ids_ref (&nullids);
+ p->p_id = &nullids;
+ }
p->p_login = nulllogin;
p->p_login->l_refcnt++;
/* Our parent is init for now. */
- p->p_parent = startup_proc;
+ p->p_parent = init_proc;
- p->p_sib = startup_proc->p_ochild;
- p->p_prevsib = &startup_proc->p_ochild;
+ p->p_sib = init_proc->p_ochild;
+ p->p_prevsib = &init_proc->p_ochild;
if (p->p_sib)
p->p_sib->p_prevsib = &p->p_sib;
- startup_proc->p_ochild = p;
+ init_proc->p_ochild = p;
p->p_loginleader = 0;
p->p_ochild = 0;
p->p_parentset = 0;
p->p_noowner = 1;
- p->p_pgrp = startup_proc->p_pgrp;
+ p->p_pgrp = init_proc->p_pgrp;
- proc_death_notify (p);
- add_proc_to_hash (p);
+ /* At this point, we do not know the task of the startup process,
+ defer registering death notifications and adding it to the hash
+ tables. */
+ if (pid != HURD_PID_STARTUP)
+ {
+ proc_death_notify (p);
+ add_proc_to_hash (p);
+ }
join_pgrp (p);
}
@@ -747,7 +765,7 @@ process_has_exited (struct proc *p)
nowait_msg_proc_newids (tp->p_msgport, tp->p_task,
1, tp->p_pgrp->pg_pgid,
!tp->p_pgrp->pg_orphcnt);
- tp->p_parent = startup_proc;
+ tp->p_parent = init_proc;
if (tp->p_dead)
isdead = 1;
}
@@ -755,17 +773,17 @@ process_has_exited (struct proc *p)
nowait_msg_proc_newids (tp->p_msgport, tp->p_task,
1, tp->p_pgrp->pg_pgid,
!tp->p_pgrp->pg_orphcnt);
- tp->p_parent = startup_proc;
+ tp->p_parent = init_proc;
/* And now append the lists. */
- tp->p_sib = startup_proc->p_ochild;
+ tp->p_sib = init_proc->p_ochild;
if (tp->p_sib)
tp->p_sib->p_prevsib = &tp->p_sib;
- startup_proc->p_ochild = p->p_ochild;
- p->p_ochild->p_prevsib = &startup_proc->p_ochild;
+ init_proc->p_ochild = p->p_ochild;
+ p->p_ochild->p_prevsib = &init_proc->p_ochild;
if (isdead)
- alert_parent (startup_proc);
+ alert_parent (init_proc);
}
/* If an operation is in progress for this process, cause it
@@ -883,6 +901,24 @@ genpid ()
return nextpid++;
}
+/* Implement proc_set_init_task as described in <hurd/process.defs>. */
+error_t
+S_proc_set_init_task(struct proc *callerp,
+ task_t task)
+{
+ if (! callerp)
+ return EOPNOTSUPP;
+
+ if (callerp != startup_proc)
+ return EPERM;
+
+ init_proc->p_task = task;
+ proc_death_notify (init_proc);
+ add_proc_to_hash (init_proc);
+
+ return 0;
+}
+
/* Implement proc_mark_important as described in <hurd/process.defs>. */
kern_return_t
S_proc_mark_important (struct proc *p)
diff --git a/proc/proc.h b/proc/proc.h
index a2e3c53..6196697 100644
--- a/proc/proc.h
+++ b/proc/proc.h
@@ -1,5 +1,6 @@
/* Process server definitions
- Copyright (C) 1992,93,94,95,96,99,2000,01 Free Software Foundation, Inc.
+ Copyright (C) 1992,93,94,95,96,99,2000,01,13
+ Free Software Foundation, Inc.
This file is part of the GNU Hurd.
@@ -134,7 +135,8 @@ struct exc
mach_port_t authserver;
struct proc *self_proc; /* process HURD_PID_PROC (us) */
-struct proc *startup_proc; /* process 1 (init) */
+struct proc *init_proc; /* process 1 (sysvinit) */
+struct proc *startup_proc; /* process 2 (hurd/init) */
struct port_bucket *proc_bucket;
struct port_class *proc_class;
@@ -183,7 +185,7 @@ void exc_clean (void *);
struct proc *add_tasks (task_t);
int pidfree (pid_t);
-struct proc *create_startup_proc (void);
+struct proc *create_init_proc (void);
struct proc *allocate_proc (task_t);
void proc_death_notify (struct proc *);
void complete_proc (struct proc *, pid_t);
--
2.1.0
|