Author: kib
Date: Fri Oct 12 15:30:15 2018
New Revision: 339331
URL: https://svnweb.freebsd.org/changeset/base/339331

Log:
  bhyve: emulate CLFLUSH and CLFLUSHOPT.
  
  Apparently CLFLUSH on mmio can cause VM exit, as reported in the PR.
  I do not see that anything useful can be done except emulating page
  faults on invalid addresses.
  
  Due to the instruction encoding pecularity, also emulate SFENCE.
  
  PR:   232081
  Reported by:  phk
  Reviewed by:  araujo, avg, jhb (all: previous version)
  Sponsored by: The FreeBSD Foundation
  Approved by:  re (gjb)
  MFC after:    1 week
  Differential revision:        https://reviews.freebsd.org/D17482

Modified:
  head/sys/amd64/vmm/vmm_instruction_emul.c

Modified: head/sys/amd64/vmm/vmm_instruction_emul.c
==============================================================================
--- head/sys/amd64/vmm/vmm_instruction_emul.c   Fri Oct 12 15:19:41 2018        
(r339330)
+++ head/sys/amd64/vmm/vmm_instruction_emul.c   Fri Oct 12 15:30:15 2018        
(r339331)
@@ -76,6 +76,7 @@ enum {
        VIE_OP_TYPE_GROUP1,
        VIE_OP_TYPE_STOS,
        VIE_OP_TYPE_BITTEST,
+       VIE_OP_TYPE_TWOB_GRP15,
        VIE_OP_TYPE_LAST
 };
 
@@ -87,6 +88,10 @@ enum {
 #define        VIE_OP_F_NO_GLA_VERIFICATION (1 << 4)
 
 static const struct vie_op two_byte_opcodes[256] = {
+       [0xAE] = {
+                 .op_byte = 0xAE,
+                 .op_type = VIE_OP_TYPE_TWOB_GRP15,
+       },
        [0xB6] = {
                .op_byte = 0xB6,
                .op_type = VIE_OP_TYPE_MOVZX,
@@ -1443,6 +1448,37 @@ emulate_bittest(void *vm, int vcpuid, uint64_t gpa, st
        return (0);
 }
 
+static int
+emulate_twob_group15(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
+    mem_region_read_t memread, mem_region_write_t memwrite, void *memarg)
+{
+       int error;
+       uint64_t buf;
+
+       switch (vie->reg & 7) {
+       case 0x7:       /* CLFLUSH, CLFLUSHOPT, and SFENCE */
+               if (vie->mod == 0x3) {
+                       /*
+                        * SFENCE.  Ignore it, VM exit provides enough
+                        * barriers on its own.
+                        */
+                       error = 0;
+               } else {
+                       /*
+                        * CLFLUSH, CLFLUSHOPT.  Only check for access
+                        * rights.
+                        */
+                       error = memread(vm, vcpuid, gpa, &buf, 1, memarg);
+               }
+               break;
+       default:
+               error = EINVAL;
+               break;
+       }
+
+       return (error);
+}
+
 int
 vmm_emulate_instruction(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
     struct vm_guest_paging *paging, mem_region_read_t memread,
@@ -1501,6 +1537,10 @@ vmm_emulate_instruction(void *vm, int vcpuid, uint64_t
                break;
        case VIE_OP_TYPE_BITTEST:
                error = emulate_bittest(vm, vcpuid, gpa, vie,
+                   memread, memwrite, memarg);
+               break;
+       case VIE_OP_TYPE_TWOB_GRP15:
+               error = emulate_twob_group15(vm, vcpuid, gpa, vie,
                    memread, memwrite, memarg);
                break;
        default:
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to