-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 154396 b: refs/heads/master c: 850f6ac h: refs/heads/master v: v3
- Loading branch information
Benjamin Herrenschmidt
committed
Jun 26, 2009
1 parent
b7e439d
commit ff86310
Showing
4 changed files
with
83 additions
and
54 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 85355bb272db31a3f2dd99d547eef794805e1319 | ||
refs/heads/master: 850f6ac316cf84bba63fdb775c897834eccbfaa3 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
/* | ||
* highmem.c: virtual kernel memory mappings for high memory | ||
* | ||
* PowerPC version, stolen from the i386 version. | ||
* | ||
* Used in CONFIG_HIGHMEM systems for memory pages which | ||
* are not addressable by direct kernel virtual addresses. | ||
* | ||
* Copyright (C) 1999 Gerhard Wichert, Siemens AG | ||
* Gerhard.Wichert@pdb.siemens.de | ||
* | ||
* | ||
* Redesigned the x86 32-bit VM architecture to deal with | ||
* up to 16 Terrabyte physical memory. With current x86 CPUs | ||
* we now support up to 64 Gigabytes physical RAM. | ||
* | ||
* Copyright (C) 1999 Ingo Molnar <mingo@redhat.com> | ||
* | ||
* Reworked for PowerPC by various contributors. Moved from | ||
* highmem.h by Benjamin Herrenschmidt (c) 2009 IBM Corp. | ||
*/ | ||
|
||
#include <linux/highmem.h> | ||
#include <linux/module.h> | ||
|
||
/* | ||
* The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap | ||
* gives a more generic (and caching) interface. But kmap_atomic can | ||
* be used in IRQ contexts, so in some (very limited) cases we need | ||
* it. | ||
*/ | ||
void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot) | ||
{ | ||
unsigned int idx; | ||
unsigned long vaddr; | ||
|
||
/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ | ||
pagefault_disable(); | ||
if (!PageHighMem(page)) | ||
return page_address(page); | ||
|
||
debug_kmap_atomic(type); | ||
idx = type + KM_TYPE_NR*smp_processor_id(); | ||
vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); | ||
#ifdef CONFIG_DEBUG_HIGHMEM | ||
BUG_ON(!pte_none(*(kmap_pte-idx))); | ||
#endif | ||
__set_pte_at(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot), 1); | ||
local_flush_tlb_page(NULL, vaddr); | ||
|
||
return (void*) vaddr; | ||
} | ||
EXPORT_SYMBOL(kmap_atomic_prot); | ||
|
||
void kunmap_atomic(void *kvaddr, enum km_type type) | ||
{ | ||
#ifdef CONFIG_DEBUG_HIGHMEM | ||
unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; | ||
enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id(); | ||
|
||
if (vaddr < __fix_to_virt(FIX_KMAP_END)) { | ||
pagefault_enable(); | ||
return; | ||
} | ||
|
||
BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); | ||
|
||
/* | ||
* force other mappings to Oops if they'll try to access | ||
* this pte without first remap it | ||
*/ | ||
pte_clear(&init_mm, vaddr, kmap_pte-idx); | ||
local_flush_tlb_page(NULL, vaddr); | ||
#endif | ||
pagefault_enable(); | ||
} | ||
EXPORT_SYMBOL(kunmap_atomic); |