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