#define REBOOT 76
#define SVRCTL 77
#define SYSUNAME 78
-#define GETSYSINFO 79 /* to PM, VFS, RS, or DS */
-#define GETDENTS 80 /* to FS */
+#define GETSYSINFO 79 /* to PM or VFS (obsolete) */
+#define GETDENTS 80 /* to VFS */
#define LLSEEK 81 /* to VFS */
#define FSTATFS 82 /* to VFS */
#define STATVFS 83 /* to VFS */
#define FTRUNCATE 94 /* to VFS */
#define FCHMOD 95 /* to VFS */
#define FCHOWN 96 /* to VFS */
-#define GETSYSINFO_UP 97 /* to PM or VFS */
+#define GETSYSINFO_UP 97 /* to PM (obsolete) */
#define SPROF 98 /* to PM */
#define CPROF 99 /* to PM */
#define PM_NUID m2_i1
#define PM_NGID m2_i2
-/* Field names for GETSYSINFO_UP (PM). */
+/* Field names for GETSYSINFO_UP (PM) (obsolete). */
#define SIU_WHAT m2_i1
+# define SIU_LOADINFO 1 /* retrieve load info data */
+# define SIU_SYSTEMHZ 2 /* retrieve system clock frequency */
#define SIU_LEN m2_i2
#define SIU_WHERE m2_p1
# define GCOV_BUFF_P m1_p1
# define GCOV_BUFF_SZ m1_i1
+/* Common request to several system servers: retrieve system information.
+ * The GETSYSINFO userland call is an (old and deprecated) alias of this, so do
+ * not change the fields or old userland applications may break.
+ */
+#define COMMON_GETSYSINFO (COMMON_RQ_BASE+2)
+# define SI_WHAT m1_i1
+# define SI_WHERE m1_p1
+
/*===========================================================================*
* Messages for VM server *
*===========================================================================*/
#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));
-#define SIU_LOADINFO 1 /* retrieve load info data */
-#define SIU_SYSTEMHZ 2 /* retrieve system clock frequency */
-#define SIU_IDLETSC 3 /* retrieve cumulative idle timestamp count */
-
-/* Exported system parameters. */
+/* What system info to retrieve with sysgetinfo(). */
+#define SI_PROC_TAB 2 /* copy of entire process table */
+#define SI_DMAP_TAB 3 /* get device <-> driver mappings */
+#define SI_DATA_STORE 5 /* get copy of data store mappings */
+#define SI_SUBSCRIPTION 6 /* get copy of data store subscriptions */
+#define SI_LOADINFO 7 /* get copy of load average structure */
+#define SI_CALL_STATS 9 /* system call statistics */
+#define SI_PROCPUB_TAB 11 /* copy of public entries of process table */
#endif
} bin[RANDOM_SOURCES];
};
-/* information on PCI devices */
-
-#define PCIINFO_ENTRY_SIZE 80
-
-struct pciinfo_entry {
- u16_t pie_vid;
- u16_t pie_did;
- char pie_name[PCIINFO_ENTRY_SIZE];
-};
-
-struct pciinfo {
- size_t pi_count;
- struct pciinfo_entry pi_entries[NR_PCIDEV];
-};
-
#endif /* _TYPE_H */
#define _PM_SEG_FLAG (1L << 30) /* for read() and write() to FS by PM */
#endif
-/* What system info to retrieve with sysgetinfo(). */
-#define SI_KINFO 0 /* get kernel info via PM */
-#define SI_PROC_ADDR 1 /* address of process table */
-#define SI_PROC_TAB 2 /* copy of entire process table */
-#define SI_DMAP_TAB 3 /* get device <-> driver mappings */
-#define SI_MEM_ALLOC 4 /* get memory allocation data */
-#define SI_DATA_STORE 5 /* get copy of data store mappings */
-#define SI_SUBSCRIPTION 6 /* get copy of data store subscriptions */
-#define SI_LOADINFO 7 /* get copy of load average structure */
-#define SI_KPROC_TAB 8 /* copy of kernel process table */
-#define SI_CALL_STATS 9 /* system call statistics */
-#define SI_PCI_INFO 10 /* get kernel info via PM */
-#define SI_PROCPUB_TAB 11 /* copy of public entries of process table */
-
/* NULL must be defined in <unistd.h> according to POSIX Sec. 2.7.1. */
#include <sys/null.h>
#endif
-_PROTOTYPE( int getsysinfo, (endpoint_t who, int what, void *where) );
_PROTOTYPE( int getsigset, (sigset_t *sigset) );
_PROTOTYPE( int getprocnr, (void) );
_PROTOTYPE( int getnprocnr, (pid_t pid) );
_getpprocnr.c \
_getprocnr.c \
_getsigset.c \
- _getsysinfo.c \
_lseek64.c \
_mapdriver.c \
_mcontext.c \
+++ /dev/null
-
-#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 <stdlib.h>
-
-#include <machine/archtypes.h>
-#include "../../../kernel/proc.h"
-
-PUBLIC int getsysinfo(who, what, where)
-endpoint_t who; /* from whom to request info */
-int what; /* what information is requested */
-void *where; /* where to put it */
-{
- message m;
- m.m1_i1 = what;
- m.m1_p1 = where;
- if (_syscall(who, GETSYSINFO, &m) < 0) return(-1);
- 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 */
-int what; /* what information is requested */
-size_t size; /* input and output size */
-void *where; /* where to put it */
-{
- message m;
- m.SIU_WHAT = what;
- m.SIU_WHERE = where;
- m.SIU_LEN = size;
- return _syscall(who, GETSYSINFO_UP, &m);
-}
-
getpprocnr.S \
getprocnr.S \
getsigset.S \
- getsysinfo.S \
getuid.S \
ioctl.S \
isatty.S \
+++ /dev/null
-#include <machine/asm.h>
-
-IMPORT(_getsysinfo)
-ENTRY(getsysinfo)
- jmp _C_LABEL(_getsysinfo)
-
-IMPORT(_getsysinfo_up)
-ENTRY(getsysinfo_up)
- jmp _C_LABEL(_getsysinfo_up)
-
SRCS= \
alloc_util.c \
assert.c \
+ getsysinfo.c \
kernel_call.c \
panic.c \
pci_attr_r16.c \
* getidle();
* ...
* idleperc = getidle();
- * printf("CPU usage: %lg%%\n", 100.0 - idleperc);
+ * if (idleperc >= 0.0)
+ * printf("CPU usage: %lg%%\n", 100.0 - idleperc);
*
- * This routine goes through PM to get the idle time, rather than making the
- * sys_getinfo() call to the kernel directly. This means that it can be used
- * by non-system processes as well, but it will incur some extra overhead in
- * the system case. The overhead does not end up being measured, because the
- * system is clearly not idle while the system calls are being made. In any
- * case, for this reason, only one getidle() run is allowed at a time.
+ * Notes:
+ * - This functionality can only be used by system processes.
+ * - The kernel has to be compiled with CONFIG_IDLE_TSC support.
+ * - Only one getidle() run is allowed per process at a time.
*
- * Note that the kernel has to be compiled with CONFIG_IDLE_TSC support.
*/
#define _MINIX 1
#define _SYSTEM 1
-#include <minix/sysinfo.h>
+#include <lib.h>
#include <minix/u64.h>
#include <minix/sysutil.h>
int r;
if (!running) {
- r = getsysinfo_up(PM_PROC_NR, SIU_IDLETSC, sizeof(idle), &idle);
- if (r != sizeof(idle))
+ if ((r = sys_getidletsc(&idle)) != OK)
return -1.0;
running = 1;
running = 0;
- r = getsysinfo_up(PM_PROC_NR, SIU_IDLETSC, sizeof(idle2), &idle2);
- if (r != sizeof(idle2))
+ if ((r = sys_getidletsc(&idle2)) != OK)
return -1.0;
idelta = sub64(idle2, idle);
--- /dev/null
+
+#include <lib.h>
+#include <minix/sysinfo.h>
+#include <minix/com.h>
+
+PUBLIC int getsysinfo(who, what, where)
+endpoint_t who; /* from whom to request info */
+int what; /* what information is requested */
+void *where; /* where to put it */
+{
+ message m;
+ m.SI_WHAT = what;
+ m.SI_WHERE = where;
+ if (_syscall(who, COMMON_GETSYSINFO, &m) < 0) return(-1);
+ return(0);
+}
*===========================================================================*/
PUBLIC char *pci_dev_name(u16_t vid, u16_t did)
{
- static char name[PCIINFO_ENTRY_SIZE]; /* We need a better interface for this */
+ static char name[80]; /* We need a better interface for this */
int r;
cp_grant_id_t gid;
#include <minix/com.h>
#include <minix/ds.h>
#include <minix/syslib.h>
+#include <minix/sysinfo.h>
#include <minix/sysutil.h>
#include <minix/keymap.h>
#include <minix/bitmap.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-#include <unistd.h>
#include <signal.h>
#include "proto.h"
case DS_SNAPSHOT:
result = do_snapshot(&m);
break;
- case GETSYSINFO:
+ case COMMON_GETSYSINFO:
result = do_getsysinfo(&m);
break;
default:
#include <minix/const.h>
#include <minix/com.h>
#include <minix/syslib.h>
+#include <minix/sysinfo.h>
#include <minix/sysutil.h>
#include <minix/keymap.h>
#include <minix/bitmap.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-#include <unistd.h>
#include <signal.h>
#include <machine/archtypes.h>
else
result= ENOSYS;
break;
+ case COMMON_GETSYSINFO:
+ result = do_getsysinfo();
+ break;
default:
/* Else, if the system call number is valid, perform the
* call.
PUBLIC unsigned long calls_stats[NCALLS];
#endif
-FORWARD _PROTOTYPE( int getpciinfo, (struct pciinfo *pciinfo) );
-
/*===========================================================================*
* do_procstat *
*===========================================================================*/
vir_bytes src_addr, dst_addr;
struct kinfo kinfo;
struct loadinfo loadinfo;
- struct pciinfo pciinfo;
static struct proc proctab[NR_PROCS+NR_TASKS];
size_t len;
int s, r;
return EPERM;
}
+ /* This call should no longer be used by user applications. In the future,
+ * requests from non-system processes should be denied. For now, just warn.
+ */
+ if (call_nr == GETSYSINFO)
+ {
+ printf("PM: obsolete call of do_getsysinfo() by proc %d '%s'\n",
+ mp->mp_endpoint, mp->mp_name);
+ }
+
switch(m_in.info_what) {
- case SI_KINFO: /* kernel info is obtained via PM */
- sys_getkinfo(&kinfo);
- src_addr = (vir_bytes) &kinfo;
- len = sizeof(struct kinfo);
- break;
- case SI_PROC_ADDR: /* get address of PM process table */
- proc_addr = &mproc[0];
- src_addr = (vir_bytes) &proc_addr;
- len = sizeof(struct mproc *);
- break;
case SI_PROC_TAB: /* copy entire process table */
src_addr = (vir_bytes) mproc;
len = sizeof(struct mproc) * NR_PROCS;
break;
- case SI_KPROC_TAB: /* copy entire process table */
- if((r=sys_getproctab(proctab)) != OK)
- return r;
- src_addr = (vir_bytes) proctab;
- len = sizeof(proctab);
- break;
case SI_LOADINFO: /* loadinfo is obtained via PM */
sys_getloadinfo(&loadinfo);
src_addr = (vir_bytes) &loadinfo;
len = sizeof(struct loadinfo);
break;
- case SI_PCI_INFO: /* PCI info is obtained via PM */
- if ((r=getpciinfo(&pciinfo)) != OK)
- return r;
- src_addr = (vir_bytes) &pciinfo;
- len = sizeof(struct pciinfo);
- break;
#if ENABLE_SYSCALL_STATS
case SI_CALL_STATS:
src_addr = (vir_bytes) calls_stats;
vir_bytes src_addr, dst_addr;
struct loadinfo loadinfo;
size_t len, real_len;
- u64_t idle_tsc;
int s;
+ printf("PM: obsolete call of do_getsysinfo_up() by proc %d '%s'\n",
+ mp->mp_endpoint, mp->mp_name);
+
switch(m_in.SIU_WHAT) {
case SIU_LOADINFO: /* loadinfo is obtained via PM */
if ((s = sys_getloadinfo(&loadinfo)) != OK)
src_addr = (vir_bytes) &system_hz;
real_len = sizeof(system_hz);
break;
- case SIU_IDLETSC:
- if ((s = sys_getidletsc(&idle_tsc)) != OK)
- return s;
- src_addr = (vir_bytes) &idle_tsc;
- real_len = sizeof(idle_tsc);
- break;
default:
return(EINVAL);
}
_brksize = brk_addr;
return 0;
}
-
-/*===========================================================================*
- * getpciinfo *
- *===========================================================================*/
-
-PRIVATE int getpciinfo(pciinfo)
-struct pciinfo *pciinfo;
-{
- int devind, r;
- struct pciinfo_entry *entry;
- char *name;
- u16_t vid, did;
-
- /* look up PCI process number */
- pci_init();
-
- /* start enumerating devices */
- entry = pciinfo->pi_entries;
- r = pci_first_dev(&devind, &vid, &did);
- while (r)
- {
- /* fetch device name */
- name = pci_dev_name(vid, did);
- if (!name)
- name = "";
-
- /* store device information in table */
- assert((char *) entry < (char *) (pciinfo + 1));
- entry->pie_vid = vid;
- entry->pie_did = did;
- strncpy(entry->pie_name, name, sizeof(entry->pie_name));
- entry->pie_name[sizeof(entry->pie_name) - 1] = 0;
- entry++;
-
- /* continue with the next device */
- r = pci_next_dev(&devind, &vid, &did);
- }
-
- /* store number of entries */
- pciinfo->pi_count = entry - pciinfo->pi_entries;
- return OK;
-}
#include <minix/const.h>
#include <minix/com.h>
#include <minix/syslib.h>
+#include <minix/sysinfo.h>
#include <minix/sysutil.h>
#include <minix/keymap.h>
#include <minix/bitmap.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-#include <unistd.h>
#include <signal.h>
#include <assert.h>
#include <sys/param.h>
* Handle the request and send a reply to the caller.
*/
else {
- if (call_nr != GETSYSINFO &&
+ if (call_nr != COMMON_GETSYSINFO &&
(call_nr < RS_RQ_BASE || call_nr >= RS_RQ_BASE+0x100))
{
/* Ignore invalid requests. Do not try to reply. */
case RS_UPDATE: result = do_update(&m); break;
case RS_CLONE: result = do_clone(&m); break;
case RS_EDIT: result = do_edit(&m); break;
- case GETSYSINFO: result = do_getsysinfo(&m); break;
+ case COMMON_GETSYSINFO:
+ result = do_getsysinfo(&m); break;
case RS_LOOKUP: result = do_lookup(&m); break;
/* Ready messages. */
case RS_INIT: result = do_init_ready(&m); break;
/* Initialize global variables for the nested call */
set_globals(m);
- /* Perform the nested call */
- if (call_nr < 0 || call_nr >= NCALLS) {
+ /* Perform the nested call - only getsysinfo() is allowed right now */
+ if (call_nr == COMMON_GETSYSINFO) {
+ r = do_getsysinfo();
+ } else {
printf("VFS: invalid nested call %d from FS %d\n", call_nr,
who_e);
r = ENOSYS;
- } else {
-#if ENABLE_SYSCALL_STATS
- calls_stats[call_nr]++;
-#endif
-
- r = (*call_vec[call_nr])();
}
/* Store the result, and restore original global variables */
error= do_mapdriver();
if (error != SUSPEND) reply(who_e, error);
break;
-
+ case COMMON_GETSYSINFO:
+ error= do_getsysinfo();
+ if (error != SUSPEND) reply(who_e, error);
+ break;
default:
/* Call the internal function that does the work. */
if (call_nr < 0 || call_nr >= NCALLS) {
#include <minix/safecopies.h>
#include <minix/endpoint.h>
#include <minix/com.h>
+#include <minix/sysinfo.h>
#include <minix/u64.h>
#include <sys/ptrace.h>
#include <sys/svrctl.h>
if (!super_user) return(EPERM);
+ /* This call should no longer be used by user applications. In the future,
+ * requests from non-system processes should be denied. For now, just warn.
+ */
+ if (call_nr == GETSYSINFO) {
+ printf("VFS: obsolete call of do_getsysinfo() by proc %d\n",
+ fp->fp_endpoint);
+ }
+
switch(m_in.info_what) {
- case SI_PROC_ADDR:
- proc_addr = &fproc[0];
- src_addr = (vir_bytes) &proc_addr;
- len = sizeof(struct fproc *);
- break;
case SI_PROC_TAB:
src_addr = (vir_bytes) fproc;
len = sizeof(struct fproc) * NR_PROCS;
do_ftruncate, /* 94 = truncate */
do_chmod, /* 95 = fchmod */
do_chown, /* 96 = fchown */
- no_sys, /* 97 = getsysinfo_up */
+ no_sys, /* 97 = (getsysinfo_up) */
no_sys, /* 98 = (sprofile) */
no_sys, /* 99 = (cprofile) */
/* THE MINIX3 ABI ENDS HERE */