[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] xen/dt: Skip non-RAM reserved-memory regions in make_memory_node()


  • To: Kuan-Wei Chiu <visitorckw@xxxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: "Orzel, Michal" <michal.orzel@xxxxxxx>
  • Date: Fri, 30 Oct 2026 12:04:58 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=gmail.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0)
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=YgGSe5eZc8SlUXO4dgxVFymdQe2k8NNy8kYwGxCq9/I=; b=tIeV/2cAf1lc935jso1Tnj/ZFMfS+y7QwtiFabc5/TmZtXJ4tpMVRNuWW1HEt34stiD60fxpfVaMYDDDhANujhTYXn/7EuS4jr+KDEHnHeny/Mp5K4pYBKZc7OMZRoEB3hhDLpsabYzHiCnr6Rm5R3i4r+ZTvRF3+m7FCa79npHBVkNa7nr1Cr66MMvwdo+EXqAIgmKNcdqOJJI10znr/xHyvuFPGNFb/PcsWszuE4DDvOicNy90+2JaULrv7XtEUCSlrIsO5JNMzd1srWSj1v3UEgHU/XaUNWeQ8lYK3QfmBKynFWmpHFgBhHtXYXAZN7wUs+HUCj8N1rzzn9zy7w==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=V/haRyWrQI/TsXQmqnJRydgIR+Y9UF8fLV0YWMTgMxSYs+8Zdv8qJLMG6ViG5H/ZbV0WDKjSuWsJ8jDcmm7O2e8fXwak/NZ6VN/vvoVnqoBhauVPtcN19aVJgrtWL+6elHpCeYzZbp1kU6L9eRIZM6cIK7eOAgU2GLrLgR/CtxrqqmgLRttUtVck7diTgpZuT2p+TdVA4RoRlGUPw6jGkU7gsApLqRGaRBTEg35uwlgW2V5/mxbX3jXB34S/8Bnab3jRgqoylV8QsEcBHlhIchLNo0yZw7xPa2SKrA+//g9AJYzUKJvz+qJQCI/24gofm7Ejd2OQ0qsYi7rFFjk/cw==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=amd.com header.i="@amd.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Cc: <sstabellini@xxxxxxxxxx>, <julien@xxxxxxx>, <bertrand.marquis@xxxxxxx>, <marscheng@xxxxxxxxxx>, <jserv@xxxxxxxxxxxxxxxx>, <eleanor15x@xxxxxxxxx>
  • Delivery-date: Fri, 30 Oct 2026 11:05:30 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>


On 28-Oct-26 22:17, Kuan-Wei Chiu wrote:
> Xen creates a second /memory node for Dom0 from
> bootinfo_get_reserved_mem() without checking whether those regions
> belong to host RAM. However, /reserved-memory can also describe
> on-chip SRAM or firmware regions outside system RAM. Listing them in a
> /memory node causes Dom0 to register non-RAM addresses as system RAM,
> conflicting with device MMIO mappings.
Hmm, I always thought that /reserved-memory is to exclude regions from memory
described under /memory. That's what Xen assumes too. map_range_to_domain() for
example does not call iomem_permit_access() for such regions because we assume
it's RAM. Can you provide more details of your board e.g. the device tree? Is
there any documentation I could use to confirm that "reserved-memory can also
describe on-chip SRAM or firmware regions outside system RAM"?

~Michal

> 
> Skip reserved-memory banks outside the host RAM banks reported by
> bootinfo_get_mem() in make_memory_node().
> 
> Fixes: 248faa637d2f ("xen/arm: add reserved-memory regions to the dom0 memory 
> node")
> Signed-off-by: Kuan-Wei Chiu <visitorckw@xxxxxxxxx>
> ---
> Found while trying to bring up Xen on new hardware.
> Tested on real silicon.
> 
>  xen/common/device-tree/domain-build.c | 42 +++++++++++++++++++++++++--
>  1 file changed, 39 insertions(+), 3 deletions(-)
> 
> diff --git a/xen/common/device-tree/domain-build.c 
> b/xen/common/device-tree/domain-build.c
> index 30a59abfa7..33baf150a6 100644
> --- a/xen/common/device-tree/domain-build.c
> +++ b/xen/common/device-tree/domain-build.c
> @@ -504,6 +504,34 @@ int __init make_chosen_node(const struct kernel_info 
> *kinfo)
>      return res;
>  }
>  
> +static bool __init is_in_host_ram(const struct membank *bank)
> +{
> +    const struct membanks *ram = bootinfo_get_mem();
> +    paddr_t start = bank->start;
> +    paddr_t end = start + bank->size;
> +    unsigned int i;
> +
> +    if ( !bank->size || end < start )
> +        return false;
> +
> +    for ( i = 0; i < ram->nr_banks; i++ )
> +    {
> +        paddr_t ram_start = ram->bank[i].start;
> +        paddr_t ram_end = ram_start + ram->bank[i].size;
> +
> +        if ( start < ram_start )
> +            return false;
> +
> +        if ( end <= ram_end )
> +            return true;
> +
> +        if ( start < ram_end )
> +            start = ram_end;
> +    }
> +
> +    return false;
> +}
> +
>  int __init make_memory_node(const struct kernel_info *kinfo, int addrcells,
>                              int sizecells, const struct membanks *mem)
>  {
> @@ -513,14 +541,20 @@ int __init make_memory_node(const struct kernel_info 
> *kinfo, int addrcells,
>      int nr_cells = 0;
>      __be32 reg[DT_MEM_NODE_REG_RANGE_SIZE];
>      __be32 *cells;
> +    bool is_resv = (mem == bootinfo_get_reserved_mem());
>  
>      if ( mem->nr_banks == 0 )
>          return -ENOENT;
>  
>      /* find the first memory range that is reserved for device (or firmware) 
> */
> -    for ( i = 0; i < mem->nr_banks &&
> -                 (mem->bank[i].type != MEMBANK_DEFAULT); i++ )
> -        ;
> +    for ( i = 0; i < mem->nr_banks; i++ )
> +    {
> +        if ( mem->bank[i].type != MEMBANK_DEFAULT )
> +            continue;
> +        if ( is_resv && !is_in_host_ram(&mem->bank[i]) )
> +            continue;
> +        break;
> +    }
>  
>      if ( i == mem->nr_banks )
>          return 0;
> @@ -544,6 +578,8 @@ int __init make_memory_node(const struct kernel_info 
> *kinfo, int addrcells,
>          if ( (mem->bank[i].type == MEMBANK_STATIC_DOMAIN) ||
>               (mem->bank[i].type == MEMBANK_FDT_RESVMEM) )
>              continue;
> +        if ( is_resv && !is_in_host_ram(&mem->bank[i]) )
> +            continue;
>  
>          nr_cells += reg_size;
>          BUG_ON(nr_cells > ARRAY_SIZE(reg));




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.