e32boot.cpp revision 1.3.10.2 1 1.3.10.2 yamt /* $NetBSD: e32boot.cpp,v 1.3.10.2 2014/05/22 11:39:39 yamt Exp $ */
2 1.3.10.2 yamt /*
3 1.3.10.2 yamt * Copyright (c) 2012, 2013 KIYOHARA Takashi
4 1.3.10.2 yamt * All rights reserved.
5 1.3.10.2 yamt *
6 1.3.10.2 yamt * Redistribution and use in source and binary forms, with or without
7 1.3.10.2 yamt * modification, are permitted provided that the following conditions
8 1.3.10.2 yamt * are met:
9 1.3.10.2 yamt * 1. Redistributions of source code must retain the above copyright
10 1.3.10.2 yamt * notice, this list of conditions and the following disclaimer.
11 1.3.10.2 yamt * 2. Redistributions in binary form must reproduce the above copyright
12 1.3.10.2 yamt * notice, this list of conditions and the following disclaimer in the
13 1.3.10.2 yamt * documentation and/or other materials provided with the distribution.
14 1.3.10.2 yamt *
15 1.3.10.2 yamt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 1.3.10.2 yamt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 1.3.10.2 yamt * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 1.3.10.2 yamt * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
19 1.3.10.2 yamt * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 1.3.10.2 yamt * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 1.3.10.2 yamt * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 1.3.10.2 yamt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23 1.3.10.2 yamt * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24 1.3.10.2 yamt * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 1.3.10.2 yamt * POSSIBILITY OF SUCH DAMAGE.
26 1.3.10.2 yamt */
27 1.3.10.2 yamt
28 1.3.10.2 yamt #include <e32base.h>
29 1.3.10.2 yamt #include <e32cons.h>
30 1.3.10.2 yamt #include <e32def.h>
31 1.3.10.2 yamt #include <e32hal.h>
32 1.3.10.2 yamt #include <e32svr.h> /* XXXXX */
33 1.3.10.2 yamt #include <w32std.h>
34 1.3.10.2 yamt
35 1.3.10.2 yamt #include "e32boot.h"
36 1.3.10.2 yamt #include "netbsd.h"
37 1.3.10.2 yamt #include "../../../include/bootinfo.h"
38 1.3.10.2 yamt
39 1.3.10.2 yamt CConsoleBase *console;
40 1.3.10.2 yamt LOCAL_C NetBSD *LoadNetBSDL(void);
41 1.3.10.2 yamt LOCAL_C struct btinfo_common *CreateBootInfo(TAny *);
42 1.3.10.2 yamt LOCAL_C struct btinfo_common *FindBootInfoL(struct btinfo_common *, int);
43 1.3.10.2 yamt TUint SummaryBootInfoMemory(struct btinfo_common *);
44 1.3.10.2 yamt LOCAL_C void E32BootL(void);
45 1.3.10.2 yamt
46 1.3.10.2 yamt struct memmap {
47 1.3.10.2 yamt TUint address;
48 1.3.10.2 yamt TUint size; /* KB */
49 1.3.10.2 yamt };
50 1.3.10.2 yamt struct memmap series5_4m[] = {{ 0xc0000000, 512 }, { 0xc0100000, 512 },
51 1.3.10.2 yamt { 0xc0400000, 512 }, { 0xc0500000, 512 },
52 1.3.10.2 yamt { 0xc1000000, 512 }, { 0xc1100000, 512 },
53 1.3.10.2 yamt { 0xc1400000, 512 }, { 0xc1500000, 512 }};
54 1.3.10.2 yamt struct memmap series5_8m[] = {{ 0xc0000000, 512 }, { 0xc0100000, 512 },
55 1.3.10.2 yamt { 0xc0400000, 512 }, { 0xc0500000, 512 },
56 1.3.10.2 yamt { 0xc1000000, 512 }, { 0xc1100000, 512 },
57 1.3.10.2 yamt { 0xc1400000, 512 }, { 0xc1500000, 512 },
58 1.3.10.2 yamt { 0xd0000000, 512 }, { 0xd0100000, 512 },
59 1.3.10.2 yamt { 0xd0400000, 512 }, { 0xd0500000, 512 },
60 1.3.10.2 yamt { 0xd1000000, 512 }, { 0xd1100000, 512 },
61 1.3.10.2 yamt { 0xd1400000, 512 }, { 0xd1500000, 512 }};
62 1.3.10.2 yamt struct memmap revo[] = {{ 0xc0000000, 4096 }, { 0xc0800000, 4096 }};
63 1.3.10.2 yamt struct memmap revopuls[] = {{ 0xc0000000, 4096 }, { 0xc0800000, 4096 },
64 1.3.10.2 yamt { 0xd0000000, 4096 }, { 0xd0800000, 4096 }};
65 1.3.10.2 yamt struct memmap series5mx_16m[] = {{ 0xc0000000, 8192 }, { 0xc1000000, 8192 }};
66 1.3.10.2 yamt struct memmap series5mxpro_24m[] = {{ 0xc0000000, 8192 }, { 0xc1000000, 8192 },
67 1.3.10.2 yamt { 0xd0000000, 4096 }, { 0xd0800000, 4096 }};
68 1.3.10.2 yamt struct memmap series5mxpro_32m[] = {{ 0xc0000000, 8192 }, { 0xc1000000, 8192 },
69 1.3.10.2 yamt { 0xd0000000, 8192 }, { 0xd1000000, 8192 }};
70 1.3.10.2 yamt struct memmap series7_16m[] = {{ 0xc0000000, 16384 }};
71 1.3.10.2 yamt struct memmap series7_32m[] = {{ 0xc0000000, 16384 }, { 0xc8000000, 16384 }};
72 1.3.10.2 yamt
73 1.3.10.2 yamt struct {
74 1.3.10.2 yamt char *model;
75 1.3.10.2 yamt TInt width;
76 1.3.10.2 yamt TInt height;
77 1.3.10.2 yamt TUint memsize;
78 1.3.10.2 yamt struct memmap *memmaps;
79 1.3.10.2 yamt } memmaps[] = {
80 1.3.10.2 yamt { "SERIES5 R1", 640, 240, 4096, series5_4m },
81 1.3.10.2 yamt { "SERIES5 R1", 640, 240, 8192, series5_8m },
82 1.3.10.2 yamt { "SERIES5 R1", 640, 320, 4096, series5_4m }, /* Geofox One */
83 1.3.10.2 yamt { "SERIES5 R1", 640, 320, 8192, series5_8m }, /* Geofox One */
84 1.3.10.2 yamt // { "SERIES5 R1", 640, 320, 16384, one_16m },
85 1.3.10.2 yamt { "SERIES5 R1", 320, 200, 4096, series5_4m }, /* Osaris */
86 1.3.10.2 yamt // { "SERIES5 R1", 320, 200, 16384, osaris_16m },
87 1.3.10.2 yamt { "SERIES5mx", 480, 160, 8192, revo },
88 1.3.10.2 yamt { "SERIES5mx", 480, 160, 16384, revopuls },
89 1.3.10.2 yamt { "SERIES5mx", 640, 240, 16384, series5mx_16m },
90 1.3.10.2 yamt { "SERIES5mx", 640, 240, 24576, series5mxpro_24m },
91 1.3.10.2 yamt { "SERIES5mx", 640, 240, 32768, series5mxpro_32m },
92 1.3.10.2 yamt { "SERIES7", 800, 600, 16384, series7_16m },
93 1.3.10.2 yamt { "SERIES7", 800, 600, 32768, series7_32m },
94 1.3.10.2 yamt };
95 1.3.10.2 yamt
96 1.3.10.2 yamt class E32BootLogicalChannel : public RLogicalChannel {
97 1.3.10.2 yamt public:
98 1.3.10.2 yamt TInt DoCreate(const TDesC *aChan, TInt aUnit, const TDesC *aDriver,
99 1.3.10.2 yamt const TDesC8 *anInfo)
100 1.3.10.2 yamt {
101 1.3.10.2 yamt
102 1.3.10.2 yamt return RLogicalChannel::DoCreate(E32BootName, TVersion(0, 0, 0),
103 1.3.10.2 yamt aChan, aUnit, aDriver, anInfo);
104 1.3.10.2 yamt }
105 1.3.10.2 yamt
106 1.3.10.2 yamt TInt DoControl(TInt aFunction, TAny *a1)
107 1.3.10.2 yamt {
108 1.3.10.2 yamt
109 1.3.10.2 yamt return RLogicalChannel::DoControl(aFunction, a1);
110 1.3.10.2 yamt }
111 1.3.10.2 yamt
112 1.3.10.2 yamt TInt DoControl(TInt aFunction, TAny *a1, TAny *a2)
113 1.3.10.2 yamt {
114 1.3.10.2 yamt
115 1.3.10.2 yamt return RLogicalChannel::DoControl(aFunction, a1, a2);
116 1.3.10.2 yamt }
117 1.3.10.2 yamt };
118 1.3.10.2 yamt
119 1.3.10.2 yamt
120 1.3.10.2 yamt LOCAL_C void
121 1.3.10.2 yamt E32BootL(void)
122 1.3.10.2 yamt {
123 1.3.10.2 yamt E32BootLogicalChannel *E32BootChannel = new E32BootLogicalChannel;
124 1.3.10.2 yamt NetBSD *netbsd = NULL;
125 1.3.10.2 yamt TScreenInfoV01 screenInfo;
126 1.3.10.2 yamt TPckg<TScreenInfoV01> sI(screenInfo);
127 1.3.10.2 yamt TBuf<32> ldd;
128 1.3.10.2 yamt TInt err;
129 1.3.10.2 yamt TUint membytes;
130 1.3.10.2 yamt TAny *buf, *safeAddress;
131 1.3.10.2 yamt struct btinfo_common *bootinfo;
132 1.3.10.2 yamt struct btinfo_model *model;
133 1.3.10.2 yamt struct btinfo_video *video;
134 1.3.10.2 yamt struct btinfo_bootargs *bootargs;
135 1.3.10.2 yamt
136 1.3.10.2 yamt console =
137 1.3.10.2 yamt Console::NewL(E32BootName, TSize(KConsFullScreen, KConsFullScreen));
138 1.3.10.2 yamt
139 1.3.10.2 yamt buf = User::AllocL(ALIGN_SAFE_PAGE_SIZE); /* bootinfo buffer */
140 1.3.10.2 yamt
141 1.3.10.2 yamt /* Put banner */
142 1.3.10.2 yamt console->Printf(_L("\n"));
143 1.3.10.2 yamt console->Printf(_L(">> %s, Revision %s\n"),
144 1.3.10.2 yamt bootprog_name, bootprog_rev);
145 1.3.10.2 yamt
146 1.3.10.2 yamt UserSvr::ScreenInfo(sI);
147 1.3.10.2 yamt if (!screenInfo.iScreenAddressValid)
148 1.3.10.2 yamt User::Leave(KErrNotSupported);
149 1.3.10.2 yamt safeAddress = screenInfo.iScreenAddress;
150 1.3.10.2 yamt
151 1.3.10.2 yamt bootinfo = CreateBootInfo((TAny *)PAGE_ALIGN(buf));
152 1.3.10.2 yamt
153 1.3.10.2 yamt model = (struct btinfo_model *)FindBootInfoL(bootinfo, BTINFO_MODEL);
154 1.3.10.2 yamt console->Printf(_L(">> Model %s\n"), model->model);
155 1.3.10.2 yamt
156 1.3.10.2 yamt membytes = SummaryBootInfoMemory(bootinfo);
157 1.3.10.2 yamt console->Printf(_L(">> Memory %d k\n"), membytes / 1024);
158 1.3.10.2 yamt
159 1.3.10.2 yamt video = (struct btinfo_video *)FindBootInfoL(bootinfo, BTINFO_VIDEO);
160 1.3.10.2 yamt console->Printf(_L(">> Video %d x %d\n"), video->width, video->height);
161 1.3.10.2 yamt
162 1.3.10.2 yamt console->Printf(_L("\n"));
163 1.3.10.2 yamt
164 1.3.10.2 yamt bootargs =
165 1.3.10.2 yamt (struct btinfo_bootargs *)FindBootInfoL(bootinfo, BTINFO_BOOTARGS);
166 1.3.10.2 yamt TRAP(err, netbsd = LoadNetBSDL());
167 1.3.10.2 yamt if (err != KErrNone)
168 1.3.10.2 yamt User::Leave(err);
169 1.3.10.2 yamt else if (netbsd == NULL)
170 1.3.10.2 yamt return;
171 1.3.10.2 yamt console->Printf(_L("\nLoaded\n"));
172 1.3.10.2 yamt
173 1.3.10.2 yamt int n, m;
174 1.3.10.2 yamt n = sizeof(bootargs->bootargs);
175 1.3.10.2 yamt m = (*netbsd->GetArgs()).Length();
176 1.3.10.2 yamt if (m > 0)
177 1.3.10.2 yamt Mem::Copy(bootargs->bootargs, &(*netbsd->GetArgs())[0],
178 1.3.10.2 yamt n < m ? n : m);
179 1.3.10.2 yamt bootargs->bootargs[n < m ? n - 1 : m] = '\0';
180 1.3.10.2 yamt
181 1.3.10.2 yamt netbsd->ParseHeader();
182 1.3.10.2 yamt
183 1.3.10.2 yamt /* Load logical device(kernel part of e32boot). */
184 1.3.10.2 yamt if (_L(model->model).CompareF(_L("SERIES5 R1")) == 0)
185 1.3.10.2 yamt ldd = _L("e32boot-s5.ldd");
186 1.3.10.2 yamt else if (_L(model->model).CompareF(_L("SERIES5mx")) == 0)
187 1.3.10.2 yamt ldd = _L("e32boot-s5mx.ldd");
188 1.3.10.2 yamt // else if (_L(model->model).CompareF(_L("SERIES7")) == 0)
189 1.3.10.2 yamt // ldd = _L("e32boot-s7.ldd"); // not yet.
190 1.3.10.2 yamt else {
191 1.3.10.2 yamt console->Printf(_L("Not Supported machine\n"));
192 1.3.10.2 yamt console->Getch();
193 1.3.10.2 yamt User::Leave(KErrNotSupported);
194 1.3.10.2 yamt }
195 1.3.10.2 yamt err = User::LoadLogicalDevice(ldd);
196 1.3.10.2 yamt if (err != KErrNone && err != KErrAlreadyExists) {
197 1.3.10.2 yamt console->Printf(_L("LoadLogicalDevice failed: %d\n"), err);
198 1.3.10.2 yamt console->Getch();
199 1.3.10.2 yamt User::Leave(err);
200 1.3.10.2 yamt }
201 1.3.10.2 yamt /* Create channel to kernel part. */
202 1.3.10.2 yamt err = E32BootChannel->DoCreate(NULL, KNullUnit, NULL, NULL);
203 1.3.10.2 yamt if (err == KErrNone) {
204 1.3.10.2 yamt E32BootChannel->DoControl(KE32BootSetSafeAddress, safeAddress);
205 1.3.10.2 yamt E32BootChannel->DoControl(KE32BootBootNetBSD, netbsd, bootinfo);
206 1.3.10.2 yamt } else {
207 1.3.10.2 yamt console->Printf(_L("DoCreate failed: %d\n"), err);
208 1.3.10.2 yamt console->Getch();
209 1.3.10.2 yamt }
210 1.3.10.2 yamt
211 1.3.10.2 yamt User::FreeLogicalDevice(ldd);
212 1.3.10.2 yamt if (err != KErrNone)
213 1.3.10.2 yamt User::Leave(err);
214 1.3.10.2 yamt }
215 1.3.10.2 yamt
216 1.3.10.2 yamt GLDEF_C TInt E32Main(void) /* main function called by E32 */
217 1.3.10.2 yamt {
218 1.3.10.2 yamt
219 1.3.10.2 yamt __UHEAP_MARK;
220 1.3.10.2 yamt CTrapCleanup *cleanup = CTrapCleanup::New();
221 1.3.10.2 yamt
222 1.3.10.2 yamt TRAPD(error, E32BootL());
223 1.3.10.2 yamt __ASSERT_ALWAYS(!error, User::Panic(E32BootName, error));
224 1.3.10.2 yamt
225 1.3.10.2 yamt delete cleanup;
226 1.3.10.2 yamt __UHEAP_MARKEND;
227 1.3.10.2 yamt return 0;
228 1.3.10.2 yamt }
229 1.3.10.2 yamt
230 1.3.10.2 yamt LOCAL_C NetBSD *
231 1.3.10.2 yamt LoadNetBSDL(void)
232 1.3.10.2 yamt {
233 1.3.10.2 yamt NetBSD *netbsd = NULL;
234 1.3.10.2 yamt TBuf<KMaxCommandLine> input, *args;
235 1.3.10.2 yamt TPtrC Default = _L("C:\\netbsd");
236 1.3.10.2 yamt TPtrC Prompt = _L("Boot: ");
237 1.3.10.2 yamt TInt pos, err;
238 1.3.10.2 yamt TBool retry;
239 1.3.10.2 yamt
240 1.3.10.2 yamt input.Zero();
241 1.3.10.2 yamt args = new TBuf<KMaxCommandLine>;
242 1.3.10.2 yamt args->Zero();
243 1.3.10.2 yamt retry = false;
244 1.3.10.2 yamt console->Printf(Prompt);
245 1.3.10.2 yamt console->Printf(_L("["));
246 1.3.10.2 yamt console->Printf(Default);
247 1.3.10.2 yamt console->Printf(_L("]: "));
248 1.3.10.2 yamt console->SetPos(Prompt.Length() +
249 1.3.10.2 yamt _L("[").Length() +
250 1.3.10.2 yamt Default.Length() +
251 1.3.10.2 yamt _L("]: ").Length());
252 1.3.10.2 yamt pos = 0;
253 1.3.10.2 yamt while (1) {
254 1.3.10.2 yamt TChar gChar = console->Getch();
255 1.3.10.2 yamt switch (gChar) {
256 1.3.10.2 yamt case EKeyEscape:
257 1.3.10.2 yamt return NULL;
258 1.3.10.2 yamt
259 1.3.10.2 yamt case EKeyEnter:
260 1.3.10.2 yamt break;
261 1.3.10.2 yamt
262 1.3.10.2 yamt case EKeyBackspace:
263 1.3.10.2 yamt if (pos > 0) {
264 1.3.10.2 yamt pos--;
265 1.3.10.2 yamt input.Delete(pos, 1);
266 1.3.10.2 yamt }
267 1.3.10.2 yamt break;
268 1.3.10.2 yamt
269 1.3.10.2 yamt default:
270 1.3.10.2 yamt if (gChar.IsPrint()) {
271 1.3.10.2 yamt if (input.Length() < KMaxCommandLine) {
272 1.3.10.2 yamt TBuf<0x02> b;
273 1.3.10.2 yamt b.Append(gChar);
274 1.3.10.2 yamt input.Insert(pos++, b);
275 1.3.10.2 yamt }
276 1.3.10.2 yamt }
277 1.3.10.2 yamt break;
278 1.3.10.2 yamt }
279 1.3.10.2 yamt if (gChar == EKeyEnter) {
280 1.3.10.2 yamt input.TrimAll();
281 1.3.10.2 yamt if (input[0] == '-')
282 1.3.10.2 yamt input.Swap(*args);
283 1.3.10.2 yamt for (int i = 0; i < input.Length(); i++)
284 1.3.10.2 yamt if (input[i] == ' ') {
285 1.3.10.2 yamt args->Copy(input);
286 1.3.10.2 yamt input.SetLength(i);
287 1.3.10.2 yamt args->Delete(0, i + 1);
288 1.3.10.2 yamt break;
289 1.3.10.2 yamt }
290 1.3.10.2 yamt args->ZeroTerminate();
291 1.3.10.2 yamt
292 1.3.10.2 yamt if (input.Length() > 0) {
293 1.3.10.2 yamt TRAP(err, netbsd = NetBSD::New(input, *args));
294 1.3.10.2 yamt } else {
295 1.3.10.2 yamt TRAP(err, netbsd = NetBSD::New(Default, *args));
296 1.3.10.2 yamt }
297 1.3.10.2 yamt if (err == 0 && netbsd != NULL)
298 1.3.10.2 yamt break;
299 1.3.10.2 yamt console->Printf(_L("\nLoad failed: %d\n"), err);
300 1.3.10.2 yamt
301 1.3.10.2 yamt input.Zero();
302 1.3.10.2 yamt args->Zero();
303 1.3.10.2 yamt console->Printf(Prompt);
304 1.3.10.2 yamt pos = 0;
305 1.3.10.2 yamt retry = true;
306 1.3.10.2 yamt }
307 1.3.10.2 yamt TInt base = Prompt.Length();
308 1.3.10.2 yamt if (!retry)
309 1.3.10.2 yamt base += (_L("[").Length() + Default.Length() +
310 1.3.10.2 yamt _L("]: ").Length());
311 1.3.10.2 yamt console->SetPos(base + pos);
312 1.3.10.2 yamt console->ClearToEndOfLine();
313 1.3.10.2 yamt console->SetPos(base);
314 1.3.10.2 yamt console->Write(input);
315 1.3.10.2 yamt console->SetPos(base + pos);
316 1.3.10.2 yamt }
317 1.3.10.2 yamt
318 1.3.10.2 yamt return netbsd;
319 1.3.10.2 yamt }
320 1.3.10.2 yamt
321 1.3.10.2 yamt #define KB * 1024
322 1.3.10.2 yamt
323 1.3.10.2 yamt LOCAL_C struct btinfo_common *
324 1.3.10.2 yamt CreateBootInfo(TAny *buf)
325 1.3.10.2 yamt {
326 1.3.10.2 yamt TMachineInfoV1Buf MachInfo;
327 1.3.10.2 yamt TMemoryInfoV1Buf MemInfo;
328 1.3.10.2 yamt struct btinfo_common *bootinfo, *common;
329 1.3.10.2 yamt struct btinfo_model *model;
330 1.3.10.2 yamt struct btinfo_memory *memory;
331 1.3.10.2 yamt struct btinfo_video *video;
332 1.3.10.2 yamt struct btinfo_bootargs *bootargs;
333 1.3.10.2 yamt struct memmap *memmap;
334 1.3.10.2 yamt TUint memsize;
335 1.3.10.2 yamt TUint i;
336 1.3.10.2 yamt
337 1.3.10.2 yamt UserHal::MachineInfo(MachInfo);
338 1.3.10.2 yamt UserHal::MemoryInfo(MemInfo);
339 1.3.10.2 yamt
340 1.3.10.2 yamt common = bootinfo = (struct btinfo_common *)buf;
341 1.3.10.2 yamt
342 1.3.10.2 yamt /* Set machine name to bootinfo. */
343 1.3.10.2 yamt common->len = sizeof(struct btinfo_model);
344 1.3.10.2 yamt common->type = BTINFO_MODEL;
345 1.3.10.2 yamt model = (struct btinfo_model *)common;
346 1.3.10.2 yamt Mem::Copy(model->model, &MachInfo().iMachineName[0],
347 1.3.10.2 yamt sizeof(model->model));
348 1.3.10.2 yamt common = &(model + 1)->common;
349 1.3.10.2 yamt
350 1.3.10.2 yamt /* Set video width/height to bootinfo. */
351 1.3.10.2 yamt common->len = sizeof(struct btinfo_video);
352 1.3.10.2 yamt common->type = BTINFO_VIDEO;
353 1.3.10.2 yamt video = (struct btinfo_video *)common;
354 1.3.10.2 yamt video->width = MachInfo().iDisplaySizeInPixels.iWidth;
355 1.3.10.2 yamt video->height = MachInfo().iDisplaySizeInPixels.iHeight;
356 1.3.10.2 yamt common = &(video + 1)->common;
357 1.3.10.2 yamt
358 1.3.10.2 yamt /* Set memory size to bootinfo. */
359 1.3.10.2 yamt memsize = MemInfo().iTotalRamInBytes / 1024;
360 1.3.10.2 yamt for (i = 0; i < sizeof(memmaps) / sizeof(memmaps[0]); i++) {
361 1.3.10.2 yamt if (_L(memmaps[i].model).CompareF(_L(model->model)) == 0 &&
362 1.3.10.2 yamt memmaps[i].width == video->width &&
363 1.3.10.2 yamt memmaps[i].height == video->height &&
364 1.3.10.2 yamt memmaps[i].memsize == memsize) {
365 1.3.10.2 yamt memmap = memmaps[i].memmaps;
366 1.3.10.2 yamt while (memsize > 0) {
367 1.3.10.2 yamt common->len = sizeof(struct btinfo_memory);
368 1.3.10.2 yamt common->type = BTINFO_MEMORY;
369 1.3.10.2 yamt memory = (struct btinfo_memory *)common;
370 1.3.10.2 yamt memory->address = memmap->address;
371 1.3.10.2 yamt memory->size = memmap->size KB;
372 1.3.10.2 yamt common = &(memory + 1)->common;
373 1.3.10.2 yamt memsize -= memmap->size;
374 1.3.10.2 yamt memmap++;
375 1.3.10.2 yamt }
376 1.3.10.2 yamt break;
377 1.3.10.2 yamt }
378 1.3.10.2 yamt }
379 1.3.10.2 yamt if (i == sizeof(memmaps) / sizeof(memmaps[0])) {
380 1.3.10.2 yamt common->len = sizeof(struct btinfo_memory);
381 1.3.10.2 yamt common->type = BTINFO_MEMORY;
382 1.3.10.2 yamt memory = (struct btinfo_memory *)common;
383 1.3.10.2 yamt memory->address = 0xc0000000; /* default is here */
384 1.3.10.2 yamt memory->size = 4096 KB; /* XXXXX */
385 1.3.10.2 yamt common = &(memory + 1)->common;
386 1.3.10.2 yamt }
387 1.3.10.2 yamt
388 1.3.10.2 yamt common->len = sizeof(struct btinfo_bootargs);
389 1.3.10.2 yamt common->type = BTINFO_BOOTARGS;
390 1.3.10.2 yamt bootargs = (struct btinfo_bootargs *)common;
391 1.3.10.2 yamt bootargs->bootargs[0] = '\0';
392 1.3.10.2 yamt common = &(bootargs + 1)->common;
393 1.3.10.2 yamt
394 1.3.10.2 yamt common->len = 0;
395 1.3.10.2 yamt common->type = BTINFO_NONE;
396 1.3.10.2 yamt
397 1.3.10.2 yamt /* Terminate bootinfo. */
398 1.3.10.2 yamt return bootinfo;
399 1.3.10.2 yamt }
400 1.3.10.2 yamt
401 1.3.10.2 yamt #undef KB
402 1.3.10.2 yamt
403 1.3.10.2 yamt LOCAL_C struct btinfo_common *
404 1.3.10.2 yamt FindBootInfoL(struct btinfo_common *bootinfo, int type)
405 1.3.10.2 yamt {
406 1.3.10.2 yamt struct btinfo_common *entry;
407 1.3.10.2 yamt
408 1.3.10.2 yamt entry = bootinfo;
409 1.3.10.2 yamt while (entry->type != BTINFO_NONE) {
410 1.3.10.2 yamt if (entry->type == type)
411 1.3.10.2 yamt return entry;
412 1.3.10.2 yamt entry = (struct btinfo_common *)((int)entry + entry->len);
413 1.3.10.2 yamt }
414 1.3.10.2 yamt User::Leave(KErrNotFound);
415 1.3.10.2 yamt
416 1.3.10.2 yamt /* NOTREACHED */
417 1.3.10.2 yamt
418 1.3.10.2 yamt return NULL;
419 1.3.10.2 yamt }
420 1.3.10.2 yamt
421 1.3.10.2 yamt TUint
422 1.3.10.2 yamt SummaryBootInfoMemory(struct btinfo_common *bootinfo)
423 1.3.10.2 yamt {
424 1.3.10.2 yamt struct btinfo_common *entry;
425 1.3.10.2 yamt struct btinfo_memory *memory;
426 1.3.10.2 yamt TUint memsize = 0;
427 1.3.10.2 yamt
428 1.3.10.2 yamt entry = bootinfo;
429 1.3.10.2 yamt while (entry->type != BTINFO_NONE) {
430 1.3.10.2 yamt if (entry->type == BTINFO_MEMORY) {
431 1.3.10.2 yamt memory = (struct btinfo_memory *)entry;
432 1.3.10.2 yamt memsize += memory->size;
433 1.3.10.2 yamt }
434 1.3.10.2 yamt entry = (struct btinfo_common *)((int)entry + entry->len);
435 1.3.10.2 yamt }
436 1.3.10.2 yamt return memsize;
437 1.3.10.2 yamt }
438