xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: "Jan Beulich" <JBeulich@suse.com>
To: Paul Durrant <Paul.Durrant@citrix.com>
Cc: Juergen Gross <jgross@suse.com>,
	Andrew Cooper <Andrew.Cooper3@citrix.com>,
	"Julien Grall (julien.grall@arm.com)" <julien.grall@arm.com>,
	'Boris Ostrovsky' <boris.ostrovsky@oracle.com>,
	"xen-devel(xen-devel@lists.xenproject.org)"
	<xen-devel@lists.xenproject.org>
Subject: Re: debian stretch dom0 + xen 4.9 fails to boot
Date: Mon, 12 Jun 2017 04:40:39 -0600	[thread overview]
Message-ID: <593E8BC70200007800161DEB@prv-mh.provo.novell.com> (raw)
In-Reply-To: <86a3251e9ac44a2bb2df23862e458ee0@AMSPEX02CL03.citrite.net>

[-- Attachment #1: Type: text/plain, Size: 1155 bytes --]

>>> On 12.06.17 at 10:14, <Paul.Durrant@citrix.com> wrote:
> Looking at the code in arch/x86/boot/edd.c in Linux, it sector aligns the 
> buffer into which it reads the MBR and the sector size is pulled from the EDD 
> which means, I believe, that the MBR read on the skull canyon would be 4k 
> aligned.
> 
> What do you think it best to do for Xen 4.9? Hardcoding a 4k alignment is 
> clearly easy and would work around this BIOS issue but, as you say, it does 
> grow the image. Reverting Juergen's patch also works round the issue, but 
> that is more by luck. Re-working the code is preferable, but I guess it's too 
> late to introduce such code-churn in 4.9.

Reverting Jürgen's code is out of question with all the information
you've gathered by now. I think re-working the EDD code slightly
is the best option. Would you mind giving the attached patch a
try? This still slightly grows the trampoline due to a few more
instructions being needed, but should still be far better than
embedding a whole 4k buffer (and then later finding a BIOS/disk
combination which wants even more). Note that I've left a tiny
bit of debugging code in there.

Jan

[-- Attachment #2: x86-MBR-below-trampoline.patch --]
[-- Type: text/plain, Size: 7173 bytes --]


TODO: remove //temp-s

We place the trampoline no lower than at 256k, so we have ample space
to read the MBRs of BIOS disks into an aligned buffer right below the
trampoline (not doing so has been found to be a problem on a buggy BIOS
coming with a Skull Canyon NUC). To facilitate that move MBR reading
past EDD info retrieval.

Also add a wrap check to the EDD info retrieval loop, to match that in
the MBR reading one.

Reported-by: Paul Durrant <Paul.Durrant@citrix.com>
---
Using 512-byte sector size as default right now - perhaps worth
considering to use 4k instead. I'm also not sure whether we shouldn't
sanity check the sector size some more.

--- unstable.orig/xen/arch/x86/boot/edd.S	2017-02-09 14:28:18.000000000 +0100
+++ unstable/xen/arch/x86/boot/edd.S	2017-06-12 12:33:36.353082705 +0200
@@ -26,46 +26,6 @@
 get_edd:
         cmpb    $2, bootsym(opt_edd)            # edd=off ?
         je      edd_done
-        cmpb    $1, bootsym(opt_edd)            # edd=skipmbr ?
-        je      edd_start
-
-# Read the first sector of each BIOS disk device and store the 4-byte signature
-edd_mbr_sig_start:
-        movb    $0x80, %dl                      # from device 80
-        movw    $bootsym(boot_mbr_signature),%bx # store buffer ptr in bx
-edd_mbr_sig_read:
-        pushw   %bx
-        movb    $0x02, %ah                      # 0x02 Read Sectors
-        movb    $1, %al                         # read 1 sector
-        movb    $0, %dh                         # at head 0
-        movw    $1, %cx                         # cylinder 0, sector 0
-        pushw   %es
-        pushw   %ds
-        popw    %es
-        movw    $bootsym(boot_edd_info), %bx    # disk's data goes into info
-        pushw   %dx             # work around buggy BIOSes
-        stc                     # work around buggy BIOSes
-        int     $0x13
-        sti                     # work around buggy BIOSes
-        popw    %dx
-        popw    %es
-        popw    %bx
-        jc      edd_mbr_sig_done                # on failure, we're done.
-        cmpb    $0, %ah                         # some BIOSes do not set CF
-        jne     edd_mbr_sig_done                # on failure, we're done.
-        cmpw    $0xaa55, bootsym(boot_edd_info)+0x1fe
-        jne     .Ledd_mbr_sig_next
-        movl    bootsym(boot_edd_info)+EDD_MBR_SIG_OFFSET,%eax
-        movb    %dl, (%bx)                      # store BIOS drive number
-        movl    %eax, 4(%bx)                    # store signature from MBR
-        incb    bootsym(boot_mbr_signature_nr)  # note that we stored something
-        addw    $8, %bx                         # increment sig buffer ptr
-.Ledd_mbr_sig_next:
-        incb    %dl                             # increment to next device
-        jz      edd_mbr_sig_done
-        cmpb    $EDD_MBR_SIG_MAX,bootsym(boot_mbr_signature_nr)
-        jb      edd_mbr_sig_read
-edd_mbr_sig_done:
 
 # Do the BIOS Enhanced Disk Drive calls
 # This consists of two calls:
@@ -136,10 +96,72 @@ edd_legacy_done:
 
 edd_next:
         incb    %dl                             # increment to next device
+        jz      edd_done
         cmpb    $EDD_INFO_MAX,bootsym(boot_edd_info_nr)
         jb      edd_check_ext
 
 edd_done:
+        cmpb    $1, bootsym(opt_edd)            # edd=skipmbr ?
+        je      .Ledd_mbr_sig_skip
+
+# Read the first sector of each BIOS disk device and store the 4-byte signature
+.Ledd_mbr_sig_start:
+        pushw   %es
+        movb    $0x80, %dl                      # from device 80
+        movw    $bootsym(boot_mbr_signature), %bx # store buffer ptr in bx
+.Ledd_mbr_sig_read:
+        pushw   %bx
+        movw    $bootsym(boot_edd_info), %bx
+        movzbw  bootsym(boot_edd_info_nr), %cx
+        jcxz    .Ledd_mbr_sig_default
+.Ledd_mbr_sig_find_info:
+        cmpb    %dl, (%bx)
+        ja      .Ledd_mbr_sig_default
+        je      .Ledd_mbr_sig_get_size
+        add     $EDDEXTSIZE+EDDPARMSIZE, %bx
+        loop    .Ledd_mbr_sig_find_info
+.Ledd_mbr_sig_default:
+        movw    $(512 >> 4), %bx
+        jmp     .Ledd_mbr_sig_set_buf
+.Ledd_mbr_sig_get_size:
+        movw    EDDEXTSIZE+0x18(%bx), %bx       # sector size
+        shr     $4, %bx                         # convert to paragraphs
+        jz      .Ledd_mbr_sig_default
+.Ledd_mbr_sig_set_buf:
+        movw    %ds, %ax
+        subw    %bx, %ax                        # disk's data goes right ahead
+        movw    %ax, %es                        # of trampoline
+        xorw    %bx, %bx
+        movw    %bx, %es:0x1fe(%bx)             # clear BIOS magic just in case
+        pushw   %dx                             # work around buggy BIOSes
+        stc                                     # work around buggy BIOSes
+        movw    $0x0201, %ax                    # read 1 sector
+        movb    $0, %dh                         # at head 0
+        movw    $1, %cx                         # cylinder 0, sector 0
+        int     $0x13
+        sti                                     # work around buggy BIOSes
+        popw    %dx
+        movw    %es:0x1fe(%bx), %si
+        movl    %es:EDD_MBR_SIG_OFFSET(%bx), %ecx
+        popw    %bx
+        jc      .Ledd_mbr_sig_done              # on failure, we're done.
+        testb   %ah, %ah                        # some BIOSes do not set CF
+        jnz     .Ledd_mbr_sig_done              # on failure, we're done.
+        cmpw    $0xaa55, %si
+        jne     .Ledd_mbr_sig_next
+        movb    %dl, (%bx)                      # store BIOS drive number
+ movw %es,2(%bx)//temp
+        movl    %ecx, 4(%bx)                    # store signature from MBR
+        incb    bootsym(boot_mbr_signature_nr)  # note that we stored something
+        addw    $8, %bx                         # increment sig buffer ptr
+.Ledd_mbr_sig_next:
+        incb    %dl                             # increment to next device
+        jz      .Ledd_mbr_sig_done
+        cmpb    $EDD_MBR_SIG_MAX, bootsym(boot_mbr_signature_nr)
+        jb      .Ledd_mbr_sig_read
+.Ledd_mbr_sig_done:
+        popw    %es
+.Ledd_mbr_sig_skip:
         ret
 
 GLOBAL(boot_edd_info_nr)
@@ -149,4 +171,4 @@ GLOBAL(boot_mbr_signature_nr)
 GLOBAL(boot_mbr_signature)
         .fill   EDD_MBR_SIG_MAX*8,1,0
 GLOBAL(boot_edd_info)
-        .fill   512,1,0                         # big enough for a disc sector
+        .fill   EDD_INFO_MAX * (EDDEXTSIZE + EDDPARMSIZE), 1, 0
--- unstable.orig/xen/arch/x86/platform_hypercall.c	2015-07-20 14:49:38.000000000 +0200
+++ unstable/xen/arch/x86/platform_hypercall.c	2017-06-12 12:22:01.658928095 +0200
@@ -376,6 +376,7 @@ ret_t do_platform_op(XEN_GUEST_HANDLE_PA
                 break;
 
             sig = bootsym(boot_mbr_signature) + op->u.firmware_info.index;
+printk("MBR[%02x] @ %02x%02x (%04lx)\n", sig->device, sig->pad[2], sig->pad[1], trampoline_phys);//temp
 
             op->u.firmware_info.u.disk_mbr_signature.device = sig->device;
             op->u.firmware_info.u.disk_mbr_signature.mbr_signature =

[-- Attachment #3: Type: text/plain, Size: 127 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  reply	other threads:[~2017-06-12 10:40 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-06 14:32 debian stretch dom0 + xen 4.9 fails to boot Paul Durrant
2017-06-06 15:11 ` Jan Beulich
2017-06-06 15:51   ` Paul Durrant
2017-06-06 16:28     ` Paul Durrant
2017-06-06 17:00       ` Boris Ostrovsky
2017-06-07  8:07         ` Jan Beulich
2017-06-07  8:09           ` Paul Durrant
2017-06-07  8:19             ` Paul Durrant
2017-06-07 14:05           ` Boris Ostrovsky
2017-06-07  8:07         ` Paul Durrant
2017-06-07  8:27           ` Jan Beulich
     [not found]           ` <5937D4FF02000078001602F6@suse.com>
2017-06-07  9:03             ` Juergen Gross
2017-06-07  9:05               ` Paul Durrant
2017-06-07  9:09                 ` Andrew Cooper
2017-06-07 10:36                   ` Paul Durrant
2017-06-07 11:06                     ` Paul Durrant
2017-06-07 11:57                       ` Juergen Gross
2017-06-07 12:02                         ` Paul Durrant
2017-06-07 12:13                           ` Juergen Gross
2017-06-07 12:19                           ` Jan Beulich
2017-06-07 12:26                             ` Paul Durrant
2017-06-07 12:34                               ` Jan Beulich
2017-06-07 11:50                     ` Jan Beulich
2017-06-07 11:55                       ` Paul Durrant
2017-06-07 12:00                         ` Jan Beulich
2017-06-07 12:46                           ` Paul Durrant
2017-06-07 12:55                             ` Jan Beulich
2017-06-07 15:06                               ` Paul Durrant
2017-06-07 15:33                                 ` Jan Beulich
2017-06-07 15:40                                   ` Paul Durrant
2017-06-07 15:52                                     ` Jan Beulich
2017-06-08 12:42                                       ` Paul Durrant
2017-06-08 12:46                                         ` Juergen Gross
2017-06-08 13:18                                         ` Jan Beulich
2017-06-08 13:24                                           ` Paul Durrant
2017-06-09 12:19                                           ` Paul Durrant
2017-06-09 13:05                                             ` Jan Beulich
2017-06-09 13:52                                               ` Boris Ostrovsky
2017-06-09 15:14                                                 ` Paul Durrant
2017-06-09 15:41                                                   ` Jan Beulich
2017-06-09 15:47                                                     ` Paul Durrant
2017-06-09 15:58                                                       ` Jan Beulich
2017-06-12  8:14                                                       ` Paul Durrant
2017-06-12 10:40                                                         ` Jan Beulich [this message]
2017-06-12 10:44                                                           ` Paul Durrant
2017-06-12 10:53                                                             ` Paul Durrant
2017-06-12 11:12                                                               ` Jan Beulich
2017-06-12 12:05                                                                 ` Paul Durrant
2017-06-12 12:25                                                                   ` Paul Durrant
2017-06-12 13:54                                                                   ` Jan Beulich
2017-06-12 14:28                                                                     ` Paul Durrant
2017-06-12 14:43                                                                       ` Paul Durrant
2017-06-12 15:03                                                                         ` Paul Durrant
2017-06-12 15:07                                                                         ` Jan Beulich
2017-06-12 15:21                                                                           ` Paul Durrant
2017-06-06 17:40     ` Julien Grall
2017-06-07  8:05       ` Paul Durrant

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=593E8BC70200007800161DEB@prv-mh.provo.novell.com \
    --to=jbeulich@suse.com \
    --cc=Andrew.Cooper3@citrix.com \
    --cc=Paul.Durrant@citrix.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=jgross@suse.com \
    --cc=julien.grall@arm.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).