From: "Pali Rohár" <pali.rohar@gmail.com>
To: Pavel Machek <pavel@ucw.cz>
Cc: x86@kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] x86/boot: This program cannot be run in DOS mode.$
Date: Mon, 8 Apr 2019 20:08:09 +0200 [thread overview]
Message-ID: <20190408180809.myjp5zaviuibj5uf@pali> (raw)
In-Reply-To: <20190408180422.GA5103@amd>
[-- Attachment #1: Type: text/plain, Size: 5230 bytes --]
On Monday 08 April 2019 20:04:22 Pavel Machek wrote:
> On Mon 2019-04-01 12:24:34, Pali Rohár wrote:
> > Every EFI binary is in PE format. And we know that PE format needs to have
> > MZ MS-DOS header as there is written offset to PE header.
> >
> > Therefore generated bzImage binary with CONFIG_EFI_STUB option is MS-DOS
> > executable binary.
> >
> > We already know the "requirement" that Windows PE executable started in
> > MS-DOS must print legendary and famous message to computer screen:
> > "This program cannot be run in DOS mode."
> >
> > But trying to run that bzImage of Linux kernel with MZ header just cause
> > freezing whole MS-DOS instead of writing "the correct message" to user.
> > This is not the compliant behavior of PE executables!
> >
> > This patch fixes this problem. When Linux kernel compiled with
> > CONFIG_EFI_STUB is started in MS-DOS then it prints message:
> >
> > This program cannot be run in DOS mode.
> > To load Linux kernel from DOS mode use LOADLIN.EXE.
> >
> > So it also helps MS-DOS users how to "correctly" start this bzImage binary
> > by mentioning LOADLIN.EXE. Note that MS-DOS strings are not null-terminated
> > but rather dollar-terminated.
> >
> > To have error message unified bugger_off_msg for BIOS boot block code was
> > changed to:
> >
> > This program cannot be run in BIOS mode.
> >
> > So if you copy generated bzImage directly to boot sector and try to boot it
> > by BIOS you get this new updated message.
> >
> > Due to fixed offset of setup header (0x1f1), PE header was moved after
> > entrytext section. bstext and bsdata sections where is full MZ header and
> > MS-DOS code is now bigger.
>
> Hehe, I guess the patch may have been dropped due to april's fools?
Yea, it was mean as first April patch :-) I tested it with MS-DOS 7.0
and DOSBox and it worked.
> You may want to retransmit?
Do you really think it can be useful? :-)
> Pavel
>
> > Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
> > ---
> > arch/x86/boot/header.S | 55 +++++++++++++++++++++++++++++++++++++++++++-------
> > arch/x86/boot/setup.ld | 1 +
> > 2 files changed, 49 insertions(+), 7 deletions(-)
> >
> > diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S
> > index 850b8762e889..58fcab7d00c8 100644
> > --- a/arch/x86/boot/header.S
> > +++ b/arch/x86/boot/header.S
> > @@ -45,6 +45,46 @@ bootsect_start:
> > # "MZ", MS-DOS header
> > .byte 0x4d
> > .byte 0x5a
> > +
> > + # Explicitly enter this as bytes, or the assembler
> > + # tries to generate a 3-byte jump here, which causes
> > + # everything else to push off to the wrong offset.
> > + .byte 0xeb # short (2-byte) jump
> > + .byte bios_start-1f
> > +1:
> > +
> > + .org 0x04
> > + .short 3 # e_cp - Pages in file
> > + .short 0 # e_crlc - Relocations
> > + .short 4 # e_cparhdr - Size of header in paragraphs
> > + .short 0 # e_minalloc - Minimum extra paragraphs needed
> > + .short 0xffff # e_maxalloc - Maximum extra paragraphs needed
> > + .short 0 # e_ss - Initial (relative) SS value
> > + .short 0 # e_sp - Initial SP value
> > + .short 0 # e_csum - Checksum
> > + .short 0 # e_ip - Initial IP value
> > + .short -4 # e_cs - Initial (relative) CS value
> > + .short 0x40 # e_lfarlc - File address of relocation table
> > +
> > + .org 0x3c
> > + .long pe_header # Offset to the PE header
> > +
> > + #
> > + # MS-DOS start code
> > + #
> > + push %cs
> > + pop %ds
> > +
> > + # Write msdos_msg string
> > + mov $msdos_msg, %dx
> > + mov $0x09, %ah
> > + int $0x21
> > +
> > + # Terminate program
> > + mov $0x4c01, %ax
> > + int $0x21
> > +
> > +bios_start:
> > #endif
> >
> > # Normalize the start address
> > @@ -80,22 +120,23 @@ bs_die:
> > # invoke the BIOS reset code...
> > ljmp $0xf000,$0xfff0
> >
> > + .section ".bsdata", "a"
> > #ifdef CONFIG_EFI_STUB
> > - .org 0x3c
> > - #
> > - # Offset to the PE header.
> > - #
> > - .long pe_header
> > +msdos_msg:
> > + .ascii "This program cannot be run in DOS mode.\r\n"
> > + .ascii "To load Linux kernel from DOS mode use LOADLIN.EXE.\r\r\n"
> > + .ascii "$"
> > #endif /* CONFIG_EFI_STUB */
> >
> > - .section ".bsdata", "a"
> > bugger_off_msg:
> > - .ascii "Use a boot loader.\r\n"
> > + .ascii "This program cannot be run in BIOS mode.\r\n"
> > + .ascii "To load Linux kernel from BIOS mode use a boot loader.\r\n"
> > .ascii "\n"
> > .ascii "Remove disk and press any key to reboot...\r\n"
> > .byte 0
> >
> > #ifdef CONFIG_EFI_STUB
> > + .section ".pedata", "a"
> > pe_header:
> > .ascii "PE"
> > .word 0
> > diff --git a/arch/x86/boot/setup.ld b/arch/x86/boot/setup.ld
> > index 0149e41d42c2..c0ec2fe09d2d 100644
> > --- a/arch/x86/boot/setup.ld
> > +++ b/arch/x86/boot/setup.ld
> > @@ -16,6 +16,7 @@ SECTIONS
> > . = 495;
> > .header : { *(.header) }
> > .entrytext : { *(.entrytext) }
> > + .pedata : { *(.pedata) }
> > .inittext : { *(.inittext) }
> > .initdata : { *(.initdata) }
> > __end_init = .;
>
--
Pali Rohár
pali.rohar@gmail.com
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
next prev parent reply other threads:[~2019-04-08 18:08 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-01 10:24 Pali Rohár
2019-04-08 18:04 ` Pavel Machek
2019-04-08 18:08 ` Pali Rohár [this message]
2019-04-08 21:25 ` Pavel Machek
2019-04-18 11:27 ` Ingo Molnar
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=20190408180809.myjp5zaviuibj5uf@pali \
--to=pali.rohar@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=pavel@ucw.cz \
--cc=x86@kernel.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
all inboxes | Powered by JetHome®