[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1 2/3] xen/riscv: setup initial pagetables
On 08.03.2023 15:54, Oleksii wrote: > Actually after my latest experiments it looks that we don't need to > calculate that things at all because for RISC-V it is used everywhere > PC-relative access. > Thereby it doesn't matter what is an address where Xen was loaded and > linker address. > Right now I found only to cases which aren't PC-relative. > Please look at the patch below: > diff --git a/xen/arch/riscv/include/asm/config.h > b/xen/arch/riscv/include/asm/config.h > index 763a922a04..e1ba613d81 100644 > --- a/xen/arch/riscv/include/asm/config.h > +++ b/xen/arch/riscv/include/asm/config.h > @@ -39,7 +39,7 @@ > name: > #endif > > -#define XEN_VIRT_START _AT(UL, 0x80200000) > +#define XEN_VIRT_START _AT(UL, 0x00200000) I think this wants to remain the address where Xen actually runs, and where Xen is linked to. This ... > --- a/xen/arch/riscv/traps.c > +++ b/xen/arch/riscv/traps.c > @@ -123,8 +123,14 @@ int do_bug_frame(const struct cpu_user_regs *regs, > vaddr_t pc) > const char *filename, *predicate; > int lineno; > > - static const struct bug_frame* bug_frames[] = { > - &__start_bug_frames[0], > + /* > + * force fill bug_frames array using auipc/addi instructions to > + * make addresses in bug_frames PC-relative. > + */ > + const struct bug_frame * force = (const struct bug_frame *) > &__start_bug_frames[0]; > + > + const struct bug_frame* bug_frames[] = { > + force, > &__stop_bug_frames_0[0], > &__stop_bug_frames_1[0], > &__stop_bug_frames_2[0], ... array would better be static anyway, and ... > The changes related to <asm/config.h> are only to make linker_addr != > load_address. So: > 1. The first issue with cpu0_boot_stack in the head.S file. When we do: > la sp, cpu0_boot_stack > Pseudo-instruction la will be transformed to auipc/addi OR > auipc/l{w|d}. > It depends on an option: nopic, pic. [1] > > So the solution can be the following: > * As it is done in the patch: add to the start of head.S ".option > nopic" > * Change la to lla thereby it will be always generated "auipc/addi" > to get an address of variable. > > 2. The second issue is with the code in do_bug_frame() with bug_frames > array: > const struct bug_frame* bug_frames[] = { > &__start_bug_frames[0], > &__stop_bug_frames_0[0], > &__stop_bug_frames_1[0], > &__stop_bug_frames_2[0], > &__stop_bug_frames_3[0], > }; > In this case &{start,stop}bug_frames{,{0-3}} will be changed to > linker address. In case of when load_addr is 0x80200000 and linker_addr > is 0x00200000 then &{start,stop}bug_frames{,{0-3}} will be equal to > 0x00200000 + X. ... this "solution" to a problem you introduce by wrongly modifying the linked address would then need applying to any other similar code pattern found in Xen. Which is (I hope obviously) not a viable route. Instead code running before address translation is enable needs to be extra careful in what code and data items it accesses, and how. Jan > To force using addresses related to load_addr in bug_frames, it is > necessary to declare a variable with getting an address of > &__{start,stop}bug_frames{,{0-3}} thereby it will generate the code: > 2002c2: 00001797 auipc a5,0x1 > 2002c6: d3e78793 addi a5,a5,-706 # > 201000 <__start_bug_frames> > 2002ca: faf43c23 sd a5,-72(s0) > 2002ce: 00001797 auipc a5,0x1 > 2002d2: d3a78793 addi a5,a5,-710 # > 201008 <__stop_bug_frames_
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |