diff mbox series

[v2,01/15] target/arm/arm-semi: Capture errno in softmmu version of set_swi_errno()

Message ID 20190916141544.17540-2-peter.maydell@linaro.org
State Superseded
Headers show
Series target/arm: Implement semihosting v2.0 | expand

Commit Message

Peter Maydell Sept. 16, 2019, 2:15 p.m. UTC
The set_swi_errno() function is called to capture the errno
from a host system call, so that we can return -1 from the
semihosting function and later allow the guest to get a more
specific error code with the SYS_ERRNO function. It comes in
two versions, one for user-only and one for softmmu. We forgot
to capture the errno in the softmmu version; fix the error.

(Semihosting calls directed to gdb are unaffected because
they go through a different code path that captures the
error return from the gdbstub call in arm_semi_cb() or
arm_semi_flen_cb().)

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

---
NB that a later commit will put in some cleanup of TaskState
that will let us reduce the duplication between the two
implementations of this function.
---
 target/arm/arm-semi.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

-- 
2.20.1

Comments

Philippe Mathieu-Daudé Oct. 3, 2019, 11:24 p.m. UTC | #1
On 9/16/19 4:15 PM, Peter Maydell wrote:
> The set_swi_errno() function is called to capture the errno

> from a host system call, so that we can return -1 from the

> semihosting function and later allow the guest to get a more

> specific error code with the SYS_ERRNO function. It comes in

> two versions, one for user-only and one for softmmu. We forgot

> to capture the errno in the softmmu version; fix the error.

> 

> (Semihosting calls directed to gdb are unaffected because

> they go through a different code path that captures the

> error return from the gdbstub call in arm_semi_cb() or

> arm_semi_flen_cb().)

> 


Fixes: 8e71621f784
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>


> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

> ---

> NB that a later commit will put in some cleanup of TaskState

> that will let us reduce the duplication between the two

> implementations of this function.

> ---

>   target/arm/arm-semi.c | 9 +++++----

>   1 file changed, 5 insertions(+), 4 deletions(-)

> 

> diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c

> index 90423a35deb..03e60105c05 100644

> --- a/target/arm/arm-semi.c

> +++ b/target/arm/arm-semi.c

> @@ -114,8 +114,13 @@ static inline uint32_t set_swi_errno(TaskState *ts, uint32_t code)

>       return code;

>   }

>   #else

> +static target_ulong syscall_err;

> +

>   static inline uint32_t set_swi_errno(CPUARMState *env, uint32_t code)

>   {

> +    if (code == (uint32_t)-1) {

> +        syscall_err = errno;

> +    }

>       return code;

>   }

>   

> @@ -124,10 +129,6 @@ static inline uint32_t set_swi_errno(CPUARMState *env, uint32_t code)

>   

>   static target_ulong arm_semi_syscall_len;

>   

> -#if !defined(CONFIG_USER_ONLY)

> -static target_ulong syscall_err;

> -#endif

> -

>   static void arm_semi_cb(CPUState *cs, target_ulong ret, target_ulong err)

>   {

>       ARMCPU *cpu = ARM_CPU(cs);

>
Peter Maydell Oct. 4, 2019, 9:50 a.m. UTC | #2
On Fri, 4 Oct 2019 at 00:24, Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>

> On 9/16/19 4:15 PM, Peter Maydell wrote:

> > The set_swi_errno() function is called to capture the errno

> > from a host system call, so that we can return -1 from the

> > semihosting function and later allow the guest to get a more

> > specific error code with the SYS_ERRNO function. It comes in

> > two versions, one for user-only and one for softmmu. We forgot

> > to capture the errno in the softmmu version; fix the error.

> >

> > (Semihosting calls directed to gdb are unaffected because

> > they go through a different code path that captures the

> > error return from the gdbstub call in arm_semi_cb() or

> > arm_semi_flen_cb().)

> >

>

> Fixes: 8e71621f784


That was the commit that added support for semihosting
to softmmu in 2007, so I don't think suggesting that this
is a 'fix' to that makes much sense. This has just been
broken forever. (It's also pretty unimportant as a bug because
the semihosting 'errno' is so ill-defined as to be unused,
I think.)

thanks
-- PMM
Richard Henderson Oct. 7, 2019, 1:36 p.m. UTC | #3
On 9/16/19 7:15 AM, Peter Maydell wrote:
> The set_swi_errno() function is called to capture the errno

> from a host system call, so that we can return -1 from the

> semihosting function and later allow the guest to get a more

> specific error code with the SYS_ERRNO function. It comes in

> two versions, one for user-only and one for softmmu. We forgot

> to capture the errno in the softmmu version; fix the error.

> 

> (Semihosting calls directed to gdb are unaffected because

> they go through a different code path that captures the

> error return from the gdbstub call in arm_semi_cb() or

> arm_semi_flen_cb().)

> 

> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

> ---

> NB that a later commit will put in some cleanup of TaskState

> that will let us reduce the duplication between the two

> implementations of this function.

> ---


Reviewed-by: Richard Henderson <richard.henderson@linaro.org>



r~
diff mbox series

Patch

diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c
index 90423a35deb..03e60105c05 100644
--- a/target/arm/arm-semi.c
+++ b/target/arm/arm-semi.c
@@ -114,8 +114,13 @@  static inline uint32_t set_swi_errno(TaskState *ts, uint32_t code)
     return code;
 }
 #else
+static target_ulong syscall_err;
+
 static inline uint32_t set_swi_errno(CPUARMState *env, uint32_t code)
 {
+    if (code == (uint32_t)-1) {
+        syscall_err = errno;
+    }
     return code;
 }
 
@@ -124,10 +129,6 @@  static inline uint32_t set_swi_errno(CPUARMState *env, uint32_t code)
 
 static target_ulong arm_semi_syscall_len;
 
-#if !defined(CONFIG_USER_ONLY)
-static target_ulong syscall_err;
-#endif
-
 static void arm_semi_cb(CPUState *cs, target_ulong ret, target_ulong err)
 {
     ARMCPU *cpu = ARM_CPU(cs);