summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2013-09-18 15:59:31 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-11-21 05:48:19 +0100
commit8d16db0cc28b2d911aee918d5c3582ad29ddfeed (patch)
tree4d957d790ce8a0470ad2dee353d3718a614b7e7d
parentc99cb9e4ab1bd2683759f35a6878a685bf5e8dd7 (diff)
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. * doc/hurd.texi (Server Bootstrap): Update accordingly. * procfs/main.c: Do not hard-code kernel pid, use pids.h instead.
-rw-r--r--doc/hurd.texi2
-rw-r--r--hurd/process.defs6
-rw-r--r--hurd/process_reply.defs2
-rw-r--r--hurd/process_request.defs7
-rw-r--r--include/pids.h7
-rw-r--r--init/init.c2
-rw-r--r--proc/main.c9
-rw-r--r--proc/mgt.c76
-rw-r--r--proc/proc.h8
-rw-r--r--procfs/main.c9
10 files changed, 93 insertions, 35 deletions
diff --git a/doc/hurd.texi b/doc/hurd.texi
index 8fa6da72..697cce79 100644
--- a/doc/hurd.texi
+++ b/doc/hurd.texi
@@ -564,7 +564,7 @@ the root filesystem and the exec server.
The @option{--multiboot-command-line} option tells the file system server that
it is a root filesystem, which triggers it to run @command{/hurd/init} as PID
-1. @command{/hurd/init} starts the @command{/hurd/proc} and
+2. @command{/hurd/init} starts the @command{/hurd/proc} and
@command{/hurd/auth} servers. After the servers are launched
@command{/hurd/init} starts the @command{/libexec/runsystem.sh} script to
finish booting.
diff --git a/hurd/process.defs b/hurd/process.defs
index bf905564..498faba8 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 ed46d55b..80454a6b 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 38e71461..7565f03f 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 22415f4f..dff76359 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 b7b40bd2..6bc6701a 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 73742edd..f1f4e1b0 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 b8aa0fc1..02d69db4 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 a2e3c537..61966971 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);
diff --git a/procfs/main.c b/procfs/main.c
index a620ba1c..629c8490 100644
--- a/procfs/main.c
+++ b/procfs/main.c
@@ -25,6 +25,7 @@
#include <argz.h>
#include <hurd/netfs.h>
#include <ps.h>
+#include <pids.h>
#include "procfs.h"
#include "proclist.h"
#include "rootdir.h"
@@ -42,7 +43,7 @@ uid_t opt_anon_owner;
#define OPT_CLK_TCK sysconf(_SC_CLK_TCK)
#define OPT_STAT_MODE 0400
#define OPT_FAKE_SELF -1
-#define OPT_KERNEL_PID 2
+#define OPT_KERNEL_PID HURD_PID_KERNEL
#define OPT_ANON_OWNER 0
#define NODEV_KEY -1 /* <= 0, so no short option. */
@@ -137,6 +138,8 @@ argp_parser (int key, char *arg, struct argp_state *state)
}
struct argp_option common_options[] = {
+#define STR(X) XSTR (X)
+#define XSTR(X) #X
{ "clk-tck", 'h', "HZ", 0,
"Unit used for the values expressed in system clock ticks "
"(default: sysconf(_SC_CLK_TCK))" },
@@ -153,7 +156,7 @@ struct argp_option common_options[] = {
{ "kernel-process", 'k', "PID", 0,
"Process identifier for the kernel, used to retreive its command "
"line, as well as the global up and idle times. "
- "(default: 2)" },
+ "(default: " STR (OPT_KERNEL_PID) ")" },
{ "compatible", 'c', NULL, 0,
"Try to be compatible with the Linux procps utilities. "
"Currently equivalent to -h 100 -s 0444 -S 1." },
@@ -169,6 +172,8 @@ struct argp_option common_options[] = {
{ "nosuid", NOSUID_KEY, NULL, 0,
"Ignored for compatibility with Linux' procfs." },
{}
+#undef XSTR
+#undef STR
};
struct argp argp = {