diff options
author | Richard Braun <rbraun@sceen.net> | 2017-06-24 22:49:22 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2017-06-25 00:04:15 +0200 |
commit | 9fb3131dbde508526dcbec29aac166ca425cd352 (patch) | |
tree | 182bdd2c35968fab94b521a8efd39f7c25f889e5 | |
parent | 58401aa087399e0344b73e91f5708af2451b33e7 (diff) |
Move physical memory properties into the new x86/pmem module
-rw-r--r-- | arch/x86/Makefrag.am | 1 | ||||
-rw-r--r-- | arch/x86/machine/biosmem.c | 49 | ||||
-rw-r--r-- | arch/x86/machine/param.h | 37 | ||||
-rw-r--r-- | arch/x86/machine/pmem.h | 67 | ||||
-rw-r--r-- | vm/vm_page.c | 22 | ||||
-rw-r--r-- | vm/vm_page.h | 3 |
6 files changed, 106 insertions, 73 deletions
diff --git a/arch/x86/Makefrag.am b/arch/x86/Makefrag.am index 965bd0bc..964d1338 100644 --- a/arch/x86/Makefrag.am +++ b/arch/x86/Makefrag.am @@ -57,6 +57,7 @@ x15_SOURCES += \ arch/x86/machine/pit.h \ arch/x86/machine/pmap.c \ arch/x86/machine/pmap.h \ + arch/x86/machine/pmem.h \ arch/x86/machine/ssp.c \ arch/x86/machine/ssp.h \ arch/x86/machine/strace.c \ diff --git a/arch/x86/machine/biosmem.c b/arch/x86/machine/biosmem.c index 8be00b10..5d510595 100644 --- a/arch/x86/machine/biosmem.c +++ b/arch/x86/machine/biosmem.c @@ -30,6 +30,7 @@ #include <machine/boot.h> #include <machine/cpu.h> #include <machine/multiboot.h> +#include <machine/pmem.h> #include <machine/types.h> #include <vm/vm_kmem.h> #include <vm/vm_page.h> @@ -108,7 +109,7 @@ struct biosmem_zone { /* * Physical zone boundaries. */ -static struct biosmem_zone biosmem_zones[VM_PAGE_MAX_ZONES] __bootdata; +static struct biosmem_zone biosmem_zones[PMEM_MAX_ZONES] __bootdata; /* * Boundaries of the simple bootstrap heap. @@ -606,8 +607,8 @@ biosmem_setup_allocator(const struct multiboot_raw_info *mbi) end = vm_page_trunc((mbi->mem_upper + 1024) << 10); #ifndef __LP64__ - if (end > VM_PAGE_DIRECTMAP_LIMIT) { - end = VM_PAGE_DIRECTMAP_LIMIT; + if (end > PMEM_DIRECTMAP_LIMIT) { + end = PMEM_DIRECTMAP_LIMIT; } #endif /* __LP64__ */ @@ -661,46 +662,46 @@ biosmem_bootstrap(const struct multiboot_raw_info *mbi) biosmem_map_adjust(); phys_start = BIOSMEM_BASE; - phys_end = VM_PAGE_DMA_LIMIT; + phys_end = PMEM_DMA_LIMIT; error = biosmem_map_find_avail(&phys_start, &phys_end); if (error) { boot_panic(biosmem_panic_nozone_msg); } - biosmem_set_zone(VM_PAGE_ZONE_DMA, phys_start, phys_end); + biosmem_set_zone(PMEM_ZONE_DMA, phys_start, phys_end); - phys_start = VM_PAGE_DMA_LIMIT; -#ifdef VM_PAGE_DMA32_LIMIT - phys_end = VM_PAGE_DMA32_LIMIT; + phys_start = PMEM_DMA_LIMIT; +#ifdef PMEM_DMA32_LIMIT + phys_end = PMEM_DMA32_LIMIT; error = biosmem_map_find_avail(&phys_start, &phys_end); if (error) { goto out; } - biosmem_set_zone(VM_PAGE_ZONE_DMA32, phys_start, phys_end); + biosmem_set_zone(PMEM_ZONE_DMA32, phys_start, phys_end); - phys_start = VM_PAGE_DMA32_LIMIT; -#endif /* VM_PAGE_DMA32_LIMIT */ - phys_end = VM_PAGE_DIRECTMAP_LIMIT; + phys_start = PMEM_DMA32_LIMIT; +#endif /* PMEM_DMA32_LIMIT */ + phys_end = PMEM_DIRECTMAP_LIMIT; error = biosmem_map_find_avail(&phys_start, &phys_end); if (error) { goto out; } - biosmem_set_zone(VM_PAGE_ZONE_DIRECTMAP, phys_start, phys_end); + biosmem_set_zone(PMEM_ZONE_DIRECTMAP, phys_start, phys_end); - phys_start = VM_PAGE_DIRECTMAP_LIMIT; - phys_end = VM_PAGE_HIGHMEM_LIMIT; + phys_start = PMEM_DIRECTMAP_LIMIT; + phys_end = PMEM_HIGHMEM_LIMIT; error = biosmem_map_find_avail(&phys_start, &phys_end); if (error) { goto out; } - biosmem_set_zone(VM_PAGE_ZONE_HIGHMEM, phys_start, phys_end); + biosmem_set_zone(PMEM_ZONE_HIGHMEM, phys_start, phys_end); out: biosmem_setup_allocator(mbi); @@ -750,12 +751,12 @@ biosmem_get_bda(void) phys_addr_t __boot biosmem_directmap_end(void) { - if (biosmem_zone_size(VM_PAGE_ZONE_DIRECTMAP) != 0) { - return biosmem_zone_end(VM_PAGE_ZONE_DIRECTMAP); - } else if (biosmem_zone_size(VM_PAGE_ZONE_DMA32) != 0) { - return biosmem_zone_end(VM_PAGE_ZONE_DMA32); + if (biosmem_zone_size(PMEM_ZONE_DIRECTMAP) != 0) { + return biosmem_zone_end(PMEM_ZONE_DIRECTMAP); + } else if (biosmem_zone_size(PMEM_ZONE_DMA32) != 0) { + return biosmem_zone_end(PMEM_ZONE_DMA32); } else { - return biosmem_zone_end(VM_PAGE_ZONE_DMA); + return biosmem_zone_end(PMEM_ZONE_DMA); } } @@ -941,14 +942,14 @@ biosmem_free_usable(void) start = vm_page_round(entry->base_addr); - if (start >= VM_PAGE_HIGHMEM_LIMIT) { + if (start >= PMEM_HIGHMEM_LIMIT) { break; } end = vm_page_trunc(entry->base_addr + entry->length); - if (end > VM_PAGE_HIGHMEM_LIMIT) { - end = VM_PAGE_HIGHMEM_LIMIT; + if (end > PMEM_HIGHMEM_LIMIT) { + end = PMEM_HIGHMEM_LIMIT; } if (start < BIOSMEM_BASE) { diff --git a/arch/x86/machine/param.h b/arch/x86/machine/param.h index 42133ab4..7f1fc2e4 100644 --- a/arch/x86/machine/param.h +++ b/arch/x86/machine/param.h @@ -96,41 +96,4 @@ #define VM_MAX_KMEM_ADDRESS VM_MAX_KERNEL_ADDRESS #endif /* __LP64__ */ -/* - * Physical memory properties. - */ - -#define VM_PAGE_DMA_LIMIT DECL_CONST(0x1000000, UL) - -#ifdef __LP64__ -#define VM_PAGE_MAX_ZONES 4 -#define VM_PAGE_DMA32_LIMIT DECL_CONST(0x100000000, UL) -#define VM_PAGE_DIRECTMAP_LIMIT DECL_CONST(0x400000000000, UL) -#define VM_PAGE_HIGHMEM_LIMIT DECL_CONST(0x10000000000000, UL) -#else /* __LP64__ */ -#define VM_PAGE_DIRECTMAP_LIMIT DECL_CONST(0x38000000, ULL) -#ifdef X15_X86_PAE -#define VM_PAGE_MAX_ZONES 3 -#define VM_PAGE_HIGHMEM_LIMIT DECL_CONST(0x10000000000000, ULL) -#else /* X15_X86_PAE */ -#define VM_PAGE_MAX_ZONES 3 -#define VM_PAGE_HIGHMEM_LIMIT DECL_CONST(0xfffff000, UL) -#endif /* X15_X86_PAE */ -#endif /* __LP64__ */ - -/* - * Physical zone indexes. - */ -#define VM_PAGE_ZONE_DMA 0 - -#ifdef __LP64__ -#define VM_PAGE_ZONE_DMA32 1 -#define VM_PAGE_ZONE_DIRECTMAP 2 -#define VM_PAGE_ZONE_HIGHMEM 3 -#else /* __LP64__ */ -#define VM_PAGE_ZONE_DMA32 1 /* Alias for the DIRECTMAP zone */ -#define VM_PAGE_ZONE_DIRECTMAP 1 -#define VM_PAGE_ZONE_HIGHMEM 2 -#endif /* __LP64__ */ - #endif /* _X86_PARAM_H */ diff --git a/arch/x86/machine/pmem.h b/arch/x86/machine/pmem.h new file mode 100644 index 00000000..b6c6db0c --- /dev/null +++ b/arch/x86/machine/pmem.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2017 Richard Braun. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * + * Physical memory layout. + * + * This file is a top header in the inclusion hierarchy, and shouldn't include + * other headers that may cause circular dependencies. + */ + +#ifndef _X86_PMEM_H +#define _X86_PMEM_H + +#include <kern/macros.h> + +/* + * Zone boundaries. + */ + +#define PMEM_DMA_LIMIT DECL_CONST(0x1000000, UL) + +#ifdef __LP64__ +#define PMEM_MAX_ZONES 4 +#define PMEM_DMA32_LIMIT DECL_CONST(0x100000000, UL) +#define PMEM_DIRECTMAP_LIMIT DECL_CONST(0x400000000000, UL) +#define PMEM_HIGHMEM_LIMIT DECL_CONST(0x10000000000000, UL) +#else /* __LP64__ */ +#define PMEM_DIRECTMAP_LIMIT DECL_CONST(0x38000000, ULL) +#ifdef X15_X86_PAE +#define PMEM_MAX_ZONES 3 +#define PMEM_HIGHMEM_LIMIT DECL_CONST(0x10000000000000, ULL) +#else /* X15_X86_PAE */ +#define PMEM_MAX_ZONES 3 +#define PMEM_HIGHMEM_LIMIT DECL_CONST(0xfffff000, UL) +#endif /* X15_X86_PAE */ +#endif /* __LP64__ */ + +/* + * Zone vm_page indexes. + */ + +#define PMEM_ZONE_DMA 0 +#define PMEM_ZONE_DMA32 1 + +#ifdef __LP64__ +#define PMEM_ZONE_DIRECTMAP 2 +#define PMEM_ZONE_HIGHMEM 3 +#else /* __LP64__ */ +#define PMEM_ZONE_DMA32 1 +#define PMEM_ZONE_DIRECTMAP 1 /* Alias for the DMA32 zone */ +#define PMEM_ZONE_HIGHMEM 2 +#endif /* __LP64__ */ + +#endif /* _X86_PMEM_H */ diff --git a/vm/vm_page.c b/vm/vm_page.c index 4ddf34a2..2c48a0dd 100644 --- a/vm/vm_page.c +++ b/vm/vm_page.c @@ -45,7 +45,7 @@ #include <kern/shell.h> #include <kern/thread.h> #include <machine/cpu.h> -#include <machine/pmap.h> +#include <machine/pmem.h> #include <machine/types.h> #include <vm/vm_page.h> @@ -145,12 +145,12 @@ static int vm_page_is_ready __read_mostly; * the direct physical mapping, DMA and DMA32 are aliases for DIRECTMAP, * in which case the zone table contains DIRECTMAP and HIGHMEM only. */ -static struct vm_page_zone vm_page_zones[VM_PAGE_MAX_ZONES]; +static struct vm_page_zone vm_page_zones[PMEM_MAX_ZONES]; /* * Bootstrap zone table. */ -static struct vm_page_boot_zone vm_page_boot_zones[VM_PAGE_MAX_ZONES] +static struct vm_page_boot_zone vm_page_boot_zones[PMEM_MAX_ZONES] __initdata; /* @@ -552,16 +552,16 @@ vm_page_select_alloc_zone(unsigned int selector) switch (selector) { case VM_PAGE_SEL_DMA: - zone_index = VM_PAGE_ZONE_DMA; + zone_index = PMEM_ZONE_DMA; break; case VM_PAGE_SEL_DMA32: - zone_index = VM_PAGE_ZONE_DMA32; + zone_index = PMEM_ZONE_DMA32; break; case VM_PAGE_SEL_DIRECTMAP: - zone_index = VM_PAGE_ZONE_DIRECTMAP; + zone_index = PMEM_ZONE_DIRECTMAP; break; case VM_PAGE_SEL_HIGHMEM: - zone_index = VM_PAGE_ZONE_HIGHMEM; + zone_index = PMEM_ZONE_HIGHMEM; break; default: panic("vm_page: invalid selector"); @@ -795,13 +795,13 @@ const char * vm_page_zone_name(unsigned int zone_index) { /* Don't use a switch statement since zones can be aliased */ - if (zone_index == VM_PAGE_ZONE_HIGHMEM) { + if (zone_index == PMEM_ZONE_HIGHMEM) { return "HIGHMEM"; - } else if (zone_index == VM_PAGE_ZONE_DIRECTMAP) { + } else if (zone_index == PMEM_ZONE_DIRECTMAP) { return "DIRECTMAP"; - } else if (zone_index == VM_PAGE_ZONE_DMA32) { + } else if (zone_index == PMEM_ZONE_DMA32) { return "DMA32"; - } else if (zone_index == VM_PAGE_ZONE_DMA) { + } else if (zone_index == PMEM_ZONE_DMA) { return "DMA"; } else { panic("vm_page: invalid zone index"); diff --git a/vm/vm_page.h b/vm/vm_page.h index 34ad163d..86ab5277 100644 --- a/vm/vm_page.h +++ b/vm/vm_page.h @@ -30,6 +30,7 @@ #include <kern/macros.h> #include <kern/param.h> #include <machine/pmap.h> +#include <machine/pmem.h> #include <machine/types.h> /* @@ -105,7 +106,7 @@ vm_page_to_pa(const struct vm_page *page) static inline uintptr_t vm_page_direct_va(phys_addr_t pa) { - assert(pa < VM_PAGE_DIRECTMAP_LIMIT); + assert(pa < PMEM_DIRECTMAP_LIMIT); return ((uintptr_t)pa + VM_MIN_DIRECTMAP_ADDRESS); } |