[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v7 1/2] xen/riscv: introduce early_printk basic stuff
On Sat, Jan 28, 2023 at 12:15 AM Oleksii <oleksii.kurochko@xxxxxxxxx> wrote: > > Hi Alistair, Bobby and community, > > I would like to ask your help with the following check: > +/* > + * early_*() can be called from head.S with MMU-off. > + * > + * The following requiremets should be honoured for early_*() to > + * work correctly: > + * It should use PC-relative addressing for accessing symbols. > + * To achieve that GCC cmodel=medany should be used. > + */ > +#ifndef __riscv_cmodel_medany > +#error "early_*() can be called from head.S with MMU-off" > +#endif I have never seen a check like this before. I don't really understand what it's looking for, if the linker is unable to call early_*() I would expect it to throw an error. I'm not sure what this is adding. I think this is safe to remove. Alistair > > Please take a look at the following messages and help me to decide if > the check mentioned above should be in early_printk.c or not: > [1] > https://lore.kernel.org/xen-devel/599792fa-b08c-0b1e-10c1-0451519d9e4a@xxxxxxx/ > [2] > https://lore.kernel.org/xen-devel/0ec33871-96fa-bd9f-eb1b-eb37d3d7c982@xxxxxxx/ > > Thanks in advance. > > ~ Oleksii > > On Fri, 2023-01-27 at 13:39 +0200, Oleksii Kurochko wrote: > > Because printk() relies on a serial driver (like the ns16550 driver) > > and drivers require working virtual memory (ioremap()) there is not > > print functionality early in Xen boot. > > > > The patch introduces the basic stuff of early_printk functionality > > which will be enough to print 'hello from C environment". > > > > Originally early_printk.{c,h} was introduced by Bobby Eshleman > > ( > > https://github.com/glg-rv/xen/commit/a3c9916bbdff7ad6030055bbee7e53d1a > > ab71384) > > but some functionality was changed: > > early_printk() function was changed in comparison with the original > > as > > common isn't being built now so there is no vscnprintf. > > > > This commit adds early printk implementation built on the putc SBI > > call. > > > > As sbi_console_putchar() is already being planned for deprecation > > it is used temporarily now and will be removed or reworked after > > real uart will be ready. > > > > Signed-off-by: Bobby Eshleman <bobby.eshleman@xxxxxxxxx> > > Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx> > > Reviewed-by: Bobby Eshleman <bobby.eshleman@xxxxxxxxx> > > --- > > Changes in V7: > > - Nothing was changed > > --- > > Changes in V6: > > - Remove __riscv_cmodel_medany check from early_printk.c > > --- > > Changes in V5: > > - Code style fixes > > - Change an error message of #error in case of > > __riscv_cmodel_medany > > isn't defined > > --- > > Changes in V4: > > - Remove "depends on RISCV*" from Kconfig.debug as it is located > > in > > arch specific folder so by default RISCV configs should be > > ebabled. > > - Add "ifdef __riscv_cmodel_medany" to be sure that PC-relative > > addressing > > is used as early_*() functions can be called from head.S with > > MMU-off and > > before relocation (if it would be needed at all for RISC-V) > > - fix code style > > --- > > Changes in V3: > > - reorder headers in alphabetical order > > - merge changes related to start_xen() function from "[PATCH v2 > > 7/8] > > xen/riscv: print hello message from C env" to this patch > > - remove unneeded parentheses in definition of STACK_SIZE > > --- > > Changes in V2: > > - introduce STACK_SIZE define. > > - use consistent padding between instruction mnemonic and > > operand(s) > > --- > > xen/arch/riscv/Kconfig.debug | 5 ++++ > > xen/arch/riscv/Makefile | 1 + > > xen/arch/riscv/early_printk.c | 33 > > +++++++++++++++++++++++ > > xen/arch/riscv/include/asm/early_printk.h | 12 +++++++++ > > xen/arch/riscv/setup.c | 4 +++ > > 5 files changed, 55 insertions(+) > > create mode 100644 xen/arch/riscv/early_printk.c > > create mode 100644 xen/arch/riscv/include/asm/early_printk.h > > > > diff --git a/xen/arch/riscv/Kconfig.debug > > b/xen/arch/riscv/Kconfig.debug > > index e69de29bb2..608c9ff832 100644 > > --- a/xen/arch/riscv/Kconfig.debug > > +++ b/xen/arch/riscv/Kconfig.debug > > @@ -0,0 +1,5 @@ > > +config EARLY_PRINTK > > + bool "Enable early printk" > > + default DEBUG > > + help > > + Enables early printk debug messages > > diff --git a/xen/arch/riscv/Makefile b/xen/arch/riscv/Makefile > > index fd916e1004..1a4f1a6015 100644 > > --- a/xen/arch/riscv/Makefile > > +++ b/xen/arch/riscv/Makefile > > @@ -1,3 +1,4 @@ > > +obj-$(CONFIG_EARLY_PRINTK) += early_printk.o > > obj-$(CONFIG_RISCV_64) += riscv64/ > > obj-y += sbi.o > > obj-y += setup.o > > diff --git a/xen/arch/riscv/early_printk.c > > b/xen/arch/riscv/early_printk.c > > new file mode 100644 > > index 0000000000..b66a11f1bc > > --- /dev/null > > +++ b/xen/arch/riscv/early_printk.c > > @@ -0,0 +1,33 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > +/* > > + * RISC-V early printk using SBI > > + * > > + * Copyright (C) 2021 Bobby Eshleman <bobbyeshleman@xxxxxxxxx> > > + */ > > +#include <asm/early_printk.h> > > +#include <asm/sbi.h> > > + > > +/* > > + * TODO: > > + * sbi_console_putchar is already planned for deprecation > > + * so it should be reworked to use UART directly. > > +*/ > > +void early_puts(const char *s, size_t nr) > > +{ > > + while ( nr-- > 0 ) > > + { > > + if ( *s == '\n' ) > > + sbi_console_putchar('\r'); > > + sbi_console_putchar(*s); > > + s++; > > + } > > +} > > + > > +void early_printk(const char *str) > > +{ > > + while ( *str ) > > + { > > + early_puts(str, 1); > > + str++; > > + } > > +} > > diff --git a/xen/arch/riscv/include/asm/early_printk.h > > b/xen/arch/riscv/include/asm/early_printk.h > > new file mode 100644 > > index 0000000000..05106e160d > > --- /dev/null > > +++ b/xen/arch/riscv/include/asm/early_printk.h > > @@ -0,0 +1,12 @@ > > +#ifndef __EARLY_PRINTK_H__ > > +#define __EARLY_PRINTK_H__ > > + > > +#include <xen/early_printk.h> > > + > > +#ifdef CONFIG_EARLY_PRINTK > > +void early_printk(const char *str); > > +#else > > +static inline void early_printk(const char *s) {}; > > +#endif > > + > > +#endif /* __EARLY_PRINTK_H__ */ > > diff --git a/xen/arch/riscv/setup.c b/xen/arch/riscv/setup.c > > index 13e24e2fe1..d09ffe1454 100644 > > --- a/xen/arch/riscv/setup.c > > +++ b/xen/arch/riscv/setup.c > > @@ -1,12 +1,16 @@ > > #include <xen/compile.h> > > #include <xen/init.h> > > > > +#include <asm/early_printk.h> > > + > > /* Xen stack for bringing up the first CPU. */ > > unsigned char __initdata cpu0_boot_stack[STACK_SIZE] > > __aligned(STACK_SIZE); > > > > void __init noreturn start_xen(void) > > { > > + early_printk("Hello from C env\n"); > > + > > for ( ;; ) > > asm volatile ("wfi"); > > > >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |