VirtualBox

source: vbox/trunk/src/VBox/VMM/tools/VBoxVMMPreload.cpp@ 64626

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

Recompiler, VMM, Devices: Purge the old APIC and the VBOX_WITH_NEW_APIC define.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.8 KB
Line 
1/* $Id: VBoxVMMPreload.cpp 64626 2016-11-10 10:31:39Z vboxsync $ */
2/** @file
3 * VBoxVMMPreload - Preload VBox the ring-0 modules.
4 */
5
6/*
7 * Copyright (C) 2012-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#include <iprt/buildconfig.h>
23#include <iprt/getopt.h>
24#include <iprt/initterm.h>
25#include <iprt/message.h>
26#include <iprt/path.h>
27#include <iprt/stream.h>
28#include <iprt/string.h>
29#include <iprt/thread.h>
30
31#include <VBox/sup.h>
32#include <VBox/version.h>
33
34
35/*******************************************************************************
36* Global Variables *
37*******************************************************************************/
38/**
39 * Known modules and their associated data (there are only known modules!).
40 */
41static struct
42{
43 const char *pszName;
44 bool fPreload;
45 void *pvImageBase;
46} g_aModules[] =
47{
48 { "VMMR0.r0", true, NULL },
49 { "VBoxDDR0.r0", true, NULL },
50#if !defined(VBOX_WITH_NEW_IOAPIC)
51 { "VBoxDD2R0.r0", true, NULL },
52#endif
53};
54
55static uint32_t g_cVerbose = 1;
56static bool g_fLockDown = false;
57
58
59/**
60 * Parses the options.
61 *
62 * @returns RTEXITCODE_SUCCESS on success.
63 * @param argc Argument count .
64 * @param argv Argument vector.
65 * @param pfExit Set to @c true if we should exit.
66 */
67static RTEXITCODE ParseOptions(int argc, char **argv, bool *pfExit)
68{
69 /*
70 * Parse arguments.
71 */
72 static const RTGETOPTDEF s_aOptions[] =
73 {
74 { "--only", 'o', RTGETOPT_REQ_STRING },
75 { "--quiet", 'q', RTGETOPT_REQ_NOTHING },
76 { "--lock" , 'l', RTGETOPT_REQ_NOTHING },
77 { "--verbose", 'v', RTGETOPT_REQ_NOTHING },
78 };
79
80 bool fAll = true;
81
82 int ch;
83 RTGETOPTUNION ValueUnion;
84 RTGETOPTSTATE GetState;
85 RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, 0 /* fFlags */);
86 while ((ch = RTGetOpt(&GetState, &ValueUnion)))
87 {
88 switch(ch)
89 {
90 case 'o':
91 {
92 uint32_t i;
93
94 if (fAll)
95 {
96 fAll = false;
97 for (i = 0; i < RT_ELEMENTS(g_aModules); i++)
98 g_aModules[i].fPreload = false;
99 }
100
101 i = RT_ELEMENTS(g_aModules);
102 while (i-- > 0)
103 if (!strcmp(ValueUnion.psz, g_aModules[i].pszName))
104 {
105 g_aModules[i].fPreload = true;
106 break;
107 }
108 if (i > RT_ELEMENTS(g_aModules))
109 return RTMsgErrorExit(RTEXITCODE_FAILURE, "No known module '%s'", ValueUnion.psz);
110 break;
111 }
112
113 case 'v':
114 g_cVerbose++;
115 break;
116
117 case 'q':
118 g_cVerbose = 0;
119 break;
120
121 case 'l':
122 g_fLockDown = true;
123 break;
124
125 case 'h':
126 RTPrintf(VBOX_PRODUCT " VMM ring-0 Module Preloader Version " VBOX_VERSION_STRING
127 "(C) 2005-" VBOX_C_YEAR " " VBOX_VENDOR "\n"
128 "All rights reserved.\n"
129 "\n"
130 "Usage: VBoxVMMPreload [-hlqvV] [-o|--only <mod>]\n"
131 "\n");
132 *pfExit = true;
133 return RTEXITCODE_SUCCESS;
134
135 case 'V':
136 RTPrintf("%sr%s\n", RTBldCfgVersion(), RTBldCfgRevisionStr());
137 *pfExit = true;
138 return RTEXITCODE_SUCCESS;
139
140 default:
141 return RTGetOptPrintError(ch, &ValueUnion);
142 }
143 }
144 return RTEXITCODE_SUCCESS;
145}
146
147
148/**
149 * Loads the modules.
150 *
151 * @returns RTEXITCODE_SUCCESS on success.
152 */
153static RTEXITCODE LoadModules(void)
154{
155 RTERRINFOSTATIC ErrInfo;
156
157 for (uint32_t i = 0; i < RT_ELEMENTS(g_aModules); i++)
158 {
159 if (g_aModules[i].fPreload)
160 {
161 char szPath[RTPATH_MAX];
162 int rc = RTPathAppPrivateArch(szPath, sizeof(szPath));
163 if (RT_SUCCESS(rc))
164 rc = RTPathAppend(szPath, sizeof(szPath), g_aModules[i].pszName);
165 if (RT_FAILURE(rc))
166 return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTPathAppPrivateArch or RTPathAppend returned %Rrc", rc);
167
168 RTErrInfoInitStatic(&ErrInfo);
169 rc = SUPR3LoadModule(szPath, g_aModules[i].pszName, &g_aModules[i].pvImageBase, &ErrInfo.Core);
170 if (RT_FAILURE(rc))
171 return RTMsgErrorExit(RTEXITCODE_FAILURE, "SUPR3LoadModule failed for %s (%s): %s (rc=%Rrc)",
172 g_aModules[i].pszName, szPath, ErrInfo.Core.pszMsg, rc);
173 if (g_cVerbose >= 1)
174 RTMsgInfo("Loaded '%s' ('%s') at %p\n", szPath, g_aModules[i].pszName, g_aModules[i].pvImageBase);
175 }
176 }
177
178 if (g_fLockDown)
179 {
180 RTErrInfoInitStatic(&ErrInfo);
181 int rc = SUPR3LockDownLoader(&ErrInfo.Core);
182 if (RT_FAILURE(rc))
183 return RTMsgErrorExit(RTEXITCODE_FAILURE, "SUPR3LockDownLoader failed: %s (rc=%Rrc)",
184 ErrInfo.Core.pszMsg, rc);
185 if (g_cVerbose >= 1)
186 RTMsgInfo("Locked down module loader interface!\n");
187 }
188
189 RTStrmFlush(g_pStdOut);
190 return RTEXITCODE_SUCCESS;
191}
192
193
194/**
195 * Entry point.
196 */
197extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
198{
199 RT_NOREF1(envp);
200 bool fExit = false;
201 RTEXITCODE rcExit = ParseOptions(argc, argv, &fExit);
202 if (rcExit == RTEXITCODE_SUCCESS && !fExit)
203 {
204 rcExit = LoadModules();
205 if (rcExit == RTEXITCODE_SUCCESS)
206 {
207 for (;;)
208 RTThreadSleep(RT_INDEFINITE_WAIT);
209 }
210 }
211 return rcExit;
212}
213
214
215#ifndef VBOX_WITH_HARDENING
216/**
217 * Main entry point.
218 */
219int main(int argc, char **argv, char **envp)
220{
221 int rc = RTR3InitExe(argc, &argv, RTR3INIT_FLAGS_SUPLIB);
222 if (RT_FAILURE(rc))
223 return RTMsgInitFailure(rc);
224 return TrustedMain(argc, argv, envp);
225}
226#endif /* !VBOX_WITH_HARDENING */
227
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