TRPM.cpp revision ff78b877ed7acd25e2d384570a938441455d6a95
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * TRPM - The Trap Monitor.
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
010ad423d45c61ef874fa1602d46459a798b54d2vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
010ad423d45c61ef874fa1602d46459a798b54d2vboxsync * available from http://www.virtualbox.org. This file is free software;
010ad423d45c61ef874fa1602d46459a798b54d2vboxsync * you can redistribute it and/or modify it under the terms of the GNU
010ad423d45c61ef874fa1602d46459a798b54d2vboxsync * General Public License (GPL) as published by the Free Software
010ad423d45c61ef874fa1602d46459a798b54d2vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
010ad423d45c61ef874fa1602d46459a798b54d2vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
010ad423d45c61ef874fa1602d46459a798b54d2vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * additional information or have any questions.
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync/** @page pg_trpm TRPM - The Trap Monitor
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * The Trap Monitor (TRPM) is responsible for all trap and interrupt handling in
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * the VMM. It plays a major role in raw-mode execution and a lesser one in the
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * hardware assisted mode.
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * Note first, the following will use trap as a collective term for faults,
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * aborts and traps.
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync * @see grp_trpm
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync * @section sec_trpm_rc Raw-Mode Context
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * When executing in the raw-mode context, TRPM will be managing the IDT and
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * processing all traps and interrupts. It will also monitor the guest IDT
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync * because CSAM wishes to know about changes to it (trap/interrupt/syscall
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync * handler patching) and TRPM needs to keep the #\BP gate in sync (ring-3
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync * considerations). See TRPMR3SyncIDT and CSAMR3CheckGates.
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * External interrupts will be forwarded to the host context by the quickest
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * possible route where they will be reasserted. The other events will be
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync * categorized into virtualization traps, genuine guest traps and hypervisor
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * traps. The latter group may be recoverable depending on when they happen and
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * whether there is a handler for it, otherwise it will cause a guru meditation.
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * TRPM disgishishes the between the first two (virt and guest traps) and the
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * latter (hyper) by checking the CPL of the trapping code, if CPL == 0 then
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * it's a hyper trap otherwise it's a virt/guest trap. There are three trap
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * dispatcher tables, one ad-hoc for one time traps registered via
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * TRPMGCSetTempHandler(), one for hyper traps and one for virt/guest traps.
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * The latter two live in TRPMGCHandlersA.asm, the former in the VM structure.
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * The raw-mode context trap handlers found in TRPMGCHandlers.cpp (for the most
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * part), will call up the other VMM sub-systems depending on what it things
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * happens. The two most busy traps are page faults (\#PF) and general
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * protection fault/trap (\#GP).
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * Before resuming guest code after having taken a virtualization trap or
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync * injected a guest trap, TRPM will check for pending forced action and
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync * every now and again let TM check for timed out timers. This allows code that
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * is being executed as part of virtualization traps to signal ring-3 exits,
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * page table resyncs and similar without necessarily using the status code. It
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * also make sure we're more responsive to timers and requests from other
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * threads (necessarily running on some different core/cpu in most cases).
c83b72ede860a1be6bdd520f7d13619b0791c1advboxsync * @section sec_trpm_all All Contexts
c83b72ede860a1be6bdd520f7d13619b0791c1advboxsync * TRPM will also dispatch / inject interrupts and traps to the guest, both when
c83b72ede860a1be6bdd520f7d13619b0791c1advboxsync * in raw-mode and when in hardware assisted mode. See TRPMInject().
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync/*******************************************************************************
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync* Header Files *
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync*******************************************************************************/
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync/*******************************************************************************
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync* Structures and Typedefs *
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync*******************************************************************************/
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * Trap handler function.
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * @todo need to specialize this as we go along.
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync /** Generic Interrupt handler. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync /** Generic Trap handler. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync /** Trap 8 (\#DF) handler. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync /** Trap 12 (\#MC) handler. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync /** Max. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync/*******************************************************************************
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync* Global Variables *
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync*******************************************************************************/
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync/** Preinitialized IDT.
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync * The u16OffsetLow is a value of the TRPMHANDLER enum which TRPMR3Relocate()
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync * will use to pick the right address. The u16SegSel is always VMM CS.
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync/* special trap handler - still, this is an interrupt gate not a trap gate... */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync#define IDTE_TRAP(enm) { (unsigned)enm, 0, 0, VBOX_IDTE_TYPE1, VBOX_IDTE_TYPE2_INT_32, 0, 1, 0 }
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync/* generic trap handler. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync#define IDTE_TRAP_GEN() IDTE_TRAP(TRPM_HANDLER_TRAP)
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync/* special interrupt handler. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync#define IDTE_INT(enm) { (unsigned)enm, 0, 0, VBOX_IDTE_TYPE1, VBOX_IDTE_TYPE2_INT_32, 0, 1, 0 }
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync/* generic interrupt handler. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync/* special task gate IDT entry (for critical exceptions like #DF). */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync#define IDTE_TASK(enm) { (unsigned)enm, 0, 0, VBOX_IDTE_TYPE1, VBOX_IDTE_TYPE2_TASK, 0, 1, 0 }
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync/* draft, fixme later when the handler is written. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync#define IDTE_RESERVED() { 0, 0, 0, 0, 0, 0, 0, 0 }
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync /* N - M M - T - C - D i */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync /* o - n o - y - o - e p */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync /* - e n - p - d - s t */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync /* - i - e - e - c . */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync /* - c - - - r */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync /* ============================================================= */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* 0 - #DE - F - N - Divide error */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* 1 - #DB - F/T - N - Single step, INT 1 instruction */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* 2 - - I - N - Non-Maskable Interrupt (NMI) */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 2 - - I - N - Non-Maskable Interrupt (NMI) */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* 3 - #BP - T - N - Breakpoint, INT 3 instruction. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* 4 - #OF - T - N - Overflow, INTO instruction. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* 5 - #BR - F - N - BOUND Range Exceeded, BOUND instruction. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* 6 - #UD - F - N - Undefined(/Invalid) Opcode. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* 7 - #NM - F - N - Device not available, FP or (F)WAIT instruction. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TASK(TRPM_HANDLER_TRAP_08), /* 8 - #DF - A - 0 - Double fault. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* 9 - - F - N - Coprocessor Segment Overrun (obsolete). */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* a - #TS - F - Y - Invalid TSS, Taskswitch or TSS access. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* b - #NP - F - Y - Segment not present. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* c - #SS - F - Y - Stack-Segment fault. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* d - #GP - F - Y - General protection fault. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* e - #PF - F - Y - Page fault. - interrupt gate!!! */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_RESERVED(), /* f - - - - Intel Reserved. Do not use. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* 10 - #MF - F - N - x86 FPU Floating-Point Error (Math fault), FP or (F)WAIT instruction. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* 11 - #AC - F - 0 - Alignment Check. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP(TRPM_HANDLER_TRAP_12), /* 12 - #MC - A - N - Machine Check. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_TRAP_GEN(), /* 13 - #XF - F - N - SIMD Floating-Point Exception. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_RESERVED(), /* 14 - - - - Intel Reserved. Do not use. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_RESERVED(), /* 15 - - - - Intel Reserved. Do not use. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_RESERVED(), /* 16 - - - - Intel Reserved. Do not use. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_RESERVED(), /* 17 - - - - Intel Reserved. Do not use. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_RESERVED(), /* 18 - - - - Intel Reserved. Do not use. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_RESERVED(), /* 19 - - - - Intel Reserved. Do not use. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_RESERVED(), /* 1a - - - - Intel Reserved. Do not use. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_RESERVED(), /* 1b - - - - Intel Reserved. Do not use. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_RESERVED(), /* 1c - - - - Intel Reserved. Do not use. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_RESERVED(), /* 1d - - - - Intel Reserved. Do not use. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_RESERVED(), /* 1e - - - - Intel Reserved. Do not use. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_RESERVED(), /* 1f - - - - Intel Reserved. Do not use. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 20 - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 21 - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 22 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 23 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 24 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 25 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 26 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 27 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 28 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 29 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 2a - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 2b - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 2c - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 2d - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 2e - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 2f - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 30 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 31 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 32 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 33 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 34 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 35 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 36 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 37 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 38 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* 39 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* 3a - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 3b - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 3c - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 3d - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* 3e - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 3f - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 40 - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 41 - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 42 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* 43 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* 44 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* 45 - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 46 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 47 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 48 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 49 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 4a - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 4b - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 4c - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 4d - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 4e - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 4f - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 50 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 51 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 52 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 53 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 54 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 55 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 56 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 57 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 58 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 59 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 5a - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* 5b - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 5c - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 5d - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 5e - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 5f - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 60 - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 61 - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 62 - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 63 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 64 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 65 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 66 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 67 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 68 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 69 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 6a - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 6b - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 6c - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 6d - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* 6e - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 6f - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 70 - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 71 - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 72 - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 73 - - I - - User defined Interrupts, external of INT n. */
a1e68eac9a1478fd1957826cb4bd631f808b7cc0vboxsync IDTE_INT_GEN(), /* 74 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 75 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 76 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 77 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 78 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 79 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 7a - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 7b - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 7c - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 7d - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 7e - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 7f - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 80 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 81 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 82 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 83 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 84 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 85 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 86 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 87 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 88 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 89 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 8a - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 8b - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 8c - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 8d - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 8e - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 8f - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 90 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 91 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 92 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 93 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 94 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 95 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 96 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 97 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 98 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 99 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 9a - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 9b - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 9c - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 9d - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 9e - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* 9f - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* a0 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* a1 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* a2 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* a3 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* a4 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* a5 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* a6 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* a7 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* a8 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* a9 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* aa - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* ab - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* ac - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* ad - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* ae - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* af - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* b0 - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* b1 - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* b2 - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* b3 - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* b4 - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* b5 - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* b6 - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* b7 - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* b8 - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* b9 - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* ba - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* bb - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* bc - - I - - User defined Interrupts, external of INT n. */
eac18a2a75654a71176720265be9d2e77658481fvboxsync IDTE_INT_GEN(), /* bd - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* be - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* bf - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* c0 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* c1 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* c2 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* c3 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* c4 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* c5 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* c6 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* c7 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* c8 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* c9 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* ca - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* cb - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* cc - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* cd - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* ce - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* cf - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* d0 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* d1 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* d2 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* d3 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* d4 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* d5 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* d6 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* d7 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* d8 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* d9 - - I - - User defined Interrupts, external of INT n. */
1acf60ed9c490056043f7bfa524f2de1a431ab10vboxsync IDTE_INT_GEN(), /* da - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* db - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* dc - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* dd - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* de - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* df - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* e0 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* e1 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* e2 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* e3 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* e4 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* e5 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* e6 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* e7 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* e8 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* e9 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* ea - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* eb - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* ec - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* ed - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* ee - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* ef - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* f0 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* f1 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* f2 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* f3 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* f4 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* f5 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* f6 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* f7 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* f8 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* f9 - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* fa - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* fb - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* fc - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* fd - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* fe - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync IDTE_INT_GEN(), /* ff - - I - - User defined Interrupts, external of INT n. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync/** Enable or disable tracking of Guest's IDT. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync/** Enable or disable tracking of Shadow IDT. */
d0eec04539061d14a7e51f492aea90fa5394615fvboxsync/** TRPM saved state version. */
static DECLCALLBACK(int) trpmR3GuestIDTWriteHandler(PVM pVM, RTGCPTR GCPtr, void *pvPtr, void *pvBuf, size_t cbBuf, PGMACCESSTYPE enmAccessType, void *pvUser);
if (pTRPMNode)
return rc;
STAM_REG(pVM, &pVM->trpm.s.StatRCWriteGuestIDTFault, STAMTYPE_COUNTER, "/TRPM/RC/IDTWritesFault", STAMUNIT_OCCURENCES, "Guest IDT writes the we returned to R3 to handle.");
STAM_REG(pVM, &pVM->trpm.s.StatRCWriteGuestIDTHandled, STAMTYPE_COUNTER, "/TRPM/RC/IDTWritesHandled", STAMUNIT_OCCURENCES, "Guest IDT writes that we handled successfully.");
STAM_REG(pVM, &pVM->trpm.s.StatSyncIDT, STAMTYPE_PROFILE, "/PROF/TRPM/SyncIDT", STAMUNIT_TICKS_PER_CALL, "Profiling of TRPMR3SyncIDT().");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x00], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/00", STAMUNIT_TICKS_PER_CALL, "#DE - Divide error.");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x01], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/01", STAMUNIT_TICKS_PER_CALL, "#DB - Debug (single step and more).");
//STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x02], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/02", STAMUNIT_TICKS_PER_CALL, "NMI");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x03], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/03", STAMUNIT_TICKS_PER_CALL, "#BP - Breakpoint.");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x04], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/04", STAMUNIT_TICKS_PER_CALL, "#OF - Overflow.");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x05], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/05", STAMUNIT_TICKS_PER_CALL, "#BR - Bound range exceeded.");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x06], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/06", STAMUNIT_TICKS_PER_CALL, "#UD - Undefined opcode.");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x07], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/07", STAMUNIT_TICKS_PER_CALL, "#NM - Device not available (FPU).");
//STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x08], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/08", STAMUNIT_TICKS_PER_CALL, "#DF - Double fault.");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x09], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/09", STAMUNIT_TICKS_PER_CALL, "#?? - Coprocessor segment overrun (obsolete).");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x0a], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/0a", STAMUNIT_TICKS_PER_CALL, "#TS - Task switch fault.");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x0b], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/0b", STAMUNIT_TICKS_PER_CALL, "#NP - Segemnt not present.");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x0c], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/0c", STAMUNIT_TICKS_PER_CALL, "#SS - Stack segment fault.");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x0d], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/0d", STAMUNIT_TICKS_PER_CALL, "#GP - General protection fault.");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x0e], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/0e", STAMUNIT_TICKS_PER_CALL, "#PF - Page fault.");
//STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x0f], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/0f", STAMUNIT_TICKS_PER_CALL, "Reserved.");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x10], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/10", STAMUNIT_TICKS_PER_CALL, "#MF - Math fault..");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x11], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/11", STAMUNIT_TICKS_PER_CALL, "#AC - Alignment check.");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x12], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/12", STAMUNIT_TICKS_PER_CALL, "#MC - Machine check.");
STAM_REG(pVM, &pVM->trpm.s.aStatGCTraps[0x13], STAMTYPE_PROFILE_ADV, "/TRPM/GC/Traps/13", STAMUNIT_TICKS_PER_CALL, "#XF - SIMD Floating-Point Exception.");
#ifdef VBOX_WITH_STATISTICS
rc = MMHyperAlloc(pVM, sizeof(STAMCOUNTER) * 255, 8, MM_TAG_STAM, (void **)&pVM->trpm.s.paStatForwardedIRQR3);
STAMR3RegisterF(pVM, &pVM->trpm.s.paStatForwardedIRQR3[i], STAMTYPE_COUNTER, STAMVISIBILITY_USED, STAMUNIT_OCCURENCES, "Forwarded interrupts.",
STAM_REG(pVM, &pVM->trpm.s.StatForwardProfR3, STAMTYPE_PROFILE_ADV, "/TRPM/ForwardRaw/ProfR3", STAMUNIT_TICKS_PER_CALL, "Profiling TRPMForwardTrap.");
STAM_REG(pVM, &pVM->trpm.s.StatForwardProfRZ, STAMTYPE_PROFILE_ADV, "/TRPM/ForwardRaw/ProfRZ", STAMUNIT_TICKS_PER_CALL, "Profiling TRPMForwardTrap.");
STAM_REG(pVM, &pVM->trpm.s.StatForwardFailNoHandler, STAMTYPE_COUNTER, "/TRPM/ForwardRaw/FailNoHandler", STAMUNIT_OCCURENCES,"Failure to forward interrupt in raw mode.");
STAM_REG(pVM, &pVM->trpm.s.StatForwardFailPatchAddr, STAMTYPE_COUNTER, "/TRPM/ForwardRaw/FailPatchAddr", STAMUNIT_OCCURENCES,"Failure to forward interrupt in raw mode.");
STAM_REG(pVM, &pVM->trpm.s.StatForwardFailR3, STAMTYPE_COUNTER, "/TRPM/ForwardRaw/FailR3", STAMUNIT_OCCURENCES, "Failure to forward interrupt in raw mode.");
STAM_REG(pVM, &pVM->trpm.s.StatForwardFailRZ, STAMTYPE_COUNTER, "/TRPM/ForwardRaw/FailRZ", STAMUNIT_OCCURENCES, "Failure to forward interrupt in raw mode.");
STAM_REG(pVM, &pVM->trpm.s.StatTrap0dDisasm, STAMTYPE_PROFILE, "/TRPM/RC/Traps/0d/Disasm", STAMUNIT_TICKS_PER_CALL, "Profiling disassembly part of trpmGCTrap0dHandler.");
STAM_REG(pVM, &pVM->trpm.s.StatTrap0dRdTsc, STAMTYPE_COUNTER, "/TRPM/RC/Traps/0d/RdTsc", STAMUNIT_OCCURENCES, "Number of RDTSC #GPs.");
int rc;
rc = PDMR3LdrGetSymbolRC(pVM, VMMGC_MAIN_MODULE_NAME, "TRPMGCHandlerInterupt", &aRCPtrs[TRPM_HANDLER_INT]);
rc = PDMR3LdrGetSymbolRC(pVM, VMMGC_MAIN_MODULE_NAME, "TRPMGCHandlerGeneric", &aRCPtrs[TRPM_HANDLER_TRAP]);
rc = PDMR3LdrGetSymbolRC(pVM, VMMGC_MAIN_MODULE_NAME, "TRPMGCHandlerTrap08", &aRCPtrs[TRPM_HANDLER_TRAP_08]);
rc = PDMR3LdrGetSymbolRC(pVM, VMMGC_MAIN_MODULE_NAME, "TRPMGCHandlerTrap12", &aRCPtrs[TRPM_HANDLER_TRAP_12]);
case TRPM_HANDLER_INT:
case TRPM_HANDLER_TRAP:
case TRPM_HANDLER_TRAP_12:
case TRPM_HANDLER_TRAP_08:
rc = PGMR3HandlerVirtualRegister(pVM, PGMVIRTHANDLERTYPE_HYPERVISOR, pVM->trpm.s.pvMonShwIdtRC, pVM->trpm.s.pvMonShwIdtRC + sizeof(pVM->trpm.s.aIdt) - 1,
/* Relocate IDT handlers for forwarding guest traps/interrupts. */
Log(("TRPMR3Relocate: iGate=%2X Handler %RRv -> %RRv\n", iTrap, pVM->trpm.s.aGuestTrapHandler[iTrap], pVM->trpm.s.aGuestTrapHandler[iTrap] + offDelta));
#ifdef VBOX_WITH_STATISTICS
#ifdef TRPM_TRACK_GUEST_IDT_CHANGES
return rc;
if (fSyncIDT)
return rc;
return rc;
return rc;
return VINF_SUCCESS;
int rc;
#ifdef TRPM_TRACK_GUEST_IDT_CHANGES
Log(("TRPMR3UpdateFromCPUM: Guest's IDT is changed to pIdt=%08X cbIdt=%08X\n", IDTR.pIdt, IDTR.cbIdt));
rc = PGMR3HandlerVirtualRegister(pVM, PGMVIRTHANDLERTYPE_WRITE, IDTR.pIdt, IDTR.pIdt + IDTR.cbIdt /* already inclusive */,
rc = PGMR3HandlerVirtualRegister(pVM, PGMVIRTHANDLERTYPE_WRITE, IDTR.pIdt, IDTR.pIdt + IDTR.cbIdt /* already inclusive */,
if (fRawRing0)
return VINF_SUCCESS;
#ifdef TRPM_TRACK_GUEST_IDT_CHANGES
static DECLCALLBACK(int) trpmR3GuestIDTWriteHandler(PVM pVM, RTGCPTR GCPtr, void *pvPtr, void *pvBuf, size_t cbBuf, PGMACCESSTYPE enmAccessType, void *pvUser)
return VINF_PGM_HANDLER_DO_DEFAULT;
int rc;
rc = PDMR3LdrGetSymbolRC(pVM, VMMGC_MAIN_MODULE_NAME, "TRPMGCHandlerInterupt", &aGCPtrs[TRPM_HANDLER_INT]);
return VERR_INVALID_PARAMETER;
return VINF_SUCCESS;
return iTrap;
return iTrap;
return VERR_INVALID_PARAMETER;
AssertReturn(pHandler == TRPM_INVALID_HANDLER || PATMIsPatchGCAddr(pVM, pHandler), VERR_INVALID_PARAMETER);
int rc = PGMPhysSimpleReadGCPtr(pVM, &GuestIdte, GCPtrIDT + iTrap * sizeof(GuestIdte), sizeof(GuestIdte));
return rc;
return VINF_SUCCESS;
return VINF_SUCCESS;
return VERR_INVALID_PARAMETER;
if (!cEntries)
pIDTE++;
GCPtrIDTE = RT_ALIGN_T(GCPtrIDTE, PAGE_SIZE, RTGCPTR) + PAGE_SIZE + (GCPtrIDTE & (sizeof(VBOXIDTE) - 1));
int rc;
#ifdef TRPM_FORWARD_TRAPS_IN_GC
# ifdef LOG_ENABLED
return VINF_EM_RESCHEDULE_HWACC;
Log(("TRPMR3InjectEvent: recheck gate %x -> valid=%d\n", u8Interrupt, TRPMR3GetGuestTrapHandler(pVM, u8Interrupt) != TRPM_INVALID_HANDLER));
rc = TRPMForwardTrap(pVM, CPUMCTX2CORE(pCtx), u8Interrupt, 0, TRPM_TRAP_NO_ERRORCODE, enmEvent, -1);
Assert(!VM_FF_ISPENDING(pVM, VM_FF_SELM_SYNC_GDT | VM_FF_SELM_SYNC_LDT | VM_FF_TRPM_SYNC_IDT | VM_FF_SELM_SYNC_TSS));
return VINF_EM_RESCHEDULE_RAW;
return VINF_EM_RESCHEDULE_HWACC;
* this implies a safe state in translated instructions and should take sti successors into account (instruction fusing)