Previous commit was a blunder. This commit setups up Malloc proper and includes a working string concat.
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
#include "../include/pci.h"
|
||||
#include "../include/system.h"
|
||||
#include "../include/port.h"
|
||||
#include "../include/scrn.h"
|
||||
|
||||
uint32_t Read(uint16_t busNumber, uint16_t deviceNumber, uint16_t functionNumber, uint32_t registerOffset)
|
||||
{
|
||||
puts("Read ");
|
||||
puts(int_to_string(functionNumber, 10));
|
||||
puts("\n");
|
||||
uint32_t id =
|
||||
0x1 << 31
|
||||
| ((busNumber & 0xFF) << 16)
|
||||
| ((deviceNumber & 0x1F) << 11)
|
||||
| ((functionNumber & 0x07) << 8)
|
||||
| (registerOffset & 0xFC);
|
||||
Write32Bit(0xCF8, id);
|
||||
uint32_t result = Read32Bit(0xCFC);
|
||||
return result >> (8 * (registerOffset %4));
|
||||
}
|
||||
|
||||
void Write(uint16_t busNumber, uint16_t deviceNumber, uint16_t functionNumber, uint32_t registerOffset, uint32_t value)
|
||||
{
|
||||
uint32_t id =
|
||||
0x1 << 31
|
||||
| ((busNumber & 0xFF) << 16)
|
||||
| ((deviceNumber & 0x1F) << 11)
|
||||
| ((functionNumber & 0x07) << 8)
|
||||
| (registerOffset & 0xFC);
|
||||
Write32Bit(0xCF8, id);
|
||||
Write32Bit(0xCFC, value);
|
||||
}
|
||||
|
||||
bool DeviceHasFunctions(uint16_t bus, uint16_t device)
|
||||
{
|
||||
//Checks the 7th bit to determine if the device has a function.
|
||||
return Read(bus, device, 0, 0x0E) & (1 << 7);
|
||||
}
|
||||
|
||||
void EnumPCISubsystem()
|
||||
{
|
||||
for(int bus = 0; bus < 8; bus++)
|
||||
{
|
||||
for(int device = 0; device < 32; device++)
|
||||
{
|
||||
int functionCount = DeviceHasFunctions(bus, device) ? 8 : 1;//8 or 1
|
||||
|
||||
for(int function = 0; function < functionCount; function++)
|
||||
{
|
||||
//puts(", Function ");
|
||||
//puts(int_to_string(function, 16));
|
||||
struct DeviceDescriptor dev = {0};
|
||||
dev = GetDeviceDescriptor(bus, device, function);
|
||||
|
||||
if(dev.VendorId == 0x0000 || dev.VendorId == 0xFFFF)
|
||||
break;//Break loop, no more funcitons.
|
||||
//puts("PCI BUS ");
|
||||
//puts(int_to_string(bus, 16));
|
||||
//puts("Device ");
|
||||
//puts(int_to_string(device, 16));
|
||||
//puts(" = Vendor ");
|
||||
//puts(int_to_string(dev.VendorId, 16));
|
||||
//puts(", Device ");
|
||||
//puts(int_to_string(dev.DeviceId, 16));
|
||||
//puts(" Class ");
|
||||
//puts(int_to_string(dev.ClassId, 16));
|
||||
//puts("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct DeviceDescriptor GetDeviceDescriptor(uint16_t busNumber, uint16_t deviceNumber, uint16_t functionNumber)
|
||||
{
|
||||
struct DeviceDescriptor result;
|
||||
|
||||
result.Bus = busNumber;
|
||||
result.Device = deviceNumber;
|
||||
result.Function = functionNumber;
|
||||
|
||||
result.VendorId = Read(busNumber, deviceNumber, functionNumber, 0x00);
|
||||
result.DeviceId = Read(busNumber, deviceNumber, functionNumber, 0x02);
|
||||
|
||||
result.ClassId = Read(busNumber, deviceNumber, functionNumber, 0x0B);
|
||||
result.SubClassId = Read(busNumber, deviceNumber, functionNumber, 0x0A);
|
||||
result.InterfaceId = Read(busNumber, deviceNumber, functionNumber, 0x09);
|
||||
|
||||
result.Revision = Read(busNumber, deviceNumber, functionNumber, 0x08);
|
||||
result.Interrupt = Read(busNumber, deviceNumber, functionNumber, 0x3C);
|
||||
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user