亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pcidev.c

?? PDA上的X86模擬器
?? C
字號:
/* *  PCIDEV: PCI host device mapping *  Copyright (C) 2003 Frank Cornelis <fcorneli@pandora.be> * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License version 2 as  *  published by the Free Software Foundation. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *//* * Create the PCIDEV using: * mknod /dev/pcidev c 240 0 */#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/mm.h>#include <linux/slab.h>#include <asm/uaccess.h>#include <linux/pci.h>#include <linux/interrupt.h>#include <linux/version.h>#include "kernel_pcidev.h"MODULE_LICENSE("GPL");MODULE_AUTHOR("Frank Cornelis <fcorneli@pandora.be>");MODULE_DESCRIPTION("PCI Host Device Mapper Driver");MODULE_SUPPORTED_DEVICE("pcidev");//EXPORT_NO_SYMBOLS;static char *pcidev_name = PCIDEV_NAME;static int pcidev_open(struct inode *inode, struct file *file){	struct pcidev_struct *pcidev = kmalloc(sizeof(struct pcidev_struct), GFP_KERNEL);	pcidev->dev = NULL;	pcidev->pid = 0;	init_timer(&pcidev->irq_timer);	pcidev->irq_timer.function = NULL; // no test irq signaling 	file->private_data = pcidev;	return 0;}static int pcidev_release(struct inode *inode, struct file *file){	struct pcidev_struct *pcidev = (struct pcidev_struct *)file->private_data;	int idx;	if (!pcidev->dev)		return 0;	if (pcidev->irq_timer.function)		del_timer_sync(&pcidev->irq_timer);	if (pcidev->pid) {		u8 irq;	     	pci_read_config_byte(pcidev->dev, PCI_INTERRUPT_PIN, &irq);	     	pci_read_config_byte(pcidev->dev, PCI_INTERRUPT_LINE, &irq);		free_irq(irq, (void *)pcidev->pid);	}	for (idx = 0; idx < PCIDEV_COUNT_RESOURCES; idx++)		if (pcidev->mapped_mem[idx])			iounmap(pcidev->mapped_mem[idx]);	pci_release_regions(pcidev->dev);	kfree(file->private_data);	return 0;}#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0))// linux kernel 2.4typedef void irqreturn_t; #define IRQ_NONE#endifstatic irqreturn_t pcidev_irqhandler(int irq, void *dev_id, struct pt_regs *regs){	int pid = (int)dev_id;	struct task_struct *task;	read_lock(&tasklist_lock);	task = find_task_by_pid(pid);	if (task)		send_sig_info(SIGUSR1, (struct siginfo *)1, task); // XXX: should be converted to real-time signals 	read_unlock(&tasklist_lock);	return IRQ_NONE; 	/* 	 * we cannot possible say IRQ_HANDLED because we simply 	 * don't know yet... only bochs could tell	 */}static void irq_test_timer(unsigned long data){	struct task_struct *task;	struct pcidev_struct *pcidev = (struct pcidev_struct *)data;	read_lock(&tasklist_lock);	task = find_task_by_pid(pcidev->pid);	if (task)		send_sig_info(SIGUSR1, (struct siginfo *)1, task);	read_unlock(&tasklist_lock);		//printk(KERN_INFO "irq_test_timer\n");	init_timer(&pcidev->irq_timer);	pcidev->irq_timer.data = data;	pcidev->irq_timer.function = irq_test_timer;	pcidev->irq_timer.expires = jiffies + HZ;	add_timer(&pcidev->irq_timer);}static int pcidev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){	int ret = 0;	struct pcidev_struct *pcidev = (struct pcidev_struct *)file->private_data;	switch(cmd) {	case PCIDEV_IOCTL_FIND: {		struct pcidev_find_struct *find;		struct pci_dev *dev;		unsigned long vendorID, deviceID;		int idx;		if (pcidev->dev)			return -EIO; // only alloc once for now		if (!access_ok(VERIFY_WRITE, (void *)arg, sizeof(struct pcidev_find_struct)))			return -EFAULT;		find = (struct pcidev_find_struct *)arg;		__get_user(vendorID, &find->vendorID);		__get_user(deviceID, &find->deviceID);		__put_user(-1, &find->bus);		__put_user(-1, &find->device);		__put_user(-1, &find->func);		dev = pci_find_device(vendorID, deviceID, NULL);		if (!dev)			return -ENOENT;		if (pci_enable_device(dev)) {			printk(KERN_WARNING "pcidev: Could not enable the PCI device.\n");			return -EIO;		}		if (pci_set_dma_mask(dev, 0xffffffff))			printk(KERN_WARNING "pcidev: only limited PCI busmaster DMA support.\n");		pci_set_master(dev);		printk(KERN_INFO "pcidev: device found at %x:%x.%d\n", 				dev->bus->number, PCI_SLOT(dev->devfn), 				PCI_FUNC(dev->devfn));		ret = pci_request_regions(dev, pcidev_name);		if (ret < 0)			break;		for (idx = 0; idx < PCIDEV_COUNT_RESOURCES; idx++) {			if (pci_resource_flags(dev, idx) & IORESOURCE_MEM) {				long len = pci_resource_len(dev,idx);				unsigned long mapped_start = (unsigned long)ioremap(pci_resource_start(dev, idx), len);				__put_user(mapped_start, &find->resources[idx].start);				__put_user(mapped_start + len - 1, &find->resources[idx].end);				pcidev->mapped_mem[idx] = (void *)mapped_start;			}			else {				pcidev->mapped_mem[idx] = NULL;				__put_user(pci_resource_start(dev, idx), &find->resources[idx].start);				__put_user(pci_resource_end(dev, idx), &find->resources[idx].end);			}			__put_user(pci_resource_flags(dev, idx), &find->resources[idx].flags);		}		pcidev->dev = dev;		__put_user(dev->bus->number, &find->bus);		__put_user(PCI_SLOT(dev->devfn), &find->device);		__put_user(PCI_FUNC(dev->devfn), &find->func);		ret = 0;		break;	}	case PCIDEV_IOCTL_READ_CONFIG_BYTE: 	case PCIDEV_IOCTL_READ_CONFIG_WORD: 	case PCIDEV_IOCTL_READ_CONFIG_DWORD: {		struct pcidev_io_struct *io;		unsigned long address, value;		if (!pcidev->dev)			return -EIO;		if (!access_ok(VERIFY_WRITE, (void *)arg, sizeof(struct pcidev_io_struct)))			return -EFAULT;		io = (struct pcidev_io_struct *)arg;		__get_user(address, &io->address);		__put_user(-1, &io->value);		printk(KERN_DEBUG "pcidev: reading config address %#x\n", (int)address);		switch(cmd) {		case PCIDEV_IOCTL_READ_CONFIG_BYTE:			ret = pci_read_config_byte(pcidev->dev, address, (u8 *)&value);			break;		case PCIDEV_IOCTL_READ_CONFIG_WORD:			ret = pci_read_config_word(pcidev->dev, address, (u16 *)&value);			break;		case PCIDEV_IOCTL_READ_CONFIG_DWORD:			ret = pci_read_config_dword(pcidev->dev, address, (u32 *)&value);			break;		}		if (ret < 0)			return ret;		__put_user(value, &io->value);		break;	}	case PCIDEV_IOCTL_WRITE_CONFIG_BYTE: 	case PCIDEV_IOCTL_WRITE_CONFIG_WORD: 	case PCIDEV_IOCTL_WRITE_CONFIG_DWORD: {		struct pcidev_io_struct *io;		unsigned long address, value;		if (!pcidev->dev)			return -EIO;		if (!access_ok(VERIFY_READ, (void *)arg, sizeof(struct pcidev_io_struct)))			return -EFAULT;		io = (struct pcidev_io_struct *)arg;		__get_user(address, &io->address);		__get_user(value, &io->value);		/*		 * Next tests prevent the pcidev user from remapping		 * the PCI host device since this could cause great 		 * trouble because we don't own those I/O resources.		 * If the pcidev wants to remap a device he needs to		 * emulate the mapping himself and not bother us about it.		 */		if (address == PCI_INTERRUPT_PIN) {			printk(KERN_WARNING "pcidev: not allowed to set irq pin!\n");			return -EIO;		}		if (address == PCI_INTERRUPT_LINE) {			printk(KERN_WARNING "pcidev: not allowed to set irq line!\n");			return -EIO;		}		if (PCI_BASE_ADDRESS_0 <= address && (address & ~3UL) <= PCI_BASE_ADDRESS_5) {			printk(KERN_WARNING "pcidev: now allowed to change base address %d\n", 					(int)((address & ~3UL) - PCI_BASE_ADDRESS_0) / 4);			return -EIO;		}		printk(KERN_DEBUG "pcidev: writing config address %#x\n", (int)address);		switch(cmd) {		case PCIDEV_IOCTL_WRITE_CONFIG_BYTE:			ret = pci_write_config_byte(pcidev->dev, address, (u8)value);			break;		case PCIDEV_IOCTL_WRITE_CONFIG_WORD:			ret = pci_write_config_word(pcidev->dev, address, (u16)value);			break;		case PCIDEV_IOCTL_WRITE_CONFIG_DWORD:			ret = pci_write_config_dword(pcidev->dev, address, (u32)value);			break;		}		break;	}	case PCIDEV_IOCTL_INTERRUPT: {		u8 irq;		if (!pcidev->dev)			return -EIO;	     	ret = pci_read_config_byte(pcidev->dev, PCI_INTERRUPT_PIN, &irq);	     	if (ret < 0)			break;	     	ret = -EIO;	     	if (!irq)		     	break;	     	ret = pci_read_config_byte(pcidev->dev, PCI_INTERRUPT_LINE, &irq);	     	if (ret < 0)	     		break;		if (arg & 1) {			pcidev->pid = current->pid; // our dev_id			printk(KERN_INFO "pcidev: enabling IRQ %d\n", irq);			ret = request_irq(irq, pcidev_irqhandler, SA_SHIRQ, 					pcidev_name, (void *)current->pid);		}		else {			ret = -EIO;			if (!pcidev->pid)				break;			printk(KERN_INFO "pcidev: disabling IRQ %d\n", irq);			free_irq(irq, (void *)pcidev->pid);			pcidev->pid = 0;			ret = 0;		}		break;	}	/*	 * Next ioctl is only for testing purposes.	 */	case PCIDEV_IOCTL_INTERRUPT_TEST: {		ret = -EIO;		if (!pcidev->dev)			break;		if (!pcidev->pid)			break;		if (pcidev->irq_timer.function)			del_timer_sync(&pcidev->irq_timer);		pcidev->irq_timer.function = NULL;		if (arg & 1) {			init_timer(&pcidev->irq_timer);			pcidev->irq_timer.function = irq_test_timer;			pcidev->irq_timer.data = (unsigned long)pcidev;			pcidev->irq_timer.expires = jiffies + HZ;			add_timer(&pcidev->irq_timer);		}		ret = 0;		break;	}	case PCIDEV_IOCTL_READ_IO_BYTE: 	case PCIDEV_IOCTL_READ_IO_WORD: 	case PCIDEV_IOCTL_READ_IO_DWORD: {		/*		 * We should probably check access rights against		 * the PCI resource list... but who cares for a 		 * security hole more or less :)		 */		struct pcidev_io_struct *io;		unsigned long address, value = -1;		if (!access_ok(VERIFY_WRITE, (void *)arg, sizeof(struct pcidev_io_struct)))			return -EFAULT;		io = (struct pcidev_io_struct *)arg;		__get_user(address, &io->address);		printk(KERN_DEBUG "pcidev: reading I/O port %#x\n", (int)address);		switch(cmd) {		case PCIDEV_IOCTL_READ_IO_BYTE:			value = inb(address);			break;		case PCIDEV_IOCTL_READ_IO_WORD:			value = inw(address);			break;		case PCIDEV_IOCTL_READ_IO_DWORD:			value = inl(address);			break;		}		__put_user(value, &io->value);		ret = 0;		break;	}	case PCIDEV_IOCTL_WRITE_IO_BYTE: 	case PCIDEV_IOCTL_WRITE_IO_WORD: 	case PCIDEV_IOCTL_WRITE_IO_DWORD: {		struct pcidev_io_struct *io;		unsigned long address, value;		if (!access_ok(VERIFY_READ, (void *)arg, sizeof(struct pcidev_io_struct)))			return -EFAULT;		io = (struct pcidev_io_struct *)arg;		__get_user(address, &io->address);		__get_user(value, &io->value);		printk(KERN_DEBUG "pcidev: writing I/O port %#x\n", (int)address);		switch(cmd) {		case PCIDEV_IOCTL_WRITE_IO_BYTE:			outb(value, address);			break;		case PCIDEV_IOCTL_WRITE_IO_WORD:			outw(value, address);			break;		case PCIDEV_IOCTL_WRITE_IO_DWORD:			outl(value, address);			break;		}		ret = 0;		break;	}	case PCIDEV_IOCTL_READ_MEM_BYTE: 	case PCIDEV_IOCTL_READ_MEM_WORD: 	case PCIDEV_IOCTL_READ_MEM_DWORD: {		struct pcidev_io_struct *io;		unsigned long address, value = -1;		if (!access_ok(VERIFY_WRITE, (void *)arg, sizeof(struct pcidev_io_struct)))			return -EFAULT;		io = (struct pcidev_io_struct *)arg;		__get_user(address, &io->address);		printk(KERN_DEBUG "pcidev: reading memory %#x\n", (int)address);		switch(cmd) {		case PCIDEV_IOCTL_READ_MEM_BYTE:			value = readb(address);			break;		case PCIDEV_IOCTL_READ_MEM_WORD:			value = readw(address);			break;		case PCIDEV_IOCTL_READ_MEM_DWORD:			value = readl(address);			break;		}		__put_user(value, &io->value);		ret = 0;		break;	}	case PCIDEV_IOCTL_WRITE_MEM_BYTE: 	case PCIDEV_IOCTL_WRITE_MEM_WORD: 	case PCIDEV_IOCTL_WRITE_MEM_DWORD: {		struct pcidev_io_struct *io;		unsigned long address, value;		if (!access_ok(VERIFY_READ, (void *)arg, sizeof(struct pcidev_io_struct)))			return -EFAULT;		io = (struct pcidev_io_struct *)arg;		__get_user(address, &io->address);		__get_user(value, &io->value);		printk(KERN_DEBUG "pcidev: writing memory %#x\n", (int)address);		switch(cmd) {		case PCIDEV_IOCTL_WRITE_MEM_BYTE:			writeb(value, address);			break;		case PCIDEV_IOCTL_WRITE_MEM_WORD:			writew(value, address);			break;		case PCIDEV_IOCTL_WRITE_MEM_DWORD:			writel(value, address);			break;		}		ret = 0;		break;	}	case PCIDEV_IOCTL_PROBE_CONFIG_DWORD: {		/*		 * This ioctl allows for probing a config space value.		 * This can be used for base address size probing		 */		struct pcidev_io_struct *io;		unsigned long address, value, orig_value;		if (!pcidev->dev)			return -EIO;		if (!access_ok(VERIFY_WRITE, (void *)arg, sizeof(struct pcidev_io_struct)))			return -EFAULT;		io = (struct pcidev_io_struct *)arg;		__get_user(address, &io->address);		__get_user(value, &io->value);		__put_user(-1, &io->value);		printk(KERN_INFO "pcidev: probing config space address: %#x\n", (int)address);		ret = pci_read_config_dword(pcidev->dev, address, (u32 *)&orig_value);		if (ret < 0)			break;		pci_write_config_dword(pcidev->dev, address, (u32)value);		pci_read_config_dword(pcidev->dev, address, (u32 *)&value);		ret = pci_write_config_dword(pcidev->dev, address, (u32)orig_value);		if (ret < 0)			break;		__put_user(value, &io->value);		break;	}	default:		ret = -ENOTTY;	}	return ret;}static struct file_operations pcidev_fops = {	open: pcidev_open,	release: pcidev_release,	ioctl: pcidev_ioctl,	owner: THIS_MODULE};int __init init_module(void){	int result;	printk(KERN_INFO "pcidev init\n");	if ((result = register_chrdev(PCIDEV_MAJOR, pcidev_name, &pcidev_fops)) < 0) {		printk(KERN_WARNING "Could not register pcidev.\n");		return result;	}	return 0;}void __exit cleanup_module(void){	if (unregister_chrdev(PCIDEV_MAJOR, pcidev_name) < 0)		printk(KERN_WARNING "Could not unregister pcidev.\n");	printk(KERN_INFO "pcidev cleanup\n");}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美国精品在线观看| 精品久久久久久久久久久院品网| 26uuu亚洲| 久久精品国产免费| 日韩午夜精品电影| 日韩精品电影一区亚洲| 丰满少妇久久久久久久| 久久影院电视剧免费观看| 经典三级视频一区| 精品欧美一区二区在线观看| 青青草精品视频| 欧美色视频一区| 亚洲bt欧美bt精品| 欧美丰满少妇xxxxx高潮对白 | 欧美一区二区国产| 日韩精品视频网站| 日韩欧美中文一区| 经典三级一区二区| 欧美国产视频在线| 99久久久精品免费观看国产蜜| 中文字幕一区二区三区在线播放| 99久久精品国产导航| 91黄色免费看| 极品美女销魂一区二区三区| 久久影院视频免费| 岛国精品一区二区| 亚洲女爱视频在线| 欧美日韩美女一区二区| 日韩av电影免费观看高清完整版| 欧美一区二区三区影视| 狠狠色丁香久久婷婷综合丁香| 国产欧美一区二区在线观看| 91麻豆精品在线观看| 丝袜美腿亚洲一区二区图片| 欧美www视频| 成人精品小蝌蚪| 亚洲一区二区精品视频| 欧美成人性福生活免费看| 国产99久久久国产精品潘金| 中文字幕中文字幕在线一区| 欧美手机在线视频| 精品在线播放免费| 一区二区三区丝袜| 日韩美女在线视频| 91色九色蝌蚪| 另类小说欧美激情| 国产精品视频线看| 欧美久久一区二区| 99久久综合精品| 亚洲免费伊人电影| 欧美va亚洲va在线观看蝴蝶网| 成人午夜免费视频| 午夜av一区二区| 欧美国产日韩在线观看| 欧美精品777| 99视频在线精品| 亚洲一卡二卡三卡四卡| 国产性色一区二区| 国产一区二区在线视频| 夜夜嗨av一区二区三区| 日韩欧美的一区| 在线精品视频免费观看| 国产精品亚洲成人| 性做久久久久久免费观看| 久久精品这里都是精品| 在线不卡中文字幕播放| 99久免费精品视频在线观看| 精品一区二区在线播放| 日韩电影免费一区| 中文字幕一区三区| 26uuu另类欧美亚洲曰本| 精品视频一区三区九区| 成人av综合在线| 国内成人精品2018免费看| 亚洲国产裸拍裸体视频在线观看乱了| 欧美高清在线视频| 精品国产百合女同互慰| 欧美放荡的少妇| 欧美亚洲高清一区| 9色porny自拍视频一区二区| 国产精品一区三区| 久草中文综合在线| 免费观看在线综合| 亚洲综合av网| 亚洲美女一区二区三区| 国产精品福利影院| wwwwxxxxx欧美| 日韩精品资源二区在线| 欧美精品aⅴ在线视频| 欧美视频精品在线| 国产宾馆实践打屁股91| 国产成人啪免费观看软件| 激情综合色综合久久综合| 免费在线看成人av| 亚洲一二三区视频在线观看| 欧美韩国一区二区| 亚洲免费av观看| 亚洲一区二区三区国产| 亚洲综合无码一区二区| 日日摸夜夜添夜夜添精品视频| 国产精品久久一卡二卡| 亚洲国产精品久久艾草纯爱| 国产乱理伦片在线观看夜一区| 欧美群妇大交群中文字幕| 欧美精品在线视频| 亚洲欧美日韩国产成人精品影院 | 精品国产一区二区三区av性色| 91丨porny丨蝌蚪视频| 欧美三级韩国三级日本三斤| 日本韩国精品在线| 日韩高清欧美激情| 国产精品嫩草99a| 久久久久久久久久久久久久久99| 欧美变态tickling挠脚心| 欧美剧情片在线观看| 日本一区二区成人| 日韩中文字幕亚洲一区二区va在线| 在线观看av不卡| 日韩高清不卡一区二区三区| 91免费看片在线观看| 日韩一本二本av| 欧美精品一区二区三区高清aⅴ| 精品欧美一区二区久久| 国产精品视频你懂的| 亚洲午夜国产一区99re久久| 免费成人在线影院| 99久久国产综合精品色伊| 51久久夜色精品国产麻豆| 久久亚洲二区三区| 亚洲自拍与偷拍| 国产一区三区三区| 在线观看日韩精品| 中文字幕av一区二区三区免费看| 国产精品久久久爽爽爽麻豆色哟哟| 爽好多水快深点欧美视频| 国产精品一区不卡| 日韩欧美中文字幕制服| 亚洲成av人片在www色猫咪| av在线不卡电影| 国产精品无遮挡| 美女任你摸久久| 欧美日韩你懂的| 亚洲成人在线网站| 欧美在线一区二区| 亚洲图片有声小说| 国产毛片一区二区| 欧美日韩国产精品成人| 国产精品免费观看视频| 国产精品一级二级三级| 日韩欧美一区在线| 日韩女优制服丝袜电影| 精品区一区二区| 国产亚洲精品中文字幕| 中文字幕第一区综合| 九九热在线视频观看这里只有精品| 色综合天天天天做夜夜夜夜做| 欧美精品一区二区三区久久久| 天天操天天干天天综合网| 91麻豆国产福利在线观看| 国产日产欧美精品一区二区三区| 麻豆传媒一区二区三区| 国产精品18久久久久久久久| 国产日韩欧美在线一区| 国产一区高清在线| 亚洲丝袜精品丝袜在线| 色哟哟一区二区| 91麻豆免费在线观看| 欧美高清一级片在线观看| 91黄色在线观看| 激情综合五月婷婷| 麻豆传媒一区二区三区| 久草中文综合在线| 欧美最猛性xxxxx直播| 欧美一三区三区四区免费在线看| 色美美综合视频| 欧美午夜一区二区三区免费大片| 在线看不卡av| 5566中文字幕一区二区电影| 91精品国产日韩91久久久久久| 91精品国产色综合久久不卡电影| 欧美电视剧在线看免费| 亚洲精品菠萝久久久久久久| 国产在线精品国自产拍免费| 欧洲av在线精品| 亚洲国产精品精华液ab| 日韩国产精品久久久久久亚洲| 懂色av一区二区夜夜嗨| 欧美一区二区人人喊爽| 亚洲国产日韩精品| 97久久人人超碰| ww亚洲ww在线观看国产| 777奇米四色成人影色区| jlzzjlzz欧美大全| 国产成人日日夜夜| 国产精品99精品久久免费| 视频一区欧美日韩| 偷拍一区二区三区| 国产乱码精品一区二区三| 成人亚洲一区二区一| 精品视频123区在线观看|