Subject: Re: release
To: Adam Glass <glass@SUN-LAMP.CS.BERKELEY.EDU>
From: Chuck Silvers <chs+@cs.cmu.edu>
List: port-sun3
Date: 02/08/1994 02:15:29
Ok, here's the guts of it, ramd.c:

#include <sys/param.h>
#include <sys/buf.h>

#define RAMD_SIZE (256 * 1024)

char ramd_image[RAMD_SIZE] = {0};

int
ramdopen(dev_t dev, int flags, int ifmt, struct proc *p)
{
    printf("ramdopen 0x%x\n", dev);
}

void
ramdstrategy(register struct buf *bp)
{
    int offset, count;

    printf("ramdstrat: blkno 0x%x bcount 0x%x\n", bp->b_blkno, bp->b_bcount);

    if (minor(bp->b_dev) != 0) {
        bp->b_error = EINVAL;
        bp->b_flags |= B_ERROR;
        return;
    }

    offset = bp->b_blkno * DEV_BSIZE;
    count = bp->b_bcount;

    if (offset + count > RAMD_SIZE) {
        bp->b_error = EINVAL;
        bp->b_flags |= B_ERROR;
        return;
    }

    if (bp->b_flags & B_READ) {
        bcopy(&ramd_image[offset], bp->b_un.b_addr, count);
    }
    else {
        bcopy(bp->b_un.b_addr, &ramd_image[offset], count);
    }

    bp->b_resid = 0;

    iodone(bp);
    printf("ramdstrat: done\n");
}

int
ramdioctl(dev_t dev, int cmd, register caddr_t data, int flag, struct proc *p)
{
    printf("ramdioctl 0x%x\n", dev);
    return -1;
}

int
ramddump(dev_t dev, daddr_t blkoff, caddr_t addr, int len)
{
    printf("ramddump\n");
    return 0;
}

int
ramdsize(dev_t dev)
{
    return (RAMD_SIZE/DEV_BSIZE);
}


--------------------


The necessary glue is:
in sun3/conf.c, add
	bdev_decl(ramd);
and
        bdev_disk_init(1,ramd),
in the appropriate places.

Figuring out how to hook this in so it was used as the root device
wasn't as clear in -current as it was in the magnum stuff,
what I did was to insert
    rootdev = makedev(3,0);
    swapdev = makedev(3,1);
    swdevt[0].sw_dev = makedev(3,1);
    swdevt[0].sw_freed = 0;
at the end of configure() in sun3/autoconf.c and to put in

extern int ufs_mountroot();
int (*mountroot)() = ufs_mountroot;

in the same file.  Then I just used

config netbsd swap generic

in the config file.  This didn't quite work in -current, but I think
it's pretty close.  I think the bits for dealing with swap are what
is wrong, but I don't know enough about that stuff to know for sure.
It would be good if there was a simple way to just run without any
swap space.

Then to initialize the ramdisk image, I ran

lwrite netbsd `echo 'ramd_image-0xe004000+0x20=D' |adb netbsd` < ~/fs.image.256

where fs.image.256 is an itty-bitty filesystem image and
lwrite is:

#include <ctype.h>
#include <stdio.h>
#include <sys/file.h>
#include <strings.h>

int hextoi(s)
char *s;
{
    int i = 0;
    static char *hex = "0123456789abcdef";

    while (*s) {
        i <<= 4;
        i += index(hex, isupper(*s) ? *s | 0x20 : *s) - hex;
        s++;
    }

    return i;
}

main(argc, argv)
int argc;
char **argv;
{
    int fd, offset, len;
    char buf[1024];

    if (argc != 3) {
        fputs("usage: lwrite [filename] [offset]\n", stderr);
        exit(1);
    }

    if ((fd = open(argv[1], O_WRONLY, 0666)) == -1) {
        fputs("lread: could not open ", stderr);
        fputs(argv[1], stderr);
        fputs("\n", stderr);
        exit(1);
    }

    offset = (argv[2][0] == '0' && argv[2][1] == 'x') ?
        hextoi(argv[2] + 2) : atoi(argv[2]);

    lseek(fd, offset, L_SET);

    for (;;) {
        if ((len = read(0, buf, sizeof(buf))) <= 0)
            exit(0);
        write(fd, buf, len);
    }
}


I think that's all of it.  A little rough, I must admit.

-Chuck

------------------------------------------------------------------------------