CPPFLAGS+= -DUSE_WATCHDOG
.endif
-.if ${USE_MCONTEXT} != "no"
-SRCS+= do_mcontext.c
-CPPFLAGS+= -DUSE_MCONTEXT
-.endif
-
# Extra debugging routines
.if ${USE_SYSDEBUG} != "no"
SRCS+= debug.c
CPPFLAGS+= -DUSE_UPDATE
.endif
-.if ${USE_STATECTL} != "no"
-CPPFLAGS+= -DUSE_STATECTL
-.endif
-
-.if ${USE_TRACE} != "no"
-CPPFLAGS+= -DUSE_TRACE
-.endif
-
CLEANFILES+=extracted-errno.h extracted-mfield.h extracted-mtype.h procoffsets.h
debug.o debug.d: extracted-errno.h extracted-mfield.h extracted-mtype.h
#define USE_EXEC 1 /* update process after execute */
#define USE_CLEAR 1 /* clean up after process exit */
#define USE_EXIT 1 /* a system process wants to exit */
+#define USE_TRACE 1 /* process information and tracing */
#define USE_GETKSIG 1 /* retrieve pending kernel signals */
#define USE_ENDKSIG 1 /* finish pending kernel signals */
#define USE_KILL 1 /* send a signal to a process */
#define USE_PHYSCOPY 1 /* copy using physical addressing */
#define USE_MEMSET 1 /* write char to a given memory area */
#define USE_RUNCTL 1 /* control stop flags of a process */
+#define USE_STATECTL 1 /* let a process control its state */
+#define USE_MCONTEXT 1 /* enable getting/setting of machine context */
#if defined(__arm__)
#define USE_PADCONF 1 /* configure pinmux */
do_cprofile.c \
do_profbuf.c \
do_vmctl.c \
+ do_mcontext.c \
do_schedule.c \
do_schedctl.c \
do_statectl.c
SRCS= driver.c drvlib.c driver_st.c driver_mt.c mq.c trace.c
-.if ${USE_STATECTL} != "no"
-CPPFLAGS+= -DUSE_STATECTL
-.endif
-
.include <bsd.lib.mk>
* will not restart statefully, and thus will skip this code.
*/
if (type == SEF_INIT_RESTART) {
-#if USE_STATECTL
if ((r = sys_statectl(SYS_STATE_CLEAR_IPC_REFS)) != OK)
panic("blockdriver_init: sys_statectl failed: %d", r);
-#endif
}
/* Publish a driver up event. */
SRCS= chardriver.c
-.if ${USE_STATECTL} != "no"
-CPPFLAGS+= -DUSE_STATECTL
-.endif
-
.include <bsd.lib.mk>
* For this reason, there may blocked callers when a driver restarts.
* Ask the kernel to unblock them (if any).
*/
-#if USE_STATECTL
if ((r = sys_statectl(SYS_STATE_CLEAR_IPC_REFS)) != OK)
panic("chardriver_announce: sys_statectl failed: %d", r);
-#endif
/* Publish a driver up event. */
if ((r = ds_retrieve_label_name(label, getprocnr())) != OK)
* For this reason, there may blocked callers when a driver restarts.
* Ask the kernel to unblock them (if any).
*/
-#if USE_STATECTL
if ((r = sys_statectl(SYS_STATE_CLEAR_IPC_REFS)) != OK) {
panic("chardriver_init: sys_statectl failed: %d", r);
}
-#endif
/* Publish a driver up event. */
r = ds_retrieve_label_name(label, getprocnr());
# Makefile for Process Manager (PM)
PROG= pm
SRCS= main.c forkexit.c break.c exec.c time.c alarm.c \
- signal.c utility.c table.c getset.c misc.c \
- profile.c schedule.c
-
-.if ${USE_MCONTEXT} != "no"
-SRCS+= mcontext.c
-CPPFLAGS+= -DUSE_MCONTEXT
-.endif
-
-.if ${USE_TRACE} != "no"
-SRCS+= trace.c
-CPPFLAGS+= -DUSE_TRACE
-.endif
+ signal.c utility.c table.c trace.c getset.c misc.c \
+ profile.c mcontext.c schedule.c
DPADD+= ${LIBSYS} ${LIBTIMERS}
LDADD+= -lsys -ltimers
/* Cause a signal if this process is traced.
* Do this before making the process runnable again!
*/
-#if USE_TRACE
if (rmp->mp_tracer != NO_TRACER && !(rmp->mp_trace_flags & TO_NOEXEC))
{
sn = (rmp->mp_trace_flags & TO_ALTEXEC) ? SIGSTOP : SIGTRAP;
check_sig(rmp->mp_pid, sn, FALSE /* ksig */);
}
-#endif /* USE_TRACE */
/* Call kernel to exec with SP and PC set by VFS. */
r = sys_exec(rmp->mp_endpoint, (char *) sp, rmp->mp_name, pc, ps_str);
tell_vfs(rmc, &m);
-#if USE_TRACE
/* Tell the tracer, if any, about the new child */
if (rmc->mp_tracer != NO_TRACER)
sig_proc(rmc, SIGSTOP, TRUE /*trace*/, FALSE /* ksig */);
-#endif /* USE_TRACE */
/* Do not reply until VFS is ready to process the fork
* request
tell_vfs(rmc, &m);
-#if USE_TRACE
/* Tell the tracer, if any, about the new child */
if (rmc->mp_tracer != NO_TRACER)
sig_proc(rmc, SIGSTOP, TRUE /*trace*/, FALSE /* ksig */);
-#endif /* USE_TRACE */
/* Wakeup the newly created process */
setreply(rmc-mproc, OK);
/* If the process has children, disinherit them. INIT is the new parent. */
for (rmp = &mproc[0]; rmp < &mproc[NR_PROCS]; rmp++) {
if (!(rmp->mp_flags & IN_USE)) continue;
-#if USE_TRACE
if (rmp->mp_tracer == proc_nr) {
/* This child's tracer died. Do something sensible. */
tracer_died(rmp);
}
-#endif /* USE_TRACE */
if (rmp->mp_parent == proc_nr) {
/* 'rmp' now points to a child to be disinherited. */
rmp->mp_parent = INIT_PROC_NR;
panic("exit_restart: vm_exit failed: %d", r);
}
-#if USE_TRACE
if (rmp->mp_flags & TRACE_EXIT)
{
/* Wake up the tracer, completing the ptrace(T_EXIT) call */
mproc[rmp->mp_tracer].mp_reply.reply_trace = 0;
setreply(rmp->mp_tracer, OK);
}
-#endif /* USE_TRACE */
/* Clean up if the parent has collected the exit status */
if (rmp->mp_flags & TOLD_PARENT)
children++; /* this child is acceptable */
-#if USE_TRACE
if (rp->mp_tracer == who_p) {
if (rp->mp_flags & TRACE_ZOMBIE) {
/* Traced child meets the pid test and has exited. */
}
}
}
-#endif /* USE_TRACE */
if (rp->mp_parent == who_p) {
if (rp->mp_flags & ZOMBIE) {
/* See if we have to notify a tracer process first. */
if (rmp->mp_tracer != NO_TRACER && rmp->mp_tracer != rmp->mp_parent) {
-#if USE_TRACE
rmp->mp_flags |= TRACE_ZOMBIE;
t_mp = &mproc[rmp->mp_tracer];
return;
tell_tracer(rmp);
-#endif /* USE_TRACE */
}
else {
rmp->mp_flags |= ZOMBIE;
child->mp_flags |= TOLD_PARENT; /* avoid informing parent twice */
}
-#if USE_TRACE
/*===========================================================================*
* tell_tracer *
*===========================================================================*/
check_parent(child, TRUE /*try_cleanup*/);
}
}
-#endif /* USE_TRACE */
/*===========================================================================*
* cleanup *
/* mcontext.c */
int do_getmcontext(void);
int do_setmcontext(void);
-#if ! USE_MCONTEXT
-#define do_getmcontext no_sys
-#define do_setmcontext no_sys
-#endif
/* misc.c */
int do_reboot(void);
/* trace.c */
int do_trace(void);
void stop_proc(struct mproc *rmp, int sig_nr);
-#if ! USE_TRACE
-#define do_trace no_sys
-#define stop_proc no_sys
-#endif
/* utility.c */
pid_t get_free_pid(void);
panic("PM: signal %d sent to exiting process %d\n", signo, slot);
}
-#if USE_TRACE
if (trace == TRUE && rmp->mp_tracer != NO_TRACER && signo != SIGKILL) {
/* Signal should be passed to the debugger first.
* This happens before any checks on block/ignore masks; otherwise,
return;
}
-#endif
if (rmp->mp_flags & VFS_CALL) {
sigaddset(&rmp->mp_sigpending, signo);
return;
}
-#if USE_TRACE
if ((rmp->mp_flags & STOPPED) && signo != SIGKILL) {
/* If the process is stopped for a debugger, do not deliver any signals
* (except SIGKILL) in order not to confuse the debugger. The signals
sigaddset(&rmp->mp_ksigpending, signo);
return;
}
-#endif /* USE_TRACE */
if (!badignore && sigismember(&rmp->mp_catch, signo)) {
/* Signal is caught. First interrupt the process's current call, if
* applicable. This may involve a roundtrip to VFS, in which case we'll
if (rmp->mp_flags & (VFS_CALL | EXITING)) return;
if (rmp->mp_flags & TRACE_EXIT) {
-#if USE_TRACE
/* Tracer requested exit with specific exit value */
exit_proc(rmp, rmp->mp_exitstatus, FALSE /*dump_core*/);
-#endif /* USE_TRACE */
}
else if (rmp->mp_flags & PM_SIG_PENDING) {
/* We saved signal(s) for after finishing a VFS call. Deal with this.
#MINIX-specific vars
_MKVARS.yes+= \
- MKMCONTEXT MKSYSDEBUG MKLIVEUPDATE MKSTATECTL MKTRACE MKLWIP
+ MKSYSDEBUG MKLIVEUPDATE MKLWIP
.if (${MACHINE_ARCH} == "i386")
_MKVARS.yes+= \
MKWATCHDOG MKACPI MKAPIC MKDEBUGREG MKINSTALLBOOT MKPCI
MKWATCHDOG:= no
MKACPI:= no
MKAPIC:= no
-MKMCONTEXT:= no
MKDEBUGREG:= no
MKSYSDEBUG:= no
MKLIVEUPDATE:= no
-MKSTATECTL:= no
-MKTRACE:= no
.endif
#
#MINIX-specific vars
.for var in \
- USE_WATCHDOG USE_ACPI USE_APIC USE_MCONTEXT USE_DEBUGREG USE_SYSDEBUG \
- USE_LIVEUPDATE USE_STATECTL USE_TRACE USE_PCI USE_BITCODE
+ USE_WATCHDOG USE_ACPI USE_APIC USE_DEBUGREG USE_SYSDEBUG \
+ USE_LIVEUPDATE USE_PCI USE_BITCODE
.if (${${var:S/USE_/MK/}} == "no")
${var}:= no
.else