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;
--
2.33.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>
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>
>
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~
© 2016 - 2026 Red Hat, Inc.