Print this page
patch mdb-enums

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/mdb/common/mdb/mdb_print.c
          +++ new/usr/src/cmd/mdb/common/mdb/mdb_print.c
↓ open down ↓ 2552 lines elided ↑ open up ↑
2553 2553                  int32_t i4;
2554 2554                  int16_t i2;
2555 2555                  int8_t i1;
2556 2556          } u;
2557 2557  
2558 2558          if (mdb_ctf_type_resolve(id, &base) == -1) {
2559 2559                  mdb_warn("could not resolve type");
2560 2560                  return (DCMD_ABORT);
2561 2561          }
2562 2562  
2563      -        if (mdb_ctf_type_kind(base) != CTF_K_INTEGER) {
2564      -                mdb_warn("expected integer type\n");
2565      -                return (DCMD_ABORT);
2566      -        }
2567      -
2568      -        if (mdb_ctf_type_encoding(base, &e) != 0) {
2569      -                mdb_warn("could not get type encoding");
2570      -                return (DCMD_ABORT);
     2563 +        switch (mdb_ctf_type_kind(base)) {
     2564 +                case CTF_K_ENUM:
     2565 +                        e.cte_format = CTF_INT_SIGNED;
     2566 +                        e.cte_offset = 0;
     2567 +                        e.cte_bits = sizeof(int) * NBBY; /* XXX: get size from CTF? */
     2568 +                        break;
     2569 +                case CTF_K_INTEGER:
     2570 +                        if (mdb_ctf_type_encoding(base, &e) != 0) {
     2571 +                                mdb_warn("could not get type encoding");
     2572 +                                return (DCMD_ABORT);
     2573 +                        }
     2574 +                        break;
     2575 +                default:
     2576 +                        mdb_warn("expected integer type\n");
     2577 +                        return (DCMD_ABORT);
2571 2578          }
2572 2579  
2573 2580          if (sign)
2574 2581                  sign = e.cte_format & CTF_INT_SIGNED;
2575 2582  
2576 2583          size = e.cte_bits / NBBY;
2577 2584  
2578 2585          /*
2579 2586           * Check to see if our life has been complicated by the presence of
2580 2587           * a bitfield.  If it has, we will print it using logic that is only
↓ open down ↓ 163 lines elided ↑ open up ↑
2744 2751                          return (DCMD_ERR);
2745 2752                  }
2746 2753  
2747 2754                  if (mdb_readstr(buf, sizeof (buf) - 1, value) < 0) {
2748 2755                          mdb_warn("failed to read string at %llx", value);
2749 2756                          return (DCMD_ERR);
2750 2757                  }
2751 2758  
2752 2759                  mdb_printf(fmt, buf);
2753 2760                  return (0);
     2761 +        }
     2762 +
     2763 +        if (mdb_ctf_type_kind(base) == CTF_K_ENUM) {
     2764 +                const char *strval;
     2765 +                int value;
     2766 +
     2767 +                if (mdb_vread(&value, sizeof (value), addr) == -1) {
     2768 +                        mdb_warn("failed to read pointer at %llx", addr);
     2769 +                        return (DCMD_ERR);
     2770 +                }
     2771 +
     2772 +                if ((strval = mdb_ctf_enum_name(id, value))) {
     2773 +                        mdb_printf(fmt, strval);
     2774 +                } else {
     2775 +                        mdb_snprintf(buf, sizeof (buf), "<%d>", value);
     2776 +                        mdb_printf(fmt, buf);
     2777 +                }
     2778 +
     2779 +                return (DCMD_OK);
2754 2780          }
2755 2781  
2756 2782          if (mdb_ctf_type_kind(base) != CTF_K_ARRAY) {
2757 2783                  mdb_warn("exepected pointer or array type\n");
2758 2784                  return (DCMD_ABORT);
2759 2785          }
2760 2786  
2761 2787          if (mdb_ctf_array_info(base, &r) == -1 ||
2762 2788              mdb_ctf_type_resolve(r.mta_contents, &base) == -1 ||
2763 2789              (size = mdb_ctf_type_size(base)) == -1) {
↓ open down ↓ 393 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX