[PERF]: Make all trap handlers, trap exit code, fatal exit code, and exception dispatch code "no return" since it always leads to an iret or other kind of non-directly-returning mechanism. This allows the compiler to optimize better and also remove useless code at the bottom of the functions. Since __builtin_unreachable is only for GCC 4.5, we use exit(0) for now (it will never be reached) to trick GCC.

svn path=/trunk/; revision=45223
This commit is contained in:
Sir Richard 2010-01-23 23:59:59 +00:00
parent f4cdf7ef0f
commit 280c5bef1e
2 changed files with 46 additions and 1 deletions

View file

@ -214,6 +214,7 @@ KiCheckForApcDelivery(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FORCEINLINE FORCEINLINE
DECLSPEC_NORETURN
KiDispatchException0Args(IN NTSTATUS Code, KiDispatchException0Args(IN NTSTATUS Code,
IN ULONG_PTR Address, IN ULONG_PTR Address,
IN PKTRAP_FRAME TrapFrame) IN PKTRAP_FRAME TrapFrame)
@ -224,6 +225,7 @@ KiDispatchException0Args(IN NTSTATUS Code,
VOID VOID
FORCEINLINE FORCEINLINE
DECLSPEC_NORETURN
KiDispatchException1Args(IN NTSTATUS Code, KiDispatchException1Args(IN NTSTATUS Code,
IN ULONG_PTR Address, IN ULONG_PTR Address,
IN ULONG P1, IN ULONG P1,
@ -235,6 +237,7 @@ KiDispatchException1Args(IN NTSTATUS Code,
VOID VOID
FORCEINLINE FORCEINLINE
DECLSPEC_NORETURN
KiDispatchException2Args(IN NTSTATUS Code, KiDispatchException2Args(IN NTSTATUS Code,
IN ULONG_PTR Address, IN ULONG_PTR Address,
IN ULONG P1, IN ULONG P1,
@ -247,6 +250,7 @@ KiDispatchException2Args(IN NTSTATUS Code,
FORCEINLINE FORCEINLINE
VOID VOID
DECLSPEC_NORETURN
KiSystemCallReturn(IN PKTRAP_FRAME TrapFrame) KiSystemCallReturn(IN PKTRAP_FRAME TrapFrame)
{ {
/* Restore nonvolatiles, EAX, and do a "jump" back to the kernel caller */ /* Restore nonvolatiles, EAX, and do a "jump" back to the kernel caller */
@ -272,10 +276,12 @@ KiSystemCallReturn(IN PKTRAP_FRAME TrapFrame)
[v] "i"(KTRAP_FRAME_ESP) [v] "i"(KTRAP_FRAME_ESP)
: "%esp" : "%esp"
); );
exit(0);
} }
FORCEINLINE FORCEINLINE
VOID VOID
DECLSPEC_NORETURN
KiSystemCallTrapReturn(IN PKTRAP_FRAME TrapFrame) KiSystemCallTrapReturn(IN PKTRAP_FRAME TrapFrame)
{ {
/* Regular interrupt exit, but we only restore EAX as a volatile */ /* Regular interrupt exit, but we only restore EAX as a volatile */
@ -299,10 +305,12 @@ KiSystemCallTrapReturn(IN PKTRAP_FRAME TrapFrame)
[e] "i"(KTRAP_FRAME_EIP) [e] "i"(KTRAP_FRAME_EIP)
: "%esp" : "%esp"
); );
exit(0);
} }
FORCEINLINE FORCEINLINE
VOID VOID
DECLSPEC_NORETURN
KiSystemCallSysExitReturn(IN PKTRAP_FRAME TrapFrame) KiSystemCallSysExitReturn(IN PKTRAP_FRAME TrapFrame)
{ {
/* Restore nonvolatiles, EAX, and do a SYSEXIT back to the user caller */ /* Restore nonvolatiles, EAX, and do a SYSEXIT back to the user caller */
@ -330,10 +338,12 @@ KiSystemCallSysExitReturn(IN PKTRAP_FRAME TrapFrame)
[v] "i"(KTRAP_FRAME_V86_ES) [v] "i"(KTRAP_FRAME_V86_ES)
: "%esp" : "%esp"
); );
exit(0);
} }
FORCEINLINE FORCEINLINE
VOID VOID
DECLSPEC_NORETURN
KiTrapReturn(IN PKTRAP_FRAME TrapFrame) KiTrapReturn(IN PKTRAP_FRAME TrapFrame)
{ {
/* Regular interrupt exit */ /* Regular interrupt exit */
@ -361,10 +371,12 @@ KiTrapReturn(IN PKTRAP_FRAME TrapFrame)
[e] "i"(KTRAP_FRAME_EIP) [e] "i"(KTRAP_FRAME_EIP)
: "%esp" : "%esp"
); );
exit(0);
} }
FORCEINLINE FORCEINLINE
VOID VOID
DECLSPEC_NORETURN
KiEditedTrapReturn(IN PKTRAP_FRAME TrapFrame) KiEditedTrapReturn(IN PKTRAP_FRAME TrapFrame)
{ {
/* Regular interrupt exit */ /* Regular interrupt exit */
@ -393,6 +405,7 @@ KiEditedTrapReturn(IN PKTRAP_FRAME TrapFrame)
[e] "i"(KTRAP_FRAME_ERROR_CODE) /* We *WANT* the error code since ESP is there! */ [e] "i"(KTRAP_FRAME_ERROR_CODE) /* We *WANT* the error code since ESP is there! */
: "%esp" : "%esp"
); );
exit(0);
} }
NTSTATUS NTSTATUS

View file

@ -50,6 +50,7 @@ UCHAR KiTrapIoTable[] =
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiExitTrap(IN PKTRAP_FRAME TrapFrame, KiExitTrap(IN PKTRAP_FRAME TrapFrame,
IN UCHAR Skip) IN UCHAR Skip)
{ {
@ -235,6 +236,7 @@ KiExitV86Trap(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiEoiHelper(IN PKTRAP_FRAME TrapFrame) KiEoiHelper(IN PKTRAP_FRAME TrapFrame)
{ {
/* Disable interrupts until we return */ /* Disable interrupts until we return */
@ -249,6 +251,7 @@ KiEoiHelper(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiServiceExit(IN PKTRAP_FRAME TrapFrame, KiServiceExit(IN PKTRAP_FRAME TrapFrame,
IN NTSTATUS Status) IN NTSTATUS Status)
{ {
@ -267,6 +270,7 @@ KiServiceExit(IN PKTRAP_FRAME TrapFrame,
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiServiceExit2(IN PKTRAP_FRAME TrapFrame) KiServiceExit2(IN PKTRAP_FRAME TrapFrame)
{ {
/* Disable interrupts until we return */ /* Disable interrupts until we return */
@ -423,6 +427,7 @@ KiEnterTrap(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiSystemFatalException(IN ULONG ExceptionCode, KiSystemFatalException(IN ULONG ExceptionCode,
IN PKTRAP_FRAME TrapFrame) IN PKTRAP_FRAME TrapFrame)
{ {
@ -437,6 +442,7 @@ KiSystemFatalException(IN ULONG ExceptionCode,
VOID VOID
NTAPI NTAPI
DECLSPEC_NORETURN
KiDispatchExceptionFromTrapFrame(IN NTSTATUS Code, KiDispatchExceptionFromTrapFrame(IN NTSTATUS Code,
IN ULONG_PTR Address, IN ULONG_PTR Address,
IN ULONG ParameterCount, IN ULONG ParameterCount,
@ -477,6 +483,7 @@ KiDispatchExceptionFromTrapFrame(IN NTSTATUS Code,
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiDebugHandler(IN PKTRAP_FRAME TrapFrame, KiDebugHandler(IN PKTRAP_FRAME TrapFrame,
IN ULONG Parameter1, IN ULONG Parameter1,
IN ULONG Parameter2, IN ULONG Parameter2,
@ -500,6 +507,7 @@ KiDebugHandler(IN PKTRAP_FRAME TrapFrame,
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiNpxHandler(IN PKTRAP_FRAME TrapFrame, KiNpxHandler(IN PKTRAP_FRAME TrapFrame,
IN PKTHREAD Thread, IN PKTHREAD Thread,
IN PFX_SAVE_AREA SaveArea) IN PFX_SAVE_AREA SaveArea)
@ -656,6 +664,7 @@ KiNpxHandler(IN PKTRAP_FRAME TrapFrame,
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap00Handler(IN PKTRAP_FRAME TrapFrame) KiTrap00Handler(IN PKTRAP_FRAME TrapFrame)
{ {
/* Save trap frame */ /* Save trap frame */
@ -675,6 +684,7 @@ KiTrap00Handler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap01Handler(IN PKTRAP_FRAME TrapFrame) KiTrap01Handler(IN PKTRAP_FRAME TrapFrame)
{ {
/* Save trap frame */ /* Save trap frame */
@ -694,6 +704,7 @@ KiTrap01Handler(IN PKTRAP_FRAME TrapFrame)
} }
VOID VOID
DECLSPEC_NORETURN
KiTrap02(VOID) KiTrap02(VOID)
{ {
PKTSS Tss, NmiTss; PKTSS Tss, NmiTss;
@ -840,6 +851,7 @@ KiTrap02(VOID)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap03Handler(IN PKTRAP_FRAME TrapFrame) KiTrap03Handler(IN PKTRAP_FRAME TrapFrame)
{ {
/* Save trap frame */ /* Save trap frame */
@ -851,6 +863,7 @@ KiTrap03Handler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap04Handler(IN PKTRAP_FRAME TrapFrame) KiTrap04Handler(IN PKTRAP_FRAME TrapFrame)
{ {
/* Save trap frame */ /* Save trap frame */
@ -870,6 +883,7 @@ KiTrap04Handler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap05Handler(IN PKTRAP_FRAME TrapFrame) KiTrap05Handler(IN PKTRAP_FRAME TrapFrame)
{ {
/* Save trap frame */ /* Save trap frame */
@ -892,6 +906,7 @@ KiTrap05Handler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap06Handler(IN PKTRAP_FRAME TrapFrame) KiTrap06Handler(IN PKTRAP_FRAME TrapFrame)
{ {
PUCHAR Instruction; PUCHAR Instruction;
@ -937,6 +952,7 @@ KiTrap06Handler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap07Handler(IN PKTRAP_FRAME TrapFrame) KiTrap07Handler(IN PKTRAP_FRAME TrapFrame)
{ {
PKTHREAD Thread, NpxThread; PKTHREAD Thread, NpxThread;
@ -1046,6 +1062,7 @@ KiTrap07Handler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap08Handler(IN PKTRAP_FRAME TrapFrame) KiTrap08Handler(IN PKTRAP_FRAME TrapFrame)
{ {
/* FIXME: Not handled */ /* FIXME: Not handled */
@ -1054,6 +1071,7 @@ KiTrap08Handler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap09Handler(IN PKTRAP_FRAME TrapFrame) KiTrap09Handler(IN PKTRAP_FRAME TrapFrame)
{ {
/* Save trap frame */ /* Save trap frame */
@ -1066,6 +1084,7 @@ KiTrap09Handler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap0AHandler(IN PKTRAP_FRAME TrapFrame) KiTrap0AHandler(IN PKTRAP_FRAME TrapFrame)
{ {
/* Save trap frame */ /* Save trap frame */
@ -1080,6 +1099,7 @@ KiTrap0AHandler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap0BHandler(IN PKTRAP_FRAME TrapFrame) KiTrap0BHandler(IN PKTRAP_FRAME TrapFrame)
{ {
/* Save trap frame */ /* Save trap frame */
@ -1092,6 +1112,7 @@ KiTrap0BHandler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap0CHandler(IN PKTRAP_FRAME TrapFrame) KiTrap0CHandler(IN PKTRAP_FRAME TrapFrame)
{ {
/* Save trap frame */ /* Save trap frame */
@ -1104,6 +1125,7 @@ KiTrap0CHandler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame, KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame,
IN ULONG EFlags) IN ULONG EFlags)
{ {
@ -1388,6 +1410,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame,
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap0EHandler(IN PKTRAP_FRAME TrapFrame) KiTrap0EHandler(IN PKTRAP_FRAME TrapFrame)
{ {
PKTHREAD Thread; PKTHREAD Thread;
@ -1510,6 +1533,7 @@ KiTrap0EHandler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap0FHandler(IN PKTRAP_FRAME TrapFrame) KiTrap0FHandler(IN PKTRAP_FRAME TrapFrame)
{ {
/* Save trap frame */ /* Save trap frame */
@ -1520,9 +1544,9 @@ KiTrap0FHandler(IN PKTRAP_FRAME TrapFrame)
KiSystemFatalException(EXCEPTION_RESERVED_TRAP, TrapFrame); KiSystemFatalException(EXCEPTION_RESERVED_TRAP, TrapFrame);
} }
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap10Handler(IN PKTRAP_FRAME TrapFrame) KiTrap10Handler(IN PKTRAP_FRAME TrapFrame)
{ {
PKTHREAD Thread; PKTHREAD Thread;
@ -1550,6 +1574,7 @@ KiTrap10Handler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap11Handler(IN PKTRAP_FRAME TrapFrame) KiTrap11Handler(IN PKTRAP_FRAME TrapFrame)
{ {
/* Save trap frame */ /* Save trap frame */
@ -1562,6 +1587,7 @@ KiTrap11Handler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiTrap13Handler(IN PKTRAP_FRAME TrapFrame) KiTrap13Handler(IN PKTRAP_FRAME TrapFrame)
{ {
PKTHREAD Thread; PKTHREAD Thread;
@ -1664,6 +1690,7 @@ KiCallbackReturnHandler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiRaiseAssertionHandler(IN PKTRAP_FRAME TrapFrame) KiRaiseAssertionHandler(IN PKTRAP_FRAME TrapFrame)
{ {
/* Save trap frame */ /* Save trap frame */
@ -1680,6 +1707,7 @@ KiRaiseAssertionHandler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiDebugServiceHandler(IN PKTRAP_FRAME TrapFrame) KiDebugServiceHandler(IN PKTRAP_FRAME TrapFrame)
{ {
/* Save trap frame */ /* Save trap frame */
@ -1694,6 +1722,7 @@ KiDebugServiceHandler(IN PKTRAP_FRAME TrapFrame)
VOID VOID
FASTCALL FASTCALL
DECLSPEC_NORETURN
KiSystemCall(IN ULONG SystemCallNumber, KiSystemCall(IN ULONG SystemCallNumber,
IN PVOID Arguments) IN PVOID Arguments)
{ {
@ -1784,6 +1813,7 @@ ExitCall:
VOID VOID
FORCEINLINE FORCEINLINE
DECLSPEC_NORETURN
KiSystemCallHandler(IN PKTRAP_FRAME TrapFrame, KiSystemCallHandler(IN PKTRAP_FRAME TrapFrame,
IN ULONG ServiceNumber, IN ULONG ServiceNumber,
IN PVOID Arguments, IN PVOID Arguments,
@ -1825,6 +1855,7 @@ KiSystemCallHandler(IN PKTRAP_FRAME TrapFrame,
VOID VOID
__attribute__((regparm(3))) __attribute__((regparm(3)))
DECLSPEC_NORETURN
KiFastCallEntryHandler(IN ULONG ServiceNumber, KiFastCallEntryHandler(IN ULONG ServiceNumber,
IN PVOID Arguments, IN PVOID Arguments,
IN PKTRAP_FRAME TrapFrame) IN PKTRAP_FRAME TrapFrame)
@ -1858,6 +1889,7 @@ KiFastCallEntryHandler(IN ULONG ServiceNumber,
VOID VOID
__attribute__((regparm(3))) __attribute__((regparm(3)))
DECLSPEC_NORETURN
KiSystemServiceHandler(IN ULONG ServiceNumber, KiSystemServiceHandler(IN ULONG ServiceNumber,
IN PVOID Arguments, IN PVOID Arguments,
IN PKTRAP_FRAME TrapFrame) IN PKTRAP_FRAME TrapFrame)