diff options
author | Thomas Heijligen <thomas.heijligen@secunet.com> | 2021-12-14 16:36:05 +0100 |
---|---|---|
committer | Nico Huber <nico.h@gmx.de> | 2021-12-22 12:35:00 +0000 |
commit | 49d758698a0dd166679c48b1a2785e50e9b0cc83 (patch) | |
tree | b48b29bd4ccdc13543fab9685dc410a6a5be6613 | |
parent | 88c871e74cb9d8b6f6f38747d1caae916364e2a2 (diff) | |
download | flashrom-49d758698a0dd166679c48b1a2785e50e9b0cc83.tar.gz flashrom-49d758698a0dd166679c48b1a2785e50e9b0cc83.tar.bz2 flashrom-49d758698a0dd166679c48b1a2785e50e9b0cc83.zip |
hwaccess: move x86 port I/O related code into own files
Allow port I/O related code to be compiled independent from memory
mapping functionality. This enables for a better selection of needed
hardware access types.
Change-Id: I372b4a409f036da766c42bc406b596bc41b0f75a
Signed-off-by: Thomas Heijligen <thomas.heijligen@secunet.com>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/60110
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Nico Huber <nico.h@gmx.de>
-rw-r--r-- | Makefile | 13 | ||||
-rw-r--r-- | amd_imc.c | 2 | ||||
-rw-r--r-- | atahpt.c | 2 | ||||
-rw-r--r-- | atapromise.c | 1 | ||||
-rw-r--r-- | atavia.c | 2 | ||||
-rw-r--r-- | board_enable.c | 1 | ||||
-rw-r--r-- | chipset_enable.c | 1 | ||||
-rw-r--r-- | drkaiser.c | 1 | ||||
-rw-r--r-- | gfxnvidia.c | 1 | ||||
-rw-r--r-- | hwaccess.c | 62 | ||||
-rw-r--r-- | hwaccess.h | 2 | ||||
-rw-r--r-- | hwaccess_x86_io.c | 87 | ||||
-rw-r--r-- | hwaccess_x86_io.h | 4 | ||||
-rw-r--r-- | internal.c | 1 | ||||
-rw-r--r-- | it8212.c | 1 | ||||
-rw-r--r-- | it85spi.c | 2 | ||||
-rw-r--r-- | it87spi.c | 1 | ||||
-rw-r--r-- | meson.build | 2 | ||||
-rw-r--r-- | nic3com.c | 2 | ||||
-rw-r--r-- | nicintel.c | 1 | ||||
-rw-r--r-- | nicintel_eeprom.c | 1 | ||||
-rw-r--r-- | nicintel_spi.c | 1 | ||||
-rw-r--r-- | nicnatsemi.c | 2 | ||||
-rw-r--r-- | nicrealtek.c | 2 | ||||
-rw-r--r-- | ogp_spi.c | 1 | ||||
-rw-r--r-- | programmer.h | 1 | ||||
-rw-r--r-- | rayer_spi.c | 2 | ||||
-rw-r--r-- | satamv.c | 1 | ||||
-rw-r--r-- | satasii.c | 1 | ||||
-rw-r--r-- | tests/hwaccess_x86_io_unittest.h | 2 | ||||
-rw-r--r-- | wbsio_spi.c | 1 |
31 files changed, 122 insertions, 82 deletions
@@ -804,24 +804,23 @@ ifneq ($(NEED_RAW_ACCESS), ) FEATURE_CFLAGS += -D'NEED_RAW_ACCESS=1' PROGRAMMER_OBJS += physmap.o hwaccess.o -ifeq ($(TARGET_OS), NetBSD) ifeq ($(ARCH), x86) +FEATURE_CFLAGS += -D'__FLASHROM_HAVE_OUTB__=1' +PROGRAMMER_OBJS += hwaccess_x86_io.o + +ifeq ($(TARGET_OS), NetBSD) PCILIBS += -l$(shell uname -p) endif -else ifeq ($(TARGET_OS), OpenBSD) -ifeq ($(ARCH), x86) PCILIBS += -l$(shell uname -m) endif -else +endif + ifeq ($(TARGET_OS), Darwin) # DirectHW framework can be found in the DirectHW library. PCILIBS += -framework IOKit -framework DirectHW endif endif -endif - -endif USE_LIBUSB1 := $(if $(call filter_deps,$(DEPENDS_ON_LIBUSB1)),yes,no) ifeq ($(USE_LIBUSB1), yes) @@ -17,7 +17,7 @@ #include "flash.h" #include "programmer.h" -#include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "spi.h" #include "platform/pci.h" @@ -18,7 +18,7 @@ #include <string.h> #include "flash.h" #include "programmer.h" -#include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #define BIOS_ROM_ADDR 0x90 diff --git a/atapromise.c b/atapromise.c index 92eba0c2..56abc26b 100644 --- a/atapromise.c +++ b/atapromise.c @@ -19,6 +19,7 @@ #include "flash.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #define MAX_ROM_DECODE (32 * 1024) @@ -20,7 +20,7 @@ #include <string.h> #include "flash.h" #include "programmer.h" -#include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #define PCI_VENDOR_ID_VIA 0x1106 diff --git a/board_enable.c b/board_enable.c index 339408a5..4ca7101a 100644 --- a/board_enable.c +++ b/board_enable.c @@ -26,6 +26,7 @@ #include "flash.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #if defined(__i386__) || defined(__x86_64__) diff --git a/chipset_enable.c b/chipset_enable.c index 85884431..517918e5 100644 --- a/chipset_enable.c +++ b/chipset_enable.c @@ -34,6 +34,7 @@ #include "flash.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #define NOT_DONE_YET 1 @@ -18,6 +18,7 @@ #include "flash.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #define PCI_VENDOR_ID_DRKAISER 0x1803 diff --git a/gfxnvidia.c b/gfxnvidia.c index e85ce68c..0d3ef39e 100644 --- a/gfxnvidia.c +++ b/gfxnvidia.c @@ -19,6 +19,7 @@ #include "flash.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #define PCI_VENDOR_ID_NVIDIA 0x10de @@ -25,17 +25,8 @@ #include <fcntl.h> #endif #include "flash.h" -#include "programmer.h" #include "hwaccess.h" -#if USE_IOPERM -#include <sys/io.h> -#endif - -#if (defined (__i386__) || defined (__x86_64__) || defined(__amd64__)) && USE_DEV_IO -int io_fd; -#endif - /* Prevent reordering and/or merging of reads/writes to hardware. * Such reordering and/or merging would break device accesses which depend on the exact access order. */ @@ -70,59 +61,6 @@ static inline void sync_primitive(void) #endif } -#if (defined (__i386__) || defined (__x86_64__) || defined(__amd64__)) && !(defined(__DJGPP__) || defined(__LIBPAYLOAD__)) -static int release_io_perms(void *p) -{ -#if defined (__sun) - sysi86(SI86V86, V86SC_IOPL, 0); -#elif USE_DEV_IO - close(io_fd); -#elif USE_IOPERM - ioperm(0, 65536, 0); -#elif USE_IOPL - iopl(0); -#endif - return 0; -} - -/* Get I/O permissions with automatic permission release on shutdown. */ -int rget_io_perms(void) -{ - #if defined (__sun) - if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) != 0) { -#elif USE_DEV_IO - if ((io_fd = open("/dev/io", O_RDWR)) < 0) { -#elif USE_IOPERM - if (ioperm(0, 65536, 1) != 0) { -#elif USE_IOPL - if (iopl(3) != 0) { -#endif - msg_perr("ERROR: Could not get I/O privileges (%s).\n", strerror(errno)); - msg_perr("You need to be root.\n"); -#if defined (__OpenBSD__) - msg_perr("If you are root already please set securelevel=-1 in /etc/rc.securelevel and\n" - "reboot, or reboot into single user mode.\n"); -#elif defined(__NetBSD__) - msg_perr("If you are root already please reboot into single user mode or make sure\n" - "that your kernel configuration has the option INSECURE enabled.\n"); -#endif - return 1; - } else { - register_shutdown(release_io_perms, NULL); - } - return 0; -} - -#else - -/* DJGPP and libpayload environments have full PCI port I/O permissions by default. */ -/* PCI port I/O support is unimplemented on PPC/MIPS and unavailable on ARM. */ -int rget_io_perms(void) -{ - return 0; -} -#endif - void mmio_writeb(uint8_t val, void *addr) { *(volatile uint8_t *) addr = val; @@ -124,8 +124,6 @@ cpu_to_be(64) #if NEED_RAW_ACCESS == 1 && (defined (__i386__) || defined (__x86_64__) || defined(__amd64__)) -#include "hwaccess_x86_io.h" - #if !(defined(__MACH__) && defined(__APPLE__)) && !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__) && !defined(__DragonFly__) && !defined(__LIBPAYLOAD__) typedef struct { uint32_t hi, lo; } msr_t; msr_t rdmsr(int addr); diff --git a/hwaccess_x86_io.c b/hwaccess_x86_io.c new file mode 100644 index 00000000..3152bfe5 --- /dev/null +++ b/hwaccess_x86_io.c @@ -0,0 +1,87 @@ +/* + * This file is part of the flashrom project. + * + * Copyright (C) 2009,2010 Carl-Daniel Hailfinger + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <errno.h> +#include <string.h> +#if !defined (__DJGPP__) && !defined(__LIBPAYLOAD__) +/* No file access needed/possible to get hardware access permissions. */ +#include <unistd.h> +#include <fcntl.h> +#endif + +#include "hwaccess_x86_io.h" +#include "flash.h" + +#if USE_IOPERM +#include <sys/io.h> +#endif + +#if USE_DEV_IO +int io_fd; +#endif + +#if !(defined(__DJGPP__) || defined(__LIBPAYLOAD__)) +static int release_io_perms(void *p) +{ +#if defined (__sun) + sysi86(SI86V86, V86SC_IOPL, 0); +#elif USE_DEV_IO + close(io_fd); +#elif USE_IOPERM + ioperm(0, 65536, 0); +#elif USE_IOPL + iopl(0); +#endif + return 0; +} + +/* Get I/O permissions with automatic permission release on shutdown. */ +int rget_io_perms(void) +{ + #if defined (__sun) + if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) != 0) { +#elif USE_DEV_IO + if ((io_fd = open("/dev/io", O_RDWR)) < 0) { +#elif USE_IOPERM + if (ioperm(0, 65536, 1) != 0) { +#elif USE_IOPL + if (iopl(3) != 0) { +#endif + msg_perr("ERROR: Could not get I/O privileges (%s).\n", strerror(errno)); + msg_perr("You need to be root.\n"); +#if defined (__OpenBSD__) + msg_perr("If you are root already please set securelevel=-1 in /etc/rc.securelevel and\n" + "reboot, or reboot into single user mode.\n"); +#elif defined(__NetBSD__) + msg_perr("If you are root already please reboot into single user mode or make sure\n" + "that your kernel configuration has the option INSECURE enabled.\n"); +#endif + return 1; + } else { + register_shutdown(release_io_perms, NULL); + } + return 0; +} + +#else + +/* DJGPP and libpayload environments have full PCI port I/O permissions by default. */ +/* PCI port I/O support is unimplemented on PPC/MIPS and unavailable on ARM. */ +int rget_io_perms(void) +{ + return 0; +} +#endif diff --git a/hwaccess_x86_io.h b/hwaccess_x86_io.h index 63692b8d..0d16fdde 100644 --- a/hwaccess_x86_io.h +++ b/hwaccess_x86_io.h @@ -29,8 +29,6 @@ #include <sys/io.h> #endif -#define __FLASHROM_HAVE_OUTB__ 1 - /* for iopl and outb under Solaris */ #if defined (__sun) #include <sys/sysi86.h> @@ -38,6 +36,8 @@ #include <asm/sunddi.h> #endif +int rget_io_perms(void); + /* Clarification about OUTB/OUTW/OUTL argument order: * OUT[BWL](val, port) */ @@ -20,6 +20,7 @@ #include "flash.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" int is_laptop = 0; @@ -18,6 +18,7 @@ #include "flash.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" static uint8_t *it8212_bar = NULL; @@ -26,7 +26,7 @@ #include "flash.h" #include "spi.h" #include "programmer.h" -#include "hwaccess.h" +#include "hwaccess_x86_io.h" #define MAX_TIMEOUT 100000 #define MAX_TRY 5 @@ -26,6 +26,7 @@ #include "chipdrivers.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "spi.h" #define ITE_SUPERIO_PORT1 0x2e diff --git a/meson.build b/meson.build index 85f40ba5..5cbcac22 100644 --- a/meson.build +++ b/meson.build @@ -347,8 +347,10 @@ endif # raw memory, MSR or PCI port I/O access if need_raw_access srcs += 'hwaccess.c' + srcs += 'hwaccess_x86_io.c' srcs += 'physmap.c' cargs += '-DNEED_RAW_ACCESS=1' + cargs += '-D__FLASHROM_HAVE_OUTB__=1' endif # raw serial IO @@ -17,7 +17,7 @@ #include <stdlib.h> #include "flash.h" #include "programmer.h" -#include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #define BIOS_ROM_ADDR 0x04 @@ -19,6 +19,7 @@ #include "flash.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" static uint8_t *nicintel_bar; diff --git a/nicintel_eeprom.c b/nicintel_eeprom.c index ab753434..fc2ef408 100644 --- a/nicintel_eeprom.c +++ b/nicintel_eeprom.c @@ -35,6 +35,7 @@ #include "spi.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #define PCI_VENDOR_ID_INTEL 0x8086 diff --git a/nicintel_spi.c b/nicintel_spi.c index f1ed1294..25a66516 100644 --- a/nicintel_spi.c +++ b/nicintel_spi.c @@ -35,6 +35,7 @@ #include "flash.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #define PCI_VENDOR_ID_INTEL 0x8086 diff --git a/nicnatsemi.c b/nicnatsemi.c index 9dd39158..bac65025 100644 --- a/nicnatsemi.c +++ b/nicnatsemi.c @@ -17,7 +17,7 @@ #include <stdlib.h> #include "flash.h" #include "programmer.h" -#include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #define PCI_VENDOR_ID_NATSEMI 0x100b diff --git a/nicrealtek.c b/nicrealtek.c index 0bf60fd2..71f9aaf0 100644 --- a/nicrealtek.c +++ b/nicrealtek.c @@ -17,7 +17,7 @@ #include <stdlib.h> #include "flash.h" #include "programmer.h" -#include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #define PCI_VENDOR_ID_REALTEK 0x10ec @@ -19,6 +19,7 @@ #include "flash.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #define PCI_VENDOR_ID_OGP 0x1227 diff --git a/programmer.h b/programmer.h index b4f04e7a..b8b5bbcb 100644 --- a/programmer.h +++ b/programmer.h @@ -271,7 +271,6 @@ struct pci_dev *pci_dev_find(uint16_t vendor, uint16_t device); struct pci_dev *pci_card_find(uint16_t vendor, uint16_t device, uint16_t card_vendor, uint16_t card_device); #endif -int rget_io_perms(void); #if CONFIG_INTERNAL == 1 extern int is_laptop; extern int laptop_ok; diff --git a/rayer_spi.c b/rayer_spi.c index e65eb78d..6cf918a8 100644 --- a/rayer_spi.c +++ b/rayer_spi.c @@ -28,7 +28,7 @@ #include <string.h> #include "flash.h" #include "programmer.h" -#include "hwaccess.h" +#include "hwaccess_x86_io.h" /* We have two sets of pins, out and in. The numbers for both sets are * independent and are bitshift values, not real pin numbers. @@ -20,6 +20,7 @@ #include "flash.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" static uint8_t *mv_bar; @@ -18,6 +18,7 @@ #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "platform/pci.h" #define PCI_VENDOR_ID_SII 0x1095 diff --git a/tests/hwaccess_x86_io_unittest.h b/tests/hwaccess_x86_io_unittest.h index 2a4cd5f3..14f3caa9 100644 --- a/tests/hwaccess_x86_io_unittest.h +++ b/tests/hwaccess_x86_io_unittest.h @@ -39,6 +39,8 @@ #include <stdint.h> +int rget_io_perms(void); + /* * Dummy implementation of iopl from sys/io.h. * sys/io.h by itself is platform-specific, so instead of including diff --git a/wbsio_spi.c b/wbsio_spi.c index 60b725f1..805abf78 100644 --- a/wbsio_spi.c +++ b/wbsio_spi.c @@ -20,6 +20,7 @@ #include "chipdrivers.h" #include "programmer.h" #include "hwaccess.h" +#include "hwaccess_x86_io.h" #include "spi.h" #define WBSIO_PORT1 0x2e |