summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2019-05-16 14:00:18 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2019-05-16 14:00:18 +0000
commit171c41516455d5579f0096ea3661f70562231175 (patch)
tree083ede1441a88d4693fa130f8ffb11507a0af226
parent478ff45c989d01e21a206c186c3466cea487dd37 (diff)
downloadillumos-joyent-171c41516455d5579f0096ea3661f70562231175.tar.gz
10924 Need mitigation of L1TF (CVE-2018-3646) [fix mismerge problems]
-rw-r--r--usr/src/pkg/manifests/system-header.mf2
-rw-r--r--usr/src/uts/i86pc/Makefile.files1
-rw-r--r--usr/src/uts/i86pc/os/ht.c613
-rw-r--r--usr/src/uts/i86pc/sys/ht.h47
-rw-r--r--usr/src/uts/i86xpv/Makefile.files1
-rw-r--r--usr/src/uts/intel/zfs/Makefile1
-rw-r--r--usr/src/uts/sun4/sys/ht.h38
-rw-r--r--usr/src/uts/sun4u/sys/Makefile1
-rw-r--r--usr/src/uts/sun4v/sys/Makefile1
9 files changed, 0 insertions, 705 deletions
diff --git a/usr/src/pkg/manifests/system-header.mf b/usr/src/pkg/manifests/system-header.mf
index 70ef6cd9e6..146662d218 100644
--- a/usr/src/pkg/manifests/system-header.mf
+++ b/usr/src/pkg/manifests/system-header.mf
@@ -1737,7 +1737,6 @@ $(sparc_ONLY)file path=usr/platform/sun4u/include/sys/errclassify.h
$(sparc_ONLY)file path=usr/platform/sun4u/include/sys/fhc.h
$(sparc_ONLY)file path=usr/platform/sun4u/include/sys/gpio_87317.h
$(sparc_ONLY)file path=usr/platform/sun4u/include/sys/hpc3130_events.h
-$(sparc_ONLY)file path=usr/platform/sun4u/include/sys/ht.h
$(sparc_ONLY)file path=usr/platform/sun4u/include/sys/i2c/clients/hpc3130.h
$(sparc_ONLY)file path=usr/platform/sun4u/include/sys/i2c/clients/i2c_client.h
$(sparc_ONLY)file path=usr/platform/sun4u/include/sys/i2c/clients/lm75.h
@@ -1801,7 +1800,6 @@ $(sparc_ONLY)file path=usr/platform/sun4v/include/sys/dvma.h
$(sparc_ONLY)file path=usr/platform/sun4v/include/sys/eeprom.h
$(sparc_ONLY)file path=usr/platform/sun4v/include/sys/fcode.h
$(sparc_ONLY)file path=usr/platform/sun4v/include/sys/hsvc.h
-$(sparc_ONLY)file path=usr/platform/sun4v/include/sys/ht.h
$(sparc_ONLY)file path=usr/platform/sun4v/include/sys/hypervisor_api.h
$(sparc_ONLY)file path=usr/platform/sun4v/include/sys/idprom.h
$(sparc_ONLY)file path=usr/platform/sun4v/include/sys/intr.h
diff --git a/usr/src/uts/i86pc/Makefile.files b/usr/src/uts/i86pc/Makefile.files
index dbd6f73437..e33bb30c87 100644
--- a/usr/src/uts/i86pc/Makefile.files
+++ b/usr/src/uts/i86pc/Makefile.files
@@ -71,7 +71,6 @@ CORE_OBJS += \
hment.o \
hold_page.o \
hrtimers.o \
- ht.o \
htable.o \
hypercall.o \
hypersubr.o \
diff --git a/usr/src/uts/i86pc/os/ht.c b/usr/src/uts/i86pc/os/ht.c
deleted file mode 100644
index 6e13eaedae..0000000000
--- a/usr/src/uts/i86pc/os/ht.c
+++ /dev/null
@@ -1,613 +0,0 @@
-/*
- * This file and its contents are supplied under the terms of the
- * Common Development and Distribution License ("CDDL"), version 1.0.
- * You may only use this file in accordance with the terms of version
- * 1.0 of the CDDL.
- *
- * A full copy of the text of the CDDL should have accompanied this
- * source. A copy of the CDDL is also available via the Internet at
- * http://www.illumos.org/license/CDDL.
- */
-
-/*
- * Copyright 2018 Joyent, Inc.
- */
-
-/*
- * HT exclusion: prevent a sibling in a hyper-threaded core from running in VMX
- * non-root guest mode, when certain threads are running on the other sibling.
- * This avoids speculation-based information leaks such as L1TF being available
- * to the untrusted guest. The stance we take is that threads from the same
- * zone as the guest VPCU thread are considered safe to run alongside, but all
- * other threads (except the idle thread), and all interrupts, are unsafe. Note
- * that due to the implementation here, there are significant sections of e.g.
- * the dispatcher code that can run concurrently with a guest, until the thread
- * reaches ht_mark(). This code assumes there are only two HT threads per core.
- *
- * The entry points are as follows:
- *
- * ht_mark_as_vcpu()
- *
- * All threads that enter guest mode (i.e. VCPU threads) need to call this at
- * least once, which sets TS_VCPU in ->t_schedflag.
- *
- * ht_mark()
- *
- * A new ->cpu_thread is now curthread (although interrupt threads have their
- * own separate handling). After preventing any interrupts, we will take our
- * own CPU's spinlock and update our own state in mcpu_ht.
- *
- * If our sibling is poisoned (i.e. in guest mode or the little bit of code
- * around it), and we're not compatible (that is, same zone ID, or the idle
- * thread), then we need to ht_kick() that sibling. ht_kick() itself waits for
- * the sibling to call ht_release(), and it will not re-enter guest mode until
- * allowed.
- *
- * Note that we ignore the fact a process can change its zone ID: poisoning
- * threads never do so, and we can ignore the other cases.
- *
- * ht_acquire()
- *
- * We are a VCPU thread about to start guest execution. Interrupts are
- * disabled. We must have already run ht_mark() to be in this code, so there's
- * no need to take our *own* spinlock in order to mark ourselves as CM_POISONED.
- * Instead, we take our sibling's lock to also mark ourselves as poisoned in the
- * sibling cpu_ht_t. This is so ht_mark() will only ever need to look at its
- * local mcpu_ht.
- *
- * We'll loop here for up to ht_acquire_wait_time microseconds; this is mainly
- * to wait out any sibling interrupt: many of them will complete quicker than
- * this.
- *
- * Finally, if we succeeded in acquiring the core, we'll flush the L1 cache as
- * mitigation against L1TF: no incompatible thread will now be able to populate
- * the L1 cache until *we* ht_release().
- *
- * ht_release()
- *
- * Simply unpoison ourselves similarly to ht_acquire(); ht_kick() will wait for
- * this to happen if needed.
- *
- * ht_begin_intr()
- *
- * In an interrupt prolog. We're either a hilevel interrupt, or a pinning
- * interrupt. In both cases, we mark our interrupt depth, and potentially
- * ht_kick(). This enforces exclusion, but doesn't otherwise modify ->ch_state:
- * we want the dispatcher code to essentially ignore interrupts.
- *
- * ht_end_intr()
- *
- * In an interrupt epilogue *or* thread_unpin(). In the first case, we never
- * slept, and we can simply decrement our counter. In the second case, we're an
- * interrupt thread about to sleep: we'll still just decrement our counter, and
- * henceforth treat the thread as a normal thread when it next gets scheduled,
- * until it finally gets to its epilogue.
- *
- * ht_mark_unsafe() / ht_mark_safe()
- *
- * Mark the current thread as temporarily unsafe (guests should not be executing
- * while a sibling is marked unsafe). This can be used for a thread that's
- * otherwise considered safe, if it needs to handle potentially sensitive data.
- * Right now, this means certain I/O handling operations that reach down into
- * the networking and ZFS sub-systems.
- *
- * ht_should_run(thread, cpu)
- *
- * This is used by the dispatcher when making scheduling decisions: if the
- * sibling is compatible with the given thread, we return B_TRUE. This is
- * essentially trying to guess if any subsequent ht_acquire() will fail, by
- * peeking at the sibling CPU's state. The peek is racy, but if we get things
- * wrong, the "only" consequence is that ht_acquire() may lose.
- *
- * ht_adjust_cpu_score()
- *
- * Used when scoring other CPUs in disp_lowpri_cpu(). If we shouldn't run here,
- * we'll add a small penalty to the score. This also makes sure a VCPU thread
- * migration behaves properly.
- */
-
-#include <sys/archsystm.h>
-#include <sys/disp.h>
-#include <sys/cmt.h>
-#include <sys/systm.h>
-#include <sys/cpu.h>
-#include <sys/var.h>
-#include <sys/xc_levels.h>
-#include <sys/cmn_err.h>
-#include <sys/sysmacros.h>
-#include <sys/x86_archext.h>
-
-#define CS_SHIFT (8)
-#define CS_MASK ((1 << CS_SHIFT) - 1)
-#define CS_MARK(s) ((s) & CS_MASK)
-#define CS_ZONE(s) ((s) >> CS_SHIFT)
-#define CS_MK(s, z) ((s) | (z << CS_SHIFT))
-
-typedef enum ch_mark {
- CM_IDLE = 0, /* running CPU idle thread */
- CM_THREAD, /* running general non-VCPU thread */
- CM_UNSAFE, /* running ->t_unsafe thread */
- CM_VCPU, /* running VCPU thread */
- CM_POISONED /* running in guest */
-} ch_mark_t;
-
-/* Double-check our false-sharing padding. */
-CTASSERT(offsetof(cpu_ht_t, ch_sib) == 64);
-CTASSERT(CM_IDLE == 0);
-CTASSERT(CM_POISONED < (1 << CS_SHIFT));
-CTASSERT(CM_POISONED > CM_VCPU);
-CTASSERT(CM_VCPU > CM_UNSAFE);
-
-static uint_t empty_pil = XC_CPUPOKE_PIL;
-
-/*
- * If disabled, no HT exclusion is performed, and system is potentially
- * vulnerable to L1TF if hyper-threading is enabled, and we don't have the "not
- * vulnerable" CPUID bit.
- */
-int ht_exclusion = 1;
-
-/*
- * How long ht_acquire() will spin trying to acquire the core, in micro-seconds.
- * This is enough time to wait out a significant proportion of interrupts.
- */
-clock_t ht_acquire_wait_time = 64;
-
-static cpu_t *
-ht_find_sibling(cpu_t *cp)
-{
- for (uint_t i = 0; i < GROUP_SIZE(&cp->cpu_pg->cmt_pgs); i++) {
- pg_cmt_t *pg = GROUP_ACCESS(&cp->cpu_pg->cmt_pgs, i);
- group_t *cg = &pg->cmt_pg.pghw_pg.pg_cpus;
-
- if (pg->cmt_pg.pghw_hw != PGHW_IPIPE)
- continue;
-
- if (GROUP_SIZE(cg) == 1)
- break;
-
- VERIFY3U(GROUP_SIZE(cg), ==, 2);
-
- if (GROUP_ACCESS(cg, 0) != cp)
- return (GROUP_ACCESS(cg, 0));
-
- VERIFY3P(GROUP_ACCESS(cg, 1), !=, cp);
-
- return (GROUP_ACCESS(cg, 1));
- }
-
- return (NULL);
-}
-
-/*
- * Initialize HT links. We have to be careful here not to race with
- * ht_begin/end_intr(), which also complicates trying to do this initialization
- * from a cross-call; hence the slightly odd approach below.
- */
-void
-ht_init(void)
-{
- cpu_t *scp = CPU;
- cpu_t *cp = scp;
- ulong_t flags;
-
- if (!ht_exclusion)
- return;
-
- mutex_enter(&cpu_lock);
-
- do {
- thread_affinity_set(curthread, cp->cpu_id);
- flags = intr_clear();
-
- cp->cpu_m.mcpu_ht.ch_intr_depth = 0;
- cp->cpu_m.mcpu_ht.ch_state = CS_MK(CM_THREAD, GLOBAL_ZONEID);
- cp->cpu_m.mcpu_ht.ch_sibstate = CS_MK(CM_THREAD, GLOBAL_ZONEID);
- ASSERT3P(cp->cpu_m.mcpu_ht.ch_sib, ==, NULL);
- cp->cpu_m.mcpu_ht.ch_sib = ht_find_sibling(cp);
-
- intr_restore(flags);
- thread_affinity_clear(curthread);
- } while ((cp = cp->cpu_next_onln) != scp);
-
- mutex_exit(&cpu_lock);
-}
-
-/*
- * We're adding an interrupt handler of some kind at the given PIL. If this
- * happens to be the same PIL as XC_CPUPOKE_PIL, then we need to disable our
- * pil_needs_kick() optimization, as there is now potentially an unsafe
- * interrupt handler at that PIL. This typically won't occur, so we're not that
- * careful about what's actually getting added, which CPU it's on, or if it gets
- * removed. This also presumes that softints can't cover our empty_pil.
- */
-void
-ht_intr_alloc_pil(uint_t pil)
-{
- ASSERT(pil <= PIL_MAX);
-
- if (empty_pil == pil)
- empty_pil = PIL_MAX + 1;
-}
-
-/*
- * If our sibling is also a VCPU thread from a different zone, we need one of
- * them to give up, otherwise they will just battle each other for exclusion
- * until they exhaust their quantum.
- *
- * We arbitrate between them by dispatch priority: clearly, a higher-priority
- * thread deserves to win the acquisition. However, under CPU load, it'll be
- * very common to see both threads with ->t_pri == 1. If so, we'll break the
- * tie by cpu_id (which is hopefully arbitrary enough).
- *
- * If we lose, the VMM code will take this as a hint to call
- * thread_affinity_set(CPU_BEST), which will likely migrate the VCPU thread
- * somewhere else.
- *
- * Note that all of this state examination is racy, as we don't own any locks
- * here.
- */
-static boolean_t
-yield_to_vcpu(cpu_t *sib, zoneid_t zoneid)
-{
- cpu_ht_t *sibht = &sib->cpu_m.mcpu_ht;
- uint64_t sibstate = sibht->ch_state;
-
- /*
- * If we're likely just waiting for an interrupt, don't yield.
- */
- if (sibht->ch_intr_depth != 0)
- return (B_FALSE);
-
- /*
- * We're only interested in VCPUs from a different zone.
- */
- if (CS_MARK(sibstate) < CM_VCPU || CS_ZONE(sibstate) == zoneid)
- return (B_FALSE);
-
- if (curthread->t_pri < sib->cpu_dispatch_pri)
- return (B_TRUE);
-
- if (curthread->t_pri == sib->cpu_dispatch_pri &&
- CPU->cpu_id < sib->cpu_id)
- return (B_TRUE);
-
- return (B_FALSE);
-}
-
-static inline boolean_t
-sibling_compatible(cpu_ht_t *sibht, zoneid_t zoneid)
-{
- uint64_t sibstate = sibht->ch_state;
-
- if (sibht->ch_intr_depth != 0)
- return (B_FALSE);
-
- if (CS_MARK(sibstate) == CM_UNSAFE)
- return (B_FALSE);
-
- if (CS_MARK(sibstate) == CM_IDLE)
- return (B_TRUE);
-
- return (CS_ZONE(sibstate) == zoneid);
-}
-
-int
-ht_acquire(void)
-{
- clock_t wait = ht_acquire_wait_time;
- cpu_ht_t *ht = &CPU->cpu_m.mcpu_ht;
- zoneid_t zoneid = getzoneid();
- cpu_ht_t *sibht;
- int ret = 0;
-
- ASSERT(!interrupts_enabled());
-
- if (ht->ch_sib == NULL) {
- /* For the "sequential" L1TF case. */
- spec_l1d_flush();
- return (1);
- }
-
- sibht = &ht->ch_sib->cpu_m.mcpu_ht;
-
- /* A VCPU thread should never change zone. */
- ASSERT3U(CS_ZONE(ht->ch_state), ==, zoneid);
- ASSERT3U(CS_MARK(ht->ch_state), ==, CM_VCPU);
- ASSERT3U(zoneid, !=, GLOBAL_ZONEID);
- ASSERT3U(curthread->t_preempt, >=, 1);
- ASSERT(curthread->t_schedflag & TS_VCPU);
-
- while (ret == 0 && wait > 0) {
-
- if (yield_to_vcpu(ht->ch_sib, zoneid)) {
- ret = -1;
- break;
- }
-
- if (sibling_compatible(sibht, zoneid)) {
- lock_set(&sibht->ch_lock);
-
- if (sibling_compatible(sibht, zoneid)) {
- ht->ch_state = CS_MK(CM_POISONED, zoneid);
- sibht->ch_sibstate = CS_MK(CM_POISONED, zoneid);
- membar_enter();
- ret = 1;
- }
-
- lock_clear(&sibht->ch_lock);
- } else {
- drv_usecwait(10);
- wait -= 10;
- }
- }
-
- DTRACE_PROBE4(ht__acquire, int, ret, uint64_t, sibht->ch_state,
- uint64_t, sibht->ch_intr_depth, clock_t, wait);
-
- if (ret == 1)
- spec_l1d_flush();
-
- return (ret);
-}
-
-void
-ht_release(void)
-{
- cpu_ht_t *ht = &CPU->cpu_m.mcpu_ht;
- zoneid_t zoneid = getzoneid();
- cpu_ht_t *sibht;
-
- ASSERT(!interrupts_enabled());
-
- if (ht->ch_sib == NULL)
- return;
-
- ASSERT3U(zoneid, !=, GLOBAL_ZONEID);
- ASSERT3U(CS_ZONE(ht->ch_state), ==, zoneid);
- ASSERT3U(CS_MARK(ht->ch_state), ==, CM_POISONED);
- ASSERT3U(curthread->t_preempt, >=, 1);
-
- sibht = &ht->ch_sib->cpu_m.mcpu_ht;
-
- lock_set(&sibht->ch_lock);
-
- ht->ch_state = CS_MK(CM_VCPU, zoneid);
- sibht->ch_sibstate = CS_MK(CM_VCPU, zoneid);
- membar_producer();
-
- lock_clear(&sibht->ch_lock);
-}
-
-static void
-ht_kick(cpu_ht_t *ht, zoneid_t zoneid)
-{
- uint64_t sibstate;
-
- ASSERT(LOCK_HELD(&ht->ch_lock));
- ASSERT(!interrupts_enabled());
-
- poke_cpu(ht->ch_sib->cpu_id);
-
- membar_consumer();
- sibstate = ht->ch_sibstate;
-
- if (CS_MARK(sibstate) != CM_POISONED || CS_ZONE(sibstate) == zoneid)
- return;
-
- lock_clear(&ht->ch_lock);
-
- /*
- * Spin until we can see the sibling has been kicked out or is otherwise
- * OK.
- */
- for (;;) {
- membar_consumer();
- sibstate = ht->ch_sibstate;
-
- if (CS_MARK(sibstate) != CM_POISONED ||
- CS_ZONE(sibstate) == zoneid)
- break;
-
- SMT_PAUSE();
- }
-
- lock_set(&ht->ch_lock);
-}
-
-static boolean_t
-pil_needs_kick(uint_t pil)
-{
- return (pil != empty_pil);
-}
-
-void
-ht_begin_intr(uint_t pil)
-{
- ulong_t flags;
- cpu_ht_t *ht;
-
- ASSERT(pil <= PIL_MAX);
-
- flags = intr_clear();
- ht = &CPU->cpu_m.mcpu_ht;
-
- if (ht->ch_sib == NULL) {
- intr_restore(flags);
- return;
- }
-
- if (atomic_inc_64_nv(&ht->ch_intr_depth) == 1 && pil_needs_kick(pil)) {
- lock_set(&ht->ch_lock);
-
- membar_consumer();
-
- if (CS_MARK(ht->ch_sibstate) == CM_POISONED)
- ht_kick(ht, GLOBAL_ZONEID);
-
- lock_clear(&ht->ch_lock);
- }
-
- intr_restore(flags);
-}
-
-void
-ht_end_intr(void)
-{
- ulong_t flags;
- cpu_ht_t *ht;
-
- flags = intr_clear();
- ht = &CPU->cpu_m.mcpu_ht;
-
- if (ht->ch_sib == NULL) {
- intr_restore(flags);
- return;
- }
-
- ASSERT3U(ht->ch_intr_depth, >, 0);
- atomic_dec_64(&ht->ch_intr_depth);
-
- intr_restore(flags);
-}
-
-static inline boolean_t
-ht_need_kick(cpu_ht_t *ht, zoneid_t zoneid)
-{
- membar_consumer();
-
- if (CS_MARK(ht->ch_sibstate) != CM_POISONED)
- return (B_FALSE);
-
- if (CS_MARK(ht->ch_state) == CM_UNSAFE)
- return (B_TRUE);
-
- return (CS_ZONE(ht->ch_sibstate) != zoneid);
-}
-
-void
-ht_mark(void)
-{
- zoneid_t zoneid = getzoneid();
- kthread_t *t = curthread;
- ulong_t flags;
- cpu_ht_t *ht;
- cpu_t *cp;
-
- flags = intr_clear();
-
- cp = CPU;
- ht = &cp->cpu_m.mcpu_ht;
-
- if (ht->ch_sib == NULL) {
- intr_restore(flags);
- return;
- }
-
- lock_set(&ht->ch_lock);
-
- /*
- * If we were a nested interrupt and went through the resume_from_intr()
- * path, we can now be resuming to a pinning interrupt thread; in which
- * case, skip marking, until we later resume to a "real" thread.
- */
- if (ht->ch_intr_depth > 0) {
- ASSERT3P(t->t_intr, !=, NULL);
-
- if (ht_need_kick(ht, zoneid))
- ht_kick(ht, zoneid);
- goto out;
- }
-
- if (t == t->t_cpu->cpu_idle_thread) {
- ASSERT3U(zoneid, ==, GLOBAL_ZONEID);
- ht->ch_state = CS_MK(CM_IDLE, zoneid);
- } else {
- uint64_t state = CM_THREAD;
-
- if (t->t_unsafe)
- state = CM_UNSAFE;
- else if (t->t_schedflag & TS_VCPU)
- state = CM_VCPU;
-
- ht->ch_state = CS_MK(state, zoneid);
-
- if (ht_need_kick(ht, zoneid))
- ht_kick(ht, zoneid);
- }
-
-out:
- membar_producer();
- lock_clear(&ht->ch_lock);
- intr_restore(flags);
-}
-
-void
-ht_begin_unsafe(void)
-{
- curthread->t_unsafe++;
- ht_mark();
-}
-
-void
-ht_end_unsafe(void)
-{
- ASSERT3U(curthread->t_unsafe, >, 0);
- curthread->t_unsafe--;
- ht_mark();
-}
-
-void
-ht_mark_as_vcpu(void)
-{
- thread_lock(curthread);
- curthread->t_schedflag |= TS_VCPU;
- ht_mark();
- thread_unlock(curthread);
-}
-
-boolean_t
-ht_should_run(kthread_t *t, cpu_t *cp)
-{
- uint64_t sibstate;
- cpu_t *sib;
-
- if (t == t->t_cpu->cpu_idle_thread)
- return (B_TRUE);
-
- if ((sib = cp->cpu_m.mcpu_ht.ch_sib) == NULL)
- return (B_TRUE);
-
- sibstate = sib->cpu_m.mcpu_ht.ch_state;
-
- if ((t->t_schedflag & TS_VCPU)) {
- if (CS_MARK(sibstate) == CM_IDLE)
- return (B_TRUE);
- if (CS_MARK(sibstate) == CM_UNSAFE)
- return (B_FALSE);
- return (CS_ZONE(sibstate) == ttozone(t)->zone_id);
- }
-
- if (CS_MARK(sibstate) < CM_VCPU)
- return (B_TRUE);
-
- return (CS_ZONE(sibstate) == ttozone(t)->zone_id);
-}
-
-pri_t
-ht_adjust_cpu_score(kthread_t *t, struct cpu *cp, pri_t score)
-{
- if (ht_should_run(t, cp))
- return (score);
-
- /*
- * If we're a VCPU thread scoring our current CPU, we are most likely
- * asking to be rescheduled elsewhere after losing ht_acquire(). In
- * this case, the current CPU is not a good choice, most likely, and we
- * should go elsewhere.
- */
- if ((t->t_schedflag & TS_VCPU) && cp == t->t_cpu && score < 0)
- return ((v.v_maxsyspri + 1) * 2);
-
- return (score + 1);
-}
diff --git a/usr/src/uts/i86pc/sys/ht.h b/usr/src/uts/i86pc/sys/ht.h
deleted file mode 100644
index 8bb5a0d6d2..0000000000
--- a/usr/src/uts/i86pc/sys/ht.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * This file and its contents are supplied under the terms of the
- * Common Development and Distribution License ("CDDL"), version 1.0.
- * You may only use this file in accordance with the terms of version
- * 1.0 of the CDDL.
- *
- * A full copy of the text of the CDDL should have accompanied this
- * source. A copy of the CDDL is also available via the Internet at
- * http://www.illumos.org/license/CDDL.
- */
-
-/*
- * Copyright 2018 Joyent, Inc.
- */
-
-#ifndef _SYS_HT_H
-#define _SYS_HT_H
-
-#include <sys/types.h>
-#include <sys/thread.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct cpu;
-
-extern void ht_init(void);
-extern void ht_intr_alloc_pil(uint_t);
-
-extern int ht_acquire(void);
-extern void ht_release(void);
-extern void ht_mark(void);
-extern void ht_begin_unsafe(void);
-extern void ht_end_unsafe(void);
-extern void ht_begin_intr(uint_t);
-extern void ht_end_intr(void);
-extern void ht_mark_as_vcpu(void);
-
-extern boolean_t ht_should_run(kthread_t *, struct cpu *);
-extern pri_t ht_adjust_cpu_score(kthread_t *, struct cpu *, pri_t);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_HT_H */
diff --git a/usr/src/uts/i86xpv/Makefile.files b/usr/src/uts/i86xpv/Makefile.files
index a040ecf0da..2362519fc7 100644
--- a/usr/src/uts/i86xpv/Makefile.files
+++ b/usr/src/uts/i86xpv/Makefile.files
@@ -61,7 +61,6 @@ CORE_OBJS += \
hment.o \
hold_page.o \
hrtimers.o \
- ht.o \
htable.o \
i86_mmu.o \
ibft.o \
diff --git a/usr/src/uts/intel/zfs/Makefile b/usr/src/uts/intel/zfs/Makefile
index 18569006d8..698d3bd8fa 100644
--- a/usr/src/uts/intel/zfs/Makefile
+++ b/usr/src/uts/intel/zfs/Makefile
@@ -74,7 +74,6 @@ INC_PATH += -I$(SRC)/common
INC_PATH += -I$(COMMONBASE)/zfs
INC_PATH += -I$(UTSBASE)/i86pc
-CPPFLAGS += -I$(UTSBASE)/i86pc
C99LMODE= -Xc99=%all
#
diff --git a/usr/src/uts/sun4/sys/ht.h b/usr/src/uts/sun4/sys/ht.h
deleted file mode 100644
index 6d7b3e37cc..0000000000
--- a/usr/src/uts/sun4/sys/ht.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * This file and its contents are supplied under the terms of the
- * Common Development and Distribution License ("CDDL"), version 1.0.
- * You may only use this file in accordance with the terms of version
- * 1.0 of the CDDL.
- *
- * A full copy of the text of the CDDL should have accompanied this
- * source. A copy of the CDDL is also available via the Internet at
- * http://www.illumos.org/license/CDDL.
- */
-
-/*
- * Copyright 2018 Joyent, Inc.
- */
-
-#ifndef _SYS_HT_H
-#define _SYS_HT_H
-
-#include <sys/types.h>
-#include <sys/thread.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define ht_init() {}
-
-#define ht_should_run(t, c) (B_TRUE)
-#define ht_adjust_cpu_score(t, c, p) (p)
-#define ht_begin_unsafe(void) {}
-#define ht_end_unsafe(void) {}
-#define ht_end_intr(void) {}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_HT_H */
diff --git a/usr/src/uts/sun4u/sys/Makefile b/usr/src/uts/sun4u/sys/Makefile
index c96dc0afad..34aad1b282 100644
--- a/usr/src/uts/sun4u/sys/Makefile
+++ b/usr/src/uts/sun4u/sys/Makefile
@@ -48,7 +48,6 @@ SUN4_HDRS= \
errclassify.h \
fcode.h \
fc_plat.h \
- ht.h \
idprom.h \
intr.h \
intreg.h \
diff --git a/usr/src/uts/sun4v/sys/Makefile b/usr/src/uts/sun4v/sys/Makefile
index 7061019749..025ce96e9a 100644
--- a/usr/src/uts/sun4v/sys/Makefile
+++ b/usr/src/uts/sun4v/sys/Makefile
@@ -46,7 +46,6 @@ SUN4_HDRS= \
dvma.h \
eeprom.h \
fcode.h \
- ht.h \
idprom.h \
intr.h \
intreg.h \