comparison src/gpf/osl/os_pro_ir.c @ 0:4e78acac3d88

src/{condat,cs,gpf,nucleus}: import from Selenite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:23:26 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4e78acac3d88
1 /*
2 * This C module is a reconstruction based on the disassembly of
3 * os_pro.obj in frame_na7_db_ir.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 "nucleus.h"
10 #include "typedefs.h"
11 #include "os.h"
12 #include "gdi.h"
13 #include "os_types.h"
14 #include "os_glob.h"
15
16 extern VOID *TCD_Current_Thread;
17 extern T_OS_TASK_TABLE_ENTRY TaskTable[];
18 extern unsigned os_time_to_tick_multiplier;
19
20 #define OS_NU_TASK_MAGIC 0xdeafbeef
21
22 VOID
23 os_TaskEntry(UNSIGNED TaskHandle, VOID *argv)
24 {
25 TaskTable[TaskHandle].TaskEntry(TaskHandle, 0);
26 }
27
28 GLOBAL LONG
29 os_SuspendTask(OS_HANDLE Caller, ULONG Time)
30 {
31 UNSIGNED SuspendTicks;
32
33 SuspendTicks = TIME_TO_SYSTEM_TICKS(Time);
34 if (!SuspendTicks)
35 SuspendTicks = 1;
36 NU_Sleep(SuspendTicks);
37 return (OS_OK);
38 }
39
40 GLOBAL LONG
41 os_ResumeTask(OS_HANDLE task_handle)
42 {
43 if (NU_Resume_Task(&TaskTable[task_handle].TaskCB.TCB) == NU_SUCCESS)
44 return(OS_OK);
45 else
46 return(OS_ERROR);
47 }
48
49 GLOBAL LONG
50 os_Relinquish(void)
51 {
52 NU_Relinquish();
53 return(OS_OK);
54 }
55
56 GLOBAL OS_HANDLE
57 os_MyHandle(void)
58 {
59 OS_NU_TASK *os_nu_task = (OS_NU_TASK *) TCD_Current_Thread;
60
61 if (os_nu_task && os_nu_task->magic_nr == OS_NU_TASK_MAGIC)
62 return(os_nu_task->handle);
63 else
64 return(OS_NOTASK);
65 }
66
67 GLOBAL LONG
68 os_GetTaskName(OS_HANDLE Caller, OS_HANDLE TaskHandle, char *Name)
69 {
70 if (TaskHandle) {
71 if (TaskHandle > MaxTasks || !TaskTable[TaskHandle].Name[0])
72 return(OS_ERROR);
73 strcpy(Name, TaskTable[TaskHandle].Name);
74 } else if (TCD_Current_Thread) {
75 NU_TASK *curtask = TCD_Current_Thread;
76 strcpy(Name, curtask->tc_name);
77 } else
78 strcpy(Name, "ROOT");
79 return(OS_OK);
80 }
81
82 GLOBAL LONG
83 os_DeferTask(OS_HANDLE task_handle, OS_TIME time)
84 {
85 if (NU_Suspend_Task(&TaskTable[task_handle].TaskCB.TCB) == NU_SUCCESS)
86 return(OS_OK);
87 else
88 return(OS_ERROR);
89 }
90
91 GLOBAL LONG
92 os_CheckTaskStack(OS_HANDLE Handle)
93 {
94 #ifdef __GNUC__
95 register void *sp asm("sp");
96 #endif
97
98 if (*TaskTable[Handle].Stack != GUARD_PATTERN)
99 return(OS_ERROR);
100 #ifdef __GNUC__
101 if (TCD_Current_Thread) {
102 NU_TASK *curtask = TCD_Current_Thread;
103 if (sp < curtask->tc_stack_start)
104 return(OS_ERROR);
105 }
106 #endif
107 return(OS_OK);
108 }