- 论坛徽章:
- 0
|
原帖由 bluesky_jxc 于 2008-9-2 16:09 发表
帮你回答算了
PCI spec里面有一句话,叫“don't care bit”, 就是说,不管写什么进去,这些bit读出来的值都是0.
换句话说,写1进去读回来是0,那么就表示这个位是“don't care”的,也就决定了PCI Mem bar的 ...
OpenSolaris的add_reg_props的代码就是这么做的。
OpenSolaris的add_reg_props函数里,首先是将BAR读出备份,然后写全1,然后读,结果存在value里,再将备份BAR写回,
/* determine the size of the address space */
base = pci_getl(bus, dev, func, offset); <<< 备份原来的BAR
pci_putl(bus, dev, func, offset, 0xffffffff); <<< 写全1,探测长度
value = pci_getl(bus, dev, func, offset); <<< 读出探测结果,待后面的代码去处理取得长度
pci_putl(bus, dev, func, offset, base); <<<写回备份的BAR
...........................................................................
对于PCI内存空间的BAR,
/* skip base regs with size of 0 */
value &= PCI_BASE_M_ADDR_M; <<< MMIO方式,value的低4位根据规范被clear掉。
if (value == 0) <<<value全部为0意味着这个BAR没有被硬件实现。
continue;
len = ((value ^ (value-1)) + 1) >> 1; <<< value ^ (value -1) 就找到了所有的don't care bit, 这些don't carebit这时都是1。
<<< 全1的don't care bit +1 再右移1位即可找到第一个不是0的bit, 就是BAR影射区域的长度。
挖出这个帖子不是为了考古,我的新问题来了。
Xen 3.3应该早就支持Direct hardware access了,那么当DomU是Linux操作系统,并且是Para Virtulaization (泛虚拟化)的时候,
当一个PCI设备被分给这个DomU的时候,Linux的DomU会用上述方式去读写这个PCI设备BAR吗?
如果答案是肯定的,那么BAR里的地址是"物理地址"还是"机器地址"?
请熟悉Xen的朋友回答。
[ 本帖最后由 Solaris12 于 2009-3-17 00:17 编辑 ] |
|