\input{packages.tex}
\newcounter{mypara}
\setcounter{mypara}{0}

\setcounter{secnumdepth}{4}

%Bibliography
\addbibresource{bibliographie.bib}

% Document
\begin{document}{

\sloppy
\input{titlepage.tex}
\setcounter{tocdepth}{4}
\setcounter{secnumdepth}{4}

% Table of contents
\tableofcontents

\newpage

\chapter{Compléments d'architecture RISC}

On va notamment s'intéresser au traitement des interruptions et exceptions. Nous l'étudierons à travers MIPS32.

\section{Rappels}

On a vu en M1 les registres visibles par le logiciel et les mécanismes d'adressage mémoire. \newline
\newline
Ce qui avait été ignoré est le mécanisme d'interruptions et exceptions ainsi que le jeu d'instructions système.

\section{Instructions systèmes}

\subsection{Syscall}

Cette instruction permet d'appeler un service du système d'exploitation. C'est une instruction de format R. \newline
\newline
En effet, le système d'exploitation est là pour gérer le matériel et en distribuer les ressources au logiciel. Pourquoi ça existe ? Parceque gérer mal le matériel peut le détruire. \newline
\newline
Comment le système sait quel service est demandé ? Il y a l'ABI : une convention d'appel pour passer des paramètres à l'instruction \texttt{syscall}. En MIPS, on met le numéro identifiant le service demandé dans le registre \texttt{r2}.

\subsection{Break}

C'est basiquement un \texttt{syscall} spécialisé pour les logiciels de débogage (comme \texttt{gdb}). \newline
\newline
Note : en RISC on peut insérer un break à la place de n'importe quelle instruction sans détruire le programme car toutes les instructions font la même taille. Pour que cette instruction soit quand même exécutée, c'est le débogueur qui va l'exécuter séparément du programme. \newline
\newline
L'instruction est de format R.

\subsection{Eret}

C'est l'instruction \textbf{privilégiée} qui permet de quitter le vecteur d'interruption/exception et on ne peut exécuter cette instruction qu'en mode système. C'est une instruction de format R*, c'est à dire un format spécial.

\subsection{Le registre STATUS}

C'est le registre de contrôle du processeur. Il y a différentes sections et notamment \texttt{mode} qui indique le mode (S/U) et la raison du passage en S s'il y a lieu.

\subsection{Mfc0}

C'est l'instruction \textbf{privilégiée} qui permet de récupérer le contenu d'un registre du coprocesseur 0 vers un registre général. C'est une instruction de format I*.

\subsection{Wait}

C'est l'instruction \textbf{privilégiée} qui permet de stopper le pipeline jusqu'à ce qu'une interruption soit reçue. Cette instruction permet d'éviter de consommer de l'énergie (excepté pour l'horloge qui consomme toujours un petit peu).\newline
\newline
La formule de la consommation est $E=\frac{1}{2}CV^{2}\alpha$ avec \textit{C} la capacité, \textit{V} TODO et $\alpha$ l'activité du signal.

\subsection{Teqi, Tlge, Tgeiu, etc}

Ces instructions \textbf{privilégiées} sont des appels système conditionnels. C'est une instruction de format I*.

\subsection{Concernant la mémoire}

Il y a aussi énormément d'instructions mémoires que nous n'avions pas étudiées. Elles seront détaillées dans les diapos fournies en annexe.

\section{Exceptions, interruptions et reset}

Ces mécanismes ne sont pas liés à l'exécution des instructions mais au contrôle général du processeur.

\subsection{Reset}

Il s'agit de réinitialiser tous les composants de la machine. Cela a pour effet :

\begin{itemize}
\item d'annuler l'exécution du programme courant ;
\item effacer la mémoire totalement ;
\item tous les programmes courants sont perdus (y compris l'OS).
\end{itemize}

Pour ce faire, cette instruction consiste en un saut vers un programme spécifique en mémoire nommé \textit{Reset Handler}. L'algorithme de ce programme est le suivant :

\begin{itemize}
\item initialiser l'adresse de la prochaine instruction à \texttt{0xBFC0 0000} ;
\item initialiser le registre STATUS à la valeur \texttt{0x0040 0004} i.e avec le champ \textit{mode} à \texttt{00 10} ;
\item initialiser le registre CAUSE à la valeur \texttt{0x0000 0000} ;
\item sauvegarde de l'adresse de retour dans EEPC (pour le reset à chaud) ;
\item initialiser le registre EBASE (Exception Base register) à \texttt{0x8000 0000}.
\end{itemize}

A l'adresse \texttt{0xBFC0 0000} se trouve un système d'exploitation simple permettant de traiter les interruptions urgentes.

\subsection{Interruptions et exceptions}

La différence entre les deux est importante. L'interruption est un évènement qui nécessite que le processeur effectue une opération. Une exception est un évènement qui indique un dysfonctionnement d'un programme ou de la machine et qui requiert l'intervention du processeur. \newline
\newline
Ainsi, les interruptions sont des évènements normaux alors que les exceptions ne devraient pas arriver... ;)

\subsubsection{Interruptions}

L'instruction \texttt{interrupt} déclenche une interruption. Cela se fait en sautant au vecteur d'interruption à l'adresse \texttt{EXH-ADR} puis en retournant au code courant pointé par le registre \texttt{EPC}. Ce mécanisme est détaillé dans les diapos en annexe. \newline
\newline
Pendant les sauvegardes et les restaurations de contexte, aucune interruption n'est traitée (en utilisant les masques). \newline
\newline
Pour revenir d'une interruption qui se produit pendant un branchement, on est obligé de ré-exécuter le branchement (sinon le \textit{delayed slot} n'est pas exécuté correctement). On initialise donc dans le registre CAUSE le bit adéquat pour le signaler (Branch Delayed Slot).

\subsubsection{Exceptions}

Le principe est que lorsqu'une erreur se produit dans l'exécution d'un programme, une exception se produit et l'\textit{Exception Handler} décide soit de tuer le programme, soit de revenir au programme. \newline
\newline
Pour préserver l'intégrité du système, l'instruction fautive ne doit pas être exécutée. Mais comment alors savoir qu'elle est illégale ? \newline
\newline
Le mécanisme est détaillé dans les diapos en annexe. Il y a beaucoup de causes d'exception, détaillées également au même endroit. \newline
\newline
Fun-fact : l'instruction \texttt{syscall} déclenche une exception, ce qui veut dire que \texttt{syscall} est une instruction du jeu d'instruction que le processeur n'a pas le droit d'exécuter ?! En fait dès que le mécanisme est en place, exécuter l'instruction n'a pas de sens (elle ne fait rien que déclencher l'exception). C'est la même chose pour les \texttt{trap} et \texttt{break}.

%% First chapter
%\chapter{Introduction}
%
%Blablabla
%
%\begin{figure}[h!]
%  \center
%  \includegraphics{images/su.png}
%  \caption{Petite image}
%  \label{fig:schema1}
%\end{figure}
%
%\setstretch{1}
%\section{Une section}
%\setstretch{1.3}
%
%Blabla \newline
%Blablabla.
%
%\setstretch{1}
%\subsection{Une sous-section}
%\setstretch{1.3}
%
%Bla à propos de l'\textbf{bla important} dont le fonctionnement est schématisé dans la figure \ref{fig:schema1}.
%
%% Second chapter
%\chapter{Seconde chose à dire}
%
%A ce propos \textit{italique}.
%
%\begin{figure}[h!]
%  \center
%  \includegraphics[width=\linewidth]{images/su.png}
%  \caption{Image pleine page}
%  \label{fig:image_pleine}
%\end{figure}
%
%\setstretch{1}
%\section{Une section}
%\setstretch{1.3}
%
%Texte pour dire tout ça parceque oui. \newline
%
%Ceci ne veut pas dire cependant que :
%
%\begin{itemize}
%\item Élément 1
%
%\item Élément 2
%
%\item Élément 3
%
%\end{itemize}

\newpage

% Bibliography
\nocite{*}
\addcontentsline{toc}{chapter}{Bibliographie}
\printbibliography

\end{document}
