diff src/gpf/osl/os_mem_ir.c @ 6:8b2a9a374324

src/gpf: addition of Magnetite src/gpf2
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 08:15:49 +0000
parents
children 82ae724ca0d7
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gpf/osl/os_mem_ir.c	Sun Jul 15 08:15:49 2018 +0000
@@ -0,0 +1,106 @@
+/*
+ * This C module is a reconstruction based on the disassembly of
+ * os_mem.obj in frame_na7_db_ir.lib from the Leonardo package.
+ */
+
+/* set of included headers from COFF symtab: */
+#include <stdio.h>
+#include <string.h>
+#include "nucleus.h"
+#include "typedefs.h"
+#include "os.h"
+#include "gdi.h"
+#include "os_types.h"
+#include "os_glob.h"
+
+extern T_OS_PART_GRP_TABLE_ENTRY PartGrpTable[];
+extern T_OS_POOL_BORDER PoolBorder[];
+
+GLOBAL LONG
+os_is_valid_partition(T_VOID_STRUCT *Buffer)
+{
+	int i;
+
+	for (i = 0; i <= MaxPoolGroups; i++) {
+		if (PoolBorder[i].End == 0)
+			return(OS_ERROR);
+		if ((char *)Buffer < PoolBorder[i].Start)
+			continue;
+		if ((char *)Buffer >= PoolBorder[i].End)
+			continue;
+		return(OS_OK);
+	}
+	return(OS_ERROR);
+}
+
+GLOBAL LONG
+os_PartitionCheck(ULONG *ptr)
+{
+	PM_HEADER *phdr;
+	PM_PCB *pool;
+
+	phdr = (PM_HEADER *)(ptr - 2);
+	if (phdr->pm_next_available)
+		return(OS_PARTITION_FREE);
+	pool = phdr->pm_partition_pool;
+	if (ptr[(pool->pm_partition_size - 4) >> 2] == GUARD_PATTERN)
+		return(OS_OK);
+	else
+		return(OS_PARTITION_GUARD_PATTERN_DESTROYED);
+}
+
+GLOBAL LONG
+os_DeallocatePartition(OS_HANDLE TaskHandle, T_VOID_STRUCT *Buffer)
+{
+	if (os_is_valid_partition(Buffer) != OS_OK)
+		return(OS_ERROR);
+	if (NU_Deallocate_Partition(Buffer) != NU_SUCCESS)
+		return(OS_ERROR);
+	return(OS_OK);
+}
+
+GLOBAL LONG
+os_AllocatePartition(OS_HANDLE TaskHandle, T_VOID_STRUCT **Buffer, ULONG Size,
+		     ULONG Suspend, OS_HANDLE GroupHandle)
+{
+	T_OS_PART_POOL *pool, *requested_pool;
+	ULONG nu_suspend;
+	STATUS sts;
+	int ret;
+
+	for (pool = PartGrpTable[GroupHandle].grp_head; pool;
+	     pool = pool->next)
+		if (Size <= pool->size)
+			break;
+	if (!pool)
+		return(OS_ERROR);
+	requested_pool = pool;
+	ret = OS_OK;
+	nu_suspend = NU_NO_SUSPEND;
+try_alloc:
+	sts = NU_Allocate_Partition(&pool->pcb, (VOID **) Buffer, nu_suspend);
+	switch (sts) {
+	case NU_SUCCESS:
+		return(ret);
+	case NU_TIMEOUT:
+	case NU_INVALID_SUSPEND:
+		*Buffer = 0;
+		return(OS_TIMEOUT);
+	case NU_NO_PARTITION:
+		pool = pool->next;
+		if (pool) {
+			ret = OS_ALLOCATED_BIGGER;
+			goto try_alloc;
+		}
+		pool = requested_pool;
+		if (Suspend) {
+			nu_suspend = Suspend;
+			ret = OS_WAITED;
+			goto try_alloc;
+		}
+		return(OS_TIMEOUT);
+	default:
+		*Buffer = 0;
+		return(OS_ERROR);
+	}
+}