Print this page
13275 bhyve needs richer INIT/SIPI support
Reviewed by: Robert Mustacchi <rm@fingolfin.org>
Approved by: Gordon Ross <gordon.w.ross@gmail.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/i86pc/io/vmm/vmm_sol_dev.c
          +++ new/usr/src/uts/i86pc/io/vmm/vmm_sol_dev.c
↓ open down ↓ 435 lines elided ↑ open up ↑
 436  436          case VM_PPTDEV_MSIX:
 437  437          case VM_SET_X2APIC_STATE:
 438  438          case VM_GLA2GPA:
 439  439          case VM_GLA2GPA_NOFAULT:
 440  440          case VM_ACTIVATE_CPU:
 441  441          case VM_SET_INTINFO:
 442  442          case VM_GET_INTINFO:
 443  443          case VM_RESTART_INSTRUCTION:
 444  444          case VM_SET_KERNEMU_DEV:
 445  445          case VM_GET_KERNEMU_DEV:
      446 +        case VM_RESET_CPU:
      447 +        case VM_GET_RUN_STATE:
      448 +        case VM_SET_RUN_STATE:
 446  449                  /*
 447  450                   * Copy in the ID of the vCPU chosen for this operation.
 448  451                   * Since a nefarious caller could update their struct between
 449  452                   * this locking and when the rest of the ioctl data is copied
 450  453                   * in, it is _critical_ that this local 'vcpu' variable be used
 451  454                   * rather than the in-struct one when performing the ioctl.
 452  455                   */
 453  456                  if (ddi_copyin(datap, &vcpu, sizeof (vcpu), md)) {
 454  457                          return (EFAULT);
 455  458                  }
↓ open down ↓ 526 lines elided ↑ open up ↑
 982  985                           */
 983  986                          if (regnums[i] < 0) {
 984  987                                  error = EINVAL;
 985  988                                  break;
 986  989                          }
 987  990                          error = vm_set_register(sc->vmm_vm, vcpu, regnums[i],
 988  991                              regvals[i]);
 989  992                  }
 990  993                  break;
 991  994          }
      995 +        case VM_RESET_CPU: {
      996 +                struct vm_vcpu_reset vvr;
      997 +
      998 +                if (ddi_copyin(datap, &vvr, sizeof (vvr), md)) {
      999 +                        error = EFAULT;
     1000 +                        break;
     1001 +                }
     1002 +                if (vvr.kind != VRK_RESET && vvr.kind != VRK_INIT) {
     1003 +                        error = EINVAL;
     1004 +                }
     1005 +
     1006 +                error = vcpu_arch_reset(sc->vmm_vm, vcpu, vvr.kind == VRK_INIT);
     1007 +                break;
     1008 +        }
     1009 +        case VM_GET_RUN_STATE: {
     1010 +                struct vm_run_state vrs;
     1011 +
     1012 +                bzero(&vrs, sizeof (vrs));
     1013 +                error = vm_get_run_state(sc->vmm_vm, vcpu, &vrs.state,
     1014 +                    &vrs.sipi_vector);
     1015 +                if (error == 0) {
     1016 +                        if (ddi_copyout(&vrs, datap, sizeof (vrs), md)) {
     1017 +                                error = EFAULT;
     1018 +                                break;
     1019 +                        }
     1020 +                }
     1021 +                break;
     1022 +        }
     1023 +        case VM_SET_RUN_STATE: {
     1024 +                struct vm_run_state vrs;
     1025 +
     1026 +                if (ddi_copyin(datap, &vrs, sizeof (vrs), md)) {
     1027 +                        error = EFAULT;
     1028 +                        break;
     1029 +                }
     1030 +                error = vm_set_run_state(sc->vmm_vm, vcpu, vrs.state,
     1031 +                    vrs.sipi_vector);
     1032 +                break;
     1033 +        }
 992 1034  
 993 1035          case VM_SET_KERNEMU_DEV:
 994 1036          case VM_GET_KERNEMU_DEV: {
 995 1037                  struct vm_readwrite_kernemu_device kemu;
 996 1038                  size_t size = 0;
 997 1039  
 998 1040                  if (ddi_copyin(datap, &kemu, sizeof (kemu), md)) {
 999 1041                          error = EFAULT;
1000 1042                          break;
1001 1043                  }
↓ open down ↓ 1413 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX