VirtualBox

source: vbox/trunk/src/VBox/VMM/testcase/tstVMMR0CallHost-1.cpp@ 7821

Last change on this file since 7821 was 5999, checked in by vboxsync, 17 years ago

The Giant CDDL Dual-License Header Change.

  • Property svn:keywords set to Id
File size: 2.9 KB
Line 
1/* $Id: tstVMMR0CallHost-1.cpp 5999 2007-12-07 15:05:06Z vboxsync $ */
2/** @file
3 * Testcase for the VMMR0JMPBUF operations.
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
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* Header Files *
20*******************************************************************************/
21#include <iprt/runtime.h>
22#include <iprt/string.h>
23#include <iprt/stream.h>
24#include <iprt/alloca.h>
25#include <VBox/err.h>
26
27#define IN_VMM_R0
28#define IN_RING0 /* pretent we're in Ring-0 to get the prototypes. */
29#include <VBox/vmm.h>
30#include "VMMInternal.h"
31
32
33
34/*******************************************************************************
35* Global Variables *
36*******************************************************************************/
37/** The jump buffer. */
38static VMMR0JMPBUF g_Jmp;
39/** The saved stack. */
40static uint8_t g_Stack[8192];
41
42
43int foo(int i, int iZero, int iMinusOne)
44{
45 char *pv = (char *)alloca(i + 32);
46 RTStrPrintf(pv, i + 32, "i=%d%*s\n", i, i+32, "");
47 if ((i % 7) == 0)
48 {
49 int rc = vmmR0CallHostLongJmp(&g_Jmp, 42);
50 if (!rc)
51 return i + 10000;
52 return -1;
53 }
54 return i;
55}
56
57
58DECLCALLBACK(int) tst2(intptr_t i)
59{
60 if (i < 0 || i > 8192)
61 {
62 RTPrintf("tstVMMR0CallHost-1: FAILURE - i=%d is out of range [0..8192]\n", i);
63 return 1;
64 }
65 int iExpect = (i % 7) == 0 ? i + 10000 : i;
66 int rc = foo(i, 0, -1);
67 if (rc != iExpect)
68 {
69 RTPrintf("tstVMMR0CallHost-1: FAILURE - i=%d rc=%d expected=%d\n", i, rc, iExpect);
70 return 1;
71 }
72 return 0;
73}
74
75int tst(int iFrom, int iTo, int iInc)
76{
77 for (int i = iFrom; i < iTo; i += iInc)
78 {
79 int rc = vmmR0CallHostSetJmp(&g_Jmp, (PFNVMMR0SETJMP)tst2, (PVM)i);
80 if (rc != 0 && rc != 42)
81 {
82 RTPrintf("tstVMMR0CallHost-1: FAILURE - i=%d rc=%d setjmp\n", i, rc);
83 return 1;
84 }
85 }
86 return 0;
87}
88
89
90int main()
91{
92 /*
93 * Init.
94 */
95 RTR3Init(false);
96 RTPrintf("tstVMMR0CallHost-1: Testing...\n");
97 g_Jmp.pvSavedStack = (RTR0PTR)&g_Stack[0];
98
99 /*
100 * Try about 1000 long jumps with increasing stack size..
101 */
102 int rc = tst(0, 7000, 1);
103 if (!rc)
104 rc = tst(7599, 0, -1);
105
106 if (!rc)
107 RTPrintf("tstVMMR0CallHost-1: SUCCESS\n");
108 else
109 RTPrintf("tstVMMR0CallHost-1: FAILED\n");
110 return !!rc;
111}
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