2008-01-15 20:27:44 +00:00
|
|
|
#include "Iop_Thbase.h"
|
|
|
|
#include "IopBios.h"
|
2025-03-11 12:48:26 -04:00
|
|
|
#include "Log.h"
|
2008-01-15 20:27:44 +00:00
|
|
|
|
|
|
|
using namespace Iop;
|
|
|
|
|
2008-11-14 17:10:21 +00:00
|
|
|
#define LOG_NAME ("iop_thbase")
|
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
#define FUNCTION_CREATETHREAD "CreateThread"
|
|
|
|
#define FUNCTION_STARTTHREAD "StartThread"
|
|
|
|
#define FUNCTION_STARTTHREADARGS "StartThreadArgs"
|
|
|
|
#define FUNCTION_DELETETHREAD "DeleteThread"
|
|
|
|
#define FUNCTION_EXITTHREAD "ExitThread"
|
|
|
|
#define FUNCTION_TERMINATETHREAD "TerminateThread"
|
|
|
|
#define FUNCTION_CHANGETHREADPRIORITY "ChangeThreadPriority"
|
2018-05-07 16:34:42 -04:00
|
|
|
#define FUNCTION_ROTATETHREADREADYQUEUE "RotateThreadReadyQueue"
|
2018-04-30 21:01:23 +01:00
|
|
|
#define FUNCTION_RELEASEWAITTHREAD "ReleaseWaitThread"
|
|
|
|
#define FUNCTION_IRELEASEWAITTHREAD "iReleaseWaitThread"
|
|
|
|
#define FUNCTION_GETTHREADID "GetThreadId"
|
|
|
|
#define FUNCTION_REFERTHREADSTATUS "ReferThreadStatus"
|
|
|
|
#define FUNCTION_IREFERTHREADSTATUS "iReferThreadStatus"
|
|
|
|
#define FUNCTION_SLEEPTHREAD "SleepThread"
|
|
|
|
#define FUNCTION_WAKEUPTHREAD "WakeupThread"
|
|
|
|
#define FUNCTION_IWAKEUPTHREAD "iWakeupThread"
|
|
|
|
#define FUNCTION_CANCELWAKEUPTHREAD "CancelWakeupThread"
|
|
|
|
#define FUNCTION_ICANCELWAKEUPTHREAD "iCancelWakeupThread"
|
|
|
|
#define FUNCTION_DELAYTHREAD "DelayThread"
|
|
|
|
#define FUNCTION_GETSYSTEMTIME "GetSystemTime"
|
|
|
|
#define FUNCTION_GETSYSTEMTIMELOW "GetSystemTimeLow"
|
|
|
|
#define FUNCTION_SETALARM "SetAlarm"
|
|
|
|
#define FUNCTION_CANCELALARM "CancelAlarm"
|
2023-12-22 11:29:52 -05:00
|
|
|
#define FUNCTION_ICANCELALARM "iCancelAlarm"
|
2018-04-30 21:01:23 +01:00
|
|
|
#define FUNCTION_USECTOSYSCLOCK "USecToSysClock"
|
|
|
|
#define FUNCTION_SYSCLOCKTOUSEC "SysClockToUSec"
|
|
|
|
#define FUNCTION_GETCURRENTTHREADPRIORITY "GetCurrentThreadPriority"
|
2021-08-30 15:23:59 -04:00
|
|
|
#define FUNCTION_GETTHREADMANIDLIST "GetThreadManIdList"
|
2008-11-28 23:46:52 +00:00
|
|
|
|
2017-04-23 15:13:04 -04:00
|
|
|
CThbase::CThbase(CIopBios& bios, uint8* ram)
|
2018-04-30 21:01:23 +01:00
|
|
|
: m_ram(ram)
|
|
|
|
, m_bios(bios)
|
2008-01-15 20:27:44 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2012-06-28 06:06:55 +00:00
|
|
|
std::string CThbase::GetId() const
|
2008-01-15 20:27:44 +00:00
|
|
|
{
|
2012-03-31 20:13:58 +00:00
|
|
|
return "thbase";
|
2008-01-15 20:27:44 +00:00
|
|
|
}
|
|
|
|
|
2012-06-28 06:06:55 +00:00
|
|
|
std::string CThbase::GetFunctionName(unsigned int functionId) const
|
2008-11-28 23:46:52 +00:00
|
|
|
{
|
|
|
|
switch(functionId)
|
|
|
|
{
|
|
|
|
case 4:
|
|
|
|
return FUNCTION_CREATETHREAD;
|
|
|
|
break;
|
2014-07-26 00:27:48 -04:00
|
|
|
case 5:
|
|
|
|
return FUNCTION_DELETETHREAD;
|
|
|
|
break;
|
2008-11-28 23:46:52 +00:00
|
|
|
case 6:
|
|
|
|
return FUNCTION_STARTTHREAD;
|
|
|
|
break;
|
2015-07-12 22:57:17 -04:00
|
|
|
case 7:
|
|
|
|
return FUNCTION_STARTTHREADARGS;
|
|
|
|
break;
|
2012-09-12 04:03:41 +00:00
|
|
|
case 8:
|
|
|
|
return FUNCTION_EXITTHREAD;
|
|
|
|
break;
|
2014-07-26 00:27:48 -04:00
|
|
|
case 10:
|
|
|
|
return FUNCTION_TERMINATETHREAD;
|
|
|
|
break;
|
2011-10-22 22:36:49 +00:00
|
|
|
case 14:
|
|
|
|
return FUNCTION_CHANGETHREADPRIORITY;
|
|
|
|
break;
|
2018-05-07 16:34:42 -04:00
|
|
|
case 16:
|
|
|
|
return FUNCTION_ROTATETHREADREADYQUEUE;
|
|
|
|
break;
|
2017-05-01 23:08:30 -04:00
|
|
|
case 18:
|
|
|
|
return FUNCTION_RELEASEWAITTHREAD;
|
|
|
|
break;
|
|
|
|
case 19:
|
|
|
|
return FUNCTION_IRELEASEWAITTHREAD;
|
|
|
|
break;
|
2008-11-28 23:46:52 +00:00
|
|
|
case 20:
|
|
|
|
return FUNCTION_GETTHREADID;
|
|
|
|
break;
|
2012-09-12 04:03:41 +00:00
|
|
|
case 22:
|
|
|
|
return FUNCTION_REFERTHREADSTATUS;
|
|
|
|
break;
|
2015-11-02 01:02:20 -05:00
|
|
|
case 23:
|
|
|
|
return FUNCTION_IREFERTHREADSTATUS;
|
|
|
|
break;
|
2008-11-28 23:46:52 +00:00
|
|
|
case 24:
|
|
|
|
return FUNCTION_SLEEPTHREAD;
|
|
|
|
break;
|
|
|
|
case 25:
|
|
|
|
return FUNCTION_WAKEUPTHREAD;
|
|
|
|
break;
|
|
|
|
case 26:
|
|
|
|
return FUNCTION_IWAKEUPTHREAD;
|
|
|
|
break;
|
2016-11-04 20:54:49 -04:00
|
|
|
case 27:
|
|
|
|
return FUNCTION_CANCELWAKEUPTHREAD;
|
|
|
|
break;
|
|
|
|
case 28:
|
|
|
|
return FUNCTION_ICANCELWAKEUPTHREAD;
|
|
|
|
break;
|
2008-11-28 23:46:52 +00:00
|
|
|
case 33:
|
|
|
|
return FUNCTION_DELAYTHREAD;
|
|
|
|
break;
|
|
|
|
case 34:
|
|
|
|
return FUNCTION_GETSYSTEMTIME;
|
|
|
|
break;
|
2012-04-12 04:52:26 +00:00
|
|
|
case 35:
|
|
|
|
return FUNCTION_SETALARM;
|
|
|
|
break;
|
2014-07-12 02:14:22 -04:00
|
|
|
case 37:
|
|
|
|
return FUNCTION_CANCELALARM;
|
|
|
|
break;
|
2023-12-22 11:29:52 -05:00
|
|
|
case 38:
|
|
|
|
return FUNCTION_ICANCELALARM;
|
|
|
|
break;
|
2008-11-28 23:46:52 +00:00
|
|
|
case 39:
|
|
|
|
return FUNCTION_USECTOSYSCLOCK;
|
|
|
|
break;
|
|
|
|
case 40:
|
|
|
|
return FUNCTION_SYSCLOCKTOUSEC;
|
|
|
|
break;
|
2011-10-22 22:36:49 +00:00
|
|
|
case 42:
|
|
|
|
return FUNCTION_GETCURRENTTHREADPRIORITY;
|
|
|
|
break;
|
2015-11-01 00:25:09 -04:00
|
|
|
case 43:
|
|
|
|
return FUNCTION_GETSYSTEMTIMELOW;
|
|
|
|
break;
|
2021-08-30 15:23:59 -04:00
|
|
|
case 47:
|
|
|
|
return FUNCTION_GETTHREADMANIDLIST;
|
|
|
|
break;
|
2008-11-28 23:46:52 +00:00
|
|
|
default:
|
|
|
|
return "unknown";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-01-15 20:27:44 +00:00
|
|
|
void CThbase::Invoke(CMIPS& context, unsigned int functionId)
|
|
|
|
{
|
2012-03-31 20:13:58 +00:00
|
|
|
switch(functionId)
|
|
|
|
{
|
|
|
|
case 4:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(CreateThread(
|
2018-04-30 21:01:23 +01:00
|
|
|
reinterpret_cast<THREAD*>(&m_ram[context.m_State.nGPR[CMIPS::A0].nV0])));
|
2012-03-31 20:13:58 +00:00
|
|
|
break;
|
2014-07-26 00:27:48 -04:00
|
|
|
case 5:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(DeleteThread(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0));
|
2014-07-26 00:27:48 -04:00
|
|
|
break;
|
2012-03-31 20:13:58 +00:00
|
|
|
case 6:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(StartThread(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A1].nV0));
|
2012-03-31 20:13:58 +00:00
|
|
|
break;
|
2015-07-12 22:57:17 -04:00
|
|
|
case 7:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(StartThreadArgs(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A1].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A2].nV0));
|
2015-07-12 22:57:17 -04:00
|
|
|
break;
|
2012-09-12 04:03:41 +00:00
|
|
|
case 8:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(ExitThread());
|
|
|
|
break;
|
2014-07-26 00:27:48 -04:00
|
|
|
case 10:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(TerminateThread(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0));
|
2014-07-26 00:27:48 -04:00
|
|
|
break;
|
2011-10-22 22:36:49 +00:00
|
|
|
case 14:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(ChangeThreadPriority(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A1].nV0));
|
2011-10-22 22:36:49 +00:00
|
|
|
break;
|
2018-05-07 16:34:42 -04:00
|
|
|
case 16:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = RotateThreadReadyQueue(
|
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0);
|
|
|
|
break;
|
2017-05-01 23:08:30 -04:00
|
|
|
case 18:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = ReleaseWaitThread(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0);
|
2017-05-01 23:08:30 -04:00
|
|
|
break;
|
|
|
|
case 19:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = iReleaseWaitThread(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0);
|
2017-05-01 23:08:30 -04:00
|
|
|
break;
|
2012-03-31 20:13:58 +00:00
|
|
|
case 20:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(GetThreadId());
|
|
|
|
break;
|
2012-09-12 04:03:41 +00:00
|
|
|
case 22:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(ReferThreadStatus(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A1].nV0));
|
2012-09-12 04:03:41 +00:00
|
|
|
break;
|
2015-11-02 01:02:20 -05:00
|
|
|
case 23:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(iReferThreadStatus(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A1].nV0));
|
2015-11-02 01:02:20 -05:00
|
|
|
break;
|
2012-03-31 20:13:58 +00:00
|
|
|
case 24:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(SleepThread());
|
|
|
|
break;
|
|
|
|
case 25:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(WakeupThread(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0));
|
2012-03-31 20:13:58 +00:00
|
|
|
break;
|
2008-11-07 23:50:47 +00:00
|
|
|
case 26:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(iWakeupThread(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0));
|
2008-11-07 23:50:47 +00:00
|
|
|
break;
|
2016-11-04 20:54:49 -04:00
|
|
|
case 27:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = CancelWakeupThread(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0);
|
2016-11-04 20:54:49 -04:00
|
|
|
break;
|
|
|
|
case 28:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = iCancelWakeupThread(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0);
|
2016-11-04 20:54:49 -04:00
|
|
|
break;
|
2012-03-31 20:13:58 +00:00
|
|
|
case 33:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(DelayThread(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0));
|
2012-03-31 20:13:58 +00:00
|
|
|
break;
|
2008-11-07 23:50:47 +00:00
|
|
|
case 34:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(GetSystemTime(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0));
|
2008-11-07 23:50:47 +00:00
|
|
|
break;
|
2012-04-12 04:52:26 +00:00
|
|
|
case 35:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(SetAlarm(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A1].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A2].nV0));
|
2012-04-12 04:52:26 +00:00
|
|
|
break;
|
2014-06-04 03:18:31 -04:00
|
|
|
case 37:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(CancelAlarm(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A1].nV0));
|
2014-06-04 03:18:31 -04:00
|
|
|
break;
|
2023-12-22 11:29:52 -05:00
|
|
|
case 38:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(iCancelAlarm(
|
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A1].nV0));
|
|
|
|
break;
|
2008-11-21 23:15:53 +00:00
|
|
|
case 39:
|
|
|
|
USecToSysClock(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A1].nV0);
|
2008-11-21 23:15:53 +00:00
|
|
|
break;
|
|
|
|
case 40:
|
|
|
|
SysClockToUSec(
|
2018-04-30 21:01:23 +01:00
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A1].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A2].nV0);
|
2008-11-21 23:15:53 +00:00
|
|
|
break;
|
2011-10-22 22:36:49 +00:00
|
|
|
case 42:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(GetCurrentThreadPriority());
|
|
|
|
break;
|
2015-11-01 00:25:09 -04:00
|
|
|
case 43:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(GetSystemTimeLow());
|
|
|
|
break;
|
2021-08-30 15:23:59 -04:00
|
|
|
case 47:
|
|
|
|
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(GetThreadmanIdList(
|
|
|
|
context.m_State.nGPR[CMIPS::A0].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A1].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A2].nV0,
|
|
|
|
context.m_State.nGPR[CMIPS::A3].nV0));
|
|
|
|
break;
|
2012-03-31 20:13:58 +00:00
|
|
|
default:
|
2018-05-24 12:59:15 -04:00
|
|
|
CLog::GetInstance().Warn(LOG_NAME, "Unknown function (%d) called at (%08X).\r\n", functionId, context.m_State.nPC);
|
2012-03-31 20:13:58 +00:00
|
|
|
break;
|
|
|
|
}
|
2008-01-15 20:27:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
uint32 CThbase::CreateThread(const THREAD* thread)
|
|
|
|
{
|
2016-07-09 18:02:47 -04:00
|
|
|
return m_bios.CreateThread(thread->threadProc, thread->priority, thread->stackSize, thread->options, thread->attributes);
|
2008-01-15 20:27:44 +00:00
|
|
|
}
|
|
|
|
|
2014-07-26 00:27:48 -04:00
|
|
|
uint32 CThbase::DeleteThread(uint32 threadId)
|
|
|
|
{
|
2016-05-07 20:26:27 -04:00
|
|
|
return m_bios.DeleteThread(threadId);
|
2014-07-26 00:27:48 -04:00
|
|
|
}
|
|
|
|
|
2015-05-15 19:53:13 -04:00
|
|
|
int32 CThbase::StartThread(uint32 threadId, uint32 param)
|
2008-01-15 20:27:44 +00:00
|
|
|
{
|
2015-05-15 19:53:13 -04:00
|
|
|
return m_bios.StartThread(threadId, param);
|
2008-01-15 20:27:44 +00:00
|
|
|
}
|
|
|
|
|
2015-07-12 22:57:17 -04:00
|
|
|
int32 CThbase::StartThreadArgs(uint32 threadId, uint32 args, uint32 argpPtr)
|
|
|
|
{
|
|
|
|
return m_bios.StartThreadArgs(threadId, args, argpPtr);
|
|
|
|
}
|
|
|
|
|
2012-09-12 04:03:41 +00:00
|
|
|
uint32 CThbase::ExitThread()
|
|
|
|
{
|
|
|
|
m_bios.ExitThread();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-07-26 00:27:48 -04:00
|
|
|
uint32 CThbase::TerminateThread(uint32 threadId)
|
|
|
|
{
|
|
|
|
return m_bios.TerminateThread(threadId);
|
|
|
|
}
|
|
|
|
|
2011-10-22 22:36:49 +00:00
|
|
|
uint32 CThbase::ChangeThreadPriority(uint32 threadId, uint32 newPrio)
|
|
|
|
{
|
2016-11-12 15:11:10 -05:00
|
|
|
return m_bios.ChangeThreadPriority(threadId, newPrio);
|
2011-10-22 22:36:49 +00:00
|
|
|
}
|
|
|
|
|
2018-05-07 16:34:42 -04:00
|
|
|
int32 CThbase::RotateThreadReadyQueue(uint32 priority)
|
|
|
|
{
|
|
|
|
return m_bios.RotateThreadReadyQueue(priority);
|
|
|
|
}
|
|
|
|
|
2017-05-01 23:08:30 -04:00
|
|
|
int32 CThbase::ReleaseWaitThread(uint32 threadId)
|
|
|
|
{
|
|
|
|
return m_bios.ReleaseWaitThread(threadId, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
int32 CThbase::iReleaseWaitThread(uint32 threadId)
|
|
|
|
{
|
|
|
|
return m_bios.ReleaseWaitThread(threadId, true);
|
|
|
|
}
|
|
|
|
|
2008-01-15 20:27:44 +00:00
|
|
|
uint32 CThbase::GetThreadId()
|
|
|
|
{
|
2012-03-31 20:13:58 +00:00
|
|
|
return m_bios.GetCurrentThreadId();
|
2008-01-15 20:27:44 +00:00
|
|
|
}
|
|
|
|
|
2012-09-12 04:03:41 +00:00
|
|
|
uint32 CThbase::ReferThreadStatus(uint32 threadId, uint32 statusPtr)
|
|
|
|
{
|
2015-11-02 01:02:20 -05:00
|
|
|
return m_bios.ReferThreadStatus(threadId, statusPtr, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32 CThbase::iReferThreadStatus(uint32 threadId, uint32 statusPtr)
|
|
|
|
{
|
|
|
|
return m_bios.ReferThreadStatus(threadId, statusPtr, true);
|
2012-09-12 04:03:41 +00:00
|
|
|
}
|
|
|
|
|
2008-01-15 20:27:44 +00:00
|
|
|
uint32 CThbase::SleepThread()
|
|
|
|
{
|
2016-05-07 20:30:46 -04:00
|
|
|
return m_bios.SleepThread();
|
2008-01-15 20:27:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
uint32 CThbase::WakeupThread(uint32 threadId)
|
|
|
|
{
|
2012-03-31 20:13:58 +00:00
|
|
|
return m_bios.WakeupThread(threadId, false);
|
2008-11-07 23:50:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
uint32 CThbase::iWakeupThread(uint32 threadId)
|
|
|
|
{
|
|
|
|
return m_bios.WakeupThread(threadId, true);
|
|
|
|
}
|
|
|
|
|
2016-11-04 20:54:49 -04:00
|
|
|
int32 CThbase::CancelWakeupThread(uint32 threadId)
|
|
|
|
{
|
|
|
|
return m_bios.CancelWakeupThread(threadId, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
int32 CThbase::iCancelWakeupThread(uint32 threadId)
|
|
|
|
{
|
|
|
|
return m_bios.CancelWakeupThread(threadId, true);
|
|
|
|
}
|
|
|
|
|
2017-04-23 15:18:00 -04:00
|
|
|
uint32 CThbase::DelayThread(uint32 delay)
|
|
|
|
{
|
|
|
|
return m_bios.DelayThread(delay);
|
|
|
|
}
|
|
|
|
|
2015-10-24 21:20:46 -04:00
|
|
|
uint32 CThbase::GetSystemTime(uint32 resultPtr)
|
2008-11-07 23:50:47 +00:00
|
|
|
{
|
2008-11-14 17:10:21 +00:00
|
|
|
#ifdef _DEBUG
|
2017-05-29 06:01:32 +01:00
|
|
|
CLog::GetInstance().Print(LOG_NAME, "%d : " FUNCTION_GETSYSTEMTIME "(resultPtr = 0x%08X);\r\n",
|
2018-04-30 21:01:23 +01:00
|
|
|
m_bios.GetCurrentThreadIdRaw(), resultPtr);
|
2008-11-14 17:10:21 +00:00
|
|
|
#endif
|
2015-10-24 21:20:46 -04:00
|
|
|
uint64* result = nullptr;
|
|
|
|
if(resultPtr != 0)
|
2008-11-07 23:50:47 +00:00
|
|
|
{
|
2015-10-24 21:20:46 -04:00
|
|
|
result = reinterpret_cast<uint64*>(&m_ram[resultPtr]);
|
2008-11-07 23:50:47 +00:00
|
|
|
}
|
2015-10-24 21:20:46 -04:00
|
|
|
if(result)
|
2008-11-07 23:50:47 +00:00
|
|
|
{
|
|
|
|
(*result) = m_bios.GetCurrentTime();
|
|
|
|
}
|
|
|
|
return 1;
|
2008-01-15 20:27:44 +00:00
|
|
|
}
|
2008-11-21 23:15:53 +00:00
|
|
|
|
2015-11-01 00:25:09 -04:00
|
|
|
uint32 CThbase::GetSystemTimeLow()
|
|
|
|
{
|
|
|
|
#ifdef _DEBUG
|
|
|
|
CLog::GetInstance().Print(LOG_NAME, "%d : " FUNCTION_GETSYSTEMTIMELOW "();\r\n",
|
2018-04-30 21:01:23 +01:00
|
|
|
m_bios.GetCurrentThreadIdRaw());
|
2015-11-01 00:25:09 -04:00
|
|
|
#endif
|
|
|
|
return static_cast<uint32>(m_bios.GetCurrentTime());
|
|
|
|
}
|
|
|
|
|
2012-04-12 04:52:26 +00:00
|
|
|
uint32 CThbase::SetAlarm(uint32 timePtr, uint32 alarmFunction, uint32 param)
|
|
|
|
{
|
|
|
|
#ifdef _DEBUG
|
2017-05-29 06:01:32 +01:00
|
|
|
CLog::GetInstance().Print(LOG_NAME, "%d : SetAlarm(timePtr = 0x%08X, alarmFunction = 0x%08X, param = 0x%08X);\r\n",
|
2018-04-30 21:01:23 +01:00
|
|
|
m_bios.GetCurrentThreadIdRaw(), timePtr, alarmFunction, param);
|
2012-04-12 04:52:26 +00:00
|
|
|
#endif
|
2012-10-21 02:37:23 +00:00
|
|
|
return m_bios.SetAlarm(timePtr, alarmFunction, param);
|
2012-04-12 04:52:26 +00:00
|
|
|
}
|
|
|
|
|
2014-06-04 03:18:31 -04:00
|
|
|
uint32 CThbase::CancelAlarm(uint32 alarmFunction, uint32 param)
|
|
|
|
{
|
|
|
|
#ifdef _DEBUG
|
2017-05-29 06:01:32 +01:00
|
|
|
CLog::GetInstance().Print(LOG_NAME, "%d : CancelAlarm(alarmFunction = 0x%08X, param = 0x%08X);\r\n",
|
2018-04-30 21:01:23 +01:00
|
|
|
m_bios.GetCurrentThreadIdRaw(), alarmFunction, param);
|
2014-06-04 03:18:31 -04:00
|
|
|
#endif
|
2023-12-22 11:29:52 -05:00
|
|
|
return m_bios.CancelAlarm(alarmFunction, param, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32 CThbase::iCancelAlarm(uint32 alarmFunction, uint32 param)
|
|
|
|
{
|
|
|
|
#ifdef _DEBUG
|
|
|
|
CLog::GetInstance().Print(LOG_NAME, "%d : iCancelAlarm(alarmFunction = 0x%08X, param = 0x%08X);\r\n",
|
|
|
|
m_bios.GetCurrentThreadIdRaw(), alarmFunction, param);
|
|
|
|
#endif
|
|
|
|
return m_bios.CancelAlarm(alarmFunction, param, true);
|
2014-06-04 03:18:31 -04:00
|
|
|
}
|
|
|
|
|
2008-11-21 23:15:53 +00:00
|
|
|
void CThbase::USecToSysClock(uint32 usec, uint32 timePtr)
|
|
|
|
{
|
|
|
|
#ifdef _DEBUG
|
2017-05-29 06:01:32 +01:00
|
|
|
CLog::GetInstance().Print(LOG_NAME, "%d : USecToSysClock(usec = 0x%08X, timePtr = 0x%08X);\r\n",
|
2018-04-30 21:01:23 +01:00
|
|
|
m_bios.GetCurrentThreadIdRaw(), usec, timePtr);
|
2008-11-21 23:15:53 +00:00
|
|
|
#endif
|
|
|
|
uint64* time = (timePtr != 0) ? reinterpret_cast<uint64*>(&m_ram[timePtr]) : NULL;
|
|
|
|
if(time != NULL)
|
|
|
|
{
|
|
|
|
(*time) = m_bios.MicroSecToClock(usec);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CThbase::SysClockToUSec(uint32 timePtr, uint32 secPtr, uint32 usecPtr)
|
|
|
|
{
|
|
|
|
#ifdef _DEBUG
|
2017-05-29 06:01:32 +01:00
|
|
|
CLog::GetInstance().Print(LOG_NAME, "%d : SysClockToUSec(time = 0x%08X, sec = 0x%08X, usec = 0x%08X);\r\n",
|
2018-04-30 21:01:23 +01:00
|
|
|
m_bios.GetCurrentThreadIdRaw(), timePtr, secPtr, usecPtr);
|
2008-11-21 23:15:53 +00:00
|
|
|
#endif
|
|
|
|
uint64* time = (timePtr != 0) ? reinterpret_cast<uint64*>(&m_ram[timePtr]) : NULL;
|
|
|
|
uint32* sec = (secPtr != 0) ? reinterpret_cast<uint32*>(&m_ram[secPtr]) : NULL;
|
|
|
|
uint32* usec = (usecPtr != 0) ? reinterpret_cast<uint32*>(&m_ram[usecPtr]) : NULL;
|
|
|
|
if(time != NULL)
|
|
|
|
{
|
|
|
|
uint64 totalusec = m_bios.ClockToMicroSec(*time);
|
|
|
|
if(sec != NULL)
|
|
|
|
{
|
|
|
|
*sec = static_cast<uint32>(totalusec / 1000000);
|
|
|
|
}
|
|
|
|
if(usec != NULL)
|
|
|
|
{
|
|
|
|
*usec = static_cast<uint32>(totalusec % 1000000);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-10-22 22:36:49 +00:00
|
|
|
|
|
|
|
uint32 CThbase::GetCurrentThreadPriority()
|
|
|
|
{
|
|
|
|
#ifdef _DEBUG
|
|
|
|
CLog::GetInstance().Print(LOG_NAME, "%d : " FUNCTION_GETCURRENTTHREADPRIORITY "();\r\n",
|
2018-04-30 21:01:23 +01:00
|
|
|
m_bios.GetCurrentThreadIdRaw());
|
2011-10-22 22:36:49 +00:00
|
|
|
#endif
|
2015-11-04 01:03:32 -05:00
|
|
|
CIopBios::THREAD* currentThread = m_bios.GetThread(m_bios.GetCurrentThreadIdRaw());
|
2011-10-22 22:36:49 +00:00
|
|
|
if(currentThread == NULL) return -1;
|
|
|
|
return currentThread->priority;
|
|
|
|
}
|
2021-08-30 15:23:59 -04:00
|
|
|
|
|
|
|
int32 CThbase::GetThreadmanIdList(uint32 type, uint32 bufferPtr, uint32 bufferSize, uint32 countPtr)
|
|
|
|
{
|
|
|
|
#ifdef _DEBUG
|
|
|
|
CLog::GetInstance().Print(LOG_NAME, "%d : " FUNCTION_GETTHREADMANIDLIST "(type = %d, bufferPtr = 0x%08X, bufferSize = %d, countPtr = 0x%08X);\r\n",
|
|
|
|
m_bios.GetCurrentThreadIdRaw(), type, bufferPtr, bufferSize, countPtr);
|
|
|
|
#endif
|
|
|
|
CLog::GetInstance().Warn(LOG_NAME, "Using GetThreadmanIdList which is not fully implemented.\r\n");
|
|
|
|
if(countPtr != 0)
|
|
|
|
{
|
|
|
|
*reinterpret_cast<uint32*>(m_ram + countPtr) = 0;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|