VirtualBox

source: vbox/trunk/src/VBox/Devices/PC/DevPcArch.cpp@ 54266

Last change on this file since 54266 was 48947, checked in by vboxsync, 11 years ago

Devices: Whitespace and svn:keyword cleanups by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 8.1 KB
Line 
1/* $Id: DevPcArch.cpp 48947 2013-10-07 21:41:00Z vboxsync $ */
2/** @file
3 * DevPcArch - PC Architecture Device.
4 */
5
6/*
7 * Copyright (C) 2006-2012 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* Header Files *
20*******************************************************************************/
21#define LOG_GROUP LOG_GROUP_DEV_PC_ARCH
22#include <VBox/vmm/pdmdev.h>
23#include <VBox/vmm/mm.h>
24#include <VBox/log.h>
25#include <VBox/err.h>
26#include <iprt/assert.h>
27#include <iprt/string.h>
28
29#include "VBoxDD.h"
30
31
32/*******************************************************************************
33* Structures and Typedefs *
34*******************************************************************************/
35
36/**
37 * PC Bios instance data structure.
38 */
39typedef struct DEVPCARCH
40{
41 /** Pointer back to the device instance. */
42 PPDMDEVINS pDevIns;
43} DEVPCARCH, *PDEVPCARCH;
44
45
46
47/**
48 * @callback_method_impl{FNIOMIOPORTIN, Math coprocessor.}
49 */
50static DECLCALLBACK(int) pcarchIOPortFPURead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb)
51{
52 int rc;
53 NOREF(pvUser); NOREF(pDevIns); NOREF(pu32);
54 rc = PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "Port=%#x cb=%d\n", Port, cb);
55 if (rc == VINF_SUCCESS)
56 rc = VERR_IOM_IOPORT_UNUSED;
57 return rc;
58}
59
60/**
61 * @callback_method_impl{FNIOMIOPORTOUT, Math coprocessor.}
62 * @todo Add IGNNE support.
63 */
64static DECLCALLBACK(int) pcarchIOPortFPUWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb)
65{
66 int rc = VINF_SUCCESS;
67 NOREF(pvUser);
68 if (cb == 1)
69 {
70 switch (Port)
71 {
72 /*
73 * Clear busy latch.
74 */
75 case 0xf0:
76 Log2(("PCARCH: FPU Clear busy latch u32=%#x\n", u32));
77/* This is triggered when booting Knoppix (3.7) */
78#if 0
79 if (!u32)
80 rc = PDMDeviceDBGFStop(pDevIns, RT_SRC_POS, "Port=%#x cb=%d u32=%#x\n", Port, cb, u32);
81#endif
82 /* pDevIns->pHlp->pfnPICSetIrq(pDevIns, 13, 0); */
83 break;
84
85 /* Reset. */
86 case 0xf1:
87 Log2(("PCARCH: FPU Reset cb=%d u32=%#x\n", Port, cb, u32));
88 /** @todo figure out what the difference between FPU ports 0xf0 and 0xf1 are... */
89 /* pDevIns->pHlp->pfnPICSetIrq(pDevIns, 13, 0); */
90 break;
91
92 /* opcode transfers */
93 case 0xf8:
94 case 0xfa:
95 case 0xfc:
96 default:
97 rc = PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "Port=%#x cb=%d u32=%#x\n", Port, cb, u32);
98 break;
99 }
100 /* this works better, but probably not entirely correct. */
101 PDMDevHlpISASetIrq(pDevIns, 13, 0);
102 }
103 else
104 rc = PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "Port=%#x cb=%d u32=%#x\n", Port, cb, u32);
105 return rc;
106}
107
108
109/**
110 * @callback_method_impl{FNIOMIOPORTIN, PS/2 system control port A.}
111 *
112 * @todo Check if the A20 enable/disable method implemented here in any way
113 * should cooperate with the one implemented in the PS/2 keyboard device.
114 * This probably belongs together in the PS/2 keyboard device (since that
115 * is where the "port B" mentioned by Ralph Brown is implemented).
116 *
117 * @remark Ralph Brown and friends have this to say about this port:
118 *
119 * @verbatim
1200092 RW PS/2 system control port A (port B is at PORT 0061h) (see #P0415)
121
122Bitfields for PS/2 system control port A:
123Bit(s) Description (Table P0415)
124 7-6 any bit set to 1 turns activity light on
125 5 unused
126 4 watchdog timout occurred
127 3 =0 RTC/CMOS security lock (on password area) unlocked
128 =1 CMOS locked (done by POST)
129 2 unused
130 1 A20 is active
131 0 =0 system reset or write
132 =1 pulse alternate reset pin (high-speed alternate CPU reset)
133Notes: once set, bit 3 may only be cleared by a power-on reset
134 on at least the C&T 82C235, bit 0 remains set through a CPU reset to
135 allow the BIOS to determine the reset method
136 on the PS/2 30-286 & "Tortuga" the INT 15h/87h memory copy does
137 not use this port for A20 control, but instead uses the keyboard
138 controller (8042). Reportedly this may cause the system to crash
139 when access to the 8042 is disabled in password server mode
140 (see #P0398).
141SeeAlso: #P0416,#P0417,MSR 00001000h
142 * @endverbatim
143 */
144static DECLCALLBACK(int)
145pcarchIOPortPS2SysControlPortARead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb)
146{
147 if (cb == 1)
148 {
149 *pu32 = PDMDevHlpA20IsEnabled(pDevIns) << 1;
150 return VINF_SUCCESS;
151 }
152 return PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "Port=%#x cb=%d\n", Port, cb);
153}
154
155
156/**
157 * @callback_method_impl{FNIOMIOPORTOUT, PS/2 system control port A.}
158 * @see Remark and todo of pcarchIOPortPS2SysControlPortARead().
159 */
160static DECLCALLBACK(int)
161pcarchIOPortPS2SysControlPortAWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb)
162{
163 NOREF(pvUser);
164 if (cb == 1)
165 {
166 /*
167 * Fast reset?
168 */
169 if (u32 & 1)
170 {
171 LogRel(("Reset initiated by system port A\n"));
172 return PDMDevHlpVMReset(pDevIns);
173 }
174
175 /*
176 * A20 is the only thing we care about of the other stuff.
177 */
178 PDMDevHlpA20Set(pDevIns, !!(u32 & 2));
179 return VINF_SUCCESS;
180 }
181 return PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "Port=%#x cb=%d u32=%#x\n", Port, cb, u32);
182}
183
184
185/**
186 * @interface_method_impl{PDMDEVREG,pfnConstruct}
187 */
188static DECLCALLBACK(int) pcarchConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNODE pCfg)
189{
190 PDEVPCARCH pThis = PDMINS_2_DATA(pDevIns, PDEVPCARCH);
191 int rc;
192 Assert(iInstance == 0);
193
194 /*
195 * Validate configuration.
196 */
197 if (!CFGMR3AreValuesValid(pCfg, "\0"))
198 return VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES;
199
200 /*
201 * Init the data.
202 */
203 pThis->pDevIns = pDevIns;
204
205 /*
206 * Register I/O Ports
207 */
208 rc = PDMDevHlpIOPortRegister(pDevIns, 0xF0, 0x10, NULL,
209 pcarchIOPortFPUWrite, pcarchIOPortFPURead,
210 NULL, NULL, "Math Co-Processor (DOS/OS2 mode)");
211 if (RT_FAILURE(rc))
212 return rc;
213 rc = PDMDevHlpIOPortRegister(pDevIns, 0x92, 1, NULL,
214 pcarchIOPortPS2SysControlPortAWrite, pcarchIOPortPS2SysControlPortARead,
215 NULL, NULL, "PS/2 system control port A (A20 and more)");
216 if (RT_FAILURE(rc))
217 return rc;
218
219 return VINF_SUCCESS;
220}
221
222
223/**
224 * The device registration structure.
225 */
226const PDMDEVREG g_DevicePcArch =
227{
228 /* u32Version */
229 PDM_DEVREG_VERSION,
230 /* szName */
231 "pcarch",
232 /* szRCMod */
233 "",
234 /* szR0Mod */
235 "",
236 /* pszDescription */
237 "PC Architecture Device",
238 /* fFlags */
239 PDM_DEVREG_FLAGS_HOST_BITS_DEFAULT | PDM_DEVREG_FLAGS_GUEST_BITS_DEFAULT,
240 /* fClass */
241 PDM_DEVREG_CLASS_ARCH,
242 /* cMaxInstances */
243 1,
244 /* cbInstance */
245 sizeof(DEVPCARCH),
246 /* pfnConstruct */
247 pcarchConstruct,
248 /* pfnDestruct */
249 NULL,
250 /* pfnRelocate */
251 NULL,
252 /* pfnMemSetup */
253 NULL,
254 /* pfnPowerOn */
255 NULL,
256 /* pfnReset */
257 NULL,
258 /* pfnSuspend */
259 NULL,
260 /* pfnResume */
261 NULL,
262 /* pfnAttach */
263 NULL,
264 /* pfnDetach */
265 NULL,
266 /* pfnQueryInterface. */
267 NULL,
268 /* pfnInitComplete. */
269 NULL,
270 /* pfnPowerOff */
271 NULL,
272 /* pfnSoftReset */
273 NULL,
274 /* u32VersionEnd */
275 PDM_DEVREG_VERSION
276};
277
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