Print this page
10924 Need mitigation of L1TF (CVE-2018-3646)
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Peter Tribble <peter.tribble@gmail.com>
*** 20,29 ****
--- 20,30 ----
*/
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2018 Western Digital Corporation. All rights reserved.
+ * Copyright 2018 Joyent, Inc.
*/
#include <sys/cpuvar.h>
#include <sys/cpu_event.h>
#include <sys/param.h>
*** 66,75 ****
--- 67,77 ----
#include <sys/x_call.h>
#include <sys/reboot.h>
#include <vm/hat_i86.h>
#include <sys/stack.h>
#include <sys/apix.h>
+ #include <sys/ht.h>
static void apix_post_hardint(int);
/*
* Insert an vector into the tail of the interrupt pending list
*** 278,287 ****
--- 280,290 ----
ASSERT(SA((uintptr_t)stackptr) == (uintptr_t)stackptr);
t->t_sp = (uintptr_t)stackptr;
it->t_intr = t;
cpu->cpu_thread = it;
+ ht_begin_intr(pil);
/*
* Set bit for this pil in CPU's interrupt active bitmask.
*/
ASSERT((cpu->cpu_intr_actv & (1 << pil)) == 0);
*** 348,358 ****
--- 351,363 ----
panic("dosoftint_epilog: swtch returned");
}
it->t_link = cpu->cpu_intr_thread;
cpu->cpu_intr_thread = it;
it->t_state = TS_FREE;
+ ht_end_intr();
cpu->cpu_thread = t;
+
if (t->t_flag & T_INTR_THREAD)
t->t_intr_start = now;
basespl = cpu->cpu_base_spl;
pil = MAX(oldpil, basespl);
mcpu->mcpu_pri = pil;
*** 464,473 ****
--- 469,480 ----
cpu->cpu_intracct[cpu->cpu_mstate] += intrtime;
t->t_intr_start = 0;
}
}
+ ht_begin_intr(pil);
+
/* store starting timestamp in CPu structure for this IPL */
mcpu->pil_high_start[pil - (LOCK_LEVEL + 1)] = now;
if (pil == 15) {
/*
*** 554,563 ****
--- 561,572 ----
if (t->t_flag & T_INTR_THREAD)
t->t_intr_start = now;
}
+ ht_end_intr();
+
mcpu->mcpu_pri = oldpil;
if (pil < CBE_HIGH_PIL)
(void) (*setlvlx)(oldpil, 0);
return (mask);
*** 666,675 ****
--- 675,685 ----
* they're TS_FREE.)
*/
it->t_state = TS_ONPROC;
cpu->cpu_thread = it;
+ ht_begin_intr(pil);
/*
* Initialize thread priority level from intr_pri
*/
it->t_pil = (uchar_t)pil;
*** 754,764 ****
--- 764,776 ----
*/
it->t_link = cpu->cpu_intr_thread;
cpu->cpu_intr_thread = it;
it->t_state = TS_FREE;
+ ht_end_intr();
cpu->cpu_thread = t;
+
if (t->t_flag & T_INTR_THREAD)
t->t_intr_start = now;
basespl = cpu->cpu_base_spl;
mcpu->mcpu_pri = MAX(oldpil, basespl);
(*setlvlx)(mcpu->mcpu_pri, 0);