Files
lbmk/util/e6400-flash-unlock/accessors.c
T
Nicholas Chin 724cb39f86 util/e6400-flash-unlock: Update to upstream version
This updates lbmk's copy of e6400-flash-unlock to commit c5567fece479
(README.md: Update with info about broader device support) in my
upstream repo.

Changes:
- Theoretical support for any Dell system that implements that flash
  descriptor override command. This is done by reading base address
  registers at runtime instead of hard coding them for specific devices.
  Tested on the Latitude E6400 and Latitude E6430.
- Support for OpenBSD. It compiles, runs, and behaves as expected,
  though I have not actually tested internally flashing with flashrom
  yet. It should work though, as the program checks if the descriptor
  override is set and the BIOS Write Enable is able to be set to 1, which
  is all that is needed to internal flash.
- Integrated changes made in the lbmk copy
- Moved operating system accessor implementations to their own file

It should be fully functional, though minor formatting and cleanup
changes are still planned.

Signed-off-by: Nicholas Chin <nic.c3.14@gmail.com>
2023-10-09 23:16:18 -06:00

92 lines
1.5 KiB
C

/* SPDX-License-Identifier: MIT */
/* SPDX-FileCopyrightText: 2023 Nicholas Chin */
#if defined(__linux__)
#include <sys/io.h>
#endif
#if defined(__OpenBSD__)
#include <machine/sysarch.h>
#include <sys/types.h>
#if defined(__amd64__)
#include <amd64/pio.h>
#elif defined(__i386__)
#include <i386/pio.h>
#endif /* __i386__ */
#endif /* __OpenBSD__ */
#include <errno.h>
#include "accessors.h"
uint32_t
pci_read_32(uint32_t dev, uint8_t reg)
{
sys_outl(PCI_CFG_ADDR, dev | reg);
return sys_inl(PCI_CFG_DATA);
}
void
pci_write_32(uint32_t dev, uint8_t reg, uint32_t value)
{
sys_outl(PCI_CFG_ADDR, dev | reg);
sys_outl(PCI_CFG_DATA, value);
}
void
sys_outb(unsigned int port, uint8_t data)
{
#if defined(__linux__)
outb(data, port);
#endif
#if defined(__OpenBSD__)
outb(port, data);
#endif
}
void
sys_outl(unsigned int port, uint32_t data)
{
#if defined(__linux__)
outl(data, port);
#endif
#if defined(__OpenBSD__)
outl(port, data);
#endif
}
uint8_t
sys_inb(unsigned int port)
{
#if defined(__linux__) || defined (__OpenBSD__)
return inb(port);
#endif
return 0;
}
uint32_t
sys_inl(unsigned int port)
{
#if defined(__linux__) || defined (__OpenBSD__)
return inl(port);
#endif
return 0;
}
int
sys_iopl(int level)
{
#if defined(__linux__)
return iopl(level);
#endif
#if defined(__OpenBSD__)
#if defined(__i386__)
return i386_iopl(level);
#elif defined(__amd64__)
return amd64_iopl(level);
#endif /* __amd64__ */
#endif /* __OpenBSD__ */
errno = ENOSYS;
return -1;
}