On Thu, Jul 20, 2017 at 08:44:53PM +0200, Theo Buehler wrote:
> On Thu, Jul 20, 2017 at 09:45:55PM +0900, YASUOKA Masahiko wrote:
> > On Tue, 18 Jul 2017 15:48:48 -0600
> > "Theo de Raadt" <[email protected]> wrote:
> > >> On Tue, Jul 18, 2017 at 08:40:53PM +0200, Theo Buehler wrote:
> > >> > On Tue, Jul 18, 2017 at 11:10:00AM -0600, Theo de Raadt wrote:
> > >> > > Possibly.
> > >> > >
> > >> > > cc'ing yasuoka who helped me with this method of disk probing.
> > >> > >
> > >> > > But anyways, beyond a code review we need someone to SHOW THEIR BOOT
> > >> > > LOADER
> > >> > > OUTPUT, so that we can see the hibernate marker letter is missing.
> > >> >
> > >> > Using FDE from MBR on my T420, I can confirm Natasha's findings.
> > >> >
> > >> > Automatic kernel selection to unhibernate fails, but manually selecting
> > >> > /bsd.booted works fine.
> > >> >
> > >> > I see the exact same thing on reboot and on boot into unhibernate:
> > >> > (manually transcribed, no & sign)
> > >> >
> > >> > Using drive 0, partition 3.
> > >> > Loading......
> > >> > probing: pc0 mem[630K 511M 510M 2471M 486M a20=on]
> > >> > disk: hd0+ sr0*
> > >> > >> OpenBSD/amd64 BOOT 3.33
> > >> > Passphrase: _
> > >>
> > >> To compare, here my output on suspended boot for a laptop (i386)
> > >> *without* FDE:
> > >>
> > >> Using drive 0, partition 3.
> > >> Loading......
> > >> probing: pc0 pci mem[636K 2037M a20=on]
> > >> disk: hd0+&
> > >> >> OpenBSD/i386 BOOT 3.31
> > >> unhibernate detected: switching to /bsd.booted
> > >> boot>
> > >> booting hd0a:/bsd.booted: 8122376+....
> > >> entry point at 0x2000d4
> > >> ...
> > >>
> > >> So here the & is present, and an explicit line is echoed.
> > >
> > > I'll explain what is going on here, and what needs to probably be done.
> > >
> > > The changes introduced into the bootloader are largely correct. They
> > > make the right decisions. They just don't make them at the right
> > > points in time. The IO operations should be moved further forward, to
> > > after the key operations.
> > >
> > > Havinge done it this way, yasuoka and I were able to create a workable
> > > model, but the operations need to be moved forward.
> > >
> > > Someone want to dive in?
> >
> > The diff is to support selecting bsd.booted for FED.
> >
> > disk: hd0 sr0*
> > >> OpenBSD/amd64 BOOTX64 3.33
> > Passphrase: <--- Enter the passphrase
> > unhibernate detected: switching to /bsd.booted
> > boot>
> > booting sr0a:/bsd.booted: xxxx...
> >
> > we can't add "&" sign on the "disk" line. Since the bootloader gets
> > the passpharase after that line.
> >
> > The boot codes other than BOOTX64.EFI are not tested yet.
>
> I tried to pxeboot into bsd.rd to install a snapshot with your diff
> (with FDE on MBR) and this leads to a hang after password entry.
> Therefore I didn't dare to install the bootloader, as I need this
> machine for work.
>
> More precisely, it looks like check_hibernate() doesn't return on a
> normally rebooted machine:
>
> probing: pc0 pxe![2.1] mem[630K 511M 518M 2471M 486M a20=on]
> disk: hd0+ sr0*
> net: mac aa:bb:cc:dd:ee:ff, ip 192.168.10.11, server 192.168.10.10
> >> OpenBSD/amd64 PXEBOOT 3.28
> Passphrase:
> start check_hibernate()
> _
>
>
> and the machine hangs here.
>
> I used the following simple modification of your diff:
Unfortunately, regular boot is also broken the same way as PXE boot with
this diff. I made a fresh FDE on MBR install to a memory stick. After
the install I rebooted from the memory stick, boot decrypts the volume
but hangs in check_hibernate().
(with the same diff as in my previous mail):
Using drive 0, partition 3
Loading......
probing: pc0 mem[630K 511M 518M 2471M 486M a20=on]
disk hd0+ hd1+ sr0* sr1*
>> OpenBSD/amd64 BOOT 3.33
Passphrase:
start check_hibernate()
>
> Index: libsa/biosdev.c
> ===================================================================
> RCS file: /var/cvs/src/sys/arch/amd64/stand/libsa/biosdev.c,v
> retrieving revision 1.30
> diff -u -p -r1.30 biosdev.c
> --- libsa/biosdev.c 18 Sep 2016 15:13:10 -0000 1.30
> +++ libsa/biosdev.c 20 Jul 2017 17:21:05 -0000
> @@ -548,6 +548,9 @@ biosopen(struct open_file *f, ...)
> if (sr_getdisklabel(bv, &dip->disklabel))
> return ERDLAB;
> dip->bios_info.flags &= ~BDI_BADLABEL;
> + printf("start check_hibernate()\n");
> + check_hibernate(dip);
> + printf("stop check_hibernate()\n");
> }
>
> bv->sbv_part = part + 'a';
>