diff --git a/src/pandos_const.h b/src/pandos_const.h index d1348e7..39d533d 100644 --- a/src/pandos_const.h +++ b/src/pandos_const.h @@ -111,6 +111,7 @@ #define OKCHARTRANS 5 #define TRANSMITCHAR 2 + #define SEEKTOCYL 2 #define DISKREAD 3 #define DISKWRITE 4 diff --git a/src/sys_support.c b/src/sys_support.c index 50a59e7..967d90a 100644 --- a/src/sys_support.c +++ b/src/sys_support.c @@ -11,9 +11,8 @@ #include #include #include "pandos_const.h" +#include "vm_support.h" -/* TODO Trovare altrernativa */ -#define PRINTCHR 2 #define LOG(s) log("SS", s) #define LOGi(s, i) logi("SS", s, i) @@ -25,21 +24,9 @@ unsigned int retValue = SYSCALL (GETTOD, 0, 0, 0); GETTOD=1 */ inline unsigned int get_TOD(void){ - //l'handler dovrà prendere il valore restituito da questa funzione e piazzarlo nel registro v0 di U-proc unsigned int ret; STCK(ret); return ret; - - /* - Access to the TOD clock value can be accomplished either of the following - ways: - • Direct access to the Bus Register memory location: 0x1000.001C - • Appendix C contains a listing of the µMPS3 System-wide constants file - contst.h. Included in this file is a pre-defined macro STCK(T) which takes - an unsigned integer as its input parameter and populates it with the value of - the low-order word of the TOD clock divided by the Time Scale. [Section - 4.1.1] - */ } /* @@ -47,7 +34,6 @@ SYSCALL (TERMINATE, 0, 0, 0); TERMINATE=2 */ inline void terminate(void){ - //spara al processo utente che l'ha chiamato SYSCALL(TERMPROCESS, act_proc->p_pid, 0, 0); } @@ -55,27 +41,24 @@ inline void terminate(void){ int retValue = SYSCALL (WRITEPRINTER, char *virtAddr, int len, 0); WRITEPRINTER=3 */ -inline int write_to_printer(unsigned int virtAddr, int len, unsigned int asid){ //cresta - //USARE REGISTRO COMMAND DA QUALCHE PARTE +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); + } - //ogni device di tipo printer ha un campo status (qua devo farlo funzionare solo se lo status è 1, altrimenti restituisco -status) - //operazione di stampa avviata caricando il campo command - dtpreg_t * dev_reg = (dtpreg_t*)DEV_REG_ADDR(IL_PRINTER,asid-1); //sup_asid è l'id del processo, associazione 1:1 tra processi e devices + dtpreg_t * dev_reg = (dtpreg_t*)DEV_REG_ADDR(IL_PRINTER,asid-1); //asid è l'id del processo, associazione 1:1 tra processi e devices //ciclo che scorre tutta la stringa, inserisce su dev_reg.data0 il carattere attuale, chiama la syscall e poi riesegue - //int iostatus = SYSCALL(DOIO,(int *)dev_reg.command, PRINTCHR, 0); - //se iostatus != 1 restituire -iostatus int i; for(i=0; idata0 = virtAddr+i; //carico il carattere da trasmettere sul campoi data0, data1 non viene usato - if(*((char*)(virtAddr+i)) == '\0'){ + dev_reg->data0 = virtAddr+i; //carico il carattere da trasmettere sul campo data0, data1 non viene usato + if(*((char*)(virtAddr+i)) == '\0'){ //fine stringa break; } - SYSCALL(DOIO, (int)&dev_reg->command, PRINTCHR, 0); + SYSCALL(DOIO, (int)&dev_reg->command, TRANSMITCHAR, 0); if(dev_reg->status != READY) return -dev_reg->status; } return i; - //TODO bloccare processo chiamante durante la trasmissione //sospende il processo chiamante fino alla fine della trasmissione al printer associato al processo @@ -90,8 +73,12 @@ inline int write_to_printer(unsigned int virtAddr, int len, unsigned int asid){ int retValue = SYSCALL (WRITETERMINAL, char *virtAddr, int len, 0); WRITETERMINAL=4 */ -inline int write_to_terminal(unsigned int virtAddr, int len, unsigned int asid){ //cresta - termreg_t * dev_reg = (termreg_t*)DEV_REG_ADDR(IL_TERMINAL,asid-1); //sup_asid è l'id del processo, associazione 1:1 tra processi e devices +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); + } + + termreg_t * dev_reg = (termreg_t*)DEV_REG_ADDR(IL_TERMINAL,asid-1); //asid è l'id del processo, associazione 1:1 tra processi e devices int i; for(i=0; itransm_command = virtAddr+i; //carico il carattere da trasmettere sul campo data0, data1 non viene usato @@ -103,7 +90,6 @@ inline int write_to_terminal(unsigned int virtAddr, int len, unsigned int asid){ return -dev_reg->transm_status; } return i; - //TODO bloccare processo chiamante durante la trasmissione //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 @@ -144,6 +130,10 @@ 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"); + return; //TODO gestire l'errore meglio + } unsigned int cause = CAUSE_GET_EXCCODE(act_proc_sup->sup_exceptState[GENERALEXCEPT].cause); if(cause == EXC_SYS){ support_syscall_handler(act_proc_sup); @@ -161,23 +151,18 @@ void support_exec_handler(void){ void support_syscall_handler(support_t* act_proc_sup){ - unsigned int arg1, arg2, arg3; /* FIXEM sicuri che arg3 non venga mai usato ????*/ - - if(act_proc_sup == NULL){ //TODO forse questo controllo va tolto / va messo nel support_handler() perchè viene già fatto a priori dalla passup or die quindi è ridondante - //LOG("Error on get support"); - return; //TODO gestire l'errore meglio - } + unsigned int arg1, arg2; int number = CAUSE_GET_EXCCODE(act_proc_sup->sup_exceptState[GENERALEXCEPT].cause); arg1 = act_proc_sup->sup_exceptState[1].reg_a1; arg2 = act_proc_sup->sup_exceptState[1].reg_a2; - arg3 = act_proc_sup->sup_exceptState[1].reg_a3; int ret=-2147483648; //uso MININT per evitare conflitti con i valori di ritorno che possono essere numeri negativi, 0 e positivi switch(number){ case GETTOD:{ ret=get_TOD(); + break; } case TERMINATE:{ terminate(); @@ -185,12 +170,15 @@ void support_syscall_handler(support_t* act_proc_sup){ } case WRITEPRINTER:{ ret=write_to_printer(arg1, arg2, act_proc_sup->sup_asid); + break; } case WRITETERMINAL:{ ret=write_to_terminal(arg1, arg2, act_proc_sup->sup_asid); + break; } case READTERMINAL:{ ret=read_from_terminal(arg1, act_proc_sup->sup_asid); + break; } default:{ LOGi("Unknow syscall ", number); @@ -211,9 +199,14 @@ void support_syscall_handler(support_t* act_proc_sup){ } void support_trap_handler(support_t* act_proc_sup){ + //TODO STA ROBA E' DA CONTROLLARE MOLTO ATTENTAMENTE + pcb_t *tmp =remove_blocked(&swp_pl_sem); + + if(tmp->p_pid != act_proc->p_pid) + 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) - terminate(); + SYSCALL(TERMINATE,0,0,0); } diff --git a/src/sys_support.h b/src/sys_support.h index b6a84fa..7cda57c 100644 --- a/src/sys_support.h +++ b/src/sys_support.h @@ -1,5 +1,6 @@ #ifndef SYSSUPPORT_H #define SYSSUPPORT_H +#include "pandos_types.h" #include "pandos_types.h"