bool dyn_lwp::changePC( Address loc, dyn_saved_regs * regs ) { if( regs != NULL ) { restoreRegisters( *regs ); } /* We can't change the PC to a slot number other than 0. */ assert( loc % 16 == 0 ); // /* DEBUG */ fprintf( stderr, "%s[%d]: (lwp %d) changing PC to 0x%lx\n", __FILE__, __LINE__, get_lwp_id(), loc ); return (getDBI()->ptrace( PTRACE_POKEUSER, get_lwp_id(), PT_CR_IIP, loc, -1, & errno ) != -1); } /* end changePC() */
void IOI2CLM6x::processPowerEvent ( UInt32 eventType ) { switch ( eventType ) { case kI2CPowerEvent_OFF: case kI2CPowerEvent_SLEEP: { require_success( saveRegisters(), IOI2CLM6x_processPowerEvent_saveRegistersErr ); fRegistersAreSaved = true; break; } case kI2CPowerEvent_ON: case kI2CPowerEvent_WAKE: { if ( fRegistersAreSaved ) { // Full Power State require_success( restoreRegisters(), IOI2CLM6x_processPowerEvent_restoreRegistersErr ); fRegistersAreSaved = false; } break; } case kI2CPowerEvent_STARTUP: { require_success( initHW(), IOI2CLM6x_processPowerEvent_initHWErr ); break; } } IOI2CLM6x_processPowerEvent_initHWErr: IOI2CLM6x_processPowerEvent_saveRegistersErr: return; IOI2CLM6x_processPowerEvent_restoreRegistersErr: fRegistersAreSaved = false; return; }
IOReturn AppleLM8x::setPowerState(unsigned long whatState, IOService *dontCare) { DLOG("AppleLM8x::setPowerState called with state:%lu\n", whatState); if ( (whatState == kLM8xOffState) ) { // No Power State systemIsRestarting = TRUE; // set flag to reflect shutting down state. if ( saveRegisters() != kIOReturnSuccess ) IOLog("AppleLM8x::powerStateWillChangeTo(0x%x) failed to save registers.\n", kLM8xAddr<<1); } if ( (whatState == kLM8xOnState) ) { // Full Power State if ( restoreRegisters() != kIOReturnSuccess ) IOLog("AppleLM8x::powerStateWillChangeTo(0x%x) failed to restore registers.\n", kLM8xAddr<<1); systemIsRestarting = FALSE; // set flag to reflect we are not shutting down. } return IOPMAckImplied; }
// Yield to another user thread. void yield(void) { labelhack(Resume); DEBUG_PRINT("Put self in readyQ and suspend\n"); Registers saveArea; void* localStubBase = stubBase; DEBUG_PRINT("stacklet %p cannot be freed\n", stubBase - STACKLET_SIZE); DEBUG_PRINT("Store stubBase in localStubBase %p\n", localStubBase); saveRegisters(); void* stackPointer; getStackPointer(stackPointer); enqReadyQ(&&Resume, stackPointer); suspendStub(); Resume: restoreRegisters(); stubBase = localStubBase; DEBUG_PRINT("stacklet %p can be freed\n", stubBase - STACKLET_SIZE); DEBUG_PRINT("Restore stubBase to be %p.\n", stubBase); DEBUG_PRINT("Resumed a ready thread.\n"); }