diff mbox series

[v2,19/43] bsd-user: start to move target CPU functions to target_arch*

Message ID 20210826211201.98877-20-imp@bsdimp.com
State New
Headers show
Series bsd-user updates to run hello world | expand

Commit Message

Warner Losh Aug. 26, 2021, 9:11 p.m. UTC
From: Warner Losh <imp@FreeBSD.org>

Move the CPU functons into target_arch_cpu.c that are unique to each
CPU. These are defined in target_arch.h.

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/i386/target_arch.h       | 31 +++++++++++++
 bsd-user/i386/target_arch_cpu.c   | 75 +++++++++++++++++++++++++++++++
 bsd-user/main.c                   | 12 -----
 bsd-user/x86_64/target_arch.h     | 31 +++++++++++++
 bsd-user/x86_64/target_arch_cpu.c | 75 +++++++++++++++++++++++++++++++
 configure                         |  7 +--
 meson.build                       |  8 +++-
 7 files changed, 219 insertions(+), 20 deletions(-)
 create mode 100644 bsd-user/i386/target_arch.h
 create mode 100644 bsd-user/i386/target_arch_cpu.c
 create mode 100644 bsd-user/x86_64/target_arch.h
 create mode 100644 bsd-user/x86_64/target_arch_cpu.c

Comments

Philippe Mathieu-Daudé Aug. 27, 2021, 4:39 a.m. UTC | #1
On 8/26/21 11:11 PM, imp@bsdimp.com wrote:
> From: Warner Losh <imp@FreeBSD.org>
> 
> Move the CPU functons into target_arch_cpu.c that are unique to each

Typo "functions"

> CPU. These are defined in target_arch.h.
> 
> Signed-off-by: Stacey Son <sson@FreeBSD.org>
> Signed-off-by: Warner Losh <imp@bsdimp.com>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/i386/target_arch.h       | 31 +++++++++++++
>  bsd-user/i386/target_arch_cpu.c   | 75 +++++++++++++++++++++++++++++++
>  bsd-user/main.c                   | 12 -----
>  bsd-user/x86_64/target_arch.h     | 31 +++++++++++++
>  bsd-user/x86_64/target_arch_cpu.c | 75 +++++++++++++++++++++++++++++++
>  configure                         |  7 +--
>  meson.build                       |  8 +++-
>  7 files changed, 219 insertions(+), 20 deletions(-)
>  create mode 100644 bsd-user/i386/target_arch.h
>  create mode 100644 bsd-user/i386/target_arch_cpu.c
>  create mode 100644 bsd-user/x86_64/target_arch.h
>  create mode 100644 bsd-user/x86_64/target_arch_cpu.c

> diff --git a/bsd-user/main.c b/bsd-user/main.c
> index f7e1df5da5..7b3550898d 100644
> --- a/bsd-user/main.c
> +++ b/bsd-user/main.c
> @@ -72,13 +72,6 @@ void gemu_log(const char *fmt, ...)
>      va_end(ap);
>  }
>  
> -#if defined(TARGET_I386)
> -int cpu_get_pic_interrupt(CPUX86State *env)
> -{
> -    return -1;
> -}
> -#endif

Let's avoid that using a stub.

> diff --git a/meson.build b/meson.build
> index f2e148eaf9..5fe6b4aae6 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -2560,9 +2560,13 @@ foreach target : target_dirs
>      if 'CONFIG_LINUX_USER' in config_target
>        base_dir = 'linux-user'
>        target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
> -    else
> +    endif
> +    if 'CONFIG_BSD_USER' in config_target
>        base_dir = 'bsd-user'
> -      target_inc += include_directories('bsd-user/freebsd')
> +      target_inc += include_directories('bsd-user/' / targetos)
> +#     target_inc += include_directories('bsd-user/host/' / config_host['ARCH'])

Left-over?

> +      dir = base_dir / abi
> +      arch_srcs += files(dir / 'target_arch_cpu.c')
>      endif
>      target_inc += include_directories(
>        base_dir,
>
Warner Losh Aug. 27, 2021, 3:41 p.m. UTC | #2
> On Aug 26, 2021, at 10:39 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> 
> On 8/26/21 11:11 PM, imp@bsdimp.com wrote:
>> From: Warner Losh <imp@FreeBSD.org>
>> 
>> Move the CPU functons into target_arch_cpu.c that are unique to each
> 
> Typo "functions"

doh! Thanks!

>> CPU. These are defined in target_arch.h.
>> 
>> Signed-off-by: Stacey Son <sson@FreeBSD.org>
>> Signed-off-by: Warner Losh <imp@bsdimp.com>
>> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
>> ---
>> bsd-user/i386/target_arch.h       | 31 +++++++++++++
>> bsd-user/i386/target_arch_cpu.c   | 75 +++++++++++++++++++++++++++++++
>> bsd-user/main.c                   | 12 -----
>> bsd-user/x86_64/target_arch.h     | 31 +++++++++++++
>> bsd-user/x86_64/target_arch_cpu.c | 75 +++++++++++++++++++++++++++++++
>> configure                         |  7 +--
>> meson.build                       |  8 +++-
>> 7 files changed, 219 insertions(+), 20 deletions(-)
>> create mode 100644 bsd-user/i386/target_arch.h
>> create mode 100644 bsd-user/i386/target_arch_cpu.c
>> create mode 100644 bsd-user/x86_64/target_arch.h
>> create mode 100644 bsd-user/x86_64/target_arch_cpu.c
> 
>> diff --git a/bsd-user/main.c b/bsd-user/main.c
>> index f7e1df5da5..7b3550898d 100644
>> --- a/bsd-user/main.c
>> +++ b/bsd-user/main.c
>> @@ -72,13 +72,6 @@ void gemu_log(const char *fmt, ...)
>>     va_end(ap);
>> }
>> 
>> -#if defined(TARGET_I386)
>> -int cpu_get_pic_interrupt(CPUX86State *env)
>> -{
>> -    return -1;
>> -}
>> -#endif
> 
> Let's avoid that using a stub.

Not sure I understand this comment. I’ve removed this code. And I have i386 and x86_64
as separate functions because that’s how Stacey broke it up. I have a todo item to merge
them back together once I’m caught up.

>> diff --git a/meson.build b/meson.build
>> index f2e148eaf9..5fe6b4aae6 100644
>> --- a/meson.build
>> +++ b/meson.build
>> @@ -2560,9 +2560,13 @@ foreach target : target_dirs
>>     if 'CONFIG_LINUX_USER' in config_target
>>       base_dir = 'linux-user'
>>       target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
>> -    else
>> +    endif
>> +    if 'CONFIG_BSD_USER' in config_target
>>       base_dir = 'bsd-user'
>> -      target_inc += include_directories('bsd-user/freebsd')
>> +      target_inc += include_directories('bsd-user/' / targetos)
>> +#     target_inc += include_directories('bsd-user/host/' / config_host['ARCH'])
> 
> Left-over?

Yea. Future changes will need this line. I’ll delete for now.

>> +      dir = base_dir / abi
>> +      arch_srcs += files(dir / 'target_arch_cpu.c')
>>     endif
>>     target_inc += include_directories(
>>       base_dir,
diff mbox series

Patch

diff --git a/bsd-user/i386/target_arch.h b/bsd-user/i386/target_arch.h
new file mode 100644
index 0000000000..73e9a028fe
--- /dev/null
+++ b/bsd-user/i386/target_arch.h
@@ -0,0 +1,31 @@ 
+/*
+ * Intel x86 specific prototypes for bsd-user
+ *
+ *  Copyright (c) 2013 Stacey D. Son
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _TARGET_ARCH_H_
+#define _TARGET_ARCH_H_
+
+/* target_arch_cpu.c */
+void bsd_i386_write_dt(void *ptr, unsigned long addr, unsigned long limit,
+                int flags);
+void bsd_i386_set_idt(int n, unsigned int dpl);
+void bsd_i386_set_idt_base(uint64_t base);
+
+#define target_cpu_set_tls(env, newtls)
+
+#endif /* ! _TARGET_ARCH_H_ */
diff --git a/bsd-user/i386/target_arch_cpu.c b/bsd-user/i386/target_arch_cpu.c
new file mode 100644
index 0000000000..7f2f755a11
--- /dev/null
+++ b/bsd-user/i386/target_arch_cpu.c
@@ -0,0 +1,75 @@ 
+/*
+ *  i386 cpu related code
+ *
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <sys/types.h>
+
+#include "qemu/osdep.h"
+#include "cpu.h"
+#include "qemu.h"
+#include "qemu/timer.h"
+
+#include "target_arch.h"
+
+static uint64_t *idt_table;
+
+uint64_t cpu_get_tsc(CPUX86State *env)
+{
+    return cpu_get_host_ticks();
+}
+
+int cpu_get_pic_interrupt(CPUX86State *env)
+{
+    return -1;
+}
+
+void bsd_i386_write_dt(void *ptr, unsigned long addr, unsigned long limit,
+                     int flags)
+{
+    unsigned int e1, e2;
+    uint32_t *p;
+    e1 = (addr << 16) | (limit & 0xffff);
+    e2 = ((addr >> 16) & 0xff) | (addr & 0xff000000) | (limit & 0x000f0000);
+    e2 |= flags;
+    p = ptr;
+    p[0] = tswap32(e1);
+    p[1] = tswap32(e2);
+}
+
+
+static void set_gate(void *ptr, unsigned int type, unsigned int dpl,
+                     uint32_t addr, unsigned int sel)
+{
+    uint32_t *p, e1, e2;
+    e1 = (addr & 0xffff) | (sel << 16);
+    e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8);
+    p = ptr;
+    p[0] = tswap32(e1);
+    p[1] = tswap32(e2);
+}
+
+/* only dpl matters as we do only user space emulation */
+void bsd_i386_set_idt(int n, unsigned int dpl)
+{
+    set_gate(idt_table + n, 0, dpl, 0, 0);
+}
+
+void bsd_i386_set_idt_base(uint64_t base)
+{
+    idt_table = g2h_untagged(base);
+}
+
diff --git a/bsd-user/main.c b/bsd-user/main.c
index f7e1df5da5..7b3550898d 100644
--- a/bsd-user/main.c
+++ b/bsd-user/main.c
@@ -72,13 +72,6 @@  void gemu_log(const char *fmt, ...)
     va_end(ap);
 }
 
-#if defined(TARGET_I386)
-int cpu_get_pic_interrupt(CPUX86State *env)
-{
-    return -1;
-}
-#endif
-
 void fork_start(void)
 {
 }
@@ -94,11 +87,6 @@  void fork_end(int child)
 /***********************************************************/
 /* CPUX86 core interface */
 
-uint64_t cpu_get_tsc(CPUX86State *env)
-{
-    return cpu_get_host_ticks();
-}
-
 static void write_dt(void *ptr, unsigned long addr, unsigned long limit,
                      int flags)
 {
diff --git a/bsd-user/x86_64/target_arch.h b/bsd-user/x86_64/target_arch.h
new file mode 100644
index 0000000000..e558e1b956
--- /dev/null
+++ b/bsd-user/x86_64/target_arch.h
@@ -0,0 +1,31 @@ 
+/*
+ * Intel x86_64 specific prototypes for bsd-user
+ *
+ *  Copyright (c) 2013 Stacey D. Son
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _TARGET_ARCH_H_
+#define _TARGET_ARCH_H_
+
+/* target_arch_cpu.c */
+void bsd_x86_64_write_dt(void *ptr, unsigned long addr, unsigned long limit,
+                int flags);
+void bsd_x86_64_set_idt(int n, unsigned int dpl);
+void bsd_x86_64_set_idt_base(uint64_t base);
+
+#define target_cpu_set_tls(env, newtls)
+
+#endif /* !_TARGET_ARCH_H_ */
diff --git a/bsd-user/x86_64/target_arch_cpu.c b/bsd-user/x86_64/target_arch_cpu.c
new file mode 100644
index 0000000000..a2c5b176a4
--- /dev/null
+++ b/bsd-user/x86_64/target_arch_cpu.c
@@ -0,0 +1,75 @@ 
+/*
+ *  x86_64 cpu related code
+ *
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <sys/types.h>
+
+#include "qemu/osdep.h"
+#include "cpu.h"
+#include "qemu.h"
+#include "qemu/timer.h"
+
+#include "target_arch.h"
+
+static uint64_t *idt_table;
+
+uint64_t cpu_get_tsc(CPUX86State *env)
+{
+    return cpu_get_host_ticks();
+}
+
+int cpu_get_pic_interrupt(CPUX86State *env)
+{
+    return -1;
+}
+
+void bsd_x86_64_write_dt(void *ptr, unsigned long addr,
+        unsigned long limit, int flags)
+{
+    unsigned int e1, e2;
+    uint32_t *p;
+    e1 = (addr << 16) | (limit & 0xffff);
+    e2 = ((addr >> 16) & 0xff) | (addr & 0xff000000) | (limit & 0x000f0000);
+    e2 |= flags;
+    p = ptr;
+    p[0] = tswap32(e1);
+    p[1] = tswap32(e2);
+}
+
+static void set_gate64(void *ptr, unsigned int type, unsigned int dpl,
+        uint64_t addr, unsigned int sel)
+{
+    uint32_t *p, e1, e2;
+    e1 = (addr & 0xffff) | (sel << 16);
+    e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8);
+    p = ptr;
+    p[0] = tswap32(e1);
+    p[1] = tswap32(e2);
+    p[2] = tswap32(addr >> 32);
+    p[3] = 0;
+}
+
+/* only dpl matters as we do only user space emulation */
+void bsd_x86_64_set_idt(int n, unsigned int dpl)
+{
+    set_gate64(idt_table + n * 2, 0, dpl, 0, 0);
+}
+
+void bsd_x86_64_set_idt_base(uint64_t base)
+{
+    idt_table = g2h_untagged(base);
+}
diff --git a/configure b/configure
index 9a79a004d7..111d27f28e 100755
--- a/configure
+++ b/configure
@@ -721,6 +721,7 @@  GNU/kFreeBSD)
 ;;
 FreeBSD)
   bsd="yes"
+  bsd_user="yes"
   make="${MAKE-gmake}"
   audio_drv_list="oss try-sdl"
   audio_possible_drivers="oss sdl pa"
@@ -782,12 +783,6 @@  Linux)
 ;;
 esac
 
-if [ "$bsd" = "yes" ] ; then
-  if [ "$darwin" != "yes" ] ; then
-    bsd_user="yes"
-  fi
-fi
-
 : ${make=${MAKE-make}}
 
 # We prefer python 3.x. A bare 'python' is traditionally
diff --git a/meson.build b/meson.build
index f2e148eaf9..5fe6b4aae6 100644
--- a/meson.build
+++ b/meson.build
@@ -2560,9 +2560,13 @@  foreach target : target_dirs
     if 'CONFIG_LINUX_USER' in config_target
       base_dir = 'linux-user'
       target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
-    else
+    endif
+    if 'CONFIG_BSD_USER' in config_target
       base_dir = 'bsd-user'
-      target_inc += include_directories('bsd-user/freebsd')
+      target_inc += include_directories('bsd-user/' / targetos)
+#     target_inc += include_directories('bsd-user/host/' / config_host['ARCH'])
+      dir = base_dir / abi
+      arch_srcs += files(dir / 'target_arch_cpu.c')
     endif
     target_inc += include_directories(
       base_dir,