virtual void handleResult(PendingInterrupt& pend) { int result = currentMIPS->r[MIPS_REG_V0]; int alarmID = triggeredAlarm.front(); triggeredAlarm.pop_front(); // A non-zero result means to reschedule. if (result > 0) { DEBUG_LOG(HLE, "Rescheduling alarm %08x for +%dms", alarmID, result); u32 error; Alarm *alarm = kernelObjects.Get<Alarm>(alarmID, error); __KernelScheduleAlarm(alarm, (u64) usToCycles(result)); } else { if (result < 0) WARN_LOG(HLE, "Alarm requested reschedule for negative value %u, ignoring", (unsigned) result); DEBUG_LOG(HLE, "Finished alarm %08x", alarmID); // Delete the alarm if it's not rescheduled. kernelObjects.Destroy<Alarm>(alarmID); } }
virtual void handleResult(int result) { // A non-zero result means to reschedule. // TODO: Do sysclock alarms return a different value unit? if (result > 0) __KernelScheduleAlarm(alarm, usToCycles(result)); else if (result < 0) WARN_LOG(HLE, "Alarm requested reschedule for negative value %u, ignoring", (unsigned) result); }
SceUID __KernelSetAlarm(u64 ticks, u32 handlerPtr, u32 commonPtr) { if (!Memory::IsValidAddress(handlerPtr)) return SCE_KERNEL_ERROR_ILLEGAL_ADDR; Alarm *alarm = new Alarm; SceUID uid = kernelObjects.Create(alarm); alarm->alm.size = NATIVEALARM_SIZE; alarm->alm.handlerPtr = handlerPtr; alarm->alm.commonPtr = commonPtr; __KernelScheduleAlarm(alarm, ticks); return uid; }
virtual void handleResult(int result) { // A non-zero result means to reschedule. if (result > 0) { u32 error; Alarm *alarm = kernelObjects.Get<Alarm>(alarmID, error); __KernelScheduleAlarm(alarm, (u64) usToCycles(result)); } else { if (result < 0) WARN_LOG(HLE, "Alarm requested reschedule for negative value %u, ignoring", (unsigned) result); // Delete the alarm if it's not rescheduled. kernelObjects.Destroy<Alarm>(alarmID); __ReleaseSubIntrHandler(PSP_SYSTIMER0_INTR, alarmID); } }
SceUID __KernelSetAlarm(u64 ticks, u32 handlerPtr, u32 commonPtr) { if (!alarmInitComplete) __KernelAlarmInit(); Alarm *alarm = new Alarm; SceUID uid = kernelObjects.Create(alarm); alarm->alm.size = sizeof(NativeAlarm); alarm->alm.schedule = CoreTiming::GetTicks() + ticks; alarm->alm.handlerPtr = handlerPtr; alarm->alm.commonPtr = commonPtr; u32 error = __RegisterSubInterruptHandler(PSP_SYSTIMER0_INTR, uid, new AlarmIntrHandler(alarm)); if (error != 0) return error; __KernelScheduleAlarm(alarm, (int) ticks); return uid; }
SceUID __KernelSetAlarm(u64 ticks, u32 handlerPtr, u32 commonPtr) { if (!Memory::IsValidAddress(handlerPtr)) return SCE_KERNEL_ERROR_ILLEGAL_ADDR; Alarm *alarm = new Alarm; SceUID uid = kernelObjects.Create(alarm); alarm->alm.size = NATIVEALARM_SIZE; alarm->alm.handlerPtr = handlerPtr; alarm->alm.commonPtr = commonPtr; u32 error; AlarmIntrHandler *handler = (AlarmIntrHandler *) __RegisterSubIntrHandler(PSP_SYSTIMER0_INTR, uid, error); if (error != 0) { kernelObjects.Destroy<Alarm>(uid); return error; } handler->setAlarm(alarm); __KernelScheduleAlarm(alarm, ticks); return uid; }