📄 lpci.c.txt
字号:
#include <STDIO.H>
#include <UNISTD.H>
#include <SYS io.h>
#define PCIIndexP 0xcf8
#define PCIDataP 0xcfc
#define DummyP 0x80
unsigned short int GetVendorID(unsigned long PCIDData_T);
unsigned short int GetDeviceID(unsigned long PCIDData_T);
int Prt_CPRight(void);
int main()
{
int nLst;
unsigned char bus,dev,func;
unsigned long PCIAddr,PCIDData;
unsigned int vendorID,deviceID;
nLst=0;
/* Get access to the ports */
/*if(ioperm(PCIIndexP,8,1)){perror("ioperm");exit(1);}
if(ioperm(PCIDataP ,3,1)){perror("ioperm");exit(1);}
*/
iopl(3);
Prt_CPRight();
/* Begin scan here */
for(bus=0;bus<0xfe;bus++)
for(dev=0;dev<=0x1f;dev++)
for(func=0;func<=7;func++)
{
PCIAddr=(0x8000<<16)|((bus<<8|dev<<3|func)<<8);
asm("movl %1,%%eax\n"\
"mov %2,%%dx\n"\
"out %%eax,%%dx\n"\
"mov %3,%%dx\n"\
"in %%dx,%%eax\n"\
"movl %%eax,%0\n"\
:"=a"(PCIDData)
:"a"(PCIAddr),"i"(PCIIndexP),"i"(PCIDataP)
,"i"(DummyP)
);
if(PCIDData!=0xffffffff)
{
vendorID=GetVendorID(PCIDData);
deviceID=GetDeviceID(PCIDData);
printf("%2x Bus:%2x Dev:%2x Func:%x======Vendor:%4x,Device:%4x\n",nLst,bus,dev,func,vendorID,deviceID);
nLst++;
}
else
{
break;
}
}
/* We don't need the ports anymore */
/*
if(ioperm(PCIIndexP,8,0)){perror("ioperm");exit(1);}
if(ioperm(PCIDataP ,3,0)){perror("ioperm");exit(1);}
*/
iopl(0);
exit(0);
}
unsigned short int GetVendorID(unsigned long PCIDData_T)
{
unsigned short int vID=0xFFFF;
asm("movl %1,%%eax\n"\
"mov %%ax,%0\n"
:"+d"(vID)
:"a"(PCIDData_T)
);
return vID;
}
unsigned short int GetDeviceID(unsigned long PCIDData_T)
{
unsigned short int dID=0xFFFF;
asm("movl %1,%%eax\n"\
"rol $0x10,%%eax\n"\
"mov %%ax,%0\n"
:"+d"(dID)
:"a"(PCIDData_T)
);
return dID;
}
int Prt_CPRight(void)
{
printf "==========================================================\n"
" List all PCI information \n"
"==========================================================\n"
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -