From 287a23162177484e35d3ab1c67ce40d5d17cb787 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 16 Aug 2021 15:32:40 -0300 Subject: [PATCH] pcireg: Convert PCI read/write operations into interrupt-safe library functions --- lib/wlib.c | 74 +++++++++++++++++++++++++++++++++++++++++ lib/wlib.h | 13 +++++++- pcireg/PCIREG.EXE | Bin 34776 -> 34904 bytes pcireg/pcireg.c | 82 ++++++++++++++++------------------------------ 4 files changed, 114 insertions(+), 55 deletions(-) diff --git a/lib/wlib.c b/lib/wlib.c index 9b69dbd..30cd877 100644 --- a/lib/wlib.c +++ b/lib/wlib.c @@ -31,3 +31,77 @@ pci_cf8(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg) ret.u8[0] = reg & 0xfc; return ret.u32; } + + +uint8_t +pci_readb(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg) +{ + uint8_t ret; + uint16_t data_port = 0xcfc | (reg & 0x03); + uint32_t cf8 = pci_cf8(bus, dev, func, reg); + cli(); + outl(0xcf8, cf8); + ret = inb(data_port); + sti(); + return ret; +} + + +uint16_t +pci_readw(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg) +{ + uint16_t ret, data_port = 0xcfc | (reg & 0x02); + uint32_t cf8 = pci_cf8(bus, dev, func, reg); + cli(); + outl(0xcf8, cf8); + ret = inw(data_port); + sti(); + return ret; +} + + +uint32_t +pci_readl(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg) +{ + uint32_t ret, cf8 = pci_cf8(bus, dev, func, reg); + cli(); + outl(0xcf8, cf8); + ret = inl(0xcfc); + sti(); + return ret; +} + + +void +pci_writeb(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint8_t val) +{ + uint16_t data_port = 0xcfc | (reg & 0x03); + uint32_t cf8 = pci_cf8(bus, dev, func, reg); + cli(); + outl(0xcf8, cf8); + outb(data_port, val); + sti(); +} + + +void +pci_writew(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint16_t val) +{ + uint16_t data_port = 0xcfc | (reg & 0x02); + uint32_t cf8 = pci_cf8(bus, dev, func, reg); + cli(); + outl(0xcf8, cf8); + outw(data_port, val); + sti(); +} + + +void +pci_writel(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint32_t val) +{ + uint32_t cf8 = pci_cf8(bus, dev, func, reg); + cli(); + outl(0xcf8, cf8); + outl(0xcfc, val); + sti(); +} diff --git a/lib/wlib.h b/lib/wlib.h index df3bd04..8429090 100644 --- a/lib/wlib.h +++ b/lib/wlib.h @@ -29,7 +29,12 @@ typedef union { #pragma pack(pop) -/* Port I/O functions. */ +/* Inline assembly functions. */ +void cli(); +#pragma aux cli = "cli"; +void sti(); +#pragma aux sti = "sti"; + uint8_t inb(uint16_t port); #pragma aux inb = "in al, dx" parm [dx] value [al]; void outb(uint16_t port, uint8_t data); @@ -66,5 +71,11 @@ void outl(uint16_t port, uint32_t data); /* PCI functions. */ extern uint32_t pci_cf8(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg); +extern uint8_t pci_readb(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg); +extern uint16_t pci_readw(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg); +extern uint32_t pci_readl(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg); +extern void pci_writeb(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint8_t val); +extern void pci_writew(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint16_t val); +extern void pci_writel(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, uint32_t val); #endif diff --git a/pcireg/PCIREG.EXE b/pcireg/PCIREG.EXE index 631b28780715e0f33946a430c8a675d5b150f3c3..7d01996a98b39e882a1f55f8cfd2d633361e8e0f 100644 GIT binary patch delta 6239 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 delta 6239 zcmZu$3w#q**1va>rfHI<(+8zZpA;-$p(KJl`oMxXh>w~UDbR(qid)6^wn?g3nqZ)0 zG8B<!Fk-rDcm3(Purq1l^%ZA4kR;vq{TgzAJ^kyayw?r;!TrU#I%YLgoN{ zsEGe#I^78aWs?8buzm<1@y?(J=-%ZOw(>SBXU4ofWr>2jrZ*jXF4TLA>)cg!L9gxU z4(dj!#d|Gm@lAKO13t1bfN-O_v zx~E;|{&xe)b*O}=h#Lkzs?L1I%1uL7{;#qLR|nFoAQ8TX22@aMFE4o9t}b}Uv7(cz zo(H~4I5$|-f`!@>)uQ%Xk8$1Yxz4_U)9!vOT|B@{w?=oUGkxj;okQohMsqqOo)Z(? z#>LU3q$!P-G}dTwoA{8>i~#UX1&{&27zMC}knv83@uF2f$77qd$r<9iu*j+`+6;?6 zOoJ%q$V=vXu4^6V*){snWG3RbrHP;42t;0Zo4B2uO>XEh&gT6q-1T(@HPLU)CG)B3 zx(E&shQyiQbwj&I`}#V0NPF=E_Pd_Zm34Efr$#q@F>@d`!6)dyKbR zzKSN8%#tU=+6CV3aWMs2$DDv>akSbI%_Npb=OmU!dj@f>UOr&hZ~ToA;NayDqVjBY zHPbDJE&JJHs^p?Z#O(&uZ7HxX!Hu{!BwpseL}IV(Q4a}o-9KP>v8v?+$+T2m@&^r7 z7nprjEj;-m-9hi8``L-=v91#C7+}l=42_skQpTM{VxO0Xh`sx)-af1Mkd^BLgE3&B zlW}3`=1Ph7Jt(=`)Pc4byGl40^3*?r>he*2)yjBWl3E>d}GQd!i>1%jQk`G*m zg|$dgMf(~aRaCI@Pe`c1iuRhXVWnhtfn@;}mkE23_%P^mYerJ1>jVsm8m%8PDMBbF zEQh07?QPs5*k7W&zd$RtlhP-Z688Y8RG?CeI<5-jYstzq0n^S6++(0Q3mUaBhu~_k zFinorJmSXHtoTvaM96-^PL^@c!J2=BQ4}W+hMl}2!wfrNN1S{hIX8-105hs)tgqn_ zWuxn{$OIamlw1zdNBz&*X1l&XvPa4u)Zz-uVIQ>>bWxy-a1B2wT_<373%EDIao&jI z1Xw#RMn20AKs|QY`A(2Wk2sG7DA^>U2tkTtVU)!E8w(3Dw+{>V%I9pXz3SWeq~t#7 zQj({&Yp`q3b3Va)$bB6<9&iu35}eE2gPHc*-Giz2o85y+j?Z9KTFs}vhSkz8^^pOq zub~e11Oj&)JindhglAB)A8nl1*EP^JAYZP|eJWUL3^Xn@hI8ipx*g(==b zg9E6|mqIsuTq!N#mJq^JiF=B$y7(_gL$+A&J1SwmsHQEnJq9V}Z0b87!40u=m;p=7#a zU9)5K$YK@@3gpF*7(yndTcF?h5pHa#l=wfH3NfmQrTh3@sbTvbZU-TL35qwv3P+g? z`oF0WqYzD1TlVJ{SFfg&lBz}gmBf*fstwmO{Tz`KUV^$0W~|wmEEoBAZx{_1JuMjh zWC1YCZdeS%xMYjw#;ST@t6J`P{7`JT&3bw>y;O)UJLRPzN=Dgzr=x z5lC`gl$_^$wn4MB&{sBK4wU++keA}U^@8N&xxH`{dq#QM4ZF37p?H2}EZy~c71gDb zRO%{Sd}dt$?)npCIlRXJ+k$hs7ORi~zYcM^BtIAj2Ux9rD;Jv7x$3jwZ$|}_K8<9I z(@C&D`UBlYx6%WAe2Tw^fNy;Y-ObNPVbW8qyZA>;OnM$HEs%jnjR2RL`~o4q?xTKy8sekm&si%c5>^N% z!-NN{d{F{)6&S^un8dl{#8&#yZ)9L2$h&q7=h|^;ln^CF}_fZRvRJd zCubr&;5VxH<2j~b>v)w6{aLaMeJ&mf#bRE9FM0DjlOvK)zGg04uTN9=$BQO5Q)Oaz z>-D31k^NeSCW=&bX!IoVYe|ko{L3cxm_BP%-)a?2^?B<1kiB$xrqU#*b3_y3ABbmj z4cTO0$QVP4+lQx(%Cx!-@iDB+Fw4ayyX%9u0DF{21e}GB9N5^-_WDE_>j#lzY=|0g*AHaWYC5PvB&G@L zfywnDD6}xC2~YvI{r^MMAPggGzxwS?ydxe*9ERD3D@-@2b9C`V`T(?;my|MCC`oo7 zL!E-cqY`!v(Jfsk7tja&nFwy`?@9C!KG->5YHshC4>jn|Lk!ickmyzdnoI)XmqagF zSTaJ;)$oLKNX=BWWV z&gc@Z9YEfXVOPfFxvCT0v!lqRjzT7KR!hwcy2Z+!g4rc8&;UHw2dhagMs4L6z)&go z?}xaXU_476ds+x63sXi3k4kSwkuqJ7pT}F&!sAl-#Q0|xZF1L#W;$j<$F&VGkw!spBPX{Sp5FW>h_F;D&M$XAl zW-Z5n-8S>px?i1L$Z(+$X&gH4afok=5#oa-*qN&=0bT=ZX8(3g>V-nJyl6Wts*)G& zLD+J*v7tZ2yGF6ElG)3GaIIY@x=!R!LHY`A^HmULi9YUqtv@7DK~H^9UH6?FY5VRM zVn+HPEM7CJlL{at>Le<#rapjhjgD~!-2VO$viE|I99w|41=*C?6c-mQA2k3uBRZ*| z8a4iX8SU;Eqp zpeDkKnR3;@yQ<9#N=L z!|+~>IJyvFkjmLNk7%BJhVbb)LtNQip{1_gTdjrb&27U;B)pTilE9~ZvVC_wbo z2h=so0XLi*0VOx)6EfN!0N{0i2G@yz7W~4bILK6}j)qoK)@$zeQWw03yk&jnLtg5#(sM3$ zP?r!>+|Ss0nX*2Hy2w8f0mbqgnhMZmSN8-B45j6l#>jj{S4beI9{MgY=~yhdT&R%( ze%+$6N=_~B1cs!Moc)rsS910NrSeho>m%0z2lYS{ltZ5_e$==efVY>N{XH2^qu`U;R0)gjks3^K{RRH+Lnh zBsna_c*QTQ>7Jk7>R}Vb=Y2L&rn9#5@Dbp{FH~B~IdJ%Oq^CX3(k%QT5d5<#E@`vr z1=AYSb0!gF-gMS<+;q@n-s!67T@I@9( zhQ|FZDwtxw&ZTOt{1bpoC~qh$6lomjmMYRTknX!Ndxs*e0bRZ#y$F)!#_V`S>H%FE zNG^iYL|OUx8`DvWlnpvbBfDDy(hrIxzZ!{(v&z{DnPee zkv;hwR-`ig5+IWy-_&b(Szs#uHhyIeE-S zI=Gz@`v2&*k8k^8O!DD%hwF%?ZG2?L(l(jN@o=DK4?e?QG~a};vI&;KCi0e#RJeg{ zzV%*wD{Gvdh>O^prc?Mj`}lMdE@#(IPs8uC?@XVA*RkJEpBh)f%dFP%IdBqgi+)3o zaEhHYqX0k1uAFf(>C82{11MsrT93ptKm$IWEyuur(e%{JZ5ZFeCgeSs^#lBl2Pu$b zIV`rw^!03bto5U!#$^Wa@BB9QmAqoSi2XjV8lPgz^Y6luP4DD?OkzD-e$QAU{&UuK z&mB0Q{p_Bl_+(SYy;T^WV;hP$;HhlO{ra5_xlh8Q~WE0Vv&u3lD#tDC-B#$#O4^e@{PjGt?IyYhKr+WfsV6@n;;4o_xi*)bwBEq}bNv(3E-$~lytSgW0{%xJ)0rawC8on)oK!5!o@Mgi O 0) { /* Assume device 00 is the northbridge if it has a host bridge class. */ if (entry->dev > 0x00) { - cf8 = pci_cf8(0x00, 0x00, 0, 0x08); - outl(0xcf8, cf8); - dev_class = inw(0xcfe); + dev_class = pci_readw(0x00, 0x00, 0, 0x0a); if (dev_class == 0x0600) printf("pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 1, 2, 3, 4);\n"); } /* Assume device 01 is the AGP bridge if it has a PCI bridge class. */ if (entry->dev > 0x01) { - cf8 = pci_cf8(0x00, 0x01, 0, 0x08); - outl(0xcf8, cf8); - dev_class = inw(0xcfe); + dev_class = pci_readw(0x00, 0x01, 0, 0x0a); if (dev_class == 0x0604) printf("pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4);\n"); } @@ -949,9 +927,7 @@ retry_buf: printf("NORTHBRIDGE,"); } else { /* Read device class. */ - cf8 = pci_cf8(0x00, entry->dev, 0, 0x08); - outl(0xcf8, cf8); - dev_class = inw(0xcfe); + dev_class = pci_readw(0x00, 0x00, 0, 0x0a); /* Determine slot type by location and class. */ if ((entry->dev == 1) && (dev_class == 0x0604)) { @@ -1026,11 +1002,9 @@ int write_reg(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, char *val) { uint16_t data_port; - uint32_t cf8; multi_t reg_val; /* Write a byte, word or dword depending on the input value's length. */ - cf8 = pci_cf8(bus, dev, func, reg); data_port = 0xcfc; switch (strlen(val)) { case 1: @@ -1044,15 +1018,15 @@ write_reg(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, char *val) bus, dev, func, reg); /* Write byte value to register. */ - data_port |= reg & 3; - outl(0xcf8, cf8); - outb(data_port, reg_val.u8[0]); + pci_writeb(bus, dev, func, reg, reg_val.u8[0]); printf("Written!\n"); /* Read the register's byte value back. */ -#ifndef DEBUG - outl(0xcf8, cf8); - reg_val.u8[0] = inb(data_port); +#ifdef DEBUG + reg_val.u32 = pci_cf8(bus, dev, func, reg); + reg_val.u8[0] = reg_val.u8[reg & 3]; +#else + reg_val.u8[0] = pci_readb(bus, dev, func, reg); #endif printf("Readback: %02X\n", reg_val.u8[0]); @@ -1069,15 +1043,15 @@ write_reg(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, char *val) bus, dev, func, reg | 1, reg & 0xfe); /* Write word value to register. */ - data_port |= reg & 2; - outl(0xcf8, cf8); - outw(data_port, reg_val.u16[0]); + pci_writew(bus, dev, func, reg, reg_val.u16[0]); printf("Written!\n"); /* Read the register's word value back. */ -#ifndef DEBUG - outl(0xcf8, cf8); - reg_val.u16[0] = inw(data_port); +#ifdef DEBUG + reg_val.u32 = pci_cf8(bus, dev, func, reg); + reg_val.u16[0] = reg_val.u16[(reg >> 1) & 1]; +#else + reg_val.u16[0] = pci_readw(bus, dev, func, reg); #endif printf("Readback: %04X / %02X %02X\n", reg_val.u16[0], @@ -1095,14 +1069,14 @@ write_reg(uint8_t bus, uint8_t dev, uint8_t func, uint8_t reg, char *val) bus, dev, func, reg | 3, reg & 0xfc); /* Write dword value to register. */ - outl(0xcf8, cf8); - outl(data_port, reg_val.u32); + pci_writel(bus, dev, func, reg, reg_val.u32); printf("Written!\n"); /* Read the register's dword value back. */ -#ifndef DEBUG - outl(0xcf8, cf8); - reg_val.u32 = inl(data_port); +#ifdef DEBUG + reg_val.u32 = pci_cf8(bus, dev, func, reg); +#else + reg_val.u32 = pci_readl(bus, dev, func, reg); #endif printf("Readback: %04X%04X / %04X %04X / %02X %02X %02X %02X\n", reg_val.u16[1], reg_val.u16[0],