Date: Mon, 06 Jan 1997 12:01:02 +0000 From: Bill Currie Subject: Re: Debuggers and mouse hooking (or maybe dpmi memory allocatio To: "Salvador Eduardo Tropea (SET)" Cc: djgpp-workers AT delorie DOT com Reply-to: billc AT blackmagic DOT tait DOT co DOT nz Message-id: <32D0E97E.2288@blackmagic.tait.co.nz> Organization: Tait Electronics NZ MIME-version: 1.0 Content-type: multipart/mixed; boundary="------------47F41D8348E7" Content-transfer-encoding: 7BIT References: This is a multi-part message in MIME format. --------------47F41D8348E7 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Salvador Eduardo Tropea (SET) wrote: > > Hi All: > > Bill (I) wrote: > > I'm having some problems with v2.01 debuggers locking up with my > > editor and I would like some advice on what mods were made to > > dbgcom.c so I can work out what's going on (the story is below). > Amazing, I have a similar problem with my editor (the one inside of > RHIDE)! > > debuggee, if I use Win3.1 all works OK (puaj, puaj and puaj). Eh? Is the english printable? :) Nice to know I wasn't the only one with the problem. [massive snip of SET and myself comparing our problems and code] > P.S. The first time that I saw that was in machine with low memory (8 > Mb), but when I tried at home (20Mb) I got the same problem. My > workaround was using Win3.1 but that sucks!. MAJOR suck! However, I found and FIXED the problem!!!!!!!!! The debugger's (in 2.01) don't preserve the flags register properly. ALL of the return flags are set from within the isr (rather than just the carry flag). This also explains why it worked under windows: in windows, the isr is called with interrupts enabled but cwsdpmi calls the isr with them disabled, and so the interrupts were being disabled! There was aslo some other problems with register preservation with some of the intercepted functions, so I fixed those whils I was at it. Bill -- Leave others their otherness. --------------47F41D8348E7 Content-Type: text/plain; charset=us-ascii; name="DBGCOM.DIF" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="DBGCOM.DIF" diff -r -c3 src/debug/common/dbgcom.c new/debug/common/dbgcom.c *** src/debug/common/dbgcom.c Tue Aug 13 00:08:04 1996 --- new/debug/common/dbgcom.c Sun Dec 29 19:25:04 1996 *************** *** 193,199 **** .align 2,0x90 \n\ _change_descriptor: \n\ pushl %ecx \n\ - pushl %eax \n\ xorl %ecx,%ecx \n\ CL3: \n\ .byte 0x2e \n\ --- 193,198 ---- *************** *** 205,218 **** movw %ax,%ds \n\ movw %dx,_descriptors(,%ecx,2) \n\ pop %ds \n\ - popl %eax \n\ popl %ecx \n\ ret \n\ CL4: \n\ incl %ecx \n\ cmpl $128,%ecx /* DESCRIPTOR_COUNT */ \n\ jl CL3 \n\ - popl %eax \n\ popl %ecx \n\ ret \n" ); --- 204,215 ---- *************** *** 252,258 **** .text \n\ .align 2,0x90 \n\ _change_dos_descriptor: \n\ - pushl %eax \n\ pushl %ecx \n\ xorl %ecx,%ecx \n\ CL6: \n\ --- 249,254 ---- *************** *** 266,279 **** movw %dx,_dos_descriptors(,%ecx,2) \n\ pop %ds \n\ popl %ecx \n\ - popl %eax \n\ ret \n\ CL7: \n\ incl %ecx \n\ cmpl $128,%ecx /* DOS_DESCRIPTOR_COUNT */ \n\ jl CL6 \n\ popl %ecx \n\ - popl %eax \n\ ret \n" ); --- 262,273 ---- *************** *** 331,337 **** Lc31a_: pushl %eax \n\ pushf \n\ popl %eax /* store the right flags for iret */ \n\ ! movl %eax,12(%esp) \n\ popl %eax \n\ Lc31a: iret \n\ Lc31b: .byte 0x2e \n\ --- 325,332 ---- Lc31a_: pushl %eax \n\ pushf \n\ popl %eax /* store the right flags for iret */ \n\ ! andl $1,%eax /* we only want the carry flag */ \n\ ! orl %eax,12(%esp) \n\ popl %eax \n\ Lc31a: iret \n\ Lc31b: .byte 0x2e \n\ *************** *** 358,363 **** --- 353,359 ---- lcall _old_i31 \n\ jc Lc31a_ \n\ pushf \n\ + pushl %eax \n\ pushl %edx \n\ pushw %si \n\ pushw %di \n\ *************** *** 365,370 **** --- 361,367 ---- xorl %eax,%eax \n\ call _change_handle \n\ popl %edx \n\ + popl %eax \n\ popf \n\ clc \n\ jmp Lc31a_ \n\ *************** *** 375,384 **** .byte 0x2e \n\ lcall _old_i31 \n\ jc Lc31_resize_mem_error \n\ ! popl %eax \n\ xorl %edx,%edx \n\ call _change_handle \n\ ! xorl %eax,%eax \n\ jmp Lc31a_ \n\ Lc31_resize_mem: \n\ pushw %si \n\ --- 372,383 ---- .byte 0x2e \n\ lcall _old_i31 \n\ jc Lc31_resize_mem_error \n\ ! xchgl %eax,(%esp) \n\ ! pushl %edx \n\ xorl %edx,%edx \n\ call _change_handle \n\ ! popl %edx \n\ ! popl %eax \n\ jmp Lc31a_ \n\ Lc31_resize_mem: \n\ pushw %si \n\ *************** *** 388,403 **** lcall _old_i31 \n\ jnc Lc31_resize_mem_ok \n\ Lc31_resize_mem_error: \n\ ! addl $4,%esp \n\ stc \n\ jmp Lc31a_ \n\ Lc31_resize_mem_ok: \n\ ! popl %eax \n\ pushw %si \n\ pushw %di \n\ popl %edx \n\ call _change_handle \n\ ! xorl %eax,%eax \n\ jmp Lc31a_ \n\ Lc31_alloc_descriptors: \n\ pushl %ecx \n\ --- 387,405 ---- lcall _old_i31 \n\ jnc Lc31_resize_mem_ok \n\ Lc31_resize_mem_error: \n\ ! xchgl %eax,(%esp) \n\ ! popl %eax \n\ stc \n\ jmp Lc31a_ \n\ Lc31_resize_mem_ok: \n\ ! xchgl %eax,(%esp) \n\ ! pushl %edx \n\ pushw %si \n\ pushw %di \n\ popl %edx \n\ call _change_handle \n\ ! popl %edx \n\ ! popl %eax \n\ jmp Lc31a_ \n\ Lc31_alloc_descriptors: \n\ pushl %ecx \n\ *************** *** 414,434 **** pushf \n\ .byte 0x2e \n\ lcall _old_i31 \n\ ! popl %edx \n\ ! jc Lc31a_ \n\ xorw %ax,%ax \n\ call _change_descriptor \n\ clc \n\ jmp Lc31a_ \n\ Lc31_create_alias_descriptor: \n\ pushf \n\ .byte 0x2e \n\ lcall _old_i31 \n\ jc Lc31a_ \n\ pushl %eax \n\ movw %ax,%dx \n\ xorw %ax,%ax \n\ call _change_descriptor \n\ popl %eax \n\ clc \n\ jmp Lc31a_ \n\ --- 416,445 ---- pushf \n\ .byte 0x2e \n\ lcall _old_i31 \n\ ! jc Lc31a_free_descriptor_error \n\ ! xchgl %eax,(%esp) \n\ ! pushl %edx \n\ ! movl %eax,%edx \n\ xorw %ax,%ax \n\ call _change_descriptor \n\ + popl %edx \n\ + popl %eax \n\ clc \n\ jmp Lc31a_ \n\ + Lc31_free_descriptor_error: \n\ + popl %ebx \n\ + jmp Lc31a_ \n\ Lc31_create_alias_descriptor: \n\ pushf \n\ .byte 0x2e \n\ lcall _old_i31 \n\ jc Lc31a_ \n\ pushl %eax \n\ + pushl %edx \n\ movw %ax,%dx \n\ xorw %ax,%ax \n\ call _change_descriptor \n\ + popl %edx \n\ popl %eax \n\ clc \n\ jmp Lc31a_ \n\ *************** *** 448,458 **** pushf \n\ .byte 0x2e \n\ lcall _old_i31 \n\ ! popl %eax \n\ ! jc Lc31a_ \n\ xorw %dx,%dx \n\ call _change_dos_descriptor \n\ clc \n\ jmp Lc31a_ \n\ .align 2,0x90 \n\ _i21_hook: \n\ --- 459,475 ---- pushf \n\ .byte 0x2e \n\ lcall _old_i31 \n\ ! jc Lc31_free_dos_memory_error \n\ ! xchgl %eax,(%esp) \n\ ! pushl %edx \n\ xorw %dx,%dx \n\ call _change_dos_descriptor \n\ + popl %edx \n\ + popl %eax \n\ clc \n\ + jmp Lc31a_ \n\ + Lc31_free_dos_memory_error: \n\ + popl %edx \n\ jmp Lc31a_ \n\ .align 2,0x90 \n\ _i21_hook: \n\ --------------47F41D8348E7--