[PATCH 3/3] lib: fwts_cmos: Use new I/O helpers, add more error checking
Colin King
colin.king at canonical.com
Tue Jan 15 12:25:35 UTC 2013
From: Colin Ian King <colin.king at canonical.com>
Use the new I/O helper functions to ensure we catch I/O access errors.
Also add in sane error handling to undo ioperm, iopl and restore
interrupt state when an error occurs.
Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
src/lib/src/fwts_cmos.c | 42 +++++++++++++++++++++++++++++++++---------
1 file changed, 33 insertions(+), 9 deletions(-)
diff --git a/src/lib/src/fwts_cmos.c b/src/lib/src/fwts_cmos.c
index 284e718..fd1f83d 100644
--- a/src/lib/src/fwts_cmos.c
+++ b/src/lib/src/fwts_cmos.c
@@ -30,24 +30,48 @@
*/
int fwts_cmos_read(const uint8_t offset, uint8_t *value)
{
+ int ret = FWTS_OK;
+
+ *value = ~0; /* Default in case of error */
+
if (ioperm(0x70, 2, 1) < 0)
return FWTS_ERROR;
- if (ioperm(0x80, 1, 1) < 0)
- return FWTS_ERROR;
- if (iopl(3) < 0) /* Want to disabled interrupts */
- return FWTS_ERROR;
+
+ if (ioperm(0x80, 1, 1) < 0) {
+ ret = FWTS_ERROR;
+ goto tidy0x70;
+ }
+ /* Want to disable interrupts */
+ if (iopl(3) < 0) {
+ ret = FWTS_ERROR;
+ goto tidy0x80;
+ }
asm("cli");
- outb(offset, 0x70); /* specify offset to read */
- outb(0, 0x80); /* Small Delay */
- *value = inb(0x71); /* get the value */
- asm("sti");
+ /* specify offset to read */
+ if (fwts_outb(offset, 0x70) != FWTS_OK) {
+ ret = FWTS_ERROR;
+ goto tidy;
+ }
+ /* Small Delay */
+ if (fwts_outb(0, 0x80) != FWTS_OK) {
+ ret = FWTS_ERROR;
+ goto tidy;
+ }
+
+ /* get the CMOS value */
+ if (fwts_inb(0x71, value) != FWTS_OK)
+ ret = FWTS_ERROR;
+tidy:
+ asm("sti");
(void)iopl(0);
+tidy0x80:
(void)ioperm(0x80, 1, 0);
+tidy0x70:
(void)ioperm(0x70, 2, 0);
- return FWTS_OK;
+ return ret;
}
#else
int fwts_cmos_read(const uint8_t offset, uint8_t *value)
--
1.8.0
More information about the fwts-devel
mailing list