diff mbox series

[05/22] bsd-user/arm/target_arch_cpu.h: Only support FreeBSD sys calls

Message ID 20220201111455.52511-6-imp@bsdimp.com (mailing list archive)
State New, archived
Headers show
Series bsd-user: Start upstreaming the system calls. | expand

Commit Message

Warner Losh Feb. 1, 2022, 11:14 a.m. UTC
Since we don't build on OpenBSD, only do FreeBSD system calls here. In
the future, we'll need to move this to some place like
bsd-user/freebsd/arm/mumble.h, but until then just leave this
inline. This reflects changes to the upstream.

Signed-off-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/arm/target_arch_cpu.h | 139 ++++++++++++++++-----------------
 1 file changed, 66 insertions(+), 73 deletions(-)

Comments

Kyle Evans Feb. 1, 2022, 4:32 p.m. UTC | #1
On Tue, Feb 1, 2022 at 5:14 AM Warner Losh <imp@bsdimp.com> wrote:
>
> Since we don't build on OpenBSD, only do FreeBSD system calls here. In
> the future, we'll need to move this to some place like
> bsd-user/freebsd/arm/mumble.h, but until then just leave this
> inline. This reflects changes to the upstream.
>
> Signed-off-by: Warner Losh <imp@bsdimp.com>
> ---
>  bsd-user/arm/target_arch_cpu.h | 139 ++++++++++++++++-----------------
>  1 file changed, 66 insertions(+), 73 deletions(-)
>
> diff --git a/bsd-user/arm/target_arch_cpu.h b/bsd-user/arm/target_arch_cpu.h
> index b087db48fa4..afb7814a8d1 100644
> --- a/bsd-user/arm/target_arch_cpu.h
> +++ b/bsd-user/arm/target_arch_cpu.h
> @@ -40,7 +40,6 @@ static inline void target_cpu_init(CPUARMState *env,
>  static inline void target_cpu_loop(CPUARMState *env)
>  {
>      int trapnr, si_signo, si_code;
> -    unsigned int n;
>      CPUState *cs = env_cpu(env);
>
>      for (;;) {
> @@ -66,82 +65,76 @@ static inline void target_cpu_loop(CPUARMState *env)
>              break;
>          case EXCP_SWI:
>              {
> -                n = env->regs[7];
> -                if (bsd_type == target_freebsd) {
> -                    int ret;
> -                    abi_ulong params = get_sp_from_cpustate(env);
> -                    int32_t syscall_nr = n;
> -                    int32_t arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8;
> +                int ret;
> +                abi_ulong params = get_sp_from_cpustate(env);
> +                int32_t syscall_nr = env->regs[7];
> +                int32_t arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8;
>
> -                    /* See arm/arm/syscall.c cpu_fetch_syscall_args() */
> -                    if (syscall_nr == TARGET_FREEBSD_NR_syscall) {
> -                        syscall_nr = env->regs[0];
> -                        arg1 = env->regs[1];
> -                        arg2 = env->regs[2];
> -                        arg3 = env->regs[3];
> -                        get_user_s32(arg4, params);
> -                        params += sizeof(int32_t);
> -                        get_user_s32(arg5, params);
> -                        params += sizeof(int32_t);
> -                        get_user_s32(arg6, params);
> -                        params += sizeof(int32_t);
> -                        get_user_s32(arg7, params);
> -                        arg8 = 0;
> -                    } else if (syscall_nr == TARGET_FREEBSD_NR___syscall) {
> -                        syscall_nr = env->regs[0];
> -                        arg1 = env->regs[2];
> -                        arg2 = env->regs[3];
> -                        get_user_s32(arg3, params);
> -                        params += sizeof(int32_t);
> -                        get_user_s32(arg4, params);
> -                        params += sizeof(int32_t);
> -                        get_user_s32(arg5, params);
> -                        params += sizeof(int32_t);
> -                        get_user_s32(arg6, params);
> -                        arg7 = 0;
> -                        arg8 = 0;
> -                    } else {
> -                        arg1 = env->regs[0];
> -                        arg2 = env->regs[1];
> -                        arg3 = env->regs[2];
> -                        arg4 = env->regs[3];
> -                        get_user_s32(arg5, params);
> -                        params += sizeof(int32_t);
> -                        get_user_s32(arg6, params);
> -                        params += sizeof(int32_t);
> -                        get_user_s32(arg7, params);
> -                        params += sizeof(int32_t);
> -                        get_user_s32(arg8, params);
> -                    }
> -                    ret = do_freebsd_syscall(env, syscall_nr, arg1, arg2, arg3,
> -                            arg4, arg5, arg6, arg7, arg8);
> +                /* See arm/arm/syscall.c cpu_fetch_syscall_args() */
> +                if (syscall_nr == TARGET_FREEBSD_NR_syscall) {
> +                    syscall_nr = env->regs[0];
> +                    arg1 = env->regs[1];
> +                    arg2 = env->regs[2];
> +                    arg3 = env->regs[3];
> +                    get_user_s32(arg4, params);
> +                    params += sizeof(int32_t);
> +                    get_user_s32(arg5, params);
> +                    params += sizeof(int32_t);
> +                    get_user_s32(arg6, params);
> +                    params += sizeof(int32_t);
> +                    get_user_s32(arg7, params);
> +                    arg8 = 0;
> +                } else if (syscall_nr == TARGET_FREEBSD_NR___syscall) {
> +                    syscall_nr = env->regs[0];
> +                    arg1 = env->regs[2];
> +                    arg2 = env->regs[3];
> +                    get_user_s32(arg3, params);
> +                    params += sizeof(int32_t);
> +                    get_user_s32(arg4, params);
> +                    params += sizeof(int32_t);
> +                    get_user_s32(arg5, params);
> +                    params += sizeof(int32_t);
> +                    get_user_s32(arg6, params);
> +                    arg7 = 0;
> +                    arg8 = 0;
> +                } else {
> +                    arg1 = env->regs[0];
> +                    arg2 = env->regs[1];
> +                    arg3 = env->regs[2];
> +                    arg4 = env->regs[3];
> +                    get_user_s32(arg5, params);
> +                    params += sizeof(int32_t);
> +                    get_user_s32(arg6, params);
> +                    params += sizeof(int32_t);
> +                    get_user_s32(arg7, params);
> +                    params += sizeof(int32_t);
> +                    get_user_s32(arg8, params);
> +                }
> +                ret = do_freebsd_syscall(env, syscall_nr, arg1, arg2, arg3,
> +                                         arg4, arg5, arg6, arg7, arg8);
> +                /*
> +                 * Compare to arm/arm/vm_machdep.c
> +                 * cpu_set_syscall_retval()
> +                 */
> +                if (-TARGET_EJUSTRETURN == ret) {
>                      /*
> -                     * Compare to arm/arm/vm_machdep.c
> -                     * cpu_set_syscall_retval()
> +                     * Returning from a successful sigreturn syscall.
> +                     * Avoid clobbering register state.
>                       */
> -                    if (-TARGET_EJUSTRETURN == ret) {
> -                        /*
> -                         * Returning from a successful sigreturn syscall.
> -                         * Avoid clobbering register state.
> -                         */
> -                        break;
> -                    }
> -                    if (-TARGET_ERESTART == ret) {
> -                        env->regs[15] -= env->thumb ? 2 : 4;
> -                        break;
> -                    }
> -                    if ((unsigned int)ret >= (unsigned int)(-515)) {
> -                        ret = -ret;
> -                        cpsr_write(env, CPSR_C, CPSR_C, CPSRWriteByInstr);
> -                        env->regs[0] = ret;
> -                    } else {
> -                        cpsr_write(env, 0, CPSR_C, CPSRWriteByInstr);
> -                        env->regs[0] = ret; /* XXX need to handle lseek()? */
> -                        /* env->regs[1] = 0; */
> -                    }
> +                    break;
> +                }
> +                if (-TARGET_ERESTART == ret) {
> +                    env->regs[15] -= env->thumb ? 2 : 4;
> +                    break;
> +                }
> +                if ((unsigned int)ret >= (unsigned int)(-515)) {
> +                    ret = -ret;
> +                    cpsr_write(env, CPSR_C, CPSR_C, CPSRWriteByInstr);
> +                    env->regs[0] = ret;
>                  } else {
> -                    fprintf(stderr, "qemu: bsd_type (= %d) syscall "
> -                            "not supported\n", bsd_type);
> +                    cpsr_write(env, 0, CPSR_C, CPSRWriteByInstr);
> +                    env->regs[0] = ret; /* XXX need to handle lseek()? */
> +                    /* env->regs[1] = 0; */
>                  }
>              }
>              break;
>

We should probably fix the lseek() situation sooner rather than later, but:

Reviewed-by: Kyle Evans <kevans@FreeBSD.org>
Richard Henderson Feb. 1, 2022, 5:31 p.m. UTC | #2
On 2/1/22 22:14, Warner Losh wrote:
> Since we don't build on OpenBSD, only do FreeBSD system calls here. In
> the future, we'll need to move this to some place like
> bsd-user/freebsd/arm/mumble.h, but until then just leave this
> inline. This reflects changes to the upstream.
> 
> Signed-off-by: Warner Losh<imp@bsdimp.com>
> ---
>   bsd-user/arm/target_arch_cpu.h | 139 ++++++++++++++++-----------------
>   1 file changed, 66 insertions(+), 73 deletions(-)

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

r~
Warner Losh Feb. 1, 2022, 11:19 p.m. UTC | #3
On Tue, Feb 1, 2022 at 9:32 AM Kyle Evans <kevans@freebsd.org> wrote:

> On Tue, Feb 1, 2022 at 5:14 AM Warner Losh <imp@bsdimp.com> wrote:
> >
> > Since we don't build on OpenBSD, only do FreeBSD system calls here. In
> > the future, we'll need to move this to some place like
> > bsd-user/freebsd/arm/mumble.h, but until then just leave this
> > inline. This reflects changes to the upstream.
> >
> > Signed-off-by: Warner Losh <imp@bsdimp.com>
> > ---
> >  bsd-user/arm/target_arch_cpu.h | 139 ++++++++++++++++-----------------
> >  1 file changed, 66 insertions(+), 73 deletions(-)
> >
> > diff --git a/bsd-user/arm/target_arch_cpu.h
> b/bsd-user/arm/target_arch_cpu.h
> > index b087db48fa4..afb7814a8d1 100644
> > --- a/bsd-user/arm/target_arch_cpu.h
> > +++ b/bsd-user/arm/target_arch_cpu.h
> > @@ -40,7 +40,6 @@ static inline void target_cpu_init(CPUARMState *env,
> >  static inline void target_cpu_loop(CPUARMState *env)
> >  {
> >      int trapnr, si_signo, si_code;
> > -    unsigned int n;
> >      CPUState *cs = env_cpu(env);
> >
> >      for (;;) {
> > @@ -66,82 +65,76 @@ static inline void target_cpu_loop(CPUARMState *env)
> >              break;
> >          case EXCP_SWI:
> >              {
> > -                n = env->regs[7];
> > -                if (bsd_type == target_freebsd) {
> > -                    int ret;
> > -                    abi_ulong params = get_sp_from_cpustate(env);
> > -                    int32_t syscall_nr = n;
> > -                    int32_t arg1, arg2, arg3, arg4, arg5, arg6, arg7,
> arg8;
> > +                int ret;
> > +                abi_ulong params = get_sp_from_cpustate(env);
> > +                int32_t syscall_nr = env->regs[7];
> > +                int32_t arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8;
> >
> > -                    /* See arm/arm/syscall.c cpu_fetch_syscall_args() */
> > -                    if (syscall_nr == TARGET_FREEBSD_NR_syscall) {
> > -                        syscall_nr = env->regs[0];
> > -                        arg1 = env->regs[1];
> > -                        arg2 = env->regs[2];
> > -                        arg3 = env->regs[3];
> > -                        get_user_s32(arg4, params);
> > -                        params += sizeof(int32_t);
> > -                        get_user_s32(arg5, params);
> > -                        params += sizeof(int32_t);
> > -                        get_user_s32(arg6, params);
> > -                        params += sizeof(int32_t);
> > -                        get_user_s32(arg7, params);
> > -                        arg8 = 0;
> > -                    } else if (syscall_nr ==
> TARGET_FREEBSD_NR___syscall) {
> > -                        syscall_nr = env->regs[0];
> > -                        arg1 = env->regs[2];
> > -                        arg2 = env->regs[3];
> > -                        get_user_s32(arg3, params);
> > -                        params += sizeof(int32_t);
> > -                        get_user_s32(arg4, params);
> > -                        params += sizeof(int32_t);
> > -                        get_user_s32(arg5, params);
> > -                        params += sizeof(int32_t);
> > -                        get_user_s32(arg6, params);
> > -                        arg7 = 0;
> > -                        arg8 = 0;
> > -                    } else {
> > -                        arg1 = env->regs[0];
> > -                        arg2 = env->regs[1];
> > -                        arg3 = env->regs[2];
> > -                        arg4 = env->regs[3];
> > -                        get_user_s32(arg5, params);
> > -                        params += sizeof(int32_t);
> > -                        get_user_s32(arg6, params);
> > -                        params += sizeof(int32_t);
> > -                        get_user_s32(arg7, params);
> > -                        params += sizeof(int32_t);
> > -                        get_user_s32(arg8, params);
> > -                    }
> > -                    ret = do_freebsd_syscall(env, syscall_nr, arg1,
> arg2, arg3,
> > -                            arg4, arg5, arg6, arg7, arg8);
> > +                /* See arm/arm/syscall.c cpu_fetch_syscall_args() */
> > +                if (syscall_nr == TARGET_FREEBSD_NR_syscall) {
> > +                    syscall_nr = env->regs[0];
> > +                    arg1 = env->regs[1];
> > +                    arg2 = env->regs[2];
> > +                    arg3 = env->regs[3];
> > +                    get_user_s32(arg4, params);
> > +                    params += sizeof(int32_t);
> > +                    get_user_s32(arg5, params);
> > +                    params += sizeof(int32_t);
> > +                    get_user_s32(arg6, params);
> > +                    params += sizeof(int32_t);
> > +                    get_user_s32(arg7, params);
> > +                    arg8 = 0;
> > +                } else if (syscall_nr == TARGET_FREEBSD_NR___syscall) {
> > +                    syscall_nr = env->regs[0];
> > +                    arg1 = env->regs[2];
> > +                    arg2 = env->regs[3];
> > +                    get_user_s32(arg3, params);
> > +                    params += sizeof(int32_t);
> > +                    get_user_s32(arg4, params);
> > +                    params += sizeof(int32_t);
> > +                    get_user_s32(arg5, params);
> > +                    params += sizeof(int32_t);
> > +                    get_user_s32(arg6, params);
> > +                    arg7 = 0;
> > +                    arg8 = 0;
> > +                } else {
> > +                    arg1 = env->regs[0];
> > +                    arg2 = env->regs[1];
> > +                    arg3 = env->regs[2];
> > +                    arg4 = env->regs[3];
> > +                    get_user_s32(arg5, params);
> > +                    params += sizeof(int32_t);
> > +                    get_user_s32(arg6, params);
> > +                    params += sizeof(int32_t);
> > +                    get_user_s32(arg7, params);
> > +                    params += sizeof(int32_t);
> > +                    get_user_s32(arg8, params);
> > +                }
> > +                ret = do_freebsd_syscall(env, syscall_nr, arg1, arg2,
> arg3,
> > +                                         arg4, arg5, arg6, arg7, arg8);
> > +                /*
> > +                 * Compare to arm/arm/vm_machdep.c
> > +                 * cpu_set_syscall_retval()
> > +                 */
> > +                if (-TARGET_EJUSTRETURN == ret) {
> >                      /*
> > -                     * Compare to arm/arm/vm_machdep.c
> > -                     * cpu_set_syscall_retval()
> > +                     * Returning from a successful sigreturn syscall.
> > +                     * Avoid clobbering register state.
> >                       */
> > -                    if (-TARGET_EJUSTRETURN == ret) {
> > -                        /*
> > -                         * Returning from a successful sigreturn
> syscall.
> > -                         * Avoid clobbering register state.
> > -                         */
> > -                        break;
> > -                    }
> > -                    if (-TARGET_ERESTART == ret) {
> > -                        env->regs[15] -= env->thumb ? 2 : 4;
> > -                        break;
> > -                    }
> > -                    if ((unsigned int)ret >= (unsigned int)(-515)) {
> > -                        ret = -ret;
> > -                        cpsr_write(env, CPSR_C, CPSR_C,
> CPSRWriteByInstr);
> > -                        env->regs[0] = ret;
> > -                    } else {
> > -                        cpsr_write(env, 0, CPSR_C, CPSRWriteByInstr);
> > -                        env->regs[0] = ret; /* XXX need to handle
> lseek()? */
> > -                        /* env->regs[1] = 0; */
> > -                    }
> > +                    break;
> > +                }
> > +                if (-TARGET_ERESTART == ret) {
> > +                    env->regs[15] -= env->thumb ? 2 : 4;
> > +                    break;
> > +                }
> > +                if ((unsigned int)ret >= (unsigned int)(-515)) {
> > +                    ret = -ret;
> > +                    cpsr_write(env, CPSR_C, CPSR_C, CPSRWriteByInstr);
> > +                    env->regs[0] = ret;
> >                  } else {
> > -                    fprintf(stderr, "qemu: bsd_type (= %d) syscall "
> > -                            "not supported\n", bsd_type);
> > +                    cpsr_write(env, 0, CPSR_C, CPSRWriteByInstr);
> > +                    env->regs[0] = ret; /* XXX need to handle lseek()?
> */
> > +                    /* env->regs[1] = 0; */
> >                  }
> >              }
> >              break;
> >
>
> We should probably fix the lseek() situation sooner rather than later, but:
>

True, but that problem is in the fork as well... I've created a github
issue for it:
https://github.com/qemu-bsd-user/qemu-bsd-user/issues/28
but I am otherwise going to ignore it for now.

Warner


> Reviewed-by: Kyle Evans <kevans@FreeBSD.org>
>
diff mbox series

Patch

diff --git a/bsd-user/arm/target_arch_cpu.h b/bsd-user/arm/target_arch_cpu.h
index b087db48fa4..afb7814a8d1 100644
--- a/bsd-user/arm/target_arch_cpu.h
+++ b/bsd-user/arm/target_arch_cpu.h
@@ -40,7 +40,6 @@  static inline void target_cpu_init(CPUARMState *env,
 static inline void target_cpu_loop(CPUARMState *env)
 {
     int trapnr, si_signo, si_code;
-    unsigned int n;
     CPUState *cs = env_cpu(env);
 
     for (;;) {
@@ -66,82 +65,76 @@  static inline void target_cpu_loop(CPUARMState *env)
             break;
         case EXCP_SWI:
             {
-                n = env->regs[7];
-                if (bsd_type == target_freebsd) {
-                    int ret;
-                    abi_ulong params = get_sp_from_cpustate(env);
-                    int32_t syscall_nr = n;
-                    int32_t arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8;
+                int ret;
+                abi_ulong params = get_sp_from_cpustate(env);
+                int32_t syscall_nr = env->regs[7];
+                int32_t arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8;
 
-                    /* See arm/arm/syscall.c cpu_fetch_syscall_args() */
-                    if (syscall_nr == TARGET_FREEBSD_NR_syscall) {
-                        syscall_nr = env->regs[0];
-                        arg1 = env->regs[1];
-                        arg2 = env->regs[2];
-                        arg3 = env->regs[3];
-                        get_user_s32(arg4, params);
-                        params += sizeof(int32_t);
-                        get_user_s32(arg5, params);
-                        params += sizeof(int32_t);
-                        get_user_s32(arg6, params);
-                        params += sizeof(int32_t);
-                        get_user_s32(arg7, params);
-                        arg8 = 0;
-                    } else if (syscall_nr == TARGET_FREEBSD_NR___syscall) {
-                        syscall_nr = env->regs[0];
-                        arg1 = env->regs[2];
-                        arg2 = env->regs[3];
-                        get_user_s32(arg3, params);
-                        params += sizeof(int32_t);
-                        get_user_s32(arg4, params);
-                        params += sizeof(int32_t);
-                        get_user_s32(arg5, params);
-                        params += sizeof(int32_t);
-                        get_user_s32(arg6, params);
-                        arg7 = 0;
-                        arg8 = 0;
-                    } else {
-                        arg1 = env->regs[0];
-                        arg2 = env->regs[1];
-                        arg3 = env->regs[2];
-                        arg4 = env->regs[3];
-                        get_user_s32(arg5, params);
-                        params += sizeof(int32_t);
-                        get_user_s32(arg6, params);
-                        params += sizeof(int32_t);
-                        get_user_s32(arg7, params);
-                        params += sizeof(int32_t);
-                        get_user_s32(arg8, params);
-                    }
-                    ret = do_freebsd_syscall(env, syscall_nr, arg1, arg2, arg3,
-                            arg4, arg5, arg6, arg7, arg8);
+                /* See arm/arm/syscall.c cpu_fetch_syscall_args() */
+                if (syscall_nr == TARGET_FREEBSD_NR_syscall) {
+                    syscall_nr = env->regs[0];
+                    arg1 = env->regs[1];
+                    arg2 = env->regs[2];
+                    arg3 = env->regs[3];
+                    get_user_s32(arg4, params);
+                    params += sizeof(int32_t);
+                    get_user_s32(arg5, params);
+                    params += sizeof(int32_t);
+                    get_user_s32(arg6, params);
+                    params += sizeof(int32_t);
+                    get_user_s32(arg7, params);
+                    arg8 = 0;
+                } else if (syscall_nr == TARGET_FREEBSD_NR___syscall) {
+                    syscall_nr = env->regs[0];
+                    arg1 = env->regs[2];
+                    arg2 = env->regs[3];
+                    get_user_s32(arg3, params);
+                    params += sizeof(int32_t);
+                    get_user_s32(arg4, params);
+                    params += sizeof(int32_t);
+                    get_user_s32(arg5, params);
+                    params += sizeof(int32_t);
+                    get_user_s32(arg6, params);
+                    arg7 = 0;
+                    arg8 = 0;
+                } else {
+                    arg1 = env->regs[0];
+                    arg2 = env->regs[1];
+                    arg3 = env->regs[2];
+                    arg4 = env->regs[3];
+                    get_user_s32(arg5, params);
+                    params += sizeof(int32_t);
+                    get_user_s32(arg6, params);
+                    params += sizeof(int32_t);
+                    get_user_s32(arg7, params);
+                    params += sizeof(int32_t);
+                    get_user_s32(arg8, params);
+                }
+                ret = do_freebsd_syscall(env, syscall_nr, arg1, arg2, arg3,
+                                         arg4, arg5, arg6, arg7, arg8);
+                /*
+                 * Compare to arm/arm/vm_machdep.c
+                 * cpu_set_syscall_retval()
+                 */
+                if (-TARGET_EJUSTRETURN == ret) {
                     /*
-                     * Compare to arm/arm/vm_machdep.c
-                     * cpu_set_syscall_retval()
+                     * Returning from a successful sigreturn syscall.
+                     * Avoid clobbering register state.
                      */
-                    if (-TARGET_EJUSTRETURN == ret) {
-                        /*
-                         * Returning from a successful sigreturn syscall.
-                         * Avoid clobbering register state.
-                         */
-                        break;
-                    }
-                    if (-TARGET_ERESTART == ret) {
-                        env->regs[15] -= env->thumb ? 2 : 4;
-                        break;
-                    }
-                    if ((unsigned int)ret >= (unsigned int)(-515)) {
-                        ret = -ret;
-                        cpsr_write(env, CPSR_C, CPSR_C, CPSRWriteByInstr);
-                        env->regs[0] = ret;
-                    } else {
-                        cpsr_write(env, 0, CPSR_C, CPSRWriteByInstr);
-                        env->regs[0] = ret; /* XXX need to handle lseek()? */
-                        /* env->regs[1] = 0; */
-                    }
+                    break;
+                }
+                if (-TARGET_ERESTART == ret) {
+                    env->regs[15] -= env->thumb ? 2 : 4;
+                    break;
+                }
+                if ((unsigned int)ret >= (unsigned int)(-515)) {
+                    ret = -ret;
+                    cpsr_write(env, CPSR_C, CPSR_C, CPSRWriteByInstr);
+                    env->regs[0] = ret;
                 } else {
-                    fprintf(stderr, "qemu: bsd_type (= %d) syscall "
-                            "not supported\n", bsd_type);
+                    cpsr_write(env, 0, CPSR_C, CPSRWriteByInstr);
+                    env->regs[0] = ret; /* XXX need to handle lseek()? */
+                    /* env->regs[1] = 0; */
                 }
             }
             break;