Module Name: src Committed By: maxv Date: Sat Feb 17 20:22:05 UTC 2018
Modified Files: src/sys/arch/amd64/amd64: amd64_trap.S Log Message: Start using ASM macros to define the trap entry points. No real functional change. To generate a diff of this commit: cvs rdiff -u -r1.24 -r1.25 src/sys/arch/amd64/amd64/amd64_trap.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/amd64/amd64/amd64_trap.S diff -u src/sys/arch/amd64/amd64/amd64_trap.S:1.24 src/sys/arch/amd64/amd64/amd64_trap.S:1.25 --- src/sys/arch/amd64/amd64/amd64_trap.S:1.24 Fri Feb 9 08:54:11 2018 +++ src/sys/arch/amd64/amd64/amd64_trap.S Sat Feb 17 20:22:05 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: amd64_trap.S,v 1.24 2018/02/09 08:54:11 maxv Exp $ */ +/* $NetBSD: amd64_trap.S,v 1.25 2018/02/17 20:22:05 maxv Exp $ */ /* * Copyright (c) 1998, 2007, 2008, 2017 The NetBSD Foundation, Inc. @@ -95,26 +95,49 @@ #define PRE_TRAP #endif -#define TRAPENTRY \ - INTRENTRY ; \ - jmp .Lalltraps_noentry +#ifdef XEN +/* + * I don't believe XEN generates in-kernel traps for the + * equivalent of iret, if it does this code would be needed + * in order to copy the user segment registers into the fault frame. + */ +#define check_swapgs alltraps +#endif #define TRAP_NJ(a) PRE_TRAP ; pushq $(a) #define ZTRAP_NJ(a) PRE_TRAP ; pushq $0 ; pushq $(a) -#define TRAP(a) TRAP_NJ(a) ; TRAPENTRY -#define ZTRAP(a) ZTRAP_NJ(a) ; TRAPENTRY +#define TRAP(a) TRAP_NJ(a) ; +#define ZTRAP(a) ZTRAP_NJ(a) ; + +.macro TRAP_ENTRY_POINT name,code,is_ztrap +IDTVEC(\name) + .if \is_ztrap + ZTRAP(\code) + .else + TRAP(\code) + .endif + INTRENTRY + jmp .Lalltraps_noentry +IDTVEC_END(\name) +.endm + +.macro TRAP_ENTRY_POINT_SWAPGS name,code,is_ztrap +IDTVEC(\name) + .if \is_ztrap + ZTRAP_NJ(\code) + .else + TRAP_NJ(\code) + .endif + jmp check_swapgs +IDTVEC_END(\name) +.endm .text TEXT_USER_BEGIN -IDTVEC(trap00) - ZTRAP(T_DIVIDE) -IDTVEC_END(trap00) - -IDTVEC(trap01) - ZTRAP(T_TRCTRAP) -IDTVEC_END(trap01) +TRAP_ENTRY_POINT trap00,T_DIVIDE,1 +TRAP_ENTRY_POINT trap01,T_TRCTRAP,1 /* * Non Maskable Interrupts are a special case: they can be triggered even @@ -197,17 +220,9 @@ IDTVEC(trap03) #endif IDTVEC_END(trap03) -IDTVEC(trap04) - ZTRAP(T_OFLOW) -IDTVEC_END(trap04) - -IDTVEC(trap05) - ZTRAP(T_BOUND) -IDTVEC_END(trap05) - -IDTVEC(trap06) - ZTRAP(T_PRIVINFLT) -IDTVEC_END(trap06) +TRAP_ENTRY_POINT trap04,T_OFLOW,1 +TRAP_ENTRY_POINT trap05,T_BOUND,1 +TRAP_ENTRY_POINT trap06,T_PRIVINFLT,1 IDTVEC(trap07) ZTRAP_NJ(T_DNA) @@ -259,41 +274,12 @@ IDTVEC(trap08) #endif IDTVEC_END(trap08) -IDTVEC(trap09) - ZTRAP(T_FPOPFLT) -IDTVEC_END(trap09) - -IDTVEC(trap10) - TRAP(T_TSSFLT) -IDTVEC_END(trap10) - -#ifdef XEN -/* - * I don't believe XEN generates in-kernel traps for the - * equivalent of iret, if it does this code would be needed - * in order to copy the user segment registers into the fault frame. - */ -#define check_swapgs alltraps -#endif - -IDTVEC(trap11) /* #NP() Segment not present */ - TRAP_NJ(T_SEGNPFLT) - jmp check_swapgs -IDTVEC_END(trap11) - -IDTVEC(trap12) /* #SS() Stack exception */ - TRAP_NJ(T_STKFLT) - jmp check_swapgs -IDTVEC_END(trap12) - -IDTVEC(trap13) /* #GP() General protection */ - TRAP_NJ(T_PROTFLT) - jmp check_swapgs -IDTVEC_END(trap13) - -IDTVEC(trap14) - TRAP(T_PAGEFLT) -IDTVEC_END(trap14) +TRAP_ENTRY_POINT trap09,T_FPOPFLT,1 +TRAP_ENTRY_POINT trap10,T_TSSFLT,0 +TRAP_ENTRY_POINT_SWAPGS trap11,T_SEGNPFLT,0 +TRAP_ENTRY_POINT_SWAPGS trap12,T_STKFLT,0 +TRAP_ENTRY_POINT_SWAPGS trap13,T_PROTFLT,0 +TRAP_ENTRY_POINT trap14,T_PAGEFLT,0 IDTVEC(trap15) ZTRAP_NJ(T_ASTFLT) @@ -316,45 +302,26 @@ IDTVEC(trap16) jmp .Lalltraps_checkusr IDTVEC_END(trap16) -IDTVEC(trap17) - TRAP(T_ALIGNFLT) -IDTVEC_END(trap17) - -IDTVEC(trap18) - ZTRAP(T_MCA) -IDTVEC_END(trap18) +TRAP_ENTRY_POINT trap17,T_ALIGNFLT,0 +TRAP_ENTRY_POINT trap18,T_MCA,1 IDTVEC(trap19) ZTRAP_NJ(T_XMM) jmp .Ldo_fputrap IDTVEC_END(trap19) -IDTVEC(trap20) -IDTVEC(trap21) -IDTVEC(trap22) -IDTVEC(trap23) -IDTVEC(trap24) -IDTVEC(trap25) -IDTVEC(trap26) -IDTVEC(trap27) -IDTVEC(trap28) -IDTVEC(trap29) -IDTVEC(trap30) -IDTVEC(trap31) - /* 20 - 31 reserved for future exp */ - ZTRAP(T_RESERVED) -IDTVEC_END(trap20) -IDTVEC_END(trap21) -IDTVEC_END(trap22) -IDTVEC_END(trap23) -IDTVEC_END(trap24) -IDTVEC_END(trap25) -IDTVEC_END(trap26) -IDTVEC_END(trap27) -IDTVEC_END(trap28) -IDTVEC_END(trap29) -IDTVEC_END(trap30) -IDTVEC_END(trap31) +TRAP_ENTRY_POINT trap20,T_RESERVED,1 +TRAP_ENTRY_POINT trap21,T_RESERVED,1 +TRAP_ENTRY_POINT trap22,T_RESERVED,1 +TRAP_ENTRY_POINT trap23,T_RESERVED,1 +TRAP_ENTRY_POINT trap24,T_RESERVED,1 +TRAP_ENTRY_POINT trap25,T_RESERVED,1 +TRAP_ENTRY_POINT trap26,T_RESERVED,1 +TRAP_ENTRY_POINT trap27,T_RESERVED,1 +TRAP_ENTRY_POINT trap28,T_RESERVED,1 +TRAP_ENTRY_POINT trap29,T_RESERVED,1 +TRAP_ENTRY_POINT trap30,T_RESERVED,1 +TRAP_ENTRY_POINT trap31,T_RESERVED,1 IDTVEC(intrspurious) ZTRAP_NJ(T_ASTFLT)