summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2009-11-20 12:48:35 +0000
committerjhb <jhb@FreeBSD.org>2009-11-20 12:48:35 +0000
commit5ade1584619e3e4e1d2efe348f39151bf55cdd50 (patch)
treef2f647a201455f04a4667a3b638fe382abe21e59 /sys
parent5e7f05ee90c717a559558c628acf8bde14221b60 (diff)
downloadFreeBSD-src-5ade1584619e3e4e1d2efe348f39151bf55cdd50.zip
FreeBSD-src-5ade1584619e3e4e1d2efe348f39151bf55cdd50.tar.gz
Always use 64-bit LBAs for disk addresses in zfsboot and gptzfsboot to
fully support booting from large volumes. Tested by: Emil Smolenski ambsd of raisa.eu.org Submitted by: Matt Reimer mattjreimer of gmail (most of the C bits) MFC after: 1 week
Diffstat (limited to 'sys')
-rw-r--r--sys/boot/i386/zfsboot/zfsboot.c11
-rw-r--r--sys/boot/i386/zfsboot/zfsldr.S17
2 files changed, 14 insertions, 14 deletions
diff --git a/sys/boot/i386/zfsboot/zfsboot.c b/sys/boot/i386/zfsboot/zfsboot.c
index c0dedd7..690d803 100644
--- a/sys/boot/i386/zfsboot/zfsboot.c
+++ b/sys/boot/i386/zfsboot/zfsboot.c
@@ -138,8 +138,8 @@ struct dsk {
unsigned unit;
unsigned slice;
unsigned part;
- unsigned start;
int init;
+ daddr_t start;
};
static char cmd[512];
static char kname[1024];
@@ -163,7 +163,7 @@ static int parse(void);
static void printf(const char *,...);
static void putchar(int);
static uint32_t memsize(void);
-static int drvread(struct dsk *, void *, unsigned, unsigned);
+static int drvread(struct dsk *, void *, daddr_t, unsigned);
static int keyhit(unsigned);
static int xputc(int);
static int xgetc(int);
@@ -310,7 +310,8 @@ static int
vdev_read(vdev_t *vdev, void *priv, off_t off, void *buf, size_t bytes)
{
char *p;
- unsigned int lba, nb;
+ daddr_t lba;
+ unsigned int nb;
struct dsk *dsk = (struct dsk *) priv;
if ((off & (DEV_BSIZE - 1)) || (bytes & (DEV_BSIZE - 1)))
@@ -964,7 +965,7 @@ static struct {
#endif
static int
-drvread(struct dsk *dsk, void *buf, unsigned lba, unsigned nblk)
+drvread(struct dsk *dsk, void *buf, daddr_t lba, unsigned nblk)
{
#ifdef GPT
static unsigned c = 0x2d5c7c2f;
@@ -999,7 +1000,7 @@ drvread(struct dsk *dsk, void *buf, unsigned lba, unsigned nblk)
v86.es = VTOPSEG(buf);
v86.eax = lba;
v86.ebx = VTOPOFF(buf);
- v86.ecx = lba >> 16;
+ v86.ecx = lba >> 32;
v86.edx = nblk << 8 | dsk->drive;
v86int();
v86.ctl = V86_FLAGS;
diff --git a/sys/boot/i386/zfsboot/zfsldr.S b/sys/boot/i386/zfsboot/zfsldr.S
index a256d30..64e3843 100644
--- a/sys/boot/i386/zfsboot/zfsldr.S
+++ b/sys/boot/i386/zfsboot/zfsldr.S
@@ -83,7 +83,7 @@ ebpb: .byte 0 # BIOS physical drive number (W)
* Trampoline used by boot2 to call read to read data from the disk via
* the BIOS. Call with:
*
- * %cx:%ax - long - LBA to read in
+ * %ecx:%eax - long - LBA to read in
* %es:(%bx) - caddr_t - buffer to read data into
* %dl - byte - drive to read from
* %dh - byte - num sectors to read
@@ -94,10 +94,8 @@ xread: push %ss # Address
/*
* Setup an EDD disk packet and pass it to read
*/
-xread.1: # Starting
- pushl $0x0 # absolute
- push %cx # block
- push %ax # number
+xread.1: pushl %ecx # Starting absolute block
+ pushl %eax # block number
push %es # Address of
push %bx # transfer buffer
xor %ax,%ax # Number of
@@ -195,7 +193,7 @@ main.4: xor %dx,%dx # Partition:drive
*/
main.5: mov %dx,MEM_ARG # Save args
movb $NSECT,%dh # Sector count
- movw $1024,%ax # Offset to boot2
+ movl $1024,%eax # Offset to boot2
callw nread.1 # Read disk
main.6: mov $MEM_BUF,%si # BTX (before reloc)
mov 0xa(%si),%bx # Get BTX length and set
@@ -245,10 +243,11 @@ seta20.3: sti # Enable interrupts
/*
* Trampoline used to call read from within boot1.
*/
-nread: xor %ax,%ax # Sector offset in partition
+nread: xor %eax,%eax # Sector offset in partition
nread.1: mov $MEM_BUF,%bx # Transfer buffer
- add 0x8(%si),%ax # Get
- mov 0xa(%si),%cx # LBA
+ xor %ecx,%ecx # Get
+ addl 0x8(%si),%eax # LBA
+ adc $0,%ecx
push %cs # Read from
callw xread.1 # disk
jnc return # If success, return
OpenPOWER on IntegriCloud