VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMR0/TRPMR0.cpp@ 67837

Last change on this file since 67837 was 62478, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 3.5 KB
Line 
1/* $Id: TRPMR0.cpp 62478 2016-07-22 18:29:06Z vboxsync $ */
2/** @file
3 * TRPM - The Trap Monitor - HC Ring 0
4 */
5
6/*
7 * Copyright (C) 2006-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19/*********************************************************************************************************************************
20* Header Files *
21*********************************************************************************************************************************/
22#define LOG_GROUP LOG_GROUP_TRPM
23#include <VBox/vmm/trpm.h>
24#include "TRPMInternal.h"
25#include <VBox/vmm/vm.h>
26#include <VBox/vmm/vmm.h>
27#include <VBox/err.h>
28#include <VBox/log.h>
29#include <iprt/assert.h>
30#include <iprt/asm-amd64-x86.h>
31
32
33#if defined(RT_OS_DARWIN) && ARCH_BITS == 32
34# error "32-bit darwin is no longer supported. Go back to 4.3 or earlier!"
35#endif
36
37
38/**
39 * Dispatches an interrupt that arrived while we were in the guest context.
40 *
41 * @param pVM The cross context VM structure.
42 * @remark Must be called with interrupts disabled.
43 */
44VMMR0DECL(void) TRPMR0DispatchHostInterrupt(PVM pVM)
45{
46 /*
47 * Get the active interrupt vector number.
48 */
49 PVMCPU pVCpu = VMMGetCpu0(pVM);
50 RTUINT uActiveVector = pVCpu->trpm.s.uActiveVector;
51 pVCpu->trpm.s.uActiveVector = UINT32_MAX;
52 AssertMsgReturnVoid(uActiveVector < 256, ("uActiveVector=%#x is invalid! (More assertions to come, please enjoy!)\n", uActiveVector));
53
54#if HC_ARCH_BITS == 64 && defined(RT_OS_DARWIN)
55 /*
56 * Do it the simple and safe way.
57 *
58 * This is a workaround for an optimization bug in the code below
59 * or a gcc 4.2 on mac (snow leopard seed 314).
60 */
61 trpmR0DispatchHostInterruptSimple(uActiveVector);
62
63#else /* The complicated way: */
64
65 /*
66 * Get the handler pointer (16:32 ptr) / (16:48 ptr).
67 */
68 RTIDTR Idtr;
69 ASMGetIDTR(&Idtr);
70# if HC_ARCH_BITS == 32
71 PVBOXIDTE pIdte = &((PVBOXIDTE)Idtr.pIdt)[uActiveVector];
72# else
73 PVBOXIDTE64 pIdte = &((PVBOXIDTE64)Idtr.pIdt)[uActiveVector];
74# endif
75 AssertMsgReturnVoid(pIdte->Gen.u1Present, ("The IDT entry (%d) is not present!\n", uActiveVector));
76 AssertMsgReturnVoid( pIdte->Gen.u3Type1 == VBOX_IDTE_TYPE1
77 || pIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_INT_32,
78 ("The IDT entry (%d) is not 32-bit int gate! type1=%#x type2=%#x\n",
79 uActiveVector, pIdte->Gen.u3Type1, pIdte->Gen.u5Type2));
80# if HC_ARCH_BITS == 32
81 RTFAR32 pfnHandler;
82 pfnHandler.off = VBOXIDTE_OFFSET(*pIdte);
83 pfnHandler.sel = pIdte->Gen.u16SegSel;
84
85 const RTR0UINTREG uRSP = ~(RTR0UINTREG)0;
86
87# else /* 64-bit: */
88 RTFAR64 pfnHandler;
89 pfnHandler.off = VBOXIDTE64_OFFSET(*pIdte);
90 pfnHandler.sel = pIdte->Gen.u16SegSel;
91
92 const RTR0UINTREG uRSP = ~(RTR0UINTREG)0;
93 if (pIdte->Gen.u3Ist)
94 {
95 trpmR0DispatchHostInterruptSimple(uActiveVector);
96 return;
97 }
98
99# endif
100
101 /*
102 * Dispatch it.
103 */
104 trpmR0DispatchHostInterrupt(pfnHandler.off, pfnHandler.sel, uRSP);
105#endif
106}
107
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette