X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Ferrors.c;h=f7da7f9f8d5a9362f7a8d1b0becc0e9fc9c0da00;hb=7aa331d83b8dd23d3ca7530fa582cec528df274a;hp=d1856db17758bc94b48d36837f981f2c4ac7db36;hpb=f086aa018b58f23bc15fbee7b2c648e35bb7dc1c;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/errors.c b/Kernel/arch/x86_64/errors.c index d1856db1..f7da7f9f 100644 --- a/Kernel/arch/x86_64/errors.c +++ b/Kernel/arch/x86_64/errors.c @@ -5,12 +5,15 @@ #include #include #include +#include // Needed for SSE handling #define MAX_BACKTRACE 6 // === IMPORTS === - int MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs); -void Error_Backtrace(Uint IP, Uint BP); +extern int MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs); +extern void Error_Backtrace(Uint IP, Uint BP); +extern void Proc_EnableSSE(void); +extern void Proc_RestoreSSE(Uint32 Data); // === PROTOTYPES === void Error_Handler(tRegs *Regs); @@ -31,6 +34,23 @@ const char * const csaERROR_NAMES[] = { void Error_Handler(tRegs *Regs) { Uint cr; + + if( Regs->IntNum == 7 ) + { + tThread *thread = Proc_GetCurThread(); + if(!thread->SavedState.bSSEModified) + { + Proc_EnableSSE(); + if(!thread->SavedState.SSE) + thread->SavedState.SSE = malloc(sizeof(tSSEState) + 0xF); + else + Proc_RestoreSSE( ((Uint)thread->SavedState.SSE + 0xF) & ~0xF ); + thread->SavedState.bSSEModified = 1; +// __asm__ __volatile__ ("sti"); + return ; + } + // oops, SSE enabled but a #NM, bad news + } if( Regs->IntNum == 14 ) { __asm__ __volatile__ ("mov %%cr2, %0":"=r"(cr)); @@ -44,7 +64,7 @@ void Error_Handler(tRegs *Regs) } Log("CPU Error %x, Code: 0x%x", Regs->IntNum, Regs->ErrorCode); -// Log(" - %s", csaERROR_NAMES[Regs->IntNum]); + Log(" - %s", csaERROR_NAMES[Regs->IntNum]); Log(" CS:RIP = 0x%04x:%016llx", Regs->CS, Regs->RIP); Log(" SS:RSP = 0x%04x:%016llx", Regs->SS, Regs->RSP); Log(" RFLAGS = 0x%016llx", Regs->RFlags);