--- old/usr/src/uts/common/os/clock.c	Fri Jan 29 20:31:00 2016
+++ new/usr/src/uts/common/os/clock.c	Fri Jan 29 20:31:00 2016
@@ -24,6 +24,7 @@
 /*
  * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2013, Joyent, Inc.  All rights reserved.
+ * Copyright 2016 Garrett D'Amore
  */
 
 #include <sys/param.h>
@@ -314,6 +315,7 @@
 int	tod_needsync = 0;	/* need to sync tod chip with software time */
 static int tod_broken = 0;	/* clock chip doesn't work */
 time_t	boot_time = 0;		/* Boot time in seconds since 1970 */
+hrtime_t boot_hrtime = 0;	/* gethrtime() at boot */
 cyclic_id_t clock_cyclic;	/* clock()'s cyclic_id */
 cyclic_id_t deadman_cyclic;	/* deadman()'s cyclic_id */
 
@@ -1903,6 +1905,9 @@
 		boot_time = ts.tv_sec;
 		set_clock = 1;
 	}
+	if (!boot_hrtime) {
+		boot_hrtime = gethrtime();
+	}
 
 	if (set_clock)
 		set_hrestime(&ts);
--- old/usr/src/uts/common/os/kstat_fr.c	Fri Jan 29 20:31:01 2016
+++ new/usr/src/uts/common/os/kstat_fr.c	Fri Jan 29 20:31:01 2016
@@ -22,6 +22,7 @@
  * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2014, Joyent, Inc. All rights reserved.
  * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2016 Garrett D'Amore
  */
 
 /*
@@ -148,6 +149,7 @@
 extern	int	vac;
 extern	uint_t	nproc;
 extern	time_t	boot_time;
+extern	hrtime_t	boot_hrtime;
 extern	sysinfo_t	sysinfo;
 extern	vminfo_t	vminfo;
 
@@ -162,6 +164,7 @@
 	kstat_named_t avenrun_5min;
 	kstat_named_t avenrun_15min;
 	kstat_named_t boot_time;
+	kstat_named_t boot_hrtime;
 	kstat_named_t nsec_per_tick;
 } system_misc_kstat = {
 	{ "ncpus",		KSTAT_DATA_UINT32 },
@@ -174,6 +177,7 @@
 	{ "avenrun_5min",	KSTAT_DATA_UINT32 },
 	{ "avenrun_15min",	KSTAT_DATA_UINT32 },
 	{ "boot_time",		KSTAT_DATA_UINT32 },
+	{ "boot_hrtime",	KSTAT_DATA_TIME },
 	{ "nsec_per_tick",	KSTAT_DATA_UINT32 },
 };
 
@@ -810,6 +814,7 @@
 	int myncpus = ncpus;
 	int *loadavgp = &avenrun[0];
 	time_t zone_boot_time;
+	hrtime_t zone_boot_hrtime;
 	clock_t zone_lbolt;
 	hrtime_t zone_hrtime;
 	size_t zone_nproc;
@@ -836,8 +841,10 @@
 		zone_boot_time = boot_time;
 		zone_lbolt = ddi_get_lbolt();
 		zone_nproc = nproc;
+		zone_boot_hrtime = boot_hrtime;
 	} else {
 		zone_boot_time = curproc->p_zone->zone_boot_time;
+		zone_boot_hrtime = curproc->p_zone->zone_boot_hrtime;
 
 		zone_hrtime = gethrtime();
 		zone_lbolt = (clock_t)(NSEC_TO_TICK(zone_hrtime) -
@@ -858,6 +865,7 @@
 	system_misc_kstat.avenrun_15min.value.ui32	= (uint32_t)loadavgp[2];
 	system_misc_kstat.boot_time.value.ui32		= (uint32_t)
 	    zone_boot_time;
+	system_misc_kstat.boot_hrtime.value.t		= zone_boot_hrtime;
 	system_misc_kstat.nsec_per_tick.value.ui32	= (uint32_t)
 	    nsec_per_tick;
 	return (0);
--- old/usr/src/uts/common/os/zone.c	Fri Jan 29 20:31:01 2016
+++ new/usr/src/uts/common/os/zone.c	Fri Jan 29 20:31:01 2016
@@ -22,6 +22,7 @@
 /*
  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2013, Joyent Inc. All rights reserved.
+ * Copyright 2016 Garrett D'Amore
  */
 
 /*
@@ -1837,6 +1838,8 @@
 	scalehrtime(&tmp);
 	zmp->zm_wtime.value.ui64 = tmp;
 
+	zmp->zm_boot_hrtime.value.t = zone->zone_boot_hrtime;
+
 	zmp->zm_avenrun1.value.ui32 = zone->zone_avenrun[0];
 	zmp->zm_avenrun5.value.ui32 = zone->zone_avenrun[1];
 	zmp->zm_avenrun15.value.ui32 = zone->zone_avenrun[2];
@@ -1884,6 +1887,7 @@
 	    KSTAT_DATA_UINT32);
 	kstat_named_init(&zmp->zm_ffnomem, "forkfail_nomem", KSTAT_DATA_UINT32);
 	kstat_named_init(&zmp->zm_ffmisc, "forkfail_misc", KSTAT_DATA_UINT32);
+	kstat_named_init(&zmp->zm_boot_hrtime, "boot_hrtime", KSTAT_DATA_TIME);
 
 
 	ksp->ks_update = zone_misc_kstat_update;
@@ -3965,6 +3969,7 @@
 			mutex_exit(&zone_status_lock);
 		} else {
 			zone->zone_boot_time = gethrestime_sec();
+			zone->zone_boot_hrtime = gethrtime();
 		}
 
 		pool_unlock();
--- old/usr/src/uts/common/sys/zone.h	Fri Jan 29 20:31:01 2016
+++ new/usr/src/uts/common/sys/zone.h	Fri Jan 29 20:31:01 2016
@@ -23,6 +23,7 @@
  * Copyright 2013, Joyent, Inc. All rights reserved.
  * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
  * Copyright 2014 Igor Kozhukhov <ikozhukhov@gmail.com>.
+ * Copyright 2016 Garrett D'Amore
  */
 
 #ifndef _SYS_ZONE_H
@@ -399,6 +400,7 @@
 	kstat_named_t	zm_ffnoproc;
 	kstat_named_t	zm_ffnomem;
 	kstat_named_t	zm_ffmisc;
+	kstat_named_t	zm_boot_hrtime;
 } zone_misc_kstat_t;
 
 typedef struct zone {
@@ -516,6 +518,7 @@
 	psetid_t	zone_psetid;	/* pset the zone is bound to */
 
 	time_t		zone_boot_time;	/* Similar to boot_time */
+	hrtime_t	zone_boot_hrtime; /* gethrtime() at zone boot */
 
 	/*
 	 * The following two can be read without holding any locks.  They are
