From patchwork Fri Feb 28 20:59:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Alexey Romko X-Patchwork-Id: 1246830 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=yahoo.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=yahoo.com header.i=@yahoo.com header.a=rsa-sha256 header.s=s2048 header.b=F0s8CfRd; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48Thkw0R1Fz9sQt for ; Sat, 29 Feb 2020 08:00:23 +1100 (AEDT) Received: from localhost ([::1]:53826 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j7mk9-0006DJ-P0 for incoming@patchwork.ozlabs.org; Fri, 28 Feb 2020 16:00:21 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:58668) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j7mjn-00069I-Va for qemu-devel@nongnu.org; Fri, 28 Feb 2020 16:00:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1j7mjl-0000M0-UQ for qemu-devel@nongnu.org; Fri, 28 Feb 2020 15:59:59 -0500 Received: from sonic310-11.consmr.mail.ir2.yahoo.com ([77.238.177.32]:45445) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1j7mjl-0000J7-Nc for qemu-devel@nongnu.org; Fri, 28 Feb 2020 15:59:57 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1582923595; bh=7uxKgR/4Bt0taBXYRLRkq2kSBEO6uFIUfYS5cxzvEXQ=; h=Date:From:To:Cc:Subject:References:From:Subject; b=F0s8CfRdmH8mZBKGp418OWk4ppP285rbRslKJRIDhxlinS/8RqbvDWv5YH9esIs/7TZv81cxl9OwtWOacjNxkGRzAXVoCSUL9bnwNlPxd19JF6tbSEx+fVGfaqdwDhT1GpEZ99ThQW6vJ0is3hUtamzGCc6dJ87GrNDjLVKiCUgiBSSb9+PQpTzTGmSBiCn+0zrGGya30VWstFkOoTpK4gy2vV1Jfr+4wyj4PTomt0lbtDcHNGcw9YH4bAVNACAQCos6Azoe3lGgXpAql9RGujCW/FdjNsc14Wi33od4yPJaxkeSP9VCAZKJ+HjEnPNT/s2ZywaSvSsQsDvI3DI2mA== X-YMail-OSG: XD1hVh8VM1kWwWsIbER1CFnHVgraKbEdFKD3pU8CRAzOXi4FjmbwDw51n6OYgjU NavWU6Ch9x3ThKZqYkydbWMUEJpEeWFCk21RLDWsbRyCDngmwvNGRCVIJN.WF_wet5eo93N5kBdO dNB1gK4m2lcS2_Qv0dudAQveo7iSjocPIreDYVGBI7gYMbDKW6AVtfe6EdDy1gN1cxc.psBaEoU2 4G63fe9vB8vwzSNEKNxlrFZasJl4VCoeSfilCWqvvKZ4qLwrRvwnwVO_FQCJ.Gqefnd11l2fjfa5 GnCkfkJ8doKHClYnsU4yvM1U.EKSOENETFvEo1F.OQaAqKbPC.HX6h5DsJ5G0yU8f84Jn.UTI1aM myVp6_K1qst7ZHWwuqv.M1XtW4m9KL9.6ouesgkNSU3rorVZsVI.YS9ssSySjtk7jUzb03ynrzFm aBaXMQZcaP7P.Cvk9R39Sd1Te3geq2ZlN2soefd4imVMmj832wKs9u26F_7bnG5sj4Ya13J3QSv9 6pZTcZZ_SJNK.ZzEkpuQ7JvM377KZWoXZfifowesRKdknRHH0X9zD2hJPPDKa82ur7Ba1sO__QPf hCTWDUsaN_4awMKMOaO9Xp.aDbUmbe9XxufFRTb6R8M4YlRIYr2dd_ayyYozIZqlYH_5QBgDQRuT 5O9pcnUqaoF9sDvcVGIywGvlZ_aqy_R_vzYheVgiqhf7oBOkDl1fjswH8sFxdrqA9NUQwF3YEsL4 z4yJ795Rrc2DUQRd.DsL5oG9G3iK7759zQh0jL06vg0z3IUXWawXYOVZ.5tQDeIPGZ8MngK45A44 rOcQaxem236GnQ6SEaJp.Qe30cl69kkWnbXO0Bfo2ZnmfgeJUIIKZaUpfpxYcZbzCfswypfeV0hq xjndihe9vP4IyYeJJLPbJkP2F3Qf7SwK34VbGMecmw3C6862TrqE8V_MtouR5TSTPP4GDtZ_yBFQ mZnM3vmvEBeLi5OrlO2Imd47TeQFb2vDgy_kZtW5iKPJqP2xQuQ.7LtiKOjnSHvLTZp41Q9Vl43g n7g2qbEept1JEPNlRaH2wVc8RNxTQz8NoKJteTJUnJuPjAFzDXF_5q5qEKIQOXXdpiGSyuyfll6a 2Zz12Qnbsflx5bFnKYgQFjUBElafJmlHDjMBdu47bEGlRXphFsbVq6Lfq7gE68RjHi8vLafFIKrG VRo74suxlgfMSzTyf8ajp4cRsIaBtVzUCSItx43LpzySDXAgyr2Ni7gjujockgeTjCR9iH5bhMRt ZpQD2rcdnvrXXMAT_2WePg6MfKDBhqw3vw1PtiFEH8wVGLNgVQP2ECJ2H89kMvnYsVe586Z.zlm_ BclZull77FNnq0nV3Yqvw_nY- Received: from sonic.gate.mail.ne1.yahoo.com by sonic310.consmr.mail.ir2.yahoo.com with HTTP; Fri, 28 Feb 2020 20:59:55 +0000 Date: Fri, 28 Feb 2020 20:59:52 +0000 (UTC) From: Alexey Romko To: "qemu-devel@nongnu.org" Cc: "wenchao.wang@intel.com" , "colin.xu@intel.com" Message-ID: <1786823015.3514736.1582923592218@mail.yahoo.com> Subject: [PATCH] Add PAT, cr8 and EFER for 32-bit qemu to hax ioctl interface MIME-Version: 1.0 References: <1786823015.3514736.1582923592218.ref@mail.yahoo.com> X-Mailer: WebService/1.1.15302 YMailNorrin Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 OPR/65.0.3467.72 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 77.238.177.32 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add PAT, cr8 and EFER for 32-bit qemu to hax ioctl interface, part of HAX PR 204 Signed-off-by: Alexey Romko ---  target/i386/hax-all.c       | 32 ++++++++++++++++++++++++++++----  target/i386/hax-i386.h      |  2 +-  target/i386/hax-interface.h |  2 ++  3 files changed, 31 insertions(+), 5 deletions(-) --  2.15.0.windows.1 diff --git a/target/i386/hax-all.c b/target/i386/hax-all.c index a8b6e5aeb8..0bdd309665 100644 --- a/target/i386/hax-all.c +++ b/target/i386/hax-all.c @@ -45,7 +45,7 @@      } while (0)    /* Current version */ -const uint32_t hax_cur_version = 0x4; /* API v4: unmapping and MMIO moves */ +const uint32_t hax_cur_version = 0x5; /* API v5: supports CR8/EFER/PAT */  /* Minimum HAX kernel version */  const uint32_t hax_min_version = 0x4; /* API v4: supports unmapping */   @@ -137,6 +137,7 @@ static int hax_version_support(struct hax_state *hax)          return 0;      }   +    hax_global.cur_api_version = version.cur_version;      return 1;  }   @@ -845,12 +846,24 @@ static int hax_sync_vcpu_register(CPUArchState *env, int set)          regs._cr2 = env->cr[2];          regs._cr3 = env->cr[3];          regs._cr4 = env->cr[4]; + +        if( hax_global.cur_api_version >= 0x5 ) { +          CPUState *cs = env_cpu(env); +          X86CPU *x86_cpu = X86_CPU(cs); +          regs._cr8 = cpu_get_apic_tpr(x86_cpu->apic_state); +        } +          hax_set_segments(env, ®s);      } else {          env->cr[0] = regs._cr0;          env->cr[2] = regs._cr2;          env->cr[3] = regs._cr3;          env->cr[4] = regs._cr4; + +        //if( hax_global.cur_api_version >= 0x5 ) { +          //no need to update TPR from regs._cr8, since all changes are notified. +        //} +          hax_get_segments(env, ®s);      }   @@ -881,14 +894,18 @@ static int hax_get_msrs(CPUArchState *env)      msrs[n++].entry = MSR_IA32_SYSENTER_ESP;      msrs[n++].entry = MSR_IA32_SYSENTER_EIP;      msrs[n++].entry = MSR_IA32_TSC; -#ifdef TARGET_X86_64      msrs[n++].entry = MSR_EFER; +#ifdef TARGET_X86_64      msrs[n++].entry = MSR_STAR;      msrs[n++].entry = MSR_LSTAR;      msrs[n++].entry = MSR_CSTAR;      msrs[n++].entry = MSR_FMASK;      msrs[n++].entry = MSR_KERNELGSBASE;  #endif +    if( hax_global.cur_api_version >= 0x5 ) { +      msrs[n++].entry = MSR_PAT; +    } +      md.nr_msr = n;      ret = hax_sync_msr(env, &md, 0);      if (ret < 0) { @@ -909,10 +926,10 @@ static int hax_get_msrs(CPUArchState *env)          case MSR_IA32_TSC:              env->tsc = msrs[i].value;              break; -#ifdef TARGET_X86_64          case MSR_EFER:              env->efer = msrs[i].value;              break; +#ifdef TARGET_X86_64          case MSR_STAR:              env->star = msrs[i].value;              break; @@ -929,6 +946,9 @@ static int hax_get_msrs(CPUArchState *env)              env->kernelgsbase = msrs[i].value;              break;  #endif +        case MSR_PAT: +            env->pat = msrs[i].value; +            break;          }      }   @@ -947,14 +967,18 @@ static int hax_set_msrs(CPUArchState *env)      hax_msr_entry_set(&msrs[n++], MSR_IA32_SYSENTER_ESP, env->sysenter_esp);      hax_msr_entry_set(&msrs[n++], MSR_IA32_SYSENTER_EIP, env->sysenter_eip);      hax_msr_entry_set(&msrs[n++], MSR_IA32_TSC, env->tsc); -#ifdef TARGET_X86_64      hax_msr_entry_set(&msrs[n++], MSR_EFER, env->efer); +#ifdef TARGET_X86_64      hax_msr_entry_set(&msrs[n++], MSR_STAR, env->star);      hax_msr_entry_set(&msrs[n++], MSR_LSTAR, env->lstar);      hax_msr_entry_set(&msrs[n++], MSR_CSTAR, env->cstar);      hax_msr_entry_set(&msrs[n++], MSR_FMASK, env->fmask);      hax_msr_entry_set(&msrs[n++], MSR_KERNELGSBASE, env->kernelgsbase);  #endif +    if( hax_global.cur_api_version >= 0x5 ) { +      hax_msr_entry_set(&msrs[n++], MSR_PAT, env->pat); +    } +      md.nr_msr = n;      md.done = 0;   diff --git a/target/i386/hax-i386.h b/target/i386/hax-i386.h index 54e9d8b057..9515803184 100644 --- a/target/i386/hax-i386.h +++ b/target/i386/hax-i386.h @@ -34,7 +34,7 @@ struct hax_vcpu_state {    struct hax_state {      hax_fd fd; /* the global hax device interface */ -    uint32_t version; +    uint32_t cur_api_version;      struct hax_vm *vm;      uint64_t mem_quota;      bool supports_64bit_ramblock; diff --git a/target/i386/hax-interface.h b/target/i386/hax-interface.h index 537ae084e9..c87aedbc2e 100644 --- a/target/i386/hax-interface.h +++ b/target/i386/hax-interface.h @@ -218,6 +218,8 @@ struct vcpu_state_t {      uint32_t _activity_state;      uint32_t pad;      interruptibility_state_t _interruptibility_state; + +    uint64_t _cr8;  };    /* HAX exit status */