]> Zhao Yanbai Git Server - minix.git/commitdiff
VM implicitly aligns mappings to a page
authorTomas Hruby <tom@minix3.org>
Thu, 21 Oct 2010 17:07:05 +0000 (17:07 +0000)
committerTomas Hruby <tom@minix3.org>
Thu, 21 Oct 2010 17:07:05 +0000 (17:07 +0000)
- problem when a PCI BAR is not aligned

- together with  David v. Moolenboek

servers/vm/mmap.c

index d0996b2bfcdfdf2a0fae150132c404c186458874..47aec72980866f02591a8e2974c454ba77136769 100644 (file)
@@ -133,6 +133,7 @@ PUBLIC int do_map_phys(message *m)
        struct vir_region *vr;
        vir_bytes len;
        phys_bytes startaddr;
+       size_t offset;
 
        target = m->VMMP_EP;
        len = m->VMMP_LEN;
@@ -159,6 +160,10 @@ PUBLIC int do_map_phys(message *m)
        if(!(vmp->vm_flags & VMF_HASPT))
                return ENXIO;
 
+       offset = startaddr % VM_PAGE_SIZE;
+       len += offset;
+       startaddr -= offset;
+
        if(len % VM_PAGE_SIZE)
                len += VM_PAGE_SIZE - (len % VM_PAGE_SIZE);
 
@@ -168,7 +173,7 @@ PUBLIC int do_map_phys(message *m)
                return ENOMEM;
        }
 
-       m->VMMP_VADDR_REPLY = (void *) arch_map2vir(vmp, vr->vaddr);
+       m->VMMP_VADDR_REPLY = (void *) (arch_map2vir(vmp, vr->vaddr) + offset);
 
        return OK;
 }