Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/io.h>
- #include <stdio.h>
- #include "pci_c_header.h"
- #include <string.h>
- #include <errno.h>
- typedef unsigned int uint;
- char *findVenName(uint venID) {
- for (uint i = 0; i < PCI_VENTABLE_LEN; i++)
- if (PciVenTable[i].VenId == venID)
- return PciVenTable[i].VenFull;
- return "";
- }
- char *findDevName(uint venID, uint devID) {
- for (uint i = 0; i < PCI_DEVTABLE_LEN; i++)
- if (PciDevTable[i].DevId == devID && PciDevTable[i].VenId == venID)
- return PciDevTable[i].ChipDesc;
- return "";
- }
- uint getAddr(uint bus, uint dev, uint func, uint reg) {
- return (1 << 31) | (bus << 16) | (dev << 11) | (func << 8) | (reg << 2);
- }
- #define _SUBTASK_
- int main() {
- //printf("Peripherial devs lab3\n\n");
- int i, busid, devid;
- if (iopl(3)) {
- printf("No ROOT\n");
- return 1;
- } else {
- printf("[Got ROOT Permissions.]\n\n");
- uint cnt = 0, resp, devID, venID;
- for (uint bus = 0; bus < (1u << 8); bus++) {
- for (uint dev = 0; dev < (1u << 5); dev++) {
- for (uint func = 0; func < (1u << 3); func++) {
- outl(getAddr(bus, dev, func, 0), 0xCF8);
- resp = inl(0xCFC);
- devID = resp >> 16;
- venID = resp & 0xFFFF;
- if (devID != 0xFFFF) {
- cnt++;
- printf("bus=0x%x dev=0x%x func=0x%x\n", bus, dev, func);
- char *venName = findVenName(venID);
- char *devName = findDevName(venID, devID);
- printf("venID=0x%x %s\n", venID, venName);
- printf("devID=0x%x %s\n", devID, devName);
- #ifdef _SUBTASK_
- outl(getAddr(bus, dev, func, 3), 0xCF8);
- resp = inl(0xCFC);
- uint hdrType = (resp >> 16) & 1;
- if (hdrType) {
- outl(getAddr(bus, dev, func, 15), 0xCF8);
- resp = inl(0xCFC);
- uint IntLine = resp & 0xFF;
- uint IntPin = (resp >> 8) & 0xFF;
- printf("[IL=0x%x]", IntLine);
- if (IntLine == 0xFF)
- printf(": Unknown or Free\n");
- else
- printf("-IRQ%d\n", IntLine);
- printf("[IP=0x%x]:", IntPin);
- switch (IntPin) {
- case 0:
- printf(" Unused\n");
- break;
- case 1:
- case 2:
- case 3:
- case 4:
- printf(" INT%c#\n", 'A' + IntPin - 1);
- break;
- case 5:
- printf(" Reserve\n");
- break;
- }
- outl(getAddr(bus, dev, func, 12), 0xCF8);
- resp = inl(0xCFC);
- uint IOBase = resp & 0xFFFF;
- uint IOLimit = (resp >> 16) & 0xFFFF;
- printf("IOBase=0x%x\n", IOBase);
- printf("IOLimit=0x%x\n", IOLimit);
- } else {
- puts("Base Address Registers:");
- for (int i = 0; i < 6; i++){
- outl(getAddr(bus, dev, func, i + 4), 0xCF8);
- resp = inl(0xCFC);
- printf("\tRegister #%d: ", i + 1);
- if (resp){
- if (resp & 1){
- puts("I/O space register");
- printf("\t\tAddress: %#x\n", resp);
- }
- else{
- puts("memory space register");
- uint typeBits = (resp >> 1) & 3;
- switch (typeBits) {
- case 0:
- puts("\t\tany position in 32 bit address space");
- break;
- case 1:
- puts("\t\tbelow 1MB");
- break;
- case 2:
- puts("\t\tany position in 64 bit address space");
- break;
- default:
- puts("\t\tReserve");
- break;
- }
- printf("\t\tAddress: %#x\n", resp >> 4);
- }
- }
- else printf("Unused register\n");
- }
- }
- #endif
- printf("\n");
- }
- }
- }
- }
- printf("%d\n", cnt);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement