OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / memory.c
1 \r
2 #include "core.h"\r
3 \r
4 IO_MemoryControl sys_mem_ctrl;\r
5 uint sys_mem_size;\r
6 \r
7 uint Memory_Test(uint start, uint end)\r
8 {\r
9         uchar flg486 = 0;\r
10         uint eflg, cr0, i;\r
11 \r
12         eflg = IO_Load_EFlags();\r
13         eflg |= EFLAGS_AC_BIT;\r
14         IO_Store_EFlags(eflg);\r
15 \r
16         eflg = IO_Load_EFlags();\r
17         if((eflg & EFLAGS_AC_BIT) != 0){\r
18                 flg486 = 1;\r
19         }\r
20         eflg &= ~EFLAGS_AC_BIT;\r
21         IO_Store_EFlags(eflg);\r
22 \r
23         if(flg486 != 0){\r
24                 cr0 = Load_CR0();\r
25                 cr0 |= CR0_ALL_CACHE_DISABLE;\r
26                 Store_CR0(cr0);\r
27         }\r
28         i = Memory_Test_Sub(start, end);\r
29         if(flg486 != 0){\r
30                 cr0 = Load_CR0();\r
31                 cr0 &= ~CR0_ALL_CACHE_DISABLE;\r
32                 Store_CR0(cr0);         \r
33         }\r
34         return i;\r
35 }\r
36 \r
37 void MemoryControl_Initialise(IO_MemoryControl *ctrl, void *start, uint size)\r
38 {\r
39         ctrl->start = start;\r
40         ctrl->size = size;\r
41         ctrl->next = start;\r
42         ((IO_MemoryControlTag *)ctrl->next)->size = ctrl->size;\r
43         ((IO_MemoryControlTag *)ctrl->next)->next = 0;\r
44         return;\r
45 }\r
46 \r
47 uint MemoryControl_FreeSize(IO_MemoryControl *ctrl)\r
48 {\r
49         void *tag;\r
50         uint size;\r
51 \r
52         size = 0;\r
53         tag = ctrl->next;\r
54 \r
55         for(;;){\r
56                 size += ((IO_MemoryControlTag *)tag)->size;\r
57                 if(((IO_MemoryControlTag *)tag)->next == 0){\r
58                         break;\r
59                 }\r
60                 tag = ((IO_MemoryControlTag *)tag)->next;\r
61         }\r
62         return size;\r
63 }\r
64 \r
65 void *MemoryControl_Allocate(IO_MemoryControl *ctrl, uint size)\r
66 {\r
67         void **before;\r
68 \r
69         size = (size + 7) & ~7;\r
70 \r
71         before = &ctrl->next;\r
72         for(;;){\r
73                 if((((IO_MemoryControlTag *)*before)->size - 8) > size){\r
74                         break;\r
75                 }\r
76                 if(((IO_MemoryControlTag *)*before)->next == 0){\r
77                         return 0;\r
78                 }\r
79                 before = &((IO_MemoryControlTag *)*before)->next;\r
80         }\r
81         ((IO_MemoryControlTag *)(*before + size))->size = ((IO_MemoryControlTag *)*before)->size - size;\r
82         ((IO_MemoryControlTag *)(*before + size))->next = ((IO_MemoryControlTag *)*before)->next;\r
83         *before = *before + size;\r
84 \r
85         return *before - size;\r
86 }\r
87 \r
88 int MemoryControl_Free(IO_MemoryControl *ctrl, void *addr0, uint size)\r
89 {\r
90         void **before;\r
91 \r
92         size = (size + 7) & ~7;\r
93 \r
94         before = &ctrl->next;\r
95         for(; before != 0;){\r
96                 if((uint)((IO_MemoryControlTag *)*before) == (uint)(addr0 + size)){             //\89ð\95ú\82µ\82½\82¢\83\81\83\82\83\8a\82Ì\8cã\91±\82É\8bó\82«\82ª\82 \82é\8fê\8d\87\81B\r
97                         ((IO_MemoryControlTag *)addr0)->size = ((IO_MemoryControlTag *)(*before))->size + size;\r
98                         ((IO_MemoryControlTag *)addr0)->next = ((IO_MemoryControlTag *)(*before))->next;\r
99                         *before = addr0;\r
100                         return 0;\r
101                 }\r
102                 if((uint)((IO_MemoryControlTag *)*before)->next >= (uint)(addr0 + size)){\r
103                         Send_SerialPort("Have to Free!1 or 2\r\n");\r
104                         return -1;\r
105                 }\r
106                 if(((IO_MemoryControlTag *)*before)->next == 0){\r
107                         Send_SerialPort("Have to Free!0\r\n");\r
108                         return -1;\r
109                 }\r
110                 before = ((IO_MemoryControlTag *)*before)->next;\r
111         }\r
112         return -1;\r
113 }\r
114 \r
115 void *MemoryControl_Allocate_Page(IO_MemoryControl *ctrl)\r
116 {\r
117         void *addr, *mem_head_4k, *offset;\r
118 \r
119         addr = MemoryControl_Allocate(ctrl, 0x2000);\r
120         if(addr == 0) return 0;\r
121         mem_head_4k = (void *)(((uint)addr + 0xfff) & 0xfffff000);\r
122         (uint)offset = (uint)mem_head_4k - (uint)addr;\r
123         if (offset > 0) {\r
124                 MemoryControl_Free(ctrl, addr, (uint)offset);\r
125         }\r
126         MemoryControl_Free(ctrl, mem_head_4k + 0x1000, 0x1000 - (uint)offset);\r
127 \r
128         return mem_head_4k;\r
129 }\r
130 \r
131 void MemoryControl_Output_Info(IO_MemoryControl *ctrl)\r
132 {\r
133         void *tag;\r
134 \r
135         debug("Memory Free Info.\n");\r
136         tag = ctrl->next;\r
137         for(;;){\r
138                 debug("Addr:0x%08X Size:0x%08X\n", (uint)tag, ((IO_MemoryControlTag *)tag)->size);\r
139                 if(((IO_MemoryControlTag *)tag)->next == 0){\r
140                         break;\r
141                 }\r
142                 tag = ((IO_MemoryControlTag *)tag)->next;\r
143         }\r
144         return;\r
145 }\r
146 \r
147 void System_MemoryControl_Initialise(void)\r
148 {\r
149         sys_mem_size = Memory_Test(0x00400000, 0xbfffffff) & 0xFFFFF000;\r
150         MemoryControl_Initialise(&sys_mem_ctrl, (void *)0x00400000, sys_mem_size - 0x00400000);\r
151         return;\r
152 }\r
153 \r
154 uint System_MemoryControl_FullSize(void)\r
155 {\r
156         return sys_mem_size;\r
157 }\r
158 \r
159 uint System_MemoryControl_FreeSize(void)\r
160 {\r
161         return MemoryControl_FreeSize(&sys_mem_ctrl);\r
162 }\r
163 \r
164 void *System_MemoryControl_Allocate(uint size)\r
165 {\r
166         void *addr;\r
167         uint *retaddr;\r
168 \r
169         retaddr = &size;\r
170 \r
171         addr = MemoryControl_Allocate(&sys_mem_ctrl, size);\r
172 \r
173         debug("[0x%08X]Memory Allocate Request.[0x%08X](%dByte)\n", *(retaddr - 1), addr, size);\r
174 \r
175         return addr;\r
176 }\r
177 \r
178 int System_MemoryControl_Free(void *addr0, uint size)\r
179 {\r
180         return MemoryControl_Free(&sys_mem_ctrl, addr0, size);\r
181 }\r
182 \r
183 void *System_MemoryControl_Allocate_Page(void)\r
184 {\r
185         return MemoryControl_Allocate_Page(&sys_mem_ctrl);\r
186 }\r
187 \r
188 void System_MemoryControl_Output_Info(void)\r
189 {\r
190         MemoryControl_Output_Info(&sys_mem_ctrl);\r
191         return;\r
192 }\r