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

Commit

Permalink
Merge pull request #33 from specialfish9/phase3/gabriele
Browse files Browse the repository at this point in the history
Phase3/gabriele
  • Loading branch information
specialfish9 authored Jul 16, 2022
2 parents 473a242 + e493882 commit 90e1b09
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 37 deletions.
1 change: 1 addition & 0 deletions src/pandos_const.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@
#define OKCHARTRANS 5
#define TRANSMITCHAR 2


#define SEEKTOCYL 2
#define DISKREAD 3
#define DISKWRITE 4
Expand Down
67 changes: 30 additions & 37 deletions src/sys_support.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@
#include <umps3/umps/libumps.h>
#include <umps3/umps/cp0.h>
#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)
Expand All @@ -25,57 +24,41 @@ 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]
*/
}

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

/*
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; i<len; i++){
dev_reg->data0 = 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
Expand All @@ -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; i<len; i++){
dev_reg->transm_command = virtAddr+i; //carico il carattere da trasmettere sul campo data0, data1 non viene usato
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand All @@ -161,36 +151,34 @@ 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();
break;
}
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);
Expand All @@ -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);
}
1 change: 1 addition & 0 deletions src/sys_support.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#ifndef SYSSUPPORT_H
#define SYSSUPPORT_H
#include "pandos_types.h"

#include "pandos_types.h"

Expand Down

0 comments on commit 90e1b09

Please sign in to comment.