. new kernel call sysctl for generic unprivileged system operations;
now used for printing diagnostic messages through the kernel message buffer. this lets processes print diagnostics without sending messages to tty and log directly, simplifying the message protocol a lot and reducing difficulties with deadlocks and other situations in which diagnostics are blackholed (e.g. grants don't work). this makes DIAGNOSTICS(_S), ASYN_DIAGNOSTICS and DIAG_REPL obsolete, although tty and log still accept the codes for 'old' binaries. This also simplifies diagnostics in several servers and drivers - only tty needs its own kputc() now. . simplifications in vfs, and some effort to get the vnode references right (consistent) even during shutdown. m_mounted_on is now NULL for root filesystems (!) (the original and new root), a less awkward special case than 'm_mounted_on == m_root_node'. root now has exactly one reference, to root, if no files are open, just like all other filesystems. m_driver_e is unused.
This commit is contained in:
@@ -52,4 +52,7 @@
|
||||
#define INTS_ORIG 0 /* restore interrupts */
|
||||
#define INTS_MINIX 1 /* initialize interrupts for minix */
|
||||
|
||||
/* for kputc() */
|
||||
#define END_OF_KMESS 0
|
||||
|
||||
#endif /* CONST_H */
|
||||
|
||||
@@ -93,6 +93,9 @@ _PROTOTYPE( void check_runqueues_f, (char *file, int line) );
|
||||
_PROTOTYPE( int verify_grant, (endpoint_t, endpoint_t, cp_grant_id_t, vir_bytes,
|
||||
int, vir_bytes, vir_bytes *, endpoint_t *));
|
||||
|
||||
/* system/do_sysctl.c */
|
||||
_PROTOTYPE( int do_sysctl, (message *m));
|
||||
|
||||
#if SPROFILE
|
||||
/* profile.c */
|
||||
_PROTOTYPE( void init_profile_clock, (u32_t) );
|
||||
|
||||
@@ -241,6 +241,7 @@ PRIVATE void initialize(void)
|
||||
/* System control. */
|
||||
map(SYS_ABORT, do_abort); /* abort MINIX */
|
||||
map(SYS_GETINFO, do_getinfo); /* request system information */
|
||||
map(SYS_SYSCTL, do_sysctl); /* misc system manipulation */
|
||||
|
||||
/* Profiling. */
|
||||
map(SYS_SPROF, do_sprofile); /* start/stop statistical profiling */
|
||||
|
||||
@@ -43,6 +43,7 @@ OBJECTS = \
|
||||
$(SYSTEM)(do_privctl.o) \
|
||||
$(SYSTEM)(do_segctl.o) \
|
||||
$(SYSTEM)(do_safecopy.o) \
|
||||
$(SYSTEM)(do_sysctl.o) \
|
||||
$(SYSTEM)(do_getksig.o) \
|
||||
$(SYSTEM)(do_endksig.o) \
|
||||
$(SYSTEM)(do_kill.o) \
|
||||
@@ -151,6 +152,9 @@ $(SYSTEM)(do_privctl.o): do_privctl.c
|
||||
$(SYSTEM)(do_safecopy.o): do_safecopy.c
|
||||
$(CC) do_safecopy.c
|
||||
|
||||
$(SYSTEM)(do_sysctl.o): do_sysctl.c
|
||||
$(CC) do_sysctl.c
|
||||
|
||||
$(SYSTEM)(do_segctl.o): do_segctl.c
|
||||
$(CC) do_segctl.c
|
||||
|
||||
|
||||
58
kernel/system/do_sysctl.c
Normal file
58
kernel/system/do_sysctl.c
Normal file
@@ -0,0 +1,58 @@
|
||||
/* The kernel call implemented in this file:
|
||||
* m_type: SYS_SYSCTL
|
||||
*
|
||||
* The parameters for this kernel call are:
|
||||
* SYSCTL_CODE request
|
||||
* and then request-specific arguments in SYSCTL_ARG1 and SYSCTL_ARG2.
|
||||
*/
|
||||
|
||||
#include "../system.h"
|
||||
#include "../vm.h"
|
||||
|
||||
|
||||
/*===========================================================================*
|
||||
* do_sysctl *
|
||||
*===========================================================================*/
|
||||
PUBLIC int do_sysctl(m_ptr)
|
||||
register message *m_ptr; /* pointer to request message */
|
||||
{
|
||||
phys_bytes ph;
|
||||
vir_bytes len, buf;
|
||||
static char mybuf[DIAG_BUFSIZE];
|
||||
struct proc *caller;
|
||||
int s, i;
|
||||
|
||||
caller = proc_addr(who_p);
|
||||
|
||||
switch (m_ptr->SYSCTL_CODE) {
|
||||
case SYSCTL_CODE_DIAG:
|
||||
buf = (vir_bytes) m_ptr->SYSCTL_ARG1;
|
||||
len = (vir_bytes) m_ptr->SYSCTL_ARG2;
|
||||
if(len < 1 || len > DIAG_BUFSIZE) {
|
||||
kprintf("do_sysctl: diag for %d: len %d out of range\n",
|
||||
caller->p_endpoint, len);
|
||||
return EINVAL;
|
||||
}
|
||||
if((ph=umap_local(caller, D, buf, len)) == 0)
|
||||
return EFAULT;
|
||||
CHECKRANGE_OR_SUSPEND(caller, ph, len, 1);
|
||||
if((s=data_copy(who_e, buf, SYSTEM, (vir_bytes) mybuf, len)) != OK) {
|
||||
kprintf("do_sysctl: diag for %d: len %d: copy failed: %d\n",
|
||||
caller->p_endpoint, len, s);
|
||||
return s;
|
||||
}
|
||||
for(i = 0; i < len; i++)
|
||||
kputc(mybuf[i]);
|
||||
kputc(END_OF_KMESS);
|
||||
return OK;
|
||||
break;
|
||||
default:
|
||||
kprintf("do_sysctl: invalid request %d\n", m_ptr->SYSCTL_CODE);
|
||||
return(EINVAL);
|
||||
}
|
||||
|
||||
minix_panic("do_sysctl: can't happen", NO_NUM);
|
||||
|
||||
return(OK);
|
||||
}
|
||||
|
||||
@@ -83,9 +83,9 @@ PUBLIC char *t_stack[TOT_STACK_SPACE / sizeof(char *)];
|
||||
*/
|
||||
#define FS_C SYS_KILL, SYS_VIRCOPY, SYS_SAFECOPYFROM, SYS_SAFECOPYTO, \
|
||||
SYS_VIRVCOPY, SYS_UMAP, SYS_GETINFO, SYS_EXIT, SYS_TIMES, SYS_SETALARM, \
|
||||
SYS_PRIVCTL, SYS_TRACE , SYS_SETGRANT, SYS_PROFBUF
|
||||
SYS_PRIVCTL, SYS_TRACE , SYS_SETGRANT, SYS_PROFBUF, SYS_SYSCTL
|
||||
#define DRV_C FS_C, SYS_SEGCTL, SYS_IRQCTL, SYS_INT86, SYS_DEVIO, \
|
||||
SYS_SDEVIO, SYS_VDEVIO, SYS_SETGRANT, SYS_PROFBUF
|
||||
SYS_SDEVIO, SYS_VDEVIO, SYS_SETGRANT, SYS_PROFBUF, SYS_SYSCTL
|
||||
|
||||
PRIVATE int
|
||||
fs_c[] = { FS_C },
|
||||
|
||||
@@ -59,8 +59,6 @@ int nr;
|
||||
#define printf kprintf
|
||||
#include "../lib/sysutil/kprintf.c"
|
||||
|
||||
#define END_OF_KMESS 0
|
||||
|
||||
/*===========================================================================*
|
||||
* kputc *
|
||||
*===========================================================================*/
|
||||
|
||||
Reference in New Issue
Block a user