On Tuesday, June 21, 2011 12:15:58 pm Henri Hennebert wrote:
> On 06/21/2011 17:55, John Baldwin wrote:
> > On Tuesday, June 21, 2011 10:50:14 am Henri Hennebert wrote:
> >> On 06/21/2011 15:01, John Baldwin wrote:
> >>> Index: zfsldr.S
> >>> ===================================================================
> >>> --- zfsldr.S      (revision 223339)
> >>> +++ zfsldr.S      (working copy)
> >>> @@ -234,9 +234,12 @@ nread.1:     xor %ecx,%ecx                   # Get
> >>>                   callw read                      # Read from disk
> >>>                   lea 0x10(%bp),%sp               # Clear stack
> >>>                   jnc return                      # If success, return
> >>> -         mov $msg_read,%si               # Otherwise, set the error
> >>> -                                         #  message and fall through to
> >>> -                                         #  the error routine
> >>> +         mov %ah,%al                     # Format
> >>> +         mov $read_err,%di               #  error
> >>> +         call hex8                       #  code
> >>> +         mov $msg_read,%si               # Set the error message and
> >>> +                                         #  fall through to the error
> >>> +                                         #  routine
> >>>    /*
> >>>     * Print out the error message pointed to by %ds:(%si) followed
> >>>     * by a prompt, wait for a keypress, and then reboot the machine.
> >>> @@ -296,12 +299,28 @@ read.1:             mov $msg_chs,%si
> >>>                   jmp error
> >>>    msg_chs:       .asciz "CHS not supported"
> >>>
> >>> +/*
> >>> + * Convert AL to hex, saving the result to [EDI].
> >>> + */
> >>> +hex8:            push %ax                        # Save
> >>> +         shrb $0x4,%al                   # Do upper
> >>> +         call hex8.1                     #  4
> >>> +         pop %ax                         # Restore
> >>> +hex8.1:  andb $0xf,%al                   # Get lower 4
> >>> +         cmpb $0xa,%al                   # Convert
> >>> +         sbbb $0x69,%al                  #  to hex
> >>> +         das                             #  digit
> >>> +         orb $0x20,%al                   # To lower case
> >>> +         stosb                           # Save char
> >>> +         ret                             # (Recursive)
> >>> +
> >>>    /* Messages */
> >>>
> >>> -msg_read:        .asciz "Read"
> >>> -msg_part:        .asciz "Boot"
> >>> +msg_read:        .ascii "Read error: "
> >>> +read_err:        .asciz "XX"
> >>> +msg_part:        .asciz "Boot error"
> >>>
> >>> -prompt:  .asciz " error\r\n"
> >>> +prompt:  .asciz "\r\n"
> >>>
> >>>                   .org PRT_OFF,0x90
> >>>
> >> I get
> >>
> >> Read error: 01
> >
> > Hmm, that would be 'invalid parameter'.
> >
> > Can you add a 'foo: jmp foo' infinite loop and move it around to figure 
out
> > which read call is failing?
> >
> main.5:         mov %dx,MEM_ARG                 # Save args
>                  movb $NSECT,%dh                 # Sector count
>                  movl $1024,%eax                 # Offset to boot2
>                  callw nread.1                   # Read disk
> 
> foo:            jmp foo
> 
> After this one I get
> 
> 'Read error: 01'

Hmm, ok.  NSECT changed in the MFC (it is now larger).  Try this patch.  It 
changes the code to read zfsboot in one sector at a time:

Index: zfsldr.S
===================================================================
--- zfsldr.S    (revision 223365)
+++ zfsldr.S    (working copy)
@@ -16,7 +16,6 @@
  */
 
 /* Memory Locations */
-               .set MEM_REL,0x700              # Relocation address
                .set MEM_ARG,0x900              # Arguments
                .set MEM_ORG,0x7c00             # Origin
                .set MEM_BUF,0x8000             # Load area
@@ -91,26 +90,19 @@ main:               cld                             # 
String ops inc
                mov %cx,%ss                     # Set up
                mov $start,%sp                  #  stack
 /*
- * Relocate ourself to MEM_REL.  Since %cx == 0, the inc %ch sets
- * %cx == 0x100.
- */
-               mov %sp,%si                     # Source
-               mov $MEM_REL,%di                # Destination
-               incb %ch                        # Word count
-               rep                             # Copy
-               movsw                           #  code
-/*
  * If we are on a hard drive, then load the MBR and look for the first
  * FreeBSD slice.  We use the fake partition entry below that points to
  * the MBR when we call nread.  The first pass looks for the first active
  * FreeBSD slice.  The second pass looks for the first non-active FreeBSD
  * slice if the first one fails.
  */
-               mov $part4,%si                  # Partition
+               mov $part4,%si                  # Dummy partition
                cmpb $0x80,%dl                  # Hard drive?
                jb main.4                       # No
-               movb $0x1,%dh                   # Block count
-               callw nread                     # Read MBR
+               xor %eax,%eax                   # Read MBR from
+               movw $MEM_BUF,%bx               #  first sector
+               movb $0x1,%dh                   #  on disk into
+               callw nread                     #  $MEM_BUF
                mov $0x1,%cx                    # Two passes
 main.1:        mov $MEM_BUF+PRT_OFF,%si        # Partition table
                movb $0x1,%dh                   # Partition
@@ -161,10 +153,18 @@ main.4:   xor %dx,%dx                     # 
Partition:drive
  * area and target area do not overlap.
  */
 main.5:        mov %dx,MEM_ARG                 # Save args
-               movb $NSECT,%dh                 # Sector count
+               movb $NSECT,%cl                 # Sector count
                movl $1024,%eax                 # Offset to boot2
-               callw nread.1                   # Read disk
-main.6:                mov $MEM_BUF,%si                # BTX (before reloc)
+               mov $MEM_BUF,%bx                # Destination buffer
+main.6:                pushal                          # Save params
+               movb $1,$dh                     # One sector
+               callw nread                     # Read disk
+               popal                           # Restore
+               incl %eax                       # Update for
+               add $SIZ_SEC,%bx                #  next sector
+               dec %cx                         # Last sector?
+               jncxz main.6                    # If not, read another.
+               mov $MEM_BUF,%si                # BTX (before reloc)
                mov 0xa(%si),%bx                # Get BTX length and set
                mov $NSECT*SIZ_SEC-1,%di        # Size of load area (less one)
                mov %di,%si                     # End of load
@@ -214,12 +214,12 @@ seta20.3: sti                             # Enable 
interrupts
  * packet on the stack and passes it to read.
  *
  * %eax                - int     - LBA to read in relative to partition start
+ * %es:%bx     - ptr     - destination address
  * %dl         - byte    - drive to read from
  * %dh         - byte    - num sectors to read
  * %si         - ptr     - MBR partition entry
  */
-nread:         xor %eax,%eax                   # Sector offset in partition
-nread.1:       xor %ecx,%ecx                   # Get
+nread:         xor %ecx,%ecx                   # Get
                addl 0x8(%si),%eax              #  LBA
                adc $0,%ecx
                pushl %ecx                      # Starting absolute block
@@ -234,9 +234,12 @@ seta20.3:  sti                             # Enable 
interrupts
                callw read                      # Read from disk
                lea 0x10(%bp),%sp               # Clear stack
                jnc return                      # If success, return
-               mov $msg_read,%si               # Otherwise, set the error
-                                               #  message and fall through to
-                                               #  the error routine
+               mov %ah,%al                     # Format
+               mov $read_err,%di               #  error
+               call hex8                       #  code
+               mov $msg_read,%si               # Set the error message and
+                                               #  fall through to the error
+                                               #  routine
 /*
  * Print out the error message pointed to by %ds:(%si) followed
  * by a prompt, wait for a keypress, and then reboot the machine.
@@ -296,12 +299,28 @@ read.1:           mov $msg_chs,%si
                jmp error
 msg_chs:       .asciz "CHS not supported"
 
+/*
+ * Convert AL to hex, saving the result to [EDI].
+ */
+hex8:          push %ax                        # Save
+               shrb $0x4,%al                   # Do upper
+               call hex8.1                     #  4
+               pop %ax                         # Restore
+hex8.1:        andb $0xf,%al                   # Get lower 4
+               cmpb $0xa,%al                   # Convert
+               sbbb $0x69,%al                  #  to hex
+               das                             #  digit
+               orb $0x20,%al                   # To lower case
+               stosb                           # Save char
+               ret                             # (Recursive)
+
 /* Messages */
 
-msg_read:      .asciz "Read"
-msg_part:      .asciz "Boot"
+msg_read:      .ascii "Read error: "
+read_err:      .asciz "XX"
+msg_part:      .asciz "Boot error"
 
-prompt:        .asciz " error\r\n"
+prompt:        .asciz "\r\n"
 
                .org PRT_OFF,0x90
 

-- 
John Baldwin
_______________________________________________
freebsd-stable@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "freebsd-stable-unsubscr...@freebsd.org"

Reply via email to