svn commit: r358849 - in projects/clang1000-import: lib/libusb sys/amd64/vmm/intel sys/amd64/vmm/io sys/compat/linux sys/sys
Dimitry Andric
dim at FreeBSD.org
Tue Mar 10 17:49:12 UTC 2020
Author: dim
Date: Tue Mar 10 17:49:09 2020
New Revision: 358849
URL: https://svnweb.freebsd.org/changeset/base/358849
Log:
Merge ^/head r358832 through r358848.
Modified:
projects/clang1000-import/lib/libusb/libusb_global_linux.h
projects/clang1000-import/sys/amd64/vmm/intel/vmx.c
projects/clang1000-import/sys/amd64/vmm/io/vlapic.c
projects/clang1000-import/sys/amd64/vmm/io/vlapic.h
projects/clang1000-import/sys/compat/linux/linux_ioctl.c
projects/clang1000-import/sys/compat/linux/linux_ioctl.h
projects/clang1000-import/sys/sys/param.h
Directory Properties:
projects/clang1000-import/ (props changed)
Modified: projects/clang1000-import/lib/libusb/libusb_global_linux.h
==============================================================================
--- projects/clang1000-import/lib/libusb/libusb_global_linux.h Tue Mar 10 16:53:49 2020 (r358848)
+++ projects/clang1000-import/lib/libusb/libusb_global_linux.h Tue Mar 10 17:49:09 2020 (r358849)
@@ -77,4 +77,11 @@
} while (0)
#endif
+#ifndef TAILQ_FOREACH_SAFE
+#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \
+ for ((var) = TAILQ_FIRST((head)); \
+ (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \
+ (var) = (tvar))
+#endif
+
#endif /* _LIBUSB_GLOBAL_LINUX_H_ */
Modified: projects/clang1000-import/sys/amd64/vmm/intel/vmx.c
==============================================================================
--- projects/clang1000-import/sys/amd64/vmm/intel/vmx.c Tue Mar 10 16:53:49 2020 (r358848)
+++ projects/clang1000-import/sys/amd64/vmm/intel/vmx.c Tue Mar 10 17:49:09 2020 (r358849)
@@ -175,6 +175,10 @@ static int cap_invpcid;
SYSCTL_INT(_hw_vmm_vmx_cap, OID_AUTO, invpcid, CTLFLAG_RD, &cap_invpcid,
0, "Guests are allowed to use INVPCID");
+static int tpr_shadowing;
+SYSCTL_INT(_hw_vmm_vmx_cap, OID_AUTO, tpr_shadowing, CTLFLAG_RD,
+ &tpr_shadowing, 0, "TPR shadowing support");
+
static int virtual_interrupt_delivery;
SYSCTL_INT(_hw_vmm_vmx_cap, OID_AUTO, virtual_interrupt_delivery, CTLFLAG_RD,
&virtual_interrupt_delivery, 0, "APICv virtual interrupt delivery support");
@@ -630,7 +634,7 @@ vmx_restore(void)
static int
vmx_init(int ipinum)
{
- int error, use_tpr_shadow;
+ int error;
uint64_t basic, fixed0, fixed1, feature_control;
uint32_t tmp, procbased2_vid_bits;
@@ -754,6 +758,24 @@ vmx_init(int ipinum)
&tmp) == 0);
/*
+ * Check support for TPR shadow.
+ */
+ error = vmx_set_ctlreg(MSR_VMX_PROCBASED_CTLS,
+ MSR_VMX_TRUE_PROCBASED_CTLS, PROCBASED_USE_TPR_SHADOW, 0,
+ &tmp);
+ if (error == 0) {
+ tpr_shadowing = 1;
+ TUNABLE_INT_FETCH("hw.vmm.vmx.use_tpr_shadowing",
+ &tpr_shadowing);
+ }
+
+ if (tpr_shadowing) {
+ procbased_ctls |= PROCBASED_USE_TPR_SHADOW;
+ procbased_ctls &= ~PROCBASED_CR8_LOAD_EXITING;
+ procbased_ctls &= ~PROCBASED_CR8_STORE_EXITING;
+ }
+
+ /*
* Check support for virtual interrupt delivery.
*/
procbased2_vid_bits = (PROCBASED2_VIRTUALIZE_APIC_ACCESSES |
@@ -761,13 +783,9 @@ vmx_init(int ipinum)
PROCBASED2_APIC_REGISTER_VIRTUALIZATION |
PROCBASED2_VIRTUAL_INTERRUPT_DELIVERY);
- use_tpr_shadow = (vmx_set_ctlreg(MSR_VMX_PROCBASED_CTLS,
- MSR_VMX_TRUE_PROCBASED_CTLS, PROCBASED_USE_TPR_SHADOW, 0,
- &tmp) == 0);
-
error = vmx_set_ctlreg(MSR_VMX_PROCBASED_CTLS2, MSR_VMX_PROCBASED_CTLS2,
procbased2_vid_bits, 0, &tmp);
- if (error == 0 && use_tpr_shadow) {
+ if (error == 0 && tpr_shadowing) {
virtual_interrupt_delivery = 1;
TUNABLE_INT_FETCH("hw.vmm.vmx.use_apic_vid",
&virtual_interrupt_delivery);
@@ -779,13 +797,6 @@ vmx_init(int ipinum)
procbased_ctls2 &= ~PROCBASED2_VIRTUALIZE_X2APIC_MODE;
/*
- * No need to emulate accesses to %CR8 if virtual
- * interrupt delivery is enabled.
- */
- procbased_ctls &= ~PROCBASED_CR8_LOAD_EXITING;
- procbased_ctls &= ~PROCBASED_CR8_STORE_EXITING;
-
- /*
* Check for Posted Interrupts only if Virtual Interrupt
* Delivery is enabled.
*/
@@ -1054,10 +1065,13 @@ vmx_vminit(struct vm *vm, pmap_t pmap)
vmx->ctx[i].guest_dr6 = DBREG_DR6_RESERVED1;
error += vmwrite(VMCS_GUEST_DR7, DBREG_DR7_RESERVED1);
- if (virtual_interrupt_delivery) {
- error += vmwrite(VMCS_APIC_ACCESS, APIC_ACCESS_ADDRESS);
+ if (tpr_shadowing) {
error += vmwrite(VMCS_VIRTUAL_APIC,
vtophys(&vmx->apic_page[i]));
+ }
+
+ if (virtual_interrupt_delivery) {
+ error += vmwrite(VMCS_APIC_ACCESS, APIC_ACCESS_ADDRESS);
error += vmwrite(VMCS_EOI_EXIT0, 0);
error += vmwrite(VMCS_EOI_EXIT1, 0);
error += vmwrite(VMCS_EOI_EXIT2, 0);
@@ -2661,6 +2675,12 @@ vmx_exit_process(struct vmx *vmx, int vcpu, struct vm_
SDT_PROBE3(vmm, vmx, exit, mwait, vmx, vcpu, vmexit);
vmexit->exitcode = VM_EXITCODE_MWAIT;
break;
+ case EXIT_REASON_TPR:
+ vlapic = vm_lapic(vmx->vm, vcpu);
+ vlapic_sync_tpr(vlapic);
+ vmexit->inst_length = 0;
+ handled = HANDLED;
+ break;
case EXIT_REASON_VMCALL:
case EXIT_REASON_VMCLEAR:
case EXIT_REASON_VMLAUNCH:
@@ -2947,6 +2967,16 @@ vmx_run(void *arg, int vcpu, register_t rip, pmap_t pm
}
/*
+ * If TPR Shadowing is enabled, the TPR Threshold
+ * must be updated right before entering the guest.
+ */
+ if (tpr_shadowing && !virtual_interrupt_delivery) {
+ if ((vmx->cap[vcpu].proc_ctls & PROCBASED_USE_TPR_SHADOW) != 0) {
+ vmcs_write(VMCS_TPR_THRESHOLD, vlapic_get_cr8(vlapic));
+ }
+ }
+
+ /*
* VM exits restore the base address but not the
* limits of GDTR and IDTR. The VMCS only stores the
* base address, so VM exits set the limits to 0xffff.
@@ -3634,10 +3664,33 @@ vmx_set_tmr(struct vlapic *vlapic, int vector, bool le
}
static void
-vmx_enable_x2apic_mode(struct vlapic *vlapic)
+vmx_enable_x2apic_mode_ts(struct vlapic *vlapic)
{
struct vmx *vmx;
struct vmcs *vmcs;
+ uint32_t proc_ctls;
+ int vcpuid;
+
+ vcpuid = vlapic->vcpuid;
+ vmx = ((struct vlapic_vtx *)vlapic)->vmx;
+ vmcs = &vmx->vmcs[vcpuid];
+
+ proc_ctls = vmx->cap[vcpuid].proc_ctls;
+ proc_ctls &= ~PROCBASED_USE_TPR_SHADOW;
+ proc_ctls |= PROCBASED_CR8_LOAD_EXITING;
+ proc_ctls |= PROCBASED_CR8_STORE_EXITING;
+ vmx->cap[vcpuid].proc_ctls = proc_ctls;
+
+ VMPTRLD(vmcs);
+ vmcs_write(VMCS_PRI_PROC_BASED_CTLS, proc_ctls);
+ VMCLEAR(vmcs);
+}
+
+static void
+vmx_enable_x2apic_mode_vid(struct vlapic *vlapic)
+{
+ struct vmx *vmx;
+ struct vmcs *vmcs;
uint32_t proc_ctls2;
int vcpuid, error;
@@ -3795,12 +3848,16 @@ vmx_vlapic_init(void *arg, int vcpuid)
vlapic_vtx->pir_desc = &vmx->pir_desc[vcpuid];
vlapic_vtx->vmx = vmx;
+ if (tpr_shadowing) {
+ vlapic->ops.enable_x2apic_mode = vmx_enable_x2apic_mode_ts;
+ }
+
if (virtual_interrupt_delivery) {
vlapic->ops.set_intr_ready = vmx_set_intr_ready;
vlapic->ops.pending_intr = vmx_pending_intr;
vlapic->ops.intr_accepted = vmx_intr_accepted;
vlapic->ops.set_tmr = vmx_set_tmr;
- vlapic->ops.enable_x2apic_mode = vmx_enable_x2apic_mode;
+ vlapic->ops.enable_x2apic_mode = vmx_enable_x2apic_mode_vid;
}
if (posted_interrupts)
Modified: projects/clang1000-import/sys/amd64/vmm/io/vlapic.c
==============================================================================
--- projects/clang1000-import/sys/amd64/vmm/io/vlapic.c Tue Mar 10 16:53:49 2020 (r358848)
+++ projects/clang1000-import/sys/amd64/vmm/io/vlapic.c Tue Mar 10 17:49:09 2020 (r358849)
@@ -555,6 +555,12 @@ vlapic_update_ppr(struct vlapic *vlapic)
VLAPIC_CTR1(vlapic, "vlapic_update_ppr 0x%02x", ppr);
}
+void
+vlapic_sync_tpr(struct vlapic *vlapic)
+{
+ vlapic_update_ppr(vlapic);
+}
+
static VMM_STAT(VLAPIC_GRATUITOUS_EOI, "EOI without any in-service interrupt");
static void
@@ -1079,6 +1085,8 @@ vlapic_pending_intr(struct vlapic *vlapic, int *vecptr
int idx, i, bitpos, vector;
uint32_t *irrptr, val;
+ vlapic_update_ppr(vlapic);
+
if (vlapic->ops.pending_intr)
return ((*vlapic->ops.pending_intr)(vlapic, vecptr));
@@ -1136,7 +1144,6 @@ vlapic_intr_accepted(struct vlapic *vlapic, int vector
panic("isrvec_stk_top overflow %d", stk_top);
vlapic->isrvec_stk[stk_top] = vector;
- vlapic_update_ppr(vlapic);
}
void
Modified: projects/clang1000-import/sys/amd64/vmm/io/vlapic.h
==============================================================================
--- projects/clang1000-import/sys/amd64/vmm/io/vlapic.h Tue Mar 10 16:53:49 2020 (r358848)
+++ projects/clang1000-import/sys/amd64/vmm/io/vlapic.h Tue Mar 10 17:49:09 2020 (r358849)
@@ -74,6 +74,8 @@ void vlapic_post_intr(struct vlapic *vlapic, int hostc
void vlapic_fire_cmci(struct vlapic *vlapic);
int vlapic_trigger_lvt(struct vlapic *vlapic, int vector);
+void vlapic_sync_tpr(struct vlapic *vlapic);
+
uint64_t vlapic_get_apicbase(struct vlapic *vlapic);
int vlapic_set_apicbase(struct vlapic *vlapic, uint64_t val);
void vlapic_set_x2apic_state(struct vm *vm, int vcpuid, enum x2apic_state s);
Modified: projects/clang1000-import/sys/compat/linux/linux_ioctl.c
==============================================================================
--- projects/clang1000-import/sys/compat/linux/linux_ioctl.c Tue Mar 10 16:53:49 2020 (r358848)
+++ projects/clang1000-import/sys/compat/linux/linux_ioctl.c Tue Mar 10 17:49:09 2020 (r358849)
@@ -3488,6 +3488,9 @@ linux_ioctl_fbsd_usb(struct thread *td, struct linux_i
case FBSD_LUSB_GET_POWER_USAGE:
args->cmd = USB_GET_POWER_USAGE;
break;
+ case FBSD_LUSB_DEVICESTATS:
+ args->cmd = USB_DEVICESTATS;
+ break;
default:
error = ENOIOCTL;
}
Modified: projects/clang1000-import/sys/compat/linux/linux_ioctl.h
==============================================================================
--- projects/clang1000-import/sys/compat/linux/linux_ioctl.h Tue Mar 10 16:53:49 2020 (r358848)
+++ projects/clang1000-import/sys/compat/linux/linux_ioctl.h Tue Mar 10 17:49:09 2020 (r358849)
@@ -743,9 +743,10 @@
#define FBSD_LUSB_FS_OPEN_STREAM 0xffdf
#define FBSD_LUSB_GET_DEV_PORT_PATH 0xffde
#define FBSD_LUSB_GET_POWER_USAGE 0xffdd
+#define FBSD_LUSB_DEVICESTATS 0xffdc
#define FBSD_LUSB_MAX 0xffff
-#define FBSD_LUSB_MIN 0xffdd
+#define FBSD_LUSB_MIN 0xffdc
/*
* Linux btrfs clone operation
Modified: projects/clang1000-import/sys/sys/param.h
==============================================================================
--- projects/clang1000-import/sys/sys/param.h Tue Mar 10 16:53:49 2020 (r358848)
+++ projects/clang1000-import/sys/sys/param.h Tue Mar 10 17:49:09 2020 (r358849)
@@ -60,7 +60,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1300082 /* Master, propagated to newvers */
+#define __FreeBSD_version 1300083 /* Master, propagated to newvers */
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
More information about the svn-src-projects
mailing list