]> Zhao Yanbai Git Server - minix.git/commitdiff
Kernel cleanup.
authorJorrit Herder <jnherder@minix3.org>
Tue, 7 Jun 2005 12:34:25 +0000 (12:34 +0000)
committerJorrit Herder <jnherder@minix3.org>
Tue, 7 Jun 2005 12:34:25 +0000 (12:34 +0000)
Reduced kernel size by 512KB by moving private buffer into cstart() function.
Replaced assertions with erroneous return values. Removed assertions relating
to isuserp(rp), since all processes should become user processes; system
processes are now treated similar to other processes.

14 files changed:
kernel/Makefile
kernel/assert.h [deleted file]
kernel/debug.h
kernel/ipc.h
kernel/misc.c
kernel/proc.c
kernel/proc.h
kernel/proto.h
kernel/start.c
kernel/system.h
kernel/system/Makefile
kernel/system/misc.c
kernel/system/proctl.c
kernel/system/sigctl.c

index 8212b972a2c8f0da589ef28a6e0523ad558a2c58..4bfdd52b9893331975da1b7fb05075890b8572bc 100755 (executable)
@@ -92,7 +92,6 @@ main.o:       sendmask.h
 misc.o:        $a
 misc.o:        $i/stdlib.h
 misc.o:        $h/com.h
-misc.o:        assert.h
 
 printer.o:     $a
 printer.o:     $h/callnr.h
@@ -124,7 +123,6 @@ system.o:   $h/com.h
 system.o:      system.h
 system.o:      proc.h
 system.o:      protect.h
-system.o:      assert.h
 system.o:      sendmask.h
 
 table.o:       $a
diff --git a/kernel/assert.h b/kernel/assert.h
deleted file mode 100755 (executable)
index 87cf720..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/*     assert.h        */
-
-#ifndef NDEBUG /* 8086 must do without training wheels. */
-#define NDEBUG (_WORD_SIZE == 2)
-#endif
-
-#if !NDEBUG
-
-#define INIT_ASSERT    static char *assert_file= __FILE__;
-
-void bad_assertion(char *file, int line, char *what);
-void bad_compare(char *file, int line, int lhs, char *what, int rhs);
-
-#define assert(x)      (!(x) ? bad_assertion(assert_file, __LINE__, #x) \
-                                                               : (void) 0)
-#define compare(a,t,b) (!((a) t (b)) ? bad_compare(assert_file, __LINE__, \
-                               (a), #a " " #t " " #b, (b)) : (void) 0)
-#else /* NDEBUG */
-
-#define INIT_ASSERT    /* nothing */
-
-#define assert(x)      (void)0
-#define compare(a,t,b) (void)0
-
-#endif /* NDEBUG */
index 3382330d4cb76a18ec23cf7fcd46c8be644c4613..259c29484d70919434cd4dd3617c92b1daf388a3 100644 (file)
@@ -1,4 +1,3 @@
-
 #ifndef DEBUG_H
 #define DEBUG_H
 
index f996082d3fd45cee11384a7bc363b50212a31172..49d4def4f6502c796566582441b56e983ae94425 100644 (file)
@@ -13,7 +13,7 @@
 #define NOTIFY          4      /* function code for notifications */
 
 #if 0
-/* Bit map operations used to bits of simple bit mask. */
+/* Bit map operations to manipulate bits of a simple mask variable. */
 #define set_bit(mask, n)       ((mask) |= (1 << (n)))
 #define clear_bit(mask, n)     ((mask) &= ~(1 << (n)))
 #define isset_bit(mask, n)     ((mask) & (1 << (n)))
index 37da8b9249df4960297f77204d975a1be4db4fa8..dc40c9e81d24b687c8b499d18d145b3485cde02f 100755 (executable)
@@ -1,10 +1,7 @@
 /* This file contains a collection of miscellaneous procedures:
  *   panic         abort MINIX due to a fatal error
- *   bad_assertion  for debugging
- *   bad_compare    for debugging
  *   alloc_bit      bit map manipulation
  *   free_bit       bit map manipulation
- *   print_bitmap   bit map manipulation
  */
 
 #include "kernel.h"
@@ -20,11 +17,7 @@ PUBLIC void panic(s,n)
 _CONST char *s;
 int n;
 {
-/* The system has run aground of a fatal error.  Terminate execution.
- * If the panic originated in MM or FS, the string will be empty and the
- * file system already syncked.  If the panic originates in the kernel, we are
- * kind of stuck.
- */
+/* The system has run aground of a fatal kernel error. Terminate execution. */
   static int panicking = 0;
   if (panicking ++)            /* prevent recursive panics */
        return;
@@ -37,26 +30,6 @@ int n;
   prepare_shutdown(RBT_PANIC);
 }
 
-#if ENABLE_K_DEBUGGING
-/*===========================================================================*
- *                        print_bitmap                                      * 
- *===========================================================================*/
-PUBLIC void print_bitmap(bitmap, nr_bits)
-bitchunk_t *bitmap; 
-bit_t nr_bits;
-{
-    bit_t bit_i;
-    
-    for (bit_i=0; bit_i < nr_bits; bit_i++) {
-
-        kprintf("%d", GET_BIT(bitmap, bit_i) > 0 );
-        if (! ((bit_i+1) % 8) )   kprintf(" ", NO_ARG);
-        if (! ((bit_i+1) % 64) )   kprintf("\n", NO_ARG);
-    }
-    kprintf("\n", NO_ARG);
-}
-#endif /* ENABLE_K_DEBUGGING */
-
 /*===========================================================================*
  *                             free_bit                                     * 
  *===========================================================================*/
@@ -107,39 +80,3 @@ bit_t nr_bits;
     return(-1);    
 }
 
-
-
-
-#if !NDEBUG
-/*=========================================================================*
- *                             bad_assertion                              *
- *=========================================================================*/
-PUBLIC void bad_assertion(file, line, what)
-char *file;
-int line;
-char *what;
-{
-  kprintf("panic at %s", karg(file));
-  kprintf(" (line %d): ", line);
-  kprintf("assertion \"%s\" failed.\n", karg(what));
-  panic(NULL, NO_NUM);
-}
-
-/*=========================================================================*
- *                             bad_compare                                *
- *=========================================================================*/
-PUBLIC void bad_compare(file, line, lhs, what, rhs)
-char *file;
-int line;
-int lhs;
-char *what;
-int rhs;
-{
-  kprintf("panic at %s", karg(file));
-  kprintf(" (line %d): ", line);
-  kprintf("compare (%d)", lhs);
-  kprintf(" %s ", karg(what));
-  kprintf("(%d) failed.\n", rhs);
-  panic(NULL, NO_NUM);
-}
-#endif /* !NDEBUG */
index c4512c60605b7677b5acbf99483fe5fb681336d2..94bf2c12c3d5c0de015eb5ffb2aaa672ebb53bae 100755 (executable)
@@ -1,6 +1,7 @@
-#define NEW_SCHED_Q    1
-#define OLD_SEND       0
-#define OLD_RECV       0
+#define NEW_ELOCKED_CHECK      1
+#define NEW_SCHED_Q            1
+#define OLD_SEND               0
+#define OLD_RECV               0
 /* This file contains essentially all of the process and message handling.
  * Together with "mpx.s" it forms the lowest layer of the MINIX kernel.
  * There is one entry point from the outside:
@@ -57,7 +58,7 @@
  */
 FORWARD _PROTOTYPE( int mini_send, (struct proc *caller_ptr, int dst,
                message *m_ptr, unsigned flags) );
-FORWARD _PROTOTYPE( int mini_rec, (struct proc *caller_ptr, int src,
+FORWARD _PROTOTYPE( int mini_receive, (struct proc *caller_ptr, int src,
                message *m_ptr, unsigned flags) );
 FORWARD _PROTOTYPE( int mini_notify, (struct proc *caller_ptr, int dst,
                message *m_ptr ) );
@@ -111,10 +112,12 @@ message *m_ptr;                   /* pointer to message in the caller's space */
    * if the caller doesn't do receive(). 
    */
   if (! (caller_ptr->p_call_mask & (1 << function)) || 
-      iskernel(src_dst) && function != SENDREC) return(ECALLDENIED);           
+          (iskerneltask(src_dst) && function != SENDREC))  
+      return(ECALLDENIED);     
   
-  /* Verify that requested source and/ or destination is a valid process. */
-  if (! isoksrc_dst(src_dst) && function != ECHO)  return(EBADSRCDST);
+  /* Require a valid source and/ or destination process, unless echoing. */
+  if (! (isokprocn(src_dst) || src_dst == ANY || function == ECHO))  
+      return(EBADSRCDST);
 
   /* Check validity of message pointer. */
   vb = (vir_bytes) m_ptr;
@@ -145,21 +148,7 @@ message *m_ptr;                    /* pointer to message in the caller's space */
    *   - ECHO:    the message directly will be echoed to the sender 
    */
   switch(function) {
-  case SENDREC:                                /* has FRESH_ANSWER flags */            
-#if DEAD_CODE
-      { message m;
-        if (caller_ptr->p_nr == MEMORY && src_dst == FS_PROC_NR) {
-       CopyMess(caller_ptr->p_nr, caller_ptr, m_ptr, proc_addr(HARDWARE), &m);
-       kprintf("MEMORY sendrec FS, m.m_type %d", m.m_type);
-       kprintf("TTY_LINE %d", m.TTY_LINE);
-       kprintf("TTY_REQ %d\n", m.TTY_REQUEST);
-       }
-        if (caller_ptr->p_nr == FS_PROC_NR && src_dst == MEMORY) {
-       CopyMess(caller_ptr->p_nr, caller_ptr, m_ptr, proc_addr(HARDWARE), &m);
-       kprintf("FS sendrec MEMORY, m.m_type %d\n", m.m_type);
-       }
-      }
-#endif
+  case SENDREC:                                /* has FRESH_ANSWER flag */             
       /* fall through */
   case SEND:                   
       if (! isalive(src_dst)) {                        
@@ -179,7 +168,7 @@ message *m_ptr;                     /* pointer to message in the caller's space */
           break;                               /* done, or SEND failed */
       }                                                /* fall through for SENDREC */
   case RECEIVE:                        
-      result = mini_rec(caller_ptr, src_dst, m_ptr, flags);
+      result = mini_receive(caller_ptr, src_dst, m_ptr, flags);
       break;
   case NOTIFY:
       result = mini_notify(caller_ptr, src_dst, m_ptr);
@@ -217,12 +206,20 @@ unsigned flags;                           /* system call flags */
   register struct proc *xp;
 #else
   register struct proc **xpp;
+  register struct proc *xp;
 #endif
 
   dst_ptr = proc_addr(dst);    /* pointer to destination's proc entry */
 
 
   /* Check for deadlock by 'caller_ptr' and 'dst' sending to each other. */
+#if NEW_ELOCKED_CHECK
+  xp = dst_ptr;
+  while (xp->p_flags & SENDING) {              /* check while sending */
+       xp = proc_addr(xp->p_sendto);           /* get xp's destination */
+       if (xp == caller_ptr) return(ELOCKED);  /* deadlock if cyclic */
+  }
+#else
   if (dst_ptr->p_flags & SENDING) {
        next_ptr = proc_addr(dst_ptr->p_sendto);
        while (TRUE) {
@@ -233,6 +230,7 @@ unsigned flags;                             /* system call flags */
                        break;
        }
   }
+#endif
 
   /* Check if 'dst' is blocked waiting for this message. The destination's 
    * SENDING flag may be set when its SENDREC call blocked while sending.  
@@ -272,9 +270,9 @@ unsigned flags;                             /* system call flags */
 }
 
 /*===========================================================================*
- *                             mini_rec                                     * 
+ *                             mini_receive                                 * 
  *===========================================================================*/
-PRIVATE int mini_rec(caller_ptr, src, m_ptr, flags)
+PRIVATE int mini_receive(caller_ptr, src, m_ptr, flags)
 register struct proc *caller_ptr;      /* process trying to get message */
 int src;                               /* which message source is wanted */
 message *m_ptr;                                /* pointer to message buffer */
@@ -398,7 +396,7 @@ message *m_ptr;                             /* pointer to message buffer */
   /* Destination is not ready. Add the notification to the pending queue. 
    * Get pointer to notification message. Don't copy if already in kernel. 
    */
-  if (! iskernelp(caller_ptr)) {
+  if (! istaskp(caller_ptr)) {
       CopyMess(proc_nr(caller_ptr), caller_ptr, m_ptr, 
           proc_addr(HARDWARE), &ntf_mess);
       m_ptr = &ntf_mess;
index 570d8deccaeeb58ce629429dcc584d07efa1ba2f..4972e3428c4fde773065615cf2b5073b62986d6e 100755 (executable)
@@ -110,26 +110,24 @@ struct proc {
 #define END_PROC_ADDR (&proc[NR_TASKS + NR_PROCS])
 
 #define NIL_PROC          ((struct proc *) 0)
+#define cproc_addr(n)     (&(proc + NR_TASKS)[(n)])
+#define proc_addr(n)      (pproc_addr + NR_TASKS)[(n)]
+#define proc_nr(p)       ((p)->p_nr)
+
+#define iskerneltask(n)          ((n) == CLOCK || (n) == SYSTASK) 
 #define isidlehardware(n) ((n) == IDLE || (n) == HARDWARE)
 #define isokprocn(n)      ((unsigned) ((n) + NR_TASKS) < NR_PROCS + NR_TASKS)
 #define isokprocp(p)      ((p) >= BEG_PROC_ADDR && (p) < END_PROC_ADDR)
-#define isoksrc_dst(n)    (isokprocn(n) || (n) == ANY)
 #define isalive(n)       (proc_addr(n)->p_type > P_NONE)
 #define isalivep(p)      ((p)->p_type > P_NONE)
-#define isrxhardware(n)   ((n) == ANY || (n) == HARDWARE)
-#define isreservedp(p)    ((p)->p_type == P_RESERVED)
 #define isemptyp(p)       ((p)->p_type == P_NONE)
 #define istaskp(p)        ((p)->p_type == P_TASK)
 #define isdriverp(p)      ((p)->p_type == P_DRIVER)
 #define isserverp(p)      ((p)->p_type == P_SERVER)
 #define isuserp(p)        ((p)->p_type == P_USER)
-#define isuser(n)        (proc_addr(n)->p_type == P_USER)
 #define isidlep(p)        ((p)->p_type == P_IDLE)
-#define cproc_addr(n)     (&(proc + NR_TASKS)[(n)])
-#define proc_addr(n)      (pproc_addr + NR_TASKS)[(n)]
-#define proc_nr(p)       ((p)->p_nr)
-#define iskernelp(p)      ((p)->p_nr < 0)
-#define iskernel(n)      ((n) == CLOCK || (n) == SYSTASK)
+
+#define isuser(n)        (proc_addr(n)->p_type == P_USER)
 
 /* The process table and pointers to process table slots. The pointers allow
  * faster access because now a process entry can be found by indexing the
index 5194a570b5ff266e92720ec42885dfe9fd7df602..9f73710c1ec1309bddeb6a85263c9ee91b66fcaf 100755 (executable)
@@ -40,7 +40,6 @@ _PROTOTYPE( void stop_sequence, (struct timer *tp)                    );
 _PROTOTYPE( void panic, (_CONST char *s, int n)                                );
 _PROTOTYPE( int alloc_bit, (bitchunk_t *map, bit_t nr_bits)            ); 
 _PROTOTYPE( void free_bit, (bit_t nr, bitchunk_t *map, bit_t nr_bits)  ); 
-_PROTOTYPE( void print_bitmap, (bitchunk_t *map, bit_t nr_bits)        );
 
 /* proc.c */
 _PROTOTYPE( int sys_call, (int function, int src_dest, message *m_ptr) );
@@ -54,7 +53,6 @@ _PROTOTYPE( void lock_unready, (struct proc *rp)                      );
 /* start.c */
 _PROTOTYPE( void cstart, (U16_t cs, U16_t ds, U16_t mds,
                                U16_t parmoff, U16_t parmsize)          );
-_PROTOTYPE( char *getkenv, (_CONST char *key)                          );
 
 /* system.c */
 _PROTOTYPE( void cause_sig, (int proc_nr, int sig_nr)                  );
index 9f6172b10242fff24791c4554b5793bb8913de92..b2be5b83e2b0e9ee0fe29ff23283cfbe60df116b 100755 (executable)
@@ -3,7 +3,6 @@
  *
  * This code runs in real mode for a 16 bit kernel and may have to switch
  * to protected mode for a 286.
- *
  * For a 32 bit kernel this already runs in protected mode, but the selectors
  * are still those given by the BIOS with interrupts disabled, so the
  * descriptors need to be reloaded and interrupt descriptors made.
 #include "protect.h"
 #include "proc.h"
 
-/* Environment strings passed by loader. */
-PRIVATE char k_environ[128*sizeof(char *)];
-
-FORWARD _PROTOTYPE( void mem_init, (void) );
+FORWARD _PROTOTYPE( void mem_init, (_CONST char *params));
+FORWARD _PROTOTYPE( char *get_value, (_CONST char *params, _CONST char *key));
 
 /*==========================================================================*
  *                             cstart                                      *
@@ -29,7 +26,8 @@ U16_t parmoff, parmsize;      /* boot parameters offset and length */
 /* Perform system initializations prior to calling main(). Most settings are
  * determined with help of the environment strings passed by MINIX' loader.
  */
-  register char *envp;
+  char params[128*sizeof(char *)];             /* boot monitor parameters */
+  register char *value;                                /* value in key=value pair */
   unsigned mon_start;
   extern int etext, end;
 
@@ -53,8 +51,8 @@ U16_t parmoff, parmsize;      /* boot parameters offset and length */
 
   /* Copy the boot parameters to kernel memory. */
   kinfo.params_base = seg2phys(mds) + parmoff;
-  kinfo.params_size = MAX(parmsize,sizeof(k_environ)-2);
-  phys_copy(kinfo.params_base, vir2phys(k_environ), kinfo.params_size);
+  kinfo.params_size = MAX(parmsize,sizeof(params)-2);
+  phys_copy(kinfo.params_base, vir2phys(params), kinfo.params_size);
 
   /* Record miscellaneous information for user-space servers. */
   kinfo.nr_procs = NR_PROCS;
@@ -64,8 +62,8 @@ U16_t parmoff, parmsize;      /* boot parameters offset and length */
   kinfo.kmem_base = vir2phys(0);
   kinfo.kmem_size = (phys_bytes) &end; 
 
-  /* Processor? */
-  machine.processor=katoi(getkenv("processor"));  /* 86, 186, 286, 386, ... */
+  /* Processor?  86, 186, 286, 386, ... */
+  machine.processor=katoi(get_value(params, "processor")); 
 
   /* Decide if mode is protected for older machines. */
 #if _WORD_SIZE == 2
@@ -74,20 +72,20 @@ U16_t parmoff, parmsize;    /* boot parameters offset and length */
   if (! machine.protected) mon_return = 0;
 
   /* XT, AT or MCA bus? */
-  envp = getkenv("bus");
-  if (envp == NIL_PTR || kstrcmp(envp, "at") == 0) {
+  value = get_value(params, "bus");
+  if (value == NIL_PTR || kstrcmp(value, "at") == 0) {
       machine.pc_at = TRUE;                    /* PC-AT compatible hardware */
-  } else if (kstrcmp(envp, "mca") == 0) {
+  } else if (kstrcmp(value, "mca") == 0) {
       machine.pc_at = machine.ps_mca = TRUE;   /* PS/2 with micro channel */
   }
 
   /* Type of VDU: */
-  envp = getkenv("video");                     /* EGA or VGA video unit */
-  if (kstrcmp(envp, "ega") == 0) machine.vdu_ega = TRUE;
-  if (kstrcmp(envp, "vga") == 0) machine.vdu_vga = machine.vdu_ega = TRUE;
+  value = get_value(params, "video");                  /* EGA or VGA video unit */
+  if (kstrcmp(value, "ega") == 0) machine.vdu_ega = TRUE;
+  if (kstrcmp(value, "vga") == 0) machine.vdu_vga = machine.vdu_ega = TRUE;
 
   /* Initialize free memory list from size passed by boot monitor. */
-  mem_init();
+  mem_init(params);
 
   /* Return to assembler code to switch to protected mode (if 286), 
    * reload selectors and call main().
@@ -107,7 +105,8 @@ U16_t parmoff, parmsize;    /* boot parameters offset and length */
 /*=========================================================================*
  *                             mem_init                                   *
  *=========================================================================*/
-PRIVATE void mem_init()
+PRIVATE void mem_init(params)
+_CONST char *params;                           /* boot monitor parameters */
 {
 /* Initialize the free memory list from the 'memory' boot variable.  Translate
  * the byte offsets and sizes in this list to clicks, properly truncated. Also
@@ -128,22 +127,23 @@ PRIVATE void mem_init()
    * b1:s1 is mem between 1M and 16M, b2:s2 is mem above 16M. Pairs b1:s1 
    * and b2:s2 are combined if the memory is adjacent. 
    */
-  s = getkenv("memory");               /* get memory boot variable */
+  s = get_value(params, "memory");     /* get memory boot variable */
   for (i = 0; i < NR_MEMS; i++) {
-       memp = &mem[i];                 /* result is stored here */
-       base = size = 0;
-       if (*s != 0) {                  /* end of boot variable */      
-           /* Expect base to be read (end != s) and ':' as next char. */ 
+       memp = &mem[i];                 /* next mem chunk is stored here */
+       base = size = 0;                /* initialize next base:size pair */
+       if (*s != 0) {                  /* get fresh data, unless at end */     
+
+           /* Read fresh base and expect colon as next char. */ 
            base = kstrtoul(s, &end, 0x10);             /* get number */
            if (end != s && *end == ':') s = ++end;     /* skip ':' */ 
-           else *s=0;          /* fake end for next; should not happen */
-           /* Expect size to be read and skip ',', unless at end. */ 
+           else *s=0;                  /* terminate, should not happen */
+
+           /* Read fresh size and expect comma or assume end. */ 
            size = kstrtoul(s, &end, 0x10);             /* get number */
            if (end != s && *end == ',') s = ++end;     /* skip ',' */
-           else if (end != s && *end == 0) s = end;    /* end found */
-           else *s=0;          /* fake end for next; should not happen */
+           else *s=0;                                  /* found end */
        }
-       limit = base + size;
+       limit = base + size;    /* limit is used for validity check */   
 #if _WORD_SIZE == 2
        max_address = kinfo.protected ? MAX_16BIT : MAX_REAL;
        if (limit > max_address) limit = max_address;
@@ -158,10 +158,11 @@ PRIVATE void mem_init()
 
 
 /*==========================================================================*
- *                             getkenv                                     *
+ *                             get_value                                           *
  *==========================================================================*/
-PUBLIC char *getkenv(name)
-_CONST char *name;
+PRIVATE char *get_value(params, name)
+_CONST char *params;                           /* boot monitor parameters */
+_CONST char *name;                             /* key to look up */
 {
 /* Get environment value - kernel version of getenv to avoid setting up the
  * usual environment array.
@@ -169,7 +170,7 @@ _CONST char *name;
   register _CONST char *namep;
   register char *envp;
 
-  for (envp = k_environ; *envp != 0;) {
+  for (envp = (char *) params; *envp != 0;) {
        for (namep = name; *namep != 0 && *namep == *envp; namep++, envp++)
                ;
        if (*namep == '\0' && *envp == '=') return(envp + 1);
index 37b051a913647bbde4cdaaaab8ce1bccf6d50156..fe0e1804f8a7c5d9d34955c501f44e56f18dc2d2 100644 (file)
@@ -13,7 +13,6 @@
 #include <minix/com.h>
 #include <minix/config.h>
 #include "proc.h"
-#include "assert.h"
 
 _PROTOTYPE( int do_exec, (message *m_ptr) );           /* process control */
 _PROTOTYPE( int do_fork, (message *m_ptr) );
@@ -27,6 +26,7 @@ _PROTOTYPE( int do_vcopy, (message *m_ptr) );
 #define do_virvcopy    do_vcopy
 #define do_physvcopy   do_vcopy
 _PROTOTYPE( int do_umap, (message *m_ptr) );
+_PROTOTYPE( int do_physzero, (message *m_ptr) );
 
 _PROTOTYPE( int do_unused, (message *m_ptr) );         /* miscellaneous */
 _PROTOTYPE( int do_abort, (message *m_ptr) );
@@ -60,9 +60,5 @@ _PROTOTYPE( int do_trace, (message *m_ptr) );         /* process tracing */
 #define do_trace do_unused
 #endif
 
-_PROTOTYPE( int do_vircopy, (message *m_ptr) );
-_PROTOTYPE( int do_physcopy, (message *m_ptr) );
-_PROTOTYPE( int do_physzero, (message *m_ptr) );
-_PROTOTYPE( int do_biosio, (message *m_ptr) );
 
 #endif /* SYSTEM_H */
index 6ff6151310b8c0b0191b35ccfdff8b5b41892585..51df0d07dd061cb25bb38bb9bb1b6eba29b68e7a 100644 (file)
@@ -37,7 +37,7 @@ a =   $h/config.h $h/const.h $h/type.h $h/ipc.h \
        $k/proc.h $k/const.h $k/type.h $k/proto.h $k/glo.h 
 
 # Dependencies from src/kernel/system.h
-b =    $k/system.h $h/com.h $k/proc.h $k/assert.h  
+b =    $k/system.h $h/com.h $k/proc.h 
 
 clock.o:       $a $b 
 copying.o:     $a $b 
index 73f90389fa9bfd3d0c0ae74c38a9d4e899bb7c7e..b985828d0d26f28ef6a926d311aa474a8c15dcc4 100644 (file)
@@ -2,7 +2,6 @@
 #include "../system.h"
 #include <unistd.h>
 #include <minix/config.h>
-INIT_ASSERT
 
 
 /*===========================================================================*
@@ -37,26 +36,26 @@ message *m_ptr;                     /* pointer to request message */
  * PM (normal abort or panic) or FS (panic), or TTY (a CTRL-ALT-DEL or ESC
  * after debugging dumps).
  */
-  register struct proc *rp;
-  phys_bytes src_phys;
-  vir_bytes len;
   int how = m_ptr->ABRT_HOW;
   
-  rp = proc_addr(m_ptr->m_source);
-
   if (how == RBT_MONITOR) {
-       /* The monitor is to run user specified instructions. */
-       len = m_ptr->ABRT_MON_LEN + 1;
-       assert(len <= kinfo.params_size);
-       src_phys = numap_local(m_ptr->ABRT_MON_PROC, 
-               (vir_bytes) m_ptr->ABRT_MON_ADDR, len);
-       assert(src_phys != 0);
-       phys_copy(src_phys, kinfo.params_base, (phys_bytes) len);
+      /* The monitor is to run user specified instructions. */
+      int proc_nr = m_ptr->ABRT_MON_PROC;
+      int length = m_ptr->ABRT_MON_LEN + 1;
+      vir_bytes src_vir = (vir_bytes) m_ptr->ABRT_MON_ADDR;
+      phys_bytes src_phys = numap_local(proc_nr, src_vir, length);
+
+      /* Validate length and address of shutdown code before copying. */
+      if (length > kinfo.params_size || src_phys == 0) 
+         kprintf("Warning, skipping shutdown code\n", NO_NUM);
+      else
+          phys_copy(src_phys, kinfo.params_base, (phys_bytes) length);
   }
   prepare_shutdown(how);
   return(OK);                          /* pro-forma (really EDISASTER) */
 }
 
+
 /* The system call implemented in this file:
  *   m_type:   SYS_GETINFO
  *
index 42566983db008b8910dbd6d8049dc2db149efb05..a608a8987f5360ca2342ad23f7d43b87976e7be1 100644 (file)
@@ -16,7 +16,6 @@
 #endif
 #include "../debug.h"
 
-INIT_ASSERT
 
 /*===========================================================================*
  *                             do_fork                                      *
@@ -33,9 +32,8 @@ register message *m_ptr;      /* pointer to request message */
   struct proc *rpp;
 
   rpp = proc_addr(m_ptr->PR_PPROC_NR);
-  assert(isuserp(rpp));
   rpc = proc_addr(m_ptr->PR_PROC_NR);
-  assert(isemptyp(rpc));
+  if (! isemptyp(rpc)) return(EINVAL);
 
   /* Copy parent 'proc' struct to child. */
 #if (CHIP == INTEL)
@@ -99,7 +97,7 @@ message *m_ptr;                       /* pointer to request message */
   /* Copy the map from PM. */
   src_phys = umap_local(proc_addr(caller), D, (vir_bytes) map_ptr, 
        sizeof(rp->p_memmap));
-  assert(src_phys != 0);
+  if (src_phys == 0) return(EFAULT);
   phys_copy(src_phys,vir2phys(rp->p_memmap),(phys_bytes)sizeof(rp->p_memmap));
 
 #if (CHIP != M68000)
@@ -140,7 +138,6 @@ register message *m_ptr;    /* pointer to request message */
   char *np;
 
   rp = proc_addr(m_ptr->PR_PROC_NR);
-  assert(isuserp(rp));
   if (m_ptr->PR_TRACING) cause_sig(m_ptr->PR_PROC_NR, SIGTRAP);
   sp = (reg_t) m_ptr->PR_STACK_PTR;
   rp->p_reg.sp = sp;           /* set the stack pointer */
index 21e0b04bc98cc3b1eeeb71c91dd3fd1bf9b12a38..d4b049841bc8350384792febb2f6cdce2a826e4e 100644 (file)
@@ -21,7 +21,6 @@
 #include "../system.h"
 #include <signal.h>
 #include <sys/sigcontext.h>
-INIT_ASSERT
 
 /* PM is ready to accept signals and repeatedly does a system call to get 
  * one. Find a process with pending signals. If no signals are available, 
@@ -72,61 +71,58 @@ message *m_ptr;                     /* pointer to request message */
 {
 /* Handle sys_sigsend, POSIX-style signal handling. */
 
-       struct sigmsg smsg;
-       register struct proc *rp;
-       phys_bytes src_phys, dst_phys;
-       struct sigcontext sc, *scp;
-       struct sigframe fr, *frp;
-
-       rp = proc_addr(m_ptr->SIG_PROC);
-       assert(isuserp(rp));
-
-       /* Get the sigmsg structure into our address space.  */
-       src_phys = umap_local(proc_addr(PM_PROC_NR), D, (vir_bytes) 
-               m_ptr->SIG_CTXT_PTR, (vir_bytes) sizeof(struct sigmsg));
-       assert(src_phys != 0);
-       phys_copy(src_phys,vir2phys(&smsg),(phys_bytes) sizeof(struct sigmsg));
-
-       /* Compute the user stack pointer where sigcontext will be stored. */
-       scp = (struct sigcontext *) smsg.sm_stkptr - 1;
-
-       /* Copy the registers to the sigcontext structure. */
-       kmemcpy(&sc.sc_regs, &rp->p_reg, sizeof(struct sigregs));
-
-       /* Finish the sigcontext initialization. */
-       sc.sc_flags = SC_SIGCONTEXT;
-       sc.sc_mask = smsg.sm_mask;
-
-       /* Copy the sigcontext structure to the user's stack. */
-       dst_phys = umap_local(rp, D, (vir_bytes) scp,
-                 (vir_bytes) sizeof(struct sigcontext));
-       if (dst_phys == 0) return(EFAULT);
-       phys_copy(vir2phys(&sc), dst_phys, 
-               (phys_bytes) sizeof(struct sigcontext));
-
-       /* Initialize the sigframe structure. */
-       frp = (struct sigframe *) scp - 1;
-       fr.sf_scpcopy = scp;
-       fr.sf_retadr2= (void (*)()) rp->p_reg.pc;
-       fr.sf_fp = rp->p_reg.fp;
-       rp->p_reg.fp = (reg_t) &frp->sf_fp;
-       fr.sf_scp = scp;
-       fr.sf_code = 0; /* XXX - should be used for type of FP exception */
-       fr.sf_signo = smsg.sm_signo;
-       fr.sf_retadr = (void (*)()) smsg.sm_sigreturn;
-
-       /* Copy the sigframe structure to the user's stack. */
-       dst_phys = umap_local(rp, D, (vir_bytes) frp, 
-               (vir_bytes) sizeof(struct sigframe));
-       if (dst_phys == 0) return(EFAULT);
-       phys_copy(vir2phys(&fr), dst_phys, 
-               (phys_bytes) sizeof(struct sigframe));
-
-       /* Reset user registers to execute the signal handler. */
-       rp->p_reg.sp = (reg_t) frp;
-       rp->p_reg.pc = (reg_t) smsg.sm_sighandler;
-
-       return(OK);
+  struct sigmsg smsg;
+  register struct proc *rp;
+  phys_bytes src_phys, dst_phys;
+  struct sigcontext sc, *scp;
+  struct sigframe fr, *frp;
+
+  rp = proc_addr(m_ptr->SIG_PROC);
+
+  /* Get the sigmsg structure into our address space.  */
+  src_phys = umap_local(proc_addr(PM_PROC_NR), D, (vir_bytes) 
+      m_ptr->SIG_CTXT_PTR, (vir_bytes) sizeof(struct sigmsg));
+  if (src_phys == 0) return(EFAULT);
+  phys_copy(src_phys,vir2phys(&smsg),(phys_bytes) sizeof(struct sigmsg));
+
+  /* Compute the user stack pointer where sigcontext will be stored. */
+  scp = (struct sigcontext *) smsg.sm_stkptr - 1;
+
+  /* Copy the registers to the sigcontext structure. */
+  kmemcpy(&sc.sc_regs, &rp->p_reg, sizeof(struct sigregs));
+
+  /* Finish the sigcontext initialization. */
+  sc.sc_flags = SC_SIGCONTEXT;
+  sc.sc_mask = smsg.sm_mask;
+
+  /* Copy the sigcontext structure to the user's stack. */
+  dst_phys = umap_local(rp, D, (vir_bytes) scp,
+      (vir_bytes) sizeof(struct sigcontext));
+  if (dst_phys == 0) return(EFAULT);
+  phys_copy(vir2phys(&sc), dst_phys, (phys_bytes) sizeof(struct sigcontext));
+
+  /* Initialize the sigframe structure. */
+  frp = (struct sigframe *) scp - 1;
+  fr.sf_scpcopy = scp;
+  fr.sf_retadr2= (void (*)()) rp->p_reg.pc;
+  fr.sf_fp = rp->p_reg.fp;
+  rp->p_reg.fp = (reg_t) &frp->sf_fp;
+  fr.sf_scp = scp;
+  fr.sf_code = 0;      /* XXX - should be used for type of FP exception */
+  fr.sf_signo = smsg.sm_signo;
+  fr.sf_retadr = (void (*)()) smsg.sm_sigreturn;
+
+  /* Copy the sigframe structure to the user's stack. */
+  dst_phys = umap_local(rp, D, (vir_bytes) frp, 
+      (vir_bytes) sizeof(struct sigframe));
+  if (dst_phys == 0) return(EFAULT);
+  phys_copy(vir2phys(&fr), dst_phys, (phys_bytes) sizeof(struct sigframe));
+
+  /* Reset user registers to execute the signal handler. */
+  rp->p_reg.sp = (reg_t) frp;
+  rp->p_reg.pc = (reg_t) smsg.sm_sighandler;
+
+  return(OK);
 }
 
 PUBLIC int do_sigreturn(m_ptr)
@@ -135,54 +131,47 @@ message *m_ptr;                   /* pointer to request message */
 /* POSIX style signals require sys_sigreturn to put things in order before 
  * the signalled process can resume execution
  */
-       struct sigcontext sc;
-       register struct proc *rp;
-       phys_bytes src_phys;
-
-       rp = proc_addr(m_ptr->SIG_PROC);
-       if (! isuserp(rp)) { 
-               kprintf("S_SIGRETURN: message source: %d; ", m_ptr->m_source); 
-               kprintf("got non-user process rp: %d\n", rp->p_nr);
-       }
-       assert(isuserp(rp));
-
-       /* Copy in the sigcontext structure. */
-       src_phys = umap_local(rp, D, (vir_bytes) m_ptr->SIG_CTXT_PTR,
-                 (vir_bytes) sizeof(struct sigcontext));
-       if (src_phys == 0) return(EFAULT);
-       phys_copy(src_phys, vir2phys(&sc), 
-               (phys_bytes) sizeof(struct sigcontext));
-
-       /* Make sure that this is not just a jmp_buf. */
-       if ((sc.sc_flags & SC_SIGCONTEXT) == 0) return(EINVAL);
-
-       /* Fix up only certain key registers if the compiler doesn't use
-        * register variables within functions containing setjmp.
-        */
-       if (sc.sc_flags & SC_NOREGLOCALS) {
-               rp->p_reg.retreg = sc.sc_retreg;
-               rp->p_reg.fp = sc.sc_fp;
-               rp->p_reg.pc = sc.sc_pc;
-               rp->p_reg.sp = sc.sc_sp;
-               return(OK);
-       }
-       sc.sc_psw  = rp->p_reg.psw;
+  struct sigcontext sc;
+  register struct proc *rp;
+  phys_bytes src_phys;
+
+  rp = proc_addr(m_ptr->SIG_PROC);
+
+  /* Copy in the sigcontext structure. */
+  src_phys = umap_local(rp, D, (vir_bytes) m_ptr->SIG_CTXT_PTR,
+      (vir_bytes) sizeof(struct sigcontext));
+  if (src_phys == 0) return(EFAULT);
+  phys_copy(src_phys, vir2phys(&sc), (phys_bytes) sizeof(struct sigcontext));
+
+  /* Make sure that this is not just a jmp_buf. */
+  if ((sc.sc_flags & SC_SIGCONTEXT) == 0) return(EINVAL);
+
+  /* Fix up only certain key registers if the compiler doesn't use
+   * register variables within functions containing setjmp.
+   */
+  if (sc.sc_flags & SC_NOREGLOCALS) {
+      rp->p_reg.retreg = sc.sc_retreg;
+      rp->p_reg.fp = sc.sc_fp;
+      rp->p_reg.pc = sc.sc_pc;
+      rp->p_reg.sp = sc.sc_sp;
+      return(OK);
+  }
+  sc.sc_psw  = rp->p_reg.psw;
 
 #if (CHIP == INTEL)
-       /* Don't panic kernel if user gave bad selectors. */
-       sc.sc_cs = rp->p_reg.cs;
-       sc.sc_ds = rp->p_reg.ds;
-       sc.sc_es = rp->p_reg.es;
+  /* Don't panic kernel if user gave bad selectors. */
+  sc.sc_cs = rp->p_reg.cs;
+  sc.sc_ds = rp->p_reg.ds;
+  sc.sc_es = rp->p_reg.es;
 #if _WORD_SIZE == 4
-       sc.sc_fs = rp->p_reg.fs;
-       sc.sc_gs = rp->p_reg.gs;
+  sc.sc_fs = rp->p_reg.fs;
+  sc.sc_gs = rp->p_reg.gs;
 #endif
 #endif
 
-       /* Restore the registers. */
-       kmemcpy(&rp->p_reg, (char *)&sc.sc_regs, sizeof(struct sigregs));
-       return(OK);
-
+  /* Restore the registers. */
+  kmemcpy(&rp->p_reg, (char *)&sc.sc_regs, sizeof(struct sigregs));
+  return(OK);
 }
 
 /*===========================================================================*