{"id":6407,"date":"2024-03-19T15:01:01","date_gmt":"2024-03-19T07:01:01","guid":{"rendered":""},"modified":"2024-03-19T15:01:01","modified_gmt":"2024-03-19T07:01:01","slug":"Virtualbox\u6e90\u7801\u5206\u679022 NEM(Hyper-V\u517c\u5bb9)3 Emulation Thread","status":"publish","type":"post","link":"https:\/\/mushiming.com\/6407.html","title":{"rendered":"Virtualbox\u6e90\u7801\u5206\u679022 NEM(Hyper-V\u517c\u5bb9)3 Emulation Thread"},"content":{"rendered":"<p><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"display: none;\"> \n <path stroke-linecap=\"round\" d=\"M5,0 0,2.5 5,5z\" id=\"raphael-marker-block\" style=\"-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"><\/path> \n<\/svg> <\/p>\n<h3>Native execution manager \uff08Emulation Thread \uff09<\/h3>\n<\/p>\n<div class=\"toc\">\n<h4>\u6587\u7ae0\u76ee\u5f55<\/h4>\n<ul>\n<li>\n<ul>\n<li>Native execution manager \uff08Emulation Thread \uff09<\/li>\n<li>22.1. Emulation\u5faa\u73af\u7ebf\u7a0b<\/li>\n<li>\n<ul>\n<li>emR3NemExecute<\/li>\n<li>nemR3NativeRunGC<\/li>\n<li>R0\u7684\u5faa\u73af<\/li>\n<li>NEMR0RunGuestCode<\/li>\n<li>emR3NemForcedActions<\/li>\n<\/ul>\n<\/li>\n<li>22.2 \u4eceGuestOS\u91cc\u83b7\u53d6\u548c\u5199\u5165\u5bc4\u5b58\u5668\u4fe1\u606f<\/li>\n<li>\n<ul>\n<li>nemR0WinImportState<\/li>\n<li>nemR0WinExportState<\/li>\n<\/ul>\n<\/li>\n<li>22.3\u4e2d\u65ad\u5904\u7406<\/li>\n<li>\n<ul>\n<li>nemHCWinHandleInterruptFF<\/li>\n<\/ul>\n<\/li>\n<li><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/div>\n<p> \u672c\u7bc7\u91cd\u70b9\u4ecb\u7ecdNEM\u6a21\u5f0f\u7684\u6267\u884cGuestOS\u76f8\u5173\u7684\u51fd\u6570\uff0c\u57fa\u672c\u6846\u67b6\u548cHM\/Raw-mode\u5b8c\u5168\u4e00\u6837\uff0c\u53ea\u662f\u5177\u4f53\u5b9e\u73b0\u4ee3\u7801\uff08\u8c03\u7528\u7684API\uff09\u4e0d\u540c\u800c\u5df2\u3002 <\/p>\n<h3>22.1. Emulation\u5faa\u73af\u7ebf\u7a0b<\/h3>\n<h4>emR3NemExecute<\/h4>\n<p>\u4e3b\u5faa\u73af\u51fd\u6570\uff0c\u5b9e\u73b0\u539f\u7406\u548c\u8fc7\u7a0b\u548cVMX\/Raw-mode\u51e0\u4e4e\u4e00\u6837\uff0c\u90e8\u5206\u5904\u7406action\u7684\u4ee3\u7801\u53ef\u4ee5\u53c2\u8003EM\u4e00\u7bc7<\/p>\n<p>EMR3Nem.cpp<\/p>\n<pre><code class=\"prism language-cpp\">VBOXSTRICTRC <span class=\"token function\">emR3NemExecute<\/span><span class=\"token punctuation\">(<\/span>PVM pVM<span class=\"token punctuation\">,<\/span> PVMCPU pVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">bool<\/span> <span class=\"token operator\">*<\/span>pfFFDone<span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u6b7b\u5faa\u73af\u6267\u884cGuestOS\u4ee3\u7801<\/span>\n <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u5148\u6267\u884cForce Action\uff0c\u5904\u7406pending\u7684\u4e8b\u4ef6<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token function\">VM_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> VM_FF_HIGH_PRIORITY_PRE_RAW_MASK<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">||<\/span> <span class=\"token function\">VMCPU_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_HIGH_PRIORITY_PRE_RAW_MASK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">emR3NemForcedActions<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">!=<\/span> VINF_SUCCESS<span class=\"token punctuation\">)<\/span>\n <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u6267\u884c\u4ee3\u7801<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">RT_LIKELY<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">emR3IsExecutionAllowed<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">NEMR3RunGC<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token keyword\">else<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u6682\u65f6\u6ca1\u6709\u6267\u884c\u6743\u9650\uff0csleep5\u6beb\u79d2\u4e4b\u540e\u518d\u6267\u884c<\/span>\n <span class=\"token function\">RTThreadSleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n rcStrict <span class=\"token operator\">=<\/span> VINF_SUCCESS<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u5904\u7406\u9ad8\u4f18\u5148\u7ea7\u7684pending\u4e8b\u4ef6\uff0c\u8c03\u7528\u7684\u662fEM\u91cc\u7684\u51fd\u6570\uff0c\u5df2\u5728EM\u4e00\u7bc7\u91cc\u4ecb\u7ecd<\/span>\n <span class=\"token function\">VMCPU_FF_CLEAR_MASK<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_RESUME_GUEST_MASK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token function\">VM_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> VM_FF_HIGH_PRIORITY_POST_MASK<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">||<\/span> <span class=\"token function\">VMCPU_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_HIGH_PRIORITY_POST_MASK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">emR3HighPriorityPostForcedActions<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">,<\/span> rcStrict<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u8fd4\u56de\u503c\u9519\u8bef\uff0c\u9000\u51fa\u5faa\u73af<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">>=<\/span> VINF_EM_FIRST <span class=\"token operator\">&&<\/span> rcStrict <span class=\"token operator\"><=<\/span> VINF_EM_LAST<span class=\"token punctuation\">)<\/span>\n <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span>\n\t <span class=\"token comment\">\/\/\u5904\u7406\u8fd4\u56de\u503c\uff0c\u5176\u5b9e\u8c03\u7528\u7684\u51fd\u6570\u662femR3HmHandleRC\uff0c\u5df2\u5728EM\u4e00\u7bc7\u91cc\u4ecb\u7ecd<\/span>\n <span class=\"token comment\">\/\/emR3NemHandleRC \u8fd4\u56deVINF_SUCCESS\uff0c\u8868\u793a\u53ef\u4ee5\u7ee7\u7eed\u6267\u884c\uff0c\u5176\u4ed6\u503c\u9700\u8981\u9000\u51fa\u5faa\u73af\u8fd4\u56deR3\u5904\u7406<\/span>\n rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">emR3NemHandleRC<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token function\">VBOXSTRICTRC_TODO<\/span><span class=\"token punctuation\">(<\/span>rcStrict<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">!=<\/span> VINF_SUCCESS<span class=\"token punctuation\">)<\/span>\n <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u5904\u7406forceaction<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token function\">VM_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> VM_FF_ALL_MASK<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">||<\/span> <span class=\"token function\">VMCPU_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_ALL_MASK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u8c03\u7528\u7684\u662fEM\u91cc\u7684\u51fd\u6570\uff0c\u5df2\u5728EM\u4e00\u7bc7\u91cc\u4ecb\u7ecd<\/span>\n rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">emR3ForcedActions<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token function\">VBOXSTRICTRC_TODO<\/span><span class=\"token punctuation\">(<\/span>rcStrict<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token function\">VBOXVMM_EM_FF_ALL_RET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token function\">VBOXSTRICTRC_VAL<\/span><span class=\"token punctuation\">(<\/span>rcStrict<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u5982\u679c\u8fd4\u56de\u9519\u8bef\u6216\u8005\u9700\u8981\u91cd\u65b0\u51b3\u5b9a\u8fd0\u884c\u6a21\u5f0f\uff0c\u9000\u51fa\u5faa\u73af<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> rcStrict <span class=\"token operator\">!=<\/span> VINF_SUCCESS\n <span class=\"token operator\">&&<\/span> rcStrict <span class=\"token operator\">!=<\/span> VINF_EM_RESCHEDULE_HM<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token operator\">*<\/span>pfFFDone <span class=\"token operator\">=<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span>\n\t<span class=\"token punctuation\">}<\/span><span class=\"token comment\">\/\/end of for<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">.<\/span>fExtrn<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u6839\u636efExtrn\u91cc\u7684flags\u4eceGuestOS\u91cc\u8bfb\u53d6\u5bf9\u5e94\u5bc4\u5b58\u5668\uff0c\u65b9\u4fbf\u540e\u9762\u5904\u7406<\/span>\n <span class=\"token keyword\">int<\/span> rcImport <span class=\"token operator\">=<\/span> <span class=\"token function\">NEMImportStateOnDemand<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">.<\/span>fExtrn<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<h4>nemR3NativeRunGC<\/h4>\n<pre><code class=\"prism language-cpp\">VBOXSTRICTRC <span class=\"token function\">nemR3NativeRunGC<\/span><span class=\"token punctuation\">(<\/span>PVM pVM<span class=\"token punctuation\">,<\/span> PVMCPU pVCpu<span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u5f00\u542f\u4e86R0\u5faa\u73af<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pVM<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fUseRing0Runloop<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/IOCTL\u8c03\u7528R0\u6307\u4ee4\u6267\u884cGuestOS\u4ee3\u7801<\/span>\n VBOXSTRICTRC rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">VMMR3CallR0EmtFast<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">,<\/span> VMMR0_DO_NEM_RUN<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u4e0b\u9762\u662f\u5904\u7406\u8fd4\u56de\u503c<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">RT_SUCCESS<\/span><span class=\"token punctuation\">(<\/span>rcStrict<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u5982\u679c\u6807\u8bb0\u4e86\u9700\u8981\u5237\u65b0TLB\uff0c\u5148\u6267\u884c\uff0c\u5904\u7406\u540e\u9762\u7684\u4e8b\u4ef6\uff0c\u9632\u6b62\u540e\u9762\u8bfb\u53d6\u5230\u9519\u8bef\u7684\u5185\u5b58<\/span>\n VBOXSTRICTRC rcPending <span class=\"token operator\">=<\/span> pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>rcPending<span class=\"token punctuation\">;<\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>rcPending <span class=\"token operator\">=<\/span> VINF_SUCCESS<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">==<\/span> VINF_NEM_FLUSH_TLB <span class=\"token operator\">||<\/span> rcPending <span class=\"token operator\">==<\/span> VINF_NEM_FLUSH_TLB<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u5237\u65b0TLB<\/span>\n <span class=\"token keyword\">int<\/span> rc <span class=\"token operator\">=<\/span> <span class=\"token function\">PGMFlushTLB<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token function\">CPUMGetGuestCR3<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">==<\/span> VINF_NEM_FLUSH_TLB<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token operator\">!<\/span><span class=\"token function\">VM_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> VM_FF_HIGH_PRIORITY_POST_MASK <span class=\"token operator\">|<\/span> VM_FF_HP_R0_PRE_HM_MASK<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">&&<\/span> <span class=\"token operator\">!<\/span><span class=\"token function\">VMCPU_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>VMCPU_FF_HIGH_PRIORITY_POST_MASK <span class=\"token operator\">|<\/span> VMCPU_FF_HP_R0_PRE_HM_MASK<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">&<\/span> <span class=\"token operator\">~<\/span>VMCPU_FF_RESUME_GUEST_MASK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u5982\u679c\u6ca1\u6709\u5176\u5b83\u9ad8\u4f18\u5148\u7ea7\u8981\u5904\u7406\u7684\u4e8b\u4ef6\uff0c\u53bb\u6389VMCPU_FF_RESUME_GUEST_MASK\uff0c\u7ee7\u7eed\u6267\u884cGutestOS\u4ee3\u7801<\/span>\n <span class=\"token function\">VMCPU_FF_CLEAR_MASK<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_RESUME_GUEST_MASK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n rcStrict <span class=\"token operator\">=<\/span> VINF_SUCCESS<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token keyword\">return<\/span> rcStrict<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<h4>R0\u7684\u5faa\u73af<\/h4>\n<p>VMMR0EntryFast IOCTl\u901a\u77e5R0\u5f00\u59cb\u5faa\u73af\u6267\u884cGuestOS\u4ee3\u7801<\/p>\n<pre><code class=\"prism language-cpp\"><span class=\"token function\">VMMR0DECL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token function\">VMMR0EntryFast<\/span><span class=\"token punctuation\">(<\/span>PGVM pGVM<span class=\"token punctuation\">,<\/span> PVMCC pVMIgnored<span class=\"token punctuation\">,<\/span> VMCPUID idCpu<span class=\"token punctuation\">,<\/span> VMMR0OPERATION enmOperation<span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\n <span class=\"token keyword\">case<\/span> VMMR0_DO_NEM_RUN<span class=\"token operator\">:<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u4f7f\u7528\u957f\u8df3\u6311\u6218\u5230NEMR0RunGuestCode\uff08R0\u5faa\u73af\uff09<\/span>\n <span class=\"token keyword\">int<\/span> rc <span class=\"token operator\">=<\/span> <span class=\"token function\">vmmR0CallRing3SetJmp2<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&<\/span>pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>vmm<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>CallRing3JmpBufR0<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>PFNVMMR0SETJMP2<span class=\"token punctuation\">)<\/span>NEMR0RunGuestCode<span class=\"token punctuation\">,<\/span> pGVM<span class=\"token punctuation\">,<\/span> idCpu<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>vmm<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>iLastGZRc <span class=\"token operator\">=<\/span> rc<span class=\"token punctuation\">;<\/span>\n <span class=\"token function\">VBOXVMM_R0_VMM_RETURN_TO_RING3_NEM<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token function\">CPUMQueryGuestCtxPtr<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> rc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<h4>NEMR0RunGuestCode<\/h4>\n<p>\u6700\u7ec8\u8c03\u7528\u5230nemHCWinRunGC\uff0c\u8fd9\u4e2a\u51fd\u6570\u662f\u4e2a\u5927\u6742\u70e9\uff0c3\u79cd\u4e0d\u540c\u7684\u5b9e\u73b0\u90fd\u653e\u5230\u8fd9\u4e2a\u4e00\u4e2a\u51fd\u6570\u91cc\uff0c\u4e3a\u4e86\u7b80\u5316\uff0c\u53ea\u770bR0\u5faa\u73af\u7684\u7248\u672c<\/p>\n<pre><code class=\"prism language-cpp\">NEM_TMPL_STATIC VBOXSTRICTRC <span class=\"token function\">nemHCWinRunGC<\/span><span class=\"token punctuation\">(<\/span>PVMCC pVM<span class=\"token punctuation\">,<\/span> PVMCPUCC pVCpu<span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u8bbe\u7f6e\u5f53\u524dVCPu\u72b6\u6001\u6210EXEC_NEM<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">VMCPU_CMPXCHG_STATE<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPUSTATE_STARTED_EXEC_NEM<span class=\"token punctuation\">,<\/span> VMCPUSTATE_STARTED<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span> <span class=\"token comment\">\/* likely *\/<\/span> <span class=\"token punctuation\">}<\/span>\n <span class=\"token keyword\">else<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token function\">VMCPU_CMPXCHG_STATE<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPUSTATE_STARTED_EXEC_NEM<span class=\"token punctuation\">,<\/span> VMCPUSTATE_STARTED_EXEC_NEM_CANCELED<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">return<\/span> VINF_SUCCESS<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n \t<span class=\"token comment\">\/\/\u4ecepvMsgSlotMapping\u91cc\u83b7\u53d6\u83b7\u53d6\u4fdd\u5b58VEMxit\u7684\u53c2\u6570\u7684\u5185\u5b58\u5730\u5740<\/span>\n VID_MESSAGE_MAPPING_HEADER <span class=\"token keyword\">volatile<\/span> <span class=\"token operator\">*<\/span>pMappingHeader <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span>VID_MESSAGE_MAPPING_HEADER <span class=\"token keyword\">volatile<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>pvMsgSlotMapping<span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u662f\u5426\u5728\u88ab\u5355\u6b65\u8c03\u8bd5<\/span>\n <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">bool<\/span> fSingleStepping <span class=\"token operator\">=<\/span> <span class=\"token function\">DBGFIsStepping<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u5faa\u73af\u6267\u884cGuestOS\u4ee3\u7801<\/span>\n <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">unsigned<\/span> iLoop <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">;<\/span> iLoop<span class=\"token operator\">++<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span> \n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fDesiredInterruptWindows <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u5982\u679c\u6709pending\u7684\u4e2d\u65ad<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">VMCPU_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_INTERRUPT_APIC <span class=\"token operator\">|<\/span> VMCPU_FF_UPDATE_APIC <span class=\"token operator\">|<\/span> VMCPU_FF_INTERRUPT_PIC\n <span class=\"token operator\">|<\/span> VMCPU_FF_INTERRUPT_NMI <span class=\"token operator\">|<\/span> VMCPU_FF_INTERRUPT_SMI<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u800c\u4e14\u6807\u8bb0\u9700\u8981\u4ecehypervisor\u91cc\u83b7\u53d6VMExit\u4fe1\u606f<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fHandleAndGetFlags <span class=\"token operator\">==<\/span> VID_MSHAGN_F_GET_NEXT_MESSAGE<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fHandleAndGetFlags <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u9000\u51faGuestOS\uff0c\u5904\u7406VMExit\uff08\u4e0b\u4e00\u7bc7\u91cc\u4ecb\u7ecd\uff09<\/span>\n rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">nemHCWinStopCpu<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">,<\/span> rcStrict<span class=\"token punctuation\">,<\/span> pMappingHeader<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">==<\/span> VINF_SUCCESS<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span> <span class=\"token comment\">\/* likely *\/<\/span> <span class=\"token punctuation\">}<\/span>\n <span class=\"token keyword\">else<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u5982\u679c\u6709pending\u7684\u4e2d\u65ad\uff0c\u5148\u6ce8\u5165\u4e2d\u65ad<\/span>\n rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">nemHCWinHandleInterruptFF<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fDesiredInterruptWindows<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">==<\/span> VINF_SUCCESS<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span> <span class=\"token comment\">\/* likely *\/<\/span> <span class=\"token punctuation\">}<\/span>\n <span class=\"token keyword\">else<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u5728\u5904\u7406vmexit\u548cforceaction\u662f\u7684\u65f6\u5019\u4fee\u6539\u4e86GuestOS\u7684\u5bc4\u5b58\u5668\uff0c\u8c03\u7528hypercall\u628a\u8fd9\u4e9b\u4fee\u6539\u8fc7\u7684\u5bc4\u5b58\u5668\u5199\u5230GuestOS\u91cc<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">.<\/span>fExtrn <span class=\"token operator\">&<\/span> <span class=\"token punctuation\">(<\/span>CPUMCTX_EXTRN_ALL <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_NEM_WIN_MASK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">!=<\/span> <span class=\"token punctuation\">(<\/span>CPUMCTX_EXTRN_ALL <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_NEM_WIN_MASK<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span> pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fDesiredInterruptWindows\n <span class=\"token operator\">||<\/span> pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fCurrentInterruptWindows <span class=\"token operator\">!=<\/span> pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fDesiredInterruptWindows<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">&&<\/span> pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fHandleAndGetFlags <span class=\"token operator\">!=<\/span> VID_MSHAGN_F_GET_NEXT_MESSAGE<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">int<\/span> rc2 <span class=\"token operator\">=<\/span> <span class=\"token function\">nemR0WinExportState<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u8fd0\u884cGuestOS\u4ee3\u7801<\/span>\n <span class=\"token keyword\">uint64_t<\/span> offDeltaIgnored<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">uint64_t<\/span> <span class=\"token keyword\">const<\/span> nsNextTimerEvt <span class=\"token operator\">=<\/span> <span class=\"token function\">TMTimerPollGIP<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&<\/span>offDeltaIgnored<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u5982\u679c\u6709\u6807\u8bb0\u9700\u8981\u8fd4\u56deR3\uff0c\u5219\u4e0d\u80fd\u8fdb\u5165GuestOS<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token operator\">!<\/span><span class=\"token function\">VM_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> VM_FF_EMT_RENDEZVOUS <span class=\"token operator\">|<\/span> VM_FF_TM_VIRTUAL_SYNC<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">&&<\/span> <span class=\"token operator\">!<\/span><span class=\"token function\">VMCPU_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_HM_TO_R3_MASK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fHandleAndGetFlags<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span> \n <span class=\"token comment\">\/\/\u662f\u5426\u6709\u6ca1\u6709\u5904\u7406\u5b8c\u7684\u65f6\u95f4\uff0c\u5982\u679c\u6709\uff0c\u4e0d\u80fd\u8fdb\u5165GuestOS\uff0c\u7ee7\u7eed\u5faa\u73af<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token keyword\">else<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>uIoCtlBuf<span class=\"token punctuation\">.<\/span>idCpu <span class=\"token operator\">=<\/span> pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>idCpu<span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u8fd0\u884cGuestOS\u4ee3\u7801<\/span>\n NTSTATUS rcNt <span class=\"token operator\">=<\/span> <span class=\"token function\">nemR0NtPerformIoControl<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">,<\/span> pVM<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nemr0<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>IoCtlStartVirtualProcessor<span class=\"token punctuation\">.<\/span>uFunction<span class=\"token punctuation\">,<\/span>\n <span class=\"token operator\">&<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>uIoCtlBuf<span class=\"token punctuation\">.<\/span>idCpu<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>uIoCtlBuf<span class=\"token punctuation\">.<\/span>idCpu<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n VERR_NEM_IPE_5<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u6709VMExit\u4e8b\u4ef6\uff0c\u6807\u8bb0\u9700\u8981\u83b7\u53d6VMExit\u4e8b\u4ef6<\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fHandleAndGetFlags <span class=\"token operator\">=<\/span> VID_MSHAGN_F_GET_NEXT_MESSAGE<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u8bbe\u7f6e\u5f53\u524dVCPU\u72b6\u6001\u6210NEM WAIT\u72b6\u6001<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">VMCPU_CMPXCHG_STATE<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPUSTATE_STARTED_EXEC_NEM_WAIT<span class=\"token punctuation\">,<\/span> VMCPUSTATE_STARTED_EXEC_NEM<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u8ba1\u7b97\u8fd0\u884c\u65f6\u95f4<\/span>\n <span class=\"token keyword\">uint64_t<\/span> <span class=\"token keyword\">const<\/span> nsNow <span class=\"token operator\">=<\/span> <span class=\"token function\">RTTimeNanoTS<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">int64_t<\/span> <span class=\"token keyword\">const<\/span> cNsNextTimerEvt <span class=\"token operator\">=<\/span> nsNow <span class=\"token operator\">-<\/span> nsNextTimerEvt<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">uint32_t<\/span> cMsWait<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>cNsNextTimerEvt <span class=\"token operator\"><<\/span> <span class=\"token number\">100000<\/span> <span class=\"token comment\">\/* ns *\/<\/span><span class=\"token punctuation\">)<\/span>\n cMsWait <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">uint64_t<\/span><span class=\"token punctuation\">)<\/span>cNsNextTimerEvt <span class=\"token operator\"><<\/span> RT_NS_1SEC<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">uint32_t<\/span><span class=\"token punctuation\">)<\/span>cNsNextTimerEvt <span class=\"token operator\"><<\/span> <span class=\"token number\">2<\/span><span class=\"token operator\">*<\/span>RT_NS_1MS<span class=\"token punctuation\">)<\/span>\n cMsWait <span class=\"token operator\">=<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">else<\/span>\n cMsWait <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">uint32_t<\/span><span class=\"token punctuation\">)<\/span>cNsNextTimerEvt <span class=\"token operator\">-<\/span> <span class=\"token number\">100000<\/span> <span class=\"token comment\">\/*ns*\/<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> RT_NS_1MS<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token keyword\">else<\/span>\n cMsWait <span class=\"token operator\">=<\/span> RT_MS_1SEC<span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u8c03\u7528MessageSlotHandleAndGetNext\u83b7\u53d6VMExit\u4fe1\u606f<\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>uIoCtlBuf<span class=\"token punctuation\">.<\/span>MsgSlotHandleAndGetNext<span class=\"token punctuation\">.<\/span>iCpu <span class=\"token operator\">=<\/span> pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>idCpu<span class=\"token punctuation\">;<\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>uIoCtlBuf<span class=\"token punctuation\">.<\/span>MsgSlotHandleAndGetNext<span class=\"token punctuation\">.<\/span>fFlags <span class=\"token operator\">=<\/span> pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fHandleAndGetFlags<span class=\"token punctuation\">;<\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>uIoCtlBuf<span class=\"token punctuation\">.<\/span>MsgSlotHandleAndGetNext<span class=\"token punctuation\">.<\/span>cMillies <span class=\"token operator\">=<\/span> cMsWait<span class=\"token punctuation\">;<\/span>\n NTSTATUS rcNt <span class=\"token operator\">=<\/span> <span class=\"token function\">nemR0NtPerformIoControl<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">,<\/span> pVM<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nemr0<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>IoCtlMessageSlotHandleAndGetNext<span class=\"token punctuation\">.<\/span>uFunction<span class=\"token punctuation\">,<\/span>\n <span class=\"token operator\">&<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>uIoCtlBuf<span class=\"token punctuation\">.<\/span>MsgSlotHandleAndGetNext<span class=\"token punctuation\">,<\/span>\n pVM<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nemr0<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>IoCtlMessageSlotHandleAndGetNext<span class=\"token punctuation\">.<\/span>cbInput<span class=\"token punctuation\">,<\/span>\n <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u8bbe\u7f6e\u5f53\u524dVCPU\u72b6\u6001\u6210NEM STARTED_EXEC \u72b6\u6001\uff0c\u51c6\u5907\u4e0b\u4e00\u4e2a\u5faa\u73af<\/span>\n <span class=\"token function\">VMCPU_CMPXCHG_STATE<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPUSTATE_STARTED_EXEC_NEM<span class=\"token punctuation\">,<\/span> VMCPUSTATE_STARTED_EXEC_NEM_WAIT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcNt <span class=\"token operator\">==<\/span> STATUS_SUCCESS<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u83b7\u53d6VMExit\u4fe1\u606f\u6210\u529f\uff0c\u6ca1\u6709VMExit\u4fe1\u606f\u518d\u83b7\u53d6\u4e86<\/span>\n <span class=\"token comment\">\/\/ \u5904\u7406VMExit\uff0c\u4e0b\u4e00\u7bc7\u91cc\u4ecb\u7ecd\u8fd9\u4e2a\u51fd\u6570<\/span>\n rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">nemHCWinHandleMessage<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">,<\/span> pMappingHeader<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u5df2\u7ecf\u83b7\u53d6\u4e86VMExit\u4fe1\u606f\uff0c\u53bb\u6389\u8fd9\u4e2aflag<\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fHandleAndGetFlags <span class=\"token operator\">|<\/span><span class=\"token operator\">=<\/span> VID_MSHAGN_F_HANDLE_MESSAGE<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">==<\/span> VINF_SUCCESS<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span> <span class=\"token comment\">\/* hopefully likely *\/<\/span> <span class=\"token punctuation\">}<\/span>\n <span class=\"token keyword\">else<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u5904\u7406\u5931\u8d25\uff0c\u8fd4\u56deR3<\/span>\n <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token keyword\">else<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u83b7\u53d6VMExit\u4fe1\u606f\u5931\u8d25\uff0c\u6807\u8bb0\u9700\u8981\u518d\u6b21\u83b7\u53d6 \uff08\u9000\u51fa\u5faa\u73af\u4e4b\u540e\u5148\u505c\u6b62VCPU\u518d\u83b7\u53d6\u4e00\u6b21\uff09<\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fHandleAndGetFlags <span class=\"token operator\">=<\/span> VID_MSHAGN_F_GET_NEXT_MESSAGE<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u5982\u679c\u6ca1\u6709\u88ab\u8bbe\u7f6eVM_FF_HP_R0_PRE_HM_MASK\uff0c\u7ee7\u7eed\u6267\u884cGuestOS\uff0c\u5982\u679c\u6709\uff0c\u9000\u51fa\u8fd4\u56de\u5230R3\u5904\u7406<\/span>\n <span class=\"token comment\">\/\/TODO\uff1a\u8fd9\u4e2a\u662f\u4e2a\u4ec0\u4e48flags\uff1f<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token operator\">!<\/span><span class=\"token function\">VM_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span> pVM<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">!<\/span>fSingleStepping <span class=\"token operator\">?<\/span> VM_FF_HP_R0_PRE_HM_MASK <span class=\"token operator\">:<\/span> VM_FF_HP_R0_PRE_HM_STEP_MASK<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">&&<\/span> <span class=\"token operator\">!<\/span><span class=\"token function\">VMCPU_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">!<\/span>fSingleStepping <span class=\"token operator\">?<\/span> VMCPU_FF_HP_R0_PRE_HM_MASK <span class=\"token operator\">:<\/span> VMCPU_FF_HP_R0_PRE_HM_STEP_MASK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">)<\/span>\n <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span>\n\t\t <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span> \n <span class=\"token punctuation\">}<\/span><span class=\"token comment\">\/\/end of for<\/span>\n \n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fHandleAndGetFlags <span class=\"token operator\">==<\/span> VID_MSHAGN_F_GET_NEXT_MESSAGE<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u505c\u6b62VCPU\u5e76\u4e14\u5904\u7406VMExit\u4fe1\u606f \uff08\u4e0b\u4e00\u7bc7\u91cc\u4ecb\u7ecd\u8fd9\u4e2a\u51fd\u6570\uff09<\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fHandleAndGetFlags <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>\n rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">nemHCWinStopCpu<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">,<\/span> rcStrict<span class=\"token punctuation\">,<\/span> pMappingHeader<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/VCPU\u72b6\u6001\u53d8\u6210STARTED<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">VMCPU_CMPXCHG_STATE<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPUSTATE_STARTED<span class=\"token punctuation\">,<\/span> VMCPUSTATE_STARTED_EXEC_NEM<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token function\">VMCPU_CMPXCHG_STATE<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPUSTATE_STARTED<span class=\"token punctuation\">,<\/span> VMCPUSTATE_STARTED_EXEC_NEM_CANCELED<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u4ecehypervisor\u91cc\u83b7\u53d6GuestOS\u5bc4\u5b58\u5668\u76f8\u5173\u4fe1\u606f\uff0c\u4e3a\u8fd4\u56deR3\u4e4b\u540e\u5904\u7406\u51c6\u5907\u73af\u5883<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">.<\/span>fExtrn <span class=\"token operator\">&<\/span> <span class=\"token punctuation\">(<\/span>CPUMCTX_EXTRN_ALL <span class=\"token operator\">|<\/span> <span class=\"token punctuation\">(<\/span>CPUMCTX_EXTRN_NEM_WIN_MASK <span class=\"token operator\">&<\/span> <span class=\"token operator\">~<\/span>CPUMCTX_EXTRN_NEM_WIN_EVENT_INJECT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u6807\u8bb0\u9700\u8981\u83b7\u53d6\u4e2d\u65ad\u76f8\u5173\u4fe1\u606f<\/span>\n <span class=\"token keyword\">uint64_t<\/span> fImport <span class=\"token operator\">=<\/span> IEM_CPUMCTX_EXTRN_MUST_MASK <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_INT <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_NMI<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">>=<\/span> VINF_EM_FIRST <span class=\"token operator\">&&<\/span> rcStrict <span class=\"token operator\"><=<\/span> VINF_EM_LAST<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">||<\/span> <span class=\"token function\">RT_FAILURE<\/span><span class=\"token punctuation\">(<\/span>rcStrict<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token comment\">\/\/\u8fd0\u884c\u9519\u8bef\uff0c\u83b7\u53d6\u6240\u6709\u5bc4\u5b58\u5668<\/span>\n fImport <span class=\"token operator\">=<\/span> CPUMCTX_EXTRN_ALL <span class=\"token operator\">|<\/span> <span class=\"token punctuation\">(<\/span>CPUMCTX_EXTRN_NEM_WIN_MASK <span class=\"token operator\">&<\/span> <span class=\"token operator\">~<\/span>CPUMCTX_EXTRN_NEM_WIN_EVENT_INJECT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> rcStrict <span class=\"token operator\">==<\/span> VINF_IOM_R3_IOPORT_COMMIT_WRITE\n <span class=\"token operator\">||<\/span> rcStrict <span class=\"token operator\">==<\/span> VINF_EM_PENDING_R3_IOPORT_WRITE<span class=\"token punctuation\">)<\/span>\n <span class=\"token comment\">\/\/\u9700\u8981R3\u5904\u7406IO\u5199\u64cd\u4f5c\uff0c\u83b7\u53d6cs\/rip\/rflags\/\u4e2d\u65ad\u5c4f\u853d\u4f4d\u7b49\u4fe1\u606f<\/span>\n fImport <span class=\"token operator\">=<\/span> CPUMCTX_EXTRN_RIP <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_CS <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_RFLAGS <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_INT<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">==<\/span> VINF_EM_PENDING_R3_IOPORT_READ<span class=\"token punctuation\">)<\/span>\n <span class=\"token comment\">\/\/\u9700\u8981R3\u5904\u7406IO\u8bfb\u64cd\u4f5c\uff0c\u83b7\u53d6rax\/cs\/rip\/rflags\/\u4e2d\u65ad\u5c4f\u853d\u4f4d\u7b49\u4fe1\u606f<\/span>\n fImport <span class=\"token operator\">=<\/span> CPUMCTX_EXTRN_RAX <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_RIP <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_CS <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_RFLAGS <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_INT<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">VMCPU_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_INTERRUPT_PIC <span class=\"token operator\">|<\/span> VMCPU_FF_INTERRUPT_APIC\n <span class=\"token operator\">|<\/span> VMCPU_FF_INTERRUPT_NMI <span class=\"token operator\">|<\/span> VMCPU_FF_INTERRUPT_SMI<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token comment\">\/\/\u6709pending\u4e2d\u65ad\uff0c\u83b7\u53d6\u4e2d\u65ad\u76f8\u5173\u4fe1\u606f<\/span>\n fImport <span class=\"token operator\">|<\/span><span class=\"token operator\">=<\/span> IEM_CPUMCTX_EXTRN_XCPT_MASK<span class=\"token punctuation\">;<\/span>\n \n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">.<\/span>fExtrn <span class=\"token operator\">&<\/span> fImport<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u8c03\u7528IOCTL<\/span>\n <span class=\"token keyword\">int<\/span> rc2 <span class=\"token operator\">=<\/span> <span class=\"token function\">nemR0WinImportState<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> pVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">,<\/span> fImport <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_NEM_WIN_EVENT_INJECT<span class=\"token punctuation\">,<\/span>\n <span class=\"token boolean\">true<\/span> <span class=\"token comment\">\/*fCanUpdateCr3*\/<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">RT_SUCCESS<\/span><span class=\"token punctuation\">(<\/span>rc2<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">.<\/span>fExtrn <span class=\"token operator\">&<\/span><span class=\"token operator\">=<\/span> <span class=\"token operator\">~<\/span>fImport<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rc2 <span class=\"token operator\">==<\/span> VERR_NEM_FLUSH_TLB<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">.<\/span>fExtrn <span class=\"token operator\">&<\/span><span class=\"token operator\">=<\/span> <span class=\"token operator\">~<\/span>fImport<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">==<\/span> VINF_SUCCESS <span class=\"token operator\">||<\/span> rcStrict <span class=\"token operator\">==<\/span> <span class=\"token operator\">-<\/span>rc2<span class=\"token punctuation\">)<\/span>\n rcStrict <span class=\"token operator\">=<\/span> <span class=\"token operator\">-<\/span>rc2<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">else<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>rcPending <span class=\"token operator\">=<\/span> <span class=\"token operator\">-<\/span>rc2<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">RT_SUCCESS<\/span><span class=\"token punctuation\">(<\/span>rcStrict<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n rcStrict <span class=\"token operator\">=<\/span> rc2<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">.<\/span>fExtrn <span class=\"token operator\">&<\/span> <span class=\"token punctuation\">(<\/span>CPUMCTX_EXTRN_ALL <span class=\"token operator\">|<\/span> <span class=\"token punctuation\">(<\/span>CPUMCTX_EXTRN_NEM_WIN_MASK <span class=\"token operator\">&<\/span> <span class=\"token operator\">~<\/span>CPUMCTX_EXTRN_NEM_WIN_EVENT_INJECT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">.<\/span>fExtrn <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<h4>emR3NemForcedActions<\/h4>\n<pre><code class=\"prism language-cpp\"><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">int<\/span> <span class=\"token function\">emR3NemForcedActions<\/span><span class=\"token punctuation\">(<\/span>PVM pVM<span class=\"token punctuation\">,<\/span> PVMCPU pVCpu<span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u4e0d\u5904\u7406sync cr3\u7684\u5904\u7406\uff1f<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">VMCPU_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_PGM_SYNC_CR3 <span class=\"token operator\">|<\/span> VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token function\">VMCPU_FF_CLEAR_MASK<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_PGM_SYNC_CR3 <span class=\"token operator\">|<\/span> VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u5185\u5b58\u4e0d\u591f\uff0c\u9700\u8981\u5206\u914d\u5185\u5b58<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">VM_FF_IS_PENDING_EXCEPT<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> VM_FF_PGM_NEED_HANDY_PAGES<span class=\"token punctuation\">,<\/span> VM_FF_PGM_NO_MEMORY<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u5206\u914d\u5185\u5b58\uff0c\u5982\u679c\u7533\u8bf7\u6210\u529f\uff0c\u4f1aclear\u6389VM_FF_PGM_NO_MEMORY flags<\/span>\n <span class=\"token keyword\">int<\/span> rc <span class=\"token operator\">=<\/span> <span class=\"token function\">PGMR3PhysAllocateHandyPages<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">RT_FAILURE<\/span><span class=\"token punctuation\">(<\/span>rc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token keyword\">return<\/span> rc<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u5982\u679c\u8fd8\u662fno memory\uff0c\u8fd4\u56de\u9519\u8bef\u7801<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">VM_FF_IS_SET<\/span><span class=\"token punctuation\">(<\/span>pVM<span class=\"token punctuation\">,<\/span> VM_FF_PGM_NO_MEMORY<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token keyword\">return<\/span> VINF_EM_NO_MEMORY<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">return<\/span> VINF_SUCCESS<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<h3>22.2 \u4eceGuestOS\u91cc\u83b7\u53d6\u548c\u5199\u5165\u5bc4\u5b58\u5668\u4fe1\u606f<\/h3>\n<h4>nemR0WinImportState<\/h4>\n<p>\u4eceHypervisor\u91cc\u83b7\u53d6\u5bc4\u5b58\u5668\u7684\u503c<\/p>\n<pre><code class=\"prism language-cpp\">NEM_TMPL_STATIC <span class=\"token keyword\">int<\/span> <span class=\"token function\">nemR0WinImportState<\/span><span class=\"token punctuation\">(<\/span>PGVM pGVM<span class=\"token punctuation\">,<\/span> PGVMCPU pGVCpu<span class=\"token punctuation\">,<\/span> PCPUMCTX pCtx<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">uint64_t<\/span> fWhat<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">bool<\/span> fCanUpdateCr3<span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">{ \n <!-- --><\/span>\n HV_INPUT_GET_VP_REGISTERS <span class=\"token operator\">*<\/span>pInput <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span>HV_INPUT_GET_VP_REGISTERS <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nemr0<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>HypercallData<span class=\"token punctuation\">.<\/span>pbPage<span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>PartitionId <span class=\"token operator\">=<\/span> pGVM<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nemr0<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>idHvPartition<span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>VpIndex <span class=\"token operator\">=<\/span> pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>idCpu<span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>fFlags <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>\n \n <span class=\"token comment\">\/\/\u8bbe\u7f6e\u6bcf\u4e2aregister\u7684\u540d\u5b57<\/span>\n uintptr_t iReg <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_GPRS_MASK<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_RAX<span class=\"token punctuation\">)<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Names<span class=\"token punctuation\">[<\/span>iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> HvX64RegisterRax<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_RCX<span class=\"token punctuation\">)<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Names<span class=\"token punctuation\">[<\/span>iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> HvX64RegisterRcx<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u6bb5\u5bc4\u5b58\u5668<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_SREG_MASK<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_CS<span class=\"token punctuation\">)<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Names<span class=\"token punctuation\">[<\/span>iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> HvX64RegisterCs<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\n <span class=\"token comment\">\/\/crx<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_CR_MASK<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_CR0<span class=\"token punctuation\">)<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Names<span class=\"token punctuation\">[<\/span>iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> HvX64RegisterCr0<span class=\"token punctuation\">;<\/span>\n \t<span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\n <span class=\"token punctuation\">}<\/span>\n \t<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_APIC_TPR<span class=\"token punctuation\">)<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Names<span class=\"token punctuation\">[<\/span>iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> HvX64RegisterCr8<span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/xmm<\/span>\n \t<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_SSE_AVX<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Names<span class=\"token punctuation\">[<\/span>iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> HvX64RegisterXmm0<span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Names<span class=\"token punctuation\">[<\/span>iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> HvX64RegisterXmm1\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\n <span class=\"token comment\">\/\/\u8c03\u7528hypercall\uff0c\u83b7\u53d6register\u91cc\u7684\u503c<\/span>\n <span class=\"token keyword\">uint64_t<\/span> uResult <span class=\"token operator\">=<\/span> <span class=\"token function\">g_pfnHvlInvokeHypercall<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">HV_MAKE_CALL_INFO<\/span><span class=\"token punctuation\">(<\/span>HvCallGetVpRegisters<span class=\"token punctuation\">,<\/span> cRegs<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nemr0<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>HypercallData<span class=\"token punctuation\">.<\/span>HCPhysPage<span class=\"token punctuation\">,<\/span>\n pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nemr0<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>HypercallData<span class=\"token punctuation\">.<\/span>HCPhysPage <span class=\"token operator\">+<\/span> cbInput<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u62f7\u8d1d\u83b7\u53d6\u7684\u5bc4\u5b58\u5668\u503c\u5230CPUMCTX\u7ed3\u6784\u4f53\u91cc<\/span>\n \t<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_GPRS_MASK<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_RAX<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>rax <span class=\"token operator\">=<\/span> paValues<span class=\"token punctuation\">[<\/span>iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Reg64<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_CR0<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u90e8\u5206\u5bc4\u5b58\u5668\u503c\u6539\u53d8\u4f1a\u6539\u53d8CPU\u7684\u884c\u4e3a\uff0c\u6240\u4ee5\u9700\u8981\u8c03\u7528\u76f8\u5e94\u7684API\u6539\u53d8CPU\u7684\u884c\u4e3a<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cr0 <span class=\"token operator\">!=<\/span> paValues<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Reg64<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token function\">CPUMSetGuestCR0<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">,<\/span> paValues<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Reg64<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n fMaybeChangedMode <span class=\"token operator\">=<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\n \t<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_EFER<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n \t<span class=\"token comment\">\/\/efer\u5bc4\u5b58\u5668\u6539\u53d8<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>paValues<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Reg64 <span class=\"token operator\">!=<\/span> pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>msrEFER<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n \t<span class=\"token comment\">\/\/\u5982\u679c\u4fee\u6539\u4e86NXE\u4f4d\uff0c\u901a\u77e5PGM NX\u72b6\u6001\u6539\u53d8<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>paValues<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Reg64 <span class=\"token operator\">^<\/span> pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>msrEFER<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&<\/span> MSR_K6_EFER_NXE<span class=\"token punctuation\">)<\/span>\n <span class=\"token function\">PGMNotifyNxeChanged<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token function\">RT_BOOL<\/span><span class=\"token punctuation\">(<\/span>paValues<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Reg64 <span class=\"token operator\">&<\/span> MSR_K6_EFER_NXE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>msrEFER <span class=\"token operator\">=<\/span> paValues<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Reg64<span class=\"token punctuation\">;<\/span>\n fMaybeChangedMode <span class=\"token operator\">=<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\n \t<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_OTHER_MSRS<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/APIC Base\u6539\u53d8\uff0c\u9700\u8981\u8bbe\u7f6e\u865a\u62dfAPIC\u91cc\u7684base<\/span>\n <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">uint64_t<\/span> uOldBase <span class=\"token operator\">=<\/span> <span class=\"token function\">APICGetBaseMsrNoCheck<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>paValues<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Reg64 <span class=\"token operator\">!=<\/span> uOldBase<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">int<\/span> rc2 <span class=\"token operator\">=<\/span> <span class=\"token function\">APICSetBaseMsr<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">,<\/span> paValues<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Reg64<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\n <span class=\"token comment\">\/\/\u8bbe\u7f6e\u4e2d\u65ad\u5c4f\u853d\u6807\u8bb0\u4f4d<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> <span class=\"token punctuation\">(<\/span>CPUMCTX_EXTRN_NEM_WIN_INHIBIT_INT <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_NMI<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">(<\/span>pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>fExtrn <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_INT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fLastInterruptShadow <span class=\"token operator\">=<\/span> paValues<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>InterruptState<span class=\"token punctuation\">.<\/span>InterruptShadow<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>paValues<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>InterruptState<span class=\"token punctuation\">.<\/span>InterruptShadow<span class=\"token punctuation\">)<\/span>\n <span class=\"token function\">EMSetInhibitInterruptsPC<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">,<\/span> paValues<span class=\"token punctuation\">[<\/span>iReg <span class=\"token operator\">+<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Reg64<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">else<\/span>\n <span class=\"token function\">VMCPU_FF_CLEAR<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_INHIBIT_INTERRUPTS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">(<\/span>pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>fExtrn <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_NMI<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>paValues<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>InterruptState<span class=\"token punctuation\">.<\/span>NmiMasked<span class=\"token punctuation\">)<\/span>\n <span class=\"token function\">VMCPU_FF_SET<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_BLOCK_NMIS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">else<\/span>\n <span class=\"token function\">VMCPU_FF_CLEAR<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_BLOCK_NMIS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n fWhat <span class=\"token operator\">|<\/span><span class=\"token operator\">=<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_INT <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_NMI<span class=\"token punctuation\">;<\/span>\n iReg <span class=\"token operator\">+<\/span><span class=\"token operator\">=<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u8fd0\u884c\u6a21\u5f0f\u6539\u53d8\uff0c\u901a\u77e5PGM\u505a\u51fa\u5bf9\u5e94\u6539\u53d8<\/span>\n <span class=\"token keyword\">int<\/span> rc <span class=\"token operator\">=<\/span> VINF_SUCCESS<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fMaybeChangedMode<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n rc <span class=\"token operator\">=<\/span> <span class=\"token function\">PGMChangeMode<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">,<\/span> pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cr0<span class=\"token punctuation\">,<\/span> pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cr4<span class=\"token punctuation\">,<\/span> pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>msrEFER<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<h4>nemR0WinExportState<\/h4>\n<p>\u628aCPUMCTX\u91cc\u7684\u5bc4\u5b58\u5668\u5199\u5165GuestOS\u91cc\uff0c\u539f\u7406\u548c\u4e0a\u9762ImportState\u7c7b\u4f3c\uff0c\u5199\u628a\u6240\u6709\u5bc4\u5b58\u5668\u7684\u540d\u5b57\/value\u5199\u5165HypercallData.pbPage\u91cc\uff0c\u7136\u540e\u8c03\u7528HvCallSetVpRegisters hypercall\u5199\u5165GuestOS\u5bc4\u5b58\u5668\u4fe1\u606f\uff0c\u76f8\u5173\u5bc4\u5b58\u5668\u7684\u5b9a\u4e49\u53ef\u4ee5\u53c2\u8003\u4e0b\u9762\u7684\u6587\u6863\uff1a<\/p>\n<p>https:\/\/docs.microsoft.com\/en-us\/virtualization\/api\/hypervisor-platform\/funcs\/whvvirtualprocessordatatypes<\/p>\n<p>Virtualbox\u5bf9\u5e94\u7684\u5934\u6587\u4ef6\u5b9a\u4e49\u5728 include\\iprt\\nt\\hyperv.h\u91cc<\/p>\n<pre><code class=\"prism language-cpp\">NEM_TMPL_STATIC <span class=\"token keyword\">int<\/span> <span class=\"token function\">nemR0WinExportState<\/span><span class=\"token punctuation\">(<\/span>PGVM pGVM<span class=\"token punctuation\">,<\/span> PGVMCPU pGVCpu<span class=\"token punctuation\">,<\/span> PCPUMCTX pCtx<span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">{ \n <!-- --><\/span>\n HV_INPUT_SET_VP_REGISTERS <span class=\"token operator\">*<\/span>pInput <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span>HV_INPUT_SET_VP_REGISTERS <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nemr0<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>HypercallData<span class=\"token punctuation\">.<\/span>pbPage<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">uint64_t<\/span> <span class=\"token keyword\">const<\/span> fWhat <span class=\"token operator\">=<\/span> <span class=\"token operator\">~<\/span>pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>fExtrn <span class=\"token operator\">&<\/span> <span class=\"token punctuation\">(<\/span>CPUMCTX_EXTRN_ALL <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_NEM_WIN_MASK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u6839\u636efWhat\u91cc\u7684flag\uff0c\u5199\u5165\u9700\u8981\u4fee\u6539\u7684GuestOS\u5bc4\u5b58\u5668\u540d\u5b57\u548cvalue<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_GPRS_MASK<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/rax<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_RAX<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token function\">HV_REGISTER_ASSOC_ZERO_PADDING_AND_HI64<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&<\/span>pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Name <span class=\"token operator\">=<\/span> HvX64RegisterRax<span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Value<span class=\"token punctuation\">.<\/span>Reg64 <span class=\"token operator\">=<\/span> pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>rax<span class=\"token punctuation\">;<\/span>\n iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u6bb5\u5bc4\u5b58\u5668<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_SREG_MASK<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_CS<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token function\">COPY_OUT_SEG<\/span><span class=\"token punctuation\">(<\/span>iReg<span class=\"token punctuation\">,<\/span> HvX64RegisterCs<span class=\"token punctuation\">,<\/span> pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cs<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u6709pending\u7684event\uff0c\u9700\u8981\u83b7\u53d6pending\u4e2d\u65ad\u4fe1\u606f\u548cevent vector<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_NEM_WIN_EVENT_INJECT<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token function\">HV_REGISTER_ASSOC_ZERO_PADDING_AND_HI64<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&<\/span>pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Name <span class=\"token operator\">=<\/span> HvRegisterPendingInterruption<span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Value<span class=\"token punctuation\">.<\/span>Reg64 <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>\n iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n \n <span class=\"token comment\">\/\/\u5982\u679c\u5c4f\u853d\u4e86\u4e2d\u65ad\u548cnmi\uff0c\u9700\u8981\u5199\u5165WHV_X64_INTERRUPT_STATE_REGISTER\u7684\u4fe1\u606f\uff08InterruptShadow\/NmiMasked\uff09<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> <span class=\"token punctuation\">(<\/span>CPUMCTX_EXTRN_NEM_WIN_INHIBIT_INT <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_NMI<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">==<\/span> <span class=\"token punctuation\">(<\/span>CPUMCTX_EXTRN_NEM_WIN_INHIBIT_INT <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_NMI<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token function\">HV_REGISTER_ASSOC_ZERO_PADDING_AND_HI64<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&<\/span>pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Name <span class=\"token operator\">=<\/span> HvRegisterInterruptState<span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Value<span class=\"token punctuation\">.<\/span>Reg64 <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token function\">VMCPU_FF_IS_SET<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_INHIBIT_INTERRUPTS<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">&&<\/span> <span class=\"token function\">EMGetInhibitInterruptsPC<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">==<\/span> pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>rip<span class=\"token punctuation\">)<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Value<span class=\"token punctuation\">.<\/span>InterruptState<span class=\"token punctuation\">.<\/span>InterruptShadow <span class=\"token operator\">=<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">VMCPU_FF_IS_SET<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_BLOCK_NMIS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Value<span class=\"token punctuation\">.<\/span>InterruptState<span class=\"token punctuation\">.<\/span>NmiMasked <span class=\"token operator\">=<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span>\n iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u5982\u679c\u5c4f\u853d\u4e86\u4e2d\u65ad\uff0c\u5199\u5165InterruptShadow\u4fe1\u606f<\/span>\n <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fWhat <span class=\"token operator\">&<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_INT<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fLastInterruptShadow\n <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token function\">VMCPU_FF_IS_SET<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_INHIBIT_INTERRUPTS<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">&&<\/span> <span class=\"token function\">EMGetInhibitInterruptsPC<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">==<\/span> pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>rip<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token function\">HV_REGISTER_ASSOC_ZERO_PADDING_AND_HI64<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&<\/span>pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Name <span class=\"token operator\">=<\/span> HvRegisterInterruptState<span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Value<span class=\"token punctuation\">.<\/span>Reg64 <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token function\">VMCPU_FF_IS_SET<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_INHIBIT_INTERRUPTS<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">&&<\/span> <span class=\"token function\">EMGetInhibitInterruptsPC<\/span><span class=\"token punctuation\">(<\/span>pGVCpu<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">==<\/span> pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>rip<span class=\"token punctuation\">)<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Value<span class=\"token punctuation\">.<\/span>InterruptState<span class=\"token punctuation\">.<\/span>InterruptShadow <span class=\"token operator\">=<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span>\n iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u6709\u88ab\u5c4f\u853d\u7684\u4e2d\u65ad\uff0c\u5199\u5165WHV_X64_DELIVERABILITY_NOTIFICATIONS_REGISTER\u544a\u8bc9Guest\u4e2d\u65ad\u88ab\u5c4f\u853d\u4e86<\/span>\n <span class=\"token comment\">\/\/fDesiredInterruptWindows\u5728nemHCWinHandleInterruptFF\u91cc\u88ab\u590d\u5236<\/span>\n <span class=\"token keyword\">uint8_t<\/span> <span class=\"token keyword\">const<\/span> fDesiredIntWin <span class=\"token operator\">=<\/span> pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fDesiredInterruptWindows<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> fDesiredIntWin\n <span class=\"token operator\">||<\/span> pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fCurrentInterruptWindows <span class=\"token operator\">!=<\/span> fDesiredIntWin<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fCurrentInterruptWindows <span class=\"token operator\">=<\/span> pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nem<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>fDesiredInterruptWindows<span class=\"token punctuation\">;<\/span>\n <span class=\"token function\">HV_REGISTER_ASSOC_ZERO_PADDING_AND_HI64<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&<\/span>pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Name <span class=\"token operator\">=<\/span> HvX64RegisterDeliverabilityNotifications<span class=\"token punctuation\">;<\/span>\n pInput<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>Elements<span class=\"token punctuation\">[<\/span>iReg<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>Value<span class=\"token punctuation\">.<\/span>DeliverabilityNotifications<span class=\"token punctuation\">.<\/span>AsUINT64 <span class=\"token operator\">=<\/span> fDesiredIntWin<span class=\"token punctuation\">;<\/span>\n iReg<span class=\"token operator\">++<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u5bc4\u5b58\u5668\u8bbe\u7f6e\u5b8c\u6bd5\uff0c\u8c03\u7528HvCallSetVpRegisters hyperV\u628a\u5bc4\u5b58\u5668\u5199\u5165GuestOS\u91cc<\/span>\n <span class=\"token keyword\">uint64_t<\/span> uResult <span class=\"token operator\">=<\/span> <span class=\"token function\">g_pfnHvlInvokeHypercall<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">HV_MAKE_CALL_INFO<\/span><span class=\"token punctuation\">(<\/span>HvCallSetVpRegisters<span class=\"token punctuation\">,<\/span> iReg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n pGVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>nemr0<span class=\"token punctuation\">.<\/span>s<span class=\"token punctuation\">.<\/span>HypercallData<span class=\"token punctuation\">.<\/span>HCPhysPage<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span> <span class=\"token comment\">\/*GCPhysOutput*\/<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n pCtx<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>fExtrn <span class=\"token operator\">|<\/span><span class=\"token operator\">=<\/span> CPUMCTX_EXTRN_ALL <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_NEM_WIN_MASK <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_KEEPER_NEM<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">return<\/span> VINF_SUCCESS<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<h3>22.3\u4e2d\u65ad\u5904\u7406<\/h3>\n<h4>nemHCWinHandleInterruptFF<\/h4>\n<p>\u5904\u7406pending\u4e2d\u65ad<\/p>\n<pre><code class=\"prism language-cpp\">NEM_TMPL_STATIC VBOXSTRICTRC <span class=\"token function\">nemHCWinHandleInterruptFF<\/span><span class=\"token punctuation\">(<\/span>PVMCC pVM<span class=\"token punctuation\">,<\/span> PVMCPUCC pVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">uint8_t<\/span> <span class=\"token operator\">*<\/span>pfInterruptWindows<span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u5982\u679c\u6709pending\u4e2d\u7684\uff0c\u628a\u4e2d\u65ad\u4eceAPIC\u7684PIB\u5185\u5b58\u91cc\u66f4\u65b0\u5230IRR\u91cc\u6392\u961f<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">VMCPU_FF_TEST_AND_CLEAR<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_UPDATE_APIC<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n \t<span class=\"token comment\">\/\/\u5177\u4f53\u5b9e\u73b0\u89c1\u524d\u9762APIC\u4e00\u7bc7<\/span>\n <span class=\"token function\">APICUpdatePendingInterrupts<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u5982\u679c\u6ca1\u6709\u4e2d\u65ad\u9700\u8981\u5904\u7406\uff0c\u76f4\u63a5\u8fd4\u56de<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">VMCPU_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_INTERRUPT_APIC <span class=\"token operator\">|<\/span> VMCPU_FF_INTERRUPT_PIC\n <span class=\"token operator\">|<\/span> VMCPU_FF_INTERRUPT_NMI <span class=\"token operator\">|<\/span> VMCPU_FF_INTERRUPT_SMI<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token keyword\">return<\/span> VINF_SUCCESS<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n \t<span class=\"token comment\">\/\/\u73b0\u5728\u65e0\u6cd5\u5904\u7406SMI\u4e2d\u65ad\uff0c\u8fd4\u56de\u9519\u8bef<\/span>\n <span class=\"token function\">AssertReturn<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">VMCPU_FF_IS_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_INTERRUPT_SMI<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> VERR_NEM_IPE_0<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u662f\u5426\u6709nmi\u4e2d\u65ad<\/span>\n <span class=\"token keyword\">bool<\/span> <span class=\"token keyword\">const<\/span> fPendingNmi <span class=\"token operator\">=<\/span> <span class=\"token function\">VMCPU_FF_IS_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_INTERRUPT_NMI<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token comment\">\/\/\u4ece\u8c03\u7528hypercall\u83b7\u53d6GuestOS\u76f8\u5173\u5bc4\u5b58\u5668\u503c<\/span>\n <span class=\"token keyword\">uint64_t<\/span> fNeedExtrn <span class=\"token operator\">=<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_INT <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_RIP <span class=\"token operator\">|<\/span> CPUMCTX_EXTRN_RFLAGS <span class=\"token operator\">|<\/span> <span class=\"token punctuation\">(<\/span>fPendingNmi <span class=\"token operator\">?<\/span> CPUMCTX_EXTRN_NEM_WIN_INHIBIT_NMI <span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">.<\/span>fExtrn <span class=\"token operator\">&<\/span> fNeedExtrn<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n VBOXSTRICTRC rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">nemHCWinImportStateIfNeededStrict<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> NEM_WIN_CPUMCTX_EXTRN_MASK_FOR_IEM_XCPT<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"IntFF\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">!=<\/span> VINF_SUCCESS<span class=\"token punctuation\">)<\/span>\n <span class=\"token keyword\">return<\/span> rcStrict<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u5982\u679c\u5f00\u542f\u4e86\u5c4f\u853d\u4e2d\u65ad\u800c\u4e14\u5f53\u524drip\u662f\u53d1\u751f\u4e2d\u65ad\u7684RIP\uff08\u5f53\u524d\u53d1\u751f\u7684\u4e2d\u65ad\u88ab\u5c4f\u853d\u4e86\uff09<\/span>\n <span class=\"token keyword\">bool<\/span> <span class=\"token keyword\">const<\/span> fInhibitInterrupts <span class=\"token operator\">=<\/span> <span class=\"token function\">VMCPU_FF_IS_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_INHIBIT_INTERRUPTS<span class=\"token punctuation\">)<\/span>\n <span class=\"token operator\">&&<\/span> <span class=\"token function\">EMGetInhibitInterruptsPC<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">==<\/span> pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">.<\/span>rip<span class=\"token punctuation\">;<\/span>\n \n <span class=\"token comment\">\/\/\u6709pending\u7684nmi\u4e2d\u65ad\uff0c\u8c03\u7528IEM\u91cc\u51fd\u6570\u6a21\u62df\u6267\u884c\u6ce8\u5165\u4e2d\u65ad<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fPendingNmi<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token operator\">!<\/span>fInhibitInterrupts\n <span class=\"token operator\">&&<\/span> <span class=\"token operator\">!<\/span><span class=\"token function\">VMCPU_FF_IS_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_BLOCK_NMIS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n VBOXSTRICTRC rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">nemHCWinImportStateIfNeededStrict<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> NEM_WIN_CPUMCTX_EXTRN_MASK_FOR_IEM_XCPT<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"NMI\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">==<\/span> VINF_SUCCESS<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token function\">VMCPU_FF_CLEAR<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_INTERRUPT_NMI<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">IEMInjectTrap<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> X86_XCPT_NMI<span class=\"token punctuation\">,<\/span> TRPM_HARDWARE_INT<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token keyword\">return<\/span> rcStrict<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u4e2d\u65ad\u88ab\u5c4f\u853d\u4e86<\/span>\n <span class=\"token operator\">*<\/span>pfInterruptWindows <span class=\"token operator\">|<\/span><span class=\"token operator\">=<\/span> NEM_WIN_INTW_F_NMI<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n\n <span class=\"token comment\">\/\/\u6709APIC\/PIC\u4e2d\u65ad<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">VMCPU_FF_IS_ANY_SET<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> VMCPU_FF_INTERRUPT_APIC <span class=\"token operator\">|<\/span> VMCPU_FF_INTERRUPT_PIC<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token operator\">!<\/span>fInhibitInterrupts\n <span class=\"token operator\">&&<\/span> pVCpu<span class=\"token operator\">-<\/span><span class=\"token operator\">><\/span>cpum<span class=\"token punctuation\">.<\/span>GstCtx<span class=\"token punctuation\">.<\/span>rflags<span class=\"token punctuation\">.<\/span>Bits<span class=\"token punctuation\">.<\/span>u1IF<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u83b7\u53d6\u9700\u8981\u7684\u5bc4\u5b58\u5668\u4fe1\u606f<\/span>\n VBOXSTRICTRC rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">nemHCWinImportStateIfNeededStrict<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> NEM_WIN_CPUMCTX_EXTRN_MASK_FOR_IEM_XCPT<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"NMI\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcStrict <span class=\"token operator\">==<\/span> VINF_SUCCESS<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u4eceAPIC\u91cc\u83b7\u53d6\u4e00\u4e2a\u4f18\u5148\u7ea7\u6700\u9ad8\u7684\u4e2d\u65ad\uff0c\u79fb\u52a8\u5230APIC\u8bbe\u5907\u7684ISR\u961f\u5217\u4e2d<\/span>\n <span class=\"token keyword\">uint8_t<\/span> bInterrupt<span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">int<\/span> rc <span class=\"token operator\">=<\/span> <span class=\"token function\">PDMGetInterrupt<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&<\/span>bInterrupt<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">RT_SUCCESS<\/span><span class=\"token punctuation\">(<\/span>rc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token comment\">\/\/\u6a21\u62df\u6267\u884c\u6ce8\u5165\u4e2d\u65ad<\/span>\n rcStrict <span class=\"token operator\">=<\/span> <span class=\"token function\">IEMInjectTrap<\/span><span class=\"token punctuation\">(<\/span>pVCpu<span class=\"token punctuation\">,<\/span> bInterrupt<span class=\"token punctuation\">,<\/span> TRPM_HARDWARE_INT<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u4e2d\u65ad\u4f18\u5148\u7ea7\u5c0f\u4e8e\u5f53\u524dVCPU\u8fd0\u884c\u4f18\u5148\u7ea7\uff0c\u88ab\u5c4f\u853d\u4e86\uff0c\u8bb0\u5f55\u4e0b\u4fe1\u606f<\/span>\n <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rc <span class=\"token operator\">==<\/span> VERR_APIC_INTR_MASKED_BY_TPR<span class=\"token punctuation\">)<\/span>\n <span class=\"token punctuation\">{ \n <!-- --><\/span>\n <span class=\"token operator\">*<\/span>pfInterruptWindows <span class=\"token operator\">|<\/span><span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span>bInterrupt <span class=\"token operator\">>><\/span> <span class=\"token number\">4<\/span> <span class=\"token comment\">\/*??*\/<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\"><<<\/span> NEM_WIN_INTW_F_PRIO_SHIFT<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token keyword\">return<\/span> rcStrict<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n <span class=\"token comment\">\/\/\u4e2d\u65ad\u88ab\u5c4f\u853d\u4e86\uff0c\u8bb0\u5f55\u4e0b\u4fe1\u606f<\/span>\n <span class=\"token operator\">*<\/span>pfInterruptWindows <span class=\"token operator\">|<\/span><span class=\"token operator\">=<\/span> NEM_WIN_INTW_F_REGULAR<span class=\"token punctuation\">;<\/span>\n <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<h3><\/h3>\n","protected":false},"excerpt":{"rendered":"Virtualbox\u6e90\u7801\u5206\u679022 NEM(Hyper-V\u517c\u5bb9)3 Emulation ThreadNativeexecutionmanager\uff08EmulationThread\uff09\u6587\u7ae0\u76ee\u5f55Nativeexecuti...","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"_links":{"self":[{"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/posts\/6407"}],"collection":[{"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/comments?post=6407"}],"version-history":[{"count":0,"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/posts\/6407\/revisions"}],"wp:attachment":[{"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/media?parent=6407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/categories?post=6407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/tags?post=6407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}