From patchwork Wed Oct 23 13:38:26 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 3088831 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 3B56C9F2B8 for ; Wed, 23 Oct 2013 13:38:44 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 19845203C4 for ; Wed, 23 Oct 2013 13:38:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 02607203AF for ; Wed, 23 Oct 2013 13:38:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751412Ab3JWNie (ORCPT ); Wed, 23 Oct 2013 09:38:34 -0400 Received: from david.siemens.de ([192.35.17.14]:34914 "EHLO david.siemens.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750936Ab3JWNid (ORCPT ); Wed, 23 Oct 2013 09:38:33 -0400 Received: from mail1.siemens.de (localhost [127.0.0.1]) by david.siemens.de (8.13.6/8.13.6) with ESMTP id r9NDcSIY027181; Wed, 23 Oct 2013 15:38:28 +0200 Received: from mchn199C.mchp.siemens.de ([146.254.78.182]) by mail1.siemens.de (8.13.6/8.13.6) with SMTP id r9NDcRnw019647; Wed, 23 Oct 2013 15:38:28 +0200 Message-ID: <5267D152.5090609@siemens.com> Date: Wed, 23 Oct 2013 14:38:26 +0100 From: Jan Kiszka User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 MIME-Version: 1.0 To: Gleb Natapov , Paolo Bonzini CC: kvm , =?UTF-8?B?IuadjuaYpeWlhyA8QXJ0aHVyIENodW5x?= =?UTF-8?B?aSBMaT4i?= Subject: [PATCH][kvm-unit-tests] nEPT: Fix test cases for 2M huge pages Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Spam-Status: No, score=-7.3 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP If 2M pages are available with EPT, the test code creates its initial identity map with such pages. But then it tries to remap two 4K pages in that range which fails as their level 3 PTE is set up for huge pages. Fix this up by ensuring that install_ept_entry always create non-large page directory entries and by remapping the 2M area around those two test pages in 4K chunks. Signed-off-by: Jan Kiszka --- x86/vmx.c | 3 ++- x86/vmx.h | 3 ++- x86/vmx_tests.c | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/x86/vmx.c b/x86/vmx.c index 9db4ef4..3e6fc37 100644 --- a/x86/vmx.c +++ b/x86/vmx.c @@ -173,7 +173,8 @@ void install_ept_entry(unsigned long *pml4, memset(new_pt, 0, PAGE_SIZE); pt[offset] = virt_to_phys(new_pt) | EPT_RA | EPT_WA | EPT_EA; - } + } else + pt[offset] &= ~EPT_LARGE_PAGE; pt = phys_to_virt(pt[offset] & 0xffffffffff000ull); } offset = ((unsigned long)guest_addr >> ((level-1) * diff --git a/x86/vmx.h b/x86/vmx.h index dc1ebdf..7d967eb 100644 --- a/x86/vmx.h +++ b/x86/vmx.h @@ -485,7 +485,8 @@ enum Ctrl1 { #define EPT_PAGE_LEVEL 4 #define EPT_PGDIR_WIDTH 9 #define EPT_PGDIR_MASK 511 -#define PAGE_MASK (~(PAGE_SIZE-1)) +#define PAGE_MASK (~(PAGE_SIZE-1)) +#define PAGE_MASK_2M (~(PAGE_SIZE_2M-1)) #define EPT_VLT_RD 1 #define EPT_VLT_WR (1 << 1) diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c index 0759e10..a002a7a 100644 --- a/x86/vmx_tests.c +++ b/x86/vmx_tests.c @@ -915,6 +915,7 @@ static int setup_ept() static void ept_init() { + unsigned long base_addr1, base_addr2; u32 ctrl_cpu[2]; init_fail = false; @@ -934,6 +935,13 @@ static void ept_init() memset(data_page2, 0x0, PAGE_SIZE); *((u32 *)data_page1) = MAGIC_VAL_1; *((u32 *)data_page2) = MAGIC_VAL_2; + base_addr1 = (unsigned long)data_page1 & PAGE_MASK_2M; + base_addr2 = (unsigned long)data_page2 & PAGE_MASK_2M; + if (setup_ept_range(pml4, base_addr1, base_addr1 + PAGE_SIZE_2M, 0, 0, + EPT_WA | EPT_RA | EPT_EA) || + setup_ept_range(pml4, base_addr2, base_addr2 + PAGE_SIZE_2M, 0, 0, + EPT_WA | EPT_RA | EPT_EA)) + init_fail = true; install_ept(pml4, (unsigned long)data_page1, (unsigned long)data_page2, EPT_RA | EPT_WA | EPT_EA); }