/*************************************************************************
* *
* 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();
}