[OSy] Patch pro SYSCALL v Sirius(NanOS) kernelu
Jiří Tlach
jiri.tlach at centrum.cz
Mon Dec 18 20:50:50 CET 2006
Dobry vecer,
pro vsechny, kteri hodlaji pouzit pro svou 3. semestralku kernel NanOS,
ktery je zalozen na kernelu Sirius, tu mam jeden maly patch tykajici se
SYSCALLu. Protoze v Siriovi nebyla potreba ani predpoklad toho, ze by
se vlakno pri obsluze vyjimky (coz SYSCALL je) mohlo zablokovat, nebyla
tam tato funkcionalita podporovana. To vsak muze zpusobit znacne
problemy pri implementaci 3. semestralky, kde se kernel funkce volaji
z uzivatelskeho procesu pres SYSCALL a nektere z techto funkci
(getc(), mutex_lock(), ..) mohou navic blokovat.
Proto posilam v priloze patch, ktery tuto situaci osetruje - v ramci
oblushy SYSCALLu tedy bude mozne volat blokujici funkce.
S pozdravem
Jiri Tlach
-------------- next part --------------
oprava v arch/sys.S
-------------------
V asm rutine handle_general_exception v arch/sys.S je nutne misto
techto instrukci
jal kstack_alloc
nop
napsat tento kod
/*
* If the exception is SYSCALL, then we will not use
* kernel stack. Instead, we will use the stack of the
* interrupted thread.
*/
lw $v1, OFFSET_SAFE_CAUSE($v0)
ori $v0, 0x20
and $v1, $v1, $v0
beq $v0, $v1, skip_kstack_alloc
nop
/*
* Now we allocate one kernel stack level for the exception handling.
*/
jal kstack_alloc
nop
skip_kstack_alloc:
oprava v arch/exc.c
-------------------
V ramci obsluhy syscallu v arch/exc.c ve funkci exception() v bloku
'case EXC_SYS:' je nutne napsat nasledujici kod. (Pripadne je mozne
provest kontrolu, zda je syscall v branch delay slotu a pokud ano tak
zavolat kernel panic):
case EXC_SYS:
{
void *old_sp;
old_sp = current_thread->stack_top;
syscall ();
current_thread->stack_top = old_sp;
cxt->epc += 4;
do_restore_cpu_context (&(current_thread->stack_top));
}
Vysvetleni: Patch zpusobi, ze v ramci obsluhy SYSCALL vyjimky se uz
nepouziva kernel zasobnik jak tomu bylo doposud, nybrz zasobnik vlakna,
ktere SYSCALL zavolalo. To pak umoznuje bez potizi prerusit beh vlakna
i v okamziku, kdy se nachazi v kernelu v obsluze SYSCALL vyjimky.
Tzn. ze pri teto obsluze uz je mozne volat i blokujici funkce.
More information about the NSWI004
mailing list