if (trace >= 2) VM.sysWriteln("GC Message: VM_CT.quiesceAttachedProcessors  quiescing attached VPs");
if (verbose >= 2) VM.sysWriteln("GC Message: VM_CT.quiesceAttachedProcessors  quiescing attached VPs");
  static void quiesceAttachedProcessors() throws VM_PragmaUninterruptible {    // if there are any attached processors (for user pthreads that entered the VM    // via an AttachJVM) we may be briefly IN_JAVA during transitions to a RVM    // processor. Ususally they are either IN_NATIVE (having returned to the users     // native C code - or invoked a native method) or IN_SIGWAIT (the native code    // invoked a JNI Function, migrated to a RVM processor, leaving the attached    // processor running its IdleThread, which enters IN_SIGWAIT and wait for a signal.    //    // We wait for the processor to be in either IN_NATIVE or IN_SIGWAIT and then     // block it there for the duration of the Collection    if (VM_Processor.numberAttachedProcessors == 0) return;    if (trace >= 2) VM.sysWriteln("GC Message: VM_CT.quiesceAttachedProcessors  quiescing attached VPs");        for (int i = 1; i < VM_Processor.attachedProcessors.length; i++) {      VM_Processor vp = VM_Processor.attachedProcessors[i];      if (vp==null) continue;   // must have detached      if (trace >= 2) VM.sysWriteln("GC Message: VM_CT.quiesceAttachedProcessors  quiescing attached VP", i);            int loopCount = 0;      while ( true ) {		while ( VM_Processor.vpStatus[vp.vpStatusIndex] == VM_Processor.IN_JAVA )	  VM.sysVirtualProcessorYield();		if ( vp.blockInWaitIfInWait() ) {	  if (trace >= 2)	    VM.sysWriteln("GC Message: VM_CT.quiesceAttachedProcessors  Attached Processor BLOCKED_IN_SIGWAIT", i);	  // Note: threads contextRegisters (ip & fp) are set by thread before	  // entering SIGWAIT, so nothing needs to be done here	  break;	}	if ( vp.lockInCIfInC() ) {	  if (trace >= 2)	    VM.sysWriteln("GC Message: VM_CT.quiesceAttachedProcessors Attached Processor BLOCKED_IN_NATIVE", i);	  	  // XXX SES TON XXX	  // TON !! what is in jniEnv.JNITopJavaFP when thread returns to user C code.	  // AND what will happen when we scan its stack with that fp	  	  // set running threads context regs ip & fp to where scan of threads 	  // stack should start.	  VM_Thread at = vp.activeThread;	  at.contextRegisters.setInnermost( VM_Address.zero() /*ip*/, at.jniEnv.topJavaFP() );	  break;	}		loopCount++;	if (trace >= 2 && (loopCount%10 == 0)) {	  VM.sysWriteln("GC Message: VM_CollectorThread Waiting for Attached Processor", i,			" with vpstatus ", VM_Processor.vpStatus[vp.vpStatusIndex]);	}	if (loopCount%1000 == 0) {	  VM.sysWriteln("GC Message: VM_CT.quiesceAttachedProcessors STUCK Waiting for Attached Processor", i);	  VM.sysFail("VM_CollectorThread - STUCK quiescing attached processors");	}      }  // while (true)    }  // end loop over attachedProcessors[]  }  // quiesceAttachedProcessors