TRPM.cpp revision 6feaa379f8d17d834f8360604f20418844ccaae7
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * TRPM - The Trap Monitor.
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2006-2007 Oracle Corporation
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * available from http://www.virtualbox.org. This file is free software;
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * you can redistribute it and/or modify it under the terms of the GNU
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * General Public License (GPL) as published by the Free Software
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
956a0e3c076406b83d635174a201fd8761ee5133vboxsync/** @page pg_trpm TRPM - The Trap Monitor
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * The Trap Monitor (TRPM) is responsible for all trap and interrupt handling in
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * the VMM. It plays a major role in raw-mode execution and a lesser one in the
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * hardware assisted mode.
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * Note first, the following will use trap as a collective term for faults,
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * aborts and traps.
a15d881e9ec9bffe9b27ae4174efb8d4dc4a0e17vboxsync * @see grp_trpm
a15d881e9ec9bffe9b27ae4174efb8d4dc4a0e17vboxsync * @section sec_trpm_rc Raw-Mode Context
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * When executing in the raw-mode context, TRPM will be managing the IDT and
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * processing all traps and interrupts. It will also monitor the guest IDT
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * because CSAM wishes to know about changes to it (trap/interrupt/syscall
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * handler patching) and TRPM needs to keep the \#BP gate in sync (ring-3
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * considerations). See TRPMR3SyncIDT and CSAMR3CheckGates.
a15d881e9ec9bffe9b27ae4174efb8d4dc4a0e17vboxsync * External interrupts will be forwarded to the host context by the quickest
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * possible route where they will be reasserted. The other events will be
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * categorized into virtualization traps, genuine guest traps and hypervisor
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * traps. The latter group may be recoverable depending on when they happen and
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * whether there is a handler for it, otherwise it will cause a guru meditation.
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * TRPM distinguishes the between the first two (virt and guest traps) and the
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * latter (hyper) by checking the CPL of the trapping code, if CPL == 0 then
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * it's a hyper trap otherwise it's a virt/guest trap. There are three trap
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * dispatcher tables, one ad-hoc for one time traps registered via
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * TRPMGCSetTempHandler(), one for hyper traps and one for virt/guest traps.
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * The latter two live in TRPMGCHandlersA.asm, the former in the VM structure.
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * The raw-mode context trap handlers found in TRPMGCHandlers.cpp (for the most
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * part), will call up the other VMM sub-systems depending on what it things
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * happens. The two most busy traps are page faults (\#PF) and general
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * protection fault/trap (\#GP).
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * Before resuming guest code after having taken a virtualization trap or
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * injected a guest trap, TRPM will check for pending forced action and
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * every now and again let TM check for timed out timers. This allows code that
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * is being executed as part of virtualization traps to signal ring-3 exits,
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * page table resyncs and similar without necessarily using the status code. It
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * also make sure we're more responsive to timers and requests from other
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * threads (necessarily running on some different core/cpu in most cases).
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * @section sec_trpm_all All Contexts
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * TRPM will also dispatch / inject interrupts and traps to the guest, both when
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * in raw-mode and when in hardware assisted mode. See TRPMInject().
956a0e3c076406b83d635174a201fd8761ee5133vboxsync/*******************************************************************************
956a0e3c076406b83d635174a201fd8761ee5133vboxsync* Header Files *
956a0e3c076406b83d635174a201fd8761ee5133vboxsync*******************************************************************************/
a15d881e9ec9bffe9b27ae4174efb8d4dc4a0e17vboxsync/*******************************************************************************
a15d881e9ec9bffe9b27ae4174efb8d4dc4a0e17vboxsync* Structures and Typedefs *
a15d881e9ec9bffe9b27ae4174efb8d4dc4a0e17vboxsync*******************************************************************************/
a15d881e9ec9bffe9b27ae4174efb8d4dc4a0e17vboxsync * Trap handler function.
a15d881e9ec9bffe9b27ae4174efb8d4dc4a0e17vboxsync * @todo need to specialize this as we go along.
956a0e3c076406b83d635174a201fd8761ee5133vboxsync /** Generic Interrupt handler. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync /** Generic Trap handler. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync /** Trap 8 (\#DF) handler. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync /** Trap 12 (\#MC) handler. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync /** Max. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync/*******************************************************************************
956a0e3c076406b83d635174a201fd8761ee5133vboxsync* Global Variables *
956a0e3c076406b83d635174a201fd8761ee5133vboxsync*******************************************************************************/
956a0e3c076406b83d635174a201fd8761ee5133vboxsync/** Preinitialized IDT.
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * The u16OffsetLow is a value of the TRPMHANDLER enum which TRPMR3Relocate()
956a0e3c076406b83d635174a201fd8761ee5133vboxsync * will use to pick the right address. The u16SegSel is always VMM CS.
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync/* special trap handler - still, this is an interrupt gate not a trap gate... */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync#define IDTE_TRAP(enm) { (unsigned)enm, 0, 0, VBOX_IDTE_TYPE1, VBOX_IDTE_TYPE2_INT_32, 0, 1, 0 }
956a0e3c076406b83d635174a201fd8761ee5133vboxsync/* generic trap handler. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync#define IDTE_TRAP_GEN() IDTE_TRAP(TRPM_HANDLER_TRAP)
956a0e3c076406b83d635174a201fd8761ee5133vboxsync/* special interrupt handler. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync#define IDTE_INT(enm) { (unsigned)enm, 0, 0, VBOX_IDTE_TYPE1, VBOX_IDTE_TYPE2_INT_32, 0, 1, 0 }
0cbb2b0b9388d33ac395656e849e4c4c7ddeb347vboxsync/* generic interrupt handler. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync/* special task gate IDT entry (for critical exceptions like #DF). */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync#define IDTE_TASK(enm) { (unsigned)enm, 0, 0, VBOX_IDTE_TYPE1, VBOX_IDTE_TYPE2_TASK, 0, 1, 0 }
956a0e3c076406b83d635174a201fd8761ee5133vboxsync/* draft, fixme later when the handler is written. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync#define IDTE_RESERVED() { 0, 0, 0, 0, 0, 0, 0, 0 }
956a0e3c076406b83d635174a201fd8761ee5133vboxsync /* N - M M - T - C - D i */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync /* o - n o - y - o - e p */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync /* - e n - p - d - s t */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync /* - i - e - e - c . */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync /* - c - - - r */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync /* ============================================================= */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* 0 - #DE - F - N - Divide error */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* 1 - #DB - F/T - N - Single step, INT 1 instruction */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* 2 - - I - N - Non-Maskable Interrupt (NMI) */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 2 - - I - N - Non-Maskable Interrupt (NMI) */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* 3 - #BP - T - N - Breakpoint, INT 3 instruction. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* 4 - #OF - T - N - Overflow, INTO instruction. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* 5 - #BR - F - N - BOUND Range Exceeded, BOUND instruction. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* 6 - #UD - F - N - Undefined(/Invalid) Opcode. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* 7 - #NM - F - N - Device not available, FP or (F)WAIT instruction. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TASK(TRPM_HANDLER_TRAP_08), /* 8 - #DF - A - 0 - Double fault. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* 9 - - F - N - Coprocessor Segment Overrun (obsolete). */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* a - #TS - F - Y - Invalid TSS, Taskswitch or TSS access. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* b - #NP - F - Y - Segment not present. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* c - #SS - F - Y - Stack-Segment fault. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* d - #GP - F - Y - General protection fault. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_TRAP_GEN(), /* e - #PF - F - Y - Page fault. - interrupt gate!!! */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_RESERVED(), /* f - - - - Intel Reserved. Do not use. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* 10 - #MF - F - N - x86 FPU Floating-Point Error (Math fault), FP or (F)WAIT instruction. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* 11 - #AC - F - 0 - Alignment Check. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP(TRPM_HANDLER_TRAP_12), /* 12 - #MC - A - N - Machine Check. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_TRAP_GEN(), /* 13 - #XF - F - N - SIMD Floating-Point Exception. */
0cbb2b0b9388d33ac395656e849e4c4c7ddeb347vboxsync IDTE_RESERVED(), /* 14 - - - - Intel Reserved. Do not use. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_RESERVED(), /* 15 - - - - Intel Reserved. Do not use. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_RESERVED(), /* 16 - - - - Intel Reserved. Do not use. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_RESERVED(), /* 17 - - - - Intel Reserved. Do not use. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_RESERVED(), /* 18 - - - - Intel Reserved. Do not use. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_RESERVED(), /* 19 - - - - Intel Reserved. Do not use. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_RESERVED(), /* 1a - - - - Intel Reserved. Do not use. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_RESERVED(), /* 1b - - - - Intel Reserved. Do not use. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_RESERVED(), /* 1c - - - - Intel Reserved. Do not use. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_RESERVED(), /* 1d - - - - Intel Reserved. Do not use. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_RESERVED(), /* 1e - - - - Intel Reserved. Do not use. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_RESERVED(), /* 1f - - - - Intel Reserved. Do not use. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 20 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 21 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 22 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 23 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 24 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 25 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 26 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 27 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 28 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 29 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 2a - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 2b - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* 2c - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 2d - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 2e - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 2f - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 30 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 31 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 32 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 33 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 34 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 35 - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 36 - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 37 - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 38 - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 39 - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 3a - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 3b - - I - - User defined Interrupts, external of INT n. */
6b8df80def0e731e860daade9dbd5b9432af4698vboxsync IDTE_INT_GEN(), /* 3c - - I - - User defined Interrupts, external of INT n. */
6b8df80def0e731e860daade9dbd5b9432af4698vboxsync IDTE_INT_GEN(), /* 3d - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 3e - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 3f - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 40 - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 41 - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 42 - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 43 - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 44 - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 45 - - I - - User defined Interrupts, external of INT n. */
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync IDTE_INT_GEN(), /* 46 - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* 47 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 48 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 49 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 4a - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 4b - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 4c - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 4d - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* 4e - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 4f - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 50 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 51 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 52 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 53 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 54 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 55 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 56 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 57 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 58 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 59 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 5a - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 5b - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 5c - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* 5d - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 5e - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 5f - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 60 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 61 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 62 - - I - - User defined Interrupts, external of INT n. */
0cbb2b0b9388d33ac395656e849e4c4c7ddeb347vboxsync IDTE_INT_GEN(), /* 63 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 64 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 65 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 66 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 67 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 68 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 69 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 6a - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 6b - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 6c - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 6d - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 6e - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 6f - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 70 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 71 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 72 - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* 73 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 74 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 75 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 76 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 77 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 78 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 79 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 7a - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 7b - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 7c - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 7d - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 7e - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 7f - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 80 - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* 81 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 82 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 83 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 84 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 85 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 86 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 87 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 88 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 89 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 8a - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 8b - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 8c - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* 8d - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 8e - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 8f - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 90 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 91 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 92 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 93 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 94 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 95 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 96 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 97 - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* 98 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 99 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 9a - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 9b - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 9c - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 9d - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 9e - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* 9f - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* a0 - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* a1 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* a2 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* a3 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* a4 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* a5 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* a6 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* a7 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* a8 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* a9 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* aa - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* ab - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* ac - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* ad - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* ae - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* af - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* b0 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* b1 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* b2 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* b3 - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* b4 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* b5 - - I - - User defined Interrupts, external of INT n. */
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync IDTE_INT_GEN(), /* b6 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* b7 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* b8 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* b9 - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* ba - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* bb - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* bc - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* bd - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* be - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* bf - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* c0 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* c1 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* c2 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* c3 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* c4 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* c5 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* c6 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* c7 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* c8 - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* c9 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* ca - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* cb - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* cc - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* cd - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* ce - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* cf - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* d0 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* d1 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* d2 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* d3 - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* d4 - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* d5 - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* d6 - - I - - User defined Interrupts, external of INT n. */
8a63f697e3c0c9afe0dc326c3db61fd4217fa895vboxsync IDTE_INT_GEN(), /* d7 - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* d8 - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* d9 - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* da - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* db - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* dc - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* dd - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* de - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* df - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* e0 - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* e1 - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* e2 - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* e3 - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* e4 - - I - - User defined Interrupts, external of INT n. */
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync IDTE_INT_GEN(), /* e5 - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* e6 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* e7 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* e8 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* e9 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* ea - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* eb - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* ec - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* ed - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* ee - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* ef - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* f0 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* f1 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* f2 - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* f3 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* f4 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* f5 - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* f6 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* f7 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* f8 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* f9 - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* fa - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* fb - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* fc - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* fd - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync IDTE_INT_GEN(), /* fe - - I - - User defined Interrupts, external of INT n. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync IDTE_INT_GEN(), /* ff - - I - - User defined Interrupts, external of INT n. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync/** Enable or disable tracking of Guest's IDT. */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync/** Enable or disable tracking of Shadow IDT. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync/** TRPM saved state version. */
956a0e3c076406b83d635174a201fd8761ee5133vboxsync#define TRPM_SAVED_STATE_VERSION_UNI 8 /* SMP support bumped the version */
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsync/*******************************************************************************
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync* Internal Functions *
2a0a20dee7f474c26cc8f6f9d7aa12c345c2b73bvboxsync*******************************************************************************/
956a0e3c076406b83d635174a201fd8761ee5133vboxsyncstatic DECLCALLBACK(int) trpmR3Save(PVM pVM, PSSMHANDLE pSSM);
68fb2428898c55a7172e6a75a0a8d7ce259919bdvboxsyncstatic DECLCALLBACK(int) trpmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass);
956a0e3c076406b83d635174a201fd8761ee5133vboxsyncstatic 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 - Segment 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) * 256, sizeof(STAMCOUNTER), MM_TAG_TRPM, (void **)&pVM->trpm.s.paStatForwardedIRQR3);
STAMR3RegisterF(pVM, &pVM->trpm.s.paStatForwardedIRQR3[i], STAMTYPE_COUNTER, STAMVISIBILITY_USED, STAMUNIT_OCCURENCES, "Forwarded interrupts.",
rc = MMHyperAlloc(pVM, sizeof(STAMCOUNTER) * 256, sizeof(STAMCOUNTER), MM_TAG_TRPM, (void **)&pVM->trpm.s.paStatHostIrqR3);
STAMR3RegisterF(pVM, &pVM->trpm.s.paStatHostIrqR3[i], STAMTYPE_COUNTER, STAMVISIBILITY_USED, STAMUNIT_OCCURENCES,
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 = 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 VERR_SYMBOL_NOT_FOUND;
return VINF_SUCCESS;
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,
Log(("trpmR3GuestIDTWriteHandler: write to %RGv size %d\n", GCPtr, cbBuf)); NOREF(GCPtr); NOREF(cbBuf);
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(pVCpu, &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 VBOX_WITH_REM
#ifdef TRPM_FORWARD_TRAPS_IN_GC
# ifdef LOG_ENABLED
Log(("TRPMR3InjectEvent: CPU%d u8Interrupt=%d (%#x) rc=%Rrc\n", pVCpu->idCpu, u8Interrupt, u8Interrupt, rc));
# ifndef IEM_VERIFICATION_MODE
Log(("TRPMR3InjectEvent: recheck gate %x -> valid=%d\n", u8Interrupt, TRPMR3GetGuestTrapHandler(pVM, u8Interrupt) != TRPM_INVALID_HANDLER));
rc = TRPMForwardTrap(pVCpu, CPUMCTX2CORE(pCtx), u8Interrupt, 0, TRPM_TRAP_NO_ERRORCODE, enmEvent, -1);
Assert(!VMCPU_FF_ISPENDING(pVCpu, VMCPU_FF_SELM_SYNC_GDT | VMCPU_FF_SELM_SYNC_LDT | VMCPU_FF_TRPM_SYNC_IDT | VMCPU_FF_SELM_SYNC_TSS));
return VINF_EM_RESCHEDULE_RAW;
#ifdef VBOX_WITH_REM
return HWACCMR3IsActive(pVCpu) ? VINF_EM_RESCHEDULE_HWACC : VINF_EM_RESCHEDULE_REM; /* (Heed the halted state if this is changed!) */
return VINF_EM_RESCHEDULE_HWACC;
* this implies a safe state in translated instructions and should take sti successors into account (instruction fusing)