summaryrefslogtreecommitdiff
path: root/debian/patches/0002-Add-proc_set_init_task-make-runsystem-pid-1.patch
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2014-09-02 23:18:57 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-09-02 23:18:57 +0200
commitb729fbad76622a759c97013989a7df489addfde8 (patch)
tree0ce7b316d031d0d9925215e8b0f5b968df62939a /debian/patches/0002-Add-proc_set_init_task-make-runsystem-pid-1.patch
parenta4a8673373d080d6947a7a026af0ec9932ce96f1 (diff)
add patch series
Diffstat (limited to 'debian/patches/0002-Add-proc_set_init_task-make-runsystem-pid-1.patch')
-rw-r--r--debian/patches/0002-Add-proc_set_init_task-make-runsystem-pid-1.patch327
1 files changed, 327 insertions, 0 deletions
diff --git a/debian/patches/0002-Add-proc_set_init_task-make-runsystem-pid-1.patch b/debian/patches/0002-Add-proc_set_init_task-make-runsystem-pid-1.patch
new file mode 100644
index 00000000..7de211d8
--- /dev/null
+++ b/debian/patches/0002-Add-proc_set_init_task-make-runsystem-pid-1.patch
@@ -0,0 +1,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
+