[OSy] TLB exception?

Ondrej Palkovsky ondrap at penguin.cz
Sun Nov 7 14:21:43 CET 2004


Prochazel jsem si pro jistotu handling TLB exception, a narazil jsem na
zajimave chovani. Pokud jsem z manualu dobre pochopil, tak pri pristupu
na adresu, ktera neni v TLB se vyvola bud TLB refill - pokud neni v
registrech, nebo TLB invalid - pokud stranka v TLB je, ale neni oznacena
jako valid.
Exception TLB refill ma entry point na adrese 0x0, pokud je EXL bit
nastaven, pak ho ma na adrese 0x180 (general exception handler). Bohuzel
kernely, ktere mam, tak ho prekvapive volaji na adrese 0x180, prestoze
EXL bit je nastaven na 0.
Problem se da demonstrovat nasledujicim kodem v example.c v originalnim
kernelu:
void example( void)
{
	write_cp0_status( read_cp0_status() & ~cp0_status_ie_mask);
	init_tlb();
	write_cp0_status( read_cp0_status() | cp0_status_ie_mask);
	___traceon();
	i = *((unsigned int *)0x10);
	___traceoff();
	/* Donutit optimalizator, aby predchozi prirazeni nezmizelo */
	if (i) i =1 else i =2;
	sem_init(&mysem, i);
}
Vygeneruje s -O2:
800013DC    lw    a1, 0x10(0)       
Raised exception: TLB (load or instruction fetch)
80000180    j     +0x318

A s -O:
80001B14    lw    v0, 0x10(0)
Raised exception: TLB (load or instruction fetch)
80000000    j     +0x4c4

Co je spatne?

-- 




More information about the NSWI004 mailing list