All of lore.kernel.org
 help / color / mirror / Atom feed
From: Warner Losh <imp@bsdimp.com>
To: qemu-devel@nongnu.org
Cc: Warner Losh <imp@bsdimp.com>, Laurent Vivier <laurent@vivier.eu>,
	qemu-trivial@nongnu.org, Kyle Evans <kevans@freebsd.org>,
	Michael Tokarev <mjt@tls.msk.ru>, Stacey Son <sson@FreeBSD.org>,
	Klye Evans <kevans@FreeBSD.org>
Subject: [PATCH 09/24] bsd-user/arm/target_arch_cpu.h: Implement system call dispatch
Date: Tue, 19 Oct 2021 10:44:32 -0600	[thread overview]
Message-ID: <20211019164447.16359-10-imp@bsdimp.com> (raw)
In-Reply-To: <20211019164447.16359-1-imp@bsdimp.com>

Implement the system call dispatch. This implements all three kinds of
system call: direct and the two indirect variants. It handles all the
special cases for thumb as well.

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Klye Evans <kevans@FreeBSD.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/arm/target_arch_cpu.h | 95 ++++++++++++++++++++++++++++++++++
 1 file changed, 95 insertions(+)

diff --git a/bsd-user/arm/target_arch_cpu.h b/bsd-user/arm/target_arch_cpu.h
index 62d6ee89b6..bc2eb05cfe 100644
--- a/bsd-user/arm/target_arch_cpu.h
+++ b/bsd-user/arm/target_arch_cpu.h
@@ -39,6 +39,7 @@ static inline void target_cpu_loop(CPUARMState *env)
 {
     int trapnr;
     target_siginfo_t info;
+    unsigned int n;
     CPUState *cs = env_cpu(env);
 
     for (;;) {
@@ -57,6 +58,100 @@ static inline void target_cpu_loop(CPUARMState *env)
                 queue_signal(env, info.si_signo, &info);
             }
             break;
+        case EXCP_SWI:
+        case EXCP_BKPT:
+            {
+                env->eabi = 1; /* FreeBSD is eabi only now */
+                /*
+                 * system call
+                 * See arm/arm/trap.c cpu_fetch_syscall_args()
+                 */
+                if (trapnr == EXCP_BKPT) {
+                    if (env->thumb) {
+                        env->regs[15] += 2;
+                    } else {
+                        env->regs[15] += 4;
+                    }
+                }
+                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;
+
+                    /* See arm/arm/trap.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) {
+                        /*
+                         * 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; */
+                    }
+                } else {
+                    fprintf(stderr, "qemu: bsd_type (= %d) syscall "
+                            "not supported\n", bsd_type);
+                }
+            }
+            break;
         case EXCP_INTERRUPT:
             /* just indicate that signals should be handled asap */
             break;
-- 
2.32.0



WARNING: multiple messages have this Message-ID (diff)
From: Warner Losh <imp@bsdimp.com>
To: qemu-devel@nongnu.org
Cc: Stacey Son <sson@FreeBSD.org>,
	qemu-trivial@nongnu.org, Klye Evans <kevans@FreeBSD.org>,
	Michael Tokarev <mjt@tls.msk.ru>,
	Laurent Vivier <laurent@vivier.eu>, Warner Losh <imp@bsdimp.com>
Subject: [PATCH 09/24] bsd-user/arm/target_arch_cpu.h: Implement system call dispatch
Date: Tue, 19 Oct 2021 10:44:32 -0600	[thread overview]
Message-ID: <20211019164447.16359-10-imp@bsdimp.com> (raw)
In-Reply-To: <20211019164447.16359-1-imp@bsdimp.com>

Implement the system call dispatch. This implements all three kinds of
system call: direct and the two indirect variants. It handles all the
special cases for thumb as well.

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Klye Evans <kevans@FreeBSD.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/arm/target_arch_cpu.h | 95 ++++++++++++++++++++++++++++++++++
 1 file changed, 95 insertions(+)

diff --git a/bsd-user/arm/target_arch_cpu.h b/bsd-user/arm/target_arch_cpu.h
index 62d6ee89b6..bc2eb05cfe 100644
--- a/bsd-user/arm/target_arch_cpu.h
+++ b/bsd-user/arm/target_arch_cpu.h
@@ -39,6 +39,7 @@ static inline void target_cpu_loop(CPUARMState *env)
 {
     int trapnr;
     target_siginfo_t info;
+    unsigned int n;
     CPUState *cs = env_cpu(env);
 
     for (;;) {
@@ -57,6 +58,100 @@ static inline void target_cpu_loop(CPUARMState *env)
                 queue_signal(env, info.si_signo, &info);
             }
             break;
+        case EXCP_SWI:
+        case EXCP_BKPT:
+            {
+                env->eabi = 1; /* FreeBSD is eabi only now */
+                /*
+                 * system call
+                 * See arm/arm/trap.c cpu_fetch_syscall_args()
+                 */
+                if (trapnr == EXCP_BKPT) {
+                    if (env->thumb) {
+                        env->regs[15] += 2;
+                    } else {
+                        env->regs[15] += 4;
+                    }
+                }
+                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;
+
+                    /* See arm/arm/trap.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) {
+                        /*
+                         * 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; */
+                    }
+                } else {
+                    fprintf(stderr, "qemu: bsd_type (= %d) syscall "
+                            "not supported\n", bsd_type);
+                }
+            }
+            break;
         case EXCP_INTERRUPT:
             /* just indicate that signals should be handled asap */
             break;
-- 
2.32.0



  parent reply	other threads:[~2021-10-19 16:45 UTC|newest]

Thread overview: 185+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-19 16:44 [PATCH 00/24] bsd-user: arm (32-bit) support Warner Losh
2021-10-19 16:44 ` Warner Losh
2021-10-19 16:44 ` [PATCH 01/24] bsd-user/arm/target_arch_sysarch.h: Use consistent include guards Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-23  7:29   ` Kyle Evans
2021-10-23  7:29     ` Kyle Evans
2021-10-28 15:08   ` Richard Henderson
2021-10-19 16:44 ` [PATCH 02/24] bsd-user/arm/target_syscall.h: Add copyright and update name Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-23  7:30   ` Kyle Evans
2021-10-23  7:30     ` Kyle Evans
2021-10-28 15:08   ` Richard Henderson
2021-10-28 15:08     ` Richard Henderson
2021-10-19 16:44 ` [PATCH 03/24] bsd-user/arm/target_arch_cpu.c: Target specific TLS routines Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-23  7:30   ` Kyle Evans
2021-10-23  7:30     ` Kyle Evans
2021-10-28 15:08   ` Richard Henderson
2021-10-28 15:08     ` Richard Henderson
2021-10-19 16:44 ` [PATCH 04/24] bsd-user/arm/target_arch_cpu.h: CPU Loop definitions Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-23  7:31   ` Kyle Evans
2021-10-23  7:31     ` Kyle Evans
2021-10-28 15:14   ` Richard Henderson
2021-10-28 15:14     ` Richard Henderson
2021-10-28 17:36     ` Warner Losh
2021-10-28 17:36       ` Warner Losh
2021-10-19 16:44 ` [PATCH 05/24] bsd-user/arm/target_arch_cpu.h: Implement target_cpu_clone_regs Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-23  7:31   ` Kyle Evans
2021-10-23  7:31     ` Kyle Evans
2021-10-28 15:15   ` Richard Henderson
2021-10-28 15:15     ` Richard Henderson
2021-10-19 16:44 ` [PATCH 06/24] bsd-user/arm/target_arch_cpu.h: Dummy target_cpu_loop implementation Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-23  7:32   ` Kyle Evans
2021-10-23  7:32     ` Kyle Evans
2021-10-28 15:15   ` Richard Henderson
2021-10-19 16:44 ` [PATCH 07/24] bsd-user/arm/target_arch_cpu.h: Implment trivial EXCP exceptions Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  5:52   ` Kyle Evans
2021-10-26  5:52     ` Kyle Evans
2021-10-28 15:19   ` Richard Henderson
2021-10-19 16:44 ` [PATCH 08/24] bsd-user/arm/target_arch_cpu.h: Implement data abort exceptions Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  5:47   ` Kyle Evans
2021-10-26  5:47     ` Kyle Evans
2021-10-28 15:29   ` Richard Henderson
2021-10-28 15:29     ` Richard Henderson
2021-10-28 16:56     ` Warner Losh
2021-10-28 16:56       ` Warner Losh
2021-10-19 16:44 ` Warner Losh [this message]
2021-10-19 16:44   ` [PATCH 09/24] bsd-user/arm/target_arch_cpu.h: Implement system call dispatch Warner Losh
2021-10-23  7:33   ` Kyle Evans
2021-10-23  7:33     ` Kyle Evans
2021-10-23 15:17     ` Warner Losh
2021-10-23 15:17       ` Warner Losh
2021-10-28 15:35   ` Richard Henderson
2021-10-28 15:35     ` Richard Henderson
2021-10-28 17:56     ` Warner Losh
2021-10-28 17:56       ` Warner Losh
2021-10-19 16:44 ` [PATCH 10/24] bsd-user/arm/target_arch_reg.h: Implement core dump register copying Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  5:48   ` Kyle Evans
2021-10-26  5:48     ` Kyle Evans
2021-10-28 15:36   ` Richard Henderson
2021-10-28 15:36     ` Richard Henderson
2021-10-19 16:44 ` [PATCH 11/24] bsd-user/arm/target_arch_vmparam.h: Parameters for arm address space Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  5:52   ` Kyle Evans
2021-10-26  5:52     ` Kyle Evans
2021-10-28 15:37   ` Richard Henderson
2021-10-28 15:37     ` Richard Henderson
2021-10-19 16:44 ` [PATCH 12/24] bsd-user/arm/target_arch_sigtramp.h: Signal Trampoline for arm Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  5:51   ` Kyle Evans
2021-10-26  5:51     ` Kyle Evans
2021-10-28 15:42   ` Richard Henderson
2021-10-28 15:42     ` Richard Henderson
2021-10-28 19:35     ` Warner Losh
2021-10-28 19:35       ` Warner Losh
2021-10-19 16:44 ` [PATCH 13/24] bsd-user/arm/target_arch_thread.h: Routines to create and switch to a thread Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  6:01   ` Kyle Evans
2021-10-26  6:01     ` Kyle Evans
2021-10-26  6:11     ` Kyle Evans
2021-10-26  6:11       ` Kyle Evans
2021-10-27 15:35       ` Warner Losh
2021-10-27 15:35         ` Warner Losh
2021-10-27 15:40         ` Kyle Evans
2021-10-27 15:40           ` Kyle Evans
2021-10-28 15:57   ` Richard Henderson
2021-10-28 15:57     ` Richard Henderson
2021-10-28 19:45     ` Warner Losh
2021-10-28 19:45       ` Warner Losh
2021-10-29 16:06       ` Richard Henderson
2021-10-29 16:06         ` Richard Henderson
2021-10-19 16:44 ` [PATCH 14/24] bsd-user/arm/target_arch_elf.h: arm defines for ELF Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  6:07   ` Kyle Evans
2021-10-26  6:07     ` Kyle Evans
2021-10-28 16:02   ` Richard Henderson
2021-10-28 16:02     ` Richard Henderson
2021-10-19 16:44 ` [PATCH 15/24] bsd-user/arm/target_arch_elf.h: arm get hwcap Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  6:02   ` Kyle Evans
2021-10-26  6:02     ` Kyle Evans
2021-10-28 16:06   ` Richard Henderson
2021-10-28 16:06     ` Richard Henderson
2021-10-19 16:44 ` [PATCH 16/24] bsd-user/arm/target_arch_elf.h: arm get_hwcap2 impl Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  6:02   ` Kyle Evans
2021-10-26  6:02     ` Kyle Evans
2021-10-28 16:08   ` Richard Henderson
2021-10-19 16:44 ` [PATCH 17/24] bsd-user/arm/target_arch_signal.h: arm specific signal registers and stack Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  6:03   ` Kyle Evans
2021-10-26  6:03     ` Kyle Evans
2021-10-28 16:18   ` Richard Henderson
2021-10-28 16:18     ` Richard Henderson
2021-10-28 16:48     ` Warner Losh
2021-10-28 16:48       ` Warner Losh
2021-10-19 16:44 ` [PATCH 18/24] bsd-user/arm/target_arch_signal.h: arm machine context for signals Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  6:03   ` Kyle Evans
2021-10-26  6:03     ` Kyle Evans
2021-10-28 17:04   ` Richard Henderson
2021-10-28 17:04     ` Richard Henderson
2021-10-28 17:18   ` Richard Henderson
2021-10-28 17:18     ` Richard Henderson
2021-10-28 20:16     ` Warner Losh
2021-10-28 20:16       ` Warner Losh
2021-10-19 16:44 ` [PATCH 19/24] bsd-user/arm/target_arch_signal.h: arm user context and trapframe " Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  6:07   ` Kyle Evans
2021-10-26  6:07     ` Kyle Evans
2021-10-27 15:48     ` Warner Losh
2021-10-27 15:48       ` Warner Losh
2021-10-28 17:22   ` Richard Henderson
2021-10-28 17:22     ` Richard Henderson
2021-10-30  2:44     ` Warner Losh
2021-10-30  2:44       ` Warner Losh
2021-10-19 16:44 ` [PATCH 20/24] bsd-user/arm/target_arch_signal.h: arm set_sigtramp_args Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  6:10   ` Kyle Evans
2021-10-26  6:10     ` Kyle Evans
2021-10-28 17:25   ` Richard Henderson
2021-10-28 17:25     ` Richard Henderson
2021-10-28 17:35     ` Kyle Evans
2021-10-28 17:35       ` Kyle Evans
2021-10-28 22:22       ` Warner Losh
2021-10-28 22:22         ` Warner Losh
2021-10-28 22:41     ` Warner Losh
2021-10-28 22:41       ` Warner Losh
2021-10-30  2:47       ` Warner Losh
2021-10-30  2:47         ` Warner Losh
2021-10-19 16:44 ` [PATCH 21/24] bsd-user/arm/target_arch_signal.h: arm get_mcontext Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  6:08   ` Kyle Evans
2021-10-26  6:08     ` Kyle Evans
2021-10-28 17:27   ` Richard Henderson
2021-10-28 17:27     ` Richard Henderson
2021-10-19 16:44 ` [PATCH 22/24] bsd-user/arm/target_arch_signal.h: arm set_mcontext Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  6:12   ` Kyle Evans
2021-10-26  6:12     ` Kyle Evans
2021-10-28 17:53   ` Richard Henderson
2021-10-28 17:53     ` Richard Henderson
2021-10-29  0:07     ` Warner Losh
2021-10-29  0:07       ` Warner Losh
2021-10-29  4:34       ` Warner Losh
2021-10-29  4:34         ` Warner Losh
2021-10-28 17:57   ` Richard Henderson
2021-10-28 17:57     ` Richard Henderson
2021-10-19 16:44 ` [PATCH 23/24] bsd-user/arm/target_arch_signal.h: arm get_ucontext_sigreturn Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  6:12   ` Kyle Evans
2021-10-26  6:12     ` Kyle Evans
2021-10-28 17:59   ` Richard Henderson
2021-10-28 17:59     ` Richard Henderson
2021-10-19 16:44 ` [PATCH 24/24] bsd-user: add arm target build Warner Losh
2021-10-19 16:44   ` Warner Losh
2021-10-26  6:21   ` Kyle Evans
2021-10-26  6:21     ` Kyle Evans
2021-10-28 18:02     ` Richard Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211019164447.16359-10-imp@bsdimp.com \
    --to=imp@bsdimp.com \
    --cc=kevans@freebsd.org \
    --cc=laurent@vivier.eu \
    --cc=mjt@tls.msk.ru \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-trivial@nongnu.org \
    --cc=sson@FreeBSD.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.