--- olpc-2.6-master.00/arch/alpha/kernel/entry.S 2007-02-28 20:05:25.000000000 -0500 +++ olpc-2.6-master-vs22x.02/arch/alpha/kernel/entry.S 2007-03-01 11:52:20.000000000 -0500 @@ -873,24 +873,15 @@ sys_getxgid: .globl sys_getxpid .ent sys_getxpid sys_getxpid: + lda $sp, -16($sp) + stq $26, 0($sp) .prologue 0 - ldq $2, TI_TASK($8) - /* See linux/kernel/timer.c sys_getppid for discussion - about this loop. */ - ldq $3, TASK_GROUP_LEADER($2) - ldq $4, TASK_REAL_PARENT($3) - ldl $0, TASK_TGID($2) -1: ldl $1, TASK_TGID($4) -#ifdef CONFIG_SMP - mov $4, $5 - mb - ldq $3, TASK_GROUP_LEADER($2) - ldq $4, TASK_REAL_PARENT($3) - cmpeq $4, $5, $5 - beq $5, 1b -#endif - stq $1, 80($sp) + lda $16, 96($sp) + jsr $26, do_getxpid + ldq $26, 0($sp) + + lda $sp, 16($sp) ret .end sys_getxpid --- olpc-2.6-master.00/arch/sh/kernel/kgdb_stub.c 2007-02-28 20:05:26.000000000 -0500 +++ olpc-2.6-master-vs22x.02/arch/sh/kernel/kgdb_stub.c 2007-03-01 11:52:20.000000000 -0500 @@ -389,7 +389,7 @@ static struct task_struct *get_thread(in if (pid == PID_MAX) pid = 0; /* First check via PID */ - thread = find_task_by_pid(pid); + thread = find_task_by_real_pid(pid); if (thread) return thread; --- olpc-2.6-master.00/fs/proc/array.c 2007-02-28 20:05:28.000000000 -0500 +++ olpc-2.6-master-vs22x.02/fs/proc/array.c 2007-03-01 17:09:59.000000000 -0500 @@ -161,8 +165,16 @@ static inline char * task_state(struct t struct group_info *group_info; int g; struct fdtable *fdt = NULL; + pid_t pid, ptgid, tppid, tgid; rcu_read_lock(); + tgid = vx_map_tgid(p->tgid); + pid = vx_map_pid(p->pid); + ptgid = vx_map_pid(pid_alive(p) ? + rcu_dereference(p->real_parent)->tgid : 0); + tppid = vx_map_pid(pid_alive(p) && p->ptrace ? + rcu_dereference(p->parent)->pid : 0); + buffer += sprintf(buffer, "State:\t%s\n" "SleepAVG:\t%lu%%\n" --- olpc-2.6-master.00/fs/proc/array.c 2007-02-28 20:05:28.000000000 -0500 +++ olpc-2.6-master-vs22x.02/fs/proc/array.c 2007-03-01 17:09:59.000000000 -0500 @@ -174,9 +186,7 @@ static inline char * task_state(struct t "Gid:\t%d\t%d\t%d\t%d\n", get_task_state(p), (p->sleep_avg/1024)*100/(1020000000/1024), - p->tgid, p->pid, - pid_alive(p) ? rcu_dereference(p->real_parent)->tgid : 0, - pid_alive(p) && p->ptrace ? rcu_dereference(p->parent)->pid : 0, + tgid, pid, (pid > 1) ? ptgid : 0, tppid, p->uid, p->euid, p->suid, p->fsuid, p->gid, p->egid, p->sgid, p->fsgid); --- olpc-2.6-master.00/fs/proc/array.c 2007-02-28 20:05:28.000000000 -0500 +++ olpc-2.6-master-vs22x.02/fs/proc/array.c 2007-03-01 17:09:59.000000000 -0500 @@ -320,7 +339,7 @@ static int do_task_stat(struct task_stru sigset_t sigign, sigcatch; char state; int res; - pid_t ppid = 0, pgid = -1, sid = -1; + pid_t pid = 0, ppid = 0, pgid = -1, sid = -1; int num_threads = 0; struct mm_struct *mm; unsigned long long start_time; --- olpc-2.6-master.00/fs/proc/array.c 2007-02-28 20:05:28.000000000 -0500 +++ olpc-2.6-master-vs22x.02/fs/proc/array.c 2007-03-01 17:09:59.000000000 -0500 @@ -382,8 +401,10 @@ static int do_task_stat(struct task_stru } sid = signal_session(sig); - pgid = process_group(task); - ppid = rcu_dereference(task->real_parent)->tgid; + pid = vx_info_map_pid(task->vx_info, task->pid); + pgid = vx_info_map_pid(task->vx_info, process_group(task)); + ppid = (pid > 1) ? vx_info_map_tgid(task->vx_info, + rcu_dereference(task->real_parent)->tgid) : 0; unlock_task_sighand(task, &flags); } --- olpc-2.6-master.00/fs/proc/array.c 2007-02-28 20:05:28.000000000 -0500 +++ olpc-2.6-master-vs22x.02/fs/proc/array.c 2007-03-01 17:09:59.000000000 -0500 @@ -413,7 +445,7 @@ ***** res = sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \ %lu %lu %lu %lu %lu %ld %ld %ld %ld %d 0 %llu %lu %ld %lu %lu %lu %lu %lu \ %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu %llu\n", - task->pid, + pid, tcomm, state, ppid, --- olpc-2.6-master.00/fs/proc/base.c 2007-02-28 20:05:28.000000000 -0500 +++ olpc-2.6-master-vs22x.02/fs/proc/base.c 2007-03-01 17:09:59.000000000 -0500 @@ -2022,7 +2046,7 @@ struct dentry *proc_pid_lookup(struct in goto out; rcu_read_lock(); - task = find_task_by_pid(tgid); + task = vx_find_proc_task_by_pid(tgid); if (task) get_task_struct(task); rcu_read_unlock(); --- olpc-2.6-master.00/fs/proc/base.c 2007-02-28 20:05:28.000000000 -0500 +++ olpc-2.6-master-vs22x.02/fs/proc/base.c 2007-03-01 17:09:59.000000000 -0500 @@ -2229,9 +2256,11 @@ static struct dentry *proc_task_lookup(s tid = name_to_int(dentry); if (tid == ~0U) goto out; + if (vx_current_initpid(tid)) + goto out; rcu_read_lock(); - task = find_task_by_pid(tid); + task = vx_find_proc_task_by_pid(tid); if (task) get_task_struct(task); rcu_read_unlock(); --- olpc-2.6-master.00/include/linux/pid.h 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/include/linux/pid.h 2007-03-01 12:00:11.000000000 -0500 @@ -8,7 +8,8 @@ enum pid_type PIDTYPE_PID, PIDTYPE_PGID, PIDTYPE_SID, - PIDTYPE_MAX + PIDTYPE_MAX, + PIDTYPE_REALPID }; /* --- olpc-2.6-master.00/include/linux/pid.h 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/include/linux/pid.h 2007-03-01 12:00:11.000000000 -0500 @@ -110,7 +111,8 @@ static inline pid_t pid_nr(struct pid *p struct hlist_node *pos___; \ if (pid != NULL) \ hlist_for_each_entry_rcu((task), pos___, \ - &pid->tasks[type], pids[type].node) { + &pid->tasks[type], pids[type].node) \ + if (vx_check((task)->xid, VS_WATCH_P|VS_IDENT)) { #define while_each_pid_task(pid, type, task) \ } \ --- olpc-2.6-master.00/include/linux/sched.h 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/include/linux/sched.h 2007-03-01 11:52:20.000000000 -0500 @@ -1265,7 +1281,11 @@ extern struct task_struct init_task; extern struct mm_struct init_mm; -#define find_task_by_pid(nr) find_task_by_pid_type(PIDTYPE_PID, nr) +#define find_task_by_real_pid(nr) \ + find_task_by_pid_type(PIDTYPE_REALPID, nr) +#define find_task_by_pid(nr) \ + find_task_by_pid_type(PIDTYPE_PID, nr) + extern struct task_struct *find_task_by_pid_type(int type, int pid); extern void __set_special_pids(pid_t session, pid_t pgrp); --- olpc-2.6-master.00/kernel/exit.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/exit.c 2007-03-01 11:52:20.000000000 -0500 @@ -585,6 +592,14 @@ static void exit_mm(struct task_struct * static inline void choose_new_parent(struct task_struct *p, struct task_struct *reaper) { + /* check for reaper context */ + vxwprintk((p->xid != reaper->xid) && (reaper != child_reaper(p)), + "rogue reaper: %p[%d,#%u] <> %p[%d,#%u]", + p, p->pid, p->xid, reaper, reaper->pid, reaper->xid); + + if (p == reaper) + reaper = vx_child_reaper(p); + /* * Make sure we're not reparenting to ourselves and that * the parent is not a zombie. --- olpc-2.6-master.00/kernel/exit.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/exit.c 2007-03-01 11:52:20.000000000 -0500 @@ -676,7 +691,8 @@ forget_original_parent(struct task_struc do { reaper = next_thread(reaper); if (reaper == father) { - reaper = child_reaper(father); + // reaper = child_reaper(father); + reaper = vx_child_reaper(father); break; } } while (reaper->exit_state); --- olpc-2.6-master.00/kernel/kthread.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/kthread.c 2007-03-01 11:52:20.000000000 -0500 @@ -126,7 +126,7 @@ static void keventd_create_kthread(struc } else { wait_for_completion(&create->started); read_lock(&tasklist_lock); - create->result = find_task_by_pid(pid); + create->result = find_task_by_real_pid(pid); read_unlock(&tasklist_lock); } complete(&create->done); --- olpc-2.6-master.00/kernel/pid.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/pid.c 2007-03-01 12:00:11.000000000 -0500 @@ -290,6 +291,9 @@ void fastcall transfer_pid(struct task_s struct task_struct * fastcall pid_task(struct pid *pid, enum pid_type type) { struct task_struct *result = NULL; + + if (type == PIDTYPE_REALPID) + type = PIDTYPE_PID; if (pid) { struct hlist_node *first; first = rcu_dereference(pid->tasks[type].first); --- olpc-2.6-master.00/kernel/pid.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/pid.c 2007-03-01 12:00:11.000000000 -0500 @@ -304,7 +308,17 @@ struct task_struct * fastcall pid_task(s */ struct task_struct *find_task_by_pid_type(int type, int nr) { - return pid_task(find_pid(nr), type); + struct task_struct *task; + + if (type == PIDTYPE_PID) + nr = vx_rmap_pid(nr); + + task = pid_task(find_pid(nr), type); + if (task && (type != PIDTYPE_REALPID) && + /* maybe VS_WATCH_P in the future? */ + !vx_check(task->xid, VS_WATCH|VS_IDENT)) + return NULL; + return task; } EXPORT_SYMBOL(find_task_by_pid_type); --- olpc-2.6-master.00/kernel/posix-timers.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/posix-timers.c 2007-03-01 11:52:20.000000000 -0500 @@ -372,7 +381,7 @@ static struct task_struct * good_sigeven struct task_struct *rtn = current->group_leader; if ((event->sigev_notify & SIGEV_THREAD_ID ) && - (!(rtn = find_task_by_pid(event->sigev_notify_thread_id)) || + (!(rtn = find_task_by_real_pid(event->sigev_notify_thread_id)) || rtn->tgid != current->tgid || (event->sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_SIGNAL)) return NULL; --- olpc-2.6-master.00/kernel/signal.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/signal.c 2007-03-01 11:52:20.000000000 -0500 @@ -1892,6 +1911,11 @@ relock: if (current == child_reaper(current)) continue; + /* virtual init is protected against user signals */ + if ((info->si_code == SI_USER) && + vx_current_initpid(current->pid)) + continue; + if (sig_kernel_stop(signr)) { /* * The default action is to stop all threads in --- olpc-2.6-master.00/kernel/sys.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/sys.c 2007-03-01 11:52:20.000000000 -0500 @@ -1371,6 +1384,7 @@ asmlinkage long sys_setpgid(pid_t pid, p { struct task_struct *p; struct task_struct *group_leader = current->group_leader; + pid_t rpgid; int err = -EINVAL; if (!pid) --- olpc-2.6-master.00/kernel/sys.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/sys.c 2007-03-01 11:52:20.000000000 -0500 @@ -1374,7 +1388,7 @@ ***** int err = -EINVAL; if (!pid) - pid = group_leader->pid; + pid = vx_map_pid(group_leader->pid); if (!pgid) pgid = pid; if (pgid < 0) --- olpc-2.6-master.00/kernel/sys.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/sys.c 2007-03-01 11:52:20.000000000 -0500 @@ -1380,6 +1394,8 @@ ***** if (pgid < 0) return -EINVAL; + rpgid = vx_rmap_pid(pgid); + /* From this point forward we keep holding onto the tasklist lock * so that our parent does not change from under us. -DaveM */ --- olpc-2.6-master.00/kernel/sys.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/sys.c 2007-03-01 11:52:20.000000000 -0500 @@ -1413,7 +1429,7 @@ asmlinkage long sys_setpgid(pid_t pid, p if (pgid != pid) { struct task_struct *g = - find_task_by_pid_type(PIDTYPE_PGID, pgid); + find_task_by_pid_type(PIDTYPE_PGID, rpgid); if (!g || task_session(g) != task_session(group_leader)) goto out; --- olpc-2.6-master.00/kernel/sys.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/sys.c 2007-03-01 11:52:20.000000000 -0500 @@ -1419,7 +1435,7 @@ ***** goto out; } - err = security_task_setpgid(p, pgid); + err = security_task_setpgid(p, rpgid); if (err) goto out; --- olpc-2.6-master.00/kernel/sys.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/sys.c 2007-03-01 11:52:20.000000000 -0500 @@ -1423,10 +1439,10 @@ ***** if (err) goto out; - if (process_group(p) != pgid) { + if (process_group(p) != rpgid) { detach_pid(p, PIDTYPE_PGID); - p->signal->pgrp = pgid; - attach_pid(p, PIDTYPE_PGID, pgid); + p->signal->pgrp = rpgid; + attach_pid(p, PIDTYPE_PGID, rpgid); } err = 0; --- olpc-2.6-master.00/kernel/sys.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/sys.c 2007-03-01 11:52:20.000000000 -0500 @@ -1439,7 +1455,7 @@ out: asmlinkage long sys_getpgid(pid_t pid) { if (!pid) - return process_group(current); + return vx_rmap_pid(process_group(current)); else { int retval; struct task_struct *p; --- olpc-2.6-master.00/kernel/sys.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/sys.c 2007-03-01 11:52:20.000000000 -0500 @@ -1451,7 +1467,7 @@ asmlinkage long sys_getpgid(pid_t pid) if (p) { retval = security_task_getpgid(p); if (!retval) - retval = process_group(p); + retval = vx_rmap_pid(process_group(p)); } read_unlock(&tasklist_lock); return retval; --- olpc-2.6-master.00/kernel/timer.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/timer.c 2007-03-01 11:52:20.000000000 -0500 @@ -1304,12 +1308,6 @@ asmlinkage unsigned long sys_alarm(unsig #endif -#ifndef __alpha__ - -/* - * The Alpha uses getxpid, getxuid, and getxgid instead. Maybe this - * should be moved into arch/i386 instead? - */ /** * sys_getpid - return the thread group id of the current process --- olpc-2.6-master.00/kernel/timer.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/timer.c 2007-03-01 11:52:20.000000000 -0500 @@ -1322,7 +1320,7 @@ asmlinkage unsigned long sys_alarm(unsig */ asmlinkage long sys_getpid(void) { - return current->tgid; + return vx_map_tgid(current->tgid); } /* --- olpc-2.6-master.00/kernel/timer.c 2007-02-28 20:05:29.000000000 -0500 +++ olpc-2.6-master-vs22x.02/kernel/timer.c 2007-03-01 11:52:20.000000000 -0500 @@ -1338,10 +1336,23 @@ asmlinkage long sys_getppid(void) rcu_read_lock(); pid = rcu_dereference(current->real_parent)->tgid; rcu_read_unlock(); + return vx_map_pid(pid); +} - return pid; +#ifdef __alpha__ + +/* + * The Alpha uses getxpid, getxuid, and getxgid instead. + */ + +asmlinkage long do_getxpid(long *ppid) +{ + *ppid = sys_getppid(); + return sys_getpid(); } +#else /* _alpha_ */ + asmlinkage long sys_getuid(void) { /* Only we change this so SMP safe */