                                   memtester
                                       
  Utility to test for faulty memory subsystem.
  
    by Charles Cazabon <charlesc-memtester@pyropus.ca>
    
    Copyright 1999 Simon Kirby. 
    Version 2 Copyright 1999 Charles Cazabon.
    Version 3 not publicly released.
    Version 4 rewrite:
    Copyright 2004-2010 Charles Cazabon.
    Licensed under the terms of the GNU General Public License version 2 (only).
    See the file COPYING for details.


  About memtester
  
    memtester is a utility for testing the memory subsystem in a computer to
    determine if it is faulty. The original source was by Simon Kirby
    <sim@stormix.com>. I have by this time completely rewritten the
    original source, and added many additional tests to help catch
    borderline memory. I also rewrote the original tests (which catch
    mainly memory bits which are stuck permanently high or low) so that
    they run approximately an order of magnitude faster.
   
    The version 4 rewrite was mainly to accomplish three things:
   
    (1) the previous code was basically a hack, and was ugly.
    (2) to make the code more portable.  The previous version required some
        hackery to compile on some systems.
    (3) to make the code fully 64-bit aware.  The previous version worked
        on 64-bit systems, but did not fully stress the memory subsystems
        on them -- this version should be better at stress-testing 64-bit
        systems.
         
  Building memtester
  
    memtester is currently only distributed in source-code form. Building
    it, however, is simple -- just type `make`.  There's no `configure` script
    or anything like that.  
    
    If you have a really strange system/toolchain, you might need to edit the
    conf-cc or conf-ld files, but try to build it without changes first.
    For example, if you want to cross-compile with `armgcc`, you would edit
    conf-cc and conf-ld to use `armgcc` instead of `cc`.  You can also change
    the contents of these files for other reasons; for example, if your 
    compiler isn't in your PATH, you could change it to use `/path/to/cc` or
    similar.
    
    You can run the resulting binary from anywhere, but if you want to install
    it and the manpage to /usr/local/, `make install` will do that.  Edit
    INSTALLPATH in the makefile if you prefer a different location.

    I've successfully built and run memtester 4 on the following systems:

        HP Tru64 Unix 4.0g (Alpha)
        HP Tru64 Unix 5.1b (Alpha)
        HP-UX 11i 11.11 (PA-RISC)
        HP-UX 11i 11.23 (64-bit Itanium)
        Debian GNU/Linux 3.0 (various)
        other 32-bit Linux (RedHat, SuSE, Ubuntu, etc) (various)
        RedHat Enterprise Linux/CentOS (64-bit AMD Opteron)
        FreeBSD 4.9 (32-bit Intel)
        FreeBSD 5.1 (64-bit Alpha)
        NetBSD 1.6 (32-bit Intel)
        Darwin (OS X) 7.5.0 (32-bit PowerPC)
        OS X Leopard/Panther/whatever -- 32- or 64-bit, PPC or x86

    It should, however, work on other Unix-like systems -- I simply don't
    have access to systems running Solaris, AIX, etc. at the moment.
    If you have trouble building memtester on your system, please report it
    to me so I can fix this.

  Using memtester
  
    Usage is simple for the basic case.  As root, run the resulting memtester
    binary with the following commandline:
    
      memtester <memory> [runs]
    
    where <memory> is the amount of memory to test, in megabytes by default.
    You can optionally include a suffix of B, K, M, or G (for bytes, 
    kilobytes, megabytes, and gigabytes respectively).
    [runs] is an optional limit to the number of runs through all tests.
    
    An optional "-p physaddr" argument available to cause memtester to test
    memory starting at a specific physical memory address (by mmap'ing 
    /dev/mem starting at an offset of `physaddr`, which is given in hex).  
    Note:  the memory specified will be overwritten during testing; you 
    therefore *cannot* specify a region belonging to the kernel or other
    applications without causing the other process or entire system to
    crash).  If you use this option, it is up to you to ensure the specified
    memory is safe to overwrite.  That makes this option mostly of use for
    testing memory-mapped I/O devices and similar.  Thanks to Allon Stern
    for the idea behind this feature.  For example, if you want to test a
    bank of RAM or device which is 64kbytes in size and starts at physical
    address 0x0C0000, you would run memtester as follows:
    
      memtester -p 0x0c0000 64k [runs]
    
    memtester must run as user root so that it can lock its pages into 
    memory. If memtester fails to lock its pages, it will issue a warning and 
    continue regardless.  Testing without the memory being locked is generally
    very slow and not particularly accurate, as you'll end up testing the same
    memory over and over as the system swaps the larger region.
   
  Current Version
  
    The current version of memtester should be available at
    http://pyropus.ca/software/memtester/
    
    Questions, comments, and feature requests should be
    directed to me at <charlesc-memtester@pyropus.ca>.  Read BUGS to report 
    bugs found in memtester.

