diff mbox series

[pciutils] libpci: Fix intel_cleanup_io() implementations

Message ID 20211220192843.15052-1-pali@kernel.org
State New
Headers show
Series [pciutils] libpci: Fix intel_cleanup_io() implementations | expand

Commit Message

Pali Rohár Dec. 20, 2021, 7:28 p.m. UTC
Function intel_cleanup_io() should de-initialize I/O port access, e.g. by
calling iopl(0) to reset I/O privilege level to default value.

Caller of intel_cleanup_io() expects that this function returns negative
value on success and positive value on error. Error means that I/O port
access was not de-initialized and is still active. Success means that I/O
port access is not active anymore and intel_setup_io() needs to be called
again to access I/O ports.

Fix Cygwin, Haiku and Linux implementations of intel_cleanup_io() function
to correctly de-initialize I/O port access and fix return value.
---
 lib/i386-io-cygwin.h | 2 +-
 lib/i386-io-haiku.h  | 2 +-
 lib/i386-io-linux.h  | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

Comments

Martin Mareš Dec. 26, 2021, 10:04 p.m. UTC | #1
Hi!

> Function intel_cleanup_io() should de-initialize I/O port access, e.g. by
> calling iopl(0) to reset I/O privilege level to default value.
> 
> Caller of intel_cleanup_io() expects that this function returns negative
> value on success and positive value on error. Error means that I/O port
> access was not de-initialized and is still active. Success means that I/O
> port access is not active anymore and intel_setup_io() needs to be called
> again to access I/O ports.
> 
> Fix Cygwin, Haiku and Linux implementations of intel_cleanup_io() function
> to correctly de-initialize I/O port access and fix return value.

Thanks for noticing the problem. I fixed it by removing the return value
of intel_cleanup_io() completely. In fact, only returning -1 made sense ever.

					Martin
diff mbox series

Patch

diff --git a/lib/i386-io-cygwin.h b/lib/i386-io-cygwin.h
index 16022482f268..038b02d00a94 100644
--- a/lib/i386-io-cygwin.h
+++ b/lib/i386-io-cygwin.h
@@ -17,7 +17,7 @@  intel_setup_io(struct pci_access *a UNUSED)
 static inline int
 intel_cleanup_io(struct pci_access *a UNUSED)
 {
-  iopl(3);
+  iopl(0);
   return -1;
 }
 
diff --git a/lib/i386-io-haiku.h b/lib/i386-io-haiku.h
index 2bbe592672ab..5c724b34e98a 100644
--- a/lib/i386-io-haiku.h
+++ b/lib/i386-io-haiku.h
@@ -72,7 +72,7 @@  static inline int
 intel_cleanup_io(struct pci_access *a UNUSED)
 {
   close(poke_driver_fd);
-  return 1;
+  return -1;
 }
 
 static inline u8
diff --git a/lib/i386-io-linux.h b/lib/i386-io-linux.h
index b39b4eb8267d..619f8ec11695 100644
--- a/lib/i386-io-linux.h
+++ b/lib/i386-io-linux.h
@@ -17,7 +17,7 @@  intel_setup_io(struct pci_access *a UNUSED)
 static inline int
 intel_cleanup_io(struct pci_access *a UNUSED)
 {
-  iopl(3);
+  iopl(0);
   return -1;
 }