Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.67 KB | None | 0 0
  1. #include <sys/io.h>
  2. #include <stdio.h>
  3. #include "pci_c_header.h"
  4. #include <string.h>
  5. #include <errno.h>
  6.  
  7. typedef unsigned int uint;
  8.  
  9. char *findVenName(uint venID) {
  10.     for (uint i = 0; i < PCI_VENTABLE_LEN; i++)
  11.         if (PciVenTable[i].VenId == venID)
  12.             return PciVenTable[i].VenFull;
  13.     return "";
  14. }
  15.  
  16. char *findDevName(uint venID, uint devID) {
  17.     for (uint i = 0; i < PCI_DEVTABLE_LEN; i++)
  18.         if (PciDevTable[i].DevId == devID && PciDevTable[i].VenId == venID)
  19.             return PciDevTable[i].ChipDesc;
  20.     return "";
  21. }
  22.  
  23. uint getAddr(uint bus, uint dev, uint func, uint reg) {
  24.     return (1 << 31) | (bus << 16) | (dev << 11) | (func << 8) | (reg << 2);
  25. }
  26.  
  27. #define _SUBTASK_
  28.  
  29. int main() {
  30.     //printf("Peripherial devs lab3\n\n");
  31.     int i, busid, devid;
  32.     if (iopl(3)) {
  33.         printf("No ROOT\n");
  34.         return 1;
  35.     } else {
  36.         printf("[Got ROOT Permissions.]\n\n");
  37.         uint cnt = 0, resp, devID, venID;
  38.         for (uint bus = 0; bus < (1u << 8); bus++) {
  39.             for (uint dev = 0; dev < (1u << 5); dev++) {
  40.                 for (uint func = 0; func < (1u << 3); func++) {
  41.                     outl(getAddr(bus, dev, func, 0), 0xCF8);
  42.                     resp = inl(0xCFC);
  43.                     devID = resp >> 16;
  44.                     venID = resp & 0xFFFF;
  45.                     if (devID != 0xFFFF) {
  46.                         cnt++;
  47.                         printf("bus=0x%x dev=0x%x func=0x%x\n", bus, dev, func);
  48.                         char *venName = findVenName(venID);
  49.                         char *devName = findDevName(venID, devID);
  50.                         printf("venID=0x%x %s\n", venID, venName);
  51.                         printf("devID=0x%x %s\n", devID, devName);
  52. #ifdef _SUBTASK_
  53.                         outl(getAddr(bus, dev, func, 3), 0xCF8);
  54.                         resp = inl(0xCFC);
  55.                         uint hdrType = (resp >> 16) & 1;
  56.                         if (hdrType) {
  57.                             outl(getAddr(bus, dev, func, 15), 0xCF8);
  58.                             resp = inl(0xCFC);
  59.                             uint IntLine = resp & 0xFF;
  60.                             uint IntPin = (resp >> 8) & 0xFF;
  61.                             printf("[IL=0x%x]", IntLine);
  62.                             if (IntLine == 0xFF)
  63.                                 printf(": Unknown or Free\n");
  64.                             else
  65.                                 printf("-IRQ%d\n", IntLine);
  66.  
  67.                             printf("[IP=0x%x]:", IntPin);
  68.                             switch (IntPin) {
  69.                                 case 0:
  70.                                     printf(" Unused\n");
  71.                                     break;
  72.                                 case 1:
  73.                                 case 2:
  74.                                 case 3:
  75.                                 case 4:
  76.                                     printf(" INT%c#\n", 'A' + IntPin - 1);
  77.                                     break;
  78.                                 case 5:
  79.                                     printf(" Reserve\n");
  80.                                     break;
  81.                             }
  82.                 outl(getAddr(bus, dev, func, 12), 0xCF8);
  83.                 resp = inl(0xCFC);
  84.                             uint IOBase = resp & 0xFFFF;
  85.                 uint IOLimit = (resp >> 16) & 0xFFFF;
  86.                             printf("IOBase=0x%x\n", IOBase);
  87.                 printf("IOLimit=0x%x\n", IOLimit);
  88.                         } else {
  89.                             puts("Base Address Registers:");   
  90.                     for (int i = 0; i < 6; i++){
  91.                 outl(getAddr(bus, dev, func, i + 4), 0xCF8);
  92.                 resp = inl(0xCFC);             
  93.                 printf("\tRegister #%d: ", i + 1);
  94.                 if (resp){
  95.                    if (resp & 1){
  96.                     puts("I/O space register");
  97.                     printf("\t\tAddress: %#x\n", resp);
  98.                        }
  99.                    else{
  100.                     puts("memory space register");
  101.                     uint typeBits = (resp >> 1) & 3;
  102.                     switch (typeBits) {
  103.                            case 0:
  104.                              puts("\t\tany position in 32 bit address space");
  105.                                  break;
  106.                            case 1:
  107.                              puts("\t\tbelow 1MB");
  108.                              break;          
  109.                            case 2:
  110.                                  puts("\t\tany position in 64 bit address space");
  111.                              break;
  112.                            default:
  113.                          puts("\t\tReserve");
  114.                          break;
  115.                        }
  116.                        printf("\t\tAddress: %#x\n", resp >> 4);
  117.                        }
  118.                 }
  119.                 else printf("Unused register\n");
  120.                             }      
  121.                         }
  122. #endif
  123.                         printf("\n");
  124.                     }
  125.                 }
  126.             }
  127.         }
  128.         printf("%d\n", cnt);
  129.     }
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement