VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/Support/solaris/SUPLib-solaris.cpp@ 4800

Last change on this file since 4800 was 4800, checked in by vboxsync, 18 years ago

Redid the supdrv interface. works on windows and linux while the other OSes still needs some adjusting/testing. internal networking is temporarily broken as the SUPCallVMMR0Ex interface is being reworked (this is what all this is really about).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 4.1 KB
Line 
1/* $Id: SUPLib-solaris.cpp 4800 2007-09-14 14:59:15Z vboxsync $ */
2/** @file
3 *
4 * VBox host drivers - Ring-0 support drivers - Solaris host:
5 * Solaris implementations for support library
6 */
7
8/*
9 * Copyright (C) 2006-2007 innotek GmbH
10 *
11 * This file is part of VirtualBox Open Source Edition (OSE), as
12 * available from http://www.215389.xyz. This file is free software;
13 * you can redistribute it and/or modify it under the terms of the GNU
14 * General Public License as published by the Free Software Foundation,
15 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
16 * distribution. VirtualBox OSE is distributed in the hope that it will
17 * be useful, but WITHOUT ANY WARRANTY of any kind.
18 */
19
20
21/*******************************************************************************
22* Header Files *
23*******************************************************************************/
24#define LOG_GROUP LOG_GROUP_SUP
25#include <VBox/types.h>
26#include <VBox/sup.h>
27#include <VBox/param.h>
28#include <VBox/err.h>
29#include <VBox/log.h>
30#include <iprt/path.h>
31#include <iprt/assert.h>
32#include <iprt/mem.h>
33#include <iprt/err.h>
34#include <iprt/string.h>
35#include "SUPLibInternal.h"
36#include "SUPDRVIOC.h"
37
38#include <sys/fcntl.h>
39#include <sys/ioctl.h>
40
41#include <fcntl.h>
42#include <errno.h>
43#include <unistd.h>
44#include <stdlib.h>
45#include <stdio.h>
46
47
48/*******************************************************************************
49* Defined Constants And Macros *
50*******************************************************************************/
51#define DEVICE_NAME "/devices/pseudo/vboxdrv@0:0"
52
53
54/*******************************************************************************
55* Global Variables *
56*******************************************************************************/
57/** Handle to the open device. */
58static int g_hDevice = -1;
59
60
61int suplibOsInit(size_t cbReserve)
62{
63 /*
64 * Check if already initialized.
65 */
66 if (g_hDevice >= 0)
67 return VINF_SUCCESS;
68
69 /*
70 * Try to open the device.
71 */
72 g_hDevice = open(DEVICE_NAME, O_RDWR, 0);
73 if (g_hDevice < 0)
74 {
75 int rc = errno;
76 LogRel(("Failed to open \"%s\", errno=%d\n", rc));
77 return RTErrConvertFromErrno(rc);
78 }
79
80 /*
81 * Avoid unused parameter warning
82 */
83 NOREF(cbReserve);
84
85 return VINF_SUCCESS;
86}
87
88
89int suplibOsTerm(void)
90{
91 /*
92 * Check if we're initialized
93 */
94 if (g_hDevice >= 0)
95 {
96 if (close(g_hDevice))
97 AssertFailed();
98 g_hDevice = -1;
99 }
100
101 return VINF_SUCCESS;
102}
103
104
105int suplibOsInstall(void)
106{
107 return VERR_NOT_IMPLEMENTED;
108}
109
110int suplibOsUninstall(void)
111{
112 return VERR_NOT_IMPLEMENTED;
113}
114
115
116int suplibOsIOCtl(uintptr_t uFunction, void *pvReq, size_t cbReq)
117{
118 AssertMsg(g_hDevice != -1, ("SUPLIB not initiated successfully!\n"));
119
120 /*
121 * Issue device iocontrol.
122 */
123 if (RT_LIKELY(ioctl(g_hDevice, uFunction, &pvReq) >= 0))
124 return VINF_SUCCESS;
125
126 /* This is the reverse operation of the one found in SUPDrv-solaris.c */
127 switch (errno)
128 {
129 case EACCES: return VERR_GENERAL_FAILURE;
130 case EINVAL: return VERR_INVALID_PARAMETER;
131 case EILSEQ: return VERR_INVALID_MAGIC;
132 case ENOSYS: return VERR_VERSION_MISMATCH;
133 case ENXIO: return VERR_INVALID_HANDLE;
134 case EFAULT: return VERR_INVALID_POINTER;
135 case ENOLCK: return VERR_LOCK_FAILED;
136 case EEXIST: return VERR_ALREADY_LOADED;
137 case EPERM: return VERR_PERMISSION_DENIED;
138 }
139
140 return RTErrConvertFromErrno(errno);
141}
142
143
144#ifdef VBOX_WITHOUT_IDT_PATCHING
145int suplibOSIOCtlFast(uintptr_t uFunction)
146{
147 int rc = ioctl(g_hDevice, uFunction, NULL);
148 if (rc == -1)
149 rc = errno;
150 return rc;
151}
152#endif
153
154
155int suplibOsPageAlloc(size_t cPages, void **ppvPages)
156{
157 *ppvPages = RTMemPageAllocZ(cPages << PAGE_SHIFT);
158 if (*ppvPages)
159 return VINF_SUCCESS;
160 return RTErrConvertFromErrno(errno);
161}
162
163
164int suplibOsPageFree(void *pvPages, size_t /* cPages */)
165{
166 RTMemPageFree(pvPages);
167 return VINF_SUCCESS;
168}
169
Note: See TracBrowser for help on using the repository browser.

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