delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/1997/01/20/06:16:52

Date: Mon, 20 Jan 1997 12:04:47 +0100 (MET)
From: Robert Hoehne <robert DOT hoehne AT mathematik DOT tu-chemnitz DOT de>
To: DJGPP workers <djgpp-workers AT delorie DOT com>
Subject: Patch for bdgcom.c
Message-Id: <Pine.HPP.3.95q.970120120052.14244B-100000@newton.mathematik.tu-chemnitz.de>
Mime-Version: 1.0

Here is now my final patch for dbgcom.c. Because there was no
inegative response to my previous patch I think every think is OK. The
difference to my first mail is, that I have added some comments.


*** dbgcom.c~	Fri Jan 10 14:21:34 1997
--- dbgcom.c	Sat Jan 18 19:19:56 1997
***************
*** 144,149 ****
--- 144,151 ----
  }
  
  static __dpmi_paddr old_i31,old_i21;
+ static int user_int_set = 0;
+ static __dpmi_paddr my_i9,user_i9,my_i8,user_i8;
  
  static void hook_dpmi(void)
  {
***************
*** 152,163 ****
--- 154,176 ----
  
    __dpmi_get_protected_mode_interrupt_vector(0x21, &old_i21);
    __dpmi_get_protected_mode_interrupt_vector(0x31, &old_i31);
+   /* Save our current interrupt vectors for the keyboard and the timer */
+   __dpmi_get_protected_mode_interrupt_vector(0x09, &my_i9);
+   __dpmi_get_protected_mode_interrupt_vector(0x08, &my_i8);
  
    asm("mov %%cs,%0" : "=g" (new_int.selector) );
    new_int.offset32 = (unsigned long)i21_hook;
    __dpmi_set_protected_mode_interrupt_vector(0x21, &new_int);
    new_int.offset32 = (unsigned long)i31_hook;
    __dpmi_set_protected_mode_interrupt_vector(0x31, &new_int);
+ 
+   /* If we have called already unhook_dpmi, the user interrupt
+      vectors for the keyboard and the timer are valid. */
+   if (user_int_set)
+   {
+     __dpmi_set_protected_mode_interrupt_vector(0x09, &user_i9);
+     __dpmi_set_protected_mode_interrupt_vector(0x08, &user_i8);
+   }
  }
  
  /* Change a handle in the list: EAX is the old handle, EDX is the new */
***************
*** 280,290 ****
  );
  
  /* BUGS: We ignore the exception handlers for the child process, so signals
!    do not work.  We also disable the hooking of HW interrupts that might
!    cause the HW-interrupt-to-limit exceptions, since they can never be fixed.
!    Byproduct:  You can't debug code which hooks int 9, since it's keyboard
!    routine never gets called.  Eventually, we should save the exception and
!    interrupt hooks and then chain to them on the next execution.  Someday. */
  
  /* Watch set selector base, if it is __djgpp_app_DS then reset breakpoints */
  
--- 293,300 ----
  );
  
  /* BUGS: We ignore the exception handlers for the child process, so signals
!    do not work.  We also disable the hooking of the numeric coprocessor
!    HW interrupt. */
  
  /* Watch set selector base, if it is __djgpp_app_DS then reset breakpoints */
  
***************
*** 349,357 ****
  	pushl	(%eax)							\n\
  	pushl	%eax							\n\
  	call	_longjmp						\n\
! Lc31d:	cmpb	$9,%bl							\n\
! 	je	Lc31a							\n\
! 	cmpb	$0x75,%bl						\n\
  	je	Lc31a							\n\
  	jmp	Lc31c							\n\
  Lc31_alloc_mem:								\n\
--- 359,365 ----
  	pushl	(%eax)							\n\
  	pushl	%eax							\n\
  	call	_longjmp						\n\
! Lc31d:	cmpb	$0x75,%bl						\n\
  	je	Lc31a							\n\
  	jmp	Lc31c							\n\
  Lc31_alloc_mem:								\n\
***************
*** 489,494 ****
--- 497,514 ----
  {
    __dpmi_set_protected_mode_interrupt_vector(0x31, &old_i31);
    __dpmi_set_protected_mode_interrupt_vector(0x21, &old_i21);
+ 
+   /* Save the interrupt vectors for the keyboard and the the
+      time, because the debuggee may have changed it. */
+   __dpmi_get_protected_mode_interrupt_vector(0x09, &user_i9);
+   __dpmi_get_protected_mode_interrupt_vector(0x08, &user_i8);
+ 
+   /* And remember it for hook_dpmi */
+   user_int_set = 1;
+ 
+   /* Now restore our interrupt vectors */
+   __dpmi_set_protected_mode_interrupt_vector(0x09, &my_i9);
+   __dpmi_set_protected_mode_interrupt_vector(0x08, &my_i8);
  }
  
  static void dbgsig(int sig)
***************
*** 630,635 ****
--- 650,659 ----
  void cleanup_client(void)
  {
    int i;
+ 
+   /* Set the flag, that the user interrupt vectors are no longer valid */
+   user_int_set = 0;
+ 
    /* Close all handles, which may be left open */
    close_handles();
    for (i=0;i<DOS_DESCRIPTOR_COUNT;i++)
***************
*** 796,802 ****
  _init_dbg_fsext(void)
  {
    __dpmi_regs r;
-   int i, fd;
    int psp_la;
    int jft_ofs;
    int jft_count;
--- 820,825 ----


*****************************************************************
* Robert Hoehne, Fakultaet fuer Mathematik, TU-Chemnitz-Zwickau *
* Post:    Am Berg 3, D-09573 Dittmannsdorf                     *
* e-Mail:  Robert DOT Hoehne AT Mathematik DOT TU-Chemnitz DOT DE              *
* WWW:     http://www.tu-chemnitz.de/~rho                       *
*****************************************************************

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019