[REMOTE-X86]
var out = "--- SAFE PCI USB PROBE ---
";
for (var bus = 0; bus < 1; bus++) {
for (var slot = 0; slot < 32; slot++) {
for (var func = 0; func < 8; func++) {
var addr = 0x80000000 | (bus << 16) | (slot << 11) | (func << 8);
sys.outl(0xCF8, addr);
var devVen = sys.inl(0xCFC);
if (devVen !== 0xFFFFFFFF) {
sys.outl(0xCF8, addr | 0x08);
var classReg = sys.inl(0xCFC);
var classCode = (classReg >> 24) & 0xFF;
var subClass = (classReg >> 16) & 0xFF;
var progIf = (classReg >> 8) & 0xFF;
if (classCode === 0x0C && subClass === 0x03) {
var venId = devVen & 0xFFFF, devId = (devVen >> 16) &
0xFFFF;
out += "USB CTRL -> Bus:"+bus+" Slot:"+slot+"
Func:"+func+"
";
out += " Vendor: 0x"+venId.toString(16)+" Device:
0x"+devId.toString(16)+"
";
out += " Type (0=UHCI, 20=EHCI): 0x"+progIf.toString(16)+"
";
sys.outl(0xCF8, addr | 0x10);
out += " BAR0: 0x"+sys.inl(0xCFC).toString(16)+"
";
}
}
}
}
}
out;
=> --- SAFE PCI USB PROBE ---
USB CTRL -> Bus:0 Slot:29 Func:0
Vendor: 0x8086 Device: 0x2658
Type (0=UHCI, 20=EHCI): 0x0
BAR0: 0x0
USB CTRL -> Bus:0 Slot:29 Func:1
Vendor: 0x8086 Device: 0x2659
Type (0=UHCI, 20=EHCI): 0x0
BAR0: 0x0
USB CTRL -> Bus:0 Slot:29 Func:2
Vendor: 0x8086 Device: 0x265a
Type (0=UHCI, 20=EHCI): 0x0
BAR0: 0x0
USB CTRL -> Bus:0 Slot:29 Func:3
Vendor: 0x8086 Device: 0x265b
Type (0=UHCI, 20=EHCI): 0x0
BAR0: 0x0
USB CTRL -> Bus:0 Slot:29 Func:7
Vendor: 0x8086 Device: 0x265c
Type (0=UHCI, 20=EHCI): 0x20
BAR0: 0xcfd00000
[GEM-EXEC] var out = "--- EHCI PORT RECON ---
";
var ehci_base = 0xcfd00000;
/ 1. Force Enable PCI Bus Mastering and MMIO (Bus 0, Slot 29, Func 7)
var pci_addr = 0x80000000 | (0 << 16) | (29 << 11) | (7 << 8);
sys.outl(0xCF8, pci_addr | 0x04);
var pci_cmd = sys.inl(0xCFC);
sys.outl(0xCFC, pci_cmd | 0x06);
/ 2. Read EHCI Capability Registers
var caplength = sys.peek(ehci_base);
var hciversion = sys.peek(ehci_base + 2) | (sys.peek(ehci_base + 3) << 8);
var hcsparams = sys.rd32(ehci_base + 0x04);
var num_ports = hcsparams & 0x0F;
out += "CAPLENGTH: 0x" + caplength.toString(16) + "
";
out += "EHCI VER : 0x" + hciversion.toString(16) + "
";
out += "HW PORTS : " + num_ports + "
";
/ 3. Read EHCI Operational Registers & Port Status
var op_base = ehci_base + caplength;
var usbcmd = sys.rd32(op_base + 0x00);
var usbsts = sys.rd32(op_base + 0x04);
out += "USBCMD: 0x" + usbcmd.toString(16) + "
";
out += "USBSTS: 0x" + usbsts.toString(16) + "
";
for (var p = 0; p < num_ports; p++) {
var portsc = sys.rd32(op_base + 0x44 + (p * 4));
var connected = portsc & 1;
var enabled = (portsc >> 2) & 1;
var owner = (portsc >> 13) & 1; // 1 = Port is owned by UHCI (Companion
Controller)
out += "PORT " + p + " (SC: 0x" + portsc.toString(16) + ") -> ";
if (connected) out += "[CONNECTED] ";
else out += "[EMPTY] ";
if (enabled) out += "[ENABLED] ";
if (owner) out += "[ROUTED TO UHCI]";
out += "
";