From 61b71b4491b0b48b9c78cc9b3501420268a3d410 Mon Sep 17 00:00:00 2001 From: pjht Date: Sun, 30 Aug 2020 17:01:50 -0500 Subject: [PATCH] Fix some isues with the PCI driver --- pci/pci.c | 39 ++++++++++++++++++--------------------- pci/pci.h | 5 +---- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/pci/pci.c b/pci/pci.c index 4749cb6..6c240b4 100644 --- a/pci/pci.c +++ b/pci/pci.c @@ -36,39 +36,36 @@ pci_dev_common_info* pci_get_dev_info(int bus,int device,int func) { info[2]=read_config(bus,device,func,8); info[3]=read_config(bus,device,func,0xC); pci_dev_common_info* pci_info=(pci_dev_common_info*)info; - pci_info->bus=bus; - pci_info->device=device; - pci_info->func=func; return pci_info; } -void pci_set_dev_info(pci_dev_common_info* inf) { +void pci_set_dev_info(int bus,int device,int func, pci_dev_common_info* inf) { uint32_t* info=(uint32_t*)inf; - write_config(inf->bus,inf->device,inf->func,0,info[0]); - write_config(inf->bus,inf->device,inf->func,4,info[1]); - write_config(inf->bus,inf->device,inf->func,8,info[2]); - write_config(inf->bus,inf->device,inf->func,0xC,info[3]); + write_config(bus,device,func,0,info[0]); + write_config(bus,device,func,4,info[1]); + write_config(bus,device,func,8,info[2]); + write_config(bus,device,func,0xC,info[3]); } -static void checkFunction(pci_dev_common_info* info); +static void checkFunction(int bus,int device,int func, pci_dev_common_info* info); static void checkDevice(int bus, int device) { pci_dev_common_info* info=pci_get_dev_info(bus,device,0); if(info->vend_id==0xFFFF||info->class_code==0xFF) { return; } - checkFunction(info); + checkFunction(bus, device, 0, info); if((info->header_type&0x80)!=0) { for(int function=1;function<8;function++) { pci_dev_common_info* info=pci_get_dev_info(bus,device,function); if(info->vend_id!=0xFFFF&&info->class_code!=0xFF) { - checkFunction(info); + checkFunction(bus,device,function,info); } } } } -static void printBAR(pci_dev_common_info* info,uint32_t bar,int num) { +static void printBAR(uint32_t bar,int num) { if (bar!=0) { if (bar&0x1) { printf("[INFO] IO BAR%d:%x\n",num,bar&0xFFFFFFFC); @@ -78,7 +75,7 @@ static void printBAR(pci_dev_common_info* info,uint32_t bar,int num) { } } -static void checkFunction(pci_dev_common_info* info) { +static void checkFunction(int bus,int device,int func,pci_dev_common_info* info) { if (pci_num_devs==max_devs) { max_devs+=32; pci_devs=malloc(sizeof(pci_dev_common_info)*max_devs); @@ -87,8 +84,8 @@ static void checkFunction(pci_dev_common_info* info) { if ((info->header_type&0x7f)==0) { pci_dev_type0* dev=realloc(info,sizeof(pci_dev_type0)); uint32_t* dev_word_array=(uint32_t*)dev; - for (int i=5;i<17;i++) { - dev_word_array[i]=read_config(info->bus,info->device,info->func,i*4); + for (int i=0;i<16;i++) { + dev_word_array[i]=read_config(bus,device,func,i*4); } pci_devs[pci_num_devs]=(pci_dev_common_info*)dev; } @@ -110,12 +107,12 @@ void pci_init() { printf("[INFO] Vendor ID:%x, Device ID:%x\n",info->vend_id,info->dev_id); if ((info->header_type&0x7f)==0) { pci_dev_type0* dev=(pci_dev_type0*)info; - printBAR(info,dev->bar0,0); - printBAR(info,dev->bar1,1); - printBAR(info,dev->bar2,2); - printBAR(info,dev->bar3,3); - printBAR(info,dev->bar4,4); - printBAR(info,dev->bar5,5); + printBAR(dev->bar0,0); + printBAR(dev->bar1,1); + printBAR(dev->bar2,2); + printBAR(dev->bar3,3); + printBAR(dev->bar4,4); + printBAR(dev->bar5,5); } } } diff --git a/pci/pci.h b/pci/pci.h index e19819b..e0297ea 100644 --- a/pci/pci.h +++ b/pci/pci.h @@ -20,9 +20,6 @@ typedef struct { uint8_t lat_timer; uint8_t header_type; uint8_t bist; - uint16_t bus; - uint8_t device; - uint8_t func; } __attribute__((packed)) pci_dev_common_info; typedef struct { @@ -71,7 +68,7 @@ extern pci_dev_common_info** pci_devs; extern size_t pci_num_devs; pci_dev_common_info* pci_get_dev_info(int bus,int device,int func); -void pci_set_dev_info(pci_dev_common_info* inf); +void pci_set_dev_info(int bus,int device,int func,pci_dev_common_info* inf); void pci_init(); #endif