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

@@ -202,18 +202,28 @@
 
         bop_alloc_pnext = pstart + len;
         bop_alloc_plast = pmax;
 }
 
+#define DUMP_ATAG_VAL(name, val)                                        \
+        do {                                                            \
+                DBG_MSG("\t" name ":");                                 \
+                bcons_puts("\t");                                       \
+                DBG_MSG(fakebop_hack_ultostr((val),                     \
+                    &buffer[BUFFERSIZE-1]));                            \
+        } while (0)
+
 static void
 fakebop_dump_tags(void *tagstart)
 {
         atag_header_t *h = tagstart;
         atag_core_t *acp;
         atag_mem_t *amp;
         atag_cmdline_t *alp;
         atag_initrd_t *aip;
+        atag_illumos_status_t *aisp;
+        atag_illumos_mapping_t *aimp;
         const char *tname;
         int i;
         char *c;
 
         DBG_MSG("starting point:");

@@ -249,10 +259,16 @@
                         tname = "ATAG_VIDEOLFB";
                         break;
                 case ATAG_CMDLINE:
                         tname = "ATAG_CMDLINE";
                         break;
+                case ATAG_ILLUMOS_STATUS:
+                        tname = "ATAG_ILLUMOS_STATUS";
+                        break;
+                case ATAG_ILLUMOS_MAPPING:
+                        tname = "ATAG_ILLUMOS_MAPPING";
+                        break;
                 default:
                         tname = fakebop_hack_ultostr(h->ah_tag,
                             &buffer[BUFFERSIZE-1]);
                         break;
                 }

@@ -266,45 +282,24 @@
                 case ATAG_CORE:
                         if (h->ah_size == 2) {
                                 DBG_MSG("ATAG_CORE has no extra information");
                         } else {
                                 acp = (atag_core_t *)h;
-                                DBG_MSG("\tflags:");
-                                bcons_puts("\t");
-                                DBG_MSG(fakebop_hack_ultostr(acp->ac_flags,
-                                    &buffer[BUFFERSIZE-1]));
-                                DBG_MSG("\tpage:");
-                                bcons_puts("\t");
-                                DBG_MSG(fakebop_hack_ultostr(acp->ac_pagesize,
-                                    &buffer[BUFFERSIZE-1]));
-                                DBG_MSG("\troot:");
-                                bcons_puts("\t");
-                                DBG_MSG(fakebop_hack_ultostr(acp->ac_rootdev,
-                                    &buffer[BUFFERSIZE-1]));
+                                DUMP_ATAG_VAL("flags", acp->ac_flags);
+                                DUMP_ATAG_VAL("pagesize", acp->ac_pagesize);
+                                DUMP_ATAG_VAL("rootdev", acp->ac_rootdev);
                         }
                         break;
                 case ATAG_MEM:
                         amp = (atag_mem_t *)h;
-                        DBG_MSG("\tsize:");
-                        bcons_puts("\t");
-                        DBG_MSG(fakebop_hack_ultostr(amp->am_size,
-                            &buffer[BUFFERSIZE-1]));
-                        DBG_MSG("\tstart:");
-                        bcons_puts("\t");
-                        DBG_MSG(fakebop_hack_ultostr(amp->am_start,
-                            &buffer[BUFFERSIZE-1]));
+                        DUMP_ATAG_VAL("size", amp->am_size);
+                        DUMP_ATAG_VAL("start", amp->am_start);
                         break;
                 case ATAG_INITRD2:
                         aip = (atag_initrd_t *)h;
-                        DBG_MSG("\tsize:");
-                        bcons_puts("\t");
-                        DBG_MSG(fakebop_hack_ultostr(aip->ai_size,
-                            &buffer[BUFFERSIZE-1]));
-                        DBG_MSG("\tstart:");
-                        bcons_puts("\t");
-                        DBG_MSG(fakebop_hack_ultostr(aip->ai_start,
-                            &buffer[BUFFERSIZE-1]));
+                        DUMP_ATAG_VAL("size", aip->ai_size);
+                        DUMP_ATAG_VAL("start", aip->ai_start);
                         break;
                 case ATAG_CMDLINE:
                         alp = (atag_cmdline_t *)h;
                         DBG_MSG("\tcmdline:");
                         /*

@@ -320,10 +315,33 @@
                                         i = 0;
                                 }
                         }
                         bcons_puts("\n");
                         break;
+                case ATAG_ILLUMOS_STATUS:
+                        aisp = (atag_illumos_status_t *)h;
+                        DUMP_ATAG_VAL("version", aisp->ais_version);
+                        DUMP_ATAG_VAL("ptbase", aisp->ais_ptbase);
+                        DUMP_ATAG_VAL("freemem", aisp->ais_freemem);
+                        DUMP_ATAG_VAL("freeused", aisp->ais_freeused);
+                        DUMP_ATAG_VAL("archive", aisp->ais_archive);
+                        DUMP_ATAG_VAL("archivelen", aisp->ais_archivelen);
+                        DUMP_ATAG_VAL("pt_arena", aisp->ais_pt_arena);
+                        DUMP_ATAG_VAL("pt_arena_max", aisp->ais_pt_arena_max);
+                        DUMP_ATAG_VAL("stext", aisp->ais_stext);
+                        DUMP_ATAG_VAL("etext", aisp->ais_etext);
+                        DUMP_ATAG_VAL("sdata", aisp->ais_sdata);
+                        DUMP_ATAG_VAL("edata", aisp->ais_edata);
+                        break;
+                case ATAG_ILLUMOS_MAPPING:
+                        aimp = (atag_illumos_mapping_t *)h;
+                        DUMP_ATAG_VAL("paddr", aimp->aim_paddr);
+                        DUMP_ATAG_VAL("plen", aimp->aim_plen);
+                        DUMP_ATAG_VAL("vaddr", aimp->aim_vaddr);
+                        DUMP_ATAG_VAL("vlen", aimp->aim_vlen);
+                        DUMP_ATAG_VAL("mapflags", aimp->aim_mapflags);
+                        break;
                 default:
                         break;
                 }
                 h = atag_next(h);
         }

@@ -340,10 +358,14 @@
 
         bp->bi_flags = 0;
         while (ahp != NULL) {
                 switch (ahp->ah_tag) {
                 case ATAG_MEM:
+                        /*
+                         * XXX: we may actually get more than one ATAG_MEM
+                         * if the system has discontiguous physical memory
+                         */
                         amp = (atag_mem_t *)ahp;
                         bp->bi_memsize = amp->am_size;
                         bp->bi_memstart = amp->am_start;
                         break;
                 case ATAG_CMDLINE: