On Sun, 7 Nov 1999, John Hay wrote:
Ok, with these patches doscmd is working for me again. I can boot dos and
run the topspeed C compiler like I used to a few months ago.
If nobody has any complaints I'll commit it. I'm just not 100% sure about
the patch to doscmd.c and would like if someone with more knowledge about
the signal stuff would just look at it. There is just too many signal
Index: doscmd.c
===
RCS file: /home/ncvs/src/usr.bin/doscmd/doscmd.c,v
retrieving revision 1.11
diff -u -r1.11 doscmd.c
--- doscmd.c 1999/10/13 23:48:35 1.11
+++ doscmd.c 1999/11/07 12:50:06
@@ -258,6 +258,7 @@
sigemptyset(uc.uc_sigmask);
sigaltstack(NULL, uc.uc_stack);
+uc.uc_mcontext.mc_onstack = uc.uc_stack.ss_flags;
if (tmode)
tracetrap(REGS);
I only know this well enough to use the source quickly.
Setting the onstack flag to the stack flags is logically wrong because
the onstack flag is a single bit (1 or SS_ONSTACK; see (*)), while the
stack flags are some combination of SS_DISABLE and SS_ONSTACK (see
sigaltstack(2)). The following would be logically correct:
+uc.uc_mcontext.mc_onstack = uc.uc_stack.ss_flags SS_ONSTACK;
but since the alternative signal stack is not in use at this point,
the rvalue is known to be 0 and the fix can be reduced to:
+uc.uc_mcontext.mc_onstack = 0;
as in RELENG_3. RELENG_3 also omits the sigaltstack() call (which
gives the current (almost known) alt stack settings). I think this
is valid because uc_stack and mc_onstack are read-only for signal
handlers (any changes to uc_stack will be ignored on sigreturn(),
and any changes to mc_onstack will make a mess). When sigreturn()
is called with a made-up context as in doscmd:main(), mc_onstack
needs to be initialised to avoid making a mess.
(*) In RELENG_3, the SS_ONSTACK bit in ss_flags is passed to signal
handlers as "sc_onstack = ss_flags SS_ONSTACK" but assumed to
be returned via sigreturn() as "sc_onstack 01". Since
signal handlers are not expected to modify sc_onstack, this only
works if SS_ONSTACK = 1, as it is.
In -current, the SS_ONSTACK bit in ss_flags is passed to signal
handlers as "mc_onstack = ss_flags SS_ONSTACK ? 1 : 0", so the
old handling of the flag in sigreturn() is now logically correct,
but this is broken since it changes the semantics for setting
mc_onstack.
Related problems:
The USE_VM86 case in doscmd.c is more broken than in RELENG_3. It
is missing sc - uc name changes.
Unrelated problems:
Your patch for cwd.c helps, but lookup of /dosD/bin/ls.exe is still
broken. The path gets converted to //dosd/bin/ls.exe. The // is
wrong and the /dosd is broken, since that part of the path is in ffs
which is case-sensitive.
Bruce
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message