Print this page
11626 introduce /etc/versions/build
11627 clean up UUID code for ::status

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/mdb/common/mdb/mdb_kvm.c
          +++ new/usr/src/cmd/mdb/common/mdb/mdb_kvm.c
↓ open down ↓ 15 lines elided ↑ open up ↑
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
  23   23   */
  24   24  
  25   25  /*
  26      - * Copyright (c) 2013, Joyent, Inc.  All rights reserved.
       26 + * Copyright 2019 Joyent, Inc.
  27   27   */
  28   28  
  29   29  /*
  30   30   * Libkvm Kernel Target
  31   31   *
  32   32   * The libkvm kernel target provides access to both crash dumps and live
  33   33   * kernels through /dev/ksyms and /dev/kmem, using the facilities provided by
  34   34   * the libkvm.so library.  The target-specific data structures are shared
  35   35   * between this file (common code) and the ISA-dependent parts of the target,
  36   36   * and so they are defined in the mdb_kvm.h header.  The target processes an
↓ open down ↓ 7 lines elided ↑ open up ↑
  44   44   * that must be compiled against the kernel implementation.
  45   45   */
  46   46  
  47   47  #include <sys/modctl.h>
  48   48  #include <sys/kobj.h>
  49   49  #include <sys/kobj_impl.h>
  50   50  #include <sys/utsname.h>
  51   51  #include <sys/panic.h>
  52   52  #include <sys/dumphdr.h>
  53   53  #include <sys/dumpadm.h>
       54 +#include <sys/uuid.h>
  54   55  
  55   56  #include <dlfcn.h>
  56   57  #include <libctf.h>
  57   58  #include <string.h>
  58   59  #include <fcntl.h>
  59   60  #include <errno.h>
  60   61  
  61   62  #include <mdb/mdb_target_impl.h>
  62   63  #include <mdb/mdb_err.h>
  63   64  #include <mdb/mdb_debug.h>
  64   65  #include <mdb/mdb_string.h>
  65   66  #include <mdb/mdb_modapi.h>
  66   67  #include <mdb/mdb_io_impl.h>
  67   68  #include <mdb/mdb_ctf.h>
  68   69  #include <mdb/mdb_kvm.h>
  69   70  #include <mdb/mdb_module.h>
  70   71  #include <mdb/mdb_kb.h>
       72 +#include <mdb/mdb_ks.h>
  71   73  #include <mdb/mdb.h>
  72   74  
  73   75  #define KT_RELOC_BUF(buf, obase, nbase) \
  74   76          ((uintptr_t)(buf) - (uintptr_t)(obase) + (uintptr_t)(nbase))
  75   77  
  76   78  #define KT_BAD_BUF(buf, base, size) \
  77   79          ((uintptr_t)(buf) < (uintptr_t)(base) || \
  78   80          ((uintptr_t)(buf) >= (uintptr_t)(base) + (uintptr_t)(size)))
  79   81  
  80   82  typedef struct kt_symarg {
↓ open down ↓ 6 lines elided ↑ open up ↑
  87   89  
  88   90  typedef struct kt_maparg {
  89   91          mdb_tgt_t *map_target;          /* Target used for mapping iter */
  90   92          mdb_tgt_map_f *map_cb;          /* Caller's callback function */
  91   93          void *map_data;                 /* Callback function argument */
  92   94  } kt_maparg_t;
  93   95  
  94   96  static const char KT_MODULE[] = "mdb_ks";
  95   97  static const char KT_CTFPARENT[] = "genunix";
  96   98  
       99 +static void (*print_buildversion)(void);
      100 +
  97  101  static void
  98  102  kt_load_module(kt_data_t *kt, mdb_tgt_t *t, kt_module_t *km)
  99  103  {
 100  104          km->km_data = mdb_alloc(km->km_datasz, UM_SLEEP);
 101  105  
 102  106          (void) mdb_tgt_vread(t, km->km_data, km->km_datasz, km->km_symspace_va);
 103  107  
 104  108          km->km_symbuf = (void *)
 105  109              KT_RELOC_BUF(km->km_symtab_va, km->km_symspace_va, km->km_data);
 106  110  
↓ open down ↓ 371 lines elided ↑ open up ↑
 478  482                      kt->k_xpv_domu ? "domain " : "", kt->k_kvmfile,
 479  483                      (int)(sizeof (void *) * NBBY), uts.nodename);
 480  484          } else {
 481  485                  mdb_printf("debugging live kernel (%d-bit) on %s\n",
 482  486                      (int)(sizeof (void *) * NBBY), uts.nodename);
 483  487          }
 484  488  
 485  489          mdb_printf("operating system: %s %s (%s)\n",
 486  490              uts.release, uts.version, uts.machine);
 487  491  
      492 +        if (print_buildversion != NULL)
      493 +                print_buildversion();
      494 +
 488  495          if (kt->k_dumphdr) {
 489  496                  dumphdr_t *dh = kt->k_dumphdr;
 490  497  
 491  498                  mdb_printf("image uuid: %s\n", dh->dump_uuid[0] != '\0' ?
 492  499                      dh->dump_uuid : "(not set)");
 493  500                  mdb_printf("panic message: %s\n", dh->dump_panicstring);
 494  501  
 495  502                  kt->k_dump_print_content(dh, kt->k_dumpcontent);
 496  503          } else {
 497      -                char uuid[37];
      504 +                char uuid[UUID_PRINTABLE_STRING_LENGTH];
 498  505  
 499      -                if (mdb_readsym(uuid, 37, "dump_osimage_uuid") == 37 &&
 500      -                    uuid[36] == '\0') {
 501      -                        mdb_printf("image uuid: %s\n", uuid);
      506 +                if (mdb_readsym(uuid, sizeof (uuid),
      507 +                    "dump_osimage_uuid") == sizeof (uuid) &&
      508 +                    uuid[sizeof (uuid) - 1] == '\0') {
      509 +                        mdb_printf("image uuid: %s\n", uuid[0] != '\0' ?
      510 +                            uuid : "(not set)");
 502  511                  }
 503  512          }
 504  513  
 505  514          return (DCMD_OK);
 506  515  }
 507  516  
 508  517  static const mdb_dcmd_t kt_dcmds[] = {
 509  518          { "$c", "?[cnt]", "print stack backtrace", kt_stack },
 510  519          { "$C", "?[cnt]", "print stack backtrace", kt_stackv },
 511  520          { "$r", NULL, "print general-purpose registers", kt_regs },
↓ open down ↓ 63 lines elided ↑ open up ↑
 575  584                          mdb_warn("warning: dump is from %s %s %s; dcmds and "
 576  585                              "macros may not match kernel implementation\n",
 577  586                              u2.sysname, u2.release, u2.version);
 578  587                  }
 579  588  
 580  589                  if (mdb_module_load(KT_MODULE, MDB_MOD_GLOBAL) < 0) {
 581  590                          warn("failed to load kernel support module -- "
 582  591                              "some modules may not load\n");
 583  592                  }
 584  593  
      594 +                print_buildversion = (void (*)(void))dlsym(RTLD_NEXT,
      595 +                    "mdb_print_buildversion");
      596 +
 585  597                  if (mdb_prop_postmortem && kt->k_dumphdr != NULL) {
 586  598                          sym = dlsym(RTLD_NEXT, "mdb_dump_print_content");
 587  599                          if (sym != NULL)
 588  600                                  kt->k_dump_print_content = (void (*)())sym;
 589  601  
 590  602                          sym = dlsym(RTLD_NEXT, "mdb_dump_find_curproc");
 591  603                          if (sym != NULL)
 592  604                                  kt->k_dump_find_curproc = (int (*)())sym;
 593  605  
 594  606                          kt->k_dumpcontent = kt_find_dump_contents(kt);
↓ open down ↓ 1004 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX