Index: doscmd/Makefile diff -c doscmd/Makefile:1.1.1.1 doscmd/Makefile:1.1.1.1.2.4 *** doscmd/Makefile:1.1.1.1 Wed May 12 11:22:35 1999 --- doscmd/Makefile Thu Jun 28 23:24:57 2001 *************** *** 1,4 **** --- 1,5 ---- # BSDI Makefile,v 2.6 1996/04/08 20:06:40 bostic Exp + # $Id$ PROG= doscmd SRCS= AsyncIO.c ParseBuffer.c \ *************** *** 11,27 **** BINGRP= kmem EXEGRP= bin BINMODE=2555 EXEMODE=444 ! CFLAGS+=-I/usr/X11/include -DDISASSEMBLER -g ! LDFLAGS+=-L/usr/X11/lib LDADD+= -lX11 -li386 -lgcc -lc -lgcc ! DPADD+= /usr/X11/lib/libX11.a ${LIBC} ${LIBGCC} afterinstall: ! install ${COPY} -o ${BINOWN} -g ${EXEGRP} -m ${EXEMODE} \ ! doscmd.kernel ${DESTDIR}/usr/libexec/doscmd.kernel ! install -c -o ${BINOWN} -g ${EXEGRP} -m ${EXEMODE} \ ! ${.CURDIR}/instbsdi.exe ${DESTDIR}/usr/dos/ doscmd: doscmd.kernel ${LIBCRT0} doscmd_loader.o ld -N -Bstatic -o doscmd ${LDFLAGS} ${LIBCRT0} doscmd_loader.o ${LDADD} --- 12,29 ---- BINGRP= kmem EXEGRP= bin BINMODE=2555 + BINDIR=/usr/local/bin EXEMODE=444 ! LIBGCCPATH=`gcc -print-libgcc-file-name | sed s/libgcc.a//` ! CFLAGS+=-I/usr/X11R6/include -DDISASSEMBLER -g ! LDFLAGS+=-L/usr/X11R6/lib -L${LIBGCCPATH} LDADD+= -lX11 -li386 -lgcc -lc -lgcc ! DPADD+= /usr/X11R6/lib/libX11.a ${LIBC} ${LIBGCC} afterinstall: ! install -c -o ${BINOWN} -g ${EXEGRP} -m ${EXEMODE} doscmd.kernel ${DESTDIR}/usr/local/libexec ! -test ! -d ${DESTDIR}/usr/local/dos && mkdir -m 777 ${DESTDIR}/usr/local/dos ! install -c -o ${BINOWN} -g ${EXEGRP} -m ${EXEMODE} ${.CURDIR}/instbsdi.exe ${DESTDIR}/usr/local/dos/ doscmd: doscmd.kernel ${LIBCRT0} doscmd_loader.o ld -N -Bstatic -o doscmd ${LDFLAGS} ${LIBCRT0} doscmd_loader.o ${LDADD} Index: doscmd/bios.c diff -c doscmd/bios.c:1.1.1.1 doscmd/bios.c:1.1.1.1.2.1 *** doscmd/bios.c:1.1.1.1 Wed May 12 11:22:35 1999 --- doscmd/bios.c Wed May 12 12:31:07 1999 *************** *** 220,226 **** } gettimeofday(&tv, &tz); ! tm = *localtime(&tv.tv_sec); *(u_long *)&BIOSDATA[0x6c] = (((tm.tm_hour * 60 + tm.tm_min) * 60) + tm.tm_sec) * 182 / 10; --- 220,226 ---- } gettimeofday(&tv, &tz); ! tm = *localtime((time_t *)&tv.tv_sec); *(u_long *)&BIOSDATA[0x6c] = (((tm.tm_hour * 60 + tm.tm_min) * 60) + tm.tm_sec) * 182 / 10; Index: doscmd/doscmd.h diff -c doscmd/doscmd.h:1.1.1.1 doscmd/doscmd.h:1.1.1.1.2.1 *** doscmd/doscmd.h:1.1.1.1 Wed May 12 11:22:35 1999 --- doscmd/doscmd.h Wed May 12 12:31:07 1999 *************** *** 30,36 **** * BSDI doscmd.h,v 2.3 1996/04/08 19:32:32 bostic Exp */ ! #ifdef __NetBSD__ #define USE_VM86 #endif --- 30,36 ---- * BSDI doscmd.h,v 2.3 1996/04/08 19:32:32 bostic Exp */ ! #if defined( __NetBSD__) || defined(__OpenBSD__) #define USE_VM86 #endif *************** *** 58,64 **** #define MAX_AVAIL_SEG 0xa000 char *dosmem; ! char cmdname[]; int dosmem_size; int pspseg; /* segment # of PSP */ --- 58,64 ---- #define MAX_AVAIL_SEG 0xa000 char *dosmem; ! extern char cmdname[]; int dosmem_size; int pspseg; /* segment # of PSP */ *************** *** 77,83 **** #define PRB_V86_FORMAT 0x4242 #endif ! extern struct sigframe *saved_sigframe; int vflag; int tmode; --- 77,83 ---- #define PRB_V86_FORMAT 0x4242 #endif ! extern struct sigcontext *saved_sigcontext; int vflag; int tmode; *************** *** 214,226 **** void unknown_int3(int, int, int, struct sigcontext *); void unknown_int4(int, int, int, int, struct sigcontext *); ! void sigtrap(struct sigframe *); ! void sigtrace(struct sigframe *); ! void sigalrm(struct sigframe *); ! void sigill(struct sigframe *); ! void sigurg(struct sigframe *); ! void sigfpe(struct sigframe *); ! void breakpoint(struct sigframe *); void outb_traceport(int, unsigned char); unsigned char inb_traceport(int); --- 214,226 ---- void unknown_int3(int, int, int, struct sigcontext *); void unknown_int4(int, int, int, int, struct sigcontext *); ! void sigtrap(int, siginfo_t *, struct sigcontext *); ! void sigtrace(int, siginfo_t *, struct sigcontext *); ! void sigalrm(int, siginfo_t *, struct sigcontext *); ! void sigill(int, siginfo_t *, struct sigcontext *); ! void sigurg(int, siginfo_t *, struct sigcontext *); ! void sigfpe(int, siginfo_t *, struct sigcontext *); ! void breakpoint(int, siginfo_t *, struct sigcontext *); void outb_traceport(int, unsigned char); unsigned char inb_traceport(int); Index: doscmd/doscmd_loader.c diff -c doscmd/doscmd_loader.c:1.1.1.1 doscmd/doscmd_loader.c:1.1.1.1.2.1 *** doscmd/doscmd_loader.c:1.1.1.1 Wed May 12 11:22:34 1999 --- doscmd/doscmd_loader.c Mon May 17 17:07:20 1999 *************** *** 38,44 **** */ static const char filler[4096] = { 0, }; ! #define _PATH_DOS_KERNEL_DIR "/usr/libexec/" #define _PATH_DOS_KERNEL "doscmd.kernel" int --- 38,44 ---- */ static const char filler[4096] = { 0, }; ! #define _PATH_DOS_KERNEL_DIR "/usr/local/libexec/" #define _PATH_DOS_KERNEL "doscmd.kernel" int *************** *** 65,71 **** return(exec.a_entry); } ! void main(int argc, char **argv, char **environ) { void (*entry_point)(); --- 65,71 ---- return(exec.a_entry); } ! int main(int argc, char **argv, char **environ) { void (*entry_point)(); Index: doscmd/instbsdi.exe Index: doscmd/int.c diff -c doscmd/int.c:1.1.1.1 doscmd/int.c:1.1.1.1.2.1 *** doscmd/int.c:1.1.1.1 Wed May 12 11:22:35 1999 --- doscmd/int.c Wed May 12 12:31:07 1999 *************** *** 3,9 **** void softint(int intnum) { ! #define sc (&saved_sigframe->sf_sc) u_long vec = ivec[intnum]; if (dead || !saved_valid || vec == 0) --- 3,10 ---- void softint(int intnum) { ! struct sigcontext *sc = saved_sigcontext; ! u_long vec = ivec[intnum]; if (dead || !saved_valid || vec == 0) *************** *** 19,31 **** PUSH(GET16(sc->sc_cs), sc); PUSH(GET16(sc->sc_eip), sc); PUTVEC(sc->sc_cs, sc->sc_eip, vec); - #undef sc } void hardint(int intnum) { ! #define sc (&saved_sigframe->sf_sc) /* * XXXXX * We should simulate the IRQ mask in the PIC. --- 20,31 ---- PUSH(GET16(sc->sc_cs), sc); PUSH(GET16(sc->sc_eip), sc); PUTVEC(sc->sc_cs, sc->sc_eip, vec); } void hardint(int intnum) { ! struct sigcontext *sc = saved_sigcontext; /* * XXXXX * We should simulate the IRQ mask in the PIC. *************** *** 48,52 **** sc->sc_eflags &= ~PSL_I; PUTVEC(sc->sc_cs, sc->sc_eip, vec); } - #undef sc } --- 48,51 ---- Index: doscmd/int1a.c diff -c doscmd/int1a.c:1.1.1.1 doscmd/int1a.c:1.1.1.1.2.1 *** doscmd/int1a.c:1.1.1.1 Wed May 12 11:22:34 1999 --- doscmd/int1a.c Wed May 12 12:31:07 1999 *************** *** 55,61 **** gettimeofday(&tod, &zone); if (midnight == 0) { ! tm = localtime(&boot_time.tv_sec); midnight = boot_time.tv_sec - (((tm->tm_hour * 60) + tm->tm_min) * 60 + tm->tm_sec); --- 55,61 ---- gettimeofday(&tod, &zone); if (midnight == 0) { ! tm = localtime((time_t *)&boot_time.tv_sec); midnight = boot_time.tv_sec - (((tm->tm_hour * 60) + tm->tm_min) * 60 + tm->tm_sec); *************** *** 64,70 **** SET8L(sc->sc_eax, (tod.tv_sec - midnight) / (24 * 60 * 60)); if (GET8L(sc->sc_eax)) { ! tm = localtime(&boot_time.tv_sec); midnight = boot_time.tv_sec - (((tm->tm_hour * 60) + tm->tm_min) * 60 + tm->tm_sec); --- 64,70 ---- SET8L(sc->sc_eax, (tod.tv_sec - midnight) / (24 * 60 * 60)); if (GET8L(sc->sc_eax)) { ! tm = localtime((time_t *)&boot_time.tv_sec); midnight = boot_time.tv_sec - (((tm->tm_hour * 60) + tm->tm_min) * 60 + tm->tm_sec); *************** *** 80,86 **** case 0x02: gettimeofday(&tod, &zone); ! tm = localtime(&tod.tv_sec); SET8H(sc->sc_ecx, to_BCD(tm->tm_hour)); SET8L(sc->sc_ecx, to_BCD(tm->tm_min)); SET8H(sc->sc_edx, to_BCD(tm->tm_sec)); --- 80,86 ---- case 0x02: gettimeofday(&tod, &zone); ! tm = localtime((time_t *)&tod.tv_sec); SET8H(sc->sc_ecx, to_BCD(tm->tm_hour)); SET8L(sc->sc_ecx, to_BCD(tm->tm_min)); SET8H(sc->sc_edx, to_BCD(tm->tm_sec)); *************** *** 88,94 **** case 0x04: gettimeofday(&tod, &zone); ! tm = localtime(&tod.tv_sec); SET8H(sc->sc_ecx, to_BCD((tm->tm_year + 1900) / 100)); SET8L(sc->sc_ecx, to_BCD((tm->tm_year + 1900) % 100)); SET8H(sc->sc_edx, to_BCD(tm->tm_mon + 1)); --- 88,94 ---- case 0x04: gettimeofday(&tod, &zone); ! tm = localtime((time_t *)&tod.tv_sec); SET8H(sc->sc_ecx, to_BCD((tm->tm_year + 1900) / 100)); SET8L(sc->sc_ecx, to_BCD((tm->tm_year + 1900) % 100)); SET8H(sc->sc_edx, to_BCD(tm->tm_mon + 1)); Index: doscmd/signal.c diff -c doscmd/signal.c:1.1.1.1 doscmd/signal.c:1.1.1.1.2.1 *** doscmd/signal.c:1.1.1.1 Wed May 12 11:22:35 1999 --- doscmd/signal.c Wed May 12 12:31:07 1999 *************** *** 32,47 **** #include "doscmd.h" ! static void (*handler[NSIG])(struct sigframe *); static char signal_stack[16 * 1024]; #define PSS(w) { char s; printf(w " @ %08x\n", (signal_stack + sizeof signal_stack) - &s); } ! struct sigframe *saved_sigframe; int saved_valid = 0; void ! sanity_check(struct sigframe *sf) { #if 0 static sigset_t oset; --- 32,47 ---- #include "doscmd.h" ! static void (*handler[NSIG])(int, siginfo_t *, struct sigcontext *); static char signal_stack[16 * 1024]; #define PSS(w) { char s; printf(w " @ %08x\n", (signal_stack + sizeof signal_stack) - &s); } ! struct sigcontext *saved_sigcontext; int saved_valid = 0; void ! sanity_check(struct sigcontext *sc) { #if 0 static sigset_t oset; *************** *** 61,85 **** } void ! generichandler(struct sigframe sf) { ! #define sc (&sf.sf_sc) if (sc->sc_eflags & PSL_VM) { ! saved_sigframe = &sf; saved_valid = 1; ! if (handler[sf.sf_signum]) ! (*handler[sf.sf_signum])(&sf); saved_valid = 0; ! sanity_check(&sf); } else { ! if (handler[sf.sf_signum]) ! (*handler[sf.sf_signum])(&sf); } - #undef sc } void ! setsignal(int s, void (*h)(struct sigframe *)) { static int first = 1; struct sigaction sa; --- 61,84 ---- } void ! generichandler(int signum, siginfo_t *info, void *data) { ! struct sigcontext *sc =data; if (sc->sc_eflags & PSL_VM) { ! saved_sigcontext = sc; saved_valid = 1; ! if (handler[signum]) ! (*handler[signum])(signum, info, sc); saved_valid = 0; ! sanity_check(sc); } else { ! if (handler[signum]) ! (*handler[signum])(signum, info, sc); } } void ! setsignal(int s, void (*h)(int sig, siginfo_t *, struct sigcontext *)) { static int first = 1; struct sigaction sa; *************** *** 98,106 **** if (s >= 0 && s < NSIG) { handler[s] = h; ! sa.sa_handler = generichandler; sa.sa_mask = sigmask(SIGIO) | sigmask(SIGALRM); ! sa.sa_flags = SA_ONSTACK; sigaction(s, &sa, NULL); sigaddset(&set, s); --- 97,105 ---- if (s >= 0 && s < NSIG) { handler[s] = h; ! sa.sa_sigaction = generichandler; sa.sa_mask = sigmask(SIGIO) | sigmask(SIGALRM); ! sa.sa_flags = SA_ONSTACK | SA_SIGINFO; sigaction(s, &sa, NULL); sigaddset(&set, s); Index: doscmd/trap.c diff -c doscmd/trap.c:1.1.1.1 doscmd/trap.c:1.1.1.1.2.1 *** doscmd/trap.c:1.1.1.1 Wed May 12 11:22:35 1999 --- doscmd/trap.c Wed May 12 12:31:07 1999 *************** *** 81,89 **** } void ! sigurg(struct sigframe *sf) { - #define sc (&sf->sf_sc) int intnum; u_char *addr; int rep; --- 81,88 ---- } void ! sigurg(int signum, siginfo_t *si, struct sigcontext *sc) { int intnum; u_char *addr; int rep; *************** *** 97,105 **** if (tmode) resettrace(sc); ! switch (VM86_TYPE(sf->sf_code)) { case VM86_INTx: ! intnum = VM86_ARG(sf->sf_code); switch (intnum) { case 0x2f: switch (GET8H(sc->sc_eax)) { --- 96,104 ---- if (tmode) resettrace(sc); ! switch (VM86_TYPE(si->si_trapno)) { case VM86_INTx: ! intnum = VM86_ARG(si->si_trapno); switch (intnum) { case 0x2f: switch (GET8H(sc->sc_eax)) { *************** *** 208,240 **** break; default: dump_regs(sc); ! printf("code = %04x\n", sf->sf_code); fatal("unrecognized vm86 trap\n"); } out: if (tmode) tracetrap(sc); - #undef sc } void ! sigtrace(struct sigframe *sf) { int x; ! if (sf->sf_sc.sc_eflags & PSL_VM) fprintf(debugf, "Currently in DOS\n"); ! dump_regs(&sf->sf_sc); for (x = 0; x < 16; ++x) fprintf(debugf, " %02x", *(unsigned char *)x); putc('\n', debugf); } void ! sigtrap(struct sigframe *sf) { - #define sc (&sf->sf_sc) int intnum; if ((sc->sc_eflags & PSL_VM) == 0) { --- 207,237 ---- break; default: dump_regs(sc); ! printf("code = %04x\n", si->si_trapno); fatal("unrecognized vm86 trap\n"); } out: if (tmode) tracetrap(sc); } void ! sigtrace(int signum, siginfo_t *si, struct sigcontext *sc) { int x; ! if (sc->sc_eflags & PSL_VM) fprintf(debugf, "Currently in DOS\n"); ! dump_regs(sc); for (x = 0; x < 16; ++x) fprintf(debugf, " %02x", *(unsigned char *)x); putc('\n', debugf); } void ! sigtrap(int signum, siginfo_t *si, struct sigcontext *sc) { int intnum; if ((sc->sc_eflags & PSL_VM) == 0) { *************** *** 261,273 **** doh: if (tmode) tracetrap(sc); - #undef sc } void ! breakpoint(struct sigframe *sf) { - #define sc (&sf->sf_sc) if (sc->sc_eflags & PSL_VM) printf("doscmd "); printf("breakpoint: %04x\n", *(u_short *)0x8e64); --- 258,268 ---- doh: if (tmode) tracetrap(sc); } void ! breakpoint(int signum, siginfo_t *si, struct sigcontext *sc) { if (sc->sc_eflags & PSL_VM) printf("doscmd "); printf("breakpoint: %04x\n", *(u_short *)0x8e64); *************** *** 276,289 **** __asm__ volatile(".byte 0x0f"); /* MOV DR6,EAX */ __asm__ volatile(".byte 0x21"); __asm__ volatile(".byte 0x1b"); - #undef sc } void ! sigalrm(struct sigframe *sf) { - #define sc (&sf->sf_sc) if (tmode) resettrace(sc); --- 271,282 ---- __asm__ volatile(".byte 0x0f"); /* MOV DR6,EAX */ __asm__ volatile(".byte 0x21"); __asm__ volatile(".byte 0x1b"); } void ! sigalrm(int signum, siginfo_t *si, struct sigcontext *sc) { if (tmode) resettrace(sc); *************** *** 292,315 **** if (tmode) tracetrap(sc); - #undef sc } void ! sigill(struct sigframe *sf) { ! #define sc (&sf->sf_sc) ! fprintf(stderr, "Signal %d from DOS program\n", sf->sf_signum); dump_regs(sc); fatal("%04x:%04x Illegal instruction\n", GET16(sc->sc_cs), GET16(sc->sc_eip)); - #undef sc } void ! sigfpe(struct sigframe *sf) { - #define sc (&sf->sf_sc) #if 1 if (sc->sc_eflags & PSL_VM) { if ((ivec[0] >> 16) != 0xF000) --- 285,304 ---- if (tmode) tracetrap(sc); } void ! sigill(int signum, siginfo_t *si, struct sigcontext *sc) { ! fprintf(stderr, "Signal %d from DOS program\n", signum); dump_regs(sc); fatal("%04x:%04x Illegal instruction\n", GET16(sc->sc_cs), GET16(sc->sc_eip)); } void ! sigfpe(int signum, siginfo_t *si, struct sigcontext *sc) { #if 1 if (sc->sc_eflags & PSL_VM) { if ((ivec[0] >> 16) != 0xF000) *************** *** 322,326 **** dump_regs(sc); fatal("%04x:%04x Floating point fault\n", GET16(sc->sc_cs), GET16(sc->sc_eip)); - #undef sc } --- 311,314 ---- Index: doscmd/tty.c diff -c doscmd/tty.c:1.1.1.1 doscmd/tty.c:1.1.1.1.2.1 *** doscmd/tty.c:1.1.1.1 Wed May 12 11:22:35 1999 --- doscmd/tty.c Wed May 12 12:31:07 1999 *************** *** 908,914 **** case 0x14: /* T */ tmode ^= 1; if (!tmode) ! resettrace(&saved_sigframe->sf_sc); return(0xffff); case 0x53: /* DEL */ quit(0); --- 908,914 ---- case 0x14: /* T */ tmode ^= 1; if (!tmode) ! resettrace(saved_sigcontext); return(0xffff); case 0x53: /* DEL */ quit(0); *************** *** 1386,1392 **** if (ks == 'T' || ks == 't') { tmode ^= 1; if (!tmode) ! resettrace(&saved_sigframe->sf_sc); break; } } --- 1386,1392 ---- if (ks == 'T' || ks == 't') { tmode ^= 1; if (!tmode) ! resettrace(saved_sigcontext); break; } }