VirtualBox

source: vbox/trunk/src/VBox/Devices/PC/DevPcArch.c@ 2995

Last change on this file since 2995 was 2981, checked in by vboxsync, 17 years ago

InnoTek -> innotek: all the headers and comments.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 10.0 KB
Line 
1/* $Id: DevPcArch.c 2981 2007-06-01 16:01:28Z vboxsync $ */
2/** @file
3 * PC Architechture Device.
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 as published by the Free Software Foundation,
13 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
14 * distribution. VirtualBox OSE is distributed in the hope that it will
15 * be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * If you received this file as part of a commercial VirtualBox
18 * distribution, then only the terms of your commercial VirtualBox
19 * license agreement apply instead of the previous paragraph.
20 */
21
22/*******************************************************************************
23* Header Files *
24*******************************************************************************/
25#define LOG_GROUP LOG_GROUP_DEV_PC_ARCH
26#include <VBox/pdm.h>
27#include <VBox/mm.h>
28
29#include <VBox/log.h>
30#include <iprt/assert.h>
31#include <VBox/err.h>
32
33#include <string.h>
34
35#include "Builtins.h"
36
37
38/*******************************************************************************
39* Structures and Typedefs *
40*******************************************************************************/
41
42/**
43 * PC Bios instance data structure.
44 */
45typedef struct DEVPCARCH
46{
47 /** Pointer back to the device instance. */
48 PPDMDEVINS pDevIns;
49} DEVPCARCH, *PDEVPCARCH;
50
51
52
53/**
54 * Port I/O Handler for math coprocessor IN operations.
55 *
56 * @returns VBox status code.
57 *
58 * @param pDevIns The device instance.
59 * @param pvUser User argument - ignored.
60 * @param uPort Port number used for the IN operation.
61 * @param pu32 Where to store the result.
62 * @param cb Number of bytes read.
63 */
64static DECLCALLBACK(int) pcarchIOPortFPURead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb)
65{
66 int rc;
67 NOREF(pvUser); NOREF(pDevIns); NOREF(pu32);
68 rc = PDMDeviceDBGFStop(pDevIns, PDM_SRC_POS, "Port=%#x cb=%d\n", Port, cb);
69 if (rc == VINF_SUCCESS)
70 rc = VERR_IOM_IOPORT_UNUSED;
71 return rc;
72}
73
74/**
75 * Port I/O Handler for math coprocessor OUT operations.
76 *
77 * @returns VBox status code.
78 *
79 * @param pDevIns The device instance.
80 * @param pvUser User argument - ignored.
81 * @param uPort Port number used for the IN operation.
82 * @param u32 The value to output.
83 * @param cb The value size in bytes.
84 * @todo Add IGNNE support.
85 */
86static DECLCALLBACK(int) pcarchIOPortFPUWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb)
87{
88 int rc = VINF_SUCCESS;
89 NOREF(pvUser);
90 if (cb == 1)
91 {
92 switch (Port)
93 {
94 /*
95 * Clear busy latch.
96 */
97 case 0xf0:
98 Log2(("PCARCH: FPU Clear busy latch u32=%#x\n", u32));
99/* This is triggered when booting Knoppix (3.7) */
100#if 0
101 if (!u32)
102 rc = PDMDeviceDBGFStop(pDevIns, PDM_SRC_POS, "Port=%#x cb=%d u32=%#x\n", Port, cb, u32);
103#endif
104 /* pDevIns->pDevHlp->pfnPICSetIrq(pDevIns, 13, 0); */
105 break;
106
107 /* Reset. */
108 case 0xf1:
109 Log2(("PCARCH: FPU Reset cb=%d u32=%#x\n", Port, cb, u32));
110 /** @todo figure out what the difference between FPU ports 0xf0 and 0xf1 are... */
111 /* pDevIns->pDevHlp->pfnPICSetIrq(pDevIns, 13, 0); */
112 break;
113
114 /* opcode transfers */
115 case 0xf8:
116 case 0xfa:
117 case 0xfc:
118 default:
119 rc = PDMDeviceDBGFStop(pDevIns, PDM_SRC_POS, "Port=%#x cb=%d u32=%#x\n", Port, cb, u32);
120 break;
121 }
122 /* this works better, but probably not entirely correct. */
123 PDMDevHlpISASetIrq(pDevIns, 13, 0);
124 }
125 else
126 rc = PDMDeviceDBGFStop(pDevIns, PDM_SRC_POS, "Port=%#x cb=%d u32=%#x\n", Port, cb, u32);
127 return rc;
128}
129
130
131/**
132 * Port I/O Handler for PS/2 system control port A IN operations.
133 *
134 * @returns VBox status code.
135 *
136 * @param pDevIns The device instance.
137 * @param pvUser User argument - ignored.
138 * @param uPort Port number used for the IN operation.
139 * @param pu32 Where to store the result.
140 * @param cb Number of bytes read.
141 *
142 * @todo Check if the A20 enable/disable method implemented here in any way
143 * should cooperate with the one implemented in the PS/2 keyboard device.
144 * This probably belongs together in the PS/2 keyboard device (since that
145 * is where the "port B" mentioned by Ralph Brown is implemented).
146 *
147 * @remark Ralph Brown and friends have this to say about this port:
148 *
149 * 0092 RW PS/2 system control port A (port B is at PORT 0061h) (see #P0415)
150 *
151 * Bitfields for PS/2 system control port A:
152 * Bit(s) Description (Table P0415)
153 * 7-6 any bit set to 1 turns activity light on
154 * 5 unused
155 * 4 watchdog timout occurred
156 * 3 =0 RTC/CMOS security lock (on password area) unlocked
157 * =1 CMOS locked (done by POST)
158 * 2 unused
159 * 1 A20 is active
160 * 0 =0 system reset or write
161 * =1 pulse alternate reset pin (high-speed alternate CPU reset)
162 * Notes: once set, bit 3 may only be cleared by a power-on reset
163 * on at least the C&T 82C235, bit 0 remains set through a CPU reset to
164 * allow the BIOS to determine the reset method
165 * on the PS/2 30-286 & "Tortuga" the INT 15h/87h memory copy does
166 * not use this port for A20 control, but instead uses the keyboard
167 * controller (8042). Reportedly this may cause the system to crash
168 * when access to the 8042 is disabled in password server mode
169 * (see #P0398).
170 * SeeAlso: #P0416,#P0417,MSR 00001000h
171 */
172static DECLCALLBACK(int) pcarchIOPortPS2SysControlPortARead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb)
173{
174 if (cb == 1)
175 {
176 *pu32 = PDMDevHlpA20IsEnabled(pDevIns) << 1;
177 return VINF_SUCCESS;
178 }
179 return PDMDeviceDBGFStop(pDevIns, PDM_SRC_POS, "Port=%#x cb=%d\n", Port, cb);
180}
181
182
183/**
184 * Port I/O Handler for PS/2 system control port A OUT operations.
185 *
186 * @returns VBox status code.
187 *
188 * @param pDevIns The device instance.
189 * @param pvUser User argument - ignored.
190 * @param uPort Port number used for the IN operation.
191 * @param u32 The value to output.
192 * @param cb The value size in bytes.
193 * @see Remark and todo of pcarchIOPortPS2SysControlPortARead().
194 */
195static DECLCALLBACK(int) pcarchIOPortPS2SysControlPortAWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb)
196{
197 NOREF(pvUser);
198 if (cb == 1)
199 {
200 /*
201 * Fast reset?
202 */
203 if (u32 & 1)
204 return PDMDevHlpVMReset(pDevIns);
205
206 /*
207 * A20 is the only thing we care about of the other stuff.
208 */
209 PDMDevHlpA20Set(pDevIns, !!(u32 & 2));
210 return VINF_SUCCESS;
211 }
212 return PDMDeviceDBGFStop(pDevIns, PDM_SRC_POS, "Port=%#x cb=%d u32=%#x\n", Port, cb, u32);
213}
214
215
216/**
217 * Construct a device instance for a VM.
218 *
219 * @returns VBox status.
220 * @param pDevIns The device instance data.
221 * If the registration structure is needed, pDevIns->pDevReg points to it.
222 * @param iInstance Instance number. Use this to figure out which registers and such to use.
223 * The device number is also found in pDevIns->iInstance, but since it's
224 * likely to be freqently used PDM passes it as parameter.
225 * @param pCfgHandle Configuration node handle for the device. Use this to obtain the configuration
226 * of the device instance. It's also found in pDevIns->pCfgHandle, but like
227 * iInstance it's expected to be used a bit in this function.
228 */
229static DECLCALLBACK(int) pcarchConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNODE pCfgHandle)
230{
231 PDEVPCARCH pData = PDMINS2DATA(pDevIns, PDEVPCARCH);
232 int rc;
233 Assert(iInstance == 0);
234
235 /*
236 * Validate configuration.
237 */
238 if (!CFGMR3AreValuesValid(pCfgHandle, "\0"))
239 return VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES;
240
241 /*
242 * Init the data.
243 */
244 pData->pDevIns = pDevIns;
245
246 /*
247 * Register I/O Ports
248 */
249 rc = PDMDevHlpIOPortRegister(pDevIns, 0xF0, 0x10, NULL, pcarchIOPortFPUWrite, pcarchIOPortFPURead, NULL, NULL, "Math Co-Processor (DOS/OS2 mode)");
250 if (VBOX_FAILURE(rc))
251 return rc;
252 rc = PDMDevHlpIOPortRegister(pDevIns, 0x92, 1, NULL, pcarchIOPortPS2SysControlPortAWrite, pcarchIOPortPS2SysControlPortARead, NULL, NULL, "PS/2 system control port A (A20 and more)");
253 if (VBOX_FAILURE(rc))
254 return rc;
255
256 /*
257 * Reserve ROM/MMIO areas:
258 * 1. 0x000a0000-0x000fffff
259 * 2. 0xfff80000-0xffffffff
260 */
261 rc = PDMDevHlpPhysReserve(pDevIns, 0x000a0000, 0x50000, "Low ROM Region");
262 if (VBOX_FAILURE(rc))
263 return rc;
264 rc = PDMDevHlpPhysReserve(pDevIns, 0xfff80000, 0x80000, "High ROM Region");
265 if (VBOX_FAILURE(rc))
266 return rc;
267
268 return VINF_SUCCESS;
269}
270
271
272/**
273 * The device registration structure.
274 */
275const PDMDEVREG g_DevicePcArch =
276{
277 /* u32Version */
278 PDM_DEVREG_VERSION,
279 /* szDeviceName */
280 "pcarch",
281 /* szGCMod */
282 "",
283 /* szR0Mod */
284 "",
285 /* pszDescription */
286 "PC Architecture Device",
287 /* fFlags */
288 PDM_DEVREG_FLAGS_HOST_BITS_DEFAULT | PDM_DEVREG_FLAGS_GUEST_BITS_32,
289 /* fClass */
290 PDM_DEVREG_CLASS_ARCH,
291 /* cMaxInstances */
292 1,
293 /* cbInstance */
294 sizeof(DEVPCARCH),
295 /* pfnConstruct */
296 pcarchConstruct,
297 /* pfnDestruct */
298 NULL,
299 /* pfnRelocate */
300 NULL,
301 /* pfnIOCtl */
302 NULL,
303 /* pfnPowerOn */
304 NULL,
305 /* pfnReset */
306 NULL,
307 /* pfnSuspend */
308 NULL,
309 /* pfnResume */
310 NULL,
311 /* pfnAttach */
312 NULL,
313 /* pfnDetach */
314 NULL,
315 /* pfnQueryInterface. */
316 NULL,
317 /* pfnInitComplete. */
318 NULL
319};
320
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