2006-07-30 Martin Mares <mj@ucw.cz>
+ * lib/i386-ports.c, lib/i386-io-*: Report failures during port access
+ initialization by a->warn() instead of calling printf() or perror()
+ directly.
+
* lib/i386-ports.c, lib/i386-io-*: Moved the logic which keeps track of
the port access state to generic code.
static mach_port_t io_port;
static inline int
-intel_setup_io(void)
+intel_setup_io(struct pci_access *a)
{
mach_port_t device;
if ((errno = get_privileged_ports(NULL, &device)))
- perror("intel_setup_io() can't get_privileged_ports()");
+ a->warn("i386-io-hurd: Can't get_privileged_ports(): %m");
if (!errno && (errno = device_open(device, D_READ | D_WRITE, "io", &io_port)))
- perror("intel_setup_io() can't device_open()");
+ a->warn("i386-io-hurd: Can't device_open(): %m");
mach_port_deallocate(mach_task_self(), device);
if (!errno && (errno = i386_io_port_add(mach_thread_self(), io_port)))
- perror("intel_setup_io() can't i386_io_port_add()");
+ a->warn("i386-io-hurd: Can't i386_io_port_add(): %m");
return errno ? 0 : 1;
}
static inline int
-intel_cleanup_io(void)
+intel_cleanup_io(struct pci_access *a)
{
if ((errno = i386_io_port_remove(mach_thread_self(), io_port)))
- perror("intel_cleanup_io() can't i386_io_port_remove()");
+ a->warn("i386-io-hurd: Can't i386_io_port_remove(): %m");
mach_port_deallocate(mach_task_self(), io_port);
#endif
static int
-intel_setup_io(void)
+intel_setup_io(struct pci_access *a UNUSED)
{
return (iopl(3) < 0) ? 0 : 1;
}
static inline int
-intel_cleanup_io(void)
+intel_cleanup_io(struct pci_access *a UNUSED)
{
iopl(3);
return -1;
#include <sys/psw.h>
static int
-intel_setup_io(void)
+intel_setup_io(struct pci_access *a UNUSED)
{
return (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) < 0) ? 0 : 1;
}
static inline int
-intel_cleanup_io(void)
+intel_cleanup_io(struct pci_access *a UNUSED)
{
/* FIXME: How to switch off I/O port access? */
return 1;
* The PCI Library -- Access to i386 I/O ports on Windows
*
* Copyright (c) 2004 Alexander Stock <stock.alexander@gmx.de>
+ * Copyright (c) 2006 Martin Mares <mj@ucw.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
#define inl(x) _inpd(x)
static int
-intel_setup_io(void)
+intel_setup_io(struct pci_access *a)
{
typedef int (*MYPROC)(void);
MYPROC InitializeWinIo;
lib = LoadLibrary("WinIo.dll");
if (!lib)
{
- fprintf(stderr, "libpci: Couldn't load WinIo.dll.\n");
+ a->warning("i386-io-windows: Couldn't load WinIo.dll.");
return 0;
}
/* XXX: Is this really needed? --mj */
InitializeWinIo = (MYPROC) GetProcAddress(lib, "InitializeWinIo");
if (!InitializeWinIo)
{
- fprintf(stderr, "libpci: Couldn't find InitializeWinIo function.\n");
+ a->warning("i386-io-windows: Couldn't find InitializeWinIo function.");
return 0;
}
if (!InitializeWinIo())
{
- fprintf(stderr, "libpci: InitializeWinIo() failed.\n");
+ a->warning("i386-io-windows: InitializeWinIo() failed.");
return 0;
}
}
static inline int
-intel_cleanup_io(void)
+intel_cleanup_io(struct pci_access *a UNUSED)
{
//TODO: DeInitializeWinIo!
return 1;
static int conf12_io_enabled = -1; /* -1=haven't tried, 0=failed, 1=succeeded */
static int
-conf12_setup_io(void)
+conf12_setup_io(struct pci_access *a)
{
if (conf12_io_enabled < 0)
- conf12_io_enabled = intel_setup_io();
+ conf12_io_enabled = intel_setup_io(a);
return conf12_io_enabled;
}
static void
conf12_init(struct pci_access *a)
{
- if (!conf12_setup_io())
+ if (!conf12_setup_io(a))
a->error("No permission to access I/O ports (you probably have to be root).");
}
conf12_cleanup(struct pci_access *a UNUSED)
{
if (conf12_io_enabled > 0)
- conf12_io_enabled = intel_cleanup_io();
+ conf12_io_enabled = intel_cleanup_io(a);
}
/*
unsigned int tmp;
int res = 0;
- if (!conf12_setup_io())
+ if (!conf12_setup_io(a))
{
a->debug("...no I/O permission");
return 0;
static int
conf2_detect(struct pci_access *a)
{
- if (!conf12_setup_io())
+ if (!conf12_setup_io(a))
{
a->debug("...no I/O permission");
return 0;