library function to retrieve kernel proc table and sanity check it

This commit is contained in:
Ben Gras 2010-06-28 11:05:15 +00:00
parent 67fa273d00
commit 8379b08845
4 changed files with 49 additions and 1 deletions

View file

@ -187,4 +187,7 @@
#define VERBOSEBOOT_MAX 3
#define VERBOSEBOOTVARNAME "verbose"
/* magic value to put in struct proc entries for sanity checks. */
#define PMAGIC 0xC0FFEE1
#endif /* _MINIX_CONST_H */

View file

@ -6,6 +6,7 @@
#include <minix/type.h>
_PROTOTYPE( int getsysinfo, (endpoint_t who, int what, void *where) );
_PROTOTYPE( int minix_getkproctab, (void *pr, int nprocs, int assert));
_PROTOTYPE( ssize_t getsysinfo_up, (endpoint_t who, int what, size_t size,
void *where));

View file

@ -1,6 +1,8 @@
#ifndef PROC_H
#define PROC_H
#include <minix/const.h>
#ifndef __ASSEMBLY__
/* Here is the declaration of the process table. It contains all process
@ -102,7 +104,6 @@ struct proc {
} p_vmrequest;
int p_found; /* consistency checking variables */
#define PMAGIC 0xC0FFEE1
int p_magic; /* check validity of proc pointers */
#if DEBUG_TRACE

View file

@ -1,9 +1,23 @@
#include <lib.h>
#include <unistd.h>
#include <timers.h>
#include <minix/endpoint.h>
#define getsysinfo _getsysinfo
#define getsysinfo_up _getsysinfo_up
#include <minix/sysinfo.h>
#include <minix/const.h>
#include <minix/ipc.h>
#include <minix/com.h>
#include <minix/sysinfo.h>
#include <minix/config.h>
#include <minix/type.h>
#include <minix/const.h>
#include <stdio.h>
#include <machine/archtypes.h>
#include "../../../kernel/proc.h"
PUBLIC int getsysinfo(who, what, where)
endpoint_t who; /* from whom to request info */
@ -17,6 +31,35 @@ void *where; /* where to put it */
return(0);
}
PUBLIC int minix_getkproctab(void *vpr, int nprocs, int assert)
{
int r, i, fail = 0;
struct proc *pr = vpr;
if((r=getsysinfo(PM_PROC_NR, SI_KPROC_TAB, pr)) < 0)
return r;
for(i = 0; i < nprocs; i++) {
if(pr[i].p_magic != PMAGIC) {
fail = 1;
break;
}
}
if(!fail)
return 0;
if(assert) {
fprintf(stderr, "%s: process table failed sanity check.\n", getprogname());
fprintf(stderr, "is kernel out of sync?\n");
exit(1);
}
errno = ENOSYS;
return -1;
}
/* Unprivileged variant of getsysinfo. */
PUBLIC ssize_t getsysinfo_up(who, what, size, where)
endpoint_t who; /* from whom to request info */