Port the SB128 code to AROS.
[AROS.git] / rom / kernel / kernel_memory.c
blob2bd3494c9aed1f18a4d402cb1cf67d9e7c5dd813
1 /*
2 Copyright © 2010-2011, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Common memory utility functions
6 Lang: english
7 */
9 #include <aros/debug.h>
10 #include <exec/execbase.h>
11 #include <exec/memory.h>
12 #include <proto/exec.h>
14 #include <kernel_base.h>
17 * Create MemHeader structure for the specified RAM region.
18 * The header will be placed in the beginning of the region itself.
19 * The header will NOT be added to the memory list!
21 void krnCreateMemHeader(CONST_STRPTR name, BYTE pri, APTR start, IPTR size, ULONG flags)
23 /* The MemHeader itself does not have to be aligned */
24 struct MemHeader *mh = start;
26 mh->mh_Node.ln_Succ = NULL;
27 mh->mh_Node.ln_Pred = NULL;
28 mh->mh_Node.ln_Type = NT_MEMORY;
29 mh->mh_Node.ln_Name = (STRPTR)name;
30 mh->mh_Node.ln_Pri = pri;
31 mh->mh_Attributes = flags;
32 /* The first MemChunk needs to be aligned. We do it by adding MEMHEADER_TOTAL. */
33 mh->mh_First = start + MEMHEADER_TOTAL;
34 mh->mh_First->mc_Next = NULL;
35 mh->mh_First->mc_Bytes = size - MEMHEADER_TOTAL;
38 * mh_Lower and mh_Upper are informational only. Since our MemHeader resides
39 * inside the region it describes, the region includes MemHeader.
41 mh->mh_Lower = start;
42 mh->mh_Upper = start + size;
43 mh->mh_Free = mh->mh_First->mc_Bytes;
47 * Create informational MemHeader for ROM region.
48 * The header will be allocated inside another region, specified by 'ram' parameter.
49 * It will be not possible to allocate memory from the created MemHeader.
50 * The header will be added to the memory list.
51 * This routine uses exec.library/Allocate() for memory allocation, so it is safe
52 * to use before exec.library and kernel.resource memory management is initialized.
54 struct MemHeader *krnCreateROMHeader(struct MemHeader *ram, CONST_STRPTR name, APTR start, APTR end)
56 struct MemHeader *mh = Allocate(ram, sizeof(struct MemHeader));
58 if (mh)
60 mh->mh_Node.ln_Type = NT_MEMORY;
61 mh->mh_Node.ln_Name = (STRPTR)name;
62 mh->mh_Node.ln_Pri = -128;
63 mh->mh_Attributes = MEMF_KICK;
64 mh->mh_First = NULL;
65 mh->mh_Lower = start;
66 mh->mh_Upper = end + 1; /* end is the last valid address of the region */
67 mh->mh_Free = 0; /* Never allocate from this chunk! */
68 Enqueue(&SysBase->MemList, &mh->mh_Node);
71 return mh;