1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _ASM_X86_IDTENTRY_H 3*4882a593Smuzhiyun #define _ASM_X86_IDTENTRY_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* Interrupts/Exceptions */ 6*4882a593Smuzhiyun #include <asm/trapnr.h> 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 9*4882a593Smuzhiyun #include <linux/entry-common.h> 10*4882a593Smuzhiyun #include <linux/hardirq.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <asm/irq_stack.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /** 15*4882a593Smuzhiyun * DECLARE_IDTENTRY - Declare functions for simple IDT entry points 16*4882a593Smuzhiyun * No error code pushed by hardware 17*4882a593Smuzhiyun * @vector: Vector number (ignored for C) 18*4882a593Smuzhiyun * @func: Function name of the entry point 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * Declares three functions: 21*4882a593Smuzhiyun * - The ASM entry point: asm_##func 22*4882a593Smuzhiyun * - The XEN PV trap entry point: xen_##func (maybe unused) 23*4882a593Smuzhiyun * - The C handler called from the ASM entry point 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * Note: This is the C variant of DECLARE_IDTENTRY(). As the name says it 26*4882a593Smuzhiyun * declares the entry points for usage in C code. There is an ASM variant 27*4882a593Smuzhiyun * as well which is used to emit the entry stubs in entry_32/64.S. 28*4882a593Smuzhiyun */ 29*4882a593Smuzhiyun #define DECLARE_IDTENTRY(vector, func) \ 30*4882a593Smuzhiyun asmlinkage void asm_##func(void); \ 31*4882a593Smuzhiyun asmlinkage void xen_asm_##func(void); \ 32*4882a593Smuzhiyun __visible void func(struct pt_regs *regs) 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /** 35*4882a593Smuzhiyun * DEFINE_IDTENTRY - Emit code for simple IDT entry points 36*4882a593Smuzhiyun * @func: Function name of the entry point 37*4882a593Smuzhiyun * 38*4882a593Smuzhiyun * @func is called from ASM entry code with interrupts disabled. 39*4882a593Smuzhiyun * 40*4882a593Smuzhiyun * The macro is written so it acts as function definition. Append the 41*4882a593Smuzhiyun * body with a pair of curly brackets. 42*4882a593Smuzhiyun * 43*4882a593Smuzhiyun * irqentry_enter() contains common code which has to be invoked before 44*4882a593Smuzhiyun * arbitrary code in the body. irqentry_exit() contains common code 45*4882a593Smuzhiyun * which has to run before returning to the low level assembly code. 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun #define DEFINE_IDTENTRY(func) \ 48*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs); \ 49*4882a593Smuzhiyun \ 50*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs) \ 51*4882a593Smuzhiyun { \ 52*4882a593Smuzhiyun irqentry_state_t state = irqentry_enter(regs); \ 53*4882a593Smuzhiyun \ 54*4882a593Smuzhiyun instrumentation_begin(); \ 55*4882a593Smuzhiyun __##func (regs); \ 56*4882a593Smuzhiyun instrumentation_end(); \ 57*4882a593Smuzhiyun irqentry_exit(regs, state); \ 58*4882a593Smuzhiyun } \ 59*4882a593Smuzhiyun \ 60*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* Special case for 32bit IRET 'trap' */ 63*4882a593Smuzhiyun #define DECLARE_IDTENTRY_SW DECLARE_IDTENTRY 64*4882a593Smuzhiyun #define DEFINE_IDTENTRY_SW DEFINE_IDTENTRY 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /** 67*4882a593Smuzhiyun * DECLARE_IDTENTRY_ERRORCODE - Declare functions for simple IDT entry points 68*4882a593Smuzhiyun * Error code pushed by hardware 69*4882a593Smuzhiyun * @vector: Vector number (ignored for C) 70*4882a593Smuzhiyun * @func: Function name of the entry point 71*4882a593Smuzhiyun * 72*4882a593Smuzhiyun * Declares three functions: 73*4882a593Smuzhiyun * - The ASM entry point: asm_##func 74*4882a593Smuzhiyun * - The XEN PV trap entry point: xen_##func (maybe unused) 75*4882a593Smuzhiyun * - The C handler called from the ASM entry point 76*4882a593Smuzhiyun * 77*4882a593Smuzhiyun * Same as DECLARE_IDTENTRY, but has an extra error_code argument for the 78*4882a593Smuzhiyun * C-handler. 79*4882a593Smuzhiyun */ 80*4882a593Smuzhiyun #define DECLARE_IDTENTRY_ERRORCODE(vector, func) \ 81*4882a593Smuzhiyun asmlinkage void asm_##func(void); \ 82*4882a593Smuzhiyun asmlinkage void xen_asm_##func(void); \ 83*4882a593Smuzhiyun __visible void func(struct pt_regs *regs, unsigned long error_code) 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /** 86*4882a593Smuzhiyun * DEFINE_IDTENTRY_ERRORCODE - Emit code for simple IDT entry points 87*4882a593Smuzhiyun * Error code pushed by hardware 88*4882a593Smuzhiyun * @func: Function name of the entry point 89*4882a593Smuzhiyun * 90*4882a593Smuzhiyun * Same as DEFINE_IDTENTRY, but has an extra error_code argument 91*4882a593Smuzhiyun */ 92*4882a593Smuzhiyun #define DEFINE_IDTENTRY_ERRORCODE(func) \ 93*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs, \ 94*4882a593Smuzhiyun unsigned long error_code); \ 95*4882a593Smuzhiyun \ 96*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs, \ 97*4882a593Smuzhiyun unsigned long error_code) \ 98*4882a593Smuzhiyun { \ 99*4882a593Smuzhiyun irqentry_state_t state = irqentry_enter(regs); \ 100*4882a593Smuzhiyun \ 101*4882a593Smuzhiyun instrumentation_begin(); \ 102*4882a593Smuzhiyun __##func (regs, error_code); \ 103*4882a593Smuzhiyun instrumentation_end(); \ 104*4882a593Smuzhiyun irqentry_exit(regs, state); \ 105*4882a593Smuzhiyun } \ 106*4882a593Smuzhiyun \ 107*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs, \ 108*4882a593Smuzhiyun unsigned long error_code) 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /** 111*4882a593Smuzhiyun * DECLARE_IDTENTRY_RAW - Declare functions for raw IDT entry points 112*4882a593Smuzhiyun * No error code pushed by hardware 113*4882a593Smuzhiyun * @vector: Vector number (ignored for C) 114*4882a593Smuzhiyun * @func: Function name of the entry point 115*4882a593Smuzhiyun * 116*4882a593Smuzhiyun * Maps to DECLARE_IDTENTRY(). 117*4882a593Smuzhiyun */ 118*4882a593Smuzhiyun #define DECLARE_IDTENTRY_RAW(vector, func) \ 119*4882a593Smuzhiyun DECLARE_IDTENTRY(vector, func) 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /** 122*4882a593Smuzhiyun * DEFINE_IDTENTRY_RAW - Emit code for raw IDT entry points 123*4882a593Smuzhiyun * @func: Function name of the entry point 124*4882a593Smuzhiyun * 125*4882a593Smuzhiyun * @func is called from ASM entry code with interrupts disabled. 126*4882a593Smuzhiyun * 127*4882a593Smuzhiyun * The macro is written so it acts as function definition. Append the 128*4882a593Smuzhiyun * body with a pair of curly brackets. 129*4882a593Smuzhiyun * 130*4882a593Smuzhiyun * Contrary to DEFINE_IDTENTRY() this does not invoke the 131*4882a593Smuzhiyun * idtentry_enter/exit() helpers before and after the body invocation. This 132*4882a593Smuzhiyun * needs to be done in the body itself if applicable. Use if extra work 133*4882a593Smuzhiyun * is required before the enter/exit() helpers are invoked. 134*4882a593Smuzhiyun */ 135*4882a593Smuzhiyun #define DEFINE_IDTENTRY_RAW(func) \ 136*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs) 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun /** 139*4882a593Smuzhiyun * DECLARE_IDTENTRY_RAW_ERRORCODE - Declare functions for raw IDT entry points 140*4882a593Smuzhiyun * Error code pushed by hardware 141*4882a593Smuzhiyun * @vector: Vector number (ignored for C) 142*4882a593Smuzhiyun * @func: Function name of the entry point 143*4882a593Smuzhiyun * 144*4882a593Smuzhiyun * Maps to DECLARE_IDTENTRY_ERRORCODE() 145*4882a593Smuzhiyun */ 146*4882a593Smuzhiyun #define DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func) \ 147*4882a593Smuzhiyun DECLARE_IDTENTRY_ERRORCODE(vector, func) 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /** 150*4882a593Smuzhiyun * DEFINE_IDTENTRY_RAW_ERRORCODE - Emit code for raw IDT entry points 151*4882a593Smuzhiyun * @func: Function name of the entry point 152*4882a593Smuzhiyun * 153*4882a593Smuzhiyun * @func is called from ASM entry code with interrupts disabled. 154*4882a593Smuzhiyun * 155*4882a593Smuzhiyun * The macro is written so it acts as function definition. Append the 156*4882a593Smuzhiyun * body with a pair of curly brackets. 157*4882a593Smuzhiyun * 158*4882a593Smuzhiyun * Contrary to DEFINE_IDTENTRY_ERRORCODE() this does not invoke the 159*4882a593Smuzhiyun * irqentry_enter/exit() helpers before and after the body invocation. This 160*4882a593Smuzhiyun * needs to be done in the body itself if applicable. Use if extra work 161*4882a593Smuzhiyun * is required before the enter/exit() helpers are invoked. 162*4882a593Smuzhiyun */ 163*4882a593Smuzhiyun #define DEFINE_IDTENTRY_RAW_ERRORCODE(func) \ 164*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs, unsigned long error_code) 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /** 167*4882a593Smuzhiyun * DECLARE_IDTENTRY_IRQ - Declare functions for device interrupt IDT entry 168*4882a593Smuzhiyun * points (common/spurious) 169*4882a593Smuzhiyun * @vector: Vector number (ignored for C) 170*4882a593Smuzhiyun * @func: Function name of the entry point 171*4882a593Smuzhiyun * 172*4882a593Smuzhiyun * Maps to DECLARE_IDTENTRY_ERRORCODE() 173*4882a593Smuzhiyun */ 174*4882a593Smuzhiyun #define DECLARE_IDTENTRY_IRQ(vector, func) \ 175*4882a593Smuzhiyun DECLARE_IDTENTRY_ERRORCODE(vector, func) 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun /** 178*4882a593Smuzhiyun * DEFINE_IDTENTRY_IRQ - Emit code for device interrupt IDT entry points 179*4882a593Smuzhiyun * @func: Function name of the entry point 180*4882a593Smuzhiyun * 181*4882a593Smuzhiyun * The vector number is pushed by the low level entry stub and handed 182*4882a593Smuzhiyun * to the function as error_code argument which needs to be truncated 183*4882a593Smuzhiyun * to an u8 because the push is sign extending. 184*4882a593Smuzhiyun * 185*4882a593Smuzhiyun * irq_enter/exit_rcu() are invoked before the function body and the 186*4882a593Smuzhiyun * KVM L1D flush request is set. Stack switching to the interrupt stack 187*4882a593Smuzhiyun * has to be done in the function body if necessary. 188*4882a593Smuzhiyun */ 189*4882a593Smuzhiyun #define DEFINE_IDTENTRY_IRQ(func) \ 190*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs, u8 vector); \ 191*4882a593Smuzhiyun \ 192*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs, \ 193*4882a593Smuzhiyun unsigned long error_code) \ 194*4882a593Smuzhiyun { \ 195*4882a593Smuzhiyun irqentry_state_t state = irqentry_enter(regs); \ 196*4882a593Smuzhiyun \ 197*4882a593Smuzhiyun instrumentation_begin(); \ 198*4882a593Smuzhiyun irq_enter_rcu(); \ 199*4882a593Smuzhiyun kvm_set_cpu_l1tf_flush_l1d(); \ 200*4882a593Smuzhiyun __##func (regs, (u8)error_code); \ 201*4882a593Smuzhiyun irq_exit_rcu(); \ 202*4882a593Smuzhiyun instrumentation_end(); \ 203*4882a593Smuzhiyun irqentry_exit(regs, state); \ 204*4882a593Smuzhiyun } \ 205*4882a593Smuzhiyun \ 206*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs, u8 vector) 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun /** 209*4882a593Smuzhiyun * DECLARE_IDTENTRY_SYSVEC - Declare functions for system vector entry points 210*4882a593Smuzhiyun * @vector: Vector number (ignored for C) 211*4882a593Smuzhiyun * @func: Function name of the entry point 212*4882a593Smuzhiyun * 213*4882a593Smuzhiyun * Declares three functions: 214*4882a593Smuzhiyun * - The ASM entry point: asm_##func 215*4882a593Smuzhiyun * - The XEN PV trap entry point: xen_##func (maybe unused) 216*4882a593Smuzhiyun * - The C handler called from the ASM entry point 217*4882a593Smuzhiyun * 218*4882a593Smuzhiyun * Maps to DECLARE_IDTENTRY(). 219*4882a593Smuzhiyun */ 220*4882a593Smuzhiyun #define DECLARE_IDTENTRY_SYSVEC(vector, func) \ 221*4882a593Smuzhiyun DECLARE_IDTENTRY(vector, func) 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun /** 224*4882a593Smuzhiyun * DEFINE_IDTENTRY_SYSVEC - Emit code for system vector IDT entry points 225*4882a593Smuzhiyun * @func: Function name of the entry point 226*4882a593Smuzhiyun * 227*4882a593Smuzhiyun * irqentry_enter/exit() and irq_enter/exit_rcu() are invoked before the 228*4882a593Smuzhiyun * function body. KVM L1D flush request is set. 229*4882a593Smuzhiyun * 230*4882a593Smuzhiyun * Runs the function on the interrupt stack if the entry hit kernel mode 231*4882a593Smuzhiyun */ 232*4882a593Smuzhiyun #define DEFINE_IDTENTRY_SYSVEC(func) \ 233*4882a593Smuzhiyun static void __##func(struct pt_regs *regs); \ 234*4882a593Smuzhiyun \ 235*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs) \ 236*4882a593Smuzhiyun { \ 237*4882a593Smuzhiyun irqentry_state_t state = irqentry_enter(regs); \ 238*4882a593Smuzhiyun \ 239*4882a593Smuzhiyun instrumentation_begin(); \ 240*4882a593Smuzhiyun irq_enter_rcu(); \ 241*4882a593Smuzhiyun kvm_set_cpu_l1tf_flush_l1d(); \ 242*4882a593Smuzhiyun run_sysvec_on_irqstack_cond(__##func, regs); \ 243*4882a593Smuzhiyun irq_exit_rcu(); \ 244*4882a593Smuzhiyun instrumentation_end(); \ 245*4882a593Smuzhiyun irqentry_exit(regs, state); \ 246*4882a593Smuzhiyun } \ 247*4882a593Smuzhiyun \ 248*4882a593Smuzhiyun static noinline void __##func(struct pt_regs *regs) 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun /** 251*4882a593Smuzhiyun * DEFINE_IDTENTRY_SYSVEC_SIMPLE - Emit code for simple system vector IDT 252*4882a593Smuzhiyun * entry points 253*4882a593Smuzhiyun * @func: Function name of the entry point 254*4882a593Smuzhiyun * 255*4882a593Smuzhiyun * Runs the function on the interrupted stack. No switch to IRQ stack and 256*4882a593Smuzhiyun * only the minimal __irq_enter/exit() handling. 257*4882a593Smuzhiyun * 258*4882a593Smuzhiyun * Only use for 'empty' vectors like reschedule IPI and KVM posted 259*4882a593Smuzhiyun * interrupt vectors. 260*4882a593Smuzhiyun */ 261*4882a593Smuzhiyun #define DEFINE_IDTENTRY_SYSVEC_SIMPLE(func) \ 262*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs); \ 263*4882a593Smuzhiyun \ 264*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs) \ 265*4882a593Smuzhiyun { \ 266*4882a593Smuzhiyun irqentry_state_t state = irqentry_enter(regs); \ 267*4882a593Smuzhiyun \ 268*4882a593Smuzhiyun instrumentation_begin(); \ 269*4882a593Smuzhiyun __irq_enter_raw(); \ 270*4882a593Smuzhiyun kvm_set_cpu_l1tf_flush_l1d(); \ 271*4882a593Smuzhiyun __##func (regs); \ 272*4882a593Smuzhiyun __irq_exit_raw(); \ 273*4882a593Smuzhiyun instrumentation_end(); \ 274*4882a593Smuzhiyun irqentry_exit(regs, state); \ 275*4882a593Smuzhiyun } \ 276*4882a593Smuzhiyun \ 277*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs) 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun /** 280*4882a593Smuzhiyun * DECLARE_IDTENTRY_XENCB - Declare functions for XEN HV callback entry point 281*4882a593Smuzhiyun * @vector: Vector number (ignored for C) 282*4882a593Smuzhiyun * @func: Function name of the entry point 283*4882a593Smuzhiyun * 284*4882a593Smuzhiyun * Declares three functions: 285*4882a593Smuzhiyun * - The ASM entry point: asm_##func 286*4882a593Smuzhiyun * - The XEN PV trap entry point: xen_##func (maybe unused) 287*4882a593Smuzhiyun * - The C handler called from the ASM entry point 288*4882a593Smuzhiyun * 289*4882a593Smuzhiyun * Maps to DECLARE_IDTENTRY(). Distinct entry point to handle the 32/64-bit 290*4882a593Smuzhiyun * difference 291*4882a593Smuzhiyun */ 292*4882a593Smuzhiyun #define DECLARE_IDTENTRY_XENCB(vector, func) \ 293*4882a593Smuzhiyun DECLARE_IDTENTRY(vector, func) 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun #ifdef CONFIG_X86_64 296*4882a593Smuzhiyun /** 297*4882a593Smuzhiyun * DECLARE_IDTENTRY_IST - Declare functions for IST handling IDT entry points 298*4882a593Smuzhiyun * @vector: Vector number (ignored for C) 299*4882a593Smuzhiyun * @func: Function name of the entry point 300*4882a593Smuzhiyun * 301*4882a593Smuzhiyun * Maps to DECLARE_IDTENTRY_RAW, but declares also the NOIST C handler 302*4882a593Smuzhiyun * which is called from the ASM entry point on user mode entry 303*4882a593Smuzhiyun */ 304*4882a593Smuzhiyun #define DECLARE_IDTENTRY_IST(vector, func) \ 305*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(vector, func); \ 306*4882a593Smuzhiyun __visible void noist_##func(struct pt_regs *regs) 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun /** 309*4882a593Smuzhiyun * DECLARE_IDTENTRY_VC - Declare functions for the VC entry point 310*4882a593Smuzhiyun * @vector: Vector number (ignored for C) 311*4882a593Smuzhiyun * @func: Function name of the entry point 312*4882a593Smuzhiyun * 313*4882a593Smuzhiyun * Maps to DECLARE_IDTENTRY_RAW_ERRORCODE, but declares also the 314*4882a593Smuzhiyun * safe_stack C handler. 315*4882a593Smuzhiyun */ 316*4882a593Smuzhiyun #define DECLARE_IDTENTRY_VC(vector, func) \ 317*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func); \ 318*4882a593Smuzhiyun __visible noinstr void kernel_##func(struct pt_regs *regs, unsigned long error_code); \ 319*4882a593Smuzhiyun __visible noinstr void user_##func(struct pt_regs *regs, unsigned long error_code) 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun /** 322*4882a593Smuzhiyun * DEFINE_IDTENTRY_IST - Emit code for IST entry points 323*4882a593Smuzhiyun * @func: Function name of the entry point 324*4882a593Smuzhiyun * 325*4882a593Smuzhiyun * Maps to DEFINE_IDTENTRY_RAW 326*4882a593Smuzhiyun */ 327*4882a593Smuzhiyun #define DEFINE_IDTENTRY_IST(func) \ 328*4882a593Smuzhiyun DEFINE_IDTENTRY_RAW(func) 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun /** 331*4882a593Smuzhiyun * DEFINE_IDTENTRY_NOIST - Emit code for NOIST entry points which 332*4882a593Smuzhiyun * belong to a IST entry point (MCE, DB) 333*4882a593Smuzhiyun * @func: Function name of the entry point. Must be the same as 334*4882a593Smuzhiyun * the function name of the corresponding IST variant 335*4882a593Smuzhiyun * 336*4882a593Smuzhiyun * Maps to DEFINE_IDTENTRY_RAW(). 337*4882a593Smuzhiyun */ 338*4882a593Smuzhiyun #define DEFINE_IDTENTRY_NOIST(func) \ 339*4882a593Smuzhiyun DEFINE_IDTENTRY_RAW(noist_##func) 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun /** 342*4882a593Smuzhiyun * DECLARE_IDTENTRY_DF - Declare functions for double fault 343*4882a593Smuzhiyun * @vector: Vector number (ignored for C) 344*4882a593Smuzhiyun * @func: Function name of the entry point 345*4882a593Smuzhiyun * 346*4882a593Smuzhiyun * Maps to DECLARE_IDTENTRY_RAW_ERRORCODE 347*4882a593Smuzhiyun */ 348*4882a593Smuzhiyun #define DECLARE_IDTENTRY_DF(vector, func) \ 349*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func) 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun /** 352*4882a593Smuzhiyun * DEFINE_IDTENTRY_DF - Emit code for double fault 353*4882a593Smuzhiyun * @func: Function name of the entry point 354*4882a593Smuzhiyun * 355*4882a593Smuzhiyun * Maps to DEFINE_IDTENTRY_RAW_ERRORCODE 356*4882a593Smuzhiyun */ 357*4882a593Smuzhiyun #define DEFINE_IDTENTRY_DF(func) \ 358*4882a593Smuzhiyun DEFINE_IDTENTRY_RAW_ERRORCODE(func) 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun /** 361*4882a593Smuzhiyun * DEFINE_IDTENTRY_VC_KERNEL - Emit code for VMM communication handler 362*4882a593Smuzhiyun when raised from kernel mode 363*4882a593Smuzhiyun * @func: Function name of the entry point 364*4882a593Smuzhiyun * 365*4882a593Smuzhiyun * Maps to DEFINE_IDTENTRY_RAW_ERRORCODE 366*4882a593Smuzhiyun */ 367*4882a593Smuzhiyun #define DEFINE_IDTENTRY_VC_KERNEL(func) \ 368*4882a593Smuzhiyun DEFINE_IDTENTRY_RAW_ERRORCODE(kernel_##func) 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun /** 371*4882a593Smuzhiyun * DEFINE_IDTENTRY_VC_USER - Emit code for VMM communication handler 372*4882a593Smuzhiyun when raised from user mode 373*4882a593Smuzhiyun * @func: Function name of the entry point 374*4882a593Smuzhiyun * 375*4882a593Smuzhiyun * Maps to DEFINE_IDTENTRY_RAW_ERRORCODE 376*4882a593Smuzhiyun */ 377*4882a593Smuzhiyun #define DEFINE_IDTENTRY_VC_USER(func) \ 378*4882a593Smuzhiyun DEFINE_IDTENTRY_RAW_ERRORCODE(user_##func) 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun #else /* CONFIG_X86_64 */ 381*4882a593Smuzhiyun 382*4882a593Smuzhiyun /** 383*4882a593Smuzhiyun * DECLARE_IDTENTRY_DF - Declare functions for double fault 32bit variant 384*4882a593Smuzhiyun * @vector: Vector number (ignored for C) 385*4882a593Smuzhiyun * @func: Function name of the entry point 386*4882a593Smuzhiyun * 387*4882a593Smuzhiyun * Declares two functions: 388*4882a593Smuzhiyun * - The ASM entry point: asm_##func 389*4882a593Smuzhiyun * - The C handler called from the C shim 390*4882a593Smuzhiyun */ 391*4882a593Smuzhiyun #define DECLARE_IDTENTRY_DF(vector, func) \ 392*4882a593Smuzhiyun asmlinkage void asm_##func(void); \ 393*4882a593Smuzhiyun __visible void func(struct pt_regs *regs, \ 394*4882a593Smuzhiyun unsigned long error_code, \ 395*4882a593Smuzhiyun unsigned long address) 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun /** 398*4882a593Smuzhiyun * DEFINE_IDTENTRY_DF - Emit code for double fault on 32bit 399*4882a593Smuzhiyun * @func: Function name of the entry point 400*4882a593Smuzhiyun * 401*4882a593Smuzhiyun * This is called through the doublefault shim which already provides 402*4882a593Smuzhiyun * cr2 in the address argument. 403*4882a593Smuzhiyun */ 404*4882a593Smuzhiyun #define DEFINE_IDTENTRY_DF(func) \ 405*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs, \ 406*4882a593Smuzhiyun unsigned long error_code, \ 407*4882a593Smuzhiyun unsigned long address) 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun #endif /* !CONFIG_X86_64 */ 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun /* C-Code mapping */ 412*4882a593Smuzhiyun #define DECLARE_IDTENTRY_NMI DECLARE_IDTENTRY_RAW 413*4882a593Smuzhiyun #define DEFINE_IDTENTRY_NMI DEFINE_IDTENTRY_RAW 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun #ifdef CONFIG_X86_64 416*4882a593Smuzhiyun #define DECLARE_IDTENTRY_MCE DECLARE_IDTENTRY_IST 417*4882a593Smuzhiyun #define DEFINE_IDTENTRY_MCE DEFINE_IDTENTRY_IST 418*4882a593Smuzhiyun #define DEFINE_IDTENTRY_MCE_USER DEFINE_IDTENTRY_NOIST 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun #define DECLARE_IDTENTRY_DEBUG DECLARE_IDTENTRY_IST 421*4882a593Smuzhiyun #define DEFINE_IDTENTRY_DEBUG DEFINE_IDTENTRY_IST 422*4882a593Smuzhiyun #define DEFINE_IDTENTRY_DEBUG_USER DEFINE_IDTENTRY_NOIST 423*4882a593Smuzhiyun #endif 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun #else /* !__ASSEMBLY__ */ 426*4882a593Smuzhiyun 427*4882a593Smuzhiyun /* 428*4882a593Smuzhiyun * The ASM variants for DECLARE_IDTENTRY*() which emit the ASM entry stubs. 429*4882a593Smuzhiyun */ 430*4882a593Smuzhiyun #define DECLARE_IDTENTRY(vector, func) \ 431*4882a593Smuzhiyun idtentry vector asm_##func func has_error_code=0 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun #define DECLARE_IDTENTRY_ERRORCODE(vector, func) \ 434*4882a593Smuzhiyun idtentry vector asm_##func func has_error_code=1 435*4882a593Smuzhiyun 436*4882a593Smuzhiyun /* Special case for 32bit IRET 'trap'. Do not emit ASM code */ 437*4882a593Smuzhiyun #define DECLARE_IDTENTRY_SW(vector, func) 438*4882a593Smuzhiyun 439*4882a593Smuzhiyun #define DECLARE_IDTENTRY_RAW(vector, func) \ 440*4882a593Smuzhiyun DECLARE_IDTENTRY(vector, func) 441*4882a593Smuzhiyun 442*4882a593Smuzhiyun #define DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func) \ 443*4882a593Smuzhiyun DECLARE_IDTENTRY_ERRORCODE(vector, func) 444*4882a593Smuzhiyun 445*4882a593Smuzhiyun /* Entries for common/spurious (device) interrupts */ 446*4882a593Smuzhiyun #define DECLARE_IDTENTRY_IRQ(vector, func) \ 447*4882a593Smuzhiyun idtentry_irq vector func 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun /* System vector entries */ 450*4882a593Smuzhiyun #define DECLARE_IDTENTRY_SYSVEC(vector, func) \ 451*4882a593Smuzhiyun idtentry_sysvec vector func 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun #ifdef CONFIG_X86_64 454*4882a593Smuzhiyun # define DECLARE_IDTENTRY_MCE(vector, func) \ 455*4882a593Smuzhiyun idtentry_mce_db vector asm_##func func 456*4882a593Smuzhiyun 457*4882a593Smuzhiyun # define DECLARE_IDTENTRY_DEBUG(vector, func) \ 458*4882a593Smuzhiyun idtentry_mce_db vector asm_##func func 459*4882a593Smuzhiyun 460*4882a593Smuzhiyun # define DECLARE_IDTENTRY_DF(vector, func) \ 461*4882a593Smuzhiyun idtentry_df vector asm_##func func 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun # define DECLARE_IDTENTRY_XENCB(vector, func) \ 464*4882a593Smuzhiyun DECLARE_IDTENTRY(vector, func) 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun # define DECLARE_IDTENTRY_VC(vector, func) \ 467*4882a593Smuzhiyun idtentry_vc vector asm_##func func 468*4882a593Smuzhiyun 469*4882a593Smuzhiyun #else 470*4882a593Smuzhiyun # define DECLARE_IDTENTRY_MCE(vector, func) \ 471*4882a593Smuzhiyun DECLARE_IDTENTRY(vector, func) 472*4882a593Smuzhiyun 473*4882a593Smuzhiyun /* No ASM emitted for DF as this goes through a C shim */ 474*4882a593Smuzhiyun # define DECLARE_IDTENTRY_DF(vector, func) 475*4882a593Smuzhiyun 476*4882a593Smuzhiyun /* No ASM emitted for XEN hypervisor callback */ 477*4882a593Smuzhiyun # define DECLARE_IDTENTRY_XENCB(vector, func) 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun #endif 480*4882a593Smuzhiyun 481*4882a593Smuzhiyun /* No ASM code emitted for NMI */ 482*4882a593Smuzhiyun #define DECLARE_IDTENTRY_NMI(vector, func) 483*4882a593Smuzhiyun 484*4882a593Smuzhiyun /* 485*4882a593Smuzhiyun * ASM code to emit the common vector entry stubs where each stub is 486*4882a593Smuzhiyun * packed into 8 bytes. 487*4882a593Smuzhiyun * 488*4882a593Smuzhiyun * Note, that the 'pushq imm8' is emitted via '.byte 0x6a, vector' because 489*4882a593Smuzhiyun * GCC treats the local vector variable as unsigned int and would expand 490*4882a593Smuzhiyun * all vectors above 0x7F to a 5 byte push. The original code did an 491*4882a593Smuzhiyun * adjustment of the vector number to be in the signed byte range to avoid 492*4882a593Smuzhiyun * this. While clever it's mindboggling counterintuitive and requires the 493*4882a593Smuzhiyun * odd conversion back to a real vector number in the C entry points. Using 494*4882a593Smuzhiyun * .byte achieves the same thing and the only fixup needed in the C entry 495*4882a593Smuzhiyun * point is to mask off the bits above bit 7 because the push is sign 496*4882a593Smuzhiyun * extending. 497*4882a593Smuzhiyun */ 498*4882a593Smuzhiyun .align 8 499*4882a593Smuzhiyun SYM_CODE_START(irq_entries_start) 500*4882a593Smuzhiyun vector=FIRST_EXTERNAL_VECTOR 501*4882a593Smuzhiyun .rept (FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR) 502*4882a593Smuzhiyun UNWIND_HINT_IRET_REGS 503*4882a593Smuzhiyun 0 : 504*4882a593Smuzhiyun .byte 0x6a, vector 505*4882a593Smuzhiyun jmp asm_common_interrupt 506*4882a593Smuzhiyun nop 507*4882a593Smuzhiyun /* Ensure that the above is 8 bytes max */ 508*4882a593Smuzhiyun . = 0b + 8 509*4882a593Smuzhiyun vector = vector+1 510*4882a593Smuzhiyun .endr 511*4882a593Smuzhiyun SYM_CODE_END(irq_entries_start) 512*4882a593Smuzhiyun 513*4882a593Smuzhiyun #ifdef CONFIG_X86_LOCAL_APIC 514*4882a593Smuzhiyun .align 8 515*4882a593Smuzhiyun SYM_CODE_START(spurious_entries_start) 516*4882a593Smuzhiyun vector=FIRST_SYSTEM_VECTOR 517*4882a593Smuzhiyun .rept (NR_VECTORS - FIRST_SYSTEM_VECTOR) 518*4882a593Smuzhiyun UNWIND_HINT_IRET_REGS 519*4882a593Smuzhiyun 0 : 520*4882a593Smuzhiyun .byte 0x6a, vector 521*4882a593Smuzhiyun jmp asm_spurious_interrupt 522*4882a593Smuzhiyun nop 523*4882a593Smuzhiyun /* Ensure that the above is 8 bytes max */ 524*4882a593Smuzhiyun . = 0b + 8 525*4882a593Smuzhiyun vector = vector+1 526*4882a593Smuzhiyun .endr 527*4882a593Smuzhiyun SYM_CODE_END(spurious_entries_start) 528*4882a593Smuzhiyun #endif 529*4882a593Smuzhiyun 530*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */ 531*4882a593Smuzhiyun 532*4882a593Smuzhiyun /* 533*4882a593Smuzhiyun * The actual entry points. Note that DECLARE_IDTENTRY*() serves two 534*4882a593Smuzhiyun * purposes: 535*4882a593Smuzhiyun * - provide the function declarations when included from C-Code 536*4882a593Smuzhiyun * - emit the ASM stubs when included from entry_32/64.S 537*4882a593Smuzhiyun * 538*4882a593Smuzhiyun * This avoids duplicate defines and ensures that everything is consistent. 539*4882a593Smuzhiyun */ 540*4882a593Smuzhiyun 541*4882a593Smuzhiyun /* 542*4882a593Smuzhiyun * Dummy trap number so the low level ASM macro vector number checks do not 543*4882a593Smuzhiyun * match which results in emitting plain IDTENTRY stubs without bells and 544*4882a593Smuzhiyun * whistels. 545*4882a593Smuzhiyun */ 546*4882a593Smuzhiyun #define X86_TRAP_OTHER 0xFFFF 547*4882a593Smuzhiyun 548*4882a593Smuzhiyun /* Simple exception entry points. No hardware error code */ 549*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_DE, exc_divide_error); 550*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_OF, exc_overflow); 551*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_BR, exc_bounds); 552*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_NM, exc_device_not_available); 553*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_OLD_MF, exc_coproc_segment_overrun); 554*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_SPURIOUS, exc_spurious_interrupt_bug); 555*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_MF, exc_coprocessor_error); 556*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_XF, exc_simd_coprocessor_error); 557*4882a593Smuzhiyun 558*4882a593Smuzhiyun /* 32bit software IRET trap. Do not emit ASM code */ 559*4882a593Smuzhiyun DECLARE_IDTENTRY_SW(X86_TRAP_IRET, iret_error); 560*4882a593Smuzhiyun 561*4882a593Smuzhiyun /* Simple exception entries with error code pushed by hardware */ 562*4882a593Smuzhiyun DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_TS, exc_invalid_tss); 563*4882a593Smuzhiyun DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_NP, exc_segment_not_present); 564*4882a593Smuzhiyun DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_SS, exc_stack_segment); 565*4882a593Smuzhiyun DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_GP, exc_general_protection); 566*4882a593Smuzhiyun DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_AC, exc_alignment_check); 567*4882a593Smuzhiyun 568*4882a593Smuzhiyun /* Raw exception entries which need extra work */ 569*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_UD, exc_invalid_op); 570*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_BP, exc_int3); 571*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW_ERRORCODE(X86_TRAP_PF, exc_page_fault); 572*4882a593Smuzhiyun 573*4882a593Smuzhiyun #ifdef CONFIG_X86_MCE 574*4882a593Smuzhiyun #ifdef CONFIG_X86_64 575*4882a593Smuzhiyun DECLARE_IDTENTRY_MCE(X86_TRAP_MC, exc_machine_check); 576*4882a593Smuzhiyun #else 577*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_MC, exc_machine_check); 578*4882a593Smuzhiyun #endif 579*4882a593Smuzhiyun #endif 580*4882a593Smuzhiyun 581*4882a593Smuzhiyun /* NMI */ 582*4882a593Smuzhiyun 583*4882a593Smuzhiyun #if defined(CONFIG_X86_64) && IS_ENABLED(CONFIG_KVM_INTEL) 584*4882a593Smuzhiyun /* 585*4882a593Smuzhiyun * Special NOIST entry point for VMX which invokes this on the kernel 586*4882a593Smuzhiyun * stack. asm_exc_nmi() requires an IST to work correctly vs. the NMI 587*4882a593Smuzhiyun * 'executing' marker. 588*4882a593Smuzhiyun * 589*4882a593Smuzhiyun * On 32bit this just uses the regular NMI entry point because 32-bit does 590*4882a593Smuzhiyun * not have ISTs. 591*4882a593Smuzhiyun */ 592*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_NMI, exc_nmi_noist); 593*4882a593Smuzhiyun #else 594*4882a593Smuzhiyun #define asm_exc_nmi_noist asm_exc_nmi 595*4882a593Smuzhiyun #endif 596*4882a593Smuzhiyun 597*4882a593Smuzhiyun DECLARE_IDTENTRY_NMI(X86_TRAP_NMI, exc_nmi); 598*4882a593Smuzhiyun #ifdef CONFIG_XEN_PV 599*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_NMI, xenpv_exc_nmi); 600*4882a593Smuzhiyun #endif 601*4882a593Smuzhiyun 602*4882a593Smuzhiyun /* #DB */ 603*4882a593Smuzhiyun #ifdef CONFIG_X86_64 604*4882a593Smuzhiyun DECLARE_IDTENTRY_DEBUG(X86_TRAP_DB, exc_debug); 605*4882a593Smuzhiyun #else 606*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_DB, exc_debug); 607*4882a593Smuzhiyun #endif 608*4882a593Smuzhiyun #ifdef CONFIG_XEN_PV 609*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_DB, xenpv_exc_debug); 610*4882a593Smuzhiyun #endif 611*4882a593Smuzhiyun 612*4882a593Smuzhiyun /* #DF */ 613*4882a593Smuzhiyun DECLARE_IDTENTRY_DF(X86_TRAP_DF, exc_double_fault); 614*4882a593Smuzhiyun 615*4882a593Smuzhiyun /* #VC */ 616*4882a593Smuzhiyun #ifdef CONFIG_AMD_MEM_ENCRYPT 617*4882a593Smuzhiyun DECLARE_IDTENTRY_VC(X86_TRAP_VC, exc_vmm_communication); 618*4882a593Smuzhiyun #endif 619*4882a593Smuzhiyun 620*4882a593Smuzhiyun #ifdef CONFIG_XEN_PV 621*4882a593Smuzhiyun DECLARE_IDTENTRY_XENCB(X86_TRAP_OTHER, exc_xen_hypervisor_callback); 622*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_OTHER, exc_xen_unknown_trap); 623*4882a593Smuzhiyun #endif 624*4882a593Smuzhiyun 625*4882a593Smuzhiyun /* Device interrupts common/spurious */ 626*4882a593Smuzhiyun DECLARE_IDTENTRY_IRQ(X86_TRAP_OTHER, common_interrupt); 627*4882a593Smuzhiyun #ifdef CONFIG_X86_LOCAL_APIC 628*4882a593Smuzhiyun DECLARE_IDTENTRY_IRQ(X86_TRAP_OTHER, spurious_interrupt); 629*4882a593Smuzhiyun #endif 630*4882a593Smuzhiyun 631*4882a593Smuzhiyun /* System vector entry points */ 632*4882a593Smuzhiyun #ifdef CONFIG_X86_LOCAL_APIC 633*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(ERROR_APIC_VECTOR, sysvec_error_interrupt); 634*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(SPURIOUS_APIC_VECTOR, sysvec_spurious_apic_interrupt); 635*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(LOCAL_TIMER_VECTOR, sysvec_apic_timer_interrupt); 636*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(X86_PLATFORM_IPI_VECTOR, sysvec_x86_platform_ipi); 637*4882a593Smuzhiyun #endif 638*4882a593Smuzhiyun 639*4882a593Smuzhiyun #ifdef CONFIG_SMP 640*4882a593Smuzhiyun DECLARE_IDTENTRY(RESCHEDULE_VECTOR, sysvec_reschedule_ipi); 641*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(IRQ_MOVE_CLEANUP_VECTOR, sysvec_irq_move_cleanup); 642*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(REBOOT_VECTOR, sysvec_reboot); 643*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(CALL_FUNCTION_SINGLE_VECTOR, sysvec_call_function_single); 644*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(CALL_FUNCTION_VECTOR, sysvec_call_function); 645*4882a593Smuzhiyun #endif 646*4882a593Smuzhiyun 647*4882a593Smuzhiyun #ifdef CONFIG_X86_LOCAL_APIC 648*4882a593Smuzhiyun # ifdef CONFIG_X86_MCE_THRESHOLD 649*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(THRESHOLD_APIC_VECTOR, sysvec_threshold); 650*4882a593Smuzhiyun # endif 651*4882a593Smuzhiyun 652*4882a593Smuzhiyun # ifdef CONFIG_X86_MCE_AMD 653*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(DEFERRED_ERROR_VECTOR, sysvec_deferred_error); 654*4882a593Smuzhiyun # endif 655*4882a593Smuzhiyun 656*4882a593Smuzhiyun # ifdef CONFIG_X86_THERMAL_VECTOR 657*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(THERMAL_APIC_VECTOR, sysvec_thermal); 658*4882a593Smuzhiyun # endif 659*4882a593Smuzhiyun 660*4882a593Smuzhiyun # ifdef CONFIG_IRQ_WORK 661*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(IRQ_WORK_VECTOR, sysvec_irq_work); 662*4882a593Smuzhiyun # endif 663*4882a593Smuzhiyun #endif 664*4882a593Smuzhiyun 665*4882a593Smuzhiyun #ifdef CONFIG_HAVE_KVM 666*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_VECTOR, sysvec_kvm_posted_intr_ipi); 667*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_WAKEUP_VECTOR, sysvec_kvm_posted_intr_wakeup_ipi); 668*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_NESTED_VECTOR, sysvec_kvm_posted_intr_nested_ipi); 669*4882a593Smuzhiyun #endif 670*4882a593Smuzhiyun 671*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_HYPERV) 672*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_hyperv_callback); 673*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(HYPERV_REENLIGHTENMENT_VECTOR, sysvec_hyperv_reenlightenment); 674*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(HYPERV_STIMER0_VECTOR, sysvec_hyperv_stimer0); 675*4882a593Smuzhiyun #endif 676*4882a593Smuzhiyun 677*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_ACRN_GUEST) 678*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_acrn_hv_callback); 679*4882a593Smuzhiyun #endif 680*4882a593Smuzhiyun 681*4882a593Smuzhiyun #ifdef CONFIG_XEN_PVHVM 682*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_xen_hvm_callback); 683*4882a593Smuzhiyun #endif 684*4882a593Smuzhiyun 685*4882a593Smuzhiyun #ifdef CONFIG_KVM_GUEST 686*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_kvm_asyncpf_interrupt); 687*4882a593Smuzhiyun #endif 688*4882a593Smuzhiyun 689*4882a593Smuzhiyun #undef X86_TRAP_OTHER 690*4882a593Smuzhiyun 691*4882a593Smuzhiyun #endif 692