All of lore.kernel.org
 help / color / mirror / Atom feed
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
Cc: Mark Rutland <mark.rutland@arm.com>,
	catalin.marinas@arm.com, will.deacon@arm.com,
	dhowells@redhat.com, vgoyal@redhat.com,
	herbert@gondor.apana.org.au, davem@davemloft.net,
	akpm@linux-foundation.org, mpe@ellerman.id.au, dyoung@redhat.com,
	bhe@redhat.com, arnd@arndb.de, ard.biesheuvel@linaro.org,
	kexec@lists.infradead.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 08/14] arm64: kexec_file: create purgatory
Date: Fri, 8 Sep 2017 11:46:53 +0900	[thread overview]
Message-ID: <20170908024653.GC17186@linaro.org> (raw)
In-Reply-To: <878ti7fws9.fsf@linux.vnet.ibm.com>

On Fri, Aug 25, 2017 at 01:16:06PM -0300, Thiago Jung Bauermann wrote:
> 
> Mark Rutland <mark.rutland@arm.com> writes:
> 
> > On Fri, Aug 25, 2017 at 10:00:59AM +0900, AKASHI Takahiro wrote:
> >> On Thu, Aug 24, 2017 at 05:56:17PM +0100, Mark Rutland wrote:
> >> > On Thu, Aug 24, 2017 at 05:18:05PM +0900, AKASHI Takahiro wrote:
> >> > > This is a basic purgtory, or a kind of glue code between the two kernel,
> >> > > for arm64. We will later add a feature of verifying a digest check against
> >> > > loaded memory segments.
> >> > > 
> >> > > arch_kexec_apply_relocations_add() is responsible for re-linking any
> >> > > relative symbols in purgatory. Please note that the purgatory is not
> >> > > an executable, but a non-linked archive of binaries so relative symbols
> >> > > contained here must be resolved at kexec load time.
> >> > > Despite that arm64_kernel_start and arm64_dtb_addr are only such global
> >> > > variables now, arch_kexec_apply_relocations_add() can manage more various
> >> > > types of relocations.
> >> > 
> >> > Why does the purgatory code need to be so complex?
> >> > 
> >> > Why is it not possible to write this as position-independent asm?
> >> 
> >> I don't get your point, but please note that these values are also
> >> re-written by the 1st kernel when it loads the 2nd kernel and so
> >> they must appear as globals.
> >
> > My fear about complexity is that we must "re-link" the purgatory.
> >
> > I don't understand why that has to be necessary. Surely we can have the
> > purgatory code be position independent, and store those globals in a
> > single struct purgatory_info that we can fill in from the host?
> >
> > i.e. similar to what we do for values shared with the VDSO, where we
> > just poke vdso_data->field, no re-linking required.
> 
> Right. I'm not sure why it is a partially linked object. I believe that
> the purgatory could be linked at build time into a PIE executable with
> exported symbols for the variables that need to be filled in from the
> host.

For clarification, generic kexec code expects that the purgatory is
*relocatable* (not executable in ELF terms) as compiled with -r gcc option.
On arm64, in this case, all the *global* symbols remain to be un-resolved
even if the references are local within a single section (in a file).
This would require re-linking at purgatory load time.

I'm going to resolve this issue by adding extra *local labels*.
(See my v2.)

> On some architectures (e.g., powerpc), this would greatly reduce the
> number of relocation types that the kernel needs to know how to process.
> On x86 it make less of a difference because the partially linked object
> already has just a handful of relocation types.
> 
> > Otherwise, why can't the purgatory code be written in assembly? AFAICT,
> > the only complex part is the hashing code, which I don't beleive is
> > strictly necessary.
> 
> When I posted a similar series for powerpc with similar changes to
> handle a partially linked purgatory in the kernel, Michael Ellerman
> preferred to go for a purgatory written in assembly, partially based on
> the one from kexec-lite. That purgatory doesn't do the checksum
> verification of the segments.

Anyhow, I will drop hash-check code from the purgatory in v2 so that
it will now be quite a simple asm.

Thanks,
-Takahiro AKASHI

> -- 
> Thiago Jung Bauermann
> IBM Linux Technology Center
> 

WARNING: multiple messages have this Message-ID (diff)
From: takahiro.akashi@linaro.org (AKASHI Takahiro)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 08/14] arm64: kexec_file: create purgatory
Date: Fri, 8 Sep 2017 11:46:53 +0900	[thread overview]
Message-ID: <20170908024653.GC17186@linaro.org> (raw)
In-Reply-To: <878ti7fws9.fsf@linux.vnet.ibm.com>

On Fri, Aug 25, 2017 at 01:16:06PM -0300, Thiago Jung Bauermann wrote:
> 
> Mark Rutland <mark.rutland@arm.com> writes:
> 
> > On Fri, Aug 25, 2017 at 10:00:59AM +0900, AKASHI Takahiro wrote:
> >> On Thu, Aug 24, 2017 at 05:56:17PM +0100, Mark Rutland wrote:
> >> > On Thu, Aug 24, 2017 at 05:18:05PM +0900, AKASHI Takahiro wrote:
> >> > > This is a basic purgtory, or a kind of glue code between the two kernel,
> >> > > for arm64. We will later add a feature of verifying a digest check against
> >> > > loaded memory segments.
> >> > > 
> >> > > arch_kexec_apply_relocations_add() is responsible for re-linking any
> >> > > relative symbols in purgatory. Please note that the purgatory is not
> >> > > an executable, but a non-linked archive of binaries so relative symbols
> >> > > contained here must be resolved at kexec load time.
> >> > > Despite that arm64_kernel_start and arm64_dtb_addr are only such global
> >> > > variables now, arch_kexec_apply_relocations_add() can manage more various
> >> > > types of relocations.
> >> > 
> >> > Why does the purgatory code need to be so complex?
> >> > 
> >> > Why is it not possible to write this as position-independent asm?
> >> 
> >> I don't get your point, but please note that these values are also
> >> re-written by the 1st kernel when it loads the 2nd kernel and so
> >> they must appear as globals.
> >
> > My fear about complexity is that we must "re-link" the purgatory.
> >
> > I don't understand why that has to be necessary. Surely we can have the
> > purgatory code be position independent, and store those globals in a
> > single struct purgatory_info that we can fill in from the host?
> >
> > i.e. similar to what we do for values shared with the VDSO, where we
> > just poke vdso_data->field, no re-linking required.
> 
> Right. I'm not sure why it is a partially linked object. I believe that
> the purgatory could be linked at build time into a PIE executable with
> exported symbols for the variables that need to be filled in from the
> host.

For clarification, generic kexec code expects that the purgatory is
*relocatable* (not executable in ELF terms) as compiled with -r gcc option.
On arm64, in this case, all the *global* symbols remain to be un-resolved
even if the references are local within a single section (in a file).
This would require re-linking at purgatory load time.

I'm going to resolve this issue by adding extra *local labels*.
(See my v2.)

> On some architectures (e.g., powerpc), this would greatly reduce the
> number of relocation types that the kernel needs to know how to process.
> On x86 it make less of a difference because the partially linked object
> already has just a handful of relocation types.
> 
> > Otherwise, why can't the purgatory code be written in assembly? AFAICT,
> > the only complex part is the hashing code, which I don't beleive is
> > strictly necessary.
> 
> When I posted a similar series for powerpc with similar changes to
> handle a partially linked purgatory in the kernel, Michael Ellerman
> preferred to go for a purgatory written in assembly, partially based on
> the one from kexec-lite. That purgatory doesn't do the checksum
> verification of the segments.

Anyhow, I will drop hash-check code from the purgatory in v2 so that
it will now be quite a simple asm.

Thanks,
-Takahiro AKASHI

> -- 
> Thiago Jung Bauermann
> IBM Linux Technology Center
> 

WARNING: multiple messages have this Message-ID (diff)
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
Cc: Mark Rutland <mark.rutland@arm.com>,
	herbert@gondor.apana.org.au, bhe@redhat.com,
	ard.biesheuvel@linaro.org, catalin.marinas@arm.com,
	will.deacon@arm.com, linux-kernel@vger.kernel.org,
	kexec@lists.infradead.org, dhowells@redhat.com, arnd@arndb.de,
	linux-arm-kernel@lists.infradead.org, mpe@ellerman.id.au,
	akpm@linux-foundation.org, dyoung@redhat.com,
	davem@davemloft.net, vgoyal@redhat.com
Subject: Re: [PATCH 08/14] arm64: kexec_file: create purgatory
Date: Fri, 8 Sep 2017 11:46:53 +0900	[thread overview]
Message-ID: <20170908024653.GC17186@linaro.org> (raw)
In-Reply-To: <878ti7fws9.fsf@linux.vnet.ibm.com>

On Fri, Aug 25, 2017 at 01:16:06PM -0300, Thiago Jung Bauermann wrote:
> 
> Mark Rutland <mark.rutland@arm.com> writes:
> 
> > On Fri, Aug 25, 2017 at 10:00:59AM +0900, AKASHI Takahiro wrote:
> >> On Thu, Aug 24, 2017 at 05:56:17PM +0100, Mark Rutland wrote:
> >> > On Thu, Aug 24, 2017 at 05:18:05PM +0900, AKASHI Takahiro wrote:
> >> > > This is a basic purgtory, or a kind of glue code between the two kernel,
> >> > > for arm64. We will later add a feature of verifying a digest check against
> >> > > loaded memory segments.
> >> > > 
> >> > > arch_kexec_apply_relocations_add() is responsible for re-linking any
> >> > > relative symbols in purgatory. Please note that the purgatory is not
> >> > > an executable, but a non-linked archive of binaries so relative symbols
> >> > > contained here must be resolved at kexec load time.
> >> > > Despite that arm64_kernel_start and arm64_dtb_addr are only such global
> >> > > variables now, arch_kexec_apply_relocations_add() can manage more various
> >> > > types of relocations.
> >> > 
> >> > Why does the purgatory code need to be so complex?
> >> > 
> >> > Why is it not possible to write this as position-independent asm?
> >> 
> >> I don't get your point, but please note that these values are also
> >> re-written by the 1st kernel when it loads the 2nd kernel and so
> >> they must appear as globals.
> >
> > My fear about complexity is that we must "re-link" the purgatory.
> >
> > I don't understand why that has to be necessary. Surely we can have the
> > purgatory code be position independent, and store those globals in a
> > single struct purgatory_info that we can fill in from the host?
> >
> > i.e. similar to what we do for values shared with the VDSO, where we
> > just poke vdso_data->field, no re-linking required.
> 
> Right. I'm not sure why it is a partially linked object. I believe that
> the purgatory could be linked at build time into a PIE executable with
> exported symbols for the variables that need to be filled in from the
> host.

For clarification, generic kexec code expects that the purgatory is
*relocatable* (not executable in ELF terms) as compiled with -r gcc option.
On arm64, in this case, all the *global* symbols remain to be un-resolved
even if the references are local within a single section (in a file).
This would require re-linking at purgatory load time.

I'm going to resolve this issue by adding extra *local labels*.
(See my v2.)

> On some architectures (e.g., powerpc), this would greatly reduce the
> number of relocation types that the kernel needs to know how to process.
> On x86 it make less of a difference because the partially linked object
> already has just a handful of relocation types.
> 
> > Otherwise, why can't the purgatory code be written in assembly? AFAICT,
> > the only complex part is the hashing code, which I don't beleive is
> > strictly necessary.
> 
> When I posted a similar series for powerpc with similar changes to
> handle a partially linked purgatory in the kernel, Michael Ellerman
> preferred to go for a purgatory written in assembly, partially based on
> the one from kexec-lite. That purgatory doesn't do the checksum
> verification of the segments.

Anyhow, I will drop hash-check code from the purgatory in v2 so that
it will now be quite a simple asm.

Thanks,
-Takahiro AKASHI

> -- 
> Thiago Jung Bauermann
> IBM Linux Technology Center
> 

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

  reply	other threads:[~2017-09-08  2:45 UTC|newest]

Thread overview: 147+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-24  8:17 [PATCH 00/14] arm64: kexec: add kexec_file_load support AKASHI Takahiro
2017-08-24  8:17 ` AKASHI Takahiro
2017-08-24  8:17 ` AKASHI Takahiro
2017-08-24  8:17 ` [PATCH 01/14] MODSIGN: Export module signature definitions AKASHI Takahiro
2017-08-24  8:17   ` AKASHI Takahiro
2017-08-24  8:17   ` AKASHI Takahiro
2017-08-24  8:17 ` [PATCH 02/14] include: pe.h: remove message[] from mz header definition AKASHI Takahiro
2017-08-24  8:17   ` AKASHI Takahiro
2017-08-24  8:17   ` AKASHI Takahiro
2017-08-24  9:04   ` Ard Biesheuvel
2017-08-24  9:04     ` Ard Biesheuvel
2017-08-24  9:04     ` Ard Biesheuvel
2017-08-24  8:18 ` [PATCH 03/14] resource: add walk_system_ram_res_rev() AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  9:06   ` Ard Biesheuvel
2017-08-24  9:06     ` Ard Biesheuvel
2017-08-24  9:06     ` Ard Biesheuvel
2017-08-25  0:50     ` AKASHI Takahiro
2017-08-25  0:50       ` AKASHI Takahiro
2017-08-25  0:50       ` AKASHI Takahiro
2017-08-31  2:34   ` Pratyush Anand
2017-08-31  2:34     ` Pratyush Anand
2017-08-31  2:34     ` Pratyush Anand
2017-09-08  2:33     ` AKASHI Takahiro
2017-09-08  2:33       ` AKASHI Takahiro
2017-09-08  2:33       ` AKASHI Takahiro
2017-08-24  8:18 ` [PATCH 04/14] kexec_file: factor out vmlinux (elf) parser from powerpc AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18 ` [PATCH 05/14] kexec_file: factor out crashdump elf header function from x86 AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-25  5:47   ` Dave Young
2017-08-25  5:47     ` Dave Young
2017-08-25  5:47     ` Dave Young
2017-09-08  2:31     ` AKASHI Takahiro
2017-09-08  2:31       ` AKASHI Takahiro
2017-09-08  2:31       ` AKASHI Takahiro
2017-08-24  8:18 ` [PATCH 06/14] kexec_file: add kexec_add_segment() AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18 ` [PATCH 07/14] asm-generic: add kexec_file_load system call to unistd.h AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24 10:53   ` Arnd Bergmann
2017-08-24 10:53     ` Arnd Bergmann
2017-08-24 10:53     ` Arnd Bergmann
2017-08-24  8:18 ` [PATCH 08/14] arm64: kexec_file: create purgatory AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  9:10   ` Ard Biesheuvel
2017-08-24  9:10     ` Ard Biesheuvel
2017-08-24  9:10     ` Ard Biesheuvel
2017-08-25  1:10     ` AKASHI Takahiro
2017-08-25  1:10       ` AKASHI Takahiro
2017-08-25  1:10       ` AKASHI Takahiro
2017-08-24 16:56   ` Mark Rutland
2017-08-24 16:56     ` Mark Rutland
2017-08-24 16:56     ` Mark Rutland
2017-08-25  1:00     ` AKASHI Takahiro
2017-08-25  1:00       ` AKASHI Takahiro
2017-08-25  1:00       ` AKASHI Takahiro
2017-08-25 10:22       ` Mark Rutland
2017-08-25 10:22         ` Mark Rutland
2017-08-25 10:22         ` Mark Rutland
2017-08-25 16:16         ` Thiago Jung Bauermann
2017-08-25 16:16           ` Thiago Jung Bauermann
2017-08-25 16:16           ` Thiago Jung Bauermann
2017-09-08  2:46           ` AKASHI Takahiro [this message]
2017-09-08  2:46             ` AKASHI Takahiro
2017-09-08  2:46             ` AKASHI Takahiro
2017-08-24  8:18 ` [PATCH 09/14] arm64: kexec_file: add sha256 digest check in purgatory AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  9:13   ` Ard Biesheuvel
2017-08-24  9:13     ` Ard Biesheuvel
2017-08-24  9:13     ` Ard Biesheuvel
2017-08-25  1:25     ` AKASHI Takahiro
2017-08-25  1:25       ` AKASHI Takahiro
2017-08-25  1:25       ` AKASHI Takahiro
2017-08-24 17:04   ` Mark Rutland
2017-08-24 17:04     ` Mark Rutland
2017-08-24 17:04     ` Mark Rutland
2017-08-25  1:21     ` AKASHI Takahiro
2017-08-25  1:21       ` AKASHI Takahiro
2017-08-25  1:21       ` AKASHI Takahiro
2017-08-25 10:41       ` Mark Rutland
2017-08-25 10:41         ` Mark Rutland
2017-08-25 10:41         ` Mark Rutland
2017-09-08  2:50         ` AKASHI Takahiro
2017-09-08  2:50           ` AKASHI Takahiro
2017-09-08  2:50           ` AKASHI Takahiro
2017-09-08 15:59           ` Thiago Jung Bauermann
2017-09-08 15:59             ` Thiago Jung Bauermann
2017-09-08 15:59             ` Thiago Jung Bauermann
2017-08-24  8:18 ` [PATCH 10/14] arm64: kexec_file: load initrd, device-tree and purgatory segments AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24 17:11   ` Mark Rutland
2017-08-24 17:11     ` Mark Rutland
2017-08-24 17:11     ` Mark Rutland
2017-08-25  1:34     ` AKASHI Takahiro
2017-08-25  1:34       ` AKASHI Takahiro
2017-08-25  1:34       ` AKASHI Takahiro
2017-08-24  8:18 ` [PATCH 11/14] arm64: kexec_file: set up for crash dump adding elf core header AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18 ` [PATCH 12/14] arm64: enable KEXEC_FILE config AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18 ` [PATCH 13/14] arm64: kexec_file: add Image format support AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24 17:23   ` Mark Rutland
2017-08-24 17:23     ` Mark Rutland
2017-08-24 17:23     ` Mark Rutland
2017-08-25  1:49     ` AKASHI Takahiro
2017-08-25  1:49       ` AKASHI Takahiro
2017-08-25  1:49       ` AKASHI Takahiro
2017-08-24  8:18 ` [PATCH 14/14] arm64: kexec_file: add vmlinux " AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24  8:18   ` AKASHI Takahiro
2017-08-24 17:30   ` Mark Rutland
2017-08-24 17:30     ` Mark Rutland
2017-08-24 17:30     ` Mark Rutland
2017-08-25  2:03     ` AKASHI Takahiro
2017-08-25  2:03       ` AKASHI Takahiro
2017-08-25  2:03       ` AKASHI Takahiro
2017-08-25  6:13       ` Dave Young
2017-08-25  6:13         ` Dave Young
2017-08-25  6:13         ` Dave Young
2017-09-08  2:54         ` AKASHI Takahiro
2017-09-08  2:54           ` AKASHI Takahiro
2017-09-08  2:54           ` AKASHI Takahiro
2017-08-29 10:01     ` Mark Rutland
2017-08-29 10:01       ` Mark Rutland
2017-08-29 10:01       ` Mark Rutland
2017-08-29 16:15       ` Thiago Jung Bauermann
2017-08-29 16:15         ` Thiago Jung Bauermann
2017-08-29 16:15         ` Thiago Jung Bauermann
2017-08-30  8:40       ` Michael Ellerman
2017-08-30  8:40         ` Michael Ellerman
2017-08-30  8:40         ` Michael Ellerman
2017-09-08  3:07       ` AKASHI Takahiro
2017-09-08  3:07         ` AKASHI Takahiro
2017-09-08  3:07         ` AKASHI Takahiro

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=20170908024653.GC17186@linaro.org \
    --to=takahiro.akashi@linaro.org \
    --cc=akpm@linux-foundation.org \
    --cc=ard.biesheuvel@linaro.org \
    --cc=arnd@arndb.de \
    --cc=bauerman@linux.vnet.ibm.com \
    --cc=bhe@redhat.com \
    --cc=catalin.marinas@arm.com \
    --cc=davem@davemloft.net \
    --cc=dhowells@redhat.com \
    --cc=dyoung@redhat.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=kexec@lists.infradead.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mpe@ellerman.id.au \
    --cc=vgoyal@redhat.com \
    --cc=will.deacon@arm.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.