[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 -+-
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |