Oops, the previous revision (1.35) broke booting from floppies

because the buffers we use could end up spanning a 64k boundary.
Unfortunately it causes too much bloat (228 -> 72 bytes free) to
just reinstate the old malloc() function.

Instead, define a structure that contains all 4 buffers which must
not cross 64k boundaries. We allocate a 64k-aligned instance in
main() using the magic that was in the old boot2 malloc() function.
This brings the free space down to 168 bytes, but that is still
better than it was before revision 1.35 (136 bytes).

Reported by:	Mike Brancato <funnyguy@digitalsmackdown.net>
Pointy-hat to:	iedowse
This commit is contained in:
iedowse 2002-01-17 22:39:19 +00:00
parent b38e892818
commit 8ff94b6175
2 changed files with 36 additions and 12 deletions

View File

@ -88,6 +88,14 @@
#define TYPE_FD 3
#define TYPE_DA 4
/* Buffers that must not span a 64k boundary. */
static struct dmadat {
char blkbuf[VBLKSIZE]; /* filesystem blocks */
ufs_daddr_t indbuf[VBLKSIZE / sizeof(ufs_daddr_t)]; /* indir blocks */
char sbbuf[SBSIZE]; /* superblock */
char secbuf[DEV_BSIZE]; /* for MBR/disklabel */
} *dmadat;
extern uint32_t _end;
static const char optstr[NOPT] = "DhaCcdgPrsv";
@ -254,6 +262,7 @@ main(void)
{
int autoboot, i;
dmadat = (void *)(roundup2(__base + _end, 0x10000) - __base);
v86.ctl = V86_FLAGS;
dsk.drive = *(uint8_t *)PTOV(ARGS);
dsk.type = dsk.drive & DRV_HARD ? TYPE_AD : TYPE_FD;
@ -530,21 +539,23 @@ xfsread(ino_t inode, void *buf, size_t nbyte)
static ssize_t
fsread(ino_t inode, void *buf, size_t nbyte)
{
static char blkbuf[VBLKSIZE];
static ufs_daddr_t indbuf[VBLKSIZE / sizeof(ufs_daddr_t)];
static char sbbuf[SBSIZE];
static struct dinode din;
static struct fs *fs = (struct fs *)sbbuf;
static ino_t inomap;
static daddr_t blkmap, indmap;
char *blkbuf;
ufs_daddr_t *indbuf;
struct fs *fs;
char *s;
ufs_daddr_t lbn, addr;
daddr_t vbaddr;
size_t n, nb, off, vboff;
blkbuf = dmadat->blkbuf;
indbuf = dmadat->indbuf;
fs = (struct fs *)dmadat->sbbuf;
if (!dsk.meta) {
inomap = 0;
if (dskread(sbbuf, SBOFF / DEV_BSIZE, SBSIZE / DEV_BSIZE))
if (dskread(fs, SBOFF / DEV_BSIZE, SBSIZE / DEV_BSIZE))
return -1;
if (fs->fs_magic != FS_MAGIC) {
printf("Not ufs\n");
@ -605,12 +616,13 @@ fsread(ino_t inode, void *buf, size_t nbyte)
static int
dskread(void *buf, unsigned lba, unsigned nblk)
{
static char sec[DEV_BSIZE];
struct dos_partition *dp;
struct disklabel *d;
char *sec;
unsigned sl, i;
if (!dsk.meta) {
sec = dmadat->secbuf;
dsk.start = 0;
if (drvread(sec, DOSBBSECTOR, 1))
return -1;

View File

@ -88,6 +88,14 @@
#define TYPE_FD 3
#define TYPE_DA 4
/* Buffers that must not span a 64k boundary. */
static struct dmadat {
char blkbuf[VBLKSIZE]; /* filesystem blocks */
ufs_daddr_t indbuf[VBLKSIZE / sizeof(ufs_daddr_t)]; /* indir blocks */
char sbbuf[SBSIZE]; /* superblock */
char secbuf[DEV_BSIZE]; /* for MBR/disklabel */
} *dmadat;
extern uint32_t _end;
static const char optstr[NOPT] = "DhaCcdgPrsv";
@ -254,6 +262,7 @@ main(void)
{
int autoboot, i;
dmadat = (void *)(roundup2(__base + _end, 0x10000) - __base);
v86.ctl = V86_FLAGS;
dsk.drive = *(uint8_t *)PTOV(ARGS);
dsk.type = dsk.drive & DRV_HARD ? TYPE_AD : TYPE_FD;
@ -530,21 +539,23 @@ xfsread(ino_t inode, void *buf, size_t nbyte)
static ssize_t
fsread(ino_t inode, void *buf, size_t nbyte)
{
static char blkbuf[VBLKSIZE];
static ufs_daddr_t indbuf[VBLKSIZE / sizeof(ufs_daddr_t)];
static char sbbuf[SBSIZE];
static struct dinode din;
static struct fs *fs = (struct fs *)sbbuf;
static ino_t inomap;
static daddr_t blkmap, indmap;
char *blkbuf;
ufs_daddr_t *indbuf;
struct fs *fs;
char *s;
ufs_daddr_t lbn, addr;
daddr_t vbaddr;
size_t n, nb, off, vboff;
blkbuf = dmadat->blkbuf;
indbuf = dmadat->indbuf;
fs = (struct fs *)dmadat->sbbuf;
if (!dsk.meta) {
inomap = 0;
if (dskread(sbbuf, SBOFF / DEV_BSIZE, SBSIZE / DEV_BSIZE))
if (dskread(fs, SBOFF / DEV_BSIZE, SBSIZE / DEV_BSIZE))
return -1;
if (fs->fs_magic != FS_MAGIC) {
printf("Not ufs\n");
@ -605,12 +616,13 @@ fsread(ino_t inode, void *buf, size_t nbyte)
static int
dskread(void *buf, unsigned lba, unsigned nblk)
{
static char sec[DEV_BSIZE];
struct dos_partition *dp;
struct disklabel *d;
char *sec;
unsigned sl, i;
if (!dsk.meta) {
sec = dmadat->secbuf;
dsk.start = 0;
if (drvread(sec, DOSBBSECTOR, 1))
return -1;