[Dosemu-cvs] dosemu/src/dosext/dpmi dpmi.c,1.97,1.98 dpmi.h,1.37,1.38 msdos.c,1.44,1.45
Brought to you by:
bartoldeman
From: Stas S. <st...@us...> - 2004-12-02 18:38:40
|
Update of /cvsroot/dosemu/dosemu/src/dosext/dpmi In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25932/src/dosext/dpmi Modified Files: dpmi.c dpmi.h msdos.c Log Message: - Always use copy_context() instead of direct assignments (bug #1076593) - Improved int23 handling Index: msdos.c =================================================================== RCS file: /cvsroot/dosemu/dosemu/src/dosext/dpmi/msdos.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- msdos.c 26 Nov 2004 18:51:36 -0000 1.44 +++ msdos.c 2 Dec 2004 18:38:20 -0000 1.45 @@ -1857,7 +1857,7 @@ /* now it is a invalid selector error, try to fix it if it is */ /* caused by an instruction mov Sreg,m/r16 */ - new_sct = *scp; + copy_context(&new_sct, scp); len = decode_modify_segreg_insn(&new_sct, &segment, ®); if (len == 0) return 0; @@ -1914,6 +1914,6 @@ } /* lets hope we fixed the thing, apply the "fix" to context and return */ - *scp = new_sct; + copy_context(scp, &new_sct); return 1; } Index: dpmi.c =================================================================== RCS file: /cvsroot/dosemu/dosemu/src/dosext/dpmi/dpmi.c,v retrieving revision 1.97 retrieving revision 1.98 diff -u -d -r1.97 -r1.98 --- dpmi.c 2 Dec 2004 18:32:40 -0000 1.97 +++ dpmi.c 2 Dec 2004 18:38:20 -0000 1.98 @@ -1136,7 +1136,7 @@ /*2ch*/ *++lp = 0xffffffff; } -static inline void copy_context(struct sigcontext_struct *d, struct sigcontext_struct *s) +inline void copy_context(struct sigcontext_struct *d, struct sigcontext_struct *s) { #ifdef DIRECT_DPMI_CONTEXT_SWITCH /* -------------------------------------------------------------- @@ -3502,6 +3502,7 @@ } else if (_eip==DPMI_OFF+1+HLT_OFF(DPMI_return_from_int_23)) { struct sigcontext_struct old_ctx; unsigned long old_esp; + unsigned short *ssp; int esp_delta; if (in_dpmi_pm_stack) { in_dpmi_pm_stack--; @@ -3517,23 +3518,33 @@ restore_pm_regs(&old_ctx); old_esp = in_dpmi_pm_stack ? D_16_32(old_ctx.esp) : D_16_32(DPMI_pm_stack_size); esp_delta = old_esp - D_16_32(_esp); + ssp = (us *) SEL_ADR(_ss, _esp); + copy_context(scp, &old_ctx); if (esp_delta) { unsigned char *rm_ssp; - unsigned short *ssp; unsigned long sp; D_printf("DPMI: ret from int23 with esp_delta=%i\n", esp_delta); rm_ssp = (unsigned char *) (REG(ss) << 4); sp = (unsigned long) LWORD(esp); - ssp = (us *) SEL_ADR(_ss, _esp); esp_delta >>= DPMI_CLIENT.is_32; if (esp_delta == 2) { pushw(rm_ssp, sp, *ssp); - LWORD(esp) -= 2; } else { error("DPMI: ret from int23 with esp_delta=%i\n", esp_delta); } + LWORD(esp) -= esp_delta; + if (in_dpmi_pm_stack) { + D_printf("DPMI: int23 invoked while on PM stack!\n"); + REG(eflags) &= ~CF; + } + if (REG(eflags) & CF) { + struct vm86_regs saved_regs = REGS; + D_printf("DPMI: int23 termination request\n"); + quit_dpmi(scp, 0); + REGS = saved_regs; + D_printf("DPMI: int23 termination performed\n"); + } } - *scp = old_ctx; in_dpmi_dos_int = 1; } else if (_eip==DPMI_OFF+1+HLT_OFF(DPMI_return_from_int_24)) { Index: dpmi.h =================================================================== RCS file: /cvsroot/dosemu/dosemu/src/dosext/dpmi/dpmi.h,v retrieving revision 1.37 retrieving revision 1.38 diff -u -d -r1.37 -r1.38 --- dpmi.h 26 Nov 2004 21:10:18 -0000 1.37 +++ dpmi.h 2 Dec 2004 18:38:20 -0000 1.38 @@ -248,5 +248,6 @@ void dpmi_return_request(void); void dpmi_check_return(struct sigcontext_struct *scp); void dpmi_init(void); +extern inline void copy_context(struct sigcontext_struct *d, struct sigcontext_struct *s); #endif /* DPMI_H */ |