From patchwork Thu Feb 11 07:53:26 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 8276971 Return-Path: X-Original-To: patchwork-xen-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 116329F4DD for ; Thu, 11 Feb 2016 07:56:24 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2C44520351 for ; Thu, 11 Feb 2016 07:56:23 +0000 (UTC) Received: from lists.xen.org (lists.xenproject.org [50.57.142.19]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id EA956202FE for ; Thu, 11 Feb 2016 07:56:21 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aTm4F-0003bx-ME; Thu, 11 Feb 2016 07:53:35 +0000 Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aTm4C-0003aw-Q6 for xen-devel@lists.xen.org; Thu, 11 Feb 2016 07:53:32 +0000 Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id 71/29-12889-CFD3CB65; Thu, 11 Feb 2016 07:53:32 +0000 X-Env-Sender: jgross@suse.com X-Msg-Ref: server-10.tower-27.messagelabs.com!1455177210!23013478!1 X-Originating-IP: [195.135.220.15] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 7.35.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 19034 invoked from network); 11 Feb 2016 07:53:31 -0000 Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by server-10.tower-27.messagelabs.com with DHE-RSA-CAMELLIA256-SHA encrypted SMTP; 11 Feb 2016 07:53:31 -0000 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 6C309AC8E; Thu, 11 Feb 2016 07:53:30 +0000 (UTC) From: Juergen Gross To: grub-devel@gnu.org, xen-devel@lists.xen.org, phcoder@gmail.com, daniel.kiper@oracle.com, mchang@suse.com Date: Thu, 11 Feb 2016 08:53:26 +0100 Message-Id: <1455177206-8974-7-git-send-email-jgross@suse.com> X-Mailer: git-send-email 2.6.2 In-Reply-To: <1455177206-8974-1-git-send-email-jgross@suse.com> References: <1455177206-8974-1-git-send-email-jgross@suse.com> Cc: Juergen Gross Subject: [Xen-devel] [PATCH v2 6/6] xen: add capability to load p2m list outside of kernel mapping X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, 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 Modern pvops linux kernels support a p2m list not covered by the kernel mapping. This capability is flagged by an elf-note specifying the virtual address the kernel is expecting the p2m list to be mapped to. In case the elf-note is set by the kernel don't place the p2m list into the kernel mapping, but map it to the given address. This will allow to support domains with larger memory, as the kernel mapping is limited to 2GB and a domain with huge memory in the TB range will have a p2m list larger than this. Signed-off-by: Juergen Gross --- grub-core/loader/i386/xen.c | 50 ++++++++++++++++++++++++++++++++------ grub-core/loader/i386/xen_fileXX.c | 4 +++ include/grub/xen_file.h | 2 ++ 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/grub-core/loader/i386/xen.c b/grub-core/loader/i386/xen.c index 5e10420..9ddc6c2 100644 --- a/grub-core/loader/i386/xen.c +++ b/grub-core/loader/i386/xen.c @@ -305,19 +305,44 @@ static grub_err_t grub_xen_p2m_alloc (void) { grub_relocator_chunk_t ch; - grub_size_t p2msize; + grub_size_t p2msize, p2malloc; grub_err_t err; + struct grub_xen_mapping *map; + + map = mappings + n_mappings; + p2msize = ALIGN_UP (sizeof (grub_xen_mfn_t) * + grub_xen_start_page_addr->nr_pages, PAGE_SIZE); + if (xen_inf.has_p2m_base) + { + err = get_pgtable_size (xen_inf.p2m_base, xen_inf.p2m_base + p2msize, + (max_addr + p2msize) >> PAGE_SHIFT); + if (err) + return err; + + map->area.pfn_start = max_addr >> PAGE_SHIFT; + p2malloc = p2msize + page2offset (map->area.n_pt_pages); + n_mappings++; + next_start.mfn_list = xen_inf.p2m_base; + next_start.first_p2m_pfn = map->area.pfn_start; + next_start.nr_p2m_frames = p2malloc >> PAGE_SHIFT; + } + else + { + next_start.mfn_list = max_addr + xen_inf.virt_base; + p2malloc = p2msize; + } state.mfn_list = max_addr; - next_start.mfn_list = max_addr + xen_inf.virt_base; - p2msize = sizeof (grub_xen_mfn_t) * grub_xen_start_page_addr->nr_pages; - err = grub_relocator_alloc_chunk_addr (relocator, &ch, max_addr, p2msize); + err = grub_relocator_alloc_chunk_addr (relocator, &ch, max_addr, p2malloc); if (err) return err; virt_mfn_list = get_virtual_current_address (ch); + if (xen_inf.has_p2m_base) + map->where = (grub_uint64_t *) virt_mfn_list + + p2msize / sizeof (grub_uint64_t); grub_memcpy (virt_mfn_list, (void *) grub_xen_start_page_addr->mfn_list, p2msize); - max_addr = ALIGN_UP (max_addr + p2msize, PAGE_SIZE); + max_addr += p2malloc; return GRUB_ERR_NONE; } @@ -425,9 +450,12 @@ grub_xen_alloc_end (void) return GRUB_ERR_NONE; called = 1; - err = grub_xen_p2m_alloc (); - if (err) - return err; + if (!xen_inf.has_p2m_base) + { + err = grub_xen_p2m_alloc (); + if (err) + return err; + } err = grub_xen_special_alloc (); if (err) return err; @@ -452,6 +480,12 @@ grub_xen_boot (void) err = grub_xen_alloc_end (); if (err) return err; + if (xen_inf.has_p2m_base) + { + err = grub_xen_p2m_alloc (); + if (err) + return err; + } err = set_mfns (console_pfn); if (err) diff --git a/grub-core/loader/i386/xen_fileXX.c b/grub-core/loader/i386/xen_fileXX.c index 69fccd2..8d01adb 100644 --- a/grub-core/loader/i386/xen_fileXX.c +++ b/grub-core/loader/i386/xen_fileXX.c @@ -253,6 +253,10 @@ parse_note (grub_elf_t elf, struct grub_xen_file_info *xi, descsz == 2 ? 2 : 3) == 0) xi->arch = GRUB_XEN_FILE_I386; break; + case 15: + xi->p2m_base = grub_le_to_cpu_addr (*(Elf_Addr *) desc); + xi->has_p2m_base = 1; + break; case 16: xi->unmapped_initrd = !!grub_le_to_cpu32(*(grub_uint32_t *) desc); break; diff --git a/include/grub/xen_file.h b/include/grub/xen_file.h index ed749fa..6587999 100644 --- a/include/grub/xen_file.h +++ b/include/grub/xen_file.h @@ -32,9 +32,11 @@ struct grub_xen_file_info grub_uint64_t entry_point; grub_uint64_t hypercall_page; grub_uint64_t paddr_offset; + grub_uint64_t p2m_base; int has_hypercall_page; int has_note; int has_xen_guest; + int has_p2m_base; int extended_cr3; int unmapped_initrd; enum