diff options
| author | Jes Sorensen <jes@wildopensource.com> | 2005-03-13 00:16:33 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-03-13 00:16:33 -0800 |
| commit | afb7359a63fc8812064ff4bdbe7ea34325d8a361 (patch) | |
| tree | 5be39014fec16c5a60d4687b5dbcc83ede6bccd8 /include | |
| parent | 939034527a64b84ae4c727fce011d7a7d335b87b (diff) | |
[PATCH] ia64 specific /dev/mem handlers
Convert /dev/mem read/write calls to use arch_translate_mem_ptr if
available. Needed on ia64 for pages converted fo uncached mappings to
avoid it being accessed in cached mode after the conversion which can lead
to memory corruption. Introduces PG_uncached page flag for marking pages
uncached.
Also folds do_write_mem into write_mem as it was it's only user.
Use __ARCH_HAS_NO_PAGE_ZERO_MAPPED for architectures to indicate they
require magic handling of the zero page (Sparc and m68k).
Signed-off-by: Jes Sorensen <jes@wildopensource.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include')
| -rw-r--r-- | include/asm-alpha/io.h | 11 | ||||
| -rw-r--r-- | include/asm-arm/io.h | 11 | ||||
| -rw-r--r-- | include/asm-arm26/io.h | 11 | ||||
| -rw-r--r-- | include/asm-cris/io.h | 11 | ||||
| -rw-r--r-- | include/asm-frv/io.h | 12 | ||||
| -rw-r--r-- | include/asm-h8300/io.h | 11 | ||||
| -rw-r--r-- | include/asm-i386/io.h | 11 | ||||
| -rw-r--r-- | include/asm-ia64/uaccess.h | 36 | ||||
| -rw-r--r-- | include/asm-m32r/io.h | 11 | ||||
| -rw-r--r-- | include/asm-m68k/io.h | 14 | ||||
| -rw-r--r-- | include/asm-m68knommu/io.h | 11 | ||||
| -rw-r--r-- | include/asm-mips/io.h | 11 | ||||
| -rw-r--r-- | include/asm-parisc/io.h | 11 | ||||
| -rw-r--r-- | include/asm-ppc/io.h | 11 | ||||
| -rw-r--r-- | include/asm-ppc64/io.h | 11 | ||||
| -rw-r--r-- | include/asm-s390/io.h | 11 | ||||
| -rw-r--r-- | include/asm-sparc/io.h | 13 | ||||
| -rw-r--r-- | include/asm-sparc64/io.h | 11 | ||||
| -rw-r--r-- | include/asm-um/io.h | 11 | ||||
| -rw-r--r-- | include/asm-v850/io.h | 11 | ||||
| -rw-r--r-- | include/asm-x86_64/io.h | 11 | ||||
| -rw-r--r-- | include/linux/page-flags.h | 6 |
22 files changed, 267 insertions, 1 deletions
diff --git a/include/asm-alpha/io.h b/include/asm-alpha/io.h index 68907d940af1..871dd7ad909d 100644 --- a/include/asm-alpha/io.h +++ b/include/asm-alpha/io.h @@ -666,6 +666,17 @@ isa_memcpy_toio(unsigned long offset, const void *src, long n) #define writeq writeq #define readq readq +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* __KERNEL__ */ #endif /* __ALPHA_IO_H */ diff --git a/include/asm-arm/io.h b/include/asm-arm/io.h index 4fdff0484a32..69bc7a3e8160 100644 --- a/include/asm-arm/io.h +++ b/include/asm-arm/io.h @@ -271,5 +271,16 @@ extern void __iounmap(void __iomem *addr); #define BIOVEC_MERGEABLE(vec1, vec2) \ ((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2))) +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* __KERNEL__ */ #endif /* __ASM_ARM_IO_H */ diff --git a/include/asm-arm26/io.h b/include/asm-arm26/io.h index bc20793f9f4f..02f94d88a124 100644 --- a/include/asm-arm26/io.h +++ b/include/asm-arm26/io.h @@ -420,5 +420,16 @@ extern void consistent_sync(void *vaddr, size_t size, int rw); #define BIOVEC_MERGEABLE(vec1, vec2) \ ((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2))) +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* __KERNEL__ */ #endif /* __ASM_ARM_IO_H */ diff --git a/include/asm-cris/io.h b/include/asm-cris/io.h index b7222312be27..1d2b51701e8d 100644 --- a/include/asm-cris/io.h +++ b/include/asm-cris/io.h @@ -86,4 +86,15 @@ extern void iounmap(void *addr); #define outsw(x,y,z) #define outsl(x,y,z) +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif diff --git a/include/asm-frv/io.h b/include/asm-frv/io.h index e5812fbd35aa..48829f727242 100644 --- a/include/asm-frv/io.h +++ b/include/asm-frv/io.h @@ -273,6 +273,18 @@ static inline void flush_write_buffers(void) __asm__ __volatile__ ("membar" : : :"memory"); } + +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* __KERNEL__ */ #endif /* _ASM_IO_H */ diff --git a/include/asm-h8300/io.h b/include/asm-h8300/io.h index 57574c8aefa4..1773e373e9c6 100644 --- a/include/asm-h8300/io.h +++ b/include/asm-h8300/io.h @@ -317,6 +317,17 @@ static __inline__ void ctrl_outl(unsigned long b, unsigned long addr) #define virt_to_bus virt_to_phys #define bus_to_virt phys_to_virt +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* __KERNEL__ */ #endif /* _H8300_IO_H */ diff --git a/include/asm-i386/io.h b/include/asm-i386/io.h index 479e976ed86c..7babb97a02eb 100644 --- a/include/asm-i386/io.h +++ b/include/asm-i386/io.h @@ -49,6 +49,17 @@ #include <linux/vmalloc.h> +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + /** * virt_to_phys - map virtual addresses to physical * @address: address to remap diff --git a/include/asm-ia64/uaccess.h b/include/asm-ia64/uaccess.h index 1ffc804e0f16..d8563cd3adf4 100644 --- a/include/asm-ia64/uaccess.h +++ b/include/asm-ia64/uaccess.h @@ -35,6 +35,8 @@ #include <linux/compiler.h> #include <linux/errno.h> #include <linux/sched.h> +#include <linux/page-flags.h> +#include <linux/mm.h> #include <asm/intrinsics.h> #include <asm/pgtable.h> @@ -367,4 +369,38 @@ ia64_done_with_exception (struct pt_regs *regs) return 0; } +#define ARCH_HAS_TRANSLATE_MEM_PTR 1 +static __inline__ char * +xlate_dev_mem_ptr (unsigned long p) +{ + struct page *page; + char * ptr; + + page = pfn_to_page(p >> PAGE_SHIFT); + if (PageUncached(page)) + ptr = (char *)p + __IA64_UNCACHED_OFFSET; + else + ptr = __va(p); + + return ptr; +} + +/* + * Convert a virtual cached kernel memory pointer to an uncached pointer + */ +static __inline__ char * +xlate_dev_kmem_ptr (char * p) +{ + struct page *page; + char * ptr; + + page = virt_to_page((unsigned long)p >> PAGE_SHIFT); + if (PageUncached(page)) + ptr = (char *)__pa(p) + __IA64_UNCACHED_OFFSET; + else + ptr = p; + + return ptr; +} + #endif /* _ASM_IA64_UACCESS_H */ diff --git a/include/asm-m32r/io.h b/include/asm-m32r/io.h index a5d3abee0ef4..8e9e481e6996 100644 --- a/include/asm-m32r/io.h +++ b/include/asm-m32r/io.h @@ -216,6 +216,17 @@ memcpy_toio(volatile void __iomem *dst, const void *src, int count) memcpy((void __force *) dst, src, count); } +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* __KERNEL__ */ #endif /* _ASM_M32R_IO_H */ diff --git a/include/asm-m68k/io.h b/include/asm-m68k/io.h index c963b138a142..6bb8b0d8f99d 100644 --- a/include/asm-m68k/io.h +++ b/include/asm-m68k/io.h @@ -359,4 +359,18 @@ extern void dma_cache_inv(unsigned long start, unsigned long size); #endif #endif /* __KERNEL__ */ + +#define __ARCH_HAS_NO_PAGE_ZERO_MAPPED 1 + +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* _IO_H */ diff --git a/include/asm-m68knommu/io.h b/include/asm-m68knommu/io.h index e14f03e3ac1e..30fade4149b8 100644 --- a/include/asm-m68knommu/io.h +++ b/include/asm-m68knommu/io.h @@ -187,6 +187,17 @@ extern void iounmap(void *addr); #define virt_to_bus virt_to_phys #define bus_to_virt phys_to_virt +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* __KERNEL__ */ #endif /* _M68KNOMMU_IO_H */ diff --git a/include/asm-mips/io.h b/include/asm-mips/io.h index 8e5ac32ae857..039845f2e6b0 100644 --- a/include/asm-mips/io.h +++ b/include/asm-mips/io.h @@ -616,4 +616,15 @@ extern void (*_dma_cache_inv)(unsigned long start, unsigned long size); #define csr_out32(v,a) (*(volatile u32 *)((unsigned long)(a) + __CSR_32_ADJUST) = (v)) #define csr_in32(a) (*(volatile u32 *)((unsigned long)(a) + __CSR_32_ADJUST)) +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* _ASM_IO_H */ diff --git a/include/asm-parisc/io.h b/include/asm-parisc/io.h index c137a955c5ef..b9bb5946ecc9 100644 --- a/include/asm-parisc/io.h +++ b/include/asm-parisc/io.h @@ -404,4 +404,15 @@ extern void outsl (unsigned long port, const void *src, unsigned long count); #include <asm-generic/iomap.h> +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif diff --git a/include/asm-ppc/io.h b/include/asm-ppc/io.h index e0c38f4b90f0..7eb7cf6360bd 100644 --- a/include/asm-ppc/io.h +++ b/include/asm-ppc/io.h @@ -552,4 +552,15 @@ extern void pci_iounmap(struct pci_dev *dev, void __iomem *); #include <asm/mpc8260_pci9.h> #endif +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* __KERNEL__ */ diff --git a/include/asm-ppc64/io.h b/include/asm-ppc64/io.h index 7a1194f606be..aba1dfa388ba 100644 --- a/include/asm-ppc64/io.h +++ b/include/asm-ppc64/io.h @@ -442,6 +442,17 @@ out: extern int check_legacy_ioport(unsigned long base_port); +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* __KERNEL__ */ #endif /* _PPC64_IO_H */ diff --git a/include/asm-s390/io.h b/include/asm-s390/io.h index 60342a587a3c..8188fdc9884f 100644 --- a/include/asm-s390/io.h +++ b/include/asm-s390/io.h @@ -107,6 +107,17 @@ extern void iounmap(void *addr); #define mmiowb() +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* __KERNEL__ */ #endif diff --git a/include/asm-sparc/io.h b/include/asm-sparc/io.h index f98570f54b53..a42df208d590 100644 --- a/include/asm-sparc/io.h +++ b/include/asm-sparc/io.h @@ -274,4 +274,17 @@ extern void sbus_iounmap(volatile void __iomem *vaddr, unsigned long size); #endif +#define __ARCH_HAS_NO_PAGE_ZERO_MAPPED 1 + +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* !(__SPARC_IO_H) */ diff --git a/include/asm-sparc64/io.h b/include/asm-sparc64/io.h index 6661a23b6883..afdcea90707a 100644 --- a/include/asm-sparc64/io.h +++ b/include/asm-sparc64/io.h @@ -485,6 +485,17 @@ extern void pci_iounmap(struct pci_dev *dev, void __iomem *); #define dma_cache_wback(_start,_size) do { } while (0) #define dma_cache_wback_inv(_start,_size) do { } while (0) +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif #endif /* !(__SPARC64_IO_H) */ diff --git a/include/asm-um/io.h b/include/asm-um/io.h index 62d6f2423ea6..90674056dcef 100644 --- a/include/asm-um/io.h +++ b/include/asm-um/io.h @@ -22,4 +22,15 @@ static inline void * phys_to_virt(unsigned long address) return __va(address); } +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif diff --git a/include/asm-v850/io.h b/include/asm-v850/io.h index ad9d60703b6f..bb5efd1b4b7d 100644 --- a/include/asm-v850/io.h +++ b/include/asm-v850/io.h @@ -119,4 +119,15 @@ outsl (unsigned long port, const void *src, unsigned long count) #define memcpy_fromio(dst, src, len) memcpy (dst, (void *)src, len) #define memcpy_toio(dst, src, len) memcpy ((void *)dst, src, len) +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* __V850_IO_H__ */ diff --git a/include/asm-x86_64/io.h b/include/asm-x86_64/io.h index 734db492e889..cc2bdb5da086 100644 --- a/include/asm-x86_64/io.h +++ b/include/asm-x86_64/io.h @@ -329,6 +329,17 @@ out: extern int iommu_bio_merge; #define BIO_VMERGE_BOUNDARY iommu_bio_merge +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + #endif /* __KERNEL__ */ #endif diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 6ab9cc46640f..f257c4c0d706 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -75,7 +75,7 @@ #define PG_mappedtodisk 17 /* Has blocks allocated on-disk */ #define PG_reclaim 18 /* To be reclaimed asap */ #define PG_nosave_free 19 /* Free, should not be written */ - +#define PG_uncached 20 /* Page has been mapped as uncached */ /* * Global page accounting. One instance per CPU. Only unsigned longs are @@ -301,6 +301,10 @@ extern void __mod_page_state(unsigned offset, unsigned long delta); #define PageSwapCache(page) 0 #endif +#define PageUncached(page) test_bit(PG_uncached, &(page)->flags) +#define SetPageUncached(page) set_bit(PG_uncached, &(page)->flags) +#define ClearPageUncached(page) clear_bit(PG_uncached, &(page)->flags) + struct page; /* forward declaration */ int test_clear_page_dirty(struct page *page); |
