[OSy] Dorder a meziproc. interrupty

Martin Decky decky at dsrg.mff.cuni.cz
Wed Feb 18 13:59:22 CET 2009


Hezky den,

> Setting any bit causes an interrupt pending on the processor specified
> by the bit index. Writing a command with the most significant bit set
> causes to deassert all interrupt endings.

Bohuzel tato cast dokumentace se tyka chovani MSIMu rady 1.2.x, verze
MSIMu, ktere mate k dispozici od zacatku semestru, pouzivaji
modifikovane chovani, ktere popisujete dale.

Tedy pokud zapisete 4bytovou hodnotu na adresu DORDER_ADDRESS, vyvola se
preruseni na tech procesorech, ktere maji v bitove masce na prislusne
pozici jednicku. Pri zapisu hodnoty 0xffffffff se tedy vyvola preruseni
na vsech procesorech.

Jedna se o level-triggered preruseni, tedy priznak vyvolani preruseni
trva do te doby, nez je zrusen. K shozeni priznaku je potreba zapsat
bitovou masku na adresu (DORDER_ADDRESS + 4). Preruseni se zrusi pro ty
procesory, ktere maji v masce nastavenou jednicku.

> tak se mi obsluha na danem procesoru zacykli a preruseni se nemohu zbavit...

Problem muze mit ruznou pricinu. Bud se Vam nepovede spravne priznak
preruseni pro prislusny procesor shodit, takze po opusteni obsluhy
preruseni je stale priznak nastaven a okamzite znovu dojde k vykonani
obsluhy preruseni. Nebo v obsluze preruseni povolite zpracovani
preruseni drive nez dojde ke shozeni priznaku, takze opet dojde okamzite
k vnorenemu preruseni.

Myslim, ze obe situace lze pri trose trpelivosti oddebugovat. Staci pri
prvnim vyvolani preruseni krokovat obsluhu preruseni az do jejiho
ukonceni a vydumpovanim CP0 registru Cause zjistit, zda byl priznak
preruseni korektne shozen (pripadne zda nedoslo k nevhodnemu vnorenemu
zpracovani tehoz preruseni).

> A na konec, obcas se mi v pristupu na nezname misto v pameti stalo, ze
> nastala vyjimka s neznamym parametrem v cause registru = hodnota 30,
> ktera podle specifikace je reserved. Je to normalni chovani
> simulatoru, popr. znamena to v pripade msimu neco, nebo je to jen
> "border" bez vyznamu, co se nacetl na nahodnem miste v pameti?

Mozna by ty okolnosti chtelo popsat trochu presneji ..

Hodnota 30 (decimalne) by skutecne v Cause registru nikdy byt nemela,
protoze dva nejspodnejsi bity Cause registru musi byt vzdy nulove.

Prosel jsem dukladne zdrojaky MSIMu a neprijde mi, ze by se ty dva bity
kdekoliv nastavovaly. Pokud by se Vam podarilo vytvorit nejaky test
case, kdy to nastava, jiste to radi dukladne otestujeme.

Pokud mate na mysli hodnotu 0x30 (hexadecimalne), potom je v polozce
ExcCode registru Cause hodnota 12 (dec), coz je Arithmetic Overflow.

Prosel jsem kod MSIMu i pro tu eventualitu, kdy mate snad na mysli, ze
hodnota 30 (dec) je primo v polozce ExcCode, ale take mi prijde, ze tato
eventualita nemuze nastat.


M.D.




More information about the NSWI004 mailing list