FreeCalypso > hg > fc-magnetite
comparison src/gpf2/osl/os_isr.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 | 10c059efb3d1 |
comparison
equal
deleted
inserted
replaced
| 486:c433cca731a3 | 487:91e8dac34ada |
|---|---|
| 1 /* | |
| 2 * This C module is a reconstruction based on the disassembly of | |
| 3 * os_isr.obj in frame_na7_db_fl.lib from the Leonardo package. | |
| 4 */ | |
| 5 | |
| 6 /* set of included headers from COFF symtab: */ | |
| 7 #include <string.h> | |
| 8 #include "gpfconf.h" /* FreeCalypso addition */ | |
| 9 #include "../../nucleus/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 typedef unsigned char u_char; | |
| 17 | |
| 18 extern T_OS_OSISR_TABLE_ENTRY OSISRTable[]; | |
| 19 extern OS_HANDLE os_int_pool_handle; | |
| 20 | |
| 21 GLOBAL LONG | |
| 22 os_isr_init(void) | |
| 23 { | |
| 24 USHORT i; | |
| 25 | |
| 26 for (i = 1; i <= MaxOSISRs; i++) | |
| 27 OSISRTable[i].name[0] = 0; | |
| 28 return(OS_OK); | |
| 29 } | |
| 30 | |
| 31 GLOBAL LONG | |
| 32 os_SetInterruptState(OS_INT_STATE new_state, OS_INT_STATE *old_state) | |
| 33 { | |
| 34 INT state; | |
| 35 | |
| 36 if (new_state) | |
| 37 state = NU_ENABLE_INTERRUPTS; | |
| 38 else | |
| 39 state = NU_DISABLE_INTERRUPTS; | |
| 40 state = NU_Control_Interrupts(state); | |
| 41 if (state & 0xFF) | |
| 42 *old_state = 0; | |
| 43 else | |
| 44 *old_state = 1; | |
| 45 return(OS_OK); | |
| 46 } | |
| 47 | |
| 48 GLOBAL LONG | |
| 49 os_EnableInterrupts(OS_INT_STATE *old_state) | |
| 50 { | |
| 51 INT state; | |
| 52 | |
| 53 state = NU_Control_Interrupts(NU_ENABLE_INTERRUPTS); | |
| 54 if (state & 0xFF) | |
| 55 *old_state = 0; | |
| 56 else | |
| 57 *old_state = 1; | |
| 58 return(OS_OK); | |
| 59 } | |
| 60 | |
| 61 GLOBAL LONG | |
| 62 os_DisableInterrupts(OS_INT_STATE *old_state) | |
| 63 { | |
| 64 INT state; | |
| 65 | |
| 66 state = NU_Control_Interrupts(NU_DISABLE_INTERRUPTS); | |
| 67 if (state & 0xFF) | |
| 68 *old_state = 0; | |
| 69 else | |
| 70 *old_state = 1; | |
| 71 return(OS_OK); | |
| 72 } | |
| 73 | |
| 74 GLOBAL LONG | |
| 75 os_DeleteOSISR(OS_HANDLE hisr_handle) | |
| 76 { | |
| 77 OS_INT_STATE old_state, state; | |
| 78 | |
| 79 if (hisr_handle <= 0 || hisr_handle > MaxOSISRs) | |
| 80 return(OS_ERROR); | |
| 81 if (OSISRTable[hisr_handle].hisr_cb.tc_activation_count) | |
| 82 return(OS_ERROR); | |
| 83 os_DisableInterrupts(&old_state); | |
| 84 if (os_DeallocateMemory(os_MyHandle(), OSISRTable[hisr_handle].stack) | |
| 85 == OS_ERROR) { | |
| 86 error: os_SetInterruptState(old_state, &state); | |
| 87 return(OS_ERROR); | |
| 88 } | |
| 89 if (NU_Delete_HISR(&OSISRTable[hisr_handle].hisr_cb) != NU_SUCCESS) | |
| 90 goto error; | |
| 91 OSISRTable[hisr_handle].name[0] = 0; | |
| 92 os_SetInterruptState(old_state, &state); | |
| 93 return(OS_OK); | |
| 94 } | |
| 95 | |
| 96 GLOBAL LONG | |
| 97 os_CreateOSISR(char *name, void (*OSISR_entry)(void), | |
| 98 int stacksize, int priority, | |
| 99 int flags, OS_HANDLE *hisr_handle) | |
| 100 { | |
| 101 OS_HANDLE handle; | |
| 102 T_VOID_STRUCT *hisr_stack; | |
| 103 OS_INT_STATE old_state, state; | |
| 104 | |
| 105 if (priority < 0 || priority > 2) | |
| 106 return(OS_ERROR); | |
| 107 priority = 2 - priority; | |
| 108 os_DisableInterrupts(&old_state); | |
| 109 for (handle = 1; handle <= MaxOSISRs; handle++) | |
| 110 if (!strncmp(OSISRTable[handle].name, name, | |
| 111 RESOURCE_NAMELEN - 1)) { | |
| 112 error: os_SetInterruptState(old_state, &state); | |
| 113 return(OS_ERROR); | |
| 114 } | |
| 115 for (handle = 1; handle <= MaxOSISRs; handle++) | |
| 116 if (!OSISRTable[handle].name[0]) | |
| 117 break; | |
| 118 if (handle > MaxOSISRs) | |
| 119 goto error; | |
| 120 if (os_AllocateMemory(os_MyHandle(), &hisr_stack, stacksize, | |
| 121 0xFFFFFFFF, os_int_pool_handle) == OS_ERROR) | |
| 122 goto error; | |
| 123 memset((u_char *)hisr_stack, INITIAL_STACK_VALUE, stacksize); | |
| 124 *hisr_stack = GUARD_PATTERN; | |
| 125 if (NU_Create_HISR(&OSISRTable[handle].hisr_cb, name, OSISR_entry, | |
| 126 priority, (VOID *)hisr_stack, stacksize) | |
| 127 != NU_SUCCESS) | |
| 128 goto error; | |
| 129 strncpy(OSISRTable[handle].name, name, RESOURCE_NAMELEN); | |
| 130 OSISRTable[handle].name[RESOURCE_NAMELEN-1] = 0; | |
| 131 OSISRTable[handle].stack = hisr_stack; | |
| 132 *hisr_handle = handle; | |
| 133 os_SetInterruptState(old_state, &state); | |
| 134 return(OS_OK); | |
| 135 } | |
| 136 | |
| 137 GLOBAL LONG | |
| 138 os_ActivateOSISR(OS_HANDLE hisr_handle) | |
| 139 { | |
| 140 if (hisr_handle <= 0 || hisr_handle > MaxOSISRs) | |
| 141 return(OS_ERROR); | |
| 142 if (NU_Activate_HISR(&OSISRTable[hisr_handle].hisr_cb) == NU_SUCCESS) | |
| 143 return(OS_OK); | |
| 144 else | |
| 145 return(OS_ERROR); | |
| 146 } |
