Message ID | 20230731224106.292845-1-keithp@keithp.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | target/nios2: Pass semihosting arg to exit | expand |
On Mon, 31 Jul 2023 at 23:42, Keith Packard via <qemu-devel@nongnu.org> wrote: > > Instead of using the function number (which is always zero), fetch the > application-provided exit code argument and pass that to the two exit > functions. > > Signed-off-by: Keith Packard <keithp@keithp.com> > --- > target/nios2/nios2-semi.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/target/nios2/nios2-semi.c b/target/nios2/nios2-semi.c > index 3738774976..ffd1f095f6 100644 > --- a/target/nios2/nios2-semi.c > +++ b/target/nios2/nios2-semi.c > @@ -133,8 +133,9 @@ void do_nios2_semihosting(CPUNios2State *env) > args = env->regs[R_ARG1]; > switch (nr) { > case HOSTED_EXIT: > - gdb_exit(env->regs[R_ARG0]); > - exit(env->regs[R_ARG0]); > + GET_ARG(0); > + gdb_exit(arg0); > + exit(arg0); The spec https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=blob;f=libgloss/nios2/nios2-semi.txt;hb=HEAD says that for HOSTED_EXIT the exit code is in r5, not in a parameter block pointed to by r5. That would imply that the correct change is to use R_ARG1 rather than R_ARG0 here. thanks -- PMM
> says that for HOSTED_EXIT the exit code is in r5, > not in a parameter block pointed to by r5. That > would imply that the correct change is to use > R_ARG1 rather than R_ARG0 here. Ah, thanks -- I hadn't managed to find the actual standard yet. I'll resubmit with that fixed.
On Tue, 1 Aug 2023 at 16:10, Keith Packard <keithp@keithp.com> wrote: > > > > says that for HOSTED_EXIT the exit code is in r5, > > not in a parameter block pointed to by r5. That > > would imply that the correct change is to use > > R_ARG1 rather than R_ARG0 here. > > Ah, thanks -- I hadn't managed to find the actual standard yet. Yeah, the closest to a "standard" we have for nios2 is that I asked the Codesourcery folks to document it in the libgloss sources and put the URL to it in a comment at the top of nios2-semi.c, given that there's no official spec and the original and main guest-side user is libgloss. m68k is in a similar position only without the URL in our source file :-) -- PMM
> Yeah, the closest to a "standard" we have for nios2 is that > I asked the Codesourcery folks to document it in the libgloss > sources and put the URL to it in a comment at the top of > nios2-semi.c, given that there's no official spec and the > original and main guest-side user is libgloss. > m68k is in a similar position only without the URL > in our source file :-) Yeah, we had the same ask when getting risc-v semihosting merged. For that, I actually pushed through an "official" risc-v standard. I kinda wish I'd used the m68k model instead of the arm model as that provides simple POSIX semantics... https://github.com/riscv-software-src/riscv-semihosting/blob/main/riscv-semihosting-spec.adoc
On Tue, 1 Aug 2023 at 16:28, Keith Packard <keithp@keithp.com> wrote: > > > > Yeah, the closest to a "standard" we have for nios2 is that > > I asked the Codesourcery folks to document it in the libgloss > > sources and put the URL to it in a comment at the top of > > nios2-semi.c, given that there's no official spec and the > > original and main guest-side user is libgloss. > > m68k is in a similar position only without the URL > > in our source file :-) > > Yeah, we had the same ask when getting risc-v semihosting merged. For > that, I actually pushed through an "official" risc-v standard. I kinda > wish I'd used the m68k model instead of the arm model as that provides > simple POSIX semantics... Yeah, there's a lot of stuff in the Arm semihosting API that I wouldn't put in there for a from-new version that didn't need to handle legacy guests. Notably the "errno" concept is badly underspecified and/or broken. On an architecture with a decent number of registers it would probably also make sense to use them rather than having every single call put its args in memory. thanks -- PMM
diff --git a/target/nios2/nios2-semi.c b/target/nios2/nios2-semi.c index 3738774976..ffd1f095f6 100644 --- a/target/nios2/nios2-semi.c +++ b/target/nios2/nios2-semi.c @@ -133,8 +133,9 @@ void do_nios2_semihosting(CPUNios2State *env) args = env->regs[R_ARG1]; switch (nr) { case HOSTED_EXIT: - gdb_exit(env->regs[R_ARG0]); - exit(env->regs[R_ARG0]); + GET_ARG(0); + gdb_exit(arg0); + exit(arg0); case HOSTED_OPEN: GET_ARG(0);
Instead of using the function number (which is always zero), fetch the application-provided exit code argument and pass that to the two exit functions. Signed-off-by: Keith Packard <keithp@keithp.com> --- target/nios2/nios2-semi.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)