summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2017-06-24 22:49:22 +0200
committerRichard Braun <rbraun@sceen.net>2017-06-25 00:04:15 +0200
commit9fb3131dbde508526dcbec29aac166ca425cd352 (patch)
tree182bdd2c35968fab94b521a8efd39f7c25f889e5
parent58401aa087399e0344b73e91f5708af2451b33e7 (diff)
Move physical memory properties into the new x86/pmem module
-rw-r--r--arch/x86/Makefrag.am1
-rw-r--r--arch/x86/machine/biosmem.c49
-rw-r--r--arch/x86/machine/param.h37
-rw-r--r--arch/x86/machine/pmem.h67
-rw-r--r--vm/vm_page.c22
-rw-r--r--vm/vm_page.h3
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);
}