|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1 2/3] xen/riscv: setup initial pagetables
On Sat, 2023-02-25 at 18:05 +0000, Julien Grall wrote:
> Hi,
>
> On 24/02/2023 15:06, Oleksii Kurochko wrote:
> > Calculate load and linker linker image addresses and
> > setup initial pagetables.
> >
> > Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
> > ---
> > xen/arch/riscv/setup.c | 11 +++++++++++
> > 1 file changed, 11 insertions(+)
> >
> > diff --git a/xen/arch/riscv/setup.c b/xen/arch/riscv/setup.c
> > index b7cd438a1d..f69bc278bb 100644
> > --- a/xen/arch/riscv/setup.c
> > +++ b/xen/arch/riscv/setup.c
> > @@ -1,9 +1,11 @@
> > #include <xen/bug.h>
> > #include <xen/compile.h>
> > #include <xen/init.h>
> > +#include <xen/kernel.h>
> >
> > #include <asm/csr.h>
> > #include <asm/early_printk.h>
> > +#include <asm/mm.h>
> > #include <asm/traps.h>
> >
> > /* Xen stack for bringing up the first CPU. */
> > @@ -43,6 +45,11 @@ static void __init disable_fpu(void)
> >
> > void __init noreturn start_xen(void)
> > {
> > + unsigned long load_start = (unsigned long)start;
> > + unsigned long load_end = load_start + (unsigned
> > long)(_end - _start);
>
> I am a bit puzzled, on top of load_addr() and linker_addr(), you
> wrote
> it can't use global variable/function. But here... you are using
> them.
> So how is this different?
I don't use load_addr() and linker_addr() macros here.
>
> > + unsigned long linker_start = (unsigned long)_start;
> > + unsigned long linker_end = (unsigned long)_end;
>
> I am a bit confused with how you define the start/end for both the
> linker and load. In one you use _start and the other _end.
>
> Both are fixed at compile time, so I assume the values will be a
> linked
> address rather than the load address. So how is this meant to how?
>
_start, _end - it is label from linker script so I use them to define
linker_start and linker_end addresses.
load_start is defined as an address of start() function from head.S and
load_end is the load_start + the size (_end - _start)
> Furthermore, I would expect linker_start and load_start to point to
> the
> same symbol (the only different is one store the virtual address
> whereas
> the other the physical address). But here you are technically using
> two
> different symbol. Can you explain why?
It is used to make identity mapping for the range [load_addr, load_end]
and [linker_addr, linker_end]. It was done so because in Bobby's
patches in the linker script XEN_VIRT_START is defined as
_AT(vaddr_t,0x00200000) but bootloader loads Xen at 0x80200000 and so
in this case loadr_addr != linker_addr.
But I have changed XEN_VIRT_START to 0x8020...00 so they are equal now.
>
> > +
> > /*
> > * The following things are passed by bootloader:
> > * a0 -> hart_id
> > @@ -65,6 +72,10 @@ void __init noreturn start_xen(void)
> >
> > test_macros_from_bug_h();
> >
> > + setup_initial_pagetables(load_start, load_end, linker_start,
> > linker_end);
>
> Shouldn't this happen earlier in start_xen()?
It can. If to be honest I don't know if it should. I added at the end
only because it was the last thing I worked on...
>
> Cheers,
>
~ Oleksii
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |