Re: doscmd broken on current? fixed

1999-11-08 Thread Bruce Evans

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



Re: doscmd broken on current? fixed

1999-11-07 Thread John Hay

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
related functions and structures and it isn't always clear (to me at least)
what should be filled in for whom.

John
-- 
John Hay -- [EMAIL PROTECTED]


Index: cwd.c
===
RCS file: /home/ncvs/src/usr.bin/doscmd/cwd.c,v
retrieving revision 1.5
diff -u -r1.5 cwd.c
--- cwd.c   1999/10/12 22:20:18 1.5
+++ cwd.c   1999/11/07 18:59:06
@@ -198,7 +198,7 @@
 u_char *np;
 Path_t *d;
 u_char tmppath[1024];
-u_char snewpath = newpath;
+u_char *snewpath = newpath;
 
 if (where[0] != '\0'  where[1] == ':') {
drive = drlton(*where);
@@ -253,7 +253,7 @@
} else {
if (np[-1] != '\\')
*np++ = '\\';
-   while (*np = *dir++  np - snewpath  1023)
+   while ((*np = *dir++)  np - snewpath  1023)
++np;
}
 }
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.c1999/10/13 23:48:35 1.11
+++ doscmd.c1999/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);


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message