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/sys/vmm.h
          +++ new/usr/src/uts/i86pc/sys/vmm.h
↓ open down ↓ 209 lines elided ↑ open up ↑
 210  210          VM_EXITCODE_INOUT,
 211  211          VM_EXITCODE_VMX,
 212  212          VM_EXITCODE_BOGUS,
 213  213          VM_EXITCODE_RDMSR,
 214  214          VM_EXITCODE_WRMSR,
 215  215          VM_EXITCODE_HLT,
 216  216          VM_EXITCODE_MTRAP,
 217  217          VM_EXITCODE_PAUSE,
 218  218          VM_EXITCODE_PAGING,
 219  219          VM_EXITCODE_INST_EMUL,
 220      -        VM_EXITCODE_SPINUP_AP,
      220 +        VM_EXITCODE_RUN_STATE,
 221  221          VM_EXITCODE_MMIO_EMUL,
 222      -        VM_EXITCODE_RUNBLOCK,
      222 +        VM_EXITCODE_DEPRECATED, /* formerly RUNBLOCK */
 223  223          VM_EXITCODE_IOAPIC_EOI,
 224  224          VM_EXITCODE_SUSPENDED,
 225  225          VM_EXITCODE_MMIO,
 226  226          VM_EXITCODE_TASK_SWITCH,
 227  227          VM_EXITCODE_MONITOR,
 228  228          VM_EXITCODE_MWAIT,
 229  229          VM_EXITCODE_SVM,
 230  230          VM_EXITCODE_REQIDLE,
 231  231          VM_EXITCODE_DEBUG,
 232  232          VM_EXITCODE_VMINSN,
↓ open down ↓ 47 lines elided ↑ open up ↑
 280  280  
 281  281  struct vm_task_switch {
 282  282          uint16_t        tsssel;         /* new TSS selector */
 283  283          int             ext;            /* task switch due to external event */
 284  284          uint32_t        errcode;
 285  285          int             errcode_valid;  /* push 'errcode' on the new stack */
 286  286          enum task_switch_reason reason;
 287  287          struct vm_guest_paging paging;
 288  288  };
 289  289  
      290 +enum vcpu_run_state {
      291 +        VRS_HALT                = 0,
      292 +        VRS_INIT                = (1 << 0),
      293 +        VRS_RUN                 = (1 << 1),
      294 +
      295 +        VRS_PEND_INIT           = (1 << 14),
      296 +        VRS_PEND_SIPI           = (1 << 15),
      297 +};
      298 +#define VRS_MASK_VALID(v)       \
      299 +        ((v) & (VRS_INIT | VRS_RUN | VRS_PEND_SIPI | VRS_PEND_SIPI))
      300 +#define VRS_IS_VALID(v)         ((v) == VRS_MASK_VALID(v))
      301 +
 290  302  struct vm_exit {
 291  303          enum vm_exitcode        exitcode;
 292  304          int                     inst_length;    /* 0 means unknown */
 293  305          uint64_t                rip;
 294  306          union {
 295  307                  struct vm_inout inout;
 296  308                  struct vm_mmio  mmio;
 297  309                  struct {
 298  310                          uint64_t        gpa;
 299  311                          int             fault_type;
↓ open down ↓ 41 lines elided ↑ open up ↑
 341  353                          uint64_t        exitinfo2;
 342  354                  } svm;
 343  355                  struct {
 344  356                          int             inst_length;
 345  357                  } bpt;
 346  358                  struct {
 347  359                          uint32_t        code;           /* ecx value */
 348  360                          uint64_t        wval;
 349  361                  } msr;
 350  362                  struct {
 351      -                        int             vcpu;
 352      -                        uint64_t        rip;
 353      -                } spinup_ap;
 354      -                struct {
 355  363                          uint64_t        rflags;
 356  364                  } hlt;
 357  365                  struct {
 358  366                          int             vector;
 359  367                  } ioapic_eoi;
 360  368                  struct {
 361  369                          enum vm_suspend_how how;
 362  370                  } suspended;
 363  371                  struct vm_task_switch task_switch;
 364  372          } u;
 365  373  };
 366  374  
 367  375  enum vm_entry_cmds {
 368  376          VEC_DEFAULT = 0,
 369  377          VEC_DISCARD_INSTR,      /* discard inst emul state */
 370      -        VEC_COMPLETE_MMIO,      /* entry includes result for mmio emul */
 371      -        VEC_COMPLETE_INOUT,     /* entry includes result for inout emul */
      378 +        VEC_FULFILL_MMIO,       /* entry includes result for mmio emul */
      379 +        VEC_FULFILL_INOUT,      /* entry includes result for inout emul */
 372  380  };
 373  381  
 374  382  struct vm_entry {
 375  383          int cpuid;
 376  384          uint_t cmd;             /* see: vm_entry_cmds */
 377  385          void *exit_data;
 378  386          union {
 379  387                  struct vm_inout inout;
 380  388                  struct vm_mmio mmio;
 381  389          } u;
 382  390  };
 383  391  
 384  392  int vm_restart_instruction(void *vm, int vcpuid);
 385  393  
 386  394  #endif  /* _VMM_H_ */
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX