221 lines
5.3 KiB
HolyC
Executable File
221 lines
5.3 KiB
HolyC
Executable File
#help_index "PCI;Processor;Devices;Info"
|
||
|
||
//The file was downloaded from
|
||
//http://www.pcidatabase.com/reports.php?type=tab-delimeted
|
||
|
||
#define PCI_DEV_FILE "::/Misc/PCIDevices.DD.Z"
|
||
|
||
/****
|
||
//1) Download http://www.pcidatabase.com/reports.php?type=tab-delimeted
|
||
//2) Rename to ::/Misc/PCIDevices.DD.Z
|
||
//3) ToDolDoc("::/Misc/PCIDevices.DD.Z");
|
||
//4) Edit and remove file header and tail
|
||
//5) Text find-and-replace "=0A=" with "". (Doesn't seem necessary anmore.)
|
||
//6) Run PCIDevFileGen(). (Doesn't seem necessary anmore.)
|
||
|
||
public U0 PCIDevFileGen()
|
||
{
|
||
Bool first=TRUE,del=FALSE,del2=FALSE,cont=FALSE;
|
||
CDoc *doc=DocRead(PCI_DEV_FILE,
|
||
DOCF_PLAIN_TEXT|DOCF_DBL_DOLLARS|DOCF_NO_CURSOR);
|
||
CDocEntry *doc_e=doc->head.next,*doc_e2;
|
||
while (doc_e!=doc) {
|
||
doc_e2=doc_e->next;
|
||
if (first) {
|
||
if (doc_e->type_u8==DOCT_TEXT) {
|
||
if (doc_e->tag[0]==';')
|
||
del=TRUE;
|
||
}
|
||
first=FALSE;
|
||
}
|
||
if (doc_e->type_u8==DOCT_TEXT && doc_e->tag[StrLen(doc_e->tag)-1]=='=' &&
|
||
doc_e2->type_u8==DOCT_NEW_LINE) {
|
||
doc_e->tag[StrLen(doc_e->tag)-1]=CH_SPACE;
|
||
cont=TRUE;
|
||
}
|
||
del2=del;
|
||
if (doc_e->type_u8==DOCT_NEW_LINE) {
|
||
first=TRUE;
|
||
del2=FALSE;
|
||
if (cont) {
|
||
del=TRUE;
|
||
cont=FALSE;
|
||
}
|
||
}
|
||
if (del)
|
||
DocEntryDel(doc,doc_e);
|
||
del=del2;
|
||
doc_e=doc_e2;
|
||
}
|
||
DocWrite(doc);
|
||
}
|
||
****/
|
||
|
||
//$LK,"::/Misc/PCIDevices.DD",A="PI:::/Misc/PCIDevices.DD"$
|
||
U0 PCILookUpSingle(CDoc *doc,I64 m,I64 d,U8 **_vendor,U8 **_dev)
|
||
{
|
||
Bool first=TRUE;
|
||
U8 buf[8],*vendor=NULL,*dev=NULL;
|
||
CDocEntry *doc_e=doc->head.next;
|
||
while (doc_e!=doc) {
|
||
if (first) {
|
||
if (doc_e->type_u8==DOCT_TEXT && doc_e->tag[0]!=';' &&
|
||
StrLen(doc_e->tag)>=4) {
|
||
buf[0](U16)='0x';
|
||
buf[2](U32)=doc_e->tag(U32 *)[0];
|
||
buf[6]=0;
|
||
if (Str2I64(buf)==m) {
|
||
doc_e=doc_e->next->next;
|
||
if (doc_e->type_u8==DOCT_TEXT) {
|
||
vendor=AStrNew(doc_e->tag);
|
||
first=FALSE;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
first=FALSE;
|
||
}
|
||
if (doc_e->type_u8==DOCT_NEW_LINE)
|
||
first=TRUE;
|
||
doc_e=doc_e->next;
|
||
}
|
||
|
||
if (vendor) {
|
||
while (doc_e!=doc) {
|
||
if (first) {
|
||
if (doc_e->type_u8==DOCT_TAB) {
|
||
doc_e=doc_e->next;
|
||
if (doc_e->type_u8==DOCT_TEXT && StrLen(doc_e->tag)>=4) {
|
||
buf[0](U16)='0x';
|
||
buf[2](U32)=doc_e->tag(U32 *)[0];
|
||
buf[6]=0;
|
||
if (Str2I64(buf)==d) {
|
||
doc_e=doc_e->next->next;
|
||
if (doc_e->type_u8==DOCT_TEXT) {
|
||
dev=AStrNew(doc_e->tag);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
} else
|
||
break;
|
||
first=FALSE;
|
||
}
|
||
if (doc_e->type_u8==DOCT_NEW_LINE)
|
||
first=TRUE;
|
||
doc_e=doc_e->next;
|
||
}
|
||
}
|
||
|
||
if (vendor)
|
||
*_vendor=vendor;
|
||
else
|
||
*_vendor=AStrNew("Unknown");
|
||
|
||
if (dev)
|
||
*_dev=dev;
|
||
else
|
||
*_dev=AStrNew("Unknown");
|
||
}
|
||
|
||
U0 PCILookUpDevs()
|
||
{
|
||
CPCIDev *tmppci;
|
||
I64 w1,w2,b,d,f,timeout=32*8*2;
|
||
CDoc *doc;
|
||
if (dev.pci_head.next!=&dev.pci_head)
|
||
return;
|
||
doc=DocRead(PCI_DEV_FILE,DOCF_PLAIN_TEXT|DOCF_NO_CURSOR);
|
||
for (b=0;b<sys_pci_busses;b++)
|
||
for (d=0;d<32;d++)
|
||
for (f=0;f<8;f++) {
|
||
w1=PCIReadU16(b,d,f,0);
|
||
if (w1!=0xFFFF) {
|
||
tmppci=ACAlloc(sizeof(CPCIDev));
|
||
tmppci->bus=b;
|
||
tmppci->dev=d;
|
||
tmppci->fun=f;
|
||
tmppci->vendor=w1;
|
||
tmppci->dev_id=w2=PCIReadU16(b,d,f,2);
|
||
tmppci->sub_code=PCIReadU8(b,d,f,0xA);
|
||
tmppci->base_code=PCIReadU8(b,d,f,0xB);
|
||
PCILookUpSingle(doc,w1,w2,&tmppci->vendor_str,&tmppci->dev_id_str);
|
||
QueIns(tmppci,dev.pci_head.last);
|
||
timeout=32*8*2;
|
||
} else if (sys_pci_busses==256 && --timeout<=0)
|
||
goto lud_done;
|
||
}
|
||
lud_done:
|
||
DocDel(doc);
|
||
}
|
||
|
||
public U0 PCIRep()
|
||
{//Report description of PCI devices.
|
||
CPCIDev *tmppci;
|
||
"PCI Busses:%d\n",sys_pci_busses;
|
||
if (!FileFind(PCI_DEV_FILE)) {
|
||
"You don't have the PCI device file.\n";
|
||
return;
|
||
}
|
||
PCILookUpDevs;
|
||
tmppci=dev.pci_head.next;
|
||
while (tmppci!=&dev.pci_head) {
|
||
"%02X:%02X:%01X %02X%02X $$GREEN$$%s $$CYAN$$%s$$FG$$\n",
|
||
tmppci->bus,tmppci->dev,tmppci->fun,
|
||
tmppci->base_code,tmppci->sub_code,
|
||
tmppci->vendor_str,tmppci->dev_id_str;
|
||
tmppci=tmppci->next;
|
||
}
|
||
}
|
||
|
||
#help_index "Info;Memory/Info"
|
||
public U0 MemBIOSRep()
|
||
{//Report the memory ranges reported by the BIOS at boot.
|
||
U16 *m01=MEM_E801;
|
||
CMemE820 *m20=MEM_E820;
|
||
CMemRange *tmpmr;
|
||
"Standard Addresses\n"
|
||
"000A0000-000BFFFF VGA\n"
|
||
"FEE00000-FEE00FFF See $$LK,\"APIC\",A=\"MN:LAPIC_BASE\"$$\n\n"
|
||
"32 Bit Device Mem\n";
|
||
while (LBts(&sys_semas[SEMA_DEV_MEM],0))
|
||
Yield;
|
||
tmpmr=dev.mem32_head.next;
|
||
while (tmpmr!=&dev.mem32_head) {
|
||
"%02X:%016X-%016X\n",
|
||
tmpmr->type,tmpmr->base,tmpmr->base+tmpmr->size-1;
|
||
tmpmr=tmpmr->next;
|
||
}
|
||
LBtr(&sys_semas[SEMA_DEV_MEM],0);
|
||
|
||
"\nBIOS Memory Report 15:E801\n"
|
||
"01:0000000000000000-%016X\n",0x100000+m01[0]<<10-1;
|
||
"01:0000000001000000-%016X\n",SYS_16MEG_AREA_LIMIT+m01[1]<<16-1;
|
||
|
||
if (m20->type) {
|
||
'\n';
|
||
"BIOS Memory Report 15:E820\n";
|
||
while (m20->type) {
|
||
"%02X:%016X-%016X\n",m20->type,m20->base,m20->base+m20->len-1;
|
||
m20++;
|
||
}
|
||
}
|
||
}
|
||
|
||
public U0 MemPageRep()
|
||
{//Page Table Report.
|
||
"MAPPED\t:%010Xwith",mem_mapped_space;
|
||
if (Bt(&mem_page_size,30))
|
||
"$$RED$$1GIG$$FG$$ pages\n";
|
||
else
|
||
"$$RED$$2MEG$$FG$$ pages\n";
|
||
"PML2\t:%010X2MEG:%08X\n",
|
||
*MEM_PML2(U64 *),*MEM_2MEG_NUM(U64 *);
|
||
"PML3\t:%010X1GIG:%08X\n",
|
||
*MEM_PML3(U64 *),*MEM_1GIG_NUM(U64 *);
|
||
"PML4\t:%010X512GIG:%08X\n",
|
||
*MEM_PML4(U64 *),*MEM_512GIG_NUM(U64 *);
|
||
"FIXED_AREA:%010X\n",SYS_FIXED_AREA;
|
||
"HEAP_BASE:%010X\nHEAP_LIMIT:%010X\n",mem_heap_base,mem_heap_limit;
|
||
}
|