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 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.
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
));
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
;
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
);