mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
bitkeeper revision 1.308 (3f0ae161layZNlO8Hy90LYzFcZ9fkQ)
Final bit of merge.
This commit is contained in:
1 parent
793fddb7e9
commit
faf3ef710d
1 file changed
+3
-109
@@ -45,8 +45,9 @@ struct proc_dir_entry *xeno_base;
|
||||
static struct proc_dir_entry *dom0_cmd_intf;
|
||||
static struct proc_dir_entry *dom_list_intf;
|
||||
|
||||
int direct_unmap(unsigned long, unsigned long);
|
||||
int direct_unmap(struct mm_struct *, unsigned long, unsigned long);
|
||||
unsigned long direct_mmap(unsigned long phys_addr, unsigned long size,
|
||||
pgprot_t prot, int tot_pages);
|
||||
|
||||
static ssize_t dom_usage_read(struct file * file, char * buff, size_t size, loff_t * off)
|
||||
{
|
||||
@@ -145,113 +146,6 @@ static void create_proc_dom_entries(int dom)
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t dom_mem_write(struct file * file, const char * buff,
|
||||
size_t size , loff_t * off)
|
||||
{
|
||||
dom_mem_t mem_data;
|
||||
|
||||
printk("dom_mem_write called: Shouldn't happen.\n");
|
||||
|
||||
copy_from_user(&mem_data, (dom_mem_t *)buff, sizeof(dom_mem_t));
|
||||
|
||||
if ( direct_unmap(mem_data.vaddr,
|
||||
mem_data.tot_pages << PAGE_SHIFT) == 0 ) {
|
||||
return sizeof(sizeof(dom_mem_t));
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t dom_mem_read(struct file * file, char * buff, size_t size, loff_t * off)
|
||||
{
|
||||
unsigned long addr;
|
||||
pgprot_t prot;
|
||||
|
||||
proc_memdata_t * mem_data = (proc_memdata_t *)((struct proc_dir_entry *)file->f_dentry->d_inode->u.generic_ip)->data;
|
||||
|
||||
prot = PAGE_SHARED;
|
||||
|
||||
/* remap the range using xen specific routines */
|
||||
|
||||
printk("Calling direct_mmap with pfn %x, tot pages %x.\n",
|
||||
mem_data->pfn, mem_data->tot_pages);
|
||||
|
||||
addr = direct_mmap(mem_data->pfn << PAGE_SHIFT, mem_data->tot_pages << PAGE_SHIFT, prot, MAP_DISCONT, mem_data->tot_pages);
|
||||
|
||||
copy_to_user((unsigned long *)buff, &addr, sizeof(addr));
|
||||
|
||||
return sizeof(addr);
|
||||
}
|
||||
|
||||
struct file_operations dom_mem_ops = {
|
||||
read: dom_mem_read,
|
||||
write: dom_mem_write,
|
||||
};
|
||||
|
||||
static int dom_map_mem(unsigned int dom, unsigned long pfn, int tot_pages)
|
||||
{
|
||||
int ret = -ENOENT;
|
||||
struct proc_dir_entry * pd = xeno_base->subdir;
|
||||
struct proc_dir_entry * file;
|
||||
proc_memdata_t * memdata;
|
||||
|
||||
while(pd != NULL){
|
||||
|
||||
if((pd->mode & S_IFDIR) && ((dom_procdata_t *)pd->data)->domain == dom){
|
||||
|
||||
/* check if there is already an entry for mem and if so
|
||||
* remove it.
|
||||
*/
|
||||
/* XXX does this not leak the memdata? */
|
||||
remove_proc_entry("mem", pd);
|
||||
|
||||
/* create new entry with parameters describing what to do
|
||||
* when it is mmaped.
|
||||
*/
|
||||
file = create_proc_entry("mem", 0600, pd);
|
||||
if(file != NULL)
|
||||
{
|
||||
file->owner = THIS_MODULE;
|
||||
file->nlink = 1;
|
||||
file->proc_fops = &dom_mem_ops;
|
||||
|
||||
memdata = (proc_memdata_t *)kmalloc(sizeof(proc_memdata_t), GFP_KERNEL);
|
||||
memdata->pfn = pfn;
|
||||
memdata->tot_pages = tot_pages;
|
||||
file->data = memdata;
|
||||
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
ret = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
pd = pd->next;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* function used to retrieve data associated with new domain */
|
||||
static ssize_t dom_data_read(struct file * file, char * buff, size_t size, loff_t * off)
|
||||
{
|
||||
dom0_newdomain_t * dom_data = (dom0_newdomain_t *)
|
||||
((struct proc_dir_entry *)file->f_dentry->d_inode->u.generic_ip)->data;
|
||||
|
||||
copy_to_user((dom0_newdomain_t *)buff, dom_data, sizeof(dom0_newdomain_t));
|
||||
|
||||
remove_proc_entry("new_dom_data", xeno_base);
|
||||
|
||||
kfree(dom_data);
|
||||
|
||||
return sizeof(dom0_newdomain_t);
|
||||
}
|
||||
|
||||
struct file_operations newdom_data_fops = {
|
||||
read: dom_data_read,
|
||||
};
|
||||
|
||||
static int dom0_cmd_write(struct file *file, const char *buffer, size_t size,
|
||||
loff_t *off)
|
||||
{
|
||||
@@ -447,7 +341,7 @@ static int handle_dom0_cmd_unmapdommem(unsigned long data)
|
||||
return -EFAULT;
|
||||
|
||||
return direct_unmap(current->mm, argbuf.vaddr,
|
||||
argbuf.tot_pages << PAGE_SIZE);
|
||||
argbuf.tot_pages << PAGE_SHIFT);
|
||||
}
|
||||
|
||||
static int dom0_cmd_ioctl(struct inode *inode, struct file *file,
|
||||
|
||||