Author: jhb
Date: Tue Dec  1 22:38:17 2009
New Revision: 200004
URL: http://svn.freebsd.org/changeset/base/200004

Log:
  MFC 199579:
  Always use 64-bit LBAs for disk addresses in zfsboot and gptzfsboot to
  fully support booting from large volumes.

Modified:
  stable/8/sys/boot/i386/zfsboot/zfsboot.c
  stable/8/sys/boot/i386/zfsboot/zfsldr.S
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/boot/i386/zfsboot/zfsboot.c
==============================================================================
--- stable/8/sys/boot/i386/zfsboot/zfsboot.c    Tue Dec  1 22:23:15 2009        
(r200003)
+++ stable/8/sys/boot/i386/zfsboot/zfsboot.c    Tue Dec  1 22:38:17 2009        
(r200004)
@@ -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, unsi
     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;

Modified: stable/8/sys/boot/i386/zfsboot/zfsldr.S
==============================================================================
--- stable/8/sys/boot/i386/zfsboot/zfsldr.S     Tue Dec  1 22:23:15 2009        
(r200003)
+++ stable/8/sys/boot/i386/zfsboot/zfsldr.S     Tue Dec  1 22:38:17 2009        
(r200004)
@@ -83,7 +83,7 @@ ebpb:         .byte   0               # BIOS physical drive nu
  * 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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to