diff options
| author | Ian Dowse <iedowse@FreeBSD.org> | 2002-01-14 19:39:19 +0000 |
|---|---|---|
| committer | Ian Dowse <iedowse@FreeBSD.org> | 2002-01-14 19:39:19 +0000 |
| commit | e9f90463379b6efddfd7ab1014f625a1b3083456 (patch) | |
| tree | 4b686ebee61f8fdf694c3d72eb8e3e0aa1db8c56 | |
| parent | 9348f5e7a606b1452a96fea89667e84d26ef2ef8 (diff) | |
Notes
| -rw-r--r-- | sys/boot/i386/boot2/boot2.c | 94 | ||||
| -rw-r--r-- | sys/boot/i386/gptboot/gptboot.c | 94 |
2 files changed, 92 insertions, 96 deletions
diff --git a/sys/boot/i386/boot2/boot2.c b/sys/boot/i386/boot2/boot2.c index 80866735b6e4..a44eefc5160f 100644 --- a/sys/boot/i386/boot2/boot2.c +++ b/sys/boot/i386/boot2/boot2.c @@ -57,13 +57,28 @@ #define ARGS 0x900 #define NOPT 11 -#define BSIZEMAX 16384 #define NDEV 5 #define MEM_BASE 0x12 #define MEM_EXT 0x15 #define V86_CY(x) ((x) & 1) #define V86_ZR(x) ((x) & 0x40) +/* + * We use 4k `virtual' blocks for filesystem data, whatever the actual + * filesystem block size. FFS blocks are always a multiple of 4k. + */ +#define VBLKSIZE 4096 +#define VBLKMASK (VBLKSIZE - 1) +#define DBPERVBLK (VBLKSIZE / DEV_BSIZE) +#define IPERVBLK (VBLKSIZE / sizeof(struct dinode)) +#define INDIRPERVBLK (VBLKSIZE / sizeof(ufs_daddr_t)) +#define INO_TO_VBA(fs, x) (fsbtodb(fs, ino_to_fsba(fs, x)) + \ + (ino_to_fsbo(fs, x) / IPERVBLK) * DBPERVBLK) +#define INO_TO_VBO(fs, x) (ino_to_fsbo(fs, x) % IPERVBLK) +#define FS_TO_VBA(fs, fsb, off) (fsbtodb(fs, fsb) + \ + ((off) / VBLKSIZE) * DBPERVBLK) +#define FS_TO_VBO(fs, fsb, off) ((off) & VBLKMASK) + #define DRV_HARD 0x80 #define DRV_MASK 0x7f @@ -121,7 +136,6 @@ static int dskread(void *, unsigned, unsigned); static int printf(const char *,...); static int putchar(int); static void *memcpy(void *, const void *, size_t); -static void *malloc(size_t); static uint32_t memsize(int); static int drvread(void *, unsigned, unsigned); static int keyhit(unsigned); @@ -516,38 +530,34 @@ xfsread(ino_t inode, void *buf, size_t nbyte) static ssize_t fsread(ino_t inode, void *buf, size_t nbyte) { - static struct fs fs; + static char blkbuf[VBLKSIZE]; + static ufs_daddr_t indbuf[VBLKSIZE / sizeof(ufs_daddr_t)]; + static char sbbuf[SBSIZE]; static struct dinode din; - static char *blkbuf; - static ufs_daddr_t *indbuf; + static struct fs *fs = (struct fs *)sbbuf; static ino_t inomap; - static ufs_daddr_t blkmap, indmap; - static unsigned fsblks; + static daddr_t blkmap, indmap; char *s; ufs_daddr_t lbn, addr; - size_t n, nb, off; + daddr_t vbaddr; + size_t n, nb, off, vboff; if (!dsk.meta) { - if (!blkbuf) - blkbuf = malloc(BSIZEMAX); inomap = 0; - if (dskread(blkbuf, SBOFF / DEV_BSIZE, SBSIZE / DEV_BSIZE)) + if (dskread(sbbuf, SBOFF / DEV_BSIZE, SBSIZE / DEV_BSIZE)) return -1; - memcpy(&fs, blkbuf, sizeof(fs)); - if (fs.fs_magic != FS_MAGIC) { + if (fs->fs_magic != FS_MAGIC) { printf("Not ufs\n"); return -1; } - fsblks = fs.fs_bsize >> DEV_BSHIFT; dsk.meta++; } if (!inode) return 0; if (inomap != inode) { - if (dskread(blkbuf, fsbtodb(&fs, ino_to_fsba(&fs, inode)), - fsblks)) + if (dskread(blkbuf, INO_TO_VBA(fs, inode), DBPERVBLK)) return -1; - din = ((struct dinode *)blkbuf)[inode % INOPB(&fs)]; + din = ((struct dinode *)blkbuf)[INO_TO_VBO(fs, inode)]; inomap = inode; fs_off = 0; blkmap = indmap = 0; @@ -557,31 +567,34 @@ fsread(ino_t inode, void *buf, size_t nbyte) nbyte = n; nb = nbyte; while (nb) { - lbn = lblkno(&fs, fs_off); + lbn = lblkno(fs, fs_off); + off = blkoff(fs, fs_off); if (lbn < NDADDR) addr = din.di_db[lbn]; else { - if (indmap != din.di_ib[0]) { - if (!indbuf) - indbuf = malloc(BSIZEMAX); - if (dskread(indbuf, fsbtodb(&fs, din.di_ib[0]), - fsblks)) + vbaddr = FS_TO_VBA(fs, din.di_ib[0], sizeof(indbuf[0]) * + ((lbn - NDADDR) % NINDIR(fs))); + if (indmap != vbaddr) { + if (dskread(indbuf, vbaddr, DBPERVBLK)) return -1; - indmap = din.di_ib[0]; + indmap = vbaddr; } - addr = indbuf[(lbn - NDADDR) % NINDIR(&fs)]; + addr = indbuf[(lbn - NDADDR) % INDIRPERVBLK]; } - n = dblksize(&fs, &din, lbn); - if (blkmap != addr) { - if (dskread(blkbuf, fsbtodb(&fs, addr), n >> DEV_BSHIFT)) + vbaddr = FS_TO_VBA(fs, addr, off); + vboff = FS_TO_VBO(fs, addr, off); + n = dblksize(fs, &din, lbn) - (off & ~VBLKMASK); + if (n > VBLKSIZE) + n = VBLKSIZE; + if (blkmap != vbaddr) { + if (dskread(blkbuf, vbaddr, n >> DEV_BSHIFT)) return -1; - blkmap = addr; + blkmap = vbaddr; } - off = blkoff(&fs, fs_off); - n -= off; + n -= vboff; if (n > nb) n = nb; - memcpy(s, blkbuf + off, n); + memcpy(s, blkbuf + vboff, n); s += n; fs_off += n; nb -= n; @@ -592,14 +605,12 @@ fsread(ino_t inode, void *buf, size_t nbyte) static int dskread(void *buf, unsigned lba, unsigned nblk) { - static char *sec; + static char sec[DEV_BSIZE]; struct dos_partition *dp; struct disklabel *d; unsigned sl, i; if (!dsk.meta) { - if (!sec) - sec = malloc(DEV_BSIZE); dsk.start = 0; if (drvread(sec, DOSBBSECTOR, 1)) return -1; @@ -711,19 +722,6 @@ memcpy(void *dst, const void *src, size_t size) return dst; } -static void * -malloc(size_t size) -{ - static uint32_t next; - void *p; - - if (!next) - next = roundup2(__base + _end, 0x10000) - __base; - p = (void *)next; - next += size; - return p; -} - static uint32_t memsize(int type) { diff --git a/sys/boot/i386/gptboot/gptboot.c b/sys/boot/i386/gptboot/gptboot.c index 80866735b6e4..a44eefc5160f 100644 --- a/sys/boot/i386/gptboot/gptboot.c +++ b/sys/boot/i386/gptboot/gptboot.c @@ -57,13 +57,28 @@ #define ARGS 0x900 #define NOPT 11 -#define BSIZEMAX 16384 #define NDEV 5 #define MEM_BASE 0x12 #define MEM_EXT 0x15 #define V86_CY(x) ((x) & 1) #define V86_ZR(x) ((x) & 0x40) +/* + * We use 4k `virtual' blocks for filesystem data, whatever the actual + * filesystem block size. FFS blocks are always a multiple of 4k. + */ +#define VBLKSIZE 4096 +#define VBLKMASK (VBLKSIZE - 1) +#define DBPERVBLK (VBLKSIZE / DEV_BSIZE) +#define IPERVBLK (VBLKSIZE / sizeof(struct dinode)) +#define INDIRPERVBLK (VBLKSIZE / sizeof(ufs_daddr_t)) +#define INO_TO_VBA(fs, x) (fsbtodb(fs, ino_to_fsba(fs, x)) + \ + (ino_to_fsbo(fs, x) / IPERVBLK) * DBPERVBLK) +#define INO_TO_VBO(fs, x) (ino_to_fsbo(fs, x) % IPERVBLK) +#define FS_TO_VBA(fs, fsb, off) (fsbtodb(fs, fsb) + \ + ((off) / VBLKSIZE) * DBPERVBLK) +#define FS_TO_VBO(fs, fsb, off) ((off) & VBLKMASK) + #define DRV_HARD 0x80 #define DRV_MASK 0x7f @@ -121,7 +136,6 @@ static int dskread(void *, unsigned, unsigned); static int printf(const char *,...); static int putchar(int); static void *memcpy(void *, const void *, size_t); -static void *malloc(size_t); static uint32_t memsize(int); static int drvread(void *, unsigned, unsigned); static int keyhit(unsigned); @@ -516,38 +530,34 @@ xfsread(ino_t inode, void *buf, size_t nbyte) static ssize_t fsread(ino_t inode, void *buf, size_t nbyte) { - static struct fs fs; + static char blkbuf[VBLKSIZE]; + static ufs_daddr_t indbuf[VBLKSIZE / sizeof(ufs_daddr_t)]; + static char sbbuf[SBSIZE]; static struct dinode din; - static char *blkbuf; - static ufs_daddr_t *indbuf; + static struct fs *fs = (struct fs *)sbbuf; static ino_t inomap; - static ufs_daddr_t blkmap, indmap; - static unsigned fsblks; + static daddr_t blkmap, indmap; char *s; ufs_daddr_t lbn, addr; - size_t n, nb, off; + daddr_t vbaddr; + size_t n, nb, off, vboff; if (!dsk.meta) { - if (!blkbuf) - blkbuf = malloc(BSIZEMAX); inomap = 0; - if (dskread(blkbuf, SBOFF / DEV_BSIZE, SBSIZE / DEV_BSIZE)) + if (dskread(sbbuf, SBOFF / DEV_BSIZE, SBSIZE / DEV_BSIZE)) return -1; - memcpy(&fs, blkbuf, sizeof(fs)); - if (fs.fs_magic != FS_MAGIC) { + if (fs->fs_magic != FS_MAGIC) { printf("Not ufs\n"); return -1; } - fsblks = fs.fs_bsize >> DEV_BSHIFT; dsk.meta++; } if (!inode) return 0; if (inomap != inode) { - if (dskread(blkbuf, fsbtodb(&fs, ino_to_fsba(&fs, inode)), - fsblks)) + if (dskread(blkbuf, INO_TO_VBA(fs, inode), DBPERVBLK)) return -1; - din = ((struct dinode *)blkbuf)[inode % INOPB(&fs)]; + din = ((struct dinode *)blkbuf)[INO_TO_VBO(fs, inode)]; inomap = inode; fs_off = 0; blkmap = indmap = 0; @@ -557,31 +567,34 @@ fsread(ino_t inode, void *buf, size_t nbyte) nbyte = n; nb = nbyte; while (nb) { - lbn = lblkno(&fs, fs_off); + lbn = lblkno(fs, fs_off); + off = blkoff(fs, fs_off); if (lbn < NDADDR) addr = din.di_db[lbn]; else { - if (indmap != din.di_ib[0]) { - if (!indbuf) - indbuf = malloc(BSIZEMAX); - if (dskread(indbuf, fsbtodb(&fs, din.di_ib[0]), - fsblks)) + vbaddr = FS_TO_VBA(fs, din.di_ib[0], sizeof(indbuf[0]) * + ((lbn - NDADDR) % NINDIR(fs))); + if (indmap != vbaddr) { + if (dskread(indbuf, vbaddr, DBPERVBLK)) return -1; - indmap = din.di_ib[0]; + indmap = vbaddr; } - addr = indbuf[(lbn - NDADDR) % NINDIR(&fs)]; + addr = indbuf[(lbn - NDADDR) % INDIRPERVBLK]; } - n = dblksize(&fs, &din, lbn); - if (blkmap != addr) { - if (dskread(blkbuf, fsbtodb(&fs, addr), n >> DEV_BSHIFT)) + vbaddr = FS_TO_VBA(fs, addr, off); + vboff = FS_TO_VBO(fs, addr, off); + n = dblksize(fs, &din, lbn) - (off & ~VBLKMASK); + if (n > VBLKSIZE) + n = VBLKSIZE; + if (blkmap != vbaddr) { + if (dskread(blkbuf, vbaddr, n >> DEV_BSHIFT)) return -1; - blkmap = addr; + blkmap = vbaddr; } - off = blkoff(&fs, fs_off); - n -= off; + n -= vboff; if (n > nb) n = nb; - memcpy(s, blkbuf + off, n); + memcpy(s, blkbuf + vboff, n); s += n; fs_off += n; nb -= n; @@ -592,14 +605,12 @@ fsread(ino_t inode, void *buf, size_t nbyte) static int dskread(void *buf, unsigned lba, unsigned nblk) { - static char *sec; + static char sec[DEV_BSIZE]; struct dos_partition *dp; struct disklabel *d; unsigned sl, i; if (!dsk.meta) { - if (!sec) - sec = malloc(DEV_BSIZE); dsk.start = 0; if (drvread(sec, DOSBBSECTOR, 1)) return -1; @@ -711,19 +722,6 @@ memcpy(void *dst, const void *src, size_t size) return dst; } -static void * -malloc(size_t size) -{ - static uint32_t next; - void *p; - - if (!next) - next = roundup2(__base + _end, 0x10000) - __base; - p = (void *)next; - next += size; - return p; -} - static uint32_t memsize(int type) { |
