I’ve done many tools reviews in the history of this web site, so it would be unthinkable to neglect to talk about what may be the biggest and baddest tool of them all—RWEverything!

RWEverything has been in the toolkit of many a BIOS programmer for a long time, going back 12+ years.  Among the challenging aspects of being a BIOS programmer is the need to have a grasp on so many industry standards: PCI, APCI, SMBIOS, USB, and hardware technologies like a CPU’s MSRs, embedded controllers, and so forth—it’s a long list.  What RWEverything gives the BIOS programmer is the ability to interact with (both read and write, hence the name) ANY AND ALL of these diverse technologies.  You don’t have to have one tool for interrogating SMBIOS, one for USB, and a different one for ACPI.  This one 12MB package comes in 32-bit and 64-bit varieties and can handle it all.

Exactly What is Supported?

PCI bus, PCI OROMs, Memory Space, IO Space, Super I/O, Clock Generator, DIMM SPD, SMBus, CPU MSRs, ACPI, Embedded Controllers, ATA, USB, SMBIOS, MP Configuration Table, System Memory Map, EDID, LPT port!

In the following sections I’ll demonstrate just three of the many possible uses of RWEverything.

Example #1:  SMBIOS

RWEverything’s SMBIOS functionality provides read access to the various tables populated on the target system.  A directory of the tables is in a pane on the left side of the window:


By clicking a particular table, the user can see the details of the table, in a hybrid hex + ASCII format that BIOS developers should be familiar with:


RWEverything supports up to SMBIOS v2.6. Hopefully this will be updated in the near future.

Example #2:  USB

RWEverything has a great USB interrogating feature which traverses the target system’s USB port topology, shows what’s connected to each port, and shows the USB configuration data for the device attached to each port.

On the left side of the window is the port topology:


On the right side of the window is the device configuration for the device that’s been selected from the left side:


The functionality of RWEverything’s USB feature is similar to the Windows DDK’s USBVIEW.EXE, with which you may be familiar.

Example #3: MSRs

A Model-Specific Register (MSR) is Intel’s term for the (hundreds and hundreds) of control registers that allow BIOS developers to read the status or control the behavior of a processor or chipset device.  Let’s pick one example, IA32_EFER, documented here.

To check the value of IA32_EFER, click the MSR button in RWEverything and you’ll see a table like:


This is interesting, but the IA32_EFER MSR is not listed here, so we’ll have to add it:

  1. click the “User” button
  2. enter the MSR in the format <RegisterName>=<0xAddress>
  3. click “Add”


Now you’ll see the MSR on the “User” tab of the RWEverything interface:


The value for CPU1 is 0xD01.  Plugging 0xD01 into Windows Calculator, we get:


Bits 0, 8, 10, and 11 are all set:

0 - SCE: System Call Enable Bit

8 - LME: Long Mode Enabled

10 - LMA: Long Mode Active

11 - NXE: Enable No-Execute Mode

Command-line Interface

RWEverything is not only a GUI, but has a nice command-line interface with scripting capabilities.  Here is a small snippet of the help file:


For example, I can type “smbios 7“ to dump the type 7 tables:



RWEverything is especially helpful when trying to learn a new technology, for example PCI or USB.  Rather than just reading a book on the subject, you can both read a book and at the same time poke around in a real system to reinforce, in a practical way, how these technologies work.

RWEverything is also a helpful debugging tool which allows the user to change the state of the hardware without having to rebuild and flash a new BIOS.  This allows quick and easy testing of various configuration changes to see their effect.

RWEverything is written by a Taiwanese programmer named Jeff.  The program is 100% free, but donations are appreciated.  I’ve only scratched the surface of what’s possible with this tool—do yourself a favor and experiment with it for yourself!

Post a Comment

Be sure to select an account profile (e.g. Google, OpenID, etc.) before typing your comment!