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:
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';