From patchwork Sun Jun 19 06:52:50 2022 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: 12886564 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1DF1FCCA47F for ; Sun, 19 Jun 2022 06:53:20 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.352047.578804 (Exim 4.92) (envelope-from ) id 1o2onw-0005MN-CI; Sun, 19 Jun 2022 06:53:04 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 352047.578804; Sun, 19 Jun 2022 06:53:04 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1o2onw-0005LX-4U; Sun, 19 Jun 2022 06:53:04 +0000 Received: by outflank-mailman (input) for mailman id 352047; Sun, 19 Jun 2022 06:53:02 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1o2onu-0004F8-AO for xen-devel@lists.xenproject.org; Sun, 19 Jun 2022 06:53:02 +0000 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 728438db-ef9c-11ec-b725-ed86ccbb4733; Sun, 19 Jun 2022 08:52:55 +0200 (CEST) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 51F3621D96; Sun, 19 Jun 2022 06:52:55 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 245AA13427; Sun, 19 Jun 2022 06:52:55 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id GLKIB8fHrmJzXgAAMHmgww (envelope-from ); Sun, 19 Jun 2022 06:52:55 +0000 X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 728438db-ef9c-11ec-b725-ed86ccbb4733 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1655621575; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5vH2NqyFMDYKMsu2Ud2YN8B9pnuLSEdOQPWCQhYC+kA=; b=KuNxw/BnF+1yrTWlTm/CJW/I2L7NggaMX43YRO9yxn+bE9DI3/aTgHbVFNVPn8cD/3/LaY /w5shJpfcvotjxt3MHfnzrvvBSDNZR76G0uDVhkbksl/UWERUhtVUKDE6/uZV4RgOtngJ0 5xWBPFo81TjFbKK0WVjGhDBrRAujYgM= From: Juergen Gross To: minios-devel@lists.xenproject.org, xen-devel@lists.xenproject.org Cc: samuel.thibault@ens-lyon.org, wl@xen.org, Juergen Gross Subject: [PATCH v2 1/4] mini-os: take newest version of arch-x86/hvm/start_info.h Date: Sun, 19 Jun 2022 08:52:50 +0200 Message-Id: <20220619065253.19503-2-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20220619065253.19503-1-jgross@suse.com> References: <20220619065253.19503-1-jgross@suse.com> MIME-Version: 1.0 Update include/xen/arch-x86/hvm/start_info.h to the newest version from the Xen tree. Signed-off-by: Juergen Gross Reviewed-by: Samuel Thibault --- include/xen/arch-x86/hvm/start_info.h | 63 ++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/include/xen/arch-x86/hvm/start_info.h b/include/xen/arch-x86/hvm/start_info.h index 64841597..50af9ea2 100644 --- a/include/xen/arch-x86/hvm/start_info.h +++ b/include/xen/arch-x86/hvm/start_info.h @@ -33,7 +33,7 @@ * | magic | Contains the magic value XEN_HVM_START_MAGIC_VALUE * | | ("xEn3" with the 0x80 bit of the "E" set). * 4 +----------------+ - * | version | Version of this structure. Current version is 0. New + * | version | Version of this structure. Current version is 1. New * | | versions are guaranteed to be backwards-compatible. * 8 +----------------+ * | flags | SIF_xxx flags. @@ -48,6 +48,15 @@ * 32 +----------------+ * | rsdp_paddr | Physical address of the RSDP ACPI data structure. * 40 +----------------+ + * | memmap_paddr | Physical address of the (optional) memory map. Only + * | | present in version 1 and newer of the structure. + * 48 +----------------+ + * | memmap_entries | Number of entries in the memory map table. Zero + * | | if there is no memory map being provided. Only + * | | present in version 1 and newer of the structure. + * 52 +----------------+ + * | reserved | Version 1 and newer only. + * 56 +----------------+ * * The layout of each entry in the module structure is the following: * @@ -62,13 +71,51 @@ * | reserved | * 32 +----------------+ * + * The layout of each entry in the memory map table is as follows: + * + * 0 +----------------+ + * | addr | Base address + * 8 +----------------+ + * | size | Size of mapping in bytes + * 16 +----------------+ + * | type | Type of mapping as defined between the hypervisor + * | | and guest. See XEN_HVM_MEMMAP_TYPE_* values below. + * 20 +----------------| + * | reserved | + * 24 +----------------+ + * * The address and sizes are always a 64bit little endian unsigned integer. * * NB: Xen on x86 will always try to place all the data below the 4GiB * boundary. + * + * Version numbers of the hvm_start_info structure have evolved like this: + * + * Version 0: Initial implementation. + * + * Version 1: Added the memmap_paddr/memmap_entries fields (plus 4 bytes of + * padding) to the end of the hvm_start_info struct. These new + * fields can be used to pass a memory map to the guest. The + * memory map is optional and so guests that understand version 1 + * of the structure must check that memmap_entries is non-zero + * before trying to read the memory map. */ #define XEN_HVM_START_MAGIC_VALUE 0x336ec578 +/* + * The values used in the type field of the memory map table entries are + * defined below and match the Address Range Types as defined in the "System + * Address Map Interfaces" section of the ACPI Specification. Please refer to + * section 15 in version 6.2 of the ACPI spec: http://uefi.org/specifications + */ +#define XEN_HVM_MEMMAP_TYPE_RAM 1 +#define XEN_HVM_MEMMAP_TYPE_RESERVED 2 +#define XEN_HVM_MEMMAP_TYPE_ACPI 3 +#define XEN_HVM_MEMMAP_TYPE_NVS 4 +#define XEN_HVM_MEMMAP_TYPE_UNUSABLE 5 +#define XEN_HVM_MEMMAP_TYPE_DISABLED 6 +#define XEN_HVM_MEMMAP_TYPE_PMEM 7 + /* * C representation of the x86/HVM start info layout. * @@ -86,6 +133,13 @@ struct hvm_start_info { uint64_t cmdline_paddr; /* Physical address of the command line. */ uint64_t rsdp_paddr; /* Physical address of the RSDP ACPI data */ /* structure. */ + /* All following fields only present in version 1 and newer */ + uint64_t memmap_paddr; /* Physical address of an array of */ + /* hvm_memmap_table_entry. */ + uint32_t memmap_entries; /* Number of entries in the memmap table. */ + /* Value will be zero if there is no memory */ + /* map being provided. */ + uint32_t reserved; /* Must be zero. */ }; struct hvm_modlist_entry { @@ -95,4 +149,11 @@ struct hvm_modlist_entry { uint64_t reserved; }; +struct hvm_memmap_table_entry { + uint64_t addr; /* Base address of the memory region */ + uint64_t size; /* Size of the memory region in bytes */ + uint32_t type; /* Mapping type */ + uint32_t reserved; /* Must be zero for Version 1. */ +}; + #endif /* __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ */ From patchwork Sun Jun 19 06:52:51 2022 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: 12886563 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F359BCCA480 for ; Sun, 19 Jun 2022 06:53:19 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.352040.578748 (Exim 4.92) (envelope-from ) id 1o2onq-0004FQ-Lf; Sun, 19 Jun 2022 06:52:58 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 352040.578748; Sun, 19 Jun 2022 06:52:58 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1o2onq-0004FJ-J2; Sun, 19 Jun 2022 06:52:58 +0000 Received: by outflank-mailman (input) for mailman id 352040; Sun, 19 Jun 2022 06:52:57 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1o2onp-0004F7-EF for xen-devel@lists.xenproject.org; Sun, 19 Jun 2022 06:52:57 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 728ce77f-ef9c-11ec-bd2d-47488cf2e6aa; Sun, 19 Jun 2022 08:52:56 +0200 (CEST) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 811D61F97A; Sun, 19 Jun 2022 06:52:55 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 5661213A5D; Sun, 19 Jun 2022 06:52:55 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 0LDUE8fHrmJzXgAAMHmgww (envelope-from ); Sun, 19 Jun 2022 06:52:55 +0000 X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 728ce77f-ef9c-11ec-bd2d-47488cf2e6aa DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1655621575; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sqQB2mee0jCv15NOcWCx6SVOgjnvvSzpgTYbgdXHN/4=; b=ie4i4WPFQ6OSeuhCBDRpD7dx5s2n3JIx76lUv+g0jwcY8mwvKpG8rLUm6Am95jytnv96e8 6Uo4Sv8YMiI0TMsao5RTw7M+vEU7XdeD8fvmcpWra+lOqBUVZOoL2fpFbZfvR4PJVaPnqD ZCeZyyxWvVnQ6hGd1aMgySeYJDkhe70= From: Juergen Gross To: minios-devel@lists.xenproject.org, xen-devel@lists.xenproject.org Cc: samuel.thibault@ens-lyon.org, wl@xen.org, Juergen Gross Subject: [PATCH v2 2/4] mini-os: prefer memory map via start_info for PVH Date: Sun, 19 Jun 2022 08:52:51 +0200 Message-Id: <20220619065253.19503-3-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20220619065253.19503-1-jgross@suse.com> References: <20220619065253.19503-1-jgross@suse.com> MIME-Version: 1.0 Since some time now a guest started in PVH mode will get the memory map from Xen via the start_info structure. Modify the PVH initialization to prefer this memory map over the one obtained via hypercall, as this will allow to add information to the memory map for a new kernel when supporting kexec. In case the start_info structure doesn't contain memory map information fall back to the hypercall. Signed-off-by: Juergen Gross Reviewed-by: Samuel Thibault --- arch/x86/mm.c | 6 ++++++ e820.c | 25 +++++++++++++++++++++++++ include/e820.h | 4 ++++ 3 files changed, 35 insertions(+) diff --git a/arch/x86/mm.c b/arch/x86/mm.c index 220c0b4d..41fcee67 100644 --- a/arch/x86/mm.c +++ b/arch/x86/mm.c @@ -45,6 +45,7 @@ #include #include #include +#include #ifdef MM_DEBUG #define DEBUG(_f, _a...) \ @@ -108,6 +109,11 @@ void arch_mm_preinit(void *p) { long ret; domid_t domid = DOMID_SELF; + struct hvm_start_info *hsi = p; + + if ( hsi->version >= 1 && hsi->memmap_entries > 0 ) + e820_init_memmap((struct hvm_memmap_table_entry *)(unsigned long) + hsi->memmap_paddr, hsi->memmap_entries); pt_base = page_table_base; first_free_pfn = PFN_UP(to_phys(&_end)); diff --git a/e820.c b/e820.c index 991ed382..ad91e00b 100644 --- a/e820.c +++ b/e820.c @@ -54,6 +54,7 @@ static char *e820_types[E820_TYPES] = { [E820_ACPI] = "ACPI", [E820_NVS] = "NVS", [E820_UNUSABLE] = "Unusable", + [E820_DISABLED] = "Disabled", [E820_PMEM] = "PMEM" }; @@ -259,6 +260,30 @@ static void e820_get_memmap(void) e820_sanitize(); } +void e820_init_memmap(struct hvm_memmap_table_entry *entry, unsigned int num) +{ + unsigned int i; + + BUILD_BUG_ON(XEN_HVM_MEMMAP_TYPE_RAM != E820_RAM); + BUILD_BUG_ON(XEN_HVM_MEMMAP_TYPE_RESERVED != E820_RESERVED); + BUILD_BUG_ON(XEN_HVM_MEMMAP_TYPE_ACPI != E820_ACPI); + BUILD_BUG_ON(XEN_HVM_MEMMAP_TYPE_NVS != E820_NVS); + BUILD_BUG_ON(XEN_HVM_MEMMAP_TYPE_UNUSABLE != E820_UNUSABLE); + BUILD_BUG_ON(XEN_HVM_MEMMAP_TYPE_DISABLED != E820_DISABLED); + BUILD_BUG_ON(XEN_HVM_MEMMAP_TYPE_PMEM != E820_PMEM); + + for ( i = 0; i < num; i++ ) + { + e820_map[i].addr = entry[i].addr; + e820_map[i].size = entry[i].size; + e820_map[i].type = entry[i].type; + } + + e820_entries = num; + + e820_sanitize(); +} + void arch_print_memmap(void) { int i; diff --git a/include/e820.h b/include/e820.h index aaf2f2ca..5438a7c8 100644 --- a/include/e820.h +++ b/include/e820.h @@ -26,6 +26,8 @@ #if defined(__arm__) || defined(__aarch64__) || defined(CONFIG_PARAVIRT) #define CONFIG_E820_TRIVIAL +#else +#include #endif /* PC BIOS standard E820 types and structure. */ @@ -34,6 +36,7 @@ #define E820_ACPI 3 #define E820_NVS 4 #define E820_UNUSABLE 5 +#define E820_DISABLED 6 #define E820_PMEM 7 #define E820_TYPES 8 @@ -54,6 +57,7 @@ unsigned long e820_get_max_contig_pages(unsigned long pfn, unsigned long pages); #ifndef CONFIG_E820_TRIVIAL unsigned long e820_get_reserved_pfns(int pages); void e820_put_reserved_pfns(unsigned long start_pfn, int pages); +void e820_init_memmap(struct hvm_memmap_table_entry *entry, unsigned int num); #endif #endif /*__E820_HEADER*/ From patchwork Sun Jun 19 06:52:52 2022 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: 12886562 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 83F52C43334 for ; Sun, 19 Jun 2022 06:53:19 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.352042.578764 (Exim 4.92) (envelope-from ) id 1o2ons-0004VW-27; Sun, 19 Jun 2022 06:53:00 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 352042.578764; Sun, 19 Jun 2022 06:53:00 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1o2onr-0004V7-SB; Sun, 19 Jun 2022 06:52:59 +0000 Received: by outflank-mailman (input) for mailman id 352042; Sun, 19 Jun 2022 06:52:58 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1o2onq-0004F8-Or for xen-devel@lists.xenproject.org; Sun, 19 Jun 2022 06:52:58 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 729e91ac-ef9c-11ec-b725-ed86ccbb4733; Sun, 19 Jun 2022 08:52:56 +0200 (CEST) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id B4EF71FD3C; Sun, 19 Jun 2022 06:52:55 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 890F613427; Sun, 19 Jun 2022 06:52:55 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 0N8WIMfHrmJzXgAAMHmgww (envelope-from ); Sun, 19 Jun 2022 06:52:55 +0000 X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 729e91ac-ef9c-11ec-b725-ed86ccbb4733 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1655621575; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AOnLOnXpUKuT3ZPKKnEQ4FE2kaPgsf79zVn7fKehw7c=; b=knRVAWHAzL0m/Y+Fs5C2n5U+iUHX+9kgJTQhx1NO+HLVnYAh5AoF3wi2Il6tQn7iQWz9ue XKQBW76Ryf05GP6VcIeY/BuwscFh6ue/NXJRKpapM9IiZsuNsiLwpuBMPhgp3sjE5moSLa 3/5eq5KaAtkRC5X4LLBuYaSPL8ok3VA= From: Juergen Gross To: minios-devel@lists.xenproject.org, xen-devel@lists.xenproject.org Cc: samuel.thibault@ens-lyon.org, wl@xen.org, Juergen Gross Subject: [PATCH v2 3/4] mini-os: fix number of pages for PVH Date: Sun, 19 Jun 2022 08:52:52 +0200 Message-Id: <20220619065253.19503-4-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20220619065253.19503-1-jgross@suse.com> References: <20220619065253.19503-1-jgross@suse.com> MIME-Version: 1.0 When getting the current allocation from Xen, this value includes the pages allocated in the MMIO area. Fix the highest available RAM page by subtracting the size of that area. This requires to read the E820 map before needing this value. Add two functions returning the current and the maximum number of RAM pages taking this correction into account. At the same time add the LAPIC page to the memory map in order to avoid reusing that PFN for internal purposes. Signed-off-by: Juergen Gross Reviewed-by: Samuel Thibault --- V2: - make e820_initial_reserved_pfns static (Samuel Thibault) - add e820_get_current_pages() and e820_get_max_pages() --- arch/x86/mm.c | 17 +++++-------- balloon.c | 16 +++--------- e820.c | 58 +++++++++++++++++++++++++++++++++++++------ include/e820.h | 2 ++ include/x86/arch_mm.h | 2 ++ 5 files changed, 65 insertions(+), 30 deletions(-) diff --git a/arch/x86/mm.c b/arch/x86/mm.c index 41fcee67..cfc978f6 100644 --- a/arch/x86/mm.c +++ b/arch/x86/mm.c @@ -107,25 +107,20 @@ desc_ptr idt_ptr = void arch_mm_preinit(void *p) { - long ret; - domid_t domid = DOMID_SELF; + unsigned int pages; struct hvm_start_info *hsi = p; if ( hsi->version >= 1 && hsi->memmap_entries > 0 ) e820_init_memmap((struct hvm_memmap_table_entry *)(unsigned long) hsi->memmap_paddr, hsi->memmap_entries); + else + e820_init_memmap(NULL, 0); pt_base = page_table_base; first_free_pfn = PFN_UP(to_phys(&_end)); - ret = HYPERVISOR_memory_op(XENMEM_current_reservation, &domid); - if ( ret < 0 ) - { - xprintk("could not get memory size\n"); - do_exit(); - } - - last_free_pfn = e820_get_maxpfn(ret); - balloon_set_nr_pages(ret, last_free_pfn); + pages = e820_get_current_pages(); + last_free_pfn = e820_get_maxpfn(pages); + balloon_set_nr_pages(pages, last_free_pfn); } #endif diff --git a/balloon.c b/balloon.c index 9dc77c54..6ad07644 100644 --- a/balloon.c +++ b/balloon.c @@ -44,20 +44,12 @@ void balloon_set_nr_pages(unsigned long pages, unsigned long pfn) void get_max_pages(void) { - long ret; - domid_t domid = DOMID_SELF; - - ret = HYPERVISOR_memory_op(XENMEM_maximum_reservation, &domid); - if ( ret < 0 ) + nr_max_pages = e820_get_max_pages(); + if ( nr_max_pages ) { - printk("Could not get maximum pfn\n"); - return; + printk("Maximum memory size: %ld pages\n", nr_max_pages); + nr_max_pfn = e820_get_maxpfn(nr_max_pages); } - - nr_max_pages = ret; - printk("Maximum memory size: %ld pages\n", nr_max_pages); - - nr_max_pfn = e820_get_maxpfn(nr_max_pages); } void mm_alloc_bitmap_remap(void) diff --git a/e820.c b/e820.c index ad91e00b..48c9eadc 100644 --- a/e820.c +++ b/e820.c @@ -29,6 +29,38 @@ #include #include +static unsigned int e820_initial_reserved_pfns; + +unsigned int e820_get_current_pages(void) +{ + domid_t domid = DOMID_SELF; + long ret; + + ret = HYPERVISOR_memory_op(XENMEM_current_reservation, &domid); + if ( ret < 0 ) + { + xprintk("could not get memory size\n"); + do_exit(); + } + + return ret - e820_initial_reserved_pfns; +} + +unsigned int e820_get_max_pages(void) +{ + domid_t domid = DOMID_SELF; + long ret; + + ret = HYPERVISOR_memory_op(XENMEM_maximum_reservation, &domid); + if ( ret < 0 ) + { + printk("Could not get maximum pfn\n"); + return 0; + } + + return ret - e820_initial_reserved_pfns; +} + #ifdef CONFIG_E820_TRIVIAL struct e820entry e820_map[1] = { { @@ -40,10 +72,6 @@ struct e820entry e820_map[1] = { unsigned e820_entries = 1; -static void e820_get_memmap(void) -{ -} - #else struct e820entry e820_map[E820_MAX]; unsigned e820_entries; @@ -199,6 +227,7 @@ static void e820_sanitize(void) { int i; unsigned long end, start; + bool found_lapic = false; /* Sanitize memory map in current form. */ e820_process_entries(); @@ -238,8 +267,20 @@ static void e820_sanitize(void) /* Make remaining temporarily reserved entries permanently reserved. */ for ( i = 0; i < e820_entries; i++ ) + { if ( e820_map[i].type == E820_TMP_RESERVED ) e820_map[i].type = E820_RESERVED; + if ( e820_map[i].type == E820_RESERVED ) + { + e820_initial_reserved_pfns += e820_map[i].size / PAGE_SIZE; + if ( e820_map[i].addr <= LAPIC_ADDRESS && + e820_map[i].addr + e820_map[i].size > LAPIC_ADDRESS ) + found_lapic = true; + } + } + + if ( !found_lapic ) + e820_insert_entry(LAPIC_ADDRESS, PAGE_SIZE, E820_RESERVED); } static void e820_get_memmap(void) @@ -264,6 +305,12 @@ void e820_init_memmap(struct hvm_memmap_table_entry *entry, unsigned int num) { unsigned int i; + if ( !entry ) + { + e820_get_memmap(); + return; + } + BUILD_BUG_ON(XEN_HVM_MEMMAP_TYPE_RAM != E820_RAM); BUILD_BUG_ON(XEN_HVM_MEMMAP_TYPE_RESERVED != E820_RESERVED); BUILD_BUG_ON(XEN_HVM_MEMMAP_TYPE_ACPI != E820_ACPI); @@ -365,9 +412,6 @@ unsigned long e820_get_maxpfn(unsigned long pages) int i; unsigned long pfns = 0, start = 0; - if ( !e820_entries ) - e820_get_memmap(); - for ( i = 0; i < e820_entries; i++ ) { if ( e820_map[i].type != E820_RAM ) diff --git a/include/e820.h b/include/e820.h index 5438a7c8..6f15fcd2 100644 --- a/include/e820.h +++ b/include/e820.h @@ -52,6 +52,8 @@ struct __packed e820entry { extern struct e820entry e820_map[]; extern unsigned e820_entries; +unsigned int e820_get_current_pages(void); +unsigned int e820_get_max_pages(void); unsigned long e820_get_maxpfn(unsigned long pages); unsigned long e820_get_max_contig_pages(unsigned long pfn, unsigned long pages); #ifndef CONFIG_E820_TRIVIAL diff --git a/include/x86/arch_mm.h b/include/x86/arch_mm.h index ffbec5a8..a1b975dc 100644 --- a/include/x86/arch_mm.h +++ b/include/x86/arch_mm.h @@ -207,6 +207,8 @@ typedef unsigned long pgentry_t; /* to align the pointer to the (next) page boundary */ #define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) +#define LAPIC_ADDRESS CONST(0xfee00000) + #ifndef __ASSEMBLY__ /* Definitions for machine and pseudophysical addresses. */ #ifdef __i386__ From patchwork Sun Jun 19 06:52:53 2022 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: 12886561 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 693A1C433EF for ; Sun, 19 Jun 2022 06:53:19 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.352044.578779 (Exim 4.92) (envelope-from ) id 1o2ont-0004mn-Ai; Sun, 19 Jun 2022 06:53:01 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 352044.578779; Sun, 19 Jun 2022 06:53:01 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1o2ont-0004ma-5a; Sun, 19 Jun 2022 06:53:01 +0000 Received: by outflank-mailman (input) for mailman id 352044; Sun, 19 Jun 2022 06:52:59 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1o2onr-0004F8-Np for xen-devel@lists.xenproject.org; Sun, 19 Jun 2022 06:52:59 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 72c3744e-ef9c-11ec-b725-ed86ccbb4733; Sun, 19 Jun 2022 08:52:56 +0200 (CEST) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 089FE1FD96; Sun, 19 Jun 2022 06:52:56 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id BBB2F13427; Sun, 19 Jun 2022 06:52:55 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id UCh0LMfHrmJzXgAAMHmgww (envelope-from ); Sun, 19 Jun 2022 06:52:55 +0000 X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 72c3744e-ef9c-11ec-b725-ed86ccbb4733 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1655621576; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xmLVZAezCgzTgOsivEiAdLkZ5h3o4dxtcy7J5SE1ulo=; b=Nki0XgCrhrAtcSGlsxAi7Igkh5HutNGZ1se7+Qjw1BBYbqM1ZY0J1CSIw1nMGG1OpYVOiY +m6BU7OVZtvEUC25lBZiXcEUIOPKtCqF4yYh9bgSp+xdmgOgyw9/zMQeHmMmN65rC/rJj9 FhKCY+x9DOhzuOKuHa//gpUF4UEX9Mw= From: Juergen Gross To: minios-devel@lists.xenproject.org, xen-devel@lists.xenproject.org Cc: samuel.thibault@ens-lyon.org, wl@xen.org, Juergen Gross Subject: [PATCH v2 4/4] mini-os: fix bug in ballooning on PVH Date: Sun, 19 Jun 2022 08:52:53 +0200 Message-Id: <20220619065253.19503-5-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20220619065253.19503-1-jgross@suse.com> References: <20220619065253.19503-1-jgross@suse.com> MIME-Version: 1.0 There is a subtle bug in ballooning code for PVH: in case ballooning extends above a non-RAM area of the memory map, wrong pages will be used. Signed-off-by: Juergen Gross Reviewed-by: Samuel Thibault --- V2: - new patch --- balloon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/balloon.c b/balloon.c index 6ad07644..55be8141 100644 --- a/balloon.c +++ b/balloon.c @@ -124,7 +124,7 @@ int balloon_up(unsigned long n_pages) for ( pfn = 0; pfn < rc; pfn++ ) { arch_pfn_add(start_pfn + pfn, balloon_frames[pfn]); - free_page(pfn_to_virt(nr_mem_pages + pfn)); + free_page(pfn_to_virt(start_pfn + pfn)); } nr_mem_pages += rc;