diff mbox series

[v8,1/2] xen/riscv: introduce early_printk basic stuff

Message ID 06c2c36bd68b2534c757dc4087476e855253680a.1675163330.git.oleksii.kurochko@gmail.com (mailing list archive)
State Superseded
Headers show
Series Basic early_printk and smoke test implementation | expand

Commit Message

Oleksii Jan. 31, 2023, 11:17 a.m. UTC
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/a3c9916bbdff7ad6030055bbee7e53d1aab71384)
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@gmail.com>
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
Reviewed-by: Bobby Eshleman <bobby.eshleman@gmail.com>
---
Changes in V8:
    - Nothing was changed
---
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

Comments

Julien Grall Jan. 31, 2023, 11:42 a.m. UTC | #1
Hi Oleksii,

On 31/01/2023 11:17, 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/a3c9916bbdff7ad6030055bbee7e53d1aab71384)
> 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@gmail.com>
> Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
> Reviewed-by: Bobby Eshleman <bobby.eshleman@gmail.com>
> ---
> Changes in V8:
>      - Nothing was changed
> ---
> Changes in V7:
>      - Nothing was changed
> ---
> Changes in V6:
>      - Remove __riscv_cmodel_medany check from early_printk.c

This discussion is still not resolved. I will echo Jan's point [1] and 
expand it. There is limited point to keep sending a new version for 
small changes if there main open points are not addressed.

Can you please look at settling done on the issues first and then send a 
new version?

Cheers,

[1] 1d63dd9a-77df-4fca-e35b-886ba19fb35d@suse.com
Oleksii Jan. 31, 2023, 12:37 p.m. UTC | #2
Hi Julien,

On Tue, 2023-01-31 at 11:42 +0000, Julien Grall wrote:
> Hi Oleksii,
> 
> On 31/01/2023 11:17, 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/a3c9916bbdff7ad6030055bbee7e53d
> > 1aab71384)
> > 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@gmail.com>
> > Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
> > Reviewed-by: Bobby Eshleman <bobby.eshleman@gmail.com>
> > ---
> > Changes in V8:
> >      - Nothing was changed
> > ---
> > Changes in V7:
> >      - Nothing was changed
> > ---
> > Changes in V6:
> >      - Remove __riscv_cmodel_medany check from early_printk.c
> 
> This discussion is still not resolved. I will echo Jan's point [1]
> and 
> expand it. There is limited point to keep sending a new version for 
> small changes if there main open points are not addressed.
> 
> Can you please look at settling done on the issues first and then
> send a 
> new version?
Sure, I won't provide new patch series until the issue will be
resolved.

This patch series has been sent to resolve an issue with CI&CD which I
missed after the renaming of task for RISC-V in build.yaml.

~ Oleksii
> 
> Cheers,
> 
> [1] 1d63dd9a-77df-4fca-e35b-886ba19fb35d@suse.com
>
Oleksii Feb. 7, 2023, 11:28 a.m. UTC | #3
On Tue, 2023-01-31 at 14:37 +0200, Oleksii wrote:
> Hi Julien,
> 
> On Tue, 2023-01-31 at 11:42 +0000, Julien Grall wrote:
> > Hi Oleksii,
> > 
> > On 31/01/2023 11:17, 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/a3c9916bbdff7ad6030055bbee7e53d
> > > 1aab71384)
> > > 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@gmail.com>
> > > Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
> > > Reviewed-by: Bobby Eshleman <bobby.eshleman@gmail.com>
> > > ---
> > > Changes in V8:
> > >      - Nothing was changed
> > > ---
> > > Changes in V7:
> > >      - Nothing was changed
> > > ---
> > > Changes in V6:
> > >      - Remove __riscv_cmodel_medany check from early_printk.c
> > 
> > This discussion is still not resolved. I will echo Jan's point [1]
> > and 
> > expand it. There is limited point to keep sending a new version for
> > small changes if there main open points are not addressed.
> > 
> > Can you please look at settling done on the issues first and then
> > send a 
> > new version?
> Sure, I won't provide new patch series until the issue will be
> resolved.
> 
Since Alistair and Bobby agreed that the check is needed I'll send a
new version of the patch series.

> This patch series has been sent to resolve an issue with CI&CD which
> I
> missed after the renaming of task for RISC-V in build.yaml.
> 
> ~ Oleksii
> > 
> > Cheers,
> > 
> > [1] 1d63dd9a-77df-4fca-e35b-886ba19fb35d@suse.com
> > 
> 
~ Oleksii
diff mbox series

Patch

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@gmail.com>
+ */
+#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");