VirtualBox

source: vbox/trunk/src/VBox/VMM/testcase/tstVMMFork.cpp@ 98644

Last change on this file since 98644 was 98644, checked in by vboxsync, 21 months ago

VMM,SUPLib: Adjustments for running tstPDMQueue in driverless mode on hardened windows builds. This adds a fFlags parameter to VMR3Create and defines VMCREATE_F_DRIVERLESS, allowing it to switch between default and driverless suplib initialization. The default CFGM config constructor was amended to enable the IEM fallback option by default (only relevant to amd64/x86).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 5.5 KB
Line 
1/* $Id: tstVMMFork.cpp 98644 2023-02-20 12:05:56Z vboxsync $ */
2/** @file
3 * VMM Fork Test.
4 */
5
6/*
7 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27
28
29/*********************************************************************************************************************************
30* Header Files *
31*********************************************************************************************************************************/
32#include <VBox/vmm/vm.h>
33#include <VBox/vmm/vmm.h>
34#include <iprt/errcore.h>
35#include <VBox/log.h>
36#include <iprt/assert.h>
37#include <iprt/initterm.h>
38#include <iprt/stream.h>
39
40#include <errno.h>
41#include <sys/wait.h>
42#include <unistd.h>
43
44
45/*********************************************************************************************************************************
46* Defined Constants And Macros *
47*********************************************************************************************************************************/
48#define TESTCASE "tstVMMFork"
49#define AUTO_TEST_ARGS 1
50
51VMMR3DECL(int) VMMDoTest(PVM pVM);
52
53
54int main(int argc, char* argv[])
55{
56 int rcErrors = 0;
57
58 /*
59 * Initialize the runtime.
60 */
61 RTR3InitExe(argc, &argv, RTR3INIT_FLAGS_TRY_SUPLIB);
62
63#ifndef AUTO_TEST_ARGS
64 if (argc < 2)
65 {
66 RTPrintf("syntax: %s command [args]\n"
67 "\n"
68 "command Command to run under child process in fork.\n"
69 "[args] Arguments to command.\n", argv[0]);
70 return 1;
71 }
72#endif
73
74 /*
75 * Create empty VM.
76 */
77 RTPrintf(TESTCASE ": Initializing...\n");
78 PVM pVM;
79 PUVM pUVM;
80 int rc = VMR3Create(1 /*cCpus*/, NULL, 0 /*fFlags*/, NULL, NULL, NULL, NULL, &pVM, &pUVM);
81 if (RT_SUCCESS(rc))
82 {
83 /*
84 * Do testing.
85 */
86 int iCowTester = 0;
87 char cCowTester = 'a';
88
89#ifndef AUTO_TEST_ARGS
90 int cArgs = argc - 1;
91 char **ppszArgs = &argv[1];
92#else
93 int cArgs = 2;
94 char *ppszArgs[3];
95 ppszArgs[0] = (char *)"/bin/sleep";
96 ppszArgs[1] = (char *)"3";
97 ppszArgs[2] = NULL;
98#endif
99
100 RTPrintf(TESTCASE ": forking current process...\n");
101 pid_t pid = fork();
102 if (pid < 0)
103 {
104 /* Bad. fork() failed! */
105 RTPrintf(TESTCASE ": error: fork() failed.\n");
106 rcErrors++;
107 }
108 else if (pid == 0)
109 {
110 /*
111 * The child process.
112 * Write to some local variables to trigger copy-on-write if it's used.
113 */
114 RTPrintf(TESTCASE ": running child process...\n");
115 RTPrintf(TESTCASE ": writing local variables...\n");
116 iCowTester = 2;
117 cCowTester = 'z';
118
119 RTPrintf(TESTCASE ": calling execv() with command-line:\n");
120 for (int i = 0; i < cArgs; i++)
121 RTPrintf(TESTCASE ": ppszArgs[%d]=%s\n", i, ppszArgs[i]);
122 execv(ppszArgs[0], ppszArgs);
123 RTPrintf(TESTCASE ": error: execv() returned to caller. errno=%d.\n", errno);
124 _exit(-1);
125 }
126 else
127 {
128 /*
129 * The parent process.
130 * Wait for child & run VMM test to ensure things are fine.
131 */
132 int result;
133 while (waitpid(pid, &result, 0) < 0)
134 ;
135 if (!WIFEXITED(result) || WEXITSTATUS(result) != 0)
136 {
137 RTPrintf(TESTCASE ": error: failed to run child process. errno=%d\n", errno);
138 rcErrors++;
139 }
140
141 if (rcErrors == 0)
142 {
143 RTPrintf(TESTCASE ": fork() returned fine.\n");
144 RTPrintf(TESTCASE ": testing VM after fork.\n");
145 VMR3ReqCallWaitU(pUVM, VMCPUID_ANY, (PFNRT)VMMDoTest, 1, pVM);
146
147 STAMR3Dump(pUVM, "*");
148 }
149 }
150
151 if (rcErrors > 0)
152 RTPrintf(TESTCASE ": error: %d error(s) during fork(). Cannot proceed to test the VM.\n", rcErrors);
153 else
154 RTPrintf(TESTCASE ": fork() and VM test, SUCCESS.\n");
155
156 /*
157 * Cleanup.
158 */
159 rc = VMR3PowerOff(pUVM);
160 if (!RT_SUCCESS(rc))
161 {
162 RTPrintf(TESTCASE ": error: failed to power off vm! rc=%Rrc\n", rc);
163 rcErrors++;
164 }
165 rc = VMR3Destroy(pUVM);
166 if (!RT_SUCCESS(rc))
167 {
168 RTPrintf(TESTCASE ": error: failed to destroy vm! rc=%Rrc\n", rc);
169 rcErrors++;
170 }
171 VMR3ReleaseUVM(pUVM);
172 }
173 else
174 {
175 RTPrintf(TESTCASE ": fatal error: failed to create vm! rc=%Rrc\n", rc);
176 rcErrors++;
177 }
178
179 return rcErrors;
180}
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