|
|
|
|
|
|
|
|
|
|
xen-devel
[Xen-devel] Re: how to transfer virtual address into pyhsical address
Yong LIU wrote:
I write a very simple module to test memory address translation.
When I install the module under xen 3.0, kernel panic. But when
I install it under xen3.0 & kernel 2.6.16-rc2, it can work well.
My question is: Is there a different way to translate virtual address
into physical address under Xen 3.0?
thanks for help.
dmesg information.
--------------------------------------------------------
hello: module license 'unspecified' taints kernel.
Unable to handle kernel paging request at virtual address 3e0c5b0c
printing eip:
f483c023
*pde = ma 00000000 pa 55555000
Oops: 0000 [#1]
SMP
Modules linked in: hello iptable_filter ip_tables video thermal
processor fan button battery ac
CPU: 1
EIP: 0061:[<f483c023>] Tainted: P VLI
EFLAGS: 00010206 (2.6.12.6-xen0-smp)
EIP is at kvirt_to_pa+0x23/0x3c [hello]
eax: 7e0c5000 ebx: f22c3000 ecx: 00000b0c edx: 000003c8
esi: f2026000 edi: c0000000 ebp: f2026000 esp: f2027f90
ds: 007b es: 007b ss: 0069
Process insmod (pid: 4710, threadinfo=f2026000 task=f27c4520)
Stack: f483e01a f22c3000 f483c380 c013a1f8 c05a10a8 00000001 f483c380
0804a060
b7fb3ff4 b7fb5538 c0109021 0804a060 00000dda 0804a050 b7fb3ff4
b7fb5538
bffd6558 00000080 0000007b c010007b 00000080 b7f5667e 00000073
00010246
Call Trace:
[<f483e01a>] hello_init_module+0x1a/0x2d [hello]
[<c013a1f8>] sys_init_module+0x145/0x1e1
[<c0109021>] syscall_call+0x7/0xb
Code: Bad EIP value.
-------------------------------------------------------
here is the code.
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <asm/pgtable.h>
#include <asm/page.h>
static void kvirt_to_pa(void *vaddr)
{
unsigned long addr=(unsigned long) vaddr;
unsigned long pte_value;
pgd_t *pgd=NULL;
pmd_t *pmd=NULL;
pte_t *pte=NULL;
pgd=pgd_offset_k(addr);
if(pgd_none(*pgd))
goto hello_failed;
pmd=pmd_offset(pgd, addr);
if(pmd_none(*pmd))
goto hello_failed;
pte=pte_offset_kernel(pmd, addr);
if(!pte_present(*pte))
goto hello_failed;
pte_value= pte_val(*pte) & PAGE_MASK | (addr & (PAGE_SIZE - 1));
return;
hello_failed:
printk(" failed\n");
return;
}
static int __init hello_init_module(void)
{
void * page=NULL;
page=__get_free_pages(GFP_KERNEL, 0);
kvirt_to_pa(page);
free_page(page);
return 1;
}
static void __exit hello_exit_module(void)
{
printk(" say bye\n");
return;
}
module_init(hello_init_module);
module_exit(hello_exit_module);
__alloc_pages() returns a pointer to a page struct, not the virtual
address of the allocated page. You can't use it directly like you do.
If you want the virtual address, either use page_address(page) or try
some get_*_page function directly instead of alloc_pages().
Regards,
Mathieu
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
|
|
|
|