init.c


/*************************************************************************
*                                                                        *
*   Modulo di inizializzazione del nucleo                                *
*                                                                        *
*   realizzato dal Gruppo 17 di Lab2 Anno Accademico 1995/96             *
*                                                                        *
*   Lorenzo     Claudio       Valerio    Riccardo    Emiliano            *
*   Coronati    Lanconelli    Paolini    Solmi       Trentini            *
*                                                                        *
**************************************************************************/

#include "../h/types.h"
#include "../h/const.h"
#include "../h/proctree.h"
#include "../h/thrqueue.h"
#include "../h/nucconst.h"

#include "../h/ssi.e"
#include "../h/trap.e"
#include "../h/intrpt.e"
#include "../h/scheduler.e"
#include "../h/globals.e"

extern int test();

#define init_state  (wait_thread.t_s)   /* per risparmiare memoria! */

main()
{
    register state_t *sts;
    register int i;

    /*
     * calcola i valori iniziali per i registri SP e STL utilizzati dai
     * gestori delle trap e degli interrupt
     */
    STST(&init_state);
    init_state.s_sp = init_state.s_stl + PAGESIZE;
    init_state.s_stl = init_state.s_sp - (NUCSTKSIZE * PAGESIZE);

#ifdef  NUC_DEBUG
    nuc_stl = init_state.s_stl;
#endif

    /* inizializza stati e puntatori area trap */
    sts = (state_t *) BEGINTRAP;
    for (i = 0; i < TRAPTYPES; i++)
    {
        MOVBCK(&init_state, ++sts, sizeof(state_t));
        sts->s_r[3] = i;/* tipo di trap */
        sts->s_r[4] = (int) (sts - 1);   /* indirizzo area old */
        sts++;
    }

    trap_area[PROGTRAP].new.s_pc = (unsigned) passup;
    trap_area[MMTRAP].new.s_pc = (unsigned) passup;
    trap_area[SYSTRAP].new.s_pc = (unsigned) onSys;

    /* inizializza stati e puntatori area interrupt */
    sts = (state_t *) BEGININTR;
    for (i = 0; i < MAXPRIO; i++)
    {
        MOVBCK(&init_state, ++sts, sizeof(state_t));
        sts->s_r[3] = i;/* tipo interrupt */
        sts->s_r[4] = (int) (sts - 1);   /* indirizzo area old */
        sts++;
    }
    intr_area[0].new.s_pc = (unsigned) onDevIO;
    intr_area[1].new.s_pc = (unsigned) onDevIO;
    intr_area[2].new.s_pc = (unsigned) onDevIO;
    intr_area[3].new.s_pc = (unsigned) onDevIO;
    intr_area[4].new.s_pc = (unsigned) onBadIO;
    intr_area[5].new.s_pc = (unsigned) onClock;
    intr_area[6].new.s_pc = (unsigned) onBadIO;
    intr_area[7].new.s_pc = (unsigned) onBadIO;

    /* inizializza strutture dati del nucleo */
    initMessage();
    initThread();
    initProc();

    /* inizializza processo S.S.I. */
    STST(&init_state);
    init_state.s_pc = (unsigned) ssi_main;
    init_state.s_sp = init_state.s_stl;
    init_state.s_stl = init_state.s_sp - (SSISTKSIZE * PAGESIZE);
    init_state.s_ps1.ps_int = 0;
    SSI = createProc(NULL, &init_state);

    /* inizializza il processo test */
    init_state.s_pc = (unsigned) test;
    init_state.s_sp = init_state.s_stl;
    init_state.s_stl = init_state.s_sp - (TSTSTKSIZE * PAGESIZE);
    createProc(SSI, &init_state);

    /* inizializza il thread "vuoto" */
    STST(&wait_thread.t_s);
    wait_thread.t_s.s_ps1.ps_int = 0;
    wait_thread.t_s.s_ps1.ps_w = TRUE;

    next_clock = CLOCKINTERVAL;
    schedule();
    NEWSTATE();
    LOADTIMER();

#ifdef  NUC_PROFILE
    ini_time = last_start;
#endif

    DISPATCH();
}


[INDICE CODICE]