Skip to content
This repository has been archived by the owner on Sep 19, 2022. It is now read-only.

Commit

Permalink
codice pulito
Browse files Browse the repository at this point in the history
  • Loading branch information
crestaa committed Jul 17, 2022
1 parent ec47c04 commit fddc83d
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 57 deletions.
89 changes: 42 additions & 47 deletions src/sys_support.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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()
}
Expand Down Expand Up @@ -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);
}
17 changes: 7 additions & 10 deletions src/sys_support.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit fddc83d

Please sign in to comment.