Date: Wed, 16 Dec 1998 17:25:38 -0500 Message-Id: <199812162225.RAA03726@envy.delorie.com> From: DJ Delorie To: djgpp-workers AT delorie DOT com Subject: patches to 2.02 Reply-To: djgpp-workers AT delorie DOT com These are from Toshio KUDO, Miyagi, Japan He had a keyboard exception patch too, but it was trivial and I already applied it. Comments? >-rwxrwxr-x kudo/kudo 5179 Dec 16 11:32 1998 nofpu.dif If no 80x87, V2 COFF emulates co-processor, turn on EM and MP bit in CR0, register the protect-mode exception handler. But, there is no real-mode exception handler. So, when V2 COFF terminates, or executes real-mode command as a child process, next, use FPU instruction in real-mode (ie detect x87), then it hangs up, reboot, or something wrong occures. This patch fixes inconvenience above. >-rwxrwxr-x kudo/kudo 13230 Dec 15 01:01 1998 edebug32.dif EDEBUG32 works on PC/AT or compatible, but not works on Japanese PC98. So, I make a patch for PC98. I hope you'll apply this patch to edebug32. Could you please grant my wish? diff -rcN orig/src/libc/dos/process/dosexec.c new/src/libc/dos/process/dosexec.c *** orig/src/libc/dos/process/dosexec.c Sun Dec 13 13:09:46 1998 --- new/src/libc/dos/process/dosexec.c Wed Dec 16 11:10:36 1998 *************** *** 139,144 **** --- 139,148 ---- extern char __PROXY[]; /* defined on crt0/crt1.c */ extern size_t __PROXY_LEN; + #if 1 /* patched by adamtk AT altavista DOT net 98.12.16 */ + extern void restore_DPMI_fpu_state (void); /* defined on emu387/npxsetup.c */ + extern void resetup_DPMI_fpu_state (void); + #endif /* end of patch by adamtk 98.12.16 */ /* Functions that call `direct_exec_tail' after they've put some data into the transfer buffer, should set LFN parameter *************** *** 325,336 **** --- 329,346 ---- parm.fcb2_off = fcb2_la & 15; dosmemput(&parm, sizeof(parm), parm_la); + #if 1 /* patched by adamtk AT altavista DOT net 98.12.16 */ + restore_DPMI_fpu_state (); + #endif /* end of patch by adamtk 98.12.16 */ r.x.ax = 0x4b00; r.x.ds = program_la / 16; r.x.dx = program_la & 15; r.x.es = parm_la / 16; r.x.bx = parm_la & 15; __dpmi_int(0x21, &r); + #if 1 /* patched by adamtk AT altavista DOT net 98.12.16 */ + resetup_DPMI_fpu_state (); + #endif /* end of patch by adamtk 98.12.16 */ #if 0 if (tbuf_selector) __dpmi_free_dos_memory (tbuf_selector); diff -rcN orig/src/libc/emu387/npxsetup.c new/src/libc/emu387/npxsetup.c *** orig/src/libc/emu387/npxsetup.c Mon Sep 7 18:55:40 1998 --- new/src/libc/emu387/npxsetup.c Wed Dec 16 11:17:42 1998 *************** *** 51,62 **** --- 51,80 ---- longjmp(__djgpp_exception_state, __djgpp_exception_state->__eax); } + #if 1 /* patched by adamtk AT altavista DOT net 98.12.16 */ + static int DPMIfpustate = -1; /* negative means not saved */ + void restore_DPMI_fpu_state (void); + void resetup_DPMI_fpu_state (void); + void + restore_DPMI_fpu_state (void) + { + if (DPMIfpustate >= 0) + __dpmi_set_coprocessor_emulation (DPMIfpustate); + } + void + resetup_DPMI_fpu_state (void) + { + if (DPMIfpustate >= 0) + __dpmi_set_coprocessor_emulation (3); + } + #else /* not patched by adamtk 98.12.16 */ #ifdef RESTORE_FPU static void restore_DPMI_fpu_state(void) { __dpmi_set_coprocessor_emulation(1); /* Enable Coprocessor, no exceptions */ } #endif + #endif /* end of patch by adamtk 98.12.16 */ extern int _detect_80387(void); *************** *** 64,73 **** --- 82,102 ---- { char *cp; char have_80387; + #if 1 /* patched by adamtk AT altavista DOT net 98.12.16 */ + int lastfpustate; + #else /* not patched by adamtk 98.12.16 */ #ifdef RESTORE_FPU static int veryfirst = 1; #endif + #endif /* end of patch by adamtk 98.12.16 */ + #if 1 /* patched by adamtk AT altavista DOT net 98.12.16 */ + /* CWSDPMI don't support DPMI-0E00 (and do not touch CR0), + * So, set DPMIfpustate to 1 for make sure EM bit off. + */ + if ((lastfpustate = __dpmi_get_coprocessor_status ()) < 0) + lastfpustate = 1; + #endif /* end of patch by adamtk 98.12.16 */ cp = getenv("387"); if (cp && (tolower(cp[0]) == 'y')) { *************** *** 82,87 **** --- 111,119 ---- nested FPU client fault - DJ */ __dpmi_set_coprocessor_emulation(1); have_80387 = _detect_80387(); + #if 1 /* patched by adamtk AT altavista DOT net 98.12.16 */ + __dpmi_set_coprocessor_emulation (lastfpustate); + #endif /* end of patch by adamtk 98.12.16 */ _8087 = (have_80387 ? 3 : 0); } *************** *** 96,101 **** --- 128,136 ---- _control87(0x033f, 0xffff); } else { + #if 1 /* patched by adamtk AT altavista DOT net 98.12.16 */ + DPMIfpustate = lastfpustate; + #endif /* end of patch by adamtk 98.12.16 */ /* Flags value 3 means coprocessor emulation, exceptions to us */ if (__dpmi_set_coprocessor_emulation(3)) { _write(2, "Warning: Coprocessor not present and DPMI setup failed!\r\n", 57); *************** *** 118,123 **** --- 153,159 ---- if (_emu_entry == 0) return; #endif + #if 0 /* patched by adamtk AT altavista DOT net 98.12.16 */ #ifdef RESTORE_FPU if (veryfirst) { *************** *** 125,130 **** --- 161,167 ---- atexit(restore_DPMI_fpu_state); } #endif + #endif /* end of patch by adamtk 98.12.16 */ signal(SIGNOFP, nofpsig); } } diff -rcN orig/src/libc/go32/dpmiexcp.c new/src/libc/go32/dpmiexcp.c *** orig/src/libc/go32/dpmiexcp.c Sun Dec 13 13:06:46 1998 --- new/src/libc/go32/dpmiexcp.c Wed Dec 16 11:21:02 1998 *************** *** 579,584 **** --- 579,587 ---- return oldenable; } + #if 1 /* patched by adamtk AT altavista DOT net 98.12.16 */ + extern void restore_DPMI_fpu_state (void); /* defined on emu387/npxsetup.c */ + #endif /* end of patch by adamtk 98.12.16 */ void __attribute__((noreturn)) _exit(int status) { *************** *** 589,594 **** --- 592,600 ---- if (__djgpp_old_kbd.offset32 == kbd_ori.offset32 && __djgpp_old_kbd.selector == kbd_ori.selector) __djgpp_exception_toggle (); + #if 1 /* patched by adamtk AT altavista DOT net 98.12.16 */ + restore_DPMI_fpu_state (); + #endif /* end of patch by adamtk 98.12.16 */ __exit (status); } diff -rcN orig/src/debug/edebug/debug.c new/src/debug/edebug/debug.c *** orig/src/debug/edebug/debug.c Mon Sep 7 18:01:28 1998 --- new/src/debug/edebug/debug.c Mon Dec 14 20:30:30 1998 *************** *** 17,23 **** --- 17,25 ---- #include #include #include + #if 0 /* patched by adamtk AT altavista DOT net 98.12.14 */ #include /* For getkey() */ + #endif /* end of patch by adamtk 98.12.14 */ #include "ed.h" #include "debug.h" *************** *** 44,50 **** --- 46,56 ---- NPXREG reg[8]; } NPX; + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + static char char32spc[] = "xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx "; + #else /* not patched by adamtk 98.12.14 */ static char char32spc[] = "xxxúxxxúxxxúxxxùxxxúxxxúxxxúxxx "; + #endif /* end of patch by adamtk 98.12.14 */ static char flset[] = "VMRF NT OFDNIETFMIZR AC PE CY"; static char floff[] = " UPID PLNZ PO NC"; *************** *** 113,119 **** --- 119,129 ---- while (1) { + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + ch = getkbd(); + #else /* not patched by adamtk 98.12.14 */ ch = getkey(); + #endif /* end of patch by adamtk 98.12.14 */ if (erase_it) { for (i=0; lasttoken[i]; i++) *************** *** 313,319 **** --- 323,333 ---- { printf("--- More ---"); fflush(stdout); + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + key = getkbd(); + #else /* not patched by adamtk 98.12.14 */ key = getkey(); + #endif /* end of patch by adamtk 98.12.14 */ printf("\r \r"); switch (key) { *************** *** 356,361 **** --- 370,379 ---- { int found; undefined_symbol = 0; + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + if (!lasttoken[0]) + rem_cmd = Zero; + #endif /* end of patch by adamtk 98.12.14 */ my_getline(buf, lasttoken); token[0] = 0; if (sscanf(buf, "%s %[^\n]", token, buf) < 2) *************** *** 551,559 **** --- 569,587 ---- break; } if (read_child(vaddr, &ch, 1)) + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + { + putchar('\n'); + break; + } + #else /* not patched by adamtk 98.12.14 */ break; + #endif /* end of patch by adamtk 98.12.14 */ if (ch == 0) { + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + vaddr++; + #endif /* end of patch by adamtk 98.12.14 */ putchar('\n'); break; } *************** *** 594,600 **** --- 622,635 ---- { word32 v1; if (read_child(vaddr+i*4, &v1, 4)) + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + { + putchar('\n'); + break; + } + #else /* not patched by adamtk 98.12.14 */ break; + #endif /* end of patch by adamtk 98.12.14 */ printf(" 0x%08lx", v1); } else *************** *** 607,621 **** --- 642,674 ---- if ((j+i*4-12>=0) && (j+i*4-12 < n*4)) { if (read_child(vaddr+j+i*4-12, &c, 1)) + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + { + putchar('\n'); + break; + } + #else /* not patched by adamtk 98.12.14 */ break; + #endif /* end of patch by adamtk 98.12.14 */ + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + if ((c&=0xFF)<' ') + putchar('.'); + else + putchar(c); + #else /* not patched by adamtk 98.12.14 */ if (c<' ') putchar('.'); else putchar(c); + #endif /* end of patch by adamtk 98.12.14 */ } else putchar(' '); + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + printf(" \n"); /* for DBCS */ + #else /* not patched by adamtk 98.12.14 */ printf("\n"); + #endif /* end of patch by adamtk 98.12.14 */ } s++; } *************** *** 718,723 **** --- 771,779 ---- } else { + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + printf("%s ", buf2); + #endif /* end of patch by adamtk 98.12.14 */ switch (regs[i].size) { case 1: *************** *** 732,756 **** --- 788,828 ---- } break; case 2: + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + printf("%04x ", *(word16 *)((word8 *)tss_ptr + regs[i].ofs)); + #else /* not patched by adamtk 98.12.14 */ printf("%04x ", *(word16 *)((word16 *)tss_ptr + regs[i].ofs)); + #endif /* end of patch by adamtk 98.12.14 */ my_getline(buf, ""); if (buf[0]) { v = syms_name2val(buf); if (undefined_symbol) break; + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + *(word16 *)((word8 *)tss_ptr + regs[i].ofs) = v; + #else /* not patched by adamtk 98.12.14 */ *(word16 *)((word16 *)tss_ptr + regs[i].ofs) = v; + #endif /* end of patch by adamtk 98.12.14 */ } break; case 4: + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + printf("%08lx ", *(word32 *)((word8 *)tss_ptr + regs[i].ofs)); + #else /* not patched by adamtk 98.12.14 */ printf("%08lx ", *(word32 *)((word32 *)tss_ptr + regs[i].ofs)); + #endif /* end of patch by adamtk 98.12.14 */ my_getline(buf, ""); if (buf[0]) { v = syms_name2val(buf); if (undefined_symbol) break; + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + *(word32 *)((word8 *)tss_ptr + regs[i].ofs) = v; + #else /* not patched by adamtk 98.12.14 */ *(word32 *)((word32 *)tss_ptr + regs[i].ofs) = v; + #endif /* end of patch by adamtk 98.12.14 */ } break; } *************** *** 762,768 **** --- 834,844 ---- vaddr = syms_name2val(buf2); if (undefined_symbol) break; + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + if (len > 1) + #else /* not patched by adamtk 98.12.14 */ if (len < 2) + #endif /* end of patch by adamtk 98.12.14 */ { v = syms_name2val(buf); if (undefined_symbol) *************** *** 773,779 **** --- 849,862 ---- { word32 vv; if (read_child(vaddr, &vv,4)) + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + { + putchar('\n'); + break; + } + #else /* not patched by adamtk 98.12.14 */ break; + #endif /* end of patch by adamtk 98.12.14 */ printf("0x%08lx 0x%08lx", vaddr, vv); my_getline(buf, ""); if (buf[0]) *************** *** 847,853 **** --- 930,940 ---- break; case CLS: + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + ansicls (); + #else /* not patched by adamtk 98.12.14 */ asm volatile("pusha; movb $15,%ah; int $0x10; movb $0,%ah; int $0x10; popa"); + #endif /* end of patch by adamtk 98.12.14 */ break; default: diff -rcN orig/src/debug/edebug/ed.c new/src/debug/edebug/ed.c *** orig/src/debug/edebug/ed.c Tue Oct 28 19:32:12 1997 --- new/src/debug/edebug/ed.c Tue Dec 15 00:54:08 1998 *************** *** 5,12 **** --- 5,20 ---- #include #include "ed.h" #include "debug.h" + #include #include #include /* Workaround for stderr bug below */ + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + #include + #include + #include + #include + #include /* For getkey() */ + #endif /* end of patch by adamtk 98.12.14 */ static char ansi_mode; /* if set, OK to emit ansi control codes */ *************** *** 16,21 **** --- 24,53 ---- printf("\033[%d;%dm", (fg & A_bold) ? 1 : 0, 30+(fg&7)); } + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + void + ansicls (void) + { + if (ansi_mode) + printf ("\033[2J\033[0;0H"); + else + asm volatile ("pusha; movb $15,%ah; int $0x10; movb $0,%ah; int $0x10; popa"); + } + + int + getkbd (void) + { + if (ScreenPrimary == 0xa0000) /* Japanese PC98? */ + { + __dpmi_regs r; + r.h.ah = 0x07; + __dpmi_int(0x21, &r); + return (r.h.al); + } + return (getkey ()); + } + #endif /* end of patch by adamtk 98.12.14 */ + /* for debugging a qdpmi bug */ #if 0 #define x printf("%s:%d\n", __FILE__, __LINE__); *************** *** 26,31 **** --- 58,70 ---- void ansidetect(void) /* Idea from DJ's install program */ { word16 oldp, newp; + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + if (ScreenPrimary == 0xa0000) /* Japanese PC98? */ + { + ansi_mode = 1; + return; + } + #endif /* end of patch by adamtk 98.12.14 */ asm("movb $3,%%ah;movb $0,%%bh;int $0x10;movw %%dx,%0" : "=g" (oldp) : : "ax", "bx", "cx", "dx"); printf("\033[0m"); *************** *** 66,75 **** --- 105,129 ---- x printf("Load failed for image %s\n",argv[1]); exit(1); } + printf("text: 0x%6x - 0x%6x\n" + "data: 0x%6x - 0x%6x\n" + "bss: 0x%6x - 0x%6x\n" + "stack: 0x%6x - 0x%6x\n" + "arena: 0x%6x - 0x%6x\n", + areas[A_text].first_addr, areas[A_text].last_addr, + areas[A_data].first_addr, areas[A_data].last_addr, + areas[A_bss].first_addr, areas[A_bss].last_addr, + areas[A_stack].first_addr, areas[A_stack].last_addr, + areas[A_arena].first_addr, areas[A_arena].last_addr); x edi_init(start_state); x ansidetect(); + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + x stdout->_file = open(ctermid(NULL), (O_RDWR | O_TEXT), 0666); + stdin->_file = dup(stdout->_file); + #else /* not patched by adamtk 98.12.14 */ x stdout->_file = dup(fileno(stdout)); + #endif /* end of patch by adamtk 98.12.14 */ x x debugger(); diff -rcN orig/src/debug/edebug/ed.h new/src/debug/edebug/ed.h *** orig/src/debug/edebug/ed.h Tue Mar 21 05:17:12 1995 --- new/src/debug/edebug/ed.h Mon Dec 14 20:28:32 1998 *************** *** 24,29 **** --- 24,33 ---- #define A_yellow 14 #define A_white 15 + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + void ansicls (void); + int getkbd (void); + #endif /* end of patch by adamtk 98.12.14 */ void ansi(int fg); void ansidetect(void); diff -rcN orig/src/debug/edebug/unassmbl.c new/src/debug/edebug/unassmbl.c *** orig/src/debug/edebug/unassmbl.c Tue Oct 28 19:35:18 1997 --- new/src/debug/edebug/unassmbl.c Mon Dec 14 20:16:00 1998 *************** *** 135,141 **** --- 135,145 ---- "mov %eax,%I-vv", "mov %ecx,%I-vv", "mov %edx,%I-vv", "mov %ebx,%I-vv", "mov %esp,%Ivv", "mov %ebp,%Ivv", "mov %esi,%I-vv", "mov %edi,%I-vv", /* c */ + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + "%g2 %Eb,%Ibb", "%g2 %Ev,%Ibb", "ret %Iww", "ret", + #else /* not patched by adamtk 98.12.14 */ "%g2 %Eb,%Ibb", "%g2 %Ev,%Ibb", "ret %Iw", "ret", + #endif /* end of patch by adamtk 98.12.14 */ "les %Gv,%Mp", "lds %Gv,%Mp", "mov %Eb,%Ibb", "mov %Ev,%I-vv", "enter %Iww,%Ibb", "leave", "retf %Iww", "retf", "int 3", "int %Ibb", "into", "iret", *************** *** 186,192 **** --- 190,200 ---- /* 9 */ "seto %Eb", "setno %Eb", "setc %Eb", "setnc %Eb", "setz %Eb", "setnz %Eb", "setbe %Eb", "setnbe %Eb", + #if 1 /* patched by adamtk AT altavista DOT net 98.12.14 */ + "sets %Eb", "setns %Eb", "setpe %Eb", "setpo %Eb", + #else /* not patched by adamtk 98.12.14 */ "sets %Eb", "setns %Eb", "setp %Eb", "setnp %Eb", + #endif /* end of patch by adamtk 98.12.14 */ "setl %Eb", "setge %Eb", "setle %Eb", "setg %Eb", /* a */ "push fs", "pop fs", 0, "bt %Ev,%Gv", *************** *** 425,431 **** --- 433,443 ---- for (i=0; i