linux/tools/testing/selftests/kvm/include/evmcs.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * tools/testing/selftests/kvm/include/vmx.h
   4 *
   5 * Copyright (C) 2018, Red Hat, Inc.
   6 *
   7 */
   8
   9#ifndef SELFTEST_KVM_EVMCS_H
  10#define SELFTEST_KVM_EVMCS_H
  11
  12#include <stdint.h>
  13#include "vmx.h"
  14
  15#define u16 uint16_t
  16#define u32 uint32_t
  17#define u64 uint64_t
  18
  19extern bool enable_evmcs;
  20
  21struct hv_vp_assist_page {
  22        __u32 apic_assist;
  23        __u32 reserved;
  24        __u64 vtl_control[2];
  25        __u64 nested_enlightenments_control[2];
  26        __u32 enlighten_vmentry;
  27        __u64 current_nested_vmcs;
  28};
  29
  30struct hv_enlightened_vmcs {
  31        u32 revision_id;
  32        u32 abort;
  33
  34        u16 host_es_selector;
  35        u16 host_cs_selector;
  36        u16 host_ss_selector;
  37        u16 host_ds_selector;
  38        u16 host_fs_selector;
  39        u16 host_gs_selector;
  40        u16 host_tr_selector;
  41
  42        u64 host_ia32_pat;
  43        u64 host_ia32_efer;
  44
  45        u64 host_cr0;
  46        u64 host_cr3;
  47        u64 host_cr4;
  48
  49        u64 host_ia32_sysenter_esp;
  50        u64 host_ia32_sysenter_eip;
  51        u64 host_rip;
  52        u32 host_ia32_sysenter_cs;
  53
  54        u32 pin_based_vm_exec_control;
  55        u32 vm_exit_controls;
  56        u32 secondary_vm_exec_control;
  57
  58        u64 io_bitmap_a;
  59        u64 io_bitmap_b;
  60        u64 msr_bitmap;
  61
  62        u16 guest_es_selector;
  63        u16 guest_cs_selector;
  64        u16 guest_ss_selector;
  65        u16 guest_ds_selector;
  66        u16 guest_fs_selector;
  67        u16 guest_gs_selector;
  68        u16 guest_ldtr_selector;
  69        u16 guest_tr_selector;
  70
  71        u32 guest_es_limit;
  72        u32 guest_cs_limit;
  73        u32 guest_ss_limit;
  74        u32 guest_ds_limit;
  75        u32 guest_fs_limit;
  76        u32 guest_gs_limit;
  77        u32 guest_ldtr_limit;
  78        u32 guest_tr_limit;
  79        u32 guest_gdtr_limit;
  80        u32 guest_idtr_limit;
  81
  82        u32 guest_es_ar_bytes;
  83        u32 guest_cs_ar_bytes;
  84        u32 guest_ss_ar_bytes;
  85        u32 guest_ds_ar_bytes;
  86        u32 guest_fs_ar_bytes;
  87        u32 guest_gs_ar_bytes;
  88        u32 guest_ldtr_ar_bytes;
  89        u32 guest_tr_ar_bytes;
  90
  91        u64 guest_es_base;
  92        u64 guest_cs_base;
  93        u64 guest_ss_base;
  94        u64 guest_ds_base;
  95        u64 guest_fs_base;
  96        u64 guest_gs_base;
  97        u64 guest_ldtr_base;
  98        u64 guest_tr_base;
  99        u64 guest_gdtr_base;
 100        u64 guest_idtr_base;
 101
 102        u64 padding64_1[3];
 103
 104        u64 vm_exit_msr_store_addr;
 105        u64 vm_exit_msr_load_addr;
 106        u64 vm_entry_msr_load_addr;
 107
 108        u64 cr3_target_value0;
 109        u64 cr3_target_value1;
 110        u64 cr3_target_value2;
 111        u64 cr3_target_value3;
 112
 113        u32 page_fault_error_code_mask;
 114        u32 page_fault_error_code_match;
 115
 116        u32 cr3_target_count;
 117        u32 vm_exit_msr_store_count;
 118        u32 vm_exit_msr_load_count;
 119        u32 vm_entry_msr_load_count;
 120
 121        u64 tsc_offset;
 122        u64 virtual_apic_page_addr;
 123        u64 vmcs_link_pointer;
 124
 125        u64 guest_ia32_debugctl;
 126        u64 guest_ia32_pat;
 127        u64 guest_ia32_efer;
 128
 129        u64 guest_pdptr0;
 130        u64 guest_pdptr1;
 131        u64 guest_pdptr2;
 132        u64 guest_pdptr3;
 133
 134        u64 guest_pending_dbg_exceptions;
 135        u64 guest_sysenter_esp;
 136        u64 guest_sysenter_eip;
 137
 138        u32 guest_activity_state;
 139        u32 guest_sysenter_cs;
 140
 141        u64 cr0_guest_host_mask;
 142        u64 cr4_guest_host_mask;
 143        u64 cr0_read_shadow;
 144        u64 cr4_read_shadow;
 145        u64 guest_cr0;
 146        u64 guest_cr3;
 147        u64 guest_cr4;
 148        u64 guest_dr7;
 149
 150        u64 host_fs_base;
 151        u64 host_gs_base;
 152        u64 host_tr_base;
 153        u64 host_gdtr_base;
 154        u64 host_idtr_base;
 155        u64 host_rsp;
 156
 157        u64 ept_pointer;
 158
 159        u16 virtual_processor_id;
 160        u16 padding16[3];
 161
 162        u64 padding64_2[5];
 163        u64 guest_physical_address;
 164
 165        u32 vm_instruction_error;
 166        u32 vm_exit_reason;
 167        u32 vm_exit_intr_info;
 168        u32 vm_exit_intr_error_code;
 169        u32 idt_vectoring_info_field;
 170        u32 idt_vectoring_error_code;
 171        u32 vm_exit_instruction_len;
 172        u32 vmx_instruction_info;
 173
 174        u64 exit_qualification;
 175        u64 exit_io_instruction_ecx;
 176        u64 exit_io_instruction_esi;
 177        u64 exit_io_instruction_edi;
 178        u64 exit_io_instruction_eip;
 179
 180        u64 guest_linear_address;
 181        u64 guest_rsp;
 182        u64 guest_rflags;
 183
 184        u32 guest_interruptibility_info;
 185        u32 cpu_based_vm_exec_control;
 186        u32 exception_bitmap;
 187        u32 vm_entry_controls;
 188        u32 vm_entry_intr_info_field;
 189        u32 vm_entry_exception_error_code;
 190        u32 vm_entry_instruction_len;
 191        u32 tpr_threshold;
 192
 193        u64 guest_rip;
 194
 195        u32 hv_clean_fields;
 196        u32 hv_padding_32;
 197        u32 hv_synthetic_controls;
 198        struct {
 199                u32 nested_flush_hypercall:1;
 200                u32 msr_bitmap:1;
 201                u32 reserved:30;
 202        } hv_enlightenments_control;
 203        u32 hv_vp_id;
 204
 205        u64 hv_vm_id;
 206        u64 partition_assist_page;
 207        u64 padding64_4[4];
 208        u64 guest_bndcfgs;
 209        u64 padding64_5[7];
 210        u64 xss_exit_bitmap;
 211        u64 padding64_6[7];
 212};
 213
 214#define HV_X64_MSR_VP_ASSIST_PAGE               0x40000073
 215#define HV_X64_MSR_VP_ASSIST_PAGE_ENABLE        0x00000001
 216#define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT 12
 217#define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK  \
 218                (~((1ull << HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT) - 1))
 219
 220struct hv_enlightened_vmcs *current_evmcs;
 221struct hv_vp_assist_page *current_vp_assist;
 222
 223static inline int enable_vp_assist(uint64_t vp_assist_pa, void *vp_assist)
 224{
 225        u64 val = (vp_assist_pa & HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK) |
 226                HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
 227
 228        wrmsr(HV_X64_MSR_VP_ASSIST_PAGE, val);
 229
 230        current_vp_assist = vp_assist;
 231
 232        enable_evmcs = true;
 233
 234        return 0;
 235}
 236
 237static inline int evmcs_vmptrld(uint64_t vmcs_pa, void *vmcs)
 238{
 239        current_vp_assist->current_nested_vmcs = vmcs_pa;
 240        current_vp_assist->enlighten_vmentry = 1;
 241
 242        current_evmcs = vmcs;
 243
 244        return 0;
 245}
 246
 247static inline int evmcs_vmptrst(uint64_t *value)
 248{
 249        *value = current_vp_assist->current_nested_vmcs &
 250                ~HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
 251
 252        return 0;
 253}
 254
 255static inline int evmcs_vmread(uint64_t encoding, uint64_t *value)
 256{
 257        switch (encoding) {
 258        case GUEST_RIP:
 259                *value = current_evmcs->guest_rip;
 260                break;
 261        case GUEST_RSP:
 262                *value = current_evmcs->guest_rsp;
 263                break;
 264        case GUEST_RFLAGS:
 265                *value = current_evmcs->guest_rflags;
 266                break;
 267        case HOST_IA32_PAT:
 268                *value = current_evmcs->host_ia32_pat;
 269                break;
 270        case HOST_IA32_EFER:
 271                *value = current_evmcs->host_ia32_efer;
 272                break;
 273        case HOST_CR0:
 274                *value = current_evmcs->host_cr0;
 275                break;
 276        case HOST_CR3:
 277                *value = current_evmcs->host_cr3;
 278                break;
 279        case HOST_CR4:
 280                *value = current_evmcs->host_cr4;
 281                break;
 282        case HOST_IA32_SYSENTER_ESP:
 283                *value = current_evmcs->host_ia32_sysenter_esp;
 284                break;
 285        case HOST_IA32_SYSENTER_EIP:
 286                *value = current_evmcs->host_ia32_sysenter_eip;
 287                break;
 288        case HOST_RIP:
 289                *value = current_evmcs->host_rip;
 290                break;
 291        case IO_BITMAP_A:
 292                *value = current_evmcs->io_bitmap_a;
 293                break;
 294        case IO_BITMAP_B:
 295                *value = current_evmcs->io_bitmap_b;
 296                break;
 297        case MSR_BITMAP:
 298                *value = current_evmcs->msr_bitmap;
 299                break;
 300        case GUEST_ES_BASE:
 301                *value = current_evmcs->guest_es_base;
 302                break;
 303        case GUEST_CS_BASE:
 304                *value = current_evmcs->guest_cs_base;
 305                break;
 306        case GUEST_SS_BASE:
 307                *value = current_evmcs->guest_ss_base;
 308                break;
 309        case GUEST_DS_BASE:
 310                *value = current_evmcs->guest_ds_base;
 311                break;
 312        case GUEST_FS_BASE:
 313                *value = current_evmcs->guest_fs_base;
 314                break;
 315        case GUEST_GS_BASE:
 316                *value = current_evmcs->guest_gs_base;
 317                break;
 318        case GUEST_LDTR_BASE:
 319                *value = current_evmcs->guest_ldtr_base;
 320                break;
 321        case GUEST_TR_BASE:
 322                *value = current_evmcs->guest_tr_base;
 323                break;
 324        case GUEST_GDTR_BASE:
 325                *value = current_evmcs->guest_gdtr_base;
 326                break;
 327        case GUEST_IDTR_BASE:
 328                *value = current_evmcs->guest_idtr_base;
 329                break;
 330        case TSC_OFFSET:
 331                *value = current_evmcs->tsc_offset;
 332                break;
 333        case VIRTUAL_APIC_PAGE_ADDR:
 334                *value = current_evmcs->virtual_apic_page_addr;
 335                break;
 336        case VMCS_LINK_POINTER:
 337                *value = current_evmcs->vmcs_link_pointer;
 338                break;
 339        case GUEST_IA32_DEBUGCTL:
 340                *value = current_evmcs->guest_ia32_debugctl;
 341                break;
 342        case GUEST_IA32_PAT:
 343                *value = current_evmcs->guest_ia32_pat;
 344                break;
 345        case GUEST_IA32_EFER:
 346                *value = current_evmcs->guest_ia32_efer;
 347                break;
 348        case GUEST_PDPTR0:
 349                *value = current_evmcs->guest_pdptr0;
 350                break;
 351        case GUEST_PDPTR1:
 352                *value = current_evmcs->guest_pdptr1;
 353                break;
 354        case GUEST_PDPTR2:
 355                *value = current_evmcs->guest_pdptr2;
 356                break;
 357        case GUEST_PDPTR3:
 358                *value = current_evmcs->guest_pdptr3;
 359                break;
 360        case GUEST_PENDING_DBG_EXCEPTIONS:
 361                *value = current_evmcs->guest_pending_dbg_exceptions;
 362                break;
 363        case GUEST_SYSENTER_ESP:
 364                *value = current_evmcs->guest_sysenter_esp;
 365                break;
 366        case GUEST_SYSENTER_EIP:
 367                *value = current_evmcs->guest_sysenter_eip;
 368                break;
 369        case CR0_GUEST_HOST_MASK:
 370                *value = current_evmcs->cr0_guest_host_mask;
 371                break;
 372        case CR4_GUEST_HOST_MASK:
 373                *value = current_evmcs->cr4_guest_host_mask;
 374                break;
 375        case CR0_READ_SHADOW:
 376                *value = current_evmcs->cr0_read_shadow;
 377                break;
 378        case CR4_READ_SHADOW:
 379                *value = current_evmcs->cr4_read_shadow;
 380                break;
 381        case GUEST_CR0:
 382                *value = current_evmcs->guest_cr0;
 383                break;
 384        case GUEST_CR3:
 385                *value = current_evmcs->guest_cr3;
 386                break;
 387        case GUEST_CR4:
 388                *value = current_evmcs->guest_cr4;
 389                break;
 390        case GUEST_DR7:
 391                *value = current_evmcs->guest_dr7;
 392                break;
 393        case HOST_FS_BASE:
 394                *value = current_evmcs->host_fs_base;
 395                break;
 396        case HOST_GS_BASE:
 397                *value = current_evmcs->host_gs_base;
 398                break;
 399        case HOST_TR_BASE:
 400                *value = current_evmcs->host_tr_base;
 401                break;
 402        case HOST_GDTR_BASE:
 403                *value = current_evmcs->host_gdtr_base;
 404                break;
 405        case HOST_IDTR_BASE:
 406                *value = current_evmcs->host_idtr_base;
 407                break;
 408        case HOST_RSP:
 409                *value = current_evmcs->host_rsp;
 410                break;
 411        case EPT_POINTER:
 412                *value = current_evmcs->ept_pointer;
 413                break;
 414        case GUEST_BNDCFGS:
 415                *value = current_evmcs->guest_bndcfgs;
 416                break;
 417        case XSS_EXIT_BITMAP:
 418                *value = current_evmcs->xss_exit_bitmap;
 419                break;
 420        case GUEST_PHYSICAL_ADDRESS:
 421                *value = current_evmcs->guest_physical_address;
 422                break;
 423        case EXIT_QUALIFICATION:
 424                *value = current_evmcs->exit_qualification;
 425                break;
 426        case GUEST_LINEAR_ADDRESS:
 427                *value = current_evmcs->guest_linear_address;
 428                break;
 429        case VM_EXIT_MSR_STORE_ADDR:
 430                *value = current_evmcs->vm_exit_msr_store_addr;
 431                break;
 432        case VM_EXIT_MSR_LOAD_ADDR:
 433                *value = current_evmcs->vm_exit_msr_load_addr;
 434                break;
 435        case VM_ENTRY_MSR_LOAD_ADDR:
 436                *value = current_evmcs->vm_entry_msr_load_addr;
 437                break;
 438        case CR3_TARGET_VALUE0:
 439                *value = current_evmcs->cr3_target_value0;
 440                break;
 441        case CR3_TARGET_VALUE1:
 442                *value = current_evmcs->cr3_target_value1;
 443                break;
 444        case CR3_TARGET_VALUE2:
 445                *value = current_evmcs->cr3_target_value2;
 446                break;
 447        case CR3_TARGET_VALUE3:
 448                *value = current_evmcs->cr3_target_value3;
 449                break;
 450        case TPR_THRESHOLD:
 451                *value = current_evmcs->tpr_threshold;
 452                break;
 453        case GUEST_INTERRUPTIBILITY_INFO:
 454                *value = current_evmcs->guest_interruptibility_info;
 455                break;
 456        case CPU_BASED_VM_EXEC_CONTROL:
 457                *value = current_evmcs->cpu_based_vm_exec_control;
 458                break;
 459        case EXCEPTION_BITMAP:
 460                *value = current_evmcs->exception_bitmap;
 461                break;
 462        case VM_ENTRY_CONTROLS:
 463                *value = current_evmcs->vm_entry_controls;
 464                break;
 465        case VM_ENTRY_INTR_INFO_FIELD:
 466                *value = current_evmcs->vm_entry_intr_info_field;
 467                break;
 468        case VM_ENTRY_EXCEPTION_ERROR_CODE:
 469                *value = current_evmcs->vm_entry_exception_error_code;
 470                break;
 471        case VM_ENTRY_INSTRUCTION_LEN:
 472                *value = current_evmcs->vm_entry_instruction_len;
 473                break;
 474        case HOST_IA32_SYSENTER_CS:
 475                *value = current_evmcs->host_ia32_sysenter_cs;
 476                break;
 477        case PIN_BASED_VM_EXEC_CONTROL:
 478                *value = current_evmcs->pin_based_vm_exec_control;
 479                break;
 480        case VM_EXIT_CONTROLS:
 481                *value = current_evmcs->vm_exit_controls;
 482                break;
 483        case SECONDARY_VM_EXEC_CONTROL:
 484                *value = current_evmcs->secondary_vm_exec_control;
 485                break;
 486        case GUEST_ES_LIMIT:
 487                *value = current_evmcs->guest_es_limit;
 488                break;
 489        case GUEST_CS_LIMIT:
 490                *value = current_evmcs->guest_cs_limit;
 491                break;
 492        case GUEST_SS_LIMIT:
 493                *value = current_evmcs->guest_ss_limit;
 494                break;
 495        case GUEST_DS_LIMIT:
 496                *value = current_evmcs->guest_ds_limit;
 497                break;
 498        case GUEST_FS_LIMIT:
 499                *value = current_evmcs->guest_fs_limit;
 500                break;
 501        case GUEST_GS_LIMIT:
 502                *value = current_evmcs->guest_gs_limit;
 503                break;
 504        case GUEST_LDTR_LIMIT:
 505                *value = current_evmcs->guest_ldtr_limit;
 506                break;
 507        case GUEST_TR_LIMIT:
 508                *value = current_evmcs->guest_tr_limit;
 509                break;
 510        case GUEST_GDTR_LIMIT:
 511                *value = current_evmcs->guest_gdtr_limit;
 512                break;
 513        case GUEST_IDTR_LIMIT:
 514                *value = current_evmcs->guest_idtr_limit;
 515                break;
 516        case GUEST_ES_AR_BYTES:
 517                *value = current_evmcs->guest_es_ar_bytes;
 518                break;
 519        case GUEST_CS_AR_BYTES:
 520                *value = current_evmcs->guest_cs_ar_bytes;
 521                break;
 522        case GUEST_SS_AR_BYTES:
 523                *value = current_evmcs->guest_ss_ar_bytes;
 524                break;
 525        case GUEST_DS_AR_BYTES:
 526                *value = current_evmcs->guest_ds_ar_bytes;
 527                break;
 528        case GUEST_FS_AR_BYTES:
 529                *value = current_evmcs->guest_fs_ar_bytes;
 530                break;
 531        case GUEST_GS_AR_BYTES:
 532                *value = current_evmcs->guest_gs_ar_bytes;
 533                break;
 534        case GUEST_LDTR_AR_BYTES:
 535                *value = current_evmcs->guest_ldtr_ar_bytes;
 536                break;
 537        case GUEST_TR_AR_BYTES:
 538                *value = current_evmcs->guest_tr_ar_bytes;
 539                break;
 540        case GUEST_ACTIVITY_STATE:
 541                *value = current_evmcs->guest_activity_state;
 542                break;
 543        case GUEST_SYSENTER_CS:
 544                *value = current_evmcs->guest_sysenter_cs;
 545                break;
 546        case VM_INSTRUCTION_ERROR:
 547                *value = current_evmcs->vm_instruction_error;
 548                break;
 549        case VM_EXIT_REASON:
 550                *value = current_evmcs->vm_exit_reason;
 551                break;
 552        case VM_EXIT_INTR_INFO:
 553                *value = current_evmcs->vm_exit_intr_info;
 554                break;
 555        case VM_EXIT_INTR_ERROR_CODE:
 556                *value = current_evmcs->vm_exit_intr_error_code;
 557                break;
 558        case IDT_VECTORING_INFO_FIELD:
 559                *value = current_evmcs->idt_vectoring_info_field;
 560                break;
 561        case IDT_VECTORING_ERROR_CODE:
 562                *value = current_evmcs->idt_vectoring_error_code;
 563                break;
 564        case VM_EXIT_INSTRUCTION_LEN:
 565                *value = current_evmcs->vm_exit_instruction_len;
 566                break;
 567        case VMX_INSTRUCTION_INFO:
 568                *value = current_evmcs->vmx_instruction_info;
 569                break;
 570        case PAGE_FAULT_ERROR_CODE_MASK:
 571                *value = current_evmcs->page_fault_error_code_mask;
 572                break;
 573        case PAGE_FAULT_ERROR_CODE_MATCH:
 574                *value = current_evmcs->page_fault_error_code_match;
 575                break;
 576        case CR3_TARGET_COUNT:
 577                *value = current_evmcs->cr3_target_count;
 578                break;
 579        case VM_EXIT_MSR_STORE_COUNT:
 580                *value = current_evmcs->vm_exit_msr_store_count;
 581                break;
 582        case VM_EXIT_MSR_LOAD_COUNT:
 583                *value = current_evmcs->vm_exit_msr_load_count;
 584                break;
 585        case VM_ENTRY_MSR_LOAD_COUNT:
 586                *value = current_evmcs->vm_entry_msr_load_count;
 587                break;
 588        case HOST_ES_SELECTOR:
 589                *value = current_evmcs->host_es_selector;
 590                break;
 591        case HOST_CS_SELECTOR:
 592                *value = current_evmcs->host_cs_selector;
 593                break;
 594        case HOST_SS_SELECTOR:
 595                *value = current_evmcs->host_ss_selector;
 596                break;
 597        case HOST_DS_SELECTOR:
 598                *value = current_evmcs->host_ds_selector;
 599                break;
 600        case HOST_FS_SELECTOR:
 601                *value = current_evmcs->host_fs_selector;
 602                break;
 603        case HOST_GS_SELECTOR:
 604                *value = current_evmcs->host_gs_selector;
 605                break;
 606        case HOST_TR_SELECTOR:
 607                *value = current_evmcs->host_tr_selector;
 608                break;
 609        case GUEST_ES_SELECTOR:
 610                *value = current_evmcs->guest_es_selector;
 611                break;
 612        case GUEST_CS_SELECTOR:
 613                *value = current_evmcs->guest_cs_selector;
 614                break;
 615        case GUEST_SS_SELECTOR:
 616                *value = current_evmcs->guest_ss_selector;
 617                break;
 618        case GUEST_DS_SELECTOR:
 619                *value = current_evmcs->guest_ds_selector;
 620                break;
 621        case GUEST_FS_SELECTOR:
 622                *value = current_evmcs->guest_fs_selector;
 623                break;
 624        case GUEST_GS_SELECTOR:
 625                *value = current_evmcs->guest_gs_selector;
 626                break;
 627        case GUEST_LDTR_SELECTOR:
 628                *value = current_evmcs->guest_ldtr_selector;
 629                break;
 630        case GUEST_TR_SELECTOR:
 631                *value = current_evmcs->guest_tr_selector;
 632                break;
 633        case VIRTUAL_PROCESSOR_ID:
 634                *value = current_evmcs->virtual_processor_id;
 635                break;
 636        default: return 1;
 637        }
 638
 639        return 0;
 640}
 641
 642static inline int evmcs_vmwrite(uint64_t encoding, uint64_t value)
 643{
 644        switch (encoding) {
 645        case GUEST_RIP:
 646                current_evmcs->guest_rip = value;
 647                break;
 648        case GUEST_RSP:
 649                current_evmcs->guest_rsp = value;
 650                break;
 651        case GUEST_RFLAGS:
 652                current_evmcs->guest_rflags = value;
 653                break;
 654        case HOST_IA32_PAT:
 655                current_evmcs->host_ia32_pat = value;
 656                break;
 657        case HOST_IA32_EFER:
 658                current_evmcs->host_ia32_efer = value;
 659                break;
 660        case HOST_CR0:
 661                current_evmcs->host_cr0 = value;
 662                break;
 663        case HOST_CR3:
 664                current_evmcs->host_cr3 = value;
 665                break;
 666        case HOST_CR4:
 667                current_evmcs->host_cr4 = value;
 668                break;
 669        case HOST_IA32_SYSENTER_ESP:
 670                current_evmcs->host_ia32_sysenter_esp = value;
 671                break;
 672        case HOST_IA32_SYSENTER_EIP:
 673                current_evmcs->host_ia32_sysenter_eip = value;
 674                break;
 675        case HOST_RIP:
 676                current_evmcs->host_rip = value;
 677                break;
 678        case IO_BITMAP_A:
 679                current_evmcs->io_bitmap_a = value;
 680                break;
 681        case IO_BITMAP_B:
 682                current_evmcs->io_bitmap_b = value;
 683                break;
 684        case MSR_BITMAP:
 685                current_evmcs->msr_bitmap = value;
 686                break;
 687        case GUEST_ES_BASE:
 688                current_evmcs->guest_es_base = value;
 689                break;
 690        case GUEST_CS_BASE:
 691                current_evmcs->guest_cs_base = value;
 692                break;
 693        case GUEST_SS_BASE:
 694                current_evmcs->guest_ss_base = value;
 695                break;
 696        case GUEST_DS_BASE:
 697                current_evmcs->guest_ds_base = value;
 698                break;
 699        case GUEST_FS_BASE:
 700                current_evmcs->guest_fs_base = value;
 701                break;
 702        case GUEST_GS_BASE:
 703                current_evmcs->guest_gs_base = value;
 704                break;
 705        case GUEST_LDTR_BASE:
 706                current_evmcs->guest_ldtr_base = value;
 707                break;
 708        case GUEST_TR_BASE:
 709                current_evmcs->guest_tr_base = value;
 710                break;
 711        case GUEST_GDTR_BASE:
 712                current_evmcs->guest_gdtr_base = value;
 713                break;
 714        case GUEST_IDTR_BASE:
 715                current_evmcs->guest_idtr_base = value;
 716                break;
 717        case TSC_OFFSET:
 718                current_evmcs->tsc_offset = value;
 719                break;
 720        case VIRTUAL_APIC_PAGE_ADDR:
 721                current_evmcs->virtual_apic_page_addr = value;
 722                break;
 723        case VMCS_LINK_POINTER:
 724                current_evmcs->vmcs_link_pointer = value;
 725                break;
 726        case GUEST_IA32_DEBUGCTL:
 727                current_evmcs->guest_ia32_debugctl = value;
 728                break;
 729        case GUEST_IA32_PAT:
 730                current_evmcs->guest_ia32_pat = value;
 731                break;
 732        case GUEST_IA32_EFER:
 733                current_evmcs->guest_ia32_efer = value;
 734                break;
 735        case GUEST_PDPTR0:
 736                current_evmcs->guest_pdptr0 = value;
 737                break;
 738        case GUEST_PDPTR1:
 739                current_evmcs->guest_pdptr1 = value;
 740                break;
 741        case GUEST_PDPTR2:
 742                current_evmcs->guest_pdptr2 = value;
 743                break;
 744        case GUEST_PDPTR3:
 745                current_evmcs->guest_pdptr3 = value;
 746                break;
 747        case GUEST_PENDING_DBG_EXCEPTIONS:
 748                current_evmcs->guest_pending_dbg_exceptions = value;
 749                break;
 750        case GUEST_SYSENTER_ESP:
 751                current_evmcs->guest_sysenter_esp = value;
 752                break;
 753        case GUEST_SYSENTER_EIP:
 754                current_evmcs->guest_sysenter_eip = value;
 755                break;
 756        case CR0_GUEST_HOST_MASK:
 757                current_evmcs->cr0_guest_host_mask = value;
 758                break;
 759        case CR4_GUEST_HOST_MASK:
 760                current_evmcs->cr4_guest_host_mask = value;
 761                break;
 762        case CR0_READ_SHADOW:
 763                current_evmcs->cr0_read_shadow = value;
 764                break;
 765        case CR4_READ_SHADOW:
 766                current_evmcs->cr4_read_shadow = value;
 767                break;
 768        case GUEST_CR0:
 769                current_evmcs->guest_cr0 = value;
 770                break;
 771        case GUEST_CR3:
 772                current_evmcs->guest_cr3 = value;
 773                break;
 774        case GUEST_CR4:
 775                current_evmcs->guest_cr4 = value;
 776                break;
 777        case GUEST_DR7:
 778                current_evmcs->guest_dr7 = value;
 779                break;
 780        case HOST_FS_BASE:
 781                current_evmcs->host_fs_base = value;
 782                break;
 783        case HOST_GS_BASE:
 784                current_evmcs->host_gs_base = value;
 785                break;
 786        case HOST_TR_BASE:
 787                current_evmcs->host_tr_base = value;
 788                break;
 789        case HOST_GDTR_BASE:
 790                current_evmcs->host_gdtr_base = value;
 791                break;
 792        case HOST_IDTR_BASE:
 793                current_evmcs->host_idtr_base = value;
 794                break;
 795        case HOST_RSP:
 796                current_evmcs->host_rsp = value;
 797                break;
 798        case EPT_POINTER:
 799                current_evmcs->ept_pointer = value;
 800                break;
 801        case GUEST_BNDCFGS:
 802                current_evmcs->guest_bndcfgs = value;
 803                break;
 804        case XSS_EXIT_BITMAP:
 805                current_evmcs->xss_exit_bitmap = value;
 806                break;
 807        case GUEST_PHYSICAL_ADDRESS:
 808                current_evmcs->guest_physical_address = value;
 809                break;
 810        case EXIT_QUALIFICATION:
 811                current_evmcs->exit_qualification = value;
 812                break;
 813        case GUEST_LINEAR_ADDRESS:
 814                current_evmcs->guest_linear_address = value;
 815                break;
 816        case VM_EXIT_MSR_STORE_ADDR:
 817                current_evmcs->vm_exit_msr_store_addr = value;
 818                break;
 819        case VM_EXIT_MSR_LOAD_ADDR:
 820                current_evmcs->vm_exit_msr_load_addr = value;
 821                break;
 822        case VM_ENTRY_MSR_LOAD_ADDR:
 823                current_evmcs->vm_entry_msr_load_addr = value;
 824                break;
 825        case CR3_TARGET_VALUE0:
 826                current_evmcs->cr3_target_value0 = value;
 827                break;
 828        case CR3_TARGET_VALUE1:
 829                current_evmcs->cr3_target_value1 = value;
 830                break;
 831        case CR3_TARGET_VALUE2:
 832                current_evmcs->cr3_target_value2 = value;
 833                break;
 834        case CR3_TARGET_VALUE3:
 835                current_evmcs->cr3_target_value3 = value;
 836                break;
 837        case TPR_THRESHOLD:
 838                current_evmcs->tpr_threshold = value;
 839                break;
 840        case GUEST_INTERRUPTIBILITY_INFO:
 841                current_evmcs->guest_interruptibility_info = value;
 842                break;
 843        case CPU_BASED_VM_EXEC_CONTROL:
 844                current_evmcs->cpu_based_vm_exec_control = value;
 845                break;
 846        case EXCEPTION_BITMAP:
 847                current_evmcs->exception_bitmap = value;
 848                break;
 849        case VM_ENTRY_CONTROLS:
 850                current_evmcs->vm_entry_controls = value;
 851                break;
 852        case VM_ENTRY_INTR_INFO_FIELD:
 853                current_evmcs->vm_entry_intr_info_field = value;
 854                break;
 855        case VM_ENTRY_EXCEPTION_ERROR_CODE:
 856                current_evmcs->vm_entry_exception_error_code = value;
 857                break;
 858        case VM_ENTRY_INSTRUCTION_LEN:
 859                current_evmcs->vm_entry_instruction_len = value;
 860                break;
 861        case HOST_IA32_SYSENTER_CS:
 862                current_evmcs->host_ia32_sysenter_cs = value;
 863                break;
 864        case PIN_BASED_VM_EXEC_CONTROL:
 865                current_evmcs->pin_based_vm_exec_control = value;
 866                break;
 867        case VM_EXIT_CONTROLS:
 868                current_evmcs->vm_exit_controls = value;
 869                break;
 870        case SECONDARY_VM_EXEC_CONTROL:
 871                current_evmcs->secondary_vm_exec_control = value;
 872                break;
 873        case GUEST_ES_LIMIT:
 874                current_evmcs->guest_es_limit = value;
 875                break;
 876        case GUEST_CS_LIMIT:
 877                current_evmcs->guest_cs_limit = value;
 878                break;
 879        case GUEST_SS_LIMIT:
 880                current_evmcs->guest_ss_limit = value;
 881                break;
 882        case GUEST_DS_LIMIT:
 883                current_evmcs->guest_ds_limit = value;
 884                break;
 885        case GUEST_FS_LIMIT:
 886                current_evmcs->guest_fs_limit = value;
 887                break;
 888        case GUEST_GS_LIMIT:
 889                current_evmcs->guest_gs_limit = value;
 890                break;
 891        case GUEST_LDTR_LIMIT:
 892                current_evmcs->guest_ldtr_limit = value;
 893                break;
 894        case GUEST_TR_LIMIT:
 895                current_evmcs->guest_tr_limit = value;
 896                break;
 897        case GUEST_GDTR_LIMIT:
 898                current_evmcs->guest_gdtr_limit = value;
 899                break;
 900        case GUEST_IDTR_LIMIT:
 901                current_evmcs->guest_idtr_limit = value;
 902                break;
 903        case GUEST_ES_AR_BYTES:
 904                current_evmcs->guest_es_ar_bytes = value;
 905                break;
 906        case GUEST_CS_AR_BYTES:
 907                current_evmcs->guest_cs_ar_bytes = value;
 908                break;
 909        case GUEST_SS_AR_BYTES:
 910                current_evmcs->guest_ss_ar_bytes = value;
 911                break;
 912        case GUEST_DS_AR_BYTES:
 913                current_evmcs->guest_ds_ar_bytes = value;
 914                break;
 915        case GUEST_FS_AR_BYTES:
 916                current_evmcs->guest_fs_ar_bytes = value;
 917                break;
 918        case GUEST_GS_AR_BYTES:
 919                current_evmcs->guest_gs_ar_bytes = value;
 920                break;
 921        case GUEST_LDTR_AR_BYTES:
 922                current_evmcs->guest_ldtr_ar_bytes = value;
 923                break;
 924        case GUEST_TR_AR_BYTES:
 925                current_evmcs->guest_tr_ar_bytes = value;
 926                break;
 927        case GUEST_ACTIVITY_STATE:
 928                current_evmcs->guest_activity_state = value;
 929                break;
 930        case GUEST_SYSENTER_CS:
 931                current_evmcs->guest_sysenter_cs = value;
 932                break;
 933        case VM_INSTRUCTION_ERROR:
 934                current_evmcs->vm_instruction_error = value;
 935                break;
 936        case VM_EXIT_REASON:
 937                current_evmcs->vm_exit_reason = value;
 938                break;
 939        case VM_EXIT_INTR_INFO:
 940                current_evmcs->vm_exit_intr_info = value;
 941                break;
 942        case VM_EXIT_INTR_ERROR_CODE:
 943                current_evmcs->vm_exit_intr_error_code = value;
 944                break;
 945        case IDT_VECTORING_INFO_FIELD:
 946                current_evmcs->idt_vectoring_info_field = value;
 947                break;
 948        case IDT_VECTORING_ERROR_CODE:
 949                current_evmcs->idt_vectoring_error_code = value;
 950                break;
 951        case VM_EXIT_INSTRUCTION_LEN:
 952                current_evmcs->vm_exit_instruction_len = value;
 953                break;
 954        case VMX_INSTRUCTION_INFO:
 955                current_evmcs->vmx_instruction_info = value;
 956                break;
 957        case PAGE_FAULT_ERROR_CODE_MASK:
 958                current_evmcs->page_fault_error_code_mask = value;
 959                break;
 960        case PAGE_FAULT_ERROR_CODE_MATCH:
 961                current_evmcs->page_fault_error_code_match = value;
 962                break;
 963        case CR3_TARGET_COUNT:
 964                current_evmcs->cr3_target_count = value;
 965                break;
 966        case VM_EXIT_MSR_STORE_COUNT:
 967                current_evmcs->vm_exit_msr_store_count = value;
 968                break;
 969        case VM_EXIT_MSR_LOAD_COUNT:
 970                current_evmcs->vm_exit_msr_load_count = value;
 971                break;
 972        case VM_ENTRY_MSR_LOAD_COUNT:
 973                current_evmcs->vm_entry_msr_load_count = value;
 974                break;
 975        case HOST_ES_SELECTOR:
 976                current_evmcs->host_es_selector = value;
 977                break;
 978        case HOST_CS_SELECTOR:
 979                current_evmcs->host_cs_selector = value;
 980                break;
 981        case HOST_SS_SELECTOR:
 982                current_evmcs->host_ss_selector = value;
 983                break;
 984        case HOST_DS_SELECTOR:
 985                current_evmcs->host_ds_selector = value;
 986                break;
 987        case HOST_FS_SELECTOR:
 988                current_evmcs->host_fs_selector = value;
 989                break;
 990        case HOST_GS_SELECTOR:
 991                current_evmcs->host_gs_selector = value;
 992                break;
 993        case HOST_TR_SELECTOR:
 994                current_evmcs->host_tr_selector = value;
 995                break;
 996        case GUEST_ES_SELECTOR:
 997                current_evmcs->guest_es_selector = value;
 998                break;
 999        case GUEST_CS_SELECTOR:
1000                current_evmcs->guest_cs_selector = value;
1001                break;
1002        case GUEST_SS_SELECTOR:
1003                current_evmcs->guest_ss_selector = value;
1004                break;
1005        case GUEST_DS_SELECTOR:
1006                current_evmcs->guest_ds_selector = value;
1007                break;
1008        case GUEST_FS_SELECTOR:
1009                current_evmcs->guest_fs_selector = value;
1010                break;
1011        case GUEST_GS_SELECTOR:
1012                current_evmcs->guest_gs_selector = value;
1013                break;
1014        case GUEST_LDTR_SELECTOR:
1015                current_evmcs->guest_ldtr_selector = value;
1016                break;
1017        case GUEST_TR_SELECTOR:
1018                current_evmcs->guest_tr_selector = value;
1019                break;
1020        case VIRTUAL_PROCESSOR_ID:
1021                current_evmcs->virtual_processor_id = value;
1022                break;
1023        default: return 1;
1024        }
1025
1026        return 0;
1027}
1028
1029static inline int evmcs_vmlaunch(void)
1030{
1031        int ret;
1032
1033        current_evmcs->hv_clean_fields = 0;
1034
1035        __asm__ __volatile__("push %%rbp;"
1036                             "push %%rcx;"
1037                             "push %%rdx;"
1038                             "push %%rsi;"
1039                             "push %%rdi;"
1040                             "push $0;"
1041                             "mov %%rsp, (%[host_rsp]);"
1042                             "lea 1f(%%rip), %%rax;"
1043                             "mov %%rax, (%[host_rip]);"
1044                             "vmlaunch;"
1045                             "incq (%%rsp);"
1046                             "1: pop %%rax;"
1047                             "pop %%rdi;"
1048                             "pop %%rsi;"
1049                             "pop %%rdx;"
1050                             "pop %%rcx;"
1051                             "pop %%rbp;"
1052                             : [ret]"=&a"(ret)
1053                             : [host_rsp]"r"
1054                               ((uint64_t)&current_evmcs->host_rsp),
1055                               [host_rip]"r"
1056                               ((uint64_t)&current_evmcs->host_rip)
1057                             : "memory", "cc", "rbx", "r8", "r9", "r10",
1058                               "r11", "r12", "r13", "r14", "r15");
1059        return ret;
1060}
1061
1062/*
1063 * No guest state (e.g. GPRs) is established by this vmresume.
1064 */
1065static inline int evmcs_vmresume(void)
1066{
1067        int ret;
1068
1069        current_evmcs->hv_clean_fields = 0;
1070
1071        __asm__ __volatile__("push %%rbp;"
1072                             "push %%rcx;"
1073                             "push %%rdx;"
1074                             "push %%rsi;"
1075                             "push %%rdi;"
1076                             "push $0;"
1077                             "mov %%rsp, (%[host_rsp]);"
1078                             "lea 1f(%%rip), %%rax;"
1079                             "mov %%rax, (%[host_rip]);"
1080                             "vmresume;"
1081                             "incq (%%rsp);"
1082                             "1: pop %%rax;"
1083                             "pop %%rdi;"
1084                             "pop %%rsi;"
1085                             "pop %%rdx;"
1086                             "pop %%rcx;"
1087                             "pop %%rbp;"
1088                             : [ret]"=&a"(ret)
1089                             : [host_rsp]"r"
1090                               ((uint64_t)&current_evmcs->host_rsp),
1091                               [host_rip]"r"
1092                               ((uint64_t)&current_evmcs->host_rip)
1093                             : "memory", "cc", "rbx", "r8", "r9", "r10",
1094                               "r11", "r12", "r13", "r14", "r15");
1095        return ret;
1096}
1097
1098#endif /* !SELFTEST_KVM_EVMCS_H */
1099