Print this page
9736 kmdb tortures via single-step miscellaneous trap
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
        
*** 19,32 ****
   * CDDL HEADER END
   */
  /*
   * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   */
  
- #pragma ident   "%Z%%M% %I%     %E% SMI"
- 
  /*
   * The main CPU-control loops, used to control masters and slaves.
   */
  
  #include <sys/types.h>
--- 19,31 ----
   * CDDL HEADER END
   */
  /*
   * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
+  * Copyright 2018 Joyent, Inc.
   */
  
  /*
   * The main CPU-control loops, used to control masters and slaves.
   */
  
  #include <sys/types.h>
*** 290,306 ****
  kaif_main_loop(kaif_cpusave_t *cpusave)
  {
          int cmd;
  
          if (kaif_master_cpuid == KAIF_MASTER_CPUID_UNSET) {
                  if (!kmdb_dpi_resume_requested &&
                      kmdb_kdi_get_unload_request()) {
                          /*
!                          * Special case: Unload requested before first debugger
!                          * entry.  Don't stop the world, as there's nothing to
!                          * clean up that can't be handled by the running kernel.
                           */
                          cpusave->krs_cpu_state = KAIF_CPU_STATE_NONE;
                          return (KAIF_CPU_CMD_RESUME);
                  }
  
                  kaif_select_master(cpusave);
--- 289,323 ----
  kaif_main_loop(kaif_cpusave_t *cpusave)
  {
          int cmd;
  
          if (kaif_master_cpuid == KAIF_MASTER_CPUID_UNSET) {
+ 
+                 /*
+                  * Special case: Unload requested before first debugger entry.
+                  * Don't stop the world, as there's nothing to clean up that
+                  * can't be handled by the running kernel.
+                  */
                  if (!kmdb_dpi_resume_requested &&
                      kmdb_kdi_get_unload_request()) {
+                         cpusave->krs_cpu_state = KAIF_CPU_STATE_NONE;
+                         return (KAIF_CPU_CMD_RESUME);
+                 }
+ 
                  /*
!                  * We're a slave with no master, so just resume.  This can
!                  * happen if, prior to this, two CPUs both raced through
!                  * kdi_cmnint() - for example, a breakpoint on a frequently
!                  * called function.  The loser will be redirected to the slave
!                  * loop; note that the event itself is lost at this point.
!                  *
!                  * The winner will then cross-call that slave, but it won't
!                  * actually be received until the slave returns to the kernel
!                  * and enables interrupts.  We'll then come back in via
!                  * kdi_slave_entry() and hit this path.
                   */
+                 if (cpusave->krs_cpu_state == KAIF_CPU_STATE_SLAVE) {
                          cpusave->krs_cpu_state = KAIF_CPU_STATE_NONE;
                          return (KAIF_CPU_CMD_RESUME);
                  }
  
                  kaif_select_master(cpusave);