26#include "arch/sys_arch.h"
28#include "ps2ip_internal.h"
30static arch_message msg_pool[SYS_MAX_MESSAGES];
31static arch_message *free_head;
34static arch_message *alloc_msg(
void);
35static void free_msg(arch_message *msg);
37static int MsgCountSema;
39static arch_message *try_alloc_msg(
void)
41 arch_message *message;
44 if(PollSema(MsgCountSema)==0)
49 free_head = free_head->next;
57static arch_message *alloc_msg(
void)
59 arch_message *message;
62 WaitSema(MsgCountSema);
67 free_head = free_head->next;
74static void free_msg(arch_message *msg)
80 msg->next = free_head;
84 SignalSema(MsgCountSema);
88TimeoutHandler(
void* pvArg)
90 iReleaseWaitThread((
int)pvArg);
95ComputeTimeDiff(iop_sys_clock_t* pStart,iop_sys_clock_t* pEnd)
98 u32 iSec, iUSec, iDiff;
100 Diff.lo=pEnd->lo-pStart->lo;
101 Diff.hi=pEnd->hi-pStart->hi - (pStart->lo>pEnd->lo);
103 SysClock2USec(&Diff, &iSec, &iUSec);
104 iDiff=(iSec*1000)+(iUSec/1000);
106 return((iDiff!=0)?iDiff:1);
118 thp.option = (u32)
"PS2IP";
120 thp.stacksize = stacksize;
123 if((tid = CreateThread(&thp)) < 0)
125 dbgprintf(
"sys_thread_new: CreateThread failed, EC: %d\n", tid);
129 if((rv = StartThread(tid, arg)) < 0)
131 dbgprintf(
"sys_thread_new: StartThread failed, EC: %d\n", rv);
136 dbgprintf(
"sys_thread_new: thread %d\n", tid);
138 return((sys_thread_t) tid);
147 mbp.attr = MBA_THFIFO;
148 mbp.option = (u32)
"PS2IP";
150 if((*
mbox = CreateMbx(&mbp)) < 0)
152 printf(
"sys_mbox_new: CreateMbx failed, EC: %d\n", *
mbox);
156 dbgprintf(
"sys_mbox_new: mbox %d\n", *
mbox);
172 arch_message *MsgPkt;
175 if((MsgPkt = try_alloc_msg()) != NULL){
176 MsgPkt->sys_msg = msg;
177 SendMbx(*
mbox, (iop_message_t *)MsgPkt);
194 arch_message *MsgPkt;
196 MsgPkt->sys_msg = msg;
197 SendMbx(*
mbox, (iop_message_t *)MsgPkt);
205static u32_t sys_arch_mbox_fetch_internal(sys_mbox_t pMBox,
void** ppvMSG, u32_t TimeElaspedout,
char block)
208 u32_t TimeElasped = 0;
209 iop_sys_clock_t ClockTicks;
210 iop_sys_clock_t Start;
221 if(TimeElaspedout > 0)
223 GetSystemTime(&Start);
224 USec2SysClock(TimeElaspedout * 1000, &ClockTicks);
225 SetAlarm(&ClockTicks, &TimeoutHandler, (
void*)iPID);
230 if(TimeElaspedout > 0)
232 CancelAlarm(TimeoutHandler,(
void*)iPID);
235 TimeElasped = ComputeTimeDiff(&Start, &End);
245 *ppvMSG = ((arch_message *)pmsg)->sys_msg;
246 free_msg((arch_message *) pmsg);
256 return(sys_arch_mbox_fetch_internal(*
mbox, msg, timeout, 1));
260 return(sys_arch_mbox_fetch_internal(*
mbox, msg, 0, 0));
269 if((*sem=CreateSema(&Sema))<0)
271 printf(
"sys_sem_new: CreateSema failed, EC: %d\n", *sem);
276 dbgprintf(
"sys_sem_new: CreateSema cnt %d sema %d\n",
count, *sem);
307 iop_sys_clock_t ClockTicks;
308 iop_sys_clock_t Start;
310 int iPID=GetThreadId();
313 GetSystemTime(&Start);
314 USec2SysClock(timeout*1000,&ClockTicks);
315 SetAlarm(&ClockTicks, &TimeoutHandler, (
void*)iPID);
317 if(WaitSema(*sem)==0){
318 CancelAlarm(TimeoutHandler,(
void*)iPID);
321 u32WaitTime=ComputeTimeDiff(&Start, &End);
322 result=(u32WaitTime<=timeout)?u32WaitTime:timeout;
345 sema.initial=sema.max=SYS_MAX_MESSAGES;
346 sema.attr=sema.option=0;
347 MsgCountSema=CreateSema(&sema);
349 free_head = &msg_pool[0];
352 for(i = 1; i < SYS_MAX_MESSAGES; i++)
354 prev->next = &msg_pool[i];
362sys_prot_t sys_arch_protect(
void)
370void sys_arch_unprotect(sys_prot_t Flags)
375void *malloc(
size_t size)
381 ptr=AllocSysMemory(ALLOC_LAST, size, NULL);
396void *calloc(
size_t n,
size_t size)
402 ptr=AllocSysMemory(ALLOC_LAST, n * size, NULL);
406 memset(ptr, 0, n * size);
413 iop_sys_clock_t timenow;
416 GetSystemTime(&timenow);
417 SysClock2USec(&timenow, &seconds, &usecs);
419 return(seconds*1000 + usecs / 1000);
void sys_mbox_set_invalid(sys_mbox_t *mbox)
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
int sys_mbox_valid(sys_mbox_t *mbox)
void sys_mbox_post(sys_mbox_t *mbox, void *msg)
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
err_t sys_mbox_new(sys_mbox_t *mbox, int size)
void sys_mbox_free(sys_mbox_t *mbox)
err_t sys_mbox_trypost_fromisr(sys_mbox_t *mbox, void *msg)
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
int sys_sem_valid(sys_sem_t *sem)
void sys_sem_set_invalid(sys_sem_t *sem)
void sys_sem_free(sys_sem_t *sem)
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
void sys_sem_signal(sys_sem_t *sem)
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)
void(*) lwip_thread_fn(void *arg)
u32 count
start sector of fragmented bd/file