Added seek support for tape files. Before, seeking a tape file
would silently fail, causing loadfile to load file contents into the wrong addresses. On the sun3/sun3x, MARK_START was incorrectly set too. Also added support for booting a sun2.
This commit is contained in:
parent
c5710fd04d
commit
100e6f3698
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: boot.c,v 1.1 2001/06/14 12:57:16 fredette Exp $ */
|
||||
/* $NetBSD: boot.c,v 1.2 2003/08/05 19:10:26 fredette Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1982, 1986, 1990, 1993
|
||||
@ -50,8 +50,9 @@
|
||||
* segment 1: netbsd.sun3 (RAMDISK3)
|
||||
* segment 2: netbsd.sun3x (RAMDISK3X)
|
||||
* segment 3: miniroot image
|
||||
* Therefore, the default name is "1" or "2"
|
||||
* for sun3 and sun3x respectively.
|
||||
* segment 4: netbsd.sun2 (RAMDISK)
|
||||
* Therefore, the default name is "1" or "2" or "4"
|
||||
* for sun3, sun3x, and sun2, respectively.
|
||||
*/
|
||||
|
||||
char defname[32] = "1";
|
||||
@ -63,6 +64,7 @@ main()
|
||||
char *cp, *file;
|
||||
void *entry;
|
||||
u_long marks[MARK_MAX];
|
||||
u_long mark_start;
|
||||
int fd;
|
||||
|
||||
printf(">> %s tapeboot [%s]\n", bootprog_name, bootprog_rev);
|
||||
@ -74,9 +76,23 @@ main()
|
||||
* its position-to-segment on open.
|
||||
*/
|
||||
|
||||
/* Assume the Sun3/Sun3x load start. */
|
||||
memset(marks, 0, sizeof(marks));
|
||||
mark_start = 0;
|
||||
|
||||
/* If running on a Sun3X, use segment 2. */
|
||||
if (_is3x)
|
||||
defname[0] = '2';
|
||||
|
||||
/*
|
||||
* If running on a Sun2, use segment 4 and
|
||||
* do the special MMU setup.
|
||||
*/
|
||||
else if (_is2) {
|
||||
defname[0] = '4';
|
||||
mark_start = sun2_map_mem_load();
|
||||
}
|
||||
|
||||
file = defname;
|
||||
|
||||
cp = prom_bootfile;
|
||||
@ -94,7 +110,7 @@ main()
|
||||
} else
|
||||
printf("tapeboot: loading segment %s\n", file);
|
||||
|
||||
marks[MARK_START] = KERN_LOADADDR;
|
||||
marks[MARK_START] = mark_start;
|
||||
if ((fd = loadfile(file, marks, LOAD_KERNEL)) != -1) {
|
||||
break;
|
||||
}
|
||||
@ -104,6 +120,10 @@ main()
|
||||
close(fd);
|
||||
|
||||
entry = (void *)marks[MARK_ENTRY];
|
||||
if (_is2) {
|
||||
printf("relocating program...");
|
||||
entry = sun2_map_mem_run(entry);
|
||||
}
|
||||
printf("Starting program at 0x%x\n", entry);
|
||||
chain_to(entry);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: rawfs.c,v 1.1 2001/06/14 12:57:17 fredette Exp $ */
|
||||
/* $NetBSD: rawfs.c,v 1.2 2003/08/05 19:10:26 fredette Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Gordon W. Ross
|
||||
@ -53,6 +53,7 @@ extern int debug;
|
||||
*/
|
||||
struct file {
|
||||
daddr_t fs_nextblk; /* block number to read next */
|
||||
off_t fs_off; /* seek offset in file */
|
||||
int fs_len; /* amount left in f_buf */
|
||||
char * fs_ptr; /* read pointer into f_buf */
|
||||
char fs_buf[RAWFS_BSIZE];
|
||||
@ -73,6 +74,7 @@ rawfs_open(path, f)
|
||||
*/
|
||||
fs = alloc(sizeof(struct file));
|
||||
fs->fs_nextblk = 0;
|
||||
fs->fs_off = 0;
|
||||
fs->fs_len = 0;
|
||||
fs->fs_ptr = fs->fs_buf;
|
||||
|
||||
@ -132,6 +134,7 @@ rawfs_read(f, start, size, resid)
|
||||
csize = fs->fs_len;
|
||||
|
||||
bcopy(fs->fs_ptr, addr, csize);
|
||||
fs->fs_off += csize;
|
||||
fs->fs_ptr += csize;
|
||||
fs->fs_len -= csize;
|
||||
addr += csize;
|
||||
@ -161,10 +164,41 @@ rawfs_seek(f, offset, where)
|
||||
off_t offset;
|
||||
int where;
|
||||
{
|
||||
#ifdef DEBUG_RAWFS
|
||||
panic("rawfs_seek");
|
||||
#endif
|
||||
return (EFTYPE);
|
||||
struct file *fs = (struct file *)f->f_fsdata;
|
||||
off_t csize;
|
||||
|
||||
switch (where) {
|
||||
case SEEK_SET:
|
||||
offset -= fs->fs_off;
|
||||
/* FALLTHROUGH */
|
||||
case SEEK_CUR:
|
||||
if (offset >= 0)
|
||||
break;
|
||||
/* FALLTHROUGH */
|
||||
case SEEK_END:
|
||||
default:
|
||||
return (-1);
|
||||
}
|
||||
|
||||
while (offset != 0) {
|
||||
|
||||
if (fs->fs_len == 0)
|
||||
if (rawfs_get_block(f) != 0)
|
||||
return (-1);
|
||||
|
||||
if (fs->fs_len <= 0)
|
||||
break; /* EOF */
|
||||
|
||||
csize = offset;
|
||||
if (csize > fs->fs_len)
|
||||
csize = fs->fs_len;
|
||||
|
||||
fs->fs_off += csize;
|
||||
fs->fs_ptr += csize;
|
||||
fs->fs_len -= csize;
|
||||
offset -= csize;
|
||||
}
|
||||
return (fs->fs_off);
|
||||
}
|
||||
|
||||
int
|
||||
|
Loading…
x
Reference in New Issue
Block a user