286 | | - Ligne 25 : `$26` **←** `c0_cause`\\⟶ donc le registre `$26`GPR réservé au kernel prend la valeur du registre de cause. |
287 | | - Ligne 26 : `$26` **←** `$26 & 0b00111100`\\⟶ C'est un masque qui permet de ne conserver que les 4 bits du champ `XCODE`. |
288 | | - Ligne 27 : `$27` **←** `0b00100000`\\⟶ On initialise le registre GPR réservé au kernel $27 avec la valeur attendue dans $26 s'il s'agit d'une cause `syscall`. |
289 | | - Ligne 28 : si `$26` ≠ `$27` goto kpanic\\⟶ Si ce n'est pas un `syscall`, on va plus loin, sinon on continue en séquence. |
290 | | '' |
291 | | }}} |
292 | | 1. Le gestionnaire de `syscall` est la partie du code noyau qui gère le comportement du noyau lors de l'exécution de l'instruction `syscall`. C'est un code en assembleur présent dans le fichier `kernel/hcpua.S` que nous allons détailler. Pour vous aider dans la compréhension de ce code, vous devez imaginer que l'instruction `syscall` est un peu comme un appel de fonction. Ce code utilise un tableau de pointeurs de fonctions nommé `syscall_vector[]` définit dans le fichier `kernel/ksyscalls.c`. Les lignes `36` à `43` du code assembleur sont chargées d'allouer de la place dans la pile.\\ \\**`common/syscalls.h`** |
| 286 | - Ligne 25 : `$26` **←** `c0_cause`\\⟶ donc le registre GPR `$26`réservé au kernel prend la valeur du registre de cause. |
| 287 | - Ligne 26 : `$26` **←** `$26 & 0b00.1111.00`\\⟶ C'est un masque qui permet de ne conserver que les 4 bits du champ `XCODE`. |
| 288 | - Ligne 27 : `$27` **←** `0b 00.1000.00`\\⟶ On initialise le registre GPR réservé au kernel $27 avec la valeur attendue dans $26 s'il s'agit d'une cause `syscall`. |
| 289 | - Ligne 28 : si `$26` ≠ `$27` goto 'kpanic'\\⟶ Si ce n'est pas un `syscall`, on va à la fonction `kpanic`, sinon on continue en séquence. |
| 290 | '' |
| 291 | }}} |
| 292 | 1. Le gestionnaire de `syscall` est la partie du code noyau qui gère l'exécution des services demandés par l'instruction `syscall`.\\Pour ce noyau, c'est un code en assembleur présent dans le fichier `kernel/hcpua.S` que nous allons détailler.\\Pour vous aider dans la compréhension du code, vous devez vous souvenir que l'instruction `syscall` réalise un peu un appel de fonction:\\- la fonction est définie par un ''numéro de syscall'' contenu dans le registre GPR `$2`;\\- les arguments (4 au maximum) sont dans les registres $4 à $7;\\- la fonction appelante de syscall n'a pas réservé d'espace dans la pile pour les arguments (il faudra le faire);\\- le registre `$2` contient la valeur de retour du syscall.\\ \\Le numéro contenu dans le registre `$2` est utilisé par le noyau pour indexer un tableau de pointeurs de fonctions de ''syscall'' nommé `syscall_vector[]`, ou vecteur de syscalls en français. Ce vecteur de syscalls est défini dans le fichier `kernel/ksyscalls.c`.\\Les lignes `36` à `43` du code assembleur (`kernel/hcpua.S`) sont chargées d'allouer de la place dans la pile, nous allons voir pourquoi...\\ \\**`common/syscalls.h`** |