FreeCalypso > hg > fc-magnetite
annotate src/gpf2/osl/os_com_ir.c @ 487:91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 22 Jun 2018 05:56:16 +0000 |
parents | |
children | f89439ce0d45 |
rev | line source |
---|---|
487
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * This C module is a reconstruction based on the disassembly of |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * os_com.obj in frame_na7_db_ir.lib from the Leonardo package. |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 */ |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 /* set of included headers from COFF symtab: */ |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <stdio.h> |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <string.h> |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include "gpfconf.h" /* FreeCalypso addition */ |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include "../../nucleus/nucleus.h" |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include "../../nucleus/tc_extr.h" /* not seen in original, but needed */ |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 #include "typedefs.h" |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 #include "os.h" |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 #include "gdi.h" |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #include "os_types.h" |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 #include "os_glob.h" |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 extern T_OS_COM_TABLE_ENTRY ComTable[]; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 extern unsigned os_tick_to_time_multiplier; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 extern int ObtainSemaphoreCB(NU_SEMAPHORE *SemCB, ULONG Timeout, |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 USHORT wait_check); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 extern int ReleaseSemaphoreCB(NU_SEMAPHORE *SemCB); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 GLOBAL LONG |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 os_SendToQueue(OS_HANDLE TaskHandle, OS_HANDLE ComHandle, USHORT Priority, |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 ULONG Suspend, OS_QDATA *Msg) |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 { |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 T_OS_COM_TABLE_ENTRY *pTable; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 T_QDATA_ELEMENT *elem; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 T_QUEUE *queue; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 int ret; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 NU_SEMAPHORE *CBPtr; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 USHORT watmark; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 if (ComHandle <= 0 || ComHandle > MaxCommunications) |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 return(OS_INVALID_QUEUE); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 pTable = ComTable + ComHandle; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 if (!pTable->Name[0]) |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 return(OS_INVALID_QUEUE); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 CBPtr = &pTable->FreeSemCB; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 ret = ObtainSemaphoreCB(CBPtr, Suspend, 1); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 if (ret == OS_ERROR || ret == OS_TIMEOUT) |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 return(ret); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 TCT_System_Protect(); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 elem = pTable->pFreeElement; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 pTable->pFreeElement = elem->pNext; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 bcopy(Msg, &elem->Data, sizeof(OS_QDATA)); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 queue = &pTable->Queue[Priority - OS_MIN_PRIORITY]; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 *queue->pWrite++ = &elem->Data; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 if (queue->pWrite - queue->pStart >= pTable->Entries + 1) |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 queue->pWrite = queue->pStart; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 watmark = pTable->Entries - CBPtr->sm_semaphore_count; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 if (pTable->MaxUsed < watmark) |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 pTable->MaxUsed = watmark; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 TCT_System_Unprotect(); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 ReleaseSemaphoreCB(&pTable->UsedSemCB); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 return(ret); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 } |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 GLOBAL LONG |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 os_ReceiveFromQueue(OS_HANDLE TaskHandle, OS_HANDLE ComHandle, |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 OS_QDATA *Msg, ULONG Timeout) |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 { |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 T_QDATA_ELEMENT *pElem; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 UNSIGNED c_time; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 int ret; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 USHORT i; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 T_QUEUE *pQueue; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 T_OS_COM_TABLE_ENTRY *pTable; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 pTable = ComTable + ComHandle; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 if (!pTable->Name[0]) |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 return(OS_ERROR); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 pTable->current_msg.type = 0; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 ret = ObtainSemaphoreCB(&pTable->UsedSemCB, Timeout, 0); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 if (ret == OS_ERROR || ret == OS_TIMEOUT) |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 return(ret); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 TCT_System_Protect(); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 for (i = OS_MAX_PRIORITY; i >= OS_MIN_PRIORITY; i--) { |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 pQueue = &pTable->Queue[i - OS_MIN_PRIORITY]; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 if (pQueue->pWrite != pQueue->pRead) |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 break; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 } |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 if (i < OS_MIN_PRIORITY) { |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 TCT_System_Unprotect(); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 ReleaseSemaphoreCB(&pTable->FreeSemCB); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 return(OS_ERROR); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 } |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 bcopy(*pQueue->pRead, Msg, sizeof(OS_QDATA)); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 pElem = (T_QDATA_ELEMENT *)*pQueue->pRead++; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 pElem->Data.data16 = 0; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 pElem->pNext = pTable->pFreeElement; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 pTable->pFreeElement = pElem; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 if (pQueue->pRead - pQueue->pStart >= pTable->Entries + 1) |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 pQueue->pRead = pQueue->pStart; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 pTable->current_msg.type = Msg->data16; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 pTable->current_msg.opc = Msg->data32; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 c_time = NU_Retrieve_Clock(); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 pTable->current_msg.time = SYSTEM_TICKS_TO_TIME(c_time); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 pTable->current_msg.ptr = Msg->ptr; |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 TCT_System_Unprotect(); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 ReleaseSemaphoreCB(&pTable->FreeSemCB); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 return(OS_OK); |
91e8dac34ada
src/gpf2/osl: initial import from old freecalypso-sw tree
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 } |