2 #include <exec/types.h>
3 #include <exec/nodes.h>
4 #include <exec/memory.h>
5 #include <exec/resident.h>
6 #include <exec/libraries.h>
7 #include <exec/execbase.h>
8 #include <proto/exec.h>
12 #include <aros/debug.h>
14 #include "pp_exec_internal.h"
16 #define MEM_START 0x400
20 * Detect memory in step sizes of 1kb. Keep it that way...
24 UBYTE
* check_memory(UBYTE
* address
)
27 *(ULONG
*)ADDRESS_ERROR_MARKER_ADDRESS
= 0;
29 *(UBYTE
*)address
= 0xcc;
30 if (0xcc != *(UBYTE
*)address
) {
33 if (0 == *(ULONG
*)ADDRESS_ERROR_MARKER_ADDRESS
) {
48 * Detect some initial memory. This should be enough
49 * to get the OS up and running. More detection follows
52 struct MemHeader
* detect_memory(void)
54 struct MemHeader
* mh
;
56 * There is no SysBase available here!!
57 * It has not been initialized, yet.
61 * Must initialize the BusError handler
63 UBYTE
* address
= (UBYTE
*)1024;
65 *(ULONG
*)(2*4) = (ULONG
)dm_bus_error_handler
;
66 *(ULONG
*)(3*4) = (ULONG
)dm_addr_error_handler
;
68 address
= check_memory(address
);
70 mh
=(struct MemHeader
*)MEM_START
;
71 mh
->mh_Node
.ln_Succ
= NULL
;
72 mh
->mh_Node
.ln_Pred
= NULL
;
73 mh
->mh_Node
.ln_Type
= NT_MEMORY
;
74 mh
->mh_Node
.ln_Name
= "chip memory";
75 mh
->mh_Node
.ln_Pri
= -5;
76 mh
->mh_Attributes
= MEMF_CHIP
| MEMF_PUBLIC
| MEMF_LOCAL
| MEMF_24BITDMA
|
78 mh
->mh_First
= (struct MemChunk
*)((UBYTE
*)mh
+MEMHEADER_TOTAL
);
79 mh
->mh_First
->mc_Next
= NULL
;
80 mh
->mh_First
->mc_Bytes
= ((ULONG
)address
- MEM_START
) - MEMHEADER_TOTAL
;
82 mh
->mh_Lower
= mh
->mh_First
;
83 mh
->mh_Upper
= (APTR
)(address
);
84 mh
->mh_Free
= mh
->mh_First
->mc_Bytes
;
90 * The locations where memory can be.
91 * Beware: Whatever is at 0x0 is also at 0x10000000 for 1MB.
92 * So I am trying to avoid detecting this part again
93 * and start later in memory.
101 static struct memories memory
[] = {{(UBYTE
*)0x10100000,-10},
102 {(UBYTE
*)0xf0000000,-10},
106 * Detect the rest of the memory available on this device.
108 void detect_memory_rest(struct ExecBase
* SysBase
)
111 *(ULONG
*)(2*4) = (ULONG
)dm_bus_error_handler
;
112 *(ULONG
*)(3*4) = (ULONG
)dm_addr_error_handler
;
114 while (0 != memory
[c
].start
) {
117 * Now try to detect sram size
119 end
= check_memory(memory
[c
].start
);
120 if (end
!= memory
->start
[c
] && NULL
!= end
) {
121 AddMemList((ULONG
)end
-(ULONG
)memory
[c
].start
,
122 MEMF_CHIP
| MEMF_PUBLIC
| MEMF_LOCAL
| MEMF_24BITDMA
| MEMF_KICK
,