Gestione delle eccezioni.

Documenti analoghi
Eccezioni. Università degli Studi di Milano Corso di Laurea in Informatica, A.A

7 May INTERRUPT ED ECCEZIONI I. Frosio

15 April INTERRUPT ED ECCEZIONI I. Frosio

Eccezioni ed interrupt. I. Frosio M.Marchi


Esercitazione 6 Datapath multiciclo Eccezioni in PCSPIM

Interrupt ed Eccezioni

Laboratorio di Architettura degli Elaboratori LabArch 2006 Secondo Quadimestre, a.a Docente: H. Muccini

Università degli Studi di Cassino

Modi di esecuzione user / kernel

Il set istruzioni di MIPS Modalità di indirizzamento. Proff. A. Borghese, F. Pedersini

Università degli Studi di Cassino

Il set istruzioni di MIPS Modalità di indirizzamento. Proff. A. Borghese, F. Pedersini

Fetch Decode Execute Program Counter controllare esegue prossima

Istruzioni di trasferimento dati

Istruzioni di controllo del flusso

Manualino minimale MIPS

Il linguaggio del calcolatore: linguaggio macchina e linguaggio assembly

Università degli Studi di Cassino e del Lazio Meridionale

p = 7. E = bias + p = = E = s e m


Linguaggio Assembly e linguaggio macchina

Macchina di Riferimento: argomenti

Linguaggio Assembly e linguaggio macchina

Riassunto. Riassunto. Ciclo fetch&execute. Concetto di programma memorizzato. Istruzioni aritmetiche add, sub, mult, div

Laboratorio di Architettura degli

Linguaggio macchina: utilizzo di costanti, metodi di indirizzamento

Linguaggio Assembly e linguaggio macchina

Architettura degli Elaboratori

COMPITINO #1 di CALCOLATORI ELETTRONICI 1 del COGNOME NOME

Architettura dei calcolatori e sistemi operativi. Architettura MIPS e set istruzioni Capitolo 2 P&H

ISA e linguaggio macchina

Gestione delle eccezioni (CPU multiciclo) La CPU pipeline

Richiami sull architettura del processore MIPS a 32 bit

Architettura degli Elaboratori e Laboratorio. Matteo Manzali Università degli Studi di Ferrara Anno Accademico

Università degli Studi di Milano - Corso Architettura degli elaboratori e delle reti Turno 1 Prof. Borghese. Cognome e nome dello studente:

MIPS! !

Assembly (3): le procedure

Laboratorio di Architettura degli Elaboratori LabArch 2006 Secondo Quadimestre, a.a Docente: H. Muccini

Assembly (3): le procedure

COMPITINO #1 di CALCOLATORI ELETTRONICI 1 del COGNOME NOME

15 April LABORATORIO 04 PROCEDURE STACK. CHIAMATA A PROCEDURE I. Frosio

Sono tipicamente causati da dispositivi hardware. normale flusso di esecuzione viene interrotto, e la CPU passa a gestire l interrupt

L'architettura del processore MIPS

Il linguaggio assembly

La struttura delle istruzioni elementari: il linguaggio Macchina. Sommario

Il linguaggio Assembly. Architettura degli Elaboratori e delle Reti Turno I

Architettura degli Elaboratori

CPU multiciclo eccezioni CPU pipeline

Architettura e funzionamento del calcolatore

MIPS Instruction Set 2

Il linguaggio macchina

Architettura degli. Assemblatore Nomenclatura MARS. Dott. Franco Liberati

Assembly IV Le procedure

Richiami sull architettura del processore MIPS a 32 bit

Convenzioni di chiamata a procedure

Lezione 20. della CPU MIPS. Prof. Federico Pedersini Dipartimento di Informatica Università degli Studi di Milano

Le etichette nei programmi. Istruzioni di branch: beq. Istruzioni di branch: bne. Istruzioni di jump: j

Il Linguaggio Assembly: Le procedure

Le procedure. L insieme delle istruzioni (4) Prima della chiamata di una procedura. Le procedure (2) Architetture dei Calcolatori (lettere A-I)

Lezione 20. della CPU MIPS. Prof. Federico Pedersini Dipartimento di Informatica Università degli Studi di Milano

Gestione dello Stack nel MIPS

Linguaggio macchina e register file

1. Si effettui la divisione di 7/5 utilizzando un efficiente algoritmo e illustrando la corrispondente architettura hardware.

MIPS Instruction Set 1

Architettura di una CPU

8 March : LABORATORIO 01 ISA & ASSEMBLY REGISTER FILE INTRODUZIONE A SPIM OPERAZIONI ARITMETICHE. I. Frosio

Convenzioni per la chiamata a procedure

Linguaggio assembler e linguaggio macchina (caso di studio: processore MIPS)

Addendum: istruzioni linguaggio macchina. Università di Bergamo - corso di Calcolatori Elettronici 1

Linguaggio macchina. Architettura degli Elaboratori e delle Reti. Il linguaggio macchina. Lezione 16. Proff. A. Borghese, F.

Gestione dei sottoprogrammi. temporaneo passaggio del controllo dal programma in esecuzione ad un sottoprogramma

Il processore: unità di controllo

Istruzioni assembler Istruzione N Registri

Un altro tipo di indirizzamento. L insieme delle istruzioni (3) Istruz. di somma e scelta con operando (2) Istruzioni di somma e scelta con operando

L unità di controllo di CPU a singolo ciclo

ISA (Instruction Set Architecture) della CPU MIPS

La CPU a singolo ciclo

slt $t1,$t2,$t3 if ($t2<$t3) $t1=1; Confronto tra registri slti $t1,$t2,100 if ($t2<100)$t1=1; Cfr. registro-costante

La CPU a singolo ciclo

System Calls, Register Spilling

Lezione 18 Il Set di Istruzioni (4)

Università degli Studi di Cassino

Processore. Memoria I/O. Control (Parte di controllo) Datapath (Parte operativa)

Architettura degli elaboratori CPU a ciclo singolo

Università degli Studi di Cassino

Dal sorgente all eseguibile I programmi Assembly. Prof. Alberto Borghese Dipartimento di Scienze dell Informazione

Architettura degli. Introduzione al corso Modello della Macchina di Von Neumann Una architettura reale: MIPS. Dott.

Dal sorgente all eseguibile I programmi Assembly. Prof. Alberto Borghese Dipartimento di Scienze dell Informazione

ARCHITETTURE DEI CALCOLATORI (canale A-I) - Prima prova in itinere del 16/6/2003 Compito tipo A

MIPS Instruction Set 1

Architettura degli Elaboratori Lez. 3 ASM: Strutture di controllo. Prof. Andrea Sterbini

Calcolatori Elettronici

Università degli Studi di Cassino e del Lazio Meridionale

Università degli Studi di Roma La Sapienza

Corso di Calcolatori Elettronici MIPS: Istruzioni di confronto Istruzioni di controllo Formato delle istruzioni in L.M.

Assembly MIPS: le procedure

Transcript:

Gestione delle eccezioni nicola.basilico@unimi.it http://homes.di.unimi.it/basilico/teaching/

Eccezioni Fetch Decodifica Calcolo Lettura / scrittura Eccezione (es. istruzione non riconosciuta) Eccezione (es. overflow) Write back Interrupt Un eccezione è un cambiamento inaspettato di flusso

Eccezioni Eccezione: interna al processore, modifica il flusso di esecuzione di un istruzione. Interrupt: esterno al processore (es. click del mouse), viene generalmente attesa la fine del ciclo dell istruzione prima di servire l interrupt.

I registri per la gestione di eccezioni Registro Cause: codifica la causa dell eccezione attraverso un Exception Code. Registro EPC: exception program counter, indirizzo della word in cui sta la faulting instruction Registro BadVaddr: indirizzo errato nel caso di una address exception Registro Status: interrupt mask e bit di controllo

Esempi main: lui $t0, 0xffff ori $t0, $t0, 0xffff Jr $t0 addi $v0, $zero, 10 syscall main: lui $t0, 0x8000 lui $t1, 0x8000 add $t2, $t0, $t1 addi $t3, $t2, -100 addi $v0, $zero, 10 syscall Bad Address in text read Overflow

Gestione SW di un eccezione La gestione delle eccezioni è affidata al coprocessor 0 Nei registri di questo coprocessore troviamo le informazioni che il SW necessita per gestire l eccezione

Gestione SW di un eccezione Eccezione L HW scrive in EPC l indirizzo dell istruzione che ha causato l eccezione (faulting instruction) Scrittura delle informazioni nei registri di coprocessor 0 L HW scrive in Cause un codice che specifica il motivo dell eccezione L HW scrive in PC l indirizzo 0x80000180 (exception handler); qui è presente una procedura del sistema operativo per la gestione delle eccezioni Gestione dell eccezione da parte dell OS Continue Ritorno all istruzione EPC+4 Exit Exception handler (OS) Vediamo nel dettaglio come vengono svolte queste operazioni dal SW

Gestione SW di un eccezione Come avviene la lettura e scrittura nei registri del coprocessore 0? # copiare dal registro $13 del coprocessore 0 (Cause register) al registro $t0 mfc0 $t0, $13 # copiare dal registro $t0 al registro $14 del coprocessore 0 (EPC) mtc0 $14, $t0 # load word dall indirizzo 100($t3) al registro $13 del coprocessore 0 lwc0 $13, 100($t3) # store word dal registro $13 del coprocessore 0 in memoria swc0 $13, 50($t2)

Gestione SW di un eccezione L exception handler non deve alterare lo stato corrente di registri e memoria ha a disposizione due registri riservati $k0 e $k1 nel caso debba fare register spilling, non userà lo stack ma la apposita area.kdata Nome Numero Utilizzo Preservato durante le chiamate $zero 0 costante zero Riservato MIPS $at 1 riservato per l assemblatore Riservato Compiler $v0-$v1 2-3 valori di ritorno di una procedura No $a0-$a3 4-7 argomenti di una procedura No $t0-$t7 8-15 registri temporanei (non salvati) No $s0-$s7 16-23 registri salvati Si $t8-$t9 24-25 registri temporanei (non salvati) No $k0-$k1 26-27 gestione delle eccezioni Riservato OS $gp 28 puntatore alla global area (dati) Si $sp 29 stack pointer Si $s8 30 registro salvato (fp) Si $ra 31 indirizzo di ritorno No

Gestione SW di un eccezione Suddividiamo logicamente la gestione di un eccezione nelle tre fasi operative di prologo, corpo della procedura ed epilogo. Prologo: stampa le informazioni relative all eccezione sollevate; Corpo: valuta la possibilità di ripristinale il flusso di esecuzione e, nel caso di un interrupt, esegue una procedura specifica per la sua gestione; Epilogo: ripristina lo stato del processore e dei registri, fa riprendere l esecuzione dall istruzione successiva a quella che ha causato l eccezione

Exception Handler (preambolo).kdata m1_:.asciiz " Exception " m2_:.asciiz " occurred and ignored\n" e0_:.asciiz " [Interrupt] s1:.word 0 s2:.word 0 [ ]

Exception Handler (prologo-1) Cause

Exception Handler (prologo-1) Cause move $k1 $at sw $v0 s1 sw $a0 s2 # Salvo $at # è necessario usare $v0 e $a0, quindi li salvo in memoria (no stack!) mfc0 $k0 $13 # copio Cause in $k0 (1) srl $a0 $k0 2 # estraggo campo ExcCode (shift right logical) (2) andi $a0 $a0 0x1f # (3)

Exception Handler (prologo-1) Cause move $k1 $at sw $v0 s1 sw $a0 s2 # Salvo $at # è necessario usare $v0 e $a0, quindi li salvo in memoria (no stack!) mfc0 $k0 $13 # copio Cause in $k0 (1) srl $a0 $k0 2 # estraggo campo ExcCode (shift right logical) (2) andi $a0 $a0 0x1f # (3) Esempio: Estrazione di ExcCode con Aritmetic Overflow (codice 12): (1) Cause Register: 0000000000000000000000000 01100 00 (in Spim vedremo 110000) (2) Shift a destra di 2 bit: 00 0000000000000000000000000 01100 (3) AND con 0x1F (11111): 00 0000000000000000000000000 01100

Exception Handler (prologo-2) # Stampo informazioni sull eccezione. li $v0 4 la $a0 m1_ syscall li $v0 1 srl $a0 $k0 2 andi $a0 $a0 0x1f syscall li $v0 4 andi $a0 $k0 0x3c lw $a0 excp($a0) nop syscall # syscall 4 (print_str) # syscall 1 (print_int) # Extract ExcCode Field # syscall 4 (print_str)

Exception Handler (corpo-3) Prima cosa da fare: controllare se è possibile riprendere l esecuzione, altrimenti eseguire exit Se la causa non è «bus error on instruction fetch» (codice 6 (0x18)) allora $pc è valido, in caso contrario in $pc c è un valore errato e sono necessari controlli aggiuntivi bne $k0 0x18 ok_pc nop # Bad PC exception requires special checks

Exception Handler (corpo-3) Prima cosa da fare: controllare se è possibile riprendere l esecuzione, altrimenti eseguire exit Se la causa non è «bus error on instruction fetch» (codice 6 (0x18)) allora $pc è valido, in caso contrario in $pc c è un valore errato e sono necessari controlli aggiuntivi bne $k0 0x18 ok_pc nop # Bad PC exception requires special checks Se è proprio un errore di fetch, controllo se in EPC ho un indirizzo valido (sintatticamente) mfc0 $a0 $14 # copio EPC in $a0 andi $a0 $a0 0x3 # Is EPC word-aligned? beq $a0 0 ok_pc # branch se gli ultimi due bit di EPC non sono 1 (divisibile per 4) nop

Exception Handler (corpo-3) Prima cosa da fare: controllare se è possibile riprendere l esecuzione, altrimenti eseguire exit Se la causa non è «bus error on instruction fetch» (codice 6 (0x18)) allora $pc è valido, in caso contrario in $pc c è un valore errato e sono necessari controlli aggiuntivi bne $k0 0x18 ok_pc nop # Bad PC exception requires special checks Se è proprio un errore di fetch, controllo se in EPC ho un indirizzo valido (sintatticamente) mfc0 $a0 $14 # copio EPC in $a0 andi $a0 $a0 0x3 # Is EPC word-aligned? beq $a0 0 ok_pc # branch se gli ultimi due bit di EPC non sono 1 (divisibile per 4) nop Nel caso in cui anche EPC non sia valido, non mi resta che fare exit (l esecuzione non può continuare dopo l eccezione). li $v0 10 syscall # Exit on really bad PC ok_pc:

Exception Handler (corpo-4) Controllo se c è stato un interrupt. In quel caso verrà gestito con del codice specifico. ok_pc: li $v0 4 la $a0 m2_ syscall # syscall 4 (print_str) srl $a0 $k0 2 andi $a0 $a0 0x1f bne $a0 0 ret nop # Extract ExcCode Field # 0 means exception was an interrupt # Interrupt-specific code Se non è un interrupt passo all epilogo della gestione

Exception Handler (epilogo-5) Calcolo l indirizzo da cui riprendere l esecuzione e lo copio in EPC ret: # Return from (non-interrupt) exception. Skip faulting instruction # at EPC to avoid infinite loop. mfc0 $k0 $14 addiu $k0 $k0 4 mtc0 $k0 $14 # Bump EPC register # Skip faulting instruction # write back EPC

Exception Handler (epilogo-5) Calcolo l indirizzo da cui riprendere l esecuzione e lo copio in EPC ret: # Return from (non-interrupt) exception. Skip faulting instruction # at EPC to avoid infinite loop. mfc0 $k0 $14 addiu $k0 $k0 4 mtc0 $k0 $14 # Bump EPC register # Skip faulting instruction # write back EPC Ripristino i registri a lo stato del processore: $v0, $a0, $at, e i registri Cause e Status # Restore registers and reset processor state lw $v0 s1 lw $a0 s2 move $at $k1 mtc0 $0 $13 mfc0 $k0 $12 ori $k0 0x1 mtc0 $k0 $12 # Restore other registers # Restore $at # Clear Cause register # Set Status register # Interrupts enabled

Exception Handler (epilogo-5) Calcolo l indirizzo da cui riprendere l esecuzione e lo copio in EPC ret: # Return from (non-interrupt) exception. Skip faulting instruction # at EPC to avoid infinite loop. mfc0 $k0 $14 addiu $k0 $k0 4 mtc0 $k0 $14 # Bump EPC register # Skip faulting instruction # write back EPC Ripristino i registri a lo stato del processore: $v0, $a0, $at, e i registri Cuase e Status # Restore registers and reset processor state lw $v0 s1 lw $a0 s2 move $at $k1 mtc0 $0 $13 mfc0 $k0 $12 ori $k0 0x1 mtc0 $k0 $12 # Restore other registers # Restore $at # Clear Cause register # Set Status register # Interrupts enabled # Return from exception on MIPS32: eret # setta exception level a 0 # ritorna a istruzione indirizzata da EPC

Esempio Cosa succede quando facciamo una jump a 0xffffffff (esempio nelle slides precedenti)? E un eccezione di codice 6? bne $k0 0x18 ok_pc nop Sì In EPC ho 0xffffffffc, è allineato? mfc0 $a0 $14 andi $a0 $a0 0x3 beq $a0 0 ok_pc nop Sì da quale istruzione riparto? Calcolo indirizzo dell istruzione da cui ripartire (EPC+4): mfc0 $k0 $14 addiu $k0 $k0 4 mtc0 $k0 $14