summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjdike <jdike>2004-04-07 20:45:47 +0000
committerjdike <jdike>2004-04-07 20:45:47 +0000
commit98ec7b5936dd520887dadda29b5974aca4253a27 (patch)
tree5e8372c5c7e46ca3a078bba154e76fb281bb4715
parentbee6e6cdbde5d895b2bdf5de9ac941a9d74afeef (diff)
downloaduml-history-98ec7b5936dd520887dadda29b5974aca4253a27.tar.gz
Added some debugging.
Gracefully handle the case where a map request happens for a page that's already correctly mapped.
-rw-r--r--arch/um/kernel/physmem.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/arch/um/kernel/physmem.c b/arch/um/kernel/physmem.c
index 5509c58..04badf5 100644
--- a/arch/um/kernel/physmem.c
+++ b/arch/um/kernel/physmem.c
@@ -100,14 +100,19 @@ int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w)
unsigned long phys;
int err;
+ phys = __pa(virt);
+ desc = find_virtmem_hash(&virtmem_hash, (void *) virt);
+ if(desc != NULL){
+ if((virt != desc->virt) || (fd != desc->fd) ||
+ (offset != desc->offset))
+ panic("Address 0x%p is already substituted\n", virt);
+ return(0);
+ }
+
fd_maps = descriptor_mapping(fd);
if(fd_maps == NULL)
return(-ENOMEM);
- phys = __pa(virt);
- if(find_virtmem_hash(&virtmem_hash, virt) != NULL)
- panic("Address 0x%p is already substituted\n", virt);
-
err = -ENOMEM;
desc = kmalloc(sizeof(*desc), GFP_ATOMIC);
if(desc == NULL)
@@ -178,6 +183,9 @@ void physmem_forget_descriptor(int fd)
if(desc == NULL)
return;
+ if(!list_empty(&desc->pages))
+ printk("Still have mapped pages on fd %d\n", fd);
+
list_for_each_safe(ele, next, &desc->pages){
page = list_entry(ele, struct phys_desc, list);
offset = page->offset;
@@ -210,9 +218,16 @@ void arch_free_page(struct page *page, int order)
}
}
-int is_remapped(void *virt)
+int is_remapped(const void *virt, int fd, __u64 offset)
{
- return(find_virtmem_hash(&virtmem_hash, virt) != NULL);
+ struct phys_desc *desc;
+
+ desc = find_virtmem_hash(&virtmem_hash, (void *) virt);
+ if(desc == NULL)
+ return(0);
+ if(offset != desc->offset)
+ printk("offset mismatch\n");
+ return(find_virtmem_hash(&virtmem_hash, (void *) virt) != NULL);
}
/* Changed during early boot */