syslib.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #include <lib.h>
  2. #include <minix/com.h>
  3. /*----------------------------------------------------------------------------
  4. Messages to systask (special calls)
  5. ----------------------------------------------------------------------------*/
  6. #if (CHIP == M68000)
  7. PUBLIC _PROTOTYPE( void sys_xit, (int parent, int proc,
  8. phys_clicks *basep, phys_clicks *sizep));
  9. #else
  10. PUBLIC _PROTOTYPE( void sys_xit, (int parent, int proc));
  11. #endif
  12. PUBLIC _PROTOTYPE( void sys_getsp, (int proc, vir_bytes *newsp));
  13. PUBLIC _PROTOTYPE( void sys_sig, (int proc, int sig, void (*sighandler)(int)));
  14. #if (CHIP == M68000)
  15. #ifdef ALCYON_C_BUG_FIXED
  16. PUBLIC _PROTOTYPE( void sys_fork, (int prnt, int chld, int pd, phys_clicks shdw));
  17. #else
  18. PUBLIC _PROTOTYPE( void sys_fork, (int parent, int child, int pid, int shadow));
  19. #endif
  20. #else
  21. PUBLIC _PROTOTYPE( void sys_fork, (int parent, int child, int pid));
  22. #endif
  23. PUBLIC _PROTOTYPE( void sys_exec, (int proc, char *ptr, int traced));
  24. PUBLIC _PROTOTYPE( void sys_newmap, (int proc, char *ptr));
  25. PUBLIC _PROTOTYPE( void sys_copy, (message *mptr));
  26. PUBLIC _PROTOTYPE( void sys_times, (int proc, time_t ptr[4]));
  27. PUBLIC _PROTOTYPE( void sys_abort, (void));
  28. #if (CHIP == M68000)
  29. PUBLIC _PROTOTYPE( void sys_fresh, (int proc, char *ptr, phys_clicks dc,
  30. phys_clicks *basep, phys_clicks *sizep));
  31. #endif
  32. PUBLIC _PROTOTYPE( void sys_kill, (int proc, int sig));
  33. PUBLIC _PROTOTYPE( int sys_trace, (int req, int procnr,
  34. long addr, long *data_p));
  35. PUBLIC _PROTOTYPE( void tell_fs, ( int what, int p1, int p2, int p3));
  36. #if (CHIP == M68000)
  37. PUBLIC void sys_xit(parent, proc, basep, sizep)
  38. phys_clicks *basep, *sizep;
  39. #else
  40. PUBLIC void sys_xit(parent, proc)
  41. #endif
  42. int parent; /* parent of exiting proc. */
  43. int proc; /* which proc has exited */
  44. {
  45. /* A proc has exited. Tell the kernel. */
  46. _callm1(SYSTASK, SYS_XIT, parent, proc, 0, NIL_PTR, NIL_PTR, NIL_PTR);
  47. #if (CHIP == M68000)
  48. *basep = (phys_clicks) _M.m1_i1;
  49. *sizep = (phys_clicks) _M.m1_i2;
  50. #endif
  51. }
  52. PUBLIC void sys_getsp(proc, newsp)
  53. int proc; /* which proc has enabled signals */
  54. vir_bytes *newsp; /* place to put sp read from kernel */
  55. {
  56. /* Ask the kernel what the sp is. */
  57. _callm1(SYSTASK, SYS_GETSP, proc, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR);
  58. *newsp = (vir_bytes) _M.STACK_PTR;
  59. }
  60. PUBLIC void sys_sig(proc, sig, sighandler)
  61. int proc; /* which proc has exited */
  62. int sig; /* signal number: 1 - 16 */
  63. _PROTOTYPE(void (*sighandler), (int));/* pointer to signal handler in user space */
  64. {
  65. /* A proc has to be signaled. Tell the kernel. */
  66. _M.m6_i1 = proc;
  67. _M.m6_i2 = sig;
  68. _M.m6_f1 = sighandler;
  69. _callx(SYSTASK, SYS_SIG);
  70. }
  71. #if (CHIP == M68000)
  72. PUBLIC void sys_fork(parent, child, pid, shadow)
  73. #ifdef ALCYON_C_BUG_FIXED
  74. phys_clicks shadow; /* memory allocated for shadow */
  75. #else
  76. int shadow;
  77. #endif
  78. #else
  79. PUBLIC void sys_fork(parent, child, pid)
  80. #endif
  81. int parent; /* proc doing the fork */
  82. int child; /* which proc has been created by the fork */
  83. int pid; /* process id assigned by MM */
  84. {
  85. /* A proc has forked. Tell the kernel. */
  86. #if (CHIP == M68000)
  87. _callm1(SYSTASK, SYS_FORK, parent, child, pid, (char *) shadow, NIL_PTR, NIL_PTR);
  88. #else
  89. _callm1(SYSTASK, SYS_FORK, parent, child, pid, NIL_PTR, NIL_PTR, NIL_PTR);
  90. #endif
  91. }
  92. PUBLIC void sys_exec(proc, ptr, traced)
  93. int proc; /* proc that did exec */
  94. char *ptr; /* new stack pointer */
  95. int traced; /* is tracing enabled? */
  96. {
  97. /* A proc has exec'd. Tell the kernel. */
  98. _callm1(SYSTASK, SYS_EXEC, proc, traced, 0, ptr, NIL_PTR, NIL_PTR);
  99. }
  100. PUBLIC void sys_newmap(proc, ptr)
  101. int proc; /* proc whose map is to be changed */
  102. char *ptr; /* pointer to new map */
  103. {
  104. /* A proc has been assigned a new memory map. Tell the kernel. */
  105. _callm1(SYSTASK, SYS_NEWMAP, proc, 0, 0, ptr, NIL_PTR, NIL_PTR);
  106. }
  107. PUBLIC void sys_copy(mptr)
  108. message *mptr; /* pointer to message */
  109. {
  110. /* A proc wants to use local copy. */
  111. /* Make this routine better. Also check other guys' error handling
  112. * -DEBUG */
  113. mptr->m_type = SYS_COPY;
  114. if (_sendrec(SYSTASK, mptr) != 0) panic("sys_copy can't send", NO_NUM);
  115. }
  116. PUBLIC void sys_times(proc, ptr)
  117. int proc; /* proc whose times are needed */
  118. time_t ptr[4]; /* pointer to time buffer */
  119. {
  120. /* Fetch the accounting info for a proc. */
  121. _callm1(SYSTASK, SYS_TIMES, proc, 0, 0, (char *)ptr, NIL_PTR, NIL_PTR);
  122. ptr[0] = _M.USER_TIME;
  123. ptr[1] = _M.SYSTEM_TIME;
  124. ptr[2] = _M.CHILD_UTIME;
  125. ptr[3] = _M.CHILD_STIME;
  126. }
  127. PUBLIC void sys_abort()
  128. {
  129. /* Something awful has happened. Abandon ship. */
  130. _callm1(SYSTASK, SYS_ABORT, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR);
  131. }
  132. #if (CHIP == M68000)
  133. PUBLIC void sys_fresh(proc, ptr, dc, basep, sizep)
  134. int proc; /* proc whose map is to be changed */
  135. char *ptr; /* pointer to new map */
  136. phys_clicks dc; /* size of initialized data */
  137. phys_clicks *basep, *sizep; /* base and size for free_mem() */
  138. {
  139. /* Create a fresh process image for exec(). Tell the kernel. */
  140. _callm1(SYSTASK, SYS_FRESH, proc, (int) dc, 0, ptr, NIL_PTR, NIL_PTR);
  141. *basep = (phys_clicks) _M.m1_i1;
  142. *sizep = (phys_clicks) _M.m1_i2;
  143. }
  144. #endif
  145. PUBLIC void sys_kill(proc, sig)
  146. int proc; /* which proc has exited */
  147. int sig; /* signal number: 1 - 16 */
  148. {
  149. /* A proc has to be signaled via MM. Tell the kernel. */
  150. _M.m6_i1 = proc;
  151. _M.m6_i2 = sig;
  152. _callx(SYSTASK, SYS_KILL);
  153. }
  154. PUBLIC int sys_trace(req, procnr, addr, data_p)
  155. int req, procnr;
  156. long addr, *data_p;
  157. {
  158. int r;
  159. _M.m2_i1 = procnr;
  160. _M.m2_i2 = req;
  161. _M.m2_l1 = addr;
  162. if (data_p) _M.m2_l2 = *data_p;
  163. r = _callx(SYSTASK, SYS_TRACE);
  164. if (data_p) *data_p = _M.m2_l2;
  165. return(r);
  166. }
  167. PUBLIC void tell_fs(what, p1, p2, p3)
  168. int what, p1, p2, p3;
  169. {
  170. /* This routine is only used by MM to inform FS of certain events:
  171. * tell_fs(CHDIR, slot, dir, 0)
  172. * tell_fs(EXEC, proc, 0, 0)
  173. * tell_fs(EXIT, proc, 0, 0)
  174. * tell_fs(FORK, parent, child, pid)
  175. * tell_fs(SETGID, proc, realgid, effgid)
  176. * tell_fs(SETUID, proc, realuid, effuid)
  177. * tell_fs(SYNC, 0, 0, 0)
  178. * tell_fs(UNPAUSE, proc, signr, 0)
  179. * tell_fs(SETPGRP, proc, 0, 0)
  180. */
  181. _callm1(FS, what, p1, p2, p3, NIL_PTR, NIL_PTR, NIL_PTR);
  182. }