summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2013-06-28 20:44:33 +0200
committerRichard Braun <rbraun@sceen.net>2013-06-28 20:44:33 +0200
commit0239be76d4601a2a1bf448965e0ffc7c17735613 (patch)
tree1494a4c85543b6b921a91b9e51b45e64e7b687e9
parent4df29fcd578766758d516cb207a8a484aaf7e4b3 (diff)
x86/pmap: replace pmap_kextract with pmap_extract
As it was done for pmap_protect, replace a kernel-specific call with one that can handle both the kernel and regular pmaps. The new function isn't complete yet and cannot handle physical maps that aren't the kernel pmap or the currently loaded pmap.
-rw-r--r--arch/x86/machine/pmap.c16
-rw-r--r--arch/x86/machine/pmap.h10
-rw-r--r--arch/x86/machine/strace.c4
-rw-r--r--vm/vm_kmem.c4
-rw-r--r--vm/vm_map.c2
5 files changed, 27 insertions, 9 deletions
diff --git a/arch/x86/machine/pmap.c b/arch/x86/machine/pmap.c
index 1c7b40fa..d35c5b19 100644
--- a/arch/x86/machine/pmap.c
+++ b/arch/x86/machine/pmap.c
@@ -610,8 +610,8 @@ pmap_protect(struct pmap *pmap, unsigned long start, unsigned long end,
panic("pmap: pmap_protect not completely implemented yet");
}
-phys_addr_t
-pmap_kextract(unsigned long va)
+static phys_addr_t
+pmap_extract_ptemap(unsigned long va)
{
const struct pmap_pt_level *pt_level;
unsigned int level;
@@ -628,6 +628,16 @@ pmap_kextract(unsigned long va)
return *pte & PMAP_PA_MASK;
}
+phys_addr_t
+pmap_extract(struct pmap *pmap, unsigned long va)
+{
+ if ((pmap == kernel_pmap) || (pmap == pmap_current()))
+ return pmap_extract_ptemap(va);
+
+ /* TODO Complete pmap_extract() */
+ panic("pmap: pmap_extract not completely implemented yet");
+}
+
static void
pmap_kupdate_local(unsigned long start, unsigned long end)
{
@@ -766,7 +776,7 @@ pmap_create(struct pmap **pmapp)
for (i = 0; i < PMAP_NR_RPTPS; i++)
pmap->pdpt[i] = (pmap->root_pt + (i * PAGE_SIZE)) | PMAP_PTE_P;
- pa = pmap_kextract(va) + (va & PAGE_MASK);
+ pa = pmap_extract_ptemap(va) + (va & PAGE_MASK);
assert(pa < VM_PHYS_NORMAL_LIMIT);
pmap->pdpt_pa = (unsigned long)pa;
#endif /* X86_PAE */
diff --git a/arch/x86/machine/pmap.h b/arch/x86/machine/pmap.h
index e9a7d38b..fc6a9322 100644
--- a/arch/x86/machine/pmap.h
+++ b/arch/x86/machine/pmap.h
@@ -179,7 +179,6 @@ void pmap_kgrow(unsigned long end);
*/
void pmap_kenter(unsigned long va, phys_addr_t pa);
void pmap_kremove(unsigned long start, unsigned long end);
-phys_addr_t pmap_kextract(unsigned long va);
/*
* Set the protection of mappings in a physical map.
@@ -188,6 +187,15 @@ void pmap_protect(struct pmap *pmap, unsigned long start, unsigned long end,
int prot);
/*
+ * Extract a mapping from a physical map.
+ *
+ * This function walks the page tables to retreive the physical address
+ * mapped at the given virtual address. If there is no mapping for the
+ * virtual address, 0 is returned (implying that page 0 is always reserved).
+ */
+phys_addr_t pmap_extract(struct pmap *pmap, unsigned long va);
+
+/*
* Flush the TLB for the given range of kernel addresses.
*/
void pmap_kupdate(unsigned long start, unsigned long end);
diff --git a/arch/x86/machine/strace.c b/arch/x86/machine/strace.c
index 0295e2ff..aee93775 100644
--- a/arch/x86/machine/strace.c
+++ b/arch/x86/machine/strace.c
@@ -92,7 +92,7 @@ strace_show(unsigned long ip, unsigned long bp)
if (frame == NULL)
break;
- pa = pmap_kextract((unsigned long)&frame[1]);
+ pa = pmap_extract(kernel_pmap, (unsigned long)&frame[1]);
if (pa == 0) {
printk("strace: unmapped return address at %p\n", &frame[1]);
@@ -100,7 +100,7 @@ strace_show(unsigned long ip, unsigned long bp)
}
strace_show_one(i, (unsigned long)frame[1]);
- pa = pmap_kextract((unsigned long)frame);
+ pa = pmap_extract(kernel_pmap, (unsigned long)frame);
if (pa == 0) {
printk("strace: unmapped frame address at %p\n", frame);
diff --git a/vm/vm_kmem.c b/vm/vm_kmem.c
index 24a23525..77238934 100644
--- a/vm/vm_kmem.c
+++ b/vm/vm_kmem.c
@@ -89,7 +89,7 @@ vm_kmem_lookup_page(unsigned long va)
{
phys_addr_t pa;
- pa = pmap_kextract(va);
+ pa = pmap_extract(kernel_pmap, va);
if (pa == 0)
return NULL;
@@ -188,7 +188,7 @@ vm_kmem_free(unsigned long addr, size_t size)
end = addr + size;
for (va = addr; va < end; va += PAGE_SIZE) {
- pa = pmap_kextract(va);
+ pa = pmap_extract(kernel_pmap, va);
if (pa == 0)
continue;
diff --git a/vm/vm_map.c b/vm/vm_map.c
index 33c95183..16d440bb 100644
--- a/vm/vm_map.c
+++ b/vm/vm_map.c
@@ -227,7 +227,7 @@ vm_map_kentry_free(unsigned long va, size_t slab_size)
assert(slab_size == vm_map_kentry_slab_size);
for (i = 0; i < slab_size; i += PAGE_SIZE) {
- pa = pmap_kextract(va + i);
+ pa = pmap_extract(kernel_pmap, va + i);
assert(pa != 0);
page = vm_phys_lookup_page(pa);
assert(page != NULL);