MFC 199579:
Always use 64-bit LBAs for disk addresses in zfsboot and gptzfsboot to fully support booting from large volumes.
This commit is contained in:
parent
50eb2856de
commit
066c224b8b
@ -138,8 +138,8 @@ struct dsk {
|
|||||||
unsigned unit;
|
unsigned unit;
|
||||||
unsigned slice;
|
unsigned slice;
|
||||||
unsigned part;
|
unsigned part;
|
||||||
unsigned start;
|
|
||||||
int init;
|
int init;
|
||||||
|
daddr_t start;
|
||||||
};
|
};
|
||||||
static char cmd[512];
|
static char cmd[512];
|
||||||
static char kname[1024];
|
static char kname[1024];
|
||||||
@ -163,7 +163,7 @@ static int parse(void);
|
|||||||
static void printf(const char *,...);
|
static void printf(const char *,...);
|
||||||
static void putchar(int);
|
static void putchar(int);
|
||||||
static uint32_t memsize(void);
|
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 keyhit(unsigned);
|
||||||
static int xputc(int);
|
static int xputc(int);
|
||||||
static int xgetc(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)
|
vdev_read(vdev_t *vdev, void *priv, off_t off, void *buf, size_t bytes)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
unsigned int lba, nb;
|
daddr_t lba;
|
||||||
|
unsigned int nb;
|
||||||
struct dsk *dsk = (struct dsk *) priv;
|
struct dsk *dsk = (struct dsk *) priv;
|
||||||
|
|
||||||
if ((off & (DEV_BSIZE - 1)) || (bytes & (DEV_BSIZE - 1)))
|
if ((off & (DEV_BSIZE - 1)) || (bytes & (DEV_BSIZE - 1)))
|
||||||
@ -964,7 +965,7 @@ static struct {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int
|
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
|
#ifdef GPT
|
||||||
static unsigned c = 0x2d5c7c2f;
|
static unsigned c = 0x2d5c7c2f;
|
||||||
@ -999,7 +1000,7 @@ drvread(struct dsk *dsk, void *buf, unsigned lba, unsigned nblk)
|
|||||||
v86.es = VTOPSEG(buf);
|
v86.es = VTOPSEG(buf);
|
||||||
v86.eax = lba;
|
v86.eax = lba;
|
||||||
v86.ebx = VTOPOFF(buf);
|
v86.ebx = VTOPOFF(buf);
|
||||||
v86.ecx = lba >> 16;
|
v86.ecx = lba >> 32;
|
||||||
v86.edx = nblk << 8 | dsk->drive;
|
v86.edx = nblk << 8 | dsk->drive;
|
||||||
v86int();
|
v86int();
|
||||||
v86.ctl = V86_FLAGS;
|
v86.ctl = V86_FLAGS;
|
||||||
|
@ -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
|
* Trampoline used by boot2 to call read to read data from the disk via
|
||||||
* the BIOS. Call with:
|
* 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
|
* %es:(%bx) - caddr_t - buffer to read data into
|
||||||
* %dl - byte - drive to read from
|
* %dl - byte - drive to read from
|
||||||
* %dh - byte - num sectors to read
|
* %dh - byte - num sectors to read
|
||||||
@ -94,10 +94,8 @@ xread: push %ss # Address
|
|||||||
/*
|
/*
|
||||||
* Setup an EDD disk packet and pass it to read
|
* Setup an EDD disk packet and pass it to read
|
||||||
*/
|
*/
|
||||||
xread.1: # Starting
|
xread.1: pushl %ecx # Starting absolute block
|
||||||
pushl $0x0 # absolute
|
pushl %eax # block number
|
||||||
push %cx # block
|
|
||||||
push %ax # number
|
|
||||||
push %es # Address of
|
push %es # Address of
|
||||||
push %bx # transfer buffer
|
push %bx # transfer buffer
|
||||||
xor %ax,%ax # Number of
|
xor %ax,%ax # Number of
|
||||||
@ -195,7 +193,7 @@ main.4: xor %dx,%dx # Partition:drive
|
|||||||
*/
|
*/
|
||||||
main.5: mov %dx,MEM_ARG # Save args
|
main.5: mov %dx,MEM_ARG # Save args
|
||||||
movb $NSECT,%dh # Sector count
|
movb $NSECT,%dh # Sector count
|
||||||
movw $1024,%ax # Offset to boot2
|
movl $1024,%eax # Offset to boot2
|
||||||
callw nread.1 # Read disk
|
callw nread.1 # Read disk
|
||||||
main.6: mov $MEM_BUF,%si # BTX (before reloc)
|
main.6: mov $MEM_BUF,%si # BTX (before reloc)
|
||||||
mov 0xa(%si),%bx # Get BTX length and set
|
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.
|
* 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
|
nread.1: mov $MEM_BUF,%bx # Transfer buffer
|
||||||
add 0x8(%si),%ax # Get
|
xor %ecx,%ecx # Get
|
||||||
mov 0xa(%si),%cx # LBA
|
addl 0x8(%si),%eax # LBA
|
||||||
|
adc $0,%ecx
|
||||||
push %cs # Read from
|
push %cs # Read from
|
||||||
callw xread.1 # disk
|
callw xread.1 # disk
|
||||||
jnc return # If success, return
|
jnc return # If success, return
|
||||||
|
Loading…
x
Reference in New Issue
Block a user