FreeCalypso > hg > fc-magnetite
comparison src/gpf2/osl/os_pro_fl.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 | bc12e6de8a07 |
comparison
equal
deleted
inserted
replaced
| 486:c433cca731a3 | 487:91e8dac34ada |
|---|---|
| 1 /* | |
| 2 * This C module is a reconstruction based on the disassembly of | |
| 3 * os_pro.obj in frame_na7_db_fl.lib from the Leonardo package. | |
| 4 */ | |
| 5 | |
| 6 /* set of included headers from COFF symtab: */ | |
| 7 #include <stdio.h> | |
| 8 #include <string.h> | |
| 9 #include "gpfconf.h" /* FreeCalypso addition */ | |
| 10 #include "../../nucleus/nucleus.h" | |
| 11 #include "typedefs.h" | |
| 12 #include "os.h" | |
| 13 #include "gdi.h" | |
| 14 #include "os_types.h" | |
| 15 #include "os_glob.h" | |
| 16 | |
| 17 typedef unsigned char u_char; | |
| 18 | |
| 19 extern VOID *TCD_Current_Thread; | |
| 20 extern T_OS_TASK_TABLE_ENTRY TaskTable[]; | |
| 21 extern VOID os_TaskEntry(UNSIGNED, VOID *); | |
| 22 | |
| 23 static NU_SEMAPHORE ProSemCB; | |
| 24 | |
| 25 #define OS_NU_TASK_MAGIC 0xdeafbeef | |
| 26 | |
| 27 static int | |
| 28 os_GetTaskEntry(USHORT Index, OS_HANDLE *Handle) | |
| 29 { | |
| 30 static USHORT Idx; | |
| 31 | |
| 32 if (Index == FIRST_ENTRY) | |
| 33 Idx = 0; | |
| 34 if (Index == FIRST_ENTRY || Index == NEXT_ENTRY) { | |
| 35 while (++Idx <= MaxTasks && !TaskTable[Idx].Name[0]) | |
| 36 ; | |
| 37 } else | |
| 38 Idx = Index; | |
| 39 if (Idx <= MaxTasks && TaskTable[Idx].Name[0]) { | |
| 40 *Handle = Idx; | |
| 41 return(0); | |
| 42 } else | |
| 43 return(-1); | |
| 44 } | |
| 45 | |
| 46 GLOBAL LONG | |
| 47 os_TaskInformation(USHORT Index, char *Buffer) | |
| 48 { | |
| 49 DATA_ELEMENT TaskStatus; | |
| 50 OPTION Prio, Preempt; | |
| 51 UNSIGNED Count, TimeSlice, Size, MinStack; | |
| 52 OS_HANDLE Handle; | |
| 53 CHAR Name[NU_MAX_NAME]; | |
| 54 u_char *StackBase, *sp; | |
| 55 USHORT Untouched; | |
| 56 | |
| 57 if (os_GetTaskEntry(Index, &Handle) < 0) | |
| 58 return(OS_ERROR); | |
| 59 if (NU_Task_Information(&TaskTable[Handle].TaskCB.TCB, Name, | |
| 60 &TaskStatus, &Count, &Prio, &Preempt, | |
| 61 &TimeSlice, (VOID **) &StackBase, | |
| 62 &Size, &MinStack) != NU_SUCCESS) | |
| 63 return(OS_ERROR); | |
| 64 Untouched = 0; | |
| 65 for (sp = StackBase; sp < StackBase + Size; sp++) { | |
| 66 if (*sp != INITIAL_STACK_VALUE) | |
| 67 break; | |
| 68 Untouched++; | |
| 69 } | |
| 70 sprintf(Buffer, | |
| 71 "Name:%s Stat:%d Count:%ld Prio:%d Stack:%lx Size:%ld Untouched:%d", | |
| 72 Name, TaskStatus, Count, 255 - Prio, (ULONG) StackBase, | |
| 73 (LONG) Size, Untouched); | |
| 74 return(OS_OK); | |
| 75 } | |
| 76 | |
| 77 GLOBAL LONG | |
| 78 os_StopTask(OS_HANDLE Caller, OS_HANDLE TaskHandle) | |
| 79 { | |
| 80 if (NU_Suspend_Task(&TaskTable[TaskHandle].TaskCB.TCB) == NU_SUCCESS) | |
| 81 return(OS_OK); | |
| 82 else | |
| 83 return(OS_ERROR); | |
| 84 } | |
| 85 | |
| 86 GLOBAL LONG | |
| 87 os_StartTask(OS_HANDLE Caller, OS_HANDLE TaskHandle, ULONG Value) | |
| 88 { | |
| 89 if (NU_Resume_Task(&TaskTable[TaskHandle].TaskCB.TCB) == NU_SUCCESS) | |
| 90 return(OS_OK); | |
| 91 else | |
| 92 return(OS_ERROR); | |
| 93 } | |
| 94 | |
| 95 GLOBAL LONG | |
| 96 os_ProInit(void) | |
| 97 { | |
| 98 USHORT i; | |
| 99 | |
| 100 if (NU_Create_Semaphore(&ProSemCB, "PROSEM", 1, NU_PRIORITY) | |
| 101 != NU_SUCCESS) | |
| 102 return(OS_ERROR); | |
| 103 for (i = 1; i <= MaxTasks; i++) | |
| 104 bzero(&TaskTable[i], sizeof(T_OS_TASK_TABLE_ENTRY)); | |
| 105 return(OS_OK); | |
| 106 } | |
| 107 | |
| 108 GLOBAL unsigned char | |
| 109 os_GetTaskState(OS_HANDLE Caller, OS_HANDLE Handle) | |
| 110 { | |
| 111 if (TaskTable[Handle].Name[0]) | |
| 112 return(TaskTable[Handle].TaskCB.TCB.tc_status); | |
| 113 else | |
| 114 return(255); | |
| 115 } | |
| 116 | |
| 117 GLOBAL LONG | |
| 118 os_GetTaskHandle(OS_HANDLE Caller, char *Name, OS_HANDLE *TaskHandle) | |
| 119 { | |
| 120 USHORT i; | |
| 121 | |
| 122 if (!Name) { | |
| 123 OS_NU_TASK *os_nu_task = (OS_NU_TASK *) TCD_Current_Thread; | |
| 124 | |
| 125 if (os_nu_task && os_nu_task->magic_nr == OS_NU_TASK_MAGIC) | |
| 126 *TaskHandle = os_nu_task->handle; | |
| 127 else | |
| 128 *TaskHandle = OS_NOTASK; | |
| 129 return(OS_OK); | |
| 130 } | |
| 131 for (i = 1; i <= MaxTasks; i++) | |
| 132 if (TaskTable[i].Name[0] && | |
| 133 !strncmp(Name, TaskTable[i].Name, RESOURCE_NAMELEN - 1)) { | |
| 134 *TaskHandle = i; | |
| 135 return(OS_OK); | |
| 136 } | |
| 137 return(OS_ERROR); | |
| 138 } | |
| 139 | |
| 140 GLOBAL LONG | |
| 141 os_GetTaskData(OS_HANDLE Handle, unsigned **tcb, | |
| 142 u_char **stackbegin, u_char **stackend) | |
| 143 { | |
| 144 NU_TASK *task; | |
| 145 | |
| 146 if (!TaskTable[Handle].Name[0]) | |
| 147 return(OS_ERROR); | |
| 148 task = &TaskTable[Handle].TaskCB.TCB; | |
| 149 *tcb = (unsigned *) task; | |
| 150 *stackbegin = (u_char *) task->tc_stack_start; | |
| 151 *stackend = (u_char *) task->tc_stack_end; | |
| 152 return(OS_OK); | |
| 153 } | |
| 154 | |
| 155 GLOBAL LONG | |
| 156 os_GetScheduleCount(OS_HANDLE task_handle, int *schedule_count) | |
| 157 { | |
| 158 NU_TASK *task_cb; | |
| 159 | |
| 160 if (task_handle > MaxTasks) | |
| 161 return(OS_ERROR); | |
| 162 if (!TaskTable[task_handle].Name[0]) | |
| 163 return(OS_ERROR); | |
| 164 if (task_handle == OS_NOTASK) | |
| 165 task_cb = (NU_TASK *) TCD_Current_Thread; | |
| 166 else | |
| 167 task_cb = &TaskTable[task_handle].TaskCB.TCB; | |
| 168 *schedule_count = task_cb->tc_scheduled; | |
| 169 return(OS_OK); | |
| 170 } | |
| 171 | |
| 172 GLOBAL LONG | |
| 173 os_DestroyTask(OS_HANDLE Caller, OS_HANDLE TaskHandle) | |
| 174 { | |
| 175 STATUS sts; | |
| 176 | |
| 177 if (NU_Terminate_Task(&TaskTable[TaskHandle].TaskCB.TCB) != NU_SUCCESS) | |
| 178 return(OS_ERROR); | |
| 179 if (NU_Delete_Task(&TaskTable[TaskHandle].TaskCB.TCB) != NU_SUCCESS) | |
| 180 return(OS_ERROR); | |
| 181 if (os_DeallocateMemory(Caller, TaskTable[TaskHandle].Stack) != OS_OK) | |
| 182 return(OS_ERROR); | |
| 183 sts = NU_Obtain_Semaphore(&ProSemCB, NU_SUSPEND); | |
| 184 TaskTable[TaskHandle].Name[0] = 0; | |
| 185 if (sts == NU_SUCCESS) | |
| 186 NU_Release_Semaphore(&ProSemCB); | |
| 187 return(OS_OK); | |
| 188 } | |
| 189 | |
| 190 GLOBAL LONG | |
| 191 os_CreateTask(OS_HANDLE Caller, char *Name, | |
| 192 void (*TaskEntry)(OS_HANDLE, ULONG), ULONG StackSize, | |
| 193 USHORT Priority, OS_HANDLE *TaskHandle, OS_HANDLE MemPoolHandle) | |
| 194 { | |
| 195 STATUS sem_sts; | |
| 196 USHORT Handle; | |
| 197 u_char *stack; | |
| 198 | |
| 199 sem_sts = NU_Obtain_Semaphore(&ProSemCB, NU_SUSPEND); | |
| 200 for (Handle = 1; Handle <= MaxTasks; Handle++) | |
| 201 if (!TaskTable[Handle].Name[0]) | |
| 202 break; | |
| 203 if (Handle > MaxTasks) { | |
| 204 return_error: if (sem_sts == NU_SUCCESS) | |
| 205 NU_Release_Semaphore(&ProSemCB); | |
| 206 return(OS_ERROR); | |
| 207 } | |
| 208 if (os_AllocateMemory(Handle, &TaskTable[Handle].Stack, StackSize + 4, | |
| 209 0, MemPoolHandle) != OS_OK) | |
| 210 goto return_error; | |
| 211 stack = (u_char *)TaskTable[Handle].Stack + 4; | |
| 212 memset(stack, INITIAL_STACK_VALUE, StackSize); | |
| 213 *TaskTable[Handle].Stack = GUARD_PATTERN; | |
| 214 if (NU_Create_Task(&TaskTable[Handle].TaskCB.TCB, Name, os_TaskEntry, | |
| 215 Handle, 0, stack, StackSize, | |
| 216 255 - Priority, 0, NU_PREEMPT, NU_NO_START) | |
| 217 != NU_SUCCESS) | |
| 218 goto return_error; | |
| 219 strncpy(TaskTable[Handle].Name, Name, RESOURCE_NAMELEN); | |
| 220 TaskTable[Handle].Name[RESOURCE_NAMELEN-1] = 0; | |
| 221 TaskTable[Handle].TaskEntry = TaskEntry; | |
| 222 TaskTable[Handle].TaskCB.magic_nr = OS_NU_TASK_MAGIC; | |
| 223 TaskTable[Handle].TaskCB.handle = Handle; | |
| 224 *TaskHandle = Handle; | |
| 225 if (sem_sts == NU_SUCCESS) | |
| 226 NU_Release_Semaphore(&ProSemCB); | |
| 227 return(OS_OK); | |
| 228 } | |
| 229 | |
| 230 GLOBAL LONG | |
| 231 os_ChangePreemption(char preempt) | |
| 232 { | |
| 233 if (NU_Change_Preemption(preempt) == NU_SUCCESS) | |
| 234 return(OS_OK); | |
| 235 else | |
| 236 return(OS_ERROR); | |
| 237 } |
