Lines 19-24
Link Here
|
19 |
#endif |
19 |
#endif |
20 |
|
20 |
|
21 |
#include <unistd.h> |
21 |
#include <unistd.h> |
|
|
22 |
#include <sys/types.h> |
23 |
#include <signal.h> |
22 |
|
24 |
|
23 |
#include <X11/Xos.h> |
25 |
#include <X11/Xos.h> |
24 |
#include "xf86.h" |
26 |
#include "xf86.h" |
Lines 203-208
stack_trace(xf86Int10InfoPtr pInt)
Link Here
|
203 |
xf86ErrorFVerb(3, "\n"); |
205 |
xf86ErrorFVerb(3, "\n"); |
204 |
} |
206 |
} |
205 |
|
207 |
|
|
|
208 |
enum port_action_e { |
209 |
PORT_ACTION_PERMIT, |
210 |
PORT_ACTION_WARN, |
211 |
PORT_ACTION_BAIL, |
212 |
PORT_ACTION_MAX |
213 |
}; |
214 |
|
215 |
static const struct port_range { |
216 |
CARD16 start, end; |
217 |
enum port_action_e access; |
218 |
} port_range_table[] = { |
219 |
// NOTE: port ranges are non overlapping and sorted |
220 |
{ 0x00, 0x1f, PORT_ACTION_BAIL }, // DMA |
221 |
{ 0x20, 0x21, PORT_ACTION_BAIL }, // PIC |
222 |
{ 0x40, 0x47, PORT_ACTION_BAIL }, // PIT 1&2 |
223 |
{ 0x50, 0x53, PORT_ACTION_BAIL }, |
224 |
{ 0x70, 0x77, PORT_ACTION_BAIL }, // CMOS/RTC |
225 |
{ 0x81, 0x8f, PORT_ACTION_BAIL }, // DIAG REGS |
226 |
{ 0xa0, 0xa1, PORT_ACTION_BAIL }, // PIC2 |
227 |
{ 0xc0, 0xdf, PORT_ACTION_BAIL }, // DMA |
228 |
}; |
229 |
#define ARRAY_SIZE(X) (sizeof((X)) / (sizeof(*(X)))) |
230 |
#define ARRAY_END(X) (&((X)[ARRAY_SIZE(X)])) |
231 |
|
232 |
static void assert_port_access_allowed (CARD16 port, CARD16 width) |
233 |
{ |
234 |
CARD16 access_start, access_end; |
235 |
const struct port_range *pr, *pr_start, *pr_end; |
236 |
|
237 |
access_start = port; |
238 |
access_end = port + width - 1; |
239 |
|
240 |
// TODO: if the list gets too long we should do a binary search |
241 |
// or convert the port list to a bitmap representation |
242 |
pr_start = port_range_table; |
243 |
pr_end = ARRAY_END(port_range_table); |
244 |
|
245 |
for (pr = pr_start; pr < pr_end; pr++) { |
246 |
if (access_end < pr->start) |
247 |
continue; |
248 |
if (access_start > pr->end) |
249 |
break; |
250 |
|
251 |
// we are in the pr range now |
252 |
switch (pr->access) { |
253 |
default: |
254 |
continue; |
255 |
case PORT_ACTION_BAIL: |
256 |
case PORT_ACTION_WARN: |
257 |
break; |
258 |
} |
259 |
|
260 |
ErrorF("Emulator asked to make a suspect %saccess to " |
261 |
"port %u (0x%04x)%s\n", |
262 |
(width == 1) ? "byte " : |
263 |
(width == 2) ? "word " : |
264 |
(width == 4) ? "long " : "", |
265 |
port, port, |
266 |
(pr->access == PORT_ACTION_BAIL) |
267 |
? "; terminating." : "ignoring."); |
268 |
|
269 |
if (pr->access == PORT_ACTION_BAIL) |
270 |
kill(getpid(), SIGSEGV); |
271 |
} |
272 |
} |
273 |
|
206 |
int |
274 |
int |
207 |
port_rep_inb(xf86Int10InfoPtr pInt, |
275 |
port_rep_inb(xf86Int10InfoPtr pInt, |
208 |
CARD16 port, CARD32 base, int d_f, CARD32 count) |
276 |
CARD16 port, CARD32 base, int d_f, CARD32 count) |
Lines 328-333
x_inb(CARD16 port)
Link Here
|
328 |
} |
396 |
} |
329 |
#endif /* __NOT_YET__ */ |
397 |
#endif /* __NOT_YET__ */ |
330 |
} else { |
398 |
} else { |
|
|
399 |
assert_port_access_allowed (port, sizeof(val)); |
400 |
|
331 |
if (!pciCfg1inb(port, &val)) |
401 |
if (!pciCfg1inb(port, &val)) |
332 |
val = inb(Int10Current->ioBase + port); |
402 |
val = inb(Int10Current->ioBase + port); |
333 |
#ifdef PRINT_PORT |
403 |
#ifdef PRINT_PORT |
Lines 352-357
x_inw(CARD16 port)
Link Here
|
352 |
X_GETTIMEOFDAY(&tv); |
422 |
X_GETTIMEOFDAY(&tv); |
353 |
val = (CARD16)(tv.tv_usec / 3); |
423 |
val = (CARD16)(tv.tv_usec / 3); |
354 |
} else { |
424 |
} else { |
|
|
425 |
assert_port_access_allowed (port, sizeof(val)); |
426 |
|
355 |
if (!pciCfg1inw(port, &val)) |
427 |
if (!pciCfg1inw(port, &val)) |
356 |
val = inw(Int10Current->ioBase + port); |
428 |
val = inw(Int10Current->ioBase + port); |
357 |
} |
429 |
} |
Lines 390-395
x_outb(CARD16 port, CARD8 val)
Link Here
|
390 |
#ifdef PRINT_PORT |
462 |
#ifdef PRINT_PORT |
391 |
ErrorF(" outb(%#x, %2.2x)\n", port, val); |
463 |
ErrorF(" outb(%#x, %2.2x)\n", port, val); |
392 |
#endif |
464 |
#endif |
|
|
465 |
assert_port_access_allowed (port, sizeof(val)); |
466 |
|
393 |
if (!pciCfg1outb(port, val)) |
467 |
if (!pciCfg1outb(port, val)) |
394 |
outb(Int10Current->ioBase + port, val); |
468 |
outb(Int10Current->ioBase + port, val); |
395 |
} |
469 |
} |
Lines 402-407
x_outw(CARD16 port, CARD16 val)
Link Here
|
402 |
ErrorF(" outw(%#x, %4.4x)\n", port, val); |
476 |
ErrorF(" outw(%#x, %4.4x)\n", port, val); |
403 |
#endif |
477 |
#endif |
404 |
|
478 |
|
|
|
479 |
assert_port_access_allowed (port, sizeof(val)); |
480 |
|
405 |
if (!pciCfg1outw(port, val)) |
481 |
if (!pciCfg1outw(port, val)) |
406 |
outw(Int10Current->ioBase + port, val); |
482 |
outw(Int10Current->ioBase + port, val); |
407 |
} |
483 |
} |
Lines 411-416
x_inl(CARD16 port)
Link Here
|
411 |
{ |
487 |
{ |
412 |
CARD32 val; |
488 |
CARD32 val; |
413 |
|
489 |
|
|
|
490 |
assert_port_access_allowed (port, sizeof(val)); |
491 |
|
414 |
if (!pciCfg1in(port, &val)) |
492 |
if (!pciCfg1in(port, &val)) |
415 |
val = inl(Int10Current->ioBase + port); |
493 |
val = inl(Int10Current->ioBase + port); |
416 |
|
494 |
|
Lines 427-432
x_outl(CARD16 port, CARD32 val)
Link Here
|
427 |
ErrorF(" outl(%#x, %8.8x)\n", port, val); |
505 |
ErrorF(" outl(%#x, %8.8x)\n", port, val); |
428 |
#endif |
506 |
#endif |
429 |
|
507 |
|
|
|
508 |
assert_port_access_allowed (port, sizeof(val)); |
509 |
|
430 |
if (!pciCfg1out(port, val)) |
510 |
if (!pciCfg1out(port, val)) |
431 |
outl(Int10Current->ioBase + port, val); |
511 |
outl(Int10Current->ioBase + port, val); |
432 |
} |
512 |
} |
433 |
- |
|
|