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

Re: [PATCH 01/10] mini-os: split e820 map handling into new source file



Juergen Gross, le lun. 06 déc. 2021 08:23:28 +0100, a ecrit:
> Introduce e820.c containing all the E820 memory map handling.
> 
> No functional change.
> 
> Signed-off-by: Juergen Gross <jgross@xxxxxxxx>

Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>

> ---
>  Makefile       |   1 +
>  arch/arm/mm.c  |   8 ----
>  arch/x86/mm.c  |  70 +----------------------------
>  e820.c         | 119 +++++++++++++++++++++++++++++++++++++++++++++++++
>  include/e820.h |   6 +++
>  5 files changed, 128 insertions(+), 76 deletions(-)
>  create mode 100644 e820.c
> 
> diff --git a/Makefile b/Makefile
> index 4b76b55..06b60fc 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -41,6 +41,7 @@ src-$(CONFIG_TPMFRONT) += tpmfront.c
>  src-$(CONFIG_TPM_TIS) += tpm_tis.c
>  src-$(CONFIG_TPMBACK) += tpmback.c
>  src-y += daytime.c
> +src-y += e820.c
>  src-y += events.c
>  src-$(CONFIG_FBFRONT) += fbfront.c
>  src-y += gntmap.c
> diff --git a/arch/arm/mm.c b/arch/arm/mm.c
> index f806c9f..9068166 100644
> --- a/arch/arm/mm.c
> +++ b/arch/arm/mm.c
> @@ -7,14 +7,6 @@
>  #include <lib.h>
>  
>  uint32_t physical_address_offset;
> -struct e820entry e820_map[1] = {
> -    {
> -        .addr = 0,
> -        .size = ULONG_MAX - 1,
> -        .type = E820_RAM
> -    }
> -};
> -unsigned e820_entries = 1;
>  
>  unsigned long allocate_ondemand(unsigned long n, unsigned long alignment)
>  {
> diff --git a/arch/x86/mm.c b/arch/x86/mm.c
> index 8ba14a5..8df93da 100644
> --- a/arch/x86/mm.c
> +++ b/arch/x86/mm.c
> @@ -64,15 +64,6 @@ extern char stack[];
>  extern void page_walk(unsigned long va);
>  
>  #ifdef CONFIG_PARAVIRT
> -struct e820entry e820_map[1] = {
> -    {
> -        .addr = 0,
> -        .size = ULONG_MAX - 1,
> -        .type = E820_RAM
> -    }
> -};
> -unsigned e820_entries = 1;
> -
>  void arch_mm_preinit(void *p)
>  {
>      start_info_t *si = p;
> @@ -112,25 +103,11 @@ desc_ptr idt_ptr =
>      .base = (unsigned long)&idt,
>  };
>  
> -struct e820entry e820_map[E820_MAX];
> -unsigned e820_entries;
> -
> -static char *e820_types[E820_TYPES] = {
> -    [E820_RAM]      = "RAM",
> -    [E820_RESERVED] = "Reserved",
> -    [E820_ACPI]     = "ACPI",
> -    [E820_NVS]      = "NVS",
> -    [E820_UNUSABLE] = "Unusable",
> -    [E820_PMEM]     = "PMEM"
> -};
> -
>  void arch_mm_preinit(void *p)
>  {
>      long ret;
>      domid_t domid = DOMID_SELF;
> -    struct xen_memory_map memmap;
> -    int i;
> -    unsigned long pfn, max = 0;
> +    unsigned long max;
>  
>      pt_base = page_table_base;
>      first_free_pfn = PFN_UP(to_phys(&_end));
> @@ -142,53 +119,10 @@ void arch_mm_preinit(void *p)
>      }
>      last_free_pfn = ret;
>  
> -    memmap.nr_entries = E820_MAX;
> -    set_xen_guest_handle(memmap.buffer, e820_map);
> -    ret = HYPERVISOR_memory_op(XENMEM_memory_map, &memmap);
> -    if ( ret < 0 )
> -    {
> -        xprintk("could not get memory map\n");
> -        do_exit();
> -    }
> -    e820_entries = memmap.nr_entries;
> -
> -    for ( i = 0; i < e820_entries; i++ )
> -    {
> -        if ( e820_map[i].type != E820_RAM )
> -            continue;
> -        pfn = (e820_map[i].addr + e820_map[i].size) >> PAGE_SHIFT;
> -        if ( pfn > max )
> -            max = pfn;
> -    }
> -
> +    max = e820_get_maxpfn();
>      if ( max < last_free_pfn )
>          last_free_pfn = max;
>  }
> -
> -void arch_print_memmap(void)
> -{
> -    int i;
> -    unsigned long from, to;
> -    char *type;
> -    char buf[12];
> -
> -    printk("Memory map:\n");
> -    for ( i = 0; i < e820_entries; i++ )
> -    {
> -        if ( e820_map[i].type >= E820_TYPES || !e820_types[e820_map[i].type] 
> )
> -        {
> -            snprintf(buf, sizeof(buf), "%8x", e820_map[i].type);
> -            type = buf;
> -        }
> -        else
> -        {
> -            type = e820_types[e820_map[i].type];
> -        }
> -        from = e820_map[i].addr;
> -        to = from + e820_map[i].size - 1;
> -        printk("%012lx-%012lx: %s\n", from, to, type);
> -    }
> -}
>  #endif
>  
>  /*
> diff --git a/e820.c b/e820.c
> new file mode 100644
> index 0000000..2165280
> --- /dev/null
> +++ b/e820.c
> @@ -0,0 +1,119 @@
> +/* -*-  Mode:C; c-basic-offset:4; tab-width:4 -*-
> + *
> + * (C) 2021 - Juergen Gross, SUSE Software Solutions Germany GmbH
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a 
> copy
> + * of this software and associated documentation files (the "Software"), to
> + * deal in the Software without restriction, including without limitation the
> + * rights to use, copy, modify, merge, publish, distribute, sublicense, 
> and/or
> + * sell copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
> THE
> + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + */
> +
> +#include <mini-os/types.h>
> +#include <mini-os/lib.h>
> +#include <mini-os/console.h>
> +#include <mini-os/os.h>
> +#include <mini-os/posix/limits.h>
> +#include <mini-os/e820.h>
> +#include <xen/memory.h>
> +
> +#ifdef CONFIG_E820_TRIVIAL
> +struct e820entry e820_map[1] = {
> +    {
> +        .addr = 0,
> +        .size = ULONG_MAX - 1,
> +        .type = E820_RAM
> +    }
> +};
> +
> +unsigned e820_entries = 1;
> +
> +static void e820_get_memmap(void)
> +{
> +}
> +
> +#else
> +struct e820entry e820_map[E820_MAX];
> +unsigned e820_entries;
> +
> +static char *e820_types[E820_TYPES] = {
> +    [E820_RAM]      = "RAM",
> +    [E820_RESERVED] = "Reserved",
> +    [E820_ACPI]     = "ACPI",
> +    [E820_NVS]      = "NVS",
> +    [E820_UNUSABLE] = "Unusable",
> +    [E820_PMEM]     = "PMEM"
> +};
> +
> +static void e820_get_memmap(void)
> +{
> +    long ret;
> +    struct xen_memory_map memmap;
> +
> +    memmap.nr_entries = E820_MAX;
> +    set_xen_guest_handle(memmap.buffer, e820_map);
> +    ret = HYPERVISOR_memory_op(XENMEM_memory_map, &memmap);
> +    if ( ret < 0 )
> +    {
> +        xprintk("could not get memory map\n");
> +        do_exit();
> +    }
> +    e820_entries = memmap.nr_entries;
> +}
> +
> +void arch_print_memmap(void)
> +{
> +    int i;
> +    unsigned long from, to;
> +    char *type;
> +    char buf[12];
> +
> +    printk("Memory map:\n");
> +    for ( i = 0; i < e820_entries; i++ )
> +    {
> +        if ( e820_map[i].type >= E820_TYPES || !e820_types[e820_map[i].type] 
> )
> +        {
> +            snprintf(buf, sizeof(buf), "%8x", e820_map[i].type);
> +            type = buf;
> +        }
> +        else
> +        {
> +            type = e820_types[e820_map[i].type];
> +        }
> +        from = e820_map[i].addr;
> +        to = from + e820_map[i].size - 1;
> +        printk("%012lx-%012lx: %s\n", from, to, type);
> +    }
> +}
> +#endif
> +
> +unsigned long e820_get_maxpfn(void)
> +{
> +    int i;
> +    unsigned long pfn, max = 0;
> +
> +    e820_get_memmap();
> +
> +    for ( i = 0; i < e820_entries; i++ )
> +    {
> +        if ( e820_map[i].type != E820_RAM )
> +            continue;
> +        pfn = (e820_map[i].addr + e820_map[i].size) >> PAGE_SHIFT;
> +        if ( pfn > max )
> +            max = pfn;
> +    }
> +
> +    return max;
> +}
> diff --git a/include/e820.h b/include/e820.h
> index 920551c..af2129f 100644
> --- a/include/e820.h
> +++ b/include/e820.h
> @@ -24,6 +24,10 @@
>  #ifndef __E820_HEADER
>  #define __E820_HEADER
>  
> +#if defined(__arm__) || defined(__aarch64__) || defined(CONFIG_PARAVIRT)
> +#define CONFIG_E820_TRIVIAL
> +#endif
> +
>  /* PC BIOS standard E820 types and structure. */
>  #define E820_RAM          1
>  #define E820_RESERVED     2
> @@ -45,4 +49,6 @@ struct __packed e820entry {
>  extern struct e820entry e820_map[];
>  extern unsigned e820_entries;
>  
> +unsigned long e820_get_maxpfn(void);
> +
>  #endif /*__E820_HEADER*/
> -- 
> 2.26.2
> 

-- 
Samuel
* c is away : cuisine; bouffe
<y> oh, moi je fais plutôt cuisine & bouffe en fait :)
<c> oui c'est vrai, certains font cuisine && bouffe (juste au cas où... ;-))
<y> ( cuisine && bouffe ) || restau
<N> voire ((cuisine && bouffe) || restau) & apéritif
 -+- #ens-mim -+-



 


Rackspace

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