187 bop_panic("phys addresses overlap\n");
188 if (aimp->aim_vaddr < vstart && aimp->aim_vaddr +
189 aimp->aim_vlen > vstart)
190 bop_panic("virt addreses overlap\n");
191 if (vstart < aimp->aim_vaddr && vstart + len > aimp->aim_vaddr)
192 bop_panic("virt addresses overlap\n");
193
194 if (aimp->aim_paddr > pstart && aimp->aim_paddr < pmax)
195 pmax = aimp->aim_paddr;
196 }
197
198 armboot_mmu_map(pstart, vstart, len, PF_R | PF_W | PF_X);
199 bop_alloc_scratch_next = vstart;
200 bop_alloc_scratch_last = vstart + len;
201 bop_alloc_scratch_size = len;
202
203 bop_alloc_pnext = pstart + len;
204 bop_alloc_plast = pmax;
205 }
206
207 static void
208 fakebop_dump_tags(void *tagstart)
209 {
210 atag_header_t *h = tagstart;
211 atag_core_t *acp;
212 atag_mem_t *amp;
213 atag_cmdline_t *alp;
214 atag_initrd_t *aip;
215 const char *tname;
216 int i;
217 char *c;
218
219 DBG_MSG("starting point:");
220 DBG_MSG(fakebop_hack_ultostr((uintptr_t)h, &buffer[BUFFERSIZE-1]));
221 DBG_MSG("first atag size:");
222 DBG_MSG(fakebop_hack_ultostr(h->ah_size, &buffer[BUFFERSIZE-1]));
223 DBG_MSG("first atag tag:");
224 DBG_MSG(fakebop_hack_ultostr(h->ah_tag, &buffer[BUFFERSIZE-1]));
225 while (h != NULL) {
226 switch (h->ah_tag) {
227 case ATAG_CORE:
228 tname = "ATAG_CORE";
229 break;
230 case ATAG_MEM:
231 tname = "ATAG_MEM";
232 break;
233 case ATAG_VIDEOTEXT:
234 tname = "ATAG_VIDEOTEXT";
235 break;
236 case ATAG_RAMDISK:
237 tname = "ATAG_RAMDISK";
238 break;
239 case ATAG_INITRD2:
240 tname = "ATAG_INITRD2";
241 break;
242 case ATAG_SERIAL:
243 tname = "ATAG_SERIAL";
244 break;
245 case ATAG_REVISION:
246 tname = "ATAG_REVISION";
247 break;
248 case ATAG_VIDEOLFB:
249 tname = "ATAG_VIDEOLFB";
250 break;
251 case ATAG_CMDLINE:
252 tname = "ATAG_CMDLINE";
253 break;
254 default:
255 tname = fakebop_hack_ultostr(h->ah_tag,
256 &buffer[BUFFERSIZE-1]);
257 break;
258 }
259 DBG_MSG("tag:");
260 DBG_MSG(tname);
261 DBG_MSG("size:");
262 DBG_MSG(fakebop_hack_ultostr(h->ah_size,
263 &buffer[BUFFERSIZE-1]));
264 /* Extended information */
265 switch (h->ah_tag) {
266 case ATAG_CORE:
267 if (h->ah_size == 2) {
268 DBG_MSG("ATAG_CORE has no extra information");
269 } else {
270 acp = (atag_core_t *)h;
271 DBG_MSG("\tflags:");
272 bcons_puts("\t");
273 DBG_MSG(fakebop_hack_ultostr(acp->ac_flags,
274 &buffer[BUFFERSIZE-1]));
275 DBG_MSG("\tpage:");
276 bcons_puts("\t");
277 DBG_MSG(fakebop_hack_ultostr(acp->ac_pagesize,
278 &buffer[BUFFERSIZE-1]));
279 DBG_MSG("\troot:");
280 bcons_puts("\t");
281 DBG_MSG(fakebop_hack_ultostr(acp->ac_rootdev,
282 &buffer[BUFFERSIZE-1]));
283 }
284 break;
285 case ATAG_MEM:
286 amp = (atag_mem_t *)h;
287 DBG_MSG("\tsize:");
288 bcons_puts("\t");
289 DBG_MSG(fakebop_hack_ultostr(amp->am_size,
290 &buffer[BUFFERSIZE-1]));
291 DBG_MSG("\tstart:");
292 bcons_puts("\t");
293 DBG_MSG(fakebop_hack_ultostr(amp->am_start,
294 &buffer[BUFFERSIZE-1]));
295 break;
296 case ATAG_INITRD2:
297 aip = (atag_initrd_t *)h;
298 DBG_MSG("\tsize:");
299 bcons_puts("\t");
300 DBG_MSG(fakebop_hack_ultostr(aip->ai_size,
301 &buffer[BUFFERSIZE-1]));
302 DBG_MSG("\tstart:");
303 bcons_puts("\t");
304 DBG_MSG(fakebop_hack_ultostr(aip->ai_start,
305 &buffer[BUFFERSIZE-1]));
306 break;
307 case ATAG_CMDLINE:
308 alp = (atag_cmdline_t *)h;
309 DBG_MSG("\tcmdline:");
310 /*
311 * We have no intelligent thing to wrap our tty at 80
312 * chars so we just do this a bit more manually for now.
313 */
314 i = 0;
315 c = alp->al_cmdline;
316 while (*c != '\0') {
317 bcons_putchar(*c++);
318 if (++i == 72) {
319 bcons_puts("\n");
320 i = 0;
321 }
322 }
323 bcons_puts("\n");
324 break;
325 default:
326 break;
327 }
328 h = atag_next(h);
329 }
330 }
331
332 static void
333 fakebop_getatags(void *tagstart)
334 {
335 atag_mem_t *amp;
336 atag_cmdline_t *alp;
337 atag_header_t *ahp = tagstart;
338 atag_illumos_status_t *aisp;
339 bootinfo_t *bp = &bootinfo;
340
341 bp->bi_flags = 0;
342 while (ahp != NULL) {
343 switch (ahp->ah_tag) {
344 case ATAG_MEM:
345 amp = (atag_mem_t *)ahp;
346 bp->bi_memsize = amp->am_size;
347 bp->bi_memstart = amp->am_start;
348 break;
349 case ATAG_CMDLINE:
350 alp = (atag_cmdline_t *)ahp;
351 bp->bi_cmdline = alp->al_cmdline;
352 break;
353 case ATAG_ILLUMOS_STATUS:
354 aisp = (atag_illumos_status_t *)ahp;
355 bp->bi_ramdisk = aisp->ais_archive;
356 bp->bi_ramsize = aisp->ais_archivelen;
357 bp->bi_flags |= BI_HAS_RAMDISK;
358 break;
359 default:
360 break;
361 }
362 ahp = atag_next(ahp);
363 }
364 }
|
187 bop_panic("phys addresses overlap\n");
188 if (aimp->aim_vaddr < vstart && aimp->aim_vaddr +
189 aimp->aim_vlen > vstart)
190 bop_panic("virt addreses overlap\n");
191 if (vstart < aimp->aim_vaddr && vstart + len > aimp->aim_vaddr)
192 bop_panic("virt addresses overlap\n");
193
194 if (aimp->aim_paddr > pstart && aimp->aim_paddr < pmax)
195 pmax = aimp->aim_paddr;
196 }
197
198 armboot_mmu_map(pstart, vstart, len, PF_R | PF_W | PF_X);
199 bop_alloc_scratch_next = vstart;
200 bop_alloc_scratch_last = vstart + len;
201 bop_alloc_scratch_size = len;
202
203 bop_alloc_pnext = pstart + len;
204 bop_alloc_plast = pmax;
205 }
206
207 #define DUMP_ATAG_VAL(name, val) \
208 do { \
209 DBG_MSG("\t" name ":"); \
210 bcons_puts("\t"); \
211 DBG_MSG(fakebop_hack_ultostr((val), \
212 &buffer[BUFFERSIZE-1])); \
213 } while (0)
214
215 static void
216 fakebop_dump_tags(void *tagstart)
217 {
218 atag_header_t *h = tagstart;
219 atag_core_t *acp;
220 atag_mem_t *amp;
221 atag_cmdline_t *alp;
222 atag_initrd_t *aip;
223 atag_illumos_status_t *aisp;
224 atag_illumos_mapping_t *aimp;
225 const char *tname;
226 int i;
227 char *c;
228
229 DBG_MSG("starting point:");
230 DBG_MSG(fakebop_hack_ultostr((uintptr_t)h, &buffer[BUFFERSIZE-1]));
231 DBG_MSG("first atag size:");
232 DBG_MSG(fakebop_hack_ultostr(h->ah_size, &buffer[BUFFERSIZE-1]));
233 DBG_MSG("first atag tag:");
234 DBG_MSG(fakebop_hack_ultostr(h->ah_tag, &buffer[BUFFERSIZE-1]));
235 while (h != NULL) {
236 switch (h->ah_tag) {
237 case ATAG_CORE:
238 tname = "ATAG_CORE";
239 break;
240 case ATAG_MEM:
241 tname = "ATAG_MEM";
242 break;
243 case ATAG_VIDEOTEXT:
244 tname = "ATAG_VIDEOTEXT";
245 break;
246 case ATAG_RAMDISK:
247 tname = "ATAG_RAMDISK";
248 break;
249 case ATAG_INITRD2:
250 tname = "ATAG_INITRD2";
251 break;
252 case ATAG_SERIAL:
253 tname = "ATAG_SERIAL";
254 break;
255 case ATAG_REVISION:
256 tname = "ATAG_REVISION";
257 break;
258 case ATAG_VIDEOLFB:
259 tname = "ATAG_VIDEOLFB";
260 break;
261 case ATAG_CMDLINE:
262 tname = "ATAG_CMDLINE";
263 break;
264 case ATAG_ILLUMOS_STATUS:
265 tname = "ATAG_ILLUMOS_STATUS";
266 break;
267 case ATAG_ILLUMOS_MAPPING:
268 tname = "ATAG_ILLUMOS_MAPPING";
269 break;
270 default:
271 tname = fakebop_hack_ultostr(h->ah_tag,
272 &buffer[BUFFERSIZE-1]);
273 break;
274 }
275 DBG_MSG("tag:");
276 DBG_MSG(tname);
277 DBG_MSG("size:");
278 DBG_MSG(fakebop_hack_ultostr(h->ah_size,
279 &buffer[BUFFERSIZE-1]));
280 /* Extended information */
281 switch (h->ah_tag) {
282 case ATAG_CORE:
283 if (h->ah_size == 2) {
284 DBG_MSG("ATAG_CORE has no extra information");
285 } else {
286 acp = (atag_core_t *)h;
287 DUMP_ATAG_VAL("flags", acp->ac_flags);
288 DUMP_ATAG_VAL("pagesize", acp->ac_pagesize);
289 DUMP_ATAG_VAL("rootdev", acp->ac_rootdev);
290 }
291 break;
292 case ATAG_MEM:
293 amp = (atag_mem_t *)h;
294 DUMP_ATAG_VAL("size", amp->am_size);
295 DUMP_ATAG_VAL("start", amp->am_start);
296 break;
297 case ATAG_INITRD2:
298 aip = (atag_initrd_t *)h;
299 DUMP_ATAG_VAL("size", aip->ai_size);
300 DUMP_ATAG_VAL("start", aip->ai_start);
301 break;
302 case ATAG_CMDLINE:
303 alp = (atag_cmdline_t *)h;
304 DBG_MSG("\tcmdline:");
305 /*
306 * We have no intelligent thing to wrap our tty at 80
307 * chars so we just do this a bit more manually for now.
308 */
309 i = 0;
310 c = alp->al_cmdline;
311 while (*c != '\0') {
312 bcons_putchar(*c++);
313 if (++i == 72) {
314 bcons_puts("\n");
315 i = 0;
316 }
317 }
318 bcons_puts("\n");
319 break;
320 case ATAG_ILLUMOS_STATUS:
321 aisp = (atag_illumos_status_t *)h;
322 DUMP_ATAG_VAL("version", aisp->ais_version);
323 DUMP_ATAG_VAL("ptbase", aisp->ais_ptbase);
324 DUMP_ATAG_VAL("freemem", aisp->ais_freemem);
325 DUMP_ATAG_VAL("freeused", aisp->ais_freeused);
326 DUMP_ATAG_VAL("archive", aisp->ais_archive);
327 DUMP_ATAG_VAL("archivelen", aisp->ais_archivelen);
328 DUMP_ATAG_VAL("pt_arena", aisp->ais_pt_arena);
329 DUMP_ATAG_VAL("pt_arena_max", aisp->ais_pt_arena_max);
330 DUMP_ATAG_VAL("stext", aisp->ais_stext);
331 DUMP_ATAG_VAL("etext", aisp->ais_etext);
332 DUMP_ATAG_VAL("sdata", aisp->ais_sdata);
333 DUMP_ATAG_VAL("edata", aisp->ais_edata);
334 break;
335 case ATAG_ILLUMOS_MAPPING:
336 aimp = (atag_illumos_mapping_t *)h;
337 DUMP_ATAG_VAL("paddr", aimp->aim_paddr);
338 DUMP_ATAG_VAL("plen", aimp->aim_plen);
339 DUMP_ATAG_VAL("vaddr", aimp->aim_vaddr);
340 DUMP_ATAG_VAL("vlen", aimp->aim_vlen);
341 DUMP_ATAG_VAL("mapflags", aimp->aim_mapflags);
342 break;
343 default:
344 break;
345 }
346 h = atag_next(h);
347 }
348 }
349
350 static void
351 fakebop_getatags(void *tagstart)
352 {
353 atag_mem_t *amp;
354 atag_cmdline_t *alp;
355 atag_header_t *ahp = tagstart;
356 atag_illumos_status_t *aisp;
357 bootinfo_t *bp = &bootinfo;
358
359 bp->bi_flags = 0;
360 while (ahp != NULL) {
361 switch (ahp->ah_tag) {
362 case ATAG_MEM:
363 /*
364 * XXX: we may actually get more than one ATAG_MEM
365 * if the system has discontiguous physical memory
366 */
367 amp = (atag_mem_t *)ahp;
368 bp->bi_memsize = amp->am_size;
369 bp->bi_memstart = amp->am_start;
370 break;
371 case ATAG_CMDLINE:
372 alp = (atag_cmdline_t *)ahp;
373 bp->bi_cmdline = alp->al_cmdline;
374 break;
375 case ATAG_ILLUMOS_STATUS:
376 aisp = (atag_illumos_status_t *)ahp;
377 bp->bi_ramdisk = aisp->ais_archive;
378 bp->bi_ramsize = aisp->ais_archivelen;
379 bp->bi_flags |= BI_HAS_RAMDISK;
380 break;
381 default:
382 break;
383 }
384 ahp = atag_next(ahp);
385 }
386 }
|