***************************************************************************
>>> What it does
***************************************************************************

The microcode_ctl utility is a companion to the IA32 microcode driver
written by Tigran Aivazian <tigran@aivazian.fsnet.co.uk>. The utility has
two uses:

a) it decodes and sends new microcode to the kernel driver to be uploaded
   to Intel IA32 family processors. (Pentium Pro, PII, Celeron, PIII, 
   Xeon, Pentium 4 etc, x86_64)
b) it signals the kernel driver to release any buffers it may hold

The microcode update is volatile and needs to be uploaded on each system
boot i.e. it doesn't reflash your cpu permanently, reboot and it reverts
back to the old microcode.

***************************************************************************
>>> how to compile the kernel to include support for microcode update
***************************************************************************

The microcode driver is a feature of the Linux kernel added to 2.4.0-test1 and
2.2.18, it needs to be enabled at compile time and it may be compiled as a
module.  CONFIG_MICROCODE is in the "Processor type and features" kernel
configuration section.  This utility relates to kernel microcode driver v1.04
or newer.

The kernel driver supports regular misc device and devfs, to create the device
node on a non-devfs system as root type:

# make device

this is equivalent to

# mkdir -p /dev/cpu/
# mknod /dev/cpu/microcode c 10 184

If you are using devfs, then you can either access the driver via regular
file cpu/microcode or via misc character device misc/microcode, both
of which are created automatically under the devfs mountpoint.

You may also find your microcode device node under /dev/cpu/0/microcode

***************************************************************************
>>> how to compile it
***************************************************************************

The utility has a simple Makefile to compile and install the software,
there are three targets of interest;

- "make all" will build the program executable
- "make install" will copy the files into standard locations
- "make device" will create a microcode device node

when building from the source it is recommended to execute "make install
device" or use the rpm packaging feature "rpm -ta microcode_ctl-n.tar.gz"

***************************************************************************
>>> how to invoke it
***************************************************************************

The utility installs by default into /usr/local whilst the RPM package
installs files into /usr - the supplied system startup script is aware of
both locations. The utility can be invoked simply as "microcode_ctl -u"

The utility will print something like:

microcode_ctl: writing microcode (length: 98304)
microcode_ctl: microcode successfuly written to /dev/cpu/microcode

The driver will send messages to the system log (/var/log/messages) like:

microcode: CPU1 updated from revision 7 to 14, date=09101999
microcode: CPU0 updated from revision 7 to 14, date=09101999

The driver won't let you downgrade or apply the same microcode as the
version it is running, it is also possible that the current version of the
microcode does not include one suitable for your processor(s). In these
cases the utility will fail with EIO and the driver will print an
explanation into the system log. For example, refusal to downgrade the
microcode produces this message in the log:

microcode: CPU1 not 'upgrading' to earlier revision 14 (current=14)
microcode: CPU0 not 'upgrading' to earlier revision 14 (current=14)

which was caused by the second invocation of microcode_ctl:

# microcode_ctl -f microcode.dat
microcode_ctl: writing microcode (length: 98304)
microcode_ctl: error writing to '/dev/cpu/microcode' errno=5 (Input/output error)
microcode_ctl: there may be messages from the driver in your system log.

***************************************************************************
>>> updating every system boot
***************************************************************************

A simple script has been included for systems to apply the microcode
update on boot. The script is a good illustration on how to use the
utility but it may be useful to run through some basic usage.

Without using the provided startup script, to update your microcode on every
system boot you'll need to add a line like the following to /etc/rc.d/rc.local
(where prefix indicates the location of the binary)

prefix/microcode_ctl -u

or to specify another microcode file 

prefix/microcode_ctl -f /etc/microcode.dat

Simple as that. Problems? Contact either myself at anton@redhat.com or
Tigran at tigran@aivazian.fsnet.co.uk

***************************************************************************
>>> Contributors
***************************************************************************
Credit where credit is due; the following people contributed ideas or
patches. Thanks :)

Richard Schaal <richard.schaal@intel.com>
Andreas Steinmetz <ast@domdv.de>
Giacomo Catenazzi <cate@neper.ethz.ch>
John Moore <johnmoore@iee.org>
Oliver Fassbender <olli@intrepid.de>
Peter Kovacs <pkovacs@webmachines.com>
Alan Eldridge <alane@geeksrus.net>
Keven Belanger <kevenb@nwb.qc.ca>
Robb Romans <robb@austin.ibm.com>

***************************************************************************
>>> Special thanks
***************************************************************************

o Intel Corporation, for supplying microcode update data and publishing
  the specifications that enabled us to write microcode driver for Linux.

- Anton Arapov <anton@redhat.com> http://fedorahosted.org/microcode_ctl
- Simon Trimmer <simon@urbanmyth.org> http://www.urbanmyth.org
