Print this page
fakebop: make a note of multiple ATAG_MEM
fakebop: dump ATAG_ILLUMOS_{STATUS,MAPPING}
fakebop: make the atag dumping code a bit more readable


 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 }