Print this page
8956 Implement KPTI
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
*** 18,27 ****
--- 18,28 ----
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2018 Joyent, Inc.
*/
/* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
/* Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T */
/* All Rights Reserved */
*** 58,67 ****
--- 59,69 ----
#include <vm/faultcode.h>
#include <sys/fp.h>
#include <sys/cmn_err.h>
#include <sys/segments.h>
#include <sys/clock.h>
+ #include <vm/hat_i86.h>
#if defined(__xpv)
#include <sys/hypervisor.h>
#include <sys/note.h>
#endif
*** 344,354 ****
{
#if defined(__xpv)
xen_set_ldt(get_ssd_base(&curproc->p_ldt_desc),
curproc->p_ldtlimit + 1);
#else
! *((system_desc_t *)&CPU->cpu_gdt[GDT_LDT]) = curproc->p_ldt_desc;
wr_ldtr(ULDT_SEL);
#endif
}
/*
--- 346,368 ----
{
#if defined(__xpv)
xen_set_ldt(get_ssd_base(&curproc->p_ldt_desc),
curproc->p_ldtlimit + 1);
#else
! size_t len;
! system_desc_t desc;
!
! /*
! * Before we can use the LDT on this CPU, we must install the LDT in the
! * user mapping table.
! */
! len = (curproc->p_ldtlimit + 1) * sizeof (user_desc_t);
! bcopy(curproc->p_ldt, CPU->cpu_m.mcpu_ldt, len);
! CPU->cpu_m.mcpu_ldt_len = len;
! set_syssegd(&desc, CPU->cpu_m.mcpu_ldt, len - 1, SDT_SYSLDT, SEL_KPL);
! *((system_desc_t *)&CPU->cpu_gdt[GDT_LDT]) = desc;
!
wr_ldtr(ULDT_SEL);
#endif
}
/*
*** 361,370 ****
--- 375,387 ----
#if defined(__xpv)
xen_set_ldt(NULL, 0);
#else
*((system_desc_t *)&CPU->cpu_gdt[GDT_LDT]) = null_sdesc;
wr_ldtr(0);
+
+ bzero(CPU->cpu_m.mcpu_ldt, CPU->cpu_m.mcpu_ldt_len);
+ CPU->cpu_m.mcpu_ldt_len = 0;
#endif
}
/*ARGSUSED*/
static void
*** 712,722 ****
ASSERT(MUTEX_HELD(&pp->p_ldtlock));
ASSERT(pp->p_ldt == NULL);
ASSERT(pp->p_ldtlimit == 0);
/*
! * Allocate new LDT just large enough to contain seli.
*/
ldtsz = P2ROUNDUP((seli + 1) * sizeof (user_desc_t), PAGESIZE);
nsels = ldtsz / sizeof (user_desc_t);
ASSERT(nsels >= MINNLDT && nsels <= MAXNLDT);
--- 729,740 ----
ASSERT(MUTEX_HELD(&pp->p_ldtlock));
ASSERT(pp->p_ldt == NULL);
ASSERT(pp->p_ldtlimit == 0);
/*
! * Allocate new LDT just large enough to contain seli. The LDT must
! * always be allocated in units of pages for KPTI.
*/
ldtsz = P2ROUNDUP((seli + 1) * sizeof (user_desc_t), PAGESIZE);
nsels = ldtsz / sizeof (user_desc_t);
ASSERT(nsels >= MINNLDT && nsels <= MAXNLDT);
*** 830,840 ****
ASSERT(MUTEX_HELD(&pp->p_ldtlock));
ASSERT(pp->p_ldt != NULL);
ASSERT(pp->p_ldtlimit != 0);
/*
! * Allocate larger LDT just large enough to contain seli.
*/
nldtsz = P2ROUNDUP((seli + 1) * sizeof (user_desc_t), PAGESIZE);
nsels = nldtsz / sizeof (user_desc_t);
ASSERT(nsels >= MINNLDT && nsels <= MAXNLDT);
ASSERT(nsels > pp->p_ldtlimit);
--- 848,859 ----
ASSERT(MUTEX_HELD(&pp->p_ldtlock));
ASSERT(pp->p_ldt != NULL);
ASSERT(pp->p_ldtlimit != 0);
/*
! * Allocate larger LDT just large enough to contain seli. The LDT must
! * always be allocated in units of pages for KPTI.
*/
nldtsz = P2ROUNDUP((seli + 1) * sizeof (user_desc_t), PAGESIZE);
nsels = nldtsz / sizeof (user_desc_t);
ASSERT(nsels >= MINNLDT && nsels <= MAXNLDT);
ASSERT(nsels > pp->p_ldtlimit);