summaryrefslogtreecommitdiffstats
path: root/sys/boot/common
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2002-10-08 15:46:45 +0000
committerphk <phk@FreeBSD.org>2002-10-08 15:46:45 +0000
commit8eaa35ca87ddc1428d31986fa79575daf17553d9 (patch)
treed0885482fd71dcad8fb5a6c5b6aa800e807000ab /sys/boot/common
parentbda41137cfe2eb0fe553c6080603d550d4bf9441 (diff)
downloadFreeBSD-src-8eaa35ca87ddc1428d31986fa79575daf17553d9.zip
FreeBSD-src-8eaa35ca87ddc1428d31986fa79575daf17553d9.tar.gz
It seems that the only problem with UFS2 booting on i386 is the 64bit
divide/remainder calls. For reasons not resolved, compiling the relevant routines from libkern into boot2 results in stack corruption. Do the simple thing: Don't use 64bit divide/remainder operations. Sponsored by: DARPA & NAI Labs
Diffstat (limited to 'sys/boot/common')
-rw-r--r--sys/boot/common/ufsread.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/sys/boot/common/ufsread.c b/sys/boot/common/ufsread.c
index 802e035..f2b7ba7 100644
--- a/sys/boot/common/ufsread.c
+++ b/sys/boot/common/ufsread.c
@@ -33,12 +33,12 @@
* 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 VBLKSHIFT 12
+#define VBLKSHIFT 12
+#define VBLKSIZE (1 << VBLKSHIFT)
#define VBLKMASK (VBLKSIZE - 1)
#define DBPERVBLK (VBLKSIZE / DEV_BSIZE)
-#define INDIRPERVBLK(fs) (NINDIR(fs) / ((fs)->fs_bsize / VBLKSIZE))
-#define IPERVBLK(fs) (INOPB(fs) / ((fs)->fs_bsize / VBLKSIZE))
+#define INDIRPERVBLK(fs) (NINDIR(fs) / ((fs)->fs_bsize >> VBLKSHIFT))
+#define IPERVBLK(fs) (INOPB(fs) / ((fs)->fs_bsize >> VBLKSHIFT))
#define INO_TO_VBA(fs, ipervblk, x) \
(fsbtodb(fs, cgimin(fs, ino_to_cg(fs, x))) + \
(((x) % (fs)->fs_ipg) / (ipervblk) * DBPERVBLK))
@@ -62,7 +62,7 @@ static ssize_t fsread(ino_t, void *, size_t);
static int ls, dsk_meta;
static uint32_t fs_off;
-static inline int
+static __inline__ int
fsfind(const char *name, ino_t * ino)
{
char buf[DEV_BSIZE];
@@ -177,7 +177,7 @@ fsread(ino_t inode, void *buf, size_t nbyte)
n = INDIRPERVBLK(fs);
addr = dp1.di_ib[0];
vbaddr = fsbtodb(fs, addr) +
- (lbn - NDADDR) / n * DBPERVBLK;
+ (lbn - NDADDR) / (n * DBPERVBLK);
if (indmap != vbaddr) {
if (dskread(indbuf, vbaddr, DBPERVBLK))
return -1;
@@ -222,13 +222,15 @@ fsread(ino_t inode, void *buf, size_t nbyte)
static struct ufs2_dinode dp2;
static ino_t inomap;
char *blkbuf;
- caddr_t indbuf;
+ void *indbuf;
struct fs *fs;
char *s;
size_t n, nb, size, off, vboff;
ufs_lbn_t lbn;
ufs2_daddr_t addr, vbaddr;
static ufs2_daddr_t blkmap, indmap;
+ u_int u;
+
blkbuf = dmadat->blkbuf;
indbuf = dmadat->indbuf;
@@ -281,14 +283,14 @@ fsread(ino_t inode, void *buf, size_t nbyte)
} else if (lbn < NDADDR + NINDIR(fs)) {
n = INDIRPERVBLK(fs);
addr = DIP(di_ib[0]);
- vbaddr = fsbtodb(fs, addr) +
- (lbn - NDADDR) / n * DBPERVBLK;
+ u = (u_int)(lbn - NDADDR) / (n * DBPERVBLK);
+ vbaddr = fsbtodb(fs, addr) + u;
if (indmap != vbaddr) {
if (dskread(indbuf, vbaddr, DBPERVBLK))
return -1;
indmap = vbaddr;
}
- n = (lbn - NDADDR) % n;
+ n = (lbn - NDADDR) & (n - 1);
if (fs->fs_magic == FS_UFS1_MAGIC)
addr = ((ufs1_daddr_t *)indbuf)[n];
else
OpenPOWER on IntegriCloud