Someone posted a program to either sun-spots or sun-managers which went and got
the PROM revision from kernel memory.  The motivation was that since 4.1
required certain PROM revision levels, it was easier to run a program than to
run around halting workstations and typing "kb<CR>" to get the banner.  Not to
mention that "kb<CR>" doesn't work with SPARCstation-1 PROMS; I don't know what
the Forth command is.  Anyhow, the posted program didn't do much better on
sun4c machines than "kb<CR>", so I fixed it to work with the OPENPROMS
architecture.
But the reason I got sidetracked into this was that I was looking for a recent
posting to one of these two newsgroups about SPARC FPU versions, and how to
determine what kind of FPU (if any) you have on a Sun-4.  (I know about
/usr/etc/fpuversion4, but I want detailed info on the FPU, like Weitek 123XYZ,
or TI ABC456).
Anyhow, here's the new getromrev.c.
@alex
/*
 * compile with cc -O -s -o getromrev getromrev.c -lkvm
 */
#include <sys/types.h>
#include <sys/param.h>
#ifdef OPENPROMS
#include <mon/openprom.h>
#include <nlist.h>
#else
#include <mon/sunromvec.h>
#endif
#include <fcntl.h>
#include <stdio.h>
#include <kvm.h>
#define  MAXREVLEN 16
static char rev[MAXREVLEN];
main (argc, argv)
char **argv;
{
    kvm_t *kd;
    static struct sunromvec rom;
#ifdef OPENPROMS
    static struct nlist rompsym[2] = { "_romp" };
    unsigned romp;
#endif
    if ((kd = kvm_open (NULL, NULL, NULL, O_RDONLY, argv[0])) == NULL)
        exit (1);
#ifdef OPENPROMS
    if (kvm_nlist (kd, rompsym) != 0)
    {
        fprintf (stderr, "%s: \"romp\" not in kernel name list\n", argv[0]);
        exit (1);
    }
    romp = rompsym[0].n_value;
    if (kvm_read (kd, romp, &romp, sizeof (romp)) != sizeof (romp))
    {
        fprintf (stderr, "%s: ", argv[0]);
        perror ("Error reading kernel memory");
        exit (1);
    }
#endif    
    if (kvm_read (kd, romp, &rom, sizeof (rom)) != sizeof (rom))
    {
        fprintf (stderr, "%s: ", argv[0]);
        perror ("Error reading kernel memory");
        exit (1);
    }
#ifdef OPENPROMS
    if (rom.v_magic != ROMVEC_MAGIC)
    {
        fprintf (stderr, "%s: couldn't find romvec\n", argv[0]);
        exit (1);
    }
    
    printf ("%d/%d.%d\n", rom.v_romvec_version,
            rom.v_mon_id >> 16, rom.v_mon_id & 0xffff);
#else
    printf ("%d/", rom.v_romvec_version - 1);
    if (kvm_read (kd, rom.v_mon_id, rev, sizeof (rev)) != sizeof (rev))
    {
        fprintf (stderr, "%s: ", argv[0]);
        perror ("Error reading kernel memory");
        exit (1);
    }
    printf ("%s\n", rev);
#endif
    exit (0);
}
This archive was generated by hypermail 2.1.2 : Fri Sep 28 2001 - 23:05:57 CDT