From: Oleksii Kurochko <oleksii.kurochko@gmail.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: "Romain Caritey" <Romain.Caritey@microchip.com>,
"Alistair Francis" <alistair.francis@wdc.com>,
"Connor Davis" <connojdavis@gmail.com>,
"Andrew Cooper" <andrew.cooper3@citrix.com>,
"Anthony PERARD" <anthony.perard@vates.tech>,
"Michal Orzel" <michal.orzel@amd.com>,
"Julien Grall" <julien@xen.org>,
"Roger Pau Monné" <roger.pau@citrix.com>,
"Stefano Stabellini" <sstabellini@kernel.org>,
xen-devel@lists.xenproject.org
Subject: Re: [PATCH v3 05/12] xen/riscv: add kernel loading support
Date: Wed, 22 Apr 2026 16:32:43 +0200 [thread overview]
Message-ID: <8415009c-9b4b-46f3-8aec-17313c19df0e@gmail.com> (raw)
In-Reply-To: <51ac0fb6-6111-4364-9781-bf8dde3df979@suse.com>
On 4/22/26 3:54 PM, Jan Beulich wrote:
> On 22.04.2026 15:47, Oleksii Kurochko wrote:
>> On 4/22/26 1:57 PM, Jan Beulich wrote:
>>> On 22.04.2026 13:45, Oleksii Kurochko wrote:
>>>> On 4/21/26 10:57 AM, Jan Beulich wrote:
>>>>> On 10.04.2026 17:54, Oleksii Kurochko wrote:
>>>>>> +static paddr_t __init kernel_image_place(struct kernel_info *info)
>>>>>> +{
>>>>>> + paddr_t load_addr = INVALID_PADDR;
>>>>>> + uint64_t image_size = info->image.image_size ?: info->image.len;
>>>>>> + const struct membanks *banks = kernel_info_get_mem_const(info);
>>>>>> + unsigned int nr_banks = banks->nr_banks;
>>>>>> + unsigned int bi;
>>>>>> +
>>>>>> + dprintk(XENLOG_DEBUG, "nr_banks(%u)\n", nr_banks);
>>>>>> +
>>>>>> + /*
>>>>>> + * At the moment, RISC-V's Linux kernel should be always position
>>>>>> + * independent based on "Per-MMU execution" of boot.rst:
>>>>>> + * https://docs.kernel.org/arch/riscv/boot.html#pre-mmu-execution
>>>>>> + *
>>>>>> + * But just for the case when RISC-V's Linux kernel isn't position
>>>>>> + * independent it is needed to take load address from
>>>>>> + * info->image.start.
>>>>>> + *
>>>>>> + * If `start` is zero, the Image is position independent.
>>>>>> + */
>>>>>> + if ( likely(!info->image.start) )
>>>>>> + {
>>>>>> + for ( bi = 0; bi != nr_banks; bi++ )
>>>>>> + {
>>>>>> + const struct membank *bank = &banks->bank[bi];
>>>>>> + paddr_t bank_start = bank->start;
>>>>>> + /*
>>>>>> + * According to boot.rst kernel load address should be properly
>>>>>> + * aligned:
>>>>>> + * https://docs.kernel.org/arch/riscv/boot.html#kernel-location
>>>>>> + *
>>>>>> + * As Image in this case is PIC we can ignore
>>>>>> + * info->image.text_offset.
>>>>>> + */
>>>>>> + paddr_t aligned_start = ROUNDUP(bank_start, KERNEL_LOAD_ADDR_ALIGNMENT);
>>>>>> + paddr_t bank_end = bank_start + bank->size;
>>>>>> + paddr_t bank_size;
>>>>>> +
>>>>>> + if ( aligned_start > bank_end )
>>>>>> + continue;
>>>>>> +
>>>>>> + bank_size = bank_end - aligned_start;
>>>>>> +
>>>>>> + dprintk(XENLOG_DEBUG, "bank[%u].start=%"PRIpaddr"\n", bi, bank->start);
>>>>>> +
>>>>>> + if ( image_size <= bank_size )
>>>>>> + {
>>>>>> + load_addr = aligned_start;
>>>>>> + break;
>>>>>> + }
>>>>>> + }
>>>>>> + }
>>>>>> + else
>>>>>> + {
>>>>>> + load_addr = info->image.start + info->image.text_offset;
>>>>>
>>>>> Why does stuff ahead of text_offset not need loading?
>>>>
>>>> Here we just calculating only a place where kernel will be loaded. The
>>>> full kernel image will be loaded in kernel_image_load().
>>>
>>> Okay, but if you calculate an address where the full image won't fit,
>>> how are things going to work?
>>
>> If the full image won't fit than the necessary bank won't be found in
>> for() loop below and so this kernel will be rejected.
>>
>> I expect that in the case when info->image.start is not 0 (so isn't
>> Image isn't PIC) Image want to be specifically load to info->image.start
>> + info->image.text_offset. Is it wrong statement?
>
> I don't know, but the adding in of .text_offset looks questionable to me.
> I simply don't know why such offsetting would be wanted / needed.
In the <linux>/Documentation/arch/riscv/boot-image-header.rst:
This header format is compliant with PE/COFF header and largely inspired
from ARM64 header. Thus, both ARM64 & RISC-V header can be combined into
one common header in future.
Than if to look at the comment near text_offset it is mentioned that:
/* Image load offset, little endian */
So it is basically Image load offset and that is why I expect it should
be added to calculation of load_addr.
Considering that boot image header is based on Arm64 I assume that an
explanation regarding text_offset for Arm64
(<linux>/Documentation/arch/arm64/booting.rst:) should be true for RISC-V:
```
The Image must be placed text_offset bytes from a 2MB aligned base
address anywhere in usable system RAM and called there. The region
between the 2 MB aligned base address and the start of the image has no
special significance to the kernel, and may be used for other purposes.
At least image_size bytes from the start of the image must be free for
use by the kernel.
```
~ Oleksii
next prev parent reply other threads:[~2026-04-22 14:33 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-10 15:54 [PATCH v3 00/12] RISCV: enable DOMAIN_BUILD_HELPERS Oleksii Kurochko
2026-04-10 15:54 ` [PATCH v3 01/12] xen/riscv: implement get_page_from_gfn() Oleksii Kurochko
2026-04-20 14:17 ` Jan Beulich
2026-04-10 15:54 ` [PATCH v3 02/12] xen: fix len type for guest copy functions Oleksii Kurochko
2026-04-20 15:43 ` Jan Beulich
2026-04-20 15:44 ` Jan Beulich
2026-04-22 10:02 ` Oleksii Kurochko
2026-04-10 15:54 ` [PATCH v3 03/12] xen/riscv: implement copy_to_guest_phys() Oleksii Kurochko
2026-04-20 15:46 ` Jan Beulich
2026-04-10 15:54 ` [PATCH v3 04/12] xen/dom0less: rename kernel_zimage_probe() to kernel_image_probe() Oleksii Kurochko
2026-04-10 15:54 ` [PATCH v3 05/12] xen/riscv: add kernel loading support Oleksii Kurochko
2026-04-21 8:57 ` Jan Beulich
2026-04-22 11:45 ` Oleksii Kurochko
2026-04-22 11:57 ` Jan Beulich
2026-04-22 13:47 ` Oleksii Kurochko
2026-04-22 13:54 ` Jan Beulich
2026-04-22 14:32 ` Oleksii Kurochko [this message]
2026-04-21 9:01 ` Jan Beulich
2026-04-10 15:54 ` [PATCH v3 06/12] xen: move declaration of fw_unreserved_regions() to common header Oleksii Kurochko
2026-04-10 15:54 ` [PATCH v3 07/12] xen: introduce domain-layout.h with common domain_use_host_layout() Oleksii Kurochko
2026-04-21 9:20 ` Jan Beulich
2026-04-22 14:38 ` Oleksii Kurochko
2026-04-10 15:54 ` [PATCH v3 08/12] xen/riscv: rework G-stage mode handling Oleksii Kurochko
2026-04-21 9:39 ` Jan Beulich
2026-04-22 16:06 ` Oleksii Kurochko
2026-04-10 15:54 ` [PATCH v3 09/12] xen: rename p2m_ipa_bits to p2m_gpa_bits Oleksii Kurochko
2026-04-10 15:54 ` [PATCH v3 10/12] xen/riscv: introduce p2m_gpa_bits Oleksii Kurochko
2026-04-21 9:46 ` Jan Beulich
2026-04-23 13:47 ` Oleksii Kurochko
2026-05-04 5:39 ` Jan Beulich
2026-04-10 15:54 ` [PATCH v3 11/12] xen/riscv: add definition of guest RAM banks Oleksii Kurochko
2026-04-21 10:24 ` Jan Beulich
2026-04-23 13:50 ` Oleksii Kurochko
2026-04-10 15:54 ` [PATCH v3 12/12] xen/riscv: enable DOMAIN_BUILD_HELPERS Oleksii Kurochko
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=8415009c-9b4b-46f3-8aec-17313c19df0e@gmail.com \
--to=oleksii.kurochko@gmail.com \
--cc=Romain.Caritey@microchip.com \
--cc=alistair.francis@wdc.com \
--cc=andrew.cooper3@citrix.com \
--cc=anthony.perard@vates.tech \
--cc=connojdavis@gmail.com \
--cc=jbeulich@suse.com \
--cc=julien@xen.org \
--cc=michal.orzel@amd.com \
--cc=roger.pau@citrix.com \
--cc=sstabellini@kernel.org \
--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 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.