[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v12 8/8] xen/README: add compiler and binutils versions for RISC-V64
On Thu, 2024-05-30 at 20:52 +0100, Andrew Cooper wrote: > On 29/05/2024 8:55 pm, Oleksii Kurochko wrote: > > diff --git a/README b/README > > index c8a108449e..30da5ff9c0 100644 > > --- a/README > > +++ b/README > > @@ -48,6 +48,10 @@ provided by your OS distributor: > > - For ARM 64-bit: > > - GCC 5.1 or later > > - GNU Binutils 2.24 or later > > + - For RISC-V 64-bit: > > + - GCC 12.2 or later > > + - GNU Binutils 2.39 or later > > I would like to petition for GCC 10 and Binutils 2.35. > > These are the versions provided as cross-compilers by Debian, and > therefore are the versions I would prefer to do smoke testing with. We can consider that, but I prefer to make a separate patch series for that. ~ Oleksii > > One issue is in cpu_relax(), needing this diff to fix: > > diff --git a/xen/arch/riscv/include/asm/processor.h > b/xen/arch/riscv/include/asm/processor.h > index 6846151717f7..830a05dd8e3a 100644 > --- a/xen/arch/riscv/include/asm/processor.h > +++ b/xen/arch/riscv/include/asm/processor.h > @@ -67,7 +67,7 @@ static inline void cpu_relax(void) > __asm__ __volatile__ ( "pause" ); > #else > /* Encoding of the pause instruction */ > - __asm__ __volatile__ ( ".insn 0x0100000F" ); > + __asm__ __volatile__ ( ".4byte 0x0100000F" ); > #endif > > barrier(); > > The .insn directive appears to check that the byte pattern is a known > extension, where .4byte doesn't. AFAICT, this makes .insn pretty > useless for what I'd expect is it's main purpose... > > > The other problem is a real issue in cmpxchg.h, already committed to > staging (51dabd6312c). > > RISC-V does a conditional toolchain for the Zbb extension > (xen/arch/riscv/rules.mk), but unconditionally uses the ANDN > instruction > in emulate_xchg_1_2(). > > Nevertheless, this is also quite easy to fix: > > diff --git a/xen/arch/riscv/include/asm/cmpxchg.h > b/xen/arch/riscv/include/asm/cmpxchg.h > index d5e678c03678..12ecb0950701 100644 > --- a/xen/arch/riscv/include/asm/cmpxchg.h > +++ b/xen/arch/riscv/include/asm/cmpxchg.h > @@ -18,6 +18,20 @@ > : "r" (new) \ > : "memory" ); > > +/* > + * Binutils < 2.37 doesn't understand ANDN. If the toolchain is too > old, form > + * it of a NOT+AND pair > + */ > +#ifdef __riscv_zbb > +#define ANDN_INSN(rd, rs1, rs2) \ > + "andn " rd ", " rs1 ", " rs2 "\n" > +#else > +#define ANDN_INSN(rd, rs1, rs2) \ > + "not " rd ", " rs2 "\n" \ > + "and " rd ", " rs1 ", " rd "\n" > +#endif > + > + > /* > * For LR and SC, the A extension requires that the address held in > rs1 be > * naturally aligned to the size of the operand (i.e., eight-byte > aligned > @@ -48,7 +62,7 @@ > \ > asm volatile ( \ > "0: lr.w" lr_sfx " %[old], %[ptr_]\n" \ > - " andn %[scratch], %[old], %[mask]\n" \ > + ANDN_INSN("%[scratch]", "%[old]", "%[mask]") \ > " or %[scratch], %[scratch], %z[new_]\n" \ > " sc.w" sc_sfx " %[scratch], %[scratch], %[ptr_]\n" \ > " bnez %[scratch], 0b\n" \ > > > > And with that, everything builds... but doesn't link. I've got this: > > LDS arch/riscv/xen.lds > riscv64-linux-gnu-ld -T arch/riscv/xen.lds -N prelink.o \ > ./common/symbols-dummy.o -o ./.xen-syms.0 > riscv64-linux-gnu-ld: prelink.o: in function > `keyhandler_crash_action': > /local/xen.git/xen/common/keyhandler.c:552: undefined reference to > `guest_physmap_remove_page' > riscv64-linux-gnu-ld: ./.xen-syms.0: hidden symbol > `guest_physmap_remove_page' isn't defined > riscv64-linux-gnu-ld: final link failed: bad value > > which is completely bizarre. > > keyhandler_crash_action() has no actual reference to > guest_physmap_remove_page(), and keyhandler.o has no such relocation. > > I'm still investigating this one. > > ~Andrew
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |