2 Copyright © 2010-2011, The AROS Development Team. All rights reserved.
5 Desc: Common memory utility functions
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 /* If the end is less than (1 << 31), MEMF_31BIT is implied */
27 if (((IPTR
)start
+size
) < (1UL << 31))
32 mh
->mh_Node
.ln_Succ
= NULL
;
33 mh
->mh_Node
.ln_Pred
= NULL
;
34 mh
->mh_Node
.ln_Type
= NT_MEMORY
;
35 mh
->mh_Node
.ln_Name
= (STRPTR
)name
;
36 mh
->mh_Node
.ln_Pri
= pri
;
37 mh
->mh_Attributes
= flags
;
38 /* The first MemChunk needs to be aligned. We do it by adding MEMHEADER_TOTAL. */
39 mh
->mh_First
= start
+ MEMHEADER_TOTAL
;
40 mh
->mh_First
->mc_Next
= NULL
;
41 mh
->mh_First
->mc_Bytes
= size
- MEMHEADER_TOTAL
;
44 * mh_Lower and mh_Upper are informational only. Since our MemHeader resides
45 * inside the region it describes, the region includes MemHeader.
48 mh
->mh_Upper
= start
+ size
;
49 mh
->mh_Free
= mh
->mh_First
->mc_Bytes
;
53 * Create informational MemHeader for ROM region.
54 * The header will be allocated from system's public memory lists.
55 * It will be not possible to allocate memory from the created MemHeader.
56 * The header will be added to the memory list.
57 * This routine uses exec.library/Allocate() for memory allocation, so it is safe
58 * to use before exec.library and kernel.resource memory management is initialized.
60 struct MemHeader
*krnCreateROMHeader(CONST_STRPTR name
, APTR start
, APTR end
)
62 struct MemHeader
*mh
= AllocMem(sizeof(struct MemHeader
), MEMF_ANY
);
66 mh
->mh_Node
.ln_Type
= NT_MEMORY
;
67 mh
->mh_Node
.ln_Name
= (STRPTR
)name
;
68 mh
->mh_Node
.ln_Pri
= -128;
69 mh
->mh_Attributes
= MEMF_KICK
;
72 mh
->mh_Upper
= end
+ 1; /* end is the last valid address of the region */
73 mh
->mh_Free
= 0; /* Never allocate from this chunk! */
74 Enqueue(&SysBase
->MemList
, &mh
->mh_Node
);