* defined way to get at the kernel page tables.
*/
-static inline unsigned long uvirt_to_bus(unsigned long adr)
-{
- unsigned long kva, ret;
-
- kva = page_address(vmalloc_to_page(adr));
- ret = virt_to_bus((void *)kva);
- MDEBUG(printk("uv2b(%lx-->%lx)", adr, ret));
- return ret;
-}
-
static inline unsigned long kvirt_to_bus(unsigned long adr)
{
- unsigned long va, kva, ret;
+ unsigned long kva, ret;
- va = VMALLOC_VMADDR(adr);
- kva = page_address(vmalloc_to_page(va));
+ kva = page_address(vmalloc_to_page((void *)adr));
ret = virt_to_bus((void *)kva);
MDEBUG(printk("kv2b(%lx-->%lx)", adr, ret));
return ret;
*/
static inline unsigned long kvirt_to_pa(unsigned long adr)
{
- unsigned long va, kva, ret;
+ unsigned long kva, ret;
- va = VMALLOC_VMADDR(adr);
- kva = page_address(vmalloc_to_page(va));
+ kva = page_address(vmalloc_to_page((void *)adr));
ret = __pa(kva);
MDEBUG(printk("kv2pa(%lx-->%lx)", adr, ret));
return ret;
* defined way to get at the kernel page tables.
*/
-static inline unsigned long uvirt_to_bus(unsigned long adr)
-{
- unsigned long kva, ret;
- kva = page_address(vmalloc_to_page(adr));
- ret = virt_to_bus((void *)kva);
- MDEBUG(printk("uv2b(%lx-->%lx)", adr, ret));
- return ret;
+/*
+ * Take a vmalloc address, and turn it into
+ * the aliased kernel virtual address..
+ *
+ * CAREFUL! Anybody who does this gets to sit
+ * in their own cr*p when it comes to virtual
+ * cache aliases. It's _your_ problem.
+ *
+ * Also, note how it only works within one page.
+ * If you're doing page-crossing stuff, you're on
+ * your own.
+ *
+ * THIS IS BROKEN CODE! You shouldn't do things
+ * like this.
+ */
+static inline void *vmalloc_to_virt(void *addr)
+{
+ struct page *page = vmalloc_to_page(addr);
+ return page_address(page) + (~PAGE_MASK & (unsigned long)addr);
}
-static inline unsigned long kvirt_to_bus(unsigned long adr)
+static inline unsigned long kvirt_to_bus(unsigned long addr)
{
- unsigned long va, kva, ret;
-
- va = VMALLOC_VMADDR(adr);
- kva = page_address(vmalloc_to_page(va));
- ret = virt_to_bus((void *)kva);
- MDEBUG(printk("kv2b(%lx-->%lx)", adr, ret));
+ unsigned long ret;
+ ret = virt_to_bus(vmalloc_to_virt((void *)addr));
+ MDEBUG(printk("kv2b(%lx-->%lx)", addr, ret));
return ret;
}
* This is used when initializing the contents of the
* area and marking the pages as reserved.
*/
-static inline unsigned long kvirt_to_pa(unsigned long adr)
+static inline unsigned long kvirt_to_pa(unsigned long addr)
{
- unsigned long va, kva, ret;
-
- va = VMALLOC_VMADDR(adr);
- kva = page_address(vmalloc_to_page(va));
- ret = __pa(kva);
- MDEBUG(printk("kv2pa(%lx-->%lx)", adr, ret));
+ unsigned long ret;
+ ret = virt_to_phys(vmalloc_to_virt((void *)addr));
+ MDEBUG(printk("kv2pa(%lx-->%lx)", addr, ret));
return ret;
}
static void * rvmalloc(signed long size)
{
void * mem;
- unsigned long adr, page;
+ unsigned long adr;
mem=vmalloc_32(size);
if (NULL == mem)
adr=(unsigned long) mem;
while (size > 0)
{
- page = kvirt_to_pa(adr);
- mem_map_reserve(virt_to_page(__va(page)));
+ mem_map_reserve(vmalloc_to_page((void *)adr));
adr+=PAGE_SIZE;
size-=PAGE_SIZE;
}
static void rvfree(void * mem, signed long size)
{
- unsigned long adr, page;
+ unsigned long adr;
if (mem)
{
adr=(unsigned long) mem;
while (size > 0)
{
- page = kvirt_to_pa(adr);
- mem_map_unreserve(virt_to_page(__va(page)));
+ mem_map_unreserve(vmalloc_to_page((void *)adr));
adr+=PAGE_SIZE;
size-=PAGE_SIZE;
}
*/
static inline unsigned long kvirt_to_pa(unsigned long adr)
{
- unsigned long va, kva, ret;
+ unsigned long kva, ret;
- va = VMALLOC_VMADDR(adr);
- kva = page_address(vmalloc_to_page(va));
+ kva = page_address(vmalloc_to_page((void *)adr));
ret = __pa(kva);
return ret;
}
* area and marking the pages as reserved.
*/
static inline unsigned long kvirt_to_pa(unsigned long adr) {
- unsigned long va, kva, ret;
+ unsigned long kva, ret;
- va = VMALLOC_VMADDR(adr);
- kva = page_address(vmalloc_to_page(va));
+ kva = page_address(vmalloc_to_page((void *) adr));
ret = __pa(kva);
MDEBUG(printk("kv2pa(%lx-->%lx)\n", adr, ret));
return ret;
static inline unsigned long
kvirt_to_pa(unsigned long adr)
{
- unsigned long va, kva, ret;
+ unsigned long kva, ret;
- va = VMALLOC_VMADDR(adr);
- kva = page_address(vmalloc_to_page(va));
+ kva = page_address(vmalloc_to_page((void *)adr));
ret = __pa(kva);
return ret;
}
*/
static inline unsigned long kvirt_to_pa(unsigned long adr)
{
- unsigned long va, kva, ret;
+ unsigned long kva, ret;
- va = VMALLOC_VMADDR(adr);
- kva = page_address(vmalloc_to_page(va));
+ kva = page_address(vmalloc_to_page((void *)adr));
ret = __pa(kva);
return ret;
}
*/
static inline unsigned long kvirt_to_pa(unsigned long adr)
{
- unsigned long va, kva, ret;
+ unsigned long kva, ret;
- va = VMALLOC_VMADDR(adr);
- kva = page_address(vmalloc_to_page(va));
+ kva = page_address(vmalloc_to_page((void *)adr));
ret = __pa(kva);
return ret;
}
*/
unsigned long usbvideo_kvirt_to_pa(unsigned long adr)
{
- unsigned long va, kva, ret;
+ unsigned long kva, ret;
- va = VMALLOC_VMADDR(adr);
- kva = page_address(vmalloc_to_page(va));
+ kva = page_address(vmalloc_to_page((void *)adr));
ret = __pa(kva);
MDEBUG(printk("kv2pa(%lx-->%lx)", adr, ret));
return ret;
extern struct vm_area_struct *find_extend_vma(struct mm_struct *mm, unsigned long addr);
-extern struct page * vmalloc_to_page(unsigned long adr);
+extern struct page * vmalloc_to_page(void *addr);
#endif /* __KERNEL__ */
/*
* Map a vmalloc()-space virtual address to the physical page.
*/
-struct page * vmalloc_to_page(unsigned long addr)
+struct page * vmalloc_to_page(void * vmalloc_addr)
{
+ unsigned long addr = (unsigned long) vmalloc_addr;
struct page *page = NULL;
pgd_t *pgd = pgd_offset_k(addr);
pmd_t *pmd;