diff --git a/src/sys_support.c b/src/sys_support.c index 967d90a..db1d133 100644 --- a/src/sys_support.c +++ b/src/sys_support.c @@ -17,30 +17,54 @@ #define LOG(s) log("SS", s) #define LOGi(s, i) logi("SS", s, i) +/** + * @brief Gestore delle systemcall a livello supporto + * @param act_proc_sup struttura di supporto del processo attivo + * */ static void support_syscall_handler(support_t* act_proc_sup); +/** + * @brief Systemcall GET TOD (SYS1). Restituisce il valore di microsecondi dall'avvio del sistema + * @return valore in microsecondi dall'avvio del sistema + * */ +static unsigned int get_TOD(void); +/** + * @brief Systemcall TERMINATE (SYS2). Termina il processo chiamante attraverso la NSYS2 + * */ +static void terminate(void); +/** + * @brief Systemcall WRITE TO PRINTER (SYS3). Scrive sulla stampante corrispettiva una stringa passata come parametro + * @param virtAddr indirizzo virtuale del primo carattere da stampare + * @param len lunghezza della stringa da stampare + * @param asid id del processo + * @return Numero di caratteri stampati se ha successo, altrimenti status con segno negativo. + * */ +static int write_to_printer(unsigned int virtAddr, int len, unsigned int asid); +/** + * @brief Systemcall WRITE TO TERMINAL (SYS4). Scrive sul terminale corrispettivo una stringa passata come parametro + * @param virtAddr indirizzo virtuale del primo carattere da stampare + * @param len lunghezza della stringa da stampare + * @param asid id del processo + * @return Numero di caratteri stampati se ha successo, altrimenti status con segno negativo. + * */ +static int write_to_terminal(unsigned int virtAddr, int len, unsigned int asid); +/** + * @brief Systemcall READ FROM TERMINAL (SYS5). Legge un input dal terminale e lo salva in memoria + * @param virtAddr indirizzo virtuale del buffer dove salvare i caratteri ricevuti + * @param asid id del processo + * @return Numero di caratteri ricevuti se ha successo, altrimenti status con segno negativo. + * */ +static int read_from_terminal(unsigned int virtAddr, unsigned int asid); -/* -unsigned int retValue = SYSCALL (GETTOD, 0, 0, 0); -GETTOD=1 -*/ inline unsigned int get_TOD(void){ unsigned int ret; STCK(ret); return ret; } -/* -SYSCALL (TERMINATE, 0, 0, 0); -TERMINATE=2 -*/ inline void terminate(void){ SYSCALL(TERMPROCESS, act_proc->p_pid, 0, 0); } -/* -int retValue = SYSCALL (WRITEPRINTER, char *virtAddr, int len, 0); -WRITEPRINTER=3 -*/ inline int write_to_printer(unsigned int virtAddr, int len, unsigned int asid){ if(len > 128 || len < 0 || virtAddr < KUSEG){ return SYSCALL(TERMINATE,0,0,0); @@ -59,20 +83,8 @@ inline int write_to_printer(unsigned int virtAddr, int len, unsigned int asid){ return -dev_reg->status; } return i; - - - //sospende il processo chiamante fino alla fine della trasmissione al printer associato al processo - //PARAMETRI: indirizzo virtuale del primo carattere della stringa da trasmettere + lunghezza della stringa - //RETURN: restituisce il numero di caratteri trasmessi (se ha avuto successo), altrimenti (status diverso da 1, device ready) return dello status del device con segno cambiato - //l'handler dovrà prendere il valore restituito da questa funzione e piazzarlo nel registro v0 di U-proc - //ERRORI: se è chiamato da un indirizzo fuori dallo spazio logico di indirizzi, o con una lunghezza > 128, o con una lunghezza < 0: ammazza il processo (SYS2) - } -/* -int retValue = SYSCALL (WRITETERMINAL, char *virtAddr, int len, 0); -WRITETERMINAL=4 -*/ inline int write_to_terminal(unsigned int virtAddr, int len, unsigned int asid){ if(len > 128 || len < 0 || virtAddr < KUSEG){ return SYSCALL(TERMINATE,0,0,0); @@ -90,26 +102,9 @@ inline int write_to_terminal(unsigned int virtAddr, int len, unsigned int asid){ return -dev_reg->transm_status; } return i; - - //sospende il processo chiamante fino alla fine della trasmissione al terminale associato al processo - //PARAMETRI: indirizzo virtuale del primo carattere della stringa da trasmettere + lunghezza della stringa - //RETURN: restituisce il numero di caratteri trasmessi (se ha avuto successo), altrimenti (status diverso da 5, character transmitted) return dello status del device con segno cambiato - //l'handler dovrà prendere il valore restituito da questa funzione e piazzarlo nel registro v0 di U-proc - //ERRORI: se è chiamato da un indirizzo fuori dallo spazio logico di indirizzi, o con una lunghezza > 128, o con una lunghezza < 0: ammazza il processo (SYS2) - } -/* -int retValue = SYSCALL (READTERMINAL, char *virtAddr, 0, 0); -READTERMINAL=5 -*/ -inline int read_from_terminal(unsigned int virtAddr, unsigned int asid){ //yonas - //sospende il processo chiamante fino a che una linea di input (stringa) è stata trasmessa dal terminale associato al processo - //PARAMETRI: indirizzo virtuale di un buffer stringa dove devono essere inseriti i caratteri ricevuti - //RETURN: restituisce il numero di caratteri trasmessi (se ha avuto successo), altrimenti (status diverso da 5, chatacter received) return dello status del device con segno cambiato - //l'handler dovrà prendere il valore restituito da questa funzione e piazzarlo nel registro v0 di U-proc - //NB: i caratteri ricevuti vanno inseriti nel buffer a partire dall'indirizzo ricevuto come parametro in a1 - //ERRORI: se l'indirizzo è fuori dallo spazio logico degli indirizzi del processo: ammazza il processo (SYS2) +inline int read_from_terminal(unsigned int virtAddr, unsigned int asid){ termreg_t * dev_reg = (termreg_t*) DEV_REG_ADDR(IL_TERMINAL, asid-1); unsigned int charnstatus; unsigned int status; @@ -131,7 +126,7 @@ inline int read_from_terminal(unsigned int virtAddr, unsigned int asid){ // void support_exec_handler(void){ support_t* act_proc_sup = (support_t*)SYSCALL(GETSUPPORTPTR,0,0,0); if(act_proc_sup == NULL){ - //LOG("Error on get support"); + LOG("Error on get support"); return; //TODO gestire l'errore meglio } unsigned int cause = CAUSE_GET_EXCCODE(act_proc_sup->sup_exceptState[GENERALEXCEPT].cause); @@ -142,8 +137,8 @@ void support_exec_handler(void){ } - //se exc è syscall > 0 - //support_syscall_handler(act_proc_sup) / se è = 0 ci entra lo stesso probabilmente e va nel caso default + //se exc è syscall + //support_syscall_handler(act_proc_sup) //altrimenti se exc è trap //support_trap_handler() } @@ -206,7 +201,7 @@ void support_trap_handler(support_t* act_proc_sup){ insert_blocked(&swp_pl_sem, tmp); //se il processo tiene mutua esclusione su un semaforo mutex del livello supporto (es. swap pool sem) - //rilascia la risorsa (NSYS4 / verhogen?) - //ammazza il processo (SYS2) + //rilascia la risorsa (NSYS4 / verhogen?) SYSCALL(VERHOGEN,&swp_pl_sem); + //termina il processo (SYS2) SYSCALL(TERMINATE,0,0,0); } diff --git a/src/sys_support.h b/src/sys_support.h index 7cda57c..de3d534 100644 --- a/src/sys_support.h +++ b/src/sys_support.h @@ -4,18 +4,15 @@ #include "pandos_types.h" -/* TODO fare static */ -extern unsigned int get_TOD(void); -extern void terminate(void); -extern int write_to_printer(unsigned int virtAddr, int len, unsigned int asid); -extern int write_to_terminal(unsigned int virtAddr, int len, unsigned int asid); -extern int read_from_terminal(unsigned int virtAddr, unsigned int asid); - - - - +/** + * @brief Gestore per le trap a livello supporto + * @param act_proc_sup struttura di supporto del processo attivo + * */ extern void support_trap_handler(support_t* act_proc_sup); +/** + * @brief Handler generale per il livello supporto. Gestisce la divisione tra syscall e trap +*/ extern void support_exec_handler(void); #endif