From patchwork Sun Jul 9 08:14:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kai Huang X-Patchwork-Id: 9831703 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id D200F60317 for ; Sun, 9 Jul 2017 08:17:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C4E302624A for ; Sun, 9 Jul 2017 08:17:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B730A27C0B; Sun, 9 Jul 2017 08:17:13 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.6 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 0A01C2624A for ; Sun, 9 Jul 2017 08:17:12 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dU7Mf-0006R8-GU; Sun, 09 Jul 2017 08:14:49 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dU7Me-0006R1-89 for xen-devel@lists.xen.org; Sun, 09 Jul 2017 08:14:48 +0000 Received: from [193.109.254.147] by server-11.bemta-6.messagelabs.com id 06/1A-03612-7F5E1695; Sun, 09 Jul 2017 08:14:47 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrDIsWRWlGSWpSXmKPExsVyMfTAYd1vTxM jDR5MN7FY8nExiwOjx9Hdv5kCGKNYM/OS8isSWDOOzJjKVnDHtuLK7D6WBsZ7el2MnBxCApMY JdYeSu9i5OJgEXjJIvGr8QsziCMh0M8q8aGngwWkSkIgTmJu91t2CLtc4nT/Y3aIbmWJrm9H2 UEahAQWMUn8enmHFSTBJqAmsXVJO1SzrcSCcyBTOTlEBKQlrn2+zAhiMwsYS3zv/Q1WLyzgJP H+wlagOAfQGaoSl26Egpi8AvESi++GQUyRl9jVdhGsmhNo4pf9C5ghTrCR+HVsPdMERsEFjAy rGDWKU4vKUot0jYz1kooy0zNKchMzc3QNDcz0clOLixPTU3MSk4r1kvNzNzECw40BCHYw/pkf eIhRkoNJSZRXrDchUogvKT+lMiOxOCO+qDQntfgQowwHh5IEb+WTxEghwaLU9NSKtMwcYODDp CU4eJREeJ2nA6V5iwsSc4sz0yFSpxjtOa5cWfeFiWPD6vVAcsqB7UDy1YT/35iEWPLy81KlxH lzQaYKgLRllObBDYVF6iVGWSlhXkagM4V4ClKLcjNLUOVfMYpzMCoJ8+4CmcKTmVcCt/sV0Fl MQGex1SWAnFWSiJCSamCUVq0Nn/jNOurShvb9jWFdy3//nf5ySdLrWeevX/ljq6Co7tu1Z8+E h8frPOdLrz9zd/8y5X0nmiOL3E2mu3Rd+rutqfZB+fYpbqHvLX+9uMTOx5K6coHVIS8F6+wrp 8SVJ7razvvDksh+gztKolYlvkxa7w27tq5/74SrBueC14jtWpre5saoxFKckWioxVxUnAgAgl 47Vs8CAAA= X-Env-Sender: kaih.linux@gmail.com X-Msg-Ref: server-3.tower-27.messagelabs.com!1499588085!105968337!1 X-Originating-IP: [209.85.192.195] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.4.25; banners=-,-,- X-VirusChecked: Checked Received: (qmail 44956 invoked from network); 9 Jul 2017 08:14:46 -0000 Received: from mail-pf0-f195.google.com (HELO mail-pf0-f195.google.com) (209.85.192.195) by server-3.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 9 Jul 2017 08:14:46 -0000 Received: by mail-pf0-f195.google.com with SMTP id q85so10351072pfq.2 for ; Sun, 09 Jul 2017 01:14:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=TjOpmj2rwEcEhCELHn9YbnmKHxQKPH+yObTAzVgmozc=; b=VJVOxjtcOEx+nphlpwN4djwabDnMadx1wIHhkuH0DzRbJxfk4wfSVySZEg+A8gl35m cp7nphs/NkLg3UJafV7YqPHBJa+LqCHmoEM4jkmuNLmyMdmTy2Fkc1szPjDGe5GT5tkn Ev4irhgCjTFnrLhthOND3yaCut2qmCE6nt9AvxKKL64+suQDNERzmy7/5+M/FAftlqGV 1+0qB1lDYonf6UQHs8Ayernp2ip6jWU2I+gStJnqsBMIrqFgZ14zFd74Q0XcfbfYjpF9 hU2UIzV1ztCB5WkrvzC700832fPDZbuIuoTkuwwUFyS4JzVmc+QBLR76z08sboMo9qJ6 66lA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=TjOpmj2rwEcEhCELHn9YbnmKHxQKPH+yObTAzVgmozc=; b=r+NnHDKuI5GSEvocqMjDkNlZXh6JXOnkxrQQUetPaoo4uwop2eKVI25aPm6giNwGhZ 1ZuRu9YvFJi1KDkepRq7iyOxKQYXDx9w+shS8OshpMmQcqvwaGsnPlH8RRerbpNleX7F EoiQOIkEldMhZOgjoqF6TuON1aD1QF5rNbusXpJ+i4y9gZziOP8ONwpTWnng6nP1rxfk uXltwbBJJCyYPEN+OTvjBtk1kZXXhFYNggR3x+eFbPIWI628p4TQW5wpSOeDCdnAC65n VqB9TLT1OQ4oIsly7UJP+QgvaHuSrrpVlgM2KjwF74aeZVe2+PFMWya5DGHazqce+j/R k7Qw== X-Gm-Message-State: AIVw112i5rSMneIpZKIC2beL23xClb5L34SJNBgycJ7nhKXchnILyDcV kJ4AA9fbh7MuMDuu X-Received: by 10.98.11.135 with SMTP id 7mr39465451pfl.45.1499588084773; Sun, 09 Jul 2017 01:14:44 -0700 (PDT) Received: from localhost.localdomain (118-92-234-57.dsl.dyn.ihug.co.nz. [118.92.234.57]) by smtp.gmail.com with ESMTPSA id s64sm18813241pfd.77.2017.07.09.01.14.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 09 Jul 2017 01:14:44 -0700 (PDT) From: Kai Huang X-Google-Original-From: Kai Huang To: xen-devel@lists.xen.org Date: Sun, 9 Jul 2017 20:14:36 +1200 Message-Id: <6008c4737ee71c6d19c44592e31bf2a7ba267dd6.1499586046.git.kai.huang@linux.intel.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: Cc: wei.liu2@citrix.com, ian.jackson@eu.citrix.com Subject: [Xen-devel] [PATCH 13/15] xen: tools: add new 'epc' parameter support X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP In order to be able to configure domain's EPC size when it is created, a new 'epc' parameter is added to XL configuration file. Like memory it indicates EPC size in MB. A new 'libxl_sgx_buildinfo', which contains EPC base and size, is also added to libxl_domain_buind_info. EPC base and size are also added to 'xc_dom_image' in order to add EPC to e820 table. EPC base is calculated internally. Signed-off-by: Kai Huang --- tools/libxc/include/xc_dom.h | 4 ++++ tools/libxl/libxl_create.c | 9 +++++++++ tools/libxl/libxl_dom.c | 30 ++++++++++++++++++++++++++++++ tools/libxl/libxl_internal.h | 2 ++ tools/libxl/libxl_types.idl | 6 ++++++ tools/libxl/libxl_x86.c | 12 ++++++++++++ tools/xl/xl_parse.c | 5 +++++ 7 files changed, 68 insertions(+) diff --git a/tools/libxc/include/xc_dom.h b/tools/libxc/include/xc_dom.h index ce47058c41..be10af7002 100644 --- a/tools/libxc/include/xc_dom.h +++ b/tools/libxc/include/xc_dom.h @@ -203,6 +203,10 @@ struct xc_dom_image { xen_paddr_t lowmem_end; xen_paddr_t highmem_end; xen_pfn_t vga_hole_size; +#if defined(__i386__) || defined(__x86_64__) + xen_paddr_t epc_base; + xen_paddr_t epc_size; +#endif /* If unset disables the setup of the IOREQ pages. */ bool device_model; diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index bffbc456c1..8710e53ffd 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -59,6 +59,13 @@ void libxl__rdm_setdefault(libxl__gc *gc, libxl_domain_build_info *b_info) LIBXL_RDM_MEM_BOUNDARY_MEMKB_DEFAULT; } +void libxl__sgx_setdefault(libxl__gc *gc, libxl_domain_build_info *b_info) +{ + if (b_info->u.hvm.sgx.epckb == LIBXL_MEMKB_DEFAULT) + b_info->u.hvm.sgx.epckb = 0; + b_info->u.hvm.sgx.epcbase = 0; +} + int libxl__domain_build_info_setdefault(libxl__gc *gc, libxl_domain_build_info *b_info) { @@ -372,6 +379,8 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc, libxl_defbool_setdefault(&b_info->u.hvm.gfx_passthru, false); libxl__rdm_setdefault(gc, b_info); + + libxl__sgx_setdefault(gc, b_info); break; case LIBXL_DOMAIN_TYPE_PV: libxl_defbool_setdefault(&b_info->u.pv.e820_host, false); diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 5d914a59ee..6d1d51d35d 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -1124,6 +1124,36 @@ int libxl__build_hvm(libxl__gc *gc, uint32_t domid, highmem_end = (1ull << 32) + (lowmem_end - mmio_start); lowmem_end = mmio_start; } +#if defined(__i386__) || defined(__x86_64__) + if (info->u.hvm.sgx.epckb) { + /* + * FIXME: + * + * Currently EPC base is put at highmem_end + 8G, which should be + * safe in most cases. + * + * I am not quite sure which is the best way to calcualte EPC base. + * IMO we can either: + * 1) put EPC between lowmem_end to mmio_start, but this brings + * additional logic to handle, ex, lowmem_end may become too small + * if EPC is large (shall we limit domain's EPC size?), and hvmloader + * will try to enlarge MMIO space until lowmem_end, or even relocate + * lowmem -- all those make things complicated, so probably put EPC + * in hole between lowmem_end to mmio_start is not good. + * 2) put EPC after highmem_end, but hvmloader may also relocate MMIO + * resource to the place after highmem_end. Maybe the ideal way is to + * put EPC right after highmem_end, and change hvmloader to detect + * EPC, and put high MMIO resource after EPC. I've done this but I + * found a strange bug that EPT mapping of EPC will be (at least part + * of the mappings) will be removed by whom I still cannot find. + * Currently EPC base is put at highmem_end + 8G, and hvmloader code + * is not changed to handle EPC, but this should be safe for most cases. + */ + info->u.hvm.sgx.epcbase = highmem_end + (2ULL << 32); + } + dom->epc_size = (info->u.hvm.sgx.epckb << 10); + dom->epc_base = info->u.hvm.sgx.epcbase; +#endif dom->lowmem_end = lowmem_end; dom->highmem_end = highmem_end; dom->mmio_start = mmio_start; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index afe6652847..9a1d309dac 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1252,6 +1252,8 @@ _hidden int libxl__device_vkb_setdefault(libxl__gc *gc, libxl_device_vkb *vkb); _hidden int libxl__device_pci_setdefault(libxl__gc *gc, libxl_device_pci *pci); _hidden void libxl__rdm_setdefault(libxl__gc *gc, libxl_domain_build_info *b_info); +_hidden void libxl__sgx_setdefault(libxl__gc *gc, + libxl_domain_build_info *b_info); _hidden int libxl__device_p9_setdefault(libxl__gc *gc, libxl_device_p9 *p9); diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 22044259f3..9723c1fa46 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -450,6 +450,11 @@ libxl_altp2m_mode = Enumeration("altp2m_mode", [ (3, "limited"), ], init_val = "LIBXL_ALTP2M_MODE_DISABLED") +libxl_sgx_buildinfo = Struct("sgx_buildinfo", [ + ("epcbase", uint64), # EPC base address + ("epckb", MemKB), # EPC size in KB + ], dir=DIR_IN) + libxl_domain_build_info = Struct("domain_build_info",[ ("max_vcpus", integer), ("avail_vcpus", libxl_bitmap), @@ -564,6 +569,7 @@ libxl_domain_build_info = Struct("domain_build_info",[ ("serial_list", libxl_string_list), ("rdm", libxl_rdm_reserve), ("rdm_mem_boundary_memkb", MemKB), + ("sgx", libxl_sgx_buildinfo), ])), ("pv", Struct(None, [("kernel", string), ("slack_memkb", MemKB), diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c index 455f6f0bed..35b0ff1ba3 100644 --- a/tools/libxl/libxl_x86.c +++ b/tools/libxl/libxl_x86.c @@ -530,6 +530,9 @@ int libxl__arch_domain_construct_memmap(libxl__gc *gc, if (dom->acpi_modules[i].length) e820_entries++; + if ( dom->epc_base && dom->epc_size ) + e820_entries++; + if (e820_entries >= E820MAX) { LOGD(ERROR, domid, "Ooops! Too many entries in the memory map!"); rc = ERROR_INVAL; @@ -570,6 +573,15 @@ int libxl__arch_domain_construct_memmap(libxl__gc *gc, e820[nr].addr = ((uint64_t)1 << 32); e820[nr].size = highmem_size; e820[nr].type = E820_RAM; + nr++; + } + + /* EPC */ + if (dom->epc_base && dom->epc_size) { + e820[nr].addr = dom->epc_base; + e820[nr].size = dom->epc_size; + e820[nr].type = E820_RESERVED; + nr++; } if (xc_domain_set_memory_map(CTX->xch, domid, e820, e820_entries) != 0) { diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c index 856a304b30..4a9be64f78 100644 --- a/tools/xl/xl_parse.c +++ b/tools/xl/xl_parse.c @@ -1182,6 +1182,11 @@ void parse_config_data(const char *config_source, if (!xlu_cfg_get_long (config, "rdm_mem_boundary", &l, 0)) b_info->u.hvm.rdm_mem_boundary_memkb = l * 1024; + + if (!xlu_cfg_get_long (config, "epc", &l, 0)) { + /* Get EPC size. EPC base is calculated by toolstack later. */ + b_info->u.hvm.sgx.epckb = l * 1024; + } break; case LIBXL_DOMAIN_TYPE_PV: {