# Introduction

Ce didacticiel est destiné aux utilisateurs maîtrisant la programmation en C ou C++, ainsi que l'architecture de la Simple Virtual Machine.

Dans ce didacticiel, vous allez découvrir la création et la manipulation des interruptions extension.

Le temps de lecture de ce didacticiel est estimé à 15 minutes.

# Mise en place

Pour commencer, créez le canevas de l'extension dans le fichier interruption.svm_plugin en utilisant ce code :

    PLUGIN irq

    DEFINE

# Déclaration

Modifiez le code de l'extension :

    PLUGIN irq

    DEFINE

    INTERRUPTION irq.example

Vous pouvez générer, compiler l'extension et l'inclure dans une petite application de test pour vérifier que l'interruption est acceptée par l'instruction `:interruption`.

Une interruption extension se définit entièrement grâce à sa déclaration.

En effet, une interruption n'est qu'une entrée d'extension spécialement reconnue par les processeurs pour interrompre l'exécution du code.

# Utilisation

## Erreur dans une instruction

Modifiez le code de l'extension :

    PLUGIN irq

    DEFINE

    INTERRUPTION irq.example

    INSTRUCTION irq.check INT
    %{
    	auto i = ARGV_VALUE(0,integer);
    	if(i<0)
    	{
    		ERROR_EXTERNAL(irq,example,"You fail!");
    	}
    %}

Générez puis compilez l'extension. Puis créez une petite application avec ce code :

    #!/usr/bin/env svm
    LOG
    DEBUG "interruptions"
    LOCAL PLUGIN "svmpluginirq/libsvmirq.so"
    PROCESS "interruptions"
    	CODE "main" INLINE
    		:irq.check 1
    		:irq.check 0
    		:irq.check -1
    	END
    END

Lancez l'application :

    ./interruptions.svm
    ### Simple Virtual Machine 1234 : PROCESS interruptions | 2023-01-01 00:00:00 GMT ####################################################################
    Kernel interrupted: @(main, line 3) Interruption !irq.example not handled: You fail!

    Core dump:
    Kernel:
    State: I, transmit_interruption, interrupted @(main, line 3) Interruption !irq.example not handled: You fail!

    Processor:
     State:
       Next instruction: <main:1/3> (Current one: <main:1/2>)
       Current memory  : &0*0
       Allocated memory:
       Aliases         :
       Flags           :
       Cascaded flags  :
       Local interruption handlers:
       Cascaded local interruption handlers:
     Saved states:
     Global interruption handlers:

    Code at <main:1/2>:
         :irq.check 1       # <0> @(main, line 1)
         :irq.check 0       # <1> @(main, line 2)
    ====== HERE ======
         :irq.check -1      # <2> @(main, line 3)
    ==================
     Labels:
     Symbols:

    Memory:
     Aliases:
     Free space:

    ### Simple Virtual Machine 1234 : SYSTEM | 2023-01-01 00:00:00 GMT ###################################################################################
    Process interruptions interrupted: @(main, line 3) Interruption !irq.example not handled: You fail!

Comme attendu, c'est la troisième instruction qui lève l'interruption `!irq.example` avec le message d'erreur inscrit dans le code de l'instruction.

## Valeur interruption

L'interruption déclarée dans une extension peut être utilisée en tant que valeur de type interruption. Modifiez le code de l'extension :

    PLUGIN irq

    DEFINE

    INTERRUPTION irq.example

    INSTRUCTION irq.raise IRQ
    %{
    	SVM_Value_Interruption irq = ::svm_parameter_value_get(svm,argv[0]);
    	::svm_processor_add_interruption(svm,CURRENT(kernel),irq);
    	::svm_machine_trace__raw(svm,"Passing here...");
    %}

Regénérez et compilez l'extension, puis lancez cette application :

    #!/usr/bin/env svm
    LOG
    DEBUG "interruptions"
    LOCAL PLUGIN "svmpluginirq/libsvmirq.so"
    PROCESS "interruptions"
    	CODE "main" INLINE
    		:irq.raise !irq.example
    	END
    END

L'exécution affiche la trace puis l'interruption non rattrappée, ce qui est attendu ici : la fonction `svm_processor_add_interruption` n'arrête pas l'exécution de l'instruction, mais place une interruption en attente dans le processeur. Cette interruption est traitée entre deux instructions.

- Une interruption extension peut être utilisée comme interruption logicielle spécifique au traitement de l'extension.
- Elle peut également être utilisée comme toute interruption pour modifier l'exécution du code de l'application.

# Conclusion

Vous venez de voir comment définir et utiliser les interruptions extension.

Créér des interruptions dédiées aux erreurs particulières aux objets d'une extension permet une gestion fine des erreurs par l'utilisateur de l'extension. Il convient alors de correctement anticiper comment l'utilisateur va vouloir définir ses gestionnaires d'interruption en rapport avec l'extension : un compromis entre une gestion trop brutale (un seul type d'interruption) et une gestion trop fine (une interruption par erreur possible) doit toujours être soigneusement fait pour une utilisation optimale de l'extension.