* [kvm-unit-tests PATCH] riscv: lib: sbi_shutdown add exit code.
@ 2025-06-20 15:50 Jesse Taube
2025-06-23 17:01 ` Andrew Jones
0 siblings, 1 reply; 4+ messages in thread
From: Jesse Taube @ 2025-06-20 15:50 UTC (permalink / raw)
To: kvm, kvm-riscv, linux-kselftest
Cc: Clément Léger, Charlie Jenkins, Jesse Taube,
Andrew Jones, James Raphael Tiovalen, Sean Christopherson,
Cade Richard
When exiting it may be useful for the sbi implementation to know the
exit code.
Add exit code to sbi_shutdown, and use it in exit().
Signed-off-by: Jesse Taube <jesse@rivosinc.com>
---
lib/riscv/asm/sbi.h | 2 +-
lib/riscv/io.c | 2 +-
lib/riscv/sbi.c | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/lib/riscv/asm/sbi.h b/lib/riscv/asm/sbi.h
index a5738a5c..de11c109 100644
--- a/lib/riscv/asm/sbi.h
+++ b/lib/riscv/asm/sbi.h
@@ -250,7 +250,7 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
unsigned long arg3, unsigned long arg4,
unsigned long arg5);
-void sbi_shutdown(void);
+void sbi_shutdown(unsigned int code);
struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp);
struct sbiret sbi_hart_stop(void);
struct sbiret sbi_hart_get_status(unsigned long hartid);
diff --git a/lib/riscv/io.c b/lib/riscv/io.c
index fb40adb7..02231268 100644
--- a/lib/riscv/io.c
+++ b/lib/riscv/io.c
@@ -150,7 +150,7 @@ void halt(int code);
void exit(int code)
{
printf("\nEXIT: STATUS=%d\n", ((code) << 1) | 1);
- sbi_shutdown();
+ sbi_shutdown(code & 1);
halt(code);
__builtin_unreachable();
}
diff --git a/lib/riscv/sbi.c b/lib/riscv/sbi.c
index 2959378f..9dd11e9d 100644
--- a/lib/riscv/sbi.c
+++ b/lib/riscv/sbi.c
@@ -107,9 +107,9 @@ struct sbiret sbi_sse_inject(unsigned long event_id, unsigned long hart_id)
return sbi_ecall(SBI_EXT_SSE, SBI_EXT_SSE_INJECT, event_id, hart_id, 0, 0, 0, 0);
}
-void sbi_shutdown(void)
+void sbi_shutdown(unsigned int code)
{
- sbi_ecall(SBI_EXT_SRST, 0, 0, 0, 0, 0, 0, 0);
+ sbi_ecall(SBI_EXT_SRST, 0, 0, code, 0, 0, 0, 0);
puts("SBI shutdown failed!\n");
}
--
2.43.0
--
kvm-riscv mailing list
kvm-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kvm-riscv
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [kvm-unit-tests PATCH] riscv: lib: sbi_shutdown add exit code.
2025-06-20 15:50 [kvm-unit-tests PATCH] riscv: lib: sbi_shutdown add exit code Jesse Taube
@ 2025-06-23 17:01 ` Andrew Jones
2025-06-23 22:46 ` Jesse Taube
0 siblings, 1 reply; 4+ messages in thread
From: Andrew Jones @ 2025-06-23 17:01 UTC (permalink / raw)
To: Jesse Taube
Cc: kvm, kvm-riscv, linux-kselftest, Clément Léger,
Charlie Jenkins, James Raphael Tiovalen, Sean Christopherson,
Cade Richard
On Fri, Jun 20, 2025 at 08:50:51AM -0700, Jesse Taube wrote:
> When exiting it may be useful for the sbi implementation to know the
> exit code.
> Add exit code to sbi_shutdown, and use it in exit().
>
> Signed-off-by: Jesse Taube <jesse@rivosinc.com>
> ---
> lib/riscv/asm/sbi.h | 2 +-
> lib/riscv/io.c | 2 +-
> lib/riscv/sbi.c | 4 ++--
> 3 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/lib/riscv/asm/sbi.h b/lib/riscv/asm/sbi.h
> index a5738a5c..de11c109 100644
> --- a/lib/riscv/asm/sbi.h
> +++ b/lib/riscv/asm/sbi.h
> @@ -250,7 +250,7 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
> unsigned long arg3, unsigned long arg4,
> unsigned long arg5);
>
> -void sbi_shutdown(void);
> +void sbi_shutdown(unsigned int code);
> struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp);
> struct sbiret sbi_hart_stop(void);
> struct sbiret sbi_hart_get_status(unsigned long hartid);
> diff --git a/lib/riscv/io.c b/lib/riscv/io.c
> index fb40adb7..02231268 100644
> --- a/lib/riscv/io.c
> +++ b/lib/riscv/io.c
> @@ -150,7 +150,7 @@ void halt(int code);
> void exit(int code)
> {
> printf("\nEXIT: STATUS=%d\n", ((code) << 1) | 1);
> - sbi_shutdown();
> + sbi_shutdown(code & 1);
> halt(code);
> __builtin_unreachable();
> }
> diff --git a/lib/riscv/sbi.c b/lib/riscv/sbi.c
> index 2959378f..9dd11e9d 100644
> --- a/lib/riscv/sbi.c
> +++ b/lib/riscv/sbi.c
> @@ -107,9 +107,9 @@ struct sbiret sbi_sse_inject(unsigned long event_id, unsigned long hart_id)
> return sbi_ecall(SBI_EXT_SSE, SBI_EXT_SSE_INJECT, event_id, hart_id, 0, 0, 0, 0);
> }
>
> -void sbi_shutdown(void)
> +void sbi_shutdown(unsigned int code)
> {
> - sbi_ecall(SBI_EXT_SRST, 0, 0, 0, 0, 0, 0, 0);
> + sbi_ecall(SBI_EXT_SRST, 0, 0, code, 0, 0, 0, 0);
We can't do this because a kvm-unit-tests exit code is not an
SRST::reset_reason[1]. This could result in the SBI implementation
returning an error, or doing something else, rather than shutting
down.
If this is a custom kvm-unit-tests-specific SBI implementation, then
we could pass in a reset_reason in the 0xE0000000 - 0xEFFFFFFF range.
[1] https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/src/ext-sys-reset.adoc#table_srst_system_reset_reasons
Thanks,
drew
> puts("SBI shutdown failed!\n");
> }
>
> --
> 2.43.0
>
>
> --
> kvm-riscv mailing list
> kvm-riscv@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kvm-riscv
--
kvm-riscv mailing list
kvm-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kvm-riscv
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [kvm-unit-tests PATCH] riscv: lib: sbi_shutdown add exit code.
2025-06-23 17:01 ` Andrew Jones
@ 2025-06-23 22:46 ` Jesse Taube
2025-06-24 8:41 ` Andrew Jones
0 siblings, 1 reply; 4+ messages in thread
From: Jesse Taube @ 2025-06-23 22:46 UTC (permalink / raw)
To: Andrew Jones
Cc: kvm, kvm-riscv, linux-kselftest, Clément Léger,
Charlie Jenkins, James Raphael Tiovalen, Sean Christopherson,
Cade Richard
On Mon, Jun 23, 2025 at 10:01 AM Andrew Jones <andrew.jones@linux.dev> wrote:
>
> On Fri, Jun 20, 2025 at 08:50:51AM -0700, Jesse Taube wrote:
> > When exiting it may be useful for the sbi implementation to know the
> > exit code.
> > Add exit code to sbi_shutdown, and use it in exit().
> >
> > Signed-off-by: Jesse Taube <jesse@rivosinc.com>
> > ---
> > lib/riscv/asm/sbi.h | 2 +-
> > lib/riscv/io.c | 2 +-
> > lib/riscv/sbi.c | 4 ++--
> > 3 files changed, 4 insertions(+), 4 deletions(-)
> >
> > diff --git a/lib/riscv/asm/sbi.h b/lib/riscv/asm/sbi.h
> > index a5738a5c..de11c109 100644
> > --- a/lib/riscv/asm/sbi.h
> > +++ b/lib/riscv/asm/sbi.h
> > @@ -250,7 +250,7 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
> > unsigned long arg3, unsigned long arg4,
> > unsigned long arg5);
> >
> > -void sbi_shutdown(void);
> > +void sbi_shutdown(unsigned int code);
> > struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp);
> > struct sbiret sbi_hart_stop(void);
> > struct sbiret sbi_hart_get_status(unsigned long hartid);
> > diff --git a/lib/riscv/io.c b/lib/riscv/io.c
> > index fb40adb7..02231268 100644
> > --- a/lib/riscv/io.c
> > +++ b/lib/riscv/io.c
> > @@ -150,7 +150,7 @@ void halt(int code);
> > void exit(int code)
> > {
> > printf("\nEXIT: STATUS=%d\n", ((code) << 1) | 1);
> > - sbi_shutdown();
> > + sbi_shutdown(code & 1);
> > halt(code);
> > __builtin_unreachable();
> > }
> > diff --git a/lib/riscv/sbi.c b/lib/riscv/sbi.c
> > index 2959378f..9dd11e9d 100644
> > --- a/lib/riscv/sbi.c
> > +++ b/lib/riscv/sbi.c
> > @@ -107,9 +107,9 @@ struct sbiret sbi_sse_inject(unsigned long event_id, unsigned long hart_id)
> > return sbi_ecall(SBI_EXT_SSE, SBI_EXT_SSE_INJECT, event_id, hart_id, 0, 0, 0, 0);
> > }
> >
> > -void sbi_shutdown(void)
> > +void sbi_shutdown(unsigned int code)
> > {
> > - sbi_ecall(SBI_EXT_SRST, 0, 0, 0, 0, 0, 0, 0);
> > + sbi_ecall(SBI_EXT_SRST, 0, 0, code, 0, 0, 0, 0);
>
> We can't do this because a kvm-unit-tests exit code is not an
> SRST::reset_reason[1]. This could result in the SBI implementation
> returning an error, or doing something else, rather than shutting
> down.
Yes that's why there is:
+sbi_shutdown(code & 1);
Admittedly it should probably be:
+sbi_shutdown(!!code);
>
> If this is a custom kvm-unit-tests-specific SBI implementation, then
> we could pass in a reset_reason in the 0xE0000000 - 0xEFFFFFFF range.
That still doesn't guarantee it to succeed.
In the exit function we can add a fallback like `sbi_shutdown(0);`,
but reason code 1 (System failure) should always work.
If anyone wants to use it for SBI specific codes, that's fine,
but I only added it for the No reason and System failure exit codes.
Thanks,
Jesse Taube.
>
> [1] https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/src/ext-sys-reset.adoc#table_srst_system_reset_reasons
>
> Thanks,
> drew
>
>
> > puts("SBI shutdown failed!\n");
> > }
> >
> > --
> > 2.43.0
> >
> >
> > --
> > kvm-riscv mailing list
> > kvm-riscv@lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/kvm-riscv
--
kvm-riscv mailing list
kvm-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kvm-riscv
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [kvm-unit-tests PATCH] riscv: lib: sbi_shutdown add exit code.
2025-06-23 22:46 ` Jesse Taube
@ 2025-06-24 8:41 ` Andrew Jones
0 siblings, 0 replies; 4+ messages in thread
From: Andrew Jones @ 2025-06-24 8:41 UTC (permalink / raw)
To: Jesse Taube
Cc: kvm, kvm-riscv, linux-kselftest, Clément Léger,
Charlie Jenkins, James Raphael Tiovalen, Sean Christopherson,
Cade Richard
On Mon, Jun 23, 2025 at 03:46:31PM -0700, Jesse Taube wrote:
> On Mon, Jun 23, 2025 at 10:01 AM Andrew Jones <andrew.jones@linux.dev> wrote:
> >
> > On Fri, Jun 20, 2025 at 08:50:51AM -0700, Jesse Taube wrote:
> > > When exiting it may be useful for the sbi implementation to know the
> > > exit code.
> > > Add exit code to sbi_shutdown, and use it in exit().
> > >
> > > Signed-off-by: Jesse Taube <jesse@rivosinc.com>
> > > ---
> > > lib/riscv/asm/sbi.h | 2 +-
> > > lib/riscv/io.c | 2 +-
> > > lib/riscv/sbi.c | 4 ++--
> > > 3 files changed, 4 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/lib/riscv/asm/sbi.h b/lib/riscv/asm/sbi.h
> > > index a5738a5c..de11c109 100644
> > > --- a/lib/riscv/asm/sbi.h
> > > +++ b/lib/riscv/asm/sbi.h
> > > @@ -250,7 +250,7 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
> > > unsigned long arg3, unsigned long arg4,
> > > unsigned long arg5);
> > >
> > > -void sbi_shutdown(void);
> > > +void sbi_shutdown(unsigned int code);
> > > struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp);
> > > struct sbiret sbi_hart_stop(void);
> > > struct sbiret sbi_hart_get_status(unsigned long hartid);
> > > diff --git a/lib/riscv/io.c b/lib/riscv/io.c
> > > index fb40adb7..02231268 100644
> > > --- a/lib/riscv/io.c
> > > +++ b/lib/riscv/io.c
> > > @@ -150,7 +150,7 @@ void halt(int code);
> > > void exit(int code)
> > > {
> > > printf("\nEXIT: STATUS=%d\n", ((code) << 1) | 1);
> > > - sbi_shutdown();
> > > + sbi_shutdown(code & 1);
> > > halt(code);
> > > __builtin_unreachable();
> > > }
> > > diff --git a/lib/riscv/sbi.c b/lib/riscv/sbi.c
> > > index 2959378f..9dd11e9d 100644
> > > --- a/lib/riscv/sbi.c
> > > +++ b/lib/riscv/sbi.c
> > > @@ -107,9 +107,9 @@ struct sbiret sbi_sse_inject(unsigned long event_id, unsigned long hart_id)
> > > return sbi_ecall(SBI_EXT_SSE, SBI_EXT_SSE_INJECT, event_id, hart_id, 0, 0, 0, 0);
> > > }
> > >
> > > -void sbi_shutdown(void)
> > > +void sbi_shutdown(unsigned int code)
> > > {
> > > - sbi_ecall(SBI_EXT_SRST, 0, 0, 0, 0, 0, 0, 0);
> > > + sbi_ecall(SBI_EXT_SRST, 0, 0, code, 0, 0, 0, 0);
> >
> > We can't do this because a kvm-unit-tests exit code is not an
> > SRST::reset_reason[1]. This could result in the SBI implementation
> > returning an error, or doing something else, rather than shutting
> > down.
>
> Yes that's why there is:
> +sbi_shutdown(code & 1);
Ah, I overlooked that.
> Admittedly it should probably be:
> +sbi_shutdown(!!code);
Indeed, it would only work now because bit 0 is set in the abort
exit code.
>
> >
> > If this is a custom kvm-unit-tests-specific SBI implementation, then
> > we could pass in a reset_reason in the 0xE0000000 - 0xEFFFFFFF range.
>
> That still doesn't guarantee it to succeed.
> In the exit function we can add a fallback like `sbi_shutdown(0);`,
> but reason code 1 (System failure) should always work.
> If anyone wants to use it for SBI specific codes, that's fine,
> but I only added it for the No reason and System failure exit codes.
Yup, I see now that the intention is just to say success/failure, not
pass down the actual exit code. The commit message says exit code,
though, which is why I didn't read the patch closely.
Please send a v2 with the !! change and a change to the commit message.
Thanks,
drew
--
kvm-riscv mailing list
kvm-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kvm-riscv
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-06-24 8:59 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-20 15:50 [kvm-unit-tests PATCH] riscv: lib: sbi_shutdown add exit code Jesse Taube
2025-06-23 17:01 ` Andrew Jones
2025-06-23 22:46 ` Jesse Taube
2025-06-24 8:41 ` Andrew Jones
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).