diff --git a/arch/x86/include/asm/stddef.h b/arch/x86/include/asm/stddef.h index f3ef4468..581c72ab 100644 --- a/arch/x86/include/asm/stddef.h +++ b/arch/x86/include/asm/stddef.h @@ -70,6 +70,18 @@ typedef unsigned int wint_t; * All the interrupt handler routines use this type for their only parameter. */ struct state { + /// GS register + unsigned short gs; + unsigned short __gs; + /// FS register + unsigned short fs; + unsigned short __fs; + /// ES register + unsigned short es; + unsigned short __es; + /// ds register + unsigned short ds; + unsigned short __ds; /// EDI register unsigned int edi; /// ESI register diff --git a/arch/x86/kernel/entry.asm b/arch/x86/kernel/entry.asm index 8d34dff9..8f9a3973 100644 --- a/arch/x86/kernel/entry.asm +++ b/arch/x86/kernel/entry.asm @@ -767,13 +767,22 @@ extern irq_handler common_stub: pusha + push ds + push es + push fs + push gs ; use the same handler for interrupts and exceptions push esp call irq_handler add esp, 4 + pop gs + pop fs + pop es + pop gs popa + add esp, 8 iret