[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