Interrupciones en IA-32e IDT en IA-32e Almacena descriptores, similares a los vistos en IA-32 pero de 16 bytes, no de 8. 256 entradas, igual que antes No se puede definir en la IDT un descriptor de segmento de datos ni de código. Son descriptores del sistema (Bit S=0 en el descriptor). Descriptores en la IDT en IA-32e 64 bits Interrupt Gate – Limpia Interrupt Flag (IF=0), no puede ser interrumpido nuevamente, pero sí por una excepción o una interrupción no enmascarable. 64 bits Trap Gate – No afecta Interrupt Flag No Task gate Descriptores en la IDT en IA-32 (2) Procedimiento de Interrupción Consideraciones Los selectores de código apuntados por las puertas de interrupción y de traps deben ser de 64 bits. La excepción es el handler de SMI. Consecuentemente el la pila se almacena en bloques de 8 bytes. La pila (ss:RSP) se almacena siempre en cada interrupción, haya o no cambio de nivel de privilegio. Consideraciones (2) Si la interrupción o excepción eleva el nivel de privilegio, el registro selector de SS se pone automáticamente en 0 (NULL) y el RPL se ajusta con el RPL de CS. Cambia el mecanismo de cambio de stack Cambia el contenido del stack frame. El offset puntero de entrada que está en cada descriptor de la IDT (64 bits) deben estar en formato canónico, va al registro RIP. Si no, #GP. Consideraciones (3) Tamaño máximo de la IDT es de 4 Kbytes, utilizando los 256 vectores de Interrupción. El contenido del RSP se alinea a 16 bytes antes de generar el stack frame (varios push's) para asegurar su alineación a 16 bytes cuando se ingrese al handler de la interrupción (o excepción), aun si el RSP llamante (que se guardara en el stack) no esta alineado a 16 bytes. Cuando se ejecuta iret se recupera el RSP llamante a su valor original (alineado o no). Consideraciones (4) IRET trabaja con operandos de 64 bit's. IRET extrae SS:RSP del stack siempre que esté en IA-32e. En el modo compatibilidad extrae SS:RSP del stack solo si cambia el CPL a causa de la Interrupción o Excepción. Conmutación de pila en IA-32e El cambio de stack en modo IA-32e trabaja como en el modo IA-32 excepto que el registro SS no se carga con el nuevo selector de la TSS, sino que se pone a NULL. En la TSS no hay definición de SS. El SS se fuerza a NULL, excepto su campo RPL que se setea al valor del nuevo CPL en toda transferencias far anidadas, con CALLF, INT n, Interrupciones de hardware, y Excepciones. Se vuelve con IRET. Pila en el handler en IA-32 Pila en el handler en IA-32e Interrupt Stack Table (IST) El campo IST se emplea para efectuar el cambio de pila. Es un índice. Si vale cero se utiliza el modo legacy. Si hay cambio de privilegio hay cambio de pila (RSP) y la saca de la TSS. Si es distinto de cero la pila (RSP) la saca de la TSS. Cuando se cambia de pila Si IST es distinto de cero. Si IST es cero pero el código (de 64 bits) destino de la interrupción o excepción es mayor nivel que el actual. En estos casos el selector de stack (parte alta de SS) se pone en NULL. El RPL de SS se completará con el nivel del privilegio del código en ejecución si hay elevación de privilegio. En estos caso el nuevo RSP sale de la TSS TSS en IA-32e Referencias Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Capítulos 6 y 7