diff src/gpf/osl/os_isr.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gpf/osl/os_isr.c	Fri Oct 16 06:23:26 2020 +0000
@@ -0,0 +1,145 @@
+/*
+ * This C module is a reconstruction based on the disassembly of
+ * os_isr.obj in frame_na7_db_fl.lib from the Leonardo package.
+ */
+
+/* set of included headers from COFF symtab: */
+#include <string.h>
+#include "nucleus.h"
+#include "typedefs.h"
+#include "os.h"
+#include "gdi.h"
+#include "os_types.h"
+#include "os_glob.h"
+
+typedef unsigned char u_char;
+
+extern T_OS_OSISR_TABLE_ENTRY OSISRTable[];
+extern OS_HANDLE os_int_pool_handle;
+
+GLOBAL LONG
+os_isr_init(void)
+{
+	USHORT i;
+
+	for (i = 1; i <= MaxOSISRs; i++)
+		OSISRTable[i].name[0] = 0;
+	return(OS_OK);
+}
+
+GLOBAL LONG
+os_SetInterruptState(OS_INT_STATE new_state, OS_INT_STATE *old_state)
+{
+	INT state;
+
+	if (new_state)
+		state = NU_ENABLE_INTERRUPTS;
+	else
+		state = NU_DISABLE_INTERRUPTS;
+	state = NU_Control_Interrupts(state);
+	if (state & 0xFF)
+		*old_state = 0;
+	else
+		*old_state = 1;
+	return(OS_OK);
+}
+
+GLOBAL LONG
+os_EnableInterrupts(OS_INT_STATE *old_state)
+{
+	INT state;
+
+	state = NU_Control_Interrupts(NU_ENABLE_INTERRUPTS);
+	if (state & 0xFF)
+		*old_state = 0;
+	else
+		*old_state = 1;
+	return(OS_OK);
+}
+
+GLOBAL LONG
+os_DisableInterrupts(OS_INT_STATE *old_state)
+{
+	INT state;
+
+	state = NU_Control_Interrupts(NU_DISABLE_INTERRUPTS);
+	if (state & 0xFF)
+		*old_state = 0;
+	else
+		*old_state = 1;
+	return(OS_OK);
+}
+
+GLOBAL LONG
+os_DeleteOSISR(OS_HANDLE hisr_handle)
+{
+	OS_INT_STATE old_state, state;
+
+	if (hisr_handle <= 0 || hisr_handle > MaxOSISRs)
+		return(OS_ERROR);
+	if (OSISRTable[hisr_handle].hisr_cb.tc_activation_count)
+		return(OS_ERROR);
+	os_DisableInterrupts(&old_state);
+	if (os_DeallocateMemory(os_MyHandle(), OSISRTable[hisr_handle].stack)
+	    == OS_ERROR) {
+error:		os_SetInterruptState(old_state, &state);
+		return(OS_ERROR);
+	}
+	if (NU_Delete_HISR(&OSISRTable[hisr_handle].hisr_cb) != NU_SUCCESS)
+		goto error;
+	OSISRTable[hisr_handle].name[0] = 0;
+	os_SetInterruptState(old_state, &state);
+	return(OS_OK);
+}
+
+GLOBAL LONG
+os_CreateOSISR(char *name, void (*OSISR_entry)(void),
+		int stacksize, int priority,
+		int flags, OS_HANDLE *hisr_handle)
+{
+	OS_HANDLE handle;
+	T_VOID_STRUCT *hisr_stack;
+	OS_INT_STATE old_state, state;
+
+	if (priority < 0 || priority > 2)
+		return(OS_ERROR);
+	priority = 2 - priority;
+	os_DisableInterrupts(&old_state);
+	for (handle = 1; handle <= MaxOSISRs; handle++)
+		if (!strncmp(OSISRTable[handle].name, name,
+				RESOURCE_NAMELEN - 1)) {
+error:			os_SetInterruptState(old_state, &state);
+			return(OS_ERROR);
+		}
+	for (handle = 1; handle <= MaxOSISRs; handle++)
+		if (!OSISRTable[handle].name[0])
+			break;
+	if (handle > MaxOSISRs)
+		goto error;
+	if (os_AllocateMemory(os_MyHandle(), &hisr_stack, stacksize,
+				0xFFFFFFFF, os_int_pool_handle) == OS_ERROR)
+		goto error;
+	memset((u_char *)hisr_stack, INITIAL_STACK_VALUE, stacksize);
+	*hisr_stack = GUARD_PATTERN;
+	if (NU_Create_HISR(&OSISRTable[handle].hisr_cb, name, OSISR_entry,
+				priority, (VOID *)hisr_stack, stacksize)
+			!= NU_SUCCESS)
+		goto error;
+	strncpy(OSISRTable[handle].name, name, RESOURCE_NAMELEN);
+	OSISRTable[handle].name[RESOURCE_NAMELEN-1] = 0;
+	OSISRTable[handle].stack = hisr_stack;
+	*hisr_handle = handle;
+	os_SetInterruptState(old_state, &state);
+	return(OS_OK);
+}
+
+GLOBAL LONG
+os_ActivateOSISR(OS_HANDLE hisr_handle)
+{
+	if (hisr_handle <= 0 || hisr_handle > MaxOSISRs)
+		return(OS_ERROR);
+	if (NU_Activate_HISR(&OSISRTable[hisr_handle].hisr_cb) == NU_SUCCESS)
+		return(OS_OK);
+	else
+		return(OS_ERROR);
+}