diff src/gpf/frame/cust_os/osx.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/frame/cust_os/osx.c	Fri Oct 16 06:23:26 2020 +0000
@@ -0,0 +1,225 @@
+/*
+ * This C module is a reconstruction based on the disassembly of
+ * osx.obj in osx_na7_db.lib from the Leonardo package.
+ */
+
+/* reconstructed set of included headers from COFF symtab: */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "typedefs.h"
+#include "vsi.h"
+#include "cust_os.h"
+
+int osx_config = 2;
+int _caller;
+T_OSX_REGISTER _osx_registry[MAX_OSX_QUEUE];
+
+void
+int_osx_send_sig(int caller, unsigned long opc, void *signal_ptr,
+		 int queue_handle)
+{
+	T_QMSG Message;
+	int status;
+
+	TRACE_ASSERT(queue_handle != 0);
+	Message.MsgType = MSG_SIGNAL;
+	Message.Msg.Signal.SigOPC = opc;
+	Message.Msg.Signal.SigBuffer = signal_ptr;
+	Message.Msg.Signal.SigLen = sizeof(xSignalHeaderRec);
+	status = vsi_c_send(caller, queue_handle, &Message FILE_LINE_MACRO);
+	TRACE_ASSERT(status == VSI_OK);
+}
+
+void
+osx_send_sig(unsigned long opc, void *signal_ptr, T_ENUM_OS_QUEUE queue_type)
+{
+	int caller, queue_handle;
+
+	caller = _osx_registry[queue_type].caller;
+	queue_handle = _osx_registry[queue_type].queue_handle;
+	TRACE_ASSERT(queue_handle != 0);
+	int_osx_send_sig(caller, opc, signal_ptr, queue_handle);
+}
+
+void
+int_osx_free_prim(int caller, xSignalHeaderRec *prim_ptr)
+{
+	vsi_c_free(caller, (T_VOID_STRUCT **) &prim_ptr FILE_LINE_MACRO);
+}
+
+void
+int_osx_send_prim(int caller, xSignalHeaderRec *prim_ptr, int queue_handle)
+{
+	T_QMSG Message;
+	int status;
+
+	if (osx_config & 1 && prim_ptr->SignalCode == 0x7D) {
+		vsi_c_free(caller, (T_VOID_STRUCT **) &prim_ptr
+				FILE_LINE_MACRO);
+		return;
+	}
+	TRACE_ASSERT(queue_handle != 0);
+	Message.MsgType = MSG_PRIMITIVE;
+	Message.Msg.Primitive.Prim = (T_VOID_STRUCT *) prim_ptr;
+	Message.Msg.Primitive.PrimLen = sizeof(xSignalHeaderRec);
+	status = vsi_c_send(caller, queue_handle, &Message FILE_LINE_MACRO);
+	TRACE_ASSERT(status == VSI_OK);
+}
+
+void
+osx_send_prim(xSignalHeaderRec *prim_ptr, T_ENUM_OS_QUEUE queue_type)
+{
+	int_osx_send_prim(_osx_registry[queue_type].caller, prim_ptr,
+			  _osx_registry[queue_type].queue_handle);
+}
+
+xSignalHeaderRec *
+int_osx_receive_prim(int caller, int queue_handle)
+{
+	T_QMSG Message;
+	unsigned opc;
+	xSignalHeaderRec *message;
+	int status;
+
+	TRACE_ASSERT(queue_handle != OSX_ERROR);
+	for (;;) {
+		status = vsi_c_await(caller, queue_handle, &Message,
+					0xFFFFFFFF);
+		TRACE_ASSERT(status == VSI_OK);
+		/*
+		 * Disassembly reveals that the original code expects
+		 * the received message to be a primitive, rather than
+		 * a signal or a timeout.  If one of the latter comes
+		 * in, the original code would go haywire.  Hence the
+		 * following TRACE_ASSERT is a FreeCalypso addition.
+		 */
+		TRACE_ASSERT(Message.MsgType == MSG_PRIMITIVE);
+		message = (xSignalHeaderRec *) Message.Msg.Primitive.Prim;
+		opc = message->SignalCode & 0xFFFF;
+		if (opc == 11 && osx_config & 2)
+			message->SigP = *(DummyStruct **)(message + 1);
+		else
+			message->SigP = (DummyStruct *)(message + 1);
+		if (opc != 0x8000)
+			return(message);
+		vsi_c_primitive(caller, message);
+	}
+}
+
+xSignalHeaderRec *
+osx_receive_prim(T_ENUM_OS_QUEUE queue_type)
+{
+	return int_osx_receive_prim(_osx_registry[queue_type].caller,
+				    _osx_registry[queue_type].queue_handle);
+}
+
+void
+osx_free_prim(xSignalHeaderRec *prim_ptr)
+{
+	vsi_c_free(_caller, (T_VOID_STRUCT **) &prim_ptr FILE_LINE_MACRO);
+}
+
+void
+int_osx_free_mem(int caller, void *mem_ptr)
+{
+	int status;
+
+	TRACE_ASSERT(mem_ptr != 0);
+	status = D_FREE(mem_ptr);
+	TRACE_ASSERT(status == VSI_OK);
+}
+
+void
+osx_free_mem(void *mem_ptr)
+{
+	int_osx_free_mem(_caller, mem_ptr);
+}
+
+xSignalHeaderRec *
+int_osx_alloc_prim(int caller, unsigned long len, int pool_group_handle)
+{
+	xSignalHeaderRec *prim_ptr;
+
+	prim_ptr = (xSignalHeaderRec *) vsi_c_new(caller,
+			(len & 0xFFFF) + sizeof(xSignalHeaderRec), 0
+			FILE_LINE_MACRO);
+	/* This check is a FreeCalypso addition */
+	TRACE_ASSERT(prim_ptr != 0);
+	prim_ptr->SigP = (DummyStruct *)(prim_ptr + 1);
+	return(prim_ptr);
+}
+
+xSignalHeaderRec *
+osx_alloc_prim(unsigned long len)
+{
+	xSignalHeaderRec *prim_ptr;
+
+	prim_ptr = (xSignalHeaderRec *) vsi_c_new(_caller,
+			(len & 0xFFFF) + sizeof(xSignalHeaderRec), 0
+			FILE_LINE_MACRO);
+	/* This check is a FreeCalypso addition */
+	TRACE_ASSERT(prim_ptr != 0);
+	prim_ptr->SigP = (DummyStruct *)(prim_ptr + 1);
+	return(prim_ptr);
+}
+
+void *
+int_osx_alloc_mem(int caller, unsigned long len)
+{
+	void *mem_ptr;
+
+	DMALLOC(mem_ptr, len);
+	TRACE_ASSERT(mem_ptr != 0);
+	return(mem_ptr);
+}
+
+void *
+osx_alloc_mem(unsigned long len)
+{
+	return int_osx_alloc_mem(_caller, len);
+}
+
+int
+_osx_open(int caller, unsigned short queue_type, int queue_handle)
+{
+	if (!queue_type && !queue_handle) {
+		_caller = caller;
+		return(OSX_ERROR);
+	}
+	if (queue_type >= MAX_OSX_QUEUE)
+		return(OSX_ERROR);
+	if (_osx_registry[queue_type].queue_handle != queue_handle &&
+	    _osx_registry[queue_type].queue_handle != -1)
+		return(OSX_ERROR);
+	_osx_registry[queue_type].queue_handle = queue_handle;
+	_osx_registry[queue_type].caller = caller;
+	return(OSX_OK);
+}
+
+void
+_osx_init(void)
+{
+	USHORT i;
+
+	for (i = 0; i < MAX_OSX_QUEUE; i++)
+		_osx_registry[i].queue_handle = -1;
+}
+
+int
+_osx_config(const char *config)
+{
+	if (!strcmp(config, L1S_TRACE_DISABLE)) {
+		osx_config |= 1;
+		return(OSX_OK);
+	}
+	if (!strcmp(config, L1S_TRACE_ENABLE)) {
+		osx_config &= ~1;
+		return(OSX_OK);
+	}
+	if (!strcmp(config, NO_SPECIAL_MPHC_RXLEV_REQ)) {
+		osx_config &= ~2;
+		return(OSX_OK);
+	}
+	return(OSX_ERROR);
+}